Imported Upstream version 1.22.0 upstream/1.22.0
authorDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 15 Jul 2022 02:14:53 +0000 (11:14 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 15 Jul 2022 02:14:53 +0000 (11:14 +0900)
1015 files changed:
CITATION.bib [new file with mode: 0644]
PKG-INFO
README.md
_configtest.c [new file with mode: 0644]
_configtest.o [new file with mode: 0644]
benchmarks/asv.conf.json
benchmarks/asv_compare.conf.json.tpl
benchmarks/benchmarks/bench_ufunc_strides.py
doc/BRANCH_WALKTHROUGH.rst [new file with mode: 0644]
doc/HOWTO_RELEASE.rst.txt
doc/Makefile
doc/RELEASE_WALKTHROUGH.rst.txt
doc/TESTS.rst.txt
doc/cdoc/Doxyfile [deleted file]
doc/cdoc/Makefile [deleted file]
doc/cdoc/README [deleted file]
doc/cdoc/numpyfilter.py [deleted file]
doc/changelog/1.21.4-changelog.rst
doc/changelog/1.21.5-changelog.rst [deleted file]
doc/changelog/1.21.6-changelog.rst [deleted file]
doc/changelog/1.22.0-changelog.rst [new file with mode: 0644]
doc/neps/conf.py
doc/neps/nep-0000.rst
doc/neps/nep-0001-npy-format.rst
doc/neps/nep-0010-new-iterator-ufunc.rst
doc/neps/nep-0011-deferred-ufunc-evaluation.rst
doc/neps/nep-0012-missing-data.rst
doc/neps/nep-0013-ufunc-overrides.rst
doc/neps/nep-0017-split-out-maskedarray.rst
doc/neps/nep-0018-array-function-protocol.rst
doc/neps/nep-0019-rng-policy.rst
doc/neps/nep-0020-gufunc-signature-enhancement.rst
doc/neps/nep-0024-missing-data-2.rst
doc/neps/nep-0026-missing-data-summary.rst
doc/neps/nep-0027-zero-rank-arrarys.rst
doc/neps/nep-0030-duck-array-protocol.rst
doc/neps/nep-0031-uarray.rst
doc/neps/nep-0035-array-creation-dispatch-with-array-function.rst
doc/neps/nep-0036-fair-play.rst
doc/neps/nep-0038-SIMD-optimizations.rst
doc/neps/nep-0040-legacy-datatype-impl.rst
doc/neps/nep-0041-improved-dtype-support.rst
doc/neps/nep-0042-new-dtypes.rst
doc/neps/nep-0043-extensible-ufuncs.rst
doc/neps/nep-0044-restructuring-numpy-docs.rst
doc/neps/nep-0045-c_style_guide.rst
doc/neps/nep-0046-sponsorship-guidelines.rst
doc/neps/nep-0047-array-api-standard.rst
doc/neps/nep-0048-spending-project-funds.rst
doc/neps/nep-0049.rst
doc/neps/nep-template.rst
doc/preprocess.py [new file with mode: 0755]
doc/source/_static/index-images/api.svg [new file with mode: 0644]
doc/source/_static/index-images/contributor.svg [new file with mode: 0644]
doc/source/_static/index-images/getting_started.svg [new file with mode: 0644]
doc/source/_static/index-images/user_guide.svg [new file with mode: 0644]
doc/source/_templates/indexcontent.html [deleted file]
doc/source/_templates/indexsidebar.html [deleted file]
doc/source/conf.py
doc/source/dev/alignment.rst [new file with mode: 0644]
doc/source/dev/development_advanced_debugging.rst
doc/source/dev/development_environment.rst
doc/source/dev/examples/.doxyfile [new file with mode: 0644]
doc/source/dev/examples/doxy_class.hpp [new file with mode: 0644]
doc/source/dev/examples/doxy_func.h [new file with mode: 0644]
doc/source/dev/examples/doxy_rst.h [new file with mode: 0644]
doc/source/dev/governance/governance.rst
doc/source/dev/governance/index.rst
doc/source/dev/governance/people.rst [deleted file]
doc/source/dev/howto-docs.rst
doc/source/dev/howto_build_docs.rst [new file with mode: 0644]
doc/source/dev/index.rst
doc/source/dev/internals.code-explanations.rst [new file with mode: 0644]
doc/source/dev/internals.rst [new file with mode: 0644]
doc/source/dev/underthehood.rst
doc/source/doc_conventions.rst [deleted file]
doc/source/docs/howto_build_docs.rst [deleted file]
doc/source/docs/howto_document.rst [deleted file]
doc/source/docs/index.rst [deleted file]
doc/source/doxyfile [new file with mode: 0644]
doc/source/f2py/advanced.rst
doc/source/f2py/allocarr.f90 [deleted file]
doc/source/f2py/allocarr_session.dat [deleted file]
doc/source/f2py/array.f [deleted file]
doc/source/f2py/array_session.dat [deleted file]
doc/source/f2py/buildtools/cmake.rst [new file with mode: 0644]
doc/source/f2py/buildtools/distutils.rst [new file with mode: 0644]
doc/source/f2py/buildtools/index.rst [new file with mode: 0644]
doc/source/f2py/buildtools/meson.rst [new file with mode: 0644]
doc/source/f2py/buildtools/skbuild.rst [new file with mode: 0644]
doc/source/f2py/calculate.f [deleted file]
doc/source/f2py/calculate_session.dat [deleted file]
doc/source/f2py/callback.f [deleted file]
doc/source/f2py/callback2.pyf [deleted file]
doc/source/f2py/callback_session.dat [deleted file]
doc/source/f2py/code/CMakeLists.txt [new file with mode: 0644]
doc/source/f2py/code/CMakeLists_skbuild.txt [new file with mode: 0644]
doc/source/f2py/code/allocarr.f90 [new file with mode: 0644]
doc/source/f2py/code/array.f [new file with mode: 0644]
doc/source/f2py/code/calculate.f [new file with mode: 0644]
doc/source/f2py/code/callback.f [new file with mode: 0644]
doc/source/f2py/code/callback2.pyf [new file with mode: 0644]
doc/source/f2py/code/common.f [new file with mode: 0644]
doc/source/f2py/code/extcallback.f [new file with mode: 0644]
doc/source/f2py/code/fib1.f [new file with mode: 0644]
doc/source/f2py/code/fib1.pyf [new file with mode: 0644]
doc/source/f2py/code/fib2.pyf [new file with mode: 0644]
doc/source/f2py/code/fib3.f [new file with mode: 0644]
doc/source/f2py/code/ftype.f [new file with mode: 0644]
doc/source/f2py/code/meson.build [new file with mode: 0644]
doc/source/f2py/code/meson_upd.build [new file with mode: 0644]
doc/source/f2py/code/moddata.f90 [new file with mode: 0644]
doc/source/f2py/code/pyproj_skbuild.toml [new file with mode: 0644]
doc/source/f2py/code/results/allocarr_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/array_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/calculate_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/callback_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/common_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/compile_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/extcallback_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/ftype_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/moddata_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/run_main_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/scalar_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/spam_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/string_session.dat [new file with mode: 0644]
doc/source/f2py/code/results/var_session.dat [new file with mode: 0644]
doc/source/f2py/code/scalar.f [new file with mode: 0644]
doc/source/f2py/code/setup_example.py [new file with mode: 0644]
doc/source/f2py/code/setup_skbuild.py [new file with mode: 0644]
doc/source/f2py/code/spam.pyf [new file with mode: 0644]
doc/source/f2py/code/string.f [new file with mode: 0644]
doc/source/f2py/code/var.pyf [new file with mode: 0644]
doc/source/f2py/common.f [deleted file]
doc/source/f2py/common_session.dat [deleted file]
doc/source/f2py/compile_session.dat [deleted file]
doc/source/f2py/distutils.rst [deleted file]
doc/source/f2py/extcallback.f [deleted file]
doc/source/f2py/extcallback_session.dat [deleted file]
doc/source/f2py/f2py.getting-started.rst
doc/source/f2py/fib1.f [deleted file]
doc/source/f2py/fib1.pyf [deleted file]
doc/source/f2py/fib2.pyf [deleted file]
doc/source/f2py/fib3.f [deleted file]
doc/source/f2py/ftype.f [deleted file]
doc/source/f2py/ftype_session.dat [deleted file]
doc/source/f2py/index.rst
doc/source/f2py/moddata.f90 [deleted file]
doc/source/f2py/moddata_session.dat [deleted file]
doc/source/f2py/python-usage.rst
doc/source/f2py/run_main_session.dat [deleted file]
doc/source/f2py/scalar.f [deleted file]
doc/source/f2py/scalar_session.dat [deleted file]
doc/source/f2py/setup_example.py [deleted file]
doc/source/f2py/signature-file.rst
doc/source/f2py/spam.pyf [deleted file]
doc/source/f2py/spam_session.dat [deleted file]
doc/source/f2py/string.f [deleted file]
doc/source/f2py/string_session.dat [deleted file]
doc/source/f2py/usage.rst
doc/source/f2py/var.pyf [deleted file]
doc/source/f2py/var_session.dat [deleted file]
doc/source/getting_started.rst [new file with mode: 0644]
doc/source/index.rst
doc/source/reference/alignment.rst
doc/source/reference/arrays.datetime.rst
doc/source/reference/arrays.dtypes.rst
doc/source/reference/arrays.indexing.rst
doc/source/reference/arrays.ndarray.rst
doc/source/reference/arrays.scalars.rst
doc/source/reference/c-api/array.rst
doc/source/reference/c-api/coremath.rst
doc/source/reference/c-api/data_memory.rst [new file with mode: 0644]
doc/source/reference/c-api/index.rst
doc/source/reference/c-api/iterator.rst
doc/source/reference/c-api/types-and-structures.rst
doc/source/reference/global_state.rst
doc/source/reference/index.rst
doc/source/reference/internals.code-explanations.rst
doc/source/reference/internals.rst
doc/source/reference/random/bit_generators/index.rst
doc/source/reference/random/index.rst
doc/source/reference/random/performance.rst
doc/source/reference/routines.ctypeslib.rst
doc/source/reference/routines.indexing.rst [deleted file]
doc/source/reference/routines.ma.rst
doc/source/reference/routines.math.rst
doc/source/reference/routines.other.rst
doc/source/reference/routines.polynomials.rst
doc/source/reference/routines.rst
doc/source/reference/routines.statistics.rst
doc/source/reference/simd/simd-optimizations.rst
doc/source/reference/ufuncs.rst
doc/source/release.rst
doc/source/release/1.14.0-notes.rst
doc/source/release/1.15.0-notes.rst
doc/source/release/1.16.0-notes.rst
doc/source/release/1.19.0-notes.rst
doc/source/release/1.20.0-notes.rst
doc/source/release/1.21.0-notes.rst
doc/source/release/1.21.2-notes.rst
doc/source/release/1.21.3-notes.rst
doc/source/release/1.21.4-notes.rst
doc/source/release/1.21.5-notes.rst [deleted file]
doc/source/release/1.21.6-notes.rst [deleted file]
doc/source/release/1.22.0-notes.rst [new file with mode: 0644]
doc/source/release/1.8.0-notes.rst
doc/source/release/1.9.0-notes.rst
doc/source/user/absolute_beginners.rst
doc/source/user/basics.broadcasting.rst
doc/source/user/basics.copies.rst [new file with mode: 0644]
doc/source/user/basics.creation.rst
doc/source/user/basics.indexing.rst
doc/source/user/basics.io.genfromtxt.rst
doc/source/user/basics.rec.rst
doc/source/user/basics.rst
doc/source/user/basics.ufuncs.rst [new file with mode: 0644]
doc/source/user/broadcasting_1.svg [new file with mode: 0644]
doc/source/user/broadcasting_2.svg [new file with mode: 0644]
doc/source/user/broadcasting_3.svg [new file with mode: 0644]
doc/source/user/broadcasting_4.svg [new file with mode: 0644]
doc/source/user/broadcasting_5.svg [new file with mode: 0644]
doc/source/user/building.rst
doc/source/user/c-info.beyond-basics.rst
doc/source/user/c-info.how-to-extend.rst
doc/source/user/c-info.python-as-glue.rst
doc/source/user/c-info.ufunc-tutorial.rst
doc/source/user/how-to-how-to.rst
doc/source/user/index.rst
doc/source/user/misc.rst
doc/source/user/numpy-for-matlab-users.rst
doc/source/user/quickstart.rst
doc/source/user/theory.broadcast_1.gif [deleted file]
doc/source/user/theory.broadcast_2.gif [deleted file]
doc/source/user/theory.broadcast_3.gif [deleted file]
doc/source/user/theory.broadcast_4.gif [deleted file]
doc/source/user/theory.broadcast_5.png [deleted file]
doc/source/user/theory.broadcasting.rst
doc/source/user/tutorial-ma.rst [deleted file]
doc/source/user/tutorial-svd.rst [deleted file]
doc/source/user/tutorials_index.rst [deleted file]
doc/source/user/whatisnumpy.rst
doc/source/user/who_covid_19_sit_rep_time_series.csv [deleted file]
doc/ufuncs.rst.txt
doc_requirements.txt
environment.yml
linter_requirements.txt
numpy/__init__.py
numpy/__init__.pyi
numpy/_globals.py
numpy/_pytesttester.py
numpy/_pytesttester.pyi [new file with mode: 0644]
numpy/_version.py
numpy/array_api/__init__.py [new file with mode: 0644]
numpy/array_api/_array_object.py [new file with mode: 0644]
numpy/array_api/_constants.py [new file with mode: 0644]
numpy/array_api/_creation_functions.py [new file with mode: 0644]
numpy/array_api/_data_type_functions.py [new file with mode: 0644]
numpy/array_api/_dtypes.py [new file with mode: 0644]
numpy/array_api/_elementwise_functions.py [new file with mode: 0644]
numpy/array_api/_manipulation_functions.py [new file with mode: 0644]
numpy/array_api/_searching_functions.py [new file with mode: 0644]
numpy/array_api/_set_functions.py [new file with mode: 0644]
numpy/array_api/_sorting_functions.py [new file with mode: 0644]
numpy/array_api/_statistical_functions.py [new file with mode: 0644]
numpy/array_api/_typing.py [new file with mode: 0644]
numpy/array_api/_utility_functions.py [new file with mode: 0644]
numpy/array_api/linalg.py [new file with mode: 0644]
numpy/array_api/setup.py [new file with mode: 0644]
numpy/array_api/tests/__init__.py [new file with mode: 0644]
numpy/array_api/tests/test_array_object.py [new file with mode: 0644]
numpy/array_api/tests/test_creation_functions.py [new file with mode: 0644]
numpy/array_api/tests/test_elementwise_functions.py [new file with mode: 0644]
numpy/char.pyi [deleted file]
numpy/compat/py3k.py
numpy/conftest.py
numpy/core/__init__.py
numpy/core/_add_newdocs.py
numpy/core/_add_newdocs_scalars.py
numpy/core/_asarray.pyi
numpy/core/_dtype.py
numpy/core/_exceptions.py
numpy/core/_internal.py
numpy/core/_internal.pyi
numpy/core/_machar.py [new file with mode: 0644]
numpy/core/_methods.py
numpy/core/_type_aliases.py
numpy/core/_type_aliases.pyi
numpy/core/_ufunc_config.pyi
numpy/core/arrayprint.py
numpy/core/arrayprint.pyi
numpy/core/code_generators/cversions.txt
numpy/core/code_generators/genapi.py
numpy/core/code_generators/generate_numpy_api.py
numpy/core/code_generators/generate_umath.py
numpy/core/code_generators/numpy_api.py
numpy/core/code_generators/ufunc_docstrings.py
numpy/core/defchararray.py
numpy/core/defchararray.pyi [new file with mode: 0644]
numpy/core/einsumfunc.py
numpy/core/einsumfunc.pyi
numpy/core/fromnumeric.py
numpy/core/fromnumeric.pyi
numpy/core/function_base.pyi
numpy/core/getlimits.py
numpy/core/getlimits.pyi [new file with mode: 0644]
numpy/core/include/numpy/.doxyfile [new file with mode: 0644]
numpy/core/include/numpy/_neighborhood_iterator_imp.h
numpy/core/include/numpy/arrayobject.h
numpy/core/include/numpy/arrayscalars.h
numpy/core/include/numpy/experimental_dtype_api.h [new file with mode: 0644]
numpy/core/include/numpy/halffloat.h
numpy/core/include/numpy/libdivide/libdivide.h
numpy/core/include/numpy/ndarrayobject.h
numpy/core/include/numpy/ndarraytypes.h
numpy/core/include/numpy/noprefix.h
numpy/core/include/numpy/npy_1_7_deprecated_api.h
numpy/core/include/numpy/npy_3kcompat.h
numpy/core/include/numpy/npy_common.h
numpy/core/include/numpy/npy_cpu.h
numpy/core/include/numpy/npy_endian.h
numpy/core/include/numpy/npy_interrupt.h
numpy/core/include/numpy/npy_math.h
numpy/core/include/numpy/npy_no_deprecated_api.h
numpy/core/include/numpy/npy_os.h
numpy/core/include/numpy/numpyconfig.h
numpy/core/include/numpy/old_defines.h
numpy/core/include/numpy/oldnumeric.h
numpy/core/include/numpy/random/bitgen.h
numpy/core/include/numpy/random/distributions.h
numpy/core/include/numpy/ufuncobject.h
numpy/core/include/numpy/utils.h
numpy/core/machar.py [deleted file]
numpy/core/memmap.pyi [new file with mode: 0644]
numpy/core/multiarray.py
numpy/core/multiarray.pyi [new file with mode: 0644]
numpy/core/numeric.py
numpy/core/numeric.pyi
numpy/core/numerictypes.py
numpy/core/numerictypes.pyi
numpy/core/overrides.py
numpy/core/records.py
numpy/core/records.pyi [new file with mode: 0644]
numpy/core/setup.py
numpy/core/setup_common.py
numpy/core/shape_base.pyi
numpy/core/src/_simd/_simd.dispatch.c.src
numpy/core/src/_simd/_simd_convert.inc
numpy/core/src/_simd/_simd_inc.h.src
numpy/core/src/_simd/_simd_vector.inc
numpy/core/src/common/.doxyfile [new file with mode: 0644]
numpy/core/src/common/array_assign.c
numpy/core/src/common/array_assign.h
numpy/core/src/common/binop_override.h
numpy/core/src/common/cblasfuncs.c
numpy/core/src/common/cblasfuncs.h
numpy/core/src/common/dlpack/dlpack.h [new file with mode: 0644]
numpy/core/src/common/get_attr_string.h
numpy/core/src/common/lowlevel_strided_loops.h
numpy/core/src/common/mem_overlap.c
numpy/core/src/common/mem_overlap.h
numpy/core/src/common/npy_argparse.c
numpy/core/src/common/npy_argparse.h
numpy/core/src/common/npy_cblas.h
numpy/core/src/common/npy_cblas_base.h
numpy/core/src/common/npy_config.h
numpy/core/src/common/npy_cpu_dispatch.h
numpy/core/src/common/npy_cpu_features.c.src
numpy/core/src/common/npy_cpu_features.h
numpy/core/src/common/npy_cpuinfo_parser.h
numpy/core/src/common/npy_ctypes.h
numpy/core/src/common/npy_dlpack.h [new file with mode: 0644]
numpy/core/src/common/npy_extint128.h
numpy/core/src/common/npy_fpmath.h
numpy/core/src/common/npy_hashtable.c [new file with mode: 0644]
numpy/core/src/common/npy_hashtable.h [new file with mode: 0644]
numpy/core/src/common/npy_import.h
numpy/core/src/common/npy_longdouble.c
numpy/core/src/common/npy_longdouble.h
numpy/core/src/common/npy_pycompat.h
numpy/core/src/common/npy_sort.h.src
numpy/core/src/common/npy_svml.h [new file with mode: 0644]
numpy/core/src/common/numpy_tag.h [new file with mode: 0644]
numpy/core/src/common/numpyos.c
numpy/core/src/common/numpyos.h
numpy/core/src/common/python_xerbla.c
numpy/core/src/common/simd/avx2/arithmetic.h
numpy/core/src/common/simd/avx2/math.h
numpy/core/src/common/simd/avx512/math.h
numpy/core/src/common/simd/avx512/utils.h
numpy/core/src/common/simd/emulate_maskop.h
numpy/core/src/common/simd/intdiv.h
numpy/core/src/common/simd/neon/math.h
numpy/core/src/common/simd/sse/math.h
numpy/core/src/common/simd/vsx/math.h
numpy/core/src/common/simd/vsx/operators.h
numpy/core/src/common/ucsnarrow.c
numpy/core/src/common/ucsnarrow.h
numpy/core/src/common/ufunc_override.h
numpy/core/src/common/umathmodule.h
numpy/core/src/dummymodule.c
numpy/core/src/multiarray/_datetime.h
numpy/core/src/multiarray/_multiarray_tests.c.src
numpy/core/src/multiarray/abstractdtypes.c
numpy/core/src/multiarray/abstractdtypes.h
numpy/core/src/multiarray/alloc.c
numpy/core/src/multiarray/alloc.h
numpy/core/src/multiarray/array_assign_array.c
numpy/core/src/multiarray/array_assign_scalar.c
numpy/core/src/multiarray/array_coercion.c
numpy/core/src/multiarray/array_coercion.h
numpy/core/src/multiarray/array_method.c
numpy/core/src/multiarray/array_method.h
numpy/core/src/multiarray/arrayfunction_override.h
numpy/core/src/multiarray/arrayobject.c
numpy/core/src/multiarray/arrayobject.h
numpy/core/src/multiarray/arraytypes.c.src
numpy/core/src/multiarray/arraytypes.h
numpy/core/src/multiarray/buffer.c
numpy/core/src/multiarray/calculation.c
numpy/core/src/multiarray/calculation.h
numpy/core/src/multiarray/common.c
numpy/core/src/multiarray/common.h
numpy/core/src/multiarray/common_dtype.c
numpy/core/src/multiarray/common_dtype.h
numpy/core/src/multiarray/compiled_base.c
numpy/core/src/multiarray/compiled_base.h
numpy/core/src/multiarray/conversion_utils.c
numpy/core/src/multiarray/conversion_utils.h
numpy/core/src/multiarray/convert.c
numpy/core/src/multiarray/convert.h
numpy/core/src/multiarray/convert_datatype.c
numpy/core/src/multiarray/convert_datatype.h
numpy/core/src/multiarray/ctors.c
numpy/core/src/multiarray/ctors.h
numpy/core/src/multiarray/datetime.c
numpy/core/src/multiarray/datetime_busday.c
numpy/core/src/multiarray/datetime_busday.h
numpy/core/src/multiarray/datetime_busdaycal.c
numpy/core/src/multiarray/datetime_busdaycal.h
numpy/core/src/multiarray/datetime_strings.c
numpy/core/src/multiarray/datetime_strings.h
numpy/core/src/multiarray/descriptor.c
numpy/core/src/multiarray/descriptor.h
numpy/core/src/multiarray/dlpack.c [new file with mode: 0644]
numpy/core/src/multiarray/dragon4.c
numpy/core/src/multiarray/dragon4.h
numpy/core/src/multiarray/dtype_transfer.c
numpy/core/src/multiarray/dtype_transfer.h
numpy/core/src/multiarray/dtypemeta.c
numpy/core/src/multiarray/dtypemeta.h
numpy/core/src/multiarray/einsum.c.src
numpy/core/src/multiarray/einsum_debug.h
numpy/core/src/multiarray/einsum_sumprod.c.src
numpy/core/src/multiarray/einsum_sumprod.h
numpy/core/src/multiarray/experimental_public_dtype_api.c [new file with mode: 0644]
numpy/core/src/multiarray/experimental_public_dtype_api.h [new file with mode: 0644]
numpy/core/src/multiarray/flagsobject.c
numpy/core/src/multiarray/getset.c
numpy/core/src/multiarray/getset.h
numpy/core/src/multiarray/hashdescr.c
numpy/core/src/multiarray/hashdescr.h
numpy/core/src/multiarray/item_selection.c
numpy/core/src/multiarray/item_selection.h
numpy/core/src/multiarray/iterators.c
numpy/core/src/multiarray/iterators.h
numpy/core/src/multiarray/legacy_dtype_implementation.c
numpy/core/src/multiarray/legacy_dtype_implementation.h
numpy/core/src/multiarray/lowlevel_strided_loops.c.src
numpy/core/src/multiarray/mapping.c
numpy/core/src/multiarray/mapping.h
numpy/core/src/multiarray/methods.c
numpy/core/src/multiarray/methods.h
numpy/core/src/multiarray/multiarraymodule.c
numpy/core/src/multiarray/multiarraymodule.h
numpy/core/src/multiarray/nditer_api.c
numpy/core/src/multiarray/nditer_constr.c
numpy/core/src/multiarray/nditer_impl.h
numpy/core/src/multiarray/nditer_pywrap.c
numpy/core/src/multiarray/nditer_pywrap.h
numpy/core/src/multiarray/nditer_templ.c.src
numpy/core/src/multiarray/npy_buffer.h
numpy/core/src/multiarray/number.c
numpy/core/src/multiarray/number.h
numpy/core/src/multiarray/refcount.c
numpy/core/src/multiarray/refcount.h
numpy/core/src/multiarray/scalarapi.c
numpy/core/src/multiarray/scalartypes.c.src
numpy/core/src/multiarray/scalartypes.h
numpy/core/src/multiarray/sequence.c
numpy/core/src/multiarray/sequence.h
numpy/core/src/multiarray/shape.c
numpy/core/src/multiarray/shape.h
numpy/core/src/multiarray/strfuncs.c
numpy/core/src/multiarray/strfuncs.h
numpy/core/src/multiarray/temp_elide.c
numpy/core/src/multiarray/temp_elide.h
numpy/core/src/multiarray/typeinfo.c
numpy/core/src/multiarray/typeinfo.h
numpy/core/src/multiarray/usertypes.c
numpy/core/src/multiarray/usertypes.h
numpy/core/src/multiarray/vdot.c
numpy/core/src/multiarray/vdot.h
numpy/core/src/npymath/halffloat.c
numpy/core/src/npymath/npy_math_internal.h.src
numpy/core/src/npymath/npy_math_private.h
numpy/core/src/npysort/radixsort.c.src [deleted file]
numpy/core/src/npysort/radixsort.cpp [new file with mode: 0644]
numpy/core/src/umath/_operand_flag_tests.c.src
numpy/core/src/umath/_rational_tests.c.src
numpy/core/src/umath/_scaled_float_dtype.c [new file with mode: 0644]
numpy/core/src/umath/_struct_ufunc_tests.c.src
numpy/core/src/umath/_umath_tests.c.src
numpy/core/src/umath/_umath_tests.dispatch.c
numpy/core/src/umath/clip.c.src [deleted file]
numpy/core/src/umath/clip.cpp [new file with mode: 0644]
numpy/core/src/umath/clip.h [new file with mode: 0644]
numpy/core/src/umath/clip.h.src [deleted file]
numpy/core/src/umath/dispatching.c [new file with mode: 0644]
numpy/core/src/umath/dispatching.h [new file with mode: 0644]
numpy/core/src/umath/extobj.c
numpy/core/src/umath/legacy_array_method.c [new file with mode: 0644]
numpy/core/src/umath/legacy_array_method.h [new file with mode: 0644]
numpy/core/src/umath/loops.c.src
numpy/core/src/umath/loops.h.src
numpy/core/src/umath/loops_arithm_fp.dispatch.c.src
numpy/core/src/umath/loops_exponent_log.dispatch.c.src
numpy/core/src/umath/loops_trigonometric.dispatch.c.src
numpy/core/src/umath/loops_umath_fp.dispatch.c.src [new file with mode: 0644]
numpy/core/src/umath/loops_unary_fp.dispatch.c.src
numpy/core/src/umath/loops_utils.h.src
numpy/core/src/umath/matmul.c.src
numpy/core/src/umath/reduction.c
numpy/core/src/umath/reduction.h
numpy/core/src/umath/scalarmath.c.src
numpy/core/src/umath/simd.inc.src
numpy/core/src/umath/svml/LICENSE [new file with mode: 0644]
numpy/core/src/umath/svml/README.md [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_acos_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_acos_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_acosh_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_acosh_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_asin_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_asin_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_asinh_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_asinh_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_atan2_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_atan2_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_atan_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_atan_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_atanh_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_atanh_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_cbrt_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_cbrt_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_cos_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_cos_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_cosh_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_cosh_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_exp2_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_exp2_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_exp_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_exp_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_expm1_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_expm1_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_log10_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_log10_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_log1p_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_log1p_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_log2_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_log2_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_log_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_log_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_pow_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_pow_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_sin_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_sin_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_sinh_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_sinh_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_tan_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_tan_s_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_tanh_d_la.s [new file with mode: 0644]
numpy/core/src/umath/svml/linux/avx512/svml_z0_tanh_s_la.s [new file with mode: 0644]
numpy/core/src/umath/ufunc_object.c
numpy/core/src/umath/ufunc_type_resolution.c
numpy/core/src/umath/ufunc_type_resolution.h
numpy/core/src/umath/umathmodule.c
numpy/core/tests/data/generate_umath_validation_data.cpp [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-arccos.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-arccosh.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-arcsin.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-arcsinh.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-arctan.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-arctanh.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-cbrt.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-cos.csv
numpy/core/tests/data/umath-validation-set-cosh.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-exp2.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-expm1.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-log10.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-log1p.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-log2.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-sin.csv
numpy/core/tests/data/umath-validation-set-sinh.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-tan.csv [new file with mode: 0644]
numpy/core/tests/data/umath-validation-set-tanh.csv [new file with mode: 0644]
numpy/core/tests/test__exceptions.py
numpy/core/tests/test_api.py
numpy/core/tests/test_array_coercion.py
numpy/core/tests/test_arraymethod.py
numpy/core/tests/test_arrayprint.py
numpy/core/tests/test_casting_unittests.py
numpy/core/tests/test_cpu_dispatcher.py
numpy/core/tests/test_cpu_features.py
numpy/core/tests/test_custom_dtypes.py [new file with mode: 0644]
numpy/core/tests/test_datetime.py
numpy/core/tests/test_deprecations.py
numpy/core/tests/test_dlpack.py [new file with mode: 0644]
numpy/core/tests/test_dtype.py
numpy/core/tests/test_einsum.py
numpy/core/tests/test_getlimits.py
numpy/core/tests/test_hashtable.py [new file with mode: 0644]
numpy/core/tests/test_longdouble.py
numpy/core/tests/test_machar.py
numpy/core/tests/test_mem_policy.py [new file with mode: 0644]
numpy/core/tests/test_multiarray.py
numpy/core/tests/test_nditer.py
numpy/core/tests/test_numeric.py
numpy/core/tests/test_regression.py
numpy/core/tests/test_scalar_methods.py
numpy/core/tests/test_scalarinherit.py
numpy/core/tests/test_scalarmath.py
numpy/core/tests/test_scalarprint.py
numpy/core/tests/test_simd.py
numpy/core/tests/test_ufunc.py
numpy/core/tests/test_umath.py
numpy/core/tests/test_umath_accuracy.py
numpy/core/tests/test_umath_complex.py
numpy/ctypeslib.py
numpy/ctypeslib.pyi
numpy/distutils/armccompiler.py [new file with mode: 0644]
numpy/distutils/ccompiler.py
numpy/distutils/ccompiler_opt.py
numpy/distutils/command/build_clib.py
numpy/distutils/command/build_ext.py
numpy/distutils/core.py
numpy/distutils/cpuinfo.py
numpy/distutils/exec_command.py
numpy/distutils/extension.py
numpy/distutils/fcompiler/__init__.py
numpy/distutils/fcompiler/arm.py [new file with mode: 0644]
numpy/distutils/fcompiler/compaq.py
numpy/distutils/fcompiler/gnu.py
numpy/distutils/fcompiler/nag.py
numpy/distutils/fcompiler/nv.py
numpy/distutils/log.py
numpy/distutils/mingw32ccompiler.py
numpy/distutils/misc_util.py
numpy/distutils/npy_pkg_config.py
numpy/distutils/system_info.py
numpy/distutils/tests/test_ccompiler_opt.py
numpy/distutils/tests/test_log.py [new file with mode: 0644]
numpy/distutils/tests/test_system_info.py
numpy/distutils/unixccompiler.py
numpy/doc/constants.py
numpy/f2py/__init__.py
numpy/f2py/__init__.pyi
numpy/f2py/__main__.py
numpy/f2py/auxfuncs.py
numpy/f2py/capi_maps.py
numpy/f2py/cb_rules.py
numpy/f2py/cfuncs.py
numpy/f2py/crackfortran.py
numpy/f2py/f2py2e.py
numpy/f2py/rules.py
numpy/f2py/setup.py
numpy/f2py/src/fortranobject.c
numpy/f2py/src/fortranobject.h
numpy/f2py/src/test/Makefile [deleted file]
numpy/f2py/src/test/bar.f [deleted file]
numpy/f2py/src/test/foo.f [deleted file]
numpy/f2py/src/test/foo90.f90 [deleted file]
numpy/f2py/src/test/foomodule.c [deleted file]
numpy/f2py/src/test/wrap.f [deleted file]
numpy/f2py/symbolic.py [new file with mode: 0644]
numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c
numpy/f2py/tests/test_callback.py
numpy/f2py/tests/test_crackfortran.py
numpy/f2py/tests/test_return_character.py
numpy/f2py/tests/test_string.py
numpy/f2py/tests/test_symbolic.py [new file with mode: 0644]
numpy/f2py/tests/util.py
numpy/fft/__init__.pyi
numpy/fft/_pocketfft.c
numpy/fft/_pocketfft.pyi [new file with mode: 0644]
numpy/fft/helper.pyi [new file with mode: 0644]
numpy/fft/tests/test_pocketfft.py
numpy/lib/__init__.pyi
numpy/lib/_datasource.py
numpy/lib/_iotools.py
numpy/lib/arraypad.pyi
numpy/lib/arraysetops.pyi
numpy/lib/arrayterator.pyi
numpy/lib/format.py
numpy/lib/format.pyi
numpy/lib/function_base.py
numpy/lib/function_base.pyi
numpy/lib/histograms.pyi
numpy/lib/index_tricks.py
numpy/lib/index_tricks.pyi
numpy/lib/nanfunctions.py
numpy/lib/nanfunctions.pyi
numpy/lib/npyio.py
numpy/lib/npyio.pyi
numpy/lib/polynomial.py
numpy/lib/polynomial.pyi
numpy/lib/recfunctions.py
numpy/lib/scimath.py
numpy/lib/shape_base.pyi
numpy/lib/stride_tricks.py
numpy/lib/stride_tricks.pyi
numpy/lib/tests/test__datasource.py
numpy/lib/tests/test_format.py
numpy/lib/tests/test_function_base.py
numpy/lib/tests/test_index_tricks.py
numpy/lib/tests/test_io.py
numpy/lib/tests/test_nanfunctions.py
numpy/lib/tests/test_polynomial.py
numpy/lib/tests/test_regression.py
numpy/lib/tests/test_shape_base.py
numpy/lib/tests/test_twodim_base.py
numpy/lib/twodim_base.py
numpy/lib/twodim_base.pyi
numpy/lib/type_check.pyi
numpy/lib/utils.py
numpy/lib/utils.pyi
numpy/linalg/__init__.pyi
numpy/linalg/lapack_lite/README.rst
numpy/linalg/lapack_lite/clapack_scrub.py
numpy/linalg/lapack_lite/fortran.py
numpy/linalg/lapack_lite/make_lite.py
numpy/linalg/lapack_lite/python_xerbla.c
numpy/linalg/lapack_litemodule.c
numpy/linalg/linalg.py
numpy/linalg/linalg.pyi [new file with mode: 0644]
numpy/linalg/setup.py
numpy/linalg/tests/test_build.py [deleted file]
numpy/linalg/tests/test_linalg.py
numpy/linalg/umath_linalg.c.src
numpy/ma/__init__.pyi
numpy/ma/bench.py
numpy/ma/core.py
numpy/ma/core.pyi
numpy/ma/extras.py
numpy/ma/mrecords.py
numpy/ma/mrecords.pyi
numpy/ma/tests/test_core.py
numpy/ma/tests/test_deprecations.py
numpy/ma/tests/test_mrecords.py
numpy/ma/tests/test_old_ma.py
numpy/ma/tests/test_subclassing.py
numpy/matrixlib/__init__.pyi
numpy/matrixlib/defmatrix.pyi [new file with mode: 0644]
numpy/polynomial/__init__.py
numpy/polynomial/__init__.pyi
numpy/polynomial/_polybase.py
numpy/polynomial/chebyshev.py
numpy/polynomial/hermite.py
numpy/polynomial/hermite_e.py
numpy/polynomial/laguerre.py
numpy/polynomial/legendre.py
numpy/polynomial/polynomial.py
numpy/polynomial/polyutils.py
numpy/polynomial/tests/test_classes.py
numpy/random/__init__.pyi
numpy/random/_examples/cython/setup.py
numpy/random/_generator.pyi
numpy/random/_generator.pyx
numpy/random/_mt19937.pyi
numpy/random/_pcg64.pyi
numpy/random/_pcg64.pyx
numpy/random/_philox.pyi
numpy/random/_sfc64.pyi
numpy/random/bit_generator.pyi
numpy/random/include/aligned_malloc.h
numpy/random/mtrand.pyi
numpy/random/mtrand.pyx
numpy/random/setup.py
numpy/random/src/distributions/distributions.c
numpy/random/src/distributions/random_hypergeometric.c
numpy/random/tests/test_direct.py
numpy/random/tests/test_generator_mt19937.py
numpy/random/tests/test_generator_mt19937_regressions.py
numpy/random/tests/test_randomstate_regression.py
numpy/random/tests/test_regression.py
numpy/rec.pyi [deleted file]
numpy/setup.py
numpy/testing/__init__.py
numpy/testing/__init__.pyi
numpy/testing/_private/extbuild.py [new file with mode: 0644]
numpy/testing/_private/utils.py
numpy/testing/_private/utils.pyi [new file with mode: 0644]
numpy/testing/setup.py
numpy/testing/utils.py
numpy/tests/test__all__.py [new file with mode: 0644]
numpy/tests/test_ctypeslib.py
numpy/tests/test_public_api.py
numpy/tests/test_reloading.py
numpy/typing/__init__.py
numpy/typing/_add_docstring.py
numpy/typing/_array_like.py
numpy/typing/_callable.py [deleted file]
numpy/typing/_callable.pyi [new file with mode: 0644]
numpy/typing/_char_codes.py
numpy/typing/_dtype_like.py
numpy/typing/_extended_precision.py
numpy/typing/_generic_alias.py
numpy/typing/_nested_sequence.py [new file with mode: 0644]
numpy/typing/_shape.py
numpy/typing/_ufunc.pyi
numpy/typing/mypy_plugin.py
numpy/typing/tests/data/fail/arithmetic.py [deleted file]
numpy/typing/tests/data/fail/arithmetic.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/array_constructors.py [deleted file]
numpy/typing/tests/data/fail/array_constructors.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/array_like.py [deleted file]
numpy/typing/tests/data/fail/array_like.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/array_pad.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/arrayprint.py [deleted file]
numpy/typing/tests/data/fail/arrayprint.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/arrayterator.py [deleted file]
numpy/typing/tests/data/fail/arrayterator.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/bitwise_ops.py [deleted file]
numpy/typing/tests/data/fail/bitwise_ops.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/char.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/chararray.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/comparisons.py [deleted file]
numpy/typing/tests/data/fail/comparisons.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/constants.py [deleted file]
numpy/typing/tests/data/fail/constants.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/datasource.py [deleted file]
numpy/typing/tests/data/fail/datasource.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/dtype.py [deleted file]
numpy/typing/tests/data/fail/dtype.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/einsumfunc.py [deleted file]
numpy/typing/tests/data/fail/einsumfunc.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/flatiter.py [deleted file]
numpy/typing/tests/data/fail/flatiter.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/fromnumeric.py [deleted file]
numpy/typing/tests/data/fail/fromnumeric.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/histograms.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/index_tricks.py [deleted file]
numpy/typing/tests/data/fail/index_tricks.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/lib_function_base.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/lib_polynomial.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/lib_utils.py [deleted file]
numpy/typing/tests/data/fail/lib_utils.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/lib_version.py [deleted file]
numpy/typing/tests/data/fail/lib_version.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/linalg.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/memmap.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/modules.py [deleted file]
numpy/typing/tests/data/fail/modules.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/multiarray.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/ndarray.py [deleted file]
numpy/typing/tests/data/fail/ndarray.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/ndarray_misc.py [deleted file]
numpy/typing/tests/data/fail/ndarray_misc.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/nditer.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/nested_sequence.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/npyio.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/numerictypes.py [deleted file]
numpy/typing/tests/data/fail/numerictypes.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/random.py [deleted file]
numpy/typing/tests/data/fail/random.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/rec.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/scalars.py [deleted file]
numpy/typing/tests/data/fail/scalars.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/shape_base.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/stride_tricks.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/testing.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/twodim_base.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/type_check.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/ufunc_config.py [deleted file]
numpy/typing/tests/data/fail/ufunc_config.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/ufunclike.py [deleted file]
numpy/typing/tests/data/fail/ufunclike.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/ufuncs.py [deleted file]
numpy/typing/tests/data/fail/ufuncs.pyi [new file with mode: 0644]
numpy/typing/tests/data/fail/warnings_and_errors.py [deleted file]
numpy/typing/tests/data/fail/warnings_and_errors.pyi [new file with mode: 0644]
numpy/typing/tests/data/misc/extended_precision.py [deleted file]
numpy/typing/tests/data/misc/extended_precision.pyi [new file with mode: 0644]
numpy/typing/tests/data/pass/arithmetic.py
numpy/typing/tests/data/pass/array_constructors.py
numpy/typing/tests/data/pass/array_like.py
numpy/typing/tests/data/pass/einsumfunc.py
numpy/typing/tests/data/pass/lib_utils.py
numpy/typing/tests/data/pass/multiarray.py
numpy/typing/tests/data/pass/simple.py
numpy/typing/tests/data/pass/warnings_and_errors.py
numpy/typing/tests/data/reveal/arithmetic.py [deleted file]
numpy/typing/tests/data/reveal/arithmetic.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/array_constructors.py [deleted file]
numpy/typing/tests/data/reveal/array_constructors.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/arraypad.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/arrayprint.py [deleted file]
numpy/typing/tests/data/reveal/arrayprint.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/arraysetops.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/arrayterator.py [deleted file]
numpy/typing/tests/data/reveal/arrayterator.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/bitwise_ops.py [deleted file]
numpy/typing/tests/data/reveal/bitwise_ops.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/char.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/chararray.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/comparisons.py [deleted file]
numpy/typing/tests/data/reveal/comparisons.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/constants.py [deleted file]
numpy/typing/tests/data/reveal/constants.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/ctypeslib.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/datasource.py [deleted file]
numpy/typing/tests/data/reveal/datasource.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/dtype.py [deleted file]
numpy/typing/tests/data/reveal/dtype.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/einsumfunc.py [deleted file]
numpy/typing/tests/data/reveal/einsumfunc.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/fft.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/flatiter.py [deleted file]
numpy/typing/tests/data/reveal/flatiter.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/fromnumeric.py [deleted file]
numpy/typing/tests/data/reveal/fromnumeric.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/getlimits.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/histograms.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/index_tricks.py [deleted file]
numpy/typing/tests/data/reveal/index_tricks.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/lib_function_base.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/lib_polynomial.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/lib_utils.py [deleted file]
numpy/typing/tests/data/reveal/lib_utils.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/lib_version.py [deleted file]
numpy/typing/tests/data/reveal/lib_version.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/linalg.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/matrix.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/memmap.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/mod.py [deleted file]
numpy/typing/tests/data/reveal/mod.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/modules.py [deleted file]
numpy/typing/tests/data/reveal/modules.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/multiarray.py [deleted file]
numpy/typing/tests/data/reveal/multiarray.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/nbit_base_example.py [deleted file]
numpy/typing/tests/data/reveal/nbit_base_example.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/ndarray_conversion.py [deleted file]
numpy/typing/tests/data/reveal/ndarray_conversion.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/ndarray_misc.py [deleted file]
numpy/typing/tests/data/reveal/ndarray_misc.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/ndarray_shape_manipulation.py [deleted file]
numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/nditer.py [deleted file]
numpy/typing/tests/data/reveal/nditer.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/nested_sequence.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/npyio.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/numeric.py [deleted file]
numpy/typing/tests/data/reveal/numeric.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/numerictypes.py [deleted file]
numpy/typing/tests/data/reveal/numerictypes.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/random.py [deleted file]
numpy/typing/tests/data/reveal/random.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/rec.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/scalars.py [deleted file]
numpy/typing/tests/data/reveal/scalars.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/shape_base.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/stride_tricks.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/testing.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/twodim_base.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/type_check.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/ufunc_config.py [deleted file]
numpy/typing/tests/data/reveal/ufunc_config.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/ufunclike.py [deleted file]
numpy/typing/tests/data/reveal/ufunclike.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/ufuncs.py [deleted file]
numpy/typing/tests/data/reveal/ufuncs.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/version.pyi [new file with mode: 0644]
numpy/typing/tests/data/reveal/warnings_and_errors.py [deleted file]
numpy/typing/tests/data/reveal/warnings_and_errors.pyi [new file with mode: 0644]
numpy/typing/tests/test_generic_alias.py
numpy/typing/tests/test_isfile.py
numpy/typing/tests/test_runtime.py
numpy/typing/tests/test_typing.py
numpy/typing/tests/test_typing_extensions.py [deleted file]
numpy/version.py
pavement.py
runtests.py
setup.cfg
setup.py
test_requirements.txt
tools/changelog.py
tools/cythonize.py
tools/download-wheels.py
tools/gitpod/gitpod.Dockerfile
tools/lint_diff.ini
tools/linter.py
tools/list_installed_dll_dependencies_cygwin.sh [new file with mode: 0644]
tools/list_numpy_dlls.sh [new file with mode: 0644]
tools/openblas_support.py
tools/rebase_installed_dlls_cygwin.sh [new file with mode: 0644]
tools/refguide_check.py
tools/swig/test/testFarray.py
tools/travis-before-install.sh
tools/travis-test.sh
tools/wheels/LICENSE_linux.txt [new file with mode: 0644]
tools/wheels/LICENSE_osx.txt [new file with mode: 0644]
tools/wheels/check_license.py [new file with mode: 0644]
tools/wheels/cibw_before_build.sh [new file with mode: 0644]
tools/wheels/cibw_test_command.sh [new file with mode: 0644]
versioneer.py

diff --git a/CITATION.bib b/CITATION.bib
new file mode 100644 (file)
index 0000000..66e7dfd
--- /dev/null
@@ -0,0 +1,20 @@
+@ARTICLE{2020NumPy-Array,
+  author  = {Harris, Charles R. and Millman, K. Jarrod and
+            van der Walt, Stéfan J and Gommers, Ralf and
+            Virtanen, Pauli and Cournapeau, David and
+            Wieser, Eric and Taylor, Julian and Berg, Sebastian and
+            Smith, Nathaniel J. and Kern, Robert and Picus, Matti and
+            Hoyer, Stephan and van Kerkwijk, Marten H. and
+            Brett, Matthew and Haldane, Allan and
+            Fernández del Río, Jaime and Wiebe, Mark and
+            Peterson, Pearu and Gérard-Marchant, Pierre and
+            Sheppard, Kevin and Reddy, Tyler and Weckesser, Warren and
+            Abbasi, Hameer and Gohlke, Christoph and
+            Oliphant, Travis E.},
+  title   = {Array programming with {NumPy}},
+  journal = {Nature},
+  year    = {2020},
+  volume  = {585},
+  pages   = {357–362},
+  doi     = {10.1038/s41586-020-2649-2}
+}
index 8050c553614a3c7d09bb69e97097ff3723636417..255e370fcea5463ed41469483326c1bd05185cd2 100644 (file)
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: numpy
-Version: 1.21.6
+Version: 1.22.0
 Summary:  NumPy is the fundamental package for array computing with Python.
 Home-page: https://www.numpy.org
 Author: Travis E. Oliphant et al.
@@ -9,7 +9,7 @@ Maintainer-email: numpy-discussion@python.org
 License: BSD
 Download-URL: https://pypi.python.org/pypi/numpy
 Project-URL: Bug Tracker, https://github.com/numpy/numpy/issues
-Project-URL: Documentation, https://numpy.org/doc/1.21
+Project-URL: Documentation, https://numpy.org/doc/1.22
 Project-URL: Source Code, https://github.com/numpy/numpy
 Platform: Windows
 Platform: Linux
@@ -23,7 +23,6 @@ Classifier: License :: OSI Approved :: BSD License
 Classifier: Programming Language :: C
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
@@ -36,7 +35,7 @@ Classifier: Operating System :: Microsoft :: Windows
 Classifier: Operating System :: POSIX
 Classifier: Operating System :: Unix
 Classifier: Operating System :: MacOS
-Requires-Python: >=3.7,<3.11
+Requires-Python: >=3.8
 License-File: LICENSE.txt
 License-File: LICENSES_bundled.txt
 
index 88c1151a0f89b2b4be67c9973229aaa48a33da34..04825dc5d9417ed7f992eecbb2b1e4f91ab5c85c 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,4 +1,26 @@
-# <img alt="NumPy" src="/branding/logo/primary/numpylogo.svg" height="60">
+# <a href="https://numpy.org/"><img alt="NumPy" src="/branding/logo/primary/numpylogo.svg" height="60"></a>
+
+<!--[![Azure Pipelines](https://dev.azure.com/numpy/numpy/_apis/build/status/numpy.numpy?branchName=main)](-->
+<!--https://dev.azure.com/numpy/numpy/_build/latest?definitionId=1?branchName=main)-->
+<!--[![Actions build_test](https://github.com/numpy/numpy/actions/workflows/build_test.yml/badge.svg)](-->
+<!--https://github.com/numpy/numpy/actions/workflows/build_test.yml)-->
+<!--[![TravisCI](https://app.travis-ci.com/numpy/numpy.svg?branch=main)](-->
+<!--https://app.travis-ci.com/numpy/numpy)-->
+<!--[![CircleCI](https://img.shields.io/circleci/project/github/numpy/numpy/main.svg?label=CircleCI)](-->
+<!--https://circleci.com/gh/numpy/numpy)-->
+<!--[![Codecov](https://codecov.io/gh/numpy/numpy/branch/main/graph/badge.svg)](-->
+<!--https://codecov.io/gh/numpy/numpy)-->
+
+[![Powered by NumFOCUS](https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A)](
+https://numfocus.org)
+[![Pypi Downloads](https://img.shields.io/pypi/dm/numpy.svg?label=Pypi%20downloads)](
+https://pypi.org/project/numpy/)
+[![Conda Downloads](https://img.shields.io/conda/dn/conda-forge/numpy.svg?label=Conda%20downloads)](
+https://anaconda.org/conda-forge/numpy)
+[![Stack Overflow](https://img.shields.io/badge/stackoverflow-Ask%20questions-blue.svg)](
+https://stackoverflow.com/questions/tagged/numpy)
+[![Nature Paper](https://img.shields.io/badge/DOI-10.1038%2Fs41592--019--0686--2-blue)](
+https://doi.org/10.1038/s41586-020-2649-2)
 
 NumPy is the fundamental package needed for scientific computing with Python.
 
@@ -29,10 +51,11 @@ Call for Contributions
 
 The NumPy project welcomes your expertise and enthusiasm!
 
-Small improvements or fixes are always appreciated; issues labeled as "good
-first issue" may be a good starting point. If you are considering larger
-contributions to the source code, please contact us through the [mailing
-list](https://mail.python.org/mailman/listinfo/numpy-discussion) first. 
+Small improvements or fixes are always appreciated; issues labeled as ["good
+first issue"](https://github.com/numpy/numpy/labels/good%20first%20issue)
+may be a good starting point. If you are considering larger contributions
+to the source code, please contact us through the [mailing
+list](https://mail.python.org/mailman/listinfo/numpy-discussion) first.
 
 Writing code isn’t the only way to contribute to NumPy. You can also: 
 - review pull requests
@@ -59,7 +82,3 @@ mailing list. You are very welcome to join.
 If you are new to contributing to open source, [this
 guide](https://opensource.guide/how-to-contribute/) helps explain why, what,
 and how to successfully get involved.
-
-
-
-[![Powered by NumFOCUS](https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A)](https://numfocus.org)
diff --git a/_configtest.c b/_configtest.c
new file mode 100644 (file)
index 0000000..fb34dbf
--- /dev/null
@@ -0,0 +1,7 @@
+
+/* This file is generated from numpy/distutils/system_info.py */
+void ATL_buildinfo(void);
+int main(void) {
+  ATL_buildinfo();
+  return 0;
+}
diff --git a/_configtest.o b/_configtest.o
new file mode 100644 (file)
index 0000000..95a4e91
Binary files /dev/null and b/_configtest.o differ
index d9222d49572a5feabbce8b4b57e98aca091a4a07..029adb5898db08a882aafc81059000a68d987de8 100644 (file)
@@ -35,7 +35,7 @@
 
     // The Pythons you'd like to test against.  If not provided, defaults
     // to the current version of Python used to run `asv`.
-    "pythons": ["3.7"],
+    // "pythons": ["3.9"],
 
     // The matrix of dependencies to test.  Each key is the name of a
     // package (in PyPI) and the values are version numbers.  An empty
index 03d13d985c8d9200809a22a6fe572bc6a06e0793..93d12d4a0b777639bad5ecebf21be1cd0a556374 100644 (file)
@@ -39,7 +39,7 @@
 
     // The Pythons you'd like to test against.  If not provided, defaults
     // to the current version of Python used to run `asv`.
-    "pythons": ["3.7"],
+    // "pythons": ["3.9"],
 
     // The matrix of dependencies to test.  Each key is the name of a
     // package (in PyPI) and the values are version numbers.  An empty
index 213ff0020293eb3d06c62c62a37254d7f8709fa9..75aa510a6b81f124ed55212dc67fdba5eddf44ca 100644 (file)
@@ -2,41 +2,31 @@ from .common import Benchmark
 
 import numpy as np
 
-unary_ufuncs = ['sin',
-              'cos',
-              'exp',
-              'log',
-              'sqrt',
-              'absolute',
-              'reciprocal',
-              'square',
-              'rint',
-              'floor',
-              'ceil' ,
-              'trunc',
-              'frexp',
-              'isnan',
-              'isfinite',
-              'isinf',
-              'signbit']
+UNARY_UFUNCS = [obj for obj in np.core.umath.__dict__.values() if
+        isinstance(obj, np.ufunc)]
+UNARY_OBJECT_UFUNCS = [uf for uf in UNARY_UFUNCS if "O->O" in uf.types]
+UNARY_OBJECT_UFUNCS.remove(getattr(np, 'invert'))
+
 stride = [1, 2, 4]
 stride_out = [1, 2, 4]
 dtype  = ['f', 'd']
 
 class Unary(Benchmark):
-    params = [unary_ufuncs, stride, stride_out, dtype]
+    params = [UNARY_OBJECT_UFUNCS, stride, stride_out, dtype]
     param_names = ['ufunc', 'stride_in', 'stride_out', 'dtype']
     timeout = 10
 
     def setup(self, ufuncname, stride, stride_out, dtype):
         np.seterr(all='ignore')
         try:
-            self.f = getattr(np, ufuncname)
+            self.f = ufuncname
         except AttributeError:
             raise NotImplementedError(f"No ufunc {ufuncname} found") from None
-        N = 10000
-        self.arr = np.ones(stride*N, dtype)
+        N = 100000
         self.arr_out = np.empty(stride_out*N, dtype)
+        self.arr = np.random.rand(stride*N).astype(dtype)
+        if (ufuncname.__name__ == 'arccosh'):
+            self.arr = 1.0 + self.arr
 
     def time_ufunc(self, ufuncname, stride, stride_out, dtype):
         self.f(self.arr[::stride], self.arr_out[::stride_out])
diff --git a/doc/BRANCH_WALKTHROUGH.rst b/doc/BRANCH_WALKTHROUGH.rst
new file mode 100644 (file)
index 0000000..95de546
--- /dev/null
@@ -0,0 +1,77 @@
+This file contains a walkthrough of branching NumPy 1.21.x on Linux.  The
+commands can be copied into the command line, but be sure to replace 1.21 and
+1.22 by the correct versions. It is good practice to make ``.mailmap`` as
+current as possible before making the branch, that may take several weeks.
+
+This should be read together with the general directions in `releasing`.
+
+Branching
+=========
+
+Make the branch
+---------------
+
+This is only needed when starting a new maintenance branch. Because
+NumPy now depends on tags to determine the version, the start of a new
+development cycle in the main branch needs an annotated tag. That is done
+as follows::
+
+    $ git checkout main
+    $ git pull upstream main
+    $ git commit --allow-empty -m'REL: Begin NumPy 1.22.0 development'
+    $ git push upstream HEAD
+
+If the push fails because new PRs have been merged, do::
+
+    $ git pull --rebase upstream
+
+and repeat the push. Once the push succeeds, tag it::
+
+    $ git tag -a -s v1.22.0.dev0 -m'Begin NumPy 1.22.0 development'
+    $ git push upstream v1.22.0.dev0
+
+then make the new branch and push it::
+
+    $ git branch maintenance/1.21.x HEAD^
+    $ git push upstream maintenance/1.21.x
+
+Prepare the main branch for further development
+-----------------------------------------------
+
+Make a PR branch to prepare main for further development::
+
+    $ git checkout -b 'prepare-main-for-1.22.0-development' v1.22.0.dev0
+
+Delete the release note fragments::
+
+    $ git rm doc/release/upcoming_changes/[0-9]*.*.rst
+
+Create the new release notes skeleton and add to index::
+
+    $ cp doc/source/release/template.rst doc/source/release/1.22.0-notes.rst
+    $ gvim doc/source/release/1.22.0-notes.rst  # put the correct version
+    $ git add doc/source/release/1.22.0-notes.rst
+    $ gvim doc/source/release.rst  # add new notes to notes index
+    $ git add doc/source/release.rst
+
+Update ``pavement.py`` and update the ``RELEASE_NOTES`` variable to point to
+the new notes::
+
+    $ gvim pavement.py
+    $ git add pavement.py
+
+Update ``cversions.txt`` to add current release. There should be no new hash
+to worry about at this early point, just add a comment following previous
+practice::
+
+    $ gvim numpy/core/code_generators/cversions.txt
+    $ git add numpy/core/code_generators/cversions.txt
+
+Check your work, commit it, and push::
+
+    $ git status  # check work
+    $ git commit -m'REL: Prepare main for NumPy 1.22.0 development'
+    $ git push origin HEAD
+
+Now make a pull request.
+
index 9af58dd24e96a2909067f1d33373da9e98b97634..37e047f9fbf0498303f0d63c3b2bcc173d161688 100644 (file)
@@ -12,7 +12,6 @@ useful info can be found.
 Source tree
 -----------
 - INSTALL.rst.txt
-- release.sh
 - pavement.py
 
 
@@ -69,8 +68,8 @@ reported.
 Tool chain
 ==========
 We build all our wheels on cloud infrastructure - so this list of compilers is
-for information and debugging builds locally.  See the ``.travis.yml`` and
-``appveyor.yml`` scripts in the `numpy wheels`_ repo for the definitive source
+for information and debugging builds locally.  See the ``.travis.yml`` script
+in the `numpy wheels`_ repo for the definitive source
 of the build recipes. Packages that are available using pip are noted.
 
 
@@ -194,11 +193,10 @@ Make sure current branch builds a package correctly
 ::
 
     git clean -fxd
-    python setup.py bdist
+    python setup.py bdist_wheel
     python setup.py sdist
 
-To actually build the binaries after everything is set up correctly, the
-release.sh script can be used. For details of the build process itself, it is
+For details of the build process itself, it is
 best to read the pavement.py script.
 
 .. note:: The following steps are repeated for the beta(s), release
@@ -278,9 +276,8 @@ following:
 
 Update the release status and create a release "tag"
 ----------------------------------------------------
-Identify the commit hash of the release, e.g. 1b2e1d63ff.
+Identify the commit hash of the release, e.g. 1b2e1d63ff::
 
-::
     git co 1b2e1d63ff # gives warning about detached head
 
 First, change/check the following variables in ``pavement.py`` depending on the
@@ -345,7 +342,7 @@ define NPY_x_y_API_VERSION in numpyconfig.h
 
 Trigger the wheel builds
 ------------------------
-See the `MacPython/numpy wheels` repository.
+See the `numpy wheels`_ repository.
 
 In that repository edit the files:
 
index 68d496389e849ea8340af8fb746ad7a30b5a636c..16fc3229d4c90ba015ff0898efaad648f4561c77 100644 (file)
@@ -14,6 +14,7 @@ PYTHON = python$(PYVER)
 SPHINXOPTS    ?=
 SPHINXBUILD   ?= LANG=C sphinx-build
 PAPER         ?=
+DOXYGEN       ?= doxygen
 # For merging a documentation archive into a git checkout of numpy/doc
 # Turn a tag like v1.18.0 into 1.18
 # Use sed -n -e 's/patttern/match/p' to return a blank value if no match
@@ -77,7 +78,7 @@ INSTALL_DIR = $(CURDIR)/build/inst-dist
 INSTALL_PPH = $(INSTALL_DIR)/lib/python$(PYVER)/site-packages:$(INSTALL_DIR)/local/lib/python$(PYVER)/site-packages:$(INSTALL_DIR)/lib/python$(PYVER)/dist-packages:$(INSTALL_DIR)/local/lib/python$(PYVER)/dist-packages
 UPLOAD_DIR=/srv/docs_scipy_org/doc/numpy-$(RELEASE)
 
-DIST_VARS=SPHINXBUILD="LANG=C PYTHONPATH=$(INSTALL_PPH) python$(PYVER) `which sphinx-build`" PYTHON="PYTHONPATH=$(INSTALL_PPH) python$(PYVER)" 
+DIST_VARS=SPHINXBUILD="LANG=C PYTHONPATH=$(INSTALL_PPH) python$(PYVER) `which sphinx-build`" PYTHON="PYTHONPATH=$(INSTALL_PPH) python$(PYVER)"
 
 NUMPYVER:=$(shell $(PYTHON) -c "import numpy; print(numpy.version.git_revision[:10])" 2>/dev/null)
 GITVER ?= $(shell cd ..; $(PYTHON) -c "import versioneer as v; print(v.get_versions()['full-revisionid'][:10])")
@@ -176,6 +177,12 @@ build/generate-stamp: $(wildcard source/reference/*.rst)
 html: version-check html-build
 html-build: generate
        mkdir -p build/html build/doctrees
+       $(PYTHON) preprocess.py
+ifeq (, $(shell which $(DOXYGEN)))
+       @echo "Unable to find 'Doxygen:$(DOXYGEN)', skip generating C/C++ API from comment blocks."
+else
+       $(DOXYGEN) build/doxygen/Doxyfile
+endif
        $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) build/html $(FILES)
        $(PYTHON) postprocess.py html build/html/*.html
        @echo
index 4fbc7af1c6f46be4b9e13d974cbb193a6d8e17d2..42d84e04b25abfe86b43f0e003266bb180608559 100644 (file)
@@ -1,7 +1,7 @@
-This file contains a walkthrough of the NumPy 1.19.0 release on Linux, modified
+This file contains a walkthrough of the NumPy 1.21.0 release on Linux, modified
 for building on azure and uploading to anaconda.org
 The commands can be copied into the command line, but be sure to
-replace 1.19.0 by the correct version.
+replace 1.21.0 by the correct version.
 
 This should be read together with the general directions in `releasing`.
 
@@ -13,46 +13,72 @@ Backport Pull Requests
 ----------------------
 
 Changes that have been marked for this release must be backported to the
-maintenance/1.19.x branch.
+maintenance/1.21.x branch.
 
 
 Update Release documentation
 ----------------------------
 
-The file ``doc/changelog/1.19.0-changelog.rst`` should be updated to reflect
-the final list of changes and contributors. This text can be generated by::
+Four documents usually need to be updated or created before making a release:
 
-    $ python tools/changelog.py $GITHUB v1.18.0..maintenance/1.19.x > doc/changelog/1.19.0-changelog.rst
+- The changelog
+- The release-notes
+- The ``.mailmap`` file
+- The ``doc/source/release.rst`` file
 
-where ``GITHUB`` contains your github access token. This text may also be
-appended to ``doc/release/1.19.0-notes.rst`` for patch release, though not for
-new releases like ``1.19.0``, as the changelogs for ``*.0`` releases tend to be
-excessively long. The ``doc/source/release.rst`` file should also be updated
-with a link to the new release notes. These changes should be committed to the
-maintenance branch, and later will be forward ported to main. The changelog
-should be reviewed for name duplicates or short names and the ``.mailmap`` file
-updated if needed.
+These changes should be made as an ordinary PR against the maintenance branch.
+After release all files except ``doc/source/release.rst``  will need to be
+forward ported to the main branch.
 
+Generate the changelog
+~~~~~~~~~~~~~~~~~~~~~~
 
-Finish the Release Note
------------------------
+The changelog is generated using the changelog tool::
 
-.. note:
+    $ python tools/changelog.py $GITHUB v1.20.0..maintenance/1.21.x > doc/changelog/1.21.0-changelog.rst
 
-  This has changed now that we use ``towncrier``. See the instructions for
-  creating the release note in ``doc/release/upcoming_changes/README.rst``.
+where ``GITHUB`` contains your GitHub access token. The text will need to be
+checked for non-standard contributor names and dependabot entries removed. It
+is also a good idea to remove any links that may be present in the PR titles
+as they don't translate well to markdown, replace them with monospaced text. The
+non-standard contributor names should be fixed by updating the ``.mailmap``
+file, which is a lot of work. It is best to make several trial runs before
+reaching this point and ping the malefactors using a GitHub issue to get the
+needed information.
 
-Fill out the release note ``doc/release/1.19.0-notes.rst`` calling out
-significant changes.
+Finish the release notes
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+If this is the first release in a series the release note is generated, see
+the release note in ``doc/release/upcoming_changes/README.rst`` to see how to
+do this. Generating the release notes will also delete all the news
+fragment files in ``doc/release/upcoming_changes/``.
+
+The generated release note will always need some fixups, the introduction will
+need to be written, and significant changes should be called out. For patch
+releases the changelog text may also be appended, but not for the initial
+release as it is too long. Check previous release notes to see how this is
+done. Note that the ``:orphan:`` markup at the top, if present, will need
+changing to ``.. currentmodule:: numpy`` and the ``doc/source/release.rst``
+index file will need updating.
+
+Check the pavement.py file
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Check that the pavement.py file points to the correct release notes. It should
+have been updated after the last release, but if not, fix it now::
+
+    $gvim pavement.py
 
 
 Release  Walkthrough
 ====================
 
 Note that in the code snippets below, ``upstream`` refers to the root repository on
-github and ``origin`` to a fork in your personal account. You may need to make adjustments
-if you have not forked the repository but simply cloned it locally. You can
-also edit ``.git/config`` and add ``upstream`` if it isn't already present.
+GitHub and ``origin`` to its fork in your personal GitHub repositories. You may
+need to make adjustments if you have not forked the repository but simply
+cloned it locally. You can also edit ``.git/config`` and add ``upstream`` if it
+isn't already present.
 
 Prepare the release commit
 --------------------------
@@ -60,24 +86,20 @@ Prepare the release commit
 Checkout the branch for the release, make sure it is up to date, and clean the
 repository::
 
-    $ git checkout maintenance/1.19.x
-    $ git pull upstream maintenance/1.19.x
+    $ git checkout maintenance/1.21.x
+    $ git pull upstream maintenance/1.21.x
     $ git submodule update
     $ git clean -xdfq
 
-Edit pavement.py and setup.py as detailed in HOWTO_RELEASE::
-
-    $ gvim pavement.py setup.py  # Generally only setup.py needs updating
-    $ git commit -a -m"REL: NumPy 1.19.0 release."
-
 Sanity check::
 
     $ python3 runtests.py -m "full"
 
-Push this release directly onto the end of the maintenance branch. This
-requires write permission to the numpy repository::
+Tag the release and push the tag. This requires write permission for the numpy
+repository::
 
-    $ git push upstream HEAD
+    $ git tag -a -s v1.21.0 -m"NumPy 1.21.0 release"
+    $ git push upstream v1.21.0
 
 
 Build source releases
@@ -87,7 +109,6 @@ Paver is used to build the source releases. It will create the ``release`` and
 ``release/installers`` directories and put the ``*.zip`` and ``*.tar.gz``
 source releases in the latter. ::
 
-    $ python3 -m cython --version  # check for correct cython version
     $ paver sdist  # sdist will do a git clean -xdfq, so we omit that
 
 
@@ -102,19 +123,20 @@ someone else, then create a new branch for the series. If the branch already
 exists skip this::
 
     $ cd ../numpy-wheels
-    $ git co master
-    $ git pull upstream master
-    $ git branch v1.19.x
+    $ git checkout main
+    $ git pull upstream main
+    $ git branch v1.21.x
 
 Checkout the new branch and edit the ``azure-pipelines.yml`` and
 ``.travis.yml`` files to make sure they have the correct version, and put in
-the commit hash for the ``REL`` commit created above for ``BUILD_COMMIT``. The
-``azure/posix.yml`` and ``.travis.yml`` files may also need the Cython versions
-updated to keep up with Python releases, but generally just do::
-
-    $ git checkout v1.19.x
-    $ gvim azure-pipelines .travis.yml
-    $ git commit -a -m"NumPy 1.19.0 release."
+the commit hash for the ``REL`` commit created above for ``BUILD_COMMIT``
+variable. The ``azure/posix.yml`` and ``.travis.yml`` files may also need the
+Cython versions updated to keep up with Python releases, but generally just
+do::
+
+    $ git checkout v1.21.x
+    $ gvim azure-pipelines.yml .travis.yml
+    $ git commit -a -m"NumPy 1.21.0 release."
     $ git push upstream HEAD
 
 Now wait. If you get nervous at the amount of time taken -- the builds can take
@@ -134,7 +156,7 @@ When the wheels have all been successfully built and staged, download them from
 Anaconda staging directory using the ``tools/download-wheels.py`` script::
 
     $ cd ../numpy
-    $ python3 tools/download-wheels.py 1.19.0
+    $ python3 tools/download-wheels.py 1.21.0
 
 
 Generate the README files
@@ -146,47 +168,24 @@ file is updated for continued development::
     $ paver write_release
 
 
-Tag the release
----------------
-
-Once the wheels have been built and downloaded without errors tag the ``REL`` commit, signing
-it with your gpg key::
-
-    $ git tag -s -m"NumPy 1.19.0 release" v1.19.0
-
-You should upload your public gpg key to github, so that the tag will appear
-"verified" there.
-
-Check that the files in ``release/installers`` have the correct versions, then
-push the tag upstream::
-
-    $ git push upstream v1.19.0
-
-We wait until this point to push the tag because it is public and should not
-be changed after it has been pushed.
-
-
 Reset the maintenance branch into a development state
 -----------------------------------------------------
 
-Add another ``REL`` commit to the numpy maintenance branch, which resets the
-``ISREALEASED`` flag to ``False`` and increments the version counter::
-
-    $ gvim pavement.py setup.py
+Create release notes for next release and edit them to set the version. These
+notes will be a skeleton and have little content::
 
-Create release notes for next release and edit them to set the version::
+    $ cp doc/source/release/template.rst doc/source/release/1.21.1-notes.rst
+    $ gvim doc/source/release/1.21.1-notes.rst
+    $ git add doc/source/release/1.21.1-notes.rst
 
-    $ cp doc/source/release/template.rst doc/source/release/1.19.1-notes.rst
-    $ gvim doc/source/release/1.19.1-notes.rst
-    $ git add doc/source/release/1.19.1-notes.rst
+Add new release notes to the documentation release list and update the
+``RELEASE_NOTES`` variable in ``pavement.py``.
 
-Add new release notes to the documentation release list::
-
-    $ gvim doc/source/release.rst
+    $ gvim doc/source/release.rst pavement.py
 
 Commit the result::
 
-    $ git commit -a -m"REL: prepare 1.19.x for further development"
+    $ git commit -a -m"REL: prepare 1.21.x for further development"
     $ git push upstream HEAD
 
 
@@ -194,33 +193,37 @@ Upload to PyPI
 --------------
 
 Upload to PyPI using ``twine``. A recent version of ``twine`` of is needed
-after recent PyPI changes, version ``3.1.1`` was used here::
+after recent PyPI changes, version ``3.4.1`` was used here::
 
     $ cd ../numpy
     $ twine upload release/installers/*.whl
-    $ twine upload release/installers/numpy-1.19.0.zip  # Upload last.
+    $ twine upload release/installers/numpy-1.21.0.zip  # Upload last.
 
 If one of the commands breaks in the middle, you may need to selectively upload
 the remaining files because PyPI does not allow the same file to be uploaded
 twice. The source file should be uploaded last to avoid synchronization
 problems that might occur if pip users access the files while this is in
-process. Note that PyPI only allows a single source distribution, here we have
+process, causing pip to build from source rather than downloading a binary
+wheel. PyPI only allows a single source distribution, here we have
 chosen the zip archive.
 
 
 Upload files to github
 ----------------------
 
-Go to `<https://github.com/numpy/numpy/releases>`_, there should be a ``v1.19.0
+Go to `<https://github.com/numpy/numpy/releases>`_, there should be a ``v1.21.0
 tag``, click on it and hit the edit button for that tag. There are two ways to
-add files, using an editable text window and as binary uploads. Cut and paste
-the ``release/README.md`` file contents into the text window. You will probably
-need to make some edits to get it to look right. Then
-
-- Upload ``release/installers/numpy-1.19.0.tar.gz`` as a binary file.
-- Upload ``release/installers/numpy-1.19.0.zip`` as a binary file.
+add files, using an editable text window and as binary uploads. Start by
+editing the ``release/README.md`` that is translated from the rst version using
+pandoc. Things that will need fixing: PR lines from the changelog, if included,
+are wrapped and need unwrapping, links should be changed to monospaced text.
+Then copy the contents to the clipboard and paste them into the text window. It
+may take several tries to get it look right. Then
+
+- Upload ``release/installers/numpy-1.21.0.tar.gz`` as a binary file.
+- Upload ``release/installers/numpy-1.21.0.zip`` as a binary file.
 - Upload ``release/README.rst`` as a binary file.
-- Upload ``doc/changelog/1.19.0-changelog.rst`` as a binary file.
+- Upload ``doc/changelog/1.21.0-changelog.rst`` as a binary file.
 - Check the pre-release button if this is a pre-releases.
 - Hit the ``{Publish,Update} release`` button at the bottom.
 
@@ -228,9 +231,11 @@ need to make some edits to get it to look right. Then
 Upload documents to numpy.org
 -----------------------------
 
-This step is only needed for final releases and can be skipped for
-pre-releases. ``make merge-doc`` clones the ``numpy/doc`` repo into
+This step is only needed for final releases and can be skipped for pre-releases
+and most patch releases. ``make merge-doc`` clones the ``numpy/doc`` repo into
 ``doc/build/merge`` and updates it with the new documentation::
+Note that if you have a `.local` numpy install, you should either remove it or
+install the current version for the docs to pick up the correct NumPy version.
 
     $ pushd doc
     $ make dist
@@ -245,7 +250,7 @@ If the release series is a new one, you will need to add a new section to the
 Otherwise, only the ``zip`` and ``pdf`` links should be updated with the
 new tag name::
 
-    $ gvim doc/build/merge/index.html +/'tag v1.19'
+    $ gvim doc/build/merge/index.html +/'tag v1.21'
 
 You can "test run" the new documentation in a browser to make sure the links
 work::
@@ -254,12 +259,12 @@ work::
 
 Update the stable link::
 
-    $ ln -sfn 1.19 stable
+    $ ln -sfn 1.21 stable
 
 Once everything seems satisfactory, commit and upload the changes::
 
     $ pushd doc/build/merge
-    $ git commit -am"Add documentation for v1.19.0"
+    $ git commit -a -m"Add documentation for v1.21.0"
     $ git push
     $ popd
 
@@ -271,14 +276,13 @@ This assumes that you have forked `<https://github.com/scipy/scipy.org>`_::
     $ cd ../scipy.org
     $ git checkout master
     $ git pull upstream master
-    $ git checkout -b numpy-1.19.0
+    $ git checkout -b numpy-1.21.0
     $ gvim www/index.rst # edit the News section
     $ git commit -a
     $ git push origin HEAD
 
 Now go to your fork and make a pull request for the branch.
 
-
 Announce to mailing lists
 -------------------------
 
@@ -294,14 +298,14 @@ Post-Release Tasks
 
 Checkout main and forward port the documentation changes::
 
-    $ git checkout -b post-1.19.0-release-update
-    $ git checkout maintenance/1.19.x doc/source/release/1.19.0-notes.rst
-    $ git checkout maintenance/1.19.x doc/changelog/1.19.0-changelog.rst
-    $ git checkout maintenance/1.19.x .mailmap  # only if updated for release.
+    $ git checkout -b post-1.21.0-release-update
+    $ git checkout maintenance/1.21.x doc/source/release/1.21.0-notes.rst
+    $ git checkout maintenance/1.21.x doc/changelog/1.21.0-changelog.rst
+    $ git checkout maintenance/1.21.x .mailmap  # only if updated for release.
     $ gvim doc/source/release.rst  # Add link to new notes
-    $ git add doc/changelog/1.19.0-changelog.rst doc/source/release/1.19.0-notes.rst
+    $ git add doc/changelog/1.21.0-changelog.rst doc/source/release/1.21.0-notes.rst
     $ git status  # check status before commit
-    $ git commit -a -m"REL: Update main after 1.19.0 release."
+    $ git commit -a -m"REL: Update main after 1.21.0 release."
     $ git push origin HEAD
 
-Go to github and make a PR.
+Go to GitHub and make a PR.
index ba09aa80028a1bb55e7b688764443139297dca91..0d8137f4a7e16496d79f43ef3a20421cbc0e2f97 100644 (file)
@@ -16,13 +16,7 @@ Our goal is that every module and package in NumPy
 should have a thorough set of unit
 tests. These tests should exercise the full functionality of a given
 routine as well as its robustness to erroneous or unexpected input
-arguments. Long experience has shown that by far the best time to
-write the tests is before you write or change the code - this is
-`test-driven development
-<https://en.wikipedia.org/wiki/Test-driven_development>`__.  The
-arguments for this can sound rather abstract, but we can assure you
-that you will find that writing the tests first leads to more robust
-and better designed code. Well-designed tests with good coverage make
+arguments. Well-designed tests with good coverage make
 an enormous difference to the ease of refactoring. Whenever a new bug
 is found in a routine, you should write a new test for that specific
 case and add it to the test suite to prevent that bug from creeping
@@ -145,6 +139,21 @@ originally written without unit tests, there are still several modules
 that don't have tests yet. Please feel free to choose one of these
 modules and develop tests for it.
 
+Using C code in tests
+---------------------
+
+NumPy exposes a rich :ref:`C-API<c-api>` . These are tested using c-extension
+modules written "as-if" they know nothing about the internals of NumPy, rather
+using the official C-API interfaces only. Examples of such modules are tests
+for a user-defined ``rational`` dtype in ``_rational_tests`` or the ufunc
+machinery tests in ``_umath_tests`` which are part of the binary distribution.
+Starting from version 1.21, you can also write snippets of C code in tests that
+will be compiled locally into c-extension modules and loaded into python.
+
+.. currentmodule:: numpy.testing.extbuild
+
+.. autofunction:: build_and_import_extension
+
 Labeling tests
 --------------
 
diff --git a/doc/cdoc/Doxyfile b/doc/cdoc/Doxyfile
deleted file mode 100644 (file)
index c9c386e..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-# Doxyfile for NumPy C API
-# See http://www.doxygen.nl/manual/config.html
-PROJECT_NAME           = numpy
-PROJECT_NUMBER         = 2.0.0
-OUTPUT_DIRECTORY       = build
-STRIP_FROM_PATH        = ../../numpy/core
-INHERIT_DOCS           = YES
-TAB_SIZE               = 8
-OPTIMIZE_OUTPUT_FOR_C  = YES
-EXTRACT_ALL            = YES
-EXTRACT_PRIVATE        = YES
-EXTRACT_STATIC         = YES
-CASE_SENSE_NAMES       = NO
-INPUT                  = ../../numpy/core/src \
-                         ../../numpy/core/include
-FILE_PATTERNS          = *.h *.c *.src
-RECURSIVE              = YES
-INPUT_FILTER           = ./numpyfilter.py
-REFERENCED_BY_RELATION = YES
-REFERENCES_RELATION    = YES
-ALPHABETICAL_INDEX     = NO
-GENERATE_HTML          = YES
-HTML_TIMESTAMP         = YES
-GENERATE_TREEVIEW      = YES
-SEARCHENGINE           = NO
-GENERATE_LATEX         = NO
-PAPER_TYPE             = a4wide
-GENERATE_XML           = NO
-HAVE_DOT               = NO
diff --git a/doc/cdoc/Makefile b/doc/cdoc/Makefile
deleted file mode 100644 (file)
index 8b9dead..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-all: build
-
-build:
-       doxygen
-
-clean:
-       rm -rf build
-
-.PHONY: all build clean
-
diff --git a/doc/cdoc/README b/doc/cdoc/README
deleted file mode 100644 (file)
index a5363cf..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-cdoc
-====
-
-This is a simple Doxygen project for building NumPy C code documentation,
-with docstrings extracted from the C sources themselves.
-
-The understood syntax for documentation in the C source is
-
-    /*
-     * Some text in reStructuredText format
-     */
-    int function_to_which_the_text_applies() 
-    {
-        ...
-    }
-
-    /*
-     * More text in reStructuredText format
-     */
-    struct
-    {
-        int variable_1; /* Documentation for variable_1 */
-
-        /*
-         * Documentation for variable_2
-         */
-        int variable_2;
-    } struct_name_t;
-
-Please do not use JavaDoc or Doxygen-specific formatting at the moment.
-
diff --git a/doc/cdoc/numpyfilter.py b/doc/cdoc/numpyfilter.py
deleted file mode 100755 (executable)
index d3cfe18..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/usr/bin/env python3
-"""
-numpyfilter.py [-h] inputfile
-
-Interpret C comments as ReStructuredText, and replace them by the HTML output.
-Also, add Doxygen /** and /**< syntax automatically where appropriate.
-
-"""
-import sys
-import re
-import os
-import textwrap
-
-from numpy.compat import pickle
-
-CACHE_FILE = 'build/rst-cache.pck'
-
-def main():
-    import argparse
-
-    parser = argparse.ArgumentParser(usage=__doc__.strip())
-    parser.add_argument('input_file', help='input file')
-    args = parser.parse_args()
-
-    comment_re = re.compile(r'(\n.*?)/\*(.*?)\*/', re.S)
-
-    cache = load_cache()
-
-    try:
-        with open(args.input_file, 'r') as f:
-            text = f.read()
-            text = comment_re.sub(lambda m: process_match(m, cache), text)
-            sys.stdout.write(text)
-    finally:
-        save_cache(cache)
-
-def filter_comment(text):
-    if text.startswith('NUMPY_API'):
-        text = text[9:].strip()
-    if text.startswith('UFUNC_API'):
-        text = text[9:].strip()
-
-    html = render_html(text)
-    return html
-
-def process_match(m, cache=None):
-    pre, rawtext = m.groups()
-
-    preline = pre.split("\n")[-1]
-
-    if cache is not None and rawtext in cache:
-        text = cache[rawtext]
-    else:
-        text = re.compile(r'^\s*\*', re.M).sub('', rawtext)
-        text = textwrap.dedent(text)
-        text = filter_comment(text)
-
-        if cache is not None:
-            cache[rawtext] = text
-
-    if preline.strip():
-        return pre + "/**< " + text + " */"
-    else:
-        return pre + "/** " + text + " */"
-
-def load_cache():
-    if os.path.exists(CACHE_FILE):
-        with open(CACHE_FILE, 'rb') as f:
-            try:
-                cache = pickle.load(f)
-            except Exception:
-                cache = {}
-    else:
-        cache = {}
-    return cache
-
-def save_cache(cache):
-    with open(CACHE_FILE + '.new', 'wb') as f:
-        pickle.dump(cache, f)
-    os.rename(CACHE_FILE + '.new', CACHE_FILE)
-
-def render_html(text):
-    import docutils.parsers.rst
-    import docutils.writers.html4css1
-    import docutils.core
-
-    docutils.parsers.rst.roles.DEFAULT_INTERPRETED_ROLE = 'title-reference'
-    writer = docutils.writers.html4css1.Writer()
-    parts = docutils.core.publish_parts(
-        text,
-        writer=writer,
-        settings_overrides = dict(halt_level=5,
-                                  traceback=True,
-                                  default_reference_context='title-reference',
-                                  stylesheet_path='',
-                                  # security settings:
-                                  raw_enabled=0,
-                                  file_insertion_enabled=0,
-                                  _disable_config=1,
-                                  )
-    )
-    return parts['html_body']
-
-if __name__ == "__main__": main()
index ecc1d1d92da4b6d655c5aa9ca95d0bdf629285ba..3452627c0ab6f2af8b0f6a70735016e98ed6b541 100644 (file)
@@ -18,7 +18,7 @@ Pull requests merged
 
 A total of 9 pull requests were merged for this release.
 
-* `#20278 <https://github.com/numpy/numpy/pull/20278>`__: BUG: Fix shadowed reference of `dtype` in type stub
+* `#20278 <https://github.com/numpy/numpy/pull/20278>`__: BUG: Fix shadowed reference of ``dtype`` in type stub
 * `#20293 <https://github.com/numpy/numpy/pull/20293>`__: BUG: Fix headers for universal2 builds
 * `#20294 <https://github.com/numpy/numpy/pull/20294>`__: BUG: ``VOID_nonzero`` could sometimes mutate alignment flag
 * `#20295 <https://github.com/numpy/numpy/pull/20295>`__: BUG: Do not use nonzero fastpath on unaligned arrays
@@ -26,4 +26,4 @@ A total of 9 pull requests were merged for this release.
 * `#20297 <https://github.com/numpy/numpy/pull/20297>`__: BUG, SIMD: Fix 64-bit/8-bit integer division by a scalar
 * `#20298 <https://github.com/numpy/numpy/pull/20298>`__: BUG, SIMD: Workaround broadcasting SIMD 64-bit integers on MSVC...
 * `#20300 <https://github.com/numpy/numpy/pull/20300>`__: REL: Prepare for the NumPy 1.21.4 release.
-* `#20302 <https://github.com/numpy/numpy/pull/20302>`__: TST: Fix a `Arrayterator` typing test failure
+* `#20302 <https://github.com/numpy/numpy/pull/20302>`__: TST: Fix a ``Arrayterator`` typing test failure
diff --git a/doc/changelog/1.21.5-changelog.rst b/doc/changelog/1.21.5-changelog.rst
deleted file mode 100644 (file)
index acd3599..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-
-Contributors
-============
-
-A total of 7 people contributed to this release.  People with a "+" by their
-names contributed a patch for the first time.
-
-* Bas van Beek
-* Charles Harris
-* Matti Picus
-* Rohit Goswami +
-* Ross Barnowski
-* Sayed Adel
-* Sebastian Berg
-
-Pull requests merged
-====================
-
-A total of 11 pull requests were merged for this release.
-
-* `#20357 <https://github.com/numpy/numpy/pull/20357>`__: MAINT: Do not forward `__(deep)copy__` calls of `_GenericAlias`...
-* `#20462 <https://github.com/numpy/numpy/pull/20462>`__: BUG: Fix float16 einsum fastpaths using wrong tempvar
-* `#20463 <https://github.com/numpy/numpy/pull/20463>`__: BUG, DIST: Print os error message when the executable not exist
-* `#20464 <https://github.com/numpy/numpy/pull/20464>`__: BLD: Verify the ability to compile C++ sources before initiating...
-* `#20465 <https://github.com/numpy/numpy/pull/20465>`__: BUG: Force ``npymath` ` to respect ``npy_longdouble``
-* `#20466 <https://github.com/numpy/numpy/pull/20466>`__: BUG: Fix failure to create aligned, empty structured dtype
-* `#20467 <https://github.com/numpy/numpy/pull/20467>`__: ENH: provide a convenience function to replace npy_load_module
-* `#20495 <https://github.com/numpy/numpy/pull/20495>`__: MAINT: update wheel to version that supports python3.10
-* `#20497 <https://github.com/numpy/numpy/pull/20497>`__: BUG: Clear errors correctly in F2PY conversions
-* `#20613 <https://github.com/numpy/numpy/pull/20613>`__: DEV: add a warningfilter to fix pytest workflow.
-* `#20618 <https://github.com/numpy/numpy/pull/20618>`__: MAINT: Help boost::python libraries at least not crash
diff --git a/doc/changelog/1.21.6-changelog.rst b/doc/changelog/1.21.6-changelog.rst
deleted file mode 100644 (file)
index 5d869ee..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-
-Contributors
-============
-
-A total of 1 people contributed to this release.  People with a "+" by their
-names contributed a patch for the first time.
-
-* Charles Harris
-
-Pull requests merged
-====================
-
-A total of 1 pull requests were merged for this release.
-
-* `#21318 <https://github.com/numpy/numpy/pull/21318>`__: REV: Revert pull request #20464 from charris/backport-20354
diff --git a/doc/changelog/1.22.0-changelog.rst b/doc/changelog/1.22.0-changelog.rst
new file mode 100644 (file)
index 0000000..c7a49bc
--- /dev/null
@@ -0,0 +1,775 @@
+
+Contributors
+============
+
+A total of 153 people contributed to this release.  People with a "+" by their
+names contributed a patch for the first time.
+
+* @DWesl
+* @Illviljan
+* @h-vetinari
+* @yan-wyb +
+* Aaron Meurer
+* Abel Aoun +
+* Adrian Gao +
+* Ahmet Can Solak +
+* Ajay DS +
+* Alban Colley +
+* Alberto Rubiales +
+* Alessia Marcolini +
+* Amit Kumar +
+* Andrei Batomunkuev +
+* Andrew Watson +
+* Anirudh Dagar +
+* Ankit Dwivedi +
+* Antony Lee
+* Arfy Slowy +
+* Arryan Singh +
+* Arun Palaniappen +
+* Arushi Sharma +
+* Bas van Beek
+* Brent Brewington +
+* Carl Johnsen +
+* Carl Michal +
+* Charles Harris
+* Chiara Marmo
+* Chris Fu (傅立业) +
+* Christoph Buchner +
+* Christoph Reiter +
+* Chunlin Fang
+* Clément Robert +
+* Constanza Fierro
+* Damien Caliste
+* Daniel Ching
+* David Badnar +
+* David Cortes +
+* David Okpare +
+* Derek Huang +
+* Developer-Ecosystem-Engineering +
+* Dima Pasechnik
+* Dimitri Papadopoulos +
+* Dmitriy Fishman +
+* Eero Vaher +
+* Elias Koromilas +
+* Eliaz Bobadilla +
+* Elisha Hollander +
+* Eric Wieser
+* Eskild Eriksen +
+* Evan Miller +
+* Fayas Noushad +
+* Gagandeep Singh +
+* Ganesh Kathiresan
+* Ghiles Meddour +
+* Greg Lucas
+* Gregory R. Lee
+* Guo Shuai +
+* Gwyn Ciesla +
+* Hameer Abbasi
+* Hector Martin +
+* Henry Schreiner +
+* Himanshu +
+* Hood Chatham +
+* Hugo Defois +
+* Hugo van Kemenade
+* I-Shen Leong +
+* Imen Rajhi +
+* Irina Maria Mocan +
+* Irit Katriel +
+* Isuru Fernando
+* Jakob Jakobson
+* Jerry Morrison +
+* Jessi J Zhao +
+* Joe Marshall +
+* Johan von Forstner +
+* Jonas I. Liechti +
+* Jonathan Reichelt Gjertsen +
+* Joshua Himmens +
+* Jérome Eertmans
+* Jérôme Kieffer +
+* KIU Shueng Chuan +
+* Kazuki Sakamoto +
+* Kenichi Maehashi
+* Kenny Huynh +
+* Kent R. Spillner +
+* Kevin Granados +
+* Kevin Modzelewski +
+* Kevin Sheppard
+* Lalit Musmade +
+* Malik Idrees Hasan Khan +
+* Marco Aurelio da Costa +
+* Margret Pax +
+* Mars Lee +
+* Marten van Kerkwijk
+* Matthew Barber +
+* Matthew Brett
+* Matthias Bussonnier
+* Matthieu Dartiailh
+* Matti Picus
+* Melissa Weber Mendonça
+* Michael McCann +
+* Mike Jarvis +
+* Mike McCann +
+* Mike Toews
+* Mukulika Pahari
+* Nick Pope +
+* Nick Wogan +
+* Niels Dunnewind +
+* Niko Savola +
+* Nikola Forró
+* Niyas Sait +
+* Pamphile ROY
+* Paul Ganssle +
+* Pauli Virtanen
+* Pearu Peterson
+* Peter Hawkins +
+* Peter Tillema +
+* Prathmesh Shirsat +
+* Raghuveer Devulapalli
+* Ralf Gommers
+* Robert Kern
+* Rohit Goswami +
+* Ronan Lamy
+* Ross Barnowski
+* Roy Jacobson +
+* Samyak S Sarnayak +
+* Sayantika Banik +
+* Sayed Adel
+* Sebastian Berg
+* Sebastian Schleehauf +
+* Serge Guelton
+* Shriraj Hegde +
+* Shubham Gupta +
+* Sista Seetaram +
+* Stefan van der Walt
+* Stephannie Jimenez Gacha +
+* Tania Allard
+* Theodoros Nikolaou +
+* Thomas Green +
+* Thomas J. Fan
+* Thomas Li +
+* Tim Hoffmann
+* Tom Tan +
+* Tyler Reddy
+* Vijay Arora +
+* Vinith Kishore +
+* Warren Weckesser
+* Yang Hau
+* Yashasvi Misra
+* Yuval Ofek +
+* Zac Hatfield-Dodds
+* Zhang Na +
+
+Pull requests merged
+====================
+
+A total of 609 pull requests were merged for this release.
+
+* `#15847 <https://github.com/numpy/numpy/pull/15847>`__: BUG: avoid infinite recurrence on dependencies in crackfortran
+* `#16740 <https://github.com/numpy/numpy/pull/16740>`__: ENH: Add broadcast support to Generator.multinomial
+* `#16796 <https://github.com/numpy/numpy/pull/16796>`__: DOC: Added a warning about fractional steps in np.arange
+* `#17530 <https://github.com/numpy/numpy/pull/17530>`__: ENH: Allow ``ctypeslib.load_library`` to take any path-like object
+* `#17582 <https://github.com/numpy/numpy/pull/17582>`__: ENH: Configurable allocator
+* `#18203 <https://github.com/numpy/numpy/pull/18203>`__: MAINT: Speedup np.quantile.
+* `#18330 <https://github.com/numpy/numpy/pull/18330>`__: TST: Add cygwin build to CI
+* `#18421 <https://github.com/numpy/numpy/pull/18421>`__: DOC: Adjust polyfit doc to clarify the meaning of w
+* `#18536 <https://github.com/numpy/numpy/pull/18536>`__: ENH: Add smallest_normal and smallest_subnormal attributes to...
+* `#18585 <https://github.com/numpy/numpy/pull/18585>`__: ENH: Implementation of the NEP 47 (adopting the array API standard)
+* `#18759 <https://github.com/numpy/numpy/pull/18759>`__: BUG: revise string_from_pyobj/try_pyarr_from_string with respect...
+* `#18762 <https://github.com/numpy/numpy/pull/18762>`__: MAINT: Remove unused imports and unreachable code
+* `#18775 <https://github.com/numpy/numpy/pull/18775>`__: DOC: Ensure that we add documentation also as to the dict for...
+* `#18884 <https://github.com/numpy/numpy/pull/18884>`__: DOC: Add support for documenting C/C++ via Doxygen & Breathe
+* `#18905 <https://github.com/numpy/numpy/pull/18905>`__: MAINT: Refactor reductions to use NEP 43 style dispatching/promotion
+* `#18964 <https://github.com/numpy/numpy/pull/18964>`__: DOC: replace np.ma functions' return types with ``MaskedArray``
+* `#18984 <https://github.com/numpy/numpy/pull/18984>`__: DOC: add example showing how to convert POSIX timestamps to datetime64
+* `#19003 <https://github.com/numpy/numpy/pull/19003>`__: DOC: Remove misleading info about Fortran compiler in Building...
+* `#19016 <https://github.com/numpy/numpy/pull/19016>`__: BUG: Update coordinates on PyArray_ITER_GOTO1D
+* `#19022 <https://github.com/numpy/numpy/pull/19022>`__: SIMD: Add new universal intrinsic for ceil
+* `#19023 <https://github.com/numpy/numpy/pull/19023>`__: BUG: fix np.ma.MaskedArray.anom when input is masked
+* `#19036 <https://github.com/numpy/numpy/pull/19036>`__: MAINT: replace imgmath with mathjax for docs
+* `#19058 <https://github.com/numpy/numpy/pull/19058>`__: BUG: Fixes to getter signatures
+* `#19060 <https://github.com/numpy/numpy/pull/19060>`__: ENH: Add initial annotations to ``np.core.multiarray``
+* `#19062 <https://github.com/numpy/numpy/pull/19062>`__: ENH: Add a mypy plugin for inferring the precision of ``np.ctypeslib.c_intp``
+* `#19070 <https://github.com/numpy/numpy/pull/19070>`__: REL: Prepare for NumPy 1.22.0 development
+* `#19071 <https://github.com/numpy/numpy/pull/19071>`__: BUG: Fix compile-time test of POPCNT
+* `#19072 <https://github.com/numpy/numpy/pull/19072>`__: BUG, TST: Fix test_numpy_version.
+* `#19082 <https://github.com/numpy/numpy/pull/19082>`__: MAINT: Bump hypothesis from 6.12.0 to 6.13.4
+* `#19083 <https://github.com/numpy/numpy/pull/19083>`__: ENH: Implement the DLPack Array API protocols for ndarray.
+* `#19086 <https://github.com/numpy/numpy/pull/19086>`__: BUG: Linter should only run on pull requests.
+* `#19087 <https://github.com/numpy/numpy/pull/19087>`__: DOC: Add note to savez about naming variables with keyword ``file``.
+* `#19089 <https://github.com/numpy/numpy/pull/19089>`__: DOC: Add example to histogram2d docstring
+* `#19090 <https://github.com/numpy/numpy/pull/19090>`__: MAINT: removed unused imports listed in LGTM
+* `#19092 <https://github.com/numpy/numpy/pull/19092>`__: BUG: Fixed an issue wherein ``_GenericAlias.__getitem__`` would...
+* `#19093 <https://github.com/numpy/numpy/pull/19093>`__: DOC: add a "Returns" section for ``np.frombuffer``
+* `#19096 <https://github.com/numpy/numpy/pull/19096>`__: BUG: Fix setup.py to work in maintenance branches.
+* `#19098 <https://github.com/numpy/numpy/pull/19098>`__: BUG, SIMD: Fix detect host/native CPU features on ICC during...
+* `#19099 <https://github.com/numpy/numpy/pull/19099>`__: DOC: fixed unsigned integer alias links.
+* `#19102 <https://github.com/numpy/numpy/pull/19102>`__: MAINT: Removed suitable unused variables shown in LGTM
+* `#19110 <https://github.com/numpy/numpy/pull/19110>`__: DOC: Fix the documented default value of the ``order`` parameter...
+* `#19115 <https://github.com/numpy/numpy/pull/19115>`__: DOC: Misc fixes to ``absolute_beginners.html``
+* `#19118 <https://github.com/numpy/numpy/pull/19118>`__: MAINT: Misc cleaning of ``numpy.typing``
+* `#19119 <https://github.com/numpy/numpy/pull/19119>`__: BUG: Adjust shallow clone in the gitpod container
+* `#19121 <https://github.com/numpy/numpy/pull/19121>`__: DOC: Fix missing files and deprecated commands.
+* `#19124 <https://github.com/numpy/numpy/pull/19124>`__: BUG: Fixed an issue wherein ``poly1d.__getitem__`` could return...
+* `#19128 <https://github.com/numpy/numpy/pull/19128>`__: DOC:``Building the NumPy API and reference docs`` rewrite
+* `#19130 <https://github.com/numpy/numpy/pull/19130>`__: ENH: SIMD architectures to show_config
+* `#19131 <https://github.com/numpy/numpy/pull/19131>`__: DOC: added explanation about tril/triu n-dimensional functionality.
+* `#19132 <https://github.com/numpy/numpy/pull/19132>`__: BUG: Use larger fetch depth in gitpod.yml
+* `#19135 <https://github.com/numpy/numpy/pull/19135>`__: BUG: Remove complex floor divide
+* `#19139 <https://github.com/numpy/numpy/pull/19139>`__: MAINT: Bump hypothesis from 6.13.4 to 6.13.10
+* `#19140 <https://github.com/numpy/numpy/pull/19140>`__: ENH: Add dtype-support to 3 ``generic``/``ndarray`` methods
+* `#19142 <https://github.com/numpy/numpy/pull/19142>`__: BUG: expose ``short_version`` as previously in version.py
+* `#19151 <https://github.com/numpy/numpy/pull/19151>`__: ENH: Vectorising np.linalg.qr
+* `#19165 <https://github.com/numpy/numpy/pull/19165>`__: DOC: Explicitly mention that ``searchsorted`` returns an integer...
+* `#19167 <https://github.com/numpy/numpy/pull/19167>`__: ENH: Improve readibility of error message in terminal.
+* `#19170 <https://github.com/numpy/numpy/pull/19170>`__: API: Delay string and number promotion deprecation/future warning
+* `#19172 <https://github.com/numpy/numpy/pull/19172>`__: BUG: Fixed an issue wherein ``_GenericAlias`` could raise for non-iterable...
+* `#19173 <https://github.com/numpy/numpy/pull/19173>`__: ENH: Add support for copy modes to NumPy
+* `#19174 <https://github.com/numpy/numpy/pull/19174>`__: MAINT, BUG: Adapt ``castingimpl.casting`` to denote a minimal level
+* `#19176 <https://github.com/numpy/numpy/pull/19176>`__: REV,BUG: Replace ``NotImplemented`` with ``typing.Any``
+* `#19177 <https://github.com/numpy/numpy/pull/19177>`__: BUG: Add ``-std=c99`` to intel icc compiler flags on linux
+* `#19179 <https://github.com/numpy/numpy/pull/19179>`__: ENH: Add annotations for ``np.testing``
+* `#19181 <https://github.com/numpy/numpy/pull/19181>`__: MAINT: Bump pytest-cov from 2.12.0 to 2.12.1
+* `#19182 <https://github.com/numpy/numpy/pull/19182>`__: MAINT: Bump hypothesis from 6.13.10 to 6.13.14
+* `#19185 <https://github.com/numpy/numpy/pull/19185>`__: DOC: Crosslinking to Gitpod guide
+* `#19186 <https://github.com/numpy/numpy/pull/19186>`__: DOC: ndindex class docstrings fix
+* `#19188 <https://github.com/numpy/numpy/pull/19188>`__: NEP: Accept NEP 35 (``like=`` keyword for array creation) as final
+* `#19195 <https://github.com/numpy/numpy/pull/19195>`__: DOC: Link issue label
+* `#19196 <https://github.com/numpy/numpy/pull/19196>`__: DOC: update references to other repos head branch to 'main'
+* `#19200 <https://github.com/numpy/numpy/pull/19200>`__: DOC: NeighborhoodIterator position on creation
+* `#19202 <https://github.com/numpy/numpy/pull/19202>`__: BUG: Fix out-of-bounds access in convert_datetime_divisor_to_multiple
+* `#19209 <https://github.com/numpy/numpy/pull/19209>`__: TST: Ignore exp FP exceptions test for glibc ver < 2.17
+* `#19211 <https://github.com/numpy/numpy/pull/19211>`__: ENH: Adding keepdims to np.argmin,np.argmax
+* `#19212 <https://github.com/numpy/numpy/pull/19212>`__: MAINT: Add annotations for the missing ``period`` parameter to...
+* `#19214 <https://github.com/numpy/numpy/pull/19214>`__: ENH: Support major version larger than 9 in ``NumpyVersion``
+* `#19218 <https://github.com/numpy/numpy/pull/19218>`__: MAINT: Add ``complex`` as allowed type for the ``np.complexfloating``...
+* `#19223 <https://github.com/numpy/numpy/pull/19223>`__: ENH: Add annotations for ``np.pad``
+* `#19224 <https://github.com/numpy/numpy/pull/19224>`__: MAINT: Remove python 2 specific string comparison code
+* `#19225 <https://github.com/numpy/numpy/pull/19225>`__: DOC: Fix some inconsistencies in the docstring of matrix_rank
+* `#19227 <https://github.com/numpy/numpy/pull/19227>`__: ENH: Add annotations to ``np.core.multiarray`` part 2/4
+* `#19228 <https://github.com/numpy/numpy/pull/19228>`__: BUG: Invalid dtypes comparison should not raise ``TypeError``
+* `#19235 <https://github.com/numpy/numpy/pull/19235>`__: Revert "BUG: revise string_from_pyobj/try_pyarr_from_string with...
+* `#19237 <https://github.com/numpy/numpy/pull/19237>`__: ENH: Add annotations to ``np.core.multiarray`` part 3/4
+* `#19241 <https://github.com/numpy/numpy/pull/19241>`__: MAINT: Bump hypothesis from 6.13.14 to 6.14.0
+* `#19242 <https://github.com/numpy/numpy/pull/19242>`__: MAINT: Bump mypy from 0.812 to 0.902
+* `#19244 <https://github.com/numpy/numpy/pull/19244>`__: BUG: Fix an issue wherein assigment to ``np.ma.masked_array`` ignores...
+* `#19245 <https://github.com/numpy/numpy/pull/19245>`__: ENH: Add dtype-support to the ``np.core.shape_base`` annotations
+* `#19251 <https://github.com/numpy/numpy/pull/19251>`__: BUG: revise string_from_pyobj/try_pyarr_from_string with respect...
+* `#19254 <https://github.com/numpy/numpy/pull/19254>`__: MAINT: Refactor output ufunc wrapping logic
+* `#19256 <https://github.com/numpy/numpy/pull/19256>`__: DOC: Fix formatting in rot90() docstring
+* `#19257 <https://github.com/numpy/numpy/pull/19257>`__: MAINT: Move array-prep and type resolution to earlier
+* `#19258 <https://github.com/numpy/numpy/pull/19258>`__: MAINT: Refactor and simplify the main ufunc iterator loop code
+* `#19259 <https://github.com/numpy/numpy/pull/19259>`__: MAINT: Align masked with normal ufunc loops
+* `#19261 <https://github.com/numpy/numpy/pull/19261>`__: ENH: Add annotations for ``np.lib.twodim_base``
+* `#19262 <https://github.com/numpy/numpy/pull/19262>`__: MAINT: Some tiny fixes and style changes in ``ufunc_object.c``
+* `#19263 <https://github.com/numpy/numpy/pull/19263>`__: STY: Small changes to the ``PyUFunc_ReduceWrapper``
+* `#19264 <https://github.com/numpy/numpy/pull/19264>`__: DOC: fix duplicate navbar in development documentation index
+* `#19275 <https://github.com/numpy/numpy/pull/19275>`__: MAINT: Misc typing maintenance for ``np.dtype``
+* `#19276 <https://github.com/numpy/numpy/pull/19276>`__: BUG: Fix ``arr.flat.index`` for large arrays and big-endian machines
+* `#19277 <https://github.com/numpy/numpy/pull/19277>`__: BUG: Add missing DECREF in new path
+* `#19278 <https://github.com/numpy/numpy/pull/19278>`__: MAINT: Remove accidentally created directory.
+* `#19281 <https://github.com/numpy/numpy/pull/19281>`__: ENH: add ``numpy.f2py.get_include`` function
+* `#19284 <https://github.com/numpy/numpy/pull/19284>`__: NEP: Fixes from NEP36 feedback
+* `#19285 <https://github.com/numpy/numpy/pull/19285>`__: MAINT: Use Ubuntu focal for travis-ci builds.
+* `#19286 <https://github.com/numpy/numpy/pull/19286>`__: ENH: Add annotations for ``np.lib.type_check``
+* `#19289 <https://github.com/numpy/numpy/pull/19289>`__: BUG: Fix reference count leak in ufunc dtype handling
+* `#19290 <https://github.com/numpy/numpy/pull/19290>`__: DOC: Unpin pydata sphinx theme and update config to avoid long...
+* `#19292 <https://github.com/numpy/numpy/pull/19292>`__: MAINT: Add lightweight identity-hash map
+* `#19293 <https://github.com/numpy/numpy/pull/19293>`__: MAINT: Add simple tuple creation helper and use it
+* `#19295 <https://github.com/numpy/numpy/pull/19295>`__: DOC: Add ``versionadded`` directives to ``numpy.typing``
+* `#19298 <https://github.com/numpy/numpy/pull/19298>`__: DOC: Add documentation for ``np.ctypeslib.c_intp``
+* `#19301 <https://github.com/numpy/numpy/pull/19301>`__: BUG: Do not raise deprecation warning for all nans in unique
+* `#19306 <https://github.com/numpy/numpy/pull/19306>`__: DOC: Fix some docstrings that crash pdf generation.
+* `#19314 <https://github.com/numpy/numpy/pull/19314>`__: MAINT: bump scipy-mathjax
+* `#19316 <https://github.com/numpy/numpy/pull/19316>`__: BUG: Fix warning problems of the mod operator
+* `#19317 <https://github.com/numpy/numpy/pull/19317>`__: MAINT: Clean up multiarray interned strings
+* `#19320 <https://github.com/numpy/numpy/pull/19320>`__: REL: Update main after 1.21.0 release.
+* `#19322 <https://github.com/numpy/numpy/pull/19322>`__: BUG: Fix cast safety and comparisons for zero sized voids
+* `#19323 <https://github.com/numpy/numpy/pull/19323>`__: BUG: Correct Cython declaration in random
+* `#19326 <https://github.com/numpy/numpy/pull/19326>`__: BUG: protect against accessing base attribute of a NULL subarray
+* `#19328 <https://github.com/numpy/numpy/pull/19328>`__: MAINT: Replace ``"dtype[Any]"`` with ``dtype`` in the definiton of...
+* `#19329 <https://github.com/numpy/numpy/pull/19329>`__: ENH Add a conda-based CI job on azure.
+* `#19338 <https://github.com/numpy/numpy/pull/19338>`__: DOC: Removed duplicate instructions for building docs from ``dev/index``...
+* `#19344 <https://github.com/numpy/numpy/pull/19344>`__: MAINT: Annotate missing attributes of ``np.number`` subclasses
+* `#19355 <https://github.com/numpy/numpy/pull/19355>`__: ENH: Adding ``bit_count`` (popcount)
+* `#19356 <https://github.com/numpy/numpy/pull/19356>`__: API: Ensure np.vectorize outputs can be subclasses.
+* `#19359 <https://github.com/numpy/numpy/pull/19359>`__: ENH: Add annotations for ``np.f2py``
+* `#19360 <https://github.com/numpy/numpy/pull/19360>`__: MAINT: remove ``print()``'s in distutils template handling
+* `#19361 <https://github.com/numpy/numpy/pull/19361>`__: ENH: Use literals for annotating ``int``- & ``str``-based constants
+* `#19362 <https://github.com/numpy/numpy/pull/19362>`__: BUG, SIMD: Fix detecting AVX512 features on Darwin
+* `#19368 <https://github.com/numpy/numpy/pull/19368>`__: MAINT: Bump mypy from 0.902 to 0.910
+* `#19369 <https://github.com/numpy/numpy/pull/19369>`__: DOC: Moved VQ example & target from duplicate array broadcasting...
+* `#19370 <https://github.com/numpy/numpy/pull/19370>`__: MAINT: Move masked strided/inner-loop code to its "final" place
+* `#19371 <https://github.com/numpy/numpy/pull/19371>`__: MAINT: Use cast-is-view flag for the ufunc trivial-loop check
+* `#19378 <https://github.com/numpy/numpy/pull/19378>`__: DOC: fix remaining np.min/np.max usages
+* `#19380 <https://github.com/numpy/numpy/pull/19380>`__: BUG: Fix NULL special case in object-to-any cast code
+* `#19381 <https://github.com/numpy/numpy/pull/19381>`__: MAINT: Modify initialization order during multiarray import
+* `#19393 <https://github.com/numpy/numpy/pull/19393>`__: MAINT: fix overly broad exception handling listed in LGTM
+* `#19394 <https://github.com/numpy/numpy/pull/19394>`__: BUG, SIMD: Fix infinite loop during count non-zero on GCC-11
+* `#19396 <https://github.com/numpy/numpy/pull/19396>`__: BUG: fix a numpy.npiter leak in npyiter_multi_index_set
+* `#19402 <https://github.com/numpy/numpy/pull/19402>`__: DOC: typo fix
+* `#19403 <https://github.com/numpy/numpy/pull/19403>`__: BUG: Fix memory leak in function npyiter_multi_index_set
+* `#19404 <https://github.com/numpy/numpy/pull/19404>`__: NEP: update NEP with the PyDataMem_Handler struct as implemented...
+* `#19407 <https://github.com/numpy/numpy/pull/19407>`__: DOC: Rearranged parts of the Indexing docs to consolidate content
+* `#19408 <https://github.com/numpy/numpy/pull/19408>`__: ENH: Add annotations for misc python-based functions
+* `#19409 <https://github.com/numpy/numpy/pull/19409>`__: BUG: fix some memory leaks in ufunc_object
+* `#19412 <https://github.com/numpy/numpy/pull/19412>`__: MAINT: Bump sphinx from 4.0.1 to 4.0.3
+* `#19413 <https://github.com/numpy/numpy/pull/19413>`__: MAINT: Bump hypothesis from 6.14.0 to 6.14.1
+* `#19416 <https://github.com/numpy/numpy/pull/19416>`__: DOC: Remove duplicate information about governance
+* `#19418 <https://github.com/numpy/numpy/pull/19418>`__: DOC: Removing tutorials from sphinx documentation
+* `#19419 <https://github.com/numpy/numpy/pull/19419>`__: BUG: fix f2py markinnerspace for multiple quotations
+* `#19421 <https://github.com/numpy/numpy/pull/19421>`__: ENH: Add annotations for ``np.core.getlimits``
+* `#19422 <https://github.com/numpy/numpy/pull/19422>`__: DOC: Additional ideas related to numpy-tutorials integration
+* `#19423 <https://github.com/numpy/numpy/pull/19423>`__: Skip finite recursion and refcounting tests for pyston
+* `#19426 <https://github.com/numpy/numpy/pull/19426>`__: MAINT: Use arm64-graviton2 for testing on travis
+* `#19429 <https://github.com/numpy/numpy/pull/19429>`__: BUG: Fix some multiarray leaks
+* `#19431 <https://github.com/numpy/numpy/pull/19431>`__: MAINT: Delete old SSE2 ``absolute`` implementation
+* `#19434 <https://github.com/numpy/numpy/pull/19434>`__: MAINT: Fix the module of ``flagsobj``
+* `#19436 <https://github.com/numpy/numpy/pull/19436>`__: ENH: Improve the annotations of ``flagsobj``
+* `#19440 <https://github.com/numpy/numpy/pull/19440>`__: MAINT: factored out _PyArray_ArgMinMaxCommon
+* `#19442 <https://github.com/numpy/numpy/pull/19442>`__: MAINT: Use "with open(...)"
+* `#19444 <https://github.com/numpy/numpy/pull/19444>`__: ENH: Add annotations for ``np.lib.shape_base``
+* `#19445 <https://github.com/numpy/numpy/pull/19445>`__: DOC: broadcast_to() supports int as shape parameter
+* `#19446 <https://github.com/numpy/numpy/pull/19446>`__: MAINT: Start testing with Python 3.10.0b3.
+* `#19447 <https://github.com/numpy/numpy/pull/19447>`__: DOC: BLAS/LAPACK linking rules
+* `#19450 <https://github.com/numpy/numpy/pull/19450>`__: TST: Simplify property-based test
+* `#19451 <https://github.com/numpy/numpy/pull/19451>`__: BUG: Make openblas_support support ILP64 on Windows.
+* `#19456 <https://github.com/numpy/numpy/pull/19456>`__: TST: Fix a ``GenericAlias`` test failure for python 3.9.0
+* `#19458 <https://github.com/numpy/numpy/pull/19458>`__: MAINT: Avoid unicode characters in division SIMD code comments
+* `#19459 <https://github.com/numpy/numpy/pull/19459>`__: ENH: Add the ``axis`` and ``ndim`` attributes to ``np.AxisError``
+* `#19460 <https://github.com/numpy/numpy/pull/19460>`__: MAINT: Bump sphinx from 4.0.3 to 4.1.0
+* `#19461 <https://github.com/numpy/numpy/pull/19461>`__: MAINT: Bump hypothesis from 6.14.1 to 6.14.2
+* `#19462 <https://github.com/numpy/numpy/pull/19462>`__: BUILD: move to OpenBLAS 0.3.16
+* `#19463 <https://github.com/numpy/numpy/pull/19463>`__: MAINT: Use straight arm64 in TravisCI.
+* `#19468 <https://github.com/numpy/numpy/pull/19468>`__: MAINT: Add missing ``dtype`` overloads for object- and ctypes-based...
+* `#19475 <https://github.com/numpy/numpy/pull/19475>`__: DOC: Fix see also references in ``numpy.resize``
+* `#19478 <https://github.com/numpy/numpy/pull/19478>`__: ENH: Vectorizing umath module using AVX-512 (open sourced from...
+* `#19479 <https://github.com/numpy/numpy/pull/19479>`__: BLD: Add clang ``-ftrapping-math`` also for ``compiler_so``
+* `#19483 <https://github.com/numpy/numpy/pull/19483>`__: MAINT: Update for using ``openblas64_``.
+* `#19485 <https://github.com/numpy/numpy/pull/19485>`__: TST/BENCH: Adding test coverage and benchmarks for floating point...
+* `#19486 <https://github.com/numpy/numpy/pull/19486>`__: DOC: Add link to NumPy PDF docs
+* `#19491 <https://github.com/numpy/numpy/pull/19491>`__: MAINT: Disable test_blas64_dot.
+* `#19492 <https://github.com/numpy/numpy/pull/19492>`__: BUILD: update OpenBLAS to v0.3.17
+* `#19493 <https://github.com/numpy/numpy/pull/19493>`__: TST: generalise ``clip`` test
+* `#19498 <https://github.com/numpy/numpy/pull/19498>`__: MAINT: Update manylinux ci test to manylinux2014
+* `#19506 <https://github.com/numpy/numpy/pull/19506>`__: DOC: Fix typos
+* `#19512 <https://github.com/numpy/numpy/pull/19512>`__: REL: Update main after 1.21.1 release.
+* `#19513 <https://github.com/numpy/numpy/pull/19513>`__: ENH: Add support for windows on arm targets
+* `#19516 <https://github.com/numpy/numpy/pull/19516>`__: DOC: Created fundamentals doc for explanations in ``ufunc`` reference...
+* `#19517 <https://github.com/numpy/numpy/pull/19517>`__: MAINT: Bump sphinx from 4.1.0 to 4.1.1
+* `#19518 <https://github.com/numpy/numpy/pull/19518>`__: MAINT: Bump hypothesis from 6.14.2 to 6.14.3
+* `#19519 <https://github.com/numpy/numpy/pull/19519>`__: MAINT: Bump cython from 0.29.23 to 0.29.24
+* `#19525 <https://github.com/numpy/numpy/pull/19525>`__: TST: Test that ``numpy.typing`` can be imported in the absence...
+* `#19526 <https://github.com/numpy/numpy/pull/19526>`__: MAINT: bump Sphinx in environment.yml file
+* `#19527 <https://github.com/numpy/numpy/pull/19527>`__: BLD: Add LoongArch support
+* `#19529 <https://github.com/numpy/numpy/pull/19529>`__: SIMD: Force inlining all functions that accept AVX registers
+* `#19534 <https://github.com/numpy/numpy/pull/19534>`__: BLD: Tell fortran compiler Cygwin doesn't support rpath.
+* `#19535 <https://github.com/numpy/numpy/pull/19535>`__: TST: Add Cygwin to the x86 feature tests.
+* `#19538 <https://github.com/numpy/numpy/pull/19538>`__: DOC: Fix typo in PCG64
+* `#19539 <https://github.com/numpy/numpy/pull/19539>`__: DEP: Remove deprecated numeric style dtype strings
+* `#19540 <https://github.com/numpy/numpy/pull/19540>`__: MAINT: Update the ``np.finfo`` annotations
+* `#19542 <https://github.com/numpy/numpy/pull/19542>`__: TST: Parametrize a few more tests.
+* `#19543 <https://github.com/numpy/numpy/pull/19543>`__: MAINT: Improve the ``np.core.numerictypes`` stubs
+* `#19545 <https://github.com/numpy/numpy/pull/19545>`__: DOC: Add clarification
+* `#19546 <https://github.com/numpy/numpy/pull/19546>`__: DOC: Add link and explanation of ``_add_newdocs`` to developer...
+* `#19547 <https://github.com/numpy/numpy/pull/19547>`__: BLD: Use cygpath utility for path conversion in cyg2win32
+* `#19554 <https://github.com/numpy/numpy/pull/19554>`__: MAINT: add missing dunder method to nditer type hints
+* `#19557 <https://github.com/numpy/numpy/pull/19557>`__: DOC: clarify doc re: unsupported keys in savez.
+* `#19559 <https://github.com/numpy/numpy/pull/19559>`__: ENH: Add annotations for ``__path__`` and ``PytestTester``
+* `#19560 <https://github.com/numpy/numpy/pull/19560>`__: TST: Bump the GitHub actions python 3.10 version
+* `#19561 <https://github.com/numpy/numpy/pull/19561>`__: DOC: Remove explicit parameter sparse=False in meshgrid() indexing...
+* `#19563 <https://github.com/numpy/numpy/pull/19563>`__: MAINT: Bump hypothesis from 6.14.3 to 6.14.4
+* `#19564 <https://github.com/numpy/numpy/pull/19564>`__: TST: Add "Scaled float" custom DType for testng
+* `#19565 <https://github.com/numpy/numpy/pull/19565>`__: DOC: Fix sphinx warnings in c-info.beyond-basics.rst
+* `#19566 <https://github.com/numpy/numpy/pull/19566>`__: DOC: Remove ``dot`` docstring in numpy/core/_add_newdocs.py
+* `#19567 <https://github.com/numpy/numpy/pull/19567>`__: DOC: Fix Unknown section warning when building docs
+* `#19568 <https://github.com/numpy/numpy/pull/19568>`__: BUG: Seed random state in test_vonmises_large_kappa_range.
+* `#19571 <https://github.com/numpy/numpy/pull/19571>`__: MAINT: Refactor UFunc core to use NEP 43 style dispatching
+* `#19572 <https://github.com/numpy/numpy/pull/19572>`__: MAINT: Cleanup unused function _move_axis_to_0
+* `#19576 <https://github.com/numpy/numpy/pull/19576>`__: MAINT: Make Python3.8 the default for CI testing.
+* `#19578 <https://github.com/numpy/numpy/pull/19578>`__: TST: Add basic tests for custom DType (scaled float) ufuncs
+* `#19580 <https://github.com/numpy/numpy/pull/19580>`__: ENH: Add basic promoter capability to ufunc dispatching
+* `#19582 <https://github.com/numpy/numpy/pull/19582>`__: BLD: load extra flags when checking for libflame
+* `#19587 <https://github.com/numpy/numpy/pull/19587>`__: MAINT: Refactor DType slots into an opaque, allocated struct
+* `#19590 <https://github.com/numpy/numpy/pull/19590>`__: DOC Fix sphinx warnings related to scope of c:macro.
+* `#19593 <https://github.com/numpy/numpy/pull/19593>`__: DOC,MAINT: Update wording surrounding ``fname`` parameter for loadtxt/genfromtxt
+* `#19595 <https://github.com/numpy/numpy/pull/19595>`__: MAINT: Bump sphinx from 4.1.1 to 4.1.2
+* `#19596 <https://github.com/numpy/numpy/pull/19596>`__: MAINT: Bump hypothesis from 6.14.4 to 6.14.5
+* `#19598 <https://github.com/numpy/numpy/pull/19598>`__: PERF: Speed-up common case of loadtxt()ing non-hex floats.
+* `#19599 <https://github.com/numpy/numpy/pull/19599>`__: PERF: Avoid using ``@recursive``.
+* `#19600 <https://github.com/numpy/numpy/pull/19600>`__: BUG: Fix bad write in masked iterator output copy paths
+* `#19601 <https://github.com/numpy/numpy/pull/19601>`__: PERF: Speedup comments handling in loadtxt.
+* `#19605 <https://github.com/numpy/numpy/pull/19605>`__: DEV: Update default Python in benchmark config.
+* `#19607 <https://github.com/numpy/numpy/pull/19607>`__: BUG: Fix NaT handling in the PyArray_CompareFunc for datetime...
+* `#19608 <https://github.com/numpy/numpy/pull/19608>`__: PERF: Specialize loadtxt packer for uniform-dtype data.
+* `#19609 <https://github.com/numpy/numpy/pull/19609>`__: PERF: In loadtxt, decide once and for all whether decoding is...
+* `#19610 <https://github.com/numpy/numpy/pull/19610>`__: PERF: Special-case single-converter in loadtxt.
+* `#19612 <https://github.com/numpy/numpy/pull/19612>`__: TST: Bump the python 3.10 test version from beta4 to rc1
+* `#19613 <https://github.com/numpy/numpy/pull/19613>`__: DOC: isclose accepts boolean input
+* `#19615 <https://github.com/numpy/numpy/pull/19615>`__: MAINT: Proposal to expire three deprecated functions in numpy.lib.npyio
+* `#19616 <https://github.com/numpy/numpy/pull/19616>`__: MAINT: In loadtxt, refactor detection of the number of columns.
+* `#19618 <https://github.com/numpy/numpy/pull/19618>`__: MAINT: Optimize loadtxt usecols.
+* `#19619 <https://github.com/numpy/numpy/pull/19619>`__: MAINT: Include .coveragerc in source distributions to support...
+* `#19620 <https://github.com/numpy/numpy/pull/19620>`__: PERF: Simplify some of loadtxt's standard converters.
+* `#19621 <https://github.com/numpy/numpy/pull/19621>`__: BUG: The normal cast-safety for ufunc loops is "no" casting
+* `#19622 <https://github.com/numpy/numpy/pull/19622>`__: MAINT: Skip a type check in loadtxt when using user converters.
+* `#19627 <https://github.com/numpy/numpy/pull/19627>`__: BUG: Ignore whitespaces while parsing gufunc signatures
+* `#19628 <https://github.com/numpy/numpy/pull/19628>`__: TST: avoid distutils.sysconfig in runtests.py
+* `#19632 <https://github.com/numpy/numpy/pull/19632>`__: BUG,DEP: Non-default UFunc signature/dtype usage should be deprecated
+* `#19633 <https://github.com/numpy/numpy/pull/19633>`__: MAINT: Bump hypothesis from 6.14.5 to 6.14.6
+* `#19638 <https://github.com/numpy/numpy/pull/19638>`__: MAINT: Remove import time compile
+* `#19639 <https://github.com/numpy/numpy/pull/19639>`__: MAINT: Update Cython version for Python 3.10.
+* `#19640 <https://github.com/numpy/numpy/pull/19640>`__: BUG: Remove logical object ufuncs with bool output
+* `#19642 <https://github.com/numpy/numpy/pull/19642>`__: BLD, SIMD: Fix testing extra checks when ``-Werror`` isn't applicable...
+* `#19645 <https://github.com/numpy/numpy/pull/19645>`__: DOC: Reorganized the documentation contribution docs
+* `#19654 <https://github.com/numpy/numpy/pull/19654>`__: BUG: add base to templated arguments for platlib
+* `#19663 <https://github.com/numpy/numpy/pull/19663>`__: NEP: add qualifier for free(), mention ContextVar
+* `#19665 <https://github.com/numpy/numpy/pull/19665>`__: MAINT: Drop Python3.7 from supported versions.
+* `#19667 <https://github.com/numpy/numpy/pull/19667>`__: ENH: Add annotations for ``np.lib.npyio``
+* `#19672 <https://github.com/numpy/numpy/pull/19672>`__: BLD: update circleCI docker image
+* `#19678 <https://github.com/numpy/numpy/pull/19678>`__: REL: Update main after 1.21.2 release.
+* `#19680 <https://github.com/numpy/numpy/pull/19680>`__: ENH: Allow ``np.fromregex`` to accept ``os.PathLike`` implementations
+* `#19681 <https://github.com/numpy/numpy/pull/19681>`__: MAINT: Update wheel requirement from <0.36.3 to <0.37.1
+* `#19682 <https://github.com/numpy/numpy/pull/19682>`__: MAINT: Bump hypothesis from 6.14.6 to 6.14.7
+* `#19683 <https://github.com/numpy/numpy/pull/19683>`__: ENH: Add annotations for ``np.lib.stride_tricks``
+* `#19686 <https://github.com/numpy/numpy/pull/19686>`__: ENH: Add spaces after punctuation in dtype repr/str.
+* `#19692 <https://github.com/numpy/numpy/pull/19692>`__: DOC: Fix trivial doc typo.
+* `#19693 <https://github.com/numpy/numpy/pull/19693>`__: MAINT: In loadtxt, inline read_data.
+* `#19695 <https://github.com/numpy/numpy/pull/19695>`__: DOC: Fix typo in ``unwrap`` docstring.
+* `#19698 <https://github.com/numpy/numpy/pull/19698>`__: DOC: fix typo in example
+* `#19702 <https://github.com/numpy/numpy/pull/19702>`__: MAINT: Replace deprecated unittest aliases
+* `#19713 <https://github.com/numpy/numpy/pull/19713>`__: MAINT: Replace numpy custom generation engine by raw C++
+* `#19714 <https://github.com/numpy/numpy/pull/19714>`__: MAINT: Remove redundant Python2 float/int conversions
+* `#19715 <https://github.com/numpy/numpy/pull/19715>`__: BUG: Casting ``bool_`` to float16
+* `#19725 <https://github.com/numpy/numpy/pull/19725>`__: MAINT: Use a contextmanager to ensure loadtxt closes the input...
+* `#19727 <https://github.com/numpy/numpy/pull/19727>`__: DOC: fix basics.creation.rst to address issue 19726
+* `#19730 <https://github.com/numpy/numpy/pull/19730>`__: BUG: Fix reference leak of capi_tmp in f2py/cb_rules.py
+* `#19731 <https://github.com/numpy/numpy/pull/19731>`__: BUG: fix time cast-safety for ``factor*unit`` e.g. in ``10**6*ms``...
+* `#19732 <https://github.com/numpy/numpy/pull/19732>`__: MAINT: Spelling fixes in documentation
+* `#19733 <https://github.com/numpy/numpy/pull/19733>`__: DOC: add citation file for GitHub support
+* `#19736 <https://github.com/numpy/numpy/pull/19736>`__: BUG: Fix passing a MaskedArray instance to ``MaskedArray.__setitem__``
+* `#19738 <https://github.com/numpy/numpy/pull/19738>`__: MAINT: Bump hypothesis from 6.14.7 to 6.15.0
+* `#19739 <https://github.com/numpy/numpy/pull/19739>`__: NEP: Update NEP 47: Adopting the array API standard
+* `#19742 <https://github.com/numpy/numpy/pull/19742>`__: MAINT: Remove redundant test.
+* `#19743 <https://github.com/numpy/numpy/pull/19743>`__: MAINT: Avoid use of confusing compat aliases.
+* `#19747 <https://github.com/numpy/numpy/pull/19747>`__: MAINT: Update README.md with badges
+* `#19754 <https://github.com/numpy/numpy/pull/19754>`__: ENH: Add clang-format file
+* `#19758 <https://github.com/numpy/numpy/pull/19758>`__: MAINT: Remove redundant semicolon
+* `#19764 <https://github.com/numpy/numpy/pull/19764>`__: BUG: np.around fails when using doctest
+* `#19766 <https://github.com/numpy/numpy/pull/19766>`__: BUG: Remove np.around's footnote [2]
+* `#19775 <https://github.com/numpy/numpy/pull/19775>`__: MAINT,DOC: Readability improvements and cleanup for f2py
+* `#19776 <https://github.com/numpy/numpy/pull/19776>`__: DOC: Add explanation of a sparse mesh grid
+* `#19781 <https://github.com/numpy/numpy/pull/19781>`__: MAINT: refactor "for ... in range(len(" statements
+* `#19784 <https://github.com/numpy/numpy/pull/19784>`__: MAINT: Remove typing code-paths specific to Python 3.7
+* `#19789 <https://github.com/numpy/numpy/pull/19789>`__: MAINT: Bump hypothesis from 6.15.0 to 6.17.3
+* `#19791 <https://github.com/numpy/numpy/pull/19791>`__: DOC: Created an explanation document for copies and views
+* `#19799 <https://github.com/numpy/numpy/pull/19799>`__: TST: Drop typing-extensions from test_requirements.txt
+* `#19800 <https://github.com/numpy/numpy/pull/19800>`__: ENH: Add entry point for Array API implementation
+* `#19802 <https://github.com/numpy/numpy/pull/19802>`__: STY: Use the new PEP 457 positional-only syntax for typing
+* `#19803 <https://github.com/numpy/numpy/pull/19803>`__: ENH: Add ``is_integer`` to ``np.floating`` & ``np.integer``
+* `#19805 <https://github.com/numpy/numpy/pull/19805>`__: ENH: Symbolic solver for dimension specifications.
+* `#19809 <https://github.com/numpy/numpy/pull/19809>`__: MAINT: Fix compiler warnings generated by convert_datatype.h.
+* `#19810 <https://github.com/numpy/numpy/pull/19810>`__: MAINT: Minor include rationalizations.
+* `#19811 <https://github.com/numpy/numpy/pull/19811>`__: DEP: Deprecate quote_args (from numpy.distutils.misc_util)
+* `#19813 <https://github.com/numpy/numpy/pull/19813>`__: DOC: Fix import of default_rng
+* `#19814 <https://github.com/numpy/numpy/pull/19814>`__: ENH: Replaced markdown issue templates with issue forms
+* `#19815 <https://github.com/numpy/numpy/pull/19815>`__: MAINT: revise OSError aliases (IOError, EnvironmentError)
+* `#19817 <https://github.com/numpy/numpy/pull/19817>`__: ENH: Use custom file-like protocols instead of ``typing.IO``
+* `#19818 <https://github.com/numpy/numpy/pull/19818>`__: MAINT: fix unhashable instance and potential exception identified...
+* `#19819 <https://github.com/numpy/numpy/pull/19819>`__: MAINT: mark _version.py as generated
+* `#19821 <https://github.com/numpy/numpy/pull/19821>`__: BUG: Fixed an issue wherein certain ``nan<x>`` functions could...
+* `#19824 <https://github.com/numpy/numpy/pull/19824>`__: MAINT: Small cleanups of includes in *.c files.
+* `#19826 <https://github.com/numpy/numpy/pull/19826>`__: MAINT: Standardize guards in numpy/core/include
+* `#19827 <https://github.com/numpy/numpy/pull/19827>`__: MAINT: Standardize guards in numpy/core/src/common.
+* `#19829 <https://github.com/numpy/numpy/pull/19829>`__: MAINT: Standardize guards in numpy/core/src/multiarray.
+* `#19837 <https://github.com/numpy/numpy/pull/19837>`__: MAINT: Bump hypothesis from 6.17.3 to 6.18.0
+* `#19838 <https://github.com/numpy/numpy/pull/19838>`__: MAINT: Bump pytest from 6.2.4 to 6.2.5
+* `#19843 <https://github.com/numpy/numpy/pull/19843>`__: TST: Fix/Improve cast nonstandard bool to numeric test
+* `#19844 <https://github.com/numpy/numpy/pull/19844>`__: DOC: Added missing C-API functions
+* `#19845 <https://github.com/numpy/numpy/pull/19845>`__: TST: Make nanfunc test ignore overflow instead of xfailing test
+* `#19846 <https://github.com/numpy/numpy/pull/19846>`__: MAINT: Update testing to 3.10rc2
+* `#19849 <https://github.com/numpy/numpy/pull/19849>`__: DOC: Fix sentence casing in page titles
+* `#19850 <https://github.com/numpy/numpy/pull/19850>`__: Replace posix specific ssize_t with py_ssize_t to compile on...
+* `#19854 <https://github.com/numpy/numpy/pull/19854>`__: BUG: Fixed an issue wherein ``var`` would raise for 0d object arrays
+* `#19856 <https://github.com/numpy/numpy/pull/19856>`__: MAINT: Mark type-check-only ufunc subclasses as ufunc aliases...
+* `#19857 <https://github.com/numpy/numpy/pull/19857>`__: MAINT, ENH: Refactor percentile and quantile methods
+* `#19862 <https://github.com/numpy/numpy/pull/19862>`__: DOC: Add BRANCH_WALKTHROUGH
+* `#19863 <https://github.com/numpy/numpy/pull/19863>`__: BUG: Fix ``nanpercentile`` ignoring the dtype of all-nan arrays
+* `#19864 <https://github.com/numpy/numpy/pull/19864>`__: DOC: Update RELEASE_WALKTHROUGH
+* `#19865 <https://github.com/numpy/numpy/pull/19865>`__: DOC: Moved NumPy Internals to Under-the-hood documentation for...
+* `#19867 <https://github.com/numpy/numpy/pull/19867>`__: MAINT: Bump hypothesis from 6.18.0 to 6.21.1
+* `#19868 <https://github.com/numpy/numpy/pull/19868>`__: MAINT: Bump sphinx from 4.1.2 to 4.2.0
+* `#19869 <https://github.com/numpy/numpy/pull/19869>`__: BUG: ensure np.median does not drop subclass for NaN result.
+* `#19870 <https://github.com/numpy/numpy/pull/19870>`__: DOC: Small fixups for the release walkthrough
+* `#19874 <https://github.com/numpy/numpy/pull/19874>`__: DOC: Fix typo in upcoming changes filename
+* `#19879 <https://github.com/numpy/numpy/pull/19879>`__: ENH: Add ``__class_getitem__`` to ``ndarray``, ``dtype`` and ``number``
+* `#19882 <https://github.com/numpy/numpy/pull/19882>`__: MAINT: Use SHA-256 instead of SHA-1
+* `#19883 <https://github.com/numpy/numpy/pull/19883>`__: DOC: Fix the reported module names of objects in the ``numpy.typing``...
+* `#19884 <https://github.com/numpy/numpy/pull/19884>`__: TST: Make this sysconfig handling a bit more portable
+* `#19887 <https://github.com/numpy/numpy/pull/19887>`__: ENH: Add annotations for ``np.linalg``
+* `#19888 <https://github.com/numpy/numpy/pull/19888>`__: BUG: core: Fix *_like strides for str and bytes dtype.
+* `#19890 <https://github.com/numpy/numpy/pull/19890>`__: DOC: Added hyperlink on numpy logo in README.md
+* `#19893 <https://github.com/numpy/numpy/pull/19893>`__: MAINT,DOC: f2py restructring
+* `#19894 <https://github.com/numpy/numpy/pull/19894>`__: ENH: Add a typing protocol for representing nested sequences
+* `#19899 <https://github.com/numpy/numpy/pull/19899>`__: DOC: replace return type in np.ma.* docstring
+* `#19900 <https://github.com/numpy/numpy/pull/19900>`__: DOC:Fixed refguide errors for basics.creation.rst
+* `#19902 <https://github.com/numpy/numpy/pull/19902>`__: BUG,DOC: Ignore upcoming_changes from refguide
+* `#19903 <https://github.com/numpy/numpy/pull/19903>`__: DOC: Fixed refguide errors for basics.broadcasting.rst
+* `#19905 <https://github.com/numpy/numpy/pull/19905>`__: DOC: fix docstring formatting of polynomial fit method return...
+* `#19907 <https://github.com/numpy/numpy/pull/19907>`__: MAINT: Bump hypothesis from 6.21.1 to 6.21.6
+* `#19908 <https://github.com/numpy/numpy/pull/19908>`__: BUG: Check whether an error is already set for invalid casting
+* `#19909 <https://github.com/numpy/numpy/pull/19909>`__: MAINT: Re-export ``LinAlgError`` to the ``np.linalg.linalg`` stubs
+* `#19911 <https://github.com/numpy/numpy/pull/19911>`__: DOC: Typos found by codespell
+* `#19913 <https://github.com/numpy/numpy/pull/19913>`__: MAINT: Fix LGTM.com error: Unmatchable caret in regular expression
+* `#19914 <https://github.com/numpy/numpy/pull/19914>`__: MAINT: Fix LGTM.com warning in nditer_imp.h
+* `#19915 <https://github.com/numpy/numpy/pull/19915>`__: ENH: Add annotations for ``np.char``
+* `#19916 <https://github.com/numpy/numpy/pull/19916>`__: MAINT: Repair ``make_lite.py``
+* `#19917 <https://github.com/numpy/numpy/pull/19917>`__: ENH: Add annotations for ``np.lib.arraysetops``
+* `#19918 <https://github.com/numpy/numpy/pull/19918>`__: MAINT: Override the modules of ``np.char`` and ``np.rec`` functions
+* `#19919 <https://github.com/numpy/numpy/pull/19919>`__: ENH: Create an experimental export of the new DType API
+* `#19920 <https://github.com/numpy/numpy/pull/19920>`__: DOC: Fix typos in NEPs, found by codespell
+* `#19921 <https://github.com/numpy/numpy/pull/19921>`__: DEP: Use ``delimiter`` rather than ``delimitor`` as kwarg in mrecords
+* `#19925 <https://github.com/numpy/numpy/pull/19925>`__: BUG: ufunc: Fix potential memory leak.
+* `#19926 <https://github.com/numpy/numpy/pull/19926>`__: BUG: Resolve Divide by Zero on Apple silicon + test failures
+* `#19927 <https://github.com/numpy/numpy/pull/19927>`__: BUG: Only call the get_versions() function once on import
+* `#19928 <https://github.com/numpy/numpy/pull/19928>`__: MAINT: lib: Check that the dtype given to fromregex is structured.
+* `#19929 <https://github.com/numpy/numpy/pull/19929>`__: duplicate item in see also.
+* `#19933 <https://github.com/numpy/numpy/pull/19933>`__: MAINT: random: Use expm1 where appropriate.
+* `#19934 <https://github.com/numpy/numpy/pull/19934>`__: BUG: core: Fix memory leak in the C function boundarraymethod_repr.
+* `#19936 <https://github.com/numpy/numpy/pull/19936>`__: BUG: Make sure __version__ is defined in setup mode
+* `#19937 <https://github.com/numpy/numpy/pull/19937>`__: ENH: Updates to numpy.array_api
+* `#19939 <https://github.com/numpy/numpy/pull/19939>`__: MAINT: Fix LGTM.com warning: Constant in conditional expression...
+* `#19940 <https://github.com/numpy/numpy/pull/19940>`__: MAINT: Fix LGTM.com warning: Variable ``isrec`` defined multiple...
+* `#19942 <https://github.com/numpy/numpy/pull/19942>`__: MAINT: Fix LGTM.com warning: Unreachable code
+* `#19943 <https://github.com/numpy/numpy/pull/19943>`__: MAINT: Fix LGTM.com warning: Variable ``f`` defined multiple times
+* `#19944 <https://github.com/numpy/numpy/pull/19944>`__: MAINT: Fix LGTM.com warning: Comparison result is always the...
+* `#19946 <https://github.com/numpy/numpy/pull/19946>`__: MAINT: Fix LGTM.com warning: Comparison result is always the...
+* `#19948 <https://github.com/numpy/numpy/pull/19948>`__: MAINT: Add annotations for three missing ``ndarray`` methods
+* `#19949 <https://github.com/numpy/numpy/pull/19949>`__: ENH: Add annotations for ``np.rec``
+* `#19951 <https://github.com/numpy/numpy/pull/19951>`__: MAINT: Fix LGTM.com warning: Comparison is always false because...
+* `#19953 <https://github.com/numpy/numpy/pull/19953>`__: ENH: Add annotations to ``np.core.multiarray`` part 4/4
+* `#19957 <https://github.com/numpy/numpy/pull/19957>`__: DOC: Add syntax highlighting, update pronouns
+* `#19960 <https://github.com/numpy/numpy/pull/19960>`__: DOC: Minor syntax fix for numpydoc warnings
+* `#19961 <https://github.com/numpy/numpy/pull/19961>`__: MAINT: Minor cleanups after merging gh-19805
+* `#19962 <https://github.com/numpy/numpy/pull/19962>`__: DOC: Remove overstated TDD evangelism.
+* `#19963 <https://github.com/numpy/numpy/pull/19963>`__: DOC: rename ``np.lib.scimath`` to ``np.emath``
+* `#19965 <https://github.com/numpy/numpy/pull/19965>`__: MAINT: Update funding link in FUNDING.yml
+* `#19967 <https://github.com/numpy/numpy/pull/19967>`__: DOC: Update basics.io.genfromtxt.rst
+* `#19968 <https://github.com/numpy/numpy/pull/19968>`__: ENH: nagfor from NAG is available on Darwin
+* `#19969 <https://github.com/numpy/numpy/pull/19969>`__: MAINT: Misc ``np.array_api`` annotation fixes
+* `#19972 <https://github.com/numpy/numpy/pull/19972>`__: MAINT: Bump hypothesis from 6.21.6 to 6.23.0
+* `#19974 <https://github.com/numpy/numpy/pull/19974>`__: BUG: np.tan(np.inf) test failure in Apple silicon
+* `#19976 <https://github.com/numpy/numpy/pull/19976>`__: DOC Remove reference to ``PyArray_MultiIter_SIZE``
+* `#19977 <https://github.com/numpy/numpy/pull/19977>`__: MAINT: clang-format for f2py
+* `#19978 <https://github.com/numpy/numpy/pull/19978>`__: MAINT: Reduce DepreciationWarnings, use more data API types for...
+* `#19979 <https://github.com/numpy/numpy/pull/19979>`__: ENH: Add annotations for ``np.memmap``
+* `#19980 <https://github.com/numpy/numpy/pull/19980>`__: ENH: Add the linalg extension to the array_api submodule
+* `#19981 <https://github.com/numpy/numpy/pull/19981>`__: DOC: Deindent some sphinx declarations to avoid warnings.
+* `#19983 <https://github.com/numpy/numpy/pull/19983>`__: DOC: Specifically mention the C99 requirement in 'Building from...
+* `#19984 <https://github.com/numpy/numpy/pull/19984>`__: MAINT: Configure pytest to ignore array_api warnings.
+* `#19986 <https://github.com/numpy/numpy/pull/19986>`__: MAINT: Fix LGTM.com warning: Comparison result is always the...
+* `#19987 <https://github.com/numpy/numpy/pull/19987>`__: BUG: Remove double cast to char in favor of PyArray_BYTES
+* `#19988 <https://github.com/numpy/numpy/pull/19988>`__: DOC: Update links to online copy of Abramowitz and Stegun.
+* `#19992 <https://github.com/numpy/numpy/pull/19992>`__: ENH: nagfor - get_flags_linker_so() on darwin
+* `#19995 <https://github.com/numpy/numpy/pull/19995>`__: DOC: for new_order parameter, add alias for 'native' order
+* `#19997 <https://github.com/numpy/numpy/pull/19997>`__: STY: Harmonize rules with cb_rules for f2py
+* `#19999 <https://github.com/numpy/numpy/pull/19999>`__: DOC: Copy-edit and fix typos.
+* `#20000 <https://github.com/numpy/numpy/pull/20000>`__: BUG,DEP: Allow (arg-)partition to accept ``uint64`` indices
+* `#20002 <https://github.com/numpy/numpy/pull/20002>`__: MAINT: Introduce various linting and misc fixes to ``numpy.typing``
+* `#20003 <https://github.com/numpy/numpy/pull/20003>`__: BLD: updated mypy version from 0.902 to 0.910
+* `#20004 <https://github.com/numpy/numpy/pull/20004>`__: DOC: Fix typos in the random and f2py documentation.
+* `#20006 <https://github.com/numpy/numpy/pull/20006>`__: ENH: Add annotations for ``np.lib.function_base`` part 1
+* `#20007 <https://github.com/numpy/numpy/pull/20007>`__: MAINT: Removed the ``cdoc`` directory
+* `#20008 <https://github.com/numpy/numpy/pull/20008>`__: BUG: Fix the ``lib.function_base`` window functions ignoring extended...
+* `#20010 <https://github.com/numpy/numpy/pull/20010>`__: MAINT: correct linker flags for NAG Fortran compiler
+* `#20015 <https://github.com/numpy/numpy/pull/20015>`__: DOC: np.select: use an example that also shows default value
+* `#20016 <https://github.com/numpy/numpy/pull/20016>`__: BUG: Add a warning for user dtypes modifying casts after use
+* `#20018 <https://github.com/numpy/numpy/pull/20018>`__: ENH: core: More informative error message for broadcast(*args)
+* `#20019 <https://github.com/numpy/numpy/pull/20019>`__: MAINT:redundant 'else' statement with 'for' loop#19077
+* `#20026 <https://github.com/numpy/numpy/pull/20026>`__: MAINT: Test PyPy3.8
+* `#20027 <https://github.com/numpy/numpy/pull/20027>`__: ENH: Add missing parameters to the ``nan<x>`` functions
+* `#20029 <https://github.com/numpy/numpy/pull/20029>`__: MAINT: Bump pytz from 2021.1 to 2021.3
+* `#20031 <https://github.com/numpy/numpy/pull/20031>`__: MAINT: Bump hypothesis from 6.23.0 to 6.23.1
+* `#20032 <https://github.com/numpy/numpy/pull/20032>`__: MAINT: Bump pytest-cov from 2.12.1 to 3.0.0
+* `#20034 <https://github.com/numpy/numpy/pull/20034>`__: ENH: Add annotations for ``np.lib.function_base`` part 2/3
+* `#20036 <https://github.com/numpy/numpy/pull/20036>`__: ENH: Add annotations for ``np.lib.function_base`` part 3/3
+* `#20037 <https://github.com/numpy/numpy/pull/20037>`__: MAINT: Fixed an issue wherein ``npt._NestedSequence`` was not a...
+* `#20040 <https://github.com/numpy/numpy/pull/20040>`__: TST: Add python 3.10 to the CI
+* `#20047 <https://github.com/numpy/numpy/pull/20047>`__: DOC:add an example to show flag writeable cleared upon copy related...
+* `#20049 <https://github.com/numpy/numpy/pull/20049>`__: BUG: Correct advance in PCG with emulated int128
+* `#20051 <https://github.com/numpy/numpy/pull/20051>`__: DOC:add-html-reference-to-some-ma-methods
+* `#20057 <https://github.com/numpy/numpy/pull/20057>`__: MAINT: LGTM.com warnings
+* `#20058 <https://github.com/numpy/numpy/pull/20058>`__: MAINT: update OpenBLAS to 0.3.18
+* `#20059 <https://github.com/numpy/numpy/pull/20059>`__: MAINT: LGTM.com recommendations
+* `#20060 <https://github.com/numpy/numpy/pull/20060>`__: MAINT: Remove encoding declarations: ``# -*- coding: utf-8 -*-``
+* `#20061 <https://github.com/numpy/numpy/pull/20061>`__: DOC: Remove references to Python 2
+* `#20063 <https://github.com/numpy/numpy/pull/20063>`__: ENH: Add annotations for ``np.lib.histograms``
+* `#20065 <https://github.com/numpy/numpy/pull/20065>`__: ENH: Add annotations for ``np.lib.polynomial``
+* `#20066 <https://github.com/numpy/numpy/pull/20066>`__: MAINT: A few updates to the array_api
+* `#20067 <https://github.com/numpy/numpy/pull/20067>`__: MAINT: Use ``Py_SET_TYPE`` macro instead of assigning to ``Py_TYPE``
+* `#20069 <https://github.com/numpy/numpy/pull/20069>`__: BUG: Add workaround for missing ufunc error propagation
+* `#20071 <https://github.com/numpy/numpy/pull/20071>`__: MAINT: Remove unused imports and remove duplicated tests
+* `#20076 <https://github.com/numpy/numpy/pull/20076>`__: DOC: Document the dtype comparison operations
+* `#20084 <https://github.com/numpy/numpy/pull/20084>`__: MAINT: move "git submodule update" earlier in docker creation
+* `#20087 <https://github.com/numpy/numpy/pull/20087>`__: BLD: fix submodule update in gitpod.Dockerfile
+* `#20088 <https://github.com/numpy/numpy/pull/20088>`__: BUG: core: result_type(0, np.timedelta64(4)) would seg. fault.
+* `#20091 <https://github.com/numpy/numpy/pull/20091>`__: DOC: fix typo in docstring of bitwise_or
+* `#20094 <https://github.com/numpy/numpy/pull/20094>`__: BUG: AVX-512F log() overflows
+* `#20096 <https://github.com/numpy/numpy/pull/20096>`__: MAINT: Bump hypothesis from 6.23.1 to 6.23.2
+* `#20097 <https://github.com/numpy/numpy/pull/20097>`__: MAINT: Bump pycodestyle from 2.7.0 to 2.8.0
+* `#20102 <https://github.com/numpy/numpy/pull/20102>`__: BLD Uses cibuildwheel for linux + osx wheels [cd build]
+* `#20104 <https://github.com/numpy/numpy/pull/20104>`__: MAINT: Update F2PY documentation URL
+* `#20105 <https://github.com/numpy/numpy/pull/20105>`__: ENH: Add annotations for ``np.matrix``
+* `#20111 <https://github.com/numpy/numpy/pull/20111>`__: DOC: fix minor typo in comment
+* `#20115 <https://github.com/numpy/numpy/pull/20115>`__: DOC: Modify code in absolute beginners tutorial to match image
+* `#20116 <https://github.com/numpy/numpy/pull/20116>`__: MAINT: Fix issue with C compiler args containing spaces
+* `#20119 <https://github.com/numpy/numpy/pull/20119>`__: DOC: Remove double property ctypes from ndarray
+* `#20123 <https://github.com/numpy/numpy/pull/20123>`__: DOC: Add note to iterable docstring about 0d arrays.
+* `#20129 <https://github.com/numpy/numpy/pull/20129>`__: ENH: Misc typing improvements to ``np.array_api``
+* `#20130 <https://github.com/numpy/numpy/pull/20130>`__: MAINT: Bump hypothesis from 6.23.2 to 6.23.3
+* `#20134 <https://github.com/numpy/numpy/pull/20134>`__: BUG: fix win32 np.clip slowness
+* `#20136 <https://github.com/numpy/numpy/pull/20136>`__: BUG: core: Fix incorrect check of NpyIter_Deallocate return value.
+* `#20137 <https://github.com/numpy/numpy/pull/20137>`__: DOC:Reword array has one axis
+* `#20139 <https://github.com/numpy/numpy/pull/20139>`__: MAINT,BUG: Fix ``ufunc.at`` to use new ufunc API
+* `#20142 <https://github.com/numpy/numpy/pull/20142>`__: MAINT: core: Update the comment about _parse_signature with more...
+* `#20146 <https://github.com/numpy/numpy/pull/20146>`__: DOC: Updated docstring for floating point rounding
+* `#20149 <https://github.com/numpy/numpy/pull/20149>`__: REL: Update main after 1.21.3 release.
+* `#20150 <https://github.com/numpy/numpy/pull/20150>`__: BUG: lib: Fix error raised by insert.
+* `#20153 <https://github.com/numpy/numpy/pull/20153>`__: BUG, SIMD: Fix 64-bit/8-bit integer division by a scalar
+* `#20154 <https://github.com/numpy/numpy/pull/20154>`__: MAINT: Add breathe to environment.yml
+* `#20155 <https://github.com/numpy/numpy/pull/20155>`__: BUG: Distutils patch to allow for 2 as a minor version (!)
+* `#20156 <https://github.com/numpy/numpy/pull/20156>`__: DOC: Fixed docstring for parameters 2 and -2 on linalg.cond
+* `#20159 <https://github.com/numpy/numpy/pull/20159>`__: BUG: Relax homogeneous signature fallback in type resolution
+* `#20162 <https://github.com/numpy/numpy/pull/20162>`__: BUG: fixes for MSVC version checks
+* `#20163 <https://github.com/numpy/numpy/pull/20163>`__: ENH: Expose promoters and Common-DType API experimentally
+* `#20164 <https://github.com/numpy/numpy/pull/20164>`__: MAINT: Remove useless custom tp_alloc and tp_free on ndarray
+* `#20165 <https://github.com/numpy/numpy/pull/20165>`__: ENH: Add annotations for ``np.chararray``
+* `#20166 <https://github.com/numpy/numpy/pull/20166>`__: MAINT, STY: Run clang-format on cpp files and headers.
+* `#20170 <https://github.com/numpy/numpy/pull/20170>`__: More informative error for unparsable version
+* `#20172 <https://github.com/numpy/numpy/pull/20172>`__: Allow clib callable build flags
+* `#20173 <https://github.com/numpy/numpy/pull/20173>`__: TST: Disable test_partial_iteration_cleanup on 32 bit Windows.
+* `#20174 <https://github.com/numpy/numpy/pull/20174>`__: TST: xfail ``test_overrides`` when numpy is built with MKL support
+* `#20179 <https://github.com/numpy/numpy/pull/20179>`__: BUG: Do not use nonzero fastpath on unaligned arrays
+* `#20182 <https://github.com/numpy/numpy/pull/20182>`__: DOC, MAINT: Update build systems for f2py
+* `#20183 <https://github.com/numpy/numpy/pull/20183>`__: Thin compatibility layer for C/C++ math header
+* `#20184 <https://github.com/numpy/numpy/pull/20184>`__: MAINT: Miscellaneous typing cleanups
+* `#20187 <https://github.com/numpy/numpy/pull/20187>`__: BUG,DOC: Resolve a refguide failure for ``ndarray.__class_getitem__``
+* `#20188 <https://github.com/numpy/numpy/pull/20188>`__: MAINT: Bump hypothesis from 6.23.3 to 6.24.0
+* `#20190 <https://github.com/numpy/numpy/pull/20190>`__: BUG: Don't pass /arch:SSE2 to MSVC when targeting x64
+* `#20194 <https://github.com/numpy/numpy/pull/20194>`__: DOC: add release note and move NEP 49 to Final
+* `#20195 <https://github.com/numpy/numpy/pull/20195>`__: DOC: Two small changes in array.rst:
+* `#20196 <https://github.com/numpy/numpy/pull/20196>`__: Fix minor grammar issues in docs
+* `#20197 <https://github.com/numpy/numpy/pull/20197>`__: DOC, MAINT : fixing typo in numpy doc
+* `#20199 <https://github.com/numpy/numpy/pull/20199>`__: ENH: Add dtype typing support to ``np.core.numeric``
+* `#20200 <https://github.com/numpy/numpy/pull/20200>`__: MAINT: Only warn for transferred ownership if env variable is...
+* `#20201 <https://github.com/numpy/numpy/pull/20201>`__: DEP: Deprecate ``np.MachAr``
+* `#20205 <https://github.com/numpy/numpy/pull/20205>`__: BUG,DOC: Fix ``random.power``'s error description
+* `#20206 <https://github.com/numpy/numpy/pull/20206>`__: CI: Add new workflow/action for testing universal intrinsics...
+* `#20207 <https://github.com/numpy/numpy/pull/20207>`__: ENH: Add prompt for title in issue forms
+* `#20213 <https://github.com/numpy/numpy/pull/20213>`__: DOC: Mention ``nan`` results in ``power`` and ``float_power``.
+* `#20214 <https://github.com/numpy/numpy/pull/20214>`__: BUG: fix test c-extension compilation inside a venv
+* `#20217 <https://github.com/numpy/numpy/pull/20217>`__: DOC: Add a release note for fully annotating the main numpy namespace
+* `#20219 <https://github.com/numpy/numpy/pull/20219>`__: BUG, SIMD: Workaround broadcasting SIMD 64-bit integers on MSVC...
+* `#20222 <https://github.com/numpy/numpy/pull/20222>`__: Run rebase on Cygwin CI
+* `#20224 <https://github.com/numpy/numpy/pull/20224>`__: BUG: Fix shadowed reference of ``dtype`` in type stubs
+* `#20228 <https://github.com/numpy/numpy/pull/20228>`__: MAINT: Better error message from histogram2d
+* `#20230 <https://github.com/numpy/numpy/pull/20230>`__: ENH: Add annotations for ``np.ctypeslib``
+* `#20232 <https://github.com/numpy/numpy/pull/20232>`__: CI: Add new workflow for Intel SDE
+* `#20234 <https://github.com/numpy/numpy/pull/20234>`__: MAINT: Update vs2017 to vs2019.
+* `#20235 <https://github.com/numpy/numpy/pull/20235>`__: DOC: fix typo in example, put the return statement inside the...
+* `#20237 <https://github.com/numpy/numpy/pull/20237>`__: BUG: ``VOID_nonzero`` could sometimes mutate alignment flag
+* `#20238 <https://github.com/numpy/numpy/pull/20238>`__: BUG: Fix environment checking logic for ``NUMPY_WARN_IF_NO_MEM_POLICY``
+* `#20242 <https://github.com/numpy/numpy/pull/20242>`__: DOC: centralized min-max documentation
+* `#20243 <https://github.com/numpy/numpy/pull/20243>`__: DOC: Fixes wording for fmod and remainder functions.
+* `#20255 <https://github.com/numpy/numpy/pull/20255>`__: DOC: fix missing link in "What is NumPy?" to broadcasting
+* `#20256 <https://github.com/numpy/numpy/pull/20256>`__: The module name in the reshape section of the absolute_beginners.html...
+* `#20261 <https://github.com/numpy/numpy/pull/20261>`__: [DOC] Fix math block in hermmulx, lagmulx
+* `#20267 <https://github.com/numpy/numpy/pull/20267>`__: Adding Examples to numpy.roll()
+* `#20268 <https://github.com/numpy/numpy/pull/20268>`__: MAINT: remove Dependabot
+* `#20269 <https://github.com/numpy/numpy/pull/20269>`__: MAINT: Bump hypothesis from 6.24.0 to 6.24.1
+* `#20270 <https://github.com/numpy/numpy/pull/20270>`__: BUG: Fix headers for universal2 builds
+* `#20271 <https://github.com/numpy/numpy/pull/20271>`__: TST: Add a test for device property
+* `#20274 <https://github.com/numpy/numpy/pull/20274>`__: TST: Some fixes & refactoring around glibc-dependent skips in...
+* `#20279 <https://github.com/numpy/numpy/pull/20279>`__: ENH: Add annotations for ``np.fft``
+* `#20281 <https://github.com/numpy/numpy/pull/20281>`__: DOC: Correct grammar in isfinite docstring
+* `#20282 <https://github.com/numpy/numpy/pull/20282>`__: MAINT: Fix runtests.py overriding $PYTHONPATH environment variable
+* `#20283 <https://github.com/numpy/numpy/pull/20283>`__: MAINT Fix typo for event name in wheels.yml
+* `#20284 <https://github.com/numpy/numpy/pull/20284>`__: BUG: Fix duplication of names in 'numpy.__all__'.
+* `#20287 <https://github.com/numpy/numpy/pull/20287>`__: TST, MAINT: module name excluded in typing tests
+* `#20290 <https://github.com/numpy/numpy/pull/20290>`__: DOC: Do not leave space between directive name and double colon.
+* `#20292 <https://github.com/numpy/numpy/pull/20292>`__: SIMD: replace raw SIMD of ceil with universal intrinsics
+* `#20299 <https://github.com/numpy/numpy/pull/20299>`__: BLD: in conda, pin setuptools to a known working version
+* `#20303 <https://github.com/numpy/numpy/pull/20303>`__: BUG: Fix requirement that user DTypes had to be heaptypes
+* `#20307 <https://github.com/numpy/numpy/pull/20307>`__: REL: Update main after 1.21.4 release.
+* `#20308 <https://github.com/numpy/numpy/pull/20308>`__: MAINT: Add ``IS_PYSTON`` to ``np.testing.__all__``
+* `#20309 <https://github.com/numpy/numpy/pull/20309>`__: MAINT: Add annotations for a missing ``percentile`` interpolation...
+* `#20310 <https://github.com/numpy/numpy/pull/20310>`__: BUG: Fix float16 einsum fastpaths using wrong tempvar
+* `#20314 <https://github.com/numpy/numpy/pull/20314>`__: BUG: Get full precision for 32 bit floating point random values.
+* `#20315 <https://github.com/numpy/numpy/pull/20315>`__: MAINT: Remove Python <3.8 support from C
+* `#20318 <https://github.com/numpy/numpy/pull/20318>`__: MAINT: Remove codeql-analysis.yml.
+* `#20325 <https://github.com/numpy/numpy/pull/20325>`__: DOC: Remove non-existent quantile ``interpolation="inclusive"``...
+* `#20327 <https://github.com/numpy/numpy/pull/20327>`__: BUG,DEP: Fixup quantile/percentile and rename interpolation->method
+* `#20331 <https://github.com/numpy/numpy/pull/20331>`__: MAINT: Update quantile default lerp method
+* `#20333 <https://github.com/numpy/numpy/pull/20333>`__: DEP: remove code for supporting GCC <4 in Mingw32CCompiler
+* `#20334 <https://github.com/numpy/numpy/pull/20334>`__: MAINT: Rename commit trigger to "wheel build" for building wheels
+* `#20342 <https://github.com/numpy/numpy/pull/20342>`__: CI: Bump azure MacOS version to macOS-1015
+* `#20343 <https://github.com/numpy/numpy/pull/20343>`__: ENH: add a 'version' field to PyDataMem_Handler
+* `#20344 <https://github.com/numpy/numpy/pull/20344>`__: BLD: do not position 'cxx=-std=c++11' as a default compiler flag
+* `#20345 <https://github.com/numpy/numpy/pull/20345>`__: ENH: Avoid re-encapsulation of the default handler
+* `#20347 <https://github.com/numpy/numpy/pull/20347>`__: MAINT: Do not forward ``__(deep)copy__`` calls of ``_GenericAlias``...
+* `#20350 <https://github.com/numpy/numpy/pull/20350>`__: DOC: random: Fix a mistake in the zipf example.
+* `#20352 <https://github.com/numpy/numpy/pull/20352>`__: ENH: Prefix log messages with their levels
+* `#20353 <https://github.com/numpy/numpy/pull/20353>`__: BUG, DIST: Print os error message when the executable not exist
+* `#20354 <https://github.com/numpy/numpy/pull/20354>`__: BLD: Verify the ability to compile C++ sources before initiating...
+* `#20360 <https://github.com/numpy/numpy/pull/20360>`__: BUG: Revert from ``long double`` changes, and force ``npymath`` to...
+* `#20361 <https://github.com/numpy/numpy/pull/20361>`__: MAINT: Update SVML sources to prevent an executable stack
+* `#20364 <https://github.com/numpy/numpy/pull/20364>`__: BUG: Relax unary ufunc (sqrt, etc.) stride assert
+* `#20365 <https://github.com/numpy/numpy/pull/20365>`__: BUG: Fix failure to create aligned, empty structured dtype
+* `#20366 <https://github.com/numpy/numpy/pull/20366>`__: MAINT,TST: Avoid small positive integers in refcount test
+* `#20367 <https://github.com/numpy/numpy/pull/20367>`__: ENH, SIMD: add new universal intrinsics for trunc
+* `#20369 <https://github.com/numpy/numpy/pull/20369>`__: MAINT: Fix newlines in diagnostics output of numpy.f2py.
+* `#20373 <https://github.com/numpy/numpy/pull/20373>`__: MAINT: Prepare for branching maintenance/1.22.x
+* `#20379 <https://github.com/numpy/numpy/pull/20379>`__: DOC: Fix formatting of a code example in ``numpy.random.Generator.multivariate_normal()``...
+* `#20386 <https://github.com/numpy/numpy/pull/20386>`__: REV: Add MaskedArray creation from non nd-array back in
+* `#20402 <https://github.com/numpy/numpy/pull/20402>`__: BLD: Fix Macos Builds [wheel build]
+* `#20410 <https://github.com/numpy/numpy/pull/20410>`__: BUG, SIMD: Fix ``exp`` FP stack overflow when ``AVX512_SKX`` is enabled
+* `#20411 <https://github.com/numpy/numpy/pull/20411>`__: ENH: provide a convenience function to replace npy_load_module...
+* `#20415 <https://github.com/numpy/numpy/pull/20415>`__: CI: CircleCI: Install numpy after processing doc_requirements.txt
+* `#20419 <https://github.com/numpy/numpy/pull/20419>`__: MAINT: import setuptools before distutils in one np.random test
+* `#20420 <https://github.com/numpy/numpy/pull/20420>`__: BUG: Clear errors correctly in F2PY conversions
+* `#20429 <https://github.com/numpy/numpy/pull/20429>`__: MAINT: Fix longdouble precision check in test_umath.py
+* `#20430 <https://github.com/numpy/numpy/pull/20430>`__: MAINT: Fix METH_NOARGS function signatures
+* `#20434 <https://github.com/numpy/numpy/pull/20434>`__: REL: Prepare for the NumPy 1.22.0r1 release.
+* `#20436 <https://github.com/numpy/numpy/pull/20436>`__: BUG: Fix an incorrect protocol used in ``np.lib.shape_base``
+* `#20473 <https://github.com/numpy/numpy/pull/20473>`__: BUG: Fix two overload-related problems
+* `#20474 <https://github.com/numpy/numpy/pull/20474>`__: TST: remove obsolete TestF77Mismatch
+* `#20475 <https://github.com/numpy/numpy/pull/20475>`__: MAINT: Update the required setuptools version.
+* `#20476 <https://github.com/numpy/numpy/pull/20476>`__: BUG: Restore support for i386 and PowerPC (OS X)
+* `#20487 <https://github.com/numpy/numpy/pull/20487>`__: MAINT: update wheel to version that supports python3.10
+* `#20496 <https://github.com/numpy/numpy/pull/20496>`__: TST: use pypy3.8-v7.3.7 final versions
+* `#20502 <https://github.com/numpy/numpy/pull/20502>`__: BUG: Fix the .T attribute in the array_api namespace
+* `#20503 <https://github.com/numpy/numpy/pull/20503>`__: BUG: Protect divide by 0 in multinomial distribution.
+* `#20535 <https://github.com/numpy/numpy/pull/20535>`__: BUG: Fix reduce promotion with out argument
+* `#20538 <https://github.com/numpy/numpy/pull/20538>`__: BUG: Fix handling of the dtype parameter to numpy.array_api.prod()
+* `#20539 <https://github.com/numpy/numpy/pull/20539>`__: PERF: Fix performance bug in dispatching cache
+* `#20541 <https://github.com/numpy/numpy/pull/20541>`__: REL: Prepare for NumPy 1.22.0rc2 release.
+* `#20548 <https://github.com/numpy/numpy/pull/20548>`__: REV: Revert adding a default ufunc promoter
+* `#20576 <https://github.com/numpy/numpy/pull/20576>`__: BUG: Fix small issues found using valgrind
+* `#20577 <https://github.com/numpy/numpy/pull/20577>`__: BUG: Fix sorting of int8/int16
+* `#20578 <https://github.com/numpy/numpy/pull/20578>`__: ENH: Add ``__array__`` to the array_api Array object
+* `#20579 <https://github.com/numpy/numpy/pull/20579>`__: MAINT: make sure CI stays on VS2019 unless changed explicitly
+* `#20585 <https://github.com/numpy/numpy/pull/20585>`__: DOC: Update front page of documentation with Sphinx-Panels
+* `#20598 <https://github.com/numpy/numpy/pull/20598>`__: BUG: Fix issues (mainly) found using pytest-leaks
+* `#20599 <https://github.com/numpy/numpy/pull/20599>`__: MAINT: Fix two minor typing-related problems
+* `#20600 <https://github.com/numpy/numpy/pull/20600>`__: BUG: Fix leaks found using pytest-leaks
+* `#20601 <https://github.com/numpy/numpy/pull/20601>`__: MAINT: Check for buffer interface support rather than try/except
+* `#20602 <https://github.com/numpy/numpy/pull/20602>`__: BUG: Fix PyInit__umath_linalg type
+* `#20605 <https://github.com/numpy/numpy/pull/20605>`__: DEV: add a warningfilter to fix pytest workflow.
+* `#20614 <https://github.com/numpy/numpy/pull/20614>`__: TST: Bump mypy: 0.910 -> 0.920
+* `#20617 <https://github.com/numpy/numpy/pull/20617>`__: MAINT: Help boost::python libraries at least not crash
+* `#20632 <https://github.com/numpy/numpy/pull/20632>`__: DOC: Document implementation of NEP 43 and experimental new DType...
+* `#20649 <https://github.com/numpy/numpy/pull/20649>`__: DOC: Modify SVG to be visible on Chrome
+* `#20650 <https://github.com/numpy/numpy/pull/20650>`__: BUG: Support env argument in CCompiler.spawn
+* `#20651 <https://github.com/numpy/numpy/pull/20651>`__: BUG: f2py: Simplify creation of an exception message.
+* `#20680 <https://github.com/numpy/numpy/pull/20680>`__: TYP,TST: Bump mypy to 0.930
+* `#20681 <https://github.com/numpy/numpy/pull/20681>`__: BUG: Fix setstate logic for empty arrays
+* `#20682 <https://github.com/numpy/numpy/pull/20682>`__: ENH: Add ARM Compiler with ARM Performance Library support
index f01ee8a51739b6cc1eeb91333c3fbb7816317e6c..68805e50faf04f8280cb406e4119e1199f438268 100644 (file)
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 #
 # NumPy Enhancement Proposals documentation build configuration file, created by
 # sphinx-quickstart on Mon Dec 11 12:45:09 2017.
index 7f841b7e28fb729a8174c31f6c0c60333e36fee6..044edebc79ed46a2c685ecc1d31e8966fdfed7c3 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP00:
 
 ===========================
-NEP 0 â€” Purpose and Process
+NEP 0 â€” Purpose and process
 ===========================
 
 :Author: Jarrod Millman <millman@berkeley.edu>
index fdf4ae47ae26a7bdd8583ee9057a34a2c2f7ba3d..fb6754f5c095eaca6ae16cf63bc71da2c18be846 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP01:
 
 =============================================
-NEP 1 â€” A Simple File Format for NumPy Arrays
+NEP 1 â€” A simple file format for NumPy arrays
 =============================================
 
 :Author: Robert Kern <robert.kern@gmail.com>
index 4e7fdfdf5769a7c942a5a0866510bcb3605d6a0d..67177d30ba318b4b355898fd68e7a62ac3ee16f3 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP10:
 
 ==============================================
-NEP 10 â€” Optimizing Iterator/UFunc Performance
+NEP 10 â€” Optimizing Iterator/UFunc performance
 ==============================================
 
 :Author: Mark Wiebe <mwwiebe@gmail.com>
@@ -10,7 +10,7 @@ NEP 10 â€” Optimizing Iterator/UFunc Performance
 :Status: Final
 
 *****************
-Table of Contents
+Table of contents
 *****************
 
 .. contents::
@@ -1545,7 +1545,7 @@ Functions For Iteration
 ``npy_intp *NpyIter_GetIndexPtr(NpyIter *iter)``
 
     This gives back a pointer to the index being tracked, or NULL
-    if no index is being tracked.  It is only useable if one of
+    if no index is being tracked.  It is only usable if one of
     the flags ``NPY_ITER_C_INDEX`` or ``NPY_ITER_F_INDEX``
     were specified during construction.
 
index 866a774d15b09dacab6723682f26cecf0b8ce9fd..fde03437881ce1a79568969f1b4278a4b521226a 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP11:
 
 ==================================
-NEP 11 â€” Deferred UFunc Evaluation
+NEP 11 â€” Deferred UFunc evaluation
 ==================================
 
 :Author: Mark Wiebe <mwwiebe@gmail.com>
index f47feadbd031edcaf373c001ec04bcd4d92b8ca9..4775ea18bc1e5a64564bd3e9e1d3a28ae0a4461c 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP12:
 
 ============================================
-NEP 12 â€” Missing Data Functionality in NumPy
+NEP 12 â€” Missing data functionality in NumPy
 ============================================
 
 :Author: Mark Wiebe <mwwiebe@gmail.com>
@@ -903,7 +903,7 @@ before it will allow NA-masked arrays to flow through.
 https://docs.scipy.org/doc/numpy/reference/c-api.array.html#NPY_ARRAY_ALLOWNA
 
 Code which does not follow this advice, and instead just calls PyArray_Check() to verify
-its an ndarray and checks some flags, will silently produce incorrect results. This style
+it is an ndarray and checks some flags, will silently produce incorrect results. This style
 of code does not provide any opportunity for numpy to say "hey, this array is special",
 so also is not compatible with future ideas of lazy evaluation, derived dtypes, etc.
 
@@ -963,7 +963,7 @@ The first version to implement is the array masks, because it is
 the more general approach. The mask itself is an array, but since
 it is intended to never be directly accessible from Python, it won't
 be a full ndarray itself. The mask always has the same shape as
-the array it's attached to, so it doesn't need its own shape. For
+the array it is attached to, so it doesn't need its own shape. For
 an array with a struct dtype, however, the mask will have a different
 dtype than just a straight bool, so it does need its own dtype.
 This gives us the following additions to the PyArrayObject::
index ceb8b23e9587fdc1f11f854c5225c41cf7df5600..c132113db7b810c084f741af7b3a9f5be2df43ef 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP13:
 
 ==========================================
-NEP 13 â€” A Mechanism for Overriding Ufuncs
+NEP 13 â€” A mechanism for overriding Ufuncs
 ==========================================
 
 .. currentmodule:: numpy
@@ -556,7 +556,7 @@ in turn immediately raises :exc:`TypeError`, because one of its operands
 ``arr.__array_ufunc__``, which will return :obj:`NotImplemented`, which
 we catch.
 
-.. note :: the reason for not allowing in-place operations to return
+.. note:: the reason for not allowing in-place operations to return
    :obj:`NotImplemented` is that these cannot generically be replaced by
    a simple reverse operation: most array operations assume the contents
    of the instance are changed in-place, and do not expect a new
index 151c5ad1a45b859b194434fdc83b286cd1c20487..5cb1c0c399e544089c2998cdef8f9e0e128c2e9d 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP17:
 
 ================================
-NEP 17 â€” Split Out Masked Arrays
+NEP 17 â€” Split out masked arrays
 ================================
 
 :Author: Stéfan van der Walt <stefanv@berkeley.edu>
index 0dcb0ff7eafe65ea260f02d55732aa47f0577285..f4c21446bbe6681d539d62f1c59d5e57ef927f18 100644 (file)
@@ -15,8 +15,8 @@ NEP 18 â€” A dispatch mechanism for NumPy's high level array functions
 :Updated: 2019-05-25
 :Resolution: https://mail.python.org/pipermail/numpy-discussion/2018-August/078493.html
 
-Abstact
--------
+Abstract
+--------
 
 We propose the ``__array_function__`` protocol, to allow arguments of NumPy
 functions to define how that function operates on them. This will allow
index 077997f43ac4d1be1d1129bfc58ff65870115784..c5c46603bbc61e35b24ad62092be942f413b20e3 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP19:
 
 =======================================
-NEP 19 â€” Random Number Generator Policy
+NEP 19 â€” Random number generator policy
 =======================================
 
 :Author: Robert Kern <robert.kern@gmail.com>
index 90ed930b483478ab3583f2f6f50b27001cc3f489..80ee75f5f71eb59c09fbf76f19de01e8ad490e37 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP20:
 
 ===============================================================
-NEP 20 â€” Expansion of Generalized Universal Function Signatures
+NEP 20 â€” Expansion of generalized universal function signatures
 ===============================================================
 
 :Author: Marten van Kerkwijk <mhvk@astro.utoronto.ca>
@@ -112,7 +112,7 @@ have a summary of all flags. This could possibly be stored in ``core_enabled``
 but specific flags indicating whether or not a gufunc uses fixed, flexible, or
 broadcastable dimensions.
 
-With the above, the formal defition of the syntax would become [4]_::
+With the above, the formal definition of the syntax would become [4]_::
 
   <Signature>            ::= <Input arguments> "->" <Output arguments>
   <Input arguments>      ::= <Argument list>
index 903ece1ba8e04c89fdf82a51b42f90342dad5d9a..c0e2d2ce777148d7c87cb3bacb1689a13cbb5244 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP24:
 
 =============================================================
-NEP 24 â€” Missing Data Functionality - Alternative 1 to NEP 12
+NEP 24 â€” Missing data functionality - Alternative 1 to NEP 12
 =============================================================
 
 :Author: Nathaniel J. Smith <njs@pobox.com>, Matthew Brett <matthew.brett@gmail.com>
index 49d89d828449a75229f5d8e0b1b3a8b108b66c3f..08dbf36d482982ace02733ce5d3a63eca8b66405 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP26:
 
 ====================================================
-NEP 26 â€” Summary of Missing Data NEPs and discussion
+NEP 26 â€” Summary of missing data NEPs and discussion
 ====================================================
 
 :Author: Mark Wiebe <mwwiebe@gmail.com>, Nathaniel J. Smith <njs@pobox.com>
index cb39726759bac0f9790edfb61c294acf03e6ddfd..eef4bcacc4cd5f40aacff009ae8a8e467dc7ed1f 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP27:
 
 =========================
-NEP 27 â€” Zero Rank Arrays
+NEP 27 â€” Zero rank arrays
 =========================
 
 :Author: Alexander Belopolsky (sasha), transcribed Matt Picus <matti.picus@gmail.com>
@@ -10,7 +10,7 @@ NEP 27 â€” Zero Rank Arrays
 :Created: 2006-06-10
 :Resolution: https://mail.python.org/pipermail/numpy-discussion/2018-October/078824.html
 
-.. note ::
+.. note::
 
     NumPy has both zero rank arrays and scalars. This design document, adapted
     from a `2006 wiki entry`_, describes what zero rank arrays are and why they
index 11a297132db82c5f4d19f94afc2661541654cb1b..1e12b546ab8699d937de5395ff344c3b3e05166f 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP30:
 
 ======================================================
-NEP 30 â€” Duck Typing for NumPy Arrays - Implementation
+NEP 30 â€” Duck typing for NumPy arrays - Implementation
 ======================================================
 
 :Author: Peter Andreas Entschev <pentschev@nvidia.com>
index 47d4bdd37f31155189432bcc4493a26879218010..b4ec94077f802b07b01bdad5c9315740c175003b 100644 (file)
@@ -359,7 +359,7 @@ NEP 18 notes that this may require maintenance of two separate APIs. However,
 this burden may be lessened by, for example, parametrizing all tests over
 ``numpy.overridable`` separately via a fixture. This also has the side-effect
 of thoroughly testing it, unlike ``__array_function__``. We also feel that it
-provides an oppurtunity to separate the NumPy API contract properly from the
+provides an opportunity to separate the NumPy API contract properly from the
 implementation.
 
 Benefits to end-users and mixing backends
index 3a689a4dcd240d1d1101c95e6d5a42ad3fa0e653..f6a77f75470d5d5475020af2b6c6d072f77d93ec 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP35:
 
 ===========================================================
-NEP 35 â€” Array Creation Dispatching With __array_function__
+NEP 35 â€” Array creation dispatching with __array_function__
 ===========================================================
 
 :Author: Peter Andreas Entschev <pentschev@nvidia.com>
@@ -209,7 +209,7 @@ libraries, preventing those libraries from using such important functionality in
 that context.
 
 The purpose of this NEP is to address that shortcoming in a simple and
-straighforward way: introduce a new ``like=`` keyword argument, similar to how
+straightforward way: introduce a new ``like=`` keyword argument, similar to how
 the ``empty_like`` family of functions work. When array creation functions
 receive such an argument, they will trigger the ``__array_function__`` protocol,
 and call the downstream library's own array creation function implementation.
index 34c8f6eb82864d06f3a183a8b0c6972df30349ad..2acdcc70459a16f90cb1474954e5d4440d08d473 100644 (file)
@@ -3,10 +3,10 @@ NEP 36 â€” Fair play
 ==================
 
 :Author: Stéfan van der Walt <stefanv@berkeley.edu>
-:Status: Draft
+:Status: Accepted
 :Type: Informational
 :Created: 2019-10-24
-:Resolution: Draft
+:Resolution: https://mail.python.org/pipermail/numpy-discussion/2021-June/081890.html
 
 
 Abstract
@@ -26,31 +26,34 @@ troublesome, bothersome, and unacceptable.
 Motivation
 ----------
 
-We sometimes learn of NumPy versions modified and circulated by outsiders.
-These patched versions can cause problems for the NumPy community.
+Every so often, we learn of NumPy versions modified and circulated by outsiders.
+These patched versions can cause problems for the NumPy community
+(see, e.g., [#erf]_ and [#CVE-2019-6446]_).
+When issues like these arise, our developers waste time identifying
+the problematic release, locating alterations, and determining an
+appropriate course of action.
 
-- In December 2018, a `bug report
-  <https://github.com/numpy/numpy/issues/12515>`__ was filed against
-  `np.erf` -- a function that didn't exist in the NumPy distribution.
-  It came to light that a company had published a NumPy version with
-  an extended API footprint. After several months of discussion, the
-  company agreed to make its patches public, and we added a label to
-  the NumPy issue tracker to identify issues pertaining to that
-  distribution.
-
-- In another case, after a security issue (CVE-2019-6446) was filed
-  against NumPy, distributions put in their own fixes, most often by
-  changing a default keyword value. As a result the NumPy API was
-  inconsistent across distributions.
-
-When issues arise in cases like these, our developers waste time
-identifying the problematic release, locating alterations,
-and determining an appropriate course of action.
+In addition, packages on the Python Packaging Index are sometimes
+named such that users assume they are sanctioned or maintained by
+NumPy.  We wish to reduce the number of such incidents.
 
 During a community call on `October 16th, 2019
 <https://github.com/numpy/archive/blob/main/status_meetings/status-2019-10-16.md>`__
-the community resolved to draft guidelines on the distribution of
-modified NumPy versions.
+the community resolved to draft guidelines to address these matters.
+
+.. [#erf] In December 2018, a
+   `bug report <https://github.com/numpy/numpy/issues/12515>`__
+   was filed against `np.erf` -- a function that didn't exist in the
+   NumPy distribution.  It came to light that a company had published
+   a NumPy version with an extended API footprint. After several
+   months of discussion, the company agreed to make its patches
+   public, and we added a label to the NumPy issue tracker to identify
+   issues pertaining to that distribution.
+
+.. [#CVE-2019-6446] After a security issue (CVE-2019-6446) was filed
+   against NumPy, distributions put in their own fixes, most often by
+   changing a default keyword value. As a result the NumPy API was
+   inconsistent across distributions.
 
 Scope
 -----
@@ -100,15 +103,16 @@ Fair play rules
      '1.17.2+mycompany.15`
 
    We understand that minor patches are often required to make a
-   library work under a certain distribution.  E.g., Debian may patch
+   library work inside of a distribution.  E.g., Debian may patch
    NumPy so that it searches for optimized BLAS libraries in the
-   correct locations.  But we ask that no substantive changes are
-   made.
+   correct locations.  This is acceptable, but we ask that no
+   substantive changes are made.
 
-3. Do not extend NumPy's API footprint.
+3. Do not extend or modify NumPy's API.
 
    If you absolutely have to break rule two, please do not add
-   additional functions to the namespace.  NumPy's API is already
+   additional functions to the namespace, or modify the API of
+   existing functions.  NumPy's API is already
    quite large, and we are working hard to reduce it where feasible.
    Having additional functions exposed in distributed versions is
    confusing for users and developers alike.
@@ -121,8 +125,8 @@ Fair play rules
    <https://numpy.org/neps/nep-0018-array-function-protocol.html>`__
    were designed to help external packages interact more easily with
    NumPy.  E.g., the latter allows objects from foreign libraries to
-   pass through NumPy unharmed.  We actively encourage using any of
-   these "officialy sanctioned" mechanisms for overriding or
+   pass through NumPy.  We actively encourage using any of
+   these "officially sanctioned" mechanisms for overriding or
    interacting with NumPy.
 
    If these mechanisms are deemed insufficient, please start a
index 396ba13712dec9e58a45d4d0bae6e126306e775a..9272284474a6175a350b967ed605d301cabc8afe 100644 (file)
@@ -64,7 +64,7 @@ mechanism for NumPy. There are three stages to using the mechanism:
 - Infrastructure is provided in the code for abstract intrinsics. The ufunc
   machinery will be extended using sets of these abstract intrinsics, so that
   a single ufunc will be expressed as a set of loops, going from a minimal to
-  a maximal set of possibly availabe intrinsics.
+  a maximal set of possibly available intrinsics.
 - At compile time, compiler macros and CPU detection are used to turn the
   abstract intrinsics into concrete intrinsic calls. Any intrinsics not
   available on the platform, either because the CPU does not support them
@@ -183,7 +183,7 @@ yet supported as a universal intrinsic, then:
 1. It should be added as a universal intrinsic for all platforms
 2. If it does not have an equivalent instruction on other platforms (e.g.
    ``_mm512_mask_i32gather_ps`` in ``AVX512``), then no universal intrinsic
-   should be added and a platform-specific ``ufunc`` or a short helper fuction
+   should be added and a platform-specific ``ufunc`` or a short helper function
    should be written instead. If such a helper function is used, it must be
    wrapped with the feature macros, and a reasonable non-intrinsic fallback to
    be used by default.
@@ -289,7 +289,7 @@ implementing and maintaining that platform's loop code.
 Discussion
 ----------
 
-Most of the discussion took place on the PR `gh-15228`_ to accecpt this NEP.
+Most of the discussion took place on the PR `gh-15228`_ to accept this NEP.
 Discussion on the mailing list mentioned `VOLK`_ which was added to
 the section on related work. The question of maintainability also was raised
 both on the mailing list and in `gh-15228`_ and resolved as follows:
index 7ea7f6df35e966f474fed10a51bf75da8dc0a686..a6e74d7a0c1f62f3b06e9be377cf35ad92167d53 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP40:
 
 ================================================
-NEP 40 â€” Legacy Datatype Implementation in NumPy
+NEP 40 â€” Legacy datatype implementation in NumPy
 ================================================
 
 :title: Legacy Datatype Implementation in NumPy
@@ -82,7 +82,7 @@ Thus we have data types (mainly strings) with the properties that:
 2. Array coercion should be able to discover the exact dtype, such as for
    ``np.array(["str1", 12.34], dtype="S")`` where NumPy discovers the
    resulting dtype as ``"S5"``.
-   (If the dtype argument is ommitted the behaviour is currently ill defined [gh-15327]_.)
+   (If the dtype argument is omitted the behaviour is currently ill defined [gh-15327]_.)
    A form similar to ``dtype="S"`` is ``dtype="datetime64"`` which can
    discover the unit: ``np.array(["2017-02"], dtype="datetime64")``.
 
@@ -197,7 +197,7 @@ Currently ``np.dtype`` is a Python class with its instances being the
 To set the actual behaviour of these instances, a prototype instance is stored
 globally and looked up based on the ``dtype.typenum``. The singleton is used
 where possible. Where required it is copied and modified, for instance to change
-endianess.
+endianness.
 
 Parametric datatypes (strings, void, datetime, and timedelta) must store
 additional information such as string lengths, fields, or datetime units --
index d7a08562d9c471add45396557cf752c83fa6dfff..2fb907073b7f3056bf8d227b849c02a5b7165fec 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP41:
 
 =================================================
-NEP 41 â€” First step towards a new Datatype System
+NEP 41 â€” First step towards a new datatype system
 =================================================
 
 :title: First step towards a new Datatype System
@@ -284,7 +284,7 @@ in general, it is not safe::
     >>> np.can_cast(np.float64, np.dtype[mp.mpf](dps=4), casting="safe")
     False
 
-since a float64 has a higer precision than the ``mpf`` datatype with
+since a float64 has a higher precision than the ``mpf`` datatype with
 ``dps=4``.
 
 Alternatively, we can say that::
@@ -765,7 +765,7 @@ Discussion
 See :ref:`NEP 40 <NEP40>`
 for a list of previous meetings and discussions.
 
-Additional discussion around this specific NEP has occured on both
+Additional discussion around this specific NEP has occurred on both
 the mailing list and the pull request:
 
 * `Mailing list discussion <https://mail.python.org/pipermail/numpy-discussion/2020-March/080481.html>`_
index bb85f1d10cba141b6502af5d82e6b6dc06662e97..c29172a281c568120f80843c0b5363faa241b170 100644 (file)
@@ -214,7 +214,7 @@ which describes the casting from one DType to another. In
 :ref:`NEP 43 <NEP43>` this ``CastingImpl`` object is used unchanged to
 support universal functions.
 Note that the name ``CastingImpl`` here will be generically called
-``ArrayMethod`` to accomodate both casting and universal functions.
+``ArrayMethod`` to accommodate both casting and universal functions.
 
 
 ******************************************************************************
index cd73108e4fbb643a50858a3938a302f592fc8572..3312eb12cc89970b52c99f705d983d3fc3b15fe1 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP43:
 
 ==============================================================================
-NEP 43 â€” Enhancing the Extensibility of UFuncs
+NEP 43 â€” Enhancing the extensibility of UFuncs
 ==============================================================================
 
 :title: Enhancing the Extensibility of UFuncs
@@ -571,7 +571,7 @@ This stores all of the constant information that is part of the ``Context``,
 such as:
 
 * the ``DTypes``
-* the number of input and ouput arguments
+* the number of input and output arguments
 * the ufunc signature (specific to generalized ufuncs, compare :ref:`NEP20`).
 
 Fortunately, most users and even ufunc implementers will not have to worry
@@ -1233,7 +1233,7 @@ are the best solution:
    logic fails or is incorrect for a newly-added loop, the loop can add a
    new promoter to refine the logic.
 
-The option of having each loop verify that no upcast occured is probably
+The option of having each loop verify that no upcast occurred is probably
 the best alternative, but does not include the ability to dynamically
 adding new loops.
 
index 229856547620cf57b999d9030dd752a036e102ff..fd41e0c2a41bc86f40f2aaad89f880b521f74fa9 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP44:
 
 ===================================================
-NEP 44 â€” Restructuring the NumPy Documentation
+NEP 44 â€” Restructuring the NumPy documentation
 ===================================================
 
 :Author: Ralf Gommers
index 5a2fcf946aa78aa8b93fc67801a6d78a69e93ced..9a6323873300f3f4d823032cab3401219266d412 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP45:
 
 =================================
-NEP 45 â€” C Style Guide
+NEP 45 â€” C style guide
 =================================
 
 :Author: Charles Harris <charlesr.harris@gmail.com>
index b8b312aa52d9eb1acb0f36f2b8acefff8b2ecc97..8535cb554703be93251062af3eca3677b992240d 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP46:
 
 =====================================
-NEP 46 â€” NumPy Sponsorship Guidelines
+NEP 46 â€” NumPy sponsorship guidelines
 =====================================
 
 :Author: Ralf Gommers <ralf.gommers@gmail.com>
index 19965c20d908aa3c19fabea67ffcc130261022d3..53b8e35b001fc186a1bf3bc07b1e7cf903d1550e 100644 (file)
@@ -91,7 +91,7 @@ In addition to those use cases, the new namespace contains functionality that
 is widely used and supported by many array libraries. As such, it is a good
 set of functions to teach to newcomers to NumPy and recommend as "best
 practice". That contrasts with NumPy's main namespace, which contains many
-functions and objects that have been superceded or we consider mistakes - but
+functions and objects that have been superseded or we consider mistakes - but
 that we can't remove because of backwards compatibility reasons.
 
 The usage of the ``numpy.array_api`` namespace by downstream libraries is
@@ -104,7 +104,7 @@ Adoption in downstream libraries
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 The prototype implementation of the ``array_api`` namespace will be used with
-SciPy, scikit-learn and other libraries of interest that depend on NumPy, in
+SciPy, scikit-learn, and other libraries of interest that depend on NumPy, in
 order to get more experience with the design and find out if any important
 parts are missing.
 
@@ -179,35 +179,41 @@ have a direct NumPy equivalent. This figure shows what is included at a high lev
 
 The most important changes compared to what NumPy currently offers are:
 
-- A new array object which:
+- A new array object, ``numpy.array_api.Array`` which:
 
-    - conforms to the casting rules and indexing behaviour specified by the
+    - is a thin pure Python (non-subclass) wrapper around ``np.ndarray``,
+    - conforms to the casting rules and indexing behavior specified by the
       standard,
     - does not have methods other than dunder methods,
-    - does not support the full range of NumPy indexing behaviour. Advanced
-      indexing with integers is not supported. Only boolean indexing
-      with a single (possibly multi-dimensional) boolean array is supported.
-      An indexing expression that selects a single element returns a 0-D array
-      rather than a scalar.
+    - does not support the full range of NumPy indexing behavior (see
+      :ref:`indexing` below),
+    - does not have distinct scalar objects, only 0-D arrays,
+    - cannot be constructed directly. Instead array construction functions
+      like ``asarray()`` should be used.
 
 - Functions in the ``array_api`` namespace:
 
-    - do not accept ``array_like`` inputs, only NumPy arrays and Python scalars
+    - do not accept ``array_like`` inputs, only ``numpy.array_api`` array
+      objects, with Python scalars only being supported in dunder operators on
+      the array object,
     - do not support ``__array_ufunc__`` and ``__array_function__``,
     - use positional-only and keyword-only parameters in their signatures,
     - have inline type annotations,
     - may have minor changes to signatures and semantics of individual
       functions compared to their equivalents already present in NumPy,
     - only support dtype literals, not format strings or other ways of
-      specifying dtypes
+      specifying dtypes,
+    - generally may only support a restricted set of dtypes compared to their
+      NumPy counterparts.
 
 - DLPack_ support will be added to NumPy,
 - New syntax for "device support" will be added, through a ``.device``
   attribute on the new array object, and ``device=`` keywords in array creation
   functions in the ``array_api`` namespace,
-- Casting rules that differ from those NumPy currently has. Output dtypes can
+- Casting rules will differ from those NumPy currently has. Output dtypes can
   be derived from input dtypes (i.e. no value-based casting), and 0-D arrays
-  are treated like >=1-D arrays.
+  are treated like >=1-D arrays. Cross-kind casting (e.g., int to float) is
+  not allowed.
 - Not all dtypes NumPy has are part of the standard. Only boolean, signed and
   unsigned integers, and floating-point dtypes up to ``float64`` are supported.
   Complex dtypes are expected to be added in the next version of the standard.
@@ -220,6 +226,31 @@ Improvements to existing NumPy functionality that are needed include:
   that are currently missing such support.
 - Add the ``keepdims`` keyword to ``np.argmin`` and ``np.argmax``.
 - Add a "never copy" mode to ``np.asarray``.
+- Add smallest_normal to ``np.finfo()``.
+- DLPack_ support.
+
+Additionally, the ``numpy.array_api`` implementation was chosen to be a
+*minimal* implementation of the array API standard. This means that it not
+only conforms to all the requirements of the array API, but it explicitly does
+not include any APIs or behaviors not explicitly required by it. The standard
+itself does not require implementations to be so restrictive, but doing this
+with the NumPy array API implementation will allow it to become a canonical
+implementation of the array API standard. Anyone who wants to make use of the
+array API standard can use the NumPy implementation and be sure that their
+code is not making use of behaviors that will not be in other conforming
+implementations.
+
+In particular, this means
+
+- ``numpy.array_api`` will only include those functions that are listed in the
+  standard. This also applies to methods on the ``Array`` object,
+- Functions will only accept input dtypes that are required by the standard
+  (e.g., transcendental functions like ``cos`` will not accept integer dtypes
+  because the standard only requires them to accept floating-point dtypes),
+- Type promotion will only occur for combinations of dtypes required by the
+  standard (see the :ref:`dtypes-and-casting-rules` section below),
+- Indexing is limited to a subset of possible index types (see :ref:`indexing`
+  below).
 
 
 Functions in the ``array_api`` namespace
@@ -228,41 +259,56 @@ Functions in the ``array_api`` namespace
 Let's start with an example of a function implementation that shows the most
 important differences with the equivalent function in the main namespace::
 
-    def max(x: array, /, *,
-            axis: Optional[Union[int, Tuple[int, ...]]] = None,
-            keepdims: bool = False
-        ) -> array:
+    def matmul(x1: Array, x2: Array, /) -> Array:
         """
-        Array API compatible wrapper for :py:func:`np.max <numpy.max>`.
+        Array API compatible wrapper for :py:func:`np.matmul <numpy.matmul>`.
+        See its docstring for more information.
         """
-        return np.max._implementation(x, axis=axis, keepdims=keepdims)
+        if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+            raise TypeError("Only numeric dtypes are allowed in matmul")
 
-This function does not accept ``array_like`` inputs, only ``ndarray``. There
-are multiple reasons for this. Other array libraries all work like this.
-Letting the user do coercion of lists, generators, or other foreign objects
-separately results in a cleaner design with less unexpected behaviour.
-It's higher-performance - less overhead from ``asarray`` calls. Static typing
-is easier. Subclasses will work as expected. And the slight increase in verbosity
-because users have to explicitly coerce to ``ndarray`` on rare occasions
-seems like a small price to pay.
+        # Call result type here just to raise on disallowed type combinations
+        _result_type(x1.dtype, x2.dtype)
+
+        return Array._new(np.matmul(x1._array, x2._array))
+
+This function does not accept ``array_like`` inputs, only
+``numpy.array_api.Array``. There are multiple reasons for this. Other array
+libraries all work like this. Requiring the user to do coercion of Python
+scalars, lists, generators, or other foreign objects explicitly results in a
+cleaner design with less unexpected behavior. It is higher-performance---less
+overhead from ``asarray`` calls. Static typing is easier. Subclasses will work
+as expected. And the slight increase in verbosity because users have to
+explicitly coerce to ``ndarray`` on rare occasions seems like a small price to
+pay.
 
 This function does not support ``__array_ufunc__`` nor ``__array_function__``.
 These protocols serve a similar purpose as the array API standard module itself,
-but through a different mechanisms. Because only ``ndarray`` instances are accepted,
+but through a different mechanisms. Because only ``Array`` instances are accepted,
 dispatching via one of these protocols isn't useful anymore.
 
-This function uses positional-only parameters in its signature. This makes code
-more portable - writing ``max(x=x, ...)`` is no longer valid, hence if other
-libraries call the first parameter ``input`` rather than ``x``, that is fine.
-The rationale for keyword-only parameters (not shown in the above example) is
-two-fold: clarity of end user code, and it being easier to extend the signature
-in the future with keywords in the desired order.
+This function uses positional-only parameters in its signature. This makes
+code more portable---writing, for instance, ``max(a=a, ...)`` is no longer
+valid, hence if other libraries call the first parameter ``input`` rather than
+``a``, that is fine. Note that NumPy already uses positional-only arguments
+for functions that are ufuncs. The rationale for keyword-only parameters (not
+shown in the above example) is two-fold: clarity of end user code, and it
+being easier to extend the signature in the future without worrying about the
+order of keywords.
 
 This function has inline type annotations. Inline annotations are far easier to
 maintain than separate stub files. And because the types are simple, this will
 not result in a large amount of clutter with type aliases or unions like in the
 current stub files NumPy has.
 
+This function only accepts numeric dtypes (i.e., not ``bool``). It also does
+not allow the input dtypes to be of different kinds (the internal
+``_result_type()`` function will raise ``TypeError`` on cross-kind type
+combinations like ``_result_type(int32, float64)``). This allows the
+implementation to be minimal. Preventing combinations that work in NumPy but
+are not required by the array API specification lets users of the submodule
+know they are not relying on NumPy specific behavior that may not be present
+in array API conforming implementations from other libraries.
 
 DLPack support for zero-copy data interchange
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -283,18 +329,19 @@ the options already present in NumPy are:
    ROCm drivers, or OpenCL devices). NumPy is CPU-only, but other array
    libraries are not. Having one protocol per device isn't tenable, hence
    device support is a must.
-2. Widespread support. DLPack has the widest adoption of all protocols, only
-   NumPy is missing support. And the experiences of other libraries with it
+2. Widespread support. DLPack has the widest adoption of all protocols. Only
+   NumPy is missing support, and the experiences of other libraries with it
    are positive. This contrasts with the protocols NumPy does support, which
-   are used very little - when other libraries want to interoperate with
+   are used very little---when other libraries want to interoperate with
    NumPy, they typically use the (more limited, and NumPy-specific)
    ``__array__`` protocol.
 
 Adding support for DLPack to NumPy entails:
 
-- Adding a ``ndarray.__dlpack__`` method
-- Adding a ``from_dlpack`` function, which takes as input an object
-  supporting ``__dlpack__``, and returns an ``ndarray``.
+- Adding a ``ndarray.__dlpack__()`` method which returns a ``dlpack`` C
+  structure wrapped in a ``PyCapsule``.
+- Adding a ``np._from_dlpack(obj)`` function, where ``obj`` supports
+  ``__dlpack__()``, and returns an ``ndarray``.
 
 DLPack is currently a ~200 LoC header, and is meant to be included directly, so
 no external dependency is needed. Implementation should be straightforward.
@@ -307,7 +354,7 @@ NumPy itself is CPU-only, so it clearly doesn't have a need for device support.
 However, other libraries (e.g. TensorFlow, PyTorch, JAX, MXNet) support
 multiple types of devices: CPU, GPU, TPU, and more exotic hardware.
 To write portable code on systems with multiple devices, it's often necessary
-to create new arrays on the same device as some other array, or check that
+to create new arrays on the same device as some other array, or to check that
 two arrays live on the same device. Hence syntax for that is needed.
 
 The array object will have a ``.device`` attribute which enables comparing
@@ -317,16 +364,19 @@ from the same library and it's the same hardware device). Furthermore,
 
     def empty(shape: Union[int, Tuple[int, ...]], /, *,
               dtype: Optional[dtype] = None,
-              device: Optional[device] = None) -> array:
+              device: Optional[device] = None) -> Array:
         """
         Array API compatible wrapper for :py:func:`np.empty <numpy.empty>`.
         """
-        return np.empty(shape, dtype=dtype, device=device)
+        if device not in ["cpu", None]:
+            raise ValueError(f"Unsupported device {device!r}")
+        return Array._new(np.empty(shape, dtype=dtype))
 
-The implementation for NumPy may be as simple as setting the device attribute to
-the string ``'cpu'`` and raising an exception if array creation functions
+The implementation for NumPy is as simple as setting the device attribute to
+the string ``"cpu"`` and raising an exception if array creation functions
 encounter any other value.
 
+.. _dtypes-and-casting-rules:
 
 Dtypes and casting rules
 ~~~~~~~~~~~~~~~~~~~~~~~~
@@ -345,79 +395,101 @@ for more details).
 
 Specifying dtypes to functions, e.g. via the ``dtype=`` keyword, is expected
 to only use the dtype literals. Format strings, Python builtin dtypes, or
-string representations of the dtype literals are not accepted - this will
-improve readability and portability of code at little cost.
-
-Casting rules are only defined between different dtypes of the same kind. The
-rationale for this is that mixed-kind (e.g., integer to floating-point)
-casting behavior differs between libraries. NumPy's mixed-kind casting
-behavior doesn't need to be changed or restricted, it only needs to be
-documented that if users use mixed-kind casting, their code may not be
-portable.
+string representations of the dtype literals are not accepted. This will
+improve readability and portability of code at little cost. Furthermore, no
+behavior is expected of these dtype literals themselves other than basic
+equality comparison. In particular, since the array API does not have scalar
+objects, syntax like ``float32(0.0)`` is not allowed (a 0-D array can be
+created with ``asarray(0.0, dtype=float32)``).
+
+Casting rules are only defined between different dtypes of the same kind
+(i.e., boolean to boolean, integer to integer, or floating-point to
+floating-point). This also means omitting integer-uint64 combinations that
+would upcast to float64 in NumPy. The rationale for this is that mixed-kind
+(e.g., integer to floating-point) casting behaviors differ between libraries.
 
 .. image:: _static/nep-0047-casting-rules-lattice.png
 
 *Type promotion diagram. Promotion between any two types is given by their
-join on this lattice. Only the types of participating arrays matter, not
-their values. Dashed lines indicate that behaviour for Python scalars is
-undefined on overflow. Boolean, integer and floating-point dtypes are not
-connected, indicating mixed-kind promotion is undefined.*
+join on this lattice. Only the types of participating arrays matter, not their
+values. Dashed lines indicate that behavior for Python scalars is undefined on
+overflow. The Python scalars themselves are only allowed in operators on the
+array object, not inside of functions. Boolean, integer and floating-point
+dtypes are not connected, indicating mixed-kind promotion is undefined (for
+the NumPy implementation, these raise an exception).*
 
 The most important difference between the casting rules in NumPy and in the
-array API standard is how scalars and 0-dimensional arrays are handled. In
-the standard, array scalars do not exist and 0-dimensional arrays follow the
-same casting rules as higher-dimensional arrays.
+array API standard is how scalars and 0-dimensional arrays are handled. In the
+standard, array scalars do not exist and 0-dimensional arrays follow the same
+casting rules as higher-dimensional arrays. Furthermore, there is no
+value-based casting in the standard. The result type of an operation can be
+predicted entirely from its input arrays' dtypes, regardless of their shapes
+or values. Python scalars are only allowed in dunder operations (like
+``__add__``), and only if they are of the same kind as the array dtype. They
+always cast to the dtype of the array, regardless of value. Overflow behavior
+is undefined.
 
 See the `Type Promotion Rules section of the array API standard <https://data-apis.github.io/array-api/latest/API_specification/type_promotion.html>`__
 for more details.
 
-.. note::
-
-    It is not clear what the best way is to support the different casting rules
-    for 0-dimensional arrays and no value-based casting. One option may be to
-    implement this second set of casting rules, keep them private, mark the
-    array API functions with a private attribute that says they adhere to
-    these different rules, and let the casting machinery check whether for
-    that attribute.
+In the implementation, this means
 
-    This needs discussion.
+- Ensuring any operation that would produce an scalar object in NumPy is
+  converted to a 0-D array in the ``Array`` constructor,
+- Checking for combinations that would apply value-based casting and
+  ensuring they promote to the correct type. This can be achieved, e.g., by
+  manually broadcasting 0-D inputs (preventing them from participating in
+  value-based casting), or by explicitly passing the ``signature`` argument
+  to the underlying ufunc,
+- In dunder operator methods, manually converting Python scalar inputs to 0-D
+  arrays of the matching dtype if they are the same kind, and raising otherwise. For scalars out of
+  bounds of the given dtype (for which the behavior is undefined by the spec),
+  the behavior of ``np.array(scalar, dtype=dtype)`` is used (either cast or
+  raise OverflowError).
 
+.. _indexing:
 
 Indexing
 ~~~~~~~~
 
 An indexing expression that would return a scalar with ``ndarray``, e.g.
-``arr_2d[0, 0]``, will return a 0-D array with the new array object. There are
-several reasons for that: array scalars are largely considered a design mistake
+``arr_2d[0, 0]``, will return a 0-D array with the new ``Array`` object. There are
+several reasons for this: array scalars are largely considered a design mistake
 which no other array library copied; it works better for non-CPU libraries
 (typically arrays can live on the device, scalars live on the host); and it's
-simply a consistent design. To get a Python scalar out of a 0-D array, one can
-simply use the builtin for the type, e.g. ``float(arr_0d)``.
+simply a more consistent design. To get a Python scalar out of a 0-D array, one can
+use the builtin for the type, e.g. ``float(arr_0d)``.
 
 The other `indexing modes in the standard <https://data-apis.github.io/array-api/latest/API_specification/indexing.html>`__
 do work largely the same as they do for ``numpy.ndarray``. One noteworthy
 difference is that clipping in slice indexing (e.g., ``a[:n]`` where ``n`` is
-larger than the size of the first axis) is unspecified behaviour, because
+larger than the size of the first axis) is unspecified behavior, because
 that kind of check can be expensive on accelerators.
 
-The lack of advanced indexing, and boolean indexing being limited to a single
-n-D boolean array, is due to those indexing modes not being suitable for all
-types of arrays or JIT compilation. Their absence does not seem to be
+The standard omits advanced indexing (indexing by an integer array), and boolean indexing is limited to a
+single n-D boolean array. This is due to those indexing modes not being
+suitable for all types of arrays or JIT compilation. Furthermore, some
+advanced NumPy indexing semantics, such as the semantics for mixing advanced
+and non-advanced indices in a single index, are considered design mistakes in
+NumPy. The absence of these more advanced index types does not seem to be
 problematic; if a user or library author wants to use them, they can do so
 through zero-copy conversion to ``numpy.ndarray``. This will signal correctly
 to whomever reads the code that it is then NumPy-specific rather than portable
 to all conforming array types.
 
-
+Being a minimal implementation, ``numpy.array_api`` will explicitly disallow
+slices with clipped bounds, advanced indexing, and boolean indices mixed with
+other indices.
 
 The array object
 ~~~~~~~~~~~~~~~~
 
 The array object in the standard does not have methods other than dunder
-methods. The rationale for that is that not all array libraries have methods
-on their array object (e.g., TensorFlow does not). It also provides only a
-single way of doing something, rather than have functions and methods that
-are effectively duplicate.
+methods. It also does not allow direct construction, preferring instead array
+construction methods like ``asarray``. The rationale for that is that not all
+array libraries have methods on their array object (e.g., TensorFlow does
+not). It also provides only a single way of doing something, rather than have
+functions and methods that are effectively duplicate.
 
 Mixing operations that may produce views (e.g., indexing, ``nonzero``)
 in combination with mutation (e.g., item or slice assignment) is
@@ -425,41 +497,60 @@ in combination with mutation (e.g., item or slice assignment) is
 This cannot easily be prohibited in the array object itself; instead this will
 be guidance to the user via documentation.
 
-The standard current does not prescribe a name for the array object itself.
-We propose to simply name it ``ndarray``. This is the most obvious name, and
-because of the separate namespace should not clash with ``numpy.ndarray``.
-
+The standard current does not prescribe a name for the array object itself. We
+propose to name it ``Array``. This uses proper PEP 8 capitalization for a
+class, and does not conflict with any existing NumPy class names. [3]_ Note
+that the actual name of the array class does not actually matter that much as
+it is not itself included in the top-level namespace, and cannot be directly
+constructed.
 
 Implementation
 --------------
 
-.. note::
-
-    This section needs a lot more detail, which will gradually be added when
-    the implementation progresses.
-
 A prototype of the ``array_api`` namespace can be found in
-https://github.com/data-apis/numpy/tree/array-api/numpy/_array_api.
-The docstring in its ``__init__.py`` has notes on completeness of the
-implementation. The code for the wrapper functions also contains ``# Note:``
-comments everywhere there is a difference with the NumPy API.
-Two important parts that are not implemented yet are the new array object and
-DLPack support. Functions may need changes to ensure the changed casting rules
-are respected.
-
-The array object
-~~~~~~~~~~~~~~~~
-
-Regarding the array object implementation, we plan to start with a regular
-Python class that wraps a ``numpy.ndarray`` instance. Attributes and methods
-can forward to that wrapped instance, applying input validation and
-implementing changed behaviour as needed.
-
-The casting rules are probably the most challenging part. The in-progress
-dtype system refactor (NEPs 40-43) should make implementing the correct casting
-behaviour easier - it is already moving away from value-based casting for
-example.
-
+https://github.com/numpy/numpy/pull/18585. The docstring in its
+``__init__.py`` has several important notes about implementation details. The
+code for the wrapper functions also contains ``# Note:`` comments everywhere
+there is a difference with the NumPy API. The
+implementation is entirely in pure Python, and consists primarily of wrapper
+classes/functions that pass through to the corresponding NumPy functions after
+applying input validation and any changed behavior. One important part that is not
+implemented yet is DLPack_ support, as its implementation in ``np.ndarray`` is
+still in progress (https://github.com/numpy/numpy/pull/19083).
+
+The ``numpy.array_api`` module is considered experimental. This means that
+importing it will issue a ``UserWarning``. The alternative to this was naming
+the module ``numpy._array_api``, but the warning was chosen instead so that it
+does not become necessary to rename the module in the future, potentially
+breaking user code. The module also requires Python 3.8 or greater due to
+extensive use of the positional-only argument syntax.
+
+The experimental nature of the module also means that it is not yet mentioned
+anywhere in the NumPy documentation, outside of its module docstring and this
+NEP. Documentation for the implementation is itself a challenging problem.
+Presently every docstring in the implementation simply references the
+underlying NumPy function it implements. However, this is not ideal, as the
+underlying NumPy function may have different behavior from the corresponding
+function in the array API, for instance, additional keyword arguments that are
+not present in the array API. It has been suggested that documentation may be
+pulled directly from the spec itself, but support for this would require
+making some technical changes to the way the spec is written, and so the
+current implementation does not yet make any attempt to do this.
+
+The array API specification is accompanied by an in-progress `official test
+suite <https://github.com/data-apis/array-api-tests>`_, which is designed to
+test conformance of any library to the array API specification. The tests
+included with the implementation will therefore be minimal, as the majority of
+the behavior will be verified by this test suite. The tests in NumPy itself
+for the ``array_api`` submodule will only include testing for behavior not
+covered by the array API test suite, for instance, tests that the
+implementation is minimal and properly rejects things like disallowed type
+combinations. A CI job will be added to the array API test suite repository to
+regularly test it against the NumPy implementation. The array API test suite
+is designed to be vendored if libraries wish to do that, but this idea was
+rejected for NumPy because the time taken by it is significant relative to the
+existing NumPy test suite, and because the test suite is itself still
+a work in progress.
 
 The dtype objects
 ~~~~~~~~~~~~~~~~~
@@ -476,16 +567,20 @@ Dtypes should not be assumed to have a class hierarchy by users, however we are
 free to implement it with a class hierarchy if that's convenient. We considered
 the following options to implement dtype objects:
 
-1. Alias dtypes to those in the main namespace. E.g., ``np.array_api.float32 =
+1. Alias dtypes to those in the main namespace, e.g., ``np.array_api.float32 =
    np.float32``.
-2. Make the dtypes instances of ``np.dtype``. E.g., ``np.array_api.float32 =
+2. Make the dtypes instances of ``np.dtype``, e.g., ``np.array_api.float32 =
    np.dtype(np.float32)``.
 3. Create new singleton classes with only the required methods/attributes
    (currently just ``__eq__``).
 
 It seems like (2) would be easiest from the perspective of interacting with
-functions outside the main namespace. And (3) would adhere best to the
-standard.
+functions outside the main namespace and (3) would adhere best to the
+standard. (2) does not prevent users from accessing NumPy-specific attributes
+of the dtype objects like (3) would, although unlike (1), it does disallow
+creating scalar objects like ``float32(0.0)``. (2) also keeps only one object
+per dtype---with (1), ``arr.dtype`` would be still be a dtype instance. The
+implementation currently uses (2).
 
 TBD: the standard does not yet have a good way to inspect properties of a
 dtype, to ask questions like "is this an integer dtype?". Perhaps this is easy
@@ -533,8 +628,11 @@ between many array libraries rather than only between NumPy and one other librar
 Alternatives
 ------------
 
-
-
+It was proposed to have the NumPy array API implementation as a separate
+library from NumPy. This was rejected because keeping it separate will make it
+less likely for people to review it, and including it in NumPy itself as an
+experimental submodule will make it easier for end users and library authors
+who already depend on NumPy to access the implementation.
 
 Appendix - a possible ``get_namespace`` implementation
 ------------------------------------------------------
@@ -569,6 +667,11 @@ Discussion
 
 - `First discussion on the mailing list about the array API standard <https://mail.python.org/pipermail/numpy-discussion/2020-November/081181.html>`__
 
+- `Discussion of NEP 47 on the mailing list
+  <https://mail.python.org/pipermail/numpy-discussion/2021-February/081530.html>`_
+
+- `PR #18585 implementing numpy.array_api
+  <https://github.com/numpy/numpy/pull/18585>`_
 
 References and Footnotes
 ------------------------
@@ -583,6 +686,7 @@ References and Footnotes
 
 .. [2] https://data-apis.org/blog/array_api_standard_release/
 
+.. [3] https://github.com/numpy/numpy/pull/18585#discussion_r641370294
 
 Copyright
 ---------
index 3571eef2d8e6f295a0cc0639c2fe69600e46fd57..d2924d4a9e35fab177092978d95b4bc26494631a 100644 (file)
@@ -1,7 +1,7 @@
 .. _NEP48:
 
 =====================================
-NEP 48 â€” Spending NumPy Project Funds
+NEP 48 â€” Spending NumPy project funds
 =====================================
 
 :Author: Ralf Gommers <ralf.gommers@gmail.com>
index 743dd2ad6e905f81705b1a72e084a3420aee83ae..3bd1d102c62d4f0293ded6b45bd21d40aacd544c 100644 (file)
@@ -3,10 +3,10 @@ NEP 49 â€” Data allocation strategies
 ===================================
 
 :Author: Matti Picus
-:Status: Draft
+:Status: Final
 :Type: Standards Track
 :Created: 2021-04-18
-:Resolution: http://numpy-discussion.10968.n7.nabble.com/NEP-49-Data-allocation-strategies-tt49185.html
+:Resolution: https://mail.python.org/archives/list/numpy-discussion@python.org/thread/YZ3PNTXZUT27B6ITFAD3WRSM3T3SRVK4/#PKYXCTG4R5Q6LIRZC4SEWLNBM6GLRF26
 
 
 Abstract
@@ -43,10 +43,10 @@ override ``malloc``.
 
 The long CPython discussion of `BPO 18835`_  began with discussing the need for
 ``PyMem_Alloc32`` and ``PyMem_Alloc64``.  The early conclusion was that the
-cost (of wasted padding) vs. the benifit of aligned memory is best left to the
+cost (of wasted padding) vs. the benefit of aligned memory is best left to the
 user, but then evolves into a discussion of various proposals to deal with
 memory allocations, including `PEP 445`_ `memory interfaces`_ to
-``PyTraceMalloc_Track`` which apparently was explictly added for NumPy.
+``PyTraceMalloc_Track`` which apparently was explicitly added for NumPy.
 
 Allowing users to implement different strategies via the NumPy C-API will
 enable exploration of this rich area of possible optimizations. The intention
@@ -93,19 +93,30 @@ High level design
 
 Users who wish to change the NumPy data memory management routines will use
 :c:func:`PyDataMem_SetHandler`, which uses a :c:type:`PyDataMem_Handler`
-structure to hold pointers to functions used to manage the data memory.
+structure to hold pointers to functions used to manage the data memory. In
+order to allow lifetime management of the ``context``, the structure is wrapped
+in a ``PyCapsule``.
 
 Since a call to ``PyDataMem_SetHandler`` will change the default functions, but
 that function may be called during the lifetime of an ``ndarray`` object, each
-``ndarray`` will carry with it the ``PyDataMem_Handler`` struct used at the
-time of its instantiation, and these will be used to reallocate or free the
-data memory of the instance. Internally NumPy may use ``memcpy`` or ``memset``
-on the pointer to the data memory.
+``ndarray`` will carry with it the ``PyDataMem_Handler``-wrapped PyCapsule used
+at the time of its instantiation, and these will be used to reallocate or free
+the data memory of the instance. Internally NumPy may use ``memcpy`` or
+``memset`` on the pointer to the data memory.
 
 The name of the handler will be exposed on the python level via a
 ``numpy.core.multiarray.get_handler_name(arr)`` function. If called as
 ``numpy.core.multiarray.get_handler_name()`` it will return the name of the
-global handler that will be used to allocate data for the next new `ndarrray`.
+handler that will be used to allocate data for the next new `ndarrray`.
+
+The version of the handler will be exposed on the python level via a
+``numpy.core.multiarray.get_handler_version(arr)`` function. If called as
+``numpy.core.multiarray.get_handler_version()`` it will return the version of the
+handler that will be used to allocate data for the next new `ndarrray`.
+
+The version, currently 1, allows for future enhancements to the
+``PyDataMemAllocator``. If fields are added, they must be added to the end.
+
 
 NumPy C-API functions
 =====================
@@ -117,37 +128,68 @@ NumPy C-API functions
     .. code-block:: c
 
         typedef struct {
-            char name[128];  /* multiple of 64 to keep the struct aligned */
-            PyDataMem_AllocFunc *alloc;
-            PyDataMem_ZeroedAllocFunc *zeroed_alloc;
-            PyDataMem_FreeFunc *free;
-            PyDataMem_ReallocFunc *realloc;
+            char name[127];  /* multiple of 64 to keep the struct aligned */
+            uint8_t version; /* currently 1 */
+            PyDataMemAllocator allocator;
         } PyDataMem_Handler;
 
-    where the function's signatures are
+    where the allocator structure is
 
     .. code-block:: c
 
-        typedef void *(PyDataMem_AllocFunc)(size_t size);
-        typedef void *(PyDataMem_ZeroedAllocFunc)(size_t nelems, size_t elsize);
-        typedef void (PyDataMem_FreeFunc)(void *ptr, size_t size);
-        typedef void *(PyDataMem_ReallocFunc)(void *ptr, size_t size);
-
-.. c:function:: const PyDataMem_Handler * PyDataMem_SetHandler(PyDataMem_Handler *handler)
+        /* The declaration of free differs from PyMemAllocatorEx */
+        typedef struct {
+            void *ctx;
+            void* (*malloc) (void *ctx, size_t size);
+            void* (*calloc) (void *ctx, size_t nelem, size_t elsize);
+            void* (*realloc) (void *ctx, void *ptr, size_t new_size);
+            void (*free) (void *ctx, void *ptr, size_t size);
+        } PyDataMemAllocator;
+
+    The use of a ``size`` parameter in ``free`` differentiates this struct from
+    the :c:type:`PyMemAllocatorEx` struct in Python. This call signature is
+    used internally in NumPy currently, and also in other places for instance
+    `C++98 <https://en.cppreference.com/w/cpp/memory/allocator/deallocate>`,
+    `C++11 <https://en.cppreference.com/w/cpp/memory/allocator_traits/deallocate>`, and
+    `Rust (allocator_api) <https://doc.rust-lang.org/std/alloc/trait.Allocator.html#tymethod.deallocate>`.
+
+    The consumer of the `PyDataMemAllocator` interface must keep track of ``size`` and make sure it is
+    consistent with the parameter passed to the ``(m|c|re)alloc``  functions.
+
+    NumPy itself may violate this requirement when the shape of the requested
+    array contains a ``0``, so authors of PyDataMemAllocators should relate to
+    the ``size`` parameter as a best-guess. Work to fix this is ongoing in PRs
+    15780_ and 15788_ but has not yet been resolved. When it is this NEP should
+    be revisited.
+
+.. c:function:: PyObject * PyDataMem_SetHandler(PyObject *handler)
 
    Sets a new allocation policy. If the input value is ``NULL``, will reset
-   the policy to the default. Returns the previous policy, ``NULL`` if the
-   previous policy was the default. We wrap the user-provided functions
+   the policy to the default. Return the previous policy, or
+   return NULL if an error has occurred. We wrap the user-provided
    so they will still call the Python and NumPy memory management callback
    hooks. All the function pointers must be filled in, ``NULL`` is not
    accepted.
 
-.. c:function:: const char * PyDataMem_GetHandlerName(PyArrayObject *obj)
+.. c:function:: const PyObject * PyDataMem_GetHandler()
+
+   Return the current policy that will be used to allocate data for the
+   next ``PyArrayObject``. On failure, return ``NULL``.
 
-   Return the const char name of the ``PyDataMem_Handler`` used by the
-   ``PyArrayObject``. If ``NULL``, return the name of the current global policy
-   that will be used to allocate data for the next ``PyArrayObject``.
+``PyDataMem_Handler`` thread safety and lifetime
+================================================
+The active handler is stored in the current :py:class:`~contextvars.Context`
+via a :py:class:`~contextvars.ContextVar`. This ensures it can be configured both
+per-thread and per-async-coroutine.
 
+There is currently no lifetime management of ``PyDataMem_Handler``.
+The user of `PyDataMem_SetHandler` must ensure that the argument remains alive
+for as long as any objects allocated with it, and while it is the active handler.
+In practice, this means the handler must be immortal.
+
+As an implementation detail, currently this ``ContextVar`` contains a ``PyCapsule``
+object storing a pointer to a ``PyDataMem_Handler`` with no destructor,
+but this should not be relied upon.
 
 Sample code
 ===========
@@ -162,8 +204,16 @@ the ``sz`` argument is correct.
     #include <numpy/arrayobject.h>
     NPY_NO_EXPORT void *
 
-    shift_alloc(size_t sz) {
-        char *real = (char *)malloc(sz + 64);
+    typedef struct {
+        void *(*malloc)(size_t);
+        void *(*calloc)(size_t, size_t);
+        void *(*realloc)(void *, size_t);
+        void (*free)(void *);
+    } Allocator;
+
+    NPY_NO_EXPORT void *
+    shift_alloc(Allocator *ctx, size_t sz) {
+        char *real = (char *)ctx->malloc(sz + 64);
         if (real == NULL) {
             return NULL;
         }
@@ -172,8 +222,8 @@ the ``sz`` argument is correct.
     }
 
     NPY_NO_EXPORT void *
-    shift_zero(size_t sz, size_t cnt) {
-        char *real = (char *)calloc(sz + 64, cnt);
+    shift_zero(Allocator *ctx, size_t sz, size_t cnt) {
+        char *real = (char *)ctx->calloc(sz + 64, cnt);
         if (real == NULL) {
             return NULL;
         }
@@ -183,7 +233,7 @@ the ``sz`` argument is correct.
     }
 
     NPY_NO_EXPORT void
-    shift_free(void * p, npy_uintp sz) {
+    shift_free(Allocator *ctx, void * p, npy_uintp sz) {
         if (p == NULL) {
             return ;
         }
@@ -191,37 +241,36 @@ the ``sz`` argument is correct.
         if (strncmp(real, "originally allocated", 20) != 0) {
             fprintf(stdout, "uh-oh, unmatched shift_free, "
                     "no appropriate prefix\\n");
-            /* Make the C runtime crash by calling free on the wrong address */
-            free((char *)p + 10);
-            /* free(real); */
+            /* Make C runtime crash by calling free on the wrong address */
+            ctx->free((char *)p + 10);
+            /* ctx->free(real); */
         }
         else {
-            int i = atoi(real +20);
+            npy_uintp i = (npy_uintp)atoi(real +20);
             if (i != sz) {
-                fprintf(stderr, "uh-oh, unmatched "
-                        "shift_free(ptr, %d) but allocated %d\\n", sz, i);
-                /* Make the C runtime crash by calling free on the wrong address */
-                /* free((char *)p + 10); */
-                free(real);
+                fprintf(stderr, "uh-oh, unmatched shift_free"
+                        "(ptr, %ld) but allocated %ld\\n", sz, i);
+                /* This happens when the shape has a 0, only print */
+                ctx->free(real);
             }
             else {
-                free(real);
+                ctx->free(real);
             }
         }
     }
 
     NPY_NO_EXPORT void *
-    shift_realloc(void * p, npy_uintp sz) {
+    shift_realloc(Allocator *ctx, void * p, npy_uintp sz) {
         if (p != NULL) {
             char *real = (char *)p - 64;
             if (strncmp(real, "originally allocated", 20) != 0) {
                 fprintf(stdout, "uh-oh, unmatched shift_realloc\\n");
                 return realloc(p, sz);
             }
-            return (void *)((char *)realloc(real, sz + 64) + 64);
+            return (void *)((char *)ctx->realloc(real, sz + 64) + 64);
         }
         else {
-            char *real = (char *)realloc(p, sz + 64);
+            char *real = (char *)ctx->realloc(p, sz + 64);
             if (real == NULL) {
                 return NULL;
             }
@@ -231,64 +280,25 @@ the ``sz`` argument is correct.
         }
     }
 
-    static PyDataMem_Handler new_handler = {
-        "secret_data_allocator",
-        shift_alloc,      /* alloc */
-        shift_zero,       /* zeroed_alloc */
-        shift_free,       /* free */
-        shift_realloc     /* realloc */
+    static Allocator new_handler_ctx = {
+        malloc,
+        calloc,
+        realloc,
+        free
     };
 
-    static PyObject* mem_policy_test_prefix(PyObject *self, PyObject *args)
-    {
-
-        if (!PyArray_Check(args)) {
-            PyErr_SetString(PyExc_ValueError,
-                    "must be called with a numpy scalar or ndarray");
+    static PyDataMem_Handler new_handler = {
+        "secret_data_allocator",
+        1,
+        {
+            &new_handler_ctx,
+            shift_alloc,      /* malloc */
+            shift_zero, /* calloc */
+            shift_realloc,      /* realloc */
+            shift_free       /* free */
         }
-        return PyUnicode_FromString(
-                        PyDataMem_GetHandlerName((PyArrayObject*)args));
     };
 
-    static PyObject* mem_policy_set_new_policy(PyObject *self, PyObject *args)
-    {
-
-         const PyDataMem_Handler *old = PyDataMem_SetHandler(&new_handler);
-         return PyUnicode_FromString(old->name);
-
-    };
-
-    static PyObject* mem_policy_set_old_policy(PyObject *self, PyObject *args)
-    {
-
-         const PyDataMem_Handler *old = PyDataMem_SetHandler(NULL);
-         return PyUnicode_FromString(old->name);
-
-    };
-
-    static PyMethodDef methods[] = {
-    {"test_prefix", (PyCFunction)mem_policy_test_prefix, METH_O},
-    {"set_new_policy", (PyCFunction)mem_policy_set_new_policy, METH_NOARGS},
-    {"set_old_policy", (PyCFunction)mem_policy_set_old_policy, METH_NOARGS},
-    { NULL }
-    };
-
-    static struct PyModuleDef moduledef = {
-        PyModuleDef_HEAD_INIT,
-        "mem_policy",  /* m_name */
-        NULL,           /* m_doc */
-        -1,             /* m_size */
-        methods,        /* m_methods */
-    };
-
-    PyMODINIT_FUNC
-    PyInit_mem_policy(void) {
-    PyObject *mod = PyModule_Create(&moduledef);
-        import_array();
-        return mod;
-    }
-
-
 Related Work
 ------------
 
@@ -315,7 +325,9 @@ mechanism. The PR was merged with no example code for using these features.
 Discussion
 ----------
 
-Not yet discussed on the mailing list.
+The discussion on the mailing list led to the ``PyDataMemAllocator`` struct
+with a ``context`` field like :c:type:`PyMemAllocatorEx` but with a different
+signature for ``free``.
 
 
 References and Footnotes
@@ -329,6 +341,8 @@ References and Footnotes
 .. _`PR 17582`: https://github.com/numpy/numpy/pull/17582
 .. _`PR 5457`: https://github.com/numpy/numpy/pull/5457
 .. _`PR 5470`: https://github.com/numpy/numpy/pull/5470
+.. _`15780`: https://github.com/numpy/numpy/pull/15780
+.. _`15788`: https://github.com/numpy/numpy/pull/15788
 .. _`PR 390`: https://github.com/numpy/numpy/pull/390
 .. _`issue 17467`: https://github.com/numpy/numpy/issues/17467
 .. _`comment in the PR`: https://github.com/numpy/numpy/pull/17582#issuecomment-809145547
index 42f717c7a8f07d8490211604b7d728b2c7f2f149..bbb48eaae5bac018e217cab0ac1cb33dcfc6776c 100644 (file)
@@ -1,5 +1,5 @@
 =================================
-NEP X â€” Template and Instructions
+NEP X â€” Template and instructions
 =================================
 
 :Author: <list of authors' real names and optionally, email addresses>
diff --git a/doc/preprocess.py b/doc/preprocess.py
new file mode 100755 (executable)
index 0000000..870d3e1
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+import subprocess
+import os
+import sys
+from string import Template
+
+def main():
+    doxy_gen(os.path.abspath(os.path.join('..')))
+
+def doxy_gen(root_path):
+    """
+    Generate Doxygen configuration file.
+    """
+    confs = doxy_config(root_path)
+    build_path = os.path.join(root_path, "doc", "build", "doxygen")
+    gen_path = os.path.join(build_path, "Doxyfile")
+    if not os.path.exists(build_path):
+        os.makedirs(build_path)
+    with open(gen_path, 'w') as fd:
+        fd.write("#Please Don't Edit! This config file was autogenerated by ")
+        fd.write(f"doxy_gen({root_path}) in doc/preprocess.py.\n")
+        for c in confs:
+            fd.write(c)
+
+class DoxyTpl(Template):
+    delimiter = '@'
+
+def doxy_config(root_path):
+    """
+    Fetch all Doxygen sub-config files and gather it with the main config file.
+    """
+    confs = []
+    dsrc_path = os.path.join(root_path, "doc", "source")
+    sub = dict(ROOT_DIR=root_path)
+    with open(os.path.join(dsrc_path, "doxyfile"), "r") as fd:
+        conf = DoxyTpl(fd.read())
+        confs.append(conf.substitute(CUR_DIR=dsrc_path, **sub))
+
+    for dpath, _, files in os.walk(root_path):
+        if ".doxyfile" not in files:
+            continue
+        conf_path = os.path.join(dpath, ".doxyfile")
+        with open(conf_path, "r") as fd:
+            conf = DoxyTpl(fd.read())
+            confs.append(conf.substitute(CUR_DIR=dpath, **sub))
+    return confs
+
+
+if __name__ == "__main__":
+    main()
+
diff --git a/doc/source/_static/index-images/api.svg b/doc/source/_static/index-images/api.svg
new file mode 100644 (file)
index 0000000..e637525
--- /dev/null
@@ -0,0 +1,31 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100" viewBox="0 0 1170 1063">
+  <metadata><?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c138 79.159824, 2016/09/14-01:09:01        ">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""/>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?></metadata>
+<image width="1170" height="1063" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABJIAAAQnCAMAAACXNLbrAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAANlBMVEUBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMAAACj98WdAAAAEHRSTlMAQL+AIBBgn1CP36/vcDDPTJL3MQAAAAFiS0dEEeK1PboAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflCgkWEi2YZYTeAAAjTUlEQVR42u3dDVoUyRKG0QRERfFn/6u903J11FHpbjIrPjPOWUE8mPFaVV0N4zPL3Ay2dFN9snY2qgfYmSRtSpIWGtUD7EySNiVJC43qAXYmSZuSpIVG9QA7k6RNSdJCo3qAnUnSpiRpoVE9wM4kaVOStNCoHmBnkrQpSVpoVA+wM0nalCQtNKoH2JkkbUqSFhrVA+xMkjYlSQuN6gF2JkmbkqSFRvUAO5OkTUnSQqN6gJ1J0qYkaaFRPcDOJGlTkrTQqB5gZ5K0KUlaaFQPsDNJ2pQkLTSqB9iZJG1KkhYa1QPsTJI2JUkLjeoBdiZJm5KkhUb1ADuTpE1J0kKjeoCdSdKmJGmhUT3AziRpU5K00KgeYGeStClJWmhUD7AzSdqUJC00qgfYmSRtSpIWGtUD7EySNiVJC43qAXYmSZuSpIVG9QA7k6RNSdJCo3qAnUnSpiRpoVE9wM4kaVOStNCoHmBnkrQpSVpoVA+wM0nalCQtNKoH2JkkbUqSFhrVA+xMkjYlSQuN6gF2JkmbkqSFRvUAO5OkTUnSQqN6gJ1J0qYkaaFRPcDOJGlTkrTQqB5gZ5K0KUlaaFQPsDNJ2pQkLTSqB9iZJG1KkhYa1QPsTJI2JUkLjeoBdiZJm5KkhUb1ADuTpE1J0kKjeoCdSdKmJGmhUT3AziRpU5K00KgeYGeStClJWmhUD7AzSdqUJC00qgfYmSRtSpIWGtUD7EySNiVJC43qAXYmSZuSpIVG9QA7k6RNSdJCo3qAnUnSpiRpoVE9wM4kaVOStNCoHmBnkrQpSVpoVA+wM0nalCQtNKoH2JkkbUqSFhrVA+xMkjYlSQuN6gF2JkmbkqSFRvUAO5OkTUnSQqN6gJ1J0qYkaaFRPcDOJGlTkrTQqB5gZ5K0KUlaaFQPsDNJ2pQkLTSqB9iZJG1KkhYa1QPsTJI2JUkLjeoBdiZJm5KkhUb1ADuTpE1J0kKjeoCdSdKmJGmhUT3AziRpU5K00KgeYGeStClJWmhUD7AzSdqUJC00qgfYmSRtSpIWGtUD7EySNiVJC43qAXYmSZuSpIVG9QA7k6RNSdJCo3qAnUnSpiRpoVE9wM4kaVOStNCoHmBnkrQpSVpoVA+wM0nalCQtNKoH2JkkbUqSFhrVA+xMkjYlSQuN6gF2JkmbkqSFRvUAO5OkTUnSQqN6gJ1J0qYkaaFRPcDOJGlTkrTQqB5gZ5K0KUlaaFQPsDNJ2pQkLTSqB9iZJG1KkhYa1QPsTJI2JUkLjeoBdiZJm5KkhUb1ADuTpE1J0kKjeoCdSdKmJGmhUT3AziRpU5K00KgeYGeStClJWmhUD7AzSdqUJC00qgfYmSRtSpIWGtUD7EySNiVJC43qAXYmSZuSpIVG9QA7k6RNSdJCo3qAnUnSpiRpoVE9wM4kaVOStNCoHmBnkrQpSVpoVA+wM0nalCQtNKoH2JkkbUqSFhrVA+xMkjYlSQuN6gF2JkmbkqSFRvUAO5OkTUnSQqN6gJ1J0qYkaaFRPcDOJGlTkrTQqB5gZ5K0KUlaaFQPsDNJ2pQkLTSqB9iZJG1KkhYa1QPsTJI2JUkLjeoBdiZJm5KkhUb1ADuTpE1J0kKjeoCdSdKmJGmhUT3AziRpU5K00KgeYGeStClJWmhUD7AzSdqUJC00qgfYmSRtSpIWGtUD7EySNiVJC43qAXYmSZuSpIVG9QA7k6RNSdJCo3qAnUnSpiRpoVE9wM4kaVOStNCoHmBnkrQpSVpoVA+wM0nalCQtNKoH+Hx7t61X1avDGq+qT9Y6t9U9CEjSXfX5Ar66q+6BJAH/kiRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiSd5/7m9d3dm9snd3d3NzfVE51mevvvTA8ZM43TTA//zvQ2Yaa/iSRJ0rNevX64/dUP7t37u7J9e/X24fbxVzPd3t3cF810//bulzM93t69rZrp7yNJkvRnb9+8++NP7/bDx+NnevjzTJ/ujp/p5uHTn2d6cLl0FkmSpD94+/6cH+C7h1dHzvTm8ayZjqzSzVkzPb5RpedJkiT9zquHc/bsyafXB8109+7smd59OOZu6T5wpr+YJEnSr93cXvZTfLxbv2w3by6c6YDLt1cXzvT5zZGXlH8hSZKkX7k0SCero3TNTKsDcHGQDpjpLydJkvRfH69Z/s9ro/TqrMdav/CwcKZrgnQiSr8nSZL0s/trF+0f794umukFB/Xxw6If1N35z9r+M5ND9zuSJEk/eXv9op3crrgAuDn/AfIvZ1rx6dvNpxfN9Mmnb78mSZL0g/tr74++eZz+4dv9w4v/jedfKL18JufulyTJ0fjezcsukZ68n/v05uPLLpGe3E6e6WWXSE8+Hf9C519AkiTpO5OOw7uZu/Z6zkyPM2+UXs8o9z8zLXry9leTJEn65uU3bV9NvHl7wbP2n8yb6eU3bc7eb0mSY/HV/Yybkck/1KkzvZk007xK/jOTt7l/IkmS9H8f59yMfDVl/6cWKXOmT5r0I0mSpCeTizRl/6c82P7ehP2fXCRN+pkkSdIX04s0oUkLZnrx/k8vkib9RJIk6WTB9r+4Sfezr5FOPr1wpvlF0qQfSZIk/ePViiK9sElLtj9zJk36jiRJ0rJNe9lL06tmekmTZn7WNmum3UiSJI1x5Rf/z3D9u4Crtv8l7yet2xZn8BtJchwmvvn3H4/Xvsf9YeE/+LUzvV04k/e4v5IkSVq5adc+Jvm4cqbH62Za9MDt/zP5DUr/J0ntk7R00z5/frhmpiUftv3r/VU/qFUPt5688KPAfUhS+ySte5D05JpbkmlftvuNax67r16V5sfwG0nqfhZWPrT54orbpKW3kl9muvw2aemt5Bd+VckXktQ8SYtv204uvnVbfNt2cnvxD2rtbduJW7cvJKl5klbfIp1c+puKFn4C+M2lt5NHLMqq3xH+d5Gk3km6OeIHfOF//6+OmOndZbeT9+svJq/+JHAzktQ7SetvR04uezlx9fP2a/7V1724+T0vcQ9JOmmcpEm/RPY57y6Z6ZALtwsvSQ65cPuHl5Mk6aRxktY/R35yyWXSMRdJl/2zH3OR5DLpRJI6J+mgi6SLLpMOuki66DLpqIskl0lDkk76JumYJ0kn518mHfER4KX/7kddJLlMGpJ00jZJh12QXPCh23EXJOdfuh3ycdsTH7pJ0ufGSTruP//zX00+4p2kr869dFv+gvt3vJskSX2TdH/kD/ncO5LjLkjO//btUR8CnFz04eSWJKlvko78z//z43kzLf922w/Oe5i8/ttt32v/TTdJ6puk4x5un5x3l3Tcw+2T8+6SjryXvPKXuexEktom6cAHySdn3SUdei957kP3I+/b3LlJ0ue2STr0vu3MO7dj79vOu3M79r7NnZsktU3SsfdI5333/sjPAE/OuZs8ekWaHseyn/d/jeoBup6Bo3/M5zwkOfYe6by7yWMfuV3zq5z2Ikldk3Tge5JPznhwc/DjrbPuJg9+vPWP6pNRTJK6Jun4f/nnX0w+7Dt33zz/4ObwdF/8G+82I0ldk3TUF+7/9fyqHftx+8nzD5OO35Ce57HwB/6zUT1A0yNw5GvS5/6cj8/k8w+4jv4U4No/6bQNSWqapOMfkZzxnZLjZ3r+WfLRT9zbv5kkSU2TdPwjkufX//Cn2+c83z5+ps/VZ6OWJDVN0sEvSj79Uz+jIJPPznT0i5InvV+WlKSmSar4h39upopMPvfMvSKTvT9yk6SmSTr6PemT51at4jAmztT7dyZJUtMkHf/h1vPrf/w7AM+/BVCxIC0PZOlP/EejeoCeJyAxSRUzPfePL0lHk6SmJyBx/RNnqrjB7f03ASSpaZISf9CJSaqYqfcXbyVJkmJ+0JL0RJJqjeoBJCnlBy1JTySp1qgeQJJSftCS9ESSao3qASQp5QctSU8kqdaoHqBnkqz/eTP5xO1okiRJh/Fe0pyZ9iZJTU9AYpK8vf2k5YEs/Yn/aFQP0PME+I7beTNVfBXYd9xqjeoBeibJbwJ44jcBpJGkpkk6/jfv+31J5/L7kmqN6gF6JslvlfzCb5WMI0lNk+R3b3+R+Lu3z/iDdzuTpKZJ8hdKvvAXSuJIUtckHb9q/o7beXqex8If+M9G9QBNj8Dx//LPz3T8M/dXz87kr90eTJK6JunwVTvjEcnhz7fP+ZNpR8/0ufpkFJOkrkk6/Of+/GOb458ln/NtsqMfcPX+0q0knTRN0tEPk865Hzn6nfLnHyUdvyJNj2PZz/u/RvUAXc/Awe9KP/8G0D/eHvxPf3/GTEe/LNn7RUlJOmmapIMf3Jz3GzeOfTXhvDeAjr2bPOfx1tYkqW2SxqdDf8pvz5rp2Du3877feuyrCec8ctuaJPVN0qEfuZ9133b0ndvzrwCcHHvn1v2+TZI+903Sod8pOfc3JR5553bua9JHXk42/zbJkKSTrkk69C7p3P/8j7xLOu9e8tgPAs75DHBvktQ4SQe+LXn2yzYHPnQ/+0Hy/XGXbo/nfAa4N0lqnKQD3wI8/z//4y7dzv/ljcddurV/uC1JJ32TdNgD7gs+2T7s0u2CC5LjLt3Oe+C+NUnqnKTDXrm55AnJUZdul/yzH3Xp1vvPJT2RpNZJOugy6aLX/w66TLroqc1Rl0kukiTppHGSDrokuexjpGO+fHfZv/oxT5M8SRqSdNI5SYdcklz43fZDLkku/N7GIR+6+bjtRJJ6J+mQpySXvpB8xKE8952kr454N6n332/7SpKaJ+mA//4vvh25X//U/fLfb73+FW4vbn8hSc2TtP6//3eX344sv518vPw58vpvurX/dtsTSeqepOVPk6/5VdKrnyZf87WN1avS/Bh+I0ntz8LiW7erPkW6X3ubdN2fJVo7U/ffb/uNJLVP0trbpCsfkCy9TbriVvLk1cp2X3EruSlJkqSVh+DqTVv4EufjtQ9tVv4yp+Z/Kek7kiRJKx8nXb9p695OuP73f6z7KMDn/99IkiQtfHTzkt/+s+rF8pf8c6/qpO+2/UuSJGksexPoRV+QWNTJl23/mk56tP0dSZKkk48rHt2+8P/+JU1KnOmTL5J8R5Ik6YsFTXrx3ciC/U+cSZF+IEmS9GR6kyY8H5m+/4kzKdKPJEmS/u/j3F2b8sR28v7PmWnu86RbRfqRJEnSV1P3f9Jf2rif+X7CrF9HNPNzN5+1/UySJOmb+2m79njp7/74vXlfd5v394jmvZ/kfaT/kCRJ+s6kXfs080vtr+c85Ho3c6a3c2Z69M72f0mSJH3v44wXlN7MfTwy5SHX+7kzvZox063vtf2CJEnSD17+8GbiTdvXmV588/Y4/wbp5Zvj3P2SJDkaP3n7sgulyZcjT25eNtOSy5EXXrxNvbndiSRJ0s9eclHybtXTkbvrn968m37Z9n8frp9pwWXbLiRJkv7r1ZV3b48Lf5Svrvw48PFu3Ys/V8f7wctIvyVJkvQrN1e8D7hy+U+uiVLiTJ/feKz9B5IkSb92c+GyvVu8/CeXBmB1kL7M9HDZ7dvjgyD9kSRJ0u+8ujv/ofLtvPcQ/+j+w/kzfTpqptfnP+j+9Not2zMkSZL+4O2bcy4BPn048j/+j2fN9O7Qi5GPD+eU8t2DT9meJ0mS9Gc3D3+8Bnh8f2iPnnz880yfbytmuvvz47fbOz06iyRJ0rPu397d/uoq4NObD2Vrdn9z9/43M9V9S+OfmX7Vyk/v73xz5GySJElnurm5u7t7f3vycHf3+ibhKe3Hmw93d2/+nSnhQuS7md7c3X2ImOlvIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJEmSIIgkSRIEkSRJgiCSJEkQRJIkCYJIkiRBEEmSJAgiSZIEQSRJkiCIJEkSBJEkSYIgkiRJEESSJAmCSJIkQRBJkiQIIkmSBEEkSZIgiCRJEgSRJEmCIJIkSRBEkiQJgkiSJEEQSZIkCCJJkgRBJOnz59u7BqoPGjNUn6Ij3Fb3ICBJLVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6IeRvUAPVQvEzNUn6Ie/gcLRxxOKlYQdAAAAABJRU5ErkJggg=="/>
+</svg>
diff --git a/doc/source/_static/index-images/contributor.svg b/doc/source/_static/index-images/contributor.svg
new file mode 100644 (file)
index 0000000..3a689e0
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#013243"><path d="M0 0h24v24H0z" fill="none"/><path d="M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm-9-2V7H4v3H1v2h3v3h2v-3h3v-2H6zm9 4c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/></svg>
\ No newline at end of file
diff --git a/doc/source/_static/index-images/getting_started.svg b/doc/source/_static/index-images/getting_started.svg
new file mode 100644 (file)
index 0000000..04db7e6
--- /dev/null
@@ -0,0 +1,31 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100" viewBox="0 0 1194 1063">
+  <metadata><?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c138 79.159824, 2016/09/14-01:09:01        ">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""/>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?></metadata>
+<image width="1194" height="1063" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKoAAAQnCAMAAADsEHQnAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABelBMVEUAAAAAAgIABggADxQBHCUBJTIBLDoBMUIBMkMAAAEAAgMAAwQACg0AFx8BJjMBLz8AAQEABQYADhMBGiMBJDABKzoBMUEABwkAEhgBHigBJzQBLj0ADBABKTcBMEAAAQIABQcBGyUBLDsACAsAFR0BLj4ACw4AGCABIy8BKjgBMEEAEBUBICsBLTwBMkIAExkBHyoBJzUABAYADRIBJTEABgkAFBsBISwBHCYBKzkADxUAERcACQwBKDYADhIAExoACw8ABAUBGyQACAoAFh0BHScAEhkBIS0AGSEAFBoBLT0BIi0BL0ABGSIBHykAAwMAERYBIy4AFRwADxMBGiIBIi4ABwoACg4BJDEBIzAADBEAFh4ADREAEBYAFx4BKjkBICoBHikBKDUAGCEBKTYACQ0BHSYBJjIAAwUAGiIAEBQAGiMAHykBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMBMkMAAAASK7oTAAAAfHRSTlMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEBQgJ+/z++PEHDfr2AwdXqxVQAAAAFiS0dEAIgFHUgAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflCgkWEyD/z8kiAAA7K0lEQVR42u3d6X8cxdXo8ZFsRyONl/Fu8CIhBxsbL2DAhtgYCzAhEIfEBHCCQ3J5kueuGo1Go9Ey/uOvFkuakWbp6a6qU+fU7/vufu7zIrR6fu6uPl1dKmGgsfFDh4/8ZqIMxGy+tlCvLzYaS6/2aTYajeV6vVaT/l9YlHQJ4jY5VTl67PgJ6T8S0FertrLcWH2VRWOtvq63WNIxiFr15KnTZ86ek/4bAT3NL9QbzUyR6rS6Vq+1pP+n5yBdg4iNnb/wxpsXpf9AQC+1+trolero1eL6vPR/woikexCtauXS6ctXpP88wEHteqNApbTmSroIkZqeOfXWkVkW0xGb1vpikaup/ZaW1SxeSTchTlNXf3vkbek/DbDP/IqTy6luzcUF6f+uTKSjEKFq5dr1d27clP7LAF3mV5aKd0lxraS7EJ/qzLu3bt+R/rsAnVrra746tVOrtvR/4xDSYYjN2Pm7773PIBWi0na6PtXP6krUMwzSaYjLZOXa6cvc+iEmrXVvN34HLEa8yC4dh5hU731w+kMe+yEm88shLqg6Lq3WY720ks5DRKY/unuGx36ISW0xaKe2NOtxxkq6D9GYunr/ASOfiEnNw2hCJosxjoZKFyIS1cqljz/h1g8REQtVpLGSbkQcqid/9+C29J8C2CMaqihjJR2JGEyPP2RAATERD9VWrOJas5LORASmHl3/lAEFxGM+hlC9im2BXboT4iYrlz4+yyoVotFalk5UR6zWpY/GHulSCKvee3z4CKtUiMdK2DmqYZaiGQqVboWs6Y8++5BFKsSjFm4yPatYlqykYyFq7OoxVqkQj5ju/fY0V6SPyxbpWkiqPDnMKhXisRDXvd+eRgyDC9K5EFOd++BzVqkQj5bnbV4KqUsfnXRTVR2/wAt/iEi0l1TblsS3s5JOhpDpL758nxf+EI2oL6m2Sa9YSTdDxtTR0zdYpUI0anFfUm0TXrGSjoaEycoHb8yyJTGiEeWDv4OaojuwS2dDQPX80+MsUyEa8/HNUvWzLHiYpLsRPlTjX/2eVSrEI/L19G5LcjeB0uUIbezR15dZpUI8lNz87ZC7CZROR2CVS09ZpUI8WpFsojACqREr6XYEVb136PcXpU9OYFd7VTo8OazJvBQoXY+gpRr/wxFeTkY8VC1T7ZFZsJLOR0BjV69fPid9cgK7VqSbk1dTYnRduh/hVC59/BuWqRAPgQ9nOSOw5Z50QEKpzh168I30uQnsUvAqzSDhX7ORTkioUo1/xjIVItLSM/fZ22LoIybdkDDGHrFMhZi0tZcqfKukIxJE5dJTlqkQkbbOR3/dGmGHFqQrEkD13rvfMk2FiJgo1atXS0FbJd2RAKX66P7xP0qfm8AeI6UK3CrpkPgv1dFnbE2FmJgpVdhWSZfEt8nxP81Kn5pAB0OlCtoq6ZR4Vp25z9ZUiImpUoVslXRL/Bq7euyy9KkJdDBWqoCtko6JV99denpW+tQEOpgrVbhWSdfEo+rJP/+Fuz/ExGCpXr1aC3PspHvisVR85R2RaWncnmq4MHPr0kHx1ampe0evf8OEOmKi/r0/0VZJN8W9ycmxyvi1Pz/7kNeTERWzpQqzJ4x0WByrTlXGH516/vHxi1xRITKa96eKoFXSbXFocroyd/X7C3/94SybKCA+lksVYl9Q6b64Uh2b+/GnC8/5GCkitS5dE8+t8r7funRi3HRq6uSjS79979YNnvghUgvSLfHN+3iVdGVcdGrm6OPr377D9/0QL5MDVd18PwaUDo2DTp36+p0XbJuOmBkdqOrm+Vum0q0p3Klnf/uQ5SlETt83lPOoeT2G0rnJbXLs3vjjr8/QKcRvWToiYfhdWpcuTs5OTVdm/v7zszN0CgoYf/i3Z8nnUZSOTi7T967dv/7DbekzEMgigSX1HcseD6N0dUZXrYy//O0tvkADJQy/T3PQgr/jKB2eEU2Ozfz01VO+6Qc9TE+p79f0N10l3Z6RVCtX//HXI3x+BoqYn/3s1vB2IKXrM0Knpsb//tkDBqigynw6C1XbVnwdSekAZTY2/v3Hn17mM1nQJY2Jqg7eXlyWLlA21cr5U9dfsAEVtKlLlyM8XxML0hHKYvreT5/9ie85QJ+2dDckeHrBRjpDQ1WnKkd/PnJF+pwDckhpTmGPn6F16RINMzZ+6i7fR4ZOK9LRkOHnKaB0igaqTn106jpXVFAquad/O7w8BZSu0aBQTc+c4pOj0Cu5p387vAyCSveor8mpH1/+8jfGPaFWYsOfnXxssyddpD4259LfusF7ftArie30+vGwdZV0k3obG//zg4vSpxpQRIIjVXs8DFdJR6mHyanxU18f541kqDYvXQtZ7j8MKN2lg6r3Xn7MYjq0W5OOhSz3K+vSYdpv+uST59/yBg20q0m3QprzmXXpNHWbnHr0y/u8kgz9kh1U2OH8sko6Tp2qlasPGaSCBclsp96f64EF6Tx1mB5/+Htu/WBCyoMKOxy/Cijdp11jMy+v89gPNnBR9cr5ZZV0oV6brDw5/U/p8wtwhIuqTW4vq6QbtaVaeXT3X4x8wgouqra4vaySrtSmsY/unrkpfXYBznBRtc3pZZV0pjZMPTr2qfS5BbiT/EzVDqeXVdKdmpz68R9PfyN9bgEOJT9TtcPpbJVwqaonD91iQAGmJLmhem8uR9ZlSzX20d0XDCjAlqQ+pzxY0+FhFQ3V+ONnrFLBmJZ0H2LicIMFuVBNVp68xfcdYE7S+1Tt53DfKrFSVe+xSgWLmFTo5G47UKlSTY9fOMMqFexhUqGLu3kFoVDNfPA1q1SwiEX1bs7mFSRCNVn56TR7vcAkFtX3cfZNQIlSzX3wP3jhDzbx+t8+q66ObPhSVWf+8Rfe+INRTKrv13Z0ZIOXavr8/eNsSQyjEv9OTS/Ljg5t6FJVvj99Q/p0AnxZkQ5DfFxNrIcN1dTVu99In0yAP0vSYYjQgptDGzJU1bnffXtF+lwC/OH5Xw+ORqsClmp6/O4RVqlgGc//enB0BxiuVGNXj12WPpMArxL/pHIfbu4AQ4VqsvLk8G3pEwnwqyldhSi5uQMMVCpeTkYCeP+vp1UnBzdQqca/+pBlKli3LB2FSDmZAg1SqrGrv7BMBfsYVejNyb7FAULFHnpIA6MKfTjZYM9/qar3vr/1R+mTCPBvQToJ0XKxE4z/Uo3fZZkKSWCpqh8X4wq+S8U0FZLBrgr9uBhX8Buqycqlj5mmQiKkgxCvVQdH12+qTr77e176QyKYqupvvvjh9Vqqyv3j0qcPEAobwPTnYLHKZ6mmLrGDOtLBByD6c7C/nr9QVece35I+eYBwGADtr1H88Por1fhXL6TPHSAg6RxErfjh9VWqqUfX2ZgYKWlL1yBqxb+y7KlUlZdv8P0sJIVZ9UGKfw7QT6nGXv6Nr7wjLXXpGkSt+Lq6p7u/r6XPGyAwdgAdpPi6uodQTc5x94f08FrNQIWPr4dUVS684P1kJEe6BZErPK/u4e7vCY/+kB42qxqs8CNA16Gqzp36l/RJA4THG4CDFd4J1HWq5u4fvyN90gDhkarBCj8CdBuqycoHbE2MJDGrMFjhR4BuSzXz8C/SZwwgglQNVnh/dZelqp68y46fSBRjVUMUPcAuU3XvOVspIFWMVQ1R9FMQDu/+pg5xTYVkkaohik4ruLv7mzn0g/TZAoiRLkH0oknV3F2e/SFh0iWIXtG9FVyVauwl26gjZdIliF7RGVBX11Qf3GLyEwmbly5B9OJIVeUh7/0haQyrD7NW8Ai7ufu7dEb6TAFEkaphio6rOwjV5NQXT9n1BWkjVcNEkKrKoWfspIfEkaph5FM1dulv0qcJII1UDVP0JcDCpape5e4P4G3loQoe4cILVTPHuPsDSNVQBY9w4YUqxhQAUpVBwSNcsFRTL19InyNABEjVUAWPcLG7v7lTbPsClElVBgWPcKFU3fvDWekzBIgCqRqq4BEuUqrvDvGKMrCFVA1V8AgXKNXYtQfS5wcQCVI1VMEjnL9U1S8OX5E+P4BIkKqhCh7h3KWanPn5tvTpAcSCVA1V8AjnTtXcBXZSB3aQqqEKHuG8pfru8YfSJwcQjxXpEERP6B3AsZ9u8eYfsIvXlYeR2Vmh+uPnJ6TPDSAipGoYkVRVZ77k8zRAB1I1jEiqWFIHupGqYST2VmdJHdiHVA0j8MUaltSB/VrSJYhe+FRVr37+R+nzAoiNdAmiF/zrypPjvzClDuwnXYLo1Qoe4JFTVfmKJXXggKZ0CmIXOlXTh45InxNAhBrSKYhdq+ABHjVVMw9YUgcOIlVDFD3AI5bqu6/Y+AXoYVE6BZFbLXqAR7z9e/KN9BkBRImtFQYrOqw+WqqqH30tfUIAcWJrhcGWix7gUUo1efIPfPQP6Ilx9cGKToCOlKrKu3z2AeitLd2CyBWdVRglVVMvf+DpH9CHdAsi1y56fEdYqDr6xk3pswGIFjOgAxU+vtlTNffXi9InAxAvBqsGKbpd8Qipqh7lS8pAfwxWDbJY+PhmLtXMz9KnAhAzBqsGKfwAMHOq5h7+Kn0qADFjWmGQwg8As6aqcuqM9JkARG1eugZRK/qyctZUVa+9d076TADixiPA/laLH96Mt398SwsYgkeA/RVfVc+Wqumf+JYWMATr6v0V3a24nC1V1fH/kj4LgOgtSPcgYoVn1bOl6uT9T6TPAiB6rKv35+DwZrimOv85Y+rAcKyr91N4s6pyhlRNPTrNkjqQwZp0EaJVfAB0WKomK5eezjKmAGTB7nr9OFiqGpyq6syf32EvdSAbtqzqo+ni6A4I1diPX75/hR2qgKxYrOptzcXB7V+q7376fJZQAdmxWNWbg6mqvqmqzp3618Vzd6T/9IAmLFb1Nu/i4PZbpLp7hNV0YDQsVvVUfFu9Tb1Xqa4eu8y9HzCqVekqRKnwd7W29FqkuvbW7E1KBYxsWboKUXIxqtAjVdW57x+cYJFKXrv22nq9w3KjD7v/njcbQy3W91up7XGyUpINrwH24GRU4WCqqjNfsUoV3PzGD2rzB7ZmOzrCtpu3tnmgF3wFjHGFgxxsALOpO1TTP/7yb0apQpnfuGBaJk1ylhrLK8U30u3CtyAOWnBzaLvf97t2+DahCmB+ob62JH0GYduay1pxB3iAo/u/zlRNVh7f+iOrVL61V9a4S4hLw+HNIH/b/Rzd/5U7V6kufMgqlWftZW73YuRknHoLd4D7uXn+t5eq6fNf/soqlWfr3PTFqlH8iyrbuAPcZ9XVr2dnleo/p3nhz7N1Lqgi1nS1YsVfuZuLraq2bJeqculPzFL51eZ7JpFzdBPIFGg3Z+uAW+vp995956bUTzgRvMgav0UnN4HssN7FxVbF2zbX08fvv8/Nn1ctdgfRYMlJq7h87rTu7EdUKo19cIM3/vxqs5yuQ9PF06p16f+KmLgaqtpQevL0G1ap/Koxa6NF08VFAAvre9xsqrCl9C2bp3vGv7KaOGgVX1ne43C4tsS9n2c8EdKl+HB1S/o/IR7uFtU3UiX3G04D08vaFG8Vf/Mdjt5U3kKqvGqxoK5P4QeBzCu8turyt0SqfKJUKhVuFZdV29y9WlkmVV5RKqVWCw4tcFm1penqxcotpMoj/nHVquiAFWOgm5y9/reFVPlDqfQq+PYyX9na5PSiilT5wzyVasUGrPhnyt2eeq+RKl9q0mcKiinUKlarnI5/biJVnrR4m0a7Qq3issrxRRWp8oWFVf2K/Njmk/+nyvXXy0iVH+xPZUGRVqX+JqDbx39lUuUJSxU2FGhVK+0NFtzOVG0iVV5w+2dEgVal/UEIp4PqW0iVD8wpmFHgJZuU/71acv+jIlUe8PTPkPytSnkVwNXH/zqQKg9SX1G1JX+r0j0PHG7+uYtUuZfyv6YW5W9Vqivrq87X1Mukygem/4xZyjsilOobC64+/9qFVDnHRZU5uTdaSHO3ah+3f6TKgzRPT9vytirJ4So3n1M8gFS5xuM/i/K2KsVbQA9P/zaRKtd4pcakvK1K7ymg++HPbaTKtRQv+VOQt1WpbVq95uuHRaocY/9Hq3JuDNpOa0HAy5zCFlLlGJMKduXbwCqtt6w8LVSVSZVzaf0bmph8rUrpXy9fC1VlUuVa2q/Tm5erVQl9Y831zp+dSJVbKf0LmqJcrUpmucrTRNU2UuUWz/+My9WqRK613W+n14lUOcXzP/NytSqN6Sp/S+qbSJVTzH/al6tVa9L/q2M9MNmRKqdSOCOTl+cpVwJL686/+7APqXIqlfXTtOV5zmX+Y1s+H/5tIVUusf9LGvL8LI0/BvSwmfo+pMqlRJ70IE+rTE+tex1T2EaqXErjQQ9o1T5+xxS2kSqXWFVPRp5WmZ0Pzr1L6ihIlUv2H/NgB63aFaRUpMop6XMGAdGqHQtBflykyqGW9DmDkHK0yuR4lefRzx2kyqEUN9JOGa3aFKhUpMolUpUYWhWuVKTKJcaqUkOrgpWKVLnEWFVycow+mmpVuFKRKpdIVXrSblXAUpEql0hVglJuVchSkSqXSFWK0m1V0FKRKpdIVZJSbVXYUpEql0hVmvK0Sv/rooFLRapcIlWJyrMFivJ3bMK899eJVDlEqlKVXKvCl4pUuUSqkpWnVYq/GbIavlSkyiVerElXnlap3WsvwJ6fB5Eqh0hVwvL8fGs691tfkygVqXKJVKUsT6vaGr/G7f3bNL2RKpekTyJIytMqhQNWeT6D6AKpckn6LIKoXEs4yh4ENsNs+dkDqXKpIX0iQVSuVqlaXF8SePT3GqlySdm/kHAtV6sULVjJLKhvI1UuMViVulytamm5Gq9L/rhIlUs8AkxevpEjFf/GyS1TbSFVLvHJGuR75UTBTeDSvOyPi1Q5Ff8JB9/ytaoV+zqn6M3fJlLlVOznGwLI+SrvQsyj66s16Z8WqXJL1YNneJKzVRHvYbUo+ORvB6lyal76nEIM8m6REumFlfB6+mukyi1970nAg7ytai1L/y/vYTmCS6oyqXItxlMN4eXeeq4d24zVkvwq1TZS5VZb+sxCHPJvk7ke02PkZugd1PsjVY7FdJ5BUP5WteqxLFk163Hc+20hVY6pmDtGAAW2H49jyCqqUJEq53gGiNeKfCphXjxWkYWKVLkX27IoxBT6rItsrFZjCxWpco8pUOwo9gmqebE1q6V4FtP3kCrnWFjHjoKfy2utSJxMi7GMJ3QjVc5xWYVdhT/tuRD4bZvVuvAGCn2RKudasTxqRgSKf4Z4vh7u0moxildoeiNV7jGvgD0uPpleWwzxz19jPbql9E6kyr0Wq1XY46JV5fK65xvBpZVYb/x2kCoPWK1CBzetKrfWvV1bra3H3qkyqfKD/RXQwVGrNiwsO79iX11ciPq+bxep8oHPQaCTu1aVy/Mra84urppr0d/27SFVXrAXDDq5bNWGtoNcrS6uyH1+NA9S5QUr6+jiuFUb2uvLed/hWl2r13Tc9HUiVX5wC4gu7lu1qb1QXxtlYXSpUV+PcxZ9OFLlCcNV6OKnVVvma+v15Uaj/z3haqOxvNEoPetSvZAqX9hhAV08tmrXfG3DQv21lc3/l8Jbvd5IlS+8X4NuIVplGKnypk2r0IVWFUGq/GFoHd1oVQGkyiNahW60Kj9S5ROtQjdalRup8opWoRutyotU+UWr0I1W5USqPKNV6Ear8iFVvtWYWUAXWpULqfKO+Sp0o1V5kCr/5tlpD11oVQ6kKoAW7wOiC60aHakKgq320IVWjYxUhbHAghU60apRkapAWoG/kovI0aoRkapgamxijA60ajSkKqB1YoU9tGokpCqoBW4DsYtWjYJUBdby/UVv6EGrRkCqBCzk/iwSbKFV2ZEqIe31eoOlq+TRqsxIlajXn0WiWcmiVVmRqkhsfhZppV7fDFeDdiWkqfUToqGRqqhtfdfttfV6P9t504kov1qXPst0IFWQxA45r2hVNqQKgijVFlqVAamCHEr1Gq0ajlRBDKXaRauGIlWQQqk60KphSBWEUKoutGoIUgUZlGofWjUYqYIISnUArRqIVEECpeqBVg1CqiCAUvVEqwYgVQiPUvVBq/ojVQiOUvVFq/oiVQiNUg1Aq/ohVQiMUg1Eq/ogVQiLUg1Bq3ojVQiKUg1Fq3oiVQiJUmVAq3ohVQiIUmVCq3ogVQiHUmVEqw4iVQiGUmVGqw4gVQiFUo2AVu1HqhAIpRoJrdqHVCEMSjUiWtWNVCEISjUyWtWFVCEESpUDrepEqhAApcqFVnUgVfCPUuVEq/aQKnhHqXKjVbtIFXyjVAXQqh2kCp5RqkJo1WukCn5RqoJo1TZSBa8oVWG0agupgk+UygFatYlUwSNK5QStKpMq+ESpHKFVpAoeUSpnaBWpgjeUyiFaRargCaVyKvlWkSr4QakcS71VpApeUCrnEm8VqYIPlMqDtFtFquABpfIi6VaRKrhHqTxJuVWkCs5RKm8SbhWpgmuUyqN0W0Wq4Bil8irZVpEquEWpPEu1VaQKTlEq7xJtFamCS5QqgDRbRargEKUKIslWkSq4Q6kCSbFVpArOUKpgEmwVqYIrlCqg9FpFquAIpQoquVaRKrhBqQJLrVWkCk5QquASaxWpgguUSkBarSJVcIBSiUiqVaQKxVEqISm1ilShMEolJqFWkSoURakEpdMqUoWCKJWoZFpFqlAMpRKWSqtIFQqhVOISaRWpQhGUKgJptIpUoQBKFYUkWkWqkB+likQKrSJVyI1SRSOBVpEq5EWpImK/VaQKOVGqqJhvFalCPpQqMtZbRaqQC6WKjvFWkSrkQakiZLtVpAo5UKoomW4VqcLoKFWkLLeKVGFklCpaK9Lnhj+kCqOiVBFblD47vCFVGBGliprZVpEqjIZSRc5qq0gVRkKpome0VaQKo6BUCthsFanCCCiVCiZbRaqQHaVSwmKrSBUyo1RqLDXk1Dut1F6bL3r2kSpkRalQVHOzZYsbCVuo1VqjnX6kChlRKji22lheqWU9/0gVsqFU8GNtIdMJSKqQCaWCN6vrGW4GSRWyoFTwaXX4nhCkChlQKni2OmzRilRhOEoF/9YG3wWSKgxFqRBCc+BuW6QKw1AqBDLowopUYQhKhWCa/VesSBUGo1QIqd7vRCRVGIhSIaxGn5tAUoVBKBVCW2r3PBVJFQagVAiv2bNVpAr9USqI6DW7TqrQF6WCkB6tIlXoh1JBzMFWkSr0Qakg6ECrSBV6ay1Jn6xI2v5WkSr0RKkga/9zQFKFXigVpDW7vxxBqtADpYK8pa65dVKFgygVYtD1OUNShQMoFeLQubROqrAfpUIkOperSBX2oVSIRmPvvCRV6EapEJG9PYxJFbpQKsSkufsUkFShE6VCXHafApIqdKBUiM3ObuukCnsoFaKzs7JOqrCLUiFCry+rSBV2UCrE6PVlFanCa5QKcdq+rCJV2EapEKm1rROUVGELpUK0tl6vIVXYRKkQr+XNU5RUoUypELXVzXOUVIFSIXILZVKFMqVC7DbfriFVoFSIXLNMqkCpEL8FUgVKhfgtk6rkUSoosEqqUkepoMI8qUobpYIO66QqaZQKSiySqpRRKmixRKoSRqmgB6lKF6WCIm1SlSpKBU0WSFWiKBVUqZOqNFEq6LJIqpJEqYJocpidaZCqFFGqIJptDrQzpCpF/ICCaLY51A6RqvTw8wlis1QcbHdIVXL48QSxXSoOtzOkKjX8dILYKRUH3BVSlRh+OEHslYpD7gipSgs/myA6S8VBd4NUJYUfTRDdpeKwO0GqUsJPJoj9peLAu0CqEsIPJoiDpdqwKP2/Sj1SlQ5KFUTPUtGqwkhVMihVEH1KRauKIlWpoFRB9C0VrSqmSaoSQamCGFAqWlUIrysnglIFMbBUtKoIUpUGShXEkFLRqgLYBTQJlCqIoaWiVfmRqhRQqiAylIpW5VYjVfZRqiAylYpW5TVPqsyjVEFkLBWtyqfJJ0vNo1RBZC4VrcqlQaqso1RBjFAqWpVHnVQZR6mCGKlUtCqHGqmyjVIFMWKpaNXoyqTKNEoVxMilolWjapAq0yhVEDlKRatGtEKqLKNUQeQqFa0aTZtUGUapgshZKlo1itUyqbKLUgWRu1S0agTLZVJlFqUKokCpaFV282VSZRWlCqJQqWhVVkubB4tUmUSpgihYqnJ5Wfq/QIf1zWNFqiyiVEEULlW5vC7936BBs7V5qEiVQZQqCAelolVZLG8dKVJlD6UKwkmpaFUG81sHilSZQ6mCcFQqWjXU4vZxIlXWUKognJWKVg2zfVFFqqyhVEE4LBWtGuz1RRWpMoZSBeG0VLRqkO3Hf2VSZQylCsJxqWjVAPWdY0SqLKFUQTgvFa3qa3X3EJEqQyhVEB5KRav6qe0eIVJlB6UKwkupaFVvy3sHiFSZQamC8FSqcrnWlP5Pi89qa+/4kCorKFUQ3kpVLrdp1X6dB5tUGUGpgvBYKlp1wErn0SFVNlCqILyWilbts9h1cEiVCZQqCM+lolVdllpdx4ZUWUCpgvBeKv6SHZrdpSJVFnB+BxGgVPwtdx042qRKP87uIIKUir/mawePNqlSj3M7iEClKvNxiE09jjap0o5SBRGuVLSq99EmVcpRqiBClqpcXpH+zxW21OtokyrdKFUQYUuV+guBjVavY0KqVKNUQYQuVdoDVsu9Dwmp0oxSBRG+VOXyfKp/2uZCnyNCqhSjVEFIlGrjj5vm4npjvt8BIVV6UaogZEq1YT29m8DmSv/DQarUolRBLM0X/1Pl1E7tL7zYGnA0SJVWlCqIpVbxP1V+den//JAatYHHglQpRamCkC3VxoVVQ/oIhLK6MORQkCqdKFUQ0qXasL4qfRBCWF0feiBIlUqUKogISrVh3fwfuzHsimoTqdKIUgURR6k2tBctPwxcrGU6CKRKIUoVRDSl2rRgtFar9axPWEmVPpQqiKhKtam9smZs3aqZ8YJqC6lSh1IFEV2ptv/4tZXlho2ngkvLWVao9pAqbShVEHGWale7Vlup1+uNTdKHKuMBbWxb3PifXV+p1UY+vqRKGUoVROSl6qW2Z73e33Ijp+X6EOu1/ZweRFKlC6UKQmGpzCNVqlCqIChVhEiVJpQqCEoVI1KlCKUKglJFiVTpQamCoFRxIlVqUKogKFWkSJUWlCoIShUrUqUEpQqCUkWLVOlAqYKgVPEiVSpQqiAoVcRIlQaUKghKFTNSpQClCoJSRY1UxY9SBUGp4kaqokepgqBUkSNVsaNUQVCq2JGqyFGqIChV9EhV3ChVEJQqfqQqapQqCEqlAKmKGaUKglJpQKoiRqmCoFQqkKp4UaogKJUOpCpalCoISqUEqYoVpQqCUmlBqiJFqYKgVGqQqjhRqiAolR6kKkqUKghKpQipihGlCoJSaUKqIkSpgqBUqpCq+FCqICiVLqQqOpQqCEqlDKmKDaUKglJpQ6oiQ6mCoFTqkKq4UKogKJU+pCoqlCoISqUQqYoJpQqCUmlEqiJCqYKgVCqRqnhQqiAolU6kKhqUKghKpRSpigWlCoJSaUWqIkGpgqBUapGqOFCqICiVXqQqCpQqCEqlGKmKAaUKglJpRqoiQKmCoFSqkSp5lCoISqUbqRJHqYKgVMqRKmmUKghKpR2pEkapgqBU6pEqWZQqjHnpPzSKIlWiKFUgXFWpR6okUapgaJV2pEoQpQqIVilHquRQqqBolW6kSgylCoxWqUaqpFCq4GiVZqRKCKUSQKsUI1UyKJUIWqUXqRJBqYTQKrVIlQRKJYZWaUWqBFAqQbRKKVIVHqUSRat0IlXBUSphtEolUhUapRJHqzQiVWG1a5RKHq1SKIZUtWu5rdRzW2vk1pT+qaEgWqVPzlTV1vj5QjFapU6uVK2vSp9pQDG0SpscqSJUMIBWKTNyqggVbKBVuoyYKkIFM2iVKiOlilDBElqlyQipIlQwhlYpkjlVhAr20Co9MqaKUMEkWqVGplTVGtJnFODHovQvEBllSFVrUfp0AryhVUoMT9UCr8zAMlqlw7BUtdakzyTAL1qlwpBUcUkF+2iVBoNTtSx9EgEB0CoFBqWK/SqRCFoVvwGpanPzh1TQquj1T9U6pUI6aFXs+qZqXfrcAUKiVZHrl6oV6TMHCItWxa1PqhhQR3JoVdR6p4pSIUG0KmY9U8U6FZJEqyLWK1WUComiVfHqkaoF6fMFkEKronUwVUx+YgjLZwititWBVLXY7xODNduWlwhoVaQOpIoNPzFYs217OZNWxWl/qurSJwoit1kqWoXg9qWqJn2aIHLbpaJVCK07VSxUYbCdUtEqBNadKrbSw0B7paJVCKsrVdz+YaDOUtEqBNWVKm7/MEh3qWgVQupMFU//MMj+UtEqBNSRqnnLQ8go7GCpaBXC6UgVO79ggF6lolUIZi9V89JnBmK21O59AtEqhLGXKt6oQX9LrX5nEK1CELupYlAB/fUvle1W1aV/n9i1m6o16bMC8RpUKtutWpf+gWLHTqpYqUJfg0tFqxDCTqp4/Id+hpWKViGA16lqSZ8QiNbwUtEq+Pc6VXyhFH1kKZXtF91pVRRep4q3/9BbtlLZXkGgVTHYThWTCugta6loFTzbTpXl0wwFZC+V7ZOoJv07xXaqWryojF5GKZXpVjXboxwI+LCVKsvPb5DfaKWiVfBpK1VMqqOHUUtFq+DRVqqkTwPEaPRS0Sr4s5mqBemzABHKUypaBW82U2X49EJe+Upl+mRazXlI4MRmqpj/xH55S2W6VfkPCoorsakCDiryo6RV8KHE+384oNhPklbBgxKjCtiv6A/ScKsa0j/YdJVYqsI+xS8dDLeK7dallFiqQjcXNzm0Cq6VmKpCFzfLMbQKjpX4/Ds6uVo4NtyqFekfbZpKfP8PHdw94jLcKravklBiVR17XD6Mp1VwqcS7yti15nRsyHCreB0wvBJ7FWOH6wVju63i1eXwSjwAxGvuH23RKjhT4gEgtvl4CG+3VbxiE1rJ8gfcMAI/40K0Co6UmFXAJl+DjXZbxeuAYZEqbPI3gm23VYytB1VirAp+f3V2W7Us/etNSkn6z40I+L0+sNsqRkEDIlXwfidjt1UL0r/fhJAq+F9zMdsqxqvCIVXJC7E6bLdVjCyEQqpSF+Y5ltlWMV4VCqlKXKgn7mZbtSb9E04FqUpbuNkgs61iZCEMUpW0kFOMZlvFyEIQpCplYeetzbaKx4AhkKqEhX4zxGqreAwYAqlKV/h32Ky2ijeXAyBVyZJ429Zqq+rSv+MElJrSf2XIkNkXwGqratI/ZPvYBCZRUjuYGG3VKstVvpGqNMnttWS0VUxX+VYyeuZgIMld4YyecfPSP2Xr+AxEimT3r7TZKvYE9ay0Lv0nRnDSvyqbreKyyi8+WZoe+RdBTLZK+h8A60ot6b8wApMvldFWcVnlVanMYFVaYiiVzVYxB+pVqcy0QlLiKJXJVq1KH1PbSmUeAaYkllKZbBU7LPhUKi9I/4ERTjylstgqxkB9KpXnpf/ACCamUhls1ar0ETWtVC7zfeVUxFUqg63iGaBHJYMnDHqLrVT2Tj2+YOrRRqqYV09DfKUy1yrGFTzaSBWLVUmIsVTWWsVuoB5tpKq8JP0Xhn9xlspYq1alj6Zlm6lalv4Lw7dmrKUy1irpg2nZZqra0n9geNaMeTjRUqt4BOjPZqoYVzAu6lKZahVbrPuzlSruAE2LvFSWWkWq/NlKFc8ALYu+VIZaxbSCP1up4hmgYQpKZadVpMqf7VQxBWqWilKZaRWp8mc7VS321zNKSamstIpU+bOdKhbWjVrVUiojrSJV/rxOFQvrJi1p+uavhVbxZo0/r1Nl4jzBPqpKZeIcJFX+7KSKyyp7lJXKQqtIlT87qeJrEOaoK5WBVpEqf3ZTxWWVMQpLpb9VpMqf3VSpP0vQZVFjqdSfhaTKn71UcVllidqvkutuFanyZy9VfBDQELWlUt4qUuVPR6pa7AVjheJS6W4VqfKnI1V8vNQK5Z/OVNwqUuVPZ6rKa9J/abgQ7+bE2ZAq9NCVKt5atoBSySFV/nSliltAAyiVIFLlT3equAXUrqn9A7+qS0WqPNqXKp4C6qZme6p+dJeKVHm0L1V8aEs1SiWMVPmzP1XsXazYEqUSRqr8OZAq/adLslS+oGzr1CNV/hxMFdvBKEWp5JEqf3qkqsWntjRS/TLNJgtLD6TKnx6p4jGgRpQqBqTKn16pKreZWtdmRfpEKspEqUiVRz1TRau00T6ibqRUpMqj3qmiVao0a9KnUVFGSqV9T4uo9UlVuc16lRrqBz/NlIpPlnrUL1U8B1RD/ZCCnVLpXzKMWN9UlVvMV6mwRqniof5OPGKlAf9/Bkby7NO/OmKoVK/mpQ+mYYNSZeokMkr9oz9TJ1lT+mBaNjBVLK5HTv+CuqlSMavg0+BUlVvstRcx/QvqtkrFA0CfSsP+D9aZsIqV/mUqY6V6pf8iN2JDU1We50lglNRvTVw2VyqWqnwanqpyeYELq/g0DDxsMlYq/a+MRy1LqsotvhEfmaaFWUNrpeL+z6tMqdq4C2TGKiZrBi6p7JVqSfqI2pYxVeVyjSWrWDRMzESbK5WBGbeoZU4VsYqEjVAZLBWL6n6NkKqNWDFlJc1IqAyWiqEqz0ZKFWtWwhatLNwaLFVT/zxu3EZMFbEStGhhMX2LwVKxUuXbyKkiVkLshMpkqValD6p5OVK1Eas6QrMTKpOlYqcq73KlCsjPZKnWpI+qfaQKYZksFWvq/pEqBGWyVK8MvDoePVKFkGyWitu/AEgVArJZKm7/QiBVCMdmqbj9C4JUIRijpTKwG6sGpAqhGC2VgR3uVSBVCMRoqQx8NUgHUoUwjJaKhapQSBWCsFoqFqpCIVUIwWqp+EhpMKQKAVgt1SpL6sGQKvhntVQsqQdEquCd1VKxnV5IpAq+mS0Vu6mHRKrgmdlS8THloEgV/DJbKqbUwyJV8MpsqXj4Fxipgk9mS8XDv9BIFTwyWyo++xAcqYI/dkvFmEJwpAre2C0VYwrhkSr4YrdUjCkIIFXwxG6p+OqDBFIFP+yWioEqEaQKXlAquEWq4IPdUjXnpY9tokgVPDBcKkY/hZAquEep4BypgnN2S8XopxxSBdcoFTwgVXCMUsEHUgW3DJeKD2lJIlVwynCpeJ1GFKmCS5QKnpAqOESp4AupgjuGS8XrNNJIFZyhVPCHVMEVSgWPSBUcoVTwiVTBDcOlalKqCJAqOGG5VLyiHANSBRcoFTwjVXCAUsE3UoXiKBW8I1UojFLBP1KFogyX6tWC9MHFDlKFgiyXig2q4kGqUAylQhCkCoVQKoRBqlAEpUIgpAoFUCqEQqqQH6VCMKQKuVEqhEOqkJflUrE9cXRIFXKiVAiJVCEfSoWgSBVyoVQIi1QhD0qFwEgVcqBUCI1UYXSUCsGRKoyMUiE8UoVRUSoIIFUYEaWCBFKF0bSb0j2hVEkiVRgJpYIMUoVRWC4Vn3uPGqnCCCgVpJAqZEepIIZUITNKBTmkCllRKggiVciIUkESqUI2lAqiSBUyoVSQRaqQBaWCMFKFDCgVpJEqDEepII5UYShKBXmkCsNQKkSAVGEISoUYkCoMRqkQBVKFgSgV4kCqMAilQiRIFQagVIgFqUJ/lArRIFXoi1IhHqQK/VAqRIRUoQ9KhZiQKvRGqRAVUoWeKBXiQqrQC6VCZEgVeqBUiA2pwkGUCtEhVTiAUiE+pAr7USpEiFRhH0qFGJEqdKNUiBKpQhdKhTiRKnSiVIgUqUIHSoVYkSrsoVSIFqnCLkqFeJEq7KBUiBipwmuUCjEjVdhGqRA1UoUtlApxI1XYRKkQOVKFMqVC/EgVjJdqXvrowglSBdul4prKCFIFSgUFSFXyWqvSPfGnyd2fGaQqda0l6Z74wzqVIaQqcaZLxd2fIaQqbZQKSpCqpFEqaEGqUkapoAapShilgh6kKl2UCoqQqmRRKmhCqlJFqaAKqUoUpYIupCpNlArKkKokUSpoQ6pSRKmgDqlKEKWCPqQqPZQKCpGq5FAqaESqUkOpoBKpSk1DuieUCnmQqsQsSveEUiEXUpUWSgWlSFVSKBW0IlUpoVRQi1QlhFJBL1KVDkoFxUhVMigV9Dr7MalKBaWCXr/+fJVUJYJSQa2b71wYnyZVaaBU0Orie3cfVaolUpUESgWtbpy+VpkslUhVEigVdJo4fv3lzHSpRKrSUJfuCaVCLice/GOmWiqRqkSsS/eEUiGPs//98Gplt1SkyjxKBY0m3vz50VSpg/T/IHhGqaDQiW+fP7k3XSJV6aBUUOjs4Zdz1VKJVKWDUkGdc8e/fjw+ViqRqoRQKqjz9oN/jE+XSqQqJZQK2kzc6nrsR6qSQKmgzcSRo2Ol3qT/p8EbSgVtJo4fmi6RqsRQKqhz+UKlRKoS025KB4VSYUSzX56cJFWJoVRQ5+3T56slUpUWSgV9/vVoukSq0kKpoM+VD8ZKpCotlAr6TLxXKZGqtFAqKPTpTIlUpYVSQaGzz6ukKi2UCgpd/Hq8RKqSMk+poM+JN66WSFVSWkvSQaFUGNm5vzwZI1VJoVRQ6M6bh6aGlYpUmUKpoNHZz+aGlopUWUKpoNE3/zUzSapSQqmg0YmnX1SHl4pU2UGpoNG5H65NZygVqTKDUkGjO+9/P3xJnVRZ0pAOCqVCDpmW1EmVIYvSQaFUyOFipiV1UmUHpYJGV964mmVJnVSZQamg0cQ7TzItqZMqKygVVPo0w5Q6qTKEUkGl2fsZl9RJlQ2UCiq9fXo845I6qTLB7gf/KJVplw9nXlInVRZQKqh09kJlhFCRKvUoFVR6+/rJkUpFqpSjVFDpyp8yvaNMqqygVFBp4sPsA1WkyoAF6aBQKuRy4x/ZB6pIlX52P05DqUy7cvyXe6OWilQpRqmg0p0Pn4wyUEWqtKNU0OmT0e/+SJVilAo6vX199Ls/UqWX3U+TUirbLn/+Y5VUpcPu9sSUyrbZC1O5SkWqdKJU0OnEX0ccUidVqlEq6PTJ06ujP/sjVWpRKuh08Xll1CF1UqXZmnRRKBXyuPw0xzwVqdLL7FZ6lMq2i8//U81dKlKlD6WCSp+8dTT/NRWp0odSQaUT92cKXFORKnXMbvtCqWybfW+ETz6QKv0oFVS6fP3H3M/+SJVClAoqvf3wXpF1KlKlTVu6KJQKOdw5+3S0Tz6QKuXMbqZAqUy78uuX56ukKiGUCir95XdzRe/+SJUmZl+noVSm3Tn7QZ6d9EiVWpQKGl359fm4i1KRKjWsjn5SKtPe/su7Lu7+SJUey9JJoVQY3dmn15zc/ZEqNawOVFEq0y7/fL7g4CepUsbqTuqUyjQHg5+kShmjC1WUyrTbfyo++EmqdJmXbgqlwqgmbnyde3NiUqWVzTV1SmXZH49/VmzTF1KlUMvkShWlsuzi7793efdHqnQw+fiPUhl2Z/ZjZ0MKpEoRi3PqlMqwc5ePFd2dilRpZHHrF0pl2IkjF9wuU5EqJQwuqlMqw7558Lji8tEfqVJjVToslAqZ3Zk9/JPrZSpSpYO9+z9KZZeXZSpSpYO5+z9KZZefZSpSpYO153+L0gcU3lx8cMrHMhWpUsHaSzWUyq5Zd1u+kCp9jM1/UiqzJm4U/tYfqdLM1qYKlMqsK99emPEXKlIVP1NLVZTKqrfffOOkr1UqUqWDdF0oFYabfePSd15DRaqiV5POC6XCMBP/fPZozHOpSFXsVqT7QqkwxJX3n497XE8nVTrYGQClVEadOPPQ8zIVqdKgIV0YSoVBbh8//NLb2CepUsTKu8qUyqSJs5/7eTmZVKkjnRhKhf5ufvqzz6lPUqVIS7oxlAp9nXjh7eVkUqWNjVkFSmXRN8f/++VciFUqUqWBiVRRKoMmzh5+4nvqk1QpYiFVlMqgm/8+dtX71CepUsTABCilsufEp7cehlulIlUa1KVDQ6lwwO1b3wdcpCJVKqhPFaUyZ+LsW2FXqUiVBtpTRamsuXL5h/tfhF2lIlUaKE8VpbLm7TMBR6lIlSK6U0WpbLkze/ytkKNUpEoR1amiVLbcvPzs6JRQqEhV7DTPVVEqU058euvCR6Fe+CNV6ihOFaWy5M7tW4dOVuVCRapipzdVK9KHDu6c++eZ6z8F2ZWKVGnVli5OXuvSRw7unDhy/0eJ+QRSpYl0cihV6iZmjx8+JXvvR6o0kG4OpUrclcvPrn0ne+tHqlRQubc6pbLi4vvvXfhI/N6PVGmgMVWUyoZzZ4+c/mCuKt0oUqWDwhlQSmXDieM/P5oK9I0HUqXfunR4KFWSJmaPf3xoRnDik1Rpo26wilIZcOLyD+JzVKRKG+n0UKrkTMze+vP4TByL6aRKjyXp+FCqtGxcUf18NLIrKlKlwbJ0fShVQs6dPf7x78Zju6AiVSpoWlenVKrduXjxyC9HK9X4rqhIlQbz0v2hVIm4cuPp6VNRPfQjVbqsSheIUiXg3Oybf7pwVW7jPFJlgJLFqmZb+kAhr4mLn37785No5tJJlVIL0hGiVLaduPzi9KnxsYgvqEiVEtIVolSGXfnkf7534ep3k7GHilRpsCbdIUpl1MTtN799fvRRpSqdIVJlQ/zjCpRKo4kTR449+Wku2kd+pEqdlnSJKJVF515cf3Iy+hUqUqVK5HeAlEqjE//6j6JOkSod4n4GSKkUunP5q4+k20OqDIp5CpRSaXTjYTx75pEqQyLeCpRSaTT7/H9Jl2dkE9IHDRnE+x7g0rz0scHIJmb/94x0eEb3jfRhQxaxLqwvtaSPDEZ259f/M1WVDs/oXkgfN2QR6bbFlEqjs88r0tnJ4/M/Sh84ZBHlN7YolUITs6fHpauTy7vHb0ofO2QQ42UVpVJo4tc/a7z72zB+7J/SBw9ZxDevQKkUOnfj+knp5uQ0ffQBDwE1iO6yilIpNPHmhauqRtQ7TR27fUf6ACKDyFarGpRKn3M3nv0oHZz8Ji89OCF9BJFBXJdVi9KHA6Ob+PXCSbXXVBvmHr4pfQiRRUyzVZRKoYnZZ+repulSHX/KQ0ANIhpZp1QKTXz65XhVujYFW/XVZVbWNYjmTUBKpdGNd1VOfnb54vNZ6cOIDFqRDCxQKo1O/N/vpENT3Nild3gIqEEcK+uUSqMr/++jqnRoHKh8/bb0kUQWi9KZesWHSXW68uAn6co4MfnynSvSxxIZRHALSKlUevOx7od/u+599uY56YOJDMRvASmVSjc/vqd5oKpD9fx1XgVUQfir8JRKpYnjh6rSjXFl+hGvAuqwJBiqJqXS6cYvOvd96Wnql1meAmow35QrFduo63Tn9//R8l3SLH66xVNAFcS+tEWptLp9zMBI1Z7K7/7GU0AVhIbWKZVWJx5cMrKmvm3y5GefSh9TZCIyXbVKqbR68+GcdF3cqp5/g4EFFVoCS+tspKfWzTe0v6V8wPRnN3gKqEL4VlEqtSYuf2VpTX3b1bd4CqhD6MeAlEqv2c+vSofFvbFL7/EUUId20FbxgrJiZ/5u5JWaLpVDvAuoRMhWUSrF3n5mbE192+S9u79KH1pkE65Vy9L/qcjvypnHVemseFEdf4PNi5UI1SpeptHs3/e1fvZvaKvYvFiNdpAdYSiVZhP/+qIq3RRffjz9G54CKhFgZqFZk/6PRBGf3B+TLoo3Y9feuCh9fJFRy/f3tniZRrdvnj6SDopHU4+/5ROmavjdvmppXvq/D0WcePDY1HvK+809/JCldTXWPS6uM/ipnLmX//aZnHl+WfoYIzN/i+uMUyl386m5l//2qf74Hu8t6+Frwaou/R+GYiY+fWjv5b99pi/8m4kFRbzcBDKkoN3ZZ+elS+Lf1LFvpI8zRjDfcB0qHv2p983Ta3YHFfY8ecBTQFUcX1ixoK7fi8cV6YyEUHn3Be8tq9JyuTUoC+r6nTht++nfrnv332dpXZeaq7tAPqFlwM0PT1WlIxJG9aPrbAmqzbqTuQXmPg2Y+PT5jHRDgrXq0eHb0scboyoeqyYzChac/drua8oHjF26xdK6PgVjtcgllQW3//toCk//dlQOnWFpXaGF3GtWzTqhsuHFS4ubFPc1ee/umyytazS/nGd0YXFB+n83HEnm6d9uq8aPsbSu1MJob9s0FxeYpDLD7CbF/VWvsrSuVmt9Ldu1VXNthdF0Sybe/4PVTYr7Y2ldt/bK2sBV9mZjeZ1MGXPnxrHzVelyhPcdS+vatWrr9cVG91L7aqOxXF+vcc9n0eznj0xuqPD/ARoJN/JSZKiDAAAAAElFTkSuQmCC"/>
+</svg>
diff --git a/doc/source/_static/index-images/user_guide.svg b/doc/source/_static/index-images/user_guide.svg
new file mode 100644 (file)
index 0000000..d61b093
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#013243"><g><rect fill="none" height="24" width="24"/></g><g><g/><g><path d="M21,5c-1.11-0.35-2.33-0.5-3.5-0.5c-1.95,0-4.05,0.4-5.5,1.5c-1.45-1.1-3.55-1.5-5.5-1.5S2.45,4.9,1,6v14.65 c0,0.25,0.25,0.5,0.5,0.5c0.1,0,0.15-0.05,0.25-0.05C3.1,20.45,5.05,20,6.5,20c1.95,0,4.05,0.4,5.5,1.5c1.35-0.85,3.8-1.5,5.5-1.5 c1.65,0,3.35,0.3,4.75,1.05c0.1,0.05,0.15,0.05,0.25,0.05c0.25,0,0.5-0.25,0.5-0.5V6C22.4,5.55,21.75,5.25,21,5z M21,18.5 c-1.1-0.35-2.3-0.5-3.5-0.5c-1.7,0-4.15,0.65-5.5,1.5V8c1.35-0.85,3.8-1.5,5.5-1.5c1.2,0,2.4,0.15,3.5,0.5V18.5z"/><g><path d="M17.5,10.5c0.88,0,1.73,0.09,2.5,0.26V9.24C19.21,9.09,18.36,9,17.5,9c-1.7,0-3.24,0.29-4.5,0.83v1.66 C14.13,10.85,15.7,10.5,17.5,10.5z"/><path d="M13,12.49v1.66c1.13-0.64,2.7-0.99,4.5-0.99c0.88,0,1.73,0.09,2.5,0.26V11.9c-0.79-0.15-1.64-0.24-2.5-0.24 C15.8,11.66,14.26,11.96,13,12.49z"/><path d="M17.5,14.33c-1.7,0-3.24,0.29-4.5,0.83v1.66c1.13-0.64,2.7-0.99,4.5-0.99c0.88,0,1.73,0.09,2.5,0.26v-1.52 C19.21,14.41,18.36,14.33,17.5,14.33z"/></g></g></g></svg>
\ No newline at end of file
diff --git a/doc/source/_templates/indexcontent.html b/doc/source/_templates/indexcontent.html
deleted file mode 100644 (file)
index 184a3ca..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-{#
-  Loosely inspired by the deprecated sphinx/themes/basic/defindex.html
-#}
-{%- extends "layout.html" %}
-{% set title = _('Overview') %}
-{% block body %}
-<h1>{{ docstitle|e }}</h1>
-<p>
-  Welcome! This is the documentation for NumPy {{ release|e }}
-  {%- if last_updated %}, last updated {{ last_updated|e }}{% endif %}.
-</p>
-<p><strong>For users:</strong></p>
-<table class="contentstable" align="center"><tr>
-    <td width="50%">
-      <p class="biglink"><a class="biglink" href="{{ pathto("user/whatisnumpy") }}">What is NumPy?</a><br/>
-       <span class="linkdescr">Who uses it and why</span></p>
-      <p class="biglink"><a class ="biglink" href="{{ pathto("user/absolute_beginners") }}">NumPy: the absolute beginner's guide</a><br/>    
-      <p class="biglink"><a class="biglink" href="https://numpy.org/install/">Installation</a><br/>
-      <p class="biglink"><a class="biglink" href="{{ pathto("user/quickstart") }}">NumPy quickstart</a><br/>
-    <span class="linkdescr">Aimed at domain experts or people migrating to NumPy</span></p>
-      <p class="biglink"><a class="biglink" href="{{ pathto("user/numpy-for-matlab-users") }}">NumPy for MATLAB users</a><br/>    
-      <p class="biglink"><a class="biglink" href="{{ pathto("user/tutorials_index") }}">NumPy Tutorials</a><br/>
-       <span class="linkdescr">Learn about concepts and submodules</span></p>
-      <p class="biglink"><a class="biglink" href="{{ pathto("user/howtos_index") }}">NumPy How Tos</a><br/>
-       <span class="linkdescr">How to do common tasks with NumPy</span></p>
-      <p class="biglink"><a class="biglink" href="{{ pathto("user/basics") }}">NumPy fundamentals</a><br/>  
-      <p class="biglink"><a class="biglink" href="{{ pathto("user/building") }}">Building from source</a><br/> 
-      <p class="biglink"><a class="biglink" href="{{ pathto("user/c-info") }}">Using NumPy C-API</a><br/>
-      <p class="biglink"><a class="biglink" href="{{ pathto("f2py/index") }}">F2PY Users Guide and Reference Manual</a><br/>
-    <span class="linkdescr">Documentation for the f2py module (Fortran extensions for Python)</span></p>        
-      <p class="biglink"><a class="biglink" href="{{ pathto("glossary") }}">Glossary</a><br/>
-    <span class="linkdescr">List of the most important terms</span></p>
-  </td></tr>
-</table>
-
-<p><strong>For developers/contributors:</strong></p>
-<table class="contentstable" align="center"><tr>
-    <td width="50%">
-      <p class="biglink"><a class="biglink" href="{{ pathto("dev/index") }}">NumPy contributor guide</a><br/>
-        <span class="linkdescr">Contributing to NumPy</span></p>
-      <p class="biglink"><a class="biglink" href="{{ pathto("dev/underthehood") }}">Under-the-hood docs</a><br/>
-       <span class="linkdescr">Specialized, in-depth documentation</span></p>
-      <p class="biglink"><a class="biglink" href="{{ pathto("docs/howto_document") }}">A guide to NumPy documentation</a><br/>    
-      <p class="biglink"><a class="biglink" href="{{ pathto("docs/howto_build_docs") }}">Building the NumPy API and reference docs</a><br/>    
-      <p class="biglink"><a class="biglink" href="{{ pathto("benchmarking") }}">Benchmarking</a><br/>
-        <span class="linkdescr">benchmarking NumPy</span></p>
-      <p class="biglink"><a class="biglink" href="https://www.numpy.org/neps/index.html">NumPy Enhancement Proposals</a><br/>
-    </td></tr>
-  </table>
-
-  <p><strong>Meta information:</strong></p>
-  <table class="contentstable" align="center"><tr>
-    <td width="50%">
-      <p class="biglink"><a class="biglink" href="{{ pathto("bugs") }}">Reporting bugs</a></p>
-      <p class="biglink"><a class="biglink" href="{{ pathto("release") }}">Release notes</a></p>
-    </td><td width="50%">
-      <p class="biglink"><a class="biglink" href="{{ pathto("doc_conventions") }}">Document conventions</a></p>
-      <p class="biglink"><a class="biglink" href="{{ pathto("license") }}">License of NumPy</a></p>
-    </td></tr>
-  </table>
-
-  <h2>Acknowledgements</h2>
-  <p>
-    Large parts of this manual originate from Travis E. Oliphant's book
-    <a href="https://archive.org/details/NumPyBook">"Guide to NumPy"</a>
-    (which generously entered public domain in August 2008). The reference
-    documentation for many of the functions are written by numerous
-    contributors and developers of NumPy.
-  </p>
-  <p>
-    The preferred way to update the documentation is by submitting a pull
-    request on GitHub (see the <a href="{{ pathto("docs/index") }}">Documentation index</a>).
-    Please help us to further improve the NumPy documentation!
-  </p>
-{% endblock %}
diff --git a/doc/source/_templates/indexsidebar.html b/doc/source/_templates/indexsidebar.html
deleted file mode 100644 (file)
index 4707fc0..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-            <h3>Resources</h3>
-            <ul>
-              <li><a href="https://numpy.org/">NumPy.org website</a></li>
-              <li><a href="https://scipy.org/">Scipy.org website</a></li>
-            </ul>
index 8fa537969a86ccb1a5a681b7dc69313f99e00366..cd5aadd81a9b69814741ae6f6c4e9bac518207dc 100644 (file)
@@ -1,7 +1,7 @@
-# -*- coding: utf-8 -*-
 import os
 import re
 import sys
+import importlib
 
 # Minimum version, enforced by sphinx
 needs_sphinx = '3.2.0'
@@ -84,8 +84,19 @@ extensions = [
     'IPython.sphinxext.ipython_console_highlighting',
     'IPython.sphinxext.ipython_directive',
     'sphinx.ext.mathjax',
+    'sphinx_panels',
 ]
 
+skippable_extensions = [
+    ('breathe', 'skip generating C/C++ API from comment blocks.'),
+]
+for ext, warn in skippable_extensions:
+    ext_exist = importlib.util.find_spec(ext) is not None
+    if ext_exist:
+        extensions.append(ext)
+    else:
+        print(f"Unable to find Sphinx extension '{ext}', {warn}.")
+
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ['_templates']
 
@@ -164,11 +175,10 @@ html_theme_options = {
   "logo_link": "index",
   "github_url": "https://github.com/numpy/numpy",
   "twitter_url": "https://twitter.com/numpy_team",
-}
-
-
-html_additional_pages = {
-    'index': 'indexcontent.html',
+  "collapse_navigation": True,
+  "external_links": [
+      {"name": "Learn", "url": "https://numpy.org/numpy-tutorials/"}
+      ],
 }
 
 html_title = "%s v%s Manual" % (project, version)
@@ -288,13 +298,15 @@ texinfo_documents = [
 intersphinx_mapping = {
     'neps': ('https://numpy.org/neps', None),
     'python': ('https://docs.python.org/dev', None),
-    'scipy': ('https://docs.scipy.org/doc/scipy', None),
+    'scipy': ('https://docs.scipy.org/doc/scipy/reference', None),
     'matplotlib': ('https://matplotlib.org/stable', None),
     'imageio': ('https://imageio.readthedocs.io/en/stable', None),
     'skimage': ('https://scikit-image.org/docs/stable', None),
     'pandas': ('https://pandas.pydata.org/pandas-docs/stable', None),
     'scipy-lecture-notes': ('https://scipy-lectures.org', None),
     'pytest': ('https://docs.pytest.org/en/stable', None),
+    'numpy-tutorials': ('https://numpy.org/numpy-tutorials', None),
+    'numpydoc': ('https://numpydoc.readthedocs.io/en/latest', None),
 }
 
 
@@ -434,6 +446,11 @@ def linkcode_resolve(domain, info):
         if not fn:
             return None
 
+        # Ignore re-exports as their source files are not within the numpy repo
+        module = inspect.getmodule(obj)
+        if module is not None and not module.__name__.startswith("numpy"):
+            return None
+
         try:
             source, lineno = inspect.getsourcelines(obj)
         except Exception:
@@ -466,3 +483,11 @@ class NumPyLexer(CLexer):
             inherit,
         ],
     }
+
+
+# -----------------------------------------------------------------------------
+# Breathe & Doxygen
+# -----------------------------------------------------------------------------
+breathe_projects = dict(numpy=os.path.join("..", "build", "doxygen", "xml"))
+breathe_default_project = "numpy"
+breathe_default_members = ("members", "undoc-members", "protected-members")
diff --git a/doc/source/dev/alignment.rst b/doc/source/dev/alignment.rst
new file mode 100644 (file)
index 0000000..bb1198e
--- /dev/null
@@ -0,0 +1,113 @@
+.. currentmodule:: numpy
+
+.. _alignment:
+
+****************
+Memory Alignment
+****************
+
+NumPy alignment goals
+=====================
+
+There are three use-cases related to memory alignment in NumPy (as of 1.14):
+
+ 1. Creating :term:`structured datatypes <structured data type>` with
+    :term:`fields <field>` aligned like in a C-struct.
+ 2. Speeding up copy operations by using :class:`uint` assignment in instead of
+    ``memcpy``.
+ 3. Guaranteeing safe aligned access for ufuncs/setitem/casting code.
+
+NumPy uses two different forms of alignment to achieve these goals:
+"True alignment" and "Uint alignment".
+
+"True" alignment refers to the architecture-dependent alignment of an
+equivalent C-type in C. For example, in x64 systems :attr:`float64` is
+equivalent to ``double`` in C. On most systems, this has either an alignment of
+4 or 8 bytes (and this can be controlled in GCC by the option
+``malign-double``).  A variable is aligned in memory if its memory offset is a
+multiple of its alignment. On some systems (eg. sparc) memory alignment is
+required; on others, it gives a speedup.
+
+"Uint" alignment depends on the size of a datatype. It is defined to be the
+"True alignment" of the uint used by NumPy's copy-code to copy the datatype, or
+undefined/unaligned if there is no equivalent uint. Currently, NumPy uses
+``uint8``, ``uint16``, ``uint32``, ``uint64``, and ``uint64`` to copy data of
+size 1, 2, 4, 8, 16 bytes respectively, and all other sized datatypes cannot
+be uint-aligned.
+
+For example, on a (typical Linux x64 GCC) system, the NumPy :attr:`complex64`
+datatype is implemented as ``struct { float real, imag; }``. This has "true"
+alignment of 4 and "uint" alignment of 8 (equal to the true alignment of
+``uint64``).
+
+Some cases where uint and true alignment are different (default GCC Linux):
+   ======   =========   ========    ========
+   arch     type        true-aln    uint-aln
+   ======   =========   ========    ========
+   x86_64   complex64          4           8
+   x86_64   float128          16           8
+   x86      float96            4          \-
+   ======   =========   ========    ========
+
+
+Variables in NumPy which control and describe alignment
+=======================================================
+
+There are 4 relevant uses of the word ``align`` used in NumPy:
+
+ * The :attr:`dtype.alignment` attribute (``descr->alignment`` in C). This is
+   meant to reflect the "true alignment" of the type. It has arch-dependent
+   default values for all datatypes, except for the structured types created
+   with ``align=True`` as described below.
+ * The ``ALIGNED`` flag of an ndarray, computed in ``IsAligned`` and checked
+   by :c:func:`PyArray_ISALIGNED`. This is computed from
+   :attr:`dtype.alignment`.
+   It is set to ``True`` if every item in the array is at a memory location
+   consistent with :attr:`dtype.alignment`, which is the case if the
+   ``data ptr`` and all strides of the array are multiples of that alignment.
+ * The ``align`` keyword of the dtype constructor, which only affects
+   :ref:`structured_arrays`. If the structure's field offsets are not manually
+   provided, NumPy determines offsets automatically. In that case,
+   ``align=True`` pads the structure so that each field is "true" aligned in
+   memory and sets :attr:`dtype.alignment` to be the largest of the field
+   "true" alignments. This is like what C-structs usually do. Otherwise if
+   offsets or itemsize were manually provided ``align=True`` simply checks that
+   all the fields are "true" aligned and that the total itemsize is a multiple
+   of the largest field alignment. In either case :attr:`dtype.isalignedstruct`
+   is also set to True.
+ * ``IsUintAligned`` is used to determine if an ndarray is "uint aligned" in
+   an analogous way to how ``IsAligned`` checks for true alignment.
+
+Consequences of alignment
+=========================
+
+Here is how the variables above are used:
+
+ 1. Creating aligned structs: To know how to offset a field when
+    ``align=True``, NumPy looks up ``field.dtype.alignment``. This includes
+    fields that are nested structured arrays.
+ 2. Ufuncs: If the ``ALIGNED`` flag of an array is False, ufuncs will
+    buffer/cast the array before evaluation. This is needed since ufunc inner
+    loops access raw elements directly, which might fail on some archs if the
+    elements are not true-aligned.
+ 3. Getitem/setitem/copyswap function: Similar to ufuncs, these functions
+    generally have two code paths. If ``ALIGNED`` is False they will
+    use a code path that buffers the arguments so they are true-aligned.
+ 4. Strided copy code: Here, "uint alignment" is used instead.  If the itemsize
+    of an array is equal to 1, 2, 4, 8 or 16 bytes and the array is uint
+    aligned then instead NumPy will do ``*(uintN*)dst) = *(uintN*)src)`` for
+    appropriate N. Otherwise, NumPy copies by doing ``memcpy(dst, src, N)``.
+ 5. Nditer code: Since this often calls the strided copy code, it must
+    check for "uint alignment".
+ 6. Cast code: This checks for "true" alignment, as it does
+    ``*dst = CASTFUNC(*src)`` if aligned. Otherwise, it does
+    ``memmove(srcval, src); dstval = CASTFUNC(srcval); memmove(dst, dstval)``
+    where dstval/srcval are aligned.
+
+Note that the strided-copy and strided-cast code are deeply intertwined and so
+any arrays being processed by them must be both uint and true aligned, even
+though the copy-code only needs uint alignment and the cast code only true
+alignment.  If there is ever a big rewrite of this code it would be good to
+allow them to use different alignments.
+
+
index fa4014fdbc450b33b116eea0986ffc1aa815cdfb..18a7f6ae9ad18f864a8ba71a1755851fd97f6c53 100644 (file)
@@ -3,8 +3,8 @@ Advanced debugging tools
 ========================
 
 If you reached here, you want to dive into, or use, more advanced tooling.
-This is usually not necessary for first time contributers and most
-day-to-day developement.
+This is usually not necessary for first time contributors and most
+day-to-day development.
 These are used more rarely, for example close to a new NumPy release,
 or when a large or particular complex change was made.
 
@@ -25,7 +25,7 @@ narrow down.
 We do not expect any of these tools to be run by most contributors.
 However, you can ensure that we can track down such issues more easily easier:
 
-* Tests should cover all code paths, incluing error paths.
+* Tests should cover all code paths, including error paths.
 * Try to write short and simple tests. If you have a very complicated test
   consider creating an additional simpler test as well.
   This can be helpful, because often it is only easy to find which test
@@ -112,7 +112,7 @@ where ``PYTHONMALLOC=malloc`` is necessary to avoid false positives from python
 itself.
 Depending on the system and valgrind version, you may see more false positives.
 ``valgrind`` supports "suppressions" to ignore some of these, and Python does
-have a supression file (and even a compile time option) which may help if you
+have a suppression file (and even a compile time option) which may help if you
 find it necessary.
 
 Valgrind helps:
index 665198c69de6cb42f89f9b3af1454c88c9e1c0cd..37cf6f7afb50bef01d096c969536c406a757d9ff 100644 (file)
@@ -122,7 +122,7 @@ source tree is to use::
 
 
 NumPy uses a series of tests to probe the compiler and libc libraries for
-funtions. The results are stored in ``_numpyconfig.h`` and ``config.h`` files
+functions. The results are stored in ``_numpyconfig.h`` and ``config.h`` files
 using ``HAVE_XXX`` definitions. These tests are run during the ``build_src``
 phase of the ``_multiarray_umath`` module in the ``generate_config_h`` and
 ``generate_numpyconfig_h`` functions. Since the output of these calls includes
diff --git a/doc/source/dev/examples/.doxyfile b/doc/source/dev/examples/.doxyfile
new file mode 100644 (file)
index 0000000..966c1b6
--- /dev/null
@@ -0,0 +1,2 @@
+INPUT += @CUR_DIR
+INCLUDE_PATH += @CUR_DIR
diff --git a/doc/source/dev/examples/doxy_class.hpp b/doc/source/dev/examples/doxy_class.hpp
new file mode 100644 (file)
index 0000000..ceba634
--- /dev/null
@@ -0,0 +1,21 @@
+/**
+ *  Template to represent limbo numbers.
+ *
+ *  Specializations for integer types that are part of nowhere.
+ *  It doesn't support with any real types.
+ *
+ *  @param Tp Type of the integer. Required to be an integer type.
+ *  @param N  Number of elements.
+*/
+template<typename Tp, std::size_t N>
+class DoxyLimbo {
+ public:
+    /// Default constructor. Initialize nothing.
+    DoxyLimbo();
+    /// Set Default behavior for copy the limbo.
+    DoxyLimbo(const DoxyLimbo<Tp, N> &l);
+    /// Returns the raw data for the limbo.
+    const Tp *data();
+ protected:
+    Tp p_data[N]; ///< Example for inline comment.
+};
diff --git a/doc/source/dev/examples/doxy_func.h b/doc/source/dev/examples/doxy_func.h
new file mode 100644 (file)
index 0000000..792a9d1
--- /dev/null
@@ -0,0 +1,11 @@
+/**
+ * This a simple brief.
+ *
+ * And the details goes here.
+ * Multi lines are welcome.
+ *
+ * @param  num  leave a comment for parameter num.
+ * @param  str  leave a comment for the second parameter.
+ * @return      leave a comment for the returned value.
+ */
+int doxy_javadoc_example(int num, const char *str);
diff --git a/doc/source/dev/examples/doxy_rst.h b/doc/source/dev/examples/doxy_rst.h
new file mode 100644 (file)
index 0000000..6ab4a07
--- /dev/null
@@ -0,0 +1,15 @@
+/**
+ * A comment block contains reST markup.
+ * @rst
+ * .. note::
+ *
+ *   Thanks to Breathe_, we were able to bring it to Doxygen_
+ *
+ * Some code example::
+ *
+ *   int example(int x) {
+ *       return x * 2;
+ *   }
+ * @endrst
+ */
+void doxy_reST_example(void);
index 8c9cc0825eb0432471c03f543b257c8c960693f3..3ed39c4c1df9dd3aabbac2dcf2f392e89ad8bae1 100644 (file)
@@ -203,7 +203,7 @@ Council membership
 ~~~~~~~~~~~~~~~~~~
 
 A list of current Steering Council Members is maintained at the
-page :ref:`governance-people`.
+page `About Us <https://numpy.org/about/>`_.
 
 To become eligible to join the Steering Council, an individual must be
 a Project Contributor who has produced contributions that are
@@ -307,7 +307,7 @@ its interactions with NumFOCUS.
    resting on one person.
 
 The current membership of the NumFOCUS Subcommittee is listed at the
-page :ref:`governance-people`.
+page `About Us <https://numpy.org/about/>`_.
 
 
 Institutional Partners and Funding
@@ -375,7 +375,7 @@ Institutional Partner benefits are:
 -  Council Members invited to NumPy Developer Meetings.
 
 A list of current Institutional Partners is maintained at the page
-:ref:`governance-people`.
+`About Us <https://numpy.org/about/>`_.
 
 
 Document history
index 3919e5e66a5e6cddfb34496797a306ec9e7639c2..4dcc3002bad9430dee0c01d3428f52ab4e6aacd6 100644 (file)
@@ -6,4 +6,3 @@ NumPy governance
    :maxdepth: 3
 
    governance
-   people
diff --git a/doc/source/dev/governance/people.rst b/doc/source/dev/governance/people.rst
deleted file mode 100644 (file)
index c48b801..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-.. _governance-people:
-
-Current steering council and institutional partners
-===================================================
-
-Steering council
-----------------
-
-* Sebastian Berg
-* Ralf Gommers
-* Charles Harris
-* Stephan Hoyer
-* Melissa Weber Mendonça
-* Inessa Pawson
-* Matti Picus
-* Stéfan van der Walt
-* Eric Wieser
-
-
-Emeritus members
-----------------
-
-* Travis Oliphant -- project founder / emeritus leader (2005-2012)
-* Alex Griffing (2015-2017)
-* Marten van Kerkwijk (2017-2019)
-* Allan Haldane (2015-2021)
-* Nathaniel Smith (2012-2021)
-* Julian Taylor (2013-2021)
-* Pauli Virtanen (2008-2021)
-* Jaime Fernández del Río (2014-2021)
-
-
-NumFOCUS Subcommittee
----------------------
-
-* Charles Harris
-* Ralf Gommers
-* Melissa Weber Mendonça
-* Sebastian Berg
-* External member: Thomas Caswell
-
-
-Institutional Partners
-----------------------
-
-* UC Berkeley (Stéfan van der Walt, Sebastian Berg, Ross Barnowski)
-
-* Quansight (Ralf Gommers, Melissa Weber Mendonça, Mars Lee, Matti Picus, Pearu Peterson)
-
index 3687d7550ebe85741b5ef634cc67dc2bb3f61dc4..93fec509c2370cf0233bd2ff9121a6c23741aa18 100644 (file)
@@ -59,6 +59,10 @@ Obvious **wording** mistakes (like leaving out a "not") fall into the typo
 category, but other rewordings -- even for grammar -- require a judgment call,
 which raises the bar. Test the waters by first presenting the fix as an issue.
 
+Some functions/objects like numpy.ndarray.transpose, numpy.array etc. defined in
+C-extension modules have their docstrings defined separately in `_add_newdocs.py
+<https://github.com/numpy/numpy/blob/main/numpy/core/_add_newdocs.py>`__
+
 **********************
 Contributing new pages
 **********************
@@ -68,7 +72,7 @@ Your frustrations using our documents are our best guide to what needs fixing.
 If you write a missing doc you join the front line of open source, but it's
 a meaningful contribution just to let us know what's missing. If you want to
 compose a doc, run your thoughts by the `mailing list
-<https://mail.python.org/mailman/listinfo/numpy-discussion>`__ for futher
+<https://mail.python.org/mailman/listinfo/numpy-discussion>`__ for further
 ideas and feedback. If you want to alert us to a gap,
 `open an issue <https://github.com/numpy/numpy/issues>`__. See
 `this issue <https://github.com/numpy/numpy/issues/15760>`__ for an example.
@@ -149,6 +153,282 @@ if you write a tutorial on your blog, create a YouTube video, or answer question
 on Stack Overflow and other sites.
 
 
+.. _howto-document:
+
+*******************
+Documentation style
+*******************
+
+.. _userdoc_guide:
+
+User documentation
+==================
+
+- In general, we follow the
+  `Google developer documentation style guide <https://developers.google.com/style>`_
+  for the User Guide.
+
+- NumPy style governs cases where:
+
+      - Google has no guidance, or
+      - We prefer not to use the Google style
+
+  Our current rules:
+
+      - We pluralize *index* as *indices* rather than
+        `indexes <https://developers.google.com/style/word-list#letter-i>`_,
+        following the precedent of :func:`numpy.indices`.
+
+      - For consistency we also pluralize *matrix* as *matrices*.
+
+- Grammatical issues inadequately addressed by the NumPy or Google rules are
+  decided by the section on "Grammar and Usage" in the most recent edition of
+  the `Chicago Manual of Style
+  <https://en.wikipedia.org/wiki/The_Chicago_Manual_of_Style>`_.
+
+- We welcome being
+  `alerted <https://github.com/numpy/numpy/issues>`_ to cases
+  we should add to the NumPy style rules.
+
+.. _docstring_intro:
+
+Docstrings
+==========
+
+When using `Sphinx <http://www.sphinx-doc.org/>`_ in combination with the
+NumPy conventions, you should use the ``numpydoc`` extension so that your
+docstrings will be handled correctly. For example, Sphinx will extract the
+``Parameters`` section from your docstring and convert it into a field
+list.  Using ``numpydoc`` will also avoid the reStructuredText errors produced
+by plain Sphinx when it encounters NumPy docstring conventions like
+section headers (e.g. ``-------------``) that sphinx does not expect to
+find in docstrings.
+
+It is available from:
+
+* `numpydoc on PyPI <https://pypi.python.org/pypi/numpydoc>`_
+* `numpydoc on GitHub <https://github.com/numpy/numpydoc/>`_
+
+Note that for documentation within NumPy, it is not necessary to do
+``import numpy as np`` at the beginning of an example.
+
+Please use the ``numpydoc`` :ref:`formatting standard <numpydoc:format>` as
+shown in their :ref:`example <numpydoc:example>`.
+
+.. _doc_c_code:
+
+Documenting C/C++ Code
+======================
+
+NumPy uses Doxygen_ to parse specially-formatted C/C++ comment blocks. This generates
+XML files, which are  converted by Breathe_ into RST, which is used by Sphinx.
+
+**It takes three steps to complete the documentation process**:
+
+1. Writing the comment blocks
+-----------------------------
+
+Although there is still no commenting style set to follow, the Javadoc
+is more preferable than the others due to the similarities with the current
+existing non-indexed comment blocks.
+
+.. note::
+   Please see `"Documenting the code" <https://www.doxygen.nl/manual/docblocks.html>`__.
+
+**This is what Javadoc style looks like**:
+
+.. literalinclude:: examples/doxy_func.h
+
+**And here is how it is rendered**:
+
+.. doxygenfunction:: doxy_javadoc_example
+
+**For line comment, you can use a triple forward slash. For example**:
+
+.. literalinclude:: examples/doxy_class.hpp
+
+**And here is how it is rendered**:
+
+.. doxygenclass:: DoxyLimbo
+
+Common Doxygen Tags:
+++++++++++++++++++++
+
+.. note::
+   For more tags/commands, please take a look at https://www.doxygen.nl/manual/commands.html
+
+``@brief``
+
+Starts a paragraph that serves as a brief description. By default the first sentence
+of the documentation block is automatically treated as a brief description, since
+option `JAVADOC_AUTOBRIEF <https://www.doxygen.nl/manual/config.html#cfg_javadoc_autobrief>`__
+is enabled within doxygen configurations.
+
+``@details``
+
+Just like ``@brief`` starts a brief description, ``@details`` starts the detailed description.
+You can also start a new paragraph (blank line) then the ``@details`` command is not needed.
+
+``@param``
+
+Starts a parameter description for a function parameter with name <parameter-name>,
+followed by a description of the parameter. The existence of the parameter is checked
+and a warning is given if the documentation of this (or any other) parameter is missing
+or not present in the function declaration or definition.
+
+``@return``
+
+Starts a return value description for a function.
+Multiple adjacent ``@return`` commands will be joined into a single paragraph.
+The ``@return`` description ends when a blank line or some other sectioning command is encountered.
+
+``@code/@endcode``
+
+Starts/Ends a block of code. A code block is treated differently from ordinary text.
+It is interpreted as source code.
+
+``@rst/@endrst``
+
+Starts/Ends a block of reST markup.
+
+Example
+~~~~~~~
+**Take a look at the following example**:
+
+.. literalinclude:: examples/doxy_rst.h
+
+**And here is how it is rendered**:
+
+.. doxygenfunction:: doxy_reST_example
+
+2. Feeding Doxygen
+------------------
+
+Not all headers files are collected automatically. You have to add the desired
+C/C++ header paths within the sub-config files of Doxygen.
+
+Sub-config files have the unique name ``.doxyfile``, which you can usually find near
+directories that contain documented headers. You need to create a new config file if
+there's not one located in a path close(2-depth) to the headers you want to add.
+
+Sub-config files can accept any of Doxygen_ `configuration options <https://www.doxygen.nl/manual/config.html>`__,
+but do not override or re-initialize any configuration option,
+rather only use the concatenation operator "+=". For example::
+
+   # to specfiy certain headers
+   INPUT += @CUR_DIR/header1.h \
+            @CUR_DIR/header2.h
+   # to add all headers in certain path
+   INPUT += @CUR_DIR/to/headers
+   # to define certain macros
+   PREDEFINED += C_MACRO(X)=X
+   # to enable certain branches
+   PREDEFINED += NPY_HAVE_FEATURE \
+                 NPY_HAVE_FEATURE2
+
+.. note::
+    @CUR_DIR is a template constant returns the current
+    dir path of the sub-config file.
+
+3. Inclusion directives
+-----------------------
+
+Breathe_ provides a wide range of custom directives to allow
+converting the documents generated by Doxygen_ into reST files.
+
+.. note::
+   For more information, please check out "`Directives & Config Variables <https://breathe.readthedocs.io/en/latest/directives.html>`__"
+
+Common directives:
+++++++++++++++++++
+
+``doxygenfunction``
+
+This directive generates the appropriate output for a single function.
+The function name is required to be unique in the project.
+
+.. code::
+
+   .. doxygenfunction:: <function name>
+       :outline:
+       :no-link:
+
+Checkout the `example <https://breathe.readthedocs.io/en/latest/function.html#function-example>`__
+to see it in action.
+
+
+``doxygenclass``
+
+This directive generates the appropriate output for a single class.
+It takes the standard project, path, outline and no-link options and
+additionally the members, protected-members, private-members, undoc-members,
+membergroups and members-only options:
+
+.. code::
+
+    .. doxygenclass:: <class name>
+       :members: [...]
+       :protected-members:
+       :private-members:
+       :undoc-members:
+       :membergroups: ...
+       :members-only:
+       :outline:
+       :no-link:
+
+Checkout the `doxygenclass documentation <https://breathe.readthedocs.io/en/latest/class.html#class-example>_`
+for more details and to see it in action.
+
+``doxygennamespace``
+
+This directive generates the appropriate output for the contents of a namespace.
+It takes the standard project, path, outline and no-link options and additionally the content-only,
+members, protected-members, private-members and undoc-members options.
+To reference a nested namespace, the full namespaced path must be provided,
+e.g. foo::bar for the bar namespace inside the foo namespace.
+
+.. code::
+
+    .. doxygennamespace:: <namespace>
+       :content-only:
+       :outline:
+       :members:
+       :protected-members:
+       :private-members:
+       :undoc-members:
+       :no-link:
+
+Checkout the `doxygennamespace documentation <https://breathe.readthedocs.io/en/latest/namespace.html#namespace-example>`__
+for more details and to see it in action.
+
+``doxygengroup``
+
+This directive generates the appropriate output for the contents of a doxygen group.
+A doxygen group can be declared with specific doxygen markup in the source comments
+as covered in the doxygen `grouping documentation <https://www.doxygen.nl/manual/grouping.html>`__.
+
+It takes the standard project, path, outline and no-link options and additionally the
+content-only, members, protected-members, private-members and undoc-members options.
+
+.. code::
+
+    .. doxygengroup:: <group name>
+       :content-only:
+       :outline:
+       :members:
+       :protected-members:
+       :private-members:
+       :undoc-members:
+       :no-link:
+       :inner:
+
+Checkout the `doxygengroup documentation <https://breathe.readthedocs.io/en/latest/group.html#group-example>`__
+for more details and to see it in action.
+
+.. _`Doxygen`: https://www.doxygen.nl/index.html
+.. _`Breathe`: https://breathe.readthedocs.io/en/latest/
+
+
 *********************
 Documentation reading
 *********************
diff --git a/doc/source/dev/howto_build_docs.rst b/doc/source/dev/howto_build_docs.rst
new file mode 100644 (file)
index 0000000..b175926
--- /dev/null
@@ -0,0 +1,137 @@
+.. _howto-build-docs:
+
+=========================================
+Building the NumPy API and reference docs
+=========================================
+
+If you only want to get the documentation, note that pre-built
+versions can be found at
+
+    https://numpy.org/doc/
+
+in several different formats.
+
+Development environments
+------------------------
+
+Before proceeding further it should be noted that the documentation is built with the ``make`` tool,
+which is not natively available on Windows. MacOS or Linux users can jump
+to :ref:`how-todoc.prerequisites`. It is recommended for Windows users to set up their development
+environment on :ref:`Gitpod <development-gitpod>` or `Windows Subsystem
+for Linux (WSL) <https://docs.microsoft.com/en-us/windows/wsl/install-win10>`_. WSL is a good option
+for a persistent local set-up.
+
+Gitpod
+^^^^^^
+Gitpod is an open-source platform that automatically creates the correct development environment right
+in your browser, reducing the need to install local development environments and deal with
+incompatible dependencies.
+
+If you have good internet connectivity and want a temporary set-up,
+it is often faster to build with Gitpod. Here are the in-depth instructions for
+:ref:`building NumPy with Gitpod <development-gitpod>`.
+
+
+.. _how-todoc.prerequisites:
+
+Prerequisites
+-------------
+
+Building the NumPy documentation and API reference requires the following:
+
+NumPy
+^^^^^
+
+Since large parts of the main documentation are obtained from NumPy via
+``import numpy`` and examining the docstrings, you will need to first
+:ref:`build <building-from-source>` and install it so that the correct version is imported.
+NumPy has to be re-built and re-installed every time you fetch the latest version of the
+repository, before generating the documentation. This ensures that the NumPy version and
+the git repository version are in sync.
+
+Note that you can e.g. install NumPy to a temporary location and set
+the PYTHONPATH environment variable appropriately.
+Alternatively, if using Python virtual environments (via e.g. ``conda``,
+``virtualenv`` or the ``venv`` module), installing NumPy into a
+new virtual environment is recommended.
+
+Dependencies
+^^^^^^^^^^^^
+
+All of the necessary dependencies for building the NumPy docs except for
+Doxygen_ can be installed with::
+
+    pip install -r doc_requirements.txt
+
+We currently use Sphinx_ along with Doxygen_ for generating the API and
+reference documentation for NumPy. In addition, building the documentation
+requires the Sphinx extension `plot_directive`, which is shipped with
+:doc:`Matplotlib <matplotlib:index>`. We also use numpydoc_ to render docstrings in
+the generated API documentation. :doc:`SciPy <scipy:index>`
+is installed since some parts of the documentation require SciPy functions.
+
+For installing Doxygen_, please check the official
+`download <https://www.doxygen.nl/download.html#srcbin>`_ and
+`installation <https://www.doxygen.nl/manual/install.html>`_ pages, or if you
+are using Linux then you can install it through your distribution package manager.
+
+.. note::
+
+   Try to install a newer version of Doxygen_ > 1.8.10 otherwise you may get some
+   warnings during the build.
+
+Submodules
+^^^^^^^^^^
+
+If you obtained NumPy via git, also get the git submodules that contain
+additional parts required for building the documentation::
+
+    git submodule update --init
+
+.. _Sphinx: http://www.sphinx-doc.org/
+.. _numpydoc: https://numpydoc.readthedocs.io/en/latest/index.html
+.. _Doxygen: https://www.doxygen.nl/index.html
+
+Instructions
+------------
+
+Now you are ready to generate the docs, so write::
+
+    cd doc
+    make html
+
+If all goes well, this will generate a
+``build/html`` subdirectory in the ``/doc`` directory, containing the built documentation. If
+you get a message about ``installed numpy != current repo git version``, you must
+either override the check by setting ``GITVER`` or re-install NumPy.
+
+If you have built NumPy into a virtual environment and get an error
+that says ``numpy not found, cannot build documentation without...``,
+you need to override the makefile ``PYTHON`` variable at the command
+line, so instead of writing ``make  html`` write::
+
+    make PYTHON=python html
+
+To build the PDF documentation, do instead::
+
+   make latex
+   make -C build/latex all-pdf
+
+You will need to have LaTeX_ installed for this, inclusive of support for
+Greek letters.  For example, on Ubuntu xenial ``texlive-lang-greek`` and
+``cm-super`` are needed.  Also, ``latexmk`` is needed on non-Windows systems.
+
+Instead of the above, you can also do::
+
+   make dist
+
+which will rebuild NumPy, install it to a temporary location, and
+build the documentation in all formats. This will most likely again
+only work on Unix platforms.
+
+The documentation for NumPy distributed at https://numpy.org/doc in html and
+pdf format is also built with ``make dist``.  See `HOWTO RELEASE`_ for details
+on how to update https://numpy.org/doc.
+
+.. _LaTeX: https://www.latex-project.org/
+.. _HOWTO RELEASE: https://github.com/numpy/numpy/blob/main/doc/HOWTO_RELEASE.rst.txt
index aaf9fe4a091cda6be8adad2deac569a6be4a4119..a8c9692679b335d46ecd09074c5decae56ce603a 100644 (file)
@@ -186,7 +186,7 @@ Stylistic Guidelines
   pep-0008/>`_ (remove trailing white space, no tabs, etc.).  Check code with
   pyflakes / flake8.
 
-* Use numpy data types instead of strings (``np.uint8`` instead of
+* Use NumPy data types instead of strings (``np.uint8`` instead of
   ``"uint8"``).
 
 * Use the following import conventions::
@@ -229,42 +229,12 @@ Building docs
 -------------
 
 To build docs, run ``make`` from the ``doc`` directory. ``make help`` lists
-all targets. For example, to build the HTML documentation, you can run:
-
-.. code:: sh
+all targets. For example, to build the HTML documentation, you can run::
 
     make html
 
-Then, all the HTML files will be generated in ``doc/build/html/``.
-Since the documentation is based on docstrings, the appropriate version of
-numpy must be installed in the host python used to run sphinx.
-
-Requirements
-~~~~~~~~~~~~
-
-`Sphinx <http://www.sphinx-doc.org/en/stable/>`__ is needed to build
-the documentation. Matplotlib, SciPy, and IPython are also required.
-
-These additional dependencies for building the documentation are listed in
-``doc_requirements.txt`` and can be conveniently installed with::
-
-    pip install -r doc_requirements.txt
-
-The numpy documentation also depends on the
-`numpydoc <https://numpydoc.readthedocs.io/en/latest/>`__ sphinx extension
-as well as an external sphinx theme.
-These extensions are included as git submodules and must be initialized
-before building the docs.
-From the ``doc/`` directory:
-
-.. code:: sh
-
-    git submodule update --init
-
-The documentation includes mathematical formulae with LaTeX formatting.
-A working LaTeX document production system
-(e.g. `texlive <https://www.tug.org/texlive/>`__) is required for the
-proper rendering of the LaTeX math in the documentation.
+To get the appropriate dependencies and other requirements,
+see :ref:`howto-build-docs`.
 
 Fixing Warnings
 ~~~~~~~~~~~~~~~
@@ -287,6 +257,7 @@ The rest of the story
    Git Basics <gitwash/index>
    development_environment
    development_gitpod
+   howto_build_docs
    development_workflow
    development_advanced_debugging
    reviewer_guidelines
diff --git a/doc/source/dev/internals.code-explanations.rst b/doc/source/dev/internals.code-explanations.rst
new file mode 100644 (file)
index 0000000..b6edd61
--- /dev/null
@@ -0,0 +1,646 @@
+.. currentmodule:: numpy
+
+.. _c-code-explanations:
+
+*************************
+NumPy C code explanations
+*************************
+
+    Fanaticism consists of redoubling your efforts when you have forgotten
+    your aim.
+    --- *George Santayana*
+
+    An authority is a person who can tell you more about something than
+    you really care to know.
+    --- *Unknown*
+
+This page attempts to explain the logic behind some of the new
+pieces of code. The purpose behind these explanations is to enable
+somebody to be able to understand the ideas behind the implementation
+somewhat more easily than just staring at the code. Perhaps in this
+way, the algorithms can be improved on, borrowed from, and/or
+optimized by more people.
+
+
+Memory model
+============
+
+.. index::
+   pair: ndarray; memory model
+
+One fundamental aspect of the :class:`ndarray` is that an array is seen as a
+"chunk" of memory starting at some location. The interpretation of
+this memory depends on the :term:`stride` information. For each dimension in
+an :math:`N`-dimensional array, an integer (:term:`stride`) dictates how many
+bytes must be skipped to get to the next element in that dimension.
+Unless you have a single-segment array, this :term:`stride` information must
+be consulted when traversing through an array. It is not difficult to
+write code that accepts strides, you just have to use ``char*``
+pointers because strides are in units of bytes. Keep in mind also that
+strides do not have to be unit-multiples of the element size. Also,
+remember that if the number of dimensions of the array is 0 (sometimes
+called a ``rank-0`` array), then the :term:`strides <stride>` and
+:term:`dimensions <dimension>` variables are ``NULL``.
+
+Besides the structural information contained in the strides and
+dimensions members of the :c:type:`PyArrayObject`, the flags contain
+important information about how the data may be accessed. In particular,
+the :c:data:`NPY_ARRAY_ALIGNED` flag is set when the memory is on a
+suitable boundary according to the datatype array. Even if you have
+a :term:`contiguous` chunk of memory, you cannot just assume it is safe to
+dereference a datatype-specific pointer to an element. Only if the
+:c:data:`NPY_ARRAY_ALIGNED` flag is set, this is a safe operation. On
+some platforms it will work but on others, like Solaris, it will cause
+a bus error. The :c:data:`NPY_ARRAY_WRITEABLE` should also be ensured
+if you plan on writing to the memory area of the array. It is also
+possible to obtain a pointer to an unwritable memory area. Sometimes,
+writing to the memory area when the :c:data:`NPY_ARRAY_WRITEABLE` flag is not
+set will just be rude. Other times it can cause program crashes (*e.g.*
+a data-area that is a read-only memory-mapped file).
+
+
+Data-type encapsulation
+=======================
+
+.. seealso:: :ref:`arrays.dtypes`
+
+.. index::
+   single: dtype
+
+The :ref:`datatype <arrays.dtypes>` is an important abstraction of the
+:class:`ndarray`. Operations
+will look to the datatype to provide the key functionality that is
+needed to operate on the array. This functionality is provided in the
+list of function pointers pointed to by the ``f`` member of the
+:c:type:`PyArray_Descr` structure. In this way, the number of datatypes can be
+extended simply by providing a :c:type:`PyArray_Descr` structure with suitable
+function pointers in the ``f`` member. For built-in types, there are some
+optimizations that bypass this mechanism, but the point of the datatype
+abstraction is to allow new datatypes to be added.
+
+One of the built-in datatypes, the :class:`void` datatype allows for
+arbitrary :term:`structured types <structured data type>` containing 1 or more
+fields as elements of the array. A :term:`field` is simply another datatype
+object along with an offset into the current structured type. In order to
+support arbitrarily nested fields, several recursive implementations of
+datatype access are implemented for the void type. A common idiom is to cycle
+through the elements of the dictionary and perform a specific operation based on
+the datatype object stored at the given offset. These offsets can be
+arbitrary numbers. Therefore, the possibility of encountering misaligned
+data must be recognized and taken into account if necessary.
+
+
+N-D Iterators
+=============
+
+.. seealso:: :ref:`arrays.nditer`
+
+.. index::
+   single: array iterator
+
+A very common operation in much of NumPy code is the need to iterate
+over all the elements of a general, strided, N-dimensional array. This
+operation of a general-purpose N-dimensional loop is abstracted in the
+notion of an iterator object. To write an N-dimensional loop, you only
+have to create an iterator object from an ndarray, work with the
+:c:member:`dataptr <PyArrayIterObject.dataptr>` member of the iterator object
+structure and call the macro :c:func:`PyArray_ITER_NEXT` on the iterator
+object to move to the next element. The ``next`` element is always in
+C-contiguous order. The macro works by first special-casing the C-contiguous,
+1-D, and 2-D cases which work very simply.
+
+For the general case, the iteration works by keeping track of a list
+of coordinate counters in the iterator object. At each iteration, the
+last coordinate counter is increased (starting from 0). If this
+counter is smaller than one less than the size of the array in that
+dimension (a pre-computed and stored value), then the counter is
+increased and the :c:member:`dataptr <PyArrayIterObject.dataptr>` member is
+increased by the strides in that
+dimension and the macro ends. If the end of a dimension is reached,
+the counter for the last dimension is reset to zero and the
+:c:member:`dataptr <PyArrayIterObject.dataptr>` is
+moved back to the beginning of that dimension by subtracting the
+strides value times one less than the number of elements in that
+dimension (this is also pre-computed and stored in the
+:c:member:`backstrides <PyArrayIterObject.backstrides>`
+member of the iterator object). In this case, the macro does not end,
+but a local dimension counter is decremented so that the next-to-last
+dimension replaces the role that the last dimension played and the
+previously-described tests are executed again on the next-to-last
+dimension. In this way, the :c:member:`dataptr <PyArrayIterObject.dataptr>`
+is adjusted appropriately for arbitrary striding.
+
+The :c:member:`coordinates <PyArrayIterObject.coordinates>` member of the
+:c:type:`PyArrayIterObject` structure maintains
+the current N-d counter unless the underlying array is C-contiguous in
+which case the coordinate counting is bypassed. The
+:c:member:`index <PyArrayIterObject.index>` member of
+the :c:type:`PyArrayIterObject` keeps track of the current flat index of the
+iterator. It is updated by the :c:func:`PyArray_ITER_NEXT` macro.
+
+
+Broadcasting
+============
+
+.. seealso:: :ref:`basics.broadcasting`
+
+.. index::
+   single: broadcasting
+
+In Numeric, the ancestor of NumPy, broadcasting was implemented in several
+lines of code buried deep in ``ufuncobject.c``. In NumPy, the notion of
+broadcasting has been abstracted so that it can be performed in multiple places.
+Broadcasting is handled by the function :c:func:`PyArray_Broadcast`. This
+function requires a :c:type:`PyArrayMultiIterObject` (or something that is a
+binary equivalent) to be passed in. The :c:type:`PyArrayMultiIterObject` keeps
+track of the broadcast number of dimensions and size in each
+dimension along with the total size of the broadcast result. It also
+keeps track of the number of arrays being broadcast and a pointer to
+an iterator for each of the arrays being broadcast.
+
+The :c:func:`PyArray_Broadcast` function takes the iterators that have already
+been defined and uses them to determine the broadcast shape in each
+dimension (to create the iterators at the same time that broadcasting
+occurs then use the :c:func:`PyArray_MultiIterNew` function).
+Then, the iterators are
+adjusted so that each iterator thinks it is iterating over an array
+with the broadcast size. This is done by adjusting the iterators
+number of dimensions, and the :term:`shape` in each dimension. This works
+because the iterator strides are also adjusted. Broadcasting only
+adjusts (or adds) length-1 dimensions. For these dimensions, the
+strides variable is simply set to 0 so that the data-pointer for the
+iterator over that array doesn't move as the broadcasting operation
+operates over the extended dimension.
+
+Broadcasting was always implemented in Numeric using 0-valued strides
+for the extended dimensions. It is done in exactly the same way in
+NumPy. The big difference is that now the array of strides is kept
+track of in a :c:type:`PyArrayIterObject`, the iterators involved in a
+broadcast result are kept track of in a :c:type:`PyArrayMultiIterObject`,
+and the :c:func:`PyArray_Broadcast` call implements the
+:ref:`general-broadcasting-rules`.
+
+
+Array Scalars
+=============
+
+.. seealso:: :ref:`arrays.scalars`
+
+.. index::
+   single: array scalars
+
+The array scalars offer a hierarchy of Python types that allow a one-to-one
+correspondence between the datatype stored in an array and the
+Python-type that is returned when an element is extracted from the
+array. An exception to this rule was made with object arrays. Object
+arrays are heterogeneous collections of arbitrary Python objects. When
+you select an item from an object array, you get back the original
+Python object (and not an object array scalar which does exist but is
+rarely used for practical purposes).
+
+The array scalars also offer the same methods and attributes as arrays
+with the intent that the same code can be used to support arbitrary
+dimensions (including 0-dimensions). The array scalars are read-only
+(immutable) with the exception of the void scalar which can also be
+written to so that structured array field setting works more naturally
+(``a[0]['f1'] = value``).
+
+
+Indexing
+========
+
+.. seealso:: :ref:`basics.indexing`, :ref:`arrays.indexing`
+
+.. index::
+   single: indexing
+
+All Python indexing operations ``arr[index]`` are organized by first preparing
+the index and finding the index type. The supported index types are:
+
+* integer
+* :const:`newaxis`
+* :term:`python:slice`
+* :py:data:`Ellipsis`
+* integer arrays/array-likes (advanced)
+* boolean (single boolean array); if there is more than one boolean array as
+  the index or the shape does not match exactly, the boolean array will be
+  converted to an integer array instead.
+* 0-d boolean (and also integer); 0-d boolean arrays are a special
+  case that has to be handled in the advanced indexing code. They signal
+  that a 0-d boolean array had to be interpreted as an integer array.
+
+As well as the scalar array special case signaling that an integer array
+was interpreted as an integer index, which is important because an integer
+array index forces a copy but is ignored if a scalar is returned (full integer
+index). The prepared index is guaranteed to be valid with the exception of
+out of bound values and broadcasting errors for advanced indexing. This
+includes that an :py:data:`Ellipsis` is added for incomplete indices for
+example when a two-dimensional array is indexed with a single integer.
+
+The next step depends on the type of index which was found. If all
+dimensions are indexed with an integer a scalar is returned or set. A
+single boolean indexing array will call specialized boolean functions.
+Indices containing an :py:data:`Ellipsis` or :term:`python:slice` but no
+advanced indexing will always create a view into the old array by calculating
+the new strides and memory offset.  This view can then either be returned or,
+for assignments, filled using ``PyArray_CopyObject``. Note that
+``PyArray_CopyObject`` may also be called on temporary arrays in other branches
+to support complicated assignments when the array is of object :class:`dtype`.
+
+Advanced indexing
+-----------------
+
+By far the most complex case is advanced indexing, which may or may not be
+combined with typical view-based indexing. Here integer indices are
+interpreted as view-based. Before trying to understand this, you may want
+to make yourself familiar with its subtleties. The advanced indexing code
+has three different branches and one special case:
+
+* There is one indexing array and it, as well as the assignment array, can
+  be iterated trivially. For example, they may be contiguous. Also, the
+  indexing array must be of :class:`intp` type and the value array in
+  assignments should be of the correct type. This is purely a fast path.
+* There are only integer array indices so that no subarray exists.
+* View-based and advanced indexing is mixed. In this case, the view-based
+  indexing defines a collection of subarrays that are combined by the
+  advanced indexing. For example, ``arr[[1, 2, 3], :]`` is created by
+  vertically stacking the subarrays ``arr[1, :]``, ``arr[2, :]``, and
+  ``arr[3, :]``.
+* There is a subarray but it has exactly one element. This case can be handled
+  as if there is no subarray but needs some care during setup.
+
+Deciding what case applies, checking broadcasting, and determining the kind
+of transposition needed are all done in :c:func:`PyArray_MapIterNew`. After
+setting up, there are two cases. If there is no subarray or it only has one
+element, no subarray iteration is necessary and an iterator is prepared
+which iterates all indexing arrays *as well as* the result or value array.
+If there is a subarray, there are three iterators prepared. One for the
+indexing arrays, one for the result or value array (minus its subarray),
+and one for the subarrays of the original and the result/assignment array.
+The first two iterators give (or allow calculation) of the pointers into
+the start of the subarray, which then allows restarting the subarray
+iteration.
+
+When advanced indices are next to each other transposing may be necessary.
+All necessary transposing is handled by :c:func:`PyArray_MapIterSwapAxes` and
+has to be handled by the caller unless :c:func:`PyArray_MapIterNew` is asked to
+allocate the result.
+
+After preparation, getting and setting are relatively straightforward,
+although the different modes of iteration need to be considered. Unless
+there is only a single indexing array during item getting, the validity of
+the indices is checked beforehand. Otherwise, it is handled in the inner
+loop itself for optimization.
+
+.. _ufuncs-internals:
+
+Universal functions
+===================
+
+.. seealso:: :ref:`ufuncs`, :ref:`ufuncs-basics`
+
+.. index::
+   single: ufunc
+
+Universal functions are callable objects that take :math:`N` inputs
+and produce :math:`M` outputs by wrapping basic 1-D loops that work
+element-by-element into full easy-to-use functions that seamlessly
+implement :ref:`broadcasting <basics.broadcasting>`,
+:ref:`type-checking <ufuncs.casting>`,
+:ref:`buffered coercion <use-of-internal-buffers>`, and
+:ref:`output-argument handling <ufuncs-output-type>`. New universal functions
+are normally created in C, although there is a mechanism for creating ufuncs
+from Python functions (:func:`frompyfunc`). The user must supply a 1-D loop that
+implements the basic function taking the input scalar values and
+placing the resulting scalars into the appropriate output slots as
+explained in implementation.
+
+
+Setup
+-----
+
+Every :class:`ufunc` calculation involves some overhead related to setting up
+the calculation. The practical significance of this overhead is that
+even though the actual calculation of the ufunc is very fast, you will
+be able to write array and type-specific code that will work faster
+for small arrays than the ufunc. In particular, using ufuncs to
+perform many calculations on 0-D arrays will be slower than other
+Python-based solutions (the silently-imported ``scalarmath`` module exists
+precisely to give array scalars the look-and-feel of ufunc based
+calculations with significantly reduced overhead).
+
+When a :class:`ufunc` is called, many things must be done. The information
+collected from these setup operations is stored in a loop object. This
+loop object is a C-structure (that could become a Python object but is
+not initialized as such because it is only used internally). This loop
+object has the layout needed to be used with :c:func:`PyArray_Broadcast`
+so that the broadcasting can be handled in the same way as it is handled in
+other sections of code.
+
+The first thing done is to look up in the thread-specific global
+dictionary the current values for the buffer-size, the error mask, and
+the associated error object. The state of the error mask controls what
+happens when an error condition is found. It should be noted that
+checking of the hardware error flags is only performed after each 1-D
+loop is executed. This means that if the input and output arrays are
+contiguous and of the correct type so that a single 1-D loop is
+performed, then the flags may not be checked until all elements of the
+array have been calculated. Looking up these values in a thread-specific
+dictionary takes time which is easily ignored for all but
+very small arrays.
+
+After checking, the thread-specific global variables, the inputs are
+evaluated to determine how the ufunc should proceed and the input and
+output arrays are constructed if necessary. Any inputs which are not
+arrays are converted to arrays (using context if necessary). Which of
+the inputs are scalars (and therefore converted to 0-D arrays) is
+noted.
+
+Next, an appropriate 1-D loop is selected from the 1-D loops available
+to the :class:`ufunc` based on the input array types. This 1-D loop is selected
+by trying to match the signature of the datatypes of the inputs
+against the available signatures. The signatures corresponding to
+built-in types are stored in the :attr:`ufunc.types` member of the ufunc
+structure. The signatures corresponding to user-defined types are stored in a
+linked list of function information with the head element stored as a
+``CObject`` in the ``userloops`` dictionary keyed by the datatype number
+(the first user-defined type in the argument list is used as the key).
+The signatures are searched until a signature is found to which the
+input arrays can all be cast safely (ignoring any scalar arguments
+which are not allowed to determine the type of the result). The
+implication of this search procedure is that "lesser types" should be
+placed below "larger types" when the signatures are stored. If no 1-D
+loop is found, then an error is reported. Otherwise, the ``argument_list``
+is updated with the stored signature --- in case casting is necessary
+and to fix the output types assumed by the 1-D loop.
+
+If the ufunc has 2 inputs and 1 output and the second input is an
+``Object`` array then a special-case check is performed so that
+``NotImplemented`` is returned if the second input is not an ndarray, has
+the :obj:`~numpy.class.__array_priority__` attribute, and has an ``__r{op}__``
+special method. In this way, Python is signaled to give the other object a
+chance to complete the operation instead of using generic object-array
+calculations. This allows (for example) sparse matrices to override
+the multiplication operator 1-D loop.
+
+For input arrays that are smaller than the specified buffer size,
+copies are made of all non-contiguous, misaligned, or out-of-byteorder
+arrays to ensure that for small arrays, a single loop is
+used. Then, array iterators are created for all the input arrays and
+the resulting collection of iterators is broadcast to a single shape.
+
+The output arguments (if any) are then processed and any missing
+return arrays are constructed. If any provided output array doesn't
+have the correct type (or is misaligned) and is smaller than the
+buffer size, then a new output array is constructed with the special
+:c:data:`NPY_ARRAY_WRITEBACKIFCOPY` flag set. At the end of the function,
+:c:func:`PyArray_ResolveWritebackIfCopy` is called so that 
+its contents will be copied back into the output array.
+Iterators for the output arguments are then processed.
+
+Finally, the decision is made about how to execute the looping
+mechanism to ensure that all elements of the input arrays are combined
+to produce the output arrays of the correct type. The options for loop
+execution are one-loop (for :term`contiguous`, aligned, and correct data
+type), strided-loop (for non-contiguous but still aligned and correct
+data type), and a buffered loop (for misaligned or incorrect data
+type situations). Depending on which execution method is called for,
+the loop is then set up and computed.
+
+
+Function call
+-------------
+
+This section describes how the basic universal function computation loop is
+set up and executed for each of the three different kinds of execution. If
+:c:data:`NPY_ALLOW_THREADS` is defined during compilation, then as long as
+no object arrays are involved, the Python Global Interpreter Lock (GIL) is
+released prior to calling the loops.  It is re-acquired if necessary to
+handle error conditions. The hardware error flags are checked only after
+the 1-D loop is completed.
+
+
+One loop
+^^^^^^^^
+
+This is the simplest case of all. The ufunc is executed by calling the
+underlying 1-D loop exactly once. This is possible only when we have
+aligned data of the correct type (including byteorder) for both input
+and output and all arrays have uniform strides (either :term:`contiguous`,
+0-D, or 1-D). In this case, the 1-D computational loop is called once
+to compute the calculation for the entire array. Note that the
+hardware error flags are only checked after the entire calculation is
+complete.
+
+
+Strided loop
+^^^^^^^^^^^^
+
+When the input and output arrays are aligned and of the correct type,
+but the striding is not uniform (non-contiguous and 2-D or larger),
+then a second looping structure is employed for the calculation. This
+approach converts all of the iterators for the input and output
+arguments to iterate over all but the largest dimension. The inner
+loop is then handled by the underlying 1-D computational loop. The
+outer loop is a standard iterator loop on the converted iterators. The
+hardware error flags are checked after each 1-D loop is completed.
+
+
+Buffered loop
+^^^^^^^^^^^^^
+
+This is the code that handles the situation whenever the input and/or
+output arrays are either misaligned or of the wrong datatype
+(including being byteswapped) from what the underlying 1-D loop
+expects. The arrays are also assumed to be non-contiguous. The code
+works very much like the strided-loop except for the inner 1-D loop is
+modified so that pre-processing is performed on the inputs and post-processing
+is performed on the outputs in ``bufsize`` chunks (where
+``bufsize`` is a user-settable parameter). The underlying 1-D
+computational loop is called on data that is copied over (if it needs
+to be). The setup code and the loop code is considerably more
+complicated in this case because it has to handle:
+
+- memory allocation of the temporary buffers
+
+- deciding whether or not to use buffers on the input and output data
+  (misaligned and/or wrong datatype)
+
+- copying and possibly casting data for any inputs or outputs for which
+  buffers are necessary.
+
+- special-casing ``Object`` arrays so that reference counts are properly
+  handled when copies and/or casts are necessary.
+
+- breaking up the inner 1-D loop into ``bufsize`` chunks (with a possible
+  remainder).
+
+Again, the hardware error flags are checked at the end of each 1-D
+loop.
+
+
+Final output manipulation
+-------------------------
+
+Ufuncs allow other array-like classes to be passed seamlessly through
+the interface in that inputs of a particular class will induce the
+outputs to be of that same class. The mechanism by which this works is
+the following. If any of the inputs are not ndarrays and define the
+:obj:`~numpy.class.__array_wrap__` method, then the class with the largest
+:obj:`~numpy.class.__array_priority__` attribute determines the type of all the
+outputs (with the exception of any output arrays passed in). The
+:obj:`~numpy.class.__array_wrap__` method of the input array will be called
+with the ndarray being returned from the ufunc as its input. There are two
+calling styles of the :obj:`~numpy.class.__array_wrap__` function supported.
+The first takes the ndarray as the first argument and a tuple of "context" as
+the second argument. The context is (ufunc, arguments, output argument
+number). This is the first call tried. If a ``TypeError`` occurs, then the
+function is called with just the ndarray as the first argument.
+
+
+Methods
+-------
+
+There are three methods of ufuncs that require calculation similar to
+the general-purpose ufuncs. These are :meth:`ufunc.reduce`,
+:meth:`ufunc.accumulate`, and :meth:`ufunc.reduceat`. Each of these
+methods requires a setup command followed by a
+loop. There are four loop styles possible for the methods
+corresponding to no-elements, one-element, strided-loop, and buffered-loop.
+These are the same basic loop styles as implemented for the
+general-purpose function call except for the no-element and one-element
+cases which are special-cases occurring when the input array
+objects have 0 and 1 elements respectively.
+
+
+Setup
+^^^^^
+
+The setup function for all three methods is ``construct_reduce``.
+This function creates a reducing loop object and fills it with the
+parameters needed to complete the loop. All of the methods only work
+on ufuncs that take 2-inputs and return 1 output. Therefore, the
+underlying 1-D loop is selected assuming a signature of ``[otype,
+otype, otype]`` where ``otype`` is the requested reduction
+datatype. The buffer size and error handling are then retrieved from
+(per-thread) global storage. For small arrays that are misaligned or
+have incorrect datatype, a copy is made so that the un-buffered
+section of code is used. Then, the looping strategy is selected. If
+there is 1 element or 0 elements in the array, then a simple looping
+method is selected. If the array is not misaligned and has the
+correct datatype, then strided looping is selected. Otherwise,
+buffered looping must be performed. Looping parameters are then
+established, and the return array is constructed.  The output array is
+of a different :term:`shape` depending on whether the method is
+:meth:`reduce <ufunc.reduce>`, :meth:`accumulate <ufunc.accumulate>`, or
+:meth:`reduceat <ufunc.reduceat>`. If an output array is already provided, then
+its shape is checked. If the output array is not C-contiguous,
+aligned, and of the correct data type, then a temporary copy is made
+with the :c:data:`NPY_ARRAY_WRITEBACKIFCOPY` flag set. In this way, the methods
+will be able to work with a well-behaved output array but the result will be
+copied back into the true output array when
+:c:func:`PyArray_ResolveWritebackIfCopy` is called at function completion.
+Finally, iterators are set up to loop over the correct :term:`axis`
+(depending on the value of axis provided to the method) and the setup
+routine returns to the actual computation routine.
+
+
+:meth:`Reduce <ufunc.reduce>` 
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. index::
+   triple: ufunc; methods; reduce
+
+All of the ufunc methods use the same underlying 1-D computational
+loops with input and output arguments adjusted so that the appropriate
+reduction takes place. For example, the key to the functioning of
+:meth:`reduce <ufunc.reduce>` is that the 1-D loop is called with the output
+and the second input pointing to the same position in memory and both having
+a step-size of 0. The first input is pointing to the input array with a
+step-size given by the appropriate stride for the selected axis. In this
+way, the operation performed is
+
+.. math::
+   :nowrap:
+
+   \begin{align*}
+   o & = & i[0] \\
+   o & = & i[k]\textrm{<op>}o\quad k=1\ldots N
+   \end{align*}
+
+where :math:`N+1` is the number of elements in the input, :math:`i`,
+:math:`o` is the output, and :math:`i[k]` is the
+:math:`k^{\textrm{th}}` element of :math:`i` along the selected axis.
+This basic operation is repeated for arrays with greater than 1
+dimension so that the reduction takes place for every 1-D sub-array
+along the selected axis. An iterator with the selected dimension
+removed handles this looping.
+
+For buffered loops, care must be taken to copy and cast data before
+the loop function is called because the underlying loop expects
+aligned data of the correct datatype (including byteorder). The
+buffered loop must handle this copying and casting prior to calling
+the loop function on chunks no greater than the user-specified
+``bufsize``.
+
+
+:meth:`Accumulate <ufunc.accumulate>`
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. index::
+   triple: ufunc; methods; accumulate
+
+The :meth:`accumulate <ufunc.accumulate>` method is very similar to
+the :meth:`reduce <ufunc.reduce>` method in that
+the output and the second input both point to the output. The
+difference is that the second input points to memory one stride behind
+the current output pointer. Thus, the operation performed is
+
+.. math::
+   :nowrap:
+
+   \begin{align*}
+   o[0] & = & i[0] \\
+   o[k] & = & i[k]\textrm{<op>}o[k-1]\quad k=1\ldots N.
+   \end{align*}
+
+The output has the same shape as the input and each 1-D loop operates
+over :math:`N` elements when the shape in the selected axis is :math:`N+1`.
+Again, buffered loops take care to copy and cast the data before
+calling the underlying 1-D computational loop.
+
+
+:meth:`Reduceat <ufunc.reduceat>`
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. index::
+   triple: ufunc; methods; reduceat
+   single: ufunc
+
+The :meth:`reduceat <ufunc.reduceat>` function is a generalization of both the
+:meth:`reduce <ufunc.reduce>` and :meth:`accumulate <ufunc.accumulate>`
+functions. It implements a :meth:`reduce <ufunc.reduce>` over ranges of
+the input array specified by indices. The extra indices argument is checked to
+be sure that every input is not too large for the input array along
+the selected dimension before the loop calculations take place. The
+loop implementation is handled using code that is very similar to the
+:meth:`reduce <ufunc.reduce>` code repeated as many times as there are elements
+in the indices input. In particular: the first input pointer passed to the
+underlying 1-D computational loop points to the input array at the
+correct location indicated by the index array. In addition, the output
+pointer and the second input pointer passed to the underlying 1-D loop
+point to the same position in memory. The size of the 1-D
+computational loop is fixed to be the difference between the current
+index and the next index (when the current index is the last index,
+then the next index is assumed to be the length of the array along the
+selected dimension). In this way, the 1-D loop will implement a
+:meth:`reduce <ufunc.reduce>` over the specified indices.
+
+Misaligned or a loop datatype that does not match the input and/or
+output datatype is handled using buffered code wherein data is
+copied to a temporary buffer and cast to the correct datatype if
+necessary prior to calling the underlying 1-D function. The temporary
+buffers are created in (element) sizes no bigger than the user
+settable buffer-size value. Thus, the loop must be flexible enough to
+call the underlying 1-D computational loop enough times to complete
+the total calculation in chunks no bigger than the buffer-size.
diff --git a/doc/source/dev/internals.rst b/doc/source/dev/internals.rst
new file mode 100644 (file)
index 0000000..14e5f31
--- /dev/null
@@ -0,0 +1,175 @@
+.. currentmodule:: numpy
+
+.. _numpy-internals:
+
+*************************************
+Internal organization of NumPy arrays
+*************************************
+
+It helps to understand a bit about how NumPy arrays are handled under the covers
+to help understand NumPy better. This section will not go into great detail.
+Those wishing to understand the full details are requested to refer to Travis
+Oliphant's book `Guide to NumPy <http://web.mit.edu/dvp/Public/numpybook.pdf>`_.
+
+NumPy arrays consist of two major components: the raw array data (from now on,
+referred to as the data buffer), and the information about the raw array data.
+The data buffer is typically what people think of as arrays in C or Fortran,
+a :term:`contiguous` (and fixed) block of memory containing fixed-sized data
+items. NumPy also contains a significant set of data that describes how to
+interpret the data in the data buffer. This extra information contains (among
+other things):
+
+ 1) The basic data element's size in bytes.
+ 2) The start of the data within the data buffer (an offset relative to the
+    beginning of the data buffer).
+ 3) The number of :term:`dimensions <dimension>` and the size of each dimension.
+ 4) The separation between elements for each dimension (the :term:`stride`).
+    This does not have to be a multiple of the element size.
+ 5) The byte order of the data (which may not be the native byte order).
+ 6) Whether the buffer is read-only.
+ 7) Information (via the :class:`dtype` object) about the interpretation of the
+    basic data element. The basic data element may be as simple as an int or a
+    float, or it may be a compound object (e.g.,
+    :term:`struct-like <structured data type>`), a fixed character field,
+    or Python object pointers.
+ 8) Whether the array is to be interpreted as :term:`C-order <C order>`
+    or :term:`Fortran-order <Fortran order>`.
+
+This arrangement allows for the very flexible use of arrays. One thing that it
+allows is simple changes to the metadata to change the interpretation of the
+array buffer. Changing the byteorder of the array is a simple change involving
+no rearrangement of the data. The :term:`shape` of the array can be changed very
+easily without changing anything in the data buffer or any data copying at all.
+
+Among other things that are made possible is one can create a new array metadata
+object that uses the same data buffer
+to create a new :term:`view` of that data buffer that has a different
+interpretation of the buffer (e.g., different shape, offset, byte order,
+strides, etc) but shares the same data bytes. Many operations in NumPy do just
+this such as :term:`slicing <python:slice>`. Other operations, such as
+transpose, don't move data elements around in the array, but rather change the
+information about the shape and strides so that the indexing of the array
+changes, but the data in the doesn't move.
+
+Typically these new versions of the array metadata but the same data buffer are
+new views into the data buffer. There is a different :class:`ndarray` object,
+but it uses the same data buffer. This is why it is necessary to force copies
+through the use of the :func:`copy` method if one really wants to make a new
+and independent copy of the data buffer.
+
+New views into arrays mean the object reference counts for the data buffer
+increase. Simply doing away with the original array object will not remove the
+data buffer if other views of it still exist.
+
+Multidimensional array indexing order issues
+============================================
+
+.. seealso:: :ref:`basics.indexing`
+
+What is the right way to index
+multi-dimensional arrays? Before you jump to conclusions about the one and
+true way to index multi-dimensional arrays, it pays to understand why this is
+a confusing issue. This section will try to explain in detail how NumPy
+indexing works and why we adopt the convention we do for images, and when it
+may be appropriate to adopt other conventions.
+
+The first thing to understand is
+that there are two conflicting conventions for indexing 2-dimensional arrays.
+Matrix notation uses the first index to indicate which row is being selected and
+the second index to indicate which column is selected. This is opposite the
+geometrically oriented-convention for images where people generally think the
+first index represents x position (i.e., column) and the second represents y
+position (i.e., row). This alone is the source of much confusion;
+matrix-oriented users and image-oriented users expect two different things with
+regard to indexing.
+
+The second issue to understand is how indices correspond
+to the order in which the array is stored in memory. In Fortran, the first index
+is the most rapidly varying index when moving through the elements of a
+two-dimensional array as it is stored in memory. If you adopt the matrix
+convention for indexing, then this means the matrix is stored one column at a
+time (since the first index moves to the next row as it changes). Thus Fortran
+is considered a Column-major language. C has just the opposite convention. In
+C, the last index changes most rapidly as one moves through the array as
+stored in memory. Thus C is a Row-major language. The matrix is stored by
+rows. Note that in both cases it presumes that the matrix convention for
+indexing is being used, i.e., for both Fortran and C, the first index is the
+row. Note this convention implies that the indexing convention is invariant
+and that the data order changes to keep that so.
+
+But that's not the only way
+to look at it. Suppose one has large two-dimensional arrays (images or
+matrices) stored in data files. Suppose the data are stored by rows rather than
+by columns. If we are to preserve our index convention (whether matrix or
+image) that means that depending on the language we use, we may be forced to
+reorder the data if it is read into memory to preserve our indexing
+convention. For example, if we read row-ordered data into memory without
+reordering, it will match the matrix indexing convention for C, but not for
+Fortran. Conversely, it will match the image indexing convention for Fortran,
+but not for C. For C, if one is using data stored in row order, and one wants
+to preserve the image index convention, the data must be reordered when
+reading into memory.
+
+In the end, what you do for Fortran or C depends on
+which is more important, not reordering data or preserving the indexing
+convention. For large images, reordering data is potentially expensive, and
+often the indexing convention is inverted to avoid that.
+
+The situation with
+NumPy makes this issue yet more complicated. The internal machinery of NumPy
+arrays is flexible enough to accept any ordering of indices. One can simply
+reorder indices by manipulating the internal :term:`stride` information for
+arrays without reordering the data at all. NumPy will know how to map the new
+index order to the data without moving the data.
+
+So if this is true, why not choose
+the index order that matches what you most expect? In particular, why not define
+row-ordered images to use the image convention? (This is sometimes referred
+to as the Fortran convention vs the C convention, thus the 'C' and 'FORTRAN'
+order options for array ordering in NumPy.) The drawback of doing this is
+potential performance penalties. It's common to access the data sequentially,
+either implicitly in array operations or explicitly by looping over rows of an
+image. When that is done, then the data will be accessed in non-optimal order.
+As the first index is incremented, what is actually happening is that elements
+spaced far apart in memory are being sequentially accessed, with usually poor
+memory access speeds. For example, for a two-dimensional image ``im`` defined so
+that ``im[0, 10]`` represents the value at ``x = 0``, ``y = 10``. To be
+consistent with usual Python behavior then ``im[0]`` would represent a column
+at ``x = 0``. Yet that data would be spread over the whole array since the data
+are stored in row order. Despite the flexibility of NumPy's indexing, it can't
+really paper over the fact basic operations are rendered inefficient because of
+data order or that getting contiguous subarrays is still awkward (e.g.,
+``im[:, 0]`` for the first row, vs ``im[0]``). Thus one can't use an idiom such
+as for row in ``im``; for col in ``im`` does work, but doesn't yield contiguous
+column data.
+
+As it turns out, NumPy is
+smart enough when dealing with :ref:`ufuncs <ufuncs-internals>` to determine
+which index is the most rapidly varying one in memory and uses that for the
+innermost loop. Thus for ufuncs, there is no large intrinsic advantage to
+either approach in most cases. On the other hand, use of :attr:`ndarray.flat`
+with a FORTRAN ordered array will lead to non-optimal memory access as adjacent
+elements in the flattened array (iterator, actually) are not contiguous in
+memory.
+
+Indeed, the fact is that Python
+indexing on lists and other sequences naturally leads to an outside-to-inside
+ordering (the first index gets the largest grouping, the next largest,
+and the last gets the smallest element). Since image data are normally stored
+in rows, this corresponds to the position within rows being the last item
+indexed.
+
+If you do want to use Fortran ordering realize that
+there are two approaches to consider: 1) accept that the first index is just not
+the most rapidly changing in memory and have all your I/O routines reorder
+your data when going from memory to disk or visa versa, or use NumPy's
+mechanism for mapping the first index to the most rapidly varying data. We
+recommend the former if possible. The disadvantage of the latter is that many
+of NumPy's functions will yield arrays without Fortran ordering unless you are
+careful to use the ``order`` keyword. Doing this would be highly inconvenient.
+
+Otherwise, we recommend simply learning to reverse the usual order of indices
+when accessing elements of an array. Granted, it goes against the grain, but
+it is more in line with Python semantics and the natural order of the data.
+
+
index 4dae48689bd2c57c123872fa416d16671dfa0f50..c0f37fd5b4934639bcc7efd5237151362f0f7fe4 100644 (file)
@@ -4,4 +4,12 @@
 Under-the-hood Documentation for developers
 ===========================================
 
-To be completed.
+These documents are intended as a low-level look into NumPy; focused
+towards developers.
+
+.. toctree::
+   :maxdepth: 1
+
+   internals
+   internals.code-explanations
+   alignment
diff --git a/doc/source/doc_conventions.rst b/doc/source/doc_conventions.rst
deleted file mode 100644 (file)
index e2bc419..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-.. _documentation_conventions:
-
-##############################################################################
-Documentation conventions
-##############################################################################
-
-- Names that look like :func:`numpy.array` are links to detailed
-  documentation.
-
-- Examples often include the Python prompt ``>>>``. This is not part of the
-  code and will cause an error if typed or pasted into the Python
-  shell. It can be safely typed or pasted into the IPython shell; the ``>>>``
-  is ignored.
-
-- Examples often use ``np`` as an alias for ``numpy``; that is, they assume
-  you've run::
-
-      >>> import numpy as np
-
-- If you're a code contributor writing a docstring, see :ref:`docstring_intro`.
-
-- If you're a writer contributing ordinary (non-docstring) documentation, see
-  :ref:`userdoc_guide`.
diff --git a/doc/source/docs/howto_build_docs.rst b/doc/source/docs/howto_build_docs.rst
deleted file mode 100644 (file)
index 38ea133..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-.. _howto-build-docs:
-
-=========================================
-Building the NumPy API and reference docs
-=========================================
-
-We currently use Sphinx_ for generating the API and reference
-documentation for NumPy.  You will need Sphinx >= 2.2.0.
-
-If you only want to get the documentation, note that pre-built
-versions can be found at
-
-    https://numpy.org/doc/
-
-in several different formats.
-
-.. _Sphinx: http://www.sphinx-doc.org/
-
-
-Instructions
-------------
-
-If you obtained NumPy via git, get also the git submodules that contain
-additional parts required for building the documentation::
-
-    git submodule update --init
-
-In addition, building the documentation requires the Sphinx extension
-`plot_directive`, which is shipped with Matplotlib_. This Sphinx extension can
-be installed by installing Matplotlib. You will also need Python>=3.6.
-
-Since large parts of the main documentation are obtained from numpy via
-``import numpy`` and examining the docstrings, you will need to first build
-NumPy, and install it so that the correct version is imported.
-
-After NumPy is installed, install SciPy since some of the plots in the random
-module require `scipy.special` to display properly.
-
-Note that you can eg. install NumPy to a temporary location and set
-the PYTHONPATH environment variable appropriately.
-Alternatively, if using Python virtual environments (via e.g. ``conda``,
-``virtualenv`` or the ``venv`` module), installing numpy into a
-new virtual environment is recommended.
-All of the necessary dependencies for building the NumPy docs can be installed
-with::
-
-    pip install -r doc_requirements.txt
-
-Now you are ready to generate the docs, so write::
-
-    cd doc
-    make html
-
-in the ``doc/`` directory. If all goes well, this will generate a
-``build/html`` subdirectory containing the built documentation. If you get
-a message about ``installed numpy != current repo git version``, you must
-either override the check by setting ``GITVER`` or re-install NumPy.
-
-If you have built numpy into a virtual environment and get an error
-that says ``numpy not found, cannot build documentation without...``,
-you need to override the makefile ``PYTHON`` variable at the command
-line, so instead of writing ``make  html`` write::
-
-    make PYTHON=python html
-    
-
-Note that building the documentation on Windows is currently not actively
-supported, though it should be possible. (See Sphinx_ documentation
-for more information.)
-
-To build the PDF documentation, do instead::
-
-   make latex
-   make -C build/latex all-pdf
-
-You will need to have Latex installed for this, inclusive of support for
-Greek letters.  For example, on Ubuntu xenial ``texlive-lang-greek`` and
-``cm-super`` are needed.  Also ``latexmk`` is needed on non-Windows systems.
-
-Instead of the above, you can also do::
-
-   make dist
-
-which will rebuild NumPy, install it to a temporary location, and
-build the documentation in all formats. This will most likely again
-only work on Unix platforms.
-
-The documentation for NumPy distributed at https://numpy.org/doc in html and
-pdf format is also built with ``make dist``.  See `HOWTO RELEASE`_ for details
-on how to update https://numpy.org/doc.
-
-.. _Matplotlib: https://matplotlib.org/
-.. _HOWTO RELEASE: https://github.com/numpy/numpy/blob/main/doc/HOWTO_RELEASE.rst.txt
-
-Sphinx extensions
------------------
-
-NumPy's documentation uses several custom extensions to Sphinx.  These
-are shipped in the ``sphinxext/`` directory (as git submodules, as discussed
-above), and are automatically enabled when building NumPy's documentation.
-
-If you want to make use of these extensions in third-party
-projects, they are available on PyPi_ as the numpydoc_ package.
-
-.. _PyPi: https://pypi.org/
-.. _numpydoc: https://python.org/pypi/numpydoc
diff --git a/doc/source/docs/howto_document.rst b/doc/source/docs/howto_document.rst
deleted file mode 100644 (file)
index ff726c6..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-.. _howto-document:
-
-
-A Guide to NumPy Documentation
-==============================
-
-.. _userdoc_guide:
-
-User documentation
-******************
-- In general, we follow the
-  `Google developer documentation style guide <https://developers.google.com/style>`_.
-
-- NumPy style governs cases where:
-
-      - Google has no guidance, or
-      - We prefer not to use the Google style
-
-  Our current rules:
-
-      - We pluralize *index* as *indices* rather than
-        `indexes <https://developers.google.com/style/word-list#letter-i>`_,
-        following the precedent of :func:`numpy.indices`.
-
-      - For consistency we also pluralize *matrix* as *matrices*.
-
-- Grammatical issues inadequately addressed by the NumPy or Google rules are
-  decided by the section on "Grammar and Usage" in the most recent edition of
-  the `Chicago Manual of Style
-  <https://en.wikipedia.org/wiki/The_Chicago_Manual_of_Style>`_.
-
-- We welcome being
-  `alerted <https://github.com/numpy/numpy/issues>`_ to cases
-  we should add to the NumPy style rules.
-
-
-
-.. _docstring_intro:
-
-Docstrings
-**********
-
-When using `Sphinx <http://www.sphinx-doc.org/>`__ in combination with the
-numpy conventions, you should use the ``numpydoc`` extension so that your
-docstrings will be handled correctly. For example, Sphinx will extract the
-``Parameters`` section from your docstring and convert it into a field
-list.  Using ``numpydoc`` will also avoid the reStructuredText errors produced
-by plain Sphinx when it encounters numpy docstring conventions like
-section headers (e.g. ``-------------``) that sphinx does not expect to
-find in docstrings.
-
-Some features described in this document require a recent version of
-``numpydoc``. For example, the **Yields** section was added in
-``numpydoc`` 0.6.
-
-It is available from:
-
-* `numpydoc on PyPI <https://pypi.python.org/pypi/numpydoc>`_
-* `numpydoc on GitHub <https://github.com/numpy/numpydoc/>`_
-
-Note that for documentation within numpy, it is not necessary to do
-``import numpy as np`` at the beginning of an example.  However, some
-sub-modules, such as ``fft``, are not imported by default, and you have to
-include them explicitly::
-
-  import numpy.fft
-
-after which you may use it::
-
-  np.fft.fft2(...)
-
-Please use the numpydoc `formatting standard`_ as shown in their example_
-
-.. _`formatting standard`: https://numpydoc.readthedocs.io/en/latest/format.html
-.. _example: https://numpydoc.readthedocs.io/en/latest/example.html
diff --git a/doc/source/docs/index.rst b/doc/source/docs/index.rst
deleted file mode 100644 (file)
index 7d8b1bc..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-.. _documentation:
-
-NumPy's Documentation
-=====================
-
-.. toctree::
-    :maxdepth: 2
-
-    howto_document
-    howto_build_docs
-    
diff --git a/doc/source/doxyfile b/doc/source/doxyfile
new file mode 100644 (file)
index 0000000..ea45b95
--- /dev/null
@@ -0,0 +1,340 @@
+# Doxyfile 1.8.18
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = NumPy
+PROJECT_NUMBER         =
+PROJECT_BRIEF          = "NumPy is the fundamental package for scientific computing in Python"
+PROJECT_LOGO           =
+OUTPUT_DIRECTORY       = @ROOT_DIR/doc/build/doxygen
+CREATE_SUBDIRS         = NO
+ALLOW_UNICODE_NAMES    = NO
+OUTPUT_LANGUAGE        = English
+OUTPUT_TEXT_DIRECTION  = None
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = YES
+STRIP_FROM_PATH        = @ROOT_DIR
+STRIP_FROM_INC_PATH    =
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = YES
+JAVADOC_BANNER         = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 4
+ALIASES                =
+ALIASES               += "rst=\verbatim embed:rst:leading-asterisk"
+ALIASES               += "endrst=\endverbatim"
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+OPTIMIZE_OUTPUT_SLICE  = NO
+EXTENSION_MAPPING      =
+MARKDOWN_SUPPORT       = YES
+TOC_INCLUDE_HEADINGS   = 5
+AUTOLINK_SUPPORT       = YES
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+GROUP_NESTED_COMPOUNDS = NO
+SUBGROUPING            = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS  = NO
+TYPEDEF_HIDES_STRUCT   = NO
+LOOKUP_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_PRIV_VIRTUAL   = NO
+EXTRACT_PACKAGE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+HIDE_COMPOUND_REFERENCE= NO
+SHOW_INCLUDE_FILES     = YES
+SHOW_GROUPED_MEMB_INC  = NO
+FORCE_LOCAL_INCLUDES   = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+STRICT_PROTO_MATCHING  = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       =
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = YES
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    =
+LAYOUT_FILE            =
+CITE_BIB_FILES         =
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = no
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_AS_ERROR          = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           =
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  =
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.h, *.hpp
+RECURSIVE              = YES
+EXCLUDE                =
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       =
+EXCLUDE_SYMBOLS        =
+EXAMPLE_PATH           =
+EXAMPLE_PATTERNS       =
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             =
+INPUT_FILTER           =
+FILTER_PATTERNS        =
+FILTER_SOURCE_FILES    = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+SOURCE_TOOLTIPS        = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+CLANG_ASSISTED_PARSING = NO
+CLANG_OPTIONS          =
+CLANG_DATABASE_PATH    =
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = YES
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          =
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            =
+HTML_FOOTER            =
+HTML_STYLESHEET        =
+HTML_EXTRA_STYLESHEET  =
+HTML_EXTRA_FILES       =
+HTML_COLORSTYLE_HUE    = 220
+HTML_COLORSTYLE_SAT    = 100
+HTML_COLORSTYLE_GAMMA  = 80
+HTML_TIMESTAMP         = NO
+HTML_DYNAMIC_MENUS     = YES
+HTML_DYNAMIC_SECTIONS  = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME  = Publisher
+GENERATE_HTMLHELP      = NO
+CHM_FILE               =
+HHC_LOCATION           =
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     =
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+GENERATE_QHP           = NO
+QCH_FILE               =
+QHP_NAMESPACE          = org.doxygen.Project
+QHP_VIRTUAL_FOLDER     = doc
+QHP_CUST_FILTER_NAME   =
+QHP_CUST_FILTER_ATTRS  =
+QHP_SECT_FILTER_ATTRS  =
+QHG_LOCATION           =
+GENERATE_ECLIPSEHELP   = NO
+ECLIPSE_DOC_ID         = org.doxygen.Project
+DISABLE_INDEX          = NO
+GENERATE_TREEVIEW      = NO
+ENUM_VALUES_PER_LINE   = 4
+TREEVIEW_WIDTH         = 250
+EXT_LINKS_IN_WINDOW    = NO
+HTML_FORMULA_FORMAT    = png
+FORMULA_FONTSIZE       = 10
+FORMULA_TRANSPARENT    = YES
+FORMULA_MACROFILE      =
+USE_MATHJAX            = NO
+MATHJAX_FORMAT         = HTML-CSS
+MATHJAX_RELPATH        = https://cdn.jsdelivr.net/npm/mathjax@@2
+MATHJAX_EXTENSIONS     =
+MATHJAX_CODEFILE       =
+SEARCHENGINE           = YES
+SERVER_BASED_SEARCH    = NO
+EXTERNAL_SEARCH        = NO
+SEARCHENGINE_URL       =
+SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
+EXTRA_SEARCH_MAPPINGS  =
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         =
+MAKEINDEX_CMD_NAME     = makeindex
+LATEX_MAKEINDEX_CMD    = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4
+EXTRA_PACKAGES         =
+LATEX_HEADER           =
+LATEX_FOOTER           =
+LATEX_EXTRA_STYLESHEET =
+LATEX_EXTRA_FILES      =
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+LATEX_SOURCE_CODE      = NO
+LATEX_BIB_STYLE        = plain
+LATEX_TIMESTAMP        = NO
+LATEX_EMOJI_DIRECTORY  =
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    =
+RTF_EXTENSIONS_FILE    =
+RTF_SOURCE_CODE        = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_SUBDIR             =
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = YES
+XML_OUTPUT             = xml
+XML_PROGRAMLISTING     = YES
+XML_NS_MEMB_FILE_SCOPE = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+DOCBOOK_PROGRAMLISTING = NO
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  =
+PREDEFINED             =
+EXPAND_AS_DEFINED      =
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+TAGFILES               =
+GENERATE_TAGFILE       =
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+EXTERNAL_PAGES         = YES
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+DIA_PATH               =
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = NO
+DOT_NUM_THREADS        = 0
+DOT_FONTNAME           = Helvetica
+DOT_FONTSIZE           = 10
+DOT_FONTPATH           =
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+UML_LIMIT_NUM_FIELDS   = 10
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
+INTERACTIVE_SVG        = NO
+DOT_PATH               =
+DOTFILE_DIRS           =
+MSCFILE_DIRS           =
+DIAFILE_DIRS           =
+PLANTUML_JAR_PATH      =
+PLANTUML_CFG_FILE      =
+PLANTUML_INCLUDE_PATH  =
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
index 1b4625dde9fcd925c65bd0b3b6f3d214fa393fa5..c8efbaadb426a2a1bf79f17bdd8f84f9a7285f2e 100644 (file)
@@ -1,48 +1,46 @@
-======================
-Advanced F2PY usages
-======================
+========================
+Advanced F2PY use cases
+========================
 
-Adding self-written functions to F2PY generated modules
-=======================================================
+Adding user-defined functions to F2PY generated modules
+=========================================================
 
-Self-written Python C/API functions can be defined inside
+User-defined Python C/API functions can be defined inside
 signature files using ``usercode`` and ``pymethoddef`` statements
 (they must be used inside the ``python module`` block). For
 example, the following signature file ``spam.pyf``
 
-.. include:: spam.pyf
+.. include:: ./code/spam.pyf
    :literal:
 
 wraps the C library function ``system()``::
 
   f2py -c spam.pyf
 
-In Python:
+In Python this can then be used as:
 
-.. include:: spam_session.dat
-   :literal:
-
-Modifying the dictionary of a F2PY generated module
-===================================================
+.. literalinclude:: ./code/results/spam_session.dat
+   :language: python
 
-The following example illustrates how to add user-defined
-variables to a F2PY generated extension module. Given the following
-signature file
+Adding user-defined variables
+==============================
 
-.. include:: var.pyf
-  :literal:
+The following example illustrates how to add user-defined variables to a F2PY
+generated extension module by modifying the dictionary of a F2PY generated
+module. Consider the following signature file (compiled with ``f2py -c var.pyf``):
 
-compile it as ``f2py -c var.pyf``.
+.. literalinclude:: ./code/var.pyf
+  :language: fortran
 
 Notice that the second ``usercode`` statement must be defined inside
-an ``interface`` block and where the module dictionary is available through
-the variable ``d`` (see ``f2py var.pyf``-generated ``varmodule.c`` for
+an ``interface`` block and the module dictionary is available through
+the variable ``d`` (see ``varmodule.c`` generated by ``f2py var.pyf`` for
 additional details).
 
-In Python:
+Usage in Python:
 
-.. include:: var_session.dat
-  :literal:
+.. literalinclude:: ./code/results/var_session.dat
+  :language: python
 
 
 Dealing with KIND specifiers
@@ -70,7 +68,7 @@ Use the ``--f2cmap`` command-line option to pass the file name to F2PY.
 By default, F2PY assumes file name is ``.f2py_f2cmap`` in the current
 working directory.
 
-Or more generally, the f2cmap file must contain a dictionary
+More generally, the f2cmap file must contain a dictionary
 with items::
 
     <Fortran typespec> : {<selector_expr>:<C type>}
@@ -79,7 +77,7 @@ that defines mapping between Fortran type::
 
     <Fortran typespec>([kind=]<selector_expr>)
 
-and the corresponding <C type>. <C type> can be one of the following::
+and the corresponding <C type>. The <C type> can be one of the following::
 
     char
     signed_char
@@ -94,4 +92,4 @@ and the corresponding <C type>. <C type> can be one of the following::
     complex_long_double
     string
 
-For more information, see F2Py source code ``numpy/f2py/capi_maps.py``.
+For more information, see the F2Py source code ``numpy/f2py/capi_maps.py``.
diff --git a/doc/source/f2py/allocarr.f90 b/doc/source/f2py/allocarr.f90
deleted file mode 100644 (file)
index e0d6c2e..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-module mod
-  real, allocatable, dimension(:,:) :: b 
-contains
-  subroutine foo
-    integer k
-    if (allocated(b)) then
-       print*, "b=["
-       do k = 1,size(b,1)
-          print*, b(k,1:size(b,2))
-       enddo
-       print*, "]"
-    else
-       print*, "b is not allocated"
-    endif
-  end subroutine foo
-end module mod
diff --git a/doc/source/f2py/allocarr_session.dat b/doc/source/f2py/allocarr_session.dat
deleted file mode 100644 (file)
index ba168c2..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
->>> import allocarr
->>> print(allocarr.mod.__doc__)
-b : 'f'-array(-1,-1), not allocated
-foo()
-
-Wrapper for ``foo``.
-
-
-
->>> allocarr.mod.foo()  
- b is not allocated
->>> allocarr.mod.b = [[1, 2, 3], [4, 5, 6]]             # allocate/initialize b
->>> allocarr.mod.foo()
- b=[
-   1.000000       2.000000       3.000000    
-   4.000000       5.000000       6.000000    
- ]
->>> allocarr.mod.b                                      # b is Fortran-contiguous
-array([[ 1.,  2.,  3.],
-       [ 4.,  5.,  6.]], dtype=float32)
->>> allocarr.mod.b.flags.f_contiguous
-True
->>> allocarr.mod.b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]  # reallocate/initialize b
->>> allocarr.mod.foo()
- b=[
-   1.000000       2.000000       3.000000    
-   4.000000       5.000000       6.000000    
-   7.000000       8.000000       9.000000    
- ]
->>> allocarr.mod.b = None                               # deallocate array
->>> allocarr.mod.foo()
- b is not allocated
diff --git a/doc/source/f2py/array.f b/doc/source/f2py/array.f
deleted file mode 100644 (file)
index ef20c9c..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-C FILE: ARRAY.F
-      SUBROUTINE FOO(A,N,M)
-C
-C     INCREMENT THE FIRST ROW AND DECREMENT THE FIRST COLUMN OF A
-C
-      INTEGER N,M,I,J
-      REAL*8 A(N,M)
-Cf2py intent(in,out,copy) a
-Cf2py integer intent(hide),depend(a) :: n=shape(a,0), m=shape(a,1)
-      DO J=1,M
-         A(1,J) = A(1,J) + 1D0
-      ENDDO
-      DO I=1,N
-         A(I,1) = A(I,1) - 1D0
-      ENDDO
-      END
-C END OF FILE ARRAY.F
diff --git a/doc/source/f2py/array_session.dat b/doc/source/f2py/array_session.dat
deleted file mode 100644 (file)
index 714c036..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
->>> import arr
->>> from numpy import asfortranarray
->>> print(arr.foo.__doc__)
-a = foo(a,[overwrite_a])
-
-Wrapper for ``foo``.
-
-Parameters
-----------
-a : input rank-2 array('d') with bounds (n,m)
-
-Other Parameters
-----------------
-overwrite_a : input int, optional
-    Default: 0
-
-Returns
--------
-a : rank-2 array('d') with bounds (n,m)
-
->>> a = arr.foo([[1, 2, 3],
-...              [4, 5, 6]])
-created an array from object
->>> print(a)
-[[ 1.  3.  4.]
- [ 3.  5.  6.]]
->>> a.flags.c_contiguous
-False
->>> a.flags.f_contiguous
-True
-# even if a is proper-contiguous and has proper type,
-# a copy is made forced by intent(copy) attribute
-# to preserve its original contents
->>> b = arr.foo(a)
-copied an array: size=6, elsize=8
->>> print(a)
-[[ 1.  3.  4.]
- [ 3.  5.  6.]]
->>> print(b)
-[[ 1.  4.  5.]
- [ 2.  5.  6.]]
->>> b = arr.foo(a, overwrite_a = 1) # a is passed directly to Fortran
-...                                 # routine and its contents is discarded
-... 
->>> print(a)
-[[ 1.  4.  5.]
- [ 2.  5.  6.]]
->>> print(b)
-[[ 1.  4.  5.]
- [ 2.  5.  6.]]
->>> a is b                          # a and b are actually the same objects
-True
->>> print(arr.foo([1, 2, 3]))       # different rank arrays are allowed
-created an array from object
-[ 1.  1.  2.]
->>> print(arr.foo([[[1], [2], [3]]]))
-created an array from object
-[[[ 1.]
-  [ 1.]
-  [ 2.]]]
->>>
->>> # Creating arrays with column major data storage order:
- ...
->>> s = asfortranarray([[1, 2, 3], [4, 5, 6]])
->>> s.flags.f_contiguous
-True
->>> print(s)
-[[1 2 3]
- [4 5 6]]
->>> print(arr.foo(s))
->>> s2 = asfortranarray(s)
->>> s2 is s    # an array with column major storage order 
-               # is returned immediately
-True
->>> # Note that arr.foo returns a column major data storage order array:
- ...
->>> s3 = ascontiguousarray(s)
->>> s3.flags.f_contiguous
-False
->>> s3.flags.c_contiguous
-True
->>> s3 = arr.foo(s3)
-copied an array: size=6, elsize=8
->>> s3.flags.f_contiguous
-True
->>> s3.flags.c_contiguous
-False
diff --git a/doc/source/f2py/buildtools/cmake.rst b/doc/source/f2py/buildtools/cmake.rst
new file mode 100644 (file)
index 0000000..3ed5a2b
--- /dev/null
@@ -0,0 +1,60 @@
+.. _f2py-cmake:
+
+===================
+Using via ``cmake``
+===================
+
+In terms of complexity, ``cmake`` falls between ``make`` and ``meson``. The
+learning curve is steeper since CMake syntax is not pythonic and is closer to
+``make`` with environment variables.
+
+However, the trade-off is enhanced flexibility and support for most architectures
+and compilers. An introduction to the syntax is out of scope for this document,
+but this `extensive CMake collection`_ of resources is great.
+
+.. note::
+
+   ``cmake`` is very popular for mixed-language systems, however support for
+   ``f2py`` is not particularly native or pleasant; and a more natural approach
+   is to consider :ref:`f2py-skbuild`
+
+Fibonacci Walkthrough (F77)
+===========================
+
+Returning to the ``fib``  example from :ref:`f2py-getting-started` section.
+
+.. literalinclude:: ./../code/fib1.f
+    :language: fortran
+
+We do not need to explicitly generate the ``python -m numpy.f2py fib1.f``
+output, which is ``fib1module.c``, which is beneficial. With this; we can now
+initialize a ``CMakeLists.txt`` file as follows:
+
+.. literalinclude:: ./../code/CMakeLists.txt
+    :language: cmake
+
+A key element of the ``CMakeLists.txt`` file defined above is that the
+``add_custom_command`` is used to generate the wrapper ``C`` files and then
+added as a dependency of the actual shared library target via a
+``add_custom_target`` directive which prevents the command from running every
+time. Additionally, the method used for obtaining the ``fortranobject.c`` file
+can also be used to grab the ``numpy`` headers on older ``cmake`` versions.
+
+This then works in the same manner as the other modules, although the naming
+conventions are different and the output library is not automatically prefixed
+with the ``cython`` information.
+
+.. code:: bash
+
+    ls .
+    # CMakeLists.txt fib1.f
+    mkdir build && cd build
+    cmake ..
+    make
+    python -c "import numpy as np; import fibby; a = np.zeros(9); fibby.fib(a); print (a)"
+    # [ 0.  1.  1.  2.  3.  5.  8. 13. 21.]
+
+This is particularly useful where an existing toolchain already exists and
+``scikit-build`` or other additional ``python`` dependencies are discouraged.
+
+.. _extensive CMake collection: https://cliutils.gitlab.io/modern-cmake/
diff --git a/doc/source/f2py/buildtools/distutils.rst b/doc/source/f2py/buildtools/distutils.rst
new file mode 100644 (file)
index 0000000..9abeee8
--- /dev/null
@@ -0,0 +1,78 @@
+.. _f2py-distutils:
+
+=============================
+Using via `numpy.distutils`
+=============================
+
+.. currentmodule:: numpy.distutils.core
+
+:mod:`numpy.distutils` is part of NumPy, and extends the standard Python
+``distutils`` module to deal with Fortran sources and F2PY signature files, e.g.
+compile Fortran sources, call F2PY to construct extension modules, etc.
+
+.. topic:: Example
+
+  Consider the following ``setup_file.py`` for the ``fib`` and ``scalar``
+  examples from :ref:`f2py-getting-started` section:
+
+  .. literalinclude:: ./../code/setup_example.py
+    :language: python
+
+  Running
+
+  .. code-block:: bash
+
+    python setup_example.py build
+
+  will build two extension modules ``scalar`` and ``fib2`` to the
+  build directory.
+   
+Extensions to ``distutils``
+===========================
+
+:mod:`numpy.distutils` extends ``distutils`` with the following features:
+
+* :class:`Extension` class argument ``sources`` may contain Fortran source
+  files. In addition, the list ``sources`` may contain at most one
+  F2PY signature file, and in this case, the name of an Extension module must
+  match with the ``<modulename>`` used in signature file. It is
+  assumed that an F2PY signature file contains exactly one ``python
+  module`` block.
+
+  If ``sources`` do not contain a signature file, then F2PY is used to scan
+  Fortran source files to construct wrappers to the Fortran codes.
+
+  Additional options to the F2PY executable can be given using the
+  :class:`Extension` class argument ``f2py_options``.
+
+* The following new ``distutils`` commands are defined:
+
+  ``build_src``
+    to construct Fortran wrapper extension modules, among many other things.
+  ``config_fc``
+    to change Fortran compiler options.
+
+  Additionally, the ``build_ext`` and ``build_clib`` commands are also enhanced
+  to support Fortran sources.
+
+  Run
+
+  .. code-block:: bash
+
+    python <setup.py file> config_fc build_src build_ext --help
+
+  to see available options for these commands.
+
+* When building Python packages containing Fortran sources, one
+  can choose different Fortran compilers by using the ``build_ext``
+  command option ``--fcompiler=<Vendor>``. Here ``<Vendor>`` can be one of the
+  following names (on ``linux`` systems)::
+
+    absoft compaq fujitsu g95 gnu gnu95 intel intele intelem lahey nag nagfor nv pathf95 pg vast
+
+  See ``numpy_distutils/fcompiler.py`` for an up-to-date list of
+  supported compilers for different platforms, or run
+
+  .. code-block:: bash
+
+     python -m numpy.f2py -c --help-fcompiler
diff --git a/doc/source/f2py/buildtools/index.rst b/doc/source/f2py/buildtools/index.rst
new file mode 100644 (file)
index 0000000..aa41fd3
--- /dev/null
@@ -0,0 +1,102 @@
+.. _f2py-bldsys:
+
+=======================
+F2PY and Build Systems
+=======================
+
+In this section we will cover the various popular build systems and their usage
+with ``f2py``.
+
+.. note::
+   **As of November 2021**
+
+   The default build system for ``F2PY`` has traditionally been the through the
+   enhanced ``numpy.distutils`` module. This module is based on ``distutils`` which
+   will be removed in ``Python 3.12.0`` in **October 2023**; ``setuptools`` does not
+   have support for Fortran or ``F2PY`` and it is unclear if it will be supported
+   in the future. Alternative methods are thus increasingly more important.
+
+
+Basic Concepts
+===============
+
+Building an extension module which includes Python and Fortran consists of:
+
+- Fortran source(s)
+- One or more generated files from ``f2py``
+
+  + A ``C`` wrapper file is always created
+  + Code with modules require an additional ``.f90`` wrapper
+
+- ``fortranobject.{c,h}``
+
+  + Distributed with ``numpy``
+  + Can be queried via ``python -c "import numpy.f2py; print(numpy.f2py.get_include())"``
+
+- NumPy headers
+
+  + Can be queried via ``python -c "import numpy; print(numpy.get_include())"``
+
+- Python libraries and development headers
+
+Broadly speaking there are three cases which arise when considering the outputs of ``f2py``:
+
+Fortran 77 programs
+   - Input file ``blah.f``
+   - Generates
+
+     + ``blahmodule.c``
+     + ``f2pywrappers.f``
+
+   When no ``COMMON`` blocks are present only a ``C`` wrapper file is generated.
+   Wrappers are also generated to rewrite assumed shape arrays as automatic
+   arrays.
+
+Fortran 90 programs
+   - Input file ``blah.f90``
+   - Generates:
+
+     + ``blahmodule.c``
+     + ``blah-f2pywrappers2.f90``
+
+   The secondary wrapper is used to handle code which is subdivided into
+   modules. It rewrites assumed shape arrays as automatic arrays.
+
+Signature files
+   - Input file ``blah.pyf``
+   - Generates:
+
+     + ``blahmodule.c``
+     + ``blah-f2pywrappers2.f90`` (occasionally)
+     + ``f2pywrappers.f`` (occasionally)
+
+   Signature files ``.pyf`` do not signal their language standard via the file
+   extension, they may generate the F90 and F77 specific wrappers depending on
+   their contents; which shifts the burden of checking for generated files onto
+   the build system.
+
+.. note::
+
+   The signature file output situation is being reconsidered in `issue 20385`_ .
+
+
+In theory keeping the above requirements in hand, any build system can be
+adapted to generate ``f2py`` extension modules. Here we will cover a subset of
+the more popular systems.
+
+.. note::
+   ``make`` has no place in a modern multi-language setup, and so is not
+   discussed further.
+
+Build Systems
+==============
+
+.. toctree::
+   :maxdepth: 2
+
+   distutils
+   meson
+   cmake
+   skbuild
+
+.. _`issue 20385`: https://github.com/numpy/numpy/issues/20385
diff --git a/doc/source/f2py/buildtools/meson.rst b/doc/source/f2py/buildtools/meson.rst
new file mode 100644 (file)
index 0000000..d98752e
--- /dev/null
@@ -0,0 +1,114 @@
+.. _f2py-meson:
+
+===================
+Using via ``meson``
+===================
+
+The key advantage gained by leveraging ``meson`` over the techniques described
+in :ref:`f2py-distutils` is that this feeds into existing systems and larger
+projects with ease. ``meson`` has a rather pythonic syntax which makes it more
+comfortable and amenable to extension for ``python`` users.
+
+.. note::
+
+    Meson needs to be at-least ``0.46.0`` in order to resolve the ``python`` include directories.
+
+
+Fibonacci Walkthrough (F77)
+===========================
+
+
+We will need the generated ``C`` wrapper before we can use a general purpose
+build system like ``meson``. We will acquire this by:
+
+.. code-block:: bash
+
+    python -n numpy.f2py fib1.f -m fib2
+
+Now, consider the following ``meson.build`` file for the ``fib`` and ``scalar``
+examples from :ref:`f2py-getting-started` section:
+
+.. literalinclude:: ./../code/meson.build
+    :language: meson
+
+At this point the build will complete, but the import will fail:
+
+.. code-block:: bash
+
+   meson setup builddir
+   meson compile -C builddir
+   cd builddir
+   python -c 'import fib2'
+   Traceback (most recent call last):
+   File "<string>", line 1, in <module>
+   ImportError: fib2.cpython-39-x86_64-linux-gnu.so: undefined symbol: FIB_
+   # Check this isn't a false positive
+   nm -A fib2.cpython-39-x86_64-linux-gnu.so | grep FIB_
+   fib2.cpython-39-x86_64-linux-gnu.so: U FIB_
+
+Recall that the original example, as reproduced below, was in SCREAMCASE:
+
+.. literalinclude:: ./../code/fib1.f
+   :language: fortran
+
+With the standard approach, the subroutine exposed to ``python`` is ``fib`` and
+not ``FIB``. This means we have a few options. One approach (where possible) is
+to lowercase the original Fortran file with say:
+
+.. code-block:: bash
+
+   tr "[:upper:]" "[:lower:]" < fib1.f > fib1.f
+   python -n numpy.f2py fib1.f -m fib2
+   meson --wipe builddir
+   meson compile -C builddir
+   cd builddir
+   python -c 'import fib2'
+
+However this requires the ability to modify the source which is not always
+possible. The easiest way to solve this is to let ``f2py`` deal with it:
+
+.. code-block:: bash
+
+   python -n numpy.f2py fib1.f -m fib2 --lower
+   meson --wipe builddir
+   meson compile -C builddir
+   cd builddir
+   python -c 'import fib2'
+
+
+Automating wrapper generation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A major pain point in the workflow defined above, is the manual tracking of
+inputs. Although it would require more effort to figure out the actual outputs
+for reasons discussed in :ref:`f2py-bldsys`.
+
+However, we can augment our workflow in a straightforward to take into account
+files for which the outputs are known when the build system is set up.
+
+.. literalinclude:: ./../code/meson_upd.build
+    :language: meson
+
+This can be compiled and run as before.
+
+.. code-block:: bash
+
+    rm -rf builddir
+    meson setup builddir
+    meson compile -C builddir
+    cd builddir
+    python -c "import numpy as np; import fibby; a = np.zeros(9); fibby.fib(a); print (a)"
+    # [ 0.  1.  1.  2.  3.  5.  8. 13. 21.]
+
+Salient points
+===============
+
+It is worth keeping in mind the following:
+
+* ``meson`` will default to passing ``-fimplicit-none`` under ``gfortran`` by
+  default, which differs from that of the standard ``np.distutils`` behaviour
+
+* It is not possible to use SCREAMCASE in this context, so either the contents
+  of the ``.f`` file or the generated wrapper ``.c`` needs to be lowered to
+  regular letters; which can be facilitated by the ``--lower`` option of
+  ``F2PY``
diff --git a/doc/source/f2py/buildtools/skbuild.rst b/doc/source/f2py/buildtools/skbuild.rst
new file mode 100644 (file)
index 0000000..af18ea4
--- /dev/null
@@ -0,0 +1,94 @@
+.. _f2py-skbuild:
+
+============================
+Using via ``scikit-build``
+============================
+
+``scikit-build`` provides two separate concepts geared towards the users of Python extension modules.
+
+1. A ``setuptools`` replacement (legacy behaviour)
+2. A series of ``cmake`` modules with definitions which help building Python extensions
+
+.. note::
+
+   It is possible to use ``scikit-build``'s ``cmake`` modules to `bypass the
+   cmake setup mechanism`_ completely, and to write targets which call ``f2py
+   -c``. This usage is **not recommended** since the point of these build system
+   documents are to move away from the internal ``numpy.distutils`` methods.
+
+For situations where no ``setuptools`` replacements are required or wanted (i.e.
+if ``wheels`` are not needed), it is recommended to instead use the vanilla
+``cmake`` setup described in :ref:`f2py-cmake`.
+
+Fibonacci Walkthrough (F77)
+===========================
+
+We will consider the ``fib``  example from :ref:`f2py-getting-started` section.
+
+.. literalinclude:: ./../code/fib1.f
+    :language: fortran
+
+``CMake`` modules only
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Consider using the following ``CMakeLists.txt``.
+
+.. literalinclude:: ./../code/CMakeLists_skbuild.txt
+   :language: cmake
+
+Much of the logic is the same as in :ref:`f2py-cmake`, however notably here the
+appropriate module suffix is generated via ``sysconfig.get_config_var("SO")``.
+The resulting extension can be built and loaded in the standard workflow.
+
+.. code:: bash
+
+    ls .
+    # CMakeLists.txt fib1.f
+    mkdir build && cd build
+    cmake ..
+    make
+    python -c "import numpy as np; import fibby; a = np.zeros(9); fibby.fib(a); print (a)"
+    # [ 0.  1.  1.  2.  3.  5.  8. 13. 21.]
+
+
+``setuptools`` replacement
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. note::
+
+   **As of November 2021**
+
+   The behavior described here of driving the ``cmake`` build of a module is
+   considered to be legacy behaviour and should not be depended on.
+
+The utility of ``scikit-build`` lies in being able to drive the generation of
+more than extension modules, in particular a common usage pattern is the
+generation of Python distributables (for example for PyPI).
+
+The workflow with ``scikit-build`` straightforwardly supports such packaging requirements. Consider augmenting the project with a ``setup.py`` as defined:
+
+.. literalinclude:: ./../code/setup_skbuild.py
+   :language: python
+
+Along with a commensurate ``pyproject.toml``
+
+.. literalinclude:: ./../code/pyproj_skbuild.toml
+   :language: toml
+
+Together these can build the extension using ``cmake`` in tandem with other
+standard ``setuptools`` outputs. Running ``cmake`` through ``setup.py`` is
+mostly used when it is necessary to integrate with extension modules not built
+with ``cmake``.
+
+.. code:: bash
+
+    ls .
+    # CMakeLists.txt fib1.f pyproject.toml setup.py
+    python setup.py build_ext --inplace
+    python -c "import numpy as np; import fibby.fibby; a = np.zeros(9); fibby.fibby.fib(a); print (a)"
+    # [ 0.  1.  1.  2.  3.  5.  8. 13. 21.]
+
+Where we have modified the path to the module as ``--inplace`` places the
+extension module in a subfolder.
+
+.. _bypass the cmake setup mechanism: https://scikit-build.readthedocs.io/en/latest/cmake-modules/F2PY.html
diff --git a/doc/source/f2py/calculate.f b/doc/source/f2py/calculate.f
deleted file mode 100644 (file)
index 4ff570d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-      subroutine calculate(x,n)
-cf2py intent(callback) func
-      external func
-c     The following lines define the signature of func for F2PY:
-cf2py real*8 y
-cf2py y = func(y)
-c
-cf2py intent(in,out,copy) x
-      integer n,i
-      real*8 x(n), func
-      do i=1,n
-         x(i) = func(x(i))
-      end do
-      end
diff --git a/doc/source/f2py/calculate_session.dat b/doc/source/f2py/calculate_session.dat
deleted file mode 100644 (file)
index c4c3807..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
->>> import foo
->>> foo.calculate(range(5), lambda x: x*x)
-array([  0.,   1.,   4.,   9.,  16.])
->>> import math
->>> foo.calculate(range(5), math.exp)
-array([  1.        ,   2.71828183,   7.3890561,  20.08553692,  54.59815003])
diff --git a/doc/source/f2py/callback.f b/doc/source/f2py/callback.f
deleted file mode 100644 (file)
index d5cfc75..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-C FILE: CALLBACK.F
-      SUBROUTINE FOO(FUN,R)
-      EXTERNAL FUN
-      INTEGER I
-      REAL*8 R, FUN
-Cf2py intent(out) r
-      R = 0D0
-      DO I=-5,5
-         R = R + FUN(I)
-      ENDDO
-      END
-C END OF FILE CALLBACK.F
diff --git a/doc/source/f2py/callback2.pyf b/doc/source/f2py/callback2.pyf
deleted file mode 100644 (file)
index 3d77eed..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-!    -*- f90 -*-
-python module __user__routines 
-    interface
-        function fun(i) result (r)
-            integer :: i
-            real*8 :: r
-        end function fun
-    end interface
-end python module __user__routines
-
-python module callback2
-    interface
-        subroutine foo(f,r)
-            use __user__routines, f=>fun
-            external f
-            real*8 intent(out) :: r
-        end subroutine foo
-    end interface 
-end python module callback2
diff --git a/doc/source/f2py/callback_session.dat b/doc/source/f2py/callback_session.dat
deleted file mode 100644 (file)
index 460c9ce..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
->>> import callback
->>> print(callback.foo.__doc__)
-r = foo(fun,[fun_extra_args])
-
-Wrapper for ``foo``.
-
-Parameters
-----------
-fun : call-back function
-
-Other Parameters
-----------------
-fun_extra_args : input tuple, optional
-    Default: ()
-
-Returns
--------
-r : float
-
-Notes
------
-Call-back functions::
-
-  def fun(i): return r
-  Required arguments:
-    i : input int
-  Return objects:
-    r : float
-
->>> def f(i): return i*i
-... 
->>> print(callback.foo(f))
-110.0
->>> print(callback.foo(lambda i:1))
-11.0
diff --git a/doc/source/f2py/code/CMakeLists.txt b/doc/source/f2py/code/CMakeLists.txt
new file mode 100644 (file)
index 0000000..62ff193
--- /dev/null
@@ -0,0 +1,80 @@
+### setup project ###
+cmake_minimum_required(VERSION 3.17.3) # 3.17 > for Python3_SOABI
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+project(fibby
+  VERSION 1.0
+  DESCRIPTION "FIB module"
+  LANGUAGES C Fortran
+  )
+
+# Safety net
+if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
+  message(
+    FATAL_ERROR
+      "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there.\n"
+  )
+endif()
+
+# Grab Python
+find_package(Python3 3.9 REQUIRED
+  COMPONENTS Interpreter Development NumPy)
+
+# Grab the variables from a local Python installation
+# F2PY headers
+execute_process(
+  COMMAND "${Python3_EXECUTABLE}"
+  -c "import numpy.f2py; print(numpy.f2py.get_include())"
+  OUTPUT_VARIABLE F2PY_INCLUDE_DIR
+  OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+# Project scope; consider using target_include_directories instead
+include_directories(
+  BEFORE
+  ${Python3_INCLUDE_DIRS}
+  ${Python3_NumPy_INCLUDE_DIRS}
+  ${F2PY_INCLUDE_DIR}
+  )
+
+message(STATUS ${Python3_INCLUDE_DIRS})
+message(STATUS ${F2PY_INCLUDE_DIR})
+message(STATUS ${Python3_NumPy_INCLUDE_DIRS})
+
+# Vars
+set(f2py_module_name "fibby")
+set(fortran_src_file "${CMAKE_SOURCE_DIR}/fib1.f")
+set(f2py_module_c "${f2py_module_name}module.c")
+set(generated_module_file "${f2py_module_name}${Python3_SOABI}")
+
+# Generate sources
+add_custom_target(
+  genpyf
+  DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${f2py_module_c}"
+  )
+add_custom_command(
+  OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${f2py_module_c}"
+  COMMAND ${Python3_EXECUTABLE}  -m "numpy.f2py"
+                   "${fortran_src_file}"
+                   -m "fibby"
+                   --lower # Important
+  DEPENDS fib1.f # Fortran source
+  )
+
+# Set up target
+add_library(${CMAKE_PROJECT_NAME} SHARED
+  "${CMAKE_CURRENT_BINARY_DIR}/${f2py_module_c}" # Generated
+  "${F2PY_INCLUDE_DIR}/fortranobject.c" # From NumPy
+  "${fortran_src_file}" # Fortran source(s)
+  )
+
+# Depend on sources
+add_dependencies(${CMAKE_PROJECT_NAME} genpyf)
+
+set_target_properties(
+     ${CMAKE_PROJECT_NAME}
+    PROPERTIES
+        PREFIX ""
+        OUTPUT_NAME "${CMAKE_PROJECT_NAME}"
+        LINKER_LANGUAGE C
+    )
diff --git a/doc/source/f2py/code/CMakeLists_skbuild.txt b/doc/source/f2py/code/CMakeLists_skbuild.txt
new file mode 100644 (file)
index 0000000..97bc5c7
--- /dev/null
@@ -0,0 +1,89 @@
+### setup project ###
+cmake_minimum_required(VERSION 3.17.3)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+project(fibby
+  VERSION 1.0
+  DESCRIPTION "FIB module"
+  LANGUAGES C Fortran
+  )
+
+# Safety net
+if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
+  message(
+    FATAL_ERROR
+      "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there.\n"
+  )
+endif()
+
+# Grab Python
+find_package(Python3 3.9 REQUIRED
+  COMPONENTS Interpreter Development)
+
+# Ensure scikit-build modules
+if (NOT SKBUILD)
+  # Kanged -->https://github.com/Kitware/torch_liberator/blob/master/CMakeLists.txt
+  # If skbuild is not the driver; include its utilities in CMAKE_MODULE_PATH
+  execute_process(
+  COMMAND "${Python3_EXECUTABLE}"
+  -c "import os, skbuild; print(os.path.dirname(skbuild.__file__))"
+  OUTPUT_VARIABLE SKBLD_DIR
+  OUTPUT_STRIP_TRAILING_WHITESPACE
+  )
+  set(SKBLD_CMAKE_DIR "${SKBLD_DIR}/resources/cmake")
+  list(APPEND CMAKE_MODULE_PATH ${SKBLD_CMAKE_DIR})
+endif()
+
+# scikit-build style includes
+find_package(PythonExtensions REQUIRED) # for ${PYTHON_EXTENSION_MODULE_SUFFIX}
+find_package(NumPy REQUIRED) # for ${NumPy_INCLUDE_DIRS}
+find_package(F2PY REQUIRED) # for ${F2PY_INCLUDE_DIR}
+
+# Prepping the module
+set(f2py_module_name "fibby")
+set(fortran_src_file "${CMAKE_SOURCE_DIR}/fib1.f")
+set(generated_module_file ${f2py_module_name}${PYTHON_EXTENSION_MODULE_SUFFIX})
+
+# Target for enforcing dependencies
+add_custom_target(${f2py_module_name} ALL
+  DEPENDS "${fortran_src_file}"
+  )
+
+# Custom command for generating .c
+add_custom_command(
+  OUTPUT "${f2py_module_name}module.c"
+  COMMAND ${F2PY_EXECUTABLE}
+    -m ${f2py_module_name}
+    ${fortran_src_file}
+    --lower
+  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+  DEPENDS ${fortran_src_file}
+  )
+
+add_library(${generated_module_file} MODULE
+            "${f2py_module_name}module.c"
+            "${F2PY_INCLUDE_DIR}/fortranobject.c"
+            "${fortran_src_file}")
+
+target_include_directories(${generated_module_file} PUBLIC
+                           ${F2PY_INCLUDE_DIRS}
+                           ${PYTHON_INCLUDE_DIRS})
+set_target_properties(${generated_module_file} PROPERTIES SUFFIX "")
+set_target_properties(${generated_module_file} PROPERTIES PREFIX "")
+
+# Linker fixes
+if (UNIX)
+  if (APPLE)
+    set_target_properties(${generated_module_file} PROPERTIES
+    LINK_FLAGS  '-Wl,-dylib,-undefined,dynamic_lookup')
+  else()
+    set_target_properties(${generated_module_file} PROPERTIES
+  LINK_FLAGS  '-Wl,--allow-shlib-undefined')
+  endif()
+endif()
+
+if (SKBUILD)
+  install(TARGETS ${generated_module_file} DESTINATION fibby)
+else()
+  install(TARGETS ${generated_module_file} DESTINATION ${CMAKE_SOURCE_DIR}/fibby)
+endif()
diff --git a/doc/source/f2py/code/allocarr.f90 b/doc/source/f2py/code/allocarr.f90
new file mode 100644 (file)
index 0000000..e0d6c2e
--- /dev/null
@@ -0,0 +1,16 @@
+module mod
+  real, allocatable, dimension(:,:) :: b 
+contains
+  subroutine foo
+    integer k
+    if (allocated(b)) then
+       print*, "b=["
+       do k = 1,size(b,1)
+          print*, b(k,1:size(b,2))
+       enddo
+       print*, "]"
+    else
+       print*, "b is not allocated"
+    endif
+  end subroutine foo
+end module mod
diff --git a/doc/source/f2py/code/array.f b/doc/source/f2py/code/array.f
new file mode 100644 (file)
index 0000000..ef20c9c
--- /dev/null
@@ -0,0 +1,17 @@
+C FILE: ARRAY.F
+      SUBROUTINE FOO(A,N,M)
+C
+C     INCREMENT THE FIRST ROW AND DECREMENT THE FIRST COLUMN OF A
+C
+      INTEGER N,M,I,J
+      REAL*8 A(N,M)
+Cf2py intent(in,out,copy) a
+Cf2py integer intent(hide),depend(a) :: n=shape(a,0), m=shape(a,1)
+      DO J=1,M
+         A(1,J) = A(1,J) + 1D0
+      ENDDO
+      DO I=1,N
+         A(I,1) = A(I,1) - 1D0
+      ENDDO
+      END
+C END OF FILE ARRAY.F
diff --git a/doc/source/f2py/code/calculate.f b/doc/source/f2py/code/calculate.f
new file mode 100644 (file)
index 0000000..4ff570d
--- /dev/null
@@ -0,0 +1,14 @@
+      subroutine calculate(x,n)
+cf2py intent(callback) func
+      external func
+c     The following lines define the signature of func for F2PY:
+cf2py real*8 y
+cf2py y = func(y)
+c
+cf2py intent(in,out,copy) x
+      integer n,i
+      real*8 x(n), func
+      do i=1,n
+         x(i) = func(x(i))
+      end do
+      end
diff --git a/doc/source/f2py/code/callback.f b/doc/source/f2py/code/callback.f
new file mode 100644 (file)
index 0000000..d5cfc75
--- /dev/null
@@ -0,0 +1,12 @@
+C FILE: CALLBACK.F
+      SUBROUTINE FOO(FUN,R)
+      EXTERNAL FUN
+      INTEGER I
+      REAL*8 R, FUN
+Cf2py intent(out) r
+      R = 0D0
+      DO I=-5,5
+         R = R + FUN(I)
+      ENDDO
+      END
+C END OF FILE CALLBACK.F
diff --git a/doc/source/f2py/code/callback2.pyf b/doc/source/f2py/code/callback2.pyf
new file mode 100644 (file)
index 0000000..3d77eed
--- /dev/null
@@ -0,0 +1,19 @@
+!    -*- f90 -*-
+python module __user__routines 
+    interface
+        function fun(i) result (r)
+            integer :: i
+            real*8 :: r
+        end function fun
+    end interface
+end python module __user__routines
+
+python module callback2
+    interface
+        subroutine foo(f,r)
+            use __user__routines, f=>fun
+            external f
+            real*8 intent(out) :: r
+        end subroutine foo
+    end interface 
+end python module callback2
diff --git a/doc/source/f2py/code/common.f b/doc/source/f2py/code/common.f
new file mode 100644 (file)
index 0000000..b098ab2
--- /dev/null
@@ -0,0 +1,13 @@
+C FILE: COMMON.F
+      SUBROUTINE FOO
+      INTEGER I,X
+      REAL A
+      COMMON /DATA/ I,X(4),A(2,3)
+      PRINT*, "I=",I
+      PRINT*, "X=[",X,"]"
+      PRINT*, "A=["
+      PRINT*, "[",A(1,1),",",A(1,2),",",A(1,3),"]"
+      PRINT*, "[",A(2,1),",",A(2,2),",",A(2,3),"]"
+      PRINT*, "]"
+      END
+C END OF COMMON.F
diff --git a/doc/source/f2py/code/extcallback.f b/doc/source/f2py/code/extcallback.f
new file mode 100644 (file)
index 0000000..9a80062
--- /dev/null
@@ -0,0 +1,14 @@
+      subroutine f1()
+         print *, "in f1, calling f2 twice.."
+         call f2()
+         call f2()
+         return
+      end
+      
+      subroutine f2()
+cf2py    intent(callback, hide) fpy
+         external fpy
+         print *, "in f2, calling f2py.."
+         call fpy()
+         return
+      end
diff --git a/doc/source/f2py/code/fib1.f b/doc/source/f2py/code/fib1.f
new file mode 100644 (file)
index 0000000..cfbb1ee
--- /dev/null
@@ -0,0 +1,18 @@
+C FILE: FIB1.F
+      SUBROUTINE FIB(A,N)
+C
+C     CALCULATE FIRST N FIBONACCI NUMBERS
+C
+      INTEGER N
+      REAL*8 A(N)
+      DO I=1,N
+         IF (I.EQ.1) THEN
+            A(I) = 0.0D0
+         ELSEIF (I.EQ.2) THEN
+            A(I) = 1.0D0
+         ELSE 
+            A(I) = A(I-1) + A(I-2)
+         ENDIF
+      ENDDO
+      END
+C END FILE FIB1.F
diff --git a/doc/source/f2py/code/fib1.pyf b/doc/source/f2py/code/fib1.pyf
new file mode 100644 (file)
index 0000000..3d6cc0a
--- /dev/null
@@ -0,0 +1,12 @@
+!    -*- f90 -*-
+python module fib2 ! in 
+    interface  ! in :fib2
+        subroutine fib(a,n) ! in :fib2:fib1.f
+            real*8 dimension(n) :: a
+            integer optional,check(len(a)>=n),depend(a) :: n=len(a)
+        end subroutine fib
+    end interface 
+end python module fib2
+
+! This file was auto-generated with f2py (version:2.28.198-1366).
+! See http://cens.ioc.ee/projects/f2py2e/
diff --git a/doc/source/f2py/code/fib2.pyf b/doc/source/f2py/code/fib2.pyf
new file mode 100644 (file)
index 0000000..4a5ae29
--- /dev/null
@@ -0,0 +1,9 @@
+!    -*- f90 -*-
+python module fib2 
+    interface
+        subroutine fib(a,n)
+            real*8 dimension(n),intent(out),depend(n) :: a
+            integer intent(in) :: n
+        end subroutine fib
+    end interface 
+end python module fib2
diff --git a/doc/source/f2py/code/fib3.f b/doc/source/f2py/code/fib3.f
new file mode 100644 (file)
index 0000000..08b050c
--- /dev/null
@@ -0,0 +1,21 @@
+C FILE: FIB3.F
+      SUBROUTINE FIB(A,N)
+C
+C     CALCULATE FIRST N FIBONACCI NUMBERS
+C
+      INTEGER N
+      REAL*8 A(N)
+Cf2py intent(in) n
+Cf2py intent(out) a
+Cf2py depend(n) a
+      DO I=1,N
+         IF (I.EQ.1) THEN
+            A(I) = 0.0D0
+         ELSEIF (I.EQ.2) THEN
+            A(I) = 1.0D0
+         ELSE 
+            A(I) = A(I-1) + A(I-2)
+         ENDIF
+      ENDDO
+      END
+C END FILE FIB3.F
diff --git a/doc/source/f2py/code/ftype.f b/doc/source/f2py/code/ftype.f
new file mode 100644 (file)
index 0000000..cabbb9e
--- /dev/null
@@ -0,0 +1,9 @@
+C FILE: FTYPE.F
+      SUBROUTINE FOO(N)
+      INTEGER N
+Cf2py integer optional,intent(in) :: n = 13
+      REAL A,X
+      COMMON /DATA/ A,X(3)
+      PRINT*, "IN FOO: N=",N," A=",A," X=[",X(1),X(2),X(3),"]"
+      END
+C END OF FTYPE.F
diff --git a/doc/source/f2py/code/meson.build b/doc/source/f2py/code/meson.build
new file mode 100644 (file)
index 0000000..b756abf
--- /dev/null
@@ -0,0 +1,38 @@
+project('f2py_examples', 'c',
+  version : '0.1',
+  default_options : ['warning_level=2'])
+
+add_languages('fortran')
+
+py_mod = import('python')
+py3 = py_mod.find_installation('python3')
+py3_dep = py3.dependency()
+message(py3.path())
+message(py3.get_install_dir())
+
+incdir_numpy = run_command(py3,
+  ['-c', 'import os; os.chdir(".."); import numpy; print(numpy.get_include())'],
+  check : true
+).stdout().strip()
+
+incdir_f2py = run_command(py3,
+    ['-c', 'import os; os.chdir(".."); import numpy.f2py; print(numpy.f2py.get_include())'],
+    check : true
+).stdout().strip()
+
+fibby_source = custom_target('fibbymodule.c',
+                            input : ['fib1.f'],
+                            output : ['fibbymodule.c'],
+                            command : [ py3, '-m', 'numpy.f2py', '@INPUT@',
+                            '-m', 'fibby', '--lower' ]
+                            )
+
+inc_np = include_directories(incdir_numpy, incdir_f2py)
+
+py3.extension_module('fibby',
+           'fib1.f',
+           fibby_source,
+           incdir_f2py+'/fortranobject.c',
+           include_directories: inc_np,
+           dependencies : py3_dep,
+           install : true)
diff --git a/doc/source/f2py/code/meson_upd.build b/doc/source/f2py/code/meson_upd.build
new file mode 100644 (file)
index 0000000..97bd8d1
--- /dev/null
@@ -0,0 +1,37 @@
+project('f2py_examples', 'c',
+  version : '0.1',
+  default_options : ['warning_level=2'])
+
+add_languages('fortran')
+
+py_mod = import('python')
+py3 = py_mod.find_installation('python3')
+py3_dep = py3.dependency()
+message(py3.path())
+message(py3.get_install_dir())
+
+incdir_numpy = run_command(py3,
+  ['-c', 'import os; os.chdir(".."); import numpy; print(numpy.get_include())'],
+  check : true
+).stdout().strip()
+
+incdir_f2py = run_command(py3,
+    ['-c', 'import os; os.chdir(".."); import numpy.f2py; print(numpy.f2py.get_include())'],
+    check : true
+).stdout().strip()
+
+fibby_source = custom_target('fibbymodule.c',
+                            input : ['fib1.f'],
+                            output : ['fibbymodule.c'],
+                            command : [ py3, '-m', 'numpy.f2py', '@INPUT@',
+                            '-m', 'fibby', '--lower' ])
+
+inc_np = include_directories(incdir_numpy, incdir_f2py)
+
+py3.extension_module('fibby',
+           'fib1.f',
+           fibby_source,
+           incdir_f2py+'/fortranobject.c',
+           include_directories: inc_np,
+           dependencies : py3_dep,
+           install : true)
diff --git a/doc/source/f2py/code/moddata.f90 b/doc/source/f2py/code/moddata.f90
new file mode 100644 (file)
index 0000000..0e98f04
--- /dev/null
@@ -0,0 +1,18 @@
+module mod
+  integer i
+  integer :: x(4)
+  real, dimension(2,3) :: a
+  real, allocatable, dimension(:,:) :: b 
+contains
+  subroutine foo
+    integer k
+    print*, "i=",i
+    print*, "x=[",x,"]"
+    print*, "a=["
+    print*, "[",a(1,1),",",a(1,2),",",a(1,3),"]"
+    print*, "[",a(2,1),",",a(2,2),",",a(2,3),"]"
+    print*, "]"
+    print*, "Setting a(1,2)=a(1,2)+3"
+    a(1,2) = a(1,2)+3
+  end subroutine foo
+end module mod
diff --git a/doc/source/f2py/code/pyproj_skbuild.toml b/doc/source/f2py/code/pyproj_skbuild.toml
new file mode 100644 (file)
index 0000000..6686d17
--- /dev/null
@@ -0,0 +1,5 @@
+[project]
+requires-python = ">=3.7"
+
+[build-system]
+requires = ["setuptools>=42", "wheel", "scikit-build", "cmake>=3.18", "numpy>=1.21"]
diff --git a/doc/source/f2py/code/results/allocarr_session.dat b/doc/source/f2py/code/results/allocarr_session.dat
new file mode 100644 (file)
index 0000000..ba168c2
--- /dev/null
@@ -0,0 +1,32 @@
+>>> import allocarr
+>>> print(allocarr.mod.__doc__)
+b : 'f'-array(-1,-1), not allocated
+foo()
+
+Wrapper for ``foo``.
+
+
+
+>>> allocarr.mod.foo()  
+ b is not allocated
+>>> allocarr.mod.b = [[1, 2, 3], [4, 5, 6]]             # allocate/initialize b
+>>> allocarr.mod.foo()
+ b=[
+   1.000000       2.000000       3.000000    
+   4.000000       5.000000       6.000000    
+ ]
+>>> allocarr.mod.b                                      # b is Fortran-contiguous
+array([[ 1.,  2.,  3.],
+       [ 4.,  5.,  6.]], dtype=float32)
+>>> allocarr.mod.b.flags.f_contiguous
+True
+>>> allocarr.mod.b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]  # reallocate/initialize b
+>>> allocarr.mod.foo()
+ b=[
+   1.000000       2.000000       3.000000    
+   4.000000       5.000000       6.000000    
+   7.000000       8.000000       9.000000    
+ ]
+>>> allocarr.mod.b = None                               # deallocate array
+>>> allocarr.mod.foo()
+ b is not allocated
diff --git a/doc/source/f2py/code/results/array_session.dat b/doc/source/f2py/code/results/array_session.dat
new file mode 100644 (file)
index 0000000..714c036
--- /dev/null
@@ -0,0 +1,87 @@
+>>> import arr
+>>> from numpy import asfortranarray
+>>> print(arr.foo.__doc__)
+a = foo(a,[overwrite_a])
+
+Wrapper for ``foo``.
+
+Parameters
+----------
+a : input rank-2 array('d') with bounds (n,m)
+
+Other Parameters
+----------------
+overwrite_a : input int, optional
+    Default: 0
+
+Returns
+-------
+a : rank-2 array('d') with bounds (n,m)
+
+>>> a = arr.foo([[1, 2, 3],
+...              [4, 5, 6]])
+created an array from object
+>>> print(a)
+[[ 1.  3.  4.]
+ [ 3.  5.  6.]]
+>>> a.flags.c_contiguous
+False
+>>> a.flags.f_contiguous
+True
+# even if a is proper-contiguous and has proper type,
+# a copy is made forced by intent(copy) attribute
+# to preserve its original contents
+>>> b = arr.foo(a)
+copied an array: size=6, elsize=8
+>>> print(a)
+[[ 1.  3.  4.]
+ [ 3.  5.  6.]]
+>>> print(b)
+[[ 1.  4.  5.]
+ [ 2.  5.  6.]]
+>>> b = arr.foo(a, overwrite_a = 1) # a is passed directly to Fortran
+...                                 # routine and its contents is discarded
+... 
+>>> print(a)
+[[ 1.  4.  5.]
+ [ 2.  5.  6.]]
+>>> print(b)
+[[ 1.  4.  5.]
+ [ 2.  5.  6.]]
+>>> a is b                          # a and b are actually the same objects
+True
+>>> print(arr.foo([1, 2, 3]))       # different rank arrays are allowed
+created an array from object
+[ 1.  1.  2.]
+>>> print(arr.foo([[[1], [2], [3]]]))
+created an array from object
+[[[ 1.]
+  [ 1.]
+  [ 2.]]]
+>>>
+>>> # Creating arrays with column major data storage order:
+ ...
+>>> s = asfortranarray([[1, 2, 3], [4, 5, 6]])
+>>> s.flags.f_contiguous
+True
+>>> print(s)
+[[1 2 3]
+ [4 5 6]]
+>>> print(arr.foo(s))
+>>> s2 = asfortranarray(s)
+>>> s2 is s    # an array with column major storage order 
+               # is returned immediately
+True
+>>> # Note that arr.foo returns a column major data storage order array:
+ ...
+>>> s3 = ascontiguousarray(s)
+>>> s3.flags.f_contiguous
+False
+>>> s3.flags.c_contiguous
+True
+>>> s3 = arr.foo(s3)
+copied an array: size=6, elsize=8
+>>> s3.flags.f_contiguous
+True
+>>> s3.flags.c_contiguous
+False
diff --git a/doc/source/f2py/code/results/calculate_session.dat b/doc/source/f2py/code/results/calculate_session.dat
new file mode 100644 (file)
index 0000000..c4c3807
--- /dev/null
@@ -0,0 +1,6 @@
+>>> import foo
+>>> foo.calculate(range(5), lambda x: x*x)
+array([  0.,   1.,   4.,   9.,  16.])
+>>> import math
+>>> foo.calculate(range(5), math.exp)
+array([  1.        ,   2.71828183,   7.3890561,  20.08553692,  54.59815003])
diff --git a/doc/source/f2py/code/results/callback_session.dat b/doc/source/f2py/code/results/callback_session.dat
new file mode 100644 (file)
index 0000000..460c9ce
--- /dev/null
@@ -0,0 +1,35 @@
+>>> import callback
+>>> print(callback.foo.__doc__)
+r = foo(fun,[fun_extra_args])
+
+Wrapper for ``foo``.
+
+Parameters
+----------
+fun : call-back function
+
+Other Parameters
+----------------
+fun_extra_args : input tuple, optional
+    Default: ()
+
+Returns
+-------
+r : float
+
+Notes
+-----
+Call-back functions::
+
+  def fun(i): return r
+  Required arguments:
+    i : input int
+  Return objects:
+    r : float
+
+>>> def f(i): return i*i
+... 
+>>> print(callback.foo(f))
+110.0
+>>> print(callback.foo(lambda i:1))
+11.0
diff --git a/doc/source/f2py/code/results/common_session.dat b/doc/source/f2py/code/results/common_session.dat
new file mode 100644 (file)
index 0000000..2595bfb
--- /dev/null
@@ -0,0 +1,30 @@
+>>> import common
+>>> print(common.data.__doc__)
+i : 'i'-scalar
+x : 'i'-array(4)
+a : 'f'-array(2,3)
+
+>>> common.data.i = 5
+>>> common.data.x[1] = 2 
+>>> common.data.a = [[1,2,3],[4,5,6]]
+>>> common.foo()
+>>> common.foo()
+ I=           5
+ X=[           0           2           0           0 ]
+ A=[
+ [   1.00000000     ,   2.00000000     ,   3.00000000     ]
+ [   4.00000000     ,   5.00000000     ,   6.00000000     ]
+ ]
+>>> common.data.a[1] = 45
+>>> common.foo()
+ I=           5
+ X=[           0           2           0           0 ]
+ A=[
+ [   1.00000000     ,   2.00000000     ,   3.00000000     ]
+ [   45.0000000     ,   45.0000000     ,   45.0000000     ]
+ ]
+>>> common.data.a                 # a is Fortran-contiguous
+array([[  1.,   2.,   3.],
+       [ 45.,  45.,  45.]], dtype=float32)
+>>> common.data.a.flags.f_contiguous
+True
\ No newline at end of file
diff --git a/doc/source/f2py/code/results/compile_session.dat b/doc/source/f2py/code/results/compile_session.dat
new file mode 100644 (file)
index 0000000..5c42742
--- /dev/null
@@ -0,0 +1,11 @@
+>>> import numpy.f2py
+>>> fsource = '''
+...       subroutine foo
+...       print*, "Hello world!"
+...       end 
+... '''
+>>> numpy.f2py.compile(fsource, modulename='hello', verbose=0)
+0
+>>> import hello
+>>> hello.foo()
+ Hello world!
diff --git a/doc/source/f2py/code/results/extcallback_session.dat b/doc/source/f2py/code/results/extcallback_session.dat
new file mode 100644 (file)
index 0000000..5b97ab7
--- /dev/null
@@ -0,0 +1,19 @@
+>>> import pfromf
+>>> pfromf.f2()
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+pfromf.error: Callback fpy not defined (as an argument or module pfromf attribute).
+
+>>> def f(): print("python f")
+... 
+>>> pfromf.fpy = f
+>>> pfromf.f2()
+ in f2, calling f2py..
+python f
+>>> pfromf.f1()
+ in f1, calling f2 twice..
+ in f2, calling f2py..
+python f
+ in f2, calling f2py..
+python f
+>>> 
\ No newline at end of file
diff --git a/doc/source/f2py/code/results/ftype_session.dat b/doc/source/f2py/code/results/ftype_session.dat
new file mode 100644 (file)
index 0000000..e39cc12
--- /dev/null
@@ -0,0 +1,21 @@
+>>> import ftype
+>>> print(ftype.__doc__)
+This module 'ftype' is auto-generated with f2py (version:2).
+Functions:
+  foo(n=13)
+COMMON blocks:
+  /data/ a,x(3)
+.
+>>> type(ftype.foo), type(ftype.data)
+(<class 'fortran'>, <class 'fortran'>)
+>>> ftype.foo()
+ IN FOO: N= 13 A=  0. X=[  0.  0.  0.]
+>>> ftype.data.a = 3
+>>> ftype.data.x = [1,2,3]
+>>> ftype.foo()
+ IN FOO: N= 13 A=  3. X=[  1.  2.  3.]
+>>> ftype.data.x[1] = 45  
+>>> ftype.foo(24)
+ IN FOO: N= 24 A=  3. X=[  1.  45.  3.]
+>>> ftype.data.x
+array([  1.,  45.,   3.], dtype=float32)
diff --git a/doc/source/f2py/code/results/moddata_session.dat b/doc/source/f2py/code/results/moddata_session.dat
new file mode 100644 (file)
index 0000000..824bd86
--- /dev/null
@@ -0,0 +1,28 @@
+>>> import moddata
+>>> print(moddata.mod.__doc__)
+i : 'i'-scalar
+x : 'i'-array(4)
+a : 'f'-array(2,3)
+b : 'f'-array(-1,-1), not allocated
+foo()
+
+Wrapper for ``foo``.
+
+
+
+>>> moddata.mod.i = 5  
+>>> moddata.mod.x[:2] = [1,2]
+>>> moddata.mod.a = [[1,2,3],[4,5,6]]
+>>> moddata.mod.foo()                
+ i=           5
+ x=[           1           2           0           0 ]
+ a=[
+ [   1.000000     ,   2.000000     ,   3.000000     ]
+ [   4.000000     ,   5.000000     ,   6.000000     ]
+ ]
+ Setting a(1,2)=a(1,2)+3
+>>> moddata.mod.a               # a is Fortran-contiguous
+array([[ 1.,  5.,  3.],
+       [ 4.,  5.,  6.]], dtype=float32)
+>>> moddata.mod.a.flags.f_contiguous
+True
diff --git a/doc/source/f2py/code/results/run_main_session.dat b/doc/source/f2py/code/results/run_main_session.dat
new file mode 100644 (file)
index 0000000..be6cacd
--- /dev/null
@@ -0,0 +1,14 @@
+>>> import numpy.f2py
+>>> r = numpy.f2py.run_main(['-m','scalar','doc/source/f2py/scalar.f'])
+Reading fortran codes...
+        Reading file 'doc/source/f2py/scalar.f' (format:fix,strict)
+Post-processing...
+        Block: scalar
+                        Block: FOO
+Building modules...
+        Building module "scalar"...
+        Wrote C/API module "scalar" to file "./scalarmodule.c"
+>>> print(r)
+{'scalar': {'h': ['/home/users/pearu/src_cvs/f2py/src/fortranobject.h'],
+        'csrc': ['./scalarmodule.c', 
+                  '/home/users/pearu/src_cvs/f2py/src/fortranobject.c']}}
diff --git a/doc/source/f2py/code/results/scalar_session.dat b/doc/source/f2py/code/results/scalar_session.dat
new file mode 100644 (file)
index 0000000..3bb45ed
--- /dev/null
@@ -0,0 +1,24 @@
+>>> import scalar
+>>> print(scalar.foo.__doc__)
+foo(a,b)
+
+Wrapper for ``foo``.
+
+Parameters
+----------
+a : input float
+b : in/output rank-0 array(float,'d')
+>>> scalar.foo(2, 3)   
+     A=  2. B=  3.
+ INCREMENT A AND B
+ NEW A=  3. B=  4.
+>>> import numpy
+>>> a = numpy.array(2)   # these are integer rank-0 arrays
+>>> b = numpy.array(3)
+>>> scalar.foo(a, b)
+     A=  2. B=  3.
+ INCREMENT A AND B
+ NEW A=  3. B=  4.
+>>> print(a, b)          # note that only b is changed in situ
+2 4
diff --git a/doc/source/f2py/code/results/spam_session.dat b/doc/source/f2py/code/results/spam_session.dat
new file mode 100644 (file)
index 0000000..bd5832d
--- /dev/null
@@ -0,0 +1,5 @@
+>>> import spam
+>>> status = spam.system('whoami')
+pearu
+>>> status = spam.system('blah')
+sh: line 1: blah: command not found
\ No newline at end of file
diff --git a/doc/source/f2py/code/results/string_session.dat b/doc/source/f2py/code/results/string_session.dat
new file mode 100644 (file)
index 0000000..e8f7854
--- /dev/null
@@ -0,0 +1,30 @@
+>>> import mystring
+>>> print(mystring.foo.__doc__)
+foo(a,b,c,d)
+
+Wrapper for ``foo``.
+
+Parameters
+----------
+a : input string(len=5)
+b : in/output rank-0 array(string(len=5),'c')
+c : input string(len=-1)
+d : in/output rank-0 array(string(len=-1),'c')
+
+>>> from numpy import array
+>>> a = array(b'123\0\0')
+>>> b = array(b'123\0\0')
+>>> c = array(b'123')
+>>> d = array(b'123')
+>>> mystring.foo(a, b, c, d)
+ A=123
+ B=123
+ C=123
+ D=123
+ CHANGE A,B,C,D
+ A=A23
+ B=B23
+ C=C23
+ D=D23
+>>> a[()], b[()], c[()], d[()]
+(b'123', b'B23', b'123', b'D2')
diff --git a/doc/source/f2py/code/results/var_session.dat b/doc/source/f2py/code/results/var_session.dat
new file mode 100644 (file)
index 0000000..fb0f798
--- /dev/null
@@ -0,0 +1,3 @@
+>>> import var
+>>> var.BAR
+5
\ No newline at end of file
diff --git a/doc/source/f2py/code/scalar.f b/doc/source/f2py/code/scalar.f
new file mode 100644 (file)
index 0000000..c22f639
--- /dev/null
@@ -0,0 +1,12 @@
+C FILE: SCALAR.F
+      SUBROUTINE FOO(A,B)
+      REAL*8 A, B
+Cf2py intent(in) a
+Cf2py intent(inout) b
+      PRINT*, "    A=",A," B=",B
+      PRINT*, "INCREMENT A AND B"
+      A = A + 1D0
+      B = B + 1D0
+      PRINT*, "NEW A=",A," B=",B
+      END
+C END OF FILE SCALAR.F
diff --git a/doc/source/f2py/code/setup_example.py b/doc/source/f2py/code/setup_example.py
new file mode 100644 (file)
index 0000000..479acc0
--- /dev/null
@@ -0,0 +1,16 @@
+from numpy.distutils.core import Extension
+
+ext1 = Extension(name = 'scalar',
+                 sources = ['scalar.f'])
+ext2 = Extension(name = 'fib2',
+                 sources = ['fib2.pyf', 'fib1.f'])
+
+if __name__ == "__main__":
+    from numpy.distutils.core import setup
+    setup(name = 'f2py_example',
+          description       = "F2PY Users Guide examples",
+          author            = "Pearu Peterson",
+          author_email      = "pearu@cens.ioc.ee",
+          ext_modules = [ext1, ext2]
+          )
+# End of setup_example.py
diff --git a/doc/source/f2py/code/setup_skbuild.py b/doc/source/f2py/code/setup_skbuild.py
new file mode 100644 (file)
index 0000000..4dfc6af
--- /dev/null
@@ -0,0 +1,10 @@
+from skbuild import setup
+
+setup(
+    name="fibby",
+    version="0.0.1",
+    description="a minimal example package (fortran version)",
+    license="MIT",
+    packages=['fibby'],
+    cmake_args=['-DSKBUILD=ON']
+)
diff --git a/doc/source/f2py/code/spam.pyf b/doc/source/f2py/code/spam.pyf
new file mode 100644 (file)
index 0000000..21ea18b
--- /dev/null
@@ -0,0 +1,19 @@
+!    -*- f90 -*-
+python module spam
+    usercode '''
+  static char doc_spam_system[] = "Execute a shell command.";
+  static PyObject *spam_system(PyObject *self, PyObject *args)
+  {
+    char *command;
+    int sts;
+
+    if (!PyArg_ParseTuple(args, "s", &command))
+        return NULL;
+    sts = system(command);
+    return Py_BuildValue("i", sts);
+  }
+    '''
+    pymethoddef '''
+    {"system",  spam_system, METH_VARARGS, doc_spam_system},
+    '''
+end python module spam
diff --git a/doc/source/f2py/code/string.f b/doc/source/f2py/code/string.f
new file mode 100644 (file)
index 0000000..9246f02
--- /dev/null
@@ -0,0 +1,21 @@
+C FILE: STRING.F
+      SUBROUTINE FOO(A,B,C,D)
+      CHARACTER*5 A, B
+      CHARACTER*(*) C,D
+Cf2py intent(in) a,c
+Cf2py intent(inout) b,d
+      PRINT*, "A=",A
+      PRINT*, "B=",B
+      PRINT*, "C=",C
+      PRINT*, "D=",D
+      PRINT*, "CHANGE A,B,C,D"
+      A(1:1) = 'A'
+      B(1:1) = 'B'
+      C(1:1) = 'C'
+      D(1:1) = 'D'
+      PRINT*, "A=",A
+      PRINT*, "B=",B
+      PRINT*, "C=",C
+      PRINT*, "D=",D
+      END
+C END OF FILE STRING.F
diff --git a/doc/source/f2py/code/var.pyf b/doc/source/f2py/code/var.pyf
new file mode 100644 (file)
index 0000000..8275ff3
--- /dev/null
@@ -0,0 +1,11 @@
+!    -*- f90 -*-
+python module var
+  usercode '''
+    int BAR = 5;
+  '''
+  interface
+    usercode '''
+      PyDict_SetItemString(d,"BAR",PyInt_FromLong(BAR));
+    '''
+  end interface
+end python module
diff --git a/doc/source/f2py/common.f b/doc/source/f2py/common.f
deleted file mode 100644 (file)
index b098ab2..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-C FILE: COMMON.F
-      SUBROUTINE FOO
-      INTEGER I,X
-      REAL A
-      COMMON /DATA/ I,X(4),A(2,3)
-      PRINT*, "I=",I
-      PRINT*, "X=[",X,"]"
-      PRINT*, "A=["
-      PRINT*, "[",A(1,1),",",A(1,2),",",A(1,3),"]"
-      PRINT*, "[",A(2,1),",",A(2,2),",",A(2,3),"]"
-      PRINT*, "]"
-      END
-C END OF COMMON.F
diff --git a/doc/source/f2py/common_session.dat b/doc/source/f2py/common_session.dat
deleted file mode 100644 (file)
index 2595bfb..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
->>> import common
->>> print(common.data.__doc__)
-i : 'i'-scalar
-x : 'i'-array(4)
-a : 'f'-array(2,3)
-
->>> common.data.i = 5
->>> common.data.x[1] = 2 
->>> common.data.a = [[1,2,3],[4,5,6]]
->>> common.foo()
->>> common.foo()
- I=           5
- X=[           0           2           0           0 ]
- A=[
- [   1.00000000     ,   2.00000000     ,   3.00000000     ]
- [   4.00000000     ,   5.00000000     ,   6.00000000     ]
- ]
->>> common.data.a[1] = 45
->>> common.foo()
- I=           5
- X=[           0           2           0           0 ]
- A=[
- [   1.00000000     ,   2.00000000     ,   3.00000000     ]
- [   45.0000000     ,   45.0000000     ,   45.0000000     ]
- ]
->>> common.data.a                 # a is Fortran-contiguous
-array([[  1.,   2.,   3.],
-       [ 45.,  45.,  45.]], dtype=float32)
->>> common.data.a.flags.f_contiguous
-True
\ No newline at end of file
diff --git a/doc/source/f2py/compile_session.dat b/doc/source/f2py/compile_session.dat
deleted file mode 100644 (file)
index 5c42742..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
->>> import numpy.f2py
->>> fsource = '''
-...       subroutine foo
-...       print*, "Hello world!"
-...       end 
-... '''
->>> numpy.f2py.compile(fsource, modulename='hello', verbose=0)
-0
->>> import hello
->>> hello.foo()
- Hello world!
diff --git a/doc/source/f2py/distutils.rst b/doc/source/f2py/distutils.rst
deleted file mode 100644 (file)
index 4cf3004..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-=============================
-Using via `numpy.distutils`
-=============================
-
-.. currentmodule:: numpy.distutils.core
-
-:mod:`numpy.distutils` is part of NumPy extending standard Python ``distutils``
-to deal with Fortran sources and F2PY signature files, e.g. compile Fortran
-sources, call F2PY to construct extension modules, etc.
-
-.. topic:: Example
-
-  Consider the following `setup file`__:
-
-  .. include:: setup_example.py
-    :literal:
-
-  Running
-
-  ::
-
-    python setup_example.py build
-
-  will build two extension modules ``scalar`` and ``fib2`` to the
-  build directory.
-
-  __ setup_example.py
-
-:mod:`numpy.distutils` extends ``distutils`` with the following features:
-
-* :class:`Extension` class argument ``sources`` may contain Fortran source
-  files. In addition, the list ``sources`` may contain at most one
-  F2PY signature file, and then the name of an Extension module must
-  match with the ``<modulename>`` used in signature file.  It is
-  assumed that an F2PY signature file contains exactly one ``python
-  module`` block.
-
-  If ``sources`` does not contain a signature files, then F2PY is used
-  to scan Fortran source files for routine signatures to construct the
-  wrappers to Fortran codes.
-
-  Additional options to F2PY process can be given using :class:`Extension`
-  class argument ``f2py_options``.
-
-* The following new ``distutils`` commands are defined:
-
-  ``build_src``
-    to construct Fortran wrapper extension modules, among many other things.
-  ``config_fc``
-    to change Fortran compiler options
-
-  as well as ``build_ext`` and  ``build_clib`` commands are enhanced
-  to support Fortran sources.
-
-  Run
-
-  ::
-
-    python <setup.py file> config_fc build_src build_ext --help
-
-  to see available options for these commands.
-
-* When building Python packages containing Fortran sources, then one
-  can choose different Fortran compilers by using ``build_ext``
-  command option ``--fcompiler=<Vendor>``. Here ``<Vendor>`` can be one of the
-  following names::
-
-    absoft sun mips intel intelv intele intelev nag compaq compaqv gnu vast pg hpux
-
-  See ``numpy_distutils/fcompiler.py`` for up-to-date list of
-  supported compilers or run
-
-  ::
-
-     f2py -c --help-fcompiler
diff --git a/doc/source/f2py/extcallback.f b/doc/source/f2py/extcallback.f
deleted file mode 100644 (file)
index 9a80062..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-      subroutine f1()
-         print *, "in f1, calling f2 twice.."
-         call f2()
-         call f2()
-         return
-      end
-      
-      subroutine f2()
-cf2py    intent(callback, hide) fpy
-         external fpy
-         print *, "in f2, calling f2py.."
-         call fpy()
-         return
-      end
diff --git a/doc/source/f2py/extcallback_session.dat b/doc/source/f2py/extcallback_session.dat
deleted file mode 100644 (file)
index 5b97ab7..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
->>> import pfromf
->>> pfromf.f2()
-Traceback (most recent call last):
-  File "<stdin>", line 1, in <module>
-pfromf.error: Callback fpy not defined (as an argument or module pfromf attribute).
-
->>> def f(): print("python f")
-... 
->>> pfromf.fpy = f
->>> pfromf.f2()
- in f2, calling f2py..
-python f
->>> pfromf.f1()
- in f1, calling f2 twice..
- in f2, calling f2py..
-python f
- in f2, calling f2py..
-python f
->>> 
\ No newline at end of file
index 27ddbb0053b342957883e01cec5558ba4402b75d..c1a006f6f2eb9206f0ee8d8d9ba9fae88f2b5e85 100644 (file)
@@ -1,3 +1,5 @@
+.. _f2py-getting-started:
+
 ======================================
  Three ways to wrap - getting started
 ======================================
@@ -6,52 +8,55 @@ Wrapping Fortran or C functions to Python using F2PY consists of the
 following steps:
 
 * Creating the so-called signature file that contains descriptions of
-  wrappers to Fortran or C functions, also called as signatures of the
-  functions. In the case of Fortran routines, F2PY can create initial
+  wrappers to Fortran or C functions, also called the signatures of the
+  functions. For Fortran routines, F2PY can create an initial
   signature file by scanning Fortran source codes and
-  catching all relevant information needed to create wrapper
+  tracking all relevant information needed to create wrapper
   functions.
 
-* Optionally, F2PY created signature files can be edited to optimize
-  wrappers functions, make them "smarter" and more "Pythonic".
+  * Optionally, F2PY created signature files can be edited to optimize
+    wrapper functions, to make them "smarter" and more "Pythonic".
 
 * F2PY reads a signature file and writes a Python C/API module containing
   Fortran/C/Python bindings.
-
 * F2PY compiles all sources and builds an extension module containing
-  the wrappers. In building extension modules, F2PY uses
-  ``numpy_distutils`` that supports a number of Fortran 77/90/95
-  compilers, including Gnu, Intel,
-  Sun Fortre, SGI MIPSpro, Absoft, NAG, Compaq etc. compilers.
+  the wrappers.
+
+  * In building the extension modules, F2PY uses ``numpy_distutils`` which
+    supports a number of Fortran 77/90/95 compilers, including Gnu, Intel, Sun
+    Fortran, SGI MIPSpro, Absoft, NAG, Compaq etc.
+
+Depending on the situation, these steps can be carried out in a single composite
+command or step-by-step; in which case some steps can be omitted or combined
+with others.
 
-Depending on a particular situation, these steps can be carried out
-either by just in one command or step-by-step, some steps can be
-omitted or combined with others.
+Below, we describe three typical approaches of using F2PY. These can be read in
+order of increasing effort, but also cater to different access levels depending
+on whether the Fortran code can be freely modified.
 
-Below I'll describe three typical approaches of using F2PY.
 The following example Fortran 77 code will be used for
-illustration, save it as fib1.f:
+illustration, save it as ``fib1.f``:
 
-.. include:: fib1.f
-   :literal:
+.. literalinclude:: ./code/fib1.f
+   :language: fortran
 
 
 The quick way
 ==============
 
-The quickest way to wrap the Fortran subroutine ``FIB`` to Python is
-to run
+The quickest way to wrap the Fortran subroutine ``FIB`` for use in Python is to
+run
 
 ::
 
   python -m numpy.f2py -c fib1.f -m fib1
 
-This command builds (see ``-c`` flag, execute ``python -m numpy.f2py`` without
-arguments to see the explanation of command line options) an extension
-module ``fib1.so`` (see ``-m`` flag) to the current directory. Now, in
-Python the Fortran subroutine ``FIB`` is accessible via ``fib1.fib``::
+This command compiles and wraps ``fib1.f`` (``-c``) to create the extension
+module ``fib1.so`` (``-m``) in the current directory. A list of command line
+options can be seen by executing ``python -m numpy.f2py``.  Now, in Python the
+Fortran subroutine ``FIB`` is accessible via ``fib1.fib``::
 
-  >>> import numpy
+  >>> import numpy as np
   >>> import fib1
   >>> print(fib1.fib.__doc__)
   fib(a,[n])
@@ -67,21 +72,21 @@ Python the Fortran subroutine ``FIB`` is accessible via ``fib1.fib``::
   n : input int, optional
       Default: len(a)
 
-  >>> a = numpy.zeros(8, 'd')
+  >>> a = np.zeros(8, 'd')
   >>> fib1.fib(a)
   >>> print(a)
   [  0.   1.   1.   2.   3.   5.   8.  13.]
 
 .. note::
 
-  * Note that F2PY found that the second argument ``n`` is the
+  * Note that F2PY recognized that the second argument ``n`` is the
     dimension of the first array argument ``a``. Since by default all
     arguments are input-only arguments, F2PY concludes that ``n`` can
     be optional with the default value ``len(a)``.
 
   * One can use different values for optional ``n``::
 
-      >>> a1 = numpy.zeros(8, 'd')
+      >>> a1 = np.zeros(8, 'd')
       >>> fib1.fib(a1, 6)
       >>> print(a1)
       [ 0.  1.  1.  2.  3.  5.  0.  0.]
@@ -96,98 +101,94 @@ Python the Fortran subroutine ``FIB`` is accessible via ``fib1.fib``::
       >>>
 
     F2PY implements basic compatibility checks between related
-    arguments in order to avoid any unexpected crashes.
+    arguments in order to avoid unexpected crashes.
 
-  * When a NumPy array, that is Fortran contiguous and has a dtype
-    corresponding to presumed Fortran type, is used as an input array
+  * When a NumPy array, that is Fortran contiguous and has a ``dtype``
+    corresponding to presumed Fortran type, is used as an input array
     argument, then its C pointer is directly passed to Fortran.
 
-    Otherwise F2PY makes a contiguous copy (with a proper dtype) of
-    the input array and passes C pointer of the copy to Fortran
+    Otherwise F2PY makes a contiguous copy (with the proper ``dtype``) of
+    the input array and passes a C pointer of the copy to the Fortran
     subroutine. As a result, any possible changes to the (copy of)
     input array have no effect to the original argument, as
     demonstrated below::
 
-      >>> a = numpy.ones(8, 'i')
+      >>> a = np.ones(8, 'i')
       >>> fib1.fib(a)
       >>> print(a)
       [1 1 1 1 1 1 1 1]
 
-    Clearly, this is not an expected behaviour. The fact that the
-    above example worked with ``dtype=float`` is considered
-    accidental.
+    Clearly, this is unexpected, as Fortran typically passes by reference. That
+    the above example worked with ``dtype=float`` is considered accidental.
 
-    F2PY provides ``intent(inplace)`` attribute that would modify
+    F2PY provides an ``intent(inplace)`` attribute that modifies
     the attributes of an input array so that any changes made by
-    Fortran routine will be effective also in input argument. For example,
-    if one specifies ``intent(inplace) a`` (see below, how), then
-    the example above would read::
+    Fortran routine will be reflected in the input argument. For example,
+    if one specifies the ``intent(inplace) a`` directive (see subsequent
+    sections on how), then the example above would read::
 
-      >>> a = numpy.ones(8, 'i')
+      >>> a = np.ones(8, 'i')
       >>> fib1.fib(a)
       >>> print(a)
       [  0.   1.   1.   2.   3.   5.   8.  13.]
 
-    However, the recommended way to get changes made by Fortran
-    subroutine back to Python is to use ``intent(out)`` attribute. It
-    is more efficient and a cleaner solution.
-
-  * The usage of ``fib1.fib`` in Python is very similar to using
-    ``FIB`` in Fortran. However, using *in situ* output arguments in
-    Python indicates a poor style as there is no safety mechanism
-    in Python with respect to wrong argument types. When using Fortran
-    or C, compilers naturally discover any type mismatches during
-    compile time but in Python the types must be checked in
-    runtime. So, using *in situ* output arguments in Python may cause
-    difficult to find bugs, not to mention that the codes will be less
-    readable when all required type checks are implemented.
-
-  Though the demonstrated way of wrapping Fortran routines to Python
-  is very straightforward, it has several drawbacks (see the comments
-  above).  These drawbacks are due to the fact that there is no way
-  that F2PY can determine what is the actual intention of one or the
-  other argument, is it input or output argument, or both, or
-  something else. So, F2PY conservatively assumes that all arguments
-  are input arguments by default.
-
-  However, there are ways (see below) how to "teach" F2PY about the
-  true intentions (among other things) of function arguments; and then
-  F2PY is able to generate more Pythonic (more explicit, easier to
-  use, and less error prone) wrappers to Fortran functions.
+    However, the recommended way to have changes made by Fortran subroutine
+    propagate to Python is to use the ``intent(out)`` attribute. That approach is
+    more efficient and also cleaner.
+
+  * The usage of ``fib1.fib`` in Python is very similar to using ``FIB`` in
+    Fortran. However, using *in situ* output arguments in Python is poor style,
+    as there are no safety mechanisms in Python to protect against wrong
+    argument types. When using Fortran or C, compilers discover any type
+    mismatches during the compilation process, but in Python the types must be
+    checked at runtime. Consequently, using *in situ* output arguments in Python
+    may lead to difficult to find bugs, not to mention the fact that the
+    codes will be less readable when all required type checks are implemented.
+
+  Though the approach to wrapping Fortran routines for Python discussed so far is
+  very straightforward, it has several drawbacks (see the comments above).
+  The drawbacks are due to the fact that there is no way for F2PY to determine
+  the actual intention of the arguments; that is there is ambiguity in
+  distinguishing between input and output arguments. Consequently, F2PY assumes
+  that all arguments are input arguments by default.
+
+  However, there are ways (see below) to remove this ambiguity by "teaching"
+  F2PY about the true intentions of function arguments, and F2PY is then able to
+  generate more explicit, easier to use, and less error prone wrappers for
+  Fortran functions.
 
 The smart way
 ==============
 
-Let's apply the steps of wrapping Fortran functions to Python one by
+Let us apply the steps for wrapping Fortran functions to Python one by
 one.
 
-* First, we create a signature file from ``fib1.f`` by running
+* First, we create a signature file from ``fib1.f`` by running:
 
   ::
 
     python -m numpy.f2py fib1.f -m fib2 -h fib1.pyf
 
-  The signature file is saved to ``fib1.pyf`` (see ``-h`` flag) and
-  its contents is shown below.
+  The signature file is saved to ``fib1.pyf`` (see the ``-h`` flag) and
+  its contents are shown below.
 
-  .. include:: fib1.pyf
-     :literal:
+  .. literalinclude:: ./code/fib1.pyf
+     :language: fortran
 
-* Next, we'll teach F2PY that the argument ``n`` is an input argument
-  (use ``intent(in)`` attribute) and that the result, i.e. the
-  contents of ``a`` after calling Fortran function ``FIB``, should be
-  returned to Python (use ``intent(out)`` attribute). In addition, an
-  array ``a`` should be created dynamically using the size given by
-  the input argument ``n`` (use ``depend(n)`` attribute to indicate
-  dependence relation).
+* Next, we'll teach F2PY that the argument ``n`` is an input argument (using the
+  ``intent(in)`` attribute) and that the result, i.e., the contents of ``a``
+  after calling the Fortran function ``FIB``, should be returned to Python (using
+  the ``intent(out)`` attribute). In addition, an array ``a`` should be created
+  dynamically using the size determined by the input argument ``n`` (using the
+  ``depend(n)`` attribute to indicate this dependence relation).
 
-  The content of a modified version of ``fib1.pyf`` (saved as
+  The contents of a suitably modified version of ``fib1.pyf`` (saved as
   ``fib2.pyf``) is as follows:
 
-  .. include:: fib2.pyf
-     :literal:
+  .. literalinclude:: ./code/fib2.pyf
+     :language: fortran
 
-* And finally, we build the extension module by running
+* Finally, we build the extension module with ``numpy.distutils`` by running:
 
   ::
 
@@ -214,16 +215,14 @@ In Python::
 
 .. note::
 
-  * Clearly, the signature of ``fib2.fib`` now corresponds to the
-    intention of Fortran subroutine ``FIB`` more closely: given the
-    number ``n``, ``fib2.fib`` returns the first ``n`` Fibonacci numbers
-    as a NumPy array. Also, the new Python signature ``fib2.fib``
-    rules out any surprises that we experienced with ``fib1.fib``.
+  * The signature of ``fib2.fib`` now more closely corresponds to the
+    intention of Fortran subroutine ``FIB``: given the number ``n``,
+    ``fib2.fib`` returns the first ``n`` Fibonacci numbers as a NumPy array.
+    The new Python signature ``fib2.fib`` also rules out the unexpected behaviour in ``fib1.fib``.
 
-  * Note that by default using single ``intent(out)`` also implies
+  * Note that by default, using a single ``intent(out)`` also implies
     ``intent(hide)``. Arguments that have the ``intent(hide)`` attribute
-    specified will not be listed in the argument list of a wrapper
-    function.
+    specified will not be listed in the argument list of a wrapper function.
 
 The quick and smart way
 ========================
@@ -233,26 +232,25 @@ suitable for wrapping (e.g. third party) Fortran codes for which
 modifications to their source codes are not desirable nor even
 possible.
 
-However, if editing Fortran codes is acceptable, then the generation
-of an intermediate signature file can be skipped in most
-cases. Namely, F2PY specific attributes can be inserted directly to
-Fortran source codes using the so-called F2PY directive. A F2PY
-directive defines special comment lines (starting with ``Cf2py``, for
-example) which are ignored by Fortran compilers but F2PY interprets
-them as normal lines.
+However, if editing Fortran codes is acceptable, then the generation of an
+intermediate signature file can be skipped in most cases. F2PY specific
+attributes can be inserted directly into Fortran source codes using F2PY
+directives. A F2PY directive consists of special comment lines (starting with
+``Cf2py`` or ``!f2py``, for example) which are ignored by Fortran compilers but
+interpreted by F2PY as normal lines.
 
-Here is shown a modified version of the previous Fortran code, save it
-as ``fib3.f``:
+Consider a modified version of the previous Fortran code with F2PY directives,
+saved as ``fib3.f``:
 
-.. include:: fib3.f
-   :literal:
+.. literalinclude:: ./code/fib3.f
+   :language: fortran
 
 Building the extension module can be now carried out in one command::
 
   python -m numpy.f2py -c -m fib3 fib3.f
 
-Notice that the resulting wrapper to ``FIB`` is as "smart" as in
-previous case::
+Notice that the resulting wrapper to ``FIB`` is as "smart" (unambiguous) as in
+the previous case::
 
   >>> import fib3
   >>> print(fib3.fib.__doc__)
diff --git a/doc/source/f2py/fib1.f b/doc/source/f2py/fib1.f
deleted file mode 100644 (file)
index cfbb1ee..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-C FILE: FIB1.F
-      SUBROUTINE FIB(A,N)
-C
-C     CALCULATE FIRST N FIBONACCI NUMBERS
-C
-      INTEGER N
-      REAL*8 A(N)
-      DO I=1,N
-         IF (I.EQ.1) THEN
-            A(I) = 0.0D0
-         ELSEIF (I.EQ.2) THEN
-            A(I) = 1.0D0
-         ELSE 
-            A(I) = A(I-1) + A(I-2)
-         ENDIF
-      ENDDO
-      END
-C END FILE FIB1.F
diff --git a/doc/source/f2py/fib1.pyf b/doc/source/f2py/fib1.pyf
deleted file mode 100644 (file)
index 3d6cc0a..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-!    -*- f90 -*-
-python module fib2 ! in 
-    interface  ! in :fib2
-        subroutine fib(a,n) ! in :fib2:fib1.f
-            real*8 dimension(n) :: a
-            integer optional,check(len(a)>=n),depend(a) :: n=len(a)
-        end subroutine fib
-    end interface 
-end python module fib2
-
-! This file was auto-generated with f2py (version:2.28.198-1366).
-! See http://cens.ioc.ee/projects/f2py2e/
diff --git a/doc/source/f2py/fib2.pyf b/doc/source/f2py/fib2.pyf
deleted file mode 100644 (file)
index 4a5ae29..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-!    -*- f90 -*-
-python module fib2 
-    interface
-        subroutine fib(a,n)
-            real*8 dimension(n),intent(out),depend(n) :: a
-            integer intent(in) :: n
-        end subroutine fib
-    end interface 
-end python module fib2
diff --git a/doc/source/f2py/fib3.f b/doc/source/f2py/fib3.f
deleted file mode 100644 (file)
index 08b050c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-C FILE: FIB3.F
-      SUBROUTINE FIB(A,N)
-C
-C     CALCULATE FIRST N FIBONACCI NUMBERS
-C
-      INTEGER N
-      REAL*8 A(N)
-Cf2py intent(in) n
-Cf2py intent(out) a
-Cf2py depend(n) a
-      DO I=1,N
-         IF (I.EQ.1) THEN
-            A(I) = 0.0D0
-         ELSEIF (I.EQ.2) THEN
-            A(I) = 1.0D0
-         ELSE 
-            A(I) = A(I-1) + A(I-2)
-         ENDIF
-      ENDDO
-      END
-C END FILE FIB3.F
diff --git a/doc/source/f2py/ftype.f b/doc/source/f2py/ftype.f
deleted file mode 100644 (file)
index cabbb9e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-C FILE: FTYPE.F
-      SUBROUTINE FOO(N)
-      INTEGER N
-Cf2py integer optional,intent(in) :: n = 13
-      REAL A,X
-      COMMON /DATA/ A,X(3)
-      PRINT*, "IN FOO: N=",N," A=",A," X=[",X(1),X(2),X(3),"]"
-      END
-C END OF FTYPE.F
diff --git a/doc/source/f2py/ftype_session.dat b/doc/source/f2py/ftype_session.dat
deleted file mode 100644 (file)
index e39cc12..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
->>> import ftype
->>> print(ftype.__doc__)
-This module 'ftype' is auto-generated with f2py (version:2).
-Functions:
-  foo(n=13)
-COMMON blocks:
-  /data/ a,x(3)
-.
->>> type(ftype.foo), type(ftype.data)
-(<class 'fortran'>, <class 'fortran'>)
->>> ftype.foo()
- IN FOO: N= 13 A=  0. X=[  0.  0.  0.]
->>> ftype.data.a = 3
->>> ftype.data.x = [1,2,3]
->>> ftype.foo()
- IN FOO: N= 13 A=  3. X=[  1.  2.  3.]
->>> ftype.data.x[1] = 45  
->>> ftype.foo(24)
- IN FOO: N= 24 A=  3. X=[  1.  45.  3.]
->>> ftype.data.x
-array([  1.,  45.,   3.], dtype=float32)
index 4921396512cc68dddd664732f89102a7f980fb5c..56df31b4e752e53d580713c96596e9bccd0453ce 100644 (file)
@@ -1,8 +1,10 @@
-#####################################
-F2PY Users Guide and Reference Manual
-#####################################
+.. _f2py:
 
-The purpose of the ``F2PY`` --*Fortran to Python interface generator*--
+=====================================
+F2PY user guide and reference manual
+=====================================
+
+The purpose of the ``F2PY`` --*Fortran to Python interface generator*-- utility
 is to provide a connection between Python and Fortran
 languages.  F2PY is a part of NumPy_ (``numpy.f2py``) and also available as a
 standalone command line tool ``f2py`` when ``numpy`` is installed that
@@ -19,11 +21,11 @@ from Python.
 .. toctree::
    :maxdepth: 2
 
+   usage
    f2py.getting-started
-   signature-file
    python-usage
-   usage
-   distutils
+   signature-file
+   buildtools/index
    advanced
 
 .. _Python: https://www.python.org/
diff --git a/doc/source/f2py/moddata.f90 b/doc/source/f2py/moddata.f90
deleted file mode 100644 (file)
index 0e98f04..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-module mod
-  integer i
-  integer :: x(4)
-  real, dimension(2,3) :: a
-  real, allocatable, dimension(:,:) :: b 
-contains
-  subroutine foo
-    integer k
-    print*, "i=",i
-    print*, "x=[",x,"]"
-    print*, "a=["
-    print*, "[",a(1,1),",",a(1,2),",",a(1,3),"]"
-    print*, "[",a(2,1),",",a(2,2),",",a(2,3),"]"
-    print*, "]"
-    print*, "Setting a(1,2)=a(1,2)+3"
-    a(1,2) = a(1,2)+3
-  end subroutine foo
-end module mod
diff --git a/doc/source/f2py/moddata_session.dat b/doc/source/f2py/moddata_session.dat
deleted file mode 100644 (file)
index 824bd86..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
->>> import moddata
->>> print(moddata.mod.__doc__)
-i : 'i'-scalar
-x : 'i'-array(4)
-a : 'f'-array(2,3)
-b : 'f'-array(-1,-1), not allocated
-foo()
-
-Wrapper for ``foo``.
-
-
-
->>> moddata.mod.i = 5  
->>> moddata.mod.x[:2] = [1,2]
->>> moddata.mod.a = [[1,2,3],[4,5,6]]
->>> moddata.mod.foo()                
- i=           5
- x=[           1           2           0           0 ]
- a=[
- [   1.000000     ,   2.000000     ,   3.000000     ]
- [   4.000000     ,   5.000000     ,   6.000000     ]
- ]
- Setting a(1,2)=a(1,2)+3
->>> moddata.mod.a               # a is Fortran-contiguous
-array([[ 1.,  5.,  3.],
-       [ 4.,  5.,  6.]], dtype=float32)
->>> moddata.mod.a.flags.f_contiguous
-True
index 65c0cec646b49a0142e47b3897787b9238020ad4..ef8ccd7dd657a562b1e2c4f1d32972c097fe3465 100644 (file)
@@ -4,74 +4,76 @@ Using F2PY bindings in Python
 
 All wrappers for Fortran/C routines, common blocks, or for Fortran
 90 module data generated by F2PY are exposed to Python as ``fortran``
-type objects.  Routine wrappers are callable ``fortran`` type objects
+type objects. Routine wrappers are callable ``fortran`` type objects
 while wrappers to Fortran data have attributes referring to data
 objects.
 
-All ``fortran`` type objects have attribute ``_cpointer`` that contains
-CObject referring to the C pointer of the corresponding Fortran/C
-function or variable in C level. Such CObjects can be used as a
-callback argument of F2PY generated functions to bypass Python C/API
-layer of calling Python functions from Fortran or C when the
-computational part of such functions is implemented in C or Fortran
-and wrapped with F2PY (or any other tool capable of providing CObject
-of a function).
+All ``fortran`` type objects have an attribute ``_cpointer`` that contains a
+``CObject`` referring to the C pointer of the corresponding Fortran/C function
+or variable at the C level. Such ``CObjects`` can be used as a callback argument
+for F2PY generated functions to bypass the Python C/API layer for calling Python
+functions from Fortran or C when the computational aspects of such functions are
+implemented in C or Fortran and wrapped with F2PY (or any other tool capable of
+providing the ``CObject`` of a function).
 
-Consider a Fortran 77 file ``ftype.f``:
+Consider a Fortran 77 file ```ftype.f``:
 
-  .. include:: ftype.f
-     :literal:
+  .. literalinclude:: ./code/ftype.f
+     :language: fortran
 
-and build a wrapper using ``f2py -c ftype.f -m ftype``.
+and a wrapper built using ``f2py -c ftype.f -m ftype``.
 
 In Python:
 
-  .. include:: ftype_session.dat
-     :literal:
+  .. literalinclude:: ./code/results/ftype_session.dat
+     :language: python
 
 
 Scalar arguments
 =================
 
-In general, a scalar argument of a F2PY generated wrapper function can
+In general, a scalar argument for a F2PY generated wrapper function can
 be an ordinary Python scalar (integer, float, complex number) as well as
 an arbitrary sequence object (list, tuple, array, string) of
 scalars. In the latter case, the first element of the sequence object
 is passed to Fortran routine as a scalar argument.
 
-Note that when type-casting is required and there is possible loss of
-information (e.g. when type-casting float to integer or complex to
-float), F2PY does not raise any exception. In complex to real
-type-casting only the real part of a complex number is used.
+.. note::
+
+   * When type-casting is required and there is possible loss of information via
+     narrowing e.g. when type-casting float to integer or complex to float, F2PY
+     *does not* raise an exception.
 
-``intent(inout)`` scalar arguments are assumed to be array objects in
-order to have *in situ* changes be effective. It is recommended to use
-arrays with proper type but also other types work.
+     * For complex to real type-casting only the real part of a complex number is used.
+
+   * ``intent(inout)`` scalar arguments are assumed to be array objects in
+     order to have *in situ* changes be effective. It is recommended to use
+     arrays with proper type but also other types work.
 
 Consider the following Fortran 77 code:
 
-  .. include:: scalar.f
-     :literal:
+  .. literalinclude:: ./code/scalar.f
+     :language: fortran
 
 and wrap it using ``f2py -c -m scalar scalar.f``.
 
 In Python:
 
-  .. include:: scalar_session.dat
-     :literal:
+  .. literalinclude:: ./code/results/scalar_session.dat
+     :language: python
 
 
 String arguments
 =================
 
-F2PY generated wrapper functions accept (almost) any Python object as
-a string argument, ``str`` is applied for non-string objects.
+F2PY generated wrapper functions accept almost any Python object as
+a string argument, since ``str`` is applied for non-string objects.
 Exceptions are NumPy arrays that must have type code ``'c'`` or
 ``'1'`` when used as string arguments.
 
-A string can have arbitrary length when using it as a string argument
-to F2PY generated wrapper function. If the length is greater than
-expected, the string is truncated. If the length is smaller than
+A string can have an arbitrary length when used as a string argument
+for an F2PY generated wrapper function. If the length is greater than
+expected, the string is truncated silently. If the length is smaller than
 expected, additional memory is allocated and filled with ``\0``.
 
 Because Python strings are immutable, an ``intent(inout)`` argument
@@ -79,43 +81,43 @@ expects an array version of a string in order to have *in situ* changes be effec
 
 Consider the following Fortran 77 code:
 
-  .. include:: string.f
-     :literal:
+  .. literalinclude:: ./code/string.f
+     :language: fortran
 
 and wrap it using ``f2py -c -m mystring string.f``.
 
 Python session:
 
-  .. include:: string_session.dat
-     :literal:
+  .. literalinclude:: ./code/results/string_session.dat
+     :language: python
 
 
 Array arguments
 ================
 
-In general, array arguments of F2PY generated wrapper functions accept
-arbitrary sequences that can be transformed to NumPy array objects.
-An exception is ``intent(inout)`` array arguments that always must be
-proper-contiguous and have proper type, otherwise an exception is
-raised. Another exception is ``intent(inplace)`` array arguments that
-attributes will be changed *in situ* if the argument has different type
-than expected (see ``intent(inplace)`` attribute for more
-information).
-
-In general, if a NumPy array is proper-contiguous and has a proper
-type then it is directly passed to wrapped Fortran/C function.
-Otherwise, an element-wise copy of an input array is made and the
-copy, being proper-contiguous and with proper type, is used as an
-array argument.
+In general, array arguments for F2PY generated wrapper functions accept
+arbitrary sequences that can be transformed to NumPy array objects. There are
+two notable exceptions:
+
+* ``intent(inout)`` array arguments must always be proper-contiguous (defined below) and have a
+  compatible ``dtype``, otherwise an exception is raised.
+* ``intent(inplace)`` array arguments  will be changed *in situ* if the argument
+  has a different type than expected (see the ``intent(inplace)`` attribute for
+  more information).
+
+In general, if a NumPy array is proper-contiguous and has a proper type then it
+is directly passed to the wrapped Fortran/C function. Otherwise, an element-wise
+copy of the input array is made and the copy, being proper-contiguous and with
+proper type, is used as the array argument.
 
 There are two types of proper-contiguous NumPy arrays:
 
-* Fortran-contiguous arrays when data is stored column-wise,
-  i.e. indexing of data as stored in memory starts from the lowest
+* Fortran-contiguous arrays refer to data that is stored columnwise,
+  i.e. the indexing of data as stored in memory starts from the lowest
   dimension;
-* C-contiguous or simply contiguous arrays when data is stored
-  row-wise, i.e. indexing of data as stored in memory starts from the
-  highest dimension.
+* C-contiguous, or simply contiguous arrays, refer to data that is stored
+  rowwise, i.e. the indexing of data as stored in memory starts from the highest
+  dimension.
 
 For one-dimensional arrays these notions coincide.
 
@@ -132,30 +134,29 @@ To test whether an array is C-contiguous, use the ``.flags.c_contiguous``
 attribute of NumPy arrays.  To test for Fortran contiguity, use the
 ``.flags.f_contiguous`` attribute.
 
-Usually there is no need to worry about how the arrays are stored in
-memory and whether the wrapped functions, being either Fortran or C
-functions, assume one or another storage order. F2PY automatically
-ensures that wrapped functions get arguments with proper storage
-order; the corresponding algorithm is designed to make copies of
-arrays only when absolutely necessary. However, when dealing with very
-large multidimensional input arrays with sizes close to the size of
-the physical memory in your computer, then a care must be taken to use
-always proper-contiguous and proper type arguments.
+Usually there is no need to worry about how the arrays are stored in memory and
+whether the wrapped functions, being either Fortran or C functions, assume one
+or another storage order. F2PY automatically ensures that wrapped functions get
+arguments with the proper storage order; the underlying algorithm is designed to
+make copies of arrays only when absolutely necessary. However, when dealing with
+very large multidimensional input arrays with sizes close to the size of the
+physical memory in your computer, then care must be taken to ensure the usage of
+proper-contiguous and proper type arguments.
 
 To transform input arrays to column major storage order before passing
 them to Fortran routines, use the function ``numpy.asfortranarray(<array>)``.
 
 Consider the following Fortran 77 code:
 
-  .. include:: array.f
-     :literal:
+  .. literalinclude:: ./code/array.f
+     :language: fortran
 
 and wrap it using ``f2py -c -m arr array.f -DF2PY_REPORT_ON_ARRAY_COPY=1``.
 
 In Python:
 
-  .. include:: array_session.dat
-     :literal:
+  .. literalinclude:: ./code/results/array_session.dat
+     :language: python
 
 .. _Call-back arguments:
 
@@ -166,31 +167,32 @@ F2PY supports calling Python functions from Fortran or C codes.
 
 Consider the following Fortran 77 code:
 
-  .. include:: callback.f
-     :literal:
+  .. literalinclude:: ./code/callback.f
+     :language: fortran
 
 and wrap it using ``f2py -c -m callback callback.f``.
 
 In Python:
 
-  .. include:: callback_session.dat
-     :literal:
+  .. literalinclude:: ./code/results/callback_session.dat
+     :language: python
 
 In the above example F2PY was able to guess accurately the signature
-of a call-back function. However, sometimes F2PY cannot establish the
-signature as one would wish and then the signature of a call-back
-function must be modified in the signature file manually. Namely,
-signature files may contain special modules (the names of such modules
-contain a substring ``__user__``) that collect various signatures of
-call-back functions.  Callback arguments in routine signatures have
-attribute ``external`` (see also ``intent(callback)`` attribute).  To
-relate a callback argument and its signature in ``__user__`` module
-block, use ``use`` statement as illustrated below. The same signature
-of a callback argument can be referred in different routine
+of the call-back function. However, sometimes F2PY cannot establish the
+appropriate signature; in these cases the signature of the call-back
+function must be explicitly defined in the signature file.
+
+To facilitate this, signature files may contain special modules (the names of
+these modules contain the special ``__user__`` sub-string) that defines the
+various signatures for call-back functions.  Callback arguments in routine
+signatures have the ``external`` attribute (see also the ``intent(callback)``
+attribute). To relate a callback argument with its signature in a ``__user__``
+module block, a ``use`` statement can be utilized as illustrated below. The same
+signature for a callback argument can be referred to in different routine
 signatures.
 
-We use the same Fortran 77 code as in previous example but now
-we'll pretend that F2PY was not able to guess the signatures of
+We use the same Fortran 77 code as in the previous example but now
+we will pretend that F2PY was not able to guess the signatures of
 call-back arguments correctly. First, we create an initial signature
 file ``callback2.pyf`` using F2PY::
 
@@ -198,40 +200,40 @@ file ``callback2.pyf`` using F2PY::
 
 Then modify it as follows
 
-  .. include:: callback2.pyf
+  .. include:: ./code/callback2.pyf
      :literal:
 
-Finally, build the extension module using ``f2py -c callback2.pyf callback.f``.
+Finally, we build the extension module using ``f2py -c callback2.pyf callback.f``.
 
-An example Python session would be identical to the previous example
-except that argument names would differ.
+An example Python session for this snippet would be identical to the previous
+example except that the argument names would differ.
 
 Sometimes a Fortran package may require that users provide routines
 that the package will use. F2PY can construct an interface to such
-routines so that Python functions could be called from Fortran.
+routines so that Python functions can be called from Fortran.
 
-Consider the following Fortran 77 subroutine that takes an array
+Consider the following Fortran 77 subroutine that takes an array as its input
 and applies a function ``func`` to its elements.
 
-  .. include:: calculate.f
-     :literal:
+  .. literalinclude:: ./code/calculate.f
+     :language: fortran
 
-It is expected that function ``func`` has been defined
-externally. In order to use a Python function as ``func``, it must
-have an attribute ``intent(callback)`` (it must be specified before
-the ``external`` statement).
+The Fortran code expects that the function ``func`` has been defined externally.
+In order to use a Python function for ``func``, it must have an attribute
+``intent(callback)`` and, it must be specified before the ``external`` statement.
 
 Finally, build an extension module using ``f2py -c -m foo calculate.f``
 
 In Python:
 
-  .. include:: calculate_session.dat
-     :literal:
+  .. literalinclude:: ./code/results/calculate_session.dat
+     :language: python
 
-The function is included as an argument to the python function call to
-the Fortran subroutine even though it was *not* in the Fortran subroutine argument
-list. The "external" refers to the C function generated by f2py, not the python
-function itself. The python function must be supplied to the C function.
+The function is included as an argument to the python function call to the
+Fortran subroutine even though it was *not* in the Fortran subroutine argument
+list. The "external" keyword refers to the C function generated by f2py, not the
+python function itself. The python function is essentially being supplied to the
+C function.
 
 The callback function may also be explicitly set in the module.
 Then it is not necessary to pass the function in the argument list to
@@ -240,24 +242,24 @@ the python callback function is itself called by another Fortran function.
 
 Consider the following Fortran 77 subroutine:
 
-  .. include:: extcallback.f
-     :literal:
+  .. literalinclude:: ./code/extcallback.f
+     :language: fortran
 
 and wrap it using ``f2py -c -m pfromf extcallback.f``.
 
 In Python:
 
-  .. include:: extcallback_session.dat
-     :literal:
+  .. literalinclude:: ./code/results/extcallback_session.dat
+     :language: python
 
 Resolving arguments to call-back functions
-------------------------------------------
+===========================================
 
-F2PY generated interface is very flexible with respect to call-back
+F2PY generated interfaces are very flexible with respect to call-back
 arguments.  For each call-back argument an additional optional
 argument ``<name>_extra_args`` is introduced by F2PY. This argument
 can be used to pass extra arguments to user provided call-back
-arguments.
+functions.
 
 If a F2PY generated wrapper function expects the following call-back
 argument::
@@ -281,7 +283,7 @@ is provided by a user, and in addition,
   fun_extra_args = (e_1,...,e_p)
 
 is used, then the following rules are applied when a Fortran or C
-function calls the call-back argument ``gun``:
+function evaluates the call-back argument ``gun``:
 
 * If ``p == 0`` then ``gun(a_1, ..., a_q)`` is called, here
   ``q = min(m, n)``.
@@ -292,8 +294,8 @@ function calls the call-back argument ``gun``:
 * If ``n + p`` is less than the number of required arguments to ``gun``
   then an exception is raised.
 
-The function ``gun`` may return any number of objects as a tuple. Then
-following rules are applied:
+If the function ``gun`` may return any number of objects as a tuple; then
+the following rules are applied:
 
 * If ``k < l``, then ``y_{k + 1}, ..., y_l`` are ignored.
 * If ``k > l``, then only ``x_1, ..., x_l`` are set.
@@ -303,62 +305,62 @@ Common blocks
 ==============
 
 F2PY generates wrappers to ``common`` blocks defined in a routine
-signature block. Common blocks are visible by all Fortran codes linked
-with the current extension module, but not to other extension modules
-(this restriction is due to how Python imports shared libraries).  In
+signature block. Common blocks are visible to all Fortran codes linked
+to the current extension module, but not to other extension modules
+(this restriction is due to the way Python imports shared libraries).  In
 Python, the F2PY wrappers to ``common`` blocks are ``fortran`` type
-objects that have (dynamic) attributes related to data members of
-common blocks. When accessed, these attributes return as NumPy array
-objects (multidimensional arrays are Fortran-contiguous) that
+objects that have (dynamic) attributes related to the data members of
+the common blocks. When accessed, these attributes return as NumPy array
+objects (multidimensional arrays are Fortran-contiguous) which
 directly link to data members in common blocks. Data members can be
 changed by direct assignment or by in-place changes to the
 corresponding array objects.
 
 Consider the following Fortran 77 code:
 
-  .. include:: common.f
-     :literal:
+  .. literalinclude:: ./code/common.f
+     :language: fortran
 
 and wrap it using ``f2py -c -m common common.f``.
 
 In Python:
 
-  .. include:: common_session.dat
-     :literal:
+  .. literalinclude:: ./code/results/common_session.dat
+     :language: python
 
 
 Fortran 90 module data
 =======================
 
-The F2PY interface to Fortran 90 module data is similar to Fortran 77
+The F2PY interface to Fortran 90 module data is similar to the handling of Fortran 77
 common blocks.
 
 Consider the following Fortran 90 code:
 
-  .. include:: moddata.f90
-     :literal:
+  .. literalinclude:: ./code/moddata.f90
+     :language: fortran
 
 and wrap it using ``f2py -c -m moddata moddata.f90``.
 
 In Python:
 
-  .. include:: moddata_session.dat
-     :literal:
+  .. literalinclude:: ./code/results/moddata_session.dat
+     :language: python
 
 
 Allocatable arrays
--------------------
+===================
 
 F2PY has basic support for Fortran 90 module allocatable arrays.
 
 Consider the following Fortran 90 code:
 
-  .. include:: allocarr.f90
-     :literal:
+  .. literalinclude:: ./code/allocarr.f90
+     :language: fortran
 
 and wrap it using ``f2py -c -m allocarr allocarr.f90``.
 
 In Python:
 
-  .. include:: allocarr_session.dat
-     :literal:
+  .. literalinclude:: ./code/results/allocarr_session.dat
+     :language: python
diff --git a/doc/source/f2py/run_main_session.dat b/doc/source/f2py/run_main_session.dat
deleted file mode 100644 (file)
index be6cacd..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
->>> import numpy.f2py
->>> r = numpy.f2py.run_main(['-m','scalar','doc/source/f2py/scalar.f'])
-Reading fortran codes...
-        Reading file 'doc/source/f2py/scalar.f' (format:fix,strict)
-Post-processing...
-        Block: scalar
-                        Block: FOO
-Building modules...
-        Building module "scalar"...
-        Wrote C/API module "scalar" to file "./scalarmodule.c"
->>> print(r)
-{'scalar': {'h': ['/home/users/pearu/src_cvs/f2py/src/fortranobject.h'],
-        'csrc': ['./scalarmodule.c', 
-                  '/home/users/pearu/src_cvs/f2py/src/fortranobject.c']}}
diff --git a/doc/source/f2py/scalar.f b/doc/source/f2py/scalar.f
deleted file mode 100644 (file)
index c22f639..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-C FILE: SCALAR.F
-      SUBROUTINE FOO(A,B)
-      REAL*8 A, B
-Cf2py intent(in) a
-Cf2py intent(inout) b
-      PRINT*, "    A=",A," B=",B
-      PRINT*, "INCREMENT A AND B"
-      A = A + 1D0
-      B = B + 1D0
-      PRINT*, "NEW A=",A," B=",B
-      END
-C END OF FILE SCALAR.F
diff --git a/doc/source/f2py/scalar_session.dat b/doc/source/f2py/scalar_session.dat
deleted file mode 100644 (file)
index 3bb45ed..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
->>> import scalar
->>> print(scalar.foo.__doc__)
-foo(a,b)
-
-Wrapper for ``foo``.
-
-Parameters
-----------
-a : input float
-b : in/output rank-0 array(float,'d')
->>> scalar.foo(2, 3)   
-     A=  2. B=  3.
- INCREMENT A AND B
- NEW A=  3. B=  4.
->>> import numpy
->>> a = numpy.array(2)   # these are integer rank-0 arrays
->>> b = numpy.array(3)
->>> scalar.foo(a, b)
-     A=  2. B=  3.
- INCREMENT A AND B
- NEW A=  3. B=  4.
->>> print(a, b)          # note that only b is changed in situ
-2 4
diff --git a/doc/source/f2py/setup_example.py b/doc/source/f2py/setup_example.py
deleted file mode 100644 (file)
index 479acc0..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-from numpy.distutils.core import Extension
-
-ext1 = Extension(name = 'scalar',
-                 sources = ['scalar.f'])
-ext2 = Extension(name = 'fib2',
-                 sources = ['fib2.pyf', 'fib1.f'])
-
-if __name__ == "__main__":
-    from numpy.distutils.core import setup
-    setup(name = 'f2py_example',
-          description       = "F2PY Users Guide examples",
-          author            = "Pearu Peterson",
-          author_email      = "pearu@cens.ioc.ee",
-          ext_modules = [ext1, ext2]
-          )
-# End of setup_example.py
index 3a163ee23d87632a73e80bab9f1d18c25fe4d4cb..b80b31509661e0a2664d85fda80dea0a32ab133b 100644 (file)
@@ -2,23 +2,22 @@
  Signature file
 ==================
 
-The syntax specification for signature files (.pyf files) is borrowed
-from the Fortran 90/95 language specification. Almost all Fortran
-90/95 standard constructs are understood, both in free and fixed
-format (recall that Fortran 77 is a subset of Fortran 90/95). F2PY
-introduces also some extensions to Fortran 90/95 language
-specification that help designing Fortran to Python interface, make it
-more "Pythonic".
-
-Signature files may contain arbitrary Fortran code (so that Fortran
-codes can be considered as signature files). F2PY silently ignores
+The syntax specification for signature files (.pyf files) is modeled on the
+Fortran 90/95 language specification. Almost all Fortran 90/95 standard
+constructs are understood, both in free and fixed format (recall that Fortran 77
+is a subset of Fortran 90/95). F2PY introduces some extensions to the Fortran
+90/95 language specification that help in the design of the Fortran to Python
+interface, making it more "Pythonic".
+
+Signature files may contain arbitrary Fortran code so that any Fortran 90/95
+codes can be treated as signature files. F2PY silently ignores
 Fortran constructs that are irrelevant for creating the interface.
-However, this includes also syntax errors. So, be careful not making
-ones ;-).
+However, this also means that syntax errors are not caught by F2PY and will only
+be caught when the library is built.
 
-In general, the contents of signature files is case-sensitive.  When
-scanning Fortran codes and writing a signature file, F2PY lowers all
-cases automatically except in multiline blocks or when ``--no-lower``
+In general, the contents of the signature files are case-sensitive. When
+scanning Fortran codes to generate a signature file, F2PY lowers all
+cases automatically except in multi-line blocks or when the ``--no-lower``
 option is used.
 
 The syntax of signature files is presented below.
@@ -27,13 +26,15 @@ Python module block
 =====================
 
 A signature file may contain one (recommended) or more ``python
-module`` blocks.  ``python module`` block describes the contents of
+module`` blocks. The ``python module`` block describes the contents of
 a Python/C extension module ``<modulename>module.c`` that F2PY
 generates.
 
-Exception: if ``<modulename>`` contains a substring ``__user__``, then
-the corresponding ``python module`` block describes the signatures of
-so-called call-back functions (see :ref:`Call-back arguments`).
+.. warning::
+
+   Exception: if ``<modulename>`` contains a substring ``__user__``, then the
+   corresponding ``python module`` block describes the signatures of call-back
+   functions (see :ref:`Call-back arguments`).
 
 A ``python module`` block has the following structure::
 
@@ -56,9 +57,9 @@ A ``python module`` block has the following structure::
     ]...
   end [python module [<modulename>]]
 
-Here brackets ``[]`` indicate an optional part, dots ``...`` indicate
-one or more of a previous part. So, ``[]...`` reads zero or more of a
-previous part.
+Here brackets ``[]`` indicate an optional section, dots ``...`` indicate one or
+more of a previous section. So, ``[]...`` is to be read as zero or more of a
+previous section.
 
 
 Fortran/C routine signatures
@@ -93,7 +94,7 @@ The signature of a Fortran block data has the following structure::
   end [ block data [<block data name>] ]
 
 Type declarations
------------------
+=================
 
 The definition of the ``<argument/variable type declaration>`` part
 is
@@ -123,33 +124,36 @@ where
 
 and
 
-+ ``<attrspec>`` is a comma separated list of attributes_;
+* ``<attrspec>`` is a comma separated list of attributes_;
 
-+ ``<arrayspec>`` is a comma separated list of dimension bounds;
+* ``<arrayspec>`` is a comma separated list of dimension bounds;
 
-+ ``<init_expr>`` is a `C expression`__.
+* ``<init_expr>`` is a `C expression`__;
 
-+ ``<intlen>`` may be negative integer for ``integer`` type
+* ``<intlen>`` may be negative integer for ``integer`` type
   specifications. In such cases ``integer*<negintlen>`` represents
-  unsigned C integers.
+  unsigned C integers;
 
 __ `C expressions`_
 
 If an argument has no ``<argument type declaration>``, its type is
 determined by applying ``implicit`` rules to its name.
 
-
 Statements
-----------
+==========
+
+Attribute statements
+^^^^^^^^^^^^^^^^^^^^^
 
-Attribute statements:
-  The ``<argument/variable attribute statement>`` is
+* The ``<argument/variable attribute statement>`` is
   ``<argument/variable type declaration>`` without ``<typespec>``.
-  In addition, in an attribute statement one cannot use other
+* In addition, in an attribute statement one cannot use other
   attributes, also ``<entitydecl>`` can be only a list of names.
 
-Use statements:
-  The definition of the ``<use statement>`` part is
+Use statements
+^^^^^^^^^^^^^^^
+
+* The definition of the ``<use statement>`` part is
 
   ::
 
@@ -161,12 +165,14 @@ Use statements:
 
      <rename_list> := <local_name> => <use_name> [ , <rename_list> ]
 
-  Currently F2PY uses ``use`` statement only for linking call-back
+* Currently F2PY uses ``use`` statement only for linking call-back
   modules and ``external`` arguments (call-back functions), see
   :ref:`Call-back arguments`.
 
-Common block statements:
-  The definition of the ``<common block statement>`` part is
+Common block statements
+^^^^^^^^^^^^^^^^^^^^^^^
+
+* The definition of the ``<common block statement>`` part is
 
   ::
 
@@ -178,18 +184,19 @@ Common block statements:
 
     <shortentitydecl> := <name> [ ( <arrayspec> ) ] [ , <shortentitydecl> ]
 
-  If a ``python module`` block contains two or more ``common`` blocks
+* If a ``python module`` block contains two or more ``common`` blocks
   with the same name, the variables from the additional declarations
   are appended.  The types of variables in ``<shortentitydecl>`` are
   defined using ``<argument type declarations>``. Note that the
   corresponding ``<argument type declarations>`` may contain array
-  specifications; then you don't need to specify these in
-  ``<shortentitydecl>``.
+  specifications; then these need not be specified in ``<shortentitydecl>``.
 
-Other statements:
-  The ``<other statement>`` part refers to any other Fortran language
+Other statements
+^^^^^^^^^^^^^^^^^
+
+* The ``<other statement>`` part refers to any other Fortran language
   constructs that are not described above. F2PY ignores most of them
-  except
+  except the following:
 
   + ``call`` statements and function calls of ``external`` arguments
     (`more details`__?);
@@ -223,7 +230,7 @@ Other statements:
       Implicit rules are used to determine the type specification of
       a variable (from the first-letter of its name) if the variable
       is not defined using ``<variable type declaration>``.  Default
-      implicit rule is given by
+      implicit rules are given by:
 
       ::
 
@@ -234,153 +241,170 @@ Other statements:
 
         entry <entry name> [([<arguments>])]
 
-      F2PY generates wrappers to all entry names using the signature
+      F2PY generates wrappers for all entry names using the signature
       of the routine block.
 
-      Tip: ``entry`` statement can be used to describe the signature
-      of an arbitrary routine allowing F2PY to generate a number of
-      wrappers from only one routine block signature. There are few
-      restrictions while doing this: ``fortranname`` cannot be used,
-      ``callstatement`` and ``callprotoargument`` can be used only if
-      they are valid for all entry routines, etc.
+      .. note::
+
+        The ``entry`` statement can be used to describe the signature of an
+        arbitrary subroutine or function allowing F2PY to generate a number of
+        wrappers from only one routine block signature. There are few
+        restrictions while doing this: ``fortranname`` cannot be used,
+        ``callstatement`` and ``callprotoargument`` can be used only if they are
+        valid for all entry routines, etc.
+
+F2PY statements
+^^^^^^^^^^^^^^^^
 
   In addition, F2PY introduces the following statements:
 
-  + ``threadsafe``
-      Use ``Py_BEGIN_ALLOW_THREADS .. Py_END_ALLOW_THREADS`` block
-      around the call to Fortran/C function.
-
-  + ``callstatement <C-expr|multi-line block>``
-      Replace F2PY generated call statement to Fortran/C function with
-      ``<C-expr|multi-line block>``. The wrapped Fortran/C function
-      is available as ``(*f2py_func)``. To raise an exception, set
-      ``f2py_success = 0`` in ``<C-expr|multi-line block>``.
-
-  + ``callprotoargument <C-typespecs>``
-      When ``callstatement`` statement is used then F2PY may not
-      generate proper prototypes for Fortran/C functions (because
-      ``<C-expr>`` may contain any function calls and F2PY has no way
-      to determine what should be the proper prototype). With this
-      statement you can explicitly specify the arguments of the
-      corresponding prototype::
-
-        extern <return type> FUNC_F(<routine name>,<ROUTINE NAME>)(<callprotoargument>);
-
-  + ``fortranname [<actual Fortran/C routine name>]``
-      You can use arbitrary ``<routine name>`` for a given Fortran/C
-      function. Then you have to specify
-      ``<actual Fortran/C routine name>`` with this statement.
-
-      If ``fortranname`` statement is used without
-      ``<actual Fortran/C routine name>`` then a dummy wrapper is
-      generated.
-
-  + ``usercode <multi-line block>``
-      When used inside ``python module`` block, then given C code
-      will be inserted to generated C/API source just before
-      wrapper function definitions. Here you can define arbitrary
-      C functions to be used in initialization of optional arguments,
-      for example. If ``usercode`` is used twice inside ``python
-      module`` block then the second multiline block is inserted
-      after the definition of external routines.
-
-      When used inside ``<routine signature>``, then given C code will
-      be inserted to the corresponding wrapper function just after
-      declaring variables but before any C statements. So, ``usercode``
-      follow-up can contain both declarations and C statements.
-
-      When used inside the first ``interface`` block, then given C
-      code will be inserted at the end of the initialization
-      function of the extension module. Here you can modify extension
-      modules dictionary. For example, for defining additional
-      variables etc.
-
-  + ``pymethoddef <multiline block>``
-      Multiline block will be inserted to the definition of
-      module methods ``PyMethodDef``-array. It must be a
-      comma-separated list of C arrays (see `Extending and Embedding`__
-      Python documentation for details).
-      ``pymethoddef`` statement can be used only inside
-      ``python module`` block.
+``threadsafe``
+  Uses a ``Py_BEGIN_ALLOW_THREADS .. Py_END_ALLOW_THREADS`` block
+  around the call to Fortran/C function.
+
+``callstatement <C-expr|multi-line block>``
+  Replaces the  F2PY generated call statement to Fortran/C function with
+  ``<C-expr|multi-line block>``. The wrapped Fortran/C function is available
+  as ``(*f2py_func)``.
+
+  To raise an exception, set ``f2py_success = 0`` in ``<C-expr|multi-line
+  block>``.
+
+``callprotoargument <C-typespecs>``
+  When the ``callstatement`` statement is used then F2PY may not
+  generate proper prototypes for Fortran/C functions (because
+  ``<C-expr>`` may contain any function calls and F2PY has no way
+  to determine what should be the proper prototype).
+
+  With this statement you can explicitly specify the arguments of the
+  corresponding prototype::
+
+    extern <return type> FUNC_F(<routine name>,<ROUTINE NAME>)(<callprotoargument>);
+
+``fortranname [<actual Fortran/C routine name>]``
+  F2PY allows for the use of an arbitrary ``<routine name>`` for a given
+  Fortran/C function. Then this statement is used for the ``<actual
+  Fortran/C routine name>``.
+
+  If ``fortranname`` statement is used without
+  ``<actual Fortran/C routine name>`` then a dummy wrapper is
+  generated.
+
+``usercode <multi-line block>``
+  When this is used inside a ``python module`` block, the given C code will
+  be inserted to generated C/API source just before wrapper function
+  definitions.
+
+  Here you can define arbitrary C functions to be used for the
+  initialization of optional arguments.
+
+  For example, if ``usercode`` is used twice inside ``python module`` block
+  then the second multi-line block is inserted after the definition of
+  the external routines.
+
+  When used inside ``<routine signature>``, then the given C code will be
+  inserted into the corresponding wrapper function just after the
+  declaration of  variables but before any C statements. So, the
+  ``usercode`` follow-up can contain both declarations and C statements.
+
+  When used inside the first ``interface`` block, then the given C code will
+  be inserted at the end of the initialization function of the extension
+  module. This is how the extension modules dictionary can be modified and
+  has many use-cases; for example, to define additional variables.
+
+``pymethoddef <multiline block>``
+  This is a multi-line block which will be inserted into the definition of a
+  module methods ``PyMethodDef``-array. It must be a comma-separated list of
+  C arrays (see `Extending and Embedding`__ Python documentation for
+  details).  ``pymethoddef`` statement can be used only inside ``python
+  module`` block.
 
   __ https://docs.python.org/extending/index.html
 
 Attributes
-------------
+============
 
 The following attributes are used by F2PY:
 
 ``optional``
   The corresponding argument is moved to the end of ``<optional
   arguments>`` list. A default value for an optional argument can be
-  specified ``<init_expr>``, see ``entitydecl`` definition. Note that
-  the default value must be given as a valid C expression.
+  specified via ``<init_expr>``, see the ``entitydecl`` definition.
+
 
-  Note that whenever ``<init_expr>`` is used, ``optional`` attribute
-  is set automatically by F2PY.
+  .. note::
 
-  For an optional array argument, all its dimensions must be bounded.
+   * The default value must be given as a valid C expression.
+   * Whenever ``<init_expr>`` is used, ``optional`` attribute
+     is set automatically by F2PY.
+   * For an optional array argument, all its dimensions must be bounded.
 
 ``required``
-  The corresponding argument is considered as a required one. This is
-  default. You need to specify ``required`` only if there is a need to
-  disable automatic ``optional`` setting when ``<init_expr>`` is used.
+  The corresponding argument with this attribute considered mandatory. This is
+  the default. ``required`` should only be specified if there is a need to
+  disable the automatic ``optional`` setting when ``<init_expr>`` is used.
 
-  If Python ``None`` object is used as a required argument, the
+  If Python ``None`` object is used as a required argument, the
   argument is treated as optional. That is, in the case of array
-  argument, the memory is allocated. And if ``<init_expr>`` is given,
-  the corresponding initialization is carried out.
+  argument, the memory is allocated. If ``<init_expr>`` is given, then the
+  corresponding initialization is carried out.
 
 ``dimension(<arrayspec>)``
-  The corresponding variable is considered as an array with given
-  dimensions in ``<arrayspec>``.
+  The corresponding variable is considered as an array with dimensions given in
+  ``<arrayspec>``.
 
 ``intent(<intentspec>)``
   This specifies the "intention" of the corresponding
   argument. ``<intentspec>`` is a comma separated list of the
   following keys:
 
-  + ``in``
-      The argument is considered as an input-only argument. It means
-      that the value of the argument is passed to Fortran/C function and
-      that function is expected not to change the value of an argument.
-
-  + ``inout``
-      The argument is considered as an input/output or *in situ*
-      output argument. ``intent(inout)`` arguments can be only
-      "contiguous" NumPy arrays with proper type and size.  Here
-      "contiguous" can be either in Fortran or C sense. The latter one
-      coincides with the contiguous concept used in NumPy and is
-      effective only if ``intent(c)`` is used. Fortran contiguity
-      is assumed by default.
-
-      Using ``intent(inout)`` is generally not recommended, use
-      ``intent(in,out)`` instead. See also ``intent(inplace)`` attribute.
-
-  + ``inplace``
-      The argument is considered as an input/output or *in situ*
-      output argument. ``intent(inplace)`` arguments must be
-      NumPy arrays with proper size. If the type of an array is
-      not "proper" or the array is non-contiguous then the array
-      will be changed in-place to fix the type and make it contiguous.
-
-      Using ``intent(inplace)`` is generally not recommended either.
-      For example, when slices have been taken from an
-      ``intent(inplace)`` argument then after in-place changes,
-      slices data pointers may point to unallocated memory area.
-
-  + ``out``
-      The argument is considered as a return variable. It is appended
-      to the ``<returned variables>`` list. Using ``intent(out)``
-      sets ``intent(hide)`` automatically, unless also
-      ``intent(in)`` or ``intent(inout)`` were used.
-
-      By default, returned multidimensional arrays are
-      Fortran-contiguous. If ``intent(c)`` is used, then returned
-      multidimensional arrays are C-contiguous.
-
-  + ``hide``
-      The argument is removed from the list of required or optional
+  * ``in``
+      The corresponding argument is considered to be input-only. This means that the value of
+      the argument is passed to a Fortran/C function and that the function is
+      expected to not change the value of this argument.
+
+  * ``inout``
+      The corresponding argument is marked for input/output or as an *in situ* output
+      argument. ``intent(inout)`` arguments can be only "contiguous" NumPy
+      arrays with proper type and size. Here "contiguous" can be either in the
+      Fortran or C sense. The latter  coincides with the default contiguous
+      concept used in NumPy and is effective only if ``intent(c)`` is used. F2PY
+      assumes Fortran contiguous arguments by default.
+
+      .. note::
+
+         Using ``intent(inout)`` is generally not recommended, use ``intent(in,out)`` instead.
+
+     See also the ``intent(inplace)`` attribute.
+
+  * ``inplace``
+      The corresponding argument is considered to be an input/output or *in situ* output
+      argument. ``intent(inplace)`` arguments must be NumPy arrays of a proper
+      size. If the type of an array is not "proper" or the array is
+      non-contiguous then the array will be modified in-place to fix the type and
+      make it contiguous.
+
+      .. note::
+
+        Using ``intent(inplace)`` is generally not recommended either.
+
+        For example, when slices have been taken from an ``intent(inplace)`` argument
+        then after in-place changes, the data pointers for the slices may point to
+        an unallocated memory area.
+
+
+  * ``out``
+      The corresponding argument is considered to be a return variable. It is appended to the
+      ``<returned variables>`` list. Using ``intent(out)`` sets ``intent(hide)``
+      automatically, unless  ``intent(in)`` or ``intent(inout)`` are specified
+      as well.
+
+      By default, returned multidimensional arrays are Fortran-contiguous. If
+      ``intent(c)`` attribute is used, then the returned multidimensional arrays
+      are C-contiguous.
+
+  * ``hide``
+      The corresponding argument is removed from the list of required or optional
       arguments. Typically ``intent(hide)`` is used with ``intent(out)``
       or when ``<init_expr>`` completely determines the value of the
       argument like in the following example::
@@ -388,18 +412,17 @@ The following attributes are used by F2PY:
         integer intent(hide),depend(a) :: n = len(a)
         real intent(in),dimension(n) :: a
 
-  + ``c``
-      The argument is treated as a C scalar or C array argument.  In
-      the case of a scalar argument, its value is passed to C function
-      as a C scalar argument (recall that Fortran scalar arguments are
-      actually C pointer arguments).  In the case of an array
-      argument, the wrapper function is assumed to treat
+  * ``c``
+      The corresponding argument is treated as a C scalar or C array argument. For the case
+      of a scalar argument, its value is passed to a C function as a C scalar
+      argument (recall that Fortran scalar arguments are actually C pointer
+      arguments).  For array arguments, the wrapper function is assumed to treat
       multidimensional arrays as C-contiguous arrays.
 
       There is no need to use ``intent(c)`` for one-dimensional
-      arrays, no matter if the wrapped function is either a Fortran or
-      a C function. This is because the concepts of Fortran- and
-      C contiguity overlap in one-dimensional cases.
+      arrays, irrespective of whether the wrapped function is in Fortran or C.
+      This is because the concepts of Fortran- and C contiguity overlap in
+      one-dimensional cases.
 
       If ``intent(c)`` is used as a statement but without an entity
       declaration list, then F2PY adds the ``intent(c)`` attribute to all
@@ -409,110 +432,121 @@ The following attributes are used by F2PY:
       attribute for ``<routine name>`` in order to disable Fortran
       specific ``F_FUNC(..,..)`` macros.
 
-  + ``cache``
-      The argument is treated as a junk of memory. No Fortran nor C
-      contiguity checks are carried out. Using ``intent(cache)``
-      makes sense only for array arguments, also in connection with
-      ``intent(hide)`` or ``optional`` attributes.
-
-  + ``copy``
-      Ensure that the original contents of ``intent(in)`` argument is
-      preserved. Typically used in connection with ``intent(in,out)``
-      attribute.  F2PY creates an optional argument
-      ``overwrite_<argument name>`` with the default value ``0``.
-
-  + ``overwrite``
-      The original contents of the ``intent(in)`` argument may be
-      altered by the Fortran/C function.  F2PY creates an optional
-      argument ``overwrite_<argument name>`` with the default value
-      ``1``.
-
-  + ``out=<new name>``
-      Replace the return name with ``<new name>`` in the ``__doc__``
-      string of a wrapper function.
-
-  + ``callback``
-      Construct an external function suitable for calling Python function
+  * ``cache``
+      The corresponding argument is treated as junk memory. No Fortran nor C contiguity
+      checks are carried out. Using ``intent(cache)`` makes sense only for array
+      arguments, also in conjunction with ``intent(hide)`` or ``optional``
+      attributes.
+
+  * ``copy``
+      Ensures that the original contents of ``intent(in)`` argument is
+      preserved. Typically used with the ``intent(in,out)`` attribute. F2PY
+      creates an optional argument ``overwrite_<argument name>`` with the
+      default value ``0``.
+
+  * ``overwrite``
+      This indicates that the original contents of the ``intent(in)`` argument
+      may be altered by the Fortran/C function.  F2PY creates an optional
+      argument ``overwrite_<argument name>`` with the default value ``1``.
+
+  * ``out=<new name>``
+      Replaces the returned name with ``<new name>`` in the ``__doc__`` string
+      of the wrapper function.
+
+  * ``callback``
+      Constructs an external function suitable for calling Python functions
       from Fortran. ``intent(callback)`` must be specified before the
-      corresponding ``external`` statement. If 'argument' is not in
-      argument list then it will be added to Python wrapper but only
-      initializing external function.
-
-      Use ``intent(callback)`` in situations where a Fortran/C code
-      assumes that a user implements a function with given prototype
-      and links it to an executable. Don't use ``intent(callback)``
-      if function appears in the argument list of a Fortran routine.
-
-      With ``intent(hide)`` or ``optional`` attributes specified and
-      using a wrapper function without specifying the callback argument
-      in argument list then call-back function is looked in the
-      namespace of F2PY generated extension module where it can be
-      set as a module attribute by a user.
-
-  + ``aux``
-      Define auxiliary C variable in F2PY generated wrapper function.
-      Useful to save parameter values so that they can be accessed
-      in initialization expression of other variables. Note that
-      ``intent(aux)`` silently implies ``intent(c)``.
+      corresponding ``external`` statement. If the 'argument' is not in
+      the argument list then it will be added to Python wrapper but only
+      by initializing an external function.
+
+      .. note::
+
+         Use ``intent(callback)`` in situations where the Fortran/C code assumes
+         that the user implemented a function with a given prototype and linked
+         it to an executable. Don't use ``intent(callback)`` if the function
+         appears in the argument list of a Fortran routine.
+
+      With ``intent(hide)`` or ``optional`` attributes specified and using a
+      wrapper function without specifying the callback argument in the argument
+      list; then the call-back function is assumed to be found in the  namespace
+      of the F2PY generated extension module where it can be set as a module
+      attribute by a user.
+
+  * ``aux``
+      Defines an auxiliary C variable in the F2PY generated wrapper function.
+      Useful to save parameter values so that they can be accessed in
+      initialization expressions for other variables.
+
+      .. note::
+
+         ``intent(aux)`` silently implies ``intent(c)``.
 
   The following rules apply:
 
-  + If no ``intent(in | inout | out | hide)`` is specified,
+  * If none of ``intent(in | inout | out | hide)`` are specified,
     ``intent(in)`` is assumed.
-  + ``intent(in,inout)`` is ``intent(in)``.
-  + ``intent(in,hide)`` or ``intent(inout,hide)`` is
-    ``intent(hide)``.
-  + ``intent(out)`` is ``intent(out,hide)`` unless ``intent(in)`` or
-    ``intent(inout)`` is specified.
-  + If ``intent(copy)`` or ``intent(overwrite)`` is used, then an
-    additional optional argument is introduced with a name
-    ``overwrite_<argument name>`` and a default value 0 or 1, respectively.
-  + ``intent(inout,inplace)`` is ``intent(inplace)``.
-  + ``intent(in,inplace)`` is ``intent(inplace)``.
-  + ``intent(hide)`` disables ``optional`` and ``required``.
+
+    * ``intent(in,inout)`` is ``intent(in)``;
+
+    * ``intent(in,hide)`` or ``intent(inout,hide)`` is ``intent(hide)``;
+
+    * ``intent(out)`` is ``intent(out,hide)`` unless ``intent(in)`` or
+      ``intent(inout)`` is specified.
+
+  * If ``intent(copy)`` or ``intent(overwrite)`` is used, then an additional
+    optional argument is introduced with a name ``overwrite_<argument name>``
+    and a default value 0 or 1, respectively.
+
+    * ``intent(inout,inplace)`` is ``intent(inplace)``;
+
+    * ``intent(in,inplace)`` is ``intent(inplace)``;
+
+    * ``intent(hide)`` disables ``optional`` and ``required``.
 
 ``check([<C-booleanexpr>])``
-  Perform consistency check of arguments by evaluating
-  ``<C-booleanexpr>``; if ``<C-booleanexpr>`` returns 0, an exception
-  is raised.
+  Performs a consistency check on the arguments by evaluating
+  ``<C-booleanexpr>``; if ``<C-booleanexpr>`` returns 0, an exception is raised.
+
+  .. note::
 
-  If ``check(..)`` is not used then F2PY generates few standard checks
-  (e.g. in a case of an array argument, check for the proper shape
-  and size) automatically. Use ``check()`` to disable checks generated
-  by F2PY.
+     If ``check(..)`` is not used then F2PY automatically generates a few
+     standard checks (e.g.  in a case of an array argument, it checks for the
+     proper shape and size). Use ``check()`` to disable checks
+     generated by F2PY.
 
 ``depend([<names>])``
   This declares that the corresponding argument depends on the values
-  of variables in the list ``<names>``. For example, ``<init_expr>``
+  of variables in the ``<names>`` list. For example, ``<init_expr>``
   may use the values of other arguments.  Using information given by
   ``depend(..)`` attributes, F2PY ensures that arguments are
-  initialized in a proper order. If ``depend(..)`` attribute is not
+  initialized in a proper order. If the ``depend(..)`` attribute is not
   used then F2PY determines dependence relations automatically. Use
-  ``depend()`` to disable dependence relations generated by F2PY.
+  ``depend()`` to disable the dependence relations generated by F2PY.
 
   When you edit dependence relations that were initially generated by
   F2PY, be careful not to break the dependence relations of other
-  relevant variables. Another thing to watch out is cyclic
+  relevant variables. Another thing to watch out for is cyclic
   dependencies. F2PY is able to detect cyclic dependencies
   when constructing wrappers and it complains if any are found.
 
 ``allocatable``
-  The corresponding variable is Fortran 90 allocatable array defined
-  as Fortran 90 module data.
+  The corresponding variable is a Fortran 90 allocatable array defined as
+  Fortran 90 module data.
 
 .. _external:
 
 ``external``
   The corresponding argument is a function provided by user. The
-  signature of this so-called call-back function can be defined
+  signature of this call-back function can be defined
 
   - in ``__user__`` module block,
   - or by demonstrative (or real, if the signature file is a real Fortran
     code) call in the ``<other statements>`` block.
 
-  For example, F2PY generates from
+  For example, F2PY generates from:
 
-  ::
+  .. code-block:: fortran
 
     external cb_sub, cb_fun
     integer n
@@ -520,7 +554,9 @@ The following attributes are used by F2PY:
     call cb_sub(a,n)
     r = cb_fun(4)
 
-  the following call-back signatures::
+  the following call-back signatures:
+
+  .. code-block:: fortran
 
     subroutine cb_sub(a,n)
         real dimension(n) :: a
@@ -531,7 +567,9 @@ The following attributes are used by F2PY:
         real :: r
     end function cb_fun
 
-  The corresponding user-provided Python function are then::
+  The corresponding user-provided Python function are then:
+
+  .. code-block:: python
 
     def cb_sub(a,[n]):
         ...
@@ -540,49 +578,50 @@ The following attributes are used by F2PY:
         ...
         return r
 
-  See also ``intent(callback)`` attribute.
+  See also the ``intent(callback)`` attribute.
 
 ``parameter``
-  The corresponding variable is a parameter and it must have a fixed
-  value. F2PY replaces all parameter occurrences by their
-  corresponding values.
+  This indicates that the corresponding variable is a parameter and it must have
+  a fixed value. F2PY replaces all parameter occurrences by their corresponding
+  values.
 
 Extensions
 ============
 
 F2PY directives
------------------
+^^^^^^^^^^^^^^^^
 
-The so-called F2PY directives allow using F2PY signature file
-constructs also in Fortran 77/90 source codes. With this feature you
-can skip (almost) completely intermediate signature file generations
-and apply F2PY directly to Fortran source codes.
+The F2PY directives allow using F2PY signature file constructs in
+Fortran 77/90 source codes. With this feature one  can (almost) completely skip
+the intermediate signature file generation and apply F2PY directly to Fortran
+source codes.
 
-F2PY directive has the following form::
+F2PY directives have the following form::
 
   <comment char>f2py ...
 
 where allowed comment characters for fixed and free format Fortran
 codes are ``cC*!#`` and ``!``, respectively. Everything that follows
 ``<comment char>f2py`` is ignored by a compiler but read by F2PY as a
-normal Fortran, non-comment line:
+normal non-comment  Fortran line:
 
+.. note::
   When F2PY finds a line with F2PY directive, the directive is first
   replaced by 5 spaces and then the line is reread.
 
 For fixed format Fortran codes, ``<comment char>`` must be at the
 first column of a file, of course. For free format Fortran codes,
-F2PY directives can appear anywhere in a file.
+the F2PY directives can appear anywhere in a file.
 
 C expressions
---------------
+^^^^^^^^^^^^^^
 
 C expressions are used in the following parts of signature files:
 
-* ``<init_expr>`` of variable initialization;
+* ``<init_expr>`` for variable initialization;
 * ``<C-booleanexpr>`` of the ``check`` attribute;
-* ``<arrayspec> of the ``dimension`` attribute;
-* ``callstatement`` statement, here also a C multiline block can be used.
+* ``<arrayspec>`` of the ``dimension`` attribute;
+* ``callstatement`` statement, here also a C multi-line block can be used.
 
 A C expression may contain:
 
@@ -592,15 +631,19 @@ A C expression may contain:
   according to given dependence relations;
 * the following CPP macros:
 
-  ``rank(<name>)``
+  ``rank(<name>)``
     Returns the rank of an array ``<name>``.
-  ``shape(<name>,<n>)``
+
+  * ``shape(<name>,<n>)``
     Returns the ``<n>``-th dimension of an array ``<name>``.
-  ``len(<name>)``
+
+  * ``len(<name>)``
     Returns the length of an array ``<name>``.
-  ``size(<name>)``
+
+  * ``size(<name>)``
     Returns the size of an array ``<name>``.
-  ``slen(<name>)``
+
+  * ``slen(<name>)``
     Returns the length of a string ``<name>``.
 
 For initializing an array ``<array name>``, F2PY generates a loop over
@@ -615,7 +658,7 @@ from ``0`` to ``shape(<array name>,<i>)-1``.
 For example, a function ``myrange(n)`` generated from the following
 signature
 
-::
+.. code-block::
 
        subroutine myrange(a,n)
          fortranname        ! myrange is a dummy wrapper
@@ -630,23 +673,23 @@ is equivalent to ``numpy.arange(n,dtype=float)``.
   F2PY may lower cases also in C expressions when scanning Fortran codes
   (see ``--[no]-lower`` option).
 
-Multiline blocks
-------------------
+Multi-line blocks
+^^^^^^^^^^^^^^^^^^
 
-A multiline block starts with ``'''`` (triple single-quotes) and ends
-with ``'''`` in some *strictly* subsequent line.  Multiline blocks can
-be used only within .pyf files. The contents of a multiline block can
+A multi-line block starts with ``'''`` (triple single-quotes) and ends
+with ``'''`` in some *strictly* subsequent line.  Multi-line blocks can
+be used only within .pyf files. The contents of a multi-line block can
 be arbitrary (except that it cannot contain ``'''``) and no
 transformations (e.g. lowering cases) are applied to it.
 
-Currently, multiline blocks can be used in the following constructs:
+Currently, multi-line blocks can be used in the following constructs:
 
-+ as a C expression of the ``callstatement`` statement;
+* as a C expression of the ``callstatement`` statement;
 
-+ as a C type specification of the ``callprotoargument`` statement;
+* as a C type specification of the ``callprotoargument`` statement;
 
-+ as a C code block of the ``usercode`` statement;
+* as a C code block of the ``usercode`` statement;
 
-+ as a list of C arrays of the ``pymethoddef`` statement;
+* as a list of C arrays of the ``pymethoddef`` statement;
 
-+ as documentation string.
+* as a documentation string.
diff --git a/doc/source/f2py/spam.pyf b/doc/source/f2py/spam.pyf
deleted file mode 100644 (file)
index 21ea18b..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-!    -*- f90 -*-
-python module spam
-    usercode '''
-  static char doc_spam_system[] = "Execute a shell command.";
-  static PyObject *spam_system(PyObject *self, PyObject *args)
-  {
-    char *command;
-    int sts;
-
-    if (!PyArg_ParseTuple(args, "s", &command))
-        return NULL;
-    sts = system(command);
-    return Py_BuildValue("i", sts);
-  }
-    '''
-    pymethoddef '''
-    {"system",  spam_system, METH_VARARGS, doc_spam_system},
-    '''
-end python module spam
diff --git a/doc/source/f2py/spam_session.dat b/doc/source/f2py/spam_session.dat
deleted file mode 100644 (file)
index bd5832d..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
->>> import spam
->>> status = spam.system('whoami')
-pearu
->>> status = spam.system('blah')
-sh: line 1: blah: command not found
\ No newline at end of file
diff --git a/doc/source/f2py/string.f b/doc/source/f2py/string.f
deleted file mode 100644 (file)
index 9246f02..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-C FILE: STRING.F
-      SUBROUTINE FOO(A,B,C,D)
-      CHARACTER*5 A, B
-      CHARACTER*(*) C,D
-Cf2py intent(in) a,c
-Cf2py intent(inout) b,d
-      PRINT*, "A=",A
-      PRINT*, "B=",B
-      PRINT*, "C=",C
-      PRINT*, "D=",D
-      PRINT*, "CHANGE A,B,C,D"
-      A(1:1) = 'A'
-      B(1:1) = 'B'
-      C(1:1) = 'C'
-      D(1:1) = 'D'
-      PRINT*, "A=",A
-      PRINT*, "B=",B
-      PRINT*, "C=",C
-      PRINT*, "D=",D
-      END
-C END OF FILE STRING.F
diff --git a/doc/source/f2py/string_session.dat b/doc/source/f2py/string_session.dat
deleted file mode 100644 (file)
index e8f7854..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
->>> import mystring
->>> print(mystring.foo.__doc__)
-foo(a,b,c,d)
-
-Wrapper for ``foo``.
-
-Parameters
-----------
-a : input string(len=5)
-b : in/output rank-0 array(string(len=5),'c')
-c : input string(len=-1)
-d : in/output rank-0 array(string(len=-1),'c')
-
->>> from numpy import array
->>> a = array(b'123\0\0')
->>> b = array(b'123\0\0')
->>> c = array(b'123')
->>> d = array(b'123')
->>> mystring.foo(a, b, c, d)
- A=123
- B=123
- C=123
- D=123
- CHANGE A,B,C,D
- A=A23
- B=B23
- C=C23
- D=D23
->>> a[()], b[()], c[()], d[()]
-(b'123', b'B23', b'123', b'D2')
index 6c3b4b6efb1e6fdb68b00ec3240f6859c824d5b8..596148799ba9839772631e3b60838c3e3ecde301 100644 (file)
@@ -3,9 +3,9 @@ Using F2PY
 ===========
 
 F2PY can be used either as a command line tool ``f2py`` or as a Python
-module ``numpy.f2py``. While we try to install the command line tool as part
+module ``numpy.f2py``. While we try to provide the command line tool as part
 of the numpy setup, some platforms like Windows make it difficult to
-reliably put the executable on the ``PATH``. We will refer to ``f2py``
+reliably put the executables on the ``PATH``. We will refer to ``f2py``
 in this document but you may have to run it as a module::
 
    python -m numpy.f2py
@@ -21,32 +21,40 @@ Command ``f2py``
 When used as a command line tool, ``f2py`` has three major modes,
 distinguished by the usage of ``-c`` and ``-h`` switches:
 
+Signature file generation
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
 1. To scan Fortran sources and generate a signature file, use
 
-   ::
+   .. code-block:: sh
 
      f2py -h <filename.pyf> <options> <fortran files>   \
        [[ only: <fortran functions>  : ]                \
         [ skip: <fortran functions>  : ]]...            \
        [<fortran files> ...]
 
-   Note that a Fortran source file can contain many routines, and not
-   necessarily all routines are needed to be used from Python. So, you
-   can either specify which routines should be wrapped (in ``only: .. :``
-   part) or which routines F2PY should ignored (in ``skip: .. :`` part).
+   .. note::
+
+    A Fortran source file can contain many routines, and it is often
+    not necessary to allow all routines be usable from Python. In such cases,
+    either specify which routines should be wrapped (in the ``only: .. :`` part)
+    or which routines F2PY should ignored (in the ``skip: .. :`` part).
 
    If ``<filename.pyf>`` is specified as ``stdout`` then signatures
-   are send to standard output instead of a file.
+   are written to standard output instead of a file.
 
-   Among other options (see below), the following options can be used
+   Among other options (see below), the following can be used
    in this mode:
 
    ``--overwrite-signature``
-     Overwrite existing signature file.
+     Overwrites an existing signature file.
+
+Extension module construction
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 2. To construct an extension module, use
 
-   ::
+   .. code-block:: sh
 
      f2py -m <modulename> <options> <fortran files>   \
        [[ only: <fortran functions>  : ]              \
@@ -61,17 +69,19 @@ distinguished by the usage of ``-c`` and ``-h`` switches:
    in this mode:
 
    ``--debug-capi``
-     Add debugging hooks to the extension module. When using this
-     extension module, various information about the wrapper is printed
-     to standard output, for example, the values of variables, the
-     steps taken, etc.
+     Adds debugging hooks to the extension module. When using this extension
+     module, various diagnostic information about the wrapper is written to
+     the standard output, for example, the values of variables, the steps taken,
+     etc.
 
    ``-include'<includefile>'``
      Add a CPP ``#include`` statement to the extension module source.
-     ``<includefile>`` should be given in one of the following forms::
+     ``<includefile>`` should be given in one of the following forms
 
-       "filename.ext"
-       <filename.ext>
+       .. code-block:: cpp
+
+        "filename.ext"
+        <filename.ext>
 
      The include statement is inserted just before the wrapper
      functions. This feature enables using arbitrary C functions
@@ -91,16 +101,19 @@ distinguished by the usage of ``-c`` and ``-h`` switches:
      List system resources found by ``numpy_distutils/system_info.py``.
      For example, try ``f2py --help-link lapack_opt``.
 
+Building a module
+^^^^^^^^^^^^^^^^^
+
 3. To build an extension module, use
 
-   ::
+   .. code-block:: sh
 
      f2py -c <options> <fortran files>       \
        [[ only: <fortran functions>  : ]     \
         [ skip: <fortran functions>  : ]]... \
        [ <fortran/c source files> ] [ <.o, .a, .so files> ]
  
-   If ``<fortran files>`` contains a signature file, then a source for
+   If ``<fortran files>`` contains a signature file, then the source for
    an extension module is constructed, all Fortran and C sources are
    compiled, and finally all object and library files are linked to the
    extension module ``<modulename>.so`` which is saved into the current
@@ -108,26 +121,25 @@ distinguished by the usage of ``-c`` and ``-h`` switches:
 
    If ``<fortran files>`` does not contain a signature file, then an
    extension module is constructed by scanning all Fortran source codes
-   for routine signatures.
+   for routine signatures, before proceeding to build the extension module.
  
-   Among other options (see below) and options described in previous
-   mode, the following options can be used in this mode:
+   Among other options (see below) and options described for previous
+   modes, the following options can be used in this mode:
  
    ``--help-fcompiler``
-     List available Fortran compilers.
-   ``--help-compiler`` [depreciated]
-     List available Fortran compilers.
+     List the available Fortran compilers.
+   ``--help-compiler`` **[depreciated]**
+     List the available Fortran compilers.
    ``--fcompiler=<Vendor>``
-     Specify Fortran compiler type by vendor.
+     Specify Fortran compiler type by vendor.
    ``--f77exec=<path>``
-     Specify the path to F77 compiler
-   ``--fcompiler-exec=<path>`` [depreciated]
-     Specify the path to F77 compiler
+     Specify the path to F77 compiler
+   ``--fcompiler-exec=<path>`` **[depreciated]**
+     Specify the path to F77 compiler
    ``--f90exec=<path>``
-     Specify the path to F90 compiler
-   ``--f90compiler-exec=<path>`` [depreciated]
-     Specify the path to F90 compiler
+     Specify the path to a F90 compiler
+   ``--f90compiler-exec=<path>`` **[depreciated]**
+     Specify the path to a F90 compiler
    ``--f77flags=<string>``
      Specify F77 compiler flags
    ``--f90flags=<string>``
@@ -137,12 +149,11 @@ distinguished by the usage of ``-c`` and ``-h`` switches:
    ``--arch=<string>``
      Specify architecture specific optimization flags
    ``--noopt``
-     Compile without optimization
+     Compile without optimization flags
    ``--noarch``
-     Compile without arch-dependent optimization
+     Compile without arch-dependent optimization flags
    ``--debug``
      Compile with debugging information
    ``-l<libname>``
      Use the library ``<libname>`` when linking.
    ``-D<macro>[=<defn=1>]``
@@ -155,34 +166,35 @@ distinguished by the usage of ``-c`` and ``-h`` switches:
    ``-L<dir>``
      Add directory ``<dir>`` to the list of directories to  be  searched
      for ``-l``.
    ``link-<resource>``
-     Link extension module with <resource> as defined by
+     Link the extension module with <resource> as defined by
      ``numpy_distutils/system_info.py``. E.g. to link with optimized
      LAPACK libraries (vecLib on MacOSX, ATLAS elsewhere), use
      ``--link-lapack_opt``. See also ``--help-link`` switch.
 
    .. note:: The ``f2py -c`` option must be applied either to an existing ``.pyf`` file (plus the source/object/library files) or one must specify the ``-m <modulename>`` option (plus the sources/object/library files). Use one of the following options:
 
-      ::
+   .. code-block:: sh
 
          f2py -c -m fib1 fib1.f
 
-      or
+   or
 
-      ::
+   .. code-block:: sh
 
          f2py -m fib1 fib1.f -h fib1.pyf
          f2py -c fib1.pyf fib1.f
 
-      For more information, see `Building C and C++ Extensions`__ Python documentation for details.
+   For more information, see the `Building C and C++ Extensions`__ Python documentation for details.
 
-      __ https://docs.python.org/3/extending/building.html
+   __ https://docs.python.org/3/extending/building.html
 
 
    When building an extension module, a combination of the following
-   macros may be required for non-gcc Fortran compilers::
+   macros may be required for non-gcc Fortran compilers:
+
+   .. code-block:: sh
+
      -DPREPEND_FORTRAN
      -DNO_APPEND_FORTRAN
      -DUPPERCASE_FORTRAN
@@ -197,11 +209,13 @@ distinguished by the usage of ``-c`` and ``-h`` switches:
    of an array argument is larger than ``<int>``, a message about
    the coping is sent to ``stderr``.
 
-Other options:
+Other options
+^^^^^^^^^^^^^
 
 ``-m <modulename>``
-  Name of an extension module. Default is ``untitled``. Don't use this option
-  if a signature file (\*.pyf) is used.
+  Name of an extension module. Default is ``untitled``.
+
+  .. warning:: Don't use this option if a signature file (\*.pyf) is used.
 ``--[no-]lower``
   Do [not] lower the cases in ``<fortran files>``.  By default,
   ``--lower`` is assumed with ``-h`` switch, and ``--no-lower``
@@ -214,7 +228,7 @@ Other options:
 ``--verbose``
   Run with extra verbosity.
 ``-v``
-  Print f2py version ID and exit.
+  Print the F2PY version and exit.
 
 Execute ``f2py`` without any options to get an up-to-date list of
 available options.
diff --git a/doc/source/f2py/var.pyf b/doc/source/f2py/var.pyf
deleted file mode 100644 (file)
index 8275ff3..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-!    -*- f90 -*-
-python module var
-  usercode '''
-    int BAR = 5;
-  '''
-  interface
-    usercode '''
-      PyDict_SetItemString(d,"BAR",PyInt_FromLong(BAR));
-    '''
-  end interface
-end python module
diff --git a/doc/source/f2py/var_session.dat b/doc/source/f2py/var_session.dat
deleted file mode 100644 (file)
index fb0f798..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
->>> import var
->>> var.BAR
-5
\ No newline at end of file
diff --git a/doc/source/getting_started.rst b/doc/source/getting_started.rst
new file mode 100644 (file)
index 0000000..cd7a663
--- /dev/null
@@ -0,0 +1,4 @@
+:orphan:
+
+Getting started
+===============
\ No newline at end of file
index 21dec00fe5a94125c0dcf0e42a92c2b2c2ec1b85..7fa7d8aa9a0ac68a59e0b6003626b7d4006fb166 100644 (file)
@@ -1,7 +1,7 @@
 .. _numpy_docs_mainpage:
 
 ###################
-NumPy Documentation
+NumPy documentation
 ###################
 
 .. toctree::
@@ -12,6 +12,90 @@ NumPy Documentation
    API reference <reference/index>
    Development <dev/index>
 
+
+**Version**: |version|
+
+**Download documentation**:
+`PDF Version <https://numpy.org/doc/stable/numpy-user.pdf>`_ |
+`Historical versions of documentation <https://numpy.org/doc/>`_
+   
+**Useful links**:
+`Installation <https://numpy.org/install/>`_ |
+`Source Repository <https://github.com/numpy/numpy>`_ |
+`Issue Tracker <https://github.com/numpy/numpy/issues>`_ |
+`Q&A Support <https://numpy.org/gethelp/>`_ |
+`Mailing List <https://mail.python.org/mailman/listinfo/numpy-discussion>`_
+
+NumPy is the fundamental package for scientific computing in Python. It is a
+Python library that provides a multidimensional array object, various derived
+objects (such as masked arrays and matrices), and an assortment of routines for
+fast operations on arrays, including mathematical, logical, shape manipulation,
+sorting, selecting, I/O, discrete Fourier transforms, basic linear algebra,
+basic statistical operations, random simulation and much more.
+
+.. panels::
+    :card: + intro-card text-center
+    :column: col-lg-6 col-md-6 col-sm-6 col-xs-12 p-2
+
+    ---
+    :img-top: ../source/_static/index-images/getting_started.svg
+
+    Getting Started
+    ^^^^^^^^^^^^^^^
+
+    New to NumPy? Check out the Absolute Beginner's Guide. It contains an
+    introduction to NumPy's main concepts and links to additional tutorials.
+
+    .. link-button:: user/absolute_beginners
+        :type: ref
+        :text: 
+        :classes: stretched-link
+    
+    ---
+    :img-top: ../source/_static/index-images/user_guide.svg
+
+    User Guide
+    ^^^^^^^^^^
+
+    The user guide provides in-depth information on the
+    key concepts of pandas with useful background information and explanation.
+
+    .. link-button:: user
+        :type: ref
+        :text: 
+        :classes: stretched-link
+
+    ---
+    :img-top: ../source/_static/index-images/api.svg
+
+    API Reference
+    ^^^^^^^^^^^^^
+
+    The reference guide contains a detailed description of the functions,
+    modules, and objects included in NumPy. The reference describes how the
+    methods work and which parameters can be used. It assumes that you have an
+    understanding of the key concepts.
+
+    .. link-button:: reference
+        :type: ref
+        :text: 
+        :classes: stretched-link 
+
+    ---
+    :img-top: ../source/_static/index-images/contributor.svg
+
+    Contributor's Guide
+    ^^^^^^^^^^^^^^^
+
+    Want to add to the codebase? Can help add translation or a flowchart to the
+    documentation? The contributing guidelines will guide you through the
+    process of improving NumPy.
+
+    .. link-button:: devindex
+        :type: ref
+        :text: 
+        :classes: stretched-link
+
 .. This is not really the index page, that is found in
    _templates/indexcontent.html The toctree content here will be added to the
    top of the template header
index 5e4315b3840e323645c0987a2aa0a4c520c516a9..70ded916a76dc9acb280f43d6a6953c3c944791c 100644 (file)
-.. _alignment:
+:orphan:
 
+****************
 Memory Alignment
-================
+****************
 
-Numpy Alignment Goals
----------------------
+.. This document has been moved to ../dev/alignment.rst.
 
-There are three use-cases related to memory alignment in numpy (as of 1.14):
+This document has been moved to :ref:`alignment`.
 
- 1. Creating structured datatypes with fields aligned like in a C-struct.
- 2. Speeding up copy operations by using uint assignment in instead of memcpy
- 3. Guaranteeing safe aligned access for ufuncs/setitem/casting code
 
-Numpy uses two different forms of alignment to achieve these goals:
-"True alignment" and "Uint alignment".
-
-"True" alignment refers to the architecture-dependent alignment of an
-equivalent C-type in C. For example, in x64 systems ``numpy.float64`` is
-equivalent to ``double`` in C. On most systems this has either an alignment of
-4 or 8 bytes (and this can be controlled in gcc by the option
-``malign-double``).  A variable is aligned in memory if its memory offset is a
-multiple of its alignment. On some systems (eg sparc) memory alignment is
-required, on others it gives a speedup.
-
-"Uint" alignment depends on the size of a datatype. It is defined to be the
-"True alignment" of the uint used by numpy's copy-code to copy the datatype, or
-undefined/unaligned if there is no equivalent uint. Currently numpy uses uint8,
-uint16, uint32, uint64 and uint64 to copy data of size 1,2,4,8,16 bytes
-respectively, and all other sized datatypes cannot be uint-aligned.
-
-For example, on a (typical linux x64 gcc) system, the numpy ``complex64``
-datatype is implemented as ``struct { float real, imag; }``. This has "true"
-alignment of 4 and "uint" alignment of 8 (equal to the true alignment of
-``uint64``).
-
-Some cases where uint and true alignment are different (default gcc linux):
-   arch     type        true-aln    uint-aln
-   ----     ----        --------    --------
-   x86_64   complex64          4           8
-   x86_64   float128          16           8
-   x86      float96            4           -
-
-
-Variables in Numpy which control and describe alignment
--------------------------------------------------------
-
-There are 4 relevant uses of the word ``align`` used in numpy:
-
- * The ``dtype.alignment`` attribute (``descr->alignment`` in C). This is meant
-   to reflect the "true alignment" of the type. It has arch-dependent default
-   values for all datatypes, with the exception of structured types created
-   with ``align=True`` as described below.
- * The ``ALIGNED`` flag of an ndarray, computed in ``IsAligned`` and checked
-   by ``PyArray_ISALIGNED``. This is computed from ``dtype.alignment``.
-   It is set to ``True`` if every item in the array is at a memory location
-   consistent with ``dtype.alignment``, which is the case if the data ptr and
-   all strides of the array are multiples of that alignment.
- * The ``align`` keyword of the dtype constructor, which only affects structured
-   arrays. If the structure's field offsets are not manually provided numpy
-   determines offsets automatically. In that case, ``align=True`` pads the
-   structure so that each field is "true" aligned in memory and sets
-   ``dtype.alignment`` to be the largest of the field "true" alignments. This
-   is like what C-structs usually do. Otherwise if offsets or itemsize were
-   manually provided ``align=True`` simply checks that all the fields are
-   "true" aligned and that the total itemsize is a multiple of the largest
-   field alignment. In either case ``dtype.isalignedstruct`` is also set to
-   True.
- * ``IsUintAligned`` is used to determine if an ndarray is "uint aligned" in
-   an analogous way to how ``IsAligned`` checks for true-alignment.
-
-Consequences of alignment
--------------------------
-
-Here is how the variables above are used:
-
- 1. Creating aligned structs: In order to know how to offset a field when
-    ``align=True``, numpy looks up ``field.dtype.alignment``. This includes
-    fields which are nested structured arrays.
- 2. Ufuncs: If the ``ALIGNED`` flag of an array is False, ufuncs will
-    buffer/cast the array before evaluation. This is needed since ufunc inner
-    loops access raw elements directly, which might fail on some archs if the
-    elements are not true-aligned.
- 3. Getitem/setitem/copyswap function: Similar to ufuncs, these functions
-    generally have two code paths. If ``ALIGNED`` is False they will
-    use a code path that buffers the arguments so they are true-aligned.
- 4. Strided copy code: Here, "uint alignment" is used instead.  If the itemsize
-    of an array is equal to 1, 2, 4, 8 or 16 bytes and the array is uint
-    aligned then instead numpy will do ``*(uintN*)dst) = *(uintN*)src)`` for
-    appropriate N. Otherwise numpy copies by doing ``memcpy(dst, src, N)``.
- 5. Nditer code: Since this often calls the strided copy code, it must
-    check for "uint alignment".
- 6. Cast code: This checks for "true" alignment, as it does
-    ``*dst = CASTFUNC(*src)`` if aligned. Otherwise, it does
-    ``memmove(srcval, src); dstval = CASTFUNC(srcval); memmove(dst, dstval)``
-    where dstval/srcval are aligned.
-
-Note that the strided-copy and strided-cast code are deeply intertwined and so
-any arrays being processed by them must be both uint and true aligned, even
-though the copy-code only needs uint alignment and the cast code only true
-alignment.  If there is ever a big rewrite of this code it would be good to
-allow them to use different alignments.
 
 
index e3b8d270dbc4d005e185b02c2bf9b2eed0cea04f..63c93821b6b4d6bcd83e6c06bd72dde1470674a3 100644 (file)
@@ -25,7 +25,7 @@ form of the string, and can be either a :ref:`date unit <arrays.dtypes.dateunits
 :ref:`time unit <arrays.dtypes.timeunits>`. The date units are years ('Y'),
 months ('M'), weeks ('W'), and days ('D'), while the time units are
 hours ('h'), minutes ('m'), seconds ('s'), milliseconds ('ms'), and
-some additional SI-prefix seconds-based units. The datetime64 data type 
+some additional SI-prefix seconds-based units. The datetime64 data type
 also accepts the string "NAT", in any combination of lowercase/uppercase
 letters, for a "Not A Time" value.
 
@@ -74,6 +74,18 @@ datetime type with generic units.
     array(['2001-01-01T12:00:00.000', '2002-02-03T13:56:03.172'],
           dtype='datetime64[ms]')
 
+An array of datetimes can be constructed from integers representing
+POSIX timestamps with the given unit.
+
+.. admonition:: Example
+
+    >>> np.array([0, 1577836800], dtype='datetime64[s]')
+    array(['1970-01-01T00:00:00', '2020-01-01T00:00:00'],
+          dtype='datetime64[s]')
+
+    >>> np.array([0, 1577836800000]).astype('datetime64[ms]')
+    array(['1970-01-01T00:00:00.000', '2020-01-01T00:00:00.000'],
+          dtype='datetime64[ms]')
 
 The datetime type works with many common NumPy functions, for
 example :func:`arange` can be used to generate ranges of dates.
@@ -120,9 +132,9 @@ Datetime and Timedelta Arithmetic
 NumPy allows the subtraction of two Datetime values, an operation which
 produces a number with a time unit. Because NumPy doesn't have a physical
 quantities system in its core, the timedelta64 data type was created
-to complement datetime64. The arguments for timedelta64 are a number, 
+to complement datetime64. The arguments for timedelta64 are a number,
 to represent the number of units, and a date/time unit, such as
-(D)ay, (M)onth, (Y)ear, (h)ours, (m)inutes, or (s)econds. The timedelta64 
+(D)ay, (M)onth, (Y)ear, (h)ours, (m)inutes, or (s)econds. The timedelta64
 data type also accepts the string "NAT" in place of the number for a "Not A Time" value.
 
 .. admonition:: Example
index b5ffa1a8b9c1ac4d49d7320a33351134db72f073..8606bc8f1a3a91a3b06bb93b99ca7987be56822d 100644 (file)
@@ -562,3 +562,20 @@ The following methods implement the pickle protocol:
 
    dtype.__reduce__
    dtype.__setstate__
+
+Utility method for typing:
+
+.. autosummary::
+   :toctree: generated/
+
+   dtype.__class_getitem__
+
+Comparison operations:
+
+.. autosummary::
+   :toctree: generated/
+
+   dtype.__ge__
+   dtype.__gt__
+   dtype.__le__
+   dtype.__lt__
index 9f82875ea65ae175ad9569dcac5e5dab3e3c439d..100d22e029d01133e3825085a4cb43e679249568 100644 (file)
-.. for doctests
-   >>> import numpy as np
-
+.. _routines.indexing:
 .. _arrays.indexing:
 
-Indexing
-========
-
-.. seealso::
+Indexing routines
+=================
 
-   :ref:`Indexing basics <basics.indexing>`
-
-.. sectionauthor:: adapted from "Guide to NumPy" by Travis E. Oliphant
+.. seealso:: :ref:`basics.indexing`
 
 .. currentmodule:: numpy
 
-.. index:: indexing, slicing
-
-:class:`ndarrays <ndarray>` can be indexed using the standard Python
-``x[obj]`` syntax, where *x* is the array and *obj* the selection.
-There are three kinds of indexing available: field access, basic
-slicing, advanced indexing. Which one occurs depends on *obj*.
-
-.. note::
-
-   In Python, ``x[(exp1, exp2, ..., expN)]`` is equivalent to
-   ``x[exp1, exp2, ..., expN]``; the latter is just syntactic sugar
-   for the former.
-
-
-Basic Slicing and Indexing
+Generating index arrays
+-----------------------
+.. autosummary::
+   :toctree: generated/
+
+   c_
+   r_
+   s_
+   nonzero
+   where
+   indices
+   ix_
+   ogrid
+   ravel_multi_index
+   unravel_index
+   diag_indices
+   diag_indices_from
+   mask_indices
+   tril_indices
+   tril_indices_from
+   triu_indices
+   triu_indices_from
+
+Indexing-like operations
+------------------------
+.. autosummary::
+   :toctree: generated/
+
+   take
+   take_along_axis
+   choose
+   compress
+   diag
+   diagonal
+   select
+   lib.stride_tricks.sliding_window_view
+   lib.stride_tricks.as_strided
+
+Inserting data into arrays
 --------------------------
-
-Basic slicing extends Python's basic concept of slicing to N
-dimensions. Basic slicing occurs when *obj* is a :class:`slice` object
-(constructed by ``start:stop:step`` notation inside of brackets), an
-integer, or a tuple of slice objects and integers. :py:data:`Ellipsis`
-and :const:`newaxis` objects can be interspersed with these as
-well.
-
-.. deprecated:: 1.15.0
-
-  In order to remain backward compatible with a common usage in
-  Numeric, basic slicing is also initiated if the selection object is
-  any non-ndarray and non-tuple sequence (such as a :class:`list`) containing
-  :class:`slice` objects, the :py:data:`Ellipsis` object, or the :const:`newaxis`
-  object, but not for integer arrays or other embedded sequences.
-
-.. index::
-   triple: ndarray; special methods; getitem
-   triple: ndarray; special methods; setitem
-   single: ellipsis
-   single: newaxis
-
-The simplest case of indexing with *N* integers returns an :ref:`array
-scalar <arrays.scalars>` representing the corresponding item.  As in
-Python, all indices are zero-based: for the *i*-th index :math:`n_i`,
-the valid range is :math:`0 \le n_i < d_i` where :math:`d_i` is the
-*i*-th element of the shape of the array.  Negative indices are
-interpreted as counting from the end of the array (*i.e.*, if
-:math:`n_i < 0`, it means :math:`n_i + d_i`).
-
-
-All arrays generated by basic slicing are always :term:`views <view>`
-of the original array.
-
-.. note::
-
-    NumPy slicing creates a :term:`view` instead of a copy as in the case of
-    builtin Python sequences such as string, tuple and list.
-    Care must be taken when extracting
-    a small portion from a large array which becomes useless after the
-    extraction, because the small portion extracted contains a reference
-    to the large original array whose memory will not be released until
-    all arrays derived from it are garbage-collected. In such cases an
-    explicit ``copy()`` is recommended.
-
-The standard rules of sequence slicing apply to basic slicing on a
-per-dimension basis (including using a step index). Some useful
-concepts to remember include:
-
-- The basic slice syntax is ``i:j:k`` where *i* is the starting index,
-  *j* is the stopping index, and *k* is the step (:math:`k\neq0`).
-  This selects the *m* elements (in the corresponding dimension) with
-  index values *i*, *i + k*, ..., *i + (m - 1) k* where
-  :math:`m = q + (r\neq0)` and *q* and *r* are the quotient and remainder
-  obtained by dividing *j - i* by *k*: *j - i = q k + r*, so that
-  *i + (m - 1) k < j*.
-
-  .. admonition:: Example
-
-     >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
-     >>> x[1:7:2]
-     array([1, 3, 5])
-
-- Negative *i* and *j* are interpreted as *n + i* and *n + j* where
-  *n* is the number of elements in the corresponding dimension.
-  Negative *k* makes stepping go towards smaller indices.
-
-  .. admonition:: Example
-
-      >>> x[-2:10]
-      array([8, 9])
-      >>> x[-3:3:-1]
-      array([7, 6, 5, 4])
-
-- Assume *n* is the number of elements in the dimension being
-  sliced. Then, if *i* is not given it defaults to 0 for *k > 0* and
-  *n - 1* for *k < 0* . If *j* is not given it defaults to *n* for *k > 0*
-  and *-n-1* for *k < 0* . If *k* is not given it defaults to 1. Note that
-  ``::`` is the same as ``:`` and means select all indices along this
-  axis.
-
-  .. admonition:: Example
-
-      >>> x[5:]
-      array([5, 6, 7, 8, 9])
-
-- If the number of objects in the selection tuple is less than
-  *N*, then ``:`` is assumed for any subsequent dimensions.
-
-  .. admonition:: Example
-
-      >>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
-      >>> x.shape
-      (2, 3, 1)
-      >>> x[1:2]
-      array([[[4],
-              [5],
-              [6]]])
-
-- :py:data:`Ellipsis` expands to the number of ``:`` objects needed for the
-  selection tuple to index all dimensions. In most cases, this means that
-  length of the expanded selection tuple is ``x.ndim``. There may only be a
-  single ellipsis present.
-
-  .. admonition:: Example
-
-      >>> x[...,0]
-      array([[1, 2, 3],
-             [4, 5, 6]])
-
-- Each :const:`newaxis` object in the selection tuple serves to expand
-  the dimensions of the resulting selection by one unit-length
-  dimension.  The added dimension is the position of the :const:`newaxis`
-  object in the selection tuple.
-
-  .. admonition:: Example
-
-      >>> x[:,np.newaxis,:,:].shape
-      (2, 1, 3, 1)
-
-- An integer, *i*, returns the same values as ``i:i+1``
-  **except** the dimensionality of the returned object is reduced by
-  1. In particular, a selection tuple with the *p*-th
-  element an integer (and all other entries ``:``) returns the
-  corresponding sub-array with dimension *N - 1*. If *N = 1*
-  then the returned object is an array scalar. These objects are
-  explained in :ref:`arrays.scalars`.
-
-- If the selection tuple has all entries ``:`` except the
-  *p*-th entry which is a slice object ``i:j:k``,
-  then the returned array has dimension *N* formed by
-  concatenating the sub-arrays returned by integer indexing of
-  elements *i*, *i+k*, ..., *i + (m - 1) k < j*,
-
-- Basic slicing with more than one non-``:`` entry in the slicing
-  tuple, acts like repeated application of slicing using a single
-  non-``:`` entry, where the non-``:`` entries are successively taken
-  (with all other non-``:`` entries replaced by ``:``). Thus,
-  ``x[ind1,...,ind2,:]`` acts like ``x[ind1][...,ind2,:]`` under basic
-  slicing.
-
-  .. warning:: The above is **not** true for advanced indexing.
-
-- You may use slicing to set values in the array, but (unlike lists) you
-  can never grow the array. The size of the value to be set in
-  ``x[obj] = value`` must be (broadcastable) to the same shape as
-  ``x[obj]``.
-
-.. index::
-   pair: ndarray; view
-
-.. note::
-
-    Remember that a slicing tuple can always be constructed as *obj*
-    and used in the ``x[obj]`` notation. Slice objects can be used in
-    the construction in place of the ``[start:stop:step]``
-    notation. For example, ``x[1:10:5,::-1]`` can also be implemented
-    as ``obj = (slice(1,10,5), slice(None,None,-1)); x[obj]`` . This
-    can be useful for constructing generic code that works on arrays
-    of arbitrary dimension.
-
-.. data:: newaxis
-   :noindex:
-
-   The :const:`newaxis` object can be used in all slicing operations to
-   create an axis of length one. :const:`newaxis` is an alias for
-   'None', and 'None' can be used in place of this with the same result.
-
-.. _advanced-indexing:
-
-Advanced Indexing
------------------
-
-Advanced indexing is triggered when the selection object, *obj*, is a
-non-tuple sequence object, an :class:`ndarray` (of data type integer or bool),
-or a tuple with at least one sequence object or ndarray (of data type
-integer or bool). There are two types of advanced indexing: integer
-and Boolean.
-
-Advanced indexing always returns a *copy* of the data (contrast with
-basic slicing that returns a :term:`view`).
-
-.. warning::
-
-   The definition of advanced indexing means that ``x[(1,2,3),]`` is
-   fundamentally different than ``x[(1,2,3)]``. The latter is
-   equivalent to ``x[1,2,3]`` which will trigger basic selection while
-   the former will trigger advanced indexing. Be sure to understand
-   why this occurs.
-
-   Also recognize that ``x[[1,2,3]]`` will trigger advanced indexing,
-   whereas due to the deprecated Numeric compatibility mentioned above,
-   ``x[[1,2,slice(None)]]`` will trigger basic slicing.
-
-Integer array indexing
-^^^^^^^^^^^^^^^^^^^^^^
-
-Integer array indexing allows selection of arbitrary items in the array
-based on their *N*-dimensional index. Each integer array represents a number
-of indexes into that dimension.
-
-Purely integer array indexing
-"""""""""""""""""""""""""""""
-
-When the index consists of as many integer arrays as the array being indexed
-has dimensions, the indexing is straight forward, but different from slicing.
-
-Advanced indexes always are :ref:`broadcast<ufuncs.broadcasting>` and
-iterated as *one*::
-
-     result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M],
-                                ..., ind_N[i_1, ..., i_M]]
-
-Note that the result shape is identical to the (broadcast) indexing array
-shapes ``ind_1, ..., ind_N``.
-
-.. admonition:: Example
-
-    From each row, a specific element should be selected. The row index is just
-    ``[0, 1, 2]`` and the column index specifies the element to choose for the
-    corresponding row, here ``[0, 1, 0]``. Using both together the task
-    can be solved using advanced indexing:
-
-    >>> x = np.array([[1, 2], [3, 4], [5, 6]])
-    >>> x[[0, 1, 2], [0, 1, 0]]
-    array([1, 4, 5])
-
-To achieve a behaviour similar to the basic slicing above, broadcasting can be
-used. The function :func:`ix_` can help with this broadcasting. This is best
-understood with an example.
-
-.. admonition:: Example
-
-    From a 4x3 array the corner elements should be selected using advanced
-    indexing. Thus all elements for which the column is one of ``[0, 2]`` and
-    the row is one of ``[0, 3]`` need to be selected. To use advanced indexing
-    one needs to select all elements *explicitly*. Using the method explained
-    previously one could write:
-
-    >>> x = np.array([[ 0,  1,  2],
-    ...               [ 3,  4,  5],
-    ...               [ 6,  7,  8],
-    ...               [ 9, 10, 11]])
-    >>> rows = np.array([[0, 0],
-    ...                  [3, 3]], dtype=np.intp)
-    >>> columns = np.array([[0, 2],
-    ...                     [0, 2]], dtype=np.intp)
-    >>> x[rows, columns]
-    array([[ 0,  2],
-           [ 9, 11]])
-
-    However, since the indexing arrays above just repeat themselves,
-    broadcasting can be used (compare operations such as
-    ``rows[:, np.newaxis] + columns``) to simplify this:
-
-    >>> rows = np.array([0, 3], dtype=np.intp)
-    >>> columns = np.array([0, 2], dtype=np.intp)
-    >>> rows[:, np.newaxis]
-    array([[0],
-           [3]])
-    >>> x[rows[:, np.newaxis], columns]
-    array([[ 0,  2],
-           [ 9, 11]])
-
-    This broadcasting can also be achieved using the function :func:`ix_`:
-
-    >>> x[np.ix_(rows, columns)]
-    array([[ 0,  2],
-           [ 9, 11]])
-
-    Note that without the ``np.ix_`` call, only the diagonal elements would
-    be selected, as was used in the previous example. This difference is the
-    most important thing to remember about indexing with multiple advanced
-    indexes.
-
-.. _combining-advanced-and-basic-indexing:
-
-Combining advanced and basic indexing
-"""""""""""""""""""""""""""""""""""""
-
-When there is at least one slice (``:``), ellipsis (``...``) or :const:`newaxis`
-in the index (or the array has more dimensions than there are advanced indexes),
-then the behaviour can be more complicated. It is like concatenating the
-indexing result for each advanced index element
-
-In the simplest case, there is only a *single* advanced index. A single
-advanced index can for example replace a slice and the result array will be
-the same, however, it is a copy and may have a different memory layout.
-A slice is preferable when it is possible.
-
-.. admonition:: Example
-
-    >>> x[1:2, 1:3]
-    array([[4, 5]])
-    >>> x[1:2, [1, 2]]
-    array([[4, 5]])
-
-The easiest way to understand the situation may be to think in
-terms of the result shape. There are two parts to the indexing operation,
-the subspace defined by the basic indexing (excluding integers) and the
-subspace from the advanced indexing part. Two cases of index combination
-need to be distinguished:
-
-* The advanced indexes are separated by a slice, :py:data:`Ellipsis` or :const:`newaxis`.
-  For example ``x[arr1, :, arr2]``.
-* The advanced indexes are all next to each other.
-  For example ``x[..., arr1, arr2, :]`` but *not* ``x[arr1, :, 1]``
-  since ``1`` is an advanced index in this regard.
-
-In the first case, the dimensions resulting from the advanced indexing
-operation come first in the result array, and the subspace dimensions after
-that.
-In the second case, the dimensions from the advanced indexing operations
-are inserted into the result array at the same spot as they were in the
-initial array (the latter logic is what makes simple advanced indexing
-behave just like slicing).
-
-.. admonition:: Example
-
- Suppose ``x.shape`` is (10,20,30) and ``ind`` is a (2,3,4)-shaped
- indexing :class:`intp` array, then ``result = x[...,ind,:]`` has
- shape (10,2,3,4,30) because the (20,)-shaped subspace has been
- replaced with a (2,3,4)-shaped broadcasted indexing subspace. If
- we let *i, j, k* loop over the (2,3,4)-shaped subspace then
- ``result[...,i,j,k,:] = x[...,ind[i,j,k],:]``. This example
- produces the same result as :meth:`x.take(ind, axis=-2) <ndarray.take>`.
-
-.. admonition:: Example
-
-  Let ``x.shape`` be (10,20,30,40,50) and suppose ``ind_1``
-  and ``ind_2`` can be broadcast to the shape (2,3,4).  Then
-  ``x[:,ind_1,ind_2]`` has shape (10,2,3,4,40,50) because the
-  (20,30)-shaped subspace from X has been replaced with the
-  (2,3,4) subspace from the indices.  However,
-  ``x[:,ind_1,:,ind_2]`` has shape (2,3,4,10,30,50) because there
-  is no unambiguous place to drop in the indexing subspace, thus
-  it is tacked-on to the beginning. It is always possible to use
-  :meth:`.transpose() <ndarray.transpose>` to move the subspace
-  anywhere desired. Note that this example cannot be replicated
-  using :func:`take`.
-
-
-Boolean array indexing
-^^^^^^^^^^^^^^^^^^^^^^
-
-This advanced indexing occurs when obj is an array object of Boolean
-type, such as may be returned from comparison operators. A single
-boolean index array is practically identical to ``x[obj.nonzero()]`` where,
-as described above, :meth:`obj.nonzero() <ndarray.nonzero>` returns a
-tuple (of length :attr:`obj.ndim <ndarray.ndim>`) of integer index
-arrays showing the :py:data:`True` elements of *obj*. However, it is
-faster when ``obj.shape == x.shape``.
-
-If ``obj.ndim == x.ndim``, ``x[obj]`` returns a 1-dimensional array
-filled with the elements of *x* corresponding to the :py:data:`True`
-values of *obj*.  The search order will be :term:`row-major`,
-C-style. If *obj* has :py:data:`True` values at entries that are outside
-of the bounds of *x*, then an index error will be raised. If *obj* is
-smaller than *x* it is identical to filling it with :py:data:`False`.
-
-.. admonition:: Example
-
-    A common use case for this is filtering for desired element values.
-    For example one may wish to select all entries from an array which
-    are not NaN:
-
-    >>> x = np.array([[1., 2.], [np.nan, 3.], [np.nan, np.nan]])
-    >>> x[~np.isnan(x)]
-    array([1., 2., 3.])
-
-    Or wish to add a constant to all negative elements:
-
-    >>> x = np.array([1., -1., -2., 3])
-    >>> x[x < 0] += 20
-    >>> x
-    array([  1.,  19.,  18.,   3.])
-
-In general if an index includes a Boolean array, the result will be
-identical to inserting ``obj.nonzero()`` into the same position
-and using the integer array indexing mechanism described above.
-``x[ind_1, boolean_array, ind_2]`` is equivalent to
-``x[(ind_1,) + boolean_array.nonzero() + (ind_2,)]``.
-
-If there is only one Boolean array and no integer indexing array present,
-this is straight forward. Care must only be taken to make sure that the
-boolean index has *exactly* as many dimensions as it is supposed to work
-with.
-
-.. admonition:: Example
-
-    From an array, select all rows which sum up to less or equal two:
-
-    >>> x = np.array([[0, 1], [1, 1], [2, 2]])
-    >>> rowsum = x.sum(-1)
-    >>> x[rowsum <= 2, :]
-    array([[0, 1],
-           [1, 1]])
-
-
-Combining multiple Boolean indexing arrays or a Boolean with an integer
-indexing array can best be understood with the
-:meth:`obj.nonzero() <ndarray.nonzero>` analogy. The function :func:`ix_`
-also supports boolean arrays and will work without any surprises.
-
-.. admonition:: Example
-
-    Use boolean indexing to select all rows adding up to an even
-    number. At the same time columns 0 and 2 should be selected with an
-    advanced integer index. Using the :func:`ix_` function this can be done
-    with:
-
-    >>> x = np.array([[ 0,  1,  2],
-    ...               [ 3,  4,  5],
-    ...               [ 6,  7,  8],
-    ...               [ 9, 10, 11]])
-    >>> rows = (x.sum(-1) % 2) == 0
-    >>> rows
-    array([False,  True, False,  True])
-    >>> columns = [0, 2]
-    >>> x[np.ix_(rows, columns)]
-    array([[ 3,  5],
-           [ 9, 11]])
-
-    Without the ``np.ix_`` call, only the diagonal elements would be
-    selected.
-
-    Or without ``np.ix_`` (compare the integer array examples):
-
-    >>> rows = rows.nonzero()[0]
-    >>> x[rows[:, np.newaxis], columns]
-    array([[ 3,  5],
-           [ 9, 11]])
-
-Detailed notes
---------------
-
-These are some detailed notes, which are not of importance for day to day
-indexing (in no particular order):
-
-* The native NumPy indexing type is ``intp`` and may differ from the
-  default integer array type. ``intp`` is the smallest data type
-  sufficient to safely index any array; for advanced indexing it may be
-  faster than other types.
-* For advanced assignments, there is in general no guarantee for the
-  iteration order. This means that if an element is set more than once,
-  it is not possible to predict the final result.
-* An empty (tuple) index is a full scalar index into a zero dimensional array.
-  ``x[()]`` returns a *scalar* if ``x`` is zero dimensional and a view
-  otherwise. On the other hand ``x[...]`` always returns a view.
-* If a zero dimensional array is present in the index *and* it is a full
-  integer index the result will be a *scalar* and not a zero dimensional array.
-  (Advanced indexing is not triggered.)
-* When an ellipsis (``...``) is present but has no size (i.e. replaces zero
-  ``:``) the result will still always be an array. A view if no advanced index
-  is present, otherwise a copy.
-* the ``nonzero`` equivalence for Boolean arrays does not hold for zero
-  dimensional boolean arrays.
-* When the result of an advanced indexing operation has no elements but an
-  individual index is out of bounds, whether or not an ``IndexError`` is
-  raised is undefined (e.g. ``x[[], [123]]`` with ``123`` being out of bounds).
-* When a *casting* error occurs during assignment (for example updating a
-  numerical array using a sequence of strings), the array being assigned
-  to may end up in an unpredictable partially updated state.
-  However, if any other error (such as an out of bounds index) occurs, the
-  array will remain unchanged.
-* The memory layout of an advanced indexing result is optimized for each
-  indexing operation and no particular memory order can be assumed.
-* When using a subclass (especially one which manipulates its shape), the
-  default ``ndarray.__setitem__`` behaviour will call ``__getitem__`` for
-  *basic* indexing but not for *advanced* indexing. For such a subclass it may
-  be preferable to call ``ndarray.__setitem__`` with a *base class* ndarray
-  view on the data. This *must* be done if the subclasses ``__getitem__`` does
-  not return views.
-
-.. _arrays.indexing.fields:
-
-
-Field Access
--------------
-
-.. seealso:: :ref:`arrays.dtypes`, :ref:`arrays.scalars`
-
-If the :class:`ndarray` object is a structured array the :term:`fields <field>`
-of the array can be accessed by indexing the array with strings,
-dictionary-like.
-
-Indexing ``x['field-name']`` returns a new :term:`view` to the array,
-which is of the same shape as *x* (except when the field is a
-sub-array) but of data type ``x.dtype['field-name']`` and contains
-only the part of the data in the specified field. Also
-:ref:`record array <arrays.classes.rec>` scalars can be "indexed" this way.
-
-Indexing into a structured array can also be done with a list of field names,
-*e.g.* ``x[['field-name1','field-name2']]``. As of NumPy 1.16 this returns a
-view containing only those fields. In older versions of numpy it returned a
-copy. See the user guide section on :ref:`structured_arrays` for more
-information on multifield indexing.
-
-If the accessed field is a sub-array, the dimensions of the sub-array
-are appended to the shape of the result.
-
-.. admonition:: Example
-
-   >>> x = np.zeros((2,2), dtype=[('a', np.int32), ('b', np.float64, (3,3))])
-   >>> x['a'].shape
-   (2, 2)
-   >>> x['a'].dtype
-   dtype('int32')
-   >>> x['b'].shape
-   (2, 2, 3, 3)
-   >>> x['b'].dtype
-   dtype('float64')
-
-
-Flat Iterator indexing
-----------------------
-
-:attr:`x.flat <ndarray.flat>` returns an iterator that will iterate
-over the entire array (in C-contiguous style with the last index
-varying the fastest). This iterator object can also be indexed using
-basic slicing or advanced indexing as long as the selection object is
-not a tuple. This should be clear from the fact that :attr:`x.flat
-<ndarray.flat>` is a 1-dimensional view. It can be used for integer
-indexing with 1-dimensional C-style-flat indices. The shape of any
-returned array is therefore the shape of the integer indexing object.
-
-.. index::
-   single: indexing
-   single: ndarray
+.. autosummary::
+   :toctree: generated/
+
+   place
+   put
+   put_along_axis
+   putmask
+   fill_diagonal
+
+Iterating over arrays
+---------------------
+.. autosummary::
+   :toctree: generated/
+
+   nditer
+   ndenumerate
+   ndindex
+   nested_iters
+   flatiter
+   lib.Arrayterator
index f2204752df83cd0c73a131dc45ba341f04257085..0f703b4754de44b1cbc34b2658da40b075681e02 100644 (file)
@@ -249,7 +249,6 @@ Other attributes
    ndarray.real
    ndarray.imag
    ndarray.flat
-   ndarray.ctypes
 
 
 .. _arrays.ndarray.array-interface:
@@ -621,3 +620,10 @@ String representations:
 
    ndarray.__str__
    ndarray.__repr__
+
+Utility method for typing:
+
+.. autosummary::
+   :toctree: generated/
+
+   ndarray.__class_getitem__
index 6c9bcb5045319ce6ed2f5d7e84ed04b3458ba8f2..c691e802ffd09ff92d4f4dbfe8f0cee3de12da52 100644 (file)
@@ -196,10 +196,10 @@ Inexact types
    ``f16`` prints as ``0.1`` because it is as close to that value as possible,
    whereas the other types do not as they have more precision and therefore have
    closer values.
-   
+
    Conversely, floating-point scalars of different precisions which approximate
    the same decimal value may compare unequal despite printing identically:
-   
+
        >>> f16 = np.float16("0.1")
        >>> f32 = np.float32("0.1")
        >>> f64 = np.float64("0.1")
@@ -352,8 +352,8 @@ are also provided.
                uint32
                uint64
 
-   Alias for the unsigned integer types (one of `numpy.byte`, `numpy.short`,
-   `numpy.intc`, `numpy.int_` and `numpy.longlong`) with the specified number
+   Alias for the unsigned integer types (one of `numpy.ubyte`, `numpy.ushort`,
+   `numpy.uintc`, `numpy.uint` and `numpy.ulonglong`) with the specified number
    of bits.
 
    Compatible with the C99 ``uint8_t``, ``uint16_t``, ``uint32_t``, and
@@ -371,8 +371,8 @@ are also provided.
 
 .. attribute:: uintp
 
-   Alias for the unsigned integer type (one of `numpy.byte`, `numpy.short`,
-   `numpy.intc`, `numpy.int_` and `np.longlong`) that is the same size as a
+   Alias for the unsigned integer type (one of `numpy.ubyte`, `numpy.ushort`,
+   `numpy.uintc`, `numpy.uint` and `np.ulonglong`) that is the same size as a
    pointer.
 
    Compatible with the C ``uintptr_t``.
@@ -399,7 +399,7 @@ are also provided.
                complex256
 
    Alias for `numpy.clongdouble`, named after its size in bits.
-   The existance of these aliases depends on the platform.
+   The existence of these aliases depends on the platform.
 
 Other aliases
 ~~~~~~~~~~~~~
@@ -498,6 +498,13 @@ The exceptions to the above rules are given below:
    generic.__setstate__
    generic.setflags
 
+Utility method for typing:
+
+.. autosummary::
+   :toctree: generated/
+
+   number.__class_getitem__
+
 
 Defining new types
 ==================
index 1673f1d6b1f765d3015583e51130d06bc3e5f555..bb440582548cd938675c85d0e1be7e61c1e27097 100644 (file)
@@ -151,6 +151,16 @@ and its sub-types).
 
     `numpy.ndarray.item` is identical to PyArray_GETITEM.
 
+.. c:function:: int PyArray_FinalizeFunc(PyArrayObject* arr, PyObject* obj)
+
+    The function pointed to by the CObject
+    :obj:`~numpy.class.__array_finalize__`.
+    The first argument is the newly created sub-type. The second argument
+    (if not NULL) is the "parent" array (if the array was created using
+    slicing or some other operation where a clearly-distinguishable parent
+    is present). This routine can do anything it wants to. It should
+    return a -1 on error and 0 otherwise.
+
 
 Data access
 ^^^^^^^^^^^
@@ -315,8 +325,7 @@ From scratch
     should be increased after the pointer is passed in, and the base member
     of the returned ndarray should point to the Python object that owns
     the data. This will ensure that the provided memory is not
-    freed while the returned array is in existence. To free memory as soon
-    as the ndarray is deallocated, set the OWNDATA flag on the returned ndarray.
+    freed while the returned array is in existence.
 
 .. c:function:: PyObject* PyArray_SimpleNewFromDescr( \
         int nd, npy_int const* dims, PyArray_Descr* descr)
@@ -509,34 +518,40 @@ From other objects
 
         :c:data:`NPY_ARRAY_CARRAY`
 
-    .. c:macro:: NPY_ARRAY_IN_ARRAY
+..
+  dedented to allow internal linking, pending a refactoring
 
-        :c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED`
+.. c:macro:: NPY_ARRAY_IN_ARRAY
+
+    :c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED`
 
     .. c:macro:: NPY_ARRAY_IN_FARRAY
 
         :c:data:`NPY_ARRAY_F_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED`
 
-    .. c:macro:: NPY_OUT_ARRAY
+.. c:macro:: NPY_OUT_ARRAY
 
-        :c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_WRITEABLE` \|
-        :c:data:`NPY_ARRAY_ALIGNED`
+    :c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_WRITEABLE` \|
+    :c:data:`NPY_ARRAY_ALIGNED`
 
-    .. c:macro:: NPY_ARRAY_OUT_ARRAY
+.. c:macro:: NPY_ARRAY_OUT_ARRAY
 
-        :c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED` \|
-        :c:data:`NPY_ARRAY_WRITEABLE`
+    :c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_ALIGNED` \|
+    :c:data:`NPY_ARRAY_WRITEABLE`
 
     .. c:macro:: NPY_ARRAY_OUT_FARRAY
 
         :c:data:`NPY_ARRAY_F_CONTIGUOUS` \| :c:data:`NPY_ARRAY_WRITEABLE` \|
         :c:data:`NPY_ARRAY_ALIGNED`
 
-    .. c:macro:: NPY_ARRAY_INOUT_ARRAY
+..
+  dedented to allow internal linking, pending a refactoring
 
-        :c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_WRITEABLE` \|
-        :c:data:`NPY_ARRAY_ALIGNED` \| :c:data:`NPY_ARRAY_WRITEBACKIFCOPY` \|
-        :c:data:`NPY_ARRAY_UPDATEIFCOPY`
+.. c:macro:: NPY_ARRAY_INOUT_ARRAY
+
+    :c:data:`NPY_ARRAY_C_CONTIGUOUS` \| :c:data:`NPY_ARRAY_WRITEABLE` \|
+    :c:data:`NPY_ARRAY_ALIGNED` \| :c:data:`NPY_ARRAY_WRITEBACKIFCOPY` \|
+    :c:data:`NPY_ARRAY_UPDATEIFCOPY`
 
     .. c:macro:: NPY_ARRAY_INOUT_FARRAY
 
@@ -574,6 +589,9 @@ From other objects
     did not have the _ARRAY_ macro namespace in them. That form
     of the constant names is deprecated in 1.7.
 
+..
+  dedented to allow internal linking, pending a refactoring
+
 .. c:macro:: NPY_ARRAY_NOTSWAPPED
 
     Make sure the returned array has a data-type descriptor that is in
@@ -585,9 +603,13 @@ From other objects
     not in machine byte- order), then a new data-type descriptor is
     created and used with its byte-order field set to native.
 
-.. c:macro:: NPY_ARRAY_BEHAVED_NS
+    .. c:macro:: NPY_ARRAY_BEHAVED_NS
+
+        :c:data:`NPY_ARRAY_ALIGNED` \| :c:data:`NPY_ARRAY_WRITEABLE` \|
+        :c:data:`NPY_ARRAY_NOTSWAPPED`
 
-    :c:data:`NPY_ARRAY_ALIGNED` \| :c:data:`NPY_ARRAY_WRITEABLE` \| :c:data:`NPY_ARRAY_NOTSWAPPED`
+..
+  dedented to allow internal linking, pending a refactoring
 
 .. c:macro:: NPY_ARRAY_ELEMENTSTRIDES
 
@@ -713,6 +735,13 @@ From other objects
     broadcastable to the shape of ``dest``. The data areas of dest
     and src must not overlap.
 
+.. c:function:: int PyArray_CopyObject(PyArrayObject* dest, PyObject* src)
+
+    Assign an object ``src`` to a NumPy array ``dest`` according to
+    array-coercion rules. This is basically identical to
+    :c:func:`PyArray_FromAny`, but assigns directly to the output array.
+    Returns 0 on success and -1 on failures.
+
 .. c:function:: int PyArray_MoveInto(PyArrayObject* dest, PyArrayObject* src)
 
     Move data from the source array, ``src``, into the destination
@@ -1250,8 +1279,8 @@ Converting data types
     function returns :c:data:`NPY_FALSE`.
 
 
-New data types
-^^^^^^^^^^^^^^
+User-defined data types
+^^^^^^^^^^^^^^^^^^^^^^^
 
 .. c:function:: void PyArray_InitArrFuncs(PyArray_ArrFuncs* f)
 
@@ -1293,8 +1322,15 @@ New data types
     data-type object, *descr*, of the given *scalar* kind. Use
     *scalar* = :c:data:`NPY_NOSCALAR` to register that an array of data-type
     *descr* can be cast safely to a data-type whose type_number is
-    *totype*.
+    *totype*. The return value is 0 on success or -1 on failure.
+
+.. c:function:: int PyArray_TypeNumFromName( \
+        char const *str)
 
+   Given a string return the type-number for the data-type with that string as
+   the type-object name.
+   Returns ``NPY_NOTYPE`` without setting an error if no type can be found.
+   Only works for user-defined data-types.
 
 Special functions for NPY_OBJECT
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -1426,7 +1462,9 @@ of the constant names is deprecated in 1.7.
 
 .. c:macro:: NPY_ARRAY_OWNDATA
 
-    The data area is owned by this array.
+    The data area is owned by this array. Should never be set manually, instead
+    create a ``PyObject`` wrapping the data and set the array's base to that
+    object. For an example, see the test in ``test_mem_policy``.
 
 .. c:macro:: NPY_ARRAY_ALIGNED
 
@@ -2647,6 +2685,12 @@ cost of a slight overhead.
     - If the position of iter is changed, any subsequent call to
       PyArrayNeighborhoodIter_Next is undefined behavior, and
       PyArrayNeighborhoodIter_Reset must be called.
+    - If the position of iter is not the beginning of the data and the
+      underlying data for iter is contiguous, the iterator will point to the
+      start of the data instead of position pointed by iter.
+      To avoid this situation, iter should be moved to the required position
+      only after the creation of iterator, and PyArrayNeighborhoodIter_Reset
+      must be called.
 
     .. code-block:: c
 
@@ -2656,7 +2700,7 @@ cost of a slight overhead.
 
        /*For a 3x3 kernel */
        bounds = {-1, 1, -1, 1};
-       neigh_iter = (PyArrayNeighborhoodIterObject*)PyArrayNeighborhoodIter_New(
+       neigh_iter = (PyArrayNeighborhoodIterObject*)PyArray_NeighborhoodIterNew(
             iter, bounds, NPY_NEIGHBORHOOD_ITER_ZERO_PADDING, NULL);
 
        for(i = 0; i < iter->size; ++i) {
@@ -2684,6 +2728,45 @@ cost of a slight overhead.
     neighborhood. Calling this function after every point of the
     neighborhood has been visited is undefined.
 
+Array mapping
+-------------
+
+Array mapping is the machinery behind advanced indexing.
+
+.. c:function:: PyObject* PyArray_MapIterArray(PyArrayObject *a, \
+                 PyObject *index)
+
+    Use advanced indexing to iterate an array.
+
+.. c:function:: void PyArray_MapIterSwapAxes(PyArrayMapIterObject *mit, \
+                PyArrayObject **ret, int getmap)
+
+    Swap the axes to or from their inserted form. ``MapIter`` always puts the
+    advanced (array) indices first in the iteration. But if they are
+    consecutive, it will insert/transpose them back before returning.
+    This is stored as ``mit->consec != 0`` (the place where they are inserted).
+    For assignments, the opposite happens: the values to be assigned are
+    transposed (``getmap=1`` instead of ``getmap=0``). ``getmap=0`` and
+    ``getmap=1`` undo the other operation.
+
+.. c:function:: void PyArray_MapIterNext(PyArrayMapIterObject *mit)
+
+    This function needs to update the state of the map iterator
+    and point ``mit->dataptr`` to the memory-location of the next object.
+
+    Note that this function never handles an extra operand but provides
+    compatibility for an old (exposed) API.
+
+.. c:function:: PyObject* PyArray_MapIterArrayCopyIfOverlap(PyArrayObject *a, \
+                PyObject *index, int copy_if_overlap, PyArrayObject *extra_op)
+
+    Similar to :c:func:`PyArray_MapIterArray` but with an additional
+    ``copy_if_overlap`` argument. If ``copy_if_overlap != 0``, checks if ``a``
+    has memory overlap with any of the arrays in ``index`` and with
+    ``extra_op``, and make copies as appropriate to avoid problems if the
+    input is modified during the iteration. ``iter->array`` may contain a
+    copied array (UPDATEIFCOPY/WRITEBACKIFCOPY set).
+
 Array Scalars
 -------------
 
@@ -2696,13 +2779,19 @@ Array Scalars
     whenever 0-dimensional arrays could be returned to Python.
 
 .. c:function:: PyObject* PyArray_Scalar( \
-        void* data, PyArray_Descr* dtype, PyObject* itemsize)
+        void* data, PyArray_Descr* dtype, PyObject* base)
+
+    Return an array scalar object of the given *dtype* by **copying**
+    from memory pointed to by *data*.  *base* is expected to be the
+    array object that is the owner of the data.  *base* is required
+    if `dtype` is a ``void`` scalar, or if the ``NPY_USE_GETITEM``
+    flag is set and it is known that the ``getitem`` method uses
+    the ``arr`` argument without checking if it is ``NULL``.  Otherwise
+    `base` may be ``NULL``.
 
-    Return an array scalar object of the given enumerated *typenum*
-    and *itemsize* by **copying** from memory pointed to by *data*
-    . If *swap* is nonzero then this function will byteswap the data
-    if appropriate to the data-type because array scalars are always
-    in correct machine-byte order.
+    If the data is not in native byte order (as indicated by
+    ``dtype->byteorder``) then this function will byteswap the data,
+    because array scalars are always in correct machine-byte order.
 
 .. c:function:: PyObject* PyArray_ToScalar(void* data, PyArrayObject* arr)
 
@@ -2815,12 +2904,14 @@ Data-type descriptors
     (recursively).
 
     The value of *newendian* is one of these macros:
-
-    .. c:macro:: NPY_IGNORE
-                 NPY_SWAP
-                 NPY_NATIVE
-                 NPY_LITTLE
-                 NPY_BIG
+..
+    dedent the enumeration of flags to avoid missing references sphinx warnings 
+
+.. c:macro:: NPY_IGNORE
+             NPY_SWAP
+             NPY_NATIVE
+             NPY_LITTLE
+             NPY_BIG
 
     If a byteorder of :c:data:`NPY_IGNORE` is encountered it
     is left alone. If newendian is :c:data:`NPY_SWAP`, then all byte-orders
index cec83b150d2177659eeace230101162d089fb665..e129fdd7769b18f1881e67791ed48e442b77dc2a 100644 (file)
@@ -49,24 +49,24 @@ Floating point classification
 .. c:macro:: npy_isnan(x)
 
     This is a macro, and is equivalent to C99 isnan: works for single, double
-    and extended precision, and return a non 0 value is x is a NaN.
+    and extended precision, and return a non 0 value if x is a NaN.
 
 .. c:macro:: npy_isfinite(x)
 
     This is a macro, and is equivalent to C99 isfinite: works for single,
-    double and extended precision, and return a non 0 value is x is neither a
+    double and extended precision, and return a non 0 value if x is neither a
     NaN nor an infinity.
 
 .. c:macro:: npy_isinf(x)
 
     This is a macro, and is equivalent to C99 isinf: works for single, double
-    and extended precision, and return a non 0 value is x is infinite (positive
+    and extended precision, and return a non 0 value if x is infinite (positive
     and negative).
 
 .. c:macro:: npy_signbit(x)
 
     This is a macro, and is equivalent to C99 signbit: works for single, double
-    and extended precision, and return a non 0 value is x has the signbit set
+    and extended precision, and return a non 0 value if x has the signbit set
     (that is the number is negative).
 
 .. c:macro:: npy_copysign(x, y)
diff --git a/doc/source/reference/c-api/data_memory.rst b/doc/source/reference/c-api/data_memory.rst
new file mode 100644 (file)
index 0000000..b779026
--- /dev/null
@@ -0,0 +1,159 @@
+.. _data_memory:
+
+Memory management in NumPy
+==========================
+
+The `numpy.ndarray` is a python class. It requires additional memory allocations
+to hold `numpy.ndarray.strides`, `numpy.ndarray.shape` and
+`numpy.ndarray.data` attributes. These attributes are specially allocated
+after creating the python object in `__new__`. The ``strides`` and
+``shape`` are stored in a piece of memory allocated internally.
+
+The ``data`` allocation used to store the actual array values (which could be
+pointers in the case of ``object`` arrays) can be very large, so NumPy has
+provided interfaces to manage its allocation and release. This document details
+how those interfaces work.
+
+Historical overview
+-------------------
+
+Since version 1.7.0, NumPy has exposed a set of ``PyDataMem_*`` functions
+(:c:func:`PyDataMem_NEW`, :c:func:`PyDataMem_FREE`, :c:func:`PyDataMem_RENEW`)
+which are backed by `alloc`, `free`, `realloc` respectively. In that version
+NumPy also exposed the `PyDataMem_EventHook` function described below, which
+wrap the OS-level calls.
+
+Since those early days, Python also improved its memory management
+capabilities, and began providing
+various :ref:`management policies <memoryoverview>` beginning in version
+3.4. These routines are divided into a set of domains, each domain has a
+:c:type:`PyMemAllocatorEx` structure of routines for memory management. Python also
+added a `tracemalloc` module to trace calls to the various routines. These
+tracking hooks were added to the NumPy ``PyDataMem_*`` routines.
+
+NumPy added a small cache of allocated memory in its internal
+``npy_alloc_cache``, ``npy_alloc_cache_zero``, and ``npy_free_cache``
+functions. These wrap ``alloc``, ``alloc-and-memset(0)`` and ``free``
+respectively, but when ``npy_free_cache`` is called, it adds the pointer to a
+short list of available blocks marked by size. These blocks can be re-used by
+subsequent calls to ``npy_alloc*``, avoiding memory thrashing.
+
+Configurable memory routines in NumPy (NEP 49)
+----------------------------------------------
+
+Users may wish to override the internal data memory routines with ones of their
+own. Since NumPy does not use the Python domain strategy to manage data memory,
+it provides an alternative set of C-APIs to change memory routines. There are
+no Python domain-wide strategies for large chunks of object data, so those are
+less suited to NumPy's needs. User who wish to change the NumPy data memory
+management routines can use :c:func:`PyDataMem_SetHandler`, which uses a
+:c:type:`PyDataMem_Handler` structure to hold pointers to functions used to
+manage the data memory. The calls are still wrapped by internal routines to
+call :c:func:`PyTraceMalloc_Track`, :c:func:`PyTraceMalloc_Untrack`, and will
+use the :c:func:`PyDataMem_EventHookFunc` mechanism. Since the functions may
+change during the lifetime of the process, each ``ndarray`` carries with it the
+functions used at the time of its instantiation, and these will be used to
+reallocate or free the data memory of the instance.
+
+.. c:type:: PyDataMem_Handler
+
+    A struct to hold function pointers used to manipulate memory
+
+    .. code-block:: c
+
+        typedef struct {
+            char name[127];  /* multiple of 64 to keep the struct aligned */
+            uint8_t version; /* currently 1 */
+            PyDataMemAllocator allocator;
+        } PyDataMem_Handler;
+
+    where the allocator structure is
+
+    .. code-block:: c
+
+        /* The declaration of free differs from PyMemAllocatorEx */ 
+        typedef struct {
+            void *ctx;
+            void* (*malloc) (void *ctx, size_t size);
+            void* (*calloc) (void *ctx, size_t nelem, size_t elsize);
+            void* (*realloc) (void *ctx, void *ptr, size_t new_size);
+            void (*free) (void *ctx, void *ptr, size_t size);
+        } PyDataMemAllocator;
+
+.. c:function:: PyObject * PyDataMem_SetHandler(PyObject *handler)
+
+   Set a new allocation policy. If the input value is ``NULL``, will reset the
+   policy to the default. Return the previous policy, or
+   return ``NULL`` if an error has occurred. We wrap the user-provided functions
+   so they will still call the python and numpy memory management callback
+   hooks.
+    
+.. c:function:: PyObject * PyDataMem_GetHandler()
+
+   Return the current policy that will be used to allocate data for the
+   next ``PyArrayObject``. On failure, return ``NULL``.
+
+For an example of setting up and using the PyDataMem_Handler, see the test in
+:file:`numpy/core/tests/test_mem_policy.py`
+
+.. c:function:: void PyDataMem_EventHookFunc(void *inp, void *outp, size_t size, void *user_data);
+
+    This function will be called during data memory manipulation
+
+.. c:function:: PyDataMem_EventHookFunc * PyDataMem_SetEventHook(PyDataMem_EventHookFunc *newhook, void *user_data, void **old_data)
+
+    Sets the allocation event hook for numpy array data.
+  
+    Returns a pointer to the previous hook or ``NULL``.  If old_data is
+    non-``NULL``, the previous user_data pointer will be copied to it.
+  
+    If not ``NULL``, hook will be called at the end of each ``PyDataMem_NEW/FREE/RENEW``:
+
+    .. code-block:: c
+   
+        result = PyDataMem_NEW(size)        -> (*hook)(NULL, result, size, user_data)
+        PyDataMem_FREE(ptr)                 -> (*hook)(ptr, NULL, 0, user_data)
+        result = PyDataMem_RENEW(ptr, size) -> (*hook)(ptr, result, size, user_data)
+  
+    When the hook is called, the GIL will be held by the calling
+    thread.  The hook should be written to be reentrant, if it performs
+    operations that might cause new allocation events (such as the
+    creation/destruction numpy objects, or creating/destroying Python
+    objects which might cause a gc)
+
+What happens when deallocating if there is no policy set
+--------------------------------------------------------
+
+A rare but useful technique is to allocate a buffer outside NumPy, use
+:c:func:`PyArray_NewFromDescr` to wrap the buffer in a ``ndarray``, then switch
+the ``OWNDATA`` flag to true. When the ``ndarray`` is released, the
+appropriate function from the ``ndarray``'s ``PyDataMem_Handler`` should be
+called to free the buffer. But the ``PyDataMem_Handler`` field was never set,
+it will be ``NULL``. For backward compatibility, NumPy will call ``free()`` to
+release the buffer. If ``NUMPY_WARN_IF_NO_MEM_POLICY`` is set to ``1``, a
+warning will be emitted. The current default is not to emit a warning, this may
+change in a future version of NumPy.
+
+A better technique would be to use a ``PyCapsule`` as a base object:
+
+.. code-block:: c
+
+    /* define a PyCapsule_Destructor, using the correct deallocator for buff */
+    void free_wrap(void *capsule){
+        void * obj = PyCapsule_GetPointer(capsule, PyCapsule_GetName(capsule));
+        free(obj); 
+    };
+
+    /* then inside the function that creates arr from buff */
+    ...
+    arr = PyArray_NewFromDescr(... buf, ...);
+    if (arr == NULL) {
+        return NULL;
+    }
+    capsule = PyCapsule_New(buf, "my_wrapped_buffer",
+                            (PyCapsule_Destructor)&free_wrap);
+    if (PyArray_SetBaseObject(arr, capsule) == -1) {
+        Py_DECREF(arr);
+        return NULL;
+    }
+    ...
index bb1ed154e9b0867689f2802763ba516d7f47db01..6288ff33bc170f048d6c5db2752816bdbb3b053e 100644 (file)
@@ -49,3 +49,4 @@ code.
    generalized-ufuncs
    coremath
    deprecations
+   data_memory
index add96e3b4698dbba1beacffbac19042fc322d065..83644d8b240b1513de804cacfddf393a7febb4d3 100644 (file)
@@ -312,318 +312,322 @@ Construction and Destruction
 
     Flags that may be passed in ``flags``, applying to the whole
     iterator, are:
+..
+    dedent the enumeration of flags to avoid missing references sphinx warnings 
 
-        .. c:macro:: NPY_ITER_C_INDEX
+.. c:macro:: NPY_ITER_C_INDEX
 
-            Causes the iterator to track a raveled flat index matching C
-            order. This option cannot be used with :c:data:`NPY_ITER_F_INDEX`.
+    Causes the iterator to track a raveled flat index matching C
+    order. This option cannot be used with :c:data:`NPY_ITER_F_INDEX`.
 
-        .. c:macro:: NPY_ITER_F_INDEX
+.. c:macro:: NPY_ITER_F_INDEX
 
-            Causes the iterator to track a raveled flat index matching Fortran
-            order. This option cannot be used with :c:data:`NPY_ITER_C_INDEX`.
+    Causes the iterator to track a raveled flat index matching Fortran
+    order. This option cannot be used with :c:data:`NPY_ITER_C_INDEX`.
+
+.. c:macro:: NPY_ITER_MULTI_INDEX
 
-        .. c:macro:: NPY_ITER_MULTI_INDEX
-
-            Causes the iterator to track a multi-index.
-            This prevents the iterator from coalescing axes to
-            produce bigger inner loops. If the loop is also not buffered
-            and no index is being tracked (`NpyIter_RemoveAxis` can be called),
-            then the iterator size can be ``-1`` to indicate that the iterator
-            is too large. This can happen due to complex broadcasting and
-            will result in errors being created when the setting the iterator
-            range, removing the multi index, or getting the next function.
-            However, it is possible to remove axes again and use the iterator
-            normally if the size is small enough after removal.
-
-        .. c:macro:: NPY_ITER_EXTERNAL_LOOP
-
-            Causes the iterator to skip iteration of the innermost
-            loop, requiring the user of the iterator to handle it.
-
-            This flag is incompatible with :c:data:`NPY_ITER_C_INDEX`,
-            :c:data:`NPY_ITER_F_INDEX`, and :c:data:`NPY_ITER_MULTI_INDEX`.
-
-        .. c:macro:: NPY_ITER_DONT_NEGATE_STRIDES
-
-            This only affects the iterator when :c:type:`NPY_KEEPORDER` is
-            specified for the order parameter.  By default with
-            :c:type:`NPY_KEEPORDER`, the iterator reverses axes which have
-            negative strides, so that memory is traversed in a forward
-            direction.  This disables this step.  Use this flag if you
-            want to use the underlying memory-ordering of the axes,
-            but don't want an axis reversed. This is the behavior of
-            ``numpy.ravel(a, order='K')``, for instance.
-
-        .. c:macro:: NPY_ITER_COMMON_DTYPE
-
-            Causes the iterator to convert all the operands to a common
-            data type, calculated based on the ufunc type promotion rules.
-            Copying or buffering must be enabled.
-
-            If the common data type is known ahead of time, don't use this
-            flag.  Instead, set the requested dtype for all the operands.
-
-        .. c:macro:: NPY_ITER_REFS_OK
-
-            Indicates that arrays with reference types (object
-            arrays or structured arrays containing an object type)
-            may be accepted and used in the iterator.  If this flag
-            is enabled, the caller must be sure to check whether
-            :c:expr:`NpyIter_IterationNeedsAPI(iter)` is true, in which case
-            it may not release the GIL during iteration.
-
-        .. c:macro:: NPY_ITER_ZEROSIZE_OK
-
-            Indicates that arrays with a size of zero should be permitted.
-            Since the typical iteration loop does not naturally work with
-            zero-sized arrays, you must check that the IterSize is larger
-            than zero before entering the iteration loop.
-            Currently only the operands are checked, not a forced shape.
-
-        .. c:macro:: NPY_ITER_REDUCE_OK
-
-            Permits writeable operands with a dimension with zero
-            stride and size greater than one.  Note that such operands
-            must be read/write.
-
-            When buffering is enabled, this also switches to a special
-            buffering mode which reduces the loop length as necessary to
-            not trample on values being reduced.
-
-            Note that if you want to do a reduction on an automatically
-            allocated output, you must use :c:func:`NpyIter_GetOperandArray`
-            to get its reference, then set every value to the reduction
-            unit before doing the iteration loop.  In the case of a
-            buffered reduction, this means you must also specify the
-            flag :c:data:`NPY_ITER_DELAY_BUFALLOC`, then reset the iterator
-            after initializing the allocated operand to prepare the
-            buffers.
-
-        .. c:macro:: NPY_ITER_RANGED
-
-            Enables support for iteration of sub-ranges of the full
-            ``iterindex`` range ``[0, NpyIter_IterSize(iter))``.  Use
-            the function :c:func:`NpyIter_ResetToIterIndexRange` to specify
-            a range for iteration.
-
-            This flag can only be used with :c:data:`NPY_ITER_EXTERNAL_LOOP`
-            when :c:data:`NPY_ITER_BUFFERED` is enabled.  This is because
-            without buffering, the inner loop is always the size of the
-            innermost iteration dimension, and allowing it to get cut up
-            would require special handling, effectively making it more
-            like the buffered version.
-
-        .. c:macro:: NPY_ITER_BUFFERED
-
-            Causes the iterator to store buffering data, and use buffering
-            to satisfy data type, alignment, and byte-order requirements.
-            To buffer an operand, do not specify the :c:data:`NPY_ITER_COPY`
-            or :c:data:`NPY_ITER_UPDATEIFCOPY` flags, because they will
-            override buffering.  Buffering is especially useful for Python
-            code using the iterator, allowing for larger chunks
-            of data at once to amortize the Python interpreter overhead.
-
-            If used with :c:data:`NPY_ITER_EXTERNAL_LOOP`, the inner loop
-            for the caller may get larger chunks than would be possible
-            without buffering, because of how the strides are laid out.
-
-            Note that if an operand is given the flag :c:data:`NPY_ITER_COPY`
-            or :c:data:`NPY_ITER_UPDATEIFCOPY`, a copy will be made in preference
-            to buffering.  Buffering will still occur when the array was
-            broadcast so elements need to be duplicated to get a constant
-            stride.
-
-            In normal buffering, the size of each inner loop is equal
-            to the buffer size, or possibly larger if
-            :c:data:`NPY_ITER_GROWINNER` is specified.  If
-            :c:data:`NPY_ITER_REDUCE_OK` is enabled and a reduction occurs,
-            the inner loops may become smaller depending
-            on the structure of the reduction.
-
-        .. c:macro:: NPY_ITER_GROWINNER
-
-            When buffering is enabled, this allows the size of the inner
-            loop to grow when buffering isn't necessary.  This option
-            is best used if you're doing a straight pass through all the
-            data, rather than anything with small cache-friendly arrays
-            of temporary values for each inner loop.
-
-        .. c:macro:: NPY_ITER_DELAY_BUFALLOC
-
-            When buffering is enabled, this delays allocation of the
-            buffers until :c:func:`NpyIter_Reset` or another reset function is
-            called.  This flag exists to avoid wasteful copying of
-            buffer data when making multiple copies of a buffered
-            iterator for multi-threaded iteration.
-
-            Another use of this flag is for setting up reduction operations.
-            After the iterator is created, and a reduction output
-            is allocated automatically by the iterator (be sure to use
-            READWRITE access), its value may be initialized to the reduction
-            unit.  Use :c:func:`NpyIter_GetOperandArray` to get the object.
-            Then, call :c:func:`NpyIter_Reset` to allocate and fill the buffers
-            with their initial values.
-
-        .. c:macro:: NPY_ITER_COPY_IF_OVERLAP
-
-            If any write operand has overlap with any read operand, eliminate all
-            overlap by making temporary copies (enabling UPDATEIFCOPY for write
-            operands, if necessary). A pair of operands has overlap if there is
-            a memory address that contains data common to both arrays.
-
-            Because exact overlap detection has exponential runtime
-            in the number of dimensions, the decision is made based
-            on heuristics, which has false positives (needless copies in unusual
-            cases) but has no false negatives.
-
-            If any read/write overlap exists, this flag ensures the result of the
-            operation is the same as if all operands were copied.
-            In cases where copies would need to be made, **the result of the
-            computation may be undefined without this flag!**
+    Causes the iterator to track a multi-index.
+    This prevents the iterator from coalescing axes to
+    produce bigger inner loops. If the loop is also not buffered
+    and no index is being tracked (`NpyIter_RemoveAxis` can be called),
+    then the iterator size can be ``-1`` to indicate that the iterator
+    is too large. This can happen due to complex broadcasting and
+    will result in errors being created when the setting the iterator
+    range, removing the multi index, or getting the next function.
+    However, it is possible to remove axes again and use the iterator
+    normally if the size is small enough after removal.
+
+.. c:macro:: NPY_ITER_EXTERNAL_LOOP
+
+    Causes the iterator to skip iteration of the innermost
+    loop, requiring the user of the iterator to handle it.
+
+    This flag is incompatible with :c:data:`NPY_ITER_C_INDEX`,
+    :c:data:`NPY_ITER_F_INDEX`, and :c:data:`NPY_ITER_MULTI_INDEX`.
+
+.. c:macro:: NPY_ITER_DONT_NEGATE_STRIDES
+
+    This only affects the iterator when :c:type:`NPY_KEEPORDER` is
+    specified for the order parameter.  By default with
+    :c:type:`NPY_KEEPORDER`, the iterator reverses axes which have
+    negative strides, so that memory is traversed in a forward
+    direction.  This disables this step.  Use this flag if you
+    want to use the underlying memory-ordering of the axes,
+    but don't want an axis reversed. This is the behavior of
+    ``numpy.ravel(a, order='K')``, for instance.
+
+.. c:macro:: NPY_ITER_COMMON_DTYPE
+
+    Causes the iterator to convert all the operands to a common
+    data type, calculated based on the ufunc type promotion rules.
+    Copying or buffering must be enabled.
+
+    If the common data type is known ahead of time, don't use this
+    flag.  Instead, set the requested dtype for all the operands.
+
+.. c:macro:: NPY_ITER_REFS_OK
+
+    Indicates that arrays with reference types (object
+    arrays or structured arrays containing an object type)
+    may be accepted and used in the iterator.  If this flag
+    is enabled, the caller must be sure to check whether
+    :c:expr:`NpyIter_IterationNeedsAPI(iter)` is true, in which case
+    it may not release the GIL during iteration.
+
+.. c:macro:: NPY_ITER_ZEROSIZE_OK
+
+    Indicates that arrays with a size of zero should be permitted.
+    Since the typical iteration loop does not naturally work with
+    zero-sized arrays, you must check that the IterSize is larger
+    than zero before entering the iteration loop.
+    Currently only the operands are checked, not a forced shape.
+
+.. c:macro:: NPY_ITER_REDUCE_OK
+
+    Permits writeable operands with a dimension with zero
+    stride and size greater than one.  Note that such operands
+    must be read/write.
+
+    When buffering is enabled, this also switches to a special
+    buffering mode which reduces the loop length as necessary to
+    not trample on values being reduced.
+
+    Note that if you want to do a reduction on an automatically
+    allocated output, you must use :c:func:`NpyIter_GetOperandArray`
+    to get its reference, then set every value to the reduction
+    unit before doing the iteration loop.  In the case of a
+    buffered reduction, this means you must also specify the
+    flag :c:data:`NPY_ITER_DELAY_BUFALLOC`, then reset the iterator
+    after initializing the allocated operand to prepare the
+    buffers.
+
+.. c:macro:: NPY_ITER_RANGED
+
+    Enables support for iteration of sub-ranges of the full
+    ``iterindex`` range ``[0, NpyIter_IterSize(iter))``.  Use
+    the function :c:func:`NpyIter_ResetToIterIndexRange` to specify
+    a range for iteration.
+
+    This flag can only be used with :c:data:`NPY_ITER_EXTERNAL_LOOP`
+    when :c:data:`NPY_ITER_BUFFERED` is enabled.  This is because
+    without buffering, the inner loop is always the size of the
+    innermost iteration dimension, and allowing it to get cut up
+    would require special handling, effectively making it more
+    like the buffered version.
+
+.. c:macro:: NPY_ITER_BUFFERED
+
+    Causes the iterator to store buffering data, and use buffering
+    to satisfy data type, alignment, and byte-order requirements.
+    To buffer an operand, do not specify the :c:data:`NPY_ITER_COPY`
+    or :c:data:`NPY_ITER_UPDATEIFCOPY` flags, because they will
+    override buffering.  Buffering is especially useful for Python
+    code using the iterator, allowing for larger chunks
+    of data at once to amortize the Python interpreter overhead.
+
+    If used with :c:data:`NPY_ITER_EXTERNAL_LOOP`, the inner loop
+    for the caller may get larger chunks than would be possible
+    without buffering, because of how the strides are laid out.
+
+    Note that if an operand is given the flag :c:data:`NPY_ITER_COPY`
+    or :c:data:`NPY_ITER_UPDATEIFCOPY`, a copy will be made in preference
+    to buffering.  Buffering will still occur when the array was
+    broadcast so elements need to be duplicated to get a constant
+    stride.
+
+    In normal buffering, the size of each inner loop is equal
+    to the buffer size, or possibly larger if
+    :c:data:`NPY_ITER_GROWINNER` is specified.  If
+    :c:data:`NPY_ITER_REDUCE_OK` is enabled and a reduction occurs,
+    the inner loops may become smaller depending
+    on the structure of the reduction.
+
+.. c:macro:: NPY_ITER_GROWINNER
+
+    When buffering is enabled, this allows the size of the inner
+    loop to grow when buffering isn't necessary.  This option
+    is best used if you're doing a straight pass through all the
+    data, rather than anything with small cache-friendly arrays
+    of temporary values for each inner loop.
+
+.. c:macro:: NPY_ITER_DELAY_BUFALLOC
+
+    When buffering is enabled, this delays allocation of the
+    buffers until :c:func:`NpyIter_Reset` or another reset function is
+    called.  This flag exists to avoid wasteful copying of
+    buffer data when making multiple copies of a buffered
+    iterator for multi-threaded iteration.
+
+    Another use of this flag is for setting up reduction operations.
+    After the iterator is created, and a reduction output
+    is allocated automatically by the iterator (be sure to use
+    READWRITE access), its value may be initialized to the reduction
+    unit.  Use :c:func:`NpyIter_GetOperandArray` to get the object.
+    Then, call :c:func:`NpyIter_Reset` to allocate and fill the buffers
+    with their initial values.
+
+.. c:macro:: NPY_ITER_COPY_IF_OVERLAP
+
+    If any write operand has overlap with any read operand, eliminate all
+    overlap by making temporary copies (enabling UPDATEIFCOPY for write
+    operands, if necessary). A pair of operands has overlap if there is
+    a memory address that contains data common to both arrays.
+
+    Because exact overlap detection has exponential runtime
+    in the number of dimensions, the decision is made based
+    on heuristics, which has false positives (needless copies in unusual
+    cases) but has no false negatives.
+
+    If any read/write overlap exists, this flag ensures the result of the
+    operation is the same as if all operands were copied.
+    In cases where copies would need to be made, **the result of the
+    computation may be undefined without this flag!**
 
     Flags that may be passed in ``op_flags[i]``, where ``0 <= i < nop``:
+..
+    dedent the enumeration of flags to avoid missing references sphinx warnings 
+
+.. c:macro:: NPY_ITER_READWRITE
+.. c:macro:: NPY_ITER_READONLY
+.. c:macro:: NPY_ITER_WRITEONLY
+
+    Indicate how the user of the iterator will read or write
+    to ``op[i]``.  Exactly one of these flags must be specified
+    per operand. Using ``NPY_ITER_READWRITE`` or ``NPY_ITER_WRITEONLY``
+    for a user-provided operand may trigger `WRITEBACKIFCOPY``
+    semantics. The data will be written back to the original array
+    when ``NpyIter_Deallocate`` is called.
+
+.. c:macro:: NPY_ITER_COPY
+
+    Allow a copy of ``op[i]`` to be made if it does not
+    meet the data type or alignment requirements as specified
+    by the constructor flags and parameters.
+
+.. c:macro:: NPY_ITER_UPDATEIFCOPY
 
-        .. c:macro:: NPY_ITER_READWRITE
-        .. c:macro:: NPY_ITER_READONLY
-        .. c:macro:: NPY_ITER_WRITEONLY
+    Triggers :c:data:`NPY_ITER_COPY`, and when an array operand
+    is flagged for writing and is copied, causes the data
+    in a copy to be copied back to ``op[i]`` when
+    ``NpyIter_Deallocate`` is called.
 
-            Indicate how the user of the iterator will read or write
-            to ``op[i]``.  Exactly one of these flags must be specified
-            per operand. Using ``NPY_ITER_READWRITE`` or ``NPY_ITER_WRITEONLY``
-            for a user-provided operand may trigger `WRITEBACKIFCOPY``
-            semantics. The data will be written back to the original array
-            when ``NpyIter_Deallocate`` is called.
-
-        .. c:macro:: NPY_ITER_COPY
+    If the operand is flagged as write-only and a copy is needed,
+    an uninitialized temporary array will be created and then copied
+    to back to ``op[i]`` on calling ``NpyIter_Deallocate``, instead of
+    doing the unnecessary copy operation.
 
-            Allow a copy of ``op[i]`` to be made if it does not
-            meet the data type or alignment requirements as specified
-            by the constructor flags and parameters.
+.. c:macro:: NPY_ITER_NBO
+.. c:macro:: NPY_ITER_ALIGNED
+.. c:macro:: NPY_ITER_CONTIG
 
-        .. c:macro:: NPY_ITER_UPDATEIFCOPY
-
-            Triggers :c:data:`NPY_ITER_COPY`, and when an array operand
-            is flagged for writing and is copied, causes the data
-            in a copy to be copied back to ``op[i]`` when
-            ``NpyIter_Deallocate`` is called.
-
-            If the operand is flagged as write-only and a copy is needed,
-            an uninitialized temporary array will be created and then copied
-            to back to ``op[i]`` on calling ``NpyIter_Deallocate``, instead of
-            doing the unnecessary copy operation.
-
-        .. c:macro:: NPY_ITER_NBO
-        .. c:macro:: NPY_ITER_ALIGNED
-        .. c:macro:: NPY_ITER_CONTIG
-
-            Causes the iterator to provide data for ``op[i]``
-            that is in native byte order, aligned according to
-            the dtype requirements, contiguous, or any combination.
-
-            By default, the iterator produces pointers into the
-            arrays provided, which may be aligned or unaligned, and
-            with any byte order.  If copying or buffering is not
-            enabled and the operand data doesn't satisfy the constraints,
-            an error will be raised.
+    Causes the iterator to provide data for ``op[i]``
+    that is in native byte order, aligned according to
+    the dtype requirements, contiguous, or any combination.
 
-            The contiguous constraint applies only to the inner loop,
-            successive inner loops may have arbitrary pointer changes.
+    By default, the iterator produces pointers into the
+    arrays provided, which may be aligned or unaligned, and
+    with any byte order.  If copying or buffering is not
+    enabled and the operand data doesn't satisfy the constraints,
+    an error will be raised.
 
-            If the requested data type is in non-native byte order,
-            the NBO flag overrides it and the requested data type is
-            converted to be in native byte order.
+    The contiguous constraint applies only to the inner loop,
+    successive inner loops may have arbitrary pointer changes.
 
-        .. c:macro:: NPY_ITER_ALLOCATE
+    If the requested data type is in non-native byte order,
+    the NBO flag overrides it and the requested data type is
+    converted to be in native byte order.
 
-            This is for output arrays, and requires that the flag
-            :c:data:`NPY_ITER_WRITEONLY` or :c:data:`NPY_ITER_READWRITE`
-            be set.  If ``op[i]`` is NULL, creates a new array with
-            the final broadcast dimensions, and a layout matching
-            the iteration order of the iterator.
+.. c:macro:: NPY_ITER_ALLOCATE
 
-            When ``op[i]`` is NULL, the requested data type
-            ``op_dtypes[i]`` may be NULL as well, in which case it is
-            automatically generated from the dtypes of the arrays which
-            are flagged as readable.  The rules for generating the dtype
-            are the same is for UFuncs.  Of special note is handling
-            of byte order in the selected dtype.  If there is exactly
-            one input, the input's dtype is used as is.  Otherwise,
-            if more than one input dtypes are combined together, the
-            output will be in native byte order.
+    This is for output arrays, and requires that the flag
+    :c:data:`NPY_ITER_WRITEONLY` or :c:data:`NPY_ITER_READWRITE`
+    be set.  If ``op[i]`` is NULL, creates a new array with
+    the final broadcast dimensions, and a layout matching
+    the iteration order of the iterator.
+
+    When ``op[i]`` is NULL, the requested data type
+    ``op_dtypes[i]`` may be NULL as well, in which case it is
+    automatically generated from the dtypes of the arrays which
+    are flagged as readable.  The rules for generating the dtype
+    are the same is for UFuncs.  Of special note is handling
+    of byte order in the selected dtype.  If there is exactly
+    one input, the input's dtype is used as is.  Otherwise,
+    if more than one input dtypes are combined together, the
+    output will be in native byte order.
+
+    After being allocated with this flag, the caller may retrieve
+    the new array by calling :c:func:`NpyIter_GetOperandArray` and
+    getting the i-th object in the returned C array.  The caller
+    must call Py_INCREF on it to claim a reference to the array.
 
-            After being allocated with this flag, the caller may retrieve
-            the new array by calling :c:func:`NpyIter_GetOperandArray` and
-            getting the i-th object in the returned C array.  The caller
-            must call Py_INCREF on it to claim a reference to the array.
+.. c:macro:: NPY_ITER_NO_SUBTYPE
 
-        .. c:macro:: NPY_ITER_NO_SUBTYPE
+    For use with :c:data:`NPY_ITER_ALLOCATE`, this flag disables
+    allocating an array subtype for the output, forcing
+    it to be a straight ndarray.
 
-            For use with :c:data:`NPY_ITER_ALLOCATE`, this flag disables
-            allocating an array subtype for the output, forcing
-            it to be a straight ndarray.
+    TODO: Maybe it would be better to introduce a function
+    ``NpyIter_GetWrappedOutput`` and remove this flag?
 
-            TODO: Maybe it would be better to introduce a function
-            ``NpyIter_GetWrappedOutput`` and remove this flag?
+.. c:macro:: NPY_ITER_NO_BROADCAST
 
-        .. c:macro:: NPY_ITER_NO_BROADCAST
+    Ensures that the input or output matches the iteration
+    dimensions exactly.
 
-            Ensures that the input or output matches the iteration
-            dimensions exactly.
+.. c:macro:: NPY_ITER_ARRAYMASK
 
-        .. c:macro:: NPY_ITER_ARRAYMASK
+    .. versionadded:: 1.7
+
+    Indicates that this operand is the mask to use for
+    selecting elements when writing to operands which have
+    the :c:data:`NPY_ITER_WRITEMASKED` flag applied to them.
+    Only one operand may have :c:data:`NPY_ITER_ARRAYMASK` flag
+    applied to it.
 
-            .. versionadded:: 1.7
+    The data type of an operand with this flag should be either
+    :c:data:`NPY_BOOL`, :c:data:`NPY_MASK`, or a struct dtype
+    whose fields are all valid mask dtypes. In the latter case,
+    it must match up with a struct operand being WRITEMASKED,
+    as it is specifying a mask for each field of that array.
 
-            Indicates that this operand is the mask to use for
-            selecting elements when writing to operands which have
-            the :c:data:`NPY_ITER_WRITEMASKED` flag applied to them.
-            Only one operand may have :c:data:`NPY_ITER_ARRAYMASK` flag
-            applied to it.
+    This flag only affects writing from the buffer back to
+    the array. This means that if the operand is also
+    :c:data:`NPY_ITER_READWRITE` or :c:data:`NPY_ITER_WRITEONLY`,
+    code doing iteration can write to this operand to
+    control which elements will be untouched and which ones will be
+    modified. This is useful when the mask should be a combination
+    of input masks.
 
-            The data type of an operand with this flag should be either
-            :c:data:`NPY_BOOL`, :c:data:`NPY_MASK`, or a struct dtype
-            whose fields are all valid mask dtypes. In the latter case,
-            it must match up with a struct operand being WRITEMASKED,
-            as it is specifying a mask for each field of that array.
+.. c:macro:: NPY_ITER_WRITEMASKED
 
-            This flag only affects writing from the buffer back to
-            the array. This means that if the operand is also
-            :c:data:`NPY_ITER_READWRITE` or :c:data:`NPY_ITER_WRITEONLY`,
-            code doing iteration can write to this operand to
-            control which elements will be untouched and which ones will be
-            modified. This is useful when the mask should be a combination
-            of input masks.
+    .. versionadded:: 1.7
 
-        .. c:macro:: NPY_ITER_WRITEMASKED
+    This array is the mask for all `writemasked <numpy.nditer>`
+    operands. Code uses the ``writemasked`` flag which indicates 
+    that only elements where the chosen ARRAYMASK operand is True
+    will be written to. In general, the iterator does not enforce
+    this, it is up to the code doing the iteration to follow that
+    promise.
 
-            .. versionadded:: 1.7
+    When ``writemasked`` flag is used, and this operand is buffered,
+    this changes how data is copied from the buffer into the array.
+    A masked copying routine is used, which only copies the
+    elements in the buffer for which ``writemasked``
+    returns true from the corresponding element in the ARRAYMASK
+    operand.
 
-            This array is the mask for all `writemasked <numpy.nditer>`
-            operands. Code uses the ``writemasked`` flag which indicates 
-            that only elements where the chosen ARRAYMASK operand is True
-            will be written to. In general, the iterator does not enforce
-            this, it is up to the code doing the iteration to follow that
-            promise.
-
-            When ``writemasked`` flag is used, and this operand is buffered,
-            this changes how data is copied from the buffer into the array.
-            A masked copying routine is used, which only copies the
-            elements in the buffer for which ``writemasked``
-            returns true from the corresponding element in the ARRAYMASK
-            operand.
+.. c:macro:: NPY_ITER_OVERLAP_ASSUME_ELEMENTWISE
 
-        .. c:macro:: NPY_ITER_OVERLAP_ASSUME_ELEMENTWISE
+    In memory overlap checks, assume that operands with
+    ``NPY_ITER_OVERLAP_ASSUME_ELEMENTWISE`` enabled are accessed only
+    in the iterator order.
 
-            In memory overlap checks, assume that operands with
-            ``NPY_ITER_OVERLAP_ASSUME_ELEMENTWISE`` enabled are accessed only
-            in the iterator order.
+    This enables the iterator to reason about data dependency,
+    possibly avoiding unnecessary copies.
 
-            This enables the iterator to reason about data dependency,
-            possibly avoiding unnecessary copies.
-
-            This flag has effect only if ``NPY_ITER_COPY_IF_OVERLAP`` is enabled
-            on the iterator.
+    This flag has effect only if ``NPY_ITER_COPY_IF_OVERLAP`` is enabled
+    on the iterator.
 
 .. c:function:: NpyIter* NpyIter_AdvancedNew( \
         npy_intp nop, PyArrayObject** op, npy_uint32 flags, NPY_ORDER order, \
@@ -1226,7 +1230,7 @@ Functions For Iteration
 .. c:function:: npy_intp* NpyIter_GetIndexPtr(NpyIter* iter)
 
     This gives back a pointer to the index being tracked, or NULL
-    if no index is being tracked.  It is only useable if one of
+    if no index is being tracked.  It is only usable if one of
     the flags :c:data:`NPY_ITER_C_INDEX` or :c:data:`NPY_ITER_F_INDEX`
     were specified during construction.
 
index ab82fda8754cc364ecfaae225db4739939af182e..605a4ae718fb897e3bd5c9e36ad18590406d2b17 100644 (file)
@@ -94,7 +94,7 @@ PyArray_Type and PyArrayObject
           PyArray_Descr *descr;
           int flags;
           PyObject *weakreflist;
-          /* version dependend private members */
+          /* version dependent private members */
       } PyArrayObject;
 
    .. c:macro:: PyObject_HEAD
@@ -178,7 +178,7 @@ PyArray_Type and PyArrayObject
 
    .. note::
 
-      Further members are considered private and version dependend. If the size
+      Further members are considered private and version dependent. If the size
       of the struct is important for your code, special care must be taken.
       A possible use-case when this is relevant is subclassing in C.
       If your code relies on ``sizeof(PyArrayObject)`` to be constant,
@@ -225,7 +225,7 @@ PyArrayDescr_Type and PyArray_Descr
    compatibility:
 
    - Never declare a non-pointer instance of the struct
-   - Never perform pointer arithmatic
+   - Never perform pointer arithmetic
    - Never use ``sizof(PyArray_Descr)``
 
    It has the following structure:
@@ -286,48 +286,54 @@ PyArrayDescr_Type and PyArray_Descr
        array like behavior. Each bit in this member is a flag which are named
        as:
 
-       .. c:macro:: NPY_ITEM_REFCOUNT
+..
+  dedented to allow internal linking, pending a refactoring
+
+.. c:macro:: NPY_ITEM_REFCOUNT
 
-           Indicates that items of this data-type must be reference
-           counted (using :c:func:`Py_INCREF` and :c:func:`Py_DECREF` ).
+    Indicates that items of this data-type must be reference
+    counted (using :c:func:`Py_INCREF` and :c:func:`Py_DECREF` ).
 
        .. c:macro:: NPY_ITEM_HASOBJECT
 
            Same as :c:data:`NPY_ITEM_REFCOUNT`.
 
-       .. c:macro:: NPY_LIST_PICKLE
+..
+  dedented to allow internal linking, pending a refactoring
 
-           Indicates arrays of this data-type must be converted to a list
-           before pickling.
+.. c:macro:: NPY_LIST_PICKLE
 
-       .. c:macro:: NPY_ITEM_IS_POINTER
+    Indicates arrays of this data-type must be converted to a list
+    before pickling.
 
-           Indicates the item is a pointer to some other data-type
+.. c:macro:: NPY_ITEM_IS_POINTER
 
-       .. c:macro:: NPY_NEEDS_INIT
+    Indicates the item is a pointer to some other data-type
 
-           Indicates memory for this data-type must be initialized (set
-           to 0) on creation.
+.. c:macro:: NPY_NEEDS_INIT
 
-       .. c:macro:: NPY_NEEDS_PYAPI
+    Indicates memory for this data-type must be initialized (set
+    to 0) on creation.
 
-           Indicates this data-type requires the Python C-API during
-           access (so don't give up the GIL if array access is going to
-           be needed).
+.. c:macro:: NPY_NEEDS_PYAPI
 
-       .. c:macro:: NPY_USE_GETITEM
+    Indicates this data-type requires the Python C-API during
+    access (so don't give up the GIL if array access is going to
+    be needed).
 
-           On array access use the ``f->getitem`` function pointer
-           instead of the standard conversion to an array scalar. Must
-           use if you don't define an array scalar to go along with
-           the data-type.
+.. c:macro:: NPY_USE_GETITEM
 
-       .. c:macro:: NPY_USE_SETITEM
+    On array access use the ``f->getitem`` function pointer
+    instead of the standard conversion to an array scalar. Must
+    use if you don't define an array scalar to go along with
+    the data-type.
 
-           When creating a 0-d array from an array scalar use
-           ``f->setitem`` instead of the standard copy from an array
-           scalar. Must use if you don't define an array scalar to go
-           along with the data-type.
+.. c:macro:: NPY_USE_SETITEM
+
+    When creating a 0-d array from an array scalar use
+    ``f->setitem`` instead of the standard copy from an array
+    scalar. Must use if you don't define an array scalar to go
+    along with the data-type.
 
        .. c:macro:: NPY_FROM_FIELDS
 
@@ -811,13 +817,14 @@ PyUFunc_Type and PyUFuncObject
           char *core_signature;
           PyUFunc_TypeResolutionFunc *type_resolver;
           PyUFunc_LegacyInnerLoopSelectionFunc *legacy_inner_loop_selector;
-          PyUFunc_MaskedInnerLoopSelectionFunc *masked_inner_loop_selector;
+          void *reserved2;
           npy_uint32 *op_flags;
           npy_uint32 *iter_flags;
           /* new in API version 0x0000000D */
           npy_intp *core_dim_sizes;
           npy_uint32 *core_dim_flags;
           PyObject *identity_value;
+          /* Further private slots (size depends on the NumPy version) */
       } PyUFuncObject;
 
    .. c:macro: PyObject_HEAD
@@ -957,18 +964,17 @@ PyUFunc_Type and PyUFuncObject
 
    .. c:member:: PyUFunc_LegacyInnerLoopSelectionFunc *legacy_inner_loop_selector
 
-       A function which returns an inner loop. The ``legacy`` in the name arises
-       because for NumPy 1.6 a better variant had been planned. This variant
-       has not yet come about.
+       .. deprecated:: 1.22
+
+            Some fallback support for this slot exists, but will be removed
+            eventually.  A universal function that relied on this will
+            have to be ported eventually.
+            See ref:`NEP 41 <NEP41>` and ref:`NEP 43 <NEP43>`
 
    .. c:member:: void *reserved2
 
        For a possible future loop selector with a different signature.
 
-   .. c:member:: PyUFunc_MaskedInnerLoopSelectionFunc *masked_inner_loop_selector
-
-       Function which returns a masked inner loop for the ufunc
-
    .. c:member:: npy_uint32 op_flags
 
        Override the default operand flags for each ufunc operand.
@@ -989,14 +995,17 @@ PyUFunc_Type and PyUFuncObject
 
        For each distinct core dimension, a set of ``UFUNC_CORE_DIM*`` flags
 
-       .. c:macro:: UFUNC_CORE_DIM_CAN_IGNORE
+..
+  dedented to allow internal linking, pending a refactoring
+
+.. c:macro:: UFUNC_CORE_DIM_CAN_IGNORE
 
-           if the dim name ends in ``?``
+    if the dim name ends in ``?``
 
-       .. c:macro:: UFUNC_CORE_DIM_SIZE_INFERRED
+.. c:macro:: UFUNC_CORE_DIM_SIZE_INFERRED
 
-           if the dim size will be determined from the operands
-           and not from a :ref:`frozen <frozen>` signature
+    if the dim size will be determined from the operands
+    and not from a :ref:`frozen <frozen>` signature
 
    .. c:member:: PyObject *identity_value
 
index f184812354d3bad27203d79731ddbea3c3f677e5..20874ceaae4954e664c96f8ac073cb68746ad667 100644 (file)
@@ -84,3 +84,13 @@ contiguous in memory.
 Most users will have no reason to change these; for details
 see the :ref:`memory layout <memory-layout>` documentation.
 
+
+Warn if no memory allocation policy when deallocating data
+----------------------------------------------------------
+
+Some users might pass ownership of the data pointer to the ``ndarray`` by
+setting the ``OWNDATA`` flag. If they do this without setting (manually) a
+memory allocation policy, the default will be to call ``free``. If
+``NUMPY_WARN_IF_NO_MEM_POLICY`` is set to ``"1"``, a ``RuntimeWarning`` will
+be emitted. A better alternative is to use a ``PyCapsule`` with a deallocator
+and set the ``ndarray.base``.
index f12d923dfdb468a334dbb4c7b0992c4f1a23592f..a18211cca782b8b6709a10045f55dc63f9997564 100644 (file)
@@ -26,7 +26,6 @@ For learning how to use NumPy, see the :ref:`complete documentation <numpy_docs_
    distutils
    distutils_guide
    c-api/index
-   internals
    simd/simd-optimizations
    swig
 
index e8e428f2ec6b2f8491a75a4dc8294d78da16e20e..d34314610f227d6d78bb59a35e4eab13af6c9bf3 100644 (file)
@@ -1,618 +1,9 @@
-.. currentmodule:: numpy
+:orphan:
 
 *************************
 NumPy C Code Explanations
 *************************
 
-    Fanaticism consists of redoubling your efforts when you have forgotten
-    your aim.
-    --- *George Santayana*
+.. This document has been moved to ../dev/internals.code-explanations.rst.
 
-    An authority is a person who can tell you more about something than
-    you really care to know.
-    --- *Unknown*
-
-This Chapter attempts to explain the logic behind some of the new
-pieces of code. The purpose behind these explanations is to enable
-somebody to be able to understand the ideas behind the implementation
-somewhat more easily than just staring at the code. Perhaps in this
-way, the algorithms can be improved on, borrowed from, and/or
-optimized by more people.
-
-
-Memory model
-============
-
-.. index::
-   pair: ndarray; memory model
-
-One fundamental aspect of the ndarray is that an array is seen as a
-"chunk" of memory starting at some location. The interpretation of
-this memory depends on the stride information. For each dimension in
-an :math:`N` -dimensional array, an integer (stride) dictates how many
-bytes must be skipped to get to the next element in that dimension.
-Unless you have a single-segment array, this stride information must
-be consulted when traversing through an array. It is not difficult to
-write code that accepts strides, you just have to use (char \*)
-pointers because strides are in units of bytes. Keep in mind also that
-strides do not have to be unit-multiples of the element size. Also,
-remember that if the number of dimensions of the array is 0 (sometimes
-called a rank-0 array), then the strides and dimensions variables are
-NULL.
-
-Besides the structural information contained in the strides and
-dimensions members of the :c:type:`PyArrayObject`, the flags contain
-important information about how the data may be accessed. In particular,
-the :c:data:`NPY_ARRAY_ALIGNED` flag is set when the memory is on a
-suitable boundary according to the data-type array. Even if you have
-a contiguous chunk of memory, you cannot just assume it is safe to
-dereference a data- type-specific pointer to an element. Only if the
-:c:data:`NPY_ARRAY_ALIGNED` flag is set is this a safe operation (on
-some platforms it will work but on others, like Solaris, it will cause
-a bus error). The :c:data:`NPY_ARRAY_WRITEABLE` should also be ensured
-if you plan on writing to the memory area of the array. It is also
-possible to obtain a pointer to an unwritable memory area. Sometimes,
-writing to the memory area when the :c:data:`NPY_ARRAY_WRITEABLE` flag is not
-set will just be rude. Other times it can cause program crashes ( *e.g.*
-a data-area that is a read-only memory-mapped file).
-
-
-Data-type encapsulation
-=======================
-
-.. index::
-   single: dtype
-
-The data-type is an important abstraction of the ndarray. Operations
-will look to the data-type to provide the key functionality that is
-needed to operate on the array. This functionality is provided in the
-list of function pointers pointed to by the 'f' member of the
-:c:type:`PyArray_Descr` structure. In this way, the number of data-types can be
-extended simply by providing a :c:type:`PyArray_Descr` structure with suitable
-function pointers in the 'f' member. For built-in types there are some
-optimizations that by-pass this mechanism, but the point of the data-
-type abstraction is to allow new data-types to be added.
-
-One of the built-in data-types, the void data-type allows for
-arbitrary structured types containing 1 or more fields as elements of the
-array. A field is simply another data-type object along with an offset
-into the current structured type. In order to support arbitrarily nested
-fields, several recursive implementations of data-type access are
-implemented for the void type. A common idiom is to cycle through the
-elements of the dictionary and perform a specific operation based on
-the data-type object stored at the given offset. These offsets can be
-arbitrary numbers. Therefore, the possibility of encountering mis-
-aligned data must be recognized and taken into account if necessary.
-
-
-N-D Iterators
-=============
-
-.. index::
-   single: array iterator
-
-A very common operation in much of NumPy code is the need to iterate
-over all the elements of a general, strided, N-dimensional array. This
-operation of a general-purpose N-dimensional loop is abstracted in the
-notion of an iterator object. To write an N-dimensional loop, you only
-have to create an iterator object from an ndarray, work with the
-dataptr member of the iterator object structure and call the macro
-:c:func:`PyArray_ITER_NEXT` (it) on the iterator object to move to the next
-element. The "next" element is always in C-contiguous order. The macro
-works by first special casing the C-contiguous, 1-D, and 2-D cases
-which work very simply.
-
-For the general case, the iteration works by keeping track of a list
-of coordinate counters in the iterator object. At each iteration, the
-last coordinate counter is increased (starting from 0). If this
-counter is smaller than one less than the size of the array in that
-dimension (a pre-computed and stored value), then the counter is
-increased and the dataptr member is increased by the strides in that
-dimension and the macro ends. If the end of a dimension is reached,
-the counter for the last dimension is reset to zero and the dataptr is
-moved back to the beginning of that dimension by subtracting the
-strides value times one less than the number of elements in that
-dimension (this is also pre-computed and stored in the backstrides
-member of the iterator object). In this case, the macro does not end,
-but a local dimension counter is decremented so that the next-to-last
-dimension replaces the role that the last dimension played and the
-previously-described tests are executed again on the next-to-last
-dimension. In this way, the dataptr is adjusted appropriately for
-arbitrary striding.
-
-The coordinates member of the :c:type:`PyArrayIterObject` structure maintains
-the current N-d counter unless the underlying array is C-contiguous in
-which case the coordinate counting is by-passed. The index member of
-the :c:type:`PyArrayIterObject` keeps track of the current flat index of the
-iterator. It is updated by the :c:func:`PyArray_ITER_NEXT` macro.
-
-
-Broadcasting
-============
-
-.. index::
-   single: broadcasting
-
-In Numeric, the ancestor of Numpy, broadcasting was implemented in several
-lines of code buried deep in ufuncobject.c. In NumPy, the notion of broadcasting
-has been abstracted so that it can be performed in multiple places.
-Broadcasting is handled by the function :c:func:`PyArray_Broadcast`. This
-function requires a :c:type:`PyArrayMultiIterObject` (or something that is a
-binary equivalent) to be passed in. The :c:type:`PyArrayMultiIterObject` keeps
-track of the broadcast number of dimensions and size in each
-dimension along with the total size of the broadcast result. It also
-keeps track of the number of arrays being broadcast and a pointer to
-an iterator for each of the arrays being broadcast.
-
-The :c:func:`PyArray_Broadcast` function takes the iterators that have already
-been defined and uses them to determine the broadcast shape in each
-dimension (to create the iterators at the same time that broadcasting
-occurs then use the :c:func:`PyArray_MultiIterNew` function).
-Then, the iterators are
-adjusted so that each iterator thinks it is iterating over an array
-with the broadcast size. This is done by adjusting the iterators
-number of dimensions, and the shape in each dimension. This works
-because the iterator strides are also adjusted. Broadcasting only
-adjusts (or adds) length-1 dimensions. For these dimensions, the
-strides variable is simply set to 0 so that the data-pointer for the
-iterator over that array doesn't move as the broadcasting operation
-operates over the extended dimension.
-
-Broadcasting was always implemented in Numeric using 0-valued strides
-for the extended dimensions. It is done in exactly the same way in
-NumPy. The big difference is that now the array of strides is kept
-track of in a :c:type:`PyArrayIterObject`, the iterators involved in a
-broadcast result are kept track of in a :c:type:`PyArrayMultiIterObject`,
-and the :c:func:`PyArray_Broadcast` call implements the broad-casting rules.
-
-
-Array Scalars
-=============
-
-.. index::
-   single: array scalars
-
-The array scalars offer a hierarchy of Python types that allow a one-
-to-one correspondence between the data-type stored in an array and the
-Python-type that is returned when an element is extracted from the
-array. An exception to this rule was made with object arrays. Object
-arrays are heterogeneous collections of arbitrary Python objects. When
-you select an item from an object array, you get back the original
-Python object (and not an object array scalar which does exist but is
-rarely used for practical purposes).
-
-The array scalars also offer the same methods and attributes as arrays
-with the intent that the same code can be used to support arbitrary
-dimensions (including 0-dimensions). The array scalars are read-only
-(immutable) with the exception of the void scalar which can also be
-written to so that structured array field setting works more naturally
-(a[0]['f1'] = ``value`` ).
-
-
-Indexing
-========
-
-.. index::
-   single: indexing
-
-All python indexing operations ``arr[index]`` are organized by first preparing
-the index and finding the index type. The supported index types are:
-
-* integer
-* newaxis
-* slice
-* ellipsis
-* integer arrays/array-likes (fancy)
-* boolean (single boolean array); if there is more than one boolean array as
-  index or the shape does not match exactly, the boolean array will be
-  converted to an integer array instead.
-* 0-d boolean (and also integer); 0-d boolean arrays are a special
-  case which has to be handled in the advanced indexing code. They signal
-  that a 0-d boolean array had to be interpreted as an integer array.
-
-As well as the scalar array special case signaling that an integer array
-was interpreted as an integer index, which is important because an integer
-array index forces a copy but is ignored if a scalar is returned (full integer
-index). The prepared index is guaranteed to be valid with the exception of
-out of bound values and broadcasting errors for advanced indexing. This
-includes that an ellipsis is added for incomplete indices for example when
-a two dimensional array is indexed with a single integer.
-
-The next step depends on the type of index which was found. If all
-dimensions are indexed with an integer a scalar is returned or set. A
-single boolean indexing array will call specialized boolean functions.
-Indices containing an ellipsis or slice but no advanced indexing will
-always create a view into the old array by calculating the new strides and
-memory offset.  This view can then either be returned or, for assignments,
-filled using :c:func:`PyArray_CopyObject`. Note that `PyArray_CopyObject`
-may also be called on temporary arrays in other branches to support
-complicated assignments when the array is of object dtype.
-
-Advanced indexing
------------------
-
-By far the most complex case is advanced indexing, which may or may not be
-combined with typical view based indexing. Here integer indices are
-interpreted as view based. Before trying to understand this, you may want
-to make yourself familiar with its subtleties. The advanced indexing code
-has three different branches and one special case:
-
-* There is one indexing array and it, as well as the assignment array, can
-  be iterated trivially. For example they may be contiguous. Also the
-  indexing array must be of `intp` type and the value array in assignments
-  should be of the correct type. This is purely a fast path.
-* There are only integer array indices so that no subarray exists.
-* View based and advanced indexing is mixed. In this case the view based
-  indexing defines a collection of subarrays that are combined by the
-  advanced indexing. For example, ``arr[[1, 2, 3], :]`` is created by
-  vertically stacking the subarrays ``arr[1, :]``, ``arr[2,:]``, and
-  ``arr[3, :]``.
-* There is a subarray but it has exactly one element. This case can be handled
-  as if there is no subarray, but needs some care during setup.
-
-Deciding what case applies, checking broadcasting, and determining the kind
-of transposition needed are all done in `PyArray_MapIterNew`. After setting
-up, there are two cases. If there is no subarray or it only has one
-element, no subarray iteration is necessary and an iterator is prepared
-which iterates all indexing arrays *as well as* the result or value array.
-If there is a subarray, there are three iterators prepared. One for the
-indexing arrays, one for the result or value array (minus its subarray),
-and one for the subarrays of the original and the result/assignment array.
-The first two iterators give (or allow calculation) of the pointers into
-the start of the subarray, which then allows to restart the subarray
-iteration.
-
-When advanced indices are next to each other transposing may be necessary.
-All necessary transposing is handled by :c:func:`PyArray_MapIterSwapAxes` and
-has to be handled by the caller unless `PyArray_MapIterNew` is asked to
-allocate the result.
-
-After preparation, getting and setting is relatively straight forward,
-although the different modes of iteration need to be considered. Unless
-there is only a single indexing array during item getting, the validity of
-the indices is checked beforehand. Otherwise it is handled in the inner
-loop itself for optimization.
-
-
-Universal Functions
-===================
-
-.. index::
-   single: ufunc
-
-Universal functions are callable objects that take :math:`N` inputs
-and produce :math:`M` outputs by wrapping basic 1-D loops that work
-element-by-element into full easy-to use functions that seamlessly
-implement broadcasting, type-checking and buffered coercion, and
-output-argument handling. New universal functions are normally created
-in C, although there is a mechanism for creating ufuncs from Python
-functions (:func:`frompyfunc`). The user must supply a 1-D loop that
-implements the basic function taking the input scalar values and
-placing the resulting scalars into the appropriate output slots as
-explained in implementation.
-
-
-Setup
------
-
-Every ufunc calculation involves some overhead related to setting up
-the calculation. The practical significance of this overhead is that
-even though the actual calculation of the ufunc is very fast, you will
-be able to write array and type-specific code that will work faster
-for small arrays than the ufunc. In particular, using ufuncs to
-perform many calculations on 0-D arrays will be slower than other
-Python-based solutions (the silently-imported scalarmath module exists
-precisely to give array scalars the look-and-feel of ufunc based
-calculations with significantly reduced overhead).
-
-When a ufunc is called, many things must be done. The information
-collected from these setup operations is stored in a loop-object. This
-loop object is a C-structure (that could become a Python object but is
-not initialized as such because it is only used internally). This loop
-object has the layout needed to be used with PyArray_Broadcast so that
-the broadcasting can be handled in the same way as it is handled in
-other sections of code.
-
-The first thing done is to look-up in the thread-specific global
-dictionary the current values for the buffer-size, the error mask, and
-the associated error object. The state of the error mask controls what
-happens when an error condition is found. It should be noted that
-checking of the hardware error flags is only performed after each 1-D
-loop is executed. This means that if the input and output arrays are
-contiguous and of the correct type so that a single 1-D loop is
-performed, then the flags may not be checked until all elements of the
-array have been calculated. Looking up these values in a thread-
-specific dictionary takes time which is easily ignored for all but
-very small arrays.
-
-After checking, the thread-specific global variables, the inputs are
-evaluated to determine how the ufunc should proceed and the input and
-output arrays are constructed if necessary. Any inputs which are not
-arrays are converted to arrays (using context if necessary). Which of
-the inputs are scalars (and therefore converted to 0-D arrays) is
-noted.
-
-Next, an appropriate 1-D loop is selected from the 1-D loops available
-to the ufunc based on the input array types. This 1-D loop is selected
-by trying to match the signature of the data-types of the inputs
-against the available signatures. The signatures corresponding to
-built-in types are stored in the types member of the ufunc structure.
-The signatures corresponding to user-defined types are stored in a
-linked-list of function-information with the head element stored as a
-``CObject`` in the userloops dictionary keyed by the data-type number
-(the first user-defined type in the argument list is used as the key).
-The signatures are searched until a signature is found to which the
-input arrays can all be cast safely (ignoring any scalar arguments
-which are not allowed to determine the type of the result). The
-implication of this search procedure is that "lesser types" should be
-placed below "larger types" when the signatures are stored. If no 1-D
-loop is found, then an error is reported. Otherwise, the argument_list
-is updated with the stored signature --- in case casting is necessary
-and to fix the output types assumed by the 1-D loop.
-
-If the ufunc has 2 inputs and 1 output and the second input is an
-Object array then a special-case check is performed so that
-NotImplemented is returned if the second input is not an ndarray, has
-the __array_priority\__ attribute, and has an __r{op}\__ special
-method. In this way, Python is signaled to give the other object a
-chance to complete the operation instead of using generic object-array
-calculations. This allows (for example) sparse matrices to override
-the multiplication operator 1-D loop.
-
-For input arrays that are smaller than the specified buffer size,
-copies are made of all non-contiguous, mis-aligned, or out-of-
-byteorder arrays to ensure that for small arrays, a single loop is
-used. Then, array iterators are created for all the input arrays and
-the resulting collection of iterators is broadcast to a single shape.
-
-The output arguments (if any) are then processed and any missing
-return arrays are constructed. If any provided output array doesn't
-have the correct type (or is mis-aligned) and is smaller than the
-buffer size, then a new output array is constructed with the special
-:c:data:`NPY_ARRAY_WRITEBACKIFCOPY` flag set. At the end of the function,
-:c:func:`PyArray_ResolveWritebackIfCopy` is called so that 
-its contents will be copied back into the output array.
-Iterators for the output arguments are then processed.
-
-Finally, the decision is made about how to execute the looping
-mechanism to ensure that all elements of the input arrays are combined
-to produce the output arrays of the correct type. The options for loop
-execution are one-loop (for contiguous, aligned, and correct data
-type), strided-loop (for non-contiguous but still aligned and correct
-data type), and a buffered loop (for mis-aligned or incorrect data
-type situations). Depending on which execution method is called for,
-the loop is then setup and computed.
-
-
-Function call
--------------
-
-This section describes how the basic universal function computation loop is
-setup and executed for each of the three different kinds of execution. If
-:c:data:`NPY_ALLOW_THREADS` is defined during compilation, then as long as
-no object arrays are involved, the Python Global Interpreter Lock (GIL) is
-released prior to calling the loops.  It is re-acquired if necessary to
-handle error conditions. The hardware error flags are checked only after
-the 1-D loop is completed.
-
-
-One Loop
-^^^^^^^^
-
-This is the simplest case of all. The ufunc is executed by calling the
-underlying 1-D loop exactly once. This is possible only when we have
-aligned data of the correct type (including byte-order) for both input
-and output and all arrays have uniform strides (either contiguous,
-0-D, or 1-D). In this case, the 1-D computational loop is called once
-to compute the calculation for the entire array. Note that the
-hardware error flags are only checked after the entire calculation is
-complete.
-
-
-Strided Loop
-^^^^^^^^^^^^
-
-When the input and output arrays are aligned and of the correct type,
-but the striding is not uniform (non-contiguous and 2-D or larger),
-then a second looping structure is employed for the calculation. This
-approach converts all of the iterators for the input and output
-arguments to iterate over all but the largest dimension. The inner
-loop is then handled by the underlying 1-D computational loop. The
-outer loop is a standard iterator loop on the converted iterators. The
-hardware error flags are checked after each 1-D loop is completed.
-
-
-Buffered Loop
-^^^^^^^^^^^^^
-
-This is the code that handles the situation whenever the input and/or
-output arrays are either misaligned or of the wrong data-type
-(including being byte-swapped) from what the underlying 1-D loop
-expects. The arrays are also assumed to be non-contiguous. The code
-works very much like the strided-loop except for the inner 1-D loop is
-modified so that pre-processing is performed on the inputs and post-
-processing is performed on the outputs in bufsize chunks (where
-bufsize is a user-settable parameter). The underlying 1-D
-computational loop is called on data that is copied over (if it needs
-to be). The setup code and the loop code is considerably more
-complicated in this case because it has to handle:
-
-- memory allocation of the temporary buffers
-
-- deciding whether or not to use buffers on the input and output data
-  (mis-aligned and/or wrong data-type)
-
-- copying and possibly casting data for any inputs or outputs for which
-  buffers are necessary.
-
-- special-casing Object arrays so that reference counts are properly
-  handled when copies and/or casts are necessary.
-
-- breaking up the inner 1-D loop into bufsize chunks (with a possible
-  remainder).
-
-Again, the hardware error flags are checked at the end of each 1-D
-loop.
-
-
-Final output manipulation
--------------------------
-
-Ufuncs allow other array-like classes to be passed seamlessly through
-the interface in that inputs of a particular class will induce the
-outputs to be of that same class. The mechanism by which this works is
-the following. If any of the inputs are not ndarrays and define the
-:obj:`~numpy.class.__array_wrap__` method, then the class with the largest
-:obj:`~numpy.class.__array_priority__` attribute determines the type of all the
-outputs (with the exception of any output arrays passed in). The
-:obj:`~numpy.class.__array_wrap__` method of the input array will be called with the
-ndarray being returned from the ufunc as it's input. There are two
-calling styles of the :obj:`~numpy.class.__array_wrap__` function supported. The first
-takes the ndarray as the first argument and a tuple of "context" as
-the second argument. The context is (ufunc, arguments, output argument
-number). This is the first call tried. If a TypeError occurs, then the
-function is called with just the ndarray as the first argument.
-
-
-Methods
--------
-
-There are three methods of ufuncs that require calculation similar to
-the general-purpose ufuncs. These are reduce, accumulate, and
-reduceat. Each of these methods requires a setup command followed by a
-loop. There are four loop styles possible for the methods
-corresponding to no-elements, one-element, strided-loop, and buffered-
-loop. These are the same basic loop styles as implemented for the
-general purpose function call except for the no-element and one-
-element cases which are special-cases occurring when the input array
-objects have 0 and 1 elements respectively.
-
-
-Setup
-^^^^^
-
-The setup function for all three methods is ``construct_reduce``.
-This function creates a reducing loop object and fills it with
-parameters needed to complete the loop. All of the methods only work
-on ufuncs that take 2-inputs and return 1 output. Therefore, the
-underlying 1-D loop is selected assuming a signature of [ ``otype``,
-``otype``, ``otype`` ] where ``otype`` is the requested reduction
-data-type. The buffer size and error handling is then retrieved from
-(per-thread) global storage. For small arrays that are mis-aligned or
-have incorrect data-type, a copy is made so that the un-buffered
-section of code is used. Then, the looping strategy is selected. If
-there is 1 element or 0 elements in the array, then a simple looping
-method is selected. If the array is not mis-aligned and has the
-correct data-type, then strided looping is selected. Otherwise,
-buffered looping must be performed. Looping parameters are then
-established, and the return array is constructed.  The output array is
-of a different shape depending on whether the method is reduce,
-accumulate, or reduceat. If an output array is already provided, then
-it's shape is checked. If the output array is not C-contiguous,
-aligned, and of the correct data type, then a temporary copy is made
-with the WRITEBACKIFCOPY flag set. In this way, the methods will be able
-to work with a well-behaved output array but the result will be copied
-back into the true output array when :c:func:`PyArray_ResolveWritebackIfCopy`
-is called at function completion.
-Finally, iterators are set up to loop over the correct axis
-(depending on the value of axis provided to the method) and the setup
-routine returns to the actual computation routine.
-
-
-Reduce
-^^^^^^
-
-.. index::
-   triple: ufunc; methods; reduce
-
-All of the ufunc methods use the same underlying 1-D computational
-loops with input and output arguments adjusted so that the appropriate
-reduction takes place. For example, the key to the functioning of
-reduce is that the 1-D loop is called with the output and the second
-input pointing to the same position in memory and both having a step-
-size of 0. The first input is pointing to the input array with a step-
-size given by the appropriate stride for the selected axis. In this
-way, the operation performed is
-
-.. math::
-   :nowrap:
-
-   \begin{align*}
-   o & = & i[0] \\
-   o & = & i[k]\textrm{<op>}o\quad k=1\ldots N
-   \end{align*}
-
-where :math:`N+1` is the number of elements in the input, :math:`i`,
-:math:`o` is the output, and :math:`i[k]` is the
-:math:`k^{\textrm{th}}` element of :math:`i` along the selected axis.
-This basic operations is repeated for arrays with greater than 1
-dimension so that the reduction takes place for every 1-D sub-array
-along the selected axis. An iterator with the selected dimension
-removed handles this looping.
-
-For buffered loops, care must be taken to copy and cast data before
-the loop function is called because the underlying loop expects
-aligned data of the correct data-type (including byte-order). The
-buffered loop must handle this copying and casting prior to calling
-the loop function on chunks no greater than the user-specified
-bufsize.
-
-
-Accumulate
-^^^^^^^^^^
-
-.. index::
-   triple: ufunc; methods; accumulate
-
-The accumulate function is very similar to the reduce function in that
-the output and the second input both point to the output. The
-difference is that the second input points to memory one stride behind
-the current output pointer. Thus, the operation performed is
-
-.. math::
-   :nowrap:
-
-   \begin{align*}
-   o[0] & = & i[0] \\
-   o[k] & = & i[k]\textrm{<op>}o[k-1]\quad k=1\ldots N.
-   \end{align*}
-
-The output has the same shape as the input and each 1-D loop operates
-over :math:`N` elements when the shape in the selected axis is :math:`N+1`.
-Again, buffered loops take care to copy and cast the data before
-calling the underlying 1-D computational loop.
-
-
-Reduceat
-^^^^^^^^
-
-.. index::
-   triple: ufunc; methods; reduceat
-   single: ufunc
-
-The reduceat function is a generalization of both the reduce and
-accumulate functions. It implements a reduce over ranges of the input
-array specified by indices. The extra indices argument is checked to
-be sure that every input is not too large for the input array along
-the selected dimension before the loop calculations take place. The
-loop implementation is handled using code that is very similar to the
-reduce code repeated as many times as there are elements in the
-indices input. In particular: the first input pointer passed to the
-underlying 1-D computational loop points to the input array at the
-correct location indicated by the index array. In addition, the output
-pointer and the second input pointer passed to the underlying 1-D loop
-point to the same position in memory. The size of the 1-D
-computational loop is fixed to be the difference between the current
-index and the next index (when the current index is the last index,
-then the next index is assumed to be the length of the array along the
-selected dimension). In this way, the 1-D loop will implement a reduce
-over the specified indices.
-
-Mis-aligned or a loop data-type that does not match the input and/or
-output data-type is handled using buffered code where-in data is
-copied to a temporary buffer and cast to the correct data-type if
-necessary prior to calling the underlying 1-D function. The temporary
-buffers are created in (element) sizes no bigger than the user
-settable buffer-size value. Thus, the loop must be flexible enough to
-call the underlying 1-D computational loop enough times to complete
-the total calculation in chunks no bigger than the buffer-size.
+This document has been moved to :ref:`c-code-explanations`.
\ No newline at end of file
index ed8042c08b73ec9fb496db15e20e84bed14f2828..7a5e6374c29ba9925db5c19369dd7101a69f318c 100644 (file)
-.. _numpy-internals:
+:orphan:
 
 ***************
 NumPy internals
 ***************
 
-.. toctree::
-
-   internals.code-explanations
-   alignment
-
-Internal organization of numpy arrays
-=====================================
-
-It helps to understand a bit about how numpy arrays are handled under the covers to help understand numpy better. This section will not go into great detail. Those wishing to understand the full details are referred to Travis Oliphant's book "Guide to NumPy".
-
-NumPy arrays consist of two major components, the raw array data (from now on,
-referred to as the data buffer), and the information about the raw array data.
-The data buffer is typically what people think of as arrays in C or Fortran,
-a contiguous (and fixed) block of memory containing fixed sized data items.
-NumPy also contains a significant set of data that describes how to interpret
-the data in the data buffer. This extra information contains (among other things):
-
- 1) The basic data element's size in bytes
- 2) The start of the data within the data buffer (an offset relative to the
-    beginning of the data buffer).
- 3) The number of dimensions and the size of each dimension
- 4) The separation between elements for each dimension (the 'stride'). This
-    does not have to be a multiple of the element size
- 5) The byte order of the data (which may not be the native byte order)
- 6) Whether the buffer is read-only
- 7) Information (via the dtype object) about the interpretation of the basic
-    data element. The basic data element may be as simple as a int or a float,
-    or it may be a compound object (e.g., struct-like), a fixed character field,
-    or Python object pointers.
- 8) Whether the array is to interpreted as C-order or Fortran-order.
-
-This arrangement allow for very flexible use of arrays. One thing that it allows
-is simple changes of the metadata to change the interpretation of the array buffer.
-Changing the byteorder of the array is a simple change involving no rearrangement
-of the data. The shape of the array can be changed very easily without changing
-anything in the data buffer or any data copying at all
-
-Among other things that are made possible is one can create a new array metadata
-object that uses the same data buffer
-to create a new view of that data buffer that has a different interpretation
-of the buffer (e.g., different shape, offset, byte order, strides, etc) but
-shares the same data bytes. Many operations in numpy do just this such as
-slices. Other operations, such as transpose, don't move data elements
-around in the array, but rather change the information about the shape and strides so that the indexing of the array changes, but the data in the doesn't move.
-
-Typically these new versions of the array metadata but the same data buffer are
-new 'views' into the data buffer. There is a different ndarray object, but it
-uses the same data buffer. This is why it is necessary to force copies through
-use of the .copy() method if one really wants to make a new and independent
-copy of the data buffer.
-
-New views into arrays mean the object reference counts for the data buffer
-increase. Simply doing away with the original array object will not remove the
-data buffer if other views of it still exist.
-
-Multidimensional Array Indexing Order Issues
-============================================
-
-What is the right way to index
-multi-dimensional arrays? Before you jump to conclusions about the one and
-true way to index multi-dimensional arrays, it pays to understand why this is
-a confusing issue. This section will try to explain in detail how numpy
-indexing works and why we adopt the convention we do for images, and when it
-may be appropriate to adopt other conventions.
-
-The first thing to understand is
-that there are two conflicting conventions for indexing 2-dimensional arrays.
-Matrix notation uses the first index to indicate which row is being selected and
-the second index to indicate which column is selected. This is opposite the
-geometrically oriented-convention for images where people generally think the
-first index represents x position (i.e., column) and the second represents y
-position (i.e., row). This alone is the source of much confusion;
-matrix-oriented users and image-oriented users expect two different things with
-regard to indexing.
-
-The second issue to understand is how indices correspond
-to the order the array is stored in memory. In Fortran the first index is the
-most rapidly varying index when moving through the elements of a two
-dimensional array as it is stored in memory. If you adopt the matrix
-convention for indexing, then this means the matrix is stored one column at a
-time (since the first index moves to the next row as it changes). Thus Fortran
-is considered a Column-major language. C has just the opposite convention. In
-C, the last index changes most rapidly as one moves through the array as
-stored in memory. Thus C is a Row-major language. The matrix is stored by
-rows. Note that in both cases it presumes that the matrix convention for
-indexing is being used, i.e., for both Fortran and C, the first index is the
-row. Note this convention implies that the indexing convention is invariant
-and that the data order changes to keep that so.
-
-But that's not the only way
-to look at it. Suppose one has large two-dimensional arrays (images or
-matrices) stored in data files. Suppose the data are stored by rows rather than
-by columns. If we are to preserve our index convention (whether matrix or
-image) that means that depending on the language we use, we may be forced to
-reorder the data if it is read into memory to preserve our indexing
-convention. For example if we read row-ordered data into memory without
-reordering, it will match the matrix indexing convention for C, but not for
-Fortran. Conversely, it will match the image indexing convention for Fortran,
-but not for C. For C, if one is using data stored in row order, and one wants
-to preserve the image index convention, the data must be reordered when
-reading into memory.
-
-In the end, which you do for Fortran or C depends on
-which is more important, not reordering data or preserving the indexing
-convention. For large images, reordering data is potentially expensive, and
-often the indexing convention is inverted to avoid that.
-
-The situation with
-numpy makes this issue yet more complicated. The internal machinery of numpy
-arrays is flexible enough to accept any ordering of indices. One can simply
-reorder indices by manipulating the internal stride information for arrays
-without reordering the data at all. NumPy will know how to map the new index
-order to the data without moving the data.
-
-So if this is true, why not choose
-the index order that matches what you most expect? In particular, why not define
-row-ordered images to use the image convention? (This is sometimes referred
-to as the Fortran convention vs the C convention, thus the 'C' and 'FORTRAN'
-order options for array ordering in numpy.) The drawback of doing this is
-potential performance penalties. It's common to access the data sequentially,
-either implicitly in array operations or explicitly by looping over rows of an
-image. When that is done, then the data will be accessed in non-optimal order.
-As the first index is incremented, what is actually happening is that elements
-spaced far apart in memory are being sequentially accessed, with usually poor
-memory access speeds. For example, for a two dimensional image 'im' defined so
-that im[0, 10] represents the value at x=0, y=10. To be consistent with usual
-Python behavior then im[0] would represent a column at x=0. Yet that data
-would be spread over the whole array since the data are stored in row order.
-Despite the flexibility of numpy's indexing, it can't really paper over the fact
-basic operations are rendered inefficient because of data order or that getting
-contiguous subarrays is still awkward (e.g., im[:,0] for the first row, vs
-im[0]), thus one can't use an idiom such as for row in im; for col in im does
-work, but doesn't yield contiguous column data.
-
-As it turns out, numpy is
-smart enough when dealing with ufuncs to determine which index is the most
-rapidly varying one in memory and uses that for the innermost loop. Thus for
-ufuncs there is no large intrinsic advantage to either approach in most cases.
-On the other hand, use of .flat with an FORTRAN ordered array will lead to
-non-optimal memory access as adjacent elements in the flattened array (iterator,
-actually) are not contiguous in memory.
-
-Indeed, the fact is that Python
-indexing on lists and other sequences naturally leads to an outside-to inside
-ordering (the first index gets the largest grouping, the next the next largest,
-and the last gets the smallest element). Since image data are normally stored
-by rows, this corresponds to position within rows being the last item indexed.
-
-If you do want to use Fortran ordering realize that
-there are two approaches to consider: 1) accept that the first index is just not
-the most rapidly changing in memory and have all your I/O routines reorder
-your data when going from memory to disk or visa versa, or use numpy's
-mechanism for mapping the first index to the most rapidly varying data. We
-recommend the former if possible. The disadvantage of the latter is that many
-of numpy's functions will yield arrays without Fortran ordering unless you are
-careful to use the 'order' keyword. Doing this would be highly inconvenient.
-
-Otherwise we recommend simply learning to reverse the usual order of indices
-when accessing elements of an array. Granted, it goes against the grain, but
-it is more in line with Python semantics and the natural order of the data.
+.. This document has been moved to ../dev/internals.rst.
 
+This document has been moved to :ref:`numpy-internals`.
 
index c5c3498068bd4973d8ca8395a54b261555de247c..211f0d60e2b888dae1c40bad461c6f1d46474458 100644 (file)
@@ -4,7 +4,7 @@ Bit Generators
 --------------
 
 The random values produced by :class:`~Generator`
-orignate in a BitGenerator.  The BitGenerators do not directly provide
+originate in a BitGenerator.  The BitGenerators do not directly provide
 random numbers and only contains methods used for seeding, getting or
 setting the state, jumping or advancing the state, and for accessing
 low-level wrappers for consumption by code that can efficiently
index 96cd47017cca3ed44d2a84f083a7878e24b83374..aaabc9b39278b4fda8f76dca23b46c675bf3c575 100644 (file)
@@ -55,7 +55,7 @@ properties than the legacy `MT19937` used in `RandomState`.
   more_vals = random.standard_normal(10)
 
 `Generator` can be used as a replacement for `RandomState`. Both class
-instances hold a internal `BitGenerator` instance to provide the bit
+instances hold an internal `BitGenerator` instance to provide the bit
 stream, it is accessible as ``gen.bit_generator``. Some long-overdue API
 cleanup means that legacy and compatibility methods have been removed from
 `Generator`
index 85855be5936379ba3e935ff7ac90e368948d700d..cb9b94113c2fb4eb38e4d4d6b313445cb2560660 100644 (file)
@@ -13,7 +13,7 @@ full-featured, and fast on most platforms, but somewhat slow when compiled for
 parallelism would indicate using `PCG64DXSM`.
 
 `Philox` is fairly slow, but its statistical properties have
-very high quality, and it is easy to get assuredly-independent stream by using
+very high quality, and it is easy to get an assuredly-independent stream by using
 unique keys. If that is the style you wish to use for parallel streams, or you
 are porting from another system that uses that style, then
 `Philox` is your choice.
index 3a059f5d93241bf7f4970bb071537064187a1624..c6127ca6428f1a6e03e49bf12e2d69847132cd42 100644 (file)
@@ -11,3 +11,10 @@ C-Types Foreign Function Interface (:mod:`numpy.ctypeslib`)
 .. autofunction:: as_ctypes_type
 .. autofunction:: load_library
 .. autofunction:: ndpointer
+
+.. class:: c_intp
+
+    A `ctypes` signed integer type of the same size as `numpy.intp`.
+
+    Depending on the platform, it can be an alias for either `~ctypes.c_int`,
+    `~ctypes.c_long` or `~ctypes.c_longlong`.
diff --git a/doc/source/reference/routines.indexing.rst b/doc/source/reference/routines.indexing.rst
deleted file mode 100644 (file)
index eebbf49..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-.. _routines.indexing:
-
-Indexing routines
-=================
-
-.. seealso:: :ref:`Indexing <arrays.indexing>`
-
-.. currentmodule:: numpy
-
-Generating index arrays
------------------------
-.. autosummary::
-   :toctree: generated/
-
-   c_
-   r_
-   s_
-   nonzero
-   where
-   indices
-   ix_
-   ogrid
-   ravel_multi_index
-   unravel_index
-   diag_indices
-   diag_indices_from
-   mask_indices
-   tril_indices
-   tril_indices_from
-   triu_indices
-   triu_indices_from
-
-Indexing-like operations
-------------------------
-.. autosummary::
-   :toctree: generated/
-
-   take
-   take_along_axis
-   choose
-   compress
-   diag
-   diagonal
-   select
-   lib.stride_tricks.sliding_window_view
-   lib.stride_tricks.as_strided
-
-Inserting data into arrays
---------------------------
-.. autosummary::
-   :toctree: generated/
-
-   place
-   put
-   put_along_axis
-   putmask
-   fill_diagonal
-
-Iterating over arrays
----------------------
-.. autosummary::
-   :toctree: generated/
-
-   nditer
-   ndenumerate
-   ndindex
-   nested_iters
-   flatiter
-   lib.Arrayterator
index d961cbf02f6c5726cf03c02d90d48012605c16ba..5404c43d8feecf35a1769945d6be6c90b5b0e8ef 100644 (file)
@@ -44,7 +44,9 @@ Ones and zeros
    ma.masked_all
    ma.masked_all_like
    ma.ones
+   ma.ones_like
    ma.zeros
+   ma.zeros_like
 
 
 _____
@@ -287,11 +289,11 @@ Filling a masked array
 
 _____
 
-Masked arrays arithmetics
-=========================
+Masked arrays arithmetic
+========================
 
-Arithmetics
-~~~~~~~~~~~
+Arithmetic
+~~~~~~~~~~
 .. autosummary::
    :toctree: generated/
 
@@ -331,6 +333,7 @@ Minimum/maximum
    ma.max
    ma.min
    ma.ptp
+   ma.diff
 
    ma.MaskedArray.argmax
    ma.MaskedArray.argmin
index 3c2f968306e1bdf5680bc3de0856d208ab78c140..2a09b8d204a18e4abad4c07bfe7f0b29d712bde5 100644 (file)
@@ -143,6 +143,21 @@ Handling complex numbers
    conj
    conjugate
 
+Extrema Finding
+---------------
+.. autosummary::
+   :toctree: generated/
+
+   maximum
+   fmax
+   amax
+   nanmax
+   
+   minimum
+   fmin
+   amin
+   nanmin
+   
 
 Miscellaneous
 -------------
@@ -160,11 +175,7 @@ Miscellaneous
    fabs
    sign
    heaviside
-   maximum
-   minimum
-   fmax
-   fmin
-
+   
    nan_to_num
    real_if_close
 
index aefd680bbcd18dd8852ff119a38e94dfe85b2340..3398574091574287e8ef82ea536b55c4f5a99bac 100644 (file)
@@ -55,4 +55,11 @@ Matlab-like Functions
    :toctree: generated/
 
    who
-   disp
\ No newline at end of file
+   disp
+
+Exceptions
+----------
+.. autosummary::
+   :toctree: generated/
+
+   AxisError
index ecfb012f0c6afc772c91934a9ef0e4f7c7f2d10f..4aea963c01168adeae3bbf77c18b179f4e525630 100644 (file)
@@ -22,7 +22,7 @@ Therefore :mod:`numpy.polynomial` is recommended for new coding.
    the polynomial functions prefixed with *poly* accessible from the `numpy`
    namespace (e.g. `numpy.polyadd`, `numpy.polyval`, `numpy.polyfit`, etc.).
 
-   The term *polynomial package* refers to the new API definied in 
+   The term *polynomial package* refers to the new API defined in 
    `numpy.polynomial`, which includes the convenience classes for the
    different kinds of polynomials (`numpy.polynomial.Polynomial`,
    `numpy.polynomial.Chebyshev`, etc.).
@@ -110,7 +110,7 @@ See the documentation for the
 `convenience classes <routines.polynomials.classes>`_ for further details on
 the ``domain`` and ``window`` attributes.
 
-Another major difference bewteen the legacy polynomial module and the
+Another major difference between the legacy polynomial module and the
 polynomial package is polynomial fitting. In the old module, fitting was
 done via the `~numpy.polyfit` function. In the polynomial package, the
 `~numpy.polynomial.polynomial.Polynomial.fit` class method is preferred. For
index 5d6a823b713877d1699c6199138543b77889e622..593d017ccefc2cd928ec30b465d5e5c8e7510d67 100644 (file)
@@ -30,7 +30,6 @@ indentation.
    routines.fft
    routines.functional
    routines.help
-   routines.indexing
    routines.io
    routines.linalg
    routines.logic
index c675b609043883e8049eb76d60cc473216c1ec85..cd93e60253fb4c83575b800561624f8986adcc48 100644 (file)
@@ -9,11 +9,7 @@ Order statistics
 
 .. autosummary::
    :toctree: generated/
-
-   amin
-   amax
-   nanmin
-   nanmax
+   
    ptp
    percentile
    nanpercentile
index 95682432102313653bd0ce3b55ecf1a41e5dff5f..9de6d1734079a3520ef1d6654b2ecacf81166518 100644 (file)
@@ -14,7 +14,7 @@ written only once. There are three layers:
   written using the maximum set of intrinsics possible.
 - At *compile* time, a distutils command is used to define the minimum and
   maximum features to support, based on user choice and compiler support. The
-  appropriate macros are overlayed with the platform / architecture intrinsics,
+  appropriate macros are overlaid with the platform / architecture intrinsics,
   and the three loops are compiled.
 - At *runtime import*, the CPU is probed for the set of supported intrinsic
   features. A mechanism is used to grab the pointer to the most appropriate
@@ -89,7 +89,7 @@ NOTES
 ~~~~~~~~~~~~~
 - CPU features and other options are case-insensitive.
 
-- The order of the requsted optimizations doesn't matter.
+- The order of the requested optimizations doesn't matter.
 
 - Either commas or spaces can be used as a separator, e.g. ``--cpu-dispatch``\ =
   "avx2 avx512f" or ``--cpu-dispatch``\ = "avx2, avx512f" both work, but the
@@ -113,7 +113,7 @@ NOTES
   compiler native flag ``-march=native`` or ``-xHost`` or ``QxHost`` is
   enabled through environment variable ``CFLAGS``
 
-- The validation process for the requsted optimizations when it comes to
+- The validation process for the requested optimizations when it comes to
   ``--cpu-baseline`` isn't strict. For example, if the user requested
   ``AVX2`` but the compiler doesn't support it then we just skip it and return
   the maximum optimization that the compiler can handle depending on the
@@ -379,15 +379,15 @@ through ``--cpu-dispatch``, but it can also represent other options such as:
       #include "numpy/utils.h" // NPY_CAT, NPY_TOSTR
 
       #ifndef NPY__CPU_TARGET_CURRENT
-        // wrapping the dispatch-able source only happens to the addtional optimizations
-        // but if the keyword 'baseline' provided within the configuration statments,
+        // wrapping the dispatch-able source only happens to the additional optimizations
+        // but if the keyword 'baseline' provided within the configuration statements,
         // the infrastructure will add extra compiling for the dispatch-able source by
         // passing it as-is to the compiler without any changes.
         #define CURRENT_TARGET(X) X
         #define NPY__CPU_TARGET_CURRENT baseline // for printing only
       #else
         // since we reach to this point, that's mean we're dealing with
-          // the addtional optimizations, so it could be SSE42 or AVX512F
+          // the additional optimizations, so it could be SSE42 or AVX512F
         #define CURRENT_TARGET(X) NPY_CAT(NPY_CAT(X, _), NPY__CPU_TARGET_CURRENT)
       #endif
       // Macro 'CURRENT_TARGET' adding the current target as suffux to the exported symbols,
@@ -418,7 +418,7 @@ through ``--cpu-dispatch``, but it can also represent other options such as:
       #undef NPY__CPU_DISPATCH_BASELINE_CALL
       #undef NPY__CPU_DISPATCH_CALL
       // nothing strange here, just a normal preprocessor callback
-      // enabled only if 'baseline' spesfied withiin the configration statments
+      // enabled only if 'baseline' specified within the configuration statements
       #define NPY__CPU_DISPATCH_BASELINE_CALL(CB, ...) \
         NPY__CPU_DISPATCH_EXPAND_(CB(__VA_ARGS__))
       // 'NPY__CPU_DISPATCH_CALL' is an abstract macro is used for dispatching
@@ -427,7 +427,7 @@ through ``--cpu-dispatch``, but it can also represent other options such as:
       // @param CHK, Expected a macro that can be used to detect CPU features
       // in runtime, which takes a CPU feature name without string quotes and
       // returns the testing result in a shape of boolean value.
-      // NumPy already has macro called "NPY_CPU_HAVE", which fit this requirment.
+      // NumPy already has macro called "NPY_CPU_HAVE", which fits this requirement.
       //
       // @param CB, a callback macro that expected to be called multiple times depending
       // on the required optimizations, the callback should receive the following arguments:
index 3eae4e1598bba51daf6d891f4c831f52df965a14..6ace5b23327996894b0fea5d4ef1c6d6c9c53ca0 100644 (file)
 Universal functions (:class:`ufunc`)
 ************************************
 
-.. note: XXX: section might need to be made more reference-guideish...
-
-.. index: ufunc, universal function, arithmetic, operation
+.. seealso:: :ref:`ufuncs-basics`
 
 A universal function (or :term:`ufunc` for short) is a function that
-operates on :class:`ndarrays <ndarray>` in an element-by-element fashion,
+operates on :class:`ndarrays <numpy.ndarray>` in an element-by-element fashion,
 supporting :ref:`array broadcasting <ufuncs.broadcasting>`, :ref:`type
 casting <ufuncs.casting>`, and several other standard features. That
-is, a ufunc is a ":term:`vectorized <vectorization>`" wrapper for a function that
-takes a fixed number of specific inputs and produces a fixed number of
-specific outputs.
-
-In NumPy, universal functions are instances of the
-:class:`numpy.ufunc` class. Many of the built-in functions are
-implemented in compiled C code. The basic ufuncs operate on scalars, but
-there is also a generalized kind for which the basic elements are sub-arrays
-(vectors, matrices, etc.), and broadcasting is done over other dimensions.
-One can also produce custom :class:`ufunc` instances using the
-:func:`frompyfunc` factory function.
-
-
-.. _ufuncs.broadcasting:
-
-Broadcasting
-============
-
-.. index:: broadcasting
-
-Each universal function takes array inputs and produces array outputs
-by performing the core function element-wise on the inputs (where an
-element is generally a scalar, but can be a vector or higher-order
-sub-array for generalized ufuncs). Standard
-broadcasting rules are applied so that inputs not sharing exactly the
-same shapes can still be usefully operated on. Broadcasting can be
-understood by four rules:
-
-1. All input arrays with :attr:`ndim <ndarray.ndim>` smaller than the
-   input array of largest :attr:`ndim <ndarray.ndim>`, have 1's
-   prepended to their shapes.
-
-2. The size in each dimension of the output shape is the maximum of all
-   the input sizes in that dimension.
-
-3. An input can be used in the calculation if its size in a particular
-   dimension either matches the output size in that dimension, or has
-   value exactly 1.
-
-4. If an input has a dimension size of 1 in its shape, the first data
-   entry in that dimension will be used for all calculations along
-   that dimension. In other words, the stepping machinery of the
-   :term:`ufunc` will simply not step along that dimension (the
-   :ref:`stride <memory-layout>` will be 0 for that dimension).
-
-Broadcasting is used throughout NumPy to decide how to handle
-disparately shaped arrays; for example, all arithmetic operations (``+``,
-``-``, ``*``, ...) between :class:`ndarrays <ndarray>` broadcast the
-arrays before operation.
-
-.. _arrays.broadcasting.broadcastable:
-
-.. index:: broadcastable
-
-A set of arrays is called "broadcastable" to the same shape if
-the above rules produce a valid result, *i.e.*, one of the following
-is true:
-
-1. The arrays all have exactly the same shape.
-
-2. The arrays all have the same number of dimensions and the length of
-   each dimensions is either a common length or 1.
-
-3. The arrays that have too few dimensions can have their shapes prepended
-   with a dimension of length 1 to satisfy property 2.
-
-.. admonition:: Example
-
-   If ``a.shape`` is (5,1), ``b.shape`` is (1,6), ``c.shape`` is (6,)
-   and ``d.shape`` is () so that *d* is a scalar, then *a*, *b*, *c*,
-   and *d* are all broadcastable to dimension (5,6); and
-
-   - *a* acts like a (5,6) array where ``a[:,0]`` is broadcast to the other
-     columns,
-
-   - *b* acts like a (5,6) array where ``b[0,:]`` is broadcast
-     to the other rows,
-
-   - *c* acts like a (1,6) array and therefore like a (5,6) array
-     where ``c[:]`` is broadcast to every row, and finally,
-
-   - *d* acts like a (5,6) array where the single value is repeated.
-
-
-.. _ufuncs-output-type:
-
-Output type determination
-=========================
-
-The output of the ufunc (and its methods) is not necessarily an
-:class:`ndarray`, if all input arguments are not :class:`ndarrays <ndarray>`.
-Indeed, if any input defines an :obj:`~class.__array_ufunc__` method,
-control will be passed completely to that function, i.e., the ufunc is
-:ref:`overridden <ufuncs.overrides>`.
-
-If none of the inputs overrides the ufunc, then
-all output arrays will be passed to the :obj:`~class.__array_prepare__` and
-:obj:`~class.__array_wrap__` methods of the input (besides
-:class:`ndarrays <ndarray>`, and scalars) that defines it **and** has
-the highest :obj:`~class.__array_priority__` of any other input to the
-universal function. The default :obj:`~class.__array_priority__` of the
-ndarray is 0.0, and the default :obj:`~class.__array_priority__` of a subtype
-is 0.0. Matrices have :obj:`~class.__array_priority__` equal to 10.0.
-
-All ufuncs can also take output arguments. If necessary, output will
-be cast to the data-type(s) of the provided output array(s). If a class
-with an :obj:`~class.__array__` method is used for the output, results will be
-written to the object returned by :obj:`~class.__array__`. Then, if the class
-also has an :obj:`~class.__array_prepare__` method, it is called so metadata
-may be determined based on the context of the ufunc (the context
-consisting of the ufunc itself, the arguments passed to the ufunc, and
-the ufunc domain.) The array object returned by
-:obj:`~class.__array_prepare__` is passed to the ufunc for computation.
-Finally, if the class also has an :obj:`~class.__array_wrap__` method, the returned
-:class:`ndarray` result will be passed to that method just before
-passing control back to the caller.
-
-Use of internal buffers
-=======================
-
-.. index:: buffers
-
-Internally, buffers are used for misaligned data, swapped data, and
-data that has to be converted from one data type to another. The size
-of internal buffers is settable on a per-thread basis. There can
-be up to :math:`2 (n_{\mathrm{inputs}} + n_{\mathrm{outputs}})`
-buffers of the specified size created to handle the data from all the
-inputs and outputs of a ufunc. The default size of a buffer is
-10,000 elements. Whenever buffer-based calculation would be needed,
-but all input arrays are smaller than the buffer size, those
-misbehaved or incorrectly-typed arrays will be copied before the
-calculation proceeds. Adjusting the size of the buffer may therefore
-alter the speed at which ufunc calculations of various sorts are
-completed. A simple interface for setting this variable is accessible
-using the function
-
-.. autosummary::
-   :toctree: generated/
-
-   setbufsize
-
-
-Error handling
-==============
-
-.. index:: error handling
-
-Universal functions can trip special floating-point status registers
-in your hardware (such as divide-by-zero). If available on your
-platform, these registers will be regularly checked during
-calculation. Error handling is controlled on a per-thread basis,
-and can be configured using the functions
-
-.. autosummary::
-   :toctree: generated/
-
-   seterr
-   seterrcall
-
-.. _ufuncs.casting:
-
-Casting Rules
-=============
-
-.. index::
-   pair: ufunc; casting rules
-
-.. note::
-
-   In NumPy 1.6.0, a type promotion API was created to encapsulate the
-   mechanism for determining output types. See the functions
-   :func:`result_type`, :func:`promote_types`, and
-   :func:`min_scalar_type` for more details.
-
-At the core of every ufunc is a one-dimensional strided loop that
-implements the actual function for a specific type combination. When a
-ufunc is created, it is given a static list of inner loops and a
-corresponding list of type signatures over which the ufunc operates.
-The ufunc machinery uses this list to determine which inner loop to
-use for a particular case. You can inspect the :attr:`.types
-<ufunc.types>` attribute for a particular ufunc to see which type
-combinations have a defined inner loop and which output type they
-produce (:ref:`character codes <arrays.scalars.character-codes>` are used
-in said output for brevity).
-
-Casting must be done on one or more of the inputs whenever the ufunc
-does not have a core loop implementation for the input types provided.
-If an implementation for the input types cannot be found, then the
-algorithm searches for an implementation with a type signature to
-which all of the inputs can be cast "safely." The first one it finds
-in its internal list of loops is selected and performed, after all
-necessary type casting. Recall that internal copies during ufuncs (even
-for casting) are limited to the size of an internal buffer (which is user
-settable).
-
-.. note::
-
-    Universal functions in NumPy are flexible enough to have mixed type
-    signatures. Thus, for example, a universal function could be defined
-    that works with floating-point and integer values. See :func:`ldexp`
-    for an example.
-
-By the above description, the casting rules are essentially
-implemented by the question of when a data type can be cast "safely"
-to another data type. The answer to this question can be determined in
-Python with a function call: :func:`can_cast(fromtype, totype)
-<can_cast>`. The Figure below shows the results of this call for
-the 24 internally supported types on the author's 64-bit system. You
-can generate this table for your system with the code given in the Figure.
-
-.. admonition:: Figure
-
-    Code segment showing the "can cast safely" table for a 64-bit system.
-    Generally the output depends on the system; your system might result in
-    a different table.
-
-    >>> mark = {False: ' -', True: ' Y'}
-    >>> def print_table(ntypes):
-    ...     print('X ' + ' '.join(ntypes))
-    ...     for row in ntypes:
-    ...         print(row, end='')
-    ...         for col in ntypes:
-    ...             print(mark[np.can_cast(row, col)], end='')
-    ...         print()
-    ...
-    >>> print_table(np.typecodes['All'])
-    X ? b h i l q p B H I L Q P e f d g F D G S U V O M m
-    ? Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y - Y
-    b - Y Y Y Y Y Y - - - - - - Y Y Y Y Y Y Y Y Y Y Y - Y
-    h - - Y Y Y Y Y - - - - - - - Y Y Y Y Y Y Y Y Y Y - Y
-    i - - - Y Y Y Y - - - - - - - - Y Y - Y Y Y Y Y Y - Y
-    l - - - - Y Y Y - - - - - - - - Y Y - Y Y Y Y Y Y - Y
-    q - - - - Y Y Y - - - - - - - - Y Y - Y Y Y Y Y Y - Y
-    p - - - - Y Y Y - - - - - - - - Y Y - Y Y Y Y Y Y - Y
-    B - - Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y - Y
-    H - - - Y Y Y Y - Y Y Y Y Y - Y Y Y Y Y Y Y Y Y Y - Y
-    I - - - - Y Y Y - - Y Y Y Y - - Y Y - Y Y Y Y Y Y - Y
-    L - - - - - - - - - - Y Y Y - - Y Y - Y Y Y Y Y Y - -
-    Q - - - - - - - - - - Y Y Y - - Y Y - Y Y Y Y Y Y - -
-    P - - - - - - - - - - Y Y Y - - Y Y - Y Y Y Y Y Y - -
-    e - - - - - - - - - - - - - Y Y Y Y Y Y Y Y Y Y Y - -
-    f - - - - - - - - - - - - - - Y Y Y Y Y Y Y Y Y Y - -
-    d - - - - - - - - - - - - - - - Y Y - Y Y Y Y Y Y - -
-    g - - - - - - - - - - - - - - - - Y - - Y Y Y Y Y - -
-    F - - - - - - - - - - - - - - - - - Y Y Y Y Y Y Y - -
-    D - - - - - - - - - - - - - - - - - - Y Y Y Y Y Y - -
-    G - - - - - - - - - - - - - - - - - - - Y Y Y Y Y - -
-    S - - - - - - - - - - - - - - - - - - - - Y Y Y Y - -
-    U - - - - - - - - - - - - - - - - - - - - - Y Y Y - -
-    V - - - - - - - - - - - - - - - - - - - - - - Y Y - -
-    O - - - - - - - - - - - - - - - - - - - - - - - Y - -
-    M - - - - - - - - - - - - - - - - - - - - - - Y Y Y -
-    m - - - - - - - - - - - - - - - - - - - - - - Y Y - Y
-
-You should note that, while included in the table for completeness,
-the 'S', 'U', and 'V' types cannot be operated on by ufuncs. Also,
-note that on a 32-bit system the integer types may have different
-sizes, resulting in a slightly altered table.
-
-Mixed scalar-array operations use a different set of casting rules
-that ensure that a scalar cannot "upcast" an array unless the scalar is
-of a fundamentally different kind of data (*i.e.*, under a different
-hierarchy in the data-type hierarchy) than the array.  This rule
-enables you to use scalar constants in your code (which, as Python
-types, are interpreted accordingly in ufuncs) without worrying about
-whether the precision of the scalar constant will cause upcasting on
-your large (small precision) array.
-
-
-.. _ufuncs.overrides:
-
-Overriding Ufunc behavior
-=========================
-
-Classes (including ndarray subclasses) can override how ufuncs act on
-them by defining certain special methods.  For details, see
-:ref:`arrays.classes`.
-
+is, a ufunc is a ":term:`vectorized <vectorization>`" wrapper for a function
+that takes a fixed number of specific inputs and produces a fixed number of
+specific outputs. For detailed information on universal functions, see
+:ref:`ufuncs-basics`.
 
 :class:`ufunc`
 ==============
@@ -314,171 +38,171 @@ advanced usage and will not typically be used.
 .. index::
    pair: ufunc; keyword arguments
 
-*out*
+.. rubric:: *out*
 
-    .. versionadded:: 1.6
+.. versionadded:: 1.6
 
-    The first output can be provided as either a positional or a keyword
-    parameter. Keyword 'out' arguments are incompatible with positional
-    ones.
+The first output can be provided as either a positional or a keyword
+parameter. Keyword 'out' arguments are incompatible with positional
+ones.
 
-    .. versionadded:: 1.10
+.. versionadded:: 1.10
 
-    The 'out' keyword argument is expected to be a tuple with one entry per
-    output (which can be None for arrays to be allocated by the ufunc).
-    For ufuncs with a single output, passing a single array (instead of a
-    tuple holding a single array) is also valid.
+The 'out' keyword argument is expected to be a tuple with one entry per
+output (which can be None for arrays to be allocated by the ufunc).
+For ufuncs with a single output, passing a single array (instead of a
+tuple holding a single array) is also valid.
 
-    Passing a single array in the 'out' keyword argument to a ufunc with
-    multiple outputs is deprecated, and will raise a warning in numpy 1.10,
-    and an error in a future release.
+Passing a single array in the 'out' keyword argument to a ufunc with
+multiple outputs is deprecated, and will raise a warning in numpy 1.10,
+and an error in a future release.
 
-    If 'out' is None (the default), a uninitialized return array is created.
-    The output array is then filled with the results of the ufunc in the places
-    that the broadcast 'where' is True. If 'where' is the scalar True (the
-    default), then this corresponds to the entire output being filled.
-    Note that outputs not explicitly filled are left with their
-    uninitialized values.
+If 'out' is None (the default), a uninitialized return array is created.
+The output array is then filled with the results of the ufunc in the places
+that the broadcast 'where' is True. If 'where' is the scalar True (the
+default), then this corresponds to the entire output being filled.
+Note that outputs not explicitly filled are left with their
+uninitialized values.
 
-    .. versionadded:: 1.13
+.. versionadded:: 1.13
 
-    Operations where ufunc input and output operands have memory overlap are
-    defined to be the same as for equivalent operations where there
-    is no memory overlap.  Operations affected make temporary copies
-    as needed to eliminate data dependency.  As detecting these cases
-    is computationally expensive, a heuristic is used, which may in rare
-    cases result in needless temporary copies.  For operations where the
-    data dependency is simple enough for the heuristic to analyze,
-    temporary copies will not be made even if the arrays overlap, if it
-    can be deduced copies are not necessary.  As an example,
-    ``np.add(a, b, out=a)`` will not involve copies.
+Operations where ufunc input and output operands have memory overlap are
+defined to be the same as for equivalent operations where there
+is no memory overlap.  Operations affected make temporary copies
+as needed to eliminate data dependency.  As detecting these cases
+is computationally expensive, a heuristic is used, which may in rare
+cases result in needless temporary copies.  For operations where the
+data dependency is simple enough for the heuristic to analyze,
+temporary copies will not be made even if the arrays overlap, if it
+can be deduced copies are not necessary.  As an example,
+``np.add(a, b, out=a)`` will not involve copies.
 
-*where*
+.. rubric:: *where*
 
-    .. versionadded:: 1.7
+.. versionadded:: 1.7
 
-    Accepts a boolean array which is broadcast together with the operands.
-    Values of True indicate to calculate the ufunc at that position, values
-    of False indicate to leave the value in the output alone. This argument
-    cannot be used for generalized ufuncs as those take non-scalar input.
+Accepts a boolean array which is broadcast together with the operands.
+Values of True indicate to calculate the ufunc at that position, values
+of False indicate to leave the value in the output alone. This argument
+cannot be used for generalized ufuncs as those take non-scalar input.
 
-    Note that if an uninitialized return array is created, values of False
-    will leave those values **uninitialized**.
+Note that if an uninitialized return array is created, values of False
+will leave those values **uninitialized**.
 
-*axes*
+.. rubric:: *axes*
 
-    .. versionadded:: 1.15
+.. versionadded:: 1.15
 
-    A list of tuples with indices of axes a generalized ufunc should operate
-    on. For instance, for a signature of ``(i,j),(j,k)->(i,k)`` appropriate
-    for matrix multiplication, the base elements are two-dimensional matrices
-    and these are taken to be stored in the two last axes of each argument.
-    The corresponding axes keyword would be ``[(-2, -1), (-2, -1), (-2, -1)]``.
-    For simplicity, for generalized ufuncs that operate on 1-dimensional arrays
-    (vectors), a single integer is accepted instead of a single-element tuple,
-    and for generalized ufuncs for which all outputs are scalars, the output
-    tuples can be omitted.
+A list of tuples with indices of axes a generalized ufunc should operate
+on. For instance, for a signature of ``(i,j),(j,k)->(i,k)`` appropriate
+for matrix multiplication, the base elements are two-dimensional matrices
+and these are taken to be stored in the two last axes of each argument.
+The corresponding axes keyword would be ``[(-2, -1), (-2, -1), (-2, -1)]``.
+For simplicity, for generalized ufuncs that operate on 1-dimensional arrays
+(vectors), a single integer is accepted instead of a single-element tuple,
+and for generalized ufuncs for which all outputs are scalars, the output
+tuples can be omitted.
 
-*axis*
+.. rubric:: *axis*
 
-    .. versionadded:: 1.15
+.. versionadded:: 1.15
 
-    A single axis over which a generalized ufunc should operate. This is a
-    short-cut for ufuncs that operate over a single, shared core dimension,
-    equivalent to passing in ``axes`` with entries of ``(axis,)`` for each
-    single-core-dimension argument and ``()`` for all others.  For instance,
-    for a signature ``(i),(i)->()``, it is equivalent to passing in
-    ``axes=[(axis,), (axis,), ()]``.
+A single axis over which a generalized ufunc should operate. This is a
+short-cut for ufuncs that operate over a single, shared core dimension,
+equivalent to passing in ``axes`` with entries of ``(axis,)`` for each
+single-core-dimension argument and ``()`` for all others.  For instance,
+for a signature ``(i),(i)->()``, it is equivalent to passing in
+``axes=[(axis,), (axis,), ()]``.
 
-*keepdims*
+.. rubric:: *keepdims*
 
-    .. versionadded:: 1.15
+.. versionadded:: 1.15
 
-    If this is set to `True`, axes which are reduced over will be left in the
-    result as a dimension with size one, so that the result will broadcast
-    correctly against the inputs. This option can only be used for generalized
-    ufuncs that operate on inputs that all have the same number of core
-    dimensions and with outputs that have no core dimensions, i.e., with
-    signatures like ``(i),(i)->()`` or ``(m,m)->()``. If used, the location of
-    the dimensions in the output can be controlled with ``axes`` and ``axis``.
+If this is set to `True`, axes which are reduced over will be left in the
+result as a dimension with size one, so that the result will broadcast
+correctly against the inputs. This option can only be used for generalized
+ufuncs that operate on inputs that all have the same number of core
+dimensions and with outputs that have no core dimensions, i.e., with
+signatures like ``(i),(i)->()`` or ``(m,m)->()``. If used, the location of
+the dimensions in the output can be controlled with ``axes`` and ``axis``.
 
-*casting*
+.. rubric:: *casting*
 
-    .. versionadded:: 1.6
+.. versionadded:: 1.6
 
-    May be 'no', 'equiv', 'safe', 'same_kind', or 'unsafe'.
-    See :func:`can_cast` for explanations of the parameter values.
+May be 'no', 'equiv', 'safe', 'same_kind', or 'unsafe'.
+See :func:`can_cast` for explanations of the parameter values.
 
-    Provides a policy for what kind of casting is permitted. For compatibility
-    with previous versions of NumPy, this defaults to 'unsafe' for numpy < 1.7.
-    In numpy 1.7 a transition to 'same_kind' was begun where ufuncs produce a
-    DeprecationWarning for calls which are allowed under the 'unsafe'
-    rules, but not under the 'same_kind' rules. From numpy 1.10 and
-    onwards, the default is 'same_kind'.
+Provides a policy for what kind of casting is permitted. For compatibility
+with previous versions of NumPy, this defaults to 'unsafe' for numpy < 1.7.
+In numpy 1.7 a transition to 'same_kind' was begun where ufuncs produce a
+DeprecationWarning for calls which are allowed under the 'unsafe'
+rules, but not under the 'same_kind' rules. From numpy 1.10 and
+onwards, the default is 'same_kind'.
 
-*order*
+.. rubric:: *order*
 
-    .. versionadded:: 1.6
+.. versionadded:: 1.6
 
-    Specifies the calculation iteration order/memory layout of the output array.
-    Defaults to 'K'. 'C' means the output should be C-contiguous, 'F' means
-    F-contiguous, 'A' means F-contiguous if the inputs are F-contiguous and
-    not also not C-contiguous, C-contiguous otherwise, and 'K' means to match
-    the element ordering of the inputs as closely as possible.
+Specifies the calculation iteration order/memory layout of the output array.
+Defaults to 'K'. 'C' means the output should be C-contiguous, 'F' means
+F-contiguous, 'A' means F-contiguous if the inputs are F-contiguous and
+not also not C-contiguous, C-contiguous otherwise, and 'K' means to match
+the element ordering of the inputs as closely as possible.
 
-*dtype*
+.. rubric:: *dtype*
 
-    .. versionadded:: 1.6
+.. versionadded:: 1.6
 
-    Overrides the DType of the output arrays the same way as the *signature*.
-    This should ensure a matching precision of the calculation.  The exact
-    calculation DTypes chosen may depend on the ufunc and the inputs may be
-    cast to this DType to perform the calculation.
+Overrides the DType of the output arrays the same way as the *signature*.
+This should ensure a matching precision of the calculation.  The exact
+calculation DTypes chosen may depend on the ufunc and the inputs may be
+cast to this DType to perform the calculation.
 
-*subok*
+.. rubric:: *subok*
 
-    .. versionadded:: 1.6
+.. versionadded:: 1.6
 
-    Defaults to true. If set to false, the output will always be a strict
-    array, not a subtype.
+Defaults to true. If set to false, the output will always be a strict
+array, not a subtype.
 
-*signature*
+.. rubric:: *signature*
 
-    Either a Dtype, a tuple of DTypes, or a special signature string
-    indicating the input and output types of a ufunc.
+Either a Dtype, a tuple of DTypes, or a special signature string
+indicating the input and output types of a ufunc.
 
-    This argument allows the user to specify exact DTypes to be used for the
-    calculation.  Casting will be used as necessary. The actual DType of the
-    input arrays is not considered unless ``signature`` is ``None`` for
-    that array.
+This argument allows the user to specify exact DTypes to be used for the
+calculation.  Casting will be used as necessary. The actual DType of the
+input arrays is not considered unless ``signature`` is ``None`` for
+that array.
 
-    When all DTypes are fixed, a specific loop is chosen or an error raised
-    if no matching loop exists.
-    If some DTypes are not specified and left ``None``, the behaviour may
-    depend on the ufunc.
-    At this time, a list of available signatures is provided by the **types**
-    attribute of the ufunc.  (This list may be missing DTypes not defined
-    by NumPy.)
+When all DTypes are fixed, a specific loop is chosen or an error raised
+if no matching loop exists.
+If some DTypes are not specified and left ``None``, the behaviour may
+depend on the ufunc.
+At this time, a list of available signatures is provided by the **types**
+attribute of the ufunc.  (This list may be missing DTypes not defined
+by NumPy.)
 
-    The ``signature`` only specifies the DType class/type.  For example, it
-    can specifiy that the operation should be ``datetime64`` or ``float64``
-    operation.  It does not specify the ``datetime64`` time-unit or the
-    ``float64`` byte-order.
+The ``signature`` only specifies the DType class/type.  For example, it
+can specify that the operation should be ``datetime64`` or ``float64``
+operation.  It does not specify the ``datetime64`` time-unit or the
+``float64`` byte-order.
 
-    For backwards compatibility this argument can also be provided as *sig*,
-    although the long form is preferred.  Note that this should not be
-    confused with the generalized ufunc :ref:`signature <details-of-signature>`
-    that is stored in the **signature** attribute of the of the ufunc object.
+For backwards compatibility this argument can also be provided as *sig*,
+although the long form is preferred.  Note that this should not be
+confused with the generalized ufunc :ref:`signature <details-of-signature>`
+that is stored in the **signature** attribute of the of the ufunc object.
 
-*extobj*
+.. rubric:: *extobj*
 
-    a list of length 3 specifying the ufunc buffer-size, the error
-    mode integer, and the error call-back function. Normally, these
-    values are looked up in a thread-specific dictionary. Passing them
-    here circumvents that look up and uses the low-level specification
-    provided for the error mode. This may be useful, for example, as
-    an optimization for calculations requiring many ufunc calls on
-    small arrays in a loop.
+A list of length 3 specifying the ufunc buffer-size, the error
+mode integer, and the error call-back function. Normally, these
+values are looked up in a thread-specific dictionary. Passing them
+here circumvents that look up and uses the low-level specification
+provided for the error mode. This may be useful, for example, as
+an optimization for calculations requiring many ufunc calls on
+small arrays in a loop.
 
 
 
@@ -517,39 +241,6 @@ possess. None of the attributes can be set.
 Methods
 -------
 
-All ufuncs have four methods. However, these methods only make sense on scalar
-ufuncs that take two input arguments and return one output argument.
-Attempting to call these methods on other ufuncs will cause a
-:exc:`ValueError`. The reduce-like methods all take an *axis* keyword, a *dtype*
-keyword, and an *out* keyword, and the arrays must all have dimension >= 1.
-The *axis* keyword specifies the axis of the array over which the reduction
-will take place (with negative values counting backwards). Generally, it is an
-integer, though for :meth:`ufunc.reduce`, it can also be a tuple of `int` to
-reduce over several axes at once, or None, to reduce over all axes.
-The *dtype* keyword allows you to manage a very common problem that arises
-when naively using :meth:`ufunc.reduce`. Sometimes you may
-have an array of a certain data type and wish to add up all of its
-elements, but the result does not fit into the data type of the
-array. This commonly happens if you have an array of single-byte
-integers. The *dtype* keyword allows you to alter the data type over which
-the reduction takes place (and therefore the type of the output). Thus,
-you can ensure that the output is a data type with precision large enough
-to handle your output. The responsibility of altering the reduce type is
-mostly up to you. There is one exception: if no *dtype* is given for a
-reduction on the "add" or "multiply" operations, then if the input type is
-an integer (or Boolean) data-type and smaller than the size of the
-:class:`int_` data type, it will be internally upcast to the :class:`int_`
-(or :class:`uint`) data-type. Finally, the *out* keyword allows you to provide
-an output array (for single-output ufuncs, which are currently the only ones
-supported; for future extension, however, a tuple with a single argument
-can be passed in). If *out* is given, the *dtype* argument is ignored.
-
-Ufuncs also have a fifth method that allows in place operations to be
-performed using fancy indexing. No buffering is used on the dimensions where
-fancy indexing is used, so the fancy index can list an item more than once and
-the operation will be performed on the result of the previous operation for
-that item.
-
 .. index::
    pair: ufunc; methods
 
index a2549f3b7d2d6b17d3b22f20730981f122f001df..a4a5bde63aeb4a7001f66b7c63450045f304761d 100644 (file)
@@ -1,12 +1,11 @@
 *************
-Release Notes
+Release notes
 *************
 
 .. toctree::
     :maxdepth: 3
 
-    1.21.6 <release/1.21.6-notes>
-    1.21.5 <release/1.21.5-notes>
+    1.22.0 <release/1.22.0-notes>
     1.21.4 <release/1.21.4-notes>
     1.21.3 <release/1.21.3-notes>
     1.21.2 <release/1.21.2-notes>
index 8ee876fd3184014c19ab177757ce98f923c1a73d..346b5af99f89df18df203a34e323aae1efd59e79 100644 (file)
@@ -332,7 +332,7 @@ eliminating their use internally and two new C-API functions,
 * ``PyArray_SetWritebackIfCopyBase``
 * ``PyArray_ResolveWritebackIfCopy``,
 
-have been added together with a complimentary flag,
+have been added together with a complementary flag,
 ``NPY_ARRAY_WRITEBACKIFCOPY``. Using the new functionality also requires that
 some flags be changed when new arrays are created, to wit:
 ``NPY_ARRAY_INOUT_ARRAY`` should be replaced by ``NPY_ARRAY_INOUT_ARRAY2`` and
index 7235ca915967e9d264c8c0c2055d04fec61bdac3..2d9d068e5c379f646fa345a317d37b01e42d39b6 100644 (file)
@@ -326,8 +326,8 @@ passed explicitly, and are not yet computed automatically.
 No longer does an IQR of 0 result in ``n_bins=1``, rather the number of bins
 chosen is related to the data size in this situation.
 
-The edges retuned by `histogram`` and ``histogramdd`` now match the data float type
------------------------------------------------------------------------------------
+The edges returned by `histogram`` and ``histogramdd`` now match the data float type
+------------------------------------------------------------------------------------
 When passed ``np.float16``, ``np.float32``, or ``np.longdouble`` data, the
 returned edges are now of the same dtype. Previously, ``histogram`` would only
 return the same type if explicit bins were given, and ``histogram`` would
index 17d24160adb41893c4872db581da8cef72830e06..122f20eba48b9f4c4541181c71feaf25ace7fa84 100644 (file)
@@ -119,7 +119,7 @@ NaT comparisons
 Consistent with the behavior of NaN, all comparisons other than inequality
 checks with datetime64 or timedelta64 NaT ("not-a-time") values now always
 return ``False``, and inequality checks with NaT now always return ``True``.
-This includes comparisons beteween NaT values. For compatibility with the
+This includes comparisons between NaT values. For compatibility with the
 old behavior, use ``np.isnat`` to explicitly check for NaT or convert
 datetime64/timedelta64 arrays with ``.astype(np.int64)`` before making
 comparisons.
@@ -365,7 +365,7 @@ Alpine Linux (and other musl c library distros) support
 We now default to use `fenv.h` for floating point status error reporting.
 Previously we had a broken default that sometimes would not report underflow,
 overflow, and invalid floating point operations. Now we can support non-glibc
-distrubutions like Alpine Linux as long as they ship `fenv.h`.
+distributions like Alpine Linux as long as they ship `fenv.h`.
 
 Speedup ``np.block`` for large arrays
 -------------------------------------
index 8f5c2c0ce2e03198caceb0467efc34cf389b28fb..410890697b5c27cefa55716cc942b1fd2750dac0 100644 (file)
@@ -402,7 +402,7 @@ Ability to disable madvise hugepages
 ------------------------------------
 On Linux NumPy has previously added support for madavise hugepages which can
 improve performance for very large arrays.  Unfortunately, on older Kernel
-versions this led to peformance regressions, thus by default the support has
+versions this led to performance regressions, thus by default the support has
 been disabled on kernels before version 4.6. To override the default, you can
 use the environment variable::
 
index b8b7a0c79a6e6d3d0851a4c0180b768fcabc4e24..494e4f19ee5b3bae852e874cd84b2f95f6698842 100644 (file)
@@ -842,7 +842,7 @@ The compiler command selection for Fortran Portland Group Compiler is changed
 in `numpy.distutils.fcompiler`.  This only affects the linking command.  This
 forces the use of the executable provided by the command line option (if
 provided) instead of the pgfortran executable.  If no executable is provided to
-the command line option it defaults to the pgf90 executable, wich is an alias
+the command line option it defaults to the pgf90 executable, which is an alias
 for pgfortran according to the PGI documentation.
 
 (`gh-16730 <https://github.com/numpy/numpy/pull/16730>`__)
index 270cc32de918e6f6371efd1c6901eb2bfd612ee3..88a4503de281224e04104998394fe2676fc9826e 100644 (file)
@@ -522,7 +522,7 @@ either of these distributions are produced.
 Placeholder annotations have been improved
 ------------------------------------------
 All placeholder annotations, that were previously annotated as ``typing.Any``,
-have been improved. Where appropiate they have been replaced with explicit
+have been improved. Where appropriate they have been replaced with explicit
 function definitions, classes or other miscellaneous objects.
 
 (`gh-18934 <https://github.com/numpy/numpy/pull/18934>`__)
index ee2c525c7ef614d55ab86855beac826b70b9aaa5..bc17c069ee19a34b586f7ca6ecff0e11c5a538ba 100644 (file)
@@ -4,11 +4,11 @@
 NumPy 1.21.2 Release Notes
 ==========================
 
-The NumPy 1.21.2 is maintenance release that fixes bugs discovered after
+The NumPy 1.21.2 is maintenance release that fixes bugs discovered after
 1.21.1. It also provides 64 bit manylinux Python 3.10.0rc1 wheels for
-downstream testing. Note that Python 3.10 is not yet final. There is also
-preliminary support for Windows on ARM64 builds, but there is no OpenBLAS for
-that platform and no wheels are available.
+downstream testing. Note that Python 3.10 is not yet final. It also has
+preliminary support for Windows on ARM64, but there is no OpenBLAS for that
+platform and no wheels are available.
 
 The Python versions supported for this release are 3.7-3.9. The 1.21.x series
 is compatible with Python 3.10.0rc1 and Python 3.10 will be officially
index c0ef5a498f8555c396eb07c72b75b0beb26d756b..4058452ef7dc445a7dc396e3753a7b99405f2026 100644 (file)
@@ -4,7 +4,7 @@
 NumPy 1.21.3 Release Notes
 ==========================
 
-The NumPy 1.21.3 is a maintenance release the fixes a few bugs discovered after
+NumPy 1.21.3 is a maintenance release that fixes a few bugs discovered after
 1.21.2. It also provides 64 bit Python 3.10.0 wheels. Note a few oddities about
 Python 3.10:
 
@@ -12,7 +12,7 @@ Python 3.10:
 * The Mac Intel builds are only available in universal2 wheels.
 
 The Python versions supported in this release are 3.7-3.10. If you want to
-compile your own version using gcc-11 you will need to use gcc-11.2+ to avoid
+compile your own version using gcc-11, you will need to use gcc-11.2+ to avoid
 problems.
 
 Contributors
index dd8abdb820d38bd2458668944fc35cc2abff4ae8..e35d8c88027ea3092467ddc6593e22e207fc7a11 100644 (file)
@@ -35,7 +35,7 @@ Pull requests merged
 
 A total of 9 pull requests were merged for this release.
 
-* `#20278 <https://github.com/numpy/numpy/pull/20278>`__: BUG: Fix shadowed reference of `dtype` in type stub
+* `#20278 <https://github.com/numpy/numpy/pull/20278>`__: BUG: Fix shadowed reference of ``dtype`` in type stub
 * `#20293 <https://github.com/numpy/numpy/pull/20293>`__: BUG: Fix headers for universal2 builds
 * `#20294 <https://github.com/numpy/numpy/pull/20294>`__: BUG: ``VOID_nonzero`` could sometimes mutate alignment flag
 * `#20295 <https://github.com/numpy/numpy/pull/20295>`__: BUG: Do not use nonzero fastpath on unaligned arrays
@@ -43,4 +43,4 @@ A total of 9 pull requests were merged for this release.
 * `#20297 <https://github.com/numpy/numpy/pull/20297>`__: BUG, SIMD: Fix 64-bit/8-bit integer division by a scalar
 * `#20298 <https://github.com/numpy/numpy/pull/20298>`__: BUG, SIMD: Workaround broadcasting SIMD 64-bit integers on MSVC...
 * `#20300 <https://github.com/numpy/numpy/pull/20300>`__: REL: Prepare for the NumPy 1.21.4 release.
-* `#20302 <https://github.com/numpy/numpy/pull/20302>`__: TST: Fix a `Arrayterator` typing test failure
+* `#20302 <https://github.com/numpy/numpy/pull/20302>`__: TST: Fix a ``Arrayterator`` typing test failure
diff --git a/doc/source/release/1.21.5-notes.rst b/doc/source/release/1.21.5-notes.rst
deleted file mode 100644 (file)
index c69d267..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-.. currentmodule:: numpy
-
-==========================
-NumPy 1.21.5 Release Notes
-==========================
-
-NumPy 1.21.5 is a maintenance release that fixes a few bugs discovered after
-the 1.21.4 release and does some maintenance to extend the 1.21.x lifetime.
-The Python versions supported in this release are 3.7-3.10. If you want to
-compile your own version using gcc-11, you will need to use gcc-11.2+ to avoid
-problems.
-
-Contributors
-============
-
-A total of 7 people contributed to this release.  People with a "+" by their
-names contributed a patch for the first time.
-
-* Bas van Beek
-* Charles Harris
-* Matti Picus
-* Rohit Goswami
-* Ross Barnowski
-* Sayed Adel
-* Sebastian Berg
-
-Pull requests merged
-====================
-
-A total of 11 pull requests were merged for this release.
-
-* `#20357 <https://github.com/numpy/numpy/pull/20357>`__: MAINT: Do not forward ``__(deep)copy__`` calls of ``_GenericAlias``...
-* `#20462 <https://github.com/numpy/numpy/pull/20462>`__: BUG: Fix float16 einsum fastpaths using wrong tempvar
-* `#20463 <https://github.com/numpy/numpy/pull/20463>`__: BUG, DIST: Print os error message when the executable not exist
-* `#20464 <https://github.com/numpy/numpy/pull/20464>`__: BLD: Verify the ability to compile C++ sources before initiating...
-* `#20465 <https://github.com/numpy/numpy/pull/20465>`__: BUG: Force ``npymath` ` to respect ``npy_longdouble``
-* `#20466 <https://github.com/numpy/numpy/pull/20466>`__: BUG: Fix failure to create aligned, empty structured dtype
-* `#20467 <https://github.com/numpy/numpy/pull/20467>`__: ENH: provide a convenience function to replace npy_load_module
-* `#20495 <https://github.com/numpy/numpy/pull/20495>`__: MAINT: update wheel to version that supports python3.10
-* `#20497 <https://github.com/numpy/numpy/pull/20497>`__: BUG: Clear errors correctly in F2PY conversions
-* `#20613 <https://github.com/numpy/numpy/pull/20613>`__: DEV: add a warningfilter to fix pytest workflow.
-* `#20618 <https://github.com/numpy/numpy/pull/20618>`__: MAINT: Help boost::python libraries at least not crash
diff --git a/doc/source/release/1.21.6-notes.rst b/doc/source/release/1.21.6-notes.rst
deleted file mode 100644 (file)
index 6683969..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-.. currentmodule:: numpy
-
-==========================
-NumPy 1.21.6 Release Notes
-==========================
-
-NumPy 1.21.6 is a very small release that achieves two things:
-
-- Backs out the mistaken backport of C++ code into 1.21.5.
-- Provides a 32 bit Windows wheel for Python 3.10.
-
-The provision of the 32 bit wheel is intended to make life easier
-for oldest-supported-numpy.
diff --git a/doc/source/release/1.22.0-notes.rst b/doc/source/release/1.22.0-notes.rst
new file mode 100644 (file)
index 0000000..08c74d9
--- /dev/null
@@ -0,0 +1,458 @@
+.. currentmodule:: numpy
+
+==========================
+NumPy 1.22.0 Release Notes
+==========================
+NumPy 1.22.0 is a big release featuring the work of 153 contributers spread
+over 609 pull requests. There have been many improvements, highlights are:
+
+* Annotations of the main namespace are essentially complete. Upstream is a
+  moving target, so there will likely be further improvements, but the major
+  work is done. This is probably the most user visible enhancement in this
+  release.
+* A preliminary version of the proposed Array-API is provided. This is a step
+  in creating a standard collection of functions that can be used across
+  applications such as CuPy and JAX.
+* NumPy now has a DLPack backend. DLPack provides a common interchange format
+  for array (tensor) data.
+* New methods for ``quantile``, ``percentile``, and related functions. The new
+  methods provide a complete set of the methods commonly found in the
+  literature.
+* A new configurable allocator for use by downstream projects.
+* The universal functions have been refactored to implement most of
+  :ref:`NEP 43 <NEP43>`.  This also unlocks the ability to experiment with the
+  future DType API.
+
+These are in addition to the ongoing work to provide SIMD support for commonly
+used functions, improvements to F2PY, and better documentation.
+
+The Python versions supported in this release are 3.8-3.10, Python 3.7 has been
+dropped. Note that 32 bit wheels are only provided for Python 3.8 and 3.9 on
+Windows, all other wheels are 64 bits on account of Ubuntu, Fedora, and other
+Linux distributions dropping 32 bit support. All 64 bit wheels are also linked
+with 64 bit integer OpenBLAS, which should fix the occasional problems
+encountered by folks using truly huge arrays.
+
+
+Expired deprecations
+====================
+
+Deprecated numeric style dtype strings have been removed
+--------------------------------------------------------
+Using the strings ``"Bytes0"``, ``"Datetime64"``, ``"Str0"``, ``"Uint32"``,
+and ``"Uint64"`` as a dtype will now raise a ``TypeError``.
+
+(`gh-19539 <https://github.com/numpy/numpy/pull/19539>`__)
+
+Expired deprecations for ``loads``, ``ndfromtxt``, and ``mafromtxt`` in npyio
+-----------------------------------------------------------------------------
+``numpy.loads`` was deprecated in v1.15, with the recommendation that users use
+``pickle.loads`` instead.  ``ndfromtxt`` and ``mafromtxt`` were both deprecated
+in v1.17 - users should use ``numpy.genfromtxt`` instead with the appropriate
+value for the ``usemask`` parameter.
+
+(`gh-19615 <https://github.com/numpy/numpy/pull/19615>`__)
+
+
+Deprecations
+============
+
+Use delimiter rather than delimitor as kwarg in mrecords
+--------------------------------------------------------
+The misspelled keyword argument ``delimitor`` of
+``numpy.ma.mrecords.fromtextfile()`` has been changed to ``delimiter``, using
+it will emit a deprecation warning.
+
+(`gh-19921 <https://github.com/numpy/numpy/pull/19921>`__)
+
+Passing boolean ``kth`` values to (arg-)partition has been deprecated
+---------------------------------------------------------------------
+``numpy.partition`` and ``numpy.argpartition`` would previously accept boolean
+values for the ``kth`` parameter, which would subsequently be converted into
+integers. This behavior has now been deprecated.
+
+(`gh-20000 <https://github.com/numpy/numpy/pull/20000>`__)
+
+The ``np.MachAr`` class has been deprecated
+-------------------------------------------
+The ``numpy.MachAr`` class and ``finfo.machar <numpy.finfo>`` attribute have
+been deprecated. Users are encouraged to access the property if interest
+directly from the corresponding ``numpy.finfo`` attribute.
+
+(`gh-20201 <https://github.com/numpy/numpy/pull/20201>`__)
+
+
+Compatibility notes
+===================
+
+Distutils forces strict floating point model on clang
+-----------------------------------------------------
+NumPy now sets the ``-ftrapping-math`` option on clang to enforce correct
+floating point error handling for universal functions.  Clang defaults to
+non-IEEE and C99 conform behaviour otherwise.  This change (using the
+equivalent but newer ``-ffp-exception-behavior=strict``) was attempted in NumPy
+1.21, but was effectively never used.
+
+(`gh-19479 <https://github.com/numpy/numpy/pull/19479>`__)
+
+Removed floor division support for complex types
+------------------------------------------------
+Floor division of complex types will now result in a ``TypeError``
+
+.. code-block:: python
+
+    >>> a = np.arange(10) + 1j* np.arange(10)
+    >>> a // 1
+    TypeError: ufunc 'floor_divide' not supported for the input types...
+
+(`gh-19135 <https://github.com/numpy/numpy/pull/19135>`__)
+
+``numpy.vectorize`` functions now produce the same output class as the base function
+------------------------------------------------------------------------------------
+When a function that respects ``numpy.ndarray`` subclasses is vectorized using
+``numpy.vectorize``, the vectorized function will now be subclass-safe also for
+cases that a signature is given (i.e., when creating a ``gufunc``): the output
+class will be the same as that returned by the first call to the underlying
+function.
+
+(`gh-19356 <https://github.com/numpy/numpy/pull/19356>`__)
+
+Python 3.7 is no longer supported
+---------------------------------
+Python support has been dropped. This is rather strict, there are changes that
+require Python >= 3.8.
+
+(`gh-19665 <https://github.com/numpy/numpy/pull/19665>`__)
+
+str/repr of complex dtypes now include space after punctuation
+--------------------------------------------------------------
+The repr of ``np.dtype({"names": ["a"], "formats": [int], "offsets": [2]})`` is
+now ``dtype({'names': ['a'], 'formats': ['<i8'], 'offsets': [2], 'itemsize':
+10})``, whereas spaces where previously omitted after colons and between
+fields.
+
+The old behavior can be restored via ``np.set_printoptions(legacy="1.21")``.
+
+(`gh-19687 <https://github.com/numpy/numpy/pull/19687>`__)
+
+Corrected ``advance`` in ``PCG64DSXM`` and ``PCG64``
+----------------------------------------------------
+Fixed a bug in the ``advance`` method of ``PCG64DSXM`` and ``PCG64``. The bug
+only affects results when the step was larger than :math:`2^{64}` on platforms
+that do not support 128-bit integers(e.g., Windows and 32-bit Linux).
+
+(`gh-20049 <https://github.com/numpy/numpy/pull/20049>`__)
+
+Change in generation of random 32 bit floating point variates
+-------------------------------------------------------------
+There was bug in the generation of 32 bit floating point values from the
+uniform distribution that would result in the least significant bit of the
+random variate always being 0.  This has been fixed.
+
+This change affects the variates produced by the ``random.Generator`` methods
+``random``, ``standard_normal``, ``standard_exponential``, and
+``standard_gamma``, but only when the dtype is specified as ``numpy.float32``.
+
+(`gh-20314 <https://github.com/numpy/numpy/pull/20314>`__)
+
+
+C API changes
+=============
+
+Masked inner-loops cannot be customized anymore
+-----------------------------------------------
+The masked inner-loop selector is now never used.  A warning will be given in
+the unlikely event that it was customized.
+
+We do not expect that any code uses this.  If you do use it, you must unset the
+selector on newer NumPy version.  Please also contact the NumPy developers, we
+do anticipate providing a new, more specific, mechanism.
+
+The customization was part of a never-implemented feature to allow for faster
+masked operations.
+
+(`gh-19259 <https://github.com/numpy/numpy/pull/19259>`__)
+
+Experimental exposure of future DType and UFunc API
+---------------------------------------------------
+The new header ``experimental_public_dtype_api.h`` allows to experiment with
+future API for improved universal function and especially user DType support.
+At this time it is advisable to experiment using the development version
+of NumPy since some changes are expected and new features will be unlocked.
+
+(`gh-19919 <https://github.com/numpy/numpy/pull/19919>`__)
+
+
+New Features
+============
+
+NEP 49 configurable allocators
+------------------------------
+As detailed in `NEP 49`_, the function used for allocation of the data segment
+of a ndarray can be changed. The policy can be set globally or in a context.
+For more information see the NEP and the :ref:`data_memory` reference docs.
+Also add a ``NUMPY_WARN_IF_NO_MEM_POLICY`` override to warn on dangerous use
+of transfering ownership by setting ``NPY_ARRAY_OWNDATA``.
+
+.. _`NEP 49`: https://numpy.org/neps/nep-0049.html
+
+(`gh-17582 <https://github.com/numpy/numpy/pull/17582>`__)
+
+Implementation of the NEP 47 (adopting the array API standard)
+--------------------------------------------------------------
+An initial implementation of `NEP 47`_ (adoption the array API standard) has
+been added as ``numpy.array_api``. The implementation is experimental and will
+issue a UserWarning on import, as the `array API standard
+<https://data-apis.org/array-api/latest/index.html>`_ is still in draft state.
+``numpy.array_api`` is a conforming implementation of the array API standard,
+which is also minimal, meaning that only those functions and behaviors that are
+required by the standard are implemented (see the NEP for more info).
+Libraries wishing to make use of the array API standard are encouraged to use
+``numpy.array_api`` to check that they are only using functionality that is
+guaranteed to be present in standard conforming implementations.
+
+.. _`NEP 47`: https://numpy.org/neps/nep-0047-array-api-standard.html
+
+(`gh-18585 <https://github.com/numpy/numpy/pull/18585>`__)
+
+Generate C/C++ API reference documentation from comments blocks is now possible
+-------------------------------------------------------------------------------
+This feature depends on Doxygen_ in the generation process and on Breathe_ to
+integrate it with Sphinx.
+
+.. _`Doxygen`: https://www.doxygen.nl/index.html
+.. _`Breathe`: https://breathe.readthedocs.io/en/latest/
+
+(`gh-18884 <https://github.com/numpy/numpy/pull/18884>`__)
+
+Assign the platform-specific ``c_intp`` precision via a mypy plugin
+-------------------------------------------------------------------
+The mypy_ plugin, introduced in `numpy/numpy#17843`_, has again been expanded:
+the plugin now is now responsible for setting the platform-specific precision
+of ``numpy.ctypeslib.c_intp``, the latter being used as data type for various
+``numpy.ndarray.ctypes`` attributes.
+
+Without the plugin, aforementioned type will default to ``ctypes.c_int64``.
+
+To enable the plugin, one must add it to their mypy `configuration file`_:
+
+.. code-block:: ini
+
+    [mypy]
+    plugins = numpy.typing.mypy_plugin
+
+
+.. _mypy: http://mypy-lang.org/
+.. _configuration file: https://mypy.readthedocs.io/en/stable/config_file.html
+.. _`numpy/numpy#17843`: https://github.com/numpy/numpy/pull/17843
+
+(`gh-19062 <https://github.com/numpy/numpy/pull/19062>`__)
+
+Add NEP 47-compatible dlpack support
+------------------------------------
+Add a ``ndarray.__dlpack__()`` method which returns a ``dlpack`` C structure
+wrapped in a ``PyCapsule``. Also add a ``np._from_dlpack(obj)`` function, where
+``obj`` supports ``__dlpack__()``, and returns an ``ndarray``.
+
+(`gh-19083 <https://github.com/numpy/numpy/pull/19083>`__)
+
+``keepdims`` optional argument added to ``numpy.argmin``, ``numpy.argmax``
+--------------------------------------------------------------------------
+``keepdims`` argument is added to ``numpy.argmin``, ``numpy.argmax``.  If set
+to ``True``, the axes which are reduced are left in the result as dimensions
+with size one.  The resulting array has the same number of dimensions and will
+broadcast with the input array.
+
+(`gh-19211 <https://github.com/numpy/numpy/pull/19211>`__)
+
+``bit_count`` to compute the number of 1-bits in an integer
+-----------------------------------------------------------
+Computes the number of 1-bits in the absolute value of the input.
+This works on all the numpy integer types. Analogous to the builtin
+``int.bit_count`` or ``popcount`` in C++.
+
+.. code-block:: python
+
+    >>> np.uint32(1023).bit_count()
+    10
+    >>> np.int32(-127).bit_count()
+    7
+
+(`gh-19355 <https://github.com/numpy/numpy/pull/19355>`__)
+
+The ``ndim`` and ``axis`` attributes have been added to ``numpy.AxisError``
+---------------------------------------------------------------------------
+The ``ndim`` and ``axis`` parameters are now also stored as attributes
+within each ``numpy.AxisError`` instance.
+
+(`gh-19459 <https://github.com/numpy/numpy/pull/19459>`__)
+
+Preliminary support for ``windows/arm64`` target
+------------------------------------------------
+``numpy`` added support for windows/arm64 target. Please note ``OpenBLAS``
+support is not yet available for windows/arm64 target.
+
+(`gh-19513 <https://github.com/numpy/numpy/pull/19513>`__)
+
+Added support for LoongArch
+---------------------------
+LoongArch is a new instruction set, numpy compilation failure on LoongArch
+architecture, so add the commit.
+
+(`gh-19527 <https://github.com/numpy/numpy/pull/19527>`__)
+
+A ``.clang-format`` file has been added
+---------------------------------------
+Clang-format is a C/C++ code formatter, together with the added
+``.clang-format`` file, it produces code close enough to the NumPy
+C_STYLE_GUIDE for general use. Clang-format version 12+ is required due to the
+use of several new features, it is available in Fedora 34 and Ubuntu Focal
+among other distributions.
+
+(`gh-19754 <https://github.com/numpy/numpy/pull/19754>`__)
+
+``is_integer`` is now available to ``numpy.floating`` and ``numpy.integer``
+---------------------------------------------------------------------------
+Based on its counterpart in Python ``float`` and ``int``, the numpy floating
+point and integer types now support ``float.is_integer``. Returns ``True`` if
+the number is finite with integral value, and ``False`` otherwise.
+
+.. code-block:: python
+
+    >>> np.float32(-2.0).is_integer()
+    True
+    >>> np.float64(3.2).is_integer()
+    False
+    >>> np.int32(-2).is_integer()
+    True
+
+(`gh-19803 <https://github.com/numpy/numpy/pull/19803>`__)
+
+Symbolic parser for Fortran dimension specifications
+----------------------------------------------------
+A new symbolic parser has been added to f2py in order to correctly parse
+dimension specifications. The parser is the basis for future improvements and
+provides compatibility with Draft Fortran 202x.
+
+(`gh-19805 <https://github.com/numpy/numpy/pull/19805>`__)
+
+``ndarray``, ``dtype`` and ``number`` are now runtime-subscriptable
+-------------------------------------------------------------------
+Mimicking :pep:`585`, the ``numpy.ndarray``, ``numpy.dtype`` and
+``numpy.number`` classes are now subscriptable for python 3.9 and later.
+Consequently, expressions that were previously only allowed in .pyi stub files
+or with the help of ``from __future__ import annotations`` are now also legal
+during runtime.
+
+.. code-block:: python
+
+    >>> import numpy as np
+    >>> from typing import Any
+
+    >>> np.ndarray[Any, np.dtype[np.float64]]
+    numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]
+
+(`gh-19879 <https://github.com/numpy/numpy/pull/19879>`__)
+
+
+Improvements
+============
+
+``ctypeslib.load_library`` can now take any path-like object
+------------------------------------------------------------
+All parameters in the can now take any :term:`python:path-like object`.
+This includes the likes of strings, bytes and objects implementing the
+:meth:`__fspath__<os.PathLike.__fspath__>` protocol.
+
+(`gh-17530 <https://github.com/numpy/numpy/pull/17530>`__)
+
+Add ``smallest_normal`` and ``smallest_subnormal`` attributes to ``finfo``
+--------------------------------------------------------------------------
+The attributes ``smallest_normal`` and ``smallest_subnormal`` are available as
+an extension of ``finfo`` class for any floating-point data type. To use these
+new attributes, write ``np.finfo(np.float64).smallest_normal`` or
+``np.finfo(np.float64).smallest_subnormal``.
+
+(`gh-18536 <https://github.com/numpy/numpy/pull/18536>`__)
+
+``numpy.linalg.qr`` accepts stacked matrices as inputs
+------------------------------------------------------
+``numpy.linalg.qr`` is able to produce results for stacked matrices as inputs.
+Moreover, the implementation of QR decomposition has been shifted to C from
+Python.
+
+(`gh-19151 <https://github.com/numpy/numpy/pull/19151>`__)
+
+``numpy.fromregex`` now accepts ``os.PathLike`` implementations
+---------------------------------------------------------------
+``numpy.fromregex`` now accepts objects implementing the ``__fspath__<os.PathLike>``
+protocol, *e.g.* ``pathlib.Path``.
+
+(`gh-19680 <https://github.com/numpy/numpy/pull/19680>`__)
+
+Add new methods for ``quantile`` and ``percentile``
+---------------------------------------------------
+``quantile`` and ``percentile`` now have have a ``method=`` keyword argument
+supporting 13 different methods.  This replaces the ``interpolation=`` keyword
+argument.
+
+The methods are now aligned with nine methods which can be found in scientific
+literature and the R language.  The remaining methods are the previous
+discontinuous variations of the default "linear" one.
+
+Please see the documentation of ``numpy.percentile`` for more information.
+
+(`gh-19857 <https://github.com/numpy/numpy/pull/19857>`__)
+
+Missing parameters have been added to the ``nan<x>`` functions
+--------------------------------------------------------------
+A number of the ``nan<x>`` functions previously lacked parameters that were
+present in their ``<x>``-based counterpart, *e.g.* the ``where`` parameter was
+present in ``numpy.mean`` but absent from ``numpy.nanmean``.
+
+The following parameters have now been added to the ``nan<x>`` functions:
+
+* nanmin: ``initial`` & ``where``
+* nanmax: ``initial`` & ``where``
+* nanargmin: ``keepdims`` & ``out``
+* nanargmax: ``keepdims`` & ``out``
+* nansum: ``initial`` & ``where``
+* nanprod: ``initial`` & ``where``
+* nanmean: ``where``
+* nanvar: ``where``
+* nanstd: ``where``
+
+(`gh-20027 <https://github.com/numpy/numpy/pull/20027>`__)
+
+Annotating the main Numpy namespace
+-----------------------------------
+Starting from the 1.20 release, PEP 484 type annotations have been included for
+parts of the NumPy library; annotating the remaining functions being a work in
+progress. With the release of 1.22 this process has been completed for the main
+NumPy namespace, which is now fully annotated.
+
+Besides the main namespace, a limited number of sub-packages contain
+annotations as well. This includes, among others, ``numpy.testing``,
+``numpy.linalg`` and ``numpy.random`` (available since 1.21).
+
+(`gh-20217 <https://github.com/numpy/numpy/pull/20217>`__)
+
+Vectorize umath module using AVX-512
+-------------------------------------
+By leveraging Intel Short Vector Math Library (SVML), 18 umath functions
+(``exp2``, ``log2``, ``log10``, ``expm1``, ``log1p``, ``cbrt``, ``sin``,
+``cos``, ``tan``, ``arcsin``, ``arccos``, ``arctan``, ``sinh``, ``cosh``,
+``tanh``, ``arcsinh``, ``arccosh``, ``arctanh``) are vectorized using AVX-512
+instruction set for both single and double precision implementations.  This
+change is currently enabled only for Linux users and on processors with AVX-512
+instruction set.  It provides an average speed up of 32x and 14x for single and
+double precision functions respectively.
+
+(`gh-19478 <https://github.com/numpy/numpy/pull/19478>`__)
+
+OpenBLAS v0.3.17
+----------------
+Update the OpenBLAS used in testing and in wheels to v0.3.17
+
+(`gh-19462 <https://github.com/numpy/numpy/pull/19462>`__)
+
index 80c39f8bc69269e29e03fd629d0e2be0446aa0a6..65a471b9212510d4d2ecd7283c3675383c236b30 100644 (file)
@@ -33,7 +33,7 @@ Future Changes
 
 
 The Datetime64 type remains experimental in this release. In 1.9 there will
-probably be some changes to make it more useable.
+probably be some changes to make it more usable.
 
 The diagonal method currently returns a new array and raises a
 FutureWarning. In 1.9 it will return a readonly view.
@@ -315,8 +315,8 @@ If used with the `overwrite_input` option the array will now only be partially
 sorted instead of fully sorted.
 
 
-Overrideable operand flags in ufunc C-API
------------------------------------------
+Overridable operand flags in ufunc C-API
+----------------------------------------
 When creating a ufunc, the default ufunc operand flags can be overridden
 via the new op_flags attribute of the ufunc object. For example, to set
 the operand flag for the first input to read/write:
index 7ea29e354f93939eebf31ffb6e7127aa22e7144f..a19a05cb70b3d002eab5463596681f588c5e3432 100644 (file)
@@ -389,7 +389,7 @@ uses a per-state lock instead of the GIL.
 MaskedArray support for more complicated base classes
 -----------------------------------------------------
 Built-in assumptions that the baseclass behaved like a plain array are being
-removed. In particalur, ``repr`` and ``str`` should now work more reliably.
+removed. In particular, ``repr`` and ``str`` should now work more reliably.
 
 
 C-API
index ec3e232c8f35307ad65084de01b637213915b0eb..27e9e1f638c3af3f9b6297caefd94a5f5b089676 100644 (file)
@@ -6,7 +6,8 @@ NumPy: the absolute basics for beginners
 .. currentmodule:: numpy
 
 Welcome to the absolute beginner's guide to NumPy! If you have comments or
-suggestions, please don’t hesitate to reach out!
+suggestions, please don’t hesitate to `reach out
+<https://numpy.org/community/>`_!
 
 
 Welcome to NumPy!
@@ -37,8 +38,7 @@ Installing NumPy
 
 To install NumPy, we strongly recommend using a scientific Python distribution.
 If you're looking for the full instructions for installing NumPy on your
-operating system, you can `find all of the details here
-<https://www.scipy.org/install.html>`_.
+operating system, see `Installing NumPy <https://numpy.org/install/>`_.
 
 
 
@@ -56,10 +56,6 @@ thing about getting this distribution is the fact that you don’t need to worry
 too much about separately installing NumPy or any of the major packages that
 you’ll be using for your data analyses, like pandas, Scikit-Learn, etc.
 
-You can find all of the installation details in the
-`Installation <https://www.scipy.org/install.html>`_ section
-at `SciPy <https://www.scipy.org>`_.
-
 How to import NumPy
 -------------------
 
@@ -87,7 +83,11 @@ If you aren't familiar with this style, it's very easy to understand.
 If you see ``>>>``, you're looking at **input**, or the code that
 you would enter. Everything that doesn't have ``>>>`` in front of it
 is **output**, or the results of running your code. This is the style
-you see when you run ``python`` on the command line, but if you're using IPython, you might see a different style.
+you see when you run ``python`` on the command line, but if you're using
+IPython, you might see a different style. Note that it is not part of the
+code and will cause an error if typed or pasted into the Python
+shell. It can be safely typed or pasted into the IPython shell; the ``>>>``
+is ignored.
 
 
 What’s the difference between a Python list and a NumPy array?
@@ -391,7 +391,7 @@ this array to an array with three rows and two columns::
 
 With ``np.reshape``, you can specify a few optional parameters::
 
-  >>> numpy.reshape(a, newshape=(1, 6), order='C')
+  >>> np.reshape(a, newshape=(1, 6), order='C')
   array([[0, 1, 2, 3, 4, 5]])
 
 ``a`` is the array to be reshaped.
@@ -613,7 +613,7 @@ How to create an array from existing data
 
 -----
 
-You can easily use create a new array from a section of an existing array.
+You can easily create a new array from a section of an existing array.
 
 Let's say you have this array:
 
@@ -899,12 +899,18 @@ You can aggregate matrices the same way you aggregated vectors::
 .. image:: images/np_matrix_aggregation.png
 
 You can aggregate all the values in a matrix and you can aggregate them across
-columns or rows using the ``axis`` parameter::
+columns or rows using the ``axis`` parameter. To illustrate this point, let's
+look at a slightly modified dataset::
 
+  >>> data = np.array([[1, 2], [5, 3], [4, 6]])
+  >>> data
+  array([[1, 2],
+         [5, 3],
+         [4, 6]])
   >>> data.max(axis=0)
   array([5, 6])
   >>> data.max(axis=1)
-  array([2, 4, 6])
+  array([2, 5, 6])
 
 .. image:: images/np_matrix_aggregation_row.png
 
@@ -1583,7 +1589,7 @@ If you created this array "a" ::
 
 .. for doctests
    The continuous integration truncates dataframe display without this setting.
-   >>> pd.set_option('display.max_columns', 10)
+   >>> pd.set_option('max_columns', 10)
 
 You could create a Pandas dataframe ::
 
index 5eae3eb3295a371282653def47a9cedba67d617b..ca299085aeed4582aeab9019351d01a3b93072e2 100644 (file)
@@ -1,22 +1,15 @@
 .. _basics.broadcasting:
+.. _array-broadcasting-in-numpy:
 
 ************
 Broadcasting
 ************
 
 .. seealso::
-    :class:`numpy.broadcast`
+    :class:`numpy.broadcast`   
 
-    :ref:`array-broadcasting-in-numpy`
-        An introduction to the concepts discussed here
 
-.. note::
-    See `this article
-    <https://numpy.org/devdocs/user/theory.broadcasting.html>`_
-    for illustrations of broadcasting concepts.
-
-
-The term broadcasting describes how numpy treats arrays with different
+The term broadcasting describes how NumPy treats arrays with different
 shapes during arithmetic operations. Subject to certain constraints,
 the smaller array is "broadcast" across the larger array so that they
 have compatible shapes. Broadcasting provides a means of vectorizing
@@ -47,15 +40,29 @@ array([ 2.,  4.,  6.])
 The result is equivalent to the previous example where ``b`` was an array.
 We can think of the scalar ``b`` being *stretched* during the arithmetic
 operation into an array with the same shape as ``a``. The new elements in
-``b`` are simply copies of the original scalar. The stretching analogy is
+``b``, as shown in :ref:`broadcasting.figure-1`, are simply copies of the
+original scalar. The stretching analogy is
 only conceptual.  NumPy is smart enough to use the original scalar value
 without actually making copies so that broadcasting operations are as
 memory and computationally efficient as possible.
 
+.. figure:: broadcasting_1.svg
+    :alt: A scalar is broadcast to match the shape of the 1-d array it
+          is being multiplied to.
+    :name: broadcasting.figure-1
+
+    *Figure 1*
+
+    *In the simplest example of broadcasting, the scalar* ``b`` *is
+    stretched to become an array of same shape as* ``a`` *so the shapes
+    are compatible for element-by-element multiplication.*
+
 The code in the second example is more efficient than that in the first
 because broadcasting moves less memory around during the multiplication
 (``b`` is a scalar rather than an array).
 
+.. _general-broadcasting-rules:
+
 General Broadcasting Rules
 ==========================
 When operating on two arrays, NumPy compares their shapes element-wise.
@@ -93,6 +100,32 @@ operation::
   B      (3d array):      7 x 1 x 5
   Result (4d array):  8 x 7 x 6 x 5
 
+
+.. _arrays.broadcasting.broadcastable:
+
+Broadcastable arrays
+====================
+
+.. index:: broadcastable
+
+A set of arrays is called "broadcastable" to the same shape if
+the above rules produce a valid result.
+
+For example, if ``a.shape`` is (5,1), ``b.shape`` is (1,6), ``c.shape`` is (6,)
+and ``d.shape`` is () so that *d* is a scalar, then *a*, *b*, *c*,
+and *d* are all broadcastable to dimension (5,6); and
+
+- *a* acts like a (5,6) array where ``a[:,0]`` is broadcast to the other
+  columns,
+
+- *b* acts like a (5,6) array where ``b[0,:]`` is broadcast
+  to the other rows,
+
+- *c* acts like a (1,6) array and therefore like a (5,6) array
+  where ``c[:]`` is broadcast to every row, and finally,
+
+- *d* acts like a (5,6) array where the single value is repeated.
+
 Here are some more examples::
 
   A      (2d array):  5 x 4
@@ -123,50 +156,50 @@ Here are examples of shapes that do not broadcast::
   A      (2d array):      2 x 1
   B      (3d array):  8 x 4 x 3 # second from last dimensions mismatched
 
-An example of broadcasting in practice::
+An example of broadcasting when a 1-d array is added to a 2-d array::
 
- >>> x = np.arange(4)
- >>> xx = x.reshape(4,1)
- >>> y = np.ones(5)
>>> z = np.ones((3,4))
-
- >>> x.shape
- (4,)
-
- >>> y.shape
(5,)
-
- >>> x + y
- ValueError: operands could not be broadcast together with shapes (4,) (5,)
-
- >>> xx.shape
- (4, 1)
-
- >>> y.shape
- (5,)
-
- >>> (xx + y).shape
- (4, 5)
-
- >>> xx + y
- array([[ 1.,  1.,  1.,  1.,  1.],
-        [ 2.,  2.,  2.,  2.,  2.],
-        [ 3.,  3.,  3.,  3.,  3.],
-        [ 4.,  4.,  4.,  4.,  4.]])
-
- >>> x.shape
- (4,)
-
- >>> z.shape
- (3, 4)
-
- >>> (x + z).shape
- (3, 4)
-
- >>> x + z
- array([[ 1.,  2.,  3.,  4.],
-        [ 1.,  2.,  3.,  4.],
-        [ 1.,  2.,  3.,  4.]])
+  >>> a = array([[ 0.0,  0.0,  0.0],
+  ...            [10.0, 10.0, 10.0],
+  ...            [20.0, 20.0, 20.0],
 ...            [30.0, 30.0, 30.0]])
+  >>> b = array([1.0, 2.0, 3.0])
+  >>> a + b
+  array([[  1.,   2.,   3.],
+          [ 11.,  12.,  13.],
+          [ 21.,  22.,  23.],
         [ 31.,  32.,  33.]])
+  >>> b = array([1.0, 2.0, 3.0, 4.0])
+  >>> a + b 
+  Traceback (most recent call last):
+  ValueError: operands could not be broadcast together with shapes (4,3) (4,)
+
+As shown in :ref:`broadcasting.figure-2`, ``b`` is added to each row of ``a``.
+In :ref:`broadcasting.figure-3`, an exception is raised because of the
+incompatible shapes.
+
+.. figure:: broadcasting_2.svg
+    :alt: A 1-d array with shape (3) is strectched to match the 2-d array of
+          shape (4, 3) it is being added to, and the result is a 2-d array of shape
+          (4, 3).
+    :name: broadcasting.figure-2
+
+    *Figure 2*
+
+    *A one dimensional array added to a two dimensional array results in
+    broadcasting if number of 1-d array elements matches the number of 2-d
+    array columns.*
+
+.. figure:: broadcasting_3.svg
+    :alt: A huge cross over the 2-d array of shape (4, 3) and the 1-d array
+          of shape (4) shows that they can not be broadcast due to mismatch
+          of shapes and thus produce no result.
+    :name: broadcasting.figure-3
+
+    *Figure 3*
+
+    *When the trailing dimensions of the arrays are unequal, broadcasting fails
+    because it is impossible to align the values in the rows of the 1st array
+    with the elements of the 2nd arrays for element-by-element addition.*
 
 Broadcasting provides a convenient way of taking the outer product (or
 any other outer operation) of two arrays. The following example shows an
@@ -180,8 +213,94 @@ outer addition operation of two 1-d arrays::
          [ 21.,  22.,  23.],
          [ 31.,  32.,  33.]])
 
+.. figure:: broadcasting_4.svg
+    :alt: A 2-d array of shape (4, 1) and a 1-d array of shape (3) are
+          stretched to match their shapes and produce a resultant array
+          of shape (4, 3).
+    :name: broadcasting.figure-4
+
+    *Figure 4*
+
+    *In some cases, broadcasting stretches both arrays to form an output array
+    larger than either of the initial arrays.*
+
 Here the ``newaxis`` index operator inserts a new axis into ``a``,
 making it a two-dimensional ``4x1`` array.  Combining the ``4x1`` array
 with ``b``, which has shape ``(3,)``, yields a ``4x3`` array.
 
-
+A Practical Example: Vector Quantization
+========================================
+
+Broadcasting comes up quite often in real world problems. A typical example
+occurs in the vector quantization (VQ) algorithm used in information theory,
+classification, and other related areas. The basic operation in VQ finds
+the closest point in a set of points, called ``codes`` in VQ jargon, to a given
+point, called the ``observation``. In the very simple, two-dimensional case
+shown below, the values in ``observation`` describe the weight and height of an
+athlete to be classified. The ``codes`` represent different classes of
+athletes. [#f1]_ Finding the closest point requires calculating the distance
+between observation and each of the codes. The shortest distance provides the
+best match. In this example, ``codes[0]`` is the closest class indicating that
+the athlete is likely a basketball player.
+
+  >>> from numpy import array, argmin, sqrt, sum
+  >>> observation = array([111.0, 188.0])
+  >>> codes = array([[102.0, 203.0],
+  ...                [132.0, 193.0],
+  ...                [45.0, 155.0],
+  ...                [57.0, 173.0]])
+  >>> diff = codes - observation    # the broadcast happens here
+  >>> dist = sqrt(sum(diff**2,axis=-1))
+  >>> argmin(dist)
+  0
+
+In this example, the ``observation`` array is stretched to match
+the shape of the ``codes`` array::
+
+  Observation      (1d array):      2
+  Codes            (2d array):  4 x 2
+  Diff             (2d array):  4 x 2
+
+.. figure:: broadcasting_5.svg
+    :alt: A height versus weight graph that shows data of a female
+          gymnast, marathon runner, basketball player, football
+          lineman and the athlete to be classified. Shortest distance
+          is found between the basketball player and the athlete
+          to be classified. 
+    :name: broadcasting.figure-5
+
+    *Figure 5*
+
+    *The basic operation of vector quantization calculates the distance between
+    an object to be classified, the dark square, and multiple known codes, the
+    gray circles. In this simple case, the codes represent individual classes.
+    More complex cases use multiple codes per class.*
+
+Typically, a large number of ``observations``, perhaps read from a database,
+are compared to a set of ``codes``. Consider this scenario::
+
+  Observation      (2d array):      10 x 3
+  Codes            (2d array):       5 x 3
+  Diff             (3d array):  5 x 10 x 3 
+
+The three-dimensional array, ``diff``, is a consequence of broadcasting, not a
+necessity for the calculation. Large data sets will generate a large
+intermediate array that is computationally inefficient. Instead, if each
+observation is calculated individually using a Python loop around the code
+in the two-dimensional example above, a much smaller array is used.
+
+Broadcasting is a powerful tool for writing short and usually intuitive code
+that does its computations very efficiently in C. However, there are cases
+when broadcasting uses unnecessarily large amounts of memory for a particular
+algorithm. In these cases, it is better to write the algorithm's outer loop in
+Python. This may also produce more readable code, as algorithms that use
+broadcasting tend to become more difficult to interpret as the number of
+dimensions in the broadcast increases.
+
+.. rubric:: Footnotes
+
+.. [#f1]
+    In this example, weight has more impact on the distance calculation
+    than height because of the larger values. In practice, it is important to
+    normalize the height and weight, often by their standard deviation across the
+    data set, so that both have equal influence on the distance calculation.
diff --git a/doc/source/user/basics.copies.rst b/doc/source/user/basics.copies.rst
new file mode 100644 (file)
index 0000000..583a59b
--- /dev/null
@@ -0,0 +1,152 @@
+.. _basics.copies-and-views:
+
+****************
+Copies and views
+****************
+
+When operating on NumPy arrays, it is possible to access the internal data
+buffer directly using a :ref:`view <view>` without copying data around. This
+ensures good performance but can also cause unwanted problems if the user is
+not aware of how this works. Hence, it is important to know the difference
+between these two terms and to know which operations return copies and
+which return views.
+
+The NumPy array is a data structure consisting of two parts:
+the :term:`contiguous` data buffer with the actual data elements and the
+metadata that contains information about the data buffer. The metadata
+includes data type, strides, and other important information that helps
+manipulate the :class:`.ndarray` easily. See the :ref:`numpy-internals`
+section for a detailed look.
+
+.. _view:
+
+View
+====
+
+It is possible to access the array differently by just changing certain
+metadata like :term:`stride` and :term:`dtype` without changing the
+data buffer. This creates a new way of looking at the data and these new
+arrays are called views. The data buffer remains the same, so any changes made
+to a view reflects in the original copy. A view can be forced through the
+:meth:`.ndarray.view` method.
+
+Copy
+====
+
+When a new array is created by duplicating the data buffer as well as the
+metadata, it is called a copy. Changes made to the copy
+do not reflect on the original array. Making a copy is slower and
+memory-consuming but sometimes necessary. A copy can be forced by using
+:meth:`.ndarray.copy`.
+
+Indexing operations
+===================
+
+.. seealso:: :ref:`basics.indexing`
+
+Views are created when elements can be addressed with offsets and strides
+in the original array. Hence, basic indexing always creates views.
+For example::
+
+    >>> x = np.arange(10)
+    >>> x
+    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
+    >>> y = x[1:3]  # creates a view
+    >>> y
+    array([1, 2])
+    >>> x[1:3] = [10, 11]
+    >>> x
+    array([ 0, 10, 11,  3,  4,  5,  6,  7,  8,  9])
+    >>> y
+    array([10, 11])  
+
+Here, ``y`` gets changed when ``x`` is changed because it is a view.
+
+:ref:`advanced-indexing`, on the other hand, always creates copies.
+For example::
+
+    >>> x = np.arange(9).reshape(3, 3)
+    >>> x
+    array([[0, 1, 2],
+           [3, 4, 5],
+           [6, 7, 8]])
+    >>> y = x[[1, 2]]
+    >>> y
+    array([[3, 4, 5],
+           [6, 7, 8]])
+    >>> y.base is None
+    True
+
+Here, ``y`` is a copy, as signified by the :attr:`base <.ndarray.base>`
+attribute. We can also confirm this by assigning new values to ``x[[1, 2]]``
+which in turn will not affect ``y`` at all::
+
+    >>> x[[1, 2]] = [[10, 11, 12], [13, 14, 15]]
+    >>> x
+    array([[ 0,  1,  2],
+           [10, 11, 12],
+           [13, 14, 15]])
+    >>> y
+    array([[3, 4, 5],
+           [6, 7, 8]])
+
+It must be noted here that during the assignment of ``x[[1, 2]]`` no view
+or copy is created as the assignment happens in-place. 
+
+
+Other operations
+================
+
+The :func:`numpy.reshape` function creates a view where possible or a copy
+otherwise. In most cases, the strides can be modified to reshape the
+array with a view. However, in some cases where the array becomes
+non-contiguous (perhaps after a :meth:`.ndarray.transpose` operation),
+the reshaping cannot be done by modifying strides and requires a copy.
+In these cases, we can raise an error by assigning the new shape to the
+shape attribute of the array. For example::
+
+    >>> x = np.ones((2, 3))
+    >>> y = x.T  # makes the array non-contiguous
+    >>> y
+    array([[1., 1.],
+           [1., 1.],
+           [1., 1.]])
+    >>> z = y.view()
+    >>> z.shape = 6
+    Traceback (most recent call last):
+       ...
+    AttributeError: Incompatible shape for in-place modification. Use
+    `.reshape()` to make a copy with the desired shape.
+
+Taking the example of another operation, :func:`.ravel` returns a contiguous
+flattened view of the array wherever possible. On the other hand,
+:meth:`.ndarray.flatten` always returns a flattened copy of the array.
+However, to guarantee a view in most cases, ``x.reshape(-1)`` may be preferable.
+
+How to tell if the array is a view or a copy
+============================================
+
+The :attr:`base <.ndarray.base>` attribute of the ndarray makes it easy
+to tell if an array is a view or a copy. The base attribute of a view returns
+the original array while it returns ``None`` for a copy.
+
+    >>> x = np.arange(9)
+    >>> x
+    array([0, 1, 2, 3, 4, 5, 6, 7, 8])
+    >>> y = x.reshape(3, 3)
+    >>> y
+    array([[0, 1, 2],
+           [3, 4, 5],
+           [6, 7, 8]])
+    >>> y.base  # .reshape() creates a view
+    array([0, 1, 2, 3, 4, 5, 6, 7, 8])
+    >>> z = y[[2, 1]]
+    >>> z
+    array([[6, 7, 8],
+           [3, 4, 5]])
+    >>> z.base is None  # advanced indexing creates a copy
+    True
+
+Note that the ``base`` attribute should not be used to determine
+if an ndarray object is *new*; only if it is a view or a copy
+of another ndarray.
\ No newline at end of file
index ccd6de184ce83855ef99025cf9c7333a67fab359..84ff1c30e1f0e90121195f86eca4f320bd9e4688 100644 (file)
@@ -37,8 +37,7 @@ respectively. Lists and tuples can define ndarray creation:
 
   >>> a1D = np.array([1, 2, 3, 4])
   >>> a2D = np.array([[1, 2], [3, 4]])
-  >>> a3D = np.array([[[1, 2], [3, 4]],
-                      [[5, 6], [7, 8]]])
+  >>> a3D = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
 
 When you use :func:`numpy.array` to define a new array, you should
 consider the :doc:`dtype <basics.types>` of the elements in the array,
@@ -59,8 +58,8 @@ in overflow. This feature can often be misunderstood. If you
 perform calculations with mismatching ``dtypes``, you can get unwanted
 results,  for example::
 
-    >>> a = array([2, 3, 4], dtype = np.uint32)
-    >>> b = array([5, 6, 7], dtype = np.uint32)
+    >>> a = np.array([2, 3, 4], dtype=np.uint32)
+    >>> b = np.array([5, 6, 7], dtype=np.uint32)
     >>> c_unsigned32 = a - b
     >>> print('unsigned c:', c_unsigned32, c_unsigned32.dtype)
     unsigned c: [4294967293 4294967293 4294967293] uint32
@@ -116,7 +115,7 @@ examples are shown::
 Note: best practice for :func:`numpy.arange` is to use integer start, end, and
 step values. There are some subtleties regarding ``dtype``. In the second
 example, the ``dtype`` is defined. In the third example, the array is
-``dtype=float`` to accomodate the step size of ``0.1``. Due to roundoff error,
+``dtype=float`` to accommodate the step size of ``0.1``. Due to roundoff error,
 the ``stop`` value is sometimes included. 
 
 :func:`numpy.linspace` will create arrays with a specified number of elements, and
@@ -173,11 +172,11 @@ list or tuple,
 routine is helpful in generating linear least squares models, as such::
  
  >>> np.vander(np.linspace(0, 2, 5), 2)
- array([[0.  , 0.  , 1.  ],
-        [0.25, 0.5 , 1.  ],
-        [1.  , 1.  , 1.  ],
-        [2.25, 1.5 , 1.  ],
-        [4.  , 2.  , 1.  ]])
+ array([[0. , 1. ],
+       [0.5, 1. ],
+       [1. , 1. ],
+       [1.5, 1. ],
+       [2. , 1. ]])
  >>> np.vander([1, 2, 3, 4], 2)
  array([[1, 1],
         [2, 1],
@@ -208,7 +207,7 @@ specified shape. The default dtype is ``float64``::
  array([[[0., 0.],
          [0., 0.],
          [0., 0.]],
-
+ <BLANKLINE>        
         [[0., 0.],
          [0., 0.],
          [0., 0.]]])
@@ -223,7 +222,7 @@ specified shape. The default dtype is ``float64``::
  array([[[1., 1.],
          [1., 1.],
          [1., 1.]],
-
+ <BLANKLINE>
         [[1., 1.],
          [1., 1.],
          [1., 1.]]])
@@ -235,7 +234,7 @@ library. Below, two arrays are created with shapes (2,3) and (2,3,2),
 respectively. The seed is set to 42 so you can reproduce these
 pseudorandom numbers::
 
- >>> import numpy.random.default_rng
+ >>> from numpy.random import default_rng
  >>> default_rng(42).random((2,3))
  array([[0.77395605, 0.43887844, 0.85859792],
         [0.69736803, 0.09417735, 0.97562235]])
@@ -275,7 +274,7 @@ following example::
  >>> b = a[:2]
  >>> b += 1
  >>> print('a =', a, '; b =', b)
- a = [2 3 3 4 5 6]; b = [2 3]
+ a = [2 3 3 4 5 6] ; b = [2 3]
 
 In this example, you did not create a new array. You created a variable,
 ``b`` that viewed the first 2 elements of ``a``. When you added 1 to ``b`` you
@@ -286,7 +285,7 @@ would get the same result by adding 1 to ``a[:2]``. If you want to create a
  >>> b = a[:2].copy()
  >>> b += 1
  >>> print('a = ', a, 'b = ', b)
- a =  [1 2 3 4 5 6] b =  [2 3]
+ a =  [1 2 3 4] b =  [2 3]
 
 For more information and examples look at :ref:`Copies and Views
 <quickstart.copies-and-views>`.
@@ -296,11 +295,10 @@ There are a number of routines to join existing arrays e.g. :func:`numpy.vstack`
 arrays into a 4-by-4 array using ``block``::
 
  >>> A = np.ones((2, 2))
- >>> B = np.eye((2, 2))
+ >>> B = np.eye(2, 2)
  >>> C = np.zeros((2, 2))
  >>> D = np.diag((-3, -4))
- >>> np.block([[A, B], 
-               [C, D]])
+ >>> np.block([[A, B], [C, D]])
  array([[ 1.,  1.,  1.,  0. ],
         [ 1.,  1.,  0.,  1. ],
         [ 0.,  0., -3.,  0. ],
index 7ee61b13007ff00e4d15665bbf332d5da69ef176..264c3d721f4f471977be763b6fa503420a1f83d3 100644 (file)
@@ -1,35 +1,43 @@
 .. _basics.indexing:
 
-********
-Indexing
-********
+****************************************
+Indexing on :class:`ndarrays <.ndarray>`
+****************************************
 
 .. seealso::
 
-   :ref:`Indexing <arrays.indexing>`
-
    :ref:`Indexing routines <routines.indexing>`
 
-Array indexing refers to any use of the square brackets ([]) to index
-array values. There are many options to indexing, which give NumPy
-indexing great power, but with power comes some complexity and the
-potential for confusion. This section is just an overview of the
-various options and issues related to indexing. Aside from single
-element indexing, the details on most of these options are to be
-found in related sections.
+.. sectionauthor:: adapted from "Guide to NumPy" by Travis E. Oliphant
+
+.. currentmodule:: numpy
+
+.. index:: indexing, slicing
 
-Assignment vs referencing
-=========================
+:class:`ndarrays <ndarray>` can be indexed using the standard Python
+``x[obj]`` syntax, where *x* is the array and *obj* the selection.
+There are different kinds of indexing available depending on *obj*:
+basic indexing, advanced indexing and field access.
 
 Most of the following examples show the use of indexing when
 referencing data in an array. The examples work just as well
-when assigning to an array. See the section at the end for
+when assigning to an array. See :ref:`assigning-values-to-indexed-arrays` for
 specific examples and explanations on how assignments work.
 
+Note that in Python, ``x[(exp1, exp2, ..., expN)]`` is equivalent to
+``x[exp1, exp2, ..., expN]``; the latter is just syntactic sugar
+for the former.
+
+
+Basic indexing
+--------------
+
+.. _single-element-indexing:
+
 Single element indexing
-=======================
+^^^^^^^^^^^^^^^^^^^^^^^
 
-Single element indexing for a 1-D array is what one expects. It work
+Single element indexing works
 exactly like that for other standard Python sequences. It is 0-based,
 and accepts negative indices for indexing from the end of the array. ::
 
@@ -39,14 +47,13 @@ and accepts negative indices for indexing from the end of the array. ::
     >>> x[-2]
     8
 
-Unlike lists and tuples, NumPy arrays support multidimensional indexing
-for multidimensional arrays. That means that it is not necessary to
+It is not necessary to
 separate each dimension's index into its own set of square brackets. ::
 
-    >>> x.shape = (2,5) # now x is 2-dimensional
-    >>> x[1,3]
+    >>> x.shape = (2, 5)  # now x is 2-dimensional
+    >>> x[1, 3]
     8
-    >>> x[1,-1]
+    >>> x[1, -1]
     9
 
 Note that if one indexes a multidimensional array with fewer indices
@@ -59,8 +66,9 @@ That is, each index specified selects the array corresponding to the
 rest of the dimensions selected. In the above example, choosing 0
 means that the remaining dimension of length 5 is being left unspecified,
 and that what is returned is an array of that dimensionality and size.
-It must be noted that the returned array is not a copy of the original,
-but points to the same values in memory as does the original array.
+It must be noted that the returned array is a :term:`view`, i.e., it is not a
+copy of the original, but points to the same values in memory as does the
+original array.
 In  this case, the 1-D array at the first position (0) is returned.
 So using a single index on the returned array, results in a single
 element being returned. That is: ::
@@ -68,304 +76,694 @@ element being returned. That is: ::
     >>> x[0][2]
     2
 
-So note that ``x[0,2] = x[0][2]`` though the second case is more
+So note that ``x[0, 2] == x[0][2]`` though the second case is more
 inefficient as a new temporary array is created after the first index
 that is subsequently indexed by 2.
 
-Note to those used to IDL or Fortran memory order as it relates to
-indexing.  NumPy uses C-order indexing. That means that the last
-index usually represents the most rapidly changing memory location,
-unlike Fortran or IDL, where the first index represents the most
-rapidly changing location in memory. This difference represents a
-great potential for confusion.
-
-Other indexing options
-======================
-
-It is possible to slice and stride arrays to extract arrays of the
-same number of dimensions, but of different sizes than the original.
-The slicing and striding works exactly the same way it does for lists
-and tuples except that they can be applied to multiple dimensions as
-well. A few examples illustrates best: ::
-
- >>> x = np.arange(10)
- >>> x[2:5]
- array([2, 3, 4])
- >>> x[:-7]
- array([0, 1, 2])
- >>> x[1:7:2]
- array([1, 3, 5])
- >>> y = np.arange(35).reshape(5,7)
- >>> y[1:5:2,::3]
- array([[ 7, 10, 13],
-        [21, 24, 27]])
-
-Note that slices of arrays do not copy the internal array data but
-only produce new views of the original data. This is different from
-list or tuple slicing and an explicit ``copy()`` is recommended if
-the original data is not required anymore.
-
-It is possible to index arrays with other arrays for the purposes of
-selecting lists of values out of arrays into new arrays. There are
-two different ways of accomplishing this. One uses one or more arrays
-of index values. The other involves giving a boolean array of the proper
-shape to indicate the values to be selected. Index arrays are a very
-powerful tool that allow one to avoid looping over individual elements in
-arrays and thus greatly improve performance.
-
-It is possible to use special features to effectively increase the
-number of dimensions in an array through indexing so the resulting
-array acquires the shape needed for use in an expression or with a
-specific function.
-
-Index arrays
-============
-
-NumPy arrays may be indexed with other arrays (or any other sequence-
-like object that can be converted to an array, such as lists, with the
-exception of tuples; see the end of this document for why this is). The
-use of index arrays ranges from simple, straightforward cases to
-complex, hard-to-understand cases. For all cases of index arrays, what
-is returned is a copy of the original data, not a view as one gets for
-slices.
-
-Index arrays must be of integer type. Each value in the array indicates
-which value in the array to use in place of the index. To illustrate: ::
-
- >>> x = np.arange(10,1,-1)
- >>> x
- array([10,  9,  8,  7,  6,  5,  4,  3,  2])
- >>> x[np.array([3, 3, 1, 8])]
- array([7, 7, 9, 2])
-
-
-The index array consisting of the values 3, 3, 1 and 8 correspondingly
-create an array of length 4 (same as the index array) where each index
-is replaced by the value the index array has in the array being indexed.
-
-Negative values are permitted and work as they do with single indices
-or slices: ::
-
- >>> x[np.array([3,3,-3,8])]
- array([7, 7, 4, 2])
-
-It is an error to have index values out of bounds: ::
-
- >>> x[np.array([3, 3, 20, 8])]
- <type 'exceptions.IndexError'>: index 20 out of bounds 0<=index<9
-
-Generally speaking, what is returned when index arrays are used is
-an array with the same shape as the index array, but with the type
-and values of the array being indexed. As an example, we can use a
-multidimensional index array instead: ::
-
- >>> x[np.array([[1,1],[2,3]])]
- array([[9, 9],
-        [8, 7]])
+.. note::
+
+    NumPy uses C-order indexing. That means that the last
+    index usually represents the most rapidly changing memory location,
+    unlike Fortran or IDL, where the first index represents the most
+    rapidly changing location in memory. This difference represents a
+    great potential for confusion.
+
+
+Slicing and striding
+^^^^^^^^^^^^^^^^^^^^
+
+Basic slicing extends Python's basic concept of slicing to N
+dimensions. Basic slicing occurs when *obj* is a :class:`slice` object
+(constructed by ``start:stop:step`` notation inside of brackets), an
+integer, or a tuple of slice objects and integers. :py:data:`Ellipsis`
+and :const:`newaxis` objects can be interspersed with these as
+well.
+
+.. deprecated:: 1.15.0
+
+  In order to remain backward compatible with a common usage in
+  Numeric, basic slicing is also initiated if the selection object is
+  any non-ndarray and non-tuple sequence (such as a :class:`list`) containing
+  :class:`slice` objects, the :py:data:`Ellipsis` object, or the :const:`newaxis`
+  object, but not for integer arrays or other embedded sequences.
+
+.. index::
+   triple: ndarray; special methods; getitem
+   triple: ndarray; special methods; setitem
+   single: ellipsis
+   single: newaxis
+
+The simplest case of indexing with *N* integers returns an :ref:`array
+scalar <arrays.scalars>` representing the corresponding item.  As in
+Python, all indices are zero-based: for the *i*-th index :math:`n_i`,
+the valid range is :math:`0 \le n_i < d_i` where :math:`d_i` is the
+*i*-th element of the shape of the array.  Negative indices are
+interpreted as counting from the end of the array (*i.e.*, if
+:math:`n_i < 0`, it means :math:`n_i + d_i`).
+
+
+All arrays generated by basic slicing are always :term:`views <view>`
+of the original array.
+
+.. note::
+
+    NumPy slicing creates a :term:`view` instead of a copy as in the case of
+    built-in Python sequences such as string, tuple and list.
+    Care must be taken when extracting
+    a small portion from a large array which becomes useless after the
+    extraction, because the small portion extracted contains a reference
+    to the large original array whose memory will not be released until
+    all arrays derived from it are garbage-collected. In such cases an
+    explicit ``copy()`` is recommended.
+
+The standard rules of sequence slicing apply to basic slicing on a
+per-dimension basis (including using a step index). Some useful
+concepts to remember include:
+
+- The basic slice syntax is ``i:j:k`` where *i* is the starting index,
+  *j* is the stopping index, and *k* is the step (:math:`k\neq0`).
+  This selects the *m* elements (in the corresponding dimension) with
+  index values *i*, *i + k*, ..., *i + (m - 1) k* where
+  :math:`m = q + (r\neq0)` and *q* and *r* are the quotient and remainder
+  obtained by dividing *j - i* by *k*: *j - i = q k + r*, so that
+  *i + (m - 1) k < j*. 
+  For example::
+
+     >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
+     >>> x[1:7:2]
+     array([1, 3, 5])
+
+- Negative *i* and *j* are interpreted as *n + i* and *n + j* where
+  *n* is the number of elements in the corresponding dimension.
+  Negative *k* makes stepping go towards smaller indices.
+  From the above example::
+
+      >>> x[-2:10]
+      array([8, 9])
+      >>> x[-3:3:-1]
+      array([7, 6, 5, 4])
+
+- Assume *n* is the number of elements in the dimension being
+  sliced. Then, if *i* is not given it defaults to 0 for *k > 0* and
+  *n - 1* for *k < 0* . If *j* is not given it defaults to *n* for *k > 0*
+  and *-n-1* for *k < 0* . If *k* is not given it defaults to 1. Note that
+  ``::`` is the same as ``:`` and means select all indices along this
+  axis.
+  From the above example::
+
+      >>> x[5:]
+      array([5, 6, 7, 8, 9])
+
+- If the number of objects in the selection tuple is less than
+  *N*, then ``:`` is assumed for any subsequent dimensions.
+  For example::
+
+      >>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
+      >>> x.shape
+      (2, 3, 1)
+      >>> x[1:2]
+      array([[[4],
+              [5],
+              [6]]])
+
+- An integer, *i*, returns the same values as ``i:i+1``
+  **except** the dimensionality of the returned object is reduced by
+  1. In particular, a selection tuple with the *p*-th
+  element an integer (and all other entries ``:``) returns the
+  corresponding sub-array with dimension *N - 1*. If *N = 1*
+  then the returned object is an array scalar. These objects are
+  explained in :ref:`arrays.scalars`.
+
+- If the selection tuple has all entries ``:`` except the
+  *p*-th entry which is a slice object ``i:j:k``,
+  then the returned array has dimension *N* formed by
+  concatenating the sub-arrays returned by integer indexing of
+  elements *i*, *i+k*, ..., *i + (m - 1) k < j*,
+
+- Basic slicing with more than one non-``:`` entry in the slicing
+  tuple, acts like repeated application of slicing using a single
+  non-``:`` entry, where the non-``:`` entries are successively taken
+  (with all other non-``:`` entries replaced by ``:``). Thus,
+  ``x[ind1, ..., ind2,:]`` acts like ``x[ind1][..., ind2, :]`` under basic
+  slicing.
+
+  .. warning:: The above is **not** true for advanced indexing.
+
+- You may use slicing to set values in the array, but (unlike lists) you
+  can never grow the array. The size of the value to be set in
+  ``x[obj] = value`` must be (broadcastable) to the same shape as
+  ``x[obj]``.
+
+- A slicing tuple can always be constructed as *obj*
+  and used in the ``x[obj]`` notation. Slice objects can be used in
+  the construction in place of the ``[start:stop:step]``
+  notation. For example, ``x[1:10:5, ::-1]`` can also be implemented
+  as ``obj = (slice(1, 10, 5), slice(None, None, -1)); x[obj]`` . This
+  can be useful for constructing generic code that works on arrays
+  of arbitrary dimensions. See :ref:`dealing-with-variable-indices`
+  for more information.
+
+.. index::
+   pair: ndarray; view
+
+
+Dimensional indexing tools
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+There are some tools to facilitate the easy matching of array shapes with
+expressions and in assignments.
+
+:py:data:`Ellipsis` expands to the number of ``:`` objects needed for the
+selection tuple to index all dimensions. In most cases, this means that the
+length of the expanded selection tuple is ``x.ndim``. There may only be a
+single ellipsis present.
+From the above example::
+
+    >>> x[..., 0]
+    array([[1, 2, 3],
+          [4, 5, 6]])
 
-Indexing Multi-dimensional arrays
-=================================
-
-Things become more complex when multidimensional arrays are indexed,
-particularly with multidimensional index arrays. These tend to be
-more unusual uses, but they are permitted, and they are useful for some
-problems. We'll  start with the simplest multidimensional case (using
-the array y from the previous examples): ::
-
- >>> y[np.array([0,2,4]), np.array([0,1,2])]
- array([ 0, 15, 30])
+This is equivalent to::
 
-In this case, if the index arrays have a matching shape, and there is
-an index array for each dimension of the array being indexed, the
-resultant array has the same shape as the index arrays, and the values
-correspond to the index set for each position in the index arrays. In
-this example, the first index value is 0 for both index arrays, and
-thus the first value of the resultant array is y[0,0]. The next value
-is y[2,1], and the last is y[4,2].
+    >>> x[:, :, 0]
+    array([[1, 2, 3],
+          [4, 5, 6]])
+
+Each :const:`newaxis` object in the selection tuple serves to expand
+the dimensions of the resulting selection by one unit-length
+dimension.  The added dimension is the position of the :const:`newaxis`
+object in the selection tuple. :const:`newaxis` is an alias for
+``None``, and ``None`` can be used in place of this with the same result.
+From the above example::
+
+    >>> x[:, np.newaxis, :, :].shape
+    (2, 1, 3, 1)
+    >>> x[:, None, :, :].shape
+    (2, 1, 3, 1)
+
+This can be handy to combine two
+arrays in a way that otherwise would require explicit reshaping
+operations. For example::
+
+    >>> x = np.arange(5)
+    >>> x[:, np.newaxis] + x[np.newaxis, :]
+    array([[0, 1, 2, 3, 4],
+          [1, 2, 3, 4, 5],
+          [2, 3, 4, 5, 6],
+          [3, 4, 5, 6, 7],
+          [4, 5, 6, 7, 8]])
+
+
+.. _advanced-indexing:
+
+Advanced indexing
+-----------------
+
+Advanced indexing is triggered when the selection object, *obj*, is a
+non-tuple sequence object, an :class:`ndarray` (of data type integer or bool),
+or a tuple with at least one sequence object or ndarray (of data type
+integer or bool). There are two types of advanced indexing: integer
+and Boolean.
+
+Advanced indexing always returns a *copy* of the data (contrast with
+basic slicing that returns a :term:`view`).
+
+.. warning::
+
+   The definition of advanced indexing means that ``x[(1, 2, 3),]`` is
+   fundamentally different than ``x[(1, 2, 3)]``. The latter is
+   equivalent to ``x[1, 2, 3]`` which will trigger basic selection while
+   the former will trigger advanced indexing. Be sure to understand
+   why this occurs.
+
+   Also recognize that ``x[[1, 2, 3]]`` will trigger advanced indexing,
+   whereas due to the deprecated Numeric compatibility mentioned above,
+   ``x[[1, 2, slice(None)]]`` will trigger basic slicing.
+
+Integer array indexing
+^^^^^^^^^^^^^^^^^^^^^^
+
+Integer array indexing allows selection of arbitrary items in the array
+based on their *N*-dimensional index. Each integer array represents a number
+of indices into that dimension.
+
+Negative values are permitted in the index arrays and work as they do with
+single indices or slices::
+
+    >>> x = np.arange(10, 1, -1)
+    >>> x
+    array([10,  9,  8,  7,  6,  5,  4,  3,  2])
+    >>> x[np.array([3, 3, 1, 8])]
+    array([7, 7, 9, 2])
+    >>> x[np.array([3, 3, -3, 8])]
+    array([7, 7, 4, 2])
+
+If the index values are out of bounds then an ``IndexError`` is thrown::
+
+    >>> x = np.array([[1, 2], [3, 4], [5, 6]])
+    >>> x[np.array([1, -1])]
+    array([[3, 4],
+          [5, 6]])
+    >>> x[np.array([3, 4])]
+    IndexError: index 3 is out of bounds for axis 0 with size 3
+
+When the index consists of as many integer arrays as dimensions of the array
+being indexed, the indexing is straightforward, but different from slicing.
+
+Advanced indices always are :ref:`broadcast<basics.broadcasting>` and
+iterated as *one*::
+
+     result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M],
+                                ..., ind_N[i_1, ..., i_M]]
+
+Note that the resulting shape is identical to the (broadcast) indexing array
+shapes ``ind_1, ..., ind_N``. If the indices cannot be broadcast to the
+same shape, an exception ``IndexError: shape mismatch: indexing arrays could
+not be broadcast together with shapes...`` is raised. 
+
+Indexing with multidimensional index arrays tend
+to be more unusual uses, but they are permitted, and they are useful for some
+problems. We’ll start with the simplest multidimensional case::
+
+    >>> y = np.arange(35).reshape(5, 7)
+    >>> y
+    array([[ 0,  1,  2,  3,  4,  5,  6],
+           [ 7,  8,  9, 10, 11, 12, 13],
+           [14, 15, 16, 17, 18, 19, 20],
+           [21, 22, 23, 24, 25, 26, 27],
+           [28, 29, 30, 31, 32, 33, 34]])
+    >>> y[np.array([0, 2, 4]), np.array([0, 1, 2])]
+    array([ 0, 15, 30])
+
+In this case, if the index arrays have a matching shape, and there is an
+index array for each dimension of the array being indexed, the resultant
+array has the same shape as the index arrays, and the values correspond
+to the index set for each position in the index arrays. In this example,
+the first index value is 0 for both index arrays, and thus the first value
+of the resultant array is ``y[0, 0]``. The next value is ``y[2, 1]``, and
+the last is ``y[4, 2]``.
 
 If the index arrays do not have the same shape, there is an attempt to
-broadcast them to the same shape.  If they cannot be broadcast to the
-same shape, an exception is raised: ::
+broadcast them to the same shape. If they cannot be broadcast to the same
+shape, an exception is raised::
 
>>> y[np.array([0,2,4]), np.array([0,1])]
- <type 'exceptions.ValueError'>: shape mismatch: objects cannot be
- broadcast to a single shape
   >>> y[np.array([0, 2, 4]), np.array([0, 1])]
+    IndexError: shape mismatch: indexing arrays could not be broadcast
+    together with shapes (3,) (2,)
 
 The broadcasting mechanism permits index arrays to be combined with
 scalars for other indices. The effect is that the scalar value is used
-for all the corresponding values of the index arrays: ::
-
- >>> y[np.array([0,2,4]), 1]
- array([ 1, 15, 29])
-
-Jumping to the next level of complexity, it is possible to only
-partially index an array with index arrays. It takes a bit of thought
-to understand what happens in such cases. For example if we just use
-one index array with y: ::
-
- >>> y[np.array([0,2,4])]
- array([[ 0,  1,  2,  3,  4,  5,  6],
-        [14, 15, 16, 17, 18, 19, 20],
-        [28, 29, 30, 31, 32, 33, 34]])
-
-What results is the construction of a new array where each value of
-the index array selects one row from the array being indexed and the
-resultant array has the resulting shape (number of index elements,
-size of row).
-
-An example of where this may be useful is for a color lookup table
-where we want to map the values of an image into RGB triples for
+for all the corresponding values of the index arrays::
+
+    >>> y[np.array([0, 2, 4]), 1]
+    array([ 1, 15, 29])
+
+Jumping to the next level of complexity, it is possible to only partially
+index an array with index arrays. It takes a bit of thought to understand
+what happens in such cases. For example if we just use one index array
+with y::
+
+    >>> y[np.array([0, 2, 4])]
+    array([[ 0,  1,  2,  3,  4,  5,  6],
+          [14, 15, 16, 17, 18, 19, 20],
+          [28, 29, 30, 31, 32, 33, 34]])
+
+It results in the construction of a new array where each value of the
+index array selects one row from the array being indexed and the resultant
+array has the resulting shape (number of index elements, size of row).
+
+In general, the shape of the resultant array will be the concatenation of
+the shape of the index array (or the shape that all the index arrays were
+broadcast to) with the shape of any unused dimensions (those not indexed)
+in the array being indexed.
+
+.. rubric:: Example
+
+From each row, a specific element should be selected. The row index is just
+``[0, 1, 2]`` and the column index specifies the element to choose for the
+corresponding row, here ``[0, 1, 0]``. Using both together the task
+can be solved using advanced indexing::
+
+    >>> x = np.array([[1, 2], [3, 4], [5, 6]])
+    >>> x[[0, 1, 2], [0, 1, 0]]
+    array([1, 4, 5])
+
+To achieve a behaviour similar to the basic slicing above, broadcasting can be
+used. The function :func:`ix_` can help with this broadcasting. This is best
+understood with an example.
+
+.. rubric:: Example
+
+From a 4x3 array the corner elements should be selected using advanced
+indexing. Thus all elements for which the column is one of ``[0, 2]`` and
+the row is one of ``[0, 3]`` need to be selected. To use advanced indexing
+one needs to select all elements *explicitly*. Using the method explained
+previously one could write::
+
+    >>> x = np.array([[ 0,  1,  2],
+    ...               [ 3,  4,  5],
+    ...               [ 6,  7,  8],
+    ...               [ 9, 10, 11]])
+    >>> rows = np.array([[0, 0],
+    ...                  [3, 3]], dtype=np.intp)
+    >>> columns = np.array([[0, 2],
+    ...                     [0, 2]], dtype=np.intp)
+    >>> x[rows, columns]
+    array([[ 0,  2],
+           [ 9, 11]])
+
+However, since the indexing arrays above just repeat themselves,
+broadcasting can be used (compare operations such as
+``rows[:, np.newaxis] + columns``) to simplify this::
+
+    >>> rows = np.array([0, 3], dtype=np.intp)
+    >>> columns = np.array([0, 2], dtype=np.intp)
+    >>> rows[:, np.newaxis]
+    array([[0],
+           [3]])
+    >>> x[rows[:, np.newaxis], columns]
+    array([[ 0,  2],
+           [ 9, 11]])
+
+This broadcasting can also be achieved using the function :func:`ix_`:
+
+    >>> x[np.ix_(rows, columns)]
+    array([[ 0,  2],
+           [ 9, 11]])
+
+Note that without the ``np.ix_`` call, only the diagonal elements would
+be selected::
+
+    >>> x[rows, columns]
+    array([ 0, 11])
+
+This difference is the most important thing to remember about
+indexing with multiple advanced indices.
+
+.. rubric:: Example
+
+A real-life example of where advanced indexing may be useful is for a color
+lookup table where we want to map the values of an image into RGB triples for
 display. The lookup table could have a shape (nlookup, 3). Indexing
 such an array with an image with shape (ny, nx) with dtype=np.uint8
 (or any integer type so long as values are with the bounds of the
 lookup table) will result in an array of shape (ny, nx, 3) where a
 triple of RGB values is associated with each pixel location.
 
-In general, the shape of the resultant array will be the concatenation
-of the shape of the index array (or the shape that all the index arrays
-were broadcast to) with the shape of any unused dimensions (those not
-indexed) in the array being indexed.
 
-Boolean or "mask" index arrays
-==============================
+Boolean array indexing
+^^^^^^^^^^^^^^^^^^^^^^
+
+This advanced indexing occurs when *obj* is an array object of Boolean
+type, such as may be returned from comparison operators. A single
+boolean index array is practically identical to ``x[obj.nonzero()]`` where,
+as described above, :meth:`obj.nonzero() <ndarray.nonzero>` returns a
+tuple (of length :attr:`obj.ndim <ndarray.ndim>`) of integer index
+arrays showing the :py:data:`True` elements of *obj*. However, it is
+faster when ``obj.shape == x.shape``.
+
+If ``obj.ndim == x.ndim``, ``x[obj]`` returns a 1-dimensional array
+filled with the elements of *x* corresponding to the :py:data:`True`
+values of *obj*.  The search order will be :term:`row-major`,
+C-style. If *obj* has :py:data:`True` values at entries that are outside
+of the bounds of *x*, then an index error will be raised. If *obj* is
+smaller than *x* it is identical to filling it with :py:data:`False`.
+
+A common use case for this is filtering for desired element values.
+For example, one may wish to select all entries from an array which
+are not :const:`NaN`::
+
+    >>> x = np.array([[1., 2.], [np.nan, 3.], [np.nan, np.nan]])
+    >>> x[~np.isnan(x)]
+    array([1., 2., 3.])
+
+Or wish to add a constant to all negative elements::
+
+    >>> x = np.array([1., -1., -2., 3])
+    >>> x[x < 0] += 20
+    >>> x
+    array([1., 19., 18., 3.])
+
+In general if an index includes a Boolean array, the result will be
+identical to inserting ``obj.nonzero()`` into the same position
+and using the integer array indexing mechanism described above.
+``x[ind_1, boolean_array, ind_2]`` is equivalent to
+``x[(ind_1,) + boolean_array.nonzero() + (ind_2,)]``.
+
+If there is only one Boolean array and no integer indexing array present,
+this is straightforward. Care must only be taken to make sure that the
+boolean index has *exactly* as many dimensions as it is supposed to work
+with.
+
+In general, when the boolean array has fewer dimensions than the array being
+indexed, this is equivalent to ``x[b, ...]``, which means x is indexed by b
+followed by as many ``:`` as are needed to fill out the rank of x. Thus the
+shape of the result is one dimension containing the number of True elements of
+the boolean array, followed by the remaining dimensions of the array being
+indexed::
+
+    >>> x = np.arange(35).reshape(5, 7)
+    >>> b = x > 20
+    >>> b[:, 5]
+    array([False, False, False,  True,  True])
+    >>> x[b[:, 5]]
+    array([[21, 22, 23, 24, 25, 26, 27],
+          [28, 29, 30, 31, 32, 33, 34]])
+
+Here the 4th and 5th rows are selected from the indexed array and
+combined to make a 2-D array.
+
+.. rubric:: Example
 
-Boolean arrays used as indices are treated in a different manner
-entirely than index arrays. Boolean arrays must be of the same shape
-as the initial dimensions of the array being indexed. In the
-most straightforward case, the boolean array has the same shape: ::
+From an array, select all rows which sum up to less or equal two::
 
- >>> b = y>20
- >>> y[b]
- array([21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34])
+    >>> x = np.array([[0, 1], [1, 1], [2, 2]])
+    >>> rowsum = x.sum(-1)
+    >>> x[rowsum <= 2, :]
+    array([[0, 1],
+           [1, 1]])
 
-Unlike in the case of integer index arrays, in the boolean case, the
-result is a 1-D array containing all the elements in the indexed array
-corresponding to all the true elements in the boolean array. The
-elements in the indexed array are always iterated and returned in
-:term:`row-major` (C-style) order. The result is also identical to
-``y[np.nonzero(b)]``. As with index arrays, what is returned is a copy
-of the data, not a view as one gets with slices.
 
-The result will be multidimensional if y has more dimensions than b.
-For example: ::
+Combining multiple Boolean indexing arrays or a Boolean with an integer
+indexing array can best be understood with the
+:meth:`obj.nonzero() <ndarray.nonzero>` analogy. The function :func:`ix_`
+also supports boolean arrays and will work without any surprises.
 
- >>> b[:,5] # use a 1-D boolean whose first dim agrees with the first dim of y
- array([False, False, False,  True,  True])
- >>> y[b[:,5]]
- array([[21, 22, 23, 24, 25, 26, 27],
-        [28, 29, 30, 31, 32, 33, 34]])
+.. rubric:: Example
 
-Here the 4th and 5th rows are selected from the indexed array and
-combined to make a 2-D array.
+Use boolean indexing to select all rows adding up to an even
+number. At the same time columns 0 and 2 should be selected with an
+advanced integer index. Using the :func:`ix_` function this can be done
+with::
 
-In general, when the boolean array has fewer dimensions than the array
-being indexed, this is equivalent to y[b, ...], which means
-y is indexed by b followed by as many : as are needed to fill
-out the rank of y.
-Thus the shape of the result is one dimension containing the number
-of True elements of the boolean array, followed by the remaining
-dimensions of the array being indexed.
+    >>> x = np.array([[ 0,  1,  2],
+    ...               [ 3,  4,  5],
+    ...               [ 6,  7,  8],
+    ...               [ 9, 10, 11]])
+    >>> rows = (x.sum(-1) % 2) == 0
+    >>> rows
+    array([False,  True, False,  True])
+    >>> columns = [0, 2]
+    >>> x[np.ix_(rows, columns)]
+    array([[ 3,  5],
+           [ 9, 11]])
 
-For example, using a 2-D boolean array of shape (2,3)
-with four True elements to select rows from a 3-D array of shape
-(2,3,5) results in a 2-D result of shape (4,5): ::
+Without the ``np.ix_`` call, only the diagonal elements would be
+selected.
 
- >>> x = np.arange(30).reshape(2,3,5)
- >>> x
- array([[[ 0,  1,  2,  3,  4],
-         [ 5,  6,  7,  8,  9],
-         [10, 11, 12, 13, 14]],
-        [[15, 16, 17, 18, 19],
-         [20, 21, 22, 23, 24],
-         [25, 26, 27, 28, 29]]])
- >>> b = np.array([[True, True, False], [False, True, True]])
- >>> x[b]
- array([[ 0,  1,  2,  3,  4],
-        [ 5,  6,  7,  8,  9],
-        [20, 21, 22, 23, 24],
-        [25, 26, 27, 28, 29]])
-
-For further details, consult the NumPy reference documentation on array indexing.
-
-Combining index arrays with slices
-==================================
-
-Index arrays may be combined with slices. For example: ::
-
- >>> y[np.array([0, 2, 4]), 1:3]
- array([[ 1,  2],
-        [15, 16],
-        [29, 30]])
-
-In effect, the slice and index array operation are independent.
-The slice operation extracts columns with index 1 and 2,
-(i.e. the 2nd and 3rd columns),
-followed by the index array operation which extracts rows with 
-index 0, 2 and 4 (i.e the first, third and fifth rows).
+Or without ``np.ix_`` (compare the integer array examples)::
 
-This is equivalent to::
+    >>> rows = rows.nonzero()[0]
+    >>> x[rows[:, np.newaxis], columns]
+    array([[ 3,  5],
+           [ 9, 11]])
 
- >>> y[:, 1:3][np.array([0, 2, 4]), :]
- array([[ 1,  2],
-        [15, 16],
-        [29, 30]])
-
-Likewise, slicing can be combined with broadcasted boolean indices: ::
-
- >>> b = y > 20
- >>> b
- array([[False, False, False, False, False, False, False],
-       [False, False, False, False, False, False, False],
-       [False, False, False, False, False, False, False],
-       [ True,  True,  True,  True,  True,  True,  True],
-       [ True,  True,  True,  True,  True,  True,  True]])
- >>> y[b[:,5],1:3]
- array([[22, 23],
-        [29, 30]])
-
-Structural indexing tools
-=========================
-
-To facilitate easy matching of array shapes with expressions and in
-assignments, the np.newaxis object can be used within array indices
-to add new dimensions with a size of 1. For example: ::
-
- >>> y.shape
- (5, 7)
- >>> y[:,np.newaxis,:].shape
- (5, 1, 7)
-
-Note that there are no new elements in the array, just that the
-dimensionality is increased. This can be handy to combine two
-arrays in a way that otherwise would require explicitly reshaping
-operations. For example: ::
-
- >>> x = np.arange(5)
- >>> x[:,np.newaxis] + x[np.newaxis,:]
- array([[0, 1, 2, 3, 4],
-        [1, 2, 3, 4, 5],
-        [2, 3, 4, 5, 6],
-        [3, 4, 5, 6, 7],
-        [4, 5, 6, 7, 8]])
-
-The ellipsis syntax maybe used to indicate selecting in full any
-remaining unspecified dimensions. For example: ::
-
- >>> z = np.arange(81).reshape(3,3,3,3)
- >>> z[1,...,2]
- array([[29, 32, 35],
-        [38, 41, 44],
-        [47, 50, 53]])
-
-This is equivalent to: ::
-
- >>> z[1,:,:,2]
- array([[29, 32, 35],
-        [38, 41, 44],
-        [47, 50, 53]])
+.. rubric:: Example
+
+Use a 2-D boolean array of shape (2, 3)
+with four True elements to select rows from a 3-D array of shape
+(2, 3, 5) results in a 2-D result of shape (4, 5)::
+
+    >>> x = np.arange(30).reshape(2, 3, 5)
+    >>> x
+    array([[[ 0,  1,  2,  3,  4],
+            [ 5,  6,  7,  8,  9],
+            [10, 11, 12, 13, 14]],
+          [[15, 16, 17, 18, 19],
+            [20, 21, 22, 23, 24],
+            [25, 26, 27, 28, 29]]])
+    >>> b = np.array([[True, True, False], [False, True, True]])
+    >>> x[b]
+    array([[ 0,  1,  2,  3,  4],
+          [ 5,  6,  7,  8,  9],
+          [20, 21, 22, 23, 24],
+          [25, 26, 27, 28, 29]])
+
+
+.. _combining-advanced-and-basic-indexing:
+
+Combining advanced and basic indexing
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+When there is at least one slice (``:``), ellipsis (``...``) or :const:`newaxis`
+in the index (or the array has more dimensions than there are advanced indices),
+then the behaviour can be more complicated. It is like concatenating the
+indexing result for each advanced index element.
+
+In the simplest case, there is only a *single* advanced index combined with
+a slice. For example::
+
+    >>> y = np.arange(35).reshape(5,7)
+    >>> y[np.array([0, 2, 4]), 1:3]
+    array([[ 1,  2],
+           [15, 16],
+           [29, 30]])
+
+In effect, the slice and index array operation are independent. The slice
+operation extracts columns with index 1 and 2, (i.e. the 2nd and 3rd columns),
+followed by the index array operation which extracts rows with index 0, 2 and 4
+(i.e the first, third and fifth rows). This is equivalent to::
+
+    >>> y[:, 1:3][np.array([0, 2, 4]), :]
+    array([[ 1,  2],
+           [15, 16],
+           [29, 30]])
+
+A single advanced index can, for example, replace a slice and the result array
+will be the same. However, it is a copy and may have a different memory layout.
+A slice is preferable when it is possible.
+For example::
+
+    >>> x = np.array([[ 0,  1,  2],
+    ...               [ 3,  4,  5],
+    ...               [ 6,  7,  8],
+    ...               [ 9, 10, 11]])
+    >>> x[1:2, 1:3]
+    array([[4, 5]])
+    >>> x[1:2, [1, 2]]
+    array([[4, 5]])
+
+The easiest way to understand a combination of *multiple* advanced indices may
+be to think in terms of the resulting shape. There are two parts to the indexing
+operation, the subspace defined by the basic indexing (excluding integers) and
+the subspace from the advanced indexing part. Two cases of index combination
+need to be distinguished:
+
+* The advanced indices are separated by a slice, :py:data:`Ellipsis` or
+  :const:`newaxis`. For example ``x[arr1, :, arr2]``.
+* The advanced indices are all next to each other.
+  For example ``x[..., arr1, arr2, :]`` but *not* ``x[arr1, :, 1]``
+  since ``1`` is an advanced index in this regard.
+
+In the first case, the dimensions resulting from the advanced indexing
+operation come first in the result array, and the subspace dimensions after
+that.
+In the second case, the dimensions from the advanced indexing operations
+are inserted into the result array at the same spot as they were in the
+initial array (the latter logic is what makes simple advanced indexing
+behave just like slicing). 
+
+.. rubric:: Example
+
+Suppose ``x.shape`` is (10, 20, 30) and ``ind`` is a (2, 3, 4)-shaped
+indexing :class:`intp` array, then ``result = x[..., ind, :]`` has
+shape (10, 2, 3, 4, 30) because the (20,)-shaped subspace has been
+replaced with a (2, 3, 4)-shaped broadcasted indexing subspace. If
+we let *i, j, k* loop over the (2, 3, 4)-shaped subspace then
+``result[..., i, j, k, :] = x[..., ind[i, j, k], :]``. This example
+produces the same result as :meth:`x.take(ind, axis=-2) <ndarray.take>`.
+
+.. rubric:: Example
+
+Let ``x.shape`` be (10, 20, 30, 40, 50) and suppose ``ind_1``
+and ``ind_2`` can be broadcast to the shape (2, 3, 4). Then
+``x[:, ind_1, ind_2]`` has shape (10, 2, 3, 4, 40, 50) because the
+(20, 30)-shaped subspace from X has been replaced with the
+(2, 3, 4) subspace from the indices. However,
+``x[:, ind_1, :, ind_2]`` has shape (2, 3, 4, 10, 30, 50) because there
+is no unambiguous place to drop in the indexing subspace, thus
+it is tacked-on to the beginning. It is always possible to use
+:meth:`.transpose() <ndarray.transpose>` to move the subspace
+anywhere desired. Note that this example cannot be replicated
+using :func:`take`.
+
+.. rubric:: Example
+
+Slicing can be combined with broadcasted boolean indices::
+
+    >>> x = np.arange(35).reshape(5, 7)
+    >>> b = x > 20
+    >>> b
+    array([[False, False, False, False, False, False, False],
+          [False, False, False, False, False, False, False],
+          [False, False, False, False, False, False, False],
+          [ True,  True,  True,  True,  True,  True,  True],
+          [ True,  True,  True,  True,  True,  True,  True]])
+    >>> x[b[:, 5], 1:3]
+    array([[22, 23],
+          [29, 30]])
+
+
+.. _arrays.indexing.fields:
+
+Field access
+-------------
+
+.. seealso:: :ref:`structured_arrays`
+
+If the :class:`ndarray` object is a structured array the :term:`fields <field>`
+of the array can be accessed by indexing the array with strings,
+dictionary-like.
+
+Indexing ``x['field-name']`` returns a new :term:`view` to the array,
+which is of the same shape as *x* (except when the field is a
+sub-array) but of data type ``x.dtype['field-name']`` and contains
+only the part of the data in the specified field. Also,
+:ref:`record array <arrays.classes.rec>` scalars can be "indexed" this way.
+
+Indexing into a structured array can also be done with a list of field names,
+e.g. ``x[['field-name1', 'field-name2']]``. As of NumPy 1.16, this returns a
+view containing only those fields. In older versions of NumPy, it returned a
+copy. See the user guide section on :ref:`structured_arrays` for more
+information on multifield indexing.
+
+If the accessed field is a sub-array, the dimensions of the sub-array
+are appended to the shape of the result.
+For example::
+
+   >>> x = np.zeros((2, 2), dtype=[('a', np.int32), ('b', np.float64, (3, 3))])
+   >>> x['a'].shape
+   (2, 2)
+   >>> x['a'].dtype
+   dtype('int32')
+   >>> x['b'].shape
+   (2, 2, 3, 3)
+   >>> x['b'].dtype
+   dtype('float64')
+
+.. _flat-iterator-indexing:
+
+Flat Iterator indexing
+----------------------
+
+:attr:`x.flat <ndarray.flat>` returns an iterator that will iterate
+over the entire array (in C-contiguous style with the last index
+varying the fastest). This iterator object can also be indexed using
+basic slicing or advanced indexing as long as the selection object is
+not a tuple. This should be clear from the fact that :attr:`x.flat
+<ndarray.flat>` is a 1-dimensional view. It can be used for integer
+indexing with 1-dimensional C-style-flat indices. The shape of any
+returned array is therefore the shape of the integer indexing object.
+
+.. index::
+   single: indexing
+   single: ndarray
+
+
+.. _assigning-values-to-indexed-arrays:
 
 Assigning values to indexed arrays
-==================================
+----------------------------------
 
 As mentioned, one can select a subset of an array to assign to using
 a single index, slices, and index and mask arrays. The value being
@@ -405,26 +803,28 @@ example is often surprising to people: ::
  array([ 0, 11, 20, 31, 40])
 
 Where people expect that the 1st location will be incremented by 3.
-In fact, it will only be incremented by 1. The reason is because
+In fact, it will only be incremented by 1. The reason is that
 a new array is extracted from the original (as a temporary) containing
 the values at 1, 1, 3, 1, then the value 1 is added to the temporary,
 and then the temporary is assigned back to the original array. Thus
-the value of the array at x[1]+1 is assigned to x[1] three times,
+the value of the array at ``x[1] + 1`` is assigned to ``x[1]`` three times,
 rather than being incremented 3 times.
 
+.. _dealing-with-variable-indices:
+
 Dealing with variable numbers of indices within programs
-========================================================
+--------------------------------------------------------
 
-The index syntax is very powerful but limiting when dealing with
+The indexing syntax is very powerful but limiting when dealing with
 a variable number of indices. For example, if you want to write
 a function that can handle arguments with various numbers of
 dimensions without having to write special case code for each
 number of possible dimensions, how can that be done? If one
 supplies to the index a tuple, the tuple will be interpreted
-as a list of indices. For example (using the previous definition
-for the array z): ::
+as a list of indices. For example::
 
- >>> indices = (1,1,1,1)
+ >>> z = np.arange(81).reshape(3, 3, 3, 3)
+ >>> indices = (1, 1, 1, 1)
  >>> z[indices]
  40
 
@@ -434,30 +834,70 @@ and then use these within an index.
 Slices can be specified within programs by using the slice() function
 in Python. For example: ::
 
- >>> indices = (1,1,1,slice(0,2)) # same as [1,1,1,0:2]
+ >>> indices = (1, 1, 1, slice(0, 2))  # same as [1, 1, 1, 0:2]
  >>> z[indices]
  array([39, 40])
 
 Likewise, ellipsis can be specified by code by using the Ellipsis
 object: ::
 
- >>> indices = (1, Ellipsis, 1) # same as [1,...,1]
+ >>> indices = (1, Ellipsis, 1)  # same as [1, ..., 1]
  >>> z[indices]
  array([[28, 31, 34],
         [37, 40, 43],
         [46, 49, 52]])
 
-For this reason it is possible to use the output from the np.nonzero()
-function directly as an index since it always returns a tuple of index
-arrays.
+For this reason, it is possible to use the output from the 
+:meth:`np.nonzero() <ndarray.nonzero>` function directly as an index since
+it always returns a tuple of index arrays.
 
 Because the special treatment of tuples, they are not automatically
 converted to an array as a list would be. As an example: ::
 
- >>> z[[1,1,1,1]] # produces a large array
+ >>> z[[1, 1, 1, 1]]  # produces a large array
  array([[[[27, 28, 29],
           [30, 31, 32], ...
- >>> z[(1,1,1,1)] # returns a single value
+ >>> z[(1, 1, 1, 1)]  # returns a single value
  40
 
 
+Detailed notes
+--------------
+
+These are some detailed notes, which are not of importance for day to day
+indexing (in no particular order):
+
+* The native NumPy indexing type is ``intp`` and may differ from the
+  default integer array type. ``intp`` is the smallest data type
+  sufficient to safely index any array; for advanced indexing it may be
+  faster than other types.
+* For advanced assignments, there is in general no guarantee for the
+  iteration order. This means that if an element is set more than once,
+  it is not possible to predict the final result.
+* An empty (tuple) index is a full scalar index into a zero-dimensional array.
+  ``x[()]`` returns a *scalar* if ``x`` is zero-dimensional and a view
+  otherwise. On the other hand, ``x[...]`` always returns a view.
+* If a zero-dimensional array is present in the index *and* it is a full
+  integer index the result will be a *scalar* and not a zero-dimensional array.
+  (Advanced indexing is not triggered.)
+* When an ellipsis (``...``) is present but has no size (i.e. replaces zero
+  ``:``) the result will still always be an array. A view if no advanced index
+  is present, otherwise a copy.
+* The ``nonzero`` equivalence for Boolean arrays does not hold for zero
+  dimensional boolean arrays.
+* When the result of an advanced indexing operation has no elements but an
+  individual index is out of bounds, whether or not an ``IndexError`` is
+  raised is undefined (e.g. ``x[[], [123]]`` with ``123`` being out of bounds).
+* When a *casting* error occurs during assignment (for example updating a
+  numerical array using a sequence of strings), the array being assigned
+  to may end up in an unpredictable partially updated state.
+  However, if any other error (such as an out of bounds index) occurs, the
+  array will remain unchanged.
+* The memory layout of an advanced indexing result is optimized for each
+  indexing operation and no particular memory order can be assumed.
+* When using a subclass (especially one which manipulates its shape), the
+  default ``ndarray.__setitem__`` behaviour will call ``__getitem__`` for
+  *basic* indexing but not for *advanced* indexing. For such a subclass it may
+  be preferable to call ``ndarray.__setitem__`` with a *base class* ndarray
+  view on the data. This *must* be done if the subclasses ``__getitem__`` does
+  not return views.
index 5364acbe921576f044b82efd47a1c5b2a260b75a..8fe7565aa730231be770e5bf9c8218c254a55e72 100644 (file)
@@ -437,7 +437,7 @@ process these missing data.
 
 By default, any empty string is marked as missing.  We can also consider
 more complex strings, such as ``"N/A"`` or ``"???"`` to represent missing
-or invalid data.  The ``missing_values`` argument accepts three kind
+or invalid data.  The ``missing_values`` argument accepts three kinds
 of values:
 
    a string or a comma-separated string
index 0524fde8ef23ebbe1e5a5e772125327f78161fe2..1e6f30506c7a3e09ec6756243fcf35b099c9fe5f 100644 (file)
@@ -128,7 +128,7 @@ summary they are:
       ...           'formats': ['i4', 'f4'],
       ...           'offsets': [0, 4],
       ...           'itemsize': 12})
-      dtype({'names':['col1','col2'], 'formats':['<i4','<f4'], 'offsets':[0,4], 'itemsize':12})
+      dtype({'names': ['col1', 'col2'], 'formats': ['<i4', '<f4'], 'offsets': [0, 4], 'itemsize': 12})
 
      Offsets may be chosen such that the fields overlap, though this will mean
      that assigning to one field may clobber any overlapping field's data. As
index 66f3f9ee9988cad92f5b5f34a1a6c9612529deb3..affb85db2f0c547a64d32086280b91ce3fafd75b 100644 (file)
@@ -18,3 +18,5 @@ fundamental NumPy ideas and philosophy.
    basics.rec
    basics.dispatch
    basics.subclassing
+   basics.ufuncs
+   basics.copies
diff --git a/doc/source/user/basics.ufuncs.rst b/doc/source/user/basics.ufuncs.rst
new file mode 100644 (file)
index 0000000..083e31f
--- /dev/null
@@ -0,0 +1,313 @@
+.. sectionauthor:: adapted from "Guide to NumPy" by Travis E. Oliphant
+
+.. _ufuncs-basics:
+
+********************************************
+Universal functions (:class:`.ufunc`) basics
+********************************************
+
+.. seealso:: :ref:`ufuncs`
+
+.. index: ufunc, universal function, arithmetic, operation
+
+A universal function (or :term:`ufunc` for short) is a function that
+operates on :class:`ndarrays <numpy.ndarray>` in an element-by-element fashion,
+supporting :ref:`array broadcasting <ufuncs.broadcasting>`, :ref:`type
+casting <ufuncs.casting>`, and several other standard features. That
+is, a ufunc is a ":term:`vectorized <vectorization>`" wrapper for a function
+that takes a fixed number of specific inputs and produces a fixed number of
+specific outputs.
+
+In NumPy, universal functions are instances of the
+:class:`numpy.ufunc` class. Many of the built-in functions are
+implemented in compiled C code. The basic ufuncs operate on scalars, but
+there is also a generalized kind for which the basic elements are sub-arrays
+(vectors, matrices, etc.), and broadcasting is done over other dimensions.
+The simplest example is the addition operator::
+
+    >>> np.array([0,2,3,4]) + np.array([1,1,-1,2])
+    array([1, 3, 2, 6])
+
+One can also produce custom :class:`numpy.ufunc` instances using the
+:func:`numpy.frompyfunc` factory function.
+
+
+Ufunc methods
+=============
+
+All ufuncs have four methods. They can be found at
+:ref:`ufuncs.methods`. However, these methods only make sense on scalar
+ufuncs that take two input arguments and return one output argument.
+Attempting to call these methods on other ufuncs will cause a
+:exc:`ValueError`.
+
+The reduce-like methods all take an *axis* keyword, a *dtype*
+keyword, and an *out* keyword, and the arrays must all have dimension >= 1.
+The *axis* keyword specifies the axis of the array over which the reduction
+will take place (with negative values counting backwards). Generally, it is an
+integer, though for :meth:`numpy.ufunc.reduce`, it can also be a tuple of
+``int`` to reduce over several axes at once, or ``None``, to reduce over all
+axes. For example::
+
+   >>> x = np.arange(9).reshape(3,3)
+   >>> x
+   array([[0, 1, 2],
+         [3, 4, 5],
+         [6, 7, 8]])
+   >>> np.add.reduce(x, 1)
+   array([ 3, 12, 21])
+   >>> np.add.reduce(x, (0, 1))
+   36
+
+The *dtype* keyword allows you to manage a very common problem that arises
+when naively using :meth:`.ufunc.reduce`. Sometimes you may
+have an array of a certain data type and wish to add up all of its
+elements, but the result does not fit into the data type of the
+array. This commonly happens if you have an array of single-byte
+integers. The *dtype* keyword allows you to alter the data type over which
+the reduction takes place (and therefore the type of the output). Thus,
+you can ensure that the output is a data type with precision large enough
+to handle your output. The responsibility of altering the reduce type is
+mostly up to you. There is one exception: if no *dtype* is given for a
+reduction on the "add" or "multiply" operations, then if the input type is
+an integer (or Boolean) data-type and smaller than the size of the
+:class:`numpy.int_` data type, it will be internally upcast to the :class:`.int_`
+(or :class:`numpy.uint`) data-type. In the previous example::
+
+   >>> x.dtype 
+   dtype('int64')
+   >>> np.multiply.reduce(x, dtype=float)
+   array([ 0., 28., 80.])
+
+Finally, the *out* keyword allows you to
+provide an output array (for single-output ufuncs, which are currently the only
+ones supported; for future extension, however, a tuple with a single argument
+can be passed in). If *out* is given, the *dtype* argument is ignored.
+Considering ``x`` from the previous example::
+
+   >>> y = np.zeros(3, dtype=int)
+   >>> y
+   array([0, 0, 0])
+   >>> np.multiply.reduce(x, dtype=float, out=y)
+   array([ 0, 28, 80])     # dtype argument is ignored
+
+Ufuncs also have a fifth method, :func:`numpy.ufunc.at`, that allows in place
+operations to be performed using advanced indexing. No
+:ref:`buffering <use-of-internal-buffers>` is used on the dimensions where
+advanced indexing is used, so the advanced index can
+list an item more than once and the operation will be performed on the result
+of the previous operation for that item.
+
+
+.. _ufuncs-output-type:
+
+Output type determination
+=========================
+
+The output of the ufunc (and its methods) is not necessarily an
+:class:`ndarray <numpy.ndarray>`, if all input arguments are not
+:class:`ndarrays <numpy.ndarray>`. Indeed, if any input defines an
+:obj:`~.class.__array_ufunc__` method,
+control will be passed completely to that function, i.e., the ufunc is
+:ref:`overridden <ufuncs.overrides>`.
+
+If none of the inputs overrides the ufunc, then
+all output arrays will be passed to the
+:obj:`~.class.__array_prepare__` and
+:obj:`~.class.__array_wrap__` methods of the input (besides
+:class:`ndarrays <.ndarray>`, and scalars) that defines it **and** has
+the highest :obj:`~.class.__array_priority__`
+of any other input to the universal function. The default
+:obj:`~.class.__array_priority__` of the
+ndarray is 0.0, and the default :obj:`~.class.__array_priority__` of a subtype
+is 0.0. Matrices have :obj:`~.class.__array_priority__` equal to 10.0.
+
+All ufuncs can also take output arguments. If necessary, output will
+be cast to the data-type(s) of the provided output array(s). If a class
+with an :obj:`~.class.__array__` method is used for the output,
+results will be written to the object returned by :obj:`~.class.__array__`.
+Then, if the class also has an :obj:`~.class.__array_prepare__` method, it is
+called so metadata may be determined based on the context of the ufunc (the
+context consisting of the ufunc itself, the arguments passed to the ufunc, and
+the ufunc domain.) The array object returned by
+:obj:`~.class.__array_prepare__` is passed to the ufunc for computation.
+Finally, if the class also has an :obj:`~.class.__array_wrap__` method, the
+returned :class:`.ndarray` result will be passed to that method just before
+passing control back to the caller.
+
+.. _ufuncs.broadcasting:
+
+Broadcasting
+============
+
+.. seealso:: :doc:`Broadcasting basics <basics.broadcasting>`
+
+.. index:: broadcasting
+
+Each universal function takes array inputs and produces array outputs
+by performing the core function element-wise on the inputs (where an
+element is generally a scalar, but can be a vector or higher-order
+sub-array for generalized ufuncs). Standard
+:ref:`broadcasting rules <general-broadcasting-rules>` are applied
+so that inputs not sharing exactly the
+same shapes can still be usefully operated on. 
+
+By these rules, if an input has a dimension size of 1 in its shape, the
+first data entry in that dimension will be used for all calculations along
+that dimension. In other words, the stepping machinery of the
+:term:`ufunc` will simply not step along that dimension (the
+:ref:`stride <memory-layout>` will be 0 for that dimension).
+   
+
+.. _ufuncs.casting:
+
+Type casting rules
+==================
+
+.. index::
+   pair: ufunc; casting rules
+
+.. note::
+
+   In NumPy 1.6.0, a type promotion API was created to encapsulate the
+   mechanism for determining output types. See the functions
+   :func:`numpy.result_type`, :func:`numpy.promote_types`, and
+   :func:`numpy.min_scalar_type` for more details.
+
+At the core of every ufunc is a one-dimensional strided loop that
+implements the actual function for a specific type combination. When a
+ufunc is created, it is given a static list of inner loops and a
+corresponding list of type signatures over which the ufunc operates.
+The ufunc machinery uses this list to determine which inner loop to
+use for a particular case. You can inspect the :attr:`.types
+<.ufunc.types>` attribute for a particular ufunc to see which type
+combinations have a defined inner loop and which output type they
+produce (:ref:`character codes <arrays.scalars.character-codes>` are used
+in said output for brevity).
+
+Casting must be done on one or more of the inputs whenever the ufunc
+does not have a core loop implementation for the input types provided.
+If an implementation for the input types cannot be found, then the
+algorithm searches for an implementation with a type signature to
+which all of the inputs can be cast "safely." The first one it finds
+in its internal list of loops is selected and performed, after all
+necessary type casting. Recall that internal copies during ufuncs (even
+for casting) are limited to the size of an internal buffer (which is user
+settable).
+
+.. note::
+
+    Universal functions in NumPy are flexible enough to have mixed type
+    signatures. Thus, for example, a universal function could be defined
+    that works with floating-point and integer values. See
+    :func:`numpy.ldexp` for an example.
+
+By the above description, the casting rules are essentially
+implemented by the question of when a data type can be cast "safely"
+to another data type. The answer to this question can be determined in
+Python with a function call: :func:`can_cast(fromtype, totype)
+<numpy.can_cast>`. The example below shows the results of this call for
+the 24 internally supported types on the author's 64-bit system. You
+can generate this table for your system with the code given in the example.
+
+.. rubric:: Example
+
+Code segment showing the "can cast safely" table for a 64-bit system.
+Generally the output depends on the system; your system might result in
+a different table.
+
+>>> mark = {False: ' -', True: ' Y'}
+>>> def print_table(ntypes):
+...     print('X ' + ' '.join(ntypes))
+...     for row in ntypes:
+...         print(row, end='')
+...         for col in ntypes:
+...             print(mark[np.can_cast(row, col)], end='')
+...         print()
+...
+>>> print_table(np.typecodes['All'])
+X ? b h i l q p B H I L Q P e f d g F D G S U V O M m
+? Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y - Y
+b - Y Y Y Y Y Y - - - - - - Y Y Y Y Y Y Y Y Y Y Y - Y
+h - - Y Y Y Y Y - - - - - - - Y Y Y Y Y Y Y Y Y Y - Y
+i - - - Y Y Y Y - - - - - - - - Y Y - Y Y Y Y Y Y - Y
+l - - - - Y Y Y - - - - - - - - Y Y - Y Y Y Y Y Y - Y
+q - - - - Y Y Y - - - - - - - - Y Y - Y Y Y Y Y Y - Y
+p - - - - Y Y Y - - - - - - - - Y Y - Y Y Y Y Y Y - Y
+B - - Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y - Y
+H - - - Y Y Y Y - Y Y Y Y Y - Y Y Y Y Y Y Y Y Y Y - Y
+I - - - - Y Y Y - - Y Y Y Y - - Y Y - Y Y Y Y Y Y - Y
+L - - - - - - - - - - Y Y Y - - Y Y - Y Y Y Y Y Y - -
+Q - - - - - - - - - - Y Y Y - - Y Y - Y Y Y Y Y Y - -
+P - - - - - - - - - - Y Y Y - - Y Y - Y Y Y Y Y Y - -
+e - - - - - - - - - - - - - Y Y Y Y Y Y Y Y Y Y Y - -
+f - - - - - - - - - - - - - - Y Y Y Y Y Y Y Y Y Y - -
+d - - - - - - - - - - - - - - - Y Y - Y Y Y Y Y Y - -
+g - - - - - - - - - - - - - - - - Y - - Y Y Y Y Y - -
+F - - - - - - - - - - - - - - - - - Y Y Y Y Y Y Y - -
+D - - - - - - - - - - - - - - - - - - Y Y Y Y Y Y - -
+G - - - - - - - - - - - - - - - - - - - Y Y Y Y Y - -
+S - - - - - - - - - - - - - - - - - - - - Y Y Y Y - -
+U - - - - - - - - - - - - - - - - - - - - - Y Y Y - -
+V - - - - - - - - - - - - - - - - - - - - - - Y Y - -
+O - - - - - - - - - - - - - - - - - - - - - - - Y - -
+M - - - - - - - - - - - - - - - - - - - - - - Y Y Y -
+m - - - - - - - - - - - - - - - - - - - - - - Y Y - Y
+
+You should note that, while included in the table for completeness,
+the 'S', 'U', and 'V' types cannot be operated on by ufuncs. Also,
+note that on a 32-bit system the integer types may have different
+sizes, resulting in a slightly altered table.
+
+Mixed scalar-array operations use a different set of casting rules
+that ensure that a scalar cannot "upcast" an array unless the scalar is
+of a fundamentally different kind of data (i.e., under a different
+hierarchy in the data-type hierarchy) than the array.  This rule
+enables you to use scalar constants in your code (which, as Python
+types, are interpreted accordingly in ufuncs) without worrying about
+whether the precision of the scalar constant will cause upcasting on
+your large (small precision) array.
+
+.. _use-of-internal-buffers:
+
+Use of internal buffers
+=======================
+
+.. index:: buffers
+
+Internally, buffers are used for misaligned data, swapped data, and
+data that has to be converted from one data type to another. The size
+of internal buffers is settable on a per-thread basis. There can
+be up to :math:`2 (n_{\mathrm{inputs}} + n_{\mathrm{outputs}})`
+buffers of the specified size created to handle the data from all the
+inputs and outputs of a ufunc. The default size of a buffer is
+10,000 elements. Whenever buffer-based calculation would be needed,
+but all input arrays are smaller than the buffer size, those
+misbehaved or incorrectly-typed arrays will be copied before the
+calculation proceeds. Adjusting the size of the buffer may therefore
+alter the speed at which ufunc calculations of various sorts are
+completed. A simple interface for setting this variable is accessible
+using the function :func:`numpy.setbufsize`.
+
+
+Error handling
+==============
+
+.. index:: error handling
+
+Universal functions can trip special floating-point status registers
+in your hardware (such as divide-by-zero). If available on your
+platform, these registers will be regularly checked during
+calculation. Error handling is controlled on a per-thread basis,
+and can be configured using the functions :func:`numpy.seterr` and
+:func:`numpy.seterrcall`.
+   
+
+.. _ufuncs.overrides:
+
+Overriding ufunc behavior
+=========================
+
+Classes (including ndarray subclasses) can override how ufuncs act on
+them by defining certain special methods.  For details, see
+:ref:`arrays.classes`.
diff --git a/doc/source/user/broadcasting_1.svg b/doc/source/user/broadcasting_1.svg
new file mode 100644 (file)
index 0000000..4031c3a
--- /dev/null
@@ -0,0 +1,669 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="137.50784mm"
+   height="50.70256mm"
+   viewBox="0 0 137.50784 50.70256"
+   version="1.1"
+   id="svg5"
+   sodipodi:docname="theory.broadcasting_1.svg"
+   inkscape:version="1.1 (c68e22c387, 2021-05-23)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview7"
+     pagecolor="#505050"
+     bordercolor="#eeeeee"
+     borderopacity="1"
+     inkscape:pageshadow="0"
+     inkscape:pageopacity="0"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="mm"
+     showgrid="false"
+     showguides="true"
+     inkscape:zoom="1.3289991"
+     inkscape:cx="-66.591468"
+     inkscape:cy="32.731399"
+     inkscape:window-width="1920"
+     inkscape:window-height="1001"
+     inkscape:window-x="-9"
+     inkscape:window-y="-9"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1"
+     fit-margin-top="5"
+     fit-margin-left="5"
+     fit-margin-right="5"
+     fit-margin-bottom="5">
+    <inkscape:grid
+       type="xygrid"
+       id="grid47998"
+       originx="-26.434583"
+       originy="-13.532259" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2">
+    <marker
+       style="overflow:visible"
+       id="Arrow1Lend"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         id="path96534" />
+    </marker>
+  </defs>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-26.434582,-13.53226)">
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 31.508555,33.859917 4.704047,-5.931184"
+       id="path5205"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 58.319717,33.859917 4.704047,-5.931184"
+       id="path6922"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 49.382665,33.859917 4.704048,-5.931184"
+       id="path6924"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 40.445607,33.859917 4.704048,-5.931184"
+       id="path6926"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 58.319717,47.091968 4.704047,-5.931184"
+       id="path6961"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 36.212602,27.928733 h 8.937053 8.937058 8.937051"
+       id="path6996"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="M 63.023764,27.928733 V 41.160784"
+       id="path7224"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 31.508555,33.859917 4.704047,-5.931184"
+       id="path9982"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 58.319717,33.859917 4.704047,-5.931184"
+       id="path9988"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 49.382665,33.859917 4.704048,-5.931184"
+       id="path9990"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 40.445607,33.859917 4.704048,-5.931184"
+       id="path9992"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 58.319717,47.091968 4.704047,-5.931184"
+       id="path9994"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 36.212602,27.928733 h 8.937053 8.937058 8.937051"
+       id="path9996"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="M 63.023764,27.928733 V 41.160784"
+       id="path9998"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 79.344654,34.069936 4.704047,-5.931184"
+       id="path48002"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 106.15582,34.069936 4.70405,-5.931184"
+       id="path48008"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 97.21876,34.069936 4.70405,-5.931184"
+       id="path48010"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 88.281704,34.069936 4.704049,-5.931184"
+       id="path48012"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 106.15582,47.301981 4.70405,-5.931184"
+       id="path48014"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 110.85987,28.138752 V 41.370797"
+       id="path48018"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 79.344654,34.069936 4.704047,-5.931184"
+       id="path48030"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 106.15582,34.069936 4.70405,-5.931184"
+       id="path48036"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 97.21876,34.069936 4.70405,-5.931184"
+       id="path48038"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 88.281704,34.069936 4.704049,-5.931184"
+       id="path48040"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 106.15582,47.301981 4.70405,-5.931184"
+       id="path48042"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 84.048701,28.138752 h 8.937052 8.937057 8.93706"
+       id="path48044"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 110.85987,28.138752 V 41.370797"
+       id="path48046"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 79.344654,34.069936 h 8.93705 8.937056 8.93706 v 13.232045"
+       id="path52709"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 106.15582,47.301981 H 97.218767 88.28171 79.344654 V 34.069936"
+       id="path53128"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 88.281704,34.069936 V 47.301981"
+       id="path53650"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.147946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 97.21876,34.069936 V 47.301981"
+       id="path53935"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:#fcffff;fill-opacity:1;stroke:#000000;stroke-width:0.248;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 79.597689,33.925906 c 0.0217,-0.0352 1.048179,-1.335017 2.281023,-2.888597 l 2.241541,-2.824686 h 4.341296 4.341292 l -2.286401,2.886538 -2.286409,2.886544 -4.335912,0.0019 c -3.456122,0.0019 -4.327906,-0.01087 -4.29643,-0.06183 z"
+       id="path53974"
+       sodipodi:nodetypes="cscccccccc" />
+    <path
+       style="fill:#fcffff;fill-opacity:1;stroke:#c2c0c0;stroke-width:0.128684;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 88.519647,33.947332 c 0.0095,-0.02368 1.029425,-1.322348 2.26667,-2.885914 l 2.249527,-2.842843 4.332898,-0.0026 c 2.383092,-0.0019 4.332888,0.0078 4.332888,0.02098 0,0.01319 -1.01863,1.307278 -2.263631,2.875812 l -2.263628,2.851889 -4.335929,0.01306 c -2.384764,0.0072 -4.328222,-0.0064 -4.318795,-0.02998 z"
+       id="path54013"
+       sodipodi:nodetypes="csccsscccc" />
+    <path
+       style="fill:#fcffff;fill-opacity:1;stroke:#c2c0c0;stroke-width:0.128684;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 97.845189,33.440213 c 0.240884,-0.30228 0.711251,-0.894698 1.045271,-1.316486 0.793854,-1.002451 1.595,-2.012218 2.36656,-2.982813 0.34296,-0.431421 0.6492,-0.816914 0.68053,-0.856639 0.0485,-0.06138 0.70602,-0.07027 4.38287,-0.05913 l 4.32589,0.01306 -2.28034,2.875812 -2.28033,2.875818 h -4.33921 -4.339205 z"
+       id="path54052"
+       sodipodi:nodetypes="ssscccccccs" />
+    <path
+       style="fill:#fcffff;fill-opacity:1;stroke:#c2c0c0;stroke-width:0.128684;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 97.304831,40.661714 v -6.518518 h 4.371249 4.37124 v 6.518518 6.518518 h -4.37124 -4.371249 z"
+       id="path54091"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       style="fill:#fcffff;fill-opacity:1;stroke:#c2c0c0;stroke-width:0.128684;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 88.357846,40.661714 v -6.518518 h 4.37124 4.37124 v 6.518518 6.518518 h -4.37124 -4.37124 z"
+       id="path54130"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       style="fill:#fcffff;fill-opacity:1;stroke:#000000;stroke-width:0.248;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 79.461984,40.661714 v -6.518518 h 4.371248 4.37124 v 6.518518 6.518518 h -4.37124 -4.371248 z"
+       id="path54169"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       style="fill:#fcffff;fill-opacity:1;stroke:#c2c0c0;stroke-width:0.128684;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 106.25221,40.556901 4.4e-4,-6.439275 2.22941,-2.811907 c 1.22617,-1.546548 2.23829,-2.821501 2.24913,-2.833211 0.0109,-0.01171 0.0198,2.878057 0.0198,6.421722 v 6.443019 l -2.20348,2.780901 c -1.21193,1.529484 -2.22422,2.802751 -2.24953,2.82946 -0.0273,0.02882 -0.0459,-2.570193 -0.0456,-6.390709 z"
+       id="path54208"
+       sodipodi:nodetypes="ccscsccscc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 31.508555,33.859917 h 8.937052 8.937058 8.937052"
+       id="path55000"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="M 58.319717,47.091968 V 33.859917"
+       id="path55035"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="M 31.508555,47.091968 V 33.859917"
+       id="path55070"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="M 40.445607,47.091968 V 33.859917"
+       id="path55072"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="M 49.382665,47.091968 V 33.859917"
+       id="path55074"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 31.508555,47.091968 h 8.937052 8.937058 8.937052"
+       id="path55189"
+       sodipodi:nodetypes="cccc" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="81.888199"
+       y="42.102463"
+       id="text62163"><tspan
+         sodipodi:role="line"
+         id="tspan62161"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="81.888199"
+         y="42.102463">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#c0c0c0;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="90.934624"
+       y="42.102463"
+       id="text66863"><tspan
+         sodipodi:role="line"
+         id="tspan66861"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#c0c0c0;fill-opacity:1;stroke-width:0.147946"
+         x="90.934624"
+         y="42.102463">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#c0c0c0;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="99.941132"
+       y="42.102463"
+       id="text77828"><tspan
+         sodipodi:role="line"
+         id="tspan77826"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#c0c0c0;fill-opacity:1;stroke-width:0.147946"
+         x="99.941132"
+         y="42.102463">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="69.630562"
+       y="41.596489"
+       id="text85828"><tspan
+         sodipodi:role="line"
+         id="tspan85826"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="69.630562"
+         y="41.596489">*</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="117.43818"
+       y="40.412045"
+       id="text87726"><tspan
+         sodipodi:role="line"
+         id="tspan87724"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="117.43818"
+         y="40.412045">=</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="44.636856"
+       y="23.010897"
+       id="text89497"><tspan
+         sodipodi:role="line"
+         id="tspan89495"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="44.636856"
+         y="23.010897"><tspan
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
+   id="tspan5460">a</tspan> (3)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="93.357834"
+       y="23.034334"
+       id="text90809"><tspan
+         sodipodi:role="line"
+         id="tspan90807"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="93.357834"
+         y="23.034334"><tspan
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
+   id="tspan2930">b</tspan> (1)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="136.34079"
+       y="22.840616"
+       id="text91329"><tspan
+         sodipodi:role="line"
+         id="tspan91327"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="136.34079"
+         y="22.840616"><tspan
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
+   id="tspan3730">result</tspan> (3)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="85.080841"
+       y="59.16547"
+       id="text93193"><tspan
+         sodipodi:role="line"
+         id="tspan93191"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="85.080841"
+         y="59.16547">stretch</tspan></text>
+    <path
+       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.165526;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 81.41288,52.445886 h 23.74344"
+       id="path96373"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:#ffffff;stroke:#000000;stroke-width:0.433145;stroke-miterlimit:5.30435;stroke-dasharray:none"
+       d="m 21.652887,74.977138 c 0.50651,-0.698939 4.230051,-5.429777 8.274534,-10.512973 l 7.353605,-9.242174 16.031996,-0.121532 16.031995,-0.121531 -5.423208,6.822108 c -2.982765,3.752159 -6.772069,8.537686 -8.420677,10.634504 l -2.997469,3.812397 H 36.61781 20.731958 Z"
+       id="path12997"
+       transform="matrix(0.26458333,0,0,0.26458333,26.434582,13.53226)" />
+    <path
+       style="fill:#ffffff;stroke:#000000;stroke-width:0.433145;stroke-miterlimit:5.30435;stroke-dasharray:none"
+       d="m 55.08026,75.409135 c 0.332112,-0.461342 4.101427,-5.244167 8.376257,-10.6285 l 7.772417,-9.789699 h 15.949964 15.949962 l -1.93952,2.426071 c -1.06673,1.334339 -4.858939,6.117164 -8.427127,10.6285 l -6.487614,8.20243 H 70.37551 c -15.273126,0 -15.875315,-0.03302 -15.29525,-0.838802 z"
+       id="path13036"
+       transform="matrix(0.26458333,0,0,0.26458333,26.434582,13.53226)" />
+    <path
+       style="fill:#ffffff;stroke:#000000;stroke-width:0.433145;stroke-miterlimit:5.30435;stroke-dasharray:none"
+       d="m 89.730475,74.283975 c 0.868474,-1.080179 4.664812,-5.863004 8.436305,-10.6285 l 6.85726,-8.664539 h 15.93574 15.93573 l -1.57904,1.963962 c -0.86848,1.08018 -4.66482,5.863005 -8.43631,10.628501 l -6.85726,8.664538 H 104.08717 88.15143 Z"
+       id="path13075"
+       transform="matrix(0.26458333,0,0,0.26458333,26.434582,13.53226)" />
+    <path
+       style="fill:#ffffff;stroke:#000000;stroke-width:0.433145;stroke-miterlimit:5.30435;stroke-dasharray:none"
+       d="M 87.338546,101.89497 V 77.634263 h 16.173804 16.17381 v 24.260707 24.26071 H 103.51235 87.338546 Z"
+       id="path13114"
+       transform="matrix(0.26458333,0,0,0.26458333,26.434582,13.53226)" />
+    <path
+       style="fill:#ffffff;stroke:#000000;stroke-width:0.433145;stroke-miterlimit:5.30435;stroke-dasharray:none"
+       d="M 53.60461,101.89497 V 77.634263 H 69.778415 85.95222 v 24.260707 24.26071 H 69.778415 53.60461 Z"
+       id="path13153"
+       transform="matrix(0.26458333,0,0,0.26458333,26.434582,13.53226)" />
+    <path
+       style="fill:#ffffff;stroke:#000000;stroke-width:0.433145;stroke-miterlimit:5.30435;stroke-dasharray:none"
+       d="M 19.870674,101.89497 V 77.634263 h 16.173805 16.173805 v 24.260707 24.26071 H 36.044479 19.870674 Z"
+       id="path13192"
+       transform="matrix(0.26458333,0,0,0.26458333,26.434582,13.53226)" />
+    <path
+       style="fill:#ffffff;stroke:#000000;stroke-width:0.433145;stroke-miterlimit:5.30435;stroke-dasharray:none"
+       d="M 121.07248,101.12036 V 77.327368 l 8.20243,-10.336784 8.20243,-10.336785 0.11972,23.659407 0.11973,23.659404 -8.32216,10.47037 -8.32215,10.47037 z"
+       id="path13231"
+       transform="matrix(0.26458333,0,0,0.26458333,26.434582,13.53226)" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="34.390987"
+       y="41.801289"
+       id="text11724"><tspan
+         sodipodi:role="line"
+         id="tspan11722"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="34.390987"
+         y="41.801289">1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="43.594547"
+       y="41.801289"
+       id="text11728"><tspan
+         sodipodi:role="line"
+         id="tspan11726"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="43.594547"
+         y="41.801289">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="52.389057"
+       y="41.801289"
+       id="text11732"><tspan
+         sodipodi:role="line"
+         id="tspan11730"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="52.389057"
+         y="41.801289">3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="34.390987"
+       y="41.801289"
+       id="text11736"><tspan
+         sodipodi:role="line"
+         id="tspan11734"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="34.390987"
+         y="41.801289">1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="43.594547"
+       y="41.801289"
+       id="text11740"><tspan
+         sodipodi:role="line"
+         id="tspan11738"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="43.594547"
+         y="41.801289">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+       x="52.389057"
+       y="41.801289"
+       id="text11744"><tspan
+         sodipodi:role="line"
+         id="tspan11742"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.147946"
+         x="52.389057"
+         y="41.801289">3</tspan></text>
+    <g
+       id="g14529"
+       transform="translate(-29.470708,43.570713)">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 156.53372,-9.7396236 4.70405,-5.9311844"
+         id="path14293"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 183.34488,-9.7396236 4.70405,-5.9311844"
+         id="path14295"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 174.40783,-9.7396236 4.70405,-5.9311844"
+         id="path14297"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 165.47077,-9.7396236 4.70405,-5.9311844"
+         id="path14299"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 183.34488,3.4924274 4.70405,-5.931184"
+         id="path14301"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 161.23777,-15.670808 h 8.93705 8.93706 8.93705"
+         id="path14303"
+         sodipodi:nodetypes="cccc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 188.04893,-15.670808 V -2.4387566"
+         id="path14305"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 156.53372,-9.7396236 4.70405,-5.9311844"
+         id="path14307"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 183.34488,-9.7396236 4.70405,-5.9311844"
+         id="path14309"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 174.40783,-9.7396236 4.70405,-5.9311844"
+         id="path14311"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 165.47077,-9.7396236 4.70405,-5.9311844"
+         id="path14313"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 183.34488,3.4924274 4.70405,-5.931184"
+         id="path14315"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 161.23777,-15.670808 h 8.93705 8.93706 8.93705"
+         id="path14317"
+         sodipodi:nodetypes="cccc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 188.04893,-15.670808 V -2.4387566"
+         id="path14319"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 156.53372,-9.7396236 h 8.93705 8.93706 8.93705"
+         id="path14321"
+         sodipodi:nodetypes="cccc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 183.34488,3.4924274 V -9.7396236"
+         id="path14323"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 156.53372,3.4924274 V -9.7396236"
+         id="path14325"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 165.47077,3.4924274 V -9.7396236"
+         id="path14327"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 174.40783,3.4924274 V -9.7396236"
+         id="path14329"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 156.53372,3.4924274 h 8.93705 8.93706 8.93705"
+         id="path14331"
+         sodipodi:nodetypes="cccc" />
+      <path
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.114603;stroke-miterlimit:5.30435;stroke-dasharray:none"
+         d="m 157.18874,-10.22958 c 0.13402,-0.184927 1.1192,-1.436628 2.18931,-2.781557 l 1.94564,-2.445325 4.2418,-0.03216 4.24179,-0.03215 -1.43489,1.805016 c -0.78919,0.992759 -1.79177,2.25893 -2.22797,2.813713 l -0.79308,1.0086964 h -4.20313 -4.20313 z"
+         id="path14333" />
+      <path
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.114603;stroke-miterlimit:5.30435;stroke-dasharray:none"
+         d="m 166.03307,-10.115281 c 0.0879,-0.122063 1.08517,-1.387519 2.21622,-2.812124 l 2.05645,-2.590191 h 4.22009 4.2201 l -0.51317,0.641898 c -0.28224,0.353044 -1.28559,1.6185 -2.22968,2.812124 l -1.71651,2.1702264 h -4.20663 c -4.04102,0 -4.20035,-0.00874 -4.04687,-0.2219334 z"
+         id="path14335" />
+      <path
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.114603;stroke-miterlimit:5.30435;stroke-dasharray:none"
+         d="m 175.20094,-10.412979 c 0.22978,-0.285798 1.23423,-1.551253 2.2321,-2.812124 l 1.81432,-2.292493 h 4.21633 4.21633 l -0.41779,0.519632 c -0.22978,0.285798 -1.23423,1.551253 -2.23211,2.812124 l -1.81431,2.2924924 h -4.21633 -4.21633 z"
+         id="path14337" />
+      <path
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.114603;stroke-miterlimit:5.30435;stroke-dasharray:none"
+         d="m 174.56807,-3.1075702 v -6.4189786 h 4.27932 4.27932 v 6.4189786 6.4189795 h -4.27932 -4.27932 z"
+         id="path14339" />
+      <path
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.114603;stroke-miterlimit:5.30435;stroke-dasharray:none"
+         d="m 165.64264,-3.1075702 v -6.4189786 h 4.27931 4.27932 v 6.4189786 6.4189795 h -4.27932 -4.27931 z"
+         id="path14341" />
+      <path
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.114603;stroke-miterlimit:5.30435;stroke-dasharray:none"
+         d="m 156.7172,-3.1075702 v -6.4189786 h 4.27932 4.27932 v 6.4189786 6.4189795 h -4.27932 -4.27932 z"
+         id="path14343" />
+      <path
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.114603;stroke-miterlimit:5.30435;stroke-dasharray:none"
+         d="m 183.49351,-3.3125191 v -6.295229 l 2.17022,-2.7349409 2.17023,-2.734941 0.0317,6.2598848 0.0317,6.2598839 -2.20191,2.7702854 -2.2019,2.7702854 z"
+         id="path14345" />
+      <g
+         id="g14377"
+         transform="translate(29.265446,-43.59954)">
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+           x="130.58751"
+           y="42.458767"
+           id="text77832"><tspan
+             sodipodi:role="line"
+             id="tspan77830"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.147946"
+             x="130.58751"
+             y="42.458767">2</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+           x="139.3645"
+           y="42.501537"
+           id="text79640"><tspan
+             sodipodi:role="line"
+             id="tspan79638"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.147946"
+             x="139.3645"
+             y="42.501537">4</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.147946"
+           x="148.36816"
+           y="42.501537"
+           id="text81564"><tspan
+             sodipodi:role="line"
+             id="tspan81562"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.91785px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.147946"
+             x="148.36816"
+             y="42.501537">6</tspan></text>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/doc/source/user/broadcasting_2.svg b/doc/source/user/broadcasting_2.svg
new file mode 100644 (file)
index 0000000..6985dad
--- /dev/null
@@ -0,0 +1,1308 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="136.12085mm"
+   height="55.258423mm"
+   viewBox="0 0 136.12085 55.258424"
+   version="1.1"
+   id="svg2361"
+   inkscape:version="1.1 (c68e22c387, 2021-05-23)"
+   sodipodi:docname="theory.broadcasting_2.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview2363"
+     pagecolor="#004100"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="mm"
+     showgrid="true"
+     inkscape:zoom="1.7469907"
+     inkscape:cx="30.051677"
+     inkscape:cy="75.844708"
+     inkscape:window-width="1920"
+     inkscape:window-height="1001"
+     inkscape:window-x="-9"
+     inkscape:window-y="-9"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1"
+     lock-margins="false"
+     fit-margin-top="5"
+     fit-margin-left="5"
+     fit-margin-right="5"
+     fit-margin-bottom="5"
+     showguides="true"
+     inkscape:guide-bbox="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid44453"
+       originx="-1.3010658"
+       originy="-2.8566359" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2358">
+    <marker
+       style="overflow:visible"
+       id="Arrow1Lend"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         id="path96534" />
+    </marker>
+  </defs>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(142.99324,-67.354454)">
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.57899px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.114475"
+       x="90.957649"
+       y="63.798756"
+       id="text93193"
+       transform="rotate(90)"><tspan
+         sodipodi:role="line"
+         id="tspan93191"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.57899px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.114475"
+         x="90.957649"
+         y="63.798756">stretch</tspan></text>
+    <path
+       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.236131;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M -64.919305,88.215985 V 106.5877"
+       id="path96373" />
+    <g
+       id="g46002"
+       transform="matrix(1.0057054,0,0,1.0057054,-82.208516,-72.64114)">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,165.23404 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21691" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,157.41086 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21910" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,165.23404 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21912" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,157.41086 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21914" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,173.05722 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21916" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,173.05722 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21918" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,180.8804 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21920" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,180.8804 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21922" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,165.23404 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21924" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,173.05722 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21926" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,157.41086 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21928" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,180.8804 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21930" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,157.41086 4.34622,-6.08471"
+         id="path22112" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M -31.866393,157.58471 -27.520173,151.5"
+         id="path22147" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M -39.689583,157.58471 -35.343363,151.5"
+         id="path22149" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M -47.512773,157.58471 -43.166553,151.5"
+         id="path22151" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -27.520173,151.5 v 31.29272"
+         id="path22266" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -50.989743,151.32615 7.82319,0.17385 h 7.82319 7.82319"
+         id="path22381" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,188.87743 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22496" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,165.40789 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22644" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,173.23107 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22646" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,181.05425 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22648" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,165.23404 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22650" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,157.41086 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22652" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,165.23404 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22654" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,157.41086 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22656" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,173.05722 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22658" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,173.05722 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22660" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,180.8804 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22662" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,180.8804 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22664" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,165.23404 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22666" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,173.05722 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22668" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,157.41086 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22670" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,180.8804 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22672" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,157.41086 4.34622,-6.08471"
+         id="path22674" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M -31.866393,157.58471 -27.520173,151.5"
+         id="path22676" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M -39.689583,157.58471 -35.343363,151.5"
+         id="path22678" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M -47.512773,157.58471 -43.166553,151.5"
+         id="path22680" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -27.520173,151.5 v 31.29272"
+         id="path22682" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -50.989743,151.32615 7.82319,0.17385 h 7.82319 7.82319"
+         id="path22684" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,188.87743 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22686" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,165.40789 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22688" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,173.23107 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22690" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,181.05425 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22692" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -55.142483,161.45304 v -3.71055 h 3.71055 3.71054 v 3.71055 3.71055 h -3.71054 -3.71055 z"
+         id="path13541" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -47.267033,161.45304 v -3.71055 h 3.71054 3.71055 v 3.71055 3.71055 h -3.71055 -3.71054 z"
+         id="path13580" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -39.543043,161.45304 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71055 h -3.71055 -3.71055 z"
+         id="path13619" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -39.543043,169.32849 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71054 h -3.71055 -3.71055 z"
+         id="path13658" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -47.267033,169.32849 v -3.71055 h 3.71054 3.71055 v 3.71055 3.71054 h -3.71055 -3.71054 z"
+         id="path13697" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -55.142483,169.32849 v -3.71055 h 3.71055 3.71054 v 3.71055 3.71054 h -3.71054 -3.71055 z"
+         id="path13736" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -55.142483,177.20393 v -3.71054 h 3.71055 3.71054 v 3.71054 3.71055 h -3.71054 -3.71055 z"
+         id="path13775" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -47.267033,177.20393 v -3.71054 h 3.71054 3.71055 v 3.71054 3.71055 h -3.71055 -3.71054 z"
+         id="path13814" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -39.543043,177.20393 v -3.71054 h 3.71055 3.71055 v 3.71054 3.71055 h -3.71055 -3.71055 z"
+         id="path13853" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -39.543043,184.92793 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71055 h -3.71055 -3.71055 z"
+         id="path13892" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -47.267033,184.92793 v -3.71055 h 3.71054 3.71055 v 3.71055 3.71055 h -3.71055 -3.71054 z"
+         id="path13931" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -55.142483,184.92793 v -3.71055 h 3.71055 3.71054 v 3.71055 3.71055 h -3.71054 -3.71055 z"
+         id="path13970" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -54.899273,157.25299 c 0.0622,-0.10561 0.9991,-1.43582 2.08211,-2.95601 l 1.96911,-2.76398 1.44974,0.019 c 0.79736,0.0105 2.42287,0.0616 3.61225,0.11359 l 2.1625,0.0945 -2.01181,2.80185 -2.0118,2.80184 -3.68255,0.0406 c -2.94083,0.0324 -3.65979,0.002 -3.56955,-0.15145 z"
+         id="path14009" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -46.783393,156.94737 c 0.20247,-0.27071 1.13436,-1.56562 2.07086,-2.87756 l 1.70272,-2.38535 h 3.62228 3.62228 l -2.05577,2.87756 -2.05578,2.87757 h -3.63737 -3.63736 z"
+         id="path14048" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -39.134073,157.23722 c 0.0666,-0.11131 0.97302,-1.40328 2.01425,-2.87104 l 1.89313,-2.66867 3.60958,-0.007 c 1.98527,-0.004 3.58686,0.0493 3.5591,0.11756 -0.0278,0.0683 -0.93452,1.36316 -2.015,2.87757 l -1.96451,2.75347 h -3.60883 c -2.97073,0 -3.58742,-0.0358 -3.48772,-0.20237 z"
+         id="path14087" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -31.667593,161.15934 v -3.45903 l 1.83964,-2.59144 c 1.01181,-1.42529 1.89779,-2.65618 1.96886,-2.73531 0.0718,-0.0799 0.12922,1.40769 0.12922,3.34472 v 3.4886 l -1.82587,2.56186 c -1.00422,1.40903 -1.89021,2.62661 -1.96886,2.70574 -0.0897,0.0903 -0.14299,-1.14491 -0.14299,-3.31514 z"
+         id="path14126" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -31.667593,169.01521 v -3.47859 l 1.83457,-2.57187 c 1.00901,-1.41453 1.895,-2.63661 1.96886,-2.71575 0.0784,-0.084 0.13429,1.30477 0.13429,3.33472 v 3.4786 l -1.83457,2.57187 c -1.00901,1.41452 -1.895,2.63661 -1.96886,2.71574 -0.0784,0.084 -0.13429,-1.30476 -0.13429,-3.33472 z"
+         id="path14165" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -31.667593,176.85105 v -3.49847 l 1.96886,-2.75406 1.96886,-2.75406 v 3.51758 3.51757 l -1.69335,2.37377 c -0.93135,1.30557 -1.81734,2.5363 -1.96886,2.73496 -0.26885,0.35246 -0.27551,0.27663 -0.27551,-3.13729 z"
+         id="path14204" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -31.667593,184.63423 v -3.45903 l 1.83964,-2.59143 c 1.01181,-1.4253 1.89779,-2.65619 1.96886,-2.73532 0.0718,-0.0799 0.12922,1.40768 0.12922,3.34472 v 3.4886 l -1.82587,2.56186 c -1.00422,1.40903 -1.89021,2.62661 -1.96886,2.70575 -0.0897,0.0903 -0.14299,-1.14492 -0.14299,-3.31515 z"
+         id="path14243" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-36.608471"
+         y="162.74039"
+         id="text17645"><tspan
+           sodipodi:role="line"
+           id="tspan17643"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-36.608471"
+           y="162.74039">0</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-37.600399"
+         y="170.6588"
+         id="text21689"><tspan
+           sodipodi:role="line"
+           id="tspan21687"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-37.600399"
+           y="170.6588">10</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-37.477116"
+         y="178.57722"
+         id="text22617"><tspan
+           sodipodi:role="line"
+           id="tspan22615"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-37.477116"
+           y="178.57722">20</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-37.494289"
+         y="186.49469"
+         id="text23721"><tspan
+           sodipodi:role="line"
+           id="tspan23719"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-37.494289"
+           y="186.49469">30</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-44.447037"
+         y="162.74039"
+         id="text25685"><tspan
+           sodipodi:role="line"
+           id="tspan25683"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-44.447037"
+           y="162.74039">0</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-45.438965"
+         y="170.6588"
+         id="text25689"><tspan
+           sodipodi:role="line"
+           id="tspan25687"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-45.438965"
+           y="170.6588">10</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-45.315681"
+         y="178.57722"
+         id="text25693"><tspan
+           sodipodi:role="line"
+           id="tspan25691"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-45.315681"
+           y="178.57722">20</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-45.332859"
+         y="186.49469"
+         id="text25697"><tspan
+           sodipodi:role="line"
+           id="tspan25695"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-45.332859"
+           y="186.49469">30</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-52.285603"
+         y="162.74039"
+         id="text25701"><tspan
+           sodipodi:role="line"
+           id="tspan25699"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-52.285603"
+           y="162.74039">0</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-53.277534"
+         y="170.6588"
+         id="text25705"><tspan
+           sodipodi:role="line"
+           id="tspan25703"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-53.277534"
+           y="170.6588">10</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-53.154247"
+         y="178.57722"
+         id="text25709"><tspan
+           sodipodi:role="line"
+           id="tspan25707"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-53.154247"
+           y="178.57722">20</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-53.171425"
+         y="186.49469"
+         id="text25713"><tspan
+           sodipodi:role="line"
+           id="tspan25711"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-53.171425"
+           y="186.49469">30</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -88.477569,93.701364 v 8.042716 h 7.867883 v -7.867871 h -7.867883 z"
+       id="path22942" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -88.477569,85.833492 v 8.042717 h 7.867883 v -7.867873 h -7.867883 z"
+       id="path22944" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -96.345452,93.701364 v 8.042716 h 7.867883 v -7.867871 h -7.867883 z"
+       id="path22946" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -96.345452,85.833492 v 8.042717 h 7.867883 v -7.867873 h -7.867883 z"
+       id="path22948" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -88.477569,101.56924 v 8.04271 h 7.867883 v -7.86787 h -7.867883 z"
+       id="path22950" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -80.609686,101.56924 v 8.04271 h 7.867885 v -7.86787 h -7.867885 z"
+       id="path22952" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -88.477569,109.43711 v 8.04272 h 7.867883 v -7.86788 h -7.867883 z"
+       id="path22954" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -96.345452,109.43711 v 8.04272 h 7.867883 v -7.86788 h -7.867883 z"
+       id="path22956" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -80.609686,93.701364 v 8.042716 h 7.867885 v -7.867871 h -7.867885 z"
+       id="path22958" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -96.345452,101.56924 v 8.04271 h 7.867883 v -7.86787 h -7.867883 z"
+       id="path22960" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -80.609686,85.833492 v 8.042717 h 7.867885 v -7.867873 h -7.867885 z"
+       id="path22962" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -80.609686,109.43711 v 8.04272 h 7.867885 v -7.86788 h -7.867885 z"
+       id="path22964" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -96.345452,85.833492 4.37105,-6.119472"
+       id="path22966" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -72.741801,86.008336 4.371049,-6.119471"
+       id="path22968" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -80.609686,86.008336 4.371051,-6.119471"
+       id="path22970" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -88.477569,86.008336 4.37105,-6.119471"
+       id="path22972" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -91.974402,79.71402 7.867883,0.174845 h 7.867884 7.867883"
+       id="path22976" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -72.741801,117.47983 c 4.371049,-6.11948 4.371049,-6.11948 4.371049,-6.11948"
+       id="path22978" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -72.741801,93.876209 c 4.371049,-6.119471 4.371049,-6.119471 4.371049,-6.119471"
+       id="path22980" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -72.741801,101.74408 c 4.371049,-6.119469 4.371049,-6.119469 4.371049,-6.119469"
+       id="path22982" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -72.741801,109.61195 c 4.371049,-6.11947 4.371049,-6.11947 4.371049,-6.11947"
+       id="path22984" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -88.477569,93.701364 v 8.042716 h 7.867883 v -7.867871 h -7.867883 z"
+       id="path22986" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -88.477569,85.833492 v 8.042717 h 7.867883 v -7.867873 h -7.867883 z"
+       id="path22988" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -96.345452,93.701364 v 8.042716 h 7.867883 v -7.867871 h -7.867883 z"
+       id="path22990" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -96.345452,85.833492 v 8.042717 h 7.867883 v -7.867873 h -7.867883 z"
+       id="path22992" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -88.477569,101.56924 v 8.04271 h 7.867883 v -7.86787 h -7.867883 z"
+       id="path22994" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -80.609686,101.56924 v 8.04271 h 7.867885 v -7.86787 h -7.867885 z"
+       id="path22996" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -88.477569,109.43711 v 8.04272 h 7.867883 v -7.86788 h -7.867883 z"
+       id="path22998" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -96.345452,109.43711 v 8.04272 h 7.867883 v -7.86788 h -7.867883 z"
+       id="path23000" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -80.609686,93.701364 v 8.042716 h 7.867885 v -7.867871 h -7.867885 z"
+       id="path23002" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -96.345452,101.56924 v 8.04271 h 7.867883 v -7.86787 h -7.867883 z"
+       id="path23004" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -80.609686,85.833492 v 8.042717 h 7.867885 v -7.867873 h -7.867885 z"
+       id="path23006" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -80.609686,109.43711 v 8.04272 h 7.867885 v -7.86788 h -7.867885 z"
+       id="path23008" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -96.345452,85.833492 4.37105,-6.119472"
+       id="path23010" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -72.741801,86.008336 4.371049,-6.119471"
+       id="path23012" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -80.609686,86.008336 4.371051,-6.119471"
+       id="path23014" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -88.477569,86.008336 4.37105,-6.119471"
+       id="path23016" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -91.974402,79.71402 7.867883,0.174845 h 7.867884 7.867883"
+       id="path23020" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -72.741801,117.47983 c 4.371049,-6.11948 4.371049,-6.11948 4.371049,-6.11948"
+       id="path23022" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -72.741801,93.876209 c 4.371049,-6.119471 4.371049,-6.119471 4.371049,-6.119471"
+       id="path23024" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -72.741801,101.74408 c 4.371049,-6.119469 4.371049,-6.119469 4.371049,-6.119469"
+       id="path23026" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -72.741801,109.61195 c 4.371049,-6.11947 4.371049,-6.11947 4.371049,-6.11947"
+       id="path23028" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -68.370751,79.888865 v 7.867873"
+       id="path25266" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.266095px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -68.370751,111.36035 v -7.86787 -7.867869 -7.867873"
+       id="path25301" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -95.976457,85.797112 c 0,-0.04012 0.932308,-1.377881 2.071787,-2.972874 l 2.071791,-2.899975 1.469565,0.01909 c 0.808261,0.01077 2.441725,0.062 3.629919,0.114237 l 2.160351,0.0951 -2.014757,2.817848 -2.014754,2.817847 -3.686948,0.04076 c -2.027823,0.02243 -3.686954,0.0075 -3.686954,-0.03214 z"
+       id="path14282" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -87.460034,84.98877 c 0.338488,-0.481696 1.254857,-1.766862 2.036376,-2.855931 l 1.420944,-1.980112 3.609047,-0.04087 c 1.984978,-0.02243 3.60905,-0.001 3.60905,0.04733 0,0.04852 -0.903225,1.352058 -2.007167,2.896751 l -2.007163,2.808543 h -3.638261 -3.638259 z"
+       id="path14321" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -80.028905,85.650787 c 0.06699,-0.117601 0.978585,-1.418412 2.02576,-2.890703 l 1.903952,-2.676902 3.625075,-0.0033 c 3.068717,-0.0033 3.606384,0.02943 3.503272,0.210491 -0.06699,0.117602 -0.978583,1.418422 -2.025756,2.890714 l -1.903953,2.676891 -3.625077,0.0033 c -3.068716,0.0033 -3.606384,-0.02943 -3.503273,-0.210502 z"
+       id="path14360" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -80.440204,89.900966 v -3.731748 h 3.731745 3.731744 v 3.731748 3.731748 h -3.731744 -3.731745 z"
+       id="path14399" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -88.208328,89.900966 v -3.731748 h 3.731747 3.731746 v 3.731748 3.731748 h -3.731746 -3.731747 z"
+       id="path14438" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -96.128772,89.900966 v -3.731748 h 3.731751 3.731746 v 3.731748 3.731748 h -3.731746 -3.731751 z"
+       id="path14477" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -96.128772,97.821402 v -3.731737 h 3.731751 3.731746 v 3.731737 3.731748 h -3.731746 -3.731751 z"
+       id="path14516" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -88.208328,97.821402 v -3.731737 h 3.731747 3.731746 v 3.731737 3.731748 h -3.731746 -3.731747 z"
+       id="path14555" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -80.440204,97.821402 v -3.731737 h 3.731745 3.731744 v 3.731737 3.731748 h -3.731744 -3.731745 z"
+       id="path14594" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -80.440204,105.74185 v -3.73175 h 3.731745 3.731744 v 3.73175 3.73173 h -3.731744 -3.731745 z"
+       id="path14633" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -88.208328,105.74185 v -3.73175 h 3.731747 3.731746 v 3.73175 3.73173 h -3.731746 -3.731747 z"
+       id="path14672" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -96.128772,105.74185 v -3.73175 h 3.731751 3.731746 v 3.73175 3.73173 h -3.731746 -3.731751 z"
+       id="path14711" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -96.128772,113.50997 v -3.73176 h 3.731751 3.731746 v 3.73176 3.73174 h -3.731746 -3.731751 z"
+       id="path14750" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -88.208328,113.50997 v -3.73176 h 3.731747 3.731746 v 3.73176 3.73174 h -3.731746 -3.731747 z"
+       id="path14789" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -80.440204,113.50997 v -3.73176 h 3.731745 3.731744 v 3.73176 3.73174 h -3.731744 -3.731745 z"
+       id="path14828" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -72.519765,113.19491 v -3.49848 l 1.845051,-2.58657 c 1.014778,-1.42259 1.905828,-2.65167 1.980111,-2.73125 0.07881,-0.0845 0.135058,1.31643 0.135058,3.36384 v 3.50852 l -1.836301,2.57651 c -1.009966,1.41707 -1.901013,2.6416 -1.980109,2.72119 -0.09024,0.0908 -0.14381,-1.15878 -0.14381,-3.35376 z"
+       id="path14867" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -72.519765,105.36597 v -3.54385 l 1.94203,-2.730248 1.942033,-2.730242 0.04087,3.500405 0.04087,3.500415 -1.982893,2.77368 -1.982894,2.77369 z"
+       id="path14906" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="M -72.519765,97.476426 V 93.94804 l 1.980111,-2.769791 1.980109,-2.76978 v 3.547233 3.547221 l -1.850154,2.606246 c -1.017584,1.433432 -1.908633,2.671361 -1.980111,2.750941 -0.07215,0.0803 -0.129955,-1.42462 -0.129955,-3.383684 z"
+       id="path14945" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.115137"
+       d="m -72.519765,89.585909 v -3.498475 l 1.845051,-2.586568 c 1.014778,-1.422596 1.905828,-2.651672 1.980111,-2.731245 0.07882,-0.08453 0.135058,1.312207 0.135058,3.353767 v 3.498463 l -1.84505,2.586558 c -1.014779,1.422618 -1.905827,2.651673 -1.980111,2.731267 -0.07882,0.08453 -0.135059,-1.312218 -0.135059,-3.353767 z"
+       id="path14984" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+       x="-93.463249"
+       y="114.9286"
+       id="text28985"><tspan
+         sodipodi:role="line"
+         id="tspan28983"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+         x="-93.463249"
+         y="114.9286">1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+       x="-85.398956"
+       y="114.95239"
+       id="text29583"><tspan
+         sodipodi:role="line"
+         id="tspan29581"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+         x="-85.398956"
+         y="114.95239">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+       x="-77.531754"
+       y="114.95239"
+       id="text30291"><tspan
+         sodipodi:role="line"
+         id="tspan30289"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+         x="-77.531754"
+         y="114.95239">3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+       x="-93.463249"
+       y="99.005096"
+       id="text33579"><tspan
+         sodipodi:role="line"
+         id="tspan33577"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+         x="-93.463249"
+         y="99.005096">1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+       x="-85.398956"
+       y="106.99065"
+       id="text33583"><tspan
+         sodipodi:role="line"
+         id="tspan33581"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+         x="-85.398956"
+         y="106.99065">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+       x="-77.531754"
+       y="106.99065"
+       id="text33587"><tspan
+         sodipodi:role="line"
+         id="tspan33585"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+         x="-77.531754"
+         y="106.99065">3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+       x="-93.463249"
+       y="106.96684"
+       id="text33591"><tspan
+         sodipodi:role="line"
+         id="tspan33589"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+         x="-93.463249"
+         y="106.96684">1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+       x="-85.398956"
+       y="99.028893"
+       id="text33595"><tspan
+         sodipodi:role="line"
+         id="tspan33593"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+         x="-85.398956"
+         y="99.028893">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+       x="-77.531754"
+       y="99.028893"
+       id="text33599"><tspan
+         sodipodi:role="line"
+         id="tspan33597"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.266095"
+         x="-77.531754"
+         y="99.028893">3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.266095"
+       x="-93.463249"
+       y="91.04332"
+       id="text33603"><tspan
+         sodipodi:role="line"
+         id="tspan33601"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.266095"
+         x="-93.463249"
+         y="91.04332">1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.266095"
+       x="-85.398956"
+       y="91.067154"
+       id="text33607"><tspan
+         sodipodi:role="line"
+         id="tspan33605"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.266095"
+         x="-85.398956"
+         y="91.067154">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.266095"
+       x="-77.531754"
+       y="91.067154"
+       id="text33611"><tspan
+         sodipodi:role="line"
+         id="tspan33609"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.90273px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.266095"
+         x="-77.531754"
+         y="91.067154">3</tspan></text>
+    <g
+       id="g45824"
+       transform="matrix(1.005713,0,0,1.005713,99.471735,-72.501863)">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,165.09427 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22694" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,157.27109 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22696" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,165.09427 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22698" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,157.27109 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22700" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,172.91745 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22702" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,172.91745 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22704" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,180.74063 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22706" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,180.74063 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22708" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,165.09427 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22710" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,172.91745 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22712" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,157.27109 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22714" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,180.74063 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22716" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,157.27109 4.34622,-6.08471"
+         id="path22718" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,157.44494 4.34622,-6.08471"
+         id="path22720" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,157.44494 4.34622,-6.08471"
+         id="path22722" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,157.44494 4.34622,-6.08471"
+         id="path22724" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -110.84392,151.36023 v 31.29272"
+         id="path22726" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -134.31349,151.18638 7.82319,0.17385 h 7.82319 7.82319"
+         id="path22728" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,188.73766 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22730" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,165.26812 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22732" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,173.0913 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22734" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,180.91448 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22736" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,165.09427 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22898" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,157.27109 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22900" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,165.09427 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22902" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,157.27109 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22904" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,172.91745 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22906" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,172.91745 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22908" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,180.74063 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22910" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,180.74063 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22912" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,165.09427 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22914" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,172.91745 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22916" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,157.27109 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22918" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,180.74063 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22920" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,157.27109 4.34622,-6.08471"
+         id="path22922" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,157.44494 4.34622,-6.08471"
+         id="path22924" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,157.44494 4.34622,-6.08471"
+         id="path22926" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,157.44494 4.34622,-6.08471"
+         id="path22928" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -110.84392,151.36023 v 31.29272"
+         id="path22930" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -134.31349,151.18638 7.82319,0.17385 h 7.82319 7.82319"
+         id="path22932" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,188.73766 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22934" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,165.26812 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22936" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,173.0913 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22938" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,180.91448 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22940" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -137.98301,156.72127 c 0.20248,-0.27072 1.13436,-1.56562 2.07086,-2.87757 l 1.70273,-2.38535 3.05858,0.009 c 1.68221,0.005 3.30585,0.0559 3.60807,0.11359 l 0.54949,0.10486 -1.97753,2.76398 -1.97753,2.76398 h -3.70141 -3.7014 z"
+         id="path15023" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -130.26306,157.08883 c 0.0278,-0.0686 0.90239,-1.32645 1.94362,-2.79531 l 1.89313,-2.67066 3.60958,-0.007 c 1.98527,-0.004 3.58687,0.0496 3.5591,0.11813 -0.0278,0.0686 -0.90239,1.32645 -1.94362,2.79532 l -1.89313,2.67066 -3.60959,0.007 c -1.98526,0.004 -3.58686,-0.0496 -3.55909,-0.11813 z"
+         id="path15062" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -120.55489,154.41164 1.99954,-2.80184 h 3.60814 c 2.84723,0 3.58375,0.0399 3.49249,0.18932 -0.0636,0.10412 -0.95734,1.36495 -1.98606,2.80184 l -1.87041,2.61253 h -3.62162 -3.62162 z"
+         id="path15101" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -122.86721,161.37839 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71054 h -3.71055 -3.71055 z"
+         id="path15140" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -130.59121,161.37839 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71054 h -3.71055 -3.71055 z"
+         id="path15179" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -138.46665,161.37839 v -3.71055 h 3.71055 3.71054 v 3.71055 3.71054 h -3.71054 -3.71055 z"
+         id="path15218" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -138.46665,169.17811 v -3.63482 h 3.71055 3.71054 v 3.63482 3.63482 h -3.71054 -3.71055 z"
+         id="path15257" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -130.59121,169.17811 v -3.63482 h 3.71055 3.71055 v 3.63482 3.63482 h -3.71055 -3.71055 z"
+         id="path15296" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -122.86721,169.17811 v -3.63482 h 3.71055 3.71055 v 3.63482 3.63482 h -3.71055 -3.71055 z"
+         id="path15335" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -122.86721,176.97783 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71055 h -3.71055 -3.71055 z"
+         id="path15374" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -130.59121,176.97783 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71055 h -3.71055 -3.71055 z"
+         id="path15413" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -138.46665,176.97783 v -3.71055 h 3.71055 3.71054 v 3.71055 3.71055 h -3.71054 -3.71055 z"
+         id="path15452" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -138.46665,184.85328 v -3.71055 h 3.71055 3.71054 v 3.71055 3.71055 h -3.71054 -3.71055 z"
+         id="path15491" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -130.59121,184.85328 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71055 h -3.71055 -3.71055 z"
+         id="path15530" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -122.86721,184.85328 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71055 h -3.71055 -3.71055 z"
+         id="path15569" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -114.99176,184.53043 v -3.48817 l 1.931,-2.71 1.93099,-2.70999 0.0408,3.4588 0.0408,3.45881 -1.84253,2.59548 c -1.01339,1.42752 -1.90067,2.66023 -1.97174,2.73936 -0.0717,0.0799 -0.12922,-1.40749 -0.12922,-3.34429 z"
+         id="path15645" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -114.99176,176.68413 v -3.45903 l 1.83964,-2.59144 c 1.01181,-1.42528 1.89779,-2.65618 1.96886,-2.73531 0.0717,-0.0799 0.12922,1.40769 0.12922,3.34472 v 3.4886 l -1.82587,2.56186 c -1.00423,1.40903 -1.89021,2.62661 -1.96886,2.70575 -0.0897,0.0903 -0.14299,-1.14492 -0.14299,-3.31515 z"
+         id="path15684" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -114.99176,168.88852 v -3.5153 l 1.931,-2.7021 1.93099,-2.70211 0.0406,3.45947 0.0406,3.45948 -1.97163,2.75793 -1.97163,2.75793 z"
+         id="path15723" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -114.99176,161.03537 v -3.50834 l 1.96886,-2.75406 1.96886,-2.75405 v 3.54665 3.54665 l -1.83457,2.57187 c -1.00901,1.41452 -1.895,2.63661 -1.96886,2.71574 -0.0784,0.084 -0.13429,-1.31721 -0.13429,-3.36446 z"
+         id="path15918" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-135.50368"
+         y="162.51427"
+         id="text42017"><tspan
+           sodipodi:role="line"
+           id="tspan42015"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-135.50368"
+           y="162.51427">1</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-136.49561"
+         y="170.43268"
+         id="text42021"><tspan
+           sodipodi:role="line"
+           id="tspan42019"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-136.49561"
+           y="170.43268">11</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-136.37231"
+         y="178.3511"
+         id="text42025"><tspan
+           sodipodi:role="line"
+           id="tspan42023"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-136.37231"
+           y="178.3511">21</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-136.3895"
+         y="186.26857"
+         id="text42029"><tspan
+           id="tspan42027"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-136.3895"
+           y="186.26857"
+           sodipodi:role="line">31</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-129.09538"
+         y="170.45638"
+         id="text35953"><tspan
+           sodipodi:role="line"
+           id="tspan35951"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-129.09538"
+           y="170.45638">12 </tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-128.79399"
+         y="178.37479"
+         id="text36807"><tspan
+           sodipodi:role="line"
+           id="tspan36805"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-128.79399"
+           y="178.37479">22</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-128.81117"
+         y="186.26857"
+         id="text37913"><tspan
+           sodipodi:role="line"
+           id="tspan37911"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-128.81117"
+           y="186.26857">32</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-128.03241"
+         y="162.53795"
+         id="text42033"><tspan
+           sodipodi:role="line"
+           id="tspan42031"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-128.03241"
+           y="162.53795">2</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-121.76529"
+         y="170.45638"
+         id="text36473"><tspan
+           sodipodi:role="line"
+           id="tspan36471"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-121.76529"
+           y="170.45638">13</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-121.642"
+         y="178.37479"
+         id="text37579"><tspan
+           sodipodi:role="line"
+           id="tspan37577"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-121.642"
+           y="178.37479">23</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-121.65918"
+         y="186.26857"
+         id="text38469"><tspan
+           sodipodi:role="line"
+           id="tspan38467"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-121.65918"
+           y="186.26857">33</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-120.75713"
+         y="162.53795"
+         id="text42037"><tspan
+           sodipodi:role="line"
+           id="tspan42035"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-120.75713"
+           y="162.53795">3</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:6.08596px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Bold Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.285279"
+       x="-105.52939"
+       y="99.007248"
+       id="text42921"><tspan
+         sodipodi:role="line"
+         id="tspan42919"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:6.08596px;font-family:Arial;-inkscape-font-specification:'Arial, Bold Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.285279"
+         x="-105.52939"
+         y="99.007248">+</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:6.08596px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Bold Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.285279"
+       x="-51.477856"
+       y="98.843964"
+       id="text43309"><tspan
+         sodipodi:role="line"
+         id="tspan43307"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:6.08596px;font-family:Arial;-inkscape-font-specification:'Arial, Bold Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.285279"
+         x="-51.477856"
+         y="98.843964">=</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.56447px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.206978"
+       x="-129.02751"
+       y="75.677513"
+       id="text47037"><tspan
+         sodipodi:role="line"
+         id="tspan47035"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.56447px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.206978"
+         x="-129.02751"
+         y="75.677513"><tspan
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.56447px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.206978"
+   id="tspan52971">a </tspan>(4 x 3)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.56447px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.285279"
+       x="-84.158951"
+       y="75.75811"
+       id="text48337"><tspan
+         sodipodi:role="line"
+         id="tspan48335"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.56447px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.285279"
+         x="-84.158951"
+         y="75.75811"><tspan
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.56447px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.285279"
+   id="tspan57051">b</tspan> (3)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.56447px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.285279"
+       x="-35.944736"
+       y="76.127975"
+       id="text49033"><tspan
+         sodipodi:role="line"
+         id="tspan49031"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.56447px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.285279"
+         x="-35.944736"
+         y="76.127975"><tspan
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.56447px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.285279"
+   id="tspan58435">result</tspan> (4 x 3)</tspan></text>
+  </g>
+</svg>
diff --git a/doc/source/user/broadcasting_3.svg b/doc/source/user/broadcasting_3.svg
new file mode 100644 (file)
index 0000000..a12030d
--- /dev/null
@@ -0,0 +1,708 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="124.43386mm"
+   height="91.324844mm"
+   viewBox="0 0 124.43386 91.324844"
+   version="1.1"
+   id="svg60162"
+   inkscape:version="1.1 (c68e22c387, 2021-05-23)"
+   sodipodi:docname="theory.broadcasting_3.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview60164"
+     pagecolor="#005d00"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="mm"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     fit-margin-top="5"
+     fit-margin-left="5"
+     fit-margin-bottom="5"
+     fit-margin-right="5"
+     inkscape:zoom="0.99674932"
+     inkscape:cx="-75.746227"
+     inkscape:cy="366.692"
+     inkscape:window-width="1920"
+     inkscape:window-height="1001"
+     inkscape:window-x="-9"
+     inkscape:window-y="-9"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g69631" />
+  <defs
+     id="defs60159">
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lstart"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lstart"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(1.1,0,0,1.1,1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         id="path78024" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         id="path78027" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow1Lend"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         id="path96534" />
+    </marker>
+  </defs>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-32.1299,-4.5183083)">
+    <g
+       id="g46002"
+       transform="matrix(1.2203364,0,0,1.2203364,104.81983,-147.93224)">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,165.23404 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21691" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,157.41086 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21910" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,165.23404 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21912" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,157.41086 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21914" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,173.05722 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21916" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,173.05722 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21918" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,180.8804 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21920" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,180.8804 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21922" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,165.23404 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21924" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,173.05722 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21926" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,157.41086 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21928" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,180.8804 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path21930" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,157.41086 4.34622,-6.08471"
+         id="path22112" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M -31.866393,157.58471 -27.520173,151.5"
+         id="path22147" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M -39.689583,157.58471 -35.343363,151.5"
+         id="path22149" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M -47.512773,157.58471 -43.166553,151.5"
+         id="path22151" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -27.520173,151.5 v 31.29272"
+         id="path22266" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -50.989743,151.32615 7.82319,0.17385 h 7.82319 7.82319"
+         id="path22381" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,188.87743 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22496" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,165.40789 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22644" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,173.23107 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22646" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,181.05425 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22648" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,165.23404 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22650" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,157.41086 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22652" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,165.23404 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22654" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,157.41086 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22656" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,173.05722 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22658" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,173.05722 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22660" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -47.512773,180.8804 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22662" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,180.8804 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22664" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,165.23404 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22666" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,173.05722 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22668" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,157.41086 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22670" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -39.689583,180.8804 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22672" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -55.335963,157.41086 4.34622,-6.08471"
+         id="path22674" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M -31.866393,157.58471 -27.520173,151.5"
+         id="path22676" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M -39.689583,157.58471 -35.343363,151.5"
+         id="path22678" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M -47.512773,157.58471 -43.166553,151.5"
+         id="path22680" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -27.520173,151.5 v 31.29272"
+         id="path22682" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -50.989743,151.32615 7.82319,0.17385 h 7.82319 7.82319"
+         id="path22684" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,188.87743 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22686" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,165.40789 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22688" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,173.23107 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22690" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -31.866393,181.05425 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22692" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -55.142483,161.45304 v -3.71055 h 3.71055 3.71054 v 3.71055 3.71055 h -3.71054 -3.71055 z"
+         id="path13541" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -47.267033,161.45304 v -3.71055 h 3.71054 3.71055 v 3.71055 3.71055 h -3.71055 -3.71054 z"
+         id="path13580" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -39.543043,161.45304 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71055 h -3.71055 -3.71055 z"
+         id="path13619" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -39.543043,169.32849 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71054 h -3.71055 -3.71055 z"
+         id="path13658" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -47.267033,169.32849 v -3.71055 h 3.71054 3.71055 v 3.71055 3.71054 h -3.71055 -3.71054 z"
+         id="path13697" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -55.142483,169.32849 v -3.71055 h 3.71055 3.71054 v 3.71055 3.71054 h -3.71054 -3.71055 z"
+         id="path13736" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -55.142483,177.20393 v -3.71054 h 3.71055 3.71054 v 3.71054 3.71055 h -3.71054 -3.71055 z"
+         id="path13775" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -47.267033,177.20393 v -3.71054 h 3.71054 3.71055 v 3.71054 3.71055 h -3.71055 -3.71054 z"
+         id="path13814" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -39.543043,177.20393 v -3.71054 h 3.71055 3.71055 v 3.71054 3.71055 h -3.71055 -3.71055 z"
+         id="path13853" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -39.543043,184.92793 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71055 h -3.71055 -3.71055 z"
+         id="path13892" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -47.267033,184.92793 v -3.71055 h 3.71054 3.71055 v 3.71055 3.71055 h -3.71055 -3.71054 z"
+         id="path13931" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -55.142483,184.92793 v -3.71055 h 3.71055 3.71054 v 3.71055 3.71055 h -3.71054 -3.71055 z"
+         id="path13970" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -54.899273,157.25299 c 0.0622,-0.10561 0.9991,-1.43582 2.08211,-2.95601 l 1.96911,-2.76398 1.44974,0.019 c 0.79736,0.0105 2.42287,0.0616 3.61225,0.11359 l 2.1625,0.0945 -2.01181,2.80185 -2.0118,2.80184 -3.68255,0.0406 c -2.94083,0.0324 -3.65979,0.002 -3.56955,-0.15145 z"
+         id="path14009" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -46.783393,156.94737 c 0.20247,-0.27071 1.13436,-1.56562 2.07086,-2.87756 l 1.70272,-2.38535 h 3.62228 3.62228 l -2.05577,2.87756 -2.05578,2.87757 h -3.63737 -3.63736 z"
+         id="path14048" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -39.134073,157.23722 c 0.0666,-0.11131 0.97302,-1.40328 2.01425,-2.87104 l 1.89313,-2.66867 3.60958,-0.007 c 1.98527,-0.004 3.58686,0.0493 3.5591,0.11756 -0.0278,0.0683 -0.93452,1.36316 -2.015,2.87757 l -1.96451,2.75347 h -3.60883 c -2.97073,0 -3.58742,-0.0358 -3.48772,-0.20237 z"
+         id="path14087" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -31.667593,161.15934 v -3.45903 l 1.83964,-2.59144 c 1.01181,-1.42529 1.89779,-2.65618 1.96886,-2.73531 0.0718,-0.0799 0.12922,1.40769 0.12922,3.34472 v 3.4886 l -1.82587,2.56186 c -1.00422,1.40903 -1.89021,2.62661 -1.96886,2.70574 -0.0897,0.0903 -0.14299,-1.14491 -0.14299,-3.31514 z"
+         id="path14126" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -31.667593,169.01521 v -3.47859 l 1.83457,-2.57187 c 1.00901,-1.41453 1.895,-2.63661 1.96886,-2.71575 0.0784,-0.084 0.13429,1.30477 0.13429,3.33472 v 3.4786 l -1.83457,2.57187 c -1.00901,1.41452 -1.895,2.63661 -1.96886,2.71574 -0.0784,0.084 -0.13429,-1.30476 -0.13429,-3.33472 z"
+         id="path14165" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -31.667593,176.85105 v -3.49847 l 1.96886,-2.75406 1.96886,-2.75406 v 3.51758 3.51757 l -1.69335,2.37377 c -0.93135,1.30557 -1.81734,2.5363 -1.96886,2.73496 -0.26885,0.35246 -0.27551,0.27663 -0.27551,-3.13729 z"
+         id="path14204" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -31.667593,184.63423 v -3.45903 l 1.83964,-2.59143 c 1.01181,-1.4253 1.89779,-2.65619 1.96886,-2.73532 0.0718,-0.0799 0.12922,1.40768 0.12922,3.34472 v 3.4886 l -1.82587,2.56186 c -1.00422,1.40903 -1.89021,2.62661 -1.96886,2.70575 -0.0897,0.0903 -0.14299,-1.14492 -0.14299,-3.31515 z"
+         id="path14243" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-36.608471"
+         y="162.74039"
+         id="text17645"><tspan
+           sodipodi:role="line"
+           id="tspan17643"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-36.608471"
+           y="162.74039">0</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-37.600399"
+         y="170.6588"
+         id="text21689"><tspan
+           sodipodi:role="line"
+           id="tspan21687"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-37.600399"
+           y="170.6588">10</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-37.477116"
+         y="178.57722"
+         id="text22617"><tspan
+           sodipodi:role="line"
+           id="tspan22615"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-37.477116"
+           y="178.57722">20</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-37.494289"
+         y="186.49469"
+         id="text23721"><tspan
+           sodipodi:role="line"
+           id="tspan23719"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-37.494289"
+           y="186.49469">30</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-44.447037"
+         y="162.74039"
+         id="text25685"><tspan
+           sodipodi:role="line"
+           id="tspan25683"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-44.447037"
+           y="162.74039">0</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-45.438965"
+         y="170.6588"
+         id="text25689"><tspan
+           sodipodi:role="line"
+           id="tspan25687"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-45.438965"
+           y="170.6588">10</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-45.315681"
+         y="178.57722"
+         id="text25693"><tspan
+           sodipodi:role="line"
+           id="tspan25691"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-45.315681"
+           y="178.57722">20</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-45.332859"
+         y="186.49469"
+         id="text25697"><tspan
+           sodipodi:role="line"
+           id="tspan25695"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-45.332859"
+           y="186.49469">30</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-52.285603"
+         y="162.74039"
+         id="text25701"><tspan
+           sodipodi:role="line"
+           id="tspan25699"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-52.285603"
+           y="162.74039">0</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-53.277534"
+         y="170.6588"
+         id="text25705"><tspan
+           sodipodi:role="line"
+           id="tspan25703"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-53.277534"
+           y="170.6588">10</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-53.154247"
+         y="178.57722"
+         id="text25709"><tspan
+           sodipodi:role="line"
+           id="tspan25707"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-53.154247"
+           y="178.57722">20</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-53.171425"
+         y="186.49469"
+         id="text25713"><tspan
+           sodipodi:role="line"
+           id="tspan25711"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-53.171425"
+           y="186.49469">30</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:7.38479px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Bold Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.346162"
+       x="84.700111"
+       y="61.040264"
+       id="text42921"><tspan
+         sodipodi:role="line"
+         id="tspan42919"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:7.38479px;font-family:Arial;-inkscape-font-specification:'Arial, Bold Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.346162"
+         x="84.700111"
+         y="61.040264">+</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.53859px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.251149"
+       x="46.541679"
+       y="32.299259"
+       id="text47037"><tspan
+         sodipodi:role="line"
+         id="tspan47035"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.53859px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.251149"
+         x="46.541679"
+         y="32.299259"><tspan
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.53859px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.251149"
+   id="tspan52971">a </tspan>(4 x 3)</tspan></text>
+    <g
+       id="g69631"
+       transform="matrix(0.79500238,0,0,0.79500238,35.940237,-68.109727)">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 96.995629,141.48877 v 12.27561 H 109.0044 V 141.75563 H 96.995629 Z"
+         id="path22696" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 84.986869,141.48877 v 12.27561 h 12.00876 v -12.00875 h -12.00876 z"
+         id="path22700" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 109.0044,141.48877 v 12.27561 h 12.00876 V 141.75563 H 109.0044 Z"
+         id="path22714" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 84.986869,141.48877 6.67154,-9.34016"
+         id="path22718" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 121.01316,141.75563 6.67154,-9.34016"
+         id="path22720" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 109.0044,141.75563 6.67154,-9.34016"
+         id="path22722" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 96.995629,141.75563 6.671541,-9.34016"
+         id="path22724" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 91.658409,132.14861 12.008761,0.26686 h 12.00877 12.00876"
+         id="path22728" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 96.995629,141.48877 v 12.27561 H 109.0044 V 141.75563 H 96.995629 Z"
+         id="path22900" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 84.986869,141.48877 v 12.27561 h 12.00876 v -12.00875 h -12.00876 z"
+         id="path22904" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 109.0044,141.48877 v 12.27561 h 12.00876 V 141.75563 H 109.0044 Z"
+         id="path22918" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 84.986869,141.48877 6.67154,-9.34016"
+         id="path22922" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 121.01316,141.75563 6.67154,-9.34016"
+         id="path22924" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 109.0044,141.75563 6.67154,-9.34016"
+         id="path22926" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 96.995629,141.75563 6.671541,-9.34016"
+         id="path22928" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.175734"
+         d="m 86.025619,140.64478 c 0.31081,-0.41556 1.74126,-2.40326 3.17881,-4.41713 l 2.61373,-3.66156 4.69498,0.0138 c 2.58223,0.008 5.074551,0.0858 5.538471,0.17437 l 0.84348,0.16096 -3.035551,4.24277 -3.03555,4.24277 h -5.68175 -5.68173 z"
+         id="path15023" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.175734"
+         d="m 97.875909,141.209 c 0.0427,-0.10531 1.38518,-2.03613 2.983491,-4.29086 l 2.906,-4.09953 5.54078,-0.0107 c 3.04743,-0.006 5.50592,0.0761 5.4633,0.18133 -0.0427,0.1053 -1.38519,2.03613 -2.9835,4.29088 l -2.906,4.09952 -5.5408,0.0107 c -3.04741,0.006 -5.505901,-0.0761 -5.463271,-0.18133 z"
+         id="path15062" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.175734"
+         d="m 109.22869,147.79356 v -5.69577 h 5.69578 5.69577 v 5.69577 5.69576 h -5.69577 -5.69578 z"
+         id="path15140" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.175734"
+         d="m 97.372189,147.79356 v -5.69577 h 5.695771 5.69578 v 5.69577 5.69576 h -5.69578 -5.695771 z"
+         id="path15179" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.175734"
+         d="m 85.283219,147.79356 v -5.69577 h 5.69577 5.69576 v 5.69577 5.69576 h -5.69576 -5.69577 z"
+         id="path15218" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.95674px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.406141"
+         x="89.831451"
+         y="149.49193"
+         id="text42017"><tspan
+           sodipodi:role="line"
+           id="tspan42015"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.95674px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.406141"
+           x="89.831451"
+           y="149.49193">1</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.95674px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.406141"
+         x="102.09368"
+         y="149.52827"
+         id="text42033"><tspan
+           sodipodi:role="line"
+           id="tspan42031"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.95674px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.406141"
+           x="102.09368"
+           y="149.52827">2</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.95674px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.406141"
+         x="114.05506"
+         y="149.52827"
+         id="text42037"><tspan
+           sodipodi:role="line"
+           id="tspan42035"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.95674px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.406141"
+           x="114.05506"
+           y="149.52827">3</tspan></text>
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 121.01316,141.48877 v 12.27561 h 12.00876 v -12.00875 h -12.00876 z"
+         id="path63486" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406141px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 133.02192,141.75563 6.67154,-9.34016"
+         id="path63490" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 127.6847,132.41547 h 12.00876"
+         id="path64980" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.406;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 133.02192,153.76438 6.67154,-9.34016"
+         id="path65130" />
+      <path
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.406;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 139.69346,132.41547 v 12.00875"
+         id="path65358" />
+      <path
+         style="fill:#ffffff;stroke:none;stroke-width:0.662837;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 414.24937,534.52703 c 0,-0.1315 5.26846,-7.6152 11.70769,-16.63044 l 11.70768,-16.39136 h 21.37323 c 11.75528,0 21.30844,0.16273 21.22924,0.36162 -0.0792,0.19889 -5.37721,7.68259 -11.77337,16.63045 l -11.62938,16.26883 h -21.30755 c -11.71915,0 -21.30754,-0.10759 -21.30754,-0.2391 z"
+         id="path65514"
+         transform="scale(0.26458333)" />
+      <path
+         style="fill:#ffffff;stroke:none;stroke-width:0.662837;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 459.67713,534.40451 c 0.0792,-0.19889 5.37721,-7.68259 11.77338,-16.63045 l 11.62938,-16.26883 h 21.30754 c 11.71915,0 21.30755,0.1076 21.30755,0.2391 0,0.1315 -5.26846,7.6152 -11.70769,16.63045 l -11.70769,16.39135 h -21.37322 c -11.75528,0 -21.30844,-0.16273 -21.22925,-0.36162 z"
+         id="path65553"
+         transform="scale(0.26458333)" />
+      <path
+         style="fill:#ffffff;stroke:none;stroke-width:0.662837;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 458.30926,558.52392 v -21.59799 h 21.81397 21.81396 v 21.59799 21.59798 h -21.81396 -21.81397 z"
+         id="path65592"
+         transform="scale(0.26458333)" />
+      <path
+         style="fill:#ffffff;stroke:none;stroke-width:0.662837;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 503.66503,557.16612 v -20.96876 l 11.66291,-16.33384 11.66292,-16.33384 v 21.04447 21.04447 l -11.29511,15.84777 c -6.21231,8.71627 -11.46062,16.03244 -11.66291,16.25814 -0.20302,0.2265 -0.36781,-8.98423 -0.36781,-20.55841 z"
+         id="path65631"
+         transform="scale(0.26458333)" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.95672px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="125.8052"
+         y="149.49046"
+         id="text66434"><tspan
+           sodipodi:role="line"
+           id="tspan66432"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.95672px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="125.8052"
+           y="149.49046">4</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.53859px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.210344"
+       x="122.50475"
+       y="32.375103"
+       id="text72815"><tspan
+         sodipodi:role="line"
+         id="tspan72813"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.53859px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.210344"
+         x="122.50475"
+         y="32.375103"><tspan
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.53859px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.210344"
+   id="tspan76229">b</tspan> (4)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.53859px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.210344"
+       x="86.699333"
+       y="15.341067"
+       id="text74733"><tspan
+         sodipodi:role="line"
+         id="tspan74731"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.53859px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.210344"
+         x="86.699333"
+         y="15.341067">mismatch</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.322771;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 37.765217,27.055961 151.48494,90.702321"
+       id="path82219" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.322771;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 37.581798,90.702321 150.93468,27.055961"
+       id="path82340" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 61.594429,19.914188 h 68.219681 l 0,5.308925"
+       id="path1246" />
+  </g>
+</svg>
diff --git a/doc/source/user/broadcasting_4.svg b/doc/source/user/broadcasting_4.svg
new file mode 100644 (file)
index 0000000..40f9466
--- /dev/null
@@ -0,0 +1,1330 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="150.64636mm"
+   height="69.054741mm"
+   viewBox="0 0 150.64636 69.054741"
+   version="1.1"
+   id="svg83310"
+   inkscape:version="1.1 (c68e22c387, 2021-05-23)"
+   sodipodi:docname="theory.broadcasting_4.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview83312"
+     pagecolor="#005200"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="mm"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     fit-margin-top="5"
+     lock-margins="true"
+     fit-margin-left="5"
+     fit-margin-right="5"
+     fit-margin-bottom="5"
+     inkscape:zoom="1.2432572"
+     inkscape:cx="197.46517"
+     inkscape:cy="157.24823"
+     inkscape:window-width="1920"
+     inkscape:window-height="1001"
+     inkscape:window-x="-9"
+     inkscape:window-y="-9"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1" />
+  <defs
+     id="defs83307">
+    <marker
+       style="overflow:visible"
+       id="Arrow1Lend"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         id="path96534" />
+    </marker>
+  </defs>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-35.165196,-11.993335)">
+    <g
+       id="g91916"
+       transform="matrix(0.77839728,0,0,0.77839728,27.454002,-34.500382)">
+      <text
+         xml:space="preserve"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:6.56009px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.164003"
+         x="92.805412"
+         y="-122.62473"
+         id="text93193"
+         transform="rotate(90)"><tspan
+           sodipodi:role="line"
+           id="tspan93191"
+           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:6.56009px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.164003"
+           x="92.805412"
+           y="-122.62473">stretch</tspan></text>
+      <path
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.338293;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+         d="M 121.01938,88.877548 V 115.1978"
+         id="path96373" />
+    </g>
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 49.087539,40.613975 v 8.968943 h 8.773973 v -8.773964 h -8.773973 z"
+       id="path21691" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 49.087539,31.840013 v 8.968941 h 8.773973 v -8.773962 h -8.773973 z"
+       id="path21910" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 40.313566,40.613975 v 8.968943 h 8.773973 v -8.773964 h -8.773973 z"
+       id="path21912" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 40.313566,31.840013 v 8.968941 h 8.773973 v -8.773962 h -8.773973 z"
+       id="path21914" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 49.087539,49.387937 v 8.968942 h 8.773973 v -8.773961 h -8.773973 z"
+       id="path21916" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 57.861512,49.387937 v 8.968942 h 8.773973 v -8.773961 h -8.773973 z"
+       id="path21918" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 49.087539,58.161899 v 8.96894 h 8.773973 v -8.77396 h -8.773973 z"
+       id="path21920" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 40.313566,58.161899 v 8.96894 h 8.773973 v -8.77396 h -8.773973 z"
+       id="path21922" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 57.861512,40.613975 v 8.968943 h 8.773973 v -8.773964 h -8.773973 z"
+       id="path21924" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 40.313566,49.387937 v 8.968942 h 8.773973 v -8.773961 h -8.773973 z"
+       id="path21926" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 57.861512,31.840013 v 8.968941 h 8.773973 v -8.773962 h -8.773973 z"
+       id="path21928" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 57.861512,58.161899 v 8.96894 h 8.773973 v -8.77396 h -8.773973 z"
+       id="path21930" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 40.313566,31.840013 4.874433,-6.824209"
+       id="path22112" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 66.635485,32.034992 4.874434,-6.824209"
+       id="path22147" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 57.861512,32.034992 4.874433,-6.824209"
+       id="path22149" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 49.087539,31.840013 4.874434,-6.824209"
+       id="path22151" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 71.509919,25.210783 V 60.306629"
+       id="path22266" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 66.635485,67.130839 c 4.874434,-6.82421 4.874434,-6.82421 4.874434,-6.82421"
+       id="path22496" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 66.635485,40.808954 c 4.874434,-6.824209 4.874434,-6.824209 4.874434,-6.824209"
+       id="path22644" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 66.635485,49.582918 c 4.874434,-6.824212 4.874434,-6.824212 4.874434,-6.824212"
+       id="path22646" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 66.635485,58.356879 c 4.874434,-6.82421 4.874434,-6.82421 4.874434,-6.82421"
+       id="path22648" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 49.087539,40.613975 v 8.968943 h 8.773973 v -8.773964 h -8.773973 z"
+       id="path22650" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 49.087539,31.840013 v 8.968941 h 8.773973 v -8.773962 h -8.773973 z"
+       id="path22652" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 40.313566,40.613975 v 8.968943 h 8.773973 v -8.773964 h -8.773973 z"
+       id="path22654" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 40.313566,31.840013 v 8.968941 h 8.773973 v -8.773962 h -8.773973 z"
+       id="path22656" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 49.087539,49.387937 v 8.968942 h 8.773973 v -8.773961 h -8.773973 z"
+       id="path22658" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 57.861512,49.387937 v 8.968942 h 8.773973 v -8.773961 h -8.773973 z"
+       id="path22660" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 49.087539,58.161899 v 8.96894 h 8.773973 v -8.77396 h -8.773973 z"
+       id="path22662" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 40.313566,58.161899 v 8.96894 h 8.773973 v -8.77396 h -8.773973 z"
+       id="path22664" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 57.861512,40.613975 v 8.968943 h 8.773973 v -8.773964 h -8.773973 z"
+       id="path22666" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 40.313566,49.387937 v 8.968942 h 8.773973 v -8.773961 h -8.773973 z"
+       id="path22668" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 57.861512,31.840013 v 8.968941 h 8.773973 v -8.773962 h -8.773973 z"
+       id="path22670" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 57.861512,58.161899 v 8.96894 h 8.773973 v -8.77396 h -8.773973 z"
+       id="path22672" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 40.313566,31.840013 4.874433,-6.824209"
+       id="path22674" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 66.635485,32.034992 4.874434,-6.824209"
+       id="path22676" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 57.861512,32.034992 4.874433,-6.824209"
+       id="path22678" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 71.509919,25.210783 V 60.306629"
+       id="path22682" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 66.635485,67.130839 c 4.874434,-6.82421 4.874434,-6.82421 4.874434,-6.82421"
+       id="path22686" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 66.635485,40.808954 c 4.874434,-6.824209 4.874434,-6.824209 4.874434,-6.824209"
+       id="path22688" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 66.635485,49.582918 c 4.874434,-6.824212 4.874434,-6.824212 4.874434,-6.824212"
+       id="path22690" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296739px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 66.635485,58.356879 c 4.874434,-6.82421 4.874434,-6.82421 4.874434,-6.82421"
+       id="path22692" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128397"
+       d="m 40.53056,36.373455 v -4.161508 h 4.161508 4.161496 v 4.161508 4.161507 H 44.692068 40.53056 Z"
+       id="path13541" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128397"
+       d="m 40.53056,45.206036 v -4.161504 h 4.161508 4.161496 v 4.161504 4.161499 H 44.692068 40.53056 Z"
+       id="path13736" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128397"
+       d="m 40.53056,54.038609 v -4.161496 h 4.161508 4.161496 v 4.161496 4.16151 H 44.692068 40.53056 Z"
+       id="path13775" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128397;stroke-opacity:1"
+       d="m 58.025862,54.038609 v -4.161496 h 4.161508 4.161507 v 4.161496 4.16151 H 62.18737 58.025862 Z"
+       id="path13853" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128397;stroke-opacity:1"
+       d="m 58.025862,62.701339 v -4.16151 h 4.161508 4.161507 v 4.16151 4.16151 H 62.18737 58.025862 Z"
+       id="path13892" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128397"
+       d="m 40.53056,62.701339 v -4.16151 h 4.161508 4.161496 v 4.16151 4.16151 H 44.692068 40.53056 Z"
+       id="path13970" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 95.383653,40.798804 v 8.969014 h 8.774037 v -8.774041 h -8.774037 z"
+       id="path22942" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 95.383653,32.024772 v 8.969005 h 8.774037 v -8.774024 h -8.774037 z"
+       id="path22944" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 86.60962,40.798804 v 8.969014 h 8.774033 V 40.993777 H 86.60962 Z"
+       id="path22946" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 86.60962,32.024772 v 8.969005 h 8.774033 V 32.219753 H 86.60962 Z"
+       id="path22948" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 95.383653,49.57283 v 8.968999 h 8.774037 v -8.774011 h -8.774037 z"
+       id="path22950" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 104.15769,49.57283 v 8.968999 h 8.77405 v -8.774011 h -8.77405 z"
+       id="path22952" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 95.383653,58.346849 v 8.96902 h 8.774037 v -8.77404 h -8.774037 z"
+       id="path22954" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 86.60962,58.346849 v 8.96902 h 8.774033 v -8.77404 H 86.60962 Z"
+       id="path22956" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 104.15769,40.798804 v 8.969014 h 8.77405 v -8.774041 h -8.77405 z"
+       id="path22958" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 86.60962,49.57283 v 8.968999 h 8.774033 V 49.767818 H 86.60962 Z"
+       id="path22960" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 104.15769,32.024772 v 8.969005 h 8.77405 v -8.774024 h -8.77405 z"
+       id="path22962" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 104.15769,58.346849 v 8.96902 h 8.77405 v -8.77404 h -8.77405 z"
+       id="path22964" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 86.60962,32.024772 4.874473,-6.824256"
+       id="path22966" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 112.93174,32.219753 4.87446,-6.824256"
+       id="path22968" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 104.15769,32.219753 4.87447,-6.824256"
+       id="path22970" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 95.383653,32.219753 4.874477,-6.824256"
+       id="path22972" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 91.484093,25.200516 8.774037,0.194981 h 8.77403 8.77404"
+       id="path22976" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 112.93174,67.315869 c 4.87446,-6.82427 4.87446,-6.82427 4.87446,-6.82427"
+       id="path22978" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 112.93174,40.993777 c 4.87446,-6.824256 4.87446,-6.824256 4.87446,-6.824256"
+       id="path22980" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 112.93174,49.767818 c 4.87446,-6.824273 4.87446,-6.824273 4.87446,-6.824273"
+       id="path22982" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 112.93174,58.541829 c 4.87446,-6.82426 4.87446,-6.82426 4.87446,-6.82426"
+       id="path22984" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 95.383653,40.798804 v 8.969014 h 8.774037 v -8.774041 h -8.774037 z"
+       id="path22986" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 95.383653,32.024772 v 8.969005 h 8.774037 v -8.774024 h -8.774037 z"
+       id="path22988" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 86.60962,40.798804 v 8.969014 h 8.774033 V 40.993777 H 86.60962 Z"
+       id="path22990" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 86.60962,32.024772 v 8.969005 h 8.774033 V 32.219753 H 86.60962 Z"
+       id="path22992" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 95.383653,49.57283 v 8.968999 h 8.774037 v -8.774011 h -8.774037 z"
+       id="path22994" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 104.15769,49.57283 v 8.968999 h 8.77405 v -8.774011 h -8.77405 z"
+       id="path22996" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 95.383653,58.346849 v 8.96902 h 8.774037 v -8.77404 h -8.774037 z"
+       id="path22998" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 86.60962,58.346849 v 8.96902 h 8.774033 v -8.77404 H 86.60962 Z"
+       id="path23000" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 104.15769,40.798804 v 8.969014 h 8.77405 v -8.774041 h -8.77405 z"
+       id="path23002" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 86.60962,49.57283 v 8.968999 h 8.774033 V 49.767818 H 86.60962 Z"
+       id="path23004" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 104.15769,32.024772 v 8.969005 h 8.77405 v -8.774024 h -8.77405 z"
+       id="path23006" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 104.15769,58.346849 v 8.96902 h 8.77405 v -8.77404 h -8.77405 z"
+       id="path23008" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 86.60962,32.024772 4.874473,-6.824256"
+       id="path23010" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 112.93174,32.219753 4.87446,-6.824256"
+       id="path23012" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 104.15769,32.219753 4.87447,-6.824256"
+       id="path23014" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 95.383653,32.219753 4.874477,-6.824256"
+       id="path23016" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 91.484093,25.200516 8.774037,0.194981 h 8.77403 8.77404"
+       id="path23020" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 112.93174,67.315869 c 4.87446,-6.82427 4.87446,-6.82427 4.87446,-6.82427"
+       id="path23022" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 112.93174,40.993777 c 4.87446,-6.824256 4.87446,-6.824256 4.87446,-6.824256"
+       id="path23024" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 112.93174,49.767818 c 4.87446,-6.824273 4.87446,-6.824273 4.87446,-6.824273"
+       id="path23026" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 112.93174,58.541829 c 4.87446,-6.82426 4.87446,-6.82426 4.87446,-6.82426"
+       id="path23028" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 117.8062,25.395497 v 8.774024"
+       id="path25266" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.296741px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 117.8062,60.491599 v -8.77403 -8.774024 -8.774024"
+       id="path25301" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 87.021112,31.984202 c 0,-0.04476 1.039683,-1.536572 2.310393,-3.315264 l 2.310408,-3.233968 1.638806,0.02125 c 0.901361,0.01253 2.722951,0.0692 4.047985,0.1274 l 2.409163,0.106111 -2.246797,3.14239 -2.246789,3.142374 -4.11158,0.04546 c -2.261377,0.02506 -4.111589,0.0088 -4.111589,-0.03581 z"
+       id="path14282" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 96.518385,31.082756 c 0.377468,-0.537164 1.399379,-1.97035 2.270904,-3.184844 l 1.584601,-2.208157 4.0247,-0.04554 c 2.21359,-0.02506 4.02471,-7.78e-4 4.02471,0.05278 0,0.05402 -1.00725,1.507771 -2.23833,3.230372 l -2.23833,3.131998 h -4.057281 -4.057287 z"
+       id="path14321" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 104.80537,31.821027 c 0.0747,-0.131137 1.09129,-1.581774 2.25907,-3.223624 l 2.12323,-2.985208 4.04258,-0.0039 c 3.42215,-0.0039 4.02173,0.03277 3.90674,0.234726 -0.0747,0.131152 -1.09128,1.581789 -2.25906,3.223647 l -2.12323,2.9852 -4.04258,0.0039 c -3.42215,0.0039 -4.02174,-0.03277 -3.90675,-0.234757 z"
+       id="path14360" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 104.3467,36.560703 v -4.16153 h 4.16152 4.16155 v 4.16153 4.161546 h -4.16155 -4.16152 z"
+       id="path14399" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 95.683904,36.560703 v -4.16153 h 4.161546 4.16153 v 4.16153 4.161546 h -4.16153 -4.161546 z"
+       id="path14438" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 86.851254,36.560703 v -4.16153 h 4.161543 4.161537 v 4.16153 4.161546 h -4.161537 -4.161543 z"
+       id="path14477" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 86.851254,45.393358 v -4.161539 h 4.161543 4.161537 v 4.161539 4.16153 h -4.161537 -4.161543 z"
+       id="path14516" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 95.683904,45.393358 v -4.161539 h 4.161546 4.16153 v 4.161539 4.16153 h -4.16153 -4.161546 z"
+       id="path14555" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 104.3467,45.393358 v -4.161539 h 4.16152 4.16155 v 4.161539 4.16153 h -4.16155 -4.16152 z"
+       id="path14594" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 104.3467,54.225999 v -4.161526 h 4.16152 4.16155 v 4.161526 4.16153 h -4.16155 -4.16152 z"
+       id="path14633" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 95.683904,54.225999 v -4.161526 h 4.161546 4.16153 v 4.161526 4.16153 h -4.16153 -4.161546 z"
+       id="path14672" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 86.851254,54.225999 v -4.161526 h 4.161543 4.161537 v 4.161526 4.16153 h -4.161537 -4.161543 z"
+       id="path14711" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 86.851254,62.888789 v -4.16155 h 4.161543 4.161537 v 4.16155 4.16153 h -4.161537 -4.161543 z"
+       id="path14750" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 95.683904,62.888789 v -4.16155 h 4.161546 4.16153 v 4.16155 4.16153 h -4.16153 -4.161546 z"
+       id="path14789" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 104.3467,62.888789 v -4.16155 h 4.16152 4.16155 v 4.16155 4.16153 h -4.16155 -4.16152 z"
+       id="path14828" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 113.17935,62.537449 v -3.90141 l 2.05754,-2.88447 c 1.13165,-1.58643 2.12532,-2.95706 2.20816,-3.04581 0.0878,-0.0942 0.15061,1.46804 0.15061,3.75126 v 3.9126 l -2.04778,2.87324 c -1.12629,1.58029 -2.11996,2.94585 -2.20816,3.0346 -0.10062,0.10124 -0.16037,-1.29223 -0.16037,-3.74001 z"
+       id="path14867" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 113.17935,53.806829 v -3.951978 l 2.16569,-3.044709 2.16569,-3.044685 0.0455,3.903553 0.0455,3.903559 -2.21128,3.09312 -2.21126,3.09315 z"
+       id="path14906" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="M 113.17935,45.008643 V 41.07389 l 2.20815,-3.08879 2.20816,-3.088781 v 3.955776 3.95576 l -2.06323,2.906405 c -1.13478,1.598524 -2.12846,2.979027 -2.20817,3.067772 -0.0805,0.08959 -0.14491,-1.588693 -0.14491,-3.773389 z"
+       id="path14945" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.128398"
+       d="m 113.17935,36.209366 v -3.901405 l 2.05754,-2.88446 c 1.13165,-1.586444 2.12532,-2.957077 2.20816,-3.045807 0.0878,-0.09422 0.15061,1.463333 0.15061,3.740013 v 3.901397 l -2.05754,2.88446 c -1.13166,1.586451 -2.12532,2.957061 -2.20816,3.04583 -0.0879,0.09422 -0.15061,-1.463356 -0.15061,-3.740028 z"
+       id="path14984" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+       x="89.823761"
+       y="64.470802"
+       id="text28985"><tspan
+         sodipodi:role="line"
+         id="tspan28983"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+         x="89.823761"
+         y="64.470802">1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+       x="98.816841"
+       y="64.49736"
+       id="text29583"><tspan
+         sodipodi:role="line"
+         id="tspan29581"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+         x="98.816841"
+         y="64.49736">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+       x="107.59012"
+       y="64.49736"
+       id="text30291"><tspan
+         sodipodi:role="line"
+         id="tspan30289"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+         x="107.59012"
+         y="64.49736">3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+       x="89.823761"
+       y="46.71336"
+       id="text33579"><tspan
+         sodipodi:role="line"
+         id="tspan33577"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+         x="89.823761"
+         y="46.71336">1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+       x="98.816841"
+       y="55.61861"
+       id="text33583"><tspan
+         sodipodi:role="line"
+         id="tspan33581"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+         x="98.816841"
+         y="55.61861">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+       x="107.59012"
+       y="55.61861"
+       id="text33587"><tspan
+         sodipodi:role="line"
+         id="tspan33585"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+         x="107.59012"
+         y="55.61861">3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+       x="89.823761"
+       y="55.592068"
+       id="text33591"><tspan
+         sodipodi:role="line"
+         id="tspan33589"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+         x="89.823761"
+         y="55.592068">1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+       x="98.816841"
+       y="46.739918"
+       id="text33595"><tspan
+         sodipodi:role="line"
+         id="tspan33593"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+         x="98.816841"
+         y="46.739918">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+       x="107.59012"
+       y="46.739918"
+       id="text33599"><tspan
+         sodipodi:role="line"
+         id="tspan33597"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.296741"
+         x="107.59012"
+         y="46.739918">3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.296741"
+       x="89.823761"
+       y="37.834614"
+       id="text33603"><tspan
+         sodipodi:role="line"
+         id="tspan33601"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.296741"
+         x="89.823761"
+         y="37.834614">1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.296741"
+       x="98.816841"
+       y="37.861195"
+       id="text33607"><tspan
+         sodipodi:role="line"
+         id="tspan33605"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.296741"
+         x="98.816841"
+         y="37.861195">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.296741"
+       x="107.59012"
+       y="37.861195"
+       id="text33611"><tspan
+         sodipodi:role="line"
+         id="tspan33609"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:4.35221px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.296741"
+         x="107.59012"
+         y="37.861195">3</tspan></text>
+    <g
+       id="g45824"
+       transform="matrix(1.1215424,0,0,1.1215424,304.97935,-144.54629)">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,165.09427 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22694" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,157.27109 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22696" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,165.09427 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22698" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,157.27109 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22700" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,172.91745 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22702" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,172.91745 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22704" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,180.74063 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22706" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,180.74063 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22708" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,165.09427 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22710" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,172.91745 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22712" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,157.27109 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22714" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,180.74063 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22716" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,157.27109 4.34622,-6.08471"
+         id="path22718" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,157.44494 4.34622,-6.08471"
+         id="path22720" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,157.44494 4.34622,-6.08471"
+         id="path22722" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,157.44494 4.34622,-6.08471"
+         id="path22724" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -110.84392,151.36023 v 31.29272"
+         id="path22726" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -134.31349,151.18638 7.82319,0.17385 h 7.82319 7.82319"
+         id="path22728" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,188.73766 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22730" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,165.26812 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22732" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,173.0913 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22734" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,180.91448 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22736" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,165.09427 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22898" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,157.27109 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22900" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,165.09427 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22902" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,157.27109 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22904" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,172.91745 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22906" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,172.91745 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22908" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,180.74063 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22910" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,180.74063 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22912" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,165.09427 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22914" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,172.91745 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22916" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,157.27109 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22918" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,180.74063 v 7.99703 h 7.82319 v -7.82318 h -7.82319 z"
+         id="path22920" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -138.65971,157.27109 4.34622,-6.08471"
+         id="path22922" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,157.44494 4.34622,-6.08471"
+         id="path22924" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -123.01333,157.44494 4.34622,-6.08471"
+         id="path22926" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -130.83652,157.44494 4.34622,-6.08471"
+         id="path22928" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -110.84392,151.36023 v 31.29272"
+         id="path22930" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -134.31349,151.18638 7.82319,0.17385 h 7.82319 7.82319"
+         id="path22932" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,188.73766 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22934" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,165.26812 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22936" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,173.0913 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22938" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m -115.19014,180.91448 c 4.34622,-6.08471 4.34622,-6.08471 4.34622,-6.08471"
+         id="path22940" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -137.98301,156.72127 c 0.20248,-0.27072 1.13436,-1.56562 2.07086,-2.87757 l 1.70273,-2.38535 3.05858,0.009 c 1.68221,0.005 3.30585,0.0559 3.60807,0.11359 l 0.54949,0.10486 -1.97753,2.76398 -1.97753,2.76398 h -3.70141 -3.7014 z"
+         id="path15023" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -130.26306,157.08883 c 0.0278,-0.0686 0.90239,-1.32645 1.94362,-2.79531 l 1.89313,-2.67066 3.60958,-0.007 c 1.98527,-0.004 3.58687,0.0496 3.5591,0.11813 -0.0278,0.0686 -0.90239,1.32645 -1.94362,2.79532 l -1.89313,2.67066 -3.60959,0.007 c -1.98526,0.004 -3.58686,-0.0496 -3.55909,-0.11813 z"
+         id="path15062" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -120.55489,154.41164 1.99954,-2.80184 h 3.60814 c 2.84723,0 3.58375,0.0399 3.49249,0.18932 -0.0636,0.10412 -0.95734,1.36495 -1.98606,2.80184 l -1.87041,2.61253 h -3.62162 -3.62162 z"
+         id="path15101" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -122.86721,161.37839 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71054 h -3.71055 -3.71055 z"
+         id="path15140" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -130.59121,161.37839 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71054 h -3.71055 -3.71055 z"
+         id="path15179" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -138.46665,161.37839 v -3.71055 h 3.71055 3.71054 v 3.71055 3.71054 h -3.71054 -3.71055 z"
+         id="path15218" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -138.46665,169.17811 v -3.63482 h 3.71055 3.71054 v 3.63482 3.63482 h -3.71054 -3.71055 z"
+         id="path15257" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -130.59121,169.17811 v -3.63482 h 3.71055 3.71055 v 3.63482 3.63482 h -3.71055 -3.71055 z"
+         id="path15296" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -122.86721,169.17811 v -3.63482 h 3.71055 3.71055 v 3.63482 3.63482 h -3.71055 -3.71055 z"
+         id="path15335" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -122.86721,176.97783 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71055 h -3.71055 -3.71055 z"
+         id="path15374" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -130.59121,176.97783 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71055 h -3.71055 -3.71055 z"
+         id="path15413" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -138.46665,176.97783 v -3.71055 h 3.71055 3.71054 v 3.71055 3.71055 h -3.71054 -3.71055 z"
+         id="path15452" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -138.46665,184.85328 v -3.71055 h 3.71055 3.71054 v 3.71055 3.71055 h -3.71054 -3.71055 z"
+         id="path15491" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -130.59121,184.85328 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71055 h -3.71055 -3.71055 z"
+         id="path15530" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -122.86721,184.85328 v -3.71055 h 3.71055 3.71055 v 3.71055 3.71055 h -3.71055 -3.71055 z"
+         id="path15569" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -114.99176,184.53043 v -3.48817 l 1.931,-2.71 1.93099,-2.70999 0.0408,3.4588 0.0408,3.45881 -1.84253,2.59548 c -1.01339,1.42752 -1.90067,2.66023 -1.97174,2.73936 -0.0717,0.0799 -0.12922,-1.40749 -0.12922,-3.34429 z"
+         id="path15645" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -114.99176,176.68413 v -3.45903 l 1.83964,-2.59144 c 1.01181,-1.42528 1.89779,-2.65618 1.96886,-2.73531 0.0717,-0.0799 0.12922,1.40769 0.12922,3.34472 v 3.4886 l -1.82587,2.56186 c -1.00423,1.40903 -1.89021,2.62661 -1.96886,2.70575 -0.0897,0.0903 -0.14299,-1.14492 -0.14299,-3.31515 z"
+         id="path15684" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -114.99176,168.88852 v -3.5153 l 1.931,-2.7021 1.93099,-2.70211 0.0406,3.45947 0.0406,3.45948 -1.97163,2.75793 -1.97163,2.75793 z"
+         id="path15723" />
+      <path
+         style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.114483"
+         d="m -114.99176,161.03537 v -3.50834 l 1.96886,-2.75406 1.96886,-2.75405 v 3.54665 3.54665 l -1.83457,2.57187 c -1.00901,1.41452 -1.895,2.63661 -1.96886,2.71574 -0.0784,0.084 -0.13429,-1.31721 -0.13429,-3.36446 z"
+         id="path15918" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-135.50368"
+         y="162.51427"
+         id="text42017"><tspan
+           sodipodi:role="line"
+           id="tspan42015"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-135.50368"
+           y="162.51427">1</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-136.49561"
+         y="170.43268"
+         id="text42021"><tspan
+           sodipodi:role="line"
+           id="tspan42019"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-136.49561"
+           y="170.43268">11</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-136.37231"
+         y="178.3511"
+         id="text42025"><tspan
+           sodipodi:role="line"
+           id="tspan42023"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-136.37231"
+           y="178.3511">21</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-136.3895"
+         y="186.26857"
+         id="text42029"><tspan
+           id="tspan42027"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-136.3895"
+           y="186.26857"
+           sodipodi:role="line">31</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-129.09538"
+         y="170.45638"
+         id="text35953"><tspan
+           sodipodi:role="line"
+           id="tspan35951"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-129.09538"
+           y="170.45638">12 </tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-128.79399"
+         y="178.37479"
+         id="text36807"><tspan
+           sodipodi:role="line"
+           id="tspan36805"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-128.79399"
+           y="178.37479">22</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-128.81117"
+         y="186.26857"
+         id="text37913"><tspan
+           sodipodi:role="line"
+           id="tspan37911"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-128.81117"
+           y="186.26857">32</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-128.03241"
+         y="162.53795"
+         id="text42033"><tspan
+           sodipodi:role="line"
+           id="tspan42031"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-128.03241"
+           y="162.53795">2</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-121.76529"
+         y="170.45638"
+         id="text36473"><tspan
+           sodipodi:role="line"
+           id="tspan36471"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-121.76529"
+           y="170.45638">13</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-121.642"
+         y="178.37479"
+         id="text37579"><tspan
+           sodipodi:role="line"
+           id="tspan37577"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-121.642"
+           y="178.37479">23</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-121.65918"
+         y="186.26857"
+         id="text38469"><tspan
+           sodipodi:role="line"
+           id="tspan38467"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-121.65918"
+           y="186.26857">33</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+         x="-120.75713"
+         y="162.53795"
+         id="text42037"><tspan
+           sodipodi:role="line"
+           id="tspan42035"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:3.88056px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
+           x="-120.75713"
+           y="162.53795">3</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:6.78689px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Bold Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.318136"
+       x="76.367958"
+       y="46.715771"
+       id="text42921"><tspan
+         sodipodi:role="line"
+         id="tspan42919"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:6.78689px;font-family:Arial;-inkscape-font-specification:'Arial, Bold Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.318136"
+         x="76.367958"
+         y="46.715771">+</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:6.78689px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Bold Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.318136"
+       x="136.64468"
+       y="46.533672"
+       id="text43309"><tspan
+         sodipodi:role="line"
+         id="tspan43307"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:6.78689px;font-family:Arial;-inkscape-font-specification:'Arial, Bold Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.318136"
+         x="136.64468"
+         y="46.533672">=</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.09017px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.230815"
+       x="50.163528"
+       y="20.699118"
+       id="text47037"><tspan
+         sodipodi:role="line"
+         id="tspan47035"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.09017px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.230815"
+         x="50.163528"
+         y="20.699118"><tspan
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.09017px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.230815"
+   id="tspan52971">a </tspan>(4 x 1)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.09017px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.318136"
+       x="100.19966"
+       y="20.788992"
+       id="text48337"><tspan
+         sodipodi:role="line"
+         id="tspan48335"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.09017px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.318136"
+         x="100.19966"
+         y="20.788992"><tspan
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.09017px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.318136"
+   id="tspan57051">b</tspan> (3)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.09017px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.318136"
+       x="153.96677"
+       y="21.201468"
+       id="text49033"><tspan
+         sodipodi:role="line"
+         id="tspan49031"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.09017px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.318136"
+         x="153.96677"
+         y="21.201468"><tspan
+   style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.09017px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.318136"
+   id="tspan58435">result</tspan> (4 x 3)</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.205951px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 45.187999,25.015804 c 8.773974,-2e-6 8.773974,-2e-6 8.773974,-2e-6"
+       id="path89538" />
+    <path
+       style="fill:none;stroke:#c2c0c0;stroke-width:0.205951px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 71.509918,25.210782 h -8.773973 l -8.773972,-0.19498"
+       id="path89540" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 41.237019,30.974494 c 0.308962,-0.432773 1.372792,-1.923662 2.364068,-3.313087 l 1.802319,-2.52623 h 4.107724 4.107722 l -2.356307,3.308862 -2.356308,3.308859 -4.115483,0.0042 -4.115484,0.0042 z"
+       id="path90170" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 49.486028,31.719487 c 0,-0.02302 1.035081,-1.491126 2.300178,-3.262446 l 2.300178,-3.220583 4.036101,0.04651 c 2.219854,0.02558 4.062159,0.07234 4.09401,0.103902 0.03185,0.03157 -0.959707,1.47874 -2.203461,3.21594 l -2.261368,3.158544 h -4.13282 c -2.27305,0 -4.132818,-0.01884 -4.132818,-0.04186 z"
+       id="path90209" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 58.547372,31.540001 c 0.07286,-0.121744 1.064278,-1.534877 2.203152,-3.140293 l 2.070678,-2.918941 4.095305,-0.0071 4.095306,-0.0071 -2.24857,3.147433 -2.248571,3.147431 h -4.049887 c -3.334947,0 -4.026499,-0.03907 -3.917413,-0.22135 z"
+       id="path90248" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 49.320374,36.399673 v -4.141359 h 4.141358 4.141359 v 4.141359 4.141358 h -4.141359 -4.141358 z"
+       id="path90287" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 58.100054,36.399673 v -4.141359 h 4.141359 4.141356 v 4.141359 4.141358 h -4.141356 -4.141359 z"
+       id="path90326" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 49.320374,45.179353 v -4.141358 h 4.141358 4.141359 v 4.141358 4.141359 h -4.141359 -4.141358 z"
+       id="path90365" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 58.100054,45.179353 v -4.141358 h 4.141359 4.141356 v 4.141358 4.141359 h -4.141356 -4.141359 z"
+       id="path90404" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 66.879733,36.045756 v -3.898917 l 2.19492,-3.077617 2.19492,-3.077618 0.04443,3.887202 0.04443,3.887203 -2.09267,2.931961 c -1.150967,1.612579 -2.158675,3.002779 -2.23935,3.089334 -0.08544,0.09167 -0.146684,-1.470387 -0.146684,-3.741548 z"
+       id="path90443" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 66.879733,44.805915 v -3.918442 l 2.19492,-3.075862 2.19492,-3.075865 0.04443,3.904972 0.04443,3.904972 -2.09267,2.93196 c -1.150967,1.61258 -2.158675,3.00278 -2.23935,3.089333 -0.08544,0.09167 -0.146684,-1.478578 -0.146684,-3.761068 z"
+       id="path90482" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 66.879733,53.585599 v -3.918445 l 2.19492,-3.075865 2.19492,-3.075863 0.04443,3.904972 0.04443,3.904971 -2.09267,2.93196 c -1.150967,1.61258 -2.158675,3.00278 -2.23935,3.08933 -0.08544,0.0917 -0.146684,-1.47857 -0.146684,-3.76106 z"
+       id="path90521" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 66.879733,62.365269 v -3.91843 l 2.19492,-3.07587 2.19492,-3.07586 0.04443,3.90497 0.04443,3.90497 -2.09267,2.93196 c -1.150967,1.61258 -2.158675,3.00278 -2.23935,3.08933 -0.08544,0.0917 -0.146684,-1.47857 -0.146684,-3.76107 z"
+       id="path90560" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 49.320374,62.738709 v -4.14136 h 4.141358 4.141359 v 4.14136 4.14136 h -4.141359 -4.141358 z"
+       id="path90599" />
+    <path
+       style="fill:#ffffff;stroke:#c2c0c0;stroke-width:0.254195;stroke-opacity:1"
+       d="m 49.320374,53.959029 v -4.141356 h 4.141358 4.141359 v 4.141356 4.14136 h -4.141359 -4.141358 z"
+       id="path90638" />
+    <g
+       id="g86032"
+       transform="matrix(0.7308395,0,0,0.7308395,29.446816,-29.293766)">
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+         x="43.503597"
+         y="92.905823"
+         id="text17645"><tspan
+           sodipodi:role="line"
+           id="tspan17643"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+           x="43.503597"
+           y="92.905823">0</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+         x="42.074402"
+         y="104.31487"
+         id="text21689"><tspan
+           sodipodi:role="line"
+           id="tspan21687"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+           x="42.074402"
+           y="104.31487">10</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+         x="42.252033"
+         y="115.72393"
+         id="text22617"><tspan
+           sodipodi:role="line"
+           id="tspan22615"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+           x="42.252033"
+           y="115.72393">20</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+         x="42.227287"
+         y="127.13161"
+         id="text23721"><tspan
+           sodipodi:role="line"
+           id="tspan23719"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+           x="42.227287"
+           y="127.13161">30</tspan></text>
+    </g>
+    <g
+       id="g86042"
+       transform="matrix(0.7308395,0,0,0.7308395,29.12217,-29.444835)">
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+         x="32.209599"
+         y="92.905823"
+         id="text25685"><tspan
+           sodipodi:role="line"
+           id="tspan25683"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+           x="32.209599"
+           y="92.905823">0</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+         x="30.780405"
+         y="104.31487"
+         id="text25689"><tspan
+           sodipodi:role="line"
+           id="tspan25687"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+           x="30.780405"
+           y="104.31487">10</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+         x="30.958035"
+         y="115.72393"
+         id="text25693"><tspan
+           sodipodi:role="line"
+           id="tspan25691"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+           x="30.958035"
+           y="115.72393">20</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+         x="30.933285"
+         y="127.13161"
+         id="text25697"><tspan
+           sodipodi:role="line"
+           id="tspan25695"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#999999;stroke-width:0.381218"
+           x="30.933285"
+           y="127.13161">30</tspan></text>
+    </g>
+    <g
+       id="g90765"
+       transform="matrix(0.7308395,0,0,0.7308395,28.395655,-29.444835)">
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.381218"
+         x="20.9156"
+         y="92.905823"
+         id="text25701"><tspan
+           sodipodi:role="line"
+           id="tspan25699"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.381218"
+           x="20.9156"
+           y="92.905823">0</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.381218"
+         x="19.486401"
+         y="104.31487"
+         id="text25705"><tspan
+           sodipodi:role="line"
+           id="tspan25703"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.381218"
+           x="19.486401"
+           y="104.31487">10</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.381218"
+         x="19.664036"
+         y="115.72393"
+         id="text25709"><tspan
+           sodipodi:role="line"
+           id="tspan25707"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.381218"
+           x="19.664036"
+           y="115.72393">20</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.381218"
+         x="19.639286"
+         y="127.13161"
+         id="text25713"><tspan
+           sodipodi:role="line"
+           id="tspan25711"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:5.59121px;font-family:Arial;-inkscape-font-specification:'Arial, Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.381218"
+           x="19.639286"
+           y="127.13161">30</tspan></text>
+    </g>
+    <g
+       id="g91924"
+       transform="matrix(0,-0.77839728,0.77839728,0,-25.887022,168.912)">
+      <text
+         xml:space="preserve"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:6.56009px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.164003"
+         x="92.805412"
+         y="-122.62473"
+         id="text91920"
+         transform="rotate(90)"><tspan
+           sodipodi:role="line"
+           id="tspan91918"
+           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:6.56009px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.164003"
+           x="92.805412"
+           y="-122.62473">stretch</tspan></text>
+      <path
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.338293;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+         d="M 121.01938,88.877548 V 115.1978"
+         id="path91922" />
+    </g>
+  </g>
+</svg>
diff --git a/doc/source/user/broadcasting_5.svg b/doc/source/user/broadcasting_5.svg
new file mode 100644 (file)
index 0000000..7d372e9
--- /dev/null
@@ -0,0 +1,344 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="215.56395mm"
+   height="140.59219mm"
+   viewBox="0 0 215.56395 140.59219"
+   version="1.1"
+   id="svg92220"
+   inkscape:version="1.1 (c68e22c387, 2021-05-23)"
+   sodipodi:docname="broadcasting-figure-5.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview92222"
+     pagecolor="#005400"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="mm"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:zoom="1.1209083"
+     inkscape:cx="592.8228"
+     inkscape:cy="219.91094"
+     inkscape:window-width="1920"
+     inkscape:window-height="1001"
+     inkscape:window-x="-9"
+     inkscape:window-y="-9"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g112380"
+     fit-margin-top="5"
+     lock-margins="true"
+     fit-margin-left="5"
+     fit-margin-right="5"
+     fit-margin-bottom="5" />
+  <defs
+     id="defs92217">
+    <rect
+       x="-230.06293"
+       y="897.24542"
+       width="189.16286"
+       height="182.77222"
+       id="rect97145" />
+  </defs>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(1.916979,2.2534185)">
+    <text
+       xml:space="preserve"
+       transform="scale(0.26458333)"
+       id="text97143"
+       style="font-style:italic;font-stretch:condensed;font-size:39.9999px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';white-space:pre;shape-inside:url(#rect97145)" />
+    <g
+       style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10"
+       id="g112380"
+       transform="matrix(0.34260659,0,0,0.35200053,2.6364747,2.279811)">
+      <path
+         fill="#ffffff"
+         d="M 1.3033791,1.3260505 H 601.30337 V 372.32605 H 1.3033791 Z"
+         fill-rule="nonzero"
+         id="path112290" />
+      <path
+         stroke="#cccccc"
+         stroke-width="1"
+         stroke-linecap="butt"
+         d="m 77.5,61.5 v 239"
+         fill-rule="nonzero"
+         id="path112292" />
+      <path
+         stroke="#cccccc"
+         stroke-width="1"
+         stroke-linecap="butt"
+         d="m 203.5,61.5 v 239"
+         fill-rule="nonzero"
+         id="path112294" />
+      <path
+         stroke="#cccccc"
+         stroke-width="1"
+         stroke-linecap="butt"
+         d="m 329.5,61.5 v 239"
+         fill-rule="nonzero"
+         id="path112296" />
+      <path
+         stroke="#cccccc"
+         stroke-width="1"
+         stroke-linecap="butt"
+         d="m 455.5,61.5 v 239"
+         fill-rule="nonzero"
+         id="path112298" />
+      <path
+         stroke="#cccccc"
+         stroke-width="1"
+         stroke-linecap="butt"
+         d="m 581.5,61.5 v 239"
+         fill-rule="nonzero"
+         id="path112300" />
+      <path
+         stroke="#cccccc"
+         stroke-width="1"
+         stroke-linecap="butt"
+         d="m 77.5,300.5 h 504"
+         fill-rule="nonzero"
+         id="path112302" />
+      <path
+         stroke="#cccccc"
+         stroke-width="1"
+         stroke-linecap="butt"
+         d="m 77.5,220.5 h 504"
+         fill-rule="nonzero"
+         id="path112304" />
+      <path
+         stroke="#cccccc"
+         stroke-width="1"
+         stroke-linecap="butt"
+         d="m 77.5,141.5 h 504"
+         fill-rule="nonzero"
+         id="path112306" />
+      <path
+         stroke="#cccccc"
+         stroke-width="1"
+         stroke-linecap="butt"
+         d="m 77.5,61.5 h 504"
+         fill-rule="nonzero"
+         id="path112308" />
+      <path
+         fill="#4285f4"
+         clip-path="url(#id_0)"
+         d="m 394.468,100.082 c 0,2.48528 -2.01472,4.5 -4.5,4.5 -2.48527,0 -4.5,-2.01472 -4.5,-4.5 0,-2.48528 2.01473,-4.5 4.5,-4.5 2.48528,0 4.5,2.01472 4.5,4.5 z"
+         fill-rule="nonzero"
+         id="path112313"
+         style="fill:#000000" />
+      <path
+         fill="#4285f4"
+         clip-path="url(#id_0)"
+         d="m 545.638,131.88644 c 0,2.48528 -2.0147,4.5 -4.5,4.5 -2.4853,0 -4.5,-2.01472 -4.5,-4.5 0,-2.48527 2.0147,-4.5 4.5,-4.5 2.4853,0 4.5,2.01473 4.5,4.5 z"
+         fill-rule="nonzero"
+         id="path112315"
+         style="fill:#000000" />
+      <path
+         fill="#4285f4"
+         clip-path="url(#id_0)"
+         d="m 107.245,252.74333 c 0,2.48527 -2.01472,4.50002 -4.5,4.50002 -2.48528,0 -4.5,-2.01475 -4.5,-4.50002 0,-2.48527 2.01472,-4.5 4.5,-4.5 2.48528,0 4.5,2.01473 4.5,4.5 z"
+         fill-rule="nonzero"
+         id="path112317"
+         style="fill:#000000" />
+      <path
+         fill="#4285f4"
+         clip-path="url(#id_0)"
+         d="m 167.713,195.49533 c 0,2.48529 -2.01471,4.5 -4.5,4.5 -2.48528,0 -4.5,-2.01471 -4.5,-4.5 0,-2.48527 2.01472,-4.5 4.5,-4.5 2.48529,0 4.5,2.01473 4.5,4.5 z"
+         fill-rule="nonzero"
+         id="path112319"
+         style="fill:#000000" />
+      <path
+         fill="#000000"
+         d="m 312.92188,349.45 -2.28126,-8.59374 h 1.17188 l 1.3125,5.64064 q 0.20312,0.875 0.35938,1.75 0.32812,-1.375 0.39062,-1.59376 l 1.625,-5.79688 h 1.375 l 1.23438,4.34374 q 0.45312,1.625 0.67187,3.0469 0.15625,-0.8125 0.42187,-1.875 l 1.34376,-5.51564 h 1.14062 l -2.34375,8.59374 h -1.10937 l -1.79688,-6.54686 q -0.23438,-0.8125 -0.28125,-1 -0.125,0.57812 -0.25,1 l -1.8125,6.54686 z m 13.625,-2 1.09374,0.125 q -0.25,0.95314 -0.95312,1.4844 -0.70312,0.53124 -1.78125,0.53124 -1.35937,0 -2.17187,-0.84374 -0.79688,-0.84376 -0.79688,-2.3594 0,-1.5625 0.8125,-2.42186 0.8125,-0.875 2.09375,-0.875 1.25,0 2.03125,0.84376 0.79688,0.84374 0.79688,2.3906 0,0.0938 0,0.28126 h -4.64063 q 0.0625,1.03124 0.57813,1.57814 0.51562,0.53124 1.29687,0.53124 0.57813,0 0.98437,-0.29688 0.42188,-0.3125 0.65626,-0.96876 z m -3.45313,-1.7031 h 3.46875 q -0.0625,-0.7969 -0.39062,-1.1875 -0.51563,-0.6094 -1.3125,-0.6094 -0.73438,0 -1.23438,0.4844 -0.48438,0.48436 -0.53125,1.3125 z m 6.20313,-3.6719 v -1.21874 h 1.0625 v 1.21874 z m 0,7.375 v -6.21874 h 1.0625 V 349.45 Z m 2.79687,0.51564 1.03125,0.15626 q 0.0625,0.46874 0.35938,0.6875 0.39062,0.29686 1.0625,0.29686 0.73437,0 1.125,-0.29686 0.40624,-0.2969 0.54687,-0.8125 0.0937,-0.32814 0.0781,-1.3594 -0.6875,0.8125 -1.71876,0.8125 -1.28124,0 -1.98437,-0.92186 -0.70313,-0.9375 -0.70313,-2.21874 0,-0.89064 0.3125,-1.64064 0.32813,-0.76562 0.9375,-1.17186 0.60938,-0.40626 1.4375,-0.40626 1.10938,0 1.82813,0.89062 v -0.75 h 0.96875 v 5.375 q 0,1.45314 -0.29688,2.0625 -0.29687,0.60938 -0.9375,0.95314 -0.64062,0.35936 -1.57812,0.35936 -1.10938,0 -1.79688,-0.5 -0.6875,-0.5 -0.67187,-1.51562 z m 0.875,-3.73438 q 0,1.21874 0.48437,1.78124 0.48438,0.5625 1.21876,0.5625 0.73437,0 1.21874,-0.5625 0.5,-0.5625 0.5,-1.75 0,-1.1406 -0.51562,-1.71874 -0.5,-0.57812 -1.21875,-0.57812 -0.70313,0 -1.20313,0.57812 -0.48437,0.5625 -0.48437,1.6875 z m 6.32813,3.21874 v -8.59374 h 1.04687 v 3.07814 q 0.73437,-0.84376 1.85937,-0.84376 0.70313,0 1.20313,0.28126 0.51563,0.2656 0.73437,0.75 0.21876,0.46874 0.21876,1.3906 v 3.9375 h -1.04688 v -3.9375 q 0,-0.79686 -0.34375,-1.15624 Q 342.625,343.9969 342,343.9969 q -0.46875,0 -0.89062,0.25 -0.40626,0.23436 -0.59376,0.65624 -0.17187,0.40626 -0.17187,1.14062 V 349.45 Z m 9.29687,-0.9375 0.15625,0.9219 q -0.45312,0.0937 -0.79688,0.0937 -0.57812,0 -0.89062,-0.17188 -0.3125,-0.1875 -0.45312,-0.48436 -0.125,-0.2969 -0.125,-1.25 v -3.57814 h -0.76563 v -0.8125 h 0.76563 v -1.54686 l 1.04687,-0.625 v 2.17186 h 1.0625 v 0.8125 h -1.0625 v 3.64064 q 0,0.4531 0.0469,0.5781 0.0625,0.125 0.1875,0.20314 0.125,0.0781 0.35938,0.0781 0.1875,0 0.46875,-0.0313 z"
+         fill-rule="nonzero"
+         id="path112323" />
+      <path
+         fill="#000000"
+         d="m 29.550013,204.71458 h -8.59375 v -1.125 h 3.53125 v -4.46875 h -3.53125 v -1.14062 h 8.59375 v 1.14062 h -4.046875 v 4.46875 h 4.046875 z m -2,-13.07812 0.125,-1.09375 q 0.953125,0.25 1.484375,0.95312 0.53125,0.70313 0.53125,1.78125 0,1.35938 -0.84375,2.17188 -0.84375,0.79687 -2.359375,0.79687 -1.5625,0 -2.421875,-0.8125 -0.875,-0.8125 -0.875,-2.09375 0,-1.25 0.84375,-2.03125 0.84375,-0.79687 2.390625,-0.79687 0.09375,0 0.28125,0 v 4.64062 q 1.03125,-0.0625 1.578125,-0.57812 0.53125,-0.51563 0.53125,-1.29688 0,-0.57812 -0.296875,-0.98437 -0.3125,-0.42188 -0.96875,-0.65625 z m -1.703125,3.45312 v -3.46875 q -0.796875,0.0625 -1.1875,0.39063 -0.609375,0.51562 -0.609375,1.3125 0,0.73437 0.484375,1.23437 0.484375,0.48438 1.3125,0.53125 z m -3.671875,-6.20312 h -1.21875 v -1.0625 h 1.21875 z m 7.375,0 h -6.21875 v -1.0625 h 6.21875 z m 0.515625,-2.79688 0.15625,-1.03125 q 0.46875,-0.0625 0.6875,-0.35937 0.296875,-0.39063 0.296875,-1.0625 0,-0.73438 -0.296875,-1.125 -0.296875,-0.40625 -0.8125,-0.54688 -0.328125,-0.0937 -1.359375,-0.0781 0.8125,0.6875 0.8125,1.71875 0,1.28125 -0.921875,1.98437 -0.9375,0.70313 -2.21875,0.70313 -0.890625,0 -1.640625,-0.3125 -0.765625,-0.32813 -1.171875,-0.9375 -0.40625,-0.60938 -0.40625,-1.4375 0,-1.10938 0.890625,-1.82813 h -0.75 v -0.96875 h 5.375 q 1.453125,0 2.0625,0.29688 0.609375,0.29687 0.953125,0.9375 0.359372,0.64062 0.359372,1.57812 0,1.10938 -0.499997,1.79688 -0.5,0.6875 -1.515625,0.67187 z m -3.734375,-0.875 q 1.21875,0 1.78125,-0.48437 0.5625,-0.48438 0.5625,-1.21875 0,-0.73438 -0.5625,-1.21875 -0.5625,-0.5 -1.75,-0.5 -1.140625,0 -1.71875,0.51562 -0.578125,0.5 -0.578125,1.21875 0,0.70313 0.578125,1.20313 0.5625,0.48437 1.6875,0.48437 z m 3.21875,-6.32812 h -8.59375 v -1.04688 h 3.078125 q -0.84375,-0.73437 -0.84375,-1.85937 0,-0.70313 0.28125,-1.20313 0.265625,-0.51562 0.75,-0.73437 0.46875,-0.21875 1.390625,-0.21875 h 3.9375 v 1.04687 h -3.9375 q -0.796875,0 -1.15625,0.34375 -0.359375,0.34375 -0.359375,0.96875 0,0.46875 0.25,0.89063 0.234375,0.40625 0.65625,0.59375 0.40625,0.17187 1.140625,0.17187 h 3.40625 z m -0.9375,-9.29688 0.921875,-0.15625 q 0.09375,0.45313 0.09375,0.79688 0,0.57812 -0.171875,0.89062 -0.1875,0.3125 -0.484375,0.45313 -0.296875,0.125 -1.25,0.125 h -3.578125 v 0.76562 h -0.8125 v -0.76562 h -1.546875 l -0.625,-1.04688 h 2.171875 v -1.0625 h 0.8125 v 1.0625 h 3.640625 q 0.453125,0 0.578125,-0.0469 0.125,-0.0625 0.203125,-0.1875 0.07813,-0.125 0.07813,-0.35938 0,-0.1875 -0.03125,-0.46875 z"
+         fill-rule="nonzero"
+         id="path112325" />
+      <path
+         fill="#000000"
+         d="m 55.01875,304.45 h -1.046876 v -6.71874 q -0.390624,0.35938 -1.015624,0.73438 -0.609376,0.35936 -1.09375,0.53126 v -1.01564 q 0.875,-0.42186 1.53125,-1 0.671874,-0.59376 0.953124,-1.15626 h 0.671876 z m 6.40625,0 v -2.0625 h -3.71875 v -0.96874 l 3.921874,-5.5625 H 62.4875 v 5.5625 h 1.15625 v 0.96874 H 62.4875 v 2.0625 z m 0,-3.03124 v -3.85936 l -2.6875,3.85936 z m 3.625,-1.20312 q 0,-1.53124 0.3125,-2.45314 0.3125,-0.9375 0.92188,-1.4375 0.625,-0.5 1.5625,-0.5 0.6875,0 1.20312,0.28126 0.53125,0.28124 0.875,0.8125 0.34375,0.51564 0.53125,1.26564 0.1875,0.75 0.1875,2.03124 0,1.51562 -0.3125,2.4375 -0.29687,0.92186 -0.92187,1.4375 -0.60938,0.5 -1.5625,0.5 -1.23438,0 -1.95313,-0.89064 Q 65.05,302.6375 65.05,300.21564 Z m 1.07813,0 q 0,2.10936 0.5,2.8125 0.5,0.70312 1.21875,0.70312 0.73437,0 1.21875,-0.70312 0.5,-0.70314 0.5,-2.8125 0,-2.125 -0.5,-2.8125 Q 68.58125,296.7 67.83125,296.7 q -0.71875,0 -1.15625,0.6094 -0.54687,0.78124 -0.54687,2.90624 z"
+         fill-rule="nonzero"
+         id="path112327" />
+      <path
+         fill="#000000"
+         d="m 55.01875,224.93889 h -1.046876 v -6.71875 q -0.390624,0.35937 -1.015624,0.73437 -0.609376,0.35938 -1.09375,0.53125 v -1.01562 q 0.875,-0.42188 1.53125,-1 0.671874,-0.59375 0.953124,-1.15625 h 0.671876 z m 8.5,-6.48438 -1.046876,0.0781 q -0.140624,-0.625 -0.390624,-0.90625 -0.4375,-0.45313 -1.0625,-0.45313 -0.5,0 -0.890626,0.28125 -0.484374,0.375 -0.78125,1.07813 -0.28125,0.6875 -0.296874,1.96875 0.375,-0.57813 0.921874,-0.85938 0.5625,-0.28125 1.171876,-0.28125 1.046874,0 1.78125,0.78125 0.75,0.78125 0.75,2 0,0.8125 -0.359376,1.51563 -0.34375,0.6875 -0.953124,1.0625 -0.609376,0.35937 -1.375,0.35937 -1.328126,0 -2.15625,-0.96875 -0.828126,-0.96875 -0.828126,-3.1875 0,-2.5 0.921876,-3.625 0.796874,-0.98437 2.15625,-0.98437 1.015624,0 1.65625,0.57812 0.65625,0.5625 0.78125,1.5625 z m -4.296876,3.70313 q 0,0.54687 0.21875,1.04687 0.234376,0.48438 0.640626,0.75 0.421874,0.26563 0.890624,0.26563 0.65625,0 1.140626,-0.53125 0.484374,-0.54688 0.484374,-1.46875 0,-0.89063 -0.484374,-1.40625 -0.46875,-0.51563 -1.1875,-0.51563 -0.71875,0 -1.21875,0.51563 -0.484376,0.51562 -0.484376,1.34375 z m 5.828126,0.53125 1.10938,-0.0937 q 0.125,0.8125 0.5625,1.21875 0.45312,0.40625 1.09375,0.40625 0.75,0 1.28125,-0.57813 0.53125,-0.57812 0.53125,-1.51562 0,-0.90625 -0.51563,-1.42188 -0.5,-0.53125 -1.32812,-0.53125 -0.5,0 -0.92188,0.23438 -0.40625,0.23437 -0.64062,0.59375 l -0.98438,-0.125 0.82813,-4.40625 h 4.28125 v 1 h -3.4375 l -0.45313,2.3125 q 0.76563,-0.54688 1.60938,-0.54688 1.125,0 1.89062,0.78125 0.78125,0.78125 0.78125,2.01563 0,1.15625 -0.67187,2.01562 -0.82813,1.03125 -2.25,1.03125 -1.17188,0 -1.92188,-0.65625 -0.73437,-0.65625 -0.84375,-1.73437 z"
+         fill-rule="nonzero"
+         id="path112329" />
+      <path
+         fill="#000000"
+         d="m 55.01875,145.42778 h -1.046876 v -6.71875 q -0.390624,0.35937 -1.015624,0.73437 -0.609376,0.35938 -1.09375,0.53126 v -1.01563 q 0.875,-0.42187 1.53125,-1 0.671874,-0.59375 0.953124,-1.15625 h 0.671876 z m 3.1875,-1.98438 1.015624,-0.0937 q 0.125,0.71874 0.484376,1.04687 0.375,0.3125 0.9375,0.3125 0.484374,0 0.84375,-0.21875 0.375,-0.23438 0.609374,-0.59375 0.234376,-0.375 0.390626,-1 0.15625,-0.64063 0.15625,-1.29687 0,-0.0781 0,-0.21876 -0.3125,0.5 -0.859376,0.82813 -0.546874,0.3125 -1.1875,0.3125 -1.078124,0 -1.8125,-0.76563 Q 58.05,140.97466 58.05,139.70903 q 0,-1.3125 0.765624,-2.10937 0.78125,-0.79688 1.9375,-0.79688 0.828126,0 1.515626,0.45312 0.703124,0.45313 1.0625,1.29688 0.359374,0.82812 0.359374,2.40625 0,1.64063 -0.359374,2.625 -0.34375,0.96875 -1.0625,1.48437 -0.703126,0.5 -1.640626,0.5 -1.015624,0 -1.65625,-0.54687 -0.640624,-0.5625 -0.765624,-1.57813 z m 4.3125,-3.79687 q 0,-0.90625 -0.484376,-1.4375 -0.46875,-0.53125 -1.15625,-0.53125 -0.703124,0 -1.234374,0.57812 -0.515626,0.5625 -0.515626,1.48438 0,0.8125 0.5,1.32812 0.5,0.51563 1.21875,0.51563 0.734376,0 1.203126,-0.51563 0.46875,-0.51562 0.46875,-1.42187 z M 65.05,141.1934 q 0,-1.53124 0.3125,-2.45312 0.3125,-0.9375 0.92188,-1.4375 0.625,-0.5 1.5625,-0.5 0.6875,0 1.20312,0.28125 0.53125,0.28125 0.875,0.8125 0.34375,0.51563 0.53125,1.26563 0.1875,0.75 0.1875,2.03124 0,1.51563 -0.3125,2.4375 -0.29687,0.92188 -0.92187,1.4375 -0.60938,0.5 -1.5625,0.5 -1.23438,0 -1.95313,-0.89062 Q 65.05,143.61528 65.05,141.1934 Z m 1.07813,0 q 0,2.10938 0.5,2.8125 0.5,0.70313 1.21875,0.70313 0.73437,0 1.21875,-0.70313 0.5,-0.70312 0.5,-2.8125 0,-2.125 -0.5,-2.8125 -0.48438,-0.70312 -1.23438,-0.70312 -0.71875,0 -1.15625,0.60938 -0.54687,0.78124 -0.54687,2.90624 z"
+         fill-rule="nonzero"
+         id="path112331" />
+      <path
+         fill="#000000"
+         d="m 56.596874,64.90104 v 1.015624 h -5.6875 q 0,-0.375 0.125,-0.734374 0.21875,-0.578126 0.6875,-1.140626 0.484376,-0.5625 1.390626,-1.296874 1.40625,-1.15625 1.890624,-1.828126 0.5,-0.671874 0.5,-1.265624 0,-0.625 -0.453124,-1.046876 -0.453126,-0.4375 -1.171876,-0.4375 -0.765624,0 -1.21875,0.453126 -0.453124,0.453124 -0.46875,1.265624 L 51.1125,59.77604 q 0.109374,-1.21875 0.828124,-1.84375 0.734376,-0.640626 1.96875,-0.640626 1.234376,0 1.953126,0.6875 0.71875,0.6875 0.71875,1.703126 0,0.515624 -0.21875,1.015624 -0.203126,0.484376 -0.703126,1.046876 -0.484374,0.546874 -1.609374,1.5 -0.953126,0.796874 -1.234376,1.09375 -0.265624,0.28125 -0.4375,0.5625 z m 5.421876,1.015624 h -1.046876 v -6.71875 Q 60.58125,59.55729 59.95625,59.93229 59.346874,60.291664 58.8625,60.46354 v -1.015626 q 0.875,-0.421874 1.53125,-1 0.671874,-0.59375 0.953124,-1.15625 h 0.671876 z m 3.03125,-2.25 1.10938,-0.09375 q 0.125,0.8125 0.5625,1.21875 0.45312,0.40625 1.09375,0.40625 0.75,0 1.28125,-0.578124 0.53125,-0.578126 0.53125,-1.515626 0,-0.90625 -0.51563,-1.421874 -0.5,-0.53125 -1.32812,-0.53125 -0.5,0 -0.92188,0.234374 -0.40625,0.234376 -0.64062,0.59375 l -0.98438,-0.125 0.82813,-4.40625 h 4.28125 v 1 h -3.4375 l -0.45313,2.3125 q 0.76563,-0.546874 1.60938,-0.546874 1.125,0 1.89062,0.78125 0.78125,0.78125 0.78125,2.015624 0,1.15625 -0.67187,2.015626 -0.82813,1.03125 -2.25,1.03125 -1.17188,0 -1.92188,-0.65625 Q 65.15938,64.74479 65.05,63.666664 Z"
+         fill-rule="nonzero"
+         id="path112333" />
+      <path
+         fill="#000000"
+         d="m 74.425,317.45 v -2.0625 h -3.71875 v -0.96874 l 3.92188,-5.5625 h 0.85937 v 5.5625 h 1.15625 v 0.96874 H 75.4875 v 2.0625 z m 0,-3.03124 v -3.85936 l -2.6875,3.85936 z m 3.625,-1.20312 q 0,-1.53124 0.3125,-2.45314 0.3125,-0.9375 0.92188,-1.4375 0.625,-0.5 1.5625,-0.5 0.6875,0 1.20312,0.28126 0.53125,0.28124 0.875,0.8125 0.34375,0.51564 0.53125,1.26564 0.1875,0.75 0.1875,2.03124 0,1.51562 -0.3125,2.4375 -0.29687,0.92186 -0.92187,1.4375 -0.60938,0.5 -1.5625,0.5 -1.23438,0 -1.95313,-0.89064 Q 78.05,315.6375 78.05,313.21564 Z m 1.07813,0 q 0,2.10936 0.5,2.8125 0.5,0.70312 1.21875,0.70312 0.73437,0 1.21875,-0.70312 0.5,-0.70314 0.5,-2.8125 0,-2.125 -0.5,-2.8125 Q 81.58125,309.7 80.83125,309.7 q -0.71875,0 -1.15625,0.6094 -0.54687,0.78124 -0.54687,2.90624 z"
+         fill-rule="nonzero"
+         id="path112335" />
+      <path
+         fill="#000000"
+         d="m 202.49374,310.96564 -1.04687,0.0781 q -0.14063,-0.625 -0.39063,-0.90626 -0.4375,-0.4531 -1.0625,-0.4531 -0.5,0 -0.89062,0.28124 -0.48438,0.375 -0.78125,1.07812 -0.28125,0.6875 -0.29687,1.96874 0.375,-0.5781 0.92187,-0.85936 0.5625,-0.28124 1.17187,-0.28124 1.04688,0 1.78126,0.78124 0.75,0.78126 0.75,2 0,0.8125 -0.35938,1.51562 -0.34375,0.6875 -0.95312,1.0625 -0.60938,0.35938 -1.375,0.35938 -1.32813,0 -2.15626,-0.96874 -0.82812,-0.96876 -0.82812,-3.1875 0,-2.5 0.92188,-3.625 0.79687,-0.9844 2.15624,-0.9844 1.01563,0 1.65626,0.57814 0.65624,0.5625 0.78124,1.5625 z m -4.29687,3.70312 q 0,0.54688 0.21875,1.04688 0.23438,0.48436 0.64062,0.75 0.42188,0.26562 0.89063,0.26562 0.65625,0 1.14063,-0.53126 0.48437,-0.54686 0.48437,-1.46874 0,-0.89062 -0.48437,-1.40626 -0.46876,-0.5156 -1.1875,-0.5156 -0.71876,0 -1.21876,0.5156 -0.48437,0.51564 -0.48437,1.34376 z m 5.82813,0.53124 1.10937,-0.0937 q 0.125,0.8125 0.5625,1.21874 0.45313,0.40626 1.09375,0.40626 0.75,0 1.28125,-0.57812 0.53125,-0.57814 0.53125,-1.51564 0,-0.90624 -0.51562,-1.42186 -0.5,-0.53124 -1.32813,-0.53124 -0.5,0 -0.92187,0.23436 -0.40626,0.23438 -0.64063,0.59374 l -0.98437,-0.125 0.82812,-4.40624 h 4.28125 v 1 h -3.4375 l -0.45313,2.3125 q 0.76563,-0.54686 1.60938,-0.54686 1.125,0 1.89062,0.78124 0.78126,0.78126 0.78126,2.01562 0,1.15624 -0.67188,2.01564 -0.82812,1.03124 -2.25,1.03124 -1.17188,0 -1.92188,-0.65624 -0.73437,-0.65626 -0.84374,-1.7344 z"
+         fill-rule="nonzero"
+         id="path112337" />
+      <path
+         fill="#000000"
+         d="m 323.15625,315.46564 1.01563,-0.0937 q 0.125,0.71874 0.48437,1.04686 0.375,0.3125 0.9375,0.3125 0.48437,0 0.84375,-0.21876 0.375,-0.23436 0.60938,-0.59374 0.23437,-0.375 0.39062,-1 0.15625,-0.64062 0.15625,-1.29686 0,-0.0781 0,-0.21876 -0.3125,0.5 -0.85937,0.82812 -0.54688,0.3125 -1.1875,0.3125 -1.07813,0 -1.8125,-0.76562 Q 323,312.9969 323,311.73126 q 0,-1.3125 0.76562,-2.10936 0.78126,-0.7969 1.9375,-0.7969 0.82813,0 1.51563,0.45314 0.70313,0.45312 1.0625,1.29686 0.35937,0.82814 0.35937,2.40626 0,1.64064 -0.35937,2.625 -0.34375,0.96874 -1.0625,1.48438 -0.70313,0.5 -1.64063,0.5 -1.01562,0 -1.65624,-0.54688 -0.64063,-0.5625 -0.76563,-1.57812 z m 4.3125,-3.79688 q 0,-0.90626 -0.48437,-1.4375 -0.46876,-0.53126 -1.15626,-0.53126 -0.70312,0 -1.23437,0.57814 -0.51563,0.5625 -0.51563,1.48436 0,0.8125 0.5,1.32814 0.5,0.51562 1.21876,0.51562 0.73437,0 1.20312,-0.51562 0.46875,-0.51564 0.46875,-1.42188 z M 330,313.21564 q 0,-1.53124 0.3125,-2.45314 0.3125,-0.9375 0.92188,-1.4375 0.625,-0.5 1.5625,-0.5 0.6875,0 1.20312,0.28126 0.53125,0.28124 0.875,0.8125 0.34375,0.51564 0.53125,1.26564 0.1875,0.75 0.1875,2.03124 0,1.51562 -0.3125,2.4375 -0.29687,0.92186 -0.92187,1.4375 -0.60938,0.5 -1.5625,0.5 -1.23438,0 -1.95313,-0.89064 Q 330,315.6375 330,313.21564 Z m 1.07812,0 q 0,2.10936 0.5,2.8125 0.5,0.70312 1.21876,0.70312 0.73437,0 1.21874,-0.70312 0.5,-0.70314 0.5,-2.8125 0,-2.125 -0.5,-2.8125 -0.48437,-0.70314 -1.23437,-0.70314 -0.71875,0 -1.15625,0.6094 -0.54688,0.78124 -0.54688,2.90624 z"
+         fill-rule="nonzero"
+         id="path112339" />
+      <path
+         fill="#000000"
+         d="m 449.44376,317.45 h -1.04688 v -6.71874 q -0.39062,0.35938 -1.01562,0.73438 -0.60938,0.35936 -1.09376,0.53126 v -1.01564 q 0.875,-0.42186 1.53126,-1 0.67187,-0.59376 0.95312,-1.15626 h 0.67188 z m 7,0 h -1.04688 v -6.71874 q -0.39062,0.35938 -1.01562,0.73438 -0.60938,0.35936 -1.09376,0.53126 v -1.01564 q 0.875,-0.42186 1.53126,-1 0.67187,-0.59376 0.95312,-1.15626 h 0.67188 z m 3.03124,-2.25 1.10938,-0.0937 q 0.125,0.8125 0.5625,1.21874 0.45312,0.40626 1.09375,0.40626 0.75,0 1.28125,-0.57812 0.53125,-0.57814 0.53125,-1.51564 0,-0.90624 -0.51563,-1.42186 -0.5,-0.53124 -1.32812,-0.53124 -0.5,0 -0.92188,0.23436 -0.40624,0.23438 -0.64062,0.59374 l -0.98438,-0.125 0.82813,-4.40624 h 4.28125 v 1 h -3.4375 l -0.45312,2.3125 q 0.76562,-0.54686 1.60937,-0.54686 1.125,0 1.89063,0.78124 0.78124,0.78126 0.78124,2.01562 0,1.15624 -0.67187,2.01564 -0.82813,1.03124 -2.25,1.03124 -1.17187,0 -1.92187,-0.65624 -0.73438,-0.65626 -0.84376,-1.7344 z"
+         fill-rule="nonzero"
+         id="path112341" />
+      <path
+         fill="#000000"
+         d="m 575.41876,317.45 h -1.04686 v -6.71874 q -0.39064,0.35938 -1.01564,0.73438 -0.60936,0.35936 -1.09376,0.53126 v -1.01564 q 0.875,-0.42186 1.53126,-1 0.67188,-0.59376 0.95314,-1.15626 h 0.67186 z m 6.40624,0 v -2.0625 h -3.71874 v -0.96874 l 3.92188,-5.5625 h 0.85936 v 5.5625 h 1.15626 v 0.96874 h -1.15626 v 2.0625 z m 0,-3.03124 v -3.85936 l -2.6875,3.85936 z m 3.625,-1.20312 q 0,-1.53124 0.3125,-2.45314 0.3125,-0.9375 0.9219,-1.4375 0.625,-0.5 1.5625,-0.5 0.6875,0 1.2031,0.28126 0.53126,0.28124 0.875,0.8125 0.34376,0.51564 0.53126,1.26564 0.1875,0.75 0.1875,2.03124 0,1.51562 -0.3125,2.4375 -0.29686,0.92186 -0.92186,1.4375 -0.6094,0.5 -1.5625,0.5 -1.2344,0 -1.95314,-0.89064 -0.84376,-1.0625 -0.84376,-3.48436 z m 1.07814,0 q 0,2.10936 0.5,2.8125 0.5,0.70312 1.21876,0.70312 0.73436,0 1.21874,-0.70312 0.5,-0.70314 0.5,-2.8125 0,-2.125 -0.5,-2.8125 -0.48438,-0.70314 -1.23438,-0.70314 -0.71876,0 -1.15626,0.6094 -0.54686,0.78124 -0.54686,2.90624 z"
+         fill-rule="nonzero"
+         id="path112343" />
+      <rect
+         style="fill:#000000;stroke:#000000;stroke-width:1.15183;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         id="rect112598"
+         width="11.020167"
+         height="9.0759048"
+         x="428.62012"
+         y="143.09004"
+         ry="0" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.761891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M 434.5503,146.90838 162.4192,195.66656"
+         id="path113258" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.761891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M 434.5503,146.90838 539.95869,131.9254"
+         id="path113262" />
+      <text
+         xml:space="preserve"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.761891"
+         x="328.28354"
+         y="78.15921"
+         id="text114292"
+         transform="scale(1.0136168,0.98656613)"><tspan
+           sodipodi:role="line"
+           id="tspan114290"
+           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.761891"
+           x="328.28354"
+           y="78.15921">basketball</tspan><tspan
+           sodipodi:role="line"
+           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.761891"
+           x="328.28354"
+           y="96.669586"
+           id="tspan114602">player</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.761891"
+         x="415.56625"
+         y="109.67815"
+         id="text118086"
+         transform="scale(1.0136168,0.98656613)"><tspan
+           sodipodi:role="line"
+           id="tspan118084"
+           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.761891"
+           x="415.56625"
+           y="109.67815">shortest</tspan><tspan
+           sodipodi:role="line"
+           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.761891"
+           x="415.56625"
+           y="128.18852"
+           id="tspan118638">distance</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.446669"
+         x="504.48294"
+         y="164.05591"
+         id="text119852"
+         transform="scale(1.0136168,0.98656613)"><tspan
+           sodipodi:role="line"
+           id="tspan119850"
+           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.446669"
+           x="504.48294"
+           y="164.05591">football</tspan><tspan
+           sodipodi:role="line"
+           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.446669"
+           x="504.48294"
+           y="182.56631"
+           id="tspan119876">lineman</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.391862"
+         x="112.2299"
+         y="168.39136"
+         id="text121552"
+         transform="scale(1.0136168,0.98656613)"><tspan
+           sodipodi:role="line"
+           id="tspan121550"
+           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.391862"
+           x="112.2299"
+           y="168.39136">marathon</tspan><tspan
+           sodipodi:role="line"
+           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.391862"
+           x="112.2299"
+           y="186.90173"
+           id="tspan121554">runner</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:italic;font-stretch:condensed;font-size:14.8083px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';fill:#000000;stroke-width:0.370208"
+         x="119.85936"
+         y="271.38208"
+         id="text124154"
+         transform="scale(1.0136168,0.98656613)"><tspan
+           sodipodi:role="line"
+           id="tspan124152"
+           style="fill:#000000;stroke-width:0.370208"
+           x="119.85936"
+           y="271.38208">female</tspan><tspan
+           sodipodi:role="line"
+           style="fill:#000000;stroke-width:0.370208"
+           x="119.85936"
+           y="289.89246"
+           id="tspan124156">gymnast</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.761891"
+         x="383.78757"
+         y="182.4346"
+         id="text128880"
+         transform="scale(1.0136168,0.98656613)"><tspan
+           sodipodi:role="line"
+           id="tspan128878"
+           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.761891"
+           x="383.78757"
+           y="182.4346">athlete to be</tspan><tspan
+           sodipodi:role="line"
+           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.8083px;font-family:Arial;-inkscape-font-specification:'Arial, Italic Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.761891"
+           x="383.78757"
+           y="200.94498"
+           id="tspan128882">classified</tspan></text>
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1.33901;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="M 434.5503,146.90838 389.37758,99.902324"
+         id="path132071" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.761891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M 434.5503,146.90838 101.22492,252.57671"
+         id="path132073" />
+    </g>
+  </g>
+</svg>
index 52d7330bf753fdbd1691a1515032d0e9c5592d2a..22efca4a6f8344f16ad63690d25fec841b9dee86 100644 (file)
@@ -3,8 +3,30 @@
 Building from source
 ====================
 
-A general overview of building NumPy from source is given here, with detailed
-instructions for specific platforms given separately.
+There are two options for building NumPy- building with Gitpod or locally from
+source. Your choice depends on your operating system and familiarity with the
+command line.
+
+Gitpod
+------------
+
+Gitpod is an open-source platform that automatically creates
+the correct development environment right in your browser, reducing the need to
+install local development environments and deal with incompatible dependencies.
+
+If you are a Windows user, unfamiliar with using the command line or building
+NumPy for the first time, it is often faster to build with Gitpod. Here are the
+in-depth instructions for building NumPy with `building NumPy with Gitpod`_.
+
+.. _building NumPy with Gitpod: https://numpy.org/devdocs/dev/development_gitpod.html
+
+Building locally
+------------------
+
+Building locally on your machine gives you
+more granular control. If you are a MacOS or Linux user familiar with using the
+command line, you can continue with building NumPy locally by following the
+instructions below.
 
 ..
   This page is referenced from numpy/numpy/__init__.py. Please keep its
@@ -23,15 +45,19 @@ Building NumPy requires the following software installed:
 
 2) Compilers
 
-   To build any extension modules for Python, you'll need a C compiler.
-   Various NumPy modules use FORTRAN 77 libraries, so you'll also need a
-   FORTRAN 77 compiler installed.
+   Much of NumPy is written in C.  You will need a C compiler that complies
+   with the C99 standard.
+
+   While a FORTRAN 77 compiler is not necessary for building NumPy, it is
+   needed to run the ``numpy.f2py`` tests. These tests are skipped if the
+   compiler is not auto-detected.
 
    Note that NumPy is developed mainly using GNU compilers and tested on
    MSVC and Clang compilers. Compilers from other vendors such as Intel,
-   Absoft, Sun, NAG, Compaq, Vast, Portland, Lahey, HP, IBM are only supported
-   in the form of community feedback, and may not work out of the box.
-   GCC 4.x (and later) compilers are recommended. On ARM64 (aarch64) GCC 8.x (and later) are recommended.
+   Absoft, Sun, NAG, Compaq, Vast, Portland, Lahey, HP, IBM are only
+   supported in the form of community feedback, and may not work out of the
+   box.  GCC 4.x (and later) compilers are recommended. On ARM64 (aarch64)
+   GCC 8.x (and later) are recommended.
 
 3) Linear Algebra libraries
 
@@ -67,7 +93,8 @@ To perform an in-place build that can be run from the source folder run::
 Testing
 -------
 
-Make sure to test your builds. To ensure everything stays in shape, see if all tests pass::
+Make sure to test your builds. To ensure everything stays in shape, see if
+all tests pass::
 
     $ python runtests.py -v -m full
 
@@ -105,11 +132,12 @@ For more information see::
 How to check the ABI of BLAS/LAPACK libraries
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-One relatively simple and reliable way to check for the compiler used to build
-a library is to use ldd on the library. If libg2c.so is a dependency, this
-means that g77 has been used (note: g77 is no longer supported for building NumPy).
-If libgfortran.so is a dependency, gfortran has been used. If both are dependencies,
-this means both have been used, which is almost always a very bad idea.
+One relatively simple and reliable way to check for the compiler used to
+build a library is to use ldd on the library. If libg2c.so is a dependency,
+this means that g77 has been used (note: g77 is no longer supported for
+building NumPy). If libgfortran.so is a dependency, gfortran has been used.
+If both are dependencies, this means both have been used, which is almost
+always a very bad idea.
 
 .. _accelerated-blas-lapack-libraries:
 
@@ -155,11 +183,11 @@ Alternatively one may use ``!`` or ``^`` to negate all items::
 
         NPY_BLAS_ORDER='^blas,atlas' python setup.py build
 
-will allow using anything **but** NetLIB BLAS and ATLAS libraries, the order of the above
-list is retained.
+will allow using anything **but** NetLIB BLAS and ATLAS libraries, the order
+of the above list is retained.
 
-One cannot mix negation and positives, nor have multiple negations, such cases will
-raise an error.
+One cannot mix negation and positives, nor have multiple negations, such
+cases will raise an error.
 
 LAPACK
 ~~~~~~
@@ -191,19 +219,19 @@ Alternatively one may use ``!`` or ``^`` to negate all items::
 
         NPY_LAPACK_ORDER='^lapack' python setup.py build
 
-will allow using anything **but** the NetLIB LAPACK library, the order of the above
-list is retained.
+will allow using anything **but** the NetLIB LAPACK library, the order of
+the above list is retained.
 
-One cannot mix negation and positives, nor have multiple negations, such cases will
-raise an error.
+One cannot mix negation and positives, nor have multiple negations, such
+cases will raise an error.
 
 .. deprecated:: 1.20
   The native libraries on macOS, provided by Accelerate, are not fit for use
-  in NumPy since they have bugs that cause wrong output under easily reproducible
-  conditions. If the vendor fixes those bugs, the library could be reinstated,
-  but until then users compiling for themselves should use another linear
-  algebra library or use the built-in (but slower) default, see the next
-  section.
+  in NumPy since they have bugs that cause wrong output under easily
+  reproducible conditions. If the vendor fixes those bugs, the library could
+  be reinstated, but until then users compiling for themselves should use
+  another linear algebra library or use the built-in (but slower) default,
+  see the next section.
 
 
 Disabling ATLAS and other accelerated libraries
@@ -257,5 +285,6 @@ Supplying additional compiler flags
 
 Additional compiler flags can be supplied by setting the ``OPT``,
 ``FOPT`` (for Fortran), and ``CC`` environment variables.
-When providing options that should improve the performance of the code ensure
-that you also set ``-DNDEBUG`` so that debugging code is not executed.
+When providing options that should improve the performance of the code
+ensure that you also set ``-DNDEBUG`` so that debugging code is not
+executed.
index 289a7951b79227547b76f1768ce13657418b127b..7dd22afbf629c3da0ab89ec827f7c09aa99b0d17 100644 (file)
@@ -172,16 +172,15 @@ iterators so that all that needs to be done to advance to the next element in
 each array is for PyArray_ITER_NEXT to be called for each of the inputs. This
 incrementing is automatically performed by
 :c:func:`PyArray_MultiIter_NEXT` ( ``obj`` ) macro (which can handle a
-multiterator ``obj`` as either a :c:expr:`PyArrayMultiObject *` or a
+multiterator ``obj`` as either a :c:expr:`PyArrayMultiIterObject *` or a
 :c:expr:`PyObject *`). The data from input number ``i`` is available using
-:c:func:`PyArray_MultiIter_DATA` ( ``obj``, ``i`` ) and the total (broadcasted)
-size as :c:func:`PyArray_MultiIter_SIZE` ( ``obj``). An example of using this
+:c:func:`PyArray_MultiIter_DATA` ( ``obj``, ``i`` ). An example of using this
 feature follows.
 
 .. code-block:: c
 
     mobj = PyArray_MultiIterNew(2, obj1, obj2);
-    size = PyArray_MultiIter_SIZE(obj);
+    size = mobj->size;
     while(size--) {
         ptr1 = PyArray_MultiIter_DATA(mobj, 0);
         ptr2 = PyArray_MultiIter_DATA(mobj, 1);
@@ -330,7 +329,7 @@ function :c:func:`PyArray_RegisterCanCast` (from_descr, totype_number,
 scalarkind) should be used to specify that the data-type object
 from_descr can be cast to the data-type with type number
 totype_number. If you are not trying to alter scalar coercion rules,
-then use :c:data:`NPY_NOSCALAR` for the scalarkind argument.
+then use :c:enumerator:`NPY_NOSCALAR` for the scalarkind argument.
 
 If you want to allow your new data-type to also be able to share in
 the scalar coercion rules, then you need to specify the scalarkind
@@ -340,7 +339,7 @@ available to that function). Then, you can register data-types that
 can be cast to separately for each scalar kind that may be returned
 from your user-defined data-type. If you don't register scalar
 coercion handling, then all of your user-defined data-types will be
-seen as :c:data:`NPY_NOSCALAR`.
+seen as :c:enumerator:`NPY_NOSCALAR`.
 
 
 Registering a ufunc loop
@@ -473,7 +472,7 @@ The __array_finalize\__ method
    attribute is looked-up in the object dictionary. If it is present
    and not None, then it can be either a CObject containing a pointer
    to a :c:func:`PyArray_FinalizeFunc` or it can be a method taking a
-   single argument (which could be None).
+   single argument (which could be None)
 
    If the :obj:`~numpy.class.__array_finalize__` attribute is a CObject, then the pointer
    must be a pointer to a function with the signature:
index ebb4b7518d1d133af04898761f5ebec4ea8edb2c..96727a177136929ffbd0c99bb8cea7fa6da3e831 100644 (file)
@@ -433,7 +433,7 @@ writeable). The syntax is
 
         The requirements flag allows specification of what kind of
         array is acceptable. If the object passed in does not satisfy
-        this requirements then a copy is made so that thre returned
+        this requirements then a copy is made so that the returned
         object will satisfy the requirements. these ndarray can use a
         very generic pointer to memory.  This flag allows specification
         of the desired properties of the returned array object. All
index 8643d0dd1efa18687121febe423e86d854b07b44..6d514f146c4fedd0bccceecd9d710294764d215e 100644 (file)
@@ -1,6 +1,6 @@
-********************
+====================
 Using Python as glue
-********************
+====================
 
 |    There is no conversation more boring than the one where everybody
 |    agrees.
@@ -124,9 +124,9 @@ Creating source for a basic extension module
 
 Probably the easiest way to introduce f2py is to offer a simple
 example. Here is one of the subroutines contained in a file named
-:file:`add.f`:
+:file:`add.f`
 
-.. code-block:: none
+.. code-block:: fortran
 
     C
           SUBROUTINE ZADD(A,B,C,N)
@@ -149,14 +149,14 @@ routine can be automatically generated by f2py::
 
 You should be able to run this command assuming your search-path is
 set-up properly. This command will produce an extension module named
-addmodule.c in the current directory. This extension module can now be
+:file:`addmodule.c` in the current directory. This extension module can now be
 compiled and used from Python just like any other extension module.
 
 
 Creating a compiled extension module
 ------------------------------------
 
-You can also get f2py to compile add.f and also compile its produced
+You can also get f2py to both compile :file:`add.f` along with the produced
 extension module leaving only a shared-library extension file that can
 be imported from Python::
 
@@ -211,7 +211,7 @@ interface file use the -h option::
 This command leaves the file add.pyf in the current directory. The
 section of this file corresponding to zadd is:
 
-.. code-block:: none
+.. code-block:: fortran
 
     subroutine zadd(a,b,c,n) ! in :add:add.f
        double complex dimension(*) :: a
@@ -224,7 +224,7 @@ By placing intent directives and checking code, the interface can be
 cleaned up quite a bit until the Python module method is both easier
 to use and more robust.
 
-.. code-block:: none
+.. code-block:: fortran
 
     subroutine zadd(a,b,c,n) ! in :add:add.f
        double complex dimension(n) :: a
@@ -277,9 +277,9 @@ Inserting directives in Fortran source
 
 The nice interface can also be generated automatically by placing the
 variable directives as special comments in the original Fortran code.
-Thus, if I modify the source code to contain:
+Thus, if the source code is modified to contain:
 
-.. code-block:: none
+.. code-block:: fortran
 
     C
           SUBROUTINE ZADD(A,B,C,N)
@@ -298,14 +298,14 @@ Thus, if I modify the source code to contain:
      20   CONTINUE
           END
 
-Then, I can compile the extension module using::
+Then, one can compile the extension module using::
 
     f2py -c -m add add.f
 
 The resulting signature for the function add.zadd is exactly the same
 one that was created previously. If the original source code had
 contained ``A(N)`` instead of ``A(*)`` and so forth with ``B`` and ``C``,
-then I could obtain (nearly) the same interface simply by placing the
+then nearly the same interface can be obtained by placing the
 ``INTENT(OUT) :: C`` comment line in the source code. The only difference
 is that ``N`` would be an optional input that would default to the length
 of ``A``.
@@ -320,7 +320,7 @@ precision floating-point numbers using a fixed averaging filter. The
 advantage of using Fortran to index into multi-dimensional arrays
 should be clear from this example.
 
-.. code-block:: none
+.. code-block::
 
           SUBROUTINE DFILTER2D(A,B,M,N)
     C
@@ -407,13 +407,12 @@ conversion of the .pyf file to a .c file is handled by `numpy.disutils`.
 Conclusion
 ----------
 
-The interface definition file (.pyf) is how you can fine-tune the
-interface between Python and Fortran. There is decent documentation
-for f2py found in the numpy/f2py/docs directory where-ever NumPy is
-installed on your system (usually under site-packages). There is also
-more information on using f2py (including how to use it to wrap C
-codes) at https://scipy-cookbook.readthedocs.io under the "Interfacing
-With Other Languages" heading.
+The interface definition file (.pyf) is how you can fine-tune the interface
+between Python and Fortran. There is decent documentation for f2py at
+:ref:`f2py`. There is also more information on using f2py (including how to use
+it to wrap C codes) at the `"Interfacing With Other Languages" heading of the
+SciPy Cookbook.
+<https://scipy-cookbook.readthedocs.io/items/idx_interfacing_with_other_languages.html>`_
 
 The f2py method of linking compiled code is currently the most
 sophisticated and integrated approach. It allows clean separation of
@@ -422,7 +421,7 @@ distribution of the extension module. The only draw-back is that it
 requires the existence of a Fortran compiler in order for a user to
 install the code. However, with the existence of the free-compilers
 g77, gfortran, and g95, as well as high-quality commercial compilers,
-this restriction is not particularly onerous. In my opinion, Fortran
+this restriction is not particularly onerous. In our opinion, Fortran
 is still the easiest way to write fast and clear code for scientific
 computing. It handles complex numbers, and multi-dimensional indexing
 in the most straightforward way. Be aware, however, that some Fortran
@@ -493,7 +492,7 @@ Complex addition in Cython
 Here is part of a Cython module named ``add.pyx`` which implements the
 complex addition functions we previously implemented using f2py:
 
-.. code-block:: none
+.. code-block:: cython
 
     cimport cython
     cimport numpy as np
@@ -546,7 +545,7 @@ Image filter in Cython
 The two-dimensional example we created using Fortran is just as easy to write
 in Cython:
 
-.. code-block:: none
+.. code-block:: cython
 
     cimport numpy as np
     import numpy as np
@@ -809,7 +808,7 @@ Calling the function
 
 The function is accessed as an attribute of or an item from the loaded
 shared-library. Thus, if ``./mylib.so`` has a function named
-``cool_function1``, I could access this function either as:
+``cool_function1``, it may be accessed either as:
 
 .. code-block:: python
 
@@ -859,7 +858,7 @@ kind of array from a given input.
 Complete example
 ----------------
 
-In this example, I will show how the addition function and the filter
+In this example, we will demonstrate how the addition function and the filter
 function implemented previously using the other approaches can be
 implemented using ctypes. First, the C code which implements the
 algorithms contains the functions ``zadd``, ``dadd``, ``sadd``, ``cadd``,
@@ -1073,7 +1072,7 @@ Its disadvantages include
 
 - It is difficult to distribute an extension module made using ctypes
   because of a lack of support for building shared libraries in
-  distutils (but I suspect this will change in time).
+  distutils.
 
 - You must have shared-libraries of your code (no static libraries).
 
@@ -1095,15 +1094,14 @@ Additional tools you may find useful
 These tools have been found useful by others using Python and so are
 included here. They are discussed separately because they are
 either older ways to do things now handled by f2py, Cython, or ctypes
-(SWIG, PyFort) or because I don't know much about them (SIP, Boost).
-I have not added links to these
-methods because my experience is that you can find the most relevant
-link faster using Google or some other search engine, and any links
-provided here would be quickly dated. Do not assume that just because
-it is included in this list, I don't think the package deserves your
-attention. I'm including information about these packages because many
-people have found them useful and I'd like to give you as many options
-as possible for tackling the problem of easily integrating your code.
+(SWIG, PyFort) or because of a lack of reasonable documentation (SIP, Boost).
+Links to these methods are not included since the most relevant
+can be found using Google or some other search engine, and any links provided
+here would be quickly dated. Do not assume that inclusion in this list means
+that the package deserves attention. Information about these packages are
+collected here because many people have found them useful and we'd like to give
+you as many options as possible for tackling the problem of easily integrating
+your code.
 
 
 SWIG
@@ -1115,7 +1113,7 @@ SWIG
 Simplified Wrapper and Interface Generator (SWIG) is an old and fairly
 stable method for wrapping C/C++-libraries to a large variety of other
 languages. It does not specifically understand NumPy arrays but can be
-made useable with NumPy through the use of typemaps. There are some
+made usable with NumPy through the use of typemaps. There are some
 sample typemaps in the numpy/tools/swig directory under numpy.i together
 with an example module that makes use of them. SWIG excels at wrapping
 large C/C++ libraries because it can (almost) parse their headers and
@@ -1132,12 +1130,12 @@ to the Python-specific typemaps, SWIG can be used to interface a
 library with other languages such as Perl, Tcl, and Ruby.
 
 My experience with SWIG has been generally positive in that it is
-relatively easy to use and quite powerful. I used to use it quite
+relatively easy to use and quite powerful. It has been used
 often before becoming more proficient at writing C-extensions.
-However, I struggled writing custom interfaces with SWIG because it
+However, writing custom interfaces with SWIG is often troublesome because it
 must be done using the concept of typemaps which are not Python
-specific and are written in a C-like syntax. Therefore, I tend to
-prefer other gluing strategies and would only attempt to use SWIG to
+specific and are written in a C-like syntax. Therefore, other gluing strategies
+are preferred and SWIG would be probably considered only to
 wrap a very-large C/C++ library. Nonetheless, there are others who use
 SWIG quite happily.
 
@@ -1170,12 +1168,11 @@ those libraries which provides a concise interface for binding C++
 classes and functions to Python. The amazing part of the Boost.Python
 approach is that it works entirely in pure C++ without introducing a
 new syntax. Many users of C++ report that Boost.Python makes it
-possible to combine the best of both worlds in a seamless fashion. I
-have not used Boost.Python because I am not a big user of C++ and
-using Boost to wrap simple C-subroutines is usually over-kill. It's
-primary purpose is to make C++ classes available in Python. So, if you
-have a set of C++ classes that need to be integrated cleanly into
-Python, consider learning about and using Boost.Python.
+possible to combine the best of both worlds in a seamless fashion. Using Boost
+to wrap simple C-subroutines is usually over-kill. Its primary purpose is to
+make C++ classes available in Python. So, if you have a set of C++ classes that
+need to be integrated cleanly into Python, consider learning about and using
+Boost.Python.
 
 
 PyFort
index 8ff45a934daa51830298a5762d5d5e631059cf10..9bd01b9639e7cd3f0d507b7ab129aafe9f83a426 100644 (file)
@@ -80,6 +80,7 @@ the module.
 
     .. code-block:: c
 
+        #define PY_SSIZE_T_CLEAN
         #include <Python.h>
         #include <math.h>
 
@@ -252,11 +253,12 @@ the primary thing that must be changed to create your own ufunc.
 
     .. code-block:: c
 
-        #include "Python.h"
-        #include "math.h"
+        #define PY_SSIZE_T_CLEAN
+        #include <Python.h>
         #include "numpy/ndarraytypes.h"
         #include "numpy/ufuncobject.h"
         #include "numpy/npy_3kcompat.h"
+        #include <math.h>
 
         /*
          * single_type_logit.c
@@ -427,11 +429,12 @@ the primary thing that must be changed to create your own ufunc.
 
     .. code-block:: c
 
-        #include "Python.h"
-        #include "math.h"
+        #define PY_SSIZE_T_CLEAN
+        #include <Python.h>
         #include "numpy/ndarraytypes.h"
         #include "numpy/ufuncobject.h"
         #include "numpy/halffloat.h"
+        #include <math.h>
 
         /*
          * multi_type_logit.c
@@ -696,11 +699,12 @@ as well as all other properties of a ufunc.
 
     .. code-block:: c
 
-        #include "Python.h"
-        #include "math.h"
+        #define PY_SSIZE_T_CLEAN
+        #include <Python.h>
         #include "numpy/ndarraytypes.h"
         #include "numpy/ufuncobject.h"
         #include "numpy/halffloat.h"
+        #include <math.h>
 
         /*
          * multi_arg_logit.c
@@ -828,11 +832,12 @@ The C file is given below.
 
     .. code-block:: c
 
-        #include "Python.h"
-        #include "math.h"
+        #define PY_SSIZE_T_CLEAN
+        #include <Python.h>
         #include "numpy/ndarraytypes.h"
         #include "numpy/ufuncobject.h"
         #include "numpy/npy_3kcompat.h"
+        #include <math.h>
 
 
         /*
index 16a2fc7a4acf753950a3edd9dcbb52bcd252c498..cdf1ad5c3adff595c714cf461beea9ecf996f99e 100644 (file)
@@ -102,13 +102,10 @@ knowledge).
 
 We distinguish both tutorials and how-tos from `Explanations`, which are
 deep dives intended to give understanding rather than immediate assistance,
-and `References`, which give complete, autoritative data on some concrete
+and `References`, which give complete, authoritative data on some concrete
 part of NumPy (like its API) but aren't obligated to paint a broader picture.
 
-For more on tutorials, see the `tutorial how-to`_.
-
-.. _`tutorial how-to`: https://github.com/numpy/numpy-tutorials/blob/master/tutorial_style.ipynb
-
+For more on tutorials, see :doc:`content/tutorial-style-guide`
 
 ******************************************************************************
 Is this page an example of a how-to?
index b47d6634eb0175f6da924d1572ca941e3a6bed4e..e5c51351e073d64a85d7de356564c87630c9f9f4 100644 (file)
@@ -21,7 +21,7 @@ details are found in :ref:`reference`.
    numpy-for-matlab-users
    building
    c-info
-   tutorials_index
+   NumPy Tutorials <https://numpy.org/numpy-tutorials/features.html>
    howtos_index
    depending_on_numpy
 
@@ -38,8 +38,6 @@ details are found in :ref:`reference`.
    ../f2py/index
    ../glossary
    ../dev/underthehood
-   ../docs/index
    ../bugs
    ../release
-   ../doc_conventions
    ../license
index f0a7f5e4c8969a28b9ab8cbc278852724451826e..31647315146dd454d6460c70b931e4c8ca54c4be 100644 (file)
@@ -143,7 +143,7 @@ Only a survey of the choices. Little detail on how each works.
  - Plusses:
 
    - part of Python standard library
-   - good for interfacing to existing sharable libraries, particularly
+   - good for interfacing to existing shareable libraries, particularly
      Windows DLLs
    - avoids API/reference counting issues
    - good numpy support: arrays have all these in their ctypes
index ed0be82a08515df2def539493d658d3149163d1c..21e23482adeb812048fd0c11c966c538aade9e6e 100644 (file)
@@ -313,11 +313,11 @@ Linear algebra equivalents
 
    * - ``a(:,find(v > 0.5))``
      - ``a[:,np.nonzero(v > 0.5)[0]]``
-     - extract the columms of ``a`` where vector v > 0.5
+     - extract the columns of ``a`` where vector v > 0.5
 
    * - ``a(:,find(v>0.5))``
      - ``a[:, v.T > 0.5]``
-     - extract the columms of ``a`` where column vector v > 0.5
+     - extract the columns of ``a`` where column vector v > 0.5
 
    * - ``a(a<0.5)=0``
      - ``a[a < 0.5]=0``
@@ -819,6 +819,6 @@ found in the `topical software page <https://scipy.org/topical-software.html>`__
 See
 `List of Python software: scripting
 <https://en.wikipedia.org/wiki/List_of_Python_software#Embedded_as_a_scripting_language>`_
-for a list of softwares that use Python as a scripting language
+for a list of software that use Python as a scripting language
 
 MATLAB® and SimuLink® are registered trademarks of The MathWorks, Inc.
index 9f3d6a040dd0700a648b27643b5295e56229d24d..a9cfeca31553c763b81cbac6354920cb2e532c2d 100644 (file)
@@ -45,10 +45,11 @@ NumPy's main object is the homogeneous multidimensional array. It is a
 table of elements (usually numbers), all of the same type, indexed by a
 tuple of non-negative integers. In NumPy dimensions are called *axes*.
 
-For example, the coordinates of a point in 3D space ``[1, 2, 1]`` has
-one axis. That axis has 3 elements in it, so we say it has a length
-of 3. In the example pictured below, the array has 2 axes. The first
-axis has a length of 2, the second axis has a length of 3.
+For example, the array for the coordinates of a point in 3D space,
+``[1, 2, 1]``, has one axis. That axis has 3 elements in it, so we say
+it has a length of 3. In the example pictured below, the array has 2 
+axes. The first axis has a length of 2, the second axis has a length of 
+3.
 
 ::
 
@@ -1482,4 +1483,4 @@ Further reading
 -  `SciPy Tutorial <https://docs.scipy.org/doc/scipy/reference/tutorial/index.html>`__
 -  `SciPy Lecture Notes <https://scipy-lectures.org>`__
 -  A `matlab, R, IDL, NumPy/SciPy dictionary <http://mathesaurus.sf.net/>`__
--  :doc:`tutorial-svd`
+-  :doc:`tutorial-svd <content/tutorial-svd>`
diff --git a/doc/source/user/theory.broadcast_1.gif b/doc/source/user/theory.broadcast_1.gif
deleted file mode 100644 (file)
index 541ec73..0000000
Binary files a/doc/source/user/theory.broadcast_1.gif and /dev/null differ
diff --git a/doc/source/user/theory.broadcast_2.gif b/doc/source/user/theory.broadcast_2.gif
deleted file mode 100644 (file)
index 163a847..0000000
Binary files a/doc/source/user/theory.broadcast_2.gif and /dev/null differ
diff --git a/doc/source/user/theory.broadcast_3.gif b/doc/source/user/theory.broadcast_3.gif
deleted file mode 100644 (file)
index 83f61f2..0000000
Binary files a/doc/source/user/theory.broadcast_3.gif and /dev/null differ
diff --git a/doc/source/user/theory.broadcast_4.gif b/doc/source/user/theory.broadcast_4.gif
deleted file mode 100644 (file)
index 9b21ff5..0000000
Binary files a/doc/source/user/theory.broadcast_4.gif and /dev/null differ
diff --git a/doc/source/user/theory.broadcast_5.png b/doc/source/user/theory.broadcast_5.png
deleted file mode 100644 (file)
index 3aa2f05..0000000
Binary files a/doc/source/user/theory.broadcast_5.png and /dev/null differ
index a82d78e6c9a84d9f78cecb98ca5ee5c6e362d7e1..a4973e4e67f41eb86c73e0dc78886207e2612c59 100644 (file)
@@ -1,7 +1,5 @@
 :orphan:
 
-.. _array-broadcasting-in-numpy:
-
 ===========================
 Array Broadcasting in Numpy
 ===========================
@@ -12,218 +10,6 @@ Array Broadcasting in Numpy
    `github repo
    <https://github.com/scipy/old-wiki/blob/gh-pages/pages/EricsBroadcastingDoc.html>`_
 
-Let's explore a more advanced concept in numpy called broadcasting. The
-term broadcasting describes how numpy treats arrays with different shapes
-during arithmetic operations. Subject to certain constraints, the smaller array
-is "broadcast" across the larger array so that they have compatible shapes.
-Broadcasting provides a means of vectorizing array operations so that looping
-occurs in C instead of Python. It does this without making needless copies of
-data and usually leads to efficient algorithm implementations. There are also
-cases where broadcasting is a bad idea because it leads to inefficient use of
-memory that slows computation. This article provides a gentle introduction to
-broadcasting with numerous examples ranging from simple to involved. It also
-provides hints on when and when not to use broadcasting.
-
-numpy operations are usually done element-by-element which requires two arrays
-to have exactly the same shape:
-
-.. code-block:: python
-    :caption: Example 1
-    :name: example-1
-
-    >>> from numpy import array
-    >>> a = array([1.0, 2.0, 3.0])
-    >>> b = array([2.0, 2.0, 2.0])
-    >>> a * b
-    array([ 2.,  4.,  6.])
-
-numpy's broadcasting rule relaxes this constraint when the arrays' shapes meet
-certain constraints. The simplest broadcasting example occurs when an array and
-a scalar value are combined in an operation:
-
-.. code-block:: python
-    :caption: Example 2
-    :name: example-2
-
-    >>> from numpy import array
-    >>> a = array([1.0,2.0,3.0])
-    >>> b = 2.0
-    >>> a * b
-    array([ 2.,  4.,  6.])
-
-The result is equivalent to the previous example where ``b`` was an array. We
-can think of the scalar ``b`` being stretched during the arithmetic operation
-into an array with the same shape as ``a``. The new elements in ``b``, as shown
-in :ref:`figure-1`, are simply copies of the original scalar. The stretching
-analogy is only conceptual. numpy is smart enough to use the original scalar
-value without actually making copies so that broadcasting operations are as
-memory and computationally efficient as possible. Because :ref:`example-2`
-moves less memory, (``b`` is a scalar, not an array) around during the
-multiplication, it is about 10% faster than :ref:`example-1` using the standard
-numpy on Windows 2000 with one million element arrays.
-
-.. figure:: theory.broadcast_1.gif
-    :alt: Vector-Scalar multiplication
-    :name: figure-1
-
-    *Figure 1*
-
-    *In the simplest example of broadcasting, the scalar ``b`` is
-    stretched to become an array of same shape as ``a`` so the shapes
-    are compatible for element-by-element multiplication.*
-
-
-The rule governing whether two arrays have compatible shapes for broadcasting
-can be expressed in a single sentence.
-
-.. admonition:: The Broadcasting Rule
-
-    **In order to broadcast, the size of the trailing axes for both arrays in
-    an operation must either be the same size or one of them must be one.**
-
-If this condition is not met, a ``ValueError('frames are not aligned')``
-exception is thrown indicating that the arrays have incompatible shapes. The
-size of the result array created by broadcast operations is the maximum size
-along each dimension from the input arrays. Note that the rule does not say
-anything about the two arrays needing to have the same number of dimensions.
-So, for example, if you have a 256 x 256 x 3 array of RGB values, and you want
-to scale each color in the image by a different value, you can multiply the
-image by a one-dimensional array with 3 values. Lining up the sizes of the
-trailing axes of these arrays according to the broadcast rule shows that they
-are compatible
-
-+-------+------------+-------+-------+---+
-|Image  | (3d array) | 256 x | 256 x | 3 |
-+-------+------------+-------+-------+---+
-|Scale  | (1d array) |       |       | 3 |
-+-------+------------+-------+-------+---+
-|Result | (3d array) | 256 x | 256 x | 3 |
-+-------+------------+-------+-------+---+
-
-In the following example, both the ``A`` and ``B`` arrays have axes with length
-one that are expanded to a larger size in a broadcast operation.
-
-+-------+------------+-----+-----+-----+---+
-|A      | (4d array) | 8 x | 1 x | 6 x | 1 |
-+-------+------------+-----+-----+-----+---+
-|B      | (3d array) |     | 7 x | 1 x | 5 |
-+-------+------------+-----+-----+-----+---+
-|Result | (4d array) | 8 x | 7 x | 6 x | 5 |
-+-------+------------+-----+-----+-----+---+
-
-Below, are several code examples and graphical representations that help make
-the broadcast rule visually obvious. :ref:`example-3` adds a one-dimensional array
-to a two-dimensional array:
-
-.. code-block:: python
-    :caption: Example 3
-    :name: example-3
-
-    >>> from numpy import array
-    >>> a = array([[ 0.0,  0.0,  0.0],
-    ...            [10.0, 10.0, 10.0],
-    ...            [20.0, 20.0, 20.0],
-    ...            [30.0, 30.0, 30.0]])
-    >>> b = array([1.0, 2.0, 3.0])
-    >>> a + b
-    array([[  1.,   2.,   3.],
-           [ 11.,  12.,  13.],
-           [ 21.,  22.,  23.],
-           [ 31.,  32.,  33.]])
-
-As shown in :ref:`figure-2`, ``b`` is added to each row of ``a``. When ``b`` is
-longer than the rows of ``a``, as in :ref:`figure-3`, an exception is raised
-because of the incompatible shapes.
-
-.. figure:: theory.broadcast_2.gif
-    :alt: Matrix-Vector
-    :name: figure-2
-
-    *Figure 2*
-
-    *A two dimensional array multiplied by a one dimensional array results in
-    broadcasting if number of 1-d array elements matches the number of 2-d
-    array columns.*
-
-.. figure:: theory.broadcast_3.gif
-    :alt: Matrix-Vector-with-error
-    :name: figure-3
-
-    *Figure 3*
-
-    *When the trailing dimensions of the arrays are unequal, broadcasting fails
-    because it is impossible to align the values in the rows of the 1st array
-    with the elements of the 2nd arrays for element-by-element addition.*
-
-Broadcasting provides a convenient way of taking the outer product (or any
-other outer operation) of two arrays. The following example shows an outer
-addition operation of two 1-d arrays that produces the same result as
-:ref:`example-3`
-
-.. code-block:: python
-    :caption: Example 4
-    :name: example-4
-
-    >>> from numpy import array, newaxis
-    >>> a = array([0.0, 10.0, 20.0, 30.0])
-    >>> b = array([1.0, 2.0, 3.0])
-    >>> a[:,newaxis] + b
-    array([[  1.,   2.,   3.],
-           [ 11.,  12.,  13.],
-           [ 21.,  22.,  23.],
-           [ 31.,  32.,  33.]])
-
-Here the newaxis index operator inserts a new axis into ``a``, making it a
-two-dimensional 4x1 array. :ref:`figure-4` illustrates the stretching of both
-arrays to produce the desired 4x3 output array.
-
-.. figure:: theory.broadcast_4.gif
-    :alt: vector-vector with newaxis
-    :name: figure-4
-
-    *Figure 4*
-
-    In some cases, broadcasting stretches both arrays to form an output array
-    larger than either of the initial arrays.*
-
-A Practical Example: Vector Quantization.
-=========================================
-
-Broadcasting comes up quite often in real world problems. A typical example
-occurs in the vector quantization (VQ) algorithm used in information theory,
-classification, and other related areas. The basic operation in VQ [#f0] finds
-the closest point in a set of points, called codes in VQ jargon, to a given
-point, called the observation. In the very simple, two-dimensional case shown
-in :ref:`figure-5`, the values in observation describe the weight and height of an
-athlete to be classified. The codes represent different classes of
-athletes. [#f1]_ Finding the closest point requires calculating the distance
-between observation and each of the codes. The shortest distance provides the
-best match. In this example, ``codes[0]`` is the closest class indicating that
-the athlete is likely a basketball player.
-
-.. figure:: theory.broadcast_5.png
-    :alt: vector quantitization example
-    :name: figure-5
-
-    *Figure 5*
-
-    *The basic operation of vector quantization calculates the distance between
-    an object to be classified, the dark square, and multiple known codes, the
-    gray circles. In this simple case, the codes represent individual classes.
-    More complex cases use multiple codes per class.*
-
-
-.. rubric:: Footnotes
-
-.. [#f0] Vector Quantization J. Makhoul, S. Roucos, and H. Gish, "Vector Quantization in Speech Coding," Proc. IEEE, vol. 73, pp. 1551-1587, Nov. 1985.
-.. [#f1]
-    In this example, weight has more impact on the distance calculation
-    than height because of the larger values. In practice, it is important to
-    normalize the height and weight, often by their standard deviation across the
-    data set, so that both have equal influence on the distance calculation.
-
 .. note::
-
-    The code to produce the figures is part of the `AstroML book
-    <http://www.astroml.org/book_figures/appendix/fig_broadcast_visual.html>`_
+    Please refer to the updated :doc:`basics.broadcasting` document.
 
diff --git a/doc/source/user/tutorial-ma.rst b/doc/source/user/tutorial-ma.rst
deleted file mode 100644 (file)
index a21c4aa..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-=======================
-Tutorial: Masked Arrays
-=======================
-
-.. currentmodule:: numpy
-
-.. testsetup::
-
-   import numpy as np
-   np.random.seed(1)
-
-Prerequisites
--------------
-
-Before reading this tutorial, you should know a bit of Python. If you
-would like to refresh your memory, take a look at the
-:doc:`Python tutorial <python:tutorial/index>`.
-
-If you want to be able to run the examples in this tutorial, you should also
-have `matplotlib <https://matplotlib.org/>`_ installed on your computer.
-
-Learner profile
----------------
-
-This tutorial is for people who have a basic understanding of NumPy and want to
-understand how masked arrays and the :mod:`numpy.ma` module can be used in
-practice.
-
-Learning Objectives
--------------------
-
-After this tutorial, you should be able to:
-
-- Understand what are masked arrays and how they can be created
-- Understand how to access and modify data for masked arrays
-- Decide when the use of masked arrays is appropriate in some of your
-  applications
-
-What are masked arrays?
------------------------
-
-Consider the following problem. You have a dataset with missing or invalid
-entries. If you're doing any kind of processing on this data, and want to
-`skip` or flag these unwanted entries without just deleting them, you may have
-to use conditionals or filter your data somehow. The :mod:`numpy.ma` module
-provides some of the same funcionality of
-:class:`NumPy ndarrays <numpy.ndarray>` with added structure to ensure
-invalid entries are not used in computation.
-
-From the :mod:`Reference Guide <numpy.ma>`:
-
-    A masked array is the combination of a standard :class:`numpy.ndarray` and
-    a **mask**. A mask is either ``nomask``, indicating that no value of the
-    associated array is invalid, or an array of booleans that determines for
-    each element of the associated array whether the value is valid or not.
-    When an element of the mask is ``False``, the corresponding element of the
-    associated array is valid and is said to be unmasked. When an element of
-    the mask is ``True``, the corresponding element of the associated array is
-    said to be masked (invalid).
-
-
-We can think of a :class:`MaskedArray <numpy.ma.MaskedArray>` as a
-combination of:
-
-- Data, as a regular :class:`numpy.ndarray` of any shape or datatype;
-- A boolean mask with the same shape as the data;
-- A ``fill_value``, a value that may be used to replace the invalid entries
-  in order to return a standard :class:`numpy.ndarray`.
-
-When can they be useful?
-------------------------
-
-There are a few situations where masked arrays can be more useful than just
-eliminating the invalid entries of an array:
-
-- When you want to preserve the values you masked for later processing, without
-  copying the array;
-- When you have to handle many arrays, each with their own mask. If the mask is
-  part of the array, you avoid bugs and the code is possibly more compact;
-- When you have different flags for missing or invalid values, and wish to
-  preserve these flags without replacing them in the original dataset, but
-  exclude them from computations;
-- If you can't avoid or eliminate missing values, but don't want to deal with
-  :class:`NaN <numpy.nan>` (Not A Number) values in your operations.
-
-Masked arrays are also a good idea since the :mod:`numpy.ma` module also
-comes with a specific implementation of most :term:`NumPy universal functions
-(ufuncs) <ufunc>`, which means that you can still apply fast vectorized
-functions and operations on masked data. The output is then a masked array.
-We'll see some examples of how this works in practice below.
-
-Using masked arrays to see COVID-19 data
-----------------------------------------
-
-From `Kaggle <https://www.kaggle.com/atilamadai/covid19>`_ it is possible to
-download a dataset with initial data about the COVID-19 outbreak in the
-beginning of 2020. We are going to look at a small subset of this data,
-contained in the file ``who_covid_19_sit_rep_time_series.csv``.
-
-.. ipython:: python
-
-    import numpy as np
-    import os
-    # The os.getcwd() function returns the current folder; you can change
-    # the filepath variable to point to the folder where you saved the .csv file
-    filepath = os.getcwd()
-    @suppress
-    filepath = os.path.join(filepath, "source", "user")
-    filename = os.path.join(filepath, "who_covid_19_sit_rep_time_series.csv")
-
-The data file contains data of different types and is organized as follows:
-
-- The first row is a header line that (mostly) describes the data in each column
-  that follow in the rows below, and beginning in the fourth column, the header
-  is the date of the observation.
-- The second through seventh row contain summary data that is of a different
-  type than that which we are going to examine, so we will need to exclude that
-  from the data with which we will work.
-- The numerical data we wish to work with begins at column 4, row 8, and extends
-  from there to the rightmost column and the lowermost row.
-
-Let's explore the data inside this file for the first 14 days of records. To
-gather data from the ``.csv`` file, we will use the :func:`numpy.genfromtxt`
-function, making sure we select only the columns with actual numbers instead of
-the first three columns which contain location data. We also skip the first 7
-rows of this file, since they contain other data we are not interested in.
-Separately, we will extract the information about dates and location for this
-data.
-
-.. ipython:: python
-
-    # Note we are using skip_header and usecols to read only portions of the
-    # data file into each variable.
-    # Read just the dates for columns 3-7 from the first row
-    dates = np.genfromtxt(filename, dtype=np.unicode_, delimiter=",",
-                          max_rows=1, usecols=range(3, 17),
-                          encoding="utf-8-sig")
-    # Read the names of the geographic locations from the first two
-    # columns, skipping the first seven rows
-    locations = np.genfromtxt(filename, dtype=np.unicode_, delimiter=",",
-                              skip_header=7, usecols=(0, 1),
-                              encoding="utf-8-sig")
-    # Read the numeric data from just the first 14 days
-    nbcases = np.genfromtxt(filename, dtype=np.int_, delimiter=",",
-                            skip_header=7, usecols=range(3, 17),
-                            encoding="utf-8-sig")
-
-Included in the :func:`numpy.genfromtxt` function call, we have selected the
-:class:`numpy.dtype` for each subset of the data (either an integer -
-:class:`numpy.int_` - or a string of characters - :class:`numpy.unicode_`). We
-have also used the ``encoding`` argument to select ``utf-8-sig`` as the encoding
-for the file (read more about encoding in the `official Python documentation
-<https://docs.python.org/3/library/codecs.html#encodings-and-unicode>`__). You
-can read more about the :func:`numpy.genfromtxt` function from
-the :func:`Reference Documentation <numpy.genfromtxt>` or from the
-:doc:`Basic IO tutorial <basics.io.genfromtxt>`.
-
-Exploring the data
-------------------
-
-First of all, we can plot the whole set of data we have and see what it looks
-like. In order to get a readable plot, we select only a few of the dates to
-show in our :func:`x-axis ticks <matplotlib.pyplot.xticks>`. Note also that in
-our plot command, we use ``nbcases.T`` (the transpose of the ``nbcases`` array)
-since this means we will plot each row of the file as a separate line. We choose
-to plot a dashed line (using the ``'--'`` line style). See the
-`matplotlib <https://matplotlib.org/>`_ documentation for more info on this.
-
-.. ipython:: python
-
-    import matplotlib.pyplot as plt
-    selected_dates = [0, 3, 11, 13]
-    plt.plot(dates, nbcases.T, '--');
-    plt.xticks(selected_dates, dates[selected_dates]);
-    @savefig plot_covid_1.png
-    plt.title("COVID-19 cumulative cases from Jan 21 to Feb 3 2020");
-
-.. note::
-
-   If you are executing the commands above in the IPython shell, it might be
-   necessary to use the command ``plt.show()`` to show the image window. Note
-   also that we use a semicolon at the end of a line to suppress its output, but
-   this is optional.
-
-The graph has a strange shape from January 24th to February 1st. It would be
-interesing to know where this data comes from. If we look at the ``locations``
-array we extracted from the ``.csv`` file, we can see that we have two columns,
-where the first would contain regions and the second would contain the name of
-the country. However, only the first few rows contain data for the the first
-column (province names in China). Following that, we only have country names. So
-it would make sense to group all the data from China into a single row. For
-this, we'll select from the ``nbcases`` array only the rows for which the
-second entry of the ``locations`` array corresponds to China. Next, we'll use
-the :func:`numpy.sum` function to sum all the selected rows (``axis=0``):
-
-.. ipython:: python
-
-    china_total = nbcases[locations[:, 1] == 'China'].sum(axis=0)
-    china_total
-
-Something's wrong with this data - we are not supposed to have negative values
-in a cumulative data set. What's going on?
-
-Missing data
-------------
-
-Looking at the data, here's what we find: there is a period with
-**missing data**:
-
-.. ipython:: python
-
-    nbcases
-
-All the ``-1`` values we are seeing come from :func:`numpy.genfromtxt`
-attempting to read missing data from the original ``.csv`` file. Obviously, we
-don't want to compute missing data as ``-1`` - we just want to skip this value
-so it doesn't interfere in our analysis. After importing the :mod:`numpy.ma`
-module, we'll create a new array, this time masking the invalid values:
-
-.. ipython:: python
-
-    from numpy import ma
-    nbcases_ma = ma.masked_values(nbcases, -1)
-
-If we look at the ``nbcases_ma`` masked array, this is what we have:
-
-.. ipython:: python
-
-    nbcases_ma
-
-We can see that this is a different kind of array. As mentioned in the
-introduction, it has three attributes (``data``, ``mask`` and ``fill_value``).
-Keep in mind that the ``mask`` attribute has a ``True`` value for elements
-corresponding to **invalid** data (represented by two dashes in the ``data``
-attribute).
-
-.. note::
-
-   Adding ``-1`` to missing data is not a problem with :func:`numpy.genfromtxt`;
-   in this particular case, substituting the missing value with ``0`` might have
-   been fine, but we'll see later that this is far from a general solution.
-   Also, it is possible to call the :func:`numpy.genfromtxt` function using the
-   ``usemask`` parameter. If ``usemask=True``, :func:`numpy.genfromtxt`
-   automatically returns a masked array.
-
-Let's try and see what the data looks like excluding the first row
-(data from the Hubei province in China) so we can look at the missing data more
-closely:
-
-.. ipython:: python
-
-    plt.plot(dates, nbcases_ma[1:].T, '--');
-    plt.xticks(selected_dates, dates[selected_dates]);
-    @savefig plot_covid_2.png
-    plt.title("COVID-19 cumulative cases from Jan 21 to Feb 3 2020");
-
-Now that our data has been masked, let's try summing up all the cases in China:
-
-.. ipython:: python
-
-    china_masked = nbcases_ma[locations[:, 1] == 'China'].sum(axis=0)
-    china_masked
-
-Note that ``china_masked`` is a masked array, so it has a different data
-structure than a regular NumPy array. Now, we can access its data directly by
-using the ``.data`` attribute:
-
-.. ipython:: python
-
-    china_total = china_masked.data
-    china_total
-
-That is better: no more negative values. However, we can still see that for some
-days, the cumulative number of cases seems to go down (from 835 to 10, for
-example), which does not agree with the definition of "cumulative data". If we
-look more closely at the data, we can see that in the period where there was
-missing data in mainland China, there was valid data for Hong Kong, Taiwan,
-Macau and "Unspecified" regions of China. Maybe we can remove those from the
-total sum of cases in China, to get a better understanding of the data.
-
-First, we'll identify the indices of locations in mainland China:
-
-.. ipython:: python
-
-   china_mask = ((locations[:, 1] == 'China') &
-                 (locations[:, 0] != 'Hong Kong') &
-                 (locations[:, 0] != 'Taiwan') &
-                 (locations[:, 0] != 'Macau') &
-                 (locations[:, 0] != 'Unspecified*'))
-
-Now, ``china_mask`` is an array of boolean values (``True`` or ``False``); we
-can check that the indices are what we wanted with the :func:`ma.nonzero` method
-for masked arrays:
-
-.. ipython:: python
-
-    china_mask.nonzero()
-
-Now we can correctly sum entries for mainland China:
-
-.. ipython:: python
-
-    china_total = nbcases_ma[china_mask].sum(axis=0)
-    china_total
-
-We can replace the data with this information and plot a new graph, focusing on
-Mainland China:
-
-.. ipython:: python
-
-    plt.plot(dates, china_total.T, '--');
-    plt.xticks(selected_dates, dates[selected_dates]);
-    @savefig plot_covid_3.png
-    plt.title("COVID-19 cumulative cases from Jan 21 to Feb 3 2020 - Mainland China");
-
-It's clear that masked arrays are the right solution here. We cannot represent
-the missing data without mischaracterizing the evolution of the curve.
-
-Fitting Data
-------------
-
-One possibility we can think of is to interpolate the missing data to estimate
-the number of cases in late January. Observe that we can select the masked
-elements using the ``.mask`` attribute:
-
-.. ipython:: python
-
-    china_total.mask
-    invalid = china_total[china_total.mask]
-    invalid
-
-We can also access the valid entries by using the logical negation for this
-mask:
-
-.. ipython:: python
-
-    valid = china_total[~china_total.mask]
-    valid
-
-Now, if we want to create a very simple approximation for this data, we should
-take into account the valid entries around the invalid ones. So first let's
-select the dates for which the data is valid. Note that we can use the mask
-from the ``china_total`` masked array to index the dates array:
-
-.. ipython:: python
-
-    dates[~china_total.mask]
-
-Finally, we can use the :func:`numpy.polyfit` and :func:`numpy.polyval`
-functions to create a cubic polynomial that fits the data as best as possible:
-
-.. ipython:: python
-
-    t = np.arange(len(china_total))
-    params = np.polyfit(t[~china_total.mask], valid, 3)
-    cubic_fit = np.polyval(params, t)
-    plt.plot(t, china_total);
-    @savefig plot_covid_4.png
-    plt.plot(t, cubic_fit, '--');
-
-This plot is not so readable since the lines seem to be over each other, so
-let's summarize in a more elaborate plot. We'll plot the real data when
-available, and show the cubic fit for unavailable data, using this fit to
-compute an estimate to the observed number of cases on January 28th 2020, 7 days
-after the beginning of the records:
-
-.. ipython:: python
-
-    plt.plot(t, china_total, label='Mainland China');
-    plt.plot(t[china_total.mask], cubic_fit[china_total.mask], '--',
-             color='orange', label='Cubic estimate');
-    plt.plot(7, np.polyval(params, 7), 'r*', label='7 days after start');
-    plt.xticks([0, 7, 13], dates[[0, 7, 13]]);
-    plt.yticks([0, np.polyval(params, 7), 10000, 17500]);
-    plt.legend();
-    @savefig plot_covid_5.png
-    plt.title("COVID-19 cumulative cases from Jan 21 to Feb 3 2020 - Mainland China\n"
-              "Cubic estimate for 7 days after start");
-
-More reading
-------------
-
-Topics not covered in this tutorial can be found in the documentation:
-
-- :func:`Hardmasks <numpy.ma.harden_mask>` vs. :func:`softmasks
-  <numpy.ma.soften_mask>`
-- :ref:`The numpy.ma module <maskedarray.generic>`
diff --git a/doc/source/user/tutorial-svd.rst b/doc/source/user/tutorial-svd.rst
deleted file mode 100644 (file)
index 7b905e5..0000000
+++ /dev/null
@@ -1,524 +0,0 @@
-================================================
-Tutorial: Linear algebra on n-dimensional arrays
-================================================
-
-.. currentmodule:: numpy
-
-.. testsetup::
-
-   import numpy as np
-   np.random.seed(1)
-
-Prerequisites
--------------
-
-Before reading this tutorial, you should know a bit of Python. If you
-would like to refresh your memory, take a look at the
-:doc:`Python tutorial <python:tutorial/index>`.
-
-If you want to be able to run the examples in this tutorial, you should also
-have `matplotlib <https://matplotlib.org/>`_ and `SciPy <https://scipy.org>`_
-installed on your computer.
-
-Learner profile
----------------
-
-This tutorial is for people who have a basic understanding of linear
-algebra and arrays in NumPy and want to understand how n-dimensional
-(:math:`n>=2`) arrays are represented and can be manipulated. In particular, if
-you don't know how to apply common functions to n-dimensional arrays (without
-using for-loops), or if you want to understand axis and shape properties for
-n-dimensional arrays, this tutorial might be of help.
-
-Learning Objectives
--------------------
-
-After this tutorial, you should be able to:
-
-- Understand the difference between one-, two- and n-dimensional arrays in
-  NumPy;
-- Understand how to apply some linear algebra operations to n-dimensional
-  arrays without using for-loops;
-- Understand axis and shape properties for n-dimensional arrays.
-
-Content
--------
-
-In this tutorial, we will use a `matrix decomposition
-<https://en.wikipedia.org/wiki/Matrix_decomposition>`_ from linear algebra, the
-Singular Value Decomposition, to generate a compressed approximation of an
-image. We'll use the ``face`` image from the `scipy.misc` module:
-
-    >>> from scipy import misc
-    >>> img = misc.face()
-
-.. note::
-
-   If you prefer, you can use your own image as you work through this tutorial.
-   In order to transform your image into a NumPy array that can be manipulated,
-   you can use the ``imread`` function from the `matplotlib.pyplot` submodule.
-   Alternatively, you can use the :func:`imageio.imread` function from the
-   ``imageio`` library. Be aware that if you use your own image, you'll likely
-   need to adapt the steps below. For more information on how images are treated
-   when converted to NumPy arrays, see :std:doc:`user_guide/numpy_images` from
-   the ``scikit-image`` documentation.
-
-Now, ``img`` is a NumPy array, as we can see when using the ``type`` function::
-
-    >>> type(img)
-    <class 'numpy.ndarray'>
-
-We can see the image using the `matplotlib.pyplot.imshow` function::
-
-    >>> import matplotlib.pyplot as plt
-    >>> plt.imshow(img)
-
-.. plot:: user/plot_face.py
-    :align: center
-    :include-source: 0
-
-.. note::
-
-   If you are executing the commands above in the IPython shell, it might be
-   necessary to use the command ``plt.show()`` to show the image window. 
-                    
-Shape, axis and array properties
---------------------------------
-
-Note that, in linear algebra, the dimension of a vector refers to the number of
-entries in an array. In NumPy, it instead defines the number of axes. For
-example, a 1D array is a vector such as ``[1, 2, 3]``, a 2D array is a matrix,
-and so forth.
-
-First, let's check for the shape of the data in our array. Since this image is
-two-dimensional (the pixels in the image form a rectangle), we might expect a
-two-dimensional array to represent it (a matrix). However, using the ``shape``
-property of this NumPy array gives us a different result::
-
-    >>> img.shape
-    (768, 1024, 3)
-
-The output is a :ref:`tuple <python:tut-tuples>` with three elements, which means
-that this is a three-dimensional array. In fact, since this is a color image, and
-we have used the ``imread`` function to read it, the data is organized in three 2D
-arrays, representing color channels (in this case, red, green and blue - RGB). You
-can see this by looking at the shape above: it indicates that we have an array of
-3 matrices, each having shape 768x1024.
-
-Furthermore, using the ``ndim`` property of this array, we can see that
-
-::
-
-    >>> img.ndim
-    3
-
-NumPy refers to each dimension as an `axis`. Because of how ``imread``
-works, the *first index in the 3rd axis* is the red pixel data for our image. We
-can access this by using the syntax
-
-::
-
-    >>> img[:, :, 0]
-    array([[121, 138, 153, ..., 119, 131, 139],
-           [ 89, 110, 130, ..., 118, 134, 146],
-           [ 73,  94, 115, ..., 117, 133, 144],
-           ...,
-           [ 87,  94, 107, ..., 120, 119, 119],
-           [ 85,  95, 112, ..., 121, 120, 120],
-           [ 85,  97, 111, ..., 120, 119, 118]], dtype=uint8)
-
-From the output above, we can see that every value in ``img[:,:,0]`` is an
-integer value between 0 and 255, representing the level of red in each
-corresponding image pixel (keep in mind that this might be different if you
-use your own image instead of `scipy.misc.face`).
-
-As expected, this is a 768x1024 matrix::
-
-    >>> img[:, :, 0].shape
-    (768, 1024)
-
-Since we are going to perform linear algebra operations on this data, it might
-be more interesting to have real numbers between 0 and 1 in each entry of the
-matrices to represent the RGB values. We can do that by setting
-
-    >>> img_array = img / 255
-
-This operation, dividing an array by a scalar, works because of NumPy's
-:ref:`broadcasting rules <array-broadcasting-in-numpy>`). (Note that in
-real-world applications, it would be better to use, for example, the
-:func:`img_as_float <skimage.img_as_float>` utility function from
-``scikit-image``).
-
-You can check that the above works by doing some tests; for example, inquiring
-about maximum and minimum values for this array::
-
-    >>> img_array.max(), img_array.min()
-    (1.0, 0.0)
-
-or checking the type of data in the array::
-
-    >>> img_array.dtype
-    dtype('float64')
-
-Note that we can assign each color channel to a separate matrix using the slice
-syntax::
-
-    >>> red_array = img_array[:, :, 0]
-    >>> green_array = img_array[:, :, 1]
-    >>> blue_array = img_array[:, :, 2]
-
-Operations on an axis
----------------------
-
-It is possible to use methods from linear algebra to approximate an existing set
-of data. Here, we will use the `SVD (Singular Value Decomposition)
-<https://en.wikipedia.org/wiki/Singular_value_decomposition>`_ to try to rebuild
-an image that uses less singular value information than the original one, while
-still retaining some of its features.
-
-.. note::
-
-    We will use NumPy's linear algebra module, `numpy.linalg`, to
-    perform the operations in this tutorial. Most of the linear algebra
-    functions in this module can also be found in `scipy.linalg`, and
-    users are encouraged to use the `scipy` module for real-world
-    applications. However, it is currently not possible to apply linear
-    algebra operations to n-dimensional arrays using the `scipy.linalg`
-    module. For more information on this, check the
-    :doc:`scipy.linalg Reference<scipy:tutorial/linalg>`.
-
-To proceed, import the linear algebra submodule from NumPy::
-
-    >>> from numpy import linalg
-
-In order to extract information from a given matrix, we can use the SVD to obtain
-3 arrays which can be multiplied to obtain the original matrix. From the theory
-of linear algebra, given a matrix :math:`A`, the following product can be
-computed:
-
-.. math::
-
-   U \Sigma V^T = A
-
-where :math:`U` and :math:`V^T` are square and :math:`\Sigma` is the same size
-as :math:`A`. :math:`\Sigma` is a diagonal matrix and contains the
-`singular values <https://en.wikipedia.org/wiki/Singular_value>`_ of :math:`A`,
-organized from largest to smallest. These values are always non-negative and can
-be used as an indicator of the "importance" of some features represented by the
-matrix :math:`A`.
-
-Let's see how this works in practice with just one matrix first. Note that
-according to `colorimetry <https://en.wikipedia.org/wiki/Grayscale#Colorimetric_(perceptual_luminance-preserving)_conversion_to_grayscale>`_,
-it is possible to obtain a fairly reasonable grayscale version of our color
-image if we apply the formula
-
-.. math::
-
-   Y = 0.2126 R + 0.7152 G + 0.0722 B
-
-where :math:`Y` is the array representing the grayscale image, and :math:`R, G`
-and :math:`B` are the red, green and blue channel arrays we had originally.
-Notice we can use the ``@`` operator (the matrix multiplication operator for
-NumPy arrays, see `numpy.matmul`) for this:
-
-::
-   
-   >>> img_gray = img_array @ [0.2126, 0.7152, 0.0722]
-
-Now, ``img_gray`` has shape
-
-::
-
-   >>> img_gray.shape
-   (768, 1024)
-
-To see if this makes sense in our image, we should use a colormap from
-``matplotlib`` corresponding to the color we wish to see in out image
-(otherwise, ``matplotlib`` will default to a colormap that does not
-correspond to the real data).
-
-In our case, we are approximating the grayscale portion of the image, so we
-will use the colormap ``gray``::
-   
-   >>> plt.imshow(img_gray, cmap="gray")
-
-.. plot:: user/plot_gray.py
-    :align: center
-    :include-source: 0
-
-Now, applying the `linalg.svd` function to this matrix, we obtain the
-following decomposition:
-::
-
-    >>> U, s, Vt = linalg.svd(img_gray)
-
-.. note::
-
-    If you are using your own image, this command might take a while to run,
-    depending on the size of your image and your hardware. Don't worry, this
-    is normal! The SVD can be a pretty intensive computation.
-   
-Let's check that this is what we expected::
-
-    >>> U.shape, s.shape, Vt.shape
-    ((768, 768), (768,), (1024, 1024))
-
-Note that ``s`` has a particular shape: it has only one dimension. This
-means that some linear algebra functions that expect 2d arrays might not work.
-For example, from the theory, one might expect ``s`` and ``Vt`` to be
-compatible for multiplication. However, this is not true as ``s`` does not
-have a second axis. Executing
-
-::
-
-    >>> s @ Vt
-    Traceback (most recent call last):
-      ...
-    ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0,
-    with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 1024 is different from
-    768)
-
-results in a ``ValueError``. This happens because having a one-dimensional
-array for ``s``, in this case, is much more economic in practice than building a
-diagonal matrix with the same data. To reconstruct the original matrix, we can
-rebuild the diagonal matrix :math:`\Sigma` with the elements of ``s`` in its
-diagonal and with the appropriate dimensions for multiplying: in our case,
-:math:`\Sigma` should be 768x1024 since ``U`` is 768x768 and ``Vt`` is
-1024x1024.
-
-::
-
-    >>> import numpy as np
-    >>> Sigma = np.zeros((768, 1024))
-    >>> for i in range(768):
-    ...     Sigma[i, i] = s[i]
-
-Now, we want to check if the reconstructed ``U @ Sigma @ Vt`` is
-close to the original ``img_gray`` matrix.
-
-Approximation
--------------
-
-The `linalg` module includes a ``norm`` function, which
-computes the norm of a vector or matrix represented in a NumPy array. For
-example, from the SVD explanation above, we would expect the norm of the
-difference between ``img_gray`` and the reconstructed SVD product to be small.
-As expected, you should see something like
-
-::
-
-    >>> linalg.norm(img_gray - U @ Sigma @ Vt)
-    1.3926466851808837e-12
-
-(The actual result of this operation might be different depending on your
-architecture and linear algebra setup. Regardless, you should see a small
-number.)
-
-We could also have used the `numpy.allclose` function to make sure the
-reconstructed product is, in fact, *close* to our original matrix (the
-difference between the two arrays is small)::
-
-    >>> np.allclose(img_gray, U @ Sigma @ Vt)
-    True
-
-To see if an approximation is reasonable, we can check the values in ``s``::
-
-    >>> plt.plot(s)
-
-.. plot:: user/plot_gray_svd.py
-    :align: center
-    :include-source: 0
-    
-In the graph, we can see that although we have 768 singular values in
-``s``, most of those (after the 150th entry or so) are pretty small. So it
-might make sense to use only the information related to the first (say, 50)
-*singular values* to build a more economical approximation to our image.
-
-The idea is to consider all but the first ``k`` singular values in
-``Sigma`` (which are the same as in ``s``) as zeros, keeping
-``U`` and ``Vt`` intact, and computing the product of these matrices
-as the approximation.
-
-For example, if we choose 
-
-::
-
-    >>> k = 10
-
-we can build the approximation by doing
-
-::
-
-    >>> approx = U @ Sigma[:, :k] @ Vt[:k, :]
-
-Note that we had to use only the first ``k`` rows of ``Vt``, since all
-other rows would be multiplied by the zeros corresponding to the singular
-values we eliminated from this approximation.
-
-::
-   
-    >>> plt.imshow(approx, cmap="gray")
-
-.. plot:: user/plot_approx.py
-    :align: center
-    :include-source: 0
-
-Now, you can go ahead and repeat this experiment with other values of `k`, and
-each of your experiments should give you a slightly better (or worse) image
-depending on the value you choose.
-
-Applying to all colors
-----------------------
-
-Now we want to do the same kind of operation, but to all three colors. Our
-first instinct might be to repeat the same operation we did above to each color
-matrix individually. However, NumPy's `broadcasting` takes care of this
-for us.
-
-If our array has more than two dimensions, then the SVD can be applied to all
-axes at once. However, the linear algebra functions in NumPy expect to see an
-array of the form ``(N, M, M)``, where the first axis represents the number
-of matrices.
-
-In our case,
-
-::
-
-    >>> img_array.shape
-    (768, 1024, 3)
-
-so we need to permutate the axis on this array to get a shape like
-``(3, 768, 1024)``. Fortunately, the `numpy.transpose` function can do that for
-us:
-
-::
-   
-   np.transpose(x, axes=(i, j, k))
-
-indicates that the axis will be reordered such that the final shape of the
-transposed array will be reordered according to the indices ``(i, j, k)``.
-
-Let's see how this goes for our array::
-
-    >>> img_array_transposed = np.transpose(img_array, (2, 0, 1))
-    >>> img_array_transposed.shape
-    (3, 768, 1024)
-
-Now we are ready to apply the SVD::
-
-    >>> U, s, Vt = linalg.svd(img_array_transposed)
-
-Finally, to obtain the full approximated image, we need to reassemble these
-matrices into the approximation. Now, note that
-
-::
-
-    >>> U.shape, s.shape, Vt.shape
-    ((3, 768, 768), (3, 768), (3, 1024, 1024))
-
-To build the final approximation matrix, we must understand how multiplication
-across different axes works.
-
-Products with n-dimensional arrays
-----------------------------------
-
-If you have worked before with only one- or two-dimensional arrays in NumPy,
-you might use `numpy.dot` and `numpy.matmul` (or the ``@`` operator)
-interchangeably. However, for n-dimensional arrays, they work in very different
-ways. For more details, check the documentation `numpy.matmul`.
-
-Now, to build our approximation, we first need to make sure that our singular
-values are ready for multiplication, so we build our ``Sigma`` matrix similarly
-to what we did before. The ``Sigma`` array must have dimensions
-``(3, 768, 1024)``. In order to add the singular values to the diagonal of
-``Sigma``, we will use the `numpy.fill_diagonal` function from NumPy, using each of
-the 3 rows in ``s`` as the diagonal for each of the 3 matrices in ``Sigma``:
-
-::
-
-    >>> Sigma = np.zeros((3, 768, 1024))
-    >>> for j in range(3):
-    ...     np.fill_diagonal(Sigma[j, :, :], s[j, :])
-
-Now, if we wish to rebuild the full SVD (with no approximation), we can do
-
-::
-
-    >>> reconstructed = U @ Sigma @ Vt
-
-Note that
-
-::
-
-    >>> reconstructed.shape
-    (3, 768, 1024)
-
-and
-
-::
-
-    >>> plt.imshow(np.transpose(reconstructed, (1, 2, 0)))
-
-.. plot:: user/plot_reconstructed.py
-    :align: center
-    :include-source: 0
-    
-should give you an image indistinguishable from the original one (although we
-may introduce floating point errors for this reconstruction). In fact, 
-you might see a warning message saying `"Clipping input data to the
-valid range for imshow with RGB data ([0..1] for floats or [0..255] for
-integers)."` This is expected from the manipulation we just did on the original
-image.
-
-Now, to do the approximation, we must choose only the first ``k`` singular
-values for each color channel. This can be done using the following syntax::
-
-    >>> approx_img = U @ Sigma[..., :k] @ Vt[..., :k, :]
-
-You can see that we have selected only the first ``k`` components of the last
-axis for ``Sigma`` (this means that we have used only the first ``k`` columns
-of each of the three matrices in the stack), and that we have selected only the
-first ``k`` components in the second-to-last axis of ``Vt`` (this means we have
-selected only the first ``k`` rows from every matrix in the stack ``Vt`` and
-all columns). If you are unfamiliar with the ellipsis syntax, it is a
-placeholder for other axes. For more details, see the documentation on
-:ref:`Indexing <basics.indexing>`.
-
-Now,
-
-::
-
-    >>> approx_img.shape
-    (3, 768, 1024)
-
-which is not the right shape for showing the image. Finally, reordering the axes 
-back to our original shape of ``(768, 1024, 3)``, we can see our approximation::
-
-    >>> plt.imshow(np.transpose(approx_img, (1, 2, 0)))
-
-.. plot:: user/plot_final.py
-    :align: center
-    :include-source: 0
-    
-Even though the image is not as sharp, using a small number of ``k`` singular
-values (compared to the original set of 768 values), we can recover many of the
-distinguishing features from this image.
-
-Final words
------------
-
-Of course, this is not the best method to *approximate* an image.
-However, there is, in fact, a result in linear algebra that says that the
-approximation we built above is the best we can get to the original matrix in
-terms of the norm of the difference. For more information, see *G. H. Golub and
-C. F. Van Loan, Matrix Computations, Baltimore, MD, Johns Hopkins University
-Press, 1985*.
-
-Further reading
----------------
-
--  :doc:`Python tutorial <python:tutorial/index>`
--  :ref:`reference`
--  :doc:`SciPy Tutorial <scipy:tutorial/index>`
--  `SciPy Lecture Notes <https://scipy-lectures.org>`__
--  `A matlab, R, IDL, NumPy/SciPy dictionary <http://mathesaurus.sf.net/>`__
diff --git a/doc/source/user/tutorials_index.rst b/doc/source/user/tutorials_index.rst
deleted file mode 100644 (file)
index 20e2c25..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-.. _tutorials:
-
-################
-NumPy Tutorials
-################
-
-These documents are intended as an introductory overview of NumPy and its 
-features. For detailed reference documentation of the functions and
-classes contained in the package, see the :ref:`API reference <reference>`.
-
-.. toctree::
-   :maxdepth: 1
-
-   tutorial-svd
-   tutorial-ma
-
index 154f91c842dfed1f0e2d139b1eb064d6b8d37ac0..e152a4ae2ee54c9dd345493504ef95a6374bb248 100644 (file)
@@ -125,7 +125,7 @@ same shape, or a scalar and an array, or even two arrays of with
 different shapes, provided that the smaller array is "expandable" to
 the shape of the larger in such a way that the resulting broadcast is
 unambiguous. For detailed "rules" of broadcasting see
-`basics.broadcasting`.
+:ref:`Broadcasting <basics.broadcasting>`.
 
 Who Else Uses NumPy?
 --------------------
diff --git a/doc/source/user/who_covid_19_sit_rep_time_series.csv b/doc/source/user/who_covid_19_sit_rep_time_series.csv
deleted file mode 100644 (file)
index 8ad5c2c..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-Province/States,Country/Region,WHO region,1/21/20,1/22/20,1/23/20,1/24/20,1/25/20,1/26/20,1/27/20,1/28/20,1/29/20,1/30/20,1/31/20,2/1/20,2/2/20,2/3/20,2/4/20,2/5/20,2/6/20,2/7/20,2/8/20,2/9/20,2/10/20,2/11/20,2/12/20,2/13/20,2/14/20,2/15/20,2/16/20,2/17/20,2/18/20,2/19/20,2/20/20,2/21/20,2/22/20,2/23/20,2/24/20,2/25/20,2/26/20,2/27/20,2/28/20,2/29/20,3/1/20,3/2/20,3/3/20
-Confirmed,Globally,,282,314,581,846,1320,2014,2798,4593,6065,7818,9826,11953,14557,17391,20630,24554,28276,31481,34886,37558,40554,43103,45171,46997,49053,50580,51857,71429,73332,75204,75748,76769,77794,78811,79331,80239,81109,82294,83652,85403,87137,88948,90870
-Confirmed,Mainland China,Western Pacific Region,278,309,571,830,1297,1985,2741,4537,5997,7736,9720,11821,14411,17238,20471,24363,28060,31211,34598,37251,40235,42708,44730,46550,48548,50054,51174,70635,72528,74280,74675,75569,76392,77042,77262,77780,78191,78630,78961,79394,79968,80174,80304
-Confirmed,Outside of China,,4,5,10,16,23,29,57,56,68,82,106,132,146,153,159,191,216,270,288,307,319,395,441,447,505,526,683,794,804,924,1073,1200,1402,1769,2069,2459,2918,3664,4691,6009,7169,8774,10566
-Suspected,Mainland China,Western Pacific Region,,,,,,,5794,6973,9239,12167,15238,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-Severe,Mainland China,Western Pacific Region,,,,,,,461,976,1239,1370,1527,1795,2110,2296,2788,3219,3859,4821,6101,6188,6484,7333,8204,,,,,,,,,,,,,,,,,,,,
-Deaths,Mainland China,Western Pacific Region,,,,,,,80,106,132,170,213,259,304,361,425,491,564,637,723,812,909,1017,1114,1260,1381,1524,1666,1772,1870,2006,2121,2239,2348,2445,2595,2666,2718,2747,2791,2838,2873,2915,2946
-Hubei ,China,Western Pacific Region,258,270,375,375,,,,,,,,7153,9074,11177,13522,16678,19665,22112,24953,27100,29631,31728,33366,34874,51968,54406,56249,58182,59989,61682,62031,62662,63454,64084,64287,64786,65187,65596,65914,66337,66907,67103,67217
-Guangdong,China,Western Pacific Region,14,17,26,32,,,,,,,,520,604,683,797,870,944,1018,1075,1120,1151,1177,1219,1241,1261,1295,1316,1322,1328,1331,1332,1333,1339,1342,1345,1347,1347,1347,1348,1349,1349,1350,1350
-Henan,China,Western Pacific Region,,1,1,1,,,,,,,,422,493,566,675,764,851,914,981,1033,1073,1105,1135,1169,1184,1212,1231,1246,1257,1262,1265,1267,1270,1271,1271,1271,1271,1272,1272,1272,1272,1272,1272
-Zhejiang,China,Western Pacific Region,,5,5,5,,,,,,,,599,661,724,829,895,954,1006,1048,1075,1104,1117,1131,1145,1155,1162,1167,1171,1172,1173,1175,1203,1205,1205,1205,1205,1205,1205,1205,1205,1205,1206,1213
-Hunan,China,Western Pacific Region,,1,1,1,,,,,,,,389,463,521,593,661,711,772,803,838,879,912,946,968,988,1001,1004,1006,1007,1008,1010,1011,1013,1016,1016,1016,1016,1017,1017,1018,1018,1018,1018
-Anhui,China,Western Pacific Region,,,,,,,,,,,,297,340,408,480,530,591,665,733,779,830,860,889,910,934,950,962,973,982,986,987,988,989,989,989,989,989,989,990,990,990,990,990
-Jiangxi,China,Western Pacific Region,,1,2,2,,,,,,,,286,333,391,476,548,600,661,698,740,771,804,844,872,900,913,925,930,933,934,934,934,934,934,934,934,934,934,935,935,935,935,935
-Shandong,China,Western Pacific Region,,1,1,1,,,,,,,,202,225,246,270,298,343,379,407,435,459,486,497,506,519,530,537,541,543,544,546,748,750,754,755,755,756,756,756,756,756,758,758
-Jiangsu,China,Western Pacific Region,,,,,,,,,,,,202,231,271,308,341,373,408,439,468,492,515,543,570,593,604,617,626,629,631,631,631,631,631,631,631,631,631,631,631,631,631,631
-Chongqing,China,Western Pacific Region,,1,5,5,,,,,,,,238,262,300,337,366,389,411,426,446,468,486,505,518,529,537,544,551,553,555,560,567,572,573,575,576,576,576,576,576,576,576,576
-Sichuan,China,Western Pacific Region,,1,2,2,,,,,,,,207,236,254,282,301,321,344,363,386,405,417,436,451,463,470,481,495,508,514,520,525,526,526,527,529,531,534,538,538,538,538,538
-Heilongjiang,China,Western Pacific Region,,,,,,,,,,,,80,95,118,155,190,227,277,282,307,331,360,378,395,418,425,445,457,464,470,476,479,479,480,480,480,480,480,480,480,480,480,480
-Beijing,China,Western Pacific Region,5,5,10,10,,,,,,,,156,183,212,228,253,274,297,315,326,337,342,352,366,372,375,380,381,387,393,395,396,399,399,399,400,400,410,410,411,413,414,414
-Shanghai,China,Western Pacific Region,1,2,9,9,,,,,,,,153,177,193,208,233,254,269,281,292,295,302,306,313,318,326,328,331,333,333,333,334,334,335,335,335,336,337,337,337,337,337,338
-Hebei,China,Western Pacific Region,,,,,,,,,,,,96,104,113,126,135,157,171,195,206,218,239,251,265,283,291,300,301,302,306,307,308,309,311,311,311,312,317,318,318,318,318,318
-Fujian,China,Western Pacific Region,,,,,,,,,,,,144,159,179,194,205,215,224,239,250,261,267,272,279,281,285,287,290,292,293,293,293,293,293,293,294,294,296,296,296,296,296,296
-Guangxi,China,Western Pacific Region,,,,,,,,,,,,100,111,127,139,150,168,172,183,195,210,215,222,222,226,235,237,238,242,244,245,246,249,249,251,252,252,252,252,252,252,252,252
-Shaanxi,China,Western Pacific Region,,,,,,,,,,,,101,116,128,142,165,173,184,195,208,213,219,225,229,230,232,236,240,240,242,245,245,245,245,245,245,245,245,245,245,245,245,245
-Yunnan,China,Western Pacific Region,,1,1,1,,,,,,,,91,99,109,117,122,128,135,138,140,141,149,154,155,162,168,169,171,172,172,172,174,174,174,174,174,174,174,174,174,174,174,174
-Hainan,China,Western Pacific Region,,,,,,,,,,,,57,63,70,79,89,100,111,123,128,136,142,145,157,157,162,162,162,163,163,168,168,168,168,168,168,168,168,168,168,168,168,168
-Guizhou,China,Western Pacific Region,,,,,,,,,,,,29,38,46,56,64,69,77,89,96,109,118,131,135,140,143,144,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146
-Tianjin,China,Western Pacific Region,,2,2,2,,,,,,,,34,40,49,63,67,70,94,81,88,91,96,106,112,119,120,122,124,125,128,130,131,133,135,135,135,135,135,136,136,136,136,136
-Shanxi,China,Western Pacific Region,,,,,,,,,,,,47,56,66,74,81,90,96,104,115,119,122,124,126,126,127,128,129,130,131,131,132,132,132,132,133,133,133,133,133,133,133,133
-Liaoning,China,Western Pacific Region,,,,,,,,,,,,60,64,70,74,81,89,94,99,105,107,108,111,116,117,119,120,121,121,121,121,121,121,121,121,121,121,121,121,121,122,122,125
-Hong Kong,China,Western Pacific Region,,,1,2,5,5,8,8,8,10,12,13,14,15,15,18,21,24,26,26,36,42,49,50,53,56,56,57,60,62,65,68,68,70,74,81,85,91,93,94,95,98,101
-Jilin,China,Western Pacific Region,,,,,,,,,,,,17,21,31,42,54,59,65,69,78,80,81,83,84,86,88,88,89,89,90,91,91,91,91,93,93,93,93,93,93,93,93,93
-Gansu,China,Western Pacific Region,,,,,,,,,,,,35,45,51,56,57,62,70,71,81,85,86,86,87,90,90,90,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91
-Xinjiang,China,Western Pacific Region,,,,,,,,,,,,18,23,24,29,32,36,39,42,45,49,55,59,63,65,70,71,73,76,76,76,76,76,75,76,76,76,76,76,76,76,76,76
-Inner Mongolia,China,Western Pacific Region,,,,,,,,,,,,23,26,33,37,42,46,49,50,54,58,58,60,61,63,68,70,72,73,75,75,75,75,75,75,75,75,75,75,75,75,75,75
-Ningxia,China,Western Pacific Region,,,,,,,,,,,,26,28,31,34,34,40,43,45,45,49,53,58,64,67,70,70,70,70,71,71,71,71,71,71,71,71,72,72,73,73,74,74
-Taiwan,China,Western Pacific Region,,1,1,1,3,3,4,7,8,8,9,10,10,10,10,11,11,16,16,17,18,18,18,18,18,18,18,20,22,23,24,26,26,23,28,31,32,32,34,39,39,40,42
-Qinghai,China,Western Pacific Region,,,,,,,,,,,,8,9,13,15,17,18,18,18,18,18,18,18,18,18,18,18,18,18,12,18,18,18,18,18,18,18,18,18,18,18,18,18
-Macau,China,Western Pacific Region,,,1,2,2,2,5,7,7,7,7,7,7,8,8,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
-Xizang,China,Western Pacific Region,,,,,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
-Unspecified*,China,Western Pacific Region,,,131,384,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-,Japan,Western Pacific Region,1,1,1,1,3,3,4,6,7,11,14,17,20,20,20,33,25,25,25,26,26,26,28,29,33,41,53,59,65,73,85,93,105,132,144,157,164,186,210,230,239,254,268
-,Republic of Korea,Western Pacific Region,1,1,1,2,2,2,4,4,4,4,11,12,15,15,16,18,23,24,24,27,27,28,28,28,28,28,29,30,31,51,104,204,346,602,763,977,1261,1766,2337,3150,3736,4212,4812
-,Thailand,South-East Asia Region,2,2,2,4,4,5,5,14,14,14,14,19,19,19,19,25,25,25,32,32,32,33,33,33,33,34,34,35,35,35,35,35,35,35,35,37,40,40,40,42,42,42,43
-,United States of America,Region of the Americas,,,1,1,2,2,5,5,5,5,6,7,8,11,11,11,12,12,12,12,12,13,13,14,15,15,15,15,15,15,15,15,35,35,35,53,53,59,59,62,62,62,64
-,Vietnam,Western Pacific Region,,,,2,2,2,2,2,2,2,5,6,7,8,9,10,10,12,13,14,14,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
-,Singapore,Western Pacific Region,,,,1,3,3,4,7,7,10,13,16,18,18,18,24,28,30,33,40,43,45,47,50,58,67,72,75,77,81,84,85,86,89,89,90,91,93,96,98,102,106,108
-,Italy,European Region,,,,,,,,,,,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,9,76,124,229,322,400,650,888,1128,1689,2036
-,Nepal,South-East Asia Region,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
-,Australia,Western Pacific Region,,,,,3,3,4,5,7,7,9,12,12,12,12,13,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,17,21,21,21,22,23,23,23,24,25,27,33
-,Malaysia,Western Pacific Region,,,,,,3,4,4,4,7,8,8,8,8,10,10,12,14,15,17,18,18,18,18,19,21,22,22,22,22,22,22,22,22,22,22,22,22,24,24,24,24,29
-,Canada,Region of the Americas,,,,,,,1,2,3,3,3,4,4,4,4,5,5,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,9,9,10,10,11,11,14,19,19,27
-,Cambodia,Western Pacific Region,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
-,France,European Region,,,,,3,3,3,3,4,5,6,6,6,6,6,6,6,6,6,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,18,38,57,100,100,191
-,Sri Lanka,South-East Asia Region,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
-,Iran,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,5,18,28,43,61,95,141,245,388,593,978,1501
-,India,South-East Asia Region,,,,,,,,,,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5
-,Germany,European Region,,,,,,,,1,4,4,5,7,8,10,12,12,12,13,14,14,14,14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,18,21,26,57,57,129,157
-,Philippines,Western Pacific Region,,,,,,,,,,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
-,Spain,European Region,,,,,,,,,,,,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,25,32,45,45,114
-,United Kingdom,European Region,,,,,,,,,,,,2,2,2,2,2,2,3,3,3,4,8,8,9,9,9,9,9,9,9,9,9,9,9,9,13,13,13,16,20,23,36,39
-,Sweden,European Region,,,,,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,7,12,13,14,15
-,Switzerland,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,6,10,18,26,30
-,Austria,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,2,4,5,10,10,18
-,Norway,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,4,6,15,19,25
-,Kuwait,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,8,12,43,43,45,45,56,56
-,Bahrain,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,26,33,33,38,40,47,49
-,United Arab Emirates,Eastern Mediterranean Region,,,,,,,,,4,4,4,4,5,5,5,5,5,5,7,7,7,8,8,8,8,8,8,9,9,9,9,9,11,13,13,13,13,13,19,19,19,21,21
-,Israel,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,2,2,2,3,5,7,7,10
-,Iraq,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,5,6,7,8,13,19,26
-,Oman,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4,4,6,6,6,6,6
-,Lebanon,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1,2,2,2,2,10,13
-,Pakistan,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,2,2,4,4,5
-,Egypt,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2
-,Croatia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,3,3,5,7,7,9
-,Greece,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,3,3,3,7,7
-,Finland,European Region,,,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,6,7
-,Algeria,African Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1,1,5
-,Brazil,Region of the Americas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,2,2,2
-,Russian,European Region,,,,,,,,,,,,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3
-,Belgium,European Region,,,,,,,,,,,,,,,,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8
-,Denmark,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,2,3,4,5
-,Estonia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1,1
-,Georgia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,2,3,3,3
-,North Macedonia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1,1
-,Romania,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,3,3,3,3
-,Afghanistan,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1,1,1,1
-,New Zealand,Western Pacific Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,2
-,Belarus,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1
-,Lithuania,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1
-,Netherlands,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,2,7,13,18
-,Nigeria,African Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,1,1
-,Mexico,Region of the Americas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,2,5,5
-,San Marino,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1,8
-,Azerbaijan,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,3,3
-,Ireland,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1
-,Monaco,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1
-,Qatar,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,3,7
-,Ecuador,Region of the Americas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,6
-,Czechia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,3
-,Iceland,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,9
-,Armenia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1
-,Luxembourg,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1
-,Indonesia,South-East Asia Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,2
-,Dominican Republic,Region of the Americas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1
-,Portugal,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2
-,Andorra,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
-,Latvia,European Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
-,Jordan,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
-,Morocco,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
-,Saudi Arabia,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
-,Tunisia,Eastern Mediterranean Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
-,Senegal,African Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
-Case on an international conveyance,Other,Other,,,,,,,,,,,,,,,,,20,61,64,64,70,135,175,174,218,218,355,454,454,542,621,634,634,634,695,691,691,705,705,705,706,706,706
\ No newline at end of file
index d628b3f95e5d873a1c7121825bd844778220387e..9257d3cb0f4a6b38ccc9314f5fbcce913d0b9d48 100644 (file)
@@ -18,7 +18,7 @@ Some benchmarks show that this results in a significant slow-down
 
 The approach is therefore, to loop over the largest-dimension (just like
 the NO_BUFFER) portion of the code.  All arrays will either have N or
-1 in this last dimension (or their would be a mis-match error). The
+1 in this last dimension (or their would be a mismatch error). The
 buffer size is B.
 
 If N <= B (and only if needed), we copy the entire last-dimension into
index 3403668549b571dcaa4ece54cad6ff42f3e78d8c..c849efb2d7494d066297df264ba1ffad0885360b 100644 (file)
@@ -1,7 +1,9 @@
-sphinx==4.0.1
+sphinx==4.2.0
 numpydoc==1.1.0
 ipython
 scipy
 matplotlib
 pandas
-pydata-sphinx-theme==0.5.2
+pydata-sphinx-theme
+breathe
+sphinx-panels
index 22ce617af4b23adf2dd881782232ac635bf1fdb1..58305e68171c815dda5cbc68f4588a5de4557909 100644 (file)
@@ -12,22 +12,23 @@ dependencies:
   - compilers
   - openblas
   - nomkl
+  - setuptools=59.2.0
   # For testing
   - pytest
   - pytest-cov
   - pytest-xdist
   - hypothesis
-  # For type annotations 
-  - mypy=0.812
-  - typing_extensions
+  # For type annotations
+  - mypy=0.930
   # For building docs
-  - sphinx=4.0.1
+  - sphinx=4.1.1
   - numpydoc=1.1.0
   - ipython
   - scipy
   - pandas
   - matplotlib
-  - pydata-sphinx-theme=0.5.2
+  - pydata-sphinx-theme
+  - breathe
   # For linting
   - pycodestyle=2.7.0
   - gitpython
index 51a769ee0aa429247866f6c0a4857383204536ae..6ed26c5c024b4a11e7f8b3132c7ff2198f8053c3 100644 (file)
@@ -1,2 +1,2 @@
-pycodestyle==2.7.0
+pycodestyle==2.8.0
 GitPython==3.1.13
\ No newline at end of file
index baff5e1417e653d87a3857cc462e0f2492610ef6..e8d1820a1406bd76a0d40218577fb98da1963cdf 100644 (file)
@@ -110,7 +110,8 @@ import sys
 import warnings
 
 from ._globals import (
-    ModuleDeprecationWarning, VisibleDeprecationWarning, _NoValue
+    ModuleDeprecationWarning, VisibleDeprecationWarning,
+    _NoValue, _CopyMode
 )
 
 # We first need to detect if we're being called as part of the numpy setup
@@ -134,13 +135,6 @@ else:
     __all__ = ['ModuleDeprecationWarning',
                'VisibleDeprecationWarning']
 
-    # get the version using versioneer
-    from ._version import get_versions
-    vinfo = get_versions()
-    __version__ = vinfo.get("closest-tag", vinfo["version"])
-    __git_version__ = vinfo.get("full-revisionid")
-    del get_versions, vinfo
-
     # mapping of {name: (value, deprecation_msg)}
     __deprecated_attrs__ = {}
 
@@ -195,12 +189,19 @@ else:
         n: (getattr(_builtins, n), _msg.format(n=n, extended_msg=extended_msg))
         for n, extended_msg in _type_info
     })
+
     # Numpy 1.20.0, 2020-10-19
     __deprecated_attrs__["typeDict"] = (
         core.numerictypes.typeDict,
         "`np.typeDict` is a deprecated alias for `np.sctypeDict`."
     )
 
+    # NumPy 1.22, 2021-10-20
+    __deprecated_attrs__["MachAr"] = (
+        core._machar.MachAr,
+        "`np.MachAr` is deprecated (NumPy 1.22)."
+    )
+
     _msg = (
         "`np.{n}` is a deprecated alias for `np.compat.{n}`. "
         "To silence this warning, use `np.compat.{n}` by itself. "
@@ -233,6 +234,10 @@ else:
     __all__.extend(lib.__all__)
     __all__.extend(['linalg', 'fft', 'random', 'ctypeslib', 'ma'])
 
+    # Remove one of the two occurrences of `issubdtype`, which is exposed as
+    # both `numpy.core.issubdtype` and `numpy.lib.issubdtype`.
+    __all__.remove('issubdtype')
+
     # These are exported by np.core, but are replaced by the builtins below
     # remove them to ensure that we don't end up with `np.long == np.int_`,
     # which would be a breaking change.
@@ -270,70 +275,54 @@ else:
     oldnumeric = 'removed'
     numarray = 'removed'
 
-    if sys.version_info[:2] >= (3, 7):
-        # module level getattr is only supported in 3.7 onwards
-        # https://www.python.org/dev/peps/pep-0562/
-        def __getattr__(attr):
-            # Warn for expired attributes, and return a dummy function
-            # that always raises an exception.
-            try:
-                msg = __expired_functions__[attr]
-            except KeyError:
-                pass
-            else:
-                warnings.warn(msg, DeprecationWarning, stacklevel=2)
-
-                def _expired(*args, **kwds):
-                    raise RuntimeError(msg)
-
-                return _expired
-
-            # Emit warnings for deprecated attributes
-            try:
-                val, msg = __deprecated_attrs__[attr]
-            except KeyError:
-                pass
-            else:
-                warnings.warn(msg, DeprecationWarning, stacklevel=2)
-                return val
-
-            # Importing Tester requires importing all of UnitTest which is not a
-            # cheap import Since it is mainly used in test suits, we lazy import it
-            # here to save on the order of 10 ms of import time for most users
-            #
-            # The previous way Tester was imported also had a side effect of adding
-            # the full `numpy.testing` namespace
-            if attr == 'testing':
-                import numpy.testing as testing
-                return testing
-            elif attr == 'Tester':
-                from .testing import Tester
-                return Tester
-
-            raise AttributeError("module {!r} has no attribute "
-                                 "{!r}".format(__name__, attr))
-
-        def __dir__():
-            return list(globals().keys() | {'Tester', 'testing'})
+    def __getattr__(attr):
+        # Warn for expired attributes, and return a dummy function
+        # that always raises an exception.
+        try:
+            msg = __expired_functions__[attr]
+        except KeyError:
+            pass
+        else:
+            warnings.warn(msg, DeprecationWarning, stacklevel=2)
 
-    else:
-        # We don't actually use this ourselves anymore, but I'm not 100% sure that
-        # no-one else in the world is using it (though I hope not)
-        from .testing import Tester
+            def _expired(*args, **kwds):
+                raise RuntimeError(msg)
 
-        # We weren't able to emit a warning about these, so keep them around
-        globals().update({
-            k: v
-            for k, (v, msg) in __deprecated_attrs__.items()
-        })
+            return _expired
 
+        # Emit warnings for deprecated attributes
+        try:
+            val, msg = __deprecated_attrs__[attr]
+        except KeyError:
+            pass
+        else:
+            warnings.warn(msg, DeprecationWarning, stacklevel=2)
+            return val
+
+        # Importing Tester requires importing all of UnitTest which is not a
+        # cheap import Since it is mainly used in test suits, we lazy import it
+        # here to save on the order of 10 ms of import time for most users
+        #
+        # The previous way Tester was imported also had a side effect of adding
+        # the full `numpy.testing` namespace
+        if attr == 'testing':
+            import numpy.testing as testing
+            return testing
+        elif attr == 'Tester':
+            from .testing import Tester
+            return Tester
+
+        raise AttributeError("module {!r} has no attribute "
+                             "{!r}".format(__name__, attr))
+
+    def __dir__():
+        return list(globals().keys() | {'Tester', 'testing'})
 
     # Pytest testing
     from numpy._pytesttester import PytestTester
     test = PytestTester(__name__)
     del PytestTester
 
-
     def _sanity_check():
         """
         Quick sanity checks for common bugs caused by environment.
@@ -383,10 +372,10 @@ else:
                 error_message = "{}: {}".format(w[-1].category.__name__, str(w[-1].message))
                 msg = (
                     "Polyfit sanity test emitted a warning, most likely due "
-                    "to using a buggy Accelerate backend. If you compiled "
-                    "yourself, more information is available at "
-                    "https://numpy.org/doc/stable/user/building.html#accelerated-blas-lapack-libraries "
-                    "Otherwise report this to the vendor "
+                    "to using a buggy Accelerate backend."
+                    "\nIf you compiled yourself, more information is available at:"
+                    "\nhttps://numpy.org/doc/stable/user/building.html#accelerated-blas-lapack-libraries"
+                    "\nOtherwise report this to the vendor "
                     "that provided NumPy.\n{}\n".format(error_message))
                 raise RuntimeError(msg)
     del _mac_os_check
@@ -424,6 +413,6 @@ else:
     # it is tidier organized.
     core.multiarray._multiarray_umath._reload_guard()
 
-from ._version import get_versions
-__version__ = get_versions()['version']
-del get_versions
+
+# get the version using versioneer
+from .version import __version__, git_revision as __git_version__
index b97ea5316185e3abb3f803da80b80055d8b26390..eb1e81c6ac66323d1ce636c089fc89a1ca5a21d8 100644 (file)
@@ -5,18 +5,24 @@ import mmap
 import ctypes as ct
 import array as _array
 import datetime as dt
+import enum
 from abc import abstractmethod
-from types import TracebackType
+from types import TracebackType, MappingProxyType
 from contextlib import ContextDecorator
 
+if sys.version_info >= (3, 9):
+    from types import GenericAlias
+
+from numpy._pytesttester import PytestTester
 from numpy.core._internal import _ctypes
+
 from numpy.typing import (
     # Arrays
     ArrayLike,
     NDArray,
     _SupportsArray,
     _NestedSequence,
-    _RecursiveSequence,
+    _FiniteNestedSequence,
     _SupportsArray,
     _ArrayLikeBool_co,
     _ArrayLikeUInt_co,
@@ -27,6 +33,8 @@ from numpy.typing import (
     _ArrayLikeTD64_co,
     _ArrayLikeDT64_co,
     _ArrayLikeObject_co,
+    _ArrayLikeStr_co,
+    _ArrayLikeBytes_co,
 
     # DTypes
     DTypeLike,
@@ -160,6 +168,7 @@ from numpy.typing._extended_precision import (
 )
 
 from typing import (
+    Literal as L,
     Any,
     ByteString,
     Callable,
@@ -185,16 +194,16 @@ from typing import (
     Type,
     TypeVar,
     Union,
+    Protocol,
+    SupportsIndex,
+    Final,
+    final,
+    ClassVar,
+    Set,
 )
 
-if sys.version_info >= (3, 8):
-    from typing import Literal as L, Protocol, SupportsIndex, Final
-else:
-    from typing_extensions import Literal as L, Protocol, SupportsIndex, Final
-
 # Ensures that the stubs are picked up
 from numpy import (
-    char as char,
     ctypeslib as ctypeslib,
     fft as fft,
     lib as lib,
@@ -203,11 +212,14 @@ from numpy import (
     matrixlib as matrixlib,
     polynomial as polynomial,
     random as random,
-    rec as rec,
     testing as testing,
     version as version,
 )
 
+from numpy.core import defchararray, records
+char = defchararray
+rec = records
+
 from numpy.core.function_base import (
     linspace as linspace,
     logspace as logspace,
@@ -256,10 +268,6 @@ from numpy.core.fromnumeric import (
 )
 
 from numpy.core._asarray import (
-    asarray as asarray,
-    asanyarray as asanyarray,
-    ascontiguousarray as ascontiguousarray,
-    asfortranarray as asfortranarray,
     require as require,
 )
 
@@ -275,7 +283,6 @@ from numpy.core._ufunc_config import (
     getbufsize as getbufsize,
     seterrcall as seterrcall,
     geterrcall as geterrcall,
-    _SupportsWrite,
     _ErrKind,
     _ErrFunc,
     _ErrDictOptional,
@@ -298,11 +305,63 @@ from numpy.core.einsumfunc import (
     einsum_path as einsum_path,
 )
 
+from numpy.core.multiarray import (
+    ALLOW_THREADS as ALLOW_THREADS,
+    BUFSIZE as BUFSIZE,
+    CLIP as CLIP,
+    MAXDIMS as MAXDIMS,
+    MAY_SHARE_BOUNDS as MAY_SHARE_BOUNDS,
+    MAY_SHARE_EXACT as MAY_SHARE_EXACT,
+    RAISE as RAISE,
+    WRAP as WRAP,
+    tracemalloc_domain as tracemalloc_domain,
+    array as array,
+    empty_like as empty_like,
+    empty as empty,
+    zeros as zeros,
+    concatenate as concatenate,
+    inner as inner,
+    where as where,
+    lexsort as lexsort,
+    can_cast as can_cast,
+    min_scalar_type as min_scalar_type,
+    result_type as result_type,
+    dot as dot,
+    vdot as vdot,
+    bincount as bincount,
+    copyto as copyto,
+    putmask as putmask,
+    packbits as packbits,
+    unpackbits as unpackbits,
+    shares_memory as shares_memory,
+    may_share_memory as may_share_memory,
+    asarray as asarray,
+    asanyarray as asanyarray,
+    ascontiguousarray as ascontiguousarray,
+    asfortranarray as asfortranarray,
+    arange as arange,
+    busday_count as busday_count,
+    busday_offset as busday_offset,
+    compare_chararrays as compare_chararrays,
+    datetime_as_string as datetime_as_string,
+    datetime_data as datetime_data,
+    frombuffer as frombuffer,
+    fromfile as fromfile,
+    fromiter as fromiter,
+    is_busday as is_busday,
+    promote_types as promote_types,
+    seterrobj as seterrobj,
+    geterrobj as geterrobj,
+    fromstring as fromstring,
+    frompyfunc as frompyfunc,
+    nested_iters as nested_iters,
+    flagsobj,
+)
+
 from numpy.core.numeric import (
     zeros_like as zeros_like,
     ones as ones,
     ones_like as ones_like,
-    empty_like as empty_like,
     full as full,
     full_like as full_like,
     count_nonzero as count_nonzero,
@@ -421,6 +480,12 @@ from numpy.lib.function_base import (
     quantile as quantile,
 )
 
+from numpy.lib.histograms import (
+    histogram_bin_edges as histogram_bin_edges,
+    histogram as histogram,
+    histogramdd as histogramdd,
+)
+
 from numpy.lib.index_tricks import (
     ravel_multi_index as ravel_multi_index,
     unravel_index as unravel_index,
@@ -460,7 +525,6 @@ from numpy.lib.npyio import (
     recfromtxt as recfromtxt,
     recfromcsv as recfromcsv,
     load as load,
-    loads as loads,
     save as save,
     savez as savez,
     savez_compressed as savez_compressed,
@@ -561,372 +625,65 @@ from numpy.lib.utils import (
     safe_eval as safe_eval,
 )
 
+from numpy.matrixlib import (
+    asmatrix as asmatrix,
+    mat as mat,
+    bmat as bmat,
+)
+
+_AnyStr_contra = TypeVar("_AnyStr_contra", str, bytes, contravariant=True)
+
+# Protocol for representing file-like-objects accepted
+# by `ndarray.tofile` and `fromfile`
+class _IOProtocol(Protocol):
+    def flush(self) -> object: ...
+    def fileno(self) -> int: ...
+    def tell(self) -> SupportsIndex: ...
+    def seek(self, offset: int, whence: int, /) -> object: ...
+
+# NOTE: `seek`, `write` and `flush` are technically only required
+# for `readwrite`/`write` modes
+class _MemMapIOProtocol(Protocol):
+    def flush(self) -> object: ...
+    def fileno(self) -> SupportsIndex: ...
+    def tell(self) -> int: ...
+    def seek(self, offset: int, whence: int, /) -> object: ...
+    def write(self, s: bytes, /) -> object: ...
+    @property
+    def read(self) -> object: ...
+
+class _SupportsWrite(Protocol[_AnyStr_contra]):
+    def write(self, s: _AnyStr_contra, /) -> object: ...
+
 __all__: List[str]
 __path__: List[str]
 __version__: str
 __git_version__: str
+test: PytestTester
 
 # TODO: Move placeholders to their respective module once
 # their annotations are properly implemented
 #
 # Placeholders for classes
-# TODO: Remove `__getattr__` once the classes are stubbed out
-class MachAr:
-    def __init__(
-        self,
-        float_conv: Any = ...,
-        int_conv: Any = ...,
-        float_to_float: Any = ...,
-        float_to_str: Any = ...,
-        title: Any = ...,
-    ) -> None: ...
-    def __getattr__(self, key: str) -> Any: ...
-
-class busdaycalendar:
-    def __new__(cls, weekmask: Any = ..., holidays: Any = ...) -> Any: ...
-    def __getattr__(self, key: str) -> Any: ...
-
-class chararray(ndarray[_ShapeType, _DType_co]):
-    def __new__(
-        subtype,
-        shape: Any,
-        itemsize: Any = ...,
-        unicode: Any = ...,
-        buffer: Any = ...,
-        offset: Any = ...,
-        strides: Any = ...,
-        order: Any = ...,
-    ) -> Any: ...
-    def __array_finalize__(self, obj): ...
-    def argsort(self, axis=..., kind=..., order=...): ...
-    def capitalize(self): ...
-    def center(self, width, fillchar=...): ...
-    def count(self, sub, start=..., end=...): ...
-    def decode(self, encoding=..., errors=...): ...
-    def encode(self, encoding=..., errors=...): ...
-    def endswith(self, suffix, start=..., end=...): ...
-    def expandtabs(self, tabsize=...): ...
-    def find(self, sub, start=..., end=...): ...
-    def index(self, sub, start=..., end=...): ...
-    def isalnum(self): ...
-    def isalpha(self): ...
-    def isdigit(self): ...
-    def islower(self): ...
-    def isspace(self): ...
-    def istitle(self): ...
-    def isupper(self): ...
-    def join(self, seq): ...
-    def ljust(self, width, fillchar=...): ...
-    def lower(self): ...
-    def lstrip(self, chars=...): ...
-    def partition(self, sep): ...
-    def replace(self, old, new, count=...): ...
-    def rfind(self, sub, start=..., end=...): ...
-    def rindex(self, sub, start=..., end=...): ...
-    def rjust(self, width, fillchar=...): ...
-    def rpartition(self, sep): ...
-    def rsplit(self, sep=..., maxsplit=...): ...
-    def rstrip(self, chars=...): ...
-    def split(self, sep=..., maxsplit=...): ...
-    def splitlines(self, keepends=...): ...
-    def startswith(self, prefix, start=..., end=...): ...
-    def strip(self, chars=...): ...
-    def swapcase(self): ...
-    def title(self): ...
-    def translate(self, table, deletechars=...): ...
-    def upper(self): ...
-    def zfill(self, width): ...
-    def isnumeric(self): ...
-    def isdecimal(self): ...
-
-class finfo:
-    def __new__(cls, dtype: Any) -> Any: ...
-    def __getattr__(self, key: str) -> Any: ...
-
-class format_parser:
-    def __init__(
-        self,
-        formats: Any,
-        names: Any,
-        titles: Any,
-        aligned: Any = ...,
-        byteorder: Any = ...,
-    ) -> None: ...
-
-class iinfo:
-    def __init__(self, int_type: Any) -> None: ...
-    def __getattr__(self, key: str) -> Any: ...
-
-class matrix(ndarray[_ShapeType, _DType_co]):
-    def __new__(
-        subtype,
-        data: Any,
-        dtype: Any = ...,
-        copy: Any = ...,
-    ) -> Any: ...
-    def __array_finalize__(self, obj): ...
-    def __getitem__(self, index): ...
-    def __mul__(self, other): ...
-    def __rmul__(self, other): ...
-    def __imul__(self, other): ...
-    def __pow__(self, other): ...
-    def __ipow__(self, other): ...
-    def __rpow__(self, other): ...
-    def tolist(self): ...
-    def sum(self, axis=..., dtype=..., out=...): ...
-    def squeeze(self, axis=...): ...
-    def flatten(self, order=...): ...
-    def mean(self, axis=..., dtype=..., out=...): ...
-    def std(self, axis=..., dtype=..., out=..., ddof=...): ...
-    def var(self, axis=..., dtype=..., out=..., ddof=...): ...
-    def prod(self, axis=..., dtype=..., out=...): ...
-    def any(self, axis=..., out=...): ...
-    def all(self, axis=..., out=...): ...
-    def max(self, axis=..., out=...): ...
-    def argmax(self, axis=..., out=...): ...
-    def min(self, axis=..., out=...): ...
-    def argmin(self, axis=..., out=...): ...
-    def ptp(self, axis=..., out=...): ...
-    def ravel(self, order=...): ...
-    @property
-    def T(self): ...
-    @property
-    def I(self): ...
-    @property
-    def A(self): ...
-    @property
-    def A1(self): ...
-    @property
-    def H(self): ...
-    def getT(self): ...
-    def getA(self): ...
-    def getA1(self): ...
-    def getH(self): ...
-    def getI(self): ...
-
-class memmap(ndarray[_ShapeType, _DType_co]):
-    def __new__(
-        subtype,
-        filename: Any,
-        dtype: Any = ...,
-        mode: Any = ...,
-        offset: Any = ...,
-        shape: Any = ...,
-        order: Any = ...,
-    ) -> Any: ...
-    def __getattr__(self, key: str) -> Any: ...
-
-class nditer:
-    def __new__(
-        cls,
-        op: Any,
-        flags: Any = ...,
-        op_flags: Any = ...,
-        op_dtypes: Any = ...,
-        order: Any = ...,
-        casting: Any = ...,
-        op_axes: Any = ...,
-        itershape: Any = ...,
-        buffersize: Any = ...,
-    ) -> Any: ...
-    def __getattr__(self, key: str) -> Any: ...
-    def __enter__(self) -> nditer: ...
-    def __exit__(
-        self,
-        exc_type: None | Type[BaseException],
-        exc_value: None | BaseException,
-        traceback: None | TracebackType,
-    ) -> None: ...
-    def __iter__(self) -> Iterator[Any]: ...
-    def __next__(self) -> Any: ...
-    def __len__(self) -> int: ...
-    def __copy__(self) -> nditer: ...
-    def __getitem__(self, index: SupportsIndex | slice) -> Any: ...
-    def __setitem__(self, index: SupportsIndex | slice, value: Any) -> None: ...
-    def __delitem__(self, key: SupportsIndex | slice) -> None: ...
-
-
-class poly1d:
-    def __init__(
-        self,
-        c_or_r: Any,
-        r: Any = ...,
-        variable: Any = ...,
-    ) -> None: ...
-    def __call__(self, val: Any) -> Any: ...
-    __hash__: Any
-    @property
-    def coeffs(self): ...
-    @coeffs.setter
-    def coeffs(self, value): ...
-    @property
-    def c(self): ...
-    @c.setter
-    def c(self, value): ...
-    @property
-    def coef(self): ...
-    @coef.setter
-    def coef(self, value): ...
-    @property
-    def coefficients(self): ...
-    @coefficients.setter
-    def coefficients(self, value): ...
-    @property
-    def variable(self): ...
-    @property
-    def order(self): ...
-    @property
-    def o(self): ...
-    @property
-    def roots(self): ...
-    @property
-    def r(self): ...
-    def __array__(self, t=...): ...
-    def __len__(self): ...
-    def __neg__(self): ...
-    def __pos__(self): ...
-    def __mul__(self, other): ...
-    def __rmul__(self, other): ...
-    def __add__(self, other): ...
-    def __radd__(self, other): ...
-    def __pow__(self, val): ...
-    def __sub__(self, other): ...
-    def __rsub__(self, other): ...
-    def __div__(self, other): ...
-    def __truediv__(self, other): ...
-    def __rdiv__(self, other): ...
-    def __rtruediv__(self, other): ...
-    def __eq__(self, other): ...
-    def __ne__(self, other): ...
-    def __getitem__(self, val): ...
-    def __setitem__(self, key, val): ...
-    def __iter__(self): ...
-    def integ(self, m=..., k=...): ...
-    def deriv(self, m=...): ...
 
-class recarray(ndarray[_ShapeType, _DType_co]):
-    def __new__(
-        subtype,
-        shape: Any,
-        dtype: Any = ...,
-        buf: Any = ...,
-        offset: Any = ...,
-        strides: Any = ...,
-        formats: Any = ...,
-        names: Any = ...,
-        titles: Any = ...,
-        byteorder: Any = ...,
-        aligned: Any = ...,
-        order: Any = ...,
-    ) -> Any: ...
-    def __array_finalize__(self, obj): ...
-    def __getattribute__(self, attr): ...
-    def __setattr__(self, attr, val): ...
-    def __getitem__(self, indx): ...
-    def field(self, attr, val=...): ...
+# Some of these are aliases; others are wrappers with an identical signature
+round = around
+round_ = around
+max = amax
+min = amin
+product = prod
+cumproduct = cumprod
+sometrue = any
+alltrue = all
 
-class record(void):
-    def __getattribute__(self, attr): ...
-    def __setattr__(self, attr, val): ...
-    def __getitem__(self, indx): ...
-    def pprint(self): ...
-
-class vectorize:
-    pyfunc: Any
-    cache: Any
-    signature: Any
-    otypes: Any
-    excluded: Any
-    __doc__: Any
-    def __init__(
-        self,
-        pyfunc,
-        otypes: Any = ...,
-        doc: Any = ...,
-        excluded: Any = ...,
-        cache: Any = ...,
-        signature: Any = ...,
-    ) -> None: ...
-    def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
-
-# Placeholders for Python-based functions
-def asmatrix(data, dtype=...): ...
-def asscalar(a): ...
-def cumproduct(*args, **kwargs): ...
-def histogram(a, bins=..., range=..., normed=..., weights=..., density=...): ...
-def histogram_bin_edges(a, bins=..., range=..., weights=...): ...
-def histogramdd(sample, bins=..., range=..., normed=..., weights=..., density=...): ...
-def mat(data, dtype=...): ...
-def max(a, axis=..., out=..., keepdims=..., initial=..., where=...): ...
-def min(a, axis=..., out=..., keepdims=..., initial=..., where=...): ...
-def product(*args, **kwargs): ...
-def round(a, decimals=..., out=...): ...
-def round_(a, decimals=..., out=...): ...
-def show_config(): ...
-
-# Placeholders for C-based functions
-# TODO: Sort out which parameters are positional-only
-@overload
-def arange(stop, dtype=..., *, like=...): ...
-@overload
-def arange(start, stop, step=..., dtype=..., *, like=...): ...
-def busday_count(
-    begindates,
-    enddates,
-    weekmask=...,
-    holidays=...,
-    busdaycal=...,
-    out=...,
-): ...
-def busday_offset(
-    dates,
-    offsets,
-    roll=...,
-    weekmask=...,
-    holidays=...,
-    busdaycal=...,
-    out=...,
-): ...
-def can_cast(from_, to, casting=...): ...
-def compare_chararrays(a, b, cmp_op, rstrip): ...
-def concatenate(__a, axis=..., out=..., dtype=..., casting=...): ...
-def copyto(dst, src, casting=..., where=...): ...
-def datetime_as_string(arr, unit=..., timezone=..., casting=...): ...
-def datetime_data(__dtype): ...
-def dot(a, b, out=...): ...
-def frombuffer(buffer, dtype=..., count=..., offset=..., *, like=...): ...
-def fromfile(
-    file, dtype=..., count=..., sep=..., offset=..., *, like=...
-): ...
-def fromiter(iter, dtype, count=..., *, like=...): ...
-def frompyfunc(func, nin, nout, * identity): ...
-def fromstring(string, dtype=..., count=..., sep=..., *, like=...): ...
-def geterrobj(): ...
-def inner(a, b): ...
-def is_busday(
-    dates, weekmask=..., holidays=..., busdaycal=..., out=...
-): ...
-def lexsort(keys, axis=...): ...
-def may_share_memory(a, b, max_work=...): ...
-def min_scalar_type(a): ...
-def nested_iters(*args, **kwargs): ...  # TODO: Sort out parameters
-def promote_types(type1, type2): ...
-def putmask(a, mask, values): ...
-def result_type(*arrays_and_dtypes): ...
-def seterrobj(errobj): ...
-def shares_memory(a, b, max_work=...): ...
-def vdot(a, b): ...
-@overload
-def where(__condition): ...
-@overload
-def where(__condition, __x, __y): ...
+def show_config() -> None: ...
 
 _NdArraySubClass = TypeVar("_NdArraySubClass", bound=ndarray)
 _DTypeScalar_co = TypeVar("_DTypeScalar_co", covariant=True, bound=generic)
 _ByteOrder = L["S", "<", ">", "=", "|", "L", "B", "N", "I"]
 
 class dtype(Generic[_DTypeScalar_co]):
-    names: Optional[Tuple[builtins.str, ...]]
+    names: None | Tuple[builtins.str, ...]
     # Overload for subclass of generic
     @overload
     def __new__(
@@ -949,7 +706,7 @@ class dtype(Generic[_DTypeScalar_co]):
     @overload
     def __new__(cls, dtype: Type[int], align: bool = ..., copy: bool = ...) -> dtype[int_]: ...
     @overload
-    def __new__(cls, dtype: Optional[Type[float]], align: bool = ..., copy: bool = ...) -> dtype[float_]: ...
+    def __new__(cls, dtype: None | Type[float], align: bool = ..., copy: bool = ...) -> dtype[float_]: ...
     @overload
     def __new__(cls, dtype: Type[complex], align: bool = ..., copy: bool = ...) -> dtype[complex_]: ...
     @overload
@@ -1088,41 +845,55 @@ class dtype(Generic[_DTypeScalar_co]):
         copy: bool = ...,
     ) -> dtype[object_]: ...
 
+    if sys.version_info >= (3, 9):
+        def __class_getitem__(self, item: Any) -> GenericAlias: ...
+
     @overload
     def __getitem__(self: dtype[void], key: List[builtins.str]) -> dtype[void]: ...
     @overload
-    def __getitem__(self: dtype[void], key: Union[builtins.str, int]) -> dtype[Any]: ...
+    def __getitem__(self: dtype[void], key: builtins.str | SupportsIndex) -> dtype[Any]: ...
 
-    # NOTE: In the future 1-based multiplications will also yield `void` dtypes
-    @overload
-    def __mul__(self, value: L[0]) -> None: ...  # type: ignore[misc]
+    # NOTE: In the future 1-based multiplications will also yield `flexible` dtypes
     @overload
     def __mul__(self: _DType, value: L[1]) -> _DType: ...
     @overload
-    def __mul__(self, value: int) -> dtype[void]: ...
+    def __mul__(self: _FlexDType, value: SupportsIndex) -> _FlexDType: ...
+    @overload
+    def __mul__(self, value: SupportsIndex) -> dtype[void]: ...
 
     # NOTE: `__rmul__` seems to be broken when used in combination with
-    # literals as of mypy 0.800. Set the return-type to `Any` for now.
-    def __rmul__(self, value: int) -> Any: ...
+    # literals as of mypy 0.902. Set the return-type to `dtype[Any]` for
+    # now for non-flexible dtypes.
+    @overload
+    def __rmul__(self: _FlexDType, value: SupportsIndex) -> _FlexDType: ...
+    @overload
+    def __rmul__(self, value: SupportsIndex) -> dtype[Any]: ...
 
     def __gt__(self, other: DTypeLike) -> bool: ...
     def __ge__(self, other: DTypeLike) -> bool: ...
     def __lt__(self, other: DTypeLike) -> bool: ...
     def __le__(self, other: DTypeLike) -> bool: ...
+
+    # Explicitly defined `__eq__` and `__ne__` to get around mypy's
+    # `strict_equality` option; even though their signatures are
+    # identical to their `object`-based counterpart
+    def __eq__(self, other: Any) -> bool: ...
+    def __ne__(self, other: Any) -> bool: ...
+
     @property
     def alignment(self) -> int: ...
     @property
-    def base(self: _DType) -> _DType: ...
+    def base(self) -> dtype[Any]: ...
     @property
     def byteorder(self) -> builtins.str: ...
     @property
     def char(self) -> builtins.str: ...
     @property
-    def descr(self) -> List[Union[Tuple[builtins.str, builtins.str], Tuple[builtins.str, builtins.str, _Shape]]]: ...
+    def descr(self) -> List[Tuple[builtins.str, builtins.str] | Tuple[builtins.str, builtins.str, _Shape]]: ...
     @property
     def fields(
         self,
-    ) -> Optional[Mapping[builtins.str, Union[Tuple[dtype[Any], int], Tuple[dtype[Any], int, Any]]]]: ...
+    ) -> None | MappingProxyType[builtins.str, Tuple[dtype[Any], int] | Tuple[dtype[Any], int, Any]]: ...
     @property
     def flags(self) -> int: ...
     @property
@@ -1138,55 +909,23 @@ class dtype(Generic[_DTypeScalar_co]):
     @property
     def kind(self) -> builtins.str: ...
     @property
-    def metadata(self) -> Optional[Mapping[builtins.str, Any]]: ...
+    def metadata(self) -> None | MappingProxyType[builtins.str, Any]: ...
     @property
     def name(self) -> builtins.str: ...
     @property
-    def names(self) -> Optional[Tuple[str, ...]]: ...
-    @property
     def num(self) -> int: ...
     @property
     def shape(self) -> _Shape: ...
     @property
     def ndim(self) -> int: ...
     @property
-    def subdtype(self: _DType) -> Optional[Tuple[_DType, _Shape]]: ...
+    def subdtype(self) -> None | Tuple[dtype[Any], _Shape]: ...
     def newbyteorder(self: _DType, __new_order: _ByteOrder = ...) -> _DType: ...
     @property
     def str(self) -> builtins.str: ...
     @property
     def type(self) -> Type[_DTypeScalar_co]: ...
 
-class _flagsobj:
-    aligned: bool
-    updateifcopy: bool
-    writeable: bool
-    writebackifcopy: bool
-    @property
-    def behaved(self) -> bool: ...
-    @property
-    def c_contiguous(self) -> bool: ...
-    @property
-    def carray(self) -> bool: ...
-    @property
-    def contiguous(self) -> bool: ...
-    @property
-    def f_contiguous(self) -> bool: ...
-    @property
-    def farray(self) -> bool: ...
-    @property
-    def fnc(self) -> bool: ...
-    @property
-    def forc(self) -> bool: ...
-    @property
-    def fortran(self) -> bool: ...
-    @property
-    def num(self) -> int: ...
-    @property
-    def owndata(self) -> bool: ...
-    def __getitem__(self, key: str) -> bool: ...
-    def __setitem__(self, key: str, value: bool) -> None: ...
-
 _ArrayLikeInt = Union[
     int,
     integer,
@@ -1218,9 +957,9 @@ class flatiter(Generic[_NdArraySubClass]):
         self, key: Union[_ArrayLikeInt, slice, ellipsis],
     ) -> _NdArraySubClass: ...
     @overload
-    def __array__(self: flatiter[ndarray[Any, _DType]], __dtype: None = ...) -> ndarray[Any, _DType]: ...
+    def __array__(self: flatiter[ndarray[Any, _DType]], dtype: None = ..., /) -> ndarray[Any, _DType]: ...
     @overload
-    def __array__(self, __dtype: _DType) -> ndarray[Any, _DType]: ...
+    def __array__(self, dtype: _DType, /) -> ndarray[Any, _DType]: ...
 
 _OrderKACF = Optional[L["K", "A", "C", "F"]]
 _OrderACF = Optional[L["A", "C", "F"]]
@@ -1239,7 +978,7 @@ class _ArrayOrScalarCommon:
     @property
     def data(self) -> memoryview: ...
     @property
-    def flags(self) -> _flagsobj: ...
+    def flags(self) -> flagsobj: ...
     @property
     def itemsize(self) -> int: ...
     @property
@@ -1249,31 +988,40 @@ class _ArrayOrScalarCommon:
     def __str__(self) -> str: ...
     def __repr__(self) -> str: ...
     def __copy__(self: _ArraySelf) -> _ArraySelf: ...
-    def __deepcopy__(self: _ArraySelf, __memo: Optional[dict] = ...) -> _ArraySelf: ...
-    def __eq__(self, other): ...
-    def __ne__(self, other): ...
+    def __deepcopy__(self: _ArraySelf, memo: None | Dict[int, Any], /) -> _ArraySelf: ...
+
+    # TODO: How to deal with the non-commutative nature of `==` and `!=`?
+    # xref numpy/numpy#17368
+    def __eq__(self, other: Any) -> Any: ...
+    def __ne__(self, other: Any) -> Any: ...
     def copy(self: _ArraySelf, order: _OrderKACF = ...) -> _ArraySelf: ...
-    def dump(self, file: str) -> None: ...
+    def dump(self, file: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _SupportsWrite[bytes]) -> None: ...
     def dumps(self) -> bytes: ...
     def tobytes(self, order: _OrderKACF = ...) -> bytes: ...
     # NOTE: `tostring()` is deprecated and therefore excluded
     # def tostring(self, order=...): ...
     def tofile(
-        self, fid: Union[IO[bytes], str, bytes, os.PathLike[Any]], sep: str = ..., format: str = ...
+        self,
+        fid: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _IOProtocol,
+        sep: str = ...,
+        format: str = ...,
     ) -> None: ...
     # generics and 0d arrays return builtin scalars
     def tolist(self) -> Any: ...
 
-    # TODO: Add proper signatures
-    def __getitem__(self, key) -> Any: ...
     @property
-    def __array_interface__(self): ...
+    def __array_interface__(self) -> Dict[str, Any]: ...
     @property
-    def __array_priority__(self): ...
+    def __array_priority__(self) -> float: ...
     @property
-    def __array_struct__(self): ...
-    def __array_wrap__(array, context=...): ...
-    def __setstate__(self, __state): ...
+    def __array_struct__(self) -> Any: ...  # builtins.PyCapsule
+    def __setstate__(self, state: Tuple[
+        SupportsIndex,  # version
+        _ShapeLike,  # Shape
+        _DType_co,  # DType
+        bool,  # F-continuous
+        bytes | List[Any],  # Data
+    ], /) -> None: ...
     # a `bool_` is returned when `keepdims=True` and `self` is a 0d array
 
     @overload
@@ -1325,18 +1073,24 @@ class _ArrayOrScalarCommon:
         self,
         axis: None = ...,
         out: None = ...,
+        *,
+        keepdims: L[False] = ...,
     ) -> intp: ...
     @overload
     def argmax(
         self,
         axis: _ShapeLike = ...,
         out: None = ...,
+        *,
+        keepdims: bool = ...,
     ) -> Any: ...
     @overload
     def argmax(
         self,
         axis: Optional[_ShapeLike] = ...,
         out: _NdArraySubClass = ...,
+        *,
+        keepdims: bool = ...,
     ) -> _NdArraySubClass: ...
 
     @overload
@@ -1344,18 +1098,24 @@ class _ArrayOrScalarCommon:
         self,
         axis: None = ...,
         out: None = ...,
+        *,
+        keepdims: L[False] = ...,
     ) -> intp: ...
     @overload
     def argmin(
         self,
         axis: _ShapeLike = ...,
-         out: None = ...,
+        out: None = ...,
+        *,
+        keepdims: bool = ...,
     ) -> Any: ...
     @overload
     def argmin(
         self,
         axis: Optional[_ShapeLike] = ...,
         out: _NdArraySubClass = ...,
+        *,
+        keepdims: bool = ...,
     ) -> _NdArraySubClass: ...
 
     def argsort(
@@ -1632,17 +1392,31 @@ class _ArrayOrScalarCommon:
 
 _DType = TypeVar("_DType", bound=dtype[Any])
 _DType_co = TypeVar("_DType_co", covariant=True, bound=dtype[Any])
+_FlexDType = TypeVar("_FlexDType", bound=dtype[flexible])
 
 # TODO: Set the `bound` to something more suitable once we
 # have proper shape support
 _ShapeType = TypeVar("_ShapeType", bound=Any)
+_ShapeType2 = TypeVar("_ShapeType2", bound=Any)
 _NumberType = TypeVar("_NumberType", bound=number[Any])
-_BufferType = Union[ndarray, bytes, bytearray, memoryview]
+
+# There is currently no exhaustive way to type the buffer protocol,
+# as it is implemented exclusivelly in the C API (python/typing#593)
+_SupportsBuffer = Union[
+    bytes,
+    bytearray,
+    memoryview,
+    _array.array[Any],
+    mmap.mmap,
+    NDArray[Any],
+    generic,
+]
 
 _T = TypeVar("_T")
 _T_co = TypeVar("_T_co", covariant=True)
+_T_contra = TypeVar("_T_contra", contravariant=True)
 _2Tuple = Tuple[_T, _T]
-_Casting = L["no", "equiv", "safe", "same_kind", "unsafe"]
+_CastingKind = L["no", "equiv", "safe", "same_kind", "unsafe"]
 
 _DTypeLike = Union[
     dtype[_ScalarType],
@@ -1660,8 +1434,12 @@ _ArrayTD64_co = NDArray[Union[bool_, integer[Any], timedelta64]]
 # Introduce an alias for `dtype` to avoid naming conflicts.
 _dtype = dtype
 
+# `builtins.PyCapsule` unfortunately lacks annotations as of the moment;
+# use `Any` as a stopgap measure
+_PyCapsule = Any
+
 class _SupportsItem(Protocol[_T_co]):
-    def item(self, __args: Any) -> _T_co: ...
+    def item(self, args: Any, /) -> _T_co: ...
 
 class _SupportsReal(Protocol[_T_co]):
     @property
@@ -1694,15 +1472,73 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
         cls: Type[_ArraySelf],
         shape: _ShapeLike,
         dtype: DTypeLike = ...,
-        buffer: _BufferType = ...,
-        offset: int = ...,
-        strides: _ShapeLike = ...,
+        buffer: None | _SupportsBuffer = ...,
+        offset: SupportsIndex = ...,
+        strides: None | _ShapeLike = ...,
         order: _OrderKACF = ...,
     ) -> _ArraySelf: ...
+
+    if sys.version_info >= (3, 9):
+        def __class_getitem__(self, item: Any) -> GenericAlias: ...
+
+    @overload
+    def __array__(self, dtype: None = ..., /) -> ndarray[Any, _DType_co]: ...
+    @overload
+    def __array__(self, dtype: _DType, /) -> ndarray[Any, _DType]: ...
+
+    def __array_ufunc__(
+        self,
+        ufunc: ufunc,
+        method: L["__call__", "reduce", "reduceat", "accumulate", "outer", "inner"],
+        *inputs: Any,
+        **kwargs: Any,
+    ) -> Any: ...
+
+    def __array_function__(
+        self,
+        func: Callable[..., Any],
+        types: Iterable[type],
+        args: Iterable[Any],
+        kwargs: Mapping[str, Any],
+    ) -> Any: ...
+
+    @property
+    def __array_finalize__(self) -> None: ...
+
+    def __array_wrap__(
+        self,
+        array: ndarray[_ShapeType2, _DType],
+        context: None | Tuple[ufunc, Tuple[Any, ...], int] = ...,
+        /,
+    ) -> ndarray[_ShapeType2, _DType]: ...
+
+    def __array_prepare__(
+        self,
+        array: ndarray[_ShapeType2, _DType],
+        context: None | Tuple[ufunc, Tuple[Any, ...], int] = ...,
+        /,
+    ) -> ndarray[_ShapeType2, _DType]: ...
+
     @overload
-    def __array__(self, __dtype: None = ...) -> ndarray[Any, _DType_co]: ...
+    def __getitem__(self, key: Union[
+        SupportsIndex,
+        _ArrayLikeInt_co,
+        Tuple[SupportsIndex | _ArrayLikeInt_co, ...],
+    ]) -> Any: ...
+    @overload
+    def __getitem__(self, key: Union[
+        None,
+        slice,
+        ellipsis,
+        SupportsIndex,
+        _ArrayLikeInt_co,
+        Tuple[None | slice | ellipsis | _ArrayLikeInt_co | SupportsIndex, ...],
+    ]) -> ndarray[Any, _DType_co]: ...
     @overload
-    def __array__(self, __dtype: _DType) -> ndarray[Any, _DType]: ...
+    def __getitem__(self: NDArray[void], key: str) -> NDArray[Any]: ...
+    @overload
+    def __getitem__(self: NDArray[void], key: list[str]) -> ndarray[_ShapeType, _dtype[void]]: ...
+
     @property
     def ctypes(self) -> _ctypes[int]: ...
     @property
@@ -1727,16 +1563,17 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     @overload
     def item(
         self: ndarray[Any, _dtype[_SupportsItem[_T]]],  # type: ignore[type-var]
-        __args: Tuple[SupportsIndex, ...],
+        args: Tuple[SupportsIndex, ...],
+        /,
     ) -> _T: ...
 
     @overload
-    def itemset(self, __value: Any) -> None: ...
+    def itemset(self, value: Any, /) -> None: ...
     @overload
-    def itemset(self, __item: _ShapeLike, __value: Any) -> None: ...
+    def itemset(self, item: _ShapeLike, value: Any, /) -> None: ...
 
     @overload
-    def resize(self, __new_shape: _ShapeLike, *, refcheck: bool = ...) -> None: ...
+    def resize(self, new_shape: _ShapeLike, /, *, refcheck: bool = ...) -> None: ...
     @overload
     def resize(self, *new_shape: SupportsIndex, refcheck: bool = ...) -> None: ...
 
@@ -1756,7 +1593,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     ) -> ndarray[Any, _DType_co]: ...
 
     @overload
-    def transpose(self: _ArraySelf, __axes: _ShapeLike) -> _ArraySelf: ...
+    def transpose(self: _ArraySelf, axes: _ShapeLike, /) -> _ArraySelf: ...
     @overload
     def transpose(self: _ArraySelf, *axes: SupportsIndex) -> _ArraySelf: ...
 
@@ -1895,7 +1732,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
 
     @overload
     def reshape(
-        self, __shape: _ShapeLike, *, order: _OrderACF = ...
+        self, shape: _ShapeLike, /, *, order: _OrderACF = ...
     ) -> ndarray[Any, _DType_co]: ...
     @overload
     def reshape(
@@ -1907,18 +1744,18 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
         self,
         dtype: _DTypeLike[_ScalarType],
         order: _OrderKACF = ...,
-        casting: _Casting = ...,
+        casting: _CastingKind = ...,
         subok: bool = ...,
-        copy: bool = ...,
+        copy: bool | _CopyMode = ...,
     ) -> NDArray[_ScalarType]: ...
     @overload
     def astype(
         self,
         dtype: DTypeLike,
         order: _OrderKACF = ...,
-        casting: _Casting = ...,
+        casting: _CastingKind = ...,
         subok: bool = ...,
-        copy: bool = ...,
+        copy: bool | _CopyMode = ...,
     ) -> NDArray[Any]: ...
 
     @overload
@@ -1974,11 +1811,9 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     # The last overload is for catching recursive objects whose
     # nesting is too deep.
     # The first overload is for catching `bytes` (as they are a subtype of
-    # `Sequence[int]`) and `str`. As `str` is a recusive sequence of
+    # `Sequence[int]`) and `str`. As `str` is a recursive sequence of
     # strings, it will pass through the final overload otherwise
 
-    @overload
-    def __lt__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __lt__(self: _ArrayNumber_co, other: _ArrayLikeNumber_co) -> NDArray[bool_]: ...
     @overload
@@ -1989,14 +1824,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __lt__(self: NDArray[object_], other: Any) -> NDArray[bool_]: ...
     @overload
     def __lt__(self: NDArray[Any], other: _ArrayLikeObject_co) -> NDArray[bool_]: ...
-    @overload
-    def __lt__(
-        self: NDArray[Union[number[Any], datetime64, timedelta64, bool_]],
-        other: _RecursiveSequence,
-    ) -> NDArray[bool_]: ...
 
-    @overload
-    def __le__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __le__(self: _ArrayNumber_co, other: _ArrayLikeNumber_co) -> NDArray[bool_]: ...
     @overload
@@ -2007,14 +1835,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __le__(self: NDArray[object_], other: Any) -> NDArray[bool_]: ...
     @overload
     def __le__(self: NDArray[Any], other: _ArrayLikeObject_co) -> NDArray[bool_]: ...
-    @overload
-    def __le__(
-        self: NDArray[Union[number[Any], datetime64, timedelta64, bool_]],
-        other: _RecursiveSequence,
-    ) -> NDArray[bool_]: ...
 
-    @overload
-    def __gt__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __gt__(self: _ArrayNumber_co, other: _ArrayLikeNumber_co) -> NDArray[bool_]: ...
     @overload
@@ -2025,14 +1846,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __gt__(self: NDArray[object_], other: Any) -> NDArray[bool_]: ...
     @overload
     def __gt__(self: NDArray[Any], other: _ArrayLikeObject_co) -> NDArray[bool_]: ...
-    @overload
-    def __gt__(
-        self: NDArray[Union[number[Any], datetime64, timedelta64, bool_]],
-        other: _RecursiveSequence,
-    ) -> NDArray[bool_]: ...
 
-    @overload
-    def __ge__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __ge__(self: _ArrayNumber_co, other: _ArrayLikeNumber_co) -> NDArray[bool_]: ...
     @overload
@@ -2043,11 +1857,6 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __ge__(self: NDArray[object_], other: Any) -> NDArray[bool_]: ...
     @overload
     def __ge__(self: NDArray[Any], other: _ArrayLikeObject_co) -> NDArray[bool_]: ...
-    @overload
-    def __ge__(
-        self: NDArray[Union[number[Any], datetime64, timedelta64, bool_]],
-        other: _RecursiveSequence,
-    ) -> NDArray[bool_]: ...
 
     # Unary ops
     @overload
@@ -2085,8 +1894,6 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     # Binary ops
     # NOTE: `ndarray` does not implement `__imatmul__`
     @overload
-    def __matmul__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
-    @overload
     def __matmul__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
     @overload
     def __matmul__(self: _ArrayUInt_co, other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: ...  # type: ignore[misc]
@@ -2100,14 +1907,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __matmul__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __matmul__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __matmul__(
-        self: _ArrayNumber_co,
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __rmatmul__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rmatmul__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
     @overload
@@ -2122,14 +1922,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __rmatmul__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __rmatmul__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __rmatmul__(
-        self: _ArrayNumber_co,
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __mod__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __mod__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: ...  # type: ignore[misc]
     @overload
@@ -2139,19 +1932,12 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     @overload
     def __mod__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: ...  # type: ignore[misc]
     @overload
-    def __mod__(self: _ArrayTD64_co, other: _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[timedelta64]: ...
+    def __mod__(self: _ArrayTD64_co, other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[timedelta64]: ...
     @overload
     def __mod__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __mod__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __mod__(
-        self: NDArray[Union[bool_, integer[Any], floating[Any], timedelta64]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __rmod__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rmod__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: ...  # type: ignore[misc]
     @overload
@@ -2161,19 +1947,12 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     @overload
     def __rmod__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: ...  # type: ignore[misc]
     @overload
-    def __rmod__(self: _ArrayTD64_co, other: _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[timedelta64]: ...
+    def __rmod__(self: _ArrayTD64_co, other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[timedelta64]: ...
     @overload
     def __rmod__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __rmod__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __rmod__(
-        self: NDArray[Union[bool_, integer[Any], floating[Any], timedelta64]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __divmod__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __divmod__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> _2Tuple[NDArray[int8]]: ...  # type: ignore[misc]
     @overload
@@ -2183,15 +1962,8 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     @overload
     def __divmod__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> _2Tuple[NDArray[floating[Any]]]: ...  # type: ignore[misc]
     @overload
-    def __divmod__(self: _ArrayTD64_co, other: _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> Tuple[NDArray[int64], NDArray[timedelta64]]: ...
-    @overload
-    def __divmod__(
-        self: NDArray[Union[bool_, integer[Any], floating[Any], timedelta64]],
-        other: _RecursiveSequence,
-    ) -> _2Tuple[Any]: ...
+    def __divmod__(self: _ArrayTD64_co, other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> Tuple[NDArray[int64], NDArray[timedelta64]]: ...
 
-    @overload
-    def __rdivmod__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rdivmod__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> _2Tuple[NDArray[int8]]: ...  # type: ignore[misc]
     @overload
@@ -2201,15 +1973,8 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     @overload
     def __rdivmod__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> _2Tuple[NDArray[floating[Any]]]: ...  # type: ignore[misc]
     @overload
-    def __rdivmod__(self: _ArrayTD64_co, other: _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> Tuple[NDArray[int64], NDArray[timedelta64]]: ...
-    @overload
-    def __rdivmod__(
-        self: NDArray[Union[bool_, integer[Any], floating[Any], timedelta64]],
-        other: _RecursiveSequence,
-    ) -> _2Tuple[Any]: ...
+    def __rdivmod__(self: _ArrayTD64_co, other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> Tuple[NDArray[int64], NDArray[timedelta64]]: ...
 
-    @overload
-    def __add__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __add__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
     @overload
@@ -2230,14 +1995,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __add__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __add__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __add__(
-        self: NDArray[Union[bool_, number[Any], timedelta64, datetime64]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __radd__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __radd__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
     @overload
@@ -2258,14 +2016,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __radd__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __radd__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __radd__(
-        self: NDArray[Union[bool_, number[Any], timedelta64, datetime64]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __sub__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __sub__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NoReturn: ...
     @overload
@@ -2286,14 +2037,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __sub__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __sub__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __sub__(
-        self: NDArray[Union[bool_, number[Any], timedelta64, datetime64]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __rsub__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rsub__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NoReturn: ...
     @overload
@@ -2314,14 +2058,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __rsub__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __rsub__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __rsub__(
-        self: NDArray[Union[bool_, number[Any], timedelta64, datetime64]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __mul__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __mul__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
     @overload
@@ -2340,14 +2077,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __mul__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __mul__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __mul__(
-        self: NDArray[Union[bool_, number[Any], timedelta64]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __rmul__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rmul__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
     @overload
@@ -2366,14 +2096,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __rmul__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __rmul__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __rmul__(
-        self: NDArray[Union[bool_, number[Any], timedelta64]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __floordiv__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __floordiv__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: ...  # type: ignore[misc]
     @overload
@@ -2383,9 +2106,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     @overload
     def __floordiv__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: ...  # type: ignore[misc]
     @overload
-    def __floordiv__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: ...  # type: ignore[misc]
-    @overload
-    def __floordiv__(self: NDArray[timedelta64], other: _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[int64]: ...
+    def __floordiv__(self: NDArray[timedelta64], other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[int64]: ...
     @overload
     def __floordiv__(self: NDArray[timedelta64], other: _ArrayLikeBool_co) -> NoReturn: ...
     @overload
@@ -2394,14 +2115,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __floordiv__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __floordiv__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __floordiv__(
-        self: NDArray[Union[bool_, number[Any], timedelta64]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __rfloordiv__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rfloordiv__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: ...  # type: ignore[misc]
     @overload
@@ -2411,9 +2125,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     @overload
     def __rfloordiv__(self: _ArrayFloat_co, other: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: ...  # type: ignore[misc]
     @overload
-    def __rfloordiv__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: ...  # type: ignore[misc]
-    @overload
-    def __rfloordiv__(self: NDArray[timedelta64], other: _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[int64]: ...
+    def __rfloordiv__(self: NDArray[timedelta64], other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[int64]: ...
     @overload
     def __rfloordiv__(self: NDArray[bool_], other: _ArrayLikeTD64_co) -> NoReturn: ...
     @overload
@@ -2422,14 +2134,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __rfloordiv__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __rfloordiv__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __rfloordiv__(
-        self: NDArray[Union[bool_, number[Any], timedelta64]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __pow__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __pow__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: ...  # type: ignore[misc]
     @overload
@@ -2444,14 +2149,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __pow__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __pow__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __pow__(
-        self: NDArray[Union[bool_, number[Any]]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __rpow__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rpow__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: ...  # type: ignore[misc]
     @overload
@@ -2466,14 +2164,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __rpow__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __rpow__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __rpow__(
-        self: NDArray[Union[bool_, number[Any]]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __truediv__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __truediv__(self: _ArrayInt_co, other: _ArrayInt_co) -> NDArray[float64]: ...  # type: ignore[misc]
     @overload
@@ -2481,7 +2172,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     @overload
     def __truediv__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: ...  # type: ignore[misc]
     @overload
-    def __truediv__(self: NDArray[timedelta64], other: _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[float64]: ...
+    def __truediv__(self: NDArray[timedelta64], other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[float64]: ...
     @overload
     def __truediv__(self: NDArray[timedelta64], other: _ArrayLikeBool_co) -> NoReturn: ...
     @overload
@@ -2490,14 +2181,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __truediv__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __truediv__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __truediv__(
-        self: NDArray[Union[bool_, number[Any], timedelta64]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __rtruediv__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rtruediv__(self: _ArrayInt_co, other: _ArrayInt_co) -> NDArray[float64]: ...  # type: ignore[misc]
     @overload
@@ -2505,7 +2189,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     @overload
     def __rtruediv__(self: _ArrayComplex_co, other: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: ...  # type: ignore[misc]
     @overload
-    def __rtruediv__(self: NDArray[timedelta64], other: _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[float64]: ...
+    def __rtruediv__(self: NDArray[timedelta64], other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[float64]: ...
     @overload
     def __rtruediv__(self: NDArray[bool_], other: _ArrayLikeTD64_co) -> NoReturn: ...
     @overload
@@ -2514,14 +2198,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __rtruediv__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __rtruediv__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __rtruediv__(
-        self: NDArray[Union[bool_, number[Any], timedelta64]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __lshift__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __lshift__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: ...  # type: ignore[misc]
     @overload
@@ -2532,14 +2209,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __lshift__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __lshift__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __lshift__(
-        self: NDArray[Union[bool_, integer[Any]]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __rlshift__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rlshift__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: ...  # type: ignore[misc]
     @overload
@@ -2550,14 +2220,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __rlshift__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __rlshift__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __rlshift__(
-        self: NDArray[Union[bool_, integer[Any]]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __rshift__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rshift__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: ...  # type: ignore[misc]
     @overload
@@ -2568,14 +2231,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __rshift__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __rshift__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __rshift__(
-        self: NDArray[Union[bool_, integer[Any]]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __rrshift__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rrshift__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[int8]: ...  # type: ignore[misc]
     @overload
@@ -2586,14 +2242,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __rrshift__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __rrshift__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __rrshift__(
-        self: NDArray[Union[bool_, integer[Any]]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __and__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __and__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
     @overload
@@ -2604,14 +2253,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __and__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __and__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __and__(
-        self: NDArray[Union[bool_, integer[Any]]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __rand__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rand__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
     @overload
@@ -2622,14 +2264,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __rand__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __rand__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __rand__(
-        self: NDArray[Union[bool_, integer[Any]]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __xor__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __xor__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
     @overload
@@ -2640,14 +2275,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __xor__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __xor__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __xor__(
-        self: NDArray[Union[bool_, integer[Any]]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __rxor__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __rxor__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
     @overload
@@ -2658,14 +2286,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __rxor__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __rxor__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __rxor__(
-        self: NDArray[Union[bool_, integer[Any]]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __or__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __or__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
     @overload
@@ -2676,14 +2297,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __or__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __or__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __or__(
-        self: NDArray[Union[bool_, integer[Any]]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
-    @overload
-    def __ror__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __ror__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
     @overload
@@ -2694,15 +2308,8 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __ror__(self: NDArray[object_], other: Any) -> Any: ...
     @overload
     def __ror__(self: NDArray[Any], other: _ArrayLikeObject_co) -> Any: ...
-    @overload
-    def __ror__(
-        self: NDArray[Union[bool_, integer[Any]]],
-        other: _RecursiveSequence,
-    ) -> Any: ...
 
     # `np.generic` does not support inplace operations
-    @overload  # type: ignore[misc]
-    def __iadd__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __iadd__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...
     @overload
@@ -2719,11 +2326,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __iadd__(self: NDArray[datetime64], other: _ArrayLikeTD64_co) -> NDArray[datetime64]: ...
     @overload
     def __iadd__(self: NDArray[object_], other: Any) -> NDArray[object_]: ...
-    @overload
-    def __iadd__(self: NDArray[_ScalarType], other: _RecursiveSequence) -> NDArray[_ScalarType]: ...
 
-    @overload  # type: ignore[misc]
-    def __isub__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __isub__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[_NBit1]]: ...
     @overload
@@ -2738,11 +2341,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __isub__(self: NDArray[datetime64], other: _ArrayLikeTD64_co) -> NDArray[datetime64]: ...
     @overload
     def __isub__(self: NDArray[object_], other: Any) -> NDArray[object_]: ...
-    @overload
-    def __isub__(self: NDArray[_ScalarType], other: _RecursiveSequence) -> NDArray[_ScalarType]: ...
 
-    @overload  # type: ignore[misc]
-    def __imul__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __imul__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...
     @overload
@@ -2757,11 +2356,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __imul__(self: NDArray[timedelta64], other: _ArrayLikeFloat_co) -> NDArray[timedelta64]: ...
     @overload
     def __imul__(self: NDArray[object_], other: Any) -> NDArray[object_]: ...
-    @overload
-    def __imul__(self: NDArray[_ScalarType], other: _RecursiveSequence) -> NDArray[_ScalarType]: ...
 
-    @overload  # type: ignore[misc]
-    def __itruediv__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __itruediv__(self: NDArray[floating[_NBit1]], other: _ArrayLikeFloat_co) -> NDArray[floating[_NBit1]]: ...
     @overload
@@ -2772,11 +2367,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __itruediv__(self: NDArray[timedelta64], other: _ArrayLikeInt_co) -> NDArray[timedelta64]: ...
     @overload
     def __itruediv__(self: NDArray[object_], other: Any) -> NDArray[object_]: ...
-    @overload
-    def __itruediv__(self: NDArray[_ScalarType], other: _RecursiveSequence) -> NDArray[_ScalarType]: ...
 
-    @overload  # type: ignore[misc]
-    def __ifloordiv__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __ifloordiv__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[_NBit1]]: ...
     @overload
@@ -2791,11 +2382,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __ifloordiv__(self: NDArray[timedelta64], other: _ArrayLikeInt_co) -> NDArray[timedelta64]: ...
     @overload
     def __ifloordiv__(self: NDArray[object_], other: Any) -> NDArray[object_]: ...
-    @overload
-    def __ifloordiv__(self: NDArray[_ScalarType], other: _RecursiveSequence) -> NDArray[_ScalarType]: ...
 
-    @overload  # type: ignore[misc]
-    def __ipow__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __ipow__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[_NBit1]]: ...
     @overload
@@ -2806,11 +2393,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __ipow__(self: NDArray[complexfloating[_NBit1, _NBit1]], other: _ArrayLikeComplex_co) -> NDArray[complexfloating[_NBit1, _NBit1]]: ...
     @overload
     def __ipow__(self: NDArray[object_], other: Any) -> NDArray[object_]: ...
-    @overload
-    def __ipow__(self: NDArray[_ScalarType], other: _RecursiveSequence) -> NDArray[_ScalarType]: ...
 
-    @overload  # type: ignore[misc]
-    def __imod__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __imod__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[_NBit1]]: ...
     @overload
@@ -2818,36 +2401,24 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     @overload
     def __imod__(self: NDArray[floating[_NBit1]], other: _ArrayLikeFloat_co) -> NDArray[floating[_NBit1]]: ...
     @overload
-    def __imod__(self: NDArray[timedelta64], other: _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[timedelta64]: ...
+    def __imod__(self: NDArray[timedelta64], other: _SupportsArray[_dtype[timedelta64]] | _NestedSequence[_SupportsArray[_dtype[timedelta64]]]) -> NDArray[timedelta64]: ...
     @overload
     def __imod__(self: NDArray[object_], other: Any) -> NDArray[object_]: ...
-    @overload
-    def __imod__(self: NDArray[_ScalarType], other: _RecursiveSequence) -> NDArray[_ScalarType]: ...
 
-    @overload  # type: ignore[misc]
-    def __ilshift__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __ilshift__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[_NBit1]]: ...
     @overload
     def __ilshift__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: ...
     @overload
     def __ilshift__(self: NDArray[object_], other: Any) -> NDArray[object_]: ...
-    @overload
-    def __ilshift__(self: NDArray[_ScalarType], other: _RecursiveSequence) -> NDArray[_ScalarType]: ...
 
-    @overload  # type: ignore[misc]
-    def __irshift__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __irshift__(self: NDArray[unsignedinteger[_NBit1]], other: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[_NBit1]]: ...
     @overload
     def __irshift__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: ...
     @overload
     def __irshift__(self: NDArray[object_], other: Any) -> NDArray[object_]: ...
-    @overload
-    def __irshift__(self: NDArray[_ScalarType], other: _RecursiveSequence) -> NDArray[_ScalarType]: ...
 
-    @overload  # type: ignore[misc]
-    def __iand__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __iand__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...
     @overload
@@ -2856,11 +2427,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __iand__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: ...
     @overload
     def __iand__(self: NDArray[object_], other: Any) -> NDArray[object_]: ...
-    @overload
-    def __iand__(self: NDArray[_ScalarType], other: _RecursiveSequence) -> NDArray[_ScalarType]: ...
 
-    @overload  # type: ignore[misc]
-    def __ixor__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __ixor__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...
     @overload
@@ -2869,11 +2436,7 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __ixor__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: ...
     @overload
     def __ixor__(self: NDArray[object_], other: Any) -> NDArray[object_]: ...
-    @overload
-    def __ixor__(self: NDArray[_ScalarType], other: _RecursiveSequence) -> NDArray[_ScalarType]: ...
 
-    @overload  # type: ignore[misc]
-    def __ior__(self: NDArray[Any], other: _NestedSequence[Union[str, bytes]]) -> NoReturn: ...
     @overload
     def __ior__(self: NDArray[bool_], other: _ArrayLikeBool_co) -> NDArray[bool_]: ...
     @overload
@@ -2882,8 +2445,9 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
     def __ior__(self: NDArray[signedinteger[_NBit1]], other: _ArrayLikeInt_co) -> NDArray[signedinteger[_NBit1]]: ...
     @overload
     def __ior__(self: NDArray[object_], other: Any) -> NDArray[object_]: ...
-    @overload
-    def __ior__(self: NDArray[_ScalarType], other: _RecursiveSequence) -> NDArray[_ScalarType]: ...
+
+    def __dlpack__(self: NDArray[number[Any]], *, stream: None = ...) -> _PyCapsule: ...
+    def __dlpack_device__(self) -> Tuple[int, L[0]]: ...
 
     # Keep `dtype` at the bottom to avoid name conflicts with `np.dtype`
     @property
@@ -2905,9 +2469,9 @@ class generic(_ArrayOrScalarCommon):
     @abstractmethod
     def __init__(self, *args: Any, **kwargs: Any) -> None: ...
     @overload
-    def __array__(self: _ScalarType, __dtype: None = ...) -> ndarray[Any, _dtype[_ScalarType]]: ...
+    def __array__(self: _ScalarType, dtype: None = ..., /) -> ndarray[Any, _dtype[_ScalarType]]: ...
     @overload
-    def __array__(self, __dtype: _DType) -> ndarray[Any, _DType]: ...
+    def __array__(self, dtype: _DType, /) -> ndarray[Any, _DType]: ...
     @property
     def base(self) -> None: ...
     @property
@@ -2927,18 +2491,18 @@ class generic(_ArrayOrScalarCommon):
         self,
         dtype: _DTypeLike[_ScalarType],
         order: _OrderKACF = ...,
-        casting: _Casting = ...,
+        casting: _CastingKind = ...,
         subok: bool = ...,
-        copy: bool = ...,
+        copy: bool | _CopyMode = ...,
     ) -> _ScalarType: ...
     @overload
     def astype(
         self,
         dtype: DTypeLike,
         order: _OrderKACF = ...,
-        casting: _Casting = ...,
+        casting: _CastingKind = ...,
         subok: bool = ...,
-        copy: bool = ...,
+        copy: bool | _CopyMode = ...,
     ) -> Any: ...
 
     # NOTE: `view` will perform a 0D->scalar cast,
@@ -2975,8 +2539,7 @@ class generic(_ArrayOrScalarCommon):
     ) -> Any: ...
 
     def item(
-        self,
-        __args: Union[L[0], Tuple[()], Tuple[L[0]]] = ...,
+        self, args: L[0] | Tuple[()] | Tuple[L[0]] = ..., /,
     ) -> Any: ...
 
     @overload
@@ -3022,7 +2585,7 @@ class generic(_ArrayOrScalarCommon):
 
     @overload
     def reshape(
-        self: _ScalarType, __shape: _ShapeLike, *, order: _OrderACF = ...
+        self: _ScalarType, shape: _ShapeLike, /, *, order: _OrderACF = ...
     ) -> ndarray[Any, _dtype[_ScalarType]]: ...
     @overload
     def reshape(
@@ -3032,7 +2595,7 @@ class generic(_ArrayOrScalarCommon):
     def squeeze(
         self: _ScalarType, axis: Union[L[0], Tuple[()]] = ...
     ) -> _ScalarType: ...
-    def transpose(self: _ScalarType, __axes: Tuple[()] = ...) -> _ScalarType: ...
+    def transpose(self: _ScalarType, axes: Tuple[()] = ..., /) -> _ScalarType: ...
     # Keep `dtype` at the bottom to avoid name conflicts with `np.dtype`
     @property
     def dtype(self: _ScalarType) -> _dtype[_ScalarType]: ...
@@ -3042,6 +2605,8 @@ class number(generic, Generic[_NBit1]):  # type: ignore
     def real(self: _ArraySelf) -> _ArraySelf: ...
     @property
     def imag(self: _ArraySelf) -> _ArraySelf: ...
+    if sys.version_info >= (3, 9):
+        def __class_getitem__(self, item: Any) -> GenericAlias: ...
     def __int__(self) -> int: ...
     def __float__(self) -> float: ...
     def __complex__(self) -> complex: ...
@@ -3067,10 +2632,9 @@ class number(generic, Generic[_NBit1]):  # type: ignore
     __ge__: _ComparisonOp[_NumberLike_co, _ArrayLikeNumber_co]
 
 class bool_(generic):
-    def __init__(self, __value: object = ...) -> None: ...
+    def __init__(self, value: object = ..., /) -> None: ...
     def item(
-        self,
-        __args: Union[L[0], Tuple[()], Tuple[L[0]]] = ...,
+        self, args: L[0] | Tuple[()] | Tuple[L[0]] = ..., /,
     ) -> bool: ...
     def tolist(self) -> bool: ...
     @property
@@ -3116,7 +2680,7 @@ class bool_(generic):
 bool8 = bool_
 
 class object_(generic):
-    def __init__(self, __value: object = ...) -> None: ...
+    def __init__(self, value: object = ..., /) -> None: ...
     @property
     def real(self: _ArraySelf) -> _ArraySelf: ...
     @property
@@ -3145,14 +2709,16 @@ class datetime64(generic):
     @overload
     def __init__(
         self,
-        __value: Union[None, datetime64, _CharLike_co, _DatetimeScalar] = ...,
-        __format: Union[_CharLike_co, Tuple[_CharLike_co, _IntLike_co]] = ...,
+        value: None | datetime64 | _CharLike_co | _DatetimeScalar = ...,
+        format: _CharLike_co | Tuple[_CharLike_co, _IntLike_co] = ...,
+        /,
     ) -> None: ...
     @overload
     def __init__(
         self,
-        __value: int,
-        __format: Union[_CharLike_co, Tuple[_CharLike_co, _IntLike_co]]
+        value: int,
+        format: _CharLike_co | Tuple[_CharLike_co, _IntLike_co],
+        /,
     ) -> None: ...
     def __add__(self, other: _TD64Like_co) -> datetime64: ...
     def __radd__(self, other: _TD64Like_co) -> datetime64: ...
@@ -3166,28 +2732,16 @@ class datetime64(generic):
     __gt__: _ComparisonOp[datetime64, _ArrayLikeDT64_co]
     __ge__: _ComparisonOp[datetime64, _ArrayLikeDT64_co]
 
-# Support for `__index__` was added in python 3.8 (bpo-20092)
-if sys.version_info >= (3, 8):
-    _IntValue = Union[SupportsInt, _CharLike_co, SupportsIndex]
-    _FloatValue = Union[None, _CharLike_co, SupportsFloat, SupportsIndex]
-    _ComplexValue = Union[
-        None,
-        _CharLike_co,
-        SupportsFloat,
-        SupportsComplex,
-        SupportsIndex,
-        complex,  # `complex` is not a subtype of `SupportsComplex`
-    ]
-else:
-    _IntValue = Union[SupportsInt, _CharLike_co]
-    _FloatValue = Union[None, _CharLike_co, SupportsFloat]
-    _ComplexValue = Union[
-        None,
-        _CharLike_co,
-        SupportsFloat,
-        SupportsComplex,
-        complex,
-    ]
+_IntValue = Union[SupportsInt, _CharLike_co, SupportsIndex]
+_FloatValue = Union[None, _CharLike_co, SupportsFloat, SupportsIndex]
+_ComplexValue = Union[
+    None,
+    _CharLike_co,
+    SupportsFloat,
+    SupportsComplex,
+    SupportsIndex,
+    complex,  # `complex` is not a subtype of `SupportsComplex`
+]
 
 class integer(number[_NBit1]):  # type: ignore
     @property
@@ -3202,10 +2756,11 @@ class integer(number[_NBit1]):  # type: ignore
     # NOTE: `__index__` is technically defined in the bottom-most
     # sub-classes (`int64`, `uint32`, etc)
     def item(
-        self,
-        __args: Union[L[0], Tuple[()], Tuple[L[0]]] = ...,
+        self, args: L[0] | Tuple[()] | Tuple[L[0]] = ..., /,
     ) -> int: ...
     def tolist(self) -> int: ...
+    def is_integer(self) -> L[True]: ...
+    def bit_count(self: _ScalarType) -> int: ...
     def __index__(self) -> int: ...
     __truediv__: _IntTrueDiv[_NBit1]
     __rtruediv__: _IntTrueDiv[_NBit1]
@@ -3225,7 +2780,7 @@ class integer(number[_NBit1]):  # type: ignore
     def __rxor__(self, other: _IntLike_co) -> integer: ...
 
 class signedinteger(integer[_NBit1]):
-    def __init__(self, __value: _IntValue = ...) -> None: ...
+    def __init__(self, value: _IntValue = ..., /) -> None: ...
     __add__: _SignedIntOp[_NBit1]
     __radd__: _SignedIntOp[_NBit1]
     __sub__: _SignedIntOp[_NBit1]
@@ -3269,8 +2824,9 @@ longlong = signedinteger[_NBitLongLong]
 class timedelta64(generic):
     def __init__(
         self,
-        __value: Union[None, int, _CharLike_co, dt.timedelta, timedelta64] = ...,
-        __format: Union[_CharLike_co, Tuple[_CharLike_co, _IntLike_co]] = ...,
+        value: None | int | _CharLike_co | dt.timedelta | timedelta64 = ...,
+        format: _CharLike_co | Tuple[_CharLike_co, _IntLike_co] = ...,
+        /,
     ) -> None: ...
     @property
     def numerator(self: _ScalarType) -> _ScalarType: ...
@@ -3306,7 +2862,7 @@ class timedelta64(generic):
 
 class unsignedinteger(integer[_NBit1]):
     # NOTE: `uint64 + signedinteger -> float64`
-    def __init__(self, __value: _IntValue = ...) -> None: ...
+    def __init__(self, value: _IntValue = ..., /) -> None: ...
     __add__: _UnsignedIntOp[_NBit1]
     __radd__: _UnsignedIntOp[_NBit1]
     __sub__: _UnsignedIntOp[_NBit1]
@@ -3352,23 +2908,23 @@ _IntType = TypeVar("_IntType", bound=integer)
 _FloatType = TypeVar('_FloatType', bound=floating)
 
 class floating(inexact[_NBit1]):
-    def __init__(self, __value: _FloatValue = ...) -> None: ...
+    def __init__(self, value: _FloatValue = ..., /) -> None: ...
     def item(
-        self,
-        __args: Union[L[0], Tuple[()], Tuple[L[0]]] = ...,
+        self, args: L[0] | Tuple[()] | Tuple[L[0]] = ...,
+        /,
     ) -> float: ...
     def tolist(self) -> float: ...
-    def is_integer(self: float64) -> bool: ...
+    def is_integer(self) -> bool: ...
     def hex(self: float64) -> str: ...
     @classmethod
-    def fromhex(cls: Type[float64], __string: str) -> float64: ...
+    def fromhex(cls: Type[float64], string: str, /) -> float64: ...
     def as_integer_ratio(self) -> Tuple[int, int]: ...
     if sys.version_info >= (3, 9):
         def __ceil__(self: float64) -> int: ...
         def __floor__(self: float64) -> int: ...
     def __trunc__(self: float64) -> int: ...
     def __getnewargs__(self: float64) -> Tuple[float]: ...
-    def __getformat__(self: float64, __typestr: L["double", "float"]) -> str: ...
+    def __getformat__(self: float64, typestr: L["double", "float"], /) -> str: ...
     @overload
     def __round__(self, ndigits: None = ...) -> int: ...
     @overload
@@ -3406,10 +2962,9 @@ longfloat = floating[_NBitLongDouble]
 # describing the two 64 bit floats representing its real and imaginary component
 
 class complexfloating(inexact[_NBit1], Generic[_NBit1, _NBit2]):
-    def __init__(self, __value: _ComplexValue = ...) -> None: ...
+    def __init__(self, value: _ComplexValue = ..., /) -> None: ...
     def item(
-        self,
-        __args: Union[L[0], Tuple[()], Tuple[L[0]]] = ...,
+        self, args: L[0] | Tuple[()] | Tuple[L[0]] = ..., /,
     ) -> complex: ...
     def tolist(self) -> complex: ...
     @property
@@ -3428,8 +2983,6 @@ class complexfloating(inexact[_NBit1], Generic[_NBit1, _NBit2]):
     __rmul__: _ComplexOp[_NBit1]
     __truediv__: _ComplexOp[_NBit1]
     __rtruediv__: _ComplexOp[_NBit1]
-    __floordiv__: _ComplexOp[_NBit1]
-    __rfloordiv__: _ComplexOp[_NBit1]
     __pow__: _ComplexOp[_NBit1]
     __rpow__: _ComplexOp[_NBit1]
 
@@ -3451,7 +3004,7 @@ class flexible(generic): ...  # type: ignore
 # depending on whether or not it's used as an opaque bytes sequence
 # or a structure
 class void(flexible):
-    def __init__(self, __value: Union[_IntLike_co, bytes]) -> None: ...
+    def __init__(self, value: _IntLike_co | bytes, /) -> None: ...
     @property
     def real(self: _ArraySelf) -> _ArraySelf: ...
     @property
@@ -3459,8 +3012,15 @@ class void(flexible):
     def setfield(
         self, val: ArrayLike, dtype: DTypeLike, offset: int = ...
     ) -> None: ...
-    def __getitem__(self, key: SupportsIndex) -> Any: ...
-    def __setitem__(self, key: SupportsIndex, value: ArrayLike) -> None: ...
+    @overload
+    def __getitem__(self, key: str | SupportsIndex) -> Any: ...
+    @overload
+    def __getitem__(self, key: list[str]) -> void: ...
+    def __setitem__(
+        self,
+        key: str | List[str] | SupportsIndex,
+        value: ArrayLike,
+    ) -> None: ...
 
 void0 = void
 
@@ -3473,14 +3033,13 @@ class character(flexible):  # type: ignore
 
 class bytes_(character, bytes):
     @overload
-    def __init__(self, __value: object = ...) -> None: ...
+    def __init__(self, value: object = ..., /) -> None: ...
     @overload
     def __init__(
-        self, __value: str, encoding: str = ..., errors: str = ...
+        self, value: str, /, encoding: str = ..., errors: str = ...
     ) -> None: ...
     def item(
-        self,
-        __args: Union[L[0], Tuple[()], Tuple[L[0]]] = ...,
+        self, args: L[0] | Tuple[()] | Tuple[L[0]] = ..., /,
     ) -> bytes: ...
     def tolist(self) -> bytes: ...
 
@@ -3489,45 +3048,19 @@ bytes0 = bytes_
 
 class str_(character, str):
     @overload
-    def __init__(self, __value: object = ...) -> None: ...
+    def __init__(self, value: object = ..., /) -> None: ...
     @overload
     def __init__(
-        self, __value: bytes, encoding: str = ..., errors: str = ...
+        self, value: bytes, /, encoding: str = ..., errors: str = ...
     ) -> None: ...
     def item(
-        self,
-        __args: Union[L[0], Tuple[()], Tuple[L[0]]] = ...,
+        self, args: L[0] | Tuple[()] | Tuple[L[0]] = ..., /,
     ) -> str: ...
     def tolist(self) -> str: ...
 
 unicode_ = str_
 str0 = str_
 
-def array(
-    object: object,
-    dtype: DTypeLike = ...,
-    *,
-    copy: bool = ...,
-    order: _OrderKACF = ...,
-    subok: bool = ...,
-    ndmin: int = ...,
-    like: ArrayLike = ...,
-) -> ndarray: ...
-def zeros(
-    shape: _ShapeLike,
-    dtype: DTypeLike = ...,
-    order: _OrderCF = ...,
-    *,
-    like: ArrayLike = ...,
-) -> ndarray: ...
-def empty(
-    shape: _ShapeLike,
-    dtype: DTypeLike = ...,
-    order: _OrderCF = ...,
-    *,
-    like: ArrayLike = ...,
-) -> ndarray: ...
-
 #
 # Constants
 #
@@ -3546,38 +3079,37 @@ inf: Final[float]
 infty: Final[float]
 nan: Final[float]
 pi: Final[float]
-ALLOW_THREADS: Final[int]
-BUFSIZE: Final[int]
-CLIP: Final[int]
-ERR_CALL: Final[int]
-ERR_DEFAULT: Final[int]
-ERR_IGNORE: Final[int]
-ERR_LOG: Final[int]
-ERR_PRINT: Final[int]
-ERR_RAISE: Final[int]
-ERR_WARN: Final[int]
-FLOATING_POINT_SUPPORT: Final[int]
-FPE_DIVIDEBYZERO: Final[int]
-FPE_INVALID: Final[int]
-FPE_OVERFLOW: Final[int]
-FPE_UNDERFLOW: Final[int]
-MAXDIMS: Final[int]
-MAY_SHARE_BOUNDS: Final[int]
-MAY_SHARE_EXACT: Final[int]
-RAISE: Final[int]
-SHIFT_DIVIDEBYZERO: Final[int]
-SHIFT_INVALID: Final[int]
-SHIFT_OVERFLOW: Final[int]
-SHIFT_UNDERFLOW: Final[int]
-UFUNC_BUFSIZE_DEFAULT: Final[int]
-WRAP: Final[int]
-tracemalloc_domain: Final[int]
+
+CLIP: L[0]
+WRAP: L[1]
+RAISE: L[2]
+
+ERR_IGNORE: L[0]
+ERR_WARN: L[1]
+ERR_RAISE: L[2]
+ERR_CALL: L[3]
+ERR_PRINT: L[4]
+ERR_LOG: L[5]
+ERR_DEFAULT: L[521]
+
+SHIFT_DIVIDEBYZERO: L[0]
+SHIFT_OVERFLOW: L[3]
+SHIFT_UNDERFLOW: L[6]
+SHIFT_INVALID: L[9]
+
+FPE_DIVIDEBYZERO: L[1]
+FPE_OVERFLOW: L[2]
+FPE_UNDERFLOW: L[4]
+FPE_INVALID: L[8]
+
+FLOATING_POINT_SUPPORT: L[1]
+UFUNC_BUFSIZE_DEFAULT = BUFSIZE
 
 little_endian: Final[bool]
 True_: Final[bool_]
 False_: Final[bool_]
 
-UFUNC_PYVALS_NAME: Final[str]
+UFUNC_PYVALS_NAME: L["UFUNC_PYVALS"]
 
 newaxis: None
 
@@ -3719,6 +3251,11 @@ trunc: _UFunc_Nin1_Nout1[L['trunc'], L[7], None]
 
 abs = absolute
 
+class _CopyMode(enum.Enum):
+    ALWAYS: L[True]
+    IF_NEEDED: L[False]
+    NEVER: L[2]
+
 # Warnings
 class ModuleDeprecationWarning(DeprecationWarning): ...
 class VisibleDeprecationWarning(UserWarning): ...
@@ -3729,11 +3266,14 @@ class RankWarning(UserWarning): ...
 class TooHardError(RuntimeError): ...
 
 class AxisError(ValueError, IndexError):
-    def __init__(
-        self, axis: int, ndim: Optional[int] = ..., msg_prefix: Optional[str] = ...
-    ) -> None: ...
+    axis: None | int
+    ndim: None | int
+    @overload
+    def __init__(self, axis: str, ndim: None = ..., msg_prefix: None = ...) -> None: ...
+    @overload
+    def __init__(self, axis: int, ndim: int, msg_prefix: None | str = ...) -> None: ...
 
-_CallType = TypeVar("_CallType", bound=Union[_ErrFunc, _SupportsWrite])
+_CallType = TypeVar("_CallType", bound=Union[_ErrFunc, _SupportsWrite[str]])
 
 class errstate(Generic[_CallType], ContextDecorator):
     call: _CallType
@@ -3753,31 +3293,30 @@ class errstate(Generic[_CallType], ContextDecorator):
     def __enter__(self) -> None: ...
     def __exit__(
         self,
-        __exc_type: Optional[Type[BaseException]],
-        __exc_value: Optional[BaseException],
-        __traceback: Optional[TracebackType],
+        exc_type: Optional[Type[BaseException]],
+        exc_value: Optional[BaseException],
+        traceback: Optional[TracebackType],
+        /,
     ) -> None: ...
 
 class ndenumerate(Generic[_ScalarType]):
     iter: flatiter[NDArray[_ScalarType]]
     @overload
     def __new__(
-        cls, arr: _NestedSequence[_SupportsArray[dtype[_ScalarType]]],
+        cls, arr: _FiniteNestedSequence[_SupportsArray[dtype[_ScalarType]]],
     ) -> ndenumerate[_ScalarType]: ...
     @overload
-    def __new__(cls, arr: _NestedSequence[str]) -> ndenumerate[str_]: ...
-    @overload
-    def __new__(cls, arr: _NestedSequence[bytes]) -> ndenumerate[bytes_]: ...
+    def __new__(cls, arr: str | _NestedSequence[str]) -> ndenumerate[str_]: ...
     @overload
-    def __new__(cls, arr: _NestedSequence[bool]) -> ndenumerate[bool_]: ...
+    def __new__(cls, arr: bytes | _NestedSequence[bytes]) -> ndenumerate[bytes_]: ...
     @overload
-    def __new__(cls, arr: _NestedSequence[int]) -> ndenumerate[int_]: ...
+    def __new__(cls, arr: bool | _NestedSequence[bool]) -> ndenumerate[bool_]: ...
     @overload
-    def __new__(cls, arr: _NestedSequence[float]) -> ndenumerate[float_]: ...
+    def __new__(cls, arr: int | _NestedSequence[int]) -> ndenumerate[int_]: ...
     @overload
-    def __new__(cls, arr: _NestedSequence[complex]) -> ndenumerate[complex_]: ...
+    def __new__(cls, arr: float | _NestedSequence[float]) -> ndenumerate[float_]: ...
     @overload
-    def __new__(cls, arr: _RecursiveSequence) -> ndenumerate[Any]: ...
+    def __new__(cls, arr: complex | _NestedSequence[complex]) -> ndenumerate[complex_]: ...
     def __next__(self: ndenumerate[_ScalarType]) -> Tuple[_Shape, _ScalarType]: ...
     def __iter__(self: _T) -> _T: ...
 
@@ -3827,3 +3366,976 @@ class broadcast:
     def __next__(self) -> Tuple[Any, ...]: ...
     def __iter__(self: _T) -> _T: ...
     def reset(self) -> None: ...
+
+class busdaycalendar:
+    def __new__(
+        cls,
+        weekmask: ArrayLike = ...,
+        holidays: ArrayLike = ...,
+    ) -> busdaycalendar: ...
+    @property
+    def weekmask(self) -> NDArray[bool_]: ...
+    @property
+    def holidays(self) -> NDArray[datetime64]: ...
+
+class finfo(Generic[_FloatType]):
+    dtype: dtype[_FloatType]
+    bits: int
+    eps: _FloatType
+    epsneg: _FloatType
+    iexp: int
+    machep: int
+    max: _FloatType
+    maxexp: int
+    min: _FloatType
+    minexp: int
+    negep: int
+    nexp: int
+    nmant: int
+    precision: int
+    resolution: _FloatType
+    smallest_subnormal: _FloatType
+    @property
+    def smallest_normal(self) -> _FloatType: ...
+    @property
+    def tiny(self) -> _FloatType: ...
+    @overload
+    def __new__(
+        cls, dtype: inexact[_NBit1] | _DTypeLike[inexact[_NBit1]]
+    ) -> finfo[floating[_NBit1]]: ...
+    @overload
+    def __new__(
+        cls, dtype: complex | float | Type[complex] | Type[float]
+    ) -> finfo[float_]: ...
+    @overload
+    def __new__(
+        cls, dtype: str
+    ) -> finfo[floating[Any]]: ...
+
+class iinfo(Generic[_IntType]):
+    dtype: dtype[_IntType]
+    kind: str
+    bits: int
+    key: str
+    @property
+    def min(self) -> int: ...
+    @property
+    def max(self) -> int: ...
+
+    @overload
+    def __new__(cls, dtype: _IntType | _DTypeLike[_IntType]) -> iinfo[_IntType]: ...
+    @overload
+    def __new__(cls, dtype: int | Type[int]) -> iinfo[int_]: ...
+    @overload
+    def __new__(cls, dtype: str) -> iinfo[Any]: ...
+
+class format_parser:
+    dtype: dtype[void]
+    def __init__(
+        self,
+        formats: DTypeLike,
+        names: None | str | Sequence[str],
+        titles: None | str | Sequence[str],
+        aligned: bool = ...,
+        byteorder: None | _ByteOrder = ...,
+    ) -> None: ...
+
+class recarray(ndarray[_ShapeType, _DType_co]):
+    # NOTE: While not strictly mandatory, we're demanding here that arguments
+    # for the `format_parser`- and `dtype`-based dtype constructors are
+    # mutually exclusive
+    @overload
+    def __new__(
+        subtype,
+        shape: _ShapeLike,
+        dtype: None = ...,
+        buf: None | _SupportsBuffer = ...,
+        offset: SupportsIndex = ...,
+        strides: None | _ShapeLike = ...,
+        *,
+        formats: DTypeLike,
+        names: None | str | Sequence[str] = ...,
+        titles: None | str | Sequence[str] = ...,
+        byteorder: None | _ByteOrder = ...,
+        aligned: bool = ...,
+        order: _OrderKACF = ...,
+    ) -> recarray[Any, dtype[record]]: ...
+    @overload
+    def __new__(
+        subtype,
+        shape: _ShapeLike,
+        dtype: DTypeLike,
+        buf: None | _SupportsBuffer = ...,
+        offset: SupportsIndex = ...,
+        strides: None | _ShapeLike = ...,
+        formats: None = ...,
+        names: None = ...,
+        titles: None = ...,
+        byteorder: None = ...,
+        aligned: L[False] = ...,
+        order: _OrderKACF = ...,
+    ) -> recarray[Any, dtype[Any]]: ...
+    def __array_finalize__(self, obj: object) -> None: ...
+    def __getattribute__(self, attr: str) -> Any: ...
+    def __setattr__(self, attr: str, val: ArrayLike) -> None: ...
+    @overload
+    def __getitem__(self, indx: Union[
+        SupportsIndex,
+        _ArrayLikeInt_co,
+        Tuple[SupportsIndex | _ArrayLikeInt_co, ...],
+    ]) -> Any: ...
+    @overload
+    def __getitem__(self: recarray[Any, dtype[void]], indx: Union[
+        None,
+        slice,
+        ellipsis,
+        SupportsIndex,
+        _ArrayLikeInt_co,
+        Tuple[None | slice | ellipsis | _ArrayLikeInt_co | SupportsIndex, ...],
+    ]) -> recarray[Any, _DType_co]: ...
+    @overload
+    def __getitem__(self, indx: Union[
+        None,
+        slice,
+        ellipsis,
+        SupportsIndex,
+        _ArrayLikeInt_co,
+        Tuple[None | slice | ellipsis | _ArrayLikeInt_co | SupportsIndex, ...],
+    ]) -> ndarray[Any, _DType_co]: ...
+    @overload
+    def __getitem__(self, indx: str) -> NDArray[Any]: ...
+    @overload
+    def __getitem__(self, indx: list[str]) -> recarray[_ShapeType, dtype[record]]: ...
+    @overload
+    def field(self, attr: int | str, val: None = ...) -> Any: ...
+    @overload
+    def field(self, attr: int | str, val: ArrayLike) -> None: ...
+
+class record(void):
+    def __getattribute__(self, attr: str) -> Any: ...
+    def __setattr__(self, attr: str, val: ArrayLike) -> None: ...
+    def pprint(self) -> str: ...
+    @overload
+    def __getitem__(self, key: str | SupportsIndex) -> Any: ...
+    @overload
+    def __getitem__(self, key: list[str]) -> record: ...
+
+_NDIterFlagsKind = L[
+    "buffered",
+    "c_index",
+    "copy_if_overlap",
+    "common_dtype",
+    "delay_bufalloc",
+    "external_loop",
+    "f_index",
+    "grow_inner", "growinner",
+    "multi_index",
+    "ranged",
+    "refs_ok",
+    "reduce_ok",
+    "zerosize_ok",
+]
+
+_NDIterOpFlagsKind = L[
+    "aligned",
+    "allocate",
+    "arraymask",
+    "copy",
+    "config",
+    "nbo",
+    "no_subtype",
+    "no_broadcast",
+    "overlap_assume_elementwise",
+    "readonly",
+    "readwrite",
+    "updateifcopy",
+    "virtual",
+    "writeonly",
+    "writemasked"
+]
+
+@final
+class nditer:
+    def __new__(
+        cls,
+        op: ArrayLike | Sequence[ArrayLike],
+        flags: None | Sequence[_NDIterFlagsKind] = ...,
+        op_flags: None | Sequence[Sequence[_NDIterOpFlagsKind]] = ...,
+        op_dtypes: DTypeLike | Sequence[DTypeLike] = ...,
+        order: _OrderKACF = ...,
+        casting: _CastingKind = ...,
+        op_axes: None | Sequence[Sequence[SupportsIndex]] = ...,
+        itershape: None | _ShapeLike = ...,
+        buffersize: SupportsIndex = ...,
+    ) -> nditer: ...
+    def __enter__(self) -> nditer: ...
+    def __exit__(
+        self,
+        exc_type: None | Type[BaseException],
+        exc_value: None | BaseException,
+        traceback: None | TracebackType,
+    ) -> None: ...
+    def __iter__(self) -> nditer: ...
+    def __next__(self) -> Tuple[NDArray[Any], ...]: ...
+    def __len__(self) -> int: ...
+    def __copy__(self) -> nditer: ...
+    @overload
+    def __getitem__(self, index: SupportsIndex) -> NDArray[Any]: ...
+    @overload
+    def __getitem__(self, index: slice) -> Tuple[NDArray[Any], ...]: ...
+    def __setitem__(self, index: slice | SupportsIndex, value: ArrayLike) -> None: ...
+    def close(self) -> None: ...
+    def copy(self) -> nditer: ...
+    def debug_print(self) -> None: ...
+    def enable_external_loop(self) -> None: ...
+    def iternext(self) -> bool: ...
+    def remove_axis(self, i: SupportsIndex, /) -> None: ...
+    def remove_multi_index(self) -> None: ...
+    def reset(self) -> None: ...
+    @property
+    def dtypes(self) -> Tuple[dtype[Any], ...]: ...
+    @property
+    def finished(self) -> bool: ...
+    @property
+    def has_delayed_bufalloc(self) -> bool: ...
+    @property
+    def has_index(self) -> bool: ...
+    @property
+    def has_multi_index(self) -> bool: ...
+    @property
+    def index(self) -> int: ...
+    @property
+    def iterationneedsapi(self) -> bool: ...
+    @property
+    def iterindex(self) -> int: ...
+    @property
+    def iterrange(self) -> Tuple[int, ...]: ...
+    @property
+    def itersize(self) -> int: ...
+    @property
+    def itviews(self) -> Tuple[NDArray[Any], ...]: ...
+    @property
+    def multi_index(self) -> Tuple[int, ...]: ...
+    @property
+    def ndim(self) -> int: ...
+    @property
+    def nop(self) -> int: ...
+    @property
+    def operands(self) -> Tuple[NDArray[Any], ...]: ...
+    @property
+    def shape(self) -> Tuple[int, ...]: ...
+    @property
+    def value(self) -> Tuple[NDArray[Any], ...]: ...
+
+_MemMapModeKind = L[
+    "readonly", "r",
+    "copyonwrite", "c",
+    "readwrite", "r+",
+    "write", "w+",
+]
+
+class memmap(ndarray[_ShapeType, _DType_co]):
+    __array_priority__: ClassVar[float]
+    filename: str | None
+    offset: int
+    mode: str
+    @overload
+    def __new__(
+        subtype,
+        filename: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _MemMapIOProtocol,
+        dtype: Type[uint8] = ...,
+        mode: _MemMapModeKind = ...,
+        offset: int = ...,
+        shape: None | int | Tuple[int, ...] = ...,
+        order: _OrderKACF = ...,
+    ) -> memmap[Any, dtype[uint8]]: ...
+    @overload
+    def __new__(
+        subtype,
+        filename: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _MemMapIOProtocol,
+        dtype: _DTypeLike[_ScalarType],
+        mode: _MemMapModeKind = ...,
+        offset: int = ...,
+        shape: None | int | Tuple[int, ...] = ...,
+        order: _OrderKACF = ...,
+    ) -> memmap[Any, dtype[_ScalarType]]: ...
+    @overload
+    def __new__(
+        subtype,
+        filename: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _MemMapIOProtocol,
+        dtype: DTypeLike,
+        mode: _MemMapModeKind = ...,
+        offset: int = ...,
+        shape: None | int | Tuple[int, ...] = ...,
+        order: _OrderKACF = ...,
+    ) -> memmap[Any, dtype[Any]]: ...
+    def __array_finalize__(self, obj: memmap[Any, Any]) -> None: ...
+    def __array_wrap__(
+        self,
+        array: memmap[_ShapeType, _DType_co],
+        context: None | Tuple[ufunc, Tuple[Any, ...], int] = ...,
+    ) -> Any: ...
+    def flush(self) -> None: ...
+
+class vectorize:
+    pyfunc: Callable[..., Any]
+    cache: bool
+    signature: None | str
+    otypes: None | str
+    excluded: Set[int | str]
+    __doc__: None | str
+    def __init__(
+        self,
+        pyfunc: Callable[..., Any],
+        otypes: None | str | Iterable[DTypeLike] = ...,
+        doc: None | str = ...,
+        excluded: None | Iterable[int | str] = ...,
+        cache: bool = ...,
+        signature: None | str = ...,
+    ) -> None: ...
+    def __call__(self, *args: Any, **kwargs: Any) -> NDArray[Any]: ...
+
+class poly1d:
+    @property
+    def variable(self) -> str: ...
+    @property
+    def order(self) -> int: ...
+    @property
+    def o(self) -> int: ...
+    @property
+    def roots(self) -> NDArray[Any]: ...
+    @property
+    def r(self) -> NDArray[Any]: ...
+
+    @property
+    def coeffs(self) -> NDArray[Any]: ...
+    @coeffs.setter
+    def coeffs(self, value: NDArray[Any]) -> None: ...
+
+    @property
+    def c(self) -> NDArray[Any]: ...
+    @c.setter
+    def c(self, value: NDArray[Any]) -> None: ...
+
+    @property
+    def coef(self) -> NDArray[Any]: ...
+    @coef.setter
+    def coef(self, value: NDArray[Any]) -> None: ...
+
+    @property
+    def coefficients(self) -> NDArray[Any]: ...
+    @coefficients.setter
+    def coefficients(self, value: NDArray[Any]) -> None: ...
+
+    __hash__: None  # type: ignore
+
+    @overload
+    def __array__(self, t: None = ...) -> NDArray[Any]: ...
+    @overload
+    def __array__(self, t: _DType) -> ndarray[Any, _DType]: ...
+
+    @overload
+    def __call__(self, val: _ScalarLike_co) -> Any: ...
+    @overload
+    def __call__(self, val: poly1d) -> poly1d: ...
+    @overload
+    def __call__(self, val: ArrayLike) -> NDArray[Any]: ...
+
+    def __init__(
+        self,
+        c_or_r: ArrayLike,
+        r: bool = ...,
+        variable: None | str = ...,
+    ) -> None: ...
+    def __len__(self) -> int: ...
+    def __neg__(self) -> poly1d: ...
+    def __pos__(self) -> poly1d: ...
+    def __mul__(self, other: ArrayLike) -> poly1d: ...
+    def __rmul__(self, other: ArrayLike) -> poly1d: ...
+    def __add__(self, other: ArrayLike) -> poly1d: ...
+    def __radd__(self, other: ArrayLike) -> poly1d: ...
+    def __pow__(self, val: _FloatLike_co) -> poly1d: ...  # Integral floats are accepted
+    def __sub__(self, other: ArrayLike) -> poly1d: ...
+    def __rsub__(self, other: ArrayLike) -> poly1d: ...
+    def __div__(self, other: ArrayLike) -> poly1d: ...
+    def __truediv__(self, other: ArrayLike) -> poly1d: ...
+    def __rdiv__(self, other: ArrayLike) -> poly1d: ...
+    def __rtruediv__(self, other: ArrayLike) -> poly1d: ...
+    def __getitem__(self, val: int) -> Any: ...
+    def __setitem__(self, key: int, val: Any) -> None: ...
+    def __iter__(self) -> Iterator[Any]: ...
+    def deriv(self, m: SupportsInt | SupportsIndex = ...) -> poly1d: ...
+    def integ(
+        self,
+        m: SupportsInt | SupportsIndex = ...,
+        k: None | _ArrayLikeComplex_co | _ArrayLikeObject_co = ...,
+    ) -> poly1d: ...
+
+class matrix(ndarray[_ShapeType, _DType_co]):
+    __array_priority__: ClassVar[float]
+    def __new__(
+        subtype,
+        data: ArrayLike,
+        dtype: DTypeLike = ...,
+        copy: bool = ...,
+    ) -> matrix[Any, Any]: ...
+    def __array_finalize__(self, obj: NDArray[Any]) -> None: ...
+
+    @overload
+    def __getitem__(self, key: Union[
+        SupportsIndex,
+        _ArrayLikeInt_co,
+        Tuple[SupportsIndex | _ArrayLikeInt_co, ...],
+    ]) -> Any: ...
+    @overload
+    def __getitem__(self, key: Union[
+        None,
+        slice,
+        ellipsis,
+        SupportsIndex,
+        _ArrayLikeInt_co,
+        Tuple[None | slice | ellipsis | _ArrayLikeInt_co | SupportsIndex, ...],
+    ]) -> matrix[Any, _DType_co]: ...
+    @overload
+    def __getitem__(self: NDArray[void], key: str) -> matrix[Any, dtype[Any]]: ...
+    @overload
+    def __getitem__(self: NDArray[void], key: list[str]) -> matrix[_ShapeType, dtype[void]]: ...
+
+    def __mul__(self, other: ArrayLike) -> matrix[Any, Any]: ...
+    def __rmul__(self, other: ArrayLike) -> matrix[Any, Any]: ...
+    def __imul__(self, other: ArrayLike) -> matrix[_ShapeType, _DType_co]: ...
+    def __pow__(self, other: ArrayLike) -> matrix[Any, Any]: ...
+    def __ipow__(self, other: ArrayLike) -> matrix[_ShapeType, _DType_co]: ...
+
+    @overload
+    def sum(self, axis: None = ..., dtype: DTypeLike = ..., out: None = ...) -> Any: ...
+    @overload
+    def sum(self, axis: _ShapeLike, dtype: DTypeLike = ..., out: None = ...) -> matrix[Any, Any]: ...
+    @overload
+    def sum(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: ...
+
+    @overload
+    def mean(self, axis: None = ..., dtype: DTypeLike = ..., out: None = ...) -> Any: ...
+    @overload
+    def mean(self, axis: _ShapeLike, dtype: DTypeLike = ..., out: None = ...) -> matrix[Any, Any]: ...
+    @overload
+    def mean(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: ...
+
+    @overload
+    def std(self, axis: None = ..., dtype: DTypeLike = ..., out: None = ..., ddof: float = ...) -> Any: ...
+    @overload
+    def std(self, axis: _ShapeLike, dtype: DTypeLike = ..., out: None = ..., ddof: float = ...) -> matrix[Any, Any]: ...
+    @overload
+    def std(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ..., ddof: float = ...) -> _NdArraySubClass: ...
+
+    @overload
+    def var(self, axis: None = ..., dtype: DTypeLike = ..., out: None = ..., ddof: float = ...) -> Any: ...
+    @overload
+    def var(self, axis: _ShapeLike, dtype: DTypeLike = ..., out: None = ..., ddof: float = ...) -> matrix[Any, Any]: ...
+    @overload
+    def var(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ..., ddof: float = ...) -> _NdArraySubClass: ...
+
+    @overload
+    def prod(self, axis: None = ..., dtype: DTypeLike = ..., out: None = ...) -> Any: ...
+    @overload
+    def prod(self, axis: _ShapeLike, dtype: DTypeLike = ..., out: None = ...) -> matrix[Any, Any]: ...
+    @overload
+    def prod(self, axis: None | _ShapeLike = ..., dtype: DTypeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: ...
+
+    @overload
+    def any(self, axis: None = ..., out: None = ...) -> bool_: ...
+    @overload
+    def any(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, dtype[bool_]]: ...
+    @overload
+    def any(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: ...
+
+    @overload
+    def all(self, axis: None = ..., out: None = ...) -> bool_: ...
+    @overload
+    def all(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, dtype[bool_]]: ...
+    @overload
+    def all(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: ...
+
+    @overload
+    def max(self: NDArray[_ScalarType], axis: None = ..., out: None = ...) -> _ScalarType: ...
+    @overload
+    def max(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, _DType_co]: ...
+    @overload
+    def max(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: ...
+
+    @overload
+    def min(self: NDArray[_ScalarType], axis: None = ..., out: None = ...) -> _ScalarType: ...
+    @overload
+    def min(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, _DType_co]: ...
+    @overload
+    def min(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: ...
+
+    @overload
+    def argmax(self: NDArray[_ScalarType], axis: None = ..., out: None = ...) -> intp: ...
+    @overload
+    def argmax(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, dtype[intp]]: ...
+    @overload
+    def argmax(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: ...
+
+    @overload
+    def argmin(self: NDArray[_ScalarType], axis: None = ..., out: None = ...) -> intp: ...
+    @overload
+    def argmin(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, dtype[intp]]: ...
+    @overload
+    def argmin(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: ...
+
+    @overload
+    def ptp(self: NDArray[_ScalarType], axis: None = ..., out: None = ...) -> _ScalarType: ...
+    @overload
+    def ptp(self, axis: _ShapeLike, out: None = ...) -> matrix[Any, _DType_co]: ...
+    @overload
+    def ptp(self, axis: None | _ShapeLike = ..., out: _NdArraySubClass = ...) -> _NdArraySubClass: ...
+
+    def squeeze(self, axis: None | _ShapeLike = ...) -> matrix[Any, _DType_co]: ...
+    def tolist(self: matrix[Any, dtype[_SupportsItem[_T]]]) -> List[List[_T]]: ...  # type: ignore[typevar]
+    def ravel(self, order: _OrderKACF = ...) -> matrix[Any, _DType_co]: ...
+    def flatten(self, order: _OrderKACF = ...) -> matrix[Any, _DType_co]: ...
+
+    @property
+    def T(self) -> matrix[Any, _DType_co]: ...
+    @property
+    def I(self) -> matrix[Any, Any]: ...
+    @property
+    def A(self) -> ndarray[_ShapeType, _DType_co]: ...
+    @property
+    def A1(self) -> ndarray[Any, _DType_co]: ...
+    @property
+    def H(self) -> matrix[Any, _DType_co]: ...
+    def getT(self) -> matrix[Any, _DType_co]: ...
+    def getI(self) -> matrix[Any, Any]: ...
+    def getA(self) -> ndarray[_ShapeType, _DType_co]: ...
+    def getA1(self) -> ndarray[Any, _DType_co]: ...
+    def getH(self) -> matrix[Any, _DType_co]: ...
+
+_CharType = TypeVar("_CharType", str_, bytes_)
+_CharDType = TypeVar("_CharDType", dtype[str_], dtype[bytes_])
+_CharArray = chararray[Any, dtype[_CharType]]
+
+class chararray(ndarray[_ShapeType, _CharDType]):
+    @overload
+    def __new__(
+        subtype,
+        shape: _ShapeLike,
+        itemsize: SupportsIndex | SupportsInt = ...,
+        unicode: L[False] = ...,
+        buffer: _SupportsBuffer = ...,
+        offset: SupportsIndex = ...,
+        strides: _ShapeLike = ...,
+        order: _OrderKACF = ...,
+    ) -> chararray[Any, dtype[bytes_]]: ...
+    @overload
+    def __new__(
+        subtype,
+        shape: _ShapeLike,
+        itemsize: SupportsIndex | SupportsInt = ...,
+        unicode: L[True] = ...,
+        buffer: _SupportsBuffer = ...,
+        offset: SupportsIndex = ...,
+        strides: _ShapeLike = ...,
+        order: _OrderKACF = ...,
+    ) -> chararray[Any, dtype[str_]]: ...
+
+    def __array_finalize__(self, obj: NDArray[str_ | bytes_]) -> None: ...
+    def __mul__(self, other: _ArrayLikeInt_co) -> chararray[Any, _CharDType]: ...
+    def __rmul__(self, other: _ArrayLikeInt_co) -> chararray[Any, _CharDType]: ...
+    def __mod__(self, i: Any) -> chararray[Any, _CharDType]: ...
+
+    @overload
+    def __eq__(
+        self: _CharArray[str_],
+        other: _ArrayLikeStr_co,
+    ) -> NDArray[bool_]: ...
+    @overload
+    def __eq__(
+        self: _CharArray[bytes_],
+        other: _ArrayLikeBytes_co,
+    ) -> NDArray[bool_]: ...
+
+    @overload
+    def __ne__(
+        self: _CharArray[str_],
+        other: _ArrayLikeStr_co,
+    ) -> NDArray[bool_]: ...
+    @overload
+    def __ne__(
+        self: _CharArray[bytes_],
+        other: _ArrayLikeBytes_co,
+    ) -> NDArray[bool_]: ...
+
+    @overload
+    def __ge__(
+        self: _CharArray[str_],
+        other: _ArrayLikeStr_co,
+    ) -> NDArray[bool_]: ...
+    @overload
+    def __ge__(
+        self: _CharArray[bytes_],
+        other: _ArrayLikeBytes_co,
+    ) -> NDArray[bool_]: ...
+
+    @overload
+    def __le__(
+        self: _CharArray[str_],
+        other: _ArrayLikeStr_co,
+    ) -> NDArray[bool_]: ...
+    @overload
+    def __le__(
+        self: _CharArray[bytes_],
+        other: _ArrayLikeBytes_co,
+    ) -> NDArray[bool_]: ...
+
+    @overload
+    def __gt__(
+        self: _CharArray[str_],
+        other: _ArrayLikeStr_co,
+    ) -> NDArray[bool_]: ...
+    @overload
+    def __gt__(
+        self: _CharArray[bytes_],
+        other: _ArrayLikeBytes_co,
+    ) -> NDArray[bool_]: ...
+
+    @overload
+    def __lt__(
+        self: _CharArray[str_],
+        other: _ArrayLikeStr_co,
+    ) -> NDArray[bool_]: ...
+    @overload
+    def __lt__(
+        self: _CharArray[bytes_],
+        other: _ArrayLikeBytes_co,
+    ) -> NDArray[bool_]: ...
+
+    @overload
+    def __add__(
+        self: _CharArray[str_],
+        other: _ArrayLikeStr_co,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def __add__(
+        self: _CharArray[bytes_],
+        other: _ArrayLikeBytes_co,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def __radd__(
+        self: _CharArray[str_],
+        other: _ArrayLikeStr_co,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def __radd__(
+        self: _CharArray[bytes_],
+        other: _ArrayLikeBytes_co,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def center(
+        self: _CharArray[str_],
+        width: _ArrayLikeInt_co,
+        fillchar: _ArrayLikeStr_co = ...,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def center(
+        self: _CharArray[bytes_],
+        width: _ArrayLikeInt_co,
+        fillchar: _ArrayLikeBytes_co = ...,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def count(
+        self: _CharArray[str_],
+        sub: _ArrayLikeStr_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[int_]: ...
+    @overload
+    def count(
+        self: _CharArray[bytes_],
+        sub: _ArrayLikeBytes_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[int_]: ...
+
+    def decode(
+        self: _CharArray[bytes_],
+        encoding: None | str = ...,
+        errors: None | str = ...,
+    ) -> _CharArray[str_]: ...
+
+    def encode(
+        self: _CharArray[str_],
+        encoding: None | str = ...,
+        errors: None | str = ...,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def endswith(
+        self: _CharArray[str_],
+        suffix: _ArrayLikeStr_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[bool_]: ...
+    @overload
+    def endswith(
+        self: _CharArray[bytes_],
+        suffix: _ArrayLikeBytes_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[bool_]: ...
+
+    def expandtabs(
+        self,
+        tabsize: _ArrayLikeInt_co = ...,
+    ) -> chararray[Any, _CharDType]: ...
+
+    @overload
+    def find(
+        self: _CharArray[str_],
+        sub: _ArrayLikeStr_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[int_]: ...
+    @overload
+    def find(
+        self: _CharArray[bytes_],
+        sub: _ArrayLikeBytes_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[int_]: ...
+
+    @overload
+    def index(
+        self: _CharArray[str_],
+        sub: _ArrayLikeStr_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[int_]: ...
+    @overload
+    def index(
+        self: _CharArray[bytes_],
+        sub: _ArrayLikeBytes_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[int_]: ...
+
+    @overload
+    def join(
+        self: _CharArray[str_],
+        seq: _ArrayLikeStr_co,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def join(
+        self: _CharArray[bytes_],
+        seq: _ArrayLikeBytes_co,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def ljust(
+        self: _CharArray[str_],
+        width: _ArrayLikeInt_co,
+        fillchar: _ArrayLikeStr_co = ...,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def ljust(
+        self: _CharArray[bytes_],
+        width: _ArrayLikeInt_co,
+        fillchar: _ArrayLikeBytes_co = ...,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def lstrip(
+        self: _CharArray[str_],
+        chars: None | _ArrayLikeStr_co = ...,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def lstrip(
+        self: _CharArray[bytes_],
+        chars: None | _ArrayLikeBytes_co = ...,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def partition(
+        self: _CharArray[str_],
+        sep: _ArrayLikeStr_co,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def partition(
+        self: _CharArray[bytes_],
+        sep: _ArrayLikeBytes_co,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def replace(
+        self: _CharArray[str_],
+        old: _ArrayLikeStr_co,
+        new: _ArrayLikeStr_co,
+        count: None | _ArrayLikeInt_co = ...,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def replace(
+        self: _CharArray[bytes_],
+        old: _ArrayLikeBytes_co,
+        new: _ArrayLikeBytes_co,
+        count: None | _ArrayLikeInt_co = ...,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def rfind(
+        self: _CharArray[str_],
+        sub: _ArrayLikeStr_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[int_]: ...
+    @overload
+    def rfind(
+        self: _CharArray[bytes_],
+        sub: _ArrayLikeBytes_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[int_]: ...
+
+    @overload
+    def rindex(
+        self: _CharArray[str_],
+        sub: _ArrayLikeStr_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[int_]: ...
+    @overload
+    def rindex(
+        self: _CharArray[bytes_],
+        sub: _ArrayLikeBytes_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[int_]: ...
+
+    @overload
+    def rjust(
+        self: _CharArray[str_],
+        width: _ArrayLikeInt_co,
+        fillchar: _ArrayLikeStr_co = ...,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def rjust(
+        self: _CharArray[bytes_],
+        width: _ArrayLikeInt_co,
+        fillchar: _ArrayLikeBytes_co = ...,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def rpartition(
+        self: _CharArray[str_],
+        sep: _ArrayLikeStr_co,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def rpartition(
+        self: _CharArray[bytes_],
+        sep: _ArrayLikeBytes_co,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def rsplit(
+        self: _CharArray[str_],
+        sep: None | _ArrayLikeStr_co = ...,
+        maxsplit: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[object_]: ...
+    @overload
+    def rsplit(
+        self: _CharArray[bytes_],
+        sep: None | _ArrayLikeBytes_co = ...,
+        maxsplit: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[object_]: ...
+
+    @overload
+    def rstrip(
+        self: _CharArray[str_],
+        chars: None | _ArrayLikeStr_co = ...,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def rstrip(
+        self: _CharArray[bytes_],
+        chars: None | _ArrayLikeBytes_co = ...,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def split(
+        self: _CharArray[str_],
+        sep: None | _ArrayLikeStr_co = ...,
+        maxsplit: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[object_]: ...
+    @overload
+    def split(
+        self: _CharArray[bytes_],
+        sep: None | _ArrayLikeBytes_co = ...,
+        maxsplit: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[object_]: ...
+
+    def splitlines(self, keepends: None | _ArrayLikeBool_co = ...) -> NDArray[object_]: ...
+
+    @overload
+    def startswith(
+        self: _CharArray[str_],
+        prefix: _ArrayLikeStr_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[bool_]: ...
+    @overload
+    def startswith(
+        self: _CharArray[bytes_],
+        prefix: _ArrayLikeBytes_co,
+        start: _ArrayLikeInt_co = ...,
+        end: None | _ArrayLikeInt_co = ...,
+    ) -> NDArray[bool_]: ...
+
+    @overload
+    def strip(
+        self: _CharArray[str_],
+        chars: None | _ArrayLikeStr_co = ...,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def strip(
+        self: _CharArray[bytes_],
+        chars: None | _ArrayLikeBytes_co = ...,
+    ) -> _CharArray[bytes_]: ...
+
+    @overload
+    def translate(
+        self: _CharArray[str_],
+        table: _ArrayLikeStr_co,
+        deletechars: None | _ArrayLikeStr_co = ...,
+    ) -> _CharArray[str_]: ...
+    @overload
+    def translate(
+        self: _CharArray[bytes_],
+        table: _ArrayLikeBytes_co,
+        deletechars: None | _ArrayLikeBytes_co = ...,
+    ) -> _CharArray[bytes_]: ...
+
+    def zfill(self, width: _ArrayLikeInt_co) -> chararray[Any, _CharDType]: ...
+    def capitalize(self) -> chararray[_ShapeType, _CharDType]: ...
+    def title(self) -> chararray[_ShapeType, _CharDType]: ...
+    def swapcase(self) -> chararray[_ShapeType, _CharDType]: ...
+    def lower(self) -> chararray[_ShapeType, _CharDType]: ...
+    def upper(self) -> chararray[_ShapeType, _CharDType]: ...
+    def isalnum(self) -> ndarray[_ShapeType, dtype[bool_]]: ...
+    def isalpha(self) -> ndarray[_ShapeType, dtype[bool_]]: ...
+    def isdigit(self) -> ndarray[_ShapeType, dtype[bool_]]: ...
+    def islower(self) -> ndarray[_ShapeType, dtype[bool_]]: ...
+    def isspace(self) -> ndarray[_ShapeType, dtype[bool_]]: ...
+    def istitle(self) -> ndarray[_ShapeType, dtype[bool_]]: ...
+    def isupper(self) -> ndarray[_ShapeType, dtype[bool_]]: ...
+    def isnumeric(self) -> ndarray[_ShapeType, dtype[bool_]]: ...
+    def isdecimal(self) -> ndarray[_ShapeType, dtype[bool_]]: ...
+
+# NOTE: Deprecated
+# class MachAr: ...
+
+class _SupportsDLPack(Protocol[_T_contra]):
+    def __dlpack__(self, *, stream: None | _T_contra = ...) -> _PyCapsule: ...
+
+def _from_dlpack(__obj: _SupportsDLPack[None]) -> NDArray[Any]: ...
index 0b715c8708700fc992329c251812993012a9728d..c888747258c77008fde5c6cef261702890ab8cfe 100644 (file)
@@ -15,8 +15,11 @@ That was not the case when the singleton classes were defined in the numpy
 motivated this module.
 
 """
+import enum
+
 __ALL__ = [
-    'ModuleDeprecationWarning', 'VisibleDeprecationWarning', '_NoValue'
+    'ModuleDeprecationWarning', 'VisibleDeprecationWarning',
+    '_NoValue', '_CopyMode'
     ]
 
 
@@ -89,3 +92,38 @@ class _NoValueType:
 
 
 _NoValue = _NoValueType()
+
+
+class _CopyMode(enum.Enum):
+    """
+    An enumeration for the copy modes supported
+    by numpy.copy() and numpy.array(). The following three modes are supported,
+
+    - ALWAYS: This means that a deep copy of the input
+              array will always be taken.
+    - IF_NEEDED: This means that a deep copy of the input
+                 array will be taken only if necessary.
+    - NEVER: This means that the deep copy will never be taken.
+             If a copy cannot be avoided then a `ValueError` will be
+             raised.
+
+    Note that the buffer-protocol could in theory do copies.  NumPy currently
+    assumes an object exporting the buffer protocol will never do this.
+    """
+
+    ALWAYS = True
+    IF_NEEDED = False
+    NEVER = 2
+
+    def __bool__(self):
+        # For backwards compatiblity
+        if self == _CopyMode.ALWAYS:
+            return True
+
+        if self == _CopyMode.IF_NEEDED:
+            return False
+
+        raise ValueError(f"{self} is neither True nor False.")
+
+
+_CopyMode.__module__ = 'numpy'
index acfaa1ca54a15a9c963ea0308048fa5d8af49f9d..8decb9dd79a1c54092c30d43a70690ef5aa07c85 100644 (file)
@@ -137,13 +137,20 @@ class PytestTester:
         # offset verbosity. The "-q" cancels a "-v".
         pytest_args += ["-q"]
 
-        # Filter out distutils cpu warnings (could be localized to
-        # distutils tests). ASV has problems with top level import,
-        # so fetch module for suppression here.
         with warnings.catch_warnings():
             warnings.simplefilter("always")
+            # Filter out distutils cpu warnings (could be localized to
+            # distutils tests). ASV has problems with top level import,
+            # so fetch module for suppression here.
             from numpy.distutils import cpuinfo
 
+        with warnings.catch_warnings(record=True):
+            # Ignore the warning from importing the array_api submodule. This
+            # warning is done on import, so it would break pytest collection,
+            # but importing it early here prevents the warning from being
+            # issued when it imported again.
+            import numpy.array_api
+
         # Filter out annoying import messages. Want these in both develop and
         # release mode.
         pytest_args += [
diff --git a/numpy/_pytesttester.pyi b/numpy/_pytesttester.pyi
new file mode 100644 (file)
index 0000000..0be64b3
--- /dev/null
@@ -0,0 +1,17 @@
+from typing import List, Iterable, Literal as L
+
+__all__: List[str]
+
+class PytestTester:
+    module_name: str
+    def __init__(self, module_name: str) -> None: ...
+    def __call__(
+        self,
+        label: L["fast", "full"] = ...,
+        verbose: int = ...,
+        extra_argv: None | Iterable[str] = ...,
+        doctests: L[False] = ...,
+        coverage: bool = ...,
+        durations: int = ...,
+        tests: None | Iterable[str] = ...,
+    ) -> bool: ...
index 755c992f98c6b85213bf11f71ccd92760906bbad..1f442cce2b2dbba4cc3eb7f1913ae029471fd912 100644 (file)
@@ -8,11 +8,11 @@ import json
 
 version_json = '''
 {
- "date": "2022-04-11T17:43:10-0600",
+ "date": "2021-12-30T14:37:35-0700",
  "dirty": false,
  "error": null,
- "full-revisionid": "ef0ec786fd4c7622ad2fa0e54d3881f3b9bbd792",
- "version": "1.21.6"
+ "full-revisionid": "4adc87dff15a247e417d50f10cc4def8e1c17a03",
+ "version": "1.22.0"
 }
 '''  # END VERSION_JSON
 
diff --git a/numpy/array_api/__init__.py b/numpy/array_api/__init__.py
new file mode 100644 (file)
index 0000000..bbe2fdc
--- /dev/null
@@ -0,0 +1,375 @@
+"""
+A NumPy sub-namespace that conforms to the Python array API standard.
+
+This submodule accompanies NEP 47, which proposes its inclusion in NumPy. It
+is still considered experimental, and will issue a warning when imported.
+
+This is a proof-of-concept namespace that wraps the corresponding NumPy
+functions to give a conforming implementation of the Python array API standard
+(https://data-apis.github.io/array-api/latest/). The standard is currently in
+an RFC phase and comments on it are both welcome and encouraged. Comments
+should be made either at https://github.com/data-apis/array-api or at
+https://github.com/data-apis/consortium-feedback/discussions.
+
+NumPy already follows the proposed spec for the most part, so this module
+serves mostly as a thin wrapper around it. However, NumPy also implements a
+lot of behavior that is not included in the spec, so this serves as a
+restricted subset of the API. Only those functions that are part of the spec
+are included in this namespace, and all functions are given with the exact
+signature given in the spec, including the use of position-only arguments, and
+omitting any extra keyword arguments implemented by NumPy but not part of the
+spec. The behavior of some functions is also modified from the NumPy behavior
+to conform to the standard. Note that the underlying array object itself is
+wrapped in a wrapper Array() class, but is otherwise unchanged. This submodule
+is implemented in pure Python with no C extensions.
+
+The array API spec is designed as a "minimal API subset" and explicitly allows
+libraries to include behaviors not specified by it. But users of this module
+that intend to write portable code should be aware that only those behaviors
+that are listed in the spec are guaranteed to be implemented across libraries.
+Consequently, the NumPy implementation was chosen to be both conforming and
+minimal, so that users can use this implementation of the array API namespace
+and be sure that behaviors that it defines will be available in conforming
+namespaces from other libraries.
+
+A few notes about the current state of this submodule:
+
+- There is a test suite that tests modules against the array API standard at
+  https://github.com/data-apis/array-api-tests. The test suite is still a work
+  in progress, but the existing tests pass on this module, with a few
+  exceptions:
+
+  - DLPack support (see https://github.com/data-apis/array-api/pull/106) is
+    not included here, as it requires a full implementation in NumPy proper
+    first.
+
+  The test suite is not yet complete, and even the tests that exist are not
+  guaranteed to give a comprehensive coverage of the spec. Therefore, when
+  reviewing and using this submodule, you should refer to the standard
+  documents themselves. There are some tests in numpy.array_api.tests, but
+  they primarily focus on things that are not tested by the official array API
+  test suite.
+
+- There is a custom array object, numpy.array_api.Array, which is returned by
+  all functions in this module. All functions in the array API namespace
+  implicitly assume that they will only receive this object as input. The only
+  way to create instances of this object is to use one of the array creation
+  functions. It does not have a public constructor on the object itself. The
+  object is a small wrapper class around numpy.ndarray. The main purpose of it
+  is to restrict the namespace of the array object to only those dtypes and
+  only those methods that are required by the spec, as well as to limit/change
+  certain behavior that differs in the spec. In particular:
+
+  - The array API namespace does not have scalar objects, only 0-D arrays.
+    Operations on Array that would create a scalar in NumPy create a 0-D
+    array.
+
+  - Indexing: Only a subset of indices supported by NumPy are required by the
+    spec. The Array object restricts indexing to only allow those types of
+    indices that are required by the spec. See the docstring of the
+    numpy.array_api.Array._validate_indices helper function for more
+    information.
+
+  - Type promotion: Some type promotion rules are different in the spec. In
+    particular, the spec does not have any value-based casting. The spec also
+    does not require cross-kind casting, like integer -> floating-point. Only
+    those promotions that are explicitly required by the array API
+    specification are allowed in this module. See NEP 47 for more info.
+
+  - Functions do not automatically call asarray() on their input, and will not
+    work if the input type is not Array. The exception is array creation
+    functions, and Python operators on the Array object, which accept Python
+    scalars of the same type as the array dtype.
+
+- All functions include type annotations, corresponding to those given in the
+  spec (see _typing.py for definitions of some custom types). These do not
+  currently fully pass mypy due to some limitations in mypy.
+
+- Dtype objects are just the NumPy dtype objects, e.g., float64 =
+  np.dtype('float64'). The spec does not require any behavior on these dtype
+  objects other than that they be accessible by name and be comparable by
+  equality, but it was considered too much extra complexity to create custom
+  objects to represent dtypes.
+
+- All places where the implementations in this submodule are known to deviate
+  from their corresponding functions in NumPy are marked with "# Note:"
+  comments.
+
+Still TODO in this module are:
+
+- DLPack support for numpy.ndarray is still in progress. See
+  https://github.com/numpy/numpy/pull/19083.
+
+- The copy=False keyword argument to asarray() is not yet implemented. This
+  requires support in numpy.asarray() first.
+
+- Some functions are not yet fully tested in the array API test suite, and may
+  require updates that are not yet known until the tests are written.
+
+- The spec is still in an RFC phase and may still have minor updates, which
+  will need to be reflected here.
+
+- Complex number support in array API spec is planned but not yet finalized,
+  as are the fft extension and certain linear algebra functions such as eig
+  that require complex dtypes.
+
+"""
+
+import warnings
+
+warnings.warn(
+    "The numpy.array_api submodule is still experimental. See NEP 47.", stacklevel=2
+)
+
+__all__ = []
+
+from ._constants import e, inf, nan, pi
+
+__all__ += ["e", "inf", "nan", "pi"]
+
+from ._creation_functions import (
+    asarray,
+    arange,
+    empty,
+    empty_like,
+    eye,
+    from_dlpack,
+    full,
+    full_like,
+    linspace,
+    meshgrid,
+    ones,
+    ones_like,
+    tril,
+    triu,
+    zeros,
+    zeros_like,
+)
+
+__all__ += [
+    "asarray",
+    "arange",
+    "empty",
+    "empty_like",
+    "eye",
+    "from_dlpack",
+    "full",
+    "full_like",
+    "linspace",
+    "meshgrid",
+    "ones",
+    "ones_like",
+    "tril",
+    "triu",
+    "zeros",
+    "zeros_like",
+]
+
+from ._data_type_functions import (
+    astype,
+    broadcast_arrays,
+    broadcast_to,
+    can_cast,
+    finfo,
+    iinfo,
+    result_type,
+)
+
+__all__ += [
+    "astype",
+    "broadcast_arrays",
+    "broadcast_to",
+    "can_cast",
+    "finfo",
+    "iinfo",
+    "result_type",
+]
+
+from ._dtypes import (
+    int8,
+    int16,
+    int32,
+    int64,
+    uint8,
+    uint16,
+    uint32,
+    uint64,
+    float32,
+    float64,
+    bool,
+)
+
+__all__ += [
+    "int8",
+    "int16",
+    "int32",
+    "int64",
+    "uint8",
+    "uint16",
+    "uint32",
+    "uint64",
+    "float32",
+    "float64",
+    "bool",
+]
+
+from ._elementwise_functions import (
+    abs,
+    acos,
+    acosh,
+    add,
+    asin,
+    asinh,
+    atan,
+    atan2,
+    atanh,
+    bitwise_and,
+    bitwise_left_shift,
+    bitwise_invert,
+    bitwise_or,
+    bitwise_right_shift,
+    bitwise_xor,
+    ceil,
+    cos,
+    cosh,
+    divide,
+    equal,
+    exp,
+    expm1,
+    floor,
+    floor_divide,
+    greater,
+    greater_equal,
+    isfinite,
+    isinf,
+    isnan,
+    less,
+    less_equal,
+    log,
+    log1p,
+    log2,
+    log10,
+    logaddexp,
+    logical_and,
+    logical_not,
+    logical_or,
+    logical_xor,
+    multiply,
+    negative,
+    not_equal,
+    positive,
+    pow,
+    remainder,
+    round,
+    sign,
+    sin,
+    sinh,
+    square,
+    sqrt,
+    subtract,
+    tan,
+    tanh,
+    trunc,
+)
+
+__all__ += [
+    "abs",
+    "acos",
+    "acosh",
+    "add",
+    "asin",
+    "asinh",
+    "atan",
+    "atan2",
+    "atanh",
+    "bitwise_and",
+    "bitwise_left_shift",
+    "bitwise_invert",
+    "bitwise_or",
+    "bitwise_right_shift",
+    "bitwise_xor",
+    "ceil",
+    "cos",
+    "cosh",
+    "divide",
+    "equal",
+    "exp",
+    "expm1",
+    "floor",
+    "floor_divide",
+    "greater",
+    "greater_equal",
+    "isfinite",
+    "isinf",
+    "isnan",
+    "less",
+    "less_equal",
+    "log",
+    "log1p",
+    "log2",
+    "log10",
+    "logaddexp",
+    "logical_and",
+    "logical_not",
+    "logical_or",
+    "logical_xor",
+    "multiply",
+    "negative",
+    "not_equal",
+    "positive",
+    "pow",
+    "remainder",
+    "round",
+    "sign",
+    "sin",
+    "sinh",
+    "square",
+    "sqrt",
+    "subtract",
+    "tan",
+    "tanh",
+    "trunc",
+]
+
+# linalg is an extension in the array API spec, which is a sub-namespace. Only
+# a subset of functions in it are imported into the top-level namespace.
+from . import linalg
+
+__all__ += ["linalg"]
+
+from .linalg import matmul, tensordot, matrix_transpose, vecdot
+
+__all__ += ["matmul", "tensordot", "matrix_transpose", "vecdot"]
+
+from ._manipulation_functions import (
+    concat,
+    expand_dims,
+    flip,
+    permute_dims,
+    reshape,
+    roll,
+    squeeze,
+    stack,
+)
+
+__all__ += ["concat", "expand_dims", "flip", "permute_dims", "reshape", "roll", "squeeze", "stack"]
+
+from ._searching_functions import argmax, argmin, nonzero, where
+
+__all__ += ["argmax", "argmin", "nonzero", "where"]
+
+from ._set_functions import unique_all, unique_counts, unique_inverse, unique_values
+
+__all__ += ["unique_all", "unique_counts", "unique_inverse", "unique_values"]
+
+from ._sorting_functions import argsort, sort
+
+__all__ += ["argsort", "sort"]
+
+from ._statistical_functions import max, mean, min, prod, std, sum, var
+
+__all__ += ["max", "mean", "min", "prod", "std", "sum", "var"]
+
+from ._utility_functions import all, any
+
+__all__ += ["all", "any"]
diff --git a/numpy/array_api/_array_object.py b/numpy/array_api/_array_object.py
new file mode 100644 (file)
index 0000000..75baf34
--- /dev/null
@@ -0,0 +1,1087 @@
+"""
+Wrapper class around the ndarray object for the array API standard.
+
+The array API standard defines some behaviors differently than ndarray, in
+particular, type promotion rules are different (the standard has no
+value-based casting). The standard also specifies a more limited subset of
+array methods and functionalities than are implemented on ndarray. Since the
+goal of the array_api namespace is to be a minimal implementation of the array
+API standard, we need to define a separate wrapper class for the array_api
+namespace.
+
+The standard compliant class is only a wrapper class. It is *not* a subclass
+of ndarray.
+"""
+
+from __future__ import annotations
+
+import operator
+from enum import IntEnum
+from ._creation_functions import asarray
+from ._dtypes import (
+    _all_dtypes,
+    _boolean_dtypes,
+    _integer_dtypes,
+    _integer_or_boolean_dtypes,
+    _floating_dtypes,
+    _numeric_dtypes,
+    _result_type,
+    _dtype_categories,
+)
+
+from typing import TYPE_CHECKING, Optional, Tuple, Union, Any
+
+if TYPE_CHECKING:
+    from ._typing import Any, PyCapsule, Device, Dtype
+    import numpy.typing as npt
+
+import numpy as np
+
+from numpy import array_api
+
+
+class Array:
+    """
+    n-d array object for the array API namespace.
+
+    See the docstring of :py:obj:`np.ndarray <numpy.ndarray>` for more
+    information.
+
+    This is a wrapper around numpy.ndarray that restricts the usage to only
+    those things that are required by the array API namespace. Note,
+    attributes on this object that start with a single underscore are not part
+    of the API specification and should only be used internally. This object
+    should not be constructed directly. Rather, use one of the creation
+    functions, such as asarray().
+
+    """
+
+    # Use a custom constructor instead of __init__, as manually initializing
+    # this class is not supported API.
+    @classmethod
+    def _new(cls, x, /):
+        """
+        This is a private method for initializing the array API Array
+        object.
+
+        Functions outside of the array_api submodule should not use this
+        method. Use one of the creation functions instead, such as
+        ``asarray``.
+
+        """
+        obj = super().__new__(cls)
+        # Note: The spec does not have array scalars, only 0-D arrays.
+        if isinstance(x, np.generic):
+            # Convert the array scalar to a 0-D array
+            x = np.asarray(x)
+        if x.dtype not in _all_dtypes:
+            raise TypeError(
+                f"The array_api namespace does not support the dtype '{x.dtype}'"
+            )
+        obj._array = x
+        return obj
+
+    # Prevent Array() from working
+    def __new__(cls, *args, **kwargs):
+        raise TypeError(
+            "The array_api Array object should not be instantiated directly. Use an array creation function, such as asarray(), instead."
+        )
+
+    # These functions are not required by the spec, but are implemented for
+    # the sake of usability.
+
+    def __str__(self: Array, /) -> str:
+        """
+        Performs the operation __str__.
+        """
+        return self._array.__str__().replace("array", "Array")
+
+    def __repr__(self: Array, /) -> str:
+        """
+        Performs the operation __repr__.
+        """
+        suffix = f", dtype={self.dtype.name})"
+        if 0 in self.shape:
+            prefix = "empty("
+            mid = str(self.shape)
+        else:
+            prefix = "Array("
+            mid = np.array2string(self._array, separator=', ', prefix=prefix, suffix=suffix)
+        return prefix + mid + suffix
+
+    # This function is not required by the spec, but we implement it here for
+    # convenience so that np.asarray(np.array_api.Array) will work.
+    def __array__(self, dtype: None | np.dtype[Any] = None) -> npt.NDArray[Any]:
+        """
+        Warning: this method is NOT part of the array API spec. Implementers
+        of other libraries need not include it, and users should not assume it
+        will be present in other implementations.
+
+        """
+        return np.asarray(self._array, dtype=dtype)
+
+    # These are various helper functions to make the array behavior match the
+    # spec in places where it either deviates from or is more strict than
+    # NumPy behavior
+
+    def _check_allowed_dtypes(self, other, dtype_category, op):
+        """
+        Helper function for operators to only allow specific input dtypes
+
+        Use like
+
+            other = self._check_allowed_dtypes(other, 'numeric', '__add__')
+            if other is NotImplemented:
+                return other
+        """
+
+        if self.dtype not in _dtype_categories[dtype_category]:
+            raise TypeError(f"Only {dtype_category} dtypes are allowed in {op}")
+        if isinstance(other, (int, float, bool)):
+            other = self._promote_scalar(other)
+        elif isinstance(other, Array):
+            if other.dtype not in _dtype_categories[dtype_category]:
+                raise TypeError(f"Only {dtype_category} dtypes are allowed in {op}")
+        else:
+            return NotImplemented
+
+        # This will raise TypeError for type combinations that are not allowed
+        # to promote in the spec (even if the NumPy array operator would
+        # promote them).
+        res_dtype = _result_type(self.dtype, other.dtype)
+        if op.startswith("__i"):
+            # Note: NumPy will allow in-place operators in some cases where
+            # the type promoted operator does not match the left-hand side
+            # operand. For example,
+
+            # >>> a = np.array(1, dtype=np.int8)
+            # >>> a += np.array(1, dtype=np.int16)
+
+            # The spec explicitly disallows this.
+            if res_dtype != self.dtype:
+                raise TypeError(
+                    f"Cannot perform {op} with dtypes {self.dtype} and {other.dtype}"
+                )
+
+        return other
+
+    # Helper function to match the type promotion rules in the spec
+    def _promote_scalar(self, scalar):
+        """
+        Returns a promoted version of a Python scalar appropriate for use with
+        operations on self.
+
+        This may raise an OverflowError in cases where the scalar is an
+        integer that is too large to fit in a NumPy integer dtype, or
+        TypeError when the scalar type is incompatible with the dtype of self.
+        """
+        if isinstance(scalar, bool):
+            if self.dtype not in _boolean_dtypes:
+                raise TypeError(
+                    "Python bool scalars can only be promoted with bool arrays"
+                )
+        elif isinstance(scalar, int):
+            if self.dtype in _boolean_dtypes:
+                raise TypeError(
+                    "Python int scalars cannot be promoted with bool arrays"
+                )
+        elif isinstance(scalar, float):
+            if self.dtype not in _floating_dtypes:
+                raise TypeError(
+                    "Python float scalars can only be promoted with floating-point arrays."
+                )
+        else:
+            raise TypeError("'scalar' must be a Python scalar")
+
+        # Note: the spec only specifies integer-dtype/int promotion
+        # behavior for integers within the bounds of the integer dtype.
+        # Outside of those bounds we use the default NumPy behavior (either
+        # cast or raise OverflowError).
+        return Array._new(np.array(scalar, self.dtype))
+
+    @staticmethod
+    def _normalize_two_args(x1, x2):
+        """
+        Normalize inputs to two arg functions to fix type promotion rules
+
+        NumPy deviates from the spec type promotion rules in cases where one
+        argument is 0-dimensional and the other is not. For example:
+
+        >>> import numpy as np
+        >>> a = np.array([1.0], dtype=np.float32)
+        >>> b = np.array(1.0, dtype=np.float64)
+        >>> np.add(a, b) # The spec says this should be float64
+        array([2.], dtype=float32)
+
+        To fix this, we add a dimension to the 0-dimension array before passing it
+        through. This works because a dimension would be added anyway from
+        broadcasting, so the resulting shape is the same, but this prevents NumPy
+        from not promoting the dtype.
+        """
+        # Another option would be to use signature=(x1.dtype, x2.dtype, None),
+        # but that only works for ufuncs, so we would have to call the ufuncs
+        # directly in the operator methods. One should also note that this
+        # sort of trick wouldn't work for functions like searchsorted, which
+        # don't do normal broadcasting, but there aren't any functions like
+        # that in the array API namespace.
+        if x1.ndim == 0 and x2.ndim != 0:
+            # The _array[None] workaround was chosen because it is relatively
+            # performant. broadcast_to(x1._array, x2.shape) is much slower. We
+            # could also manually type promote x2, but that is more complicated
+            # and about the same performance as this.
+            x1 = Array._new(x1._array[None])
+        elif x2.ndim == 0 and x1.ndim != 0:
+            x2 = Array._new(x2._array[None])
+        return (x1, x2)
+
+    # Note: A large fraction of allowed indices are disallowed here (see the
+    # docstring below)
+    @staticmethod
+    def _validate_index(key, shape):
+        """
+        Validate an index according to the array API.
+
+        The array API specification only requires a subset of indices that are
+        supported by NumPy. This function will reject any index that is
+        allowed by NumPy but not required by the array API specification. We
+        always raise ``IndexError`` on such indices (the spec does not require
+        any specific behavior on them, but this makes the NumPy array API
+        namespace a minimal implementation of the spec). See
+        https://data-apis.org/array-api/latest/API_specification/indexing.html
+        for the full list of required indexing behavior
+
+        This function either raises IndexError if the index ``key`` is
+        invalid, or a new key to be used in place of ``key`` in indexing. It
+        only raises ``IndexError`` on indices that are not already rejected by
+        NumPy, as NumPy will already raise the appropriate error on such
+        indices. ``shape`` may be None, in which case, only cases that are
+        independent of the array shape are checked.
+
+        The following cases are allowed by NumPy, but not specified by the array
+        API specification:
+
+        - Indices to not include an implicit ellipsis at the end. That is,
+          every axis of an array must be explicitly indexed or an ellipsis
+          included.
+
+        - The start and stop of a slice may not be out of bounds. In
+          particular, for a slice ``i:j:k`` on an axis of size ``n``, only the
+          following are allowed:
+
+          - ``i`` or ``j`` omitted (``None``).
+          - ``-n <= i <= max(0, n - 1)``.
+          - For ``k > 0`` or ``k`` omitted (``None``), ``-n <= j <= n``.
+          - For ``k < 0``, ``-n - 1 <= j <= max(0, n - 1)``.
+
+        - Boolean array indices are not allowed as part of a larger tuple
+          index.
+
+        - Integer array indices are not allowed (with the exception of 0-D
+          arrays, which are treated the same as scalars).
+
+        Additionally, it should be noted that indices that would return a
+        scalar in NumPy will return a 0-D array. Array scalars are not allowed
+        in the specification, only 0-D arrays. This is done in the
+        ``Array._new`` constructor, not this function.
+
+        """
+        if isinstance(key, slice):
+            if shape is None:
+                return key
+            if shape == ():
+                return key
+            if len(shape) > 1:
+                raise IndexError(
+                    "Multidimensional arrays must include an index for every axis or use an ellipsis"
+                )
+            size = shape[0]
+            # Ensure invalid slice entries are passed through.
+            if key.start is not None:
+                try:
+                    operator.index(key.start)
+                except TypeError:
+                    return key
+                if not (-size <= key.start <= size):
+                    raise IndexError(
+                        "Slices with out-of-bounds start are not allowed in the array API namespace"
+                    )
+            if key.stop is not None:
+                try:
+                    operator.index(key.stop)
+                except TypeError:
+                    return key
+                step = 1 if key.step is None else key.step
+                if (step > 0 and not (-size <= key.stop <= size)
+                    or step < 0 and not (-size - 1 <= key.stop <= max(0, size - 1))):
+                    raise IndexError("Slices with out-of-bounds stop are not allowed in the array API namespace")
+            return key
+
+        elif isinstance(key, tuple):
+            key = tuple(Array._validate_index(idx, None) for idx in key)
+
+            for idx in key:
+                if (
+                    isinstance(idx, np.ndarray)
+                    and idx.dtype in _boolean_dtypes
+                    or isinstance(idx, (bool, np.bool_))
+                ):
+                    if len(key) == 1:
+                        return key
+                    raise IndexError(
+                        "Boolean array indices combined with other indices are not allowed in the array API namespace"
+                    )
+                if isinstance(idx, tuple):
+                    raise IndexError(
+                        "Nested tuple indices are not allowed in the array API namespace"
+                    )
+
+            if shape is None:
+                return key
+            n_ellipsis = key.count(...)
+            if n_ellipsis > 1:
+                return key
+            ellipsis_i = key.index(...) if n_ellipsis else len(key)
+
+            for idx, size in list(zip(key[:ellipsis_i], shape)) + list(
+                zip(key[:ellipsis_i:-1], shape[:ellipsis_i:-1])
+            ):
+                Array._validate_index(idx, (size,))
+            if n_ellipsis == 0 and len(key) < len(shape):
+                raise IndexError(
+                    "Multidimensional arrays must include an index for every axis or use an ellipsis"
+                )
+            return key
+        elif isinstance(key, bool):
+            return key
+        elif isinstance(key, Array):
+            if key.dtype in _integer_dtypes:
+                if key.ndim != 0:
+                    raise IndexError(
+                        "Non-zero dimensional integer array indices are not allowed in the array API namespace"
+                    )
+            return key._array
+        elif key is Ellipsis:
+            return key
+        elif key is None:
+            raise IndexError(
+                "newaxis indices are not allowed in the array API namespace"
+            )
+        try:
+            key = operator.index(key)
+            if shape is not None and len(shape) > 1:
+                raise IndexError(
+                    "Multidimensional arrays must include an index for every axis or use an ellipsis"
+                )
+            return key
+        except TypeError:
+            # Note: This also omits boolean arrays that are not already in
+            # Array() form, like a list of booleans.
+            raise IndexError(
+                "Only integers, slices (`:`), ellipsis (`...`), and boolean arrays are valid indices in the array API namespace"
+            )
+
+    # Everything below this line is required by the spec.
+
+    def __abs__(self: Array, /) -> Array:
+        """
+        Performs the operation __abs__.
+        """
+        if self.dtype not in _numeric_dtypes:
+            raise TypeError("Only numeric dtypes are allowed in __abs__")
+        res = self._array.__abs__()
+        return self.__class__._new(res)
+
+    def __add__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __add__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__add__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__add__(other._array)
+        return self.__class__._new(res)
+
+    def __and__(self: Array, other: Union[int, bool, Array], /) -> Array:
+        """
+        Performs the operation __and__.
+        """
+        other = self._check_allowed_dtypes(other, "integer or boolean", "__and__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__and__(other._array)
+        return self.__class__._new(res)
+
+    def __array_namespace__(
+        self: Array, /, *, api_version: Optional[str] = None
+    ) -> Any:
+        if api_version is not None and not api_version.startswith("2021."):
+            raise ValueError(f"Unrecognized array API version: {api_version!r}")
+        return array_api
+
+    def __bool__(self: Array, /) -> bool:
+        """
+        Performs the operation __bool__.
+        """
+        # Note: This is an error here.
+        if self._array.ndim != 0:
+            raise TypeError("bool is only allowed on arrays with 0 dimensions")
+        if self.dtype not in _boolean_dtypes:
+            raise ValueError("bool is only allowed on boolean arrays")
+        res = self._array.__bool__()
+        return res
+
+    def __dlpack__(self: Array, /, *, stream: None = None) -> PyCapsule:
+        """
+        Performs the operation __dlpack__.
+        """
+        return self._array.__dlpack__(stream=stream)
+
+    def __dlpack_device__(self: Array, /) -> Tuple[IntEnum, int]:
+        """
+        Performs the operation __dlpack_device__.
+        """
+        # Note: device support is required for this
+        return self._array.__dlpack_device__()
+
+    def __eq__(self: Array, other: Union[int, float, bool, Array], /) -> Array:
+        """
+        Performs the operation __eq__.
+        """
+        # Even though "all" dtypes are allowed, we still require them to be
+        # promotable with each other.
+        other = self._check_allowed_dtypes(other, "all", "__eq__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__eq__(other._array)
+        return self.__class__._new(res)
+
+    def __float__(self: Array, /) -> float:
+        """
+        Performs the operation __float__.
+        """
+        # Note: This is an error here.
+        if self._array.ndim != 0:
+            raise TypeError("float is only allowed on arrays with 0 dimensions")
+        if self.dtype not in _floating_dtypes:
+            raise ValueError("float is only allowed on floating-point arrays")
+        res = self._array.__float__()
+        return res
+
+    def __floordiv__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __floordiv__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__floordiv__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__floordiv__(other._array)
+        return self.__class__._new(res)
+
+    def __ge__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __ge__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__ge__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__ge__(other._array)
+        return self.__class__._new(res)
+
+    def __getitem__(
+        self: Array,
+        key: Union[
+            int, slice, ellipsis, Tuple[Union[int, slice, ellipsis], ...], Array
+        ],
+        /,
+    ) -> Array:
+        """
+        Performs the operation __getitem__.
+        """
+        # Note: Only indices required by the spec are allowed. See the
+        # docstring of _validate_index
+        key = self._validate_index(key, self.shape)
+        res = self._array.__getitem__(key)
+        return self._new(res)
+
+    def __gt__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __gt__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__gt__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__gt__(other._array)
+        return self.__class__._new(res)
+
+    def __int__(self: Array, /) -> int:
+        """
+        Performs the operation __int__.
+        """
+        # Note: This is an error here.
+        if self._array.ndim != 0:
+            raise TypeError("int is only allowed on arrays with 0 dimensions")
+        if self.dtype not in _integer_dtypes:
+            raise ValueError("int is only allowed on integer arrays")
+        res = self._array.__int__()
+        return res
+
+    def __index__(self: Array, /) -> int:
+        """
+        Performs the operation __index__.
+        """
+        res = self._array.__index__()
+        return res
+
+    def __invert__(self: Array, /) -> Array:
+        """
+        Performs the operation __invert__.
+        """
+        if self.dtype not in _integer_or_boolean_dtypes:
+            raise TypeError("Only integer or boolean dtypes are allowed in __invert__")
+        res = self._array.__invert__()
+        return self.__class__._new(res)
+
+    def __le__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __le__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__le__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__le__(other._array)
+        return self.__class__._new(res)
+
+    def __lshift__(self: Array, other: Union[int, Array], /) -> Array:
+        """
+        Performs the operation __lshift__.
+        """
+        other = self._check_allowed_dtypes(other, "integer", "__lshift__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__lshift__(other._array)
+        return self.__class__._new(res)
+
+    def __lt__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __lt__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__lt__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__lt__(other._array)
+        return self.__class__._new(res)
+
+    def __matmul__(self: Array, other: Array, /) -> Array:
+        """
+        Performs the operation __matmul__.
+        """
+        # matmul is not defined for scalars, but without this, we may get
+        # the wrong error message from asarray.
+        other = self._check_allowed_dtypes(other, "numeric", "__matmul__")
+        if other is NotImplemented:
+            return other
+        res = self._array.__matmul__(other._array)
+        return self.__class__._new(res)
+
+    def __mod__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __mod__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__mod__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__mod__(other._array)
+        return self.__class__._new(res)
+
+    def __mul__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __mul__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__mul__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__mul__(other._array)
+        return self.__class__._new(res)
+
+    def __ne__(self: Array, other: Union[int, float, bool, Array], /) -> Array:
+        """
+        Performs the operation __ne__.
+        """
+        other = self._check_allowed_dtypes(other, "all", "__ne__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__ne__(other._array)
+        return self.__class__._new(res)
+
+    def __neg__(self: Array, /) -> Array:
+        """
+        Performs the operation __neg__.
+        """
+        if self.dtype not in _numeric_dtypes:
+            raise TypeError("Only numeric dtypes are allowed in __neg__")
+        res = self._array.__neg__()
+        return self.__class__._new(res)
+
+    def __or__(self: Array, other: Union[int, bool, Array], /) -> Array:
+        """
+        Performs the operation __or__.
+        """
+        other = self._check_allowed_dtypes(other, "integer or boolean", "__or__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__or__(other._array)
+        return self.__class__._new(res)
+
+    def __pos__(self: Array, /) -> Array:
+        """
+        Performs the operation __pos__.
+        """
+        if self.dtype not in _numeric_dtypes:
+            raise TypeError("Only numeric dtypes are allowed in __pos__")
+        res = self._array.__pos__()
+        return self.__class__._new(res)
+
+    # PEP 484 requires int to be a subtype of float, but __pow__ should not
+    # accept int.
+    def __pow__(self: Array, other: Union[float, Array], /) -> Array:
+        """
+        Performs the operation __pow__.
+        """
+        from ._elementwise_functions import pow
+
+        other = self._check_allowed_dtypes(other, "floating-point", "__pow__")
+        if other is NotImplemented:
+            return other
+        # Note: NumPy's __pow__ does not follow type promotion rules for 0-d
+        # arrays, so we use pow() here instead.
+        return pow(self, other)
+
+    def __rshift__(self: Array, other: Union[int, Array], /) -> Array:
+        """
+        Performs the operation __rshift__.
+        """
+        other = self._check_allowed_dtypes(other, "integer", "__rshift__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__rshift__(other._array)
+        return self.__class__._new(res)
+
+    def __setitem__(
+        self,
+        key: Union[
+            int, slice, ellipsis, Tuple[Union[int, slice, ellipsis], ...], Array
+        ],
+        value: Union[int, float, bool, Array],
+        /,
+    ) -> None:
+        """
+        Performs the operation __setitem__.
+        """
+        # Note: Only indices required by the spec are allowed. See the
+        # docstring of _validate_index
+        key = self._validate_index(key, self.shape)
+        self._array.__setitem__(key, asarray(value)._array)
+
+    def __sub__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __sub__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__sub__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__sub__(other._array)
+        return self.__class__._new(res)
+
+    # PEP 484 requires int to be a subtype of float, but __truediv__ should
+    # not accept int.
+    def __truediv__(self: Array, other: Union[float, Array], /) -> Array:
+        """
+        Performs the operation __truediv__.
+        """
+        other = self._check_allowed_dtypes(other, "floating-point", "__truediv__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__truediv__(other._array)
+        return self.__class__._new(res)
+
+    def __xor__(self: Array, other: Union[int, bool, Array], /) -> Array:
+        """
+        Performs the operation __xor__.
+        """
+        other = self._check_allowed_dtypes(other, "integer or boolean", "__xor__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__xor__(other._array)
+        return self.__class__._new(res)
+
+    def __iadd__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __iadd__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__iadd__")
+        if other is NotImplemented:
+            return other
+        self._array.__iadd__(other._array)
+        return self
+
+    def __radd__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __radd__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__radd__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__radd__(other._array)
+        return self.__class__._new(res)
+
+    def __iand__(self: Array, other: Union[int, bool, Array], /) -> Array:
+        """
+        Performs the operation __iand__.
+        """
+        other = self._check_allowed_dtypes(other, "integer or boolean", "__iand__")
+        if other is NotImplemented:
+            return other
+        self._array.__iand__(other._array)
+        return self
+
+    def __rand__(self: Array, other: Union[int, bool, Array], /) -> Array:
+        """
+        Performs the operation __rand__.
+        """
+        other = self._check_allowed_dtypes(other, "integer or boolean", "__rand__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__rand__(other._array)
+        return self.__class__._new(res)
+
+    def __ifloordiv__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __ifloordiv__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__ifloordiv__")
+        if other is NotImplemented:
+            return other
+        self._array.__ifloordiv__(other._array)
+        return self
+
+    def __rfloordiv__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __rfloordiv__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__rfloordiv__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__rfloordiv__(other._array)
+        return self.__class__._new(res)
+
+    def __ilshift__(self: Array, other: Union[int, Array], /) -> Array:
+        """
+        Performs the operation __ilshift__.
+        """
+        other = self._check_allowed_dtypes(other, "integer", "__ilshift__")
+        if other is NotImplemented:
+            return other
+        self._array.__ilshift__(other._array)
+        return self
+
+    def __rlshift__(self: Array, other: Union[int, Array], /) -> Array:
+        """
+        Performs the operation __rlshift__.
+        """
+        other = self._check_allowed_dtypes(other, "integer", "__rlshift__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__rlshift__(other._array)
+        return self.__class__._new(res)
+
+    def __imatmul__(self: Array, other: Array, /) -> Array:
+        """
+        Performs the operation __imatmul__.
+        """
+        # Note: NumPy does not implement __imatmul__.
+
+        # matmul is not defined for scalars, but without this, we may get
+        # the wrong error message from asarray.
+        other = self._check_allowed_dtypes(other, "numeric", "__imatmul__")
+        if other is NotImplemented:
+            return other
+
+        # __imatmul__ can only be allowed when it would not change the shape
+        # of self.
+        other_shape = other.shape
+        if self.shape == () or other_shape == ():
+            raise ValueError("@= requires at least one dimension")
+        if len(other_shape) == 1 or other_shape[-1] != other_shape[-2]:
+            raise ValueError("@= cannot change the shape of the input array")
+        self._array[:] = self._array.__matmul__(other._array)
+        return self
+
+    def __rmatmul__(self: Array, other: Array, /) -> Array:
+        """
+        Performs the operation __rmatmul__.
+        """
+        # matmul is not defined for scalars, but without this, we may get
+        # the wrong error message from asarray.
+        other = self._check_allowed_dtypes(other, "numeric", "__rmatmul__")
+        if other is NotImplemented:
+            return other
+        res = self._array.__rmatmul__(other._array)
+        return self.__class__._new(res)
+
+    def __imod__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __imod__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__imod__")
+        if other is NotImplemented:
+            return other
+        self._array.__imod__(other._array)
+        return self
+
+    def __rmod__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __rmod__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__rmod__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__rmod__(other._array)
+        return self.__class__._new(res)
+
+    def __imul__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __imul__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__imul__")
+        if other is NotImplemented:
+            return other
+        self._array.__imul__(other._array)
+        return self
+
+    def __rmul__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __rmul__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__rmul__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__rmul__(other._array)
+        return self.__class__._new(res)
+
+    def __ior__(self: Array, other: Union[int, bool, Array], /) -> Array:
+        """
+        Performs the operation __ior__.
+        """
+        other = self._check_allowed_dtypes(other, "integer or boolean", "__ior__")
+        if other is NotImplemented:
+            return other
+        self._array.__ior__(other._array)
+        return self
+
+    def __ror__(self: Array, other: Union[int, bool, Array], /) -> Array:
+        """
+        Performs the operation __ror__.
+        """
+        other = self._check_allowed_dtypes(other, "integer or boolean", "__ror__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__ror__(other._array)
+        return self.__class__._new(res)
+
+    def __ipow__(self: Array, other: Union[float, Array], /) -> Array:
+        """
+        Performs the operation __ipow__.
+        """
+        other = self._check_allowed_dtypes(other, "floating-point", "__ipow__")
+        if other is NotImplemented:
+            return other
+        self._array.__ipow__(other._array)
+        return self
+
+    def __rpow__(self: Array, other: Union[float, Array], /) -> Array:
+        """
+        Performs the operation __rpow__.
+        """
+        from ._elementwise_functions import pow
+
+        other = self._check_allowed_dtypes(other, "floating-point", "__rpow__")
+        if other is NotImplemented:
+            return other
+        # Note: NumPy's __pow__ does not follow the spec type promotion rules
+        # for 0-d arrays, so we use pow() here instead.
+        return pow(other, self)
+
+    def __irshift__(self: Array, other: Union[int, Array], /) -> Array:
+        """
+        Performs the operation __irshift__.
+        """
+        other = self._check_allowed_dtypes(other, "integer", "__irshift__")
+        if other is NotImplemented:
+            return other
+        self._array.__irshift__(other._array)
+        return self
+
+    def __rrshift__(self: Array, other: Union[int, Array], /) -> Array:
+        """
+        Performs the operation __rrshift__.
+        """
+        other = self._check_allowed_dtypes(other, "integer", "__rrshift__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__rrshift__(other._array)
+        return self.__class__._new(res)
+
+    def __isub__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __isub__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__isub__")
+        if other is NotImplemented:
+            return other
+        self._array.__isub__(other._array)
+        return self
+
+    def __rsub__(self: Array, other: Union[int, float, Array], /) -> Array:
+        """
+        Performs the operation __rsub__.
+        """
+        other = self._check_allowed_dtypes(other, "numeric", "__rsub__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__rsub__(other._array)
+        return self.__class__._new(res)
+
+    def __itruediv__(self: Array, other: Union[float, Array], /) -> Array:
+        """
+        Performs the operation __itruediv__.
+        """
+        other = self._check_allowed_dtypes(other, "floating-point", "__itruediv__")
+        if other is NotImplemented:
+            return other
+        self._array.__itruediv__(other._array)
+        return self
+
+    def __rtruediv__(self: Array, other: Union[float, Array], /) -> Array:
+        """
+        Performs the operation __rtruediv__.
+        """
+        other = self._check_allowed_dtypes(other, "floating-point", "__rtruediv__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__rtruediv__(other._array)
+        return self.__class__._new(res)
+
+    def __ixor__(self: Array, other: Union[int, bool, Array], /) -> Array:
+        """
+        Performs the operation __ixor__.
+        """
+        other = self._check_allowed_dtypes(other, "integer or boolean", "__ixor__")
+        if other is NotImplemented:
+            return other
+        self._array.__ixor__(other._array)
+        return self
+
+    def __rxor__(self: Array, other: Union[int, bool, Array], /) -> Array:
+        """
+        Performs the operation __rxor__.
+        """
+        other = self._check_allowed_dtypes(other, "integer or boolean", "__rxor__")
+        if other is NotImplemented:
+            return other
+        self, other = self._normalize_two_args(self, other)
+        res = self._array.__rxor__(other._array)
+        return self.__class__._new(res)
+
+    def to_device(self: Array, device: Device, /, stream: None = None) -> Array:
+        if stream is not None:
+            raise ValueError("The stream argument to to_device() is not supported")
+        if device == 'cpu':
+            return self
+        raise ValueError(f"Unsupported device {device!r}")
+
+    @property
+    def dtype(self) -> Dtype:
+        """
+        Array API compatible wrapper for :py:meth:`np.ndarray.dtype <numpy.ndarray.dtype>`.
+
+        See its docstring for more information.
+        """
+        return self._array.dtype
+
+    @property
+    def device(self) -> Device:
+        return "cpu"
+
+    # Note: mT is new in array API spec (see matrix_transpose)
+    @property
+    def mT(self) -> Array:
+        from .linalg import matrix_transpose
+        return matrix_transpose(self)
+
+    @property
+    def ndim(self) -> int:
+        """
+        Array API compatible wrapper for :py:meth:`np.ndarray.ndim <numpy.ndarray.ndim>`.
+
+        See its docstring for more information.
+        """
+        return self._array.ndim
+
+    @property
+    def shape(self) -> Tuple[int, ...]:
+        """
+        Array API compatible wrapper for :py:meth:`np.ndarray.shape <numpy.ndarray.shape>`.
+
+        See its docstring for more information.
+        """
+        return self._array.shape
+
+    @property
+    def size(self) -> int:
+        """
+        Array API compatible wrapper for :py:meth:`np.ndarray.size <numpy.ndarray.size>`.
+
+        See its docstring for more information.
+        """
+        return self._array.size
+
+    @property
+    def T(self) -> Array:
+        """
+        Array API compatible wrapper for :py:meth:`np.ndarray.T <numpy.ndarray.T>`.
+
+        See its docstring for more information.
+        """
+        # Note: T only works on 2-dimensional arrays. See the corresponding
+        # note in the specification:
+        # https://data-apis.org/array-api/latest/API_specification/array_object.html#t
+        if self.ndim != 2:
+            raise ValueError("x.T requires x to have 2 dimensions. Use x.mT to transpose stacks of matrices and permute_dims() to permute dimensions.")
+        return self.__class__._new(self._array.T)
diff --git a/numpy/array_api/_constants.py b/numpy/array_api/_constants.py
new file mode 100644 (file)
index 0000000..9541941
--- /dev/null
@@ -0,0 +1,6 @@
+import numpy as np
+
+e = np.e
+inf = np.inf
+nan = np.nan
+pi = np.pi
diff --git a/numpy/array_api/_creation_functions.py b/numpy/array_api/_creation_functions.py
new file mode 100644 (file)
index 0000000..741498f
--- /dev/null
@@ -0,0 +1,351 @@
+from __future__ import annotations
+
+
+from typing import TYPE_CHECKING, List, Optional, Tuple, Union
+
+if TYPE_CHECKING:
+    from ._typing import (
+        Array,
+        Device,
+        Dtype,
+        NestedSequence,
+        SupportsBufferProtocol,
+    )
+    from collections.abc import Sequence
+from ._dtypes import _all_dtypes
+
+import numpy as np
+
+
+def _check_valid_dtype(dtype):
+    # Note: Only spelling dtypes as the dtype objects is supported.
+
+    # We use this instead of "dtype in _all_dtypes" because the dtype objects
+    # define equality with the sorts of things we want to disallow.
+    for d in (None,) + _all_dtypes:
+        if dtype is d:
+            return
+    raise ValueError("dtype must be one of the supported dtypes")
+
+
+def asarray(
+    obj: Union[
+        Array,
+        bool,
+        int,
+        float,
+        NestedSequence[bool | int | float],
+        SupportsBufferProtocol,
+    ],
+    /,
+    *,
+    dtype: Optional[Dtype] = None,
+    device: Optional[Device] = None,
+    copy: Optional[Union[bool, np._CopyMode]] = None,
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.asarray <numpy.asarray>`.
+
+    See its docstring for more information.
+    """
+    # _array_object imports in this file are inside the functions to avoid
+    # circular imports
+    from ._array_object import Array
+
+    _check_valid_dtype(dtype)
+    if device not in ["cpu", None]:
+        raise ValueError(f"Unsupported device {device!r}")
+    if copy in (False, np._CopyMode.IF_NEEDED):
+        # Note: copy=False is not yet implemented in np.asarray
+        raise NotImplementedError("copy=False is not yet implemented")
+    if isinstance(obj, Array):
+        if dtype is not None and obj.dtype != dtype:
+            copy = True
+        if copy in (True, np._CopyMode.ALWAYS):
+            return Array._new(np.array(obj._array, copy=True, dtype=dtype))
+        return obj
+    if dtype is None and isinstance(obj, int) and (obj > 2 ** 64 or obj < -(2 ** 63)):
+        # Give a better error message in this case. NumPy would convert this
+        # to an object array. TODO: This won't handle large integers in lists.
+        raise OverflowError("Integer out of bounds for array dtypes")
+    res = np.asarray(obj, dtype=dtype)
+    return Array._new(res)
+
+
+def arange(
+    start: Union[int, float],
+    /,
+    stop: Optional[Union[int, float]] = None,
+    step: Union[int, float] = 1,
+    *,
+    dtype: Optional[Dtype] = None,
+    device: Optional[Device] = None,
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.arange <numpy.arange>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    _check_valid_dtype(dtype)
+    if device not in ["cpu", None]:
+        raise ValueError(f"Unsupported device {device!r}")
+    return Array._new(np.arange(start, stop=stop, step=step, dtype=dtype))
+
+
+def empty(
+    shape: Union[int, Tuple[int, ...]],
+    *,
+    dtype: Optional[Dtype] = None,
+    device: Optional[Device] = None,
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.empty <numpy.empty>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    _check_valid_dtype(dtype)
+    if device not in ["cpu", None]:
+        raise ValueError(f"Unsupported device {device!r}")
+    return Array._new(np.empty(shape, dtype=dtype))
+
+
+def empty_like(
+    x: Array, /, *, dtype: Optional[Dtype] = None, device: Optional[Device] = None
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.empty_like <numpy.empty_like>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    _check_valid_dtype(dtype)
+    if device not in ["cpu", None]:
+        raise ValueError(f"Unsupported device {device!r}")
+    return Array._new(np.empty_like(x._array, dtype=dtype))
+
+
+def eye(
+    n_rows: int,
+    n_cols: Optional[int] = None,
+    /,
+    *,
+    k: int = 0,
+    dtype: Optional[Dtype] = None,
+    device: Optional[Device] = None,
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.eye <numpy.eye>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    _check_valid_dtype(dtype)
+    if device not in ["cpu", None]:
+        raise ValueError(f"Unsupported device {device!r}")
+    return Array._new(np.eye(n_rows, M=n_cols, k=k, dtype=dtype))
+
+
+def from_dlpack(x: object, /) -> Array:
+    from ._array_object import Array
+
+    return Array._new(np._from_dlpack(x))
+
+
+def full(
+    shape: Union[int, Tuple[int, ...]],
+    fill_value: Union[int, float],
+    *,
+    dtype: Optional[Dtype] = None,
+    device: Optional[Device] = None,
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.full <numpy.full>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    _check_valid_dtype(dtype)
+    if device not in ["cpu", None]:
+        raise ValueError(f"Unsupported device {device!r}")
+    if isinstance(fill_value, Array) and fill_value.ndim == 0:
+        fill_value = fill_value._array
+    res = np.full(shape, fill_value, dtype=dtype)
+    if res.dtype not in _all_dtypes:
+        # This will happen if the fill value is not something that NumPy
+        # coerces to one of the acceptable dtypes.
+        raise TypeError("Invalid input to full")
+    return Array._new(res)
+
+
+def full_like(
+    x: Array,
+    /,
+    fill_value: Union[int, float],
+    *,
+    dtype: Optional[Dtype] = None,
+    device: Optional[Device] = None,
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.full_like <numpy.full_like>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    _check_valid_dtype(dtype)
+    if device not in ["cpu", None]:
+        raise ValueError(f"Unsupported device {device!r}")
+    res = np.full_like(x._array, fill_value, dtype=dtype)
+    if res.dtype not in _all_dtypes:
+        # This will happen if the fill value is not something that NumPy
+        # coerces to one of the acceptable dtypes.
+        raise TypeError("Invalid input to full_like")
+    return Array._new(res)
+
+
+def linspace(
+    start: Union[int, float],
+    stop: Union[int, float],
+    /,
+    num: int,
+    *,
+    dtype: Optional[Dtype] = None,
+    device: Optional[Device] = None,
+    endpoint: bool = True,
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.linspace <numpy.linspace>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    _check_valid_dtype(dtype)
+    if device not in ["cpu", None]:
+        raise ValueError(f"Unsupported device {device!r}")
+    return Array._new(np.linspace(start, stop, num, dtype=dtype, endpoint=endpoint))
+
+
+def meshgrid(*arrays: Array, indexing: str = "xy") -> List[Array]:
+    """
+    Array API compatible wrapper for :py:func:`np.meshgrid <numpy.meshgrid>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    # Note: unlike np.meshgrid, only inputs with all the same dtype are
+    # allowed
+
+    if len({a.dtype for a in arrays}) > 1:
+        raise ValueError("meshgrid inputs must all have the same dtype")
+
+    return [
+        Array._new(array)
+        for array in np.meshgrid(*[a._array for a in arrays], indexing=indexing)
+    ]
+
+
+def ones(
+    shape: Union[int, Tuple[int, ...]],
+    *,
+    dtype: Optional[Dtype] = None,
+    device: Optional[Device] = None,
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.ones <numpy.ones>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    _check_valid_dtype(dtype)
+    if device not in ["cpu", None]:
+        raise ValueError(f"Unsupported device {device!r}")
+    return Array._new(np.ones(shape, dtype=dtype))
+
+
+def ones_like(
+    x: Array, /, *, dtype: Optional[Dtype] = None, device: Optional[Device] = None
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.ones_like <numpy.ones_like>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    _check_valid_dtype(dtype)
+    if device not in ["cpu", None]:
+        raise ValueError(f"Unsupported device {device!r}")
+    return Array._new(np.ones_like(x._array, dtype=dtype))
+
+
+def tril(x: Array, /, *, k: int = 0) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.tril <numpy.tril>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    if x.ndim < 2:
+        # Note: Unlike np.tril, x must be at least 2-D
+        raise ValueError("x must be at least 2-dimensional for tril")
+    return Array._new(np.tril(x._array, k=k))
+
+
+def triu(x: Array, /, *, k: int = 0) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.triu <numpy.triu>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    if x.ndim < 2:
+        # Note: Unlike np.triu, x must be at least 2-D
+        raise ValueError("x must be at least 2-dimensional for triu")
+    return Array._new(np.triu(x._array, k=k))
+
+
+def zeros(
+    shape: Union[int, Tuple[int, ...]],
+    *,
+    dtype: Optional[Dtype] = None,
+    device: Optional[Device] = None,
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.zeros <numpy.zeros>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    _check_valid_dtype(dtype)
+    if device not in ["cpu", None]:
+        raise ValueError(f"Unsupported device {device!r}")
+    return Array._new(np.zeros(shape, dtype=dtype))
+
+
+def zeros_like(
+    x: Array, /, *, dtype: Optional[Dtype] = None, device: Optional[Device] = None
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.zeros_like <numpy.zeros_like>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    _check_valid_dtype(dtype)
+    if device not in ["cpu", None]:
+        raise ValueError(f"Unsupported device {device!r}")
+    return Array._new(np.zeros_like(x._array, dtype=dtype))
diff --git a/numpy/array_api/_data_type_functions.py b/numpy/array_api/_data_type_functions.py
new file mode 100644 (file)
index 0000000..e4d6db6
--- /dev/null
@@ -0,0 +1,134 @@
+from __future__ import annotations
+
+from ._array_object import Array
+from ._dtypes import _all_dtypes, _result_type
+
+from dataclasses import dataclass
+from typing import TYPE_CHECKING, List, Tuple, Union
+
+if TYPE_CHECKING:
+    from ._typing import Dtype
+    from collections.abc import Sequence
+
+import numpy as np
+
+
+# Note: astype is a function, not an array method as in NumPy.
+def astype(x: Array, dtype: Dtype, /, *, copy: bool = True) -> Array:
+    if not copy and dtype == x.dtype:
+        return x
+    return Array._new(x._array.astype(dtype=dtype, copy=copy))
+
+
+def broadcast_arrays(*arrays: Array) -> List[Array]:
+    """
+    Array API compatible wrapper for :py:func:`np.broadcast_arrays <numpy.broadcast_arrays>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    return [
+        Array._new(array) for array in np.broadcast_arrays(*[a._array for a in arrays])
+    ]
+
+
+def broadcast_to(x: Array, /, shape: Tuple[int, ...]) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.broadcast_to <numpy.broadcast_to>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    return Array._new(np.broadcast_to(x._array, shape))
+
+
+def can_cast(from_: Union[Dtype, Array], to: Dtype, /) -> bool:
+    """
+    Array API compatible wrapper for :py:func:`np.can_cast <numpy.can_cast>`.
+
+    See its docstring for more information.
+    """
+    from ._array_object import Array
+
+    if isinstance(from_, Array):
+        from_ = from_._array
+    return np.can_cast(from_, to)
+
+
+# These are internal objects for the return types of finfo and iinfo, since
+# the NumPy versions contain extra data that isn't part of the spec.
+@dataclass
+class finfo_object:
+    bits: int
+    # Note: The types of the float data here are float, whereas in NumPy they
+    # are scalars of the corresponding float dtype.
+    eps: float
+    max: float
+    min: float
+    smallest_normal: float
+
+
+@dataclass
+class iinfo_object:
+    bits: int
+    max: int
+    min: int
+
+
+def finfo(type: Union[Dtype, Array], /) -> finfo_object:
+    """
+    Array API compatible wrapper for :py:func:`np.finfo <numpy.finfo>`.
+
+    See its docstring for more information.
+    """
+    fi = np.finfo(type)
+    # Note: The types of the float data here are float, whereas in NumPy they
+    # are scalars of the corresponding float dtype.
+    return finfo_object(
+        fi.bits,
+        float(fi.eps),
+        float(fi.max),
+        float(fi.min),
+        float(fi.smallest_normal),
+    )
+
+
+def iinfo(type: Union[Dtype, Array], /) -> iinfo_object:
+    """
+    Array API compatible wrapper for :py:func:`np.iinfo <numpy.iinfo>`.
+
+    See its docstring for more information.
+    """
+    ii = np.iinfo(type)
+    return iinfo_object(ii.bits, ii.max, ii.min)
+
+
+def result_type(*arrays_and_dtypes: Union[Array, Dtype]) -> Dtype:
+    """
+    Array API compatible wrapper for :py:func:`np.result_type <numpy.result_type>`.
+
+    See its docstring for more information.
+    """
+    # Note: we use a custom implementation that gives only the type promotions
+    # required by the spec rather than using np.result_type. NumPy implements
+    # too many extra type promotions like int64 + uint64 -> float64, and does
+    # value-based casting on scalar arrays.
+    A = []
+    for a in arrays_and_dtypes:
+        if isinstance(a, Array):
+            a = a.dtype
+        elif isinstance(a, np.ndarray) or a not in _all_dtypes:
+            raise TypeError("result_type() inputs must be array_api arrays or dtypes")
+        A.append(a)
+
+    if len(A) == 0:
+        raise ValueError("at least one array or dtype is required")
+    elif len(A) == 1:
+        return A[0]
+    else:
+        t = A[0]
+        for t2 in A[1:]:
+            t = _result_type(t, t2)
+        return t
diff --git a/numpy/array_api/_dtypes.py b/numpy/array_api/_dtypes.py
new file mode 100644 (file)
index 0000000..476d619
--- /dev/null
@@ -0,0 +1,143 @@
+import numpy as np
+
+# Note: we use dtype objects instead of dtype classes. The spec does not
+# require any behavior on dtypes other than equality.
+int8 = np.dtype("int8")
+int16 = np.dtype("int16")
+int32 = np.dtype("int32")
+int64 = np.dtype("int64")
+uint8 = np.dtype("uint8")
+uint16 = np.dtype("uint16")
+uint32 = np.dtype("uint32")
+uint64 = np.dtype("uint64")
+float32 = np.dtype("float32")
+float64 = np.dtype("float64")
+# Note: This name is changed
+bool = np.dtype("bool")
+
+_all_dtypes = (
+    int8,
+    int16,
+    int32,
+    int64,
+    uint8,
+    uint16,
+    uint32,
+    uint64,
+    float32,
+    float64,
+    bool,
+)
+_boolean_dtypes = (bool,)
+_floating_dtypes = (float32, float64)
+_integer_dtypes = (int8, int16, int32, int64, uint8, uint16, uint32, uint64)
+_integer_or_boolean_dtypes = (
+    bool,
+    int8,
+    int16,
+    int32,
+    int64,
+    uint8,
+    uint16,
+    uint32,
+    uint64,
+)
+_numeric_dtypes = (
+    float32,
+    float64,
+    int8,
+    int16,
+    int32,
+    int64,
+    uint8,
+    uint16,
+    uint32,
+    uint64,
+)
+
+_dtype_categories = {
+    "all": _all_dtypes,
+    "numeric": _numeric_dtypes,
+    "integer": _integer_dtypes,
+    "integer or boolean": _integer_or_boolean_dtypes,
+    "boolean": _boolean_dtypes,
+    "floating-point": _floating_dtypes,
+}
+
+
+# Note: the spec defines a restricted type promotion table compared to NumPy.
+# In particular, cross-kind promotions like integer + float or boolean +
+# integer are not allowed, even for functions that accept both kinds.
+# Additionally, NumPy promotes signed integer + uint64 to float64, but this
+# promotion is not allowed here. To be clear, Python scalar int objects are
+# allowed to promote to floating-point dtypes, but only in array operators
+# (see Array._promote_scalar) method in _array_object.py.
+_promotion_table = {
+    (int8, int8): int8,
+    (int8, int16): int16,
+    (int8, int32): int32,
+    (int8, int64): int64,
+    (int16, int8): int16,
+    (int16, int16): int16,
+    (int16, int32): int32,
+    (int16, int64): int64,
+    (int32, int8): int32,
+    (int32, int16): int32,
+    (int32, int32): int32,
+    (int32, int64): int64,
+    (int64, int8): int64,
+    (int64, int16): int64,
+    (int64, int32): int64,
+    (int64, int64): int64,
+    (uint8, uint8): uint8,
+    (uint8, uint16): uint16,
+    (uint8, uint32): uint32,
+    (uint8, uint64): uint64,
+    (uint16, uint8): uint16,
+    (uint16, uint16): uint16,
+    (uint16, uint32): uint32,
+    (uint16, uint64): uint64,
+    (uint32, uint8): uint32,
+    (uint32, uint16): uint32,
+    (uint32, uint32): uint32,
+    (uint32, uint64): uint64,
+    (uint64, uint8): uint64,
+    (uint64, uint16): uint64,
+    (uint64, uint32): uint64,
+    (uint64, uint64): uint64,
+    (int8, uint8): int16,
+    (int8, uint16): int32,
+    (int8, uint32): int64,
+    (int16, uint8): int16,
+    (int16, uint16): int32,
+    (int16, uint32): int64,
+    (int32, uint8): int32,
+    (int32, uint16): int32,
+    (int32, uint32): int64,
+    (int64, uint8): int64,
+    (int64, uint16): int64,
+    (int64, uint32): int64,
+    (uint8, int8): int16,
+    (uint16, int8): int32,
+    (uint32, int8): int64,
+    (uint8, int16): int16,
+    (uint16, int16): int32,
+    (uint32, int16): int64,
+    (uint8, int32): int32,
+    (uint16, int32): int32,
+    (uint32, int32): int64,
+    (uint8, int64): int64,
+    (uint16, int64): int64,
+    (uint32, int64): int64,
+    (float32, float32): float32,
+    (float32, float64): float64,
+    (float64, float32): float64,
+    (float64, float64): float64,
+    (bool, bool): bool,
+}
+
+
+def _result_type(type1, type2):
+    if (type1, type2) in _promotion_table:
+        return _promotion_table[type1, type2]
+    raise TypeError(f"{type1} and {type2} cannot be type promoted together")
diff --git a/numpy/array_api/_elementwise_functions.py b/numpy/array_api/_elementwise_functions.py
new file mode 100644 (file)
index 0000000..4408fe8
--- /dev/null
@@ -0,0 +1,729 @@
+from __future__ import annotations
+
+from ._dtypes import (
+    _boolean_dtypes,
+    _floating_dtypes,
+    _integer_dtypes,
+    _integer_or_boolean_dtypes,
+    _numeric_dtypes,
+    _result_type,
+)
+from ._array_object import Array
+
+import numpy as np
+
+
+def abs(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.abs <numpy.abs>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in abs")
+    return Array._new(np.abs(x._array))
+
+
+# Note: the function name is different here
+def acos(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.arccos <numpy.arccos>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in acos")
+    return Array._new(np.arccos(x._array))
+
+
+# Note: the function name is different here
+def acosh(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.arccosh <numpy.arccosh>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in acosh")
+    return Array._new(np.arccosh(x._array))
+
+
+def add(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.add <numpy.add>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in add")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.add(x1._array, x2._array))
+
+
+# Note: the function name is different here
+def asin(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.arcsin <numpy.arcsin>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in asin")
+    return Array._new(np.arcsin(x._array))
+
+
+# Note: the function name is different here
+def asinh(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.arcsinh <numpy.arcsinh>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in asinh")
+    return Array._new(np.arcsinh(x._array))
+
+
+# Note: the function name is different here
+def atan(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.arctan <numpy.arctan>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in atan")
+    return Array._new(np.arctan(x._array))
+
+
+# Note: the function name is different here
+def atan2(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.arctan2 <numpy.arctan2>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _floating_dtypes or x2.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in atan2")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.arctan2(x1._array, x2._array))
+
+
+# Note: the function name is different here
+def atanh(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.arctanh <numpy.arctanh>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in atanh")
+    return Array._new(np.arctanh(x._array))
+
+
+def bitwise_and(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.bitwise_and <numpy.bitwise_and>`.
+
+    See its docstring for more information.
+    """
+    if (
+        x1.dtype not in _integer_or_boolean_dtypes
+        or x2.dtype not in _integer_or_boolean_dtypes
+    ):
+        raise TypeError("Only integer or boolean dtypes are allowed in bitwise_and")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.bitwise_and(x1._array, x2._array))
+
+
+# Note: the function name is different here
+def bitwise_left_shift(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.left_shift <numpy.left_shift>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _integer_dtypes or x2.dtype not in _integer_dtypes:
+        raise TypeError("Only integer dtypes are allowed in bitwise_left_shift")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    # Note: bitwise_left_shift is only defined for x2 nonnegative.
+    if np.any(x2._array < 0):
+        raise ValueError("bitwise_left_shift(x1, x2) is only defined for x2 >= 0")
+    return Array._new(np.left_shift(x1._array, x2._array))
+
+
+# Note: the function name is different here
+def bitwise_invert(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.invert <numpy.invert>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _integer_or_boolean_dtypes:
+        raise TypeError("Only integer or boolean dtypes are allowed in bitwise_invert")
+    return Array._new(np.invert(x._array))
+
+
+def bitwise_or(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.bitwise_or <numpy.bitwise_or>`.
+
+    See its docstring for more information.
+    """
+    if (
+        x1.dtype not in _integer_or_boolean_dtypes
+        or x2.dtype not in _integer_or_boolean_dtypes
+    ):
+        raise TypeError("Only integer or boolean dtypes are allowed in bitwise_or")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.bitwise_or(x1._array, x2._array))
+
+
+# Note: the function name is different here
+def bitwise_right_shift(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.right_shift <numpy.right_shift>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _integer_dtypes or x2.dtype not in _integer_dtypes:
+        raise TypeError("Only integer dtypes are allowed in bitwise_right_shift")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    # Note: bitwise_right_shift is only defined for x2 nonnegative.
+    if np.any(x2._array < 0):
+        raise ValueError("bitwise_right_shift(x1, x2) is only defined for x2 >= 0")
+    return Array._new(np.right_shift(x1._array, x2._array))
+
+
+def bitwise_xor(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.bitwise_xor <numpy.bitwise_xor>`.
+
+    See its docstring for more information.
+    """
+    if (
+        x1.dtype not in _integer_or_boolean_dtypes
+        or x2.dtype not in _integer_or_boolean_dtypes
+    ):
+        raise TypeError("Only integer or boolean dtypes are allowed in bitwise_xor")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.bitwise_xor(x1._array, x2._array))
+
+
+def ceil(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.ceil <numpy.ceil>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in ceil")
+    if x.dtype in _integer_dtypes:
+        # Note: The return dtype of ceil is the same as the input
+        return x
+    return Array._new(np.ceil(x._array))
+
+
+def cos(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.cos <numpy.cos>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in cos")
+    return Array._new(np.cos(x._array))
+
+
+def cosh(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.cosh <numpy.cosh>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in cosh")
+    return Array._new(np.cosh(x._array))
+
+
+def divide(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.divide <numpy.divide>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _floating_dtypes or x2.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in divide")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.divide(x1._array, x2._array))
+
+
+def equal(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.equal <numpy.equal>`.
+
+    See its docstring for more information.
+    """
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.equal(x1._array, x2._array))
+
+
+def exp(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.exp <numpy.exp>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in exp")
+    return Array._new(np.exp(x._array))
+
+
+def expm1(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.expm1 <numpy.expm1>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in expm1")
+    return Array._new(np.expm1(x._array))
+
+
+def floor(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.floor <numpy.floor>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in floor")
+    if x.dtype in _integer_dtypes:
+        # Note: The return dtype of floor is the same as the input
+        return x
+    return Array._new(np.floor(x._array))
+
+
+def floor_divide(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.floor_divide <numpy.floor_divide>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in floor_divide")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.floor_divide(x1._array, x2._array))
+
+
+def greater(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.greater <numpy.greater>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in greater")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.greater(x1._array, x2._array))
+
+
+def greater_equal(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.greater_equal <numpy.greater_equal>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in greater_equal")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.greater_equal(x1._array, x2._array))
+
+
+def isfinite(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.isfinite <numpy.isfinite>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in isfinite")
+    return Array._new(np.isfinite(x._array))
+
+
+def isinf(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.isinf <numpy.isinf>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in isinf")
+    return Array._new(np.isinf(x._array))
+
+
+def isnan(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.isnan <numpy.isnan>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in isnan")
+    return Array._new(np.isnan(x._array))
+
+
+def less(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.less <numpy.less>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in less")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.less(x1._array, x2._array))
+
+
+def less_equal(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.less_equal <numpy.less_equal>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in less_equal")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.less_equal(x1._array, x2._array))
+
+
+def log(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.log <numpy.log>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in log")
+    return Array._new(np.log(x._array))
+
+
+def log1p(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.log1p <numpy.log1p>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in log1p")
+    return Array._new(np.log1p(x._array))
+
+
+def log2(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.log2 <numpy.log2>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in log2")
+    return Array._new(np.log2(x._array))
+
+
+def log10(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.log10 <numpy.log10>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in log10")
+    return Array._new(np.log10(x._array))
+
+
+def logaddexp(x1: Array, x2: Array) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.logaddexp <numpy.logaddexp>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _floating_dtypes or x2.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in logaddexp")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.logaddexp(x1._array, x2._array))
+
+
+def logical_and(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.logical_and <numpy.logical_and>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _boolean_dtypes or x2.dtype not in _boolean_dtypes:
+        raise TypeError("Only boolean dtypes are allowed in logical_and")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.logical_and(x1._array, x2._array))
+
+
+def logical_not(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.logical_not <numpy.logical_not>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _boolean_dtypes:
+        raise TypeError("Only boolean dtypes are allowed in logical_not")
+    return Array._new(np.logical_not(x._array))
+
+
+def logical_or(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.logical_or <numpy.logical_or>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _boolean_dtypes or x2.dtype not in _boolean_dtypes:
+        raise TypeError("Only boolean dtypes are allowed in logical_or")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.logical_or(x1._array, x2._array))
+
+
+def logical_xor(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.logical_xor <numpy.logical_xor>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _boolean_dtypes or x2.dtype not in _boolean_dtypes:
+        raise TypeError("Only boolean dtypes are allowed in logical_xor")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.logical_xor(x1._array, x2._array))
+
+
+def multiply(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.multiply <numpy.multiply>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in multiply")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.multiply(x1._array, x2._array))
+
+
+def negative(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.negative <numpy.negative>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in negative")
+    return Array._new(np.negative(x._array))
+
+
+def not_equal(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.not_equal <numpy.not_equal>`.
+
+    See its docstring for more information.
+    """
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.not_equal(x1._array, x2._array))
+
+
+def positive(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.positive <numpy.positive>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in positive")
+    return Array._new(np.positive(x._array))
+
+
+# Note: the function name is different here
+def pow(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.power <numpy.power>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _floating_dtypes or x2.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in pow")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.power(x1._array, x2._array))
+
+
+def remainder(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.remainder <numpy.remainder>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in remainder")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.remainder(x1._array, x2._array))
+
+
+def round(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.round <numpy.round>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in round")
+    return Array._new(np.round(x._array))
+
+
+def sign(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.sign <numpy.sign>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in sign")
+    return Array._new(np.sign(x._array))
+
+
+def sin(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.sin <numpy.sin>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in sin")
+    return Array._new(np.sin(x._array))
+
+
+def sinh(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.sinh <numpy.sinh>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in sinh")
+    return Array._new(np.sinh(x._array))
+
+
+def square(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.square <numpy.square>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in square")
+    return Array._new(np.square(x._array))
+
+
+def sqrt(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.sqrt <numpy.sqrt>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in sqrt")
+    return Array._new(np.sqrt(x._array))
+
+
+def subtract(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.subtract <numpy.subtract>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in subtract")
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.subtract(x1._array, x2._array))
+
+
+def tan(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.tan <numpy.tan>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in tan")
+    return Array._new(np.tan(x._array))
+
+
+def tanh(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.tanh <numpy.tanh>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in tanh")
+    return Array._new(np.tanh(x._array))
+
+
+def trunc(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.trunc <numpy.trunc>`.
+
+    See its docstring for more information.
+    """
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in trunc")
+    if x.dtype in _integer_dtypes:
+        # Note: The return dtype of trunc is the same as the input
+        return x
+    return Array._new(np.trunc(x._array))
diff --git a/numpy/array_api/_manipulation_functions.py b/numpy/array_api/_manipulation_functions.py
new file mode 100644 (file)
index 0000000..4f2114f
--- /dev/null
@@ -0,0 +1,97 @@
+from __future__ import annotations
+
+from ._array_object import Array
+from ._data_type_functions import result_type
+
+from typing import List, Optional, Tuple, Union
+
+import numpy as np
+
+# Note: the function name is different here
+def concat(
+    arrays: Union[Tuple[Array, ...], List[Array]], /, *, axis: Optional[int] = 0
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.concatenate <numpy.concatenate>`.
+
+    See its docstring for more information.
+    """
+    # Note: Casting rules here are different from the np.concatenate default
+    # (no for scalars with axis=None, no cross-kind casting)
+    dtype = result_type(*arrays)
+    arrays = tuple(a._array for a in arrays)
+    return Array._new(np.concatenate(arrays, axis=axis, dtype=dtype))
+
+
+def expand_dims(x: Array, /, *, axis: int) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.expand_dims <numpy.expand_dims>`.
+
+    See its docstring for more information.
+    """
+    return Array._new(np.expand_dims(x._array, axis))
+
+
+def flip(x: Array, /, *, axis: Optional[Union[int, Tuple[int, ...]]] = None) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.flip <numpy.flip>`.
+
+    See its docstring for more information.
+    """
+    return Array._new(np.flip(x._array, axis=axis))
+
+
+# Note: The function name is different here (see also matrix_transpose).
+# Unlike transpose(), the axes argument is required.
+def permute_dims(x: Array, /, axes: Tuple[int, ...]) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.transpose <numpy.transpose>`.
+
+    See its docstring for more information.
+    """
+    return Array._new(np.transpose(x._array, axes))
+
+
+def reshape(x: Array, /, shape: Tuple[int, ...]) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.reshape <numpy.reshape>`.
+
+    See its docstring for more information.
+    """
+    return Array._new(np.reshape(x._array, shape))
+
+
+def roll(
+    x: Array,
+    /,
+    shift: Union[int, Tuple[int, ...]],
+    *,
+    axis: Optional[Union[int, Tuple[int, ...]]] = None,
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.roll <numpy.roll>`.
+
+    See its docstring for more information.
+    """
+    return Array._new(np.roll(x._array, shift, axis=axis))
+
+
+def squeeze(x: Array, /, axis: Union[int, Tuple[int, ...]]) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.squeeze <numpy.squeeze>`.
+
+    See its docstring for more information.
+    """
+    return Array._new(np.squeeze(x._array, axis=axis))
+
+
+def stack(arrays: Union[Tuple[Array, ...], List[Array]], /, *, axis: int = 0) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.stack <numpy.stack>`.
+
+    See its docstring for more information.
+    """
+    # Call result type here just to raise on disallowed type combinations
+    result_type(*arrays)
+    arrays = tuple(a._array for a in arrays)
+    return Array._new(np.stack(arrays, axis=axis))
diff --git a/numpy/array_api/_searching_functions.py b/numpy/array_api/_searching_functions.py
new file mode 100644 (file)
index 0000000..40f5a4d
--- /dev/null
@@ -0,0 +1,47 @@
+from __future__ import annotations
+
+from ._array_object import Array
+from ._dtypes import _result_type
+
+from typing import Optional, Tuple
+
+import numpy as np
+
+
+def argmax(x: Array, /, *, axis: Optional[int] = None, keepdims: bool = False) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.argmax <numpy.argmax>`.
+
+    See its docstring for more information.
+    """
+    return Array._new(np.asarray(np.argmax(x._array, axis=axis, keepdims=keepdims)))
+
+
+def argmin(x: Array, /, *, axis: Optional[int] = None, keepdims: bool = False) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.argmin <numpy.argmin>`.
+
+    See its docstring for more information.
+    """
+    return Array._new(np.asarray(np.argmin(x._array, axis=axis, keepdims=keepdims)))
+
+
+def nonzero(x: Array, /) -> Tuple[Array, ...]:
+    """
+    Array API compatible wrapper for :py:func:`np.nonzero <numpy.nonzero>`.
+
+    See its docstring for more information.
+    """
+    return tuple(Array._new(i) for i in np.nonzero(x._array))
+
+
+def where(condition: Array, x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.where <numpy.where>`.
+
+    See its docstring for more information.
+    """
+    # Call result type here just to raise on disallowed type combinations
+    _result_type(x1.dtype, x2.dtype)
+    x1, x2 = Array._normalize_two_args(x1, x2)
+    return Array._new(np.where(condition._array, x1._array, x2._array))
diff --git a/numpy/array_api/_set_functions.py b/numpy/array_api/_set_functions.py
new file mode 100644 (file)
index 0000000..05ee7e5
--- /dev/null
@@ -0,0 +1,92 @@
+from __future__ import annotations
+
+from ._array_object import Array
+
+from typing import NamedTuple
+
+import numpy as np
+
+# Note: np.unique() is split into four functions in the array API:
+# unique_all, unique_counts, unique_inverse, and unique_values (this is done
+# to remove polymorphic return types).
+
+# Note: The various unique() functions are supposed to return multiple NaNs.
+# This does not match the NumPy behavior, however, this is currently left as a
+# TODO in this implementation as this behavior may be reverted in np.unique().
+# See https://github.com/numpy/numpy/issues/20326.
+
+# Note: The functions here return a namedtuple (np.unique() returns a normal
+# tuple).
+
+class UniqueAllResult(NamedTuple):
+    values: Array
+    indices: Array
+    inverse_indices: Array
+    counts: Array
+
+
+class UniqueCountsResult(NamedTuple):
+    values: Array
+    counts: Array
+
+
+class UniqueInverseResult(NamedTuple):
+    values: Array
+    inverse_indices: Array
+
+
+def unique_all(x: Array, /) -> UniqueAllResult:
+    """
+    Array API compatible wrapper for :py:func:`np.unique <numpy.unique>`.
+
+    See its docstring for more information.
+    """
+    res = np.unique(
+        x._array,
+        return_counts=True,
+        return_index=True,
+        return_inverse=True,
+    )
+
+    return UniqueAllResult(*[Array._new(i) for i in res])
+
+
+def unique_counts(x: Array, /) -> UniqueCountsResult:
+    res = np.unique(
+        x._array,
+        return_counts=True,
+        return_index=False,
+        return_inverse=False,
+    )
+
+    return UniqueCountsResult(*[Array._new(i) for i in res])
+
+
+def unique_inverse(x: Array, /) -> UniqueInverseResult:
+    """
+    Array API compatible wrapper for :py:func:`np.unique <numpy.unique>`.
+
+    See its docstring for more information.
+    """
+    res = np.unique(
+        x._array,
+        return_counts=False,
+        return_index=False,
+        return_inverse=True,
+    )
+    return UniqueInverseResult(*[Array._new(i) for i in res])
+
+
+def unique_values(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.unique <numpy.unique>`.
+
+    See its docstring for more information.
+    """
+    res = np.unique(
+        x._array,
+        return_counts=False,
+        return_index=False,
+        return_inverse=False,
+    )
+    return Array._new(res)
diff --git a/numpy/array_api/_sorting_functions.py b/numpy/array_api/_sorting_functions.py
new file mode 100644 (file)
index 0000000..9cd4978
--- /dev/null
@@ -0,0 +1,37 @@
+from __future__ import annotations
+
+from ._array_object import Array
+
+import numpy as np
+
+
+def argsort(
+    x: Array, /, *, axis: int = -1, descending: bool = False, stable: bool = True
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.argsort <numpy.argsort>`.
+
+    See its docstring for more information.
+    """
+    # Note: this keyword argument is different, and the default is different.
+    kind = "stable" if stable else "quicksort"
+    res = np.argsort(x._array, axis=axis, kind=kind)
+    if descending:
+        res = np.flip(res, axis=axis)
+    return Array._new(res)
+
+
+def sort(
+    x: Array, /, *, axis: int = -1, descending: bool = False, stable: bool = True
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.sort <numpy.sort>`.
+
+    See its docstring for more information.
+    """
+    # Note: this keyword argument is different, and the default is different.
+    kind = "stable" if stable else "quicksort"
+    res = np.sort(x._array, axis=axis, kind=kind)
+    if descending:
+        res = np.flip(res, axis=axis)
+    return Array._new(res)
diff --git a/numpy/array_api/_statistical_functions.py b/numpy/array_api/_statistical_functions.py
new file mode 100644 (file)
index 0000000..5bc831a
--- /dev/null
@@ -0,0 +1,115 @@
+from __future__ import annotations
+
+from ._dtypes import (
+    _floating_dtypes,
+    _numeric_dtypes,
+)
+from ._array_object import Array
+from ._creation_functions import asarray
+from ._dtypes import float32, float64
+
+from typing import TYPE_CHECKING, Optional, Tuple, Union
+
+if TYPE_CHECKING:
+    from ._typing import Dtype
+
+import numpy as np
+
+
+def max(
+    x: Array,
+    /,
+    *,
+    axis: Optional[Union[int, Tuple[int, ...]]] = None,
+    keepdims: bool = False,
+) -> Array:
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in max")
+    return Array._new(np.max(x._array, axis=axis, keepdims=keepdims))
+
+
+def mean(
+    x: Array,
+    /,
+    *,
+    axis: Optional[Union[int, Tuple[int, ...]]] = None,
+    keepdims: bool = False,
+) -> Array:
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in mean")
+    return Array._new(np.mean(x._array, axis=axis, keepdims=keepdims))
+
+
+def min(
+    x: Array,
+    /,
+    *,
+    axis: Optional[Union[int, Tuple[int, ...]]] = None,
+    keepdims: bool = False,
+) -> Array:
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in min")
+    return Array._new(np.min(x._array, axis=axis, keepdims=keepdims))
+
+
+def prod(
+    x: Array,
+    /,
+    *,
+    axis: Optional[Union[int, Tuple[int, ...]]] = None,
+    dtype: Optional[Dtype] = None,
+    keepdims: bool = False,
+) -> Array:
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in prod")
+    # Note: sum() and prod() always upcast float32 to float64 for dtype=None
+    # We need to do so here before computing the product to avoid overflow
+    if dtype is None and x.dtype == float32:
+        dtype = float64
+    return Array._new(np.prod(x._array, dtype=dtype, axis=axis, keepdims=keepdims))
+
+
+def std(
+    x: Array,
+    /,
+    *,
+    axis: Optional[Union[int, Tuple[int, ...]]] = None,
+    correction: Union[int, float] = 0.0,
+    keepdims: bool = False,
+) -> Array:
+    # Note: the keyword argument correction is different here
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in std")
+    return Array._new(np.std(x._array, axis=axis, ddof=correction, keepdims=keepdims))
+
+
+def sum(
+    x: Array,
+    /,
+    *,
+    axis: Optional[Union[int, Tuple[int, ...]]] = None,
+    dtype: Optional[Dtype] = None,
+    keepdims: bool = False,
+) -> Array:
+    if x.dtype not in _numeric_dtypes:
+        raise TypeError("Only numeric dtypes are allowed in sum")
+    # Note: sum() and prod() always upcast integers to (u)int64 and float32 to
+    # float64 for dtype=None. `np.sum` does that too for integers, but not for
+    # float32, so we need to special-case it here
+    if dtype is None and x.dtype == float32:
+        dtype = float64
+    return Array._new(np.sum(x._array, axis=axis, dtype=dtype, keepdims=keepdims))
+
+
+def var(
+    x: Array,
+    /,
+    *,
+    axis: Optional[Union[int, Tuple[int, ...]]] = None,
+    correction: Union[int, float] = 0.0,
+    keepdims: bool = False,
+) -> Array:
+    # Note: the keyword argument correction is different here
+    if x.dtype not in _floating_dtypes:
+        raise TypeError("Only floating-point dtypes are allowed in var")
+    return Array._new(np.var(x._array, axis=axis, ddof=correction, keepdims=keepdims))
diff --git a/numpy/array_api/_typing.py b/numpy/array_api/_typing.py
new file mode 100644 (file)
index 0000000..dfa87b3
--- /dev/null
@@ -0,0 +1,74 @@
+"""
+This file defines the types for type annotations.
+
+These names aren't part of the module namespace, but they are used in the
+annotations in the function signatures. The functions in the module are only
+valid for inputs that match the given type annotations.
+"""
+
+from __future__ import annotations
+
+__all__ = [
+    "Array",
+    "Device",
+    "Dtype",
+    "SupportsDLPack",
+    "SupportsBufferProtocol",
+    "PyCapsule",
+]
+
+import sys
+from typing import (
+    Any,
+    Literal,
+    Sequence,
+    Type,
+    Union,
+    TYPE_CHECKING,
+    TypeVar,
+    Protocol,
+)
+
+from ._array_object import Array
+from numpy import (
+    dtype,
+    int8,
+    int16,
+    int32,
+    int64,
+    uint8,
+    uint16,
+    uint32,
+    uint64,
+    float32,
+    float64,
+)
+
+_T_co = TypeVar("_T_co", covariant=True)
+
+class NestedSequence(Protocol[_T_co]):
+    def __getitem__(self, key: int, /) -> _T_co | NestedSequence[_T_co]: ...
+    def __len__(self, /) -> int: ...
+
+Device = Literal["cpu"]
+if TYPE_CHECKING or sys.version_info >= (3, 9):
+    Dtype = dtype[Union[
+        int8,
+        int16,
+        int32,
+        int64,
+        uint8,
+        uint16,
+        uint32,
+        uint64,
+        float32,
+        float64,
+    ]]
+else:
+    Dtype = dtype
+
+SupportsBufferProtocol = Any
+PyCapsule = Any
+
+class SupportsDLPack(Protocol):
+    def __dlpack__(self, /, *, stream: None = ...) -> PyCapsule: ...
diff --git a/numpy/array_api/_utility_functions.py b/numpy/array_api/_utility_functions.py
new file mode 100644 (file)
index 0000000..5ecb4bd
--- /dev/null
@@ -0,0 +1,37 @@
+from __future__ import annotations
+
+from ._array_object import Array
+
+from typing import Optional, Tuple, Union
+
+import numpy as np
+
+
+def all(
+    x: Array,
+    /,
+    *,
+    axis: Optional[Union[int, Tuple[int, ...]]] = None,
+    keepdims: bool = False,
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.all <numpy.all>`.
+
+    See its docstring for more information.
+    """
+    return Array._new(np.asarray(np.all(x._array, axis=axis, keepdims=keepdims)))
+
+
+def any(
+    x: Array,
+    /,
+    *,
+    axis: Optional[Union[int, Tuple[int, ...]]] = None,
+    keepdims: bool = False,
+) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.any <numpy.any>`.
+
+    See its docstring for more information.
+    """
+    return Array._new(np.asarray(np.any(x._array, axis=axis, keepdims=keepdims)))
diff --git a/numpy/array_api/linalg.py b/numpy/array_api/linalg.py
new file mode 100644 (file)
index 0000000..8d7ba65
--- /dev/null
@@ -0,0 +1,408 @@
+from __future__ import annotations
+
+from ._dtypes import _floating_dtypes, _numeric_dtypes
+from ._array_object import Array
+
+from typing import TYPE_CHECKING
+if TYPE_CHECKING:
+    from ._typing import Literal, Optional, Sequence, Tuple, Union
+
+from typing import NamedTuple
+
+import numpy.linalg
+import numpy as np
+
+class EighResult(NamedTuple):
+    eigenvalues: Array
+    eigenvectors: Array
+
+class QRResult(NamedTuple):
+    Q: Array
+    R: Array
+
+class SlogdetResult(NamedTuple):
+    sign: Array
+    logabsdet: Array
+
+class SVDResult(NamedTuple):
+    U: Array
+    S: Array
+    Vh: Array
+
+# Note: the inclusion of the upper keyword is different from
+# np.linalg.cholesky, which does not have it.
+def cholesky(x: Array, /, *, upper: bool = False) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.linalg.cholesky <numpy.linalg.cholesky>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.cholesky.
+    if x.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed in cholesky')
+    L = np.linalg.cholesky(x._array)
+    if upper:
+        return Array._new(L).mT
+    return Array._new(L)
+
+# Note: cross is the numpy top-level namespace, not np.linalg
+def cross(x1: Array, x2: Array, /, *, axis: int = -1) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.cross <numpy.cross>`.
+
+    See its docstring for more information.
+    """
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError('Only numeric dtypes are allowed in cross')
+    # Note: this is different from np.cross(), which broadcasts
+    if x1.shape != x2.shape:
+        raise ValueError('x1 and x2 must have the same shape')
+    if x1.ndim == 0:
+        raise ValueError('cross() requires arrays of dimension at least 1')
+    # Note: this is different from np.cross(), which allows dimension 2
+    if x1.shape[axis] != 3:
+        raise ValueError('cross() dimension must equal 3')
+    return Array._new(np.cross(x1._array, x2._array, axis=axis))
+
+def det(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.linalg.det <numpy.linalg.det>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.det.
+    if x.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed in det')
+    return Array._new(np.linalg.det(x._array))
+
+# Note: diagonal is the numpy top-level namespace, not np.linalg
+def diagonal(x: Array, /, *, offset: int = 0) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.diagonal <numpy.diagonal>`.
+
+    See its docstring for more information.
+    """
+    # Note: diagonal always operates on the last two axes, whereas np.diagonal
+    # operates on the first two axes by default
+    return Array._new(np.diagonal(x._array, offset=offset, axis1=-2, axis2=-1))
+
+
+# Note: the keyword argument name upper is different from np.linalg.eigh
+def eigh(x: Array, /) -> EighResult:
+    """
+    Array API compatible wrapper for :py:func:`np.linalg.eigh <numpy.linalg.eigh>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.eigh.
+    if x.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed in eigh')
+
+    # Note: the return type here is a namedtuple, which is different from
+    # np.eigh, which only returns a tuple.
+    return EighResult(*map(Array._new, np.linalg.eigh(x._array)))
+
+
+# Note: the keyword argument name upper is different from np.linalg.eigvalsh
+def eigvalsh(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.linalg.eigvalsh <numpy.linalg.eigvalsh>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.eigvalsh.
+    if x.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed in eigvalsh')
+
+    return Array._new(np.linalg.eigvalsh(x._array))
+
+def inv(x: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.linalg.inv <numpy.linalg.inv>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.inv.
+    if x.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed in inv')
+
+    return Array._new(np.linalg.inv(x._array))
+
+
+# Note: matmul is the numpy top-level namespace but not in np.linalg
+def matmul(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.matmul <numpy.matmul>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to numeric dtypes only is different from
+    # np.matmul.
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError('Only numeric dtypes are allowed in matmul')
+
+    return Array._new(np.matmul(x1._array, x2._array))
+
+
+# Note: the name here is different from norm(). The array API norm is split
+# into matrix_norm and vector_norm().
+
+# The type for ord should be Optional[Union[int, float, Literal[np.inf,
+# -np.inf, 'fro', 'nuc']]], but Literal does not support floating-point
+# literals.
+def matrix_norm(x: Array, /, *, keepdims: bool = False, ord: Optional[Union[int, float, Literal['fro', 'nuc']]] = 'fro') -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.linalg.norm <numpy.linalg.norm>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.norm.
+    if x.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed in matrix_norm')
+
+    return Array._new(np.linalg.norm(x._array, axis=(-2, -1), keepdims=keepdims, ord=ord))
+
+
+def matrix_power(x: Array, n: int, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.matrix_power <numpy.matrix_power>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.matrix_power.
+    if x.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed for the first argument of matrix_power')
+
+    # np.matrix_power already checks if n is an integer
+    return Array._new(np.linalg.matrix_power(x._array, n))
+
+# Note: the keyword argument name rtol is different from np.linalg.matrix_rank
+def matrix_rank(x: Array, /, *, rtol: Optional[Union[float, Array]] = None) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.matrix_rank <numpy.matrix_rank>`.
+
+    See its docstring for more information.
+    """
+    # Note: this is different from np.linalg.matrix_rank, which supports 1
+    # dimensional arrays.
+    if x.ndim < 2:
+        raise np.linalg.LinAlgError("1-dimensional array given. Array must be at least two-dimensional")
+    S = np.linalg.svd(x._array, compute_uv=False)
+    if rtol is None:
+        tol = S.max(axis=-1, keepdims=True) * max(x.shape[-2:]) * np.finfo(S.dtype).eps
+    else:
+        if isinstance(rtol, Array):
+            rtol = rtol._array
+        # Note: this is different from np.linalg.matrix_rank, which does not multiply
+        # the tolerance by the largest singular value.
+        tol = S.max(axis=-1, keepdims=True)*np.asarray(rtol)[..., np.newaxis]
+    return Array._new(np.count_nonzero(S > tol, axis=-1))
+
+
+# Note: this function is new in the array API spec. Unlike transpose, it only
+# transposes the last two axes.
+def matrix_transpose(x: Array, /) -> Array:
+    if x.ndim < 2:
+        raise ValueError("x must be at least 2-dimensional for matrix_transpose")
+    return Array._new(np.swapaxes(x._array, -1, -2))
+
+# Note: outer is the numpy top-level namespace, not np.linalg
+def outer(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.outer <numpy.outer>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to numeric dtypes only is different from
+    # np.outer.
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError('Only numeric dtypes are allowed in outer')
+
+    # Note: the restriction to only 1-dim arrays is different from np.outer
+    if x1.ndim != 1 or x2.ndim != 1:
+        raise ValueError('The input arrays to outer must be 1-dimensional')
+
+    return Array._new(np.outer(x1._array, x2._array))
+
+# Note: the keyword argument name rtol is different from np.linalg.pinv
+def pinv(x: Array, /, *, rtol: Optional[Union[float, Array]] = None) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.linalg.pinv <numpy.linalg.pinv>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.pinv.
+    if x.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed in pinv')
+
+    # Note: this is different from np.linalg.pinv, which does not multiply the
+    # default tolerance by max(M, N).
+    if rtol is None:
+        rtol = max(x.shape[-2:]) * np.finfo(x.dtype).eps
+    return Array._new(np.linalg.pinv(x._array, rcond=rtol))
+
+def qr(x: Array, /, *, mode: Literal['reduced', 'complete'] = 'reduced') -> QRResult:
+    """
+    Array API compatible wrapper for :py:func:`np.linalg.qr <numpy.linalg.qr>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.qr.
+    if x.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed in qr')
+
+    # Note: the return type here is a namedtuple, which is different from
+    # np.linalg.qr, which only returns a tuple.
+    return QRResult(*map(Array._new, np.linalg.qr(x._array, mode=mode)))
+
+def slogdet(x: Array, /) -> SlogdetResult:
+    """
+    Array API compatible wrapper for :py:func:`np.linalg.slogdet <numpy.linalg.slogdet>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.slogdet.
+    if x.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed in slogdet')
+
+    # Note: the return type here is a namedtuple, which is different from
+    # np.linalg.slogdet, which only returns a tuple.
+    return SlogdetResult(*map(Array._new, np.linalg.slogdet(x._array)))
+
+# Note: unlike np.linalg.solve, the array API solve() only accepts x2 as a
+# vector when it is exactly 1-dimensional. All other cases treat x2 as a stack
+# of matrices. The np.linalg.solve behavior of allowing stacks of both
+# matrices and vectors is ambiguous c.f.
+# https://github.com/numpy/numpy/issues/15349 and
+# https://github.com/data-apis/array-api/issues/285.
+
+# To workaround this, the below is the code from np.linalg.solve except
+# only calling solve1 in the exactly 1D case.
+def _solve(a, b):
+    from ..linalg.linalg import (_makearray, _assert_stacked_2d,
+                                 _assert_stacked_square, _commonType,
+                                 isComplexType, get_linalg_error_extobj,
+                                 _raise_linalgerror_singular)
+    from ..linalg import _umath_linalg
+
+    a, _ = _makearray(a)
+    _assert_stacked_2d(a)
+    _assert_stacked_square(a)
+    b, wrap = _makearray(b)
+    t, result_t = _commonType(a, b)
+
+    # This part is different from np.linalg.solve
+    if b.ndim == 1:
+        gufunc = _umath_linalg.solve1
+    else:
+        gufunc = _umath_linalg.solve
+
+    # This does nothing currently but is left in because it will be relevant
+    # when complex dtype support is added to the spec in 2022.
+    signature = 'DD->D' if isComplexType(t) else 'dd->d'
+    extobj = get_linalg_error_extobj(_raise_linalgerror_singular)
+    r = gufunc(a, b, signature=signature, extobj=extobj)
+
+    return wrap(r.astype(result_t, copy=False))
+
+def solve(x1: Array, x2: Array, /) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.linalg.solve <numpy.linalg.solve>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.solve.
+    if x1.dtype not in _floating_dtypes or x2.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed in solve')
+
+    return Array._new(_solve(x1._array, x2._array))
+
+def svd(x: Array, /, *, full_matrices: bool = True) -> SVDResult:
+    """
+    Array API compatible wrapper for :py:func:`np.linalg.svd <numpy.linalg.svd>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.svd.
+    if x.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed in svd')
+
+    # Note: the return type here is a namedtuple, which is different from
+    # np.svd, which only returns a tuple.
+    return SVDResult(*map(Array._new, np.linalg.svd(x._array, full_matrices=full_matrices)))
+
+# Note: svdvals is not in NumPy (but it is in SciPy). It is equivalent to
+# np.linalg.svd(compute_uv=False).
+def svdvals(x: Array, /) -> Union[Array, Tuple[Array, ...]]:
+    return Array._new(np.linalg.svd(x._array, compute_uv=False))
+
+# Note: tensordot is the numpy top-level namespace but not in np.linalg
+
+# Note: axes must be a tuple, unlike np.tensordot where it can be an array or array-like.
+def tensordot(x1: Array, x2: Array, /, *, axes: Union[int, Tuple[Sequence[int], Sequence[int]]] = 2) -> Array:
+    # Note: the restriction to numeric dtypes only is different from
+    # np.tensordot.
+    if x1.dtype not in _numeric_dtypes or x2.dtype not in _numeric_dtypes:
+        raise TypeError('Only numeric dtypes are allowed in tensordot')
+
+    return Array._new(np.tensordot(x1._array, x2._array, axes=axes))
+
+# Note: trace is the numpy top-level namespace, not np.linalg
+def trace(x: Array, /, *, offset: int = 0) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.trace <numpy.trace>`.
+
+    See its docstring for more information.
+    """
+    # Note: trace always operates on the last two axes, whereas np.trace
+    # operates on the first two axes by default
+    return Array._new(np.asarray(np.trace(x._array, offset=offset, axis1=-2, axis2=-1)))
+
+# Note: vecdot is not in NumPy
+def vecdot(x1: Array, x2: Array, /, *, axis: int = -1) -> Array:
+    return tensordot(x1, x2, axes=((axis,), (axis,)))
+
+
+# Note: the name here is different from norm(). The array API norm is split
+# into matrix_norm and vector_norm().
+
+# The type for ord should be Optional[Union[int, float, Literal[np.inf,
+# -np.inf]]] but Literal does not support floating-point literals.
+def vector_norm(x: Array, /, *, axis: Optional[Union[int, Tuple[int, int]]] = None, keepdims: bool = False, ord: Optional[Union[int, float]] = 2) -> Array:
+    """
+    Array API compatible wrapper for :py:func:`np.linalg.norm <numpy.linalg.norm>`.
+
+    See its docstring for more information.
+    """
+    # Note: the restriction to floating-point dtypes only is different from
+    # np.linalg.norm.
+    if x.dtype not in _floating_dtypes:
+        raise TypeError('Only floating-point dtypes are allowed in norm')
+
+    a = x._array
+    if axis is None:
+        a = a.flatten()
+        axis = 0
+    elif isinstance(axis, tuple):
+        # Note: The axis argument supports any number of axes, whereas norm()
+        # only supports a single axis for vector norm.
+        rest = tuple(i for i in range(a.ndim) if i not in axis)
+        newshape = axis + rest
+        a = np.transpose(a, newshape).reshape((np.prod([a.shape[i] for i in axis]), *[a.shape[i] for i in rest]))
+        axis = 0
+    return Array._new(np.linalg.norm(a, axis=axis, keepdims=keepdims, ord=ord))
+
+
+__all__ = ['cholesky', 'cross', 'det', 'diagonal', 'eigh', 'eigvalsh', 'inv', 'matmul', 'matrix_norm', 'matrix_power', 'matrix_rank', 'matrix_transpose', 'outer', 'pinv', 'qr', 'slogdet', 'solve', 'svd', 'svdvals', 'tensordot', 'trace', 'vecdot', 'vector_norm']
diff --git a/numpy/array_api/setup.py b/numpy/array_api/setup.py
new file mode 100644 (file)
index 0000000..c8bc291
--- /dev/null
@@ -0,0 +1,12 @@
+def configuration(parent_package="", top_path=None):
+    from numpy.distutils.misc_util import Configuration
+
+    config = Configuration("array_api", parent_package, top_path)
+    config.add_subpackage("tests")
+    return config
+
+
+if __name__ == "__main__":
+    from numpy.distutils.core import setup
+
+    setup(configuration=configuration)
diff --git a/numpy/array_api/tests/__init__.py b/numpy/array_api/tests/__init__.py
new file mode 100644 (file)
index 0000000..536062e
--- /dev/null
@@ -0,0 +1,7 @@
+"""
+Tests for the array API namespace.
+
+Note, full compliance with the array API can be tested with the official array API test
+suite https://github.com/data-apis/array-api-tests. This test suite primarily
+focuses on those things that are not tested by the official test suite.
+"""
diff --git a/numpy/array_api/tests/test_array_object.py b/numpy/array_api/tests/test_array_object.py
new file mode 100644 (file)
index 0000000..b980bac
--- /dev/null
@@ -0,0 +1,324 @@
+import operator
+
+from numpy.testing import assert_raises
+import numpy as np
+
+from .. import ones, asarray, result_type, all, equal
+from .._array_object import Array
+from .._dtypes import (
+    _all_dtypes,
+    _boolean_dtypes,
+    _floating_dtypes,
+    _integer_dtypes,
+    _integer_or_boolean_dtypes,
+    _numeric_dtypes,
+    int8,
+    int16,
+    int32,
+    int64,
+    uint64,
+)
+
+
+def test_validate_index():
+    # The indexing tests in the official array API test suite test that the
+    # array object correctly handles the subset of indices that are required
+    # by the spec. But the NumPy array API implementation specifically
+    # disallows any index not required by the spec, via Array._validate_index.
+    # This test focuses on testing that non-valid indices are correctly
+    # rejected. See
+    # https://data-apis.org/array-api/latest/API_specification/indexing.html
+    # and the docstring of Array._validate_index for the exact indexing
+    # behavior that should be allowed. This does not test indices that are
+    # already invalid in NumPy itself because Array will generally just pass
+    # such indices directly to the underlying np.ndarray.
+
+    a = ones((3, 4))
+
+    # Out of bounds slices are not allowed
+    assert_raises(IndexError, lambda: a[:4])
+    assert_raises(IndexError, lambda: a[:-4])
+    assert_raises(IndexError, lambda: a[:3:-1])
+    assert_raises(IndexError, lambda: a[:-5:-1])
+    assert_raises(IndexError, lambda: a[4:])
+    assert_raises(IndexError, lambda: a[-4:])
+    assert_raises(IndexError, lambda: a[4::-1])
+    assert_raises(IndexError, lambda: a[-4::-1])
+
+    assert_raises(IndexError, lambda: a[...,:5])
+    assert_raises(IndexError, lambda: a[...,:-5])
+    assert_raises(IndexError, lambda: a[...,:5:-1])
+    assert_raises(IndexError, lambda: a[...,:-6:-1])
+    assert_raises(IndexError, lambda: a[...,5:])
+    assert_raises(IndexError, lambda: a[...,-5:])
+    assert_raises(IndexError, lambda: a[...,5::-1])
+    assert_raises(IndexError, lambda: a[...,-5::-1])
+
+    # Boolean indices cannot be part of a larger tuple index
+    assert_raises(IndexError, lambda: a[a[:,0]==1,0])
+    assert_raises(IndexError, lambda: a[a[:,0]==1,...])
+    assert_raises(IndexError, lambda: a[..., a[0]==1])
+    assert_raises(IndexError, lambda: a[[True, True, True]])
+    assert_raises(IndexError, lambda: a[(True, True, True),])
+
+    # Integer array indices are not allowed (except for 0-D)
+    idx = asarray([[0, 1]])
+    assert_raises(IndexError, lambda: a[idx])
+    assert_raises(IndexError, lambda: a[idx,])
+    assert_raises(IndexError, lambda: a[[0, 1]])
+    assert_raises(IndexError, lambda: a[(0, 1), (0, 1)])
+    assert_raises(IndexError, lambda: a[[0, 1]])
+    assert_raises(IndexError, lambda: a[np.array([[0, 1]])])
+
+    # np.newaxis is not allowed
+    assert_raises(IndexError, lambda: a[None])
+    assert_raises(IndexError, lambda: a[None, ...])
+    assert_raises(IndexError, lambda: a[..., None])
+
+    # Multiaxis indices must contain exactly as many indices as dimensions
+    assert_raises(IndexError, lambda: a[()])
+    assert_raises(IndexError, lambda: a[0,])
+    assert_raises(IndexError, lambda: a[0])
+    assert_raises(IndexError, lambda: a[:])
+
+def test_operators():
+    # For every operator, we test that it works for the required type
+    # combinations and raises TypeError otherwise
+    binary_op_dtypes = {
+        "__add__": "numeric",
+        "__and__": "integer_or_boolean",
+        "__eq__": "all",
+        "__floordiv__": "numeric",
+        "__ge__": "numeric",
+        "__gt__": "numeric",
+        "__le__": "numeric",
+        "__lshift__": "integer",
+        "__lt__": "numeric",
+        "__mod__": "numeric",
+        "__mul__": "numeric",
+        "__ne__": "all",
+        "__or__": "integer_or_boolean",
+        "__pow__": "floating",
+        "__rshift__": "integer",
+        "__sub__": "numeric",
+        "__truediv__": "floating",
+        "__xor__": "integer_or_boolean",
+    }
+
+    # Recompute each time because of in-place ops
+    def _array_vals():
+        for d in _integer_dtypes:
+            yield asarray(1, dtype=d)
+        for d in _boolean_dtypes:
+            yield asarray(False, dtype=d)
+        for d in _floating_dtypes:
+            yield asarray(1.0, dtype=d)
+
+    for op, dtypes in binary_op_dtypes.items():
+        ops = [op]
+        if op not in ["__eq__", "__ne__", "__le__", "__ge__", "__lt__", "__gt__"]:
+            rop = "__r" + op[2:]
+            iop = "__i" + op[2:]
+            ops += [rop, iop]
+        for s in [1, 1.0, False]:
+            for _op in ops:
+                for a in _array_vals():
+                    # Test array op scalar. From the spec, the following combinations
+                    # are supported:
+
+                    # - Python bool for a bool array dtype,
+                    # - a Python int within the bounds of the given dtype for integer array dtypes,
+                    # - a Python int or float for floating-point array dtypes
+
+                    # We do not do bounds checking for int scalars, but rather use the default
+                    # NumPy behavior for casting in that case.
+
+                    if ((dtypes == "all"
+                         or dtypes == "numeric" and a.dtype in _numeric_dtypes
+                         or dtypes == "integer" and a.dtype in _integer_dtypes
+                         or dtypes == "integer_or_boolean" and a.dtype in _integer_or_boolean_dtypes
+                         or dtypes == "boolean" and a.dtype in _boolean_dtypes
+                         or dtypes == "floating" and a.dtype in _floating_dtypes
+                        )
+                        # bool is a subtype of int, which is why we avoid
+                        # isinstance here.
+                        and (a.dtype in _boolean_dtypes and type(s) == bool
+                             or a.dtype in _integer_dtypes and type(s) == int
+                             or a.dtype in _floating_dtypes and type(s) in [float, int]
+                        )):
+                        # Only test for no error
+                        getattr(a, _op)(s)
+                    else:
+                        assert_raises(TypeError, lambda: getattr(a, _op)(s))
+
+                # Test array op array.
+                for _op in ops:
+                    for x in _array_vals():
+                        for y in _array_vals():
+                            # See the promotion table in NEP 47 or the array
+                            # API spec page on type promotion. Mixed kind
+                            # promotion is not defined.
+                            if (x.dtype == uint64 and y.dtype in [int8, int16, int32, int64]
+                                or y.dtype == uint64 and x.dtype in [int8, int16, int32, int64]
+                                or x.dtype in _integer_dtypes and y.dtype not in _integer_dtypes
+                                or y.dtype in _integer_dtypes and x.dtype not in _integer_dtypes
+                                or x.dtype in _boolean_dtypes and y.dtype not in _boolean_dtypes
+                                or y.dtype in _boolean_dtypes and x.dtype not in _boolean_dtypes
+                                or x.dtype in _floating_dtypes and y.dtype not in _floating_dtypes
+                                or y.dtype in _floating_dtypes and x.dtype not in _floating_dtypes
+                                ):
+                                assert_raises(TypeError, lambda: getattr(x, _op)(y))
+                            # Ensure in-place operators only promote to the same dtype as the left operand.
+                            elif (
+                                _op.startswith("__i")
+                                and result_type(x.dtype, y.dtype) != x.dtype
+                            ):
+                                assert_raises(TypeError, lambda: getattr(x, _op)(y))
+                            # Ensure only those dtypes that are required for every operator are allowed.
+                            elif (dtypes == "all" and (x.dtype in _boolean_dtypes and y.dtype in _boolean_dtypes
+                                                      or x.dtype in _numeric_dtypes and y.dtype in _numeric_dtypes)
+                                or (dtypes == "numeric" and x.dtype in _numeric_dtypes and y.dtype in _numeric_dtypes)
+                                or dtypes == "integer" and x.dtype in _integer_dtypes and y.dtype in _numeric_dtypes
+                                or dtypes == "integer_or_boolean" and (x.dtype in _integer_dtypes and y.dtype in _integer_dtypes
+                                                                       or x.dtype in _boolean_dtypes and y.dtype in _boolean_dtypes)
+                                or dtypes == "boolean" and x.dtype in _boolean_dtypes and y.dtype in _boolean_dtypes
+                                or dtypes == "floating" and x.dtype in _floating_dtypes and y.dtype in _floating_dtypes
+                            ):
+                                getattr(x, _op)(y)
+                            else:
+                                assert_raises(TypeError, lambda: getattr(x, _op)(y))
+
+    unary_op_dtypes = {
+        "__abs__": "numeric",
+        "__invert__": "integer_or_boolean",
+        "__neg__": "numeric",
+        "__pos__": "numeric",
+    }
+    for op, dtypes in unary_op_dtypes.items():
+        for a in _array_vals():
+            if (
+                dtypes == "numeric"
+                and a.dtype in _numeric_dtypes
+                or dtypes == "integer_or_boolean"
+                and a.dtype in _integer_or_boolean_dtypes
+            ):
+                # Only test for no error
+                getattr(a, op)()
+            else:
+                assert_raises(TypeError, lambda: getattr(a, op)())
+
+    # Finally, matmul() must be tested separately, because it works a bit
+    # different from the other operations.
+    def _matmul_array_vals():
+        for a in _array_vals():
+            yield a
+        for d in _all_dtypes:
+            yield ones((3, 4), dtype=d)
+            yield ones((4, 2), dtype=d)
+            yield ones((4, 4), dtype=d)
+
+    # Scalars always error
+    for _op in ["__matmul__", "__rmatmul__", "__imatmul__"]:
+        for s in [1, 1.0, False]:
+            for a in _matmul_array_vals():
+                if (type(s) in [float, int] and a.dtype in _floating_dtypes
+                    or type(s) == int and a.dtype in _integer_dtypes):
+                    # Type promotion is valid, but @ is not allowed on 0-D
+                    # inputs, so the error is a ValueError
+                    assert_raises(ValueError, lambda: getattr(a, _op)(s))
+                else:
+                    assert_raises(TypeError, lambda: getattr(a, _op)(s))
+
+    for x in _matmul_array_vals():
+        for y in _matmul_array_vals():
+            if (x.dtype == uint64 and y.dtype in [int8, int16, int32, int64]
+                or y.dtype == uint64 and x.dtype in [int8, int16, int32, int64]
+                or x.dtype in _integer_dtypes and y.dtype not in _integer_dtypes
+                or y.dtype in _integer_dtypes and x.dtype not in _integer_dtypes
+                or x.dtype in _floating_dtypes and y.dtype not in _floating_dtypes
+                or y.dtype in _floating_dtypes and x.dtype not in _floating_dtypes
+                or x.dtype in _boolean_dtypes
+                or y.dtype in _boolean_dtypes
+                ):
+                assert_raises(TypeError, lambda: x.__matmul__(y))
+                assert_raises(TypeError, lambda: y.__rmatmul__(x))
+                assert_raises(TypeError, lambda: x.__imatmul__(y))
+            elif x.shape == () or y.shape == () or x.shape[1] != y.shape[0]:
+                assert_raises(ValueError, lambda: x.__matmul__(y))
+                assert_raises(ValueError, lambda: y.__rmatmul__(x))
+                if result_type(x.dtype, y.dtype) != x.dtype:
+                    assert_raises(TypeError, lambda: x.__imatmul__(y))
+                else:
+                    assert_raises(ValueError, lambda: x.__imatmul__(y))
+            else:
+                x.__matmul__(y)
+                y.__rmatmul__(x)
+                if result_type(x.dtype, y.dtype) != x.dtype:
+                    assert_raises(TypeError, lambda: x.__imatmul__(y))
+                elif y.shape[0] != y.shape[1]:
+                    # This one fails because x @ y has a different shape from x
+                    assert_raises(ValueError, lambda: x.__imatmul__(y))
+                else:
+                    x.__imatmul__(y)
+
+
+def test_python_scalar_construtors():
+    b = asarray(False)
+    i = asarray(0)
+    f = asarray(0.0)
+
+    assert bool(b) == False
+    assert int(i) == 0
+    assert float(f) == 0.0
+    assert operator.index(i) == 0
+
+    # bool/int/float should only be allowed on 0-D arrays.
+    assert_raises(TypeError, lambda: bool(asarray([False])))
+    assert_raises(TypeError, lambda: int(asarray([0])))
+    assert_raises(TypeError, lambda: float(asarray([0.0])))
+    assert_raises(TypeError, lambda: operator.index(asarray([0])))
+
+    # bool/int/float should only be allowed on arrays of the corresponding
+    # dtype
+    assert_raises(ValueError, lambda: bool(i))
+    assert_raises(ValueError, lambda: bool(f))
+
+    assert_raises(ValueError, lambda: int(b))
+    assert_raises(ValueError, lambda: int(f))
+
+    assert_raises(ValueError, lambda: float(b))
+    assert_raises(ValueError, lambda: float(i))
+
+    assert_raises(TypeError, lambda: operator.index(b))
+    assert_raises(TypeError, lambda: operator.index(f))
+
+
+def test_device_property():
+    a = ones((3, 4))
+    assert a.device == 'cpu'
+
+    assert all(equal(a.to_device('cpu'), a))
+    assert_raises(ValueError, lambda: a.to_device('gpu'))
+
+    assert all(equal(asarray(a, device='cpu'), a))
+    assert_raises(ValueError, lambda: asarray(a, device='gpu'))
+
+def test_array_properties():
+    a = ones((1, 2, 3))
+    b = ones((2, 3))
+    assert_raises(ValueError, lambda: a.T)
+
+    assert isinstance(b.T, Array)
+    assert b.T.shape == (3, 2)
+
+    assert isinstance(a.mT, Array)
+    assert a.mT.shape == (1, 3, 2)
+    assert isinstance(b.mT, Array)
+    assert b.mT.shape == (3, 2)
+
+def test___array__():
+    a = ones((2, 3), dtype=int16)
+    assert np.asarray(a) is a._array
+    b = np.asarray(a, dtype=np.float64)
+    assert np.all(np.equal(b, np.ones((2, 3), dtype=np.float64)))
+    assert b.dtype == np.float64
diff --git a/numpy/array_api/tests/test_creation_functions.py b/numpy/array_api/tests/test_creation_functions.py
new file mode 100644 (file)
index 0000000..be9eaa3
--- /dev/null
@@ -0,0 +1,142 @@
+from numpy.testing import assert_raises
+import numpy as np
+
+from .. import all
+from .._creation_functions import (
+    asarray,
+    arange,
+    empty,
+    empty_like,
+    eye,
+    full,
+    full_like,
+    linspace,
+    meshgrid,
+    ones,
+    ones_like,
+    zeros,
+    zeros_like,
+)
+from .._dtypes import float32, float64
+from .._array_object import Array
+
+
+def test_asarray_errors():
+    # Test various protections against incorrect usage
+    assert_raises(TypeError, lambda: Array([1]))
+    assert_raises(TypeError, lambda: asarray(["a"]))
+    assert_raises(ValueError, lambda: asarray([1.0], dtype=np.float16))
+    assert_raises(OverflowError, lambda: asarray(2**100))
+    # Preferably this would be OverflowError
+    # assert_raises(OverflowError, lambda: asarray([2**100]))
+    assert_raises(TypeError, lambda: asarray([2**100]))
+    asarray([1], device="cpu")  # Doesn't error
+    assert_raises(ValueError, lambda: asarray([1], device="gpu"))
+
+    assert_raises(ValueError, lambda: asarray([1], dtype=int))
+    assert_raises(ValueError, lambda: asarray([1], dtype="i"))
+
+
+def test_asarray_copy():
+    a = asarray([1])
+    b = asarray(a, copy=True)
+    a[0] = 0
+    assert all(b[0] == 1)
+    assert all(a[0] == 0)
+    a = asarray([1])
+    b = asarray(a, copy=np._CopyMode.ALWAYS)
+    a[0] = 0
+    assert all(b[0] == 1)
+    assert all(a[0] == 0)
+    a = asarray([1])
+    b = asarray(a, copy=np._CopyMode.NEVER)
+    a[0] = 0
+    assert all(b[0] == 0)
+    assert_raises(NotImplementedError, lambda: asarray(a, copy=False))
+    assert_raises(NotImplementedError,
+                  lambda: asarray(a, copy=np._CopyMode.IF_NEEDED))
+
+
+def test_arange_errors():
+    arange(1, device="cpu")  # Doesn't error
+    assert_raises(ValueError, lambda: arange(1, device="gpu"))
+    assert_raises(ValueError, lambda: arange(1, dtype=int))
+    assert_raises(ValueError, lambda: arange(1, dtype="i"))
+
+
+def test_empty_errors():
+    empty((1,), device="cpu")  # Doesn't error
+    assert_raises(ValueError, lambda: empty((1,), device="gpu"))
+    assert_raises(ValueError, lambda: empty((1,), dtype=int))
+    assert_raises(ValueError, lambda: empty((1,), dtype="i"))
+
+
+def test_empty_like_errors():
+    empty_like(asarray(1), device="cpu")  # Doesn't error
+    assert_raises(ValueError, lambda: empty_like(asarray(1), device="gpu"))
+    assert_raises(ValueError, lambda: empty_like(asarray(1), dtype=int))
+    assert_raises(ValueError, lambda: empty_like(asarray(1), dtype="i"))
+
+
+def test_eye_errors():
+    eye(1, device="cpu")  # Doesn't error
+    assert_raises(ValueError, lambda: eye(1, device="gpu"))
+    assert_raises(ValueError, lambda: eye(1, dtype=int))
+    assert_raises(ValueError, lambda: eye(1, dtype="i"))
+
+
+def test_full_errors():
+    full((1,), 0, device="cpu")  # Doesn't error
+    assert_raises(ValueError, lambda: full((1,), 0, device="gpu"))
+    assert_raises(ValueError, lambda: full((1,), 0, dtype=int))
+    assert_raises(ValueError, lambda: full((1,), 0, dtype="i"))
+
+
+def test_full_like_errors():
+    full_like(asarray(1), 0, device="cpu")  # Doesn't error
+    assert_raises(ValueError, lambda: full_like(asarray(1), 0, device="gpu"))
+    assert_raises(ValueError, lambda: full_like(asarray(1), 0, dtype=int))
+    assert_raises(ValueError, lambda: full_like(asarray(1), 0, dtype="i"))
+
+
+def test_linspace_errors():
+    linspace(0, 1, 10, device="cpu")  # Doesn't error
+    assert_raises(ValueError, lambda: linspace(0, 1, 10, device="gpu"))
+    assert_raises(ValueError, lambda: linspace(0, 1, 10, dtype=float))
+    assert_raises(ValueError, lambda: linspace(0, 1, 10, dtype="f"))
+
+
+def test_ones_errors():
+    ones((1,), device="cpu")  # Doesn't error
+    assert_raises(ValueError, lambda: ones((1,), device="gpu"))
+    assert_raises(ValueError, lambda: ones((1,), dtype=int))
+    assert_raises(ValueError, lambda: ones((1,), dtype="i"))
+
+
+def test_ones_like_errors():
+    ones_like(asarray(1), device="cpu")  # Doesn't error
+    assert_raises(ValueError, lambda: ones_like(asarray(1), device="gpu"))
+    assert_raises(ValueError, lambda: ones_like(asarray(1), dtype=int))
+    assert_raises(ValueError, lambda: ones_like(asarray(1), dtype="i"))
+
+
+def test_zeros_errors():
+    zeros((1,), device="cpu")  # Doesn't error
+    assert_raises(ValueError, lambda: zeros((1,), device="gpu"))
+    assert_raises(ValueError, lambda: zeros((1,), dtype=int))
+    assert_raises(ValueError, lambda: zeros((1,), dtype="i"))
+
+
+def test_zeros_like_errors():
+    zeros_like(asarray(1), device="cpu")  # Doesn't error
+    assert_raises(ValueError, lambda: zeros_like(asarray(1), device="gpu"))
+    assert_raises(ValueError, lambda: zeros_like(asarray(1), dtype=int))
+    assert_raises(ValueError, lambda: zeros_like(asarray(1), dtype="i"))
+
+def test_meshgrid_dtype_errors():
+    # Doesn't raise
+    meshgrid()
+    meshgrid(asarray([1.], dtype=float32))
+    meshgrid(asarray([1.], dtype=float32), asarray([1.], dtype=float32))
+
+    assert_raises(ValueError, lambda: meshgrid(asarray([1.], dtype=float32), asarray([1.], dtype=float64)))
diff --git a/numpy/array_api/tests/test_elementwise_functions.py b/numpy/array_api/tests/test_elementwise_functions.py
new file mode 100644 (file)
index 0000000..a9274ae
--- /dev/null
@@ -0,0 +1,111 @@
+from inspect import getfullargspec
+
+from numpy.testing import assert_raises
+
+from .. import asarray, _elementwise_functions
+from .._elementwise_functions import bitwise_left_shift, bitwise_right_shift
+from .._dtypes import (
+    _dtype_categories,
+    _boolean_dtypes,
+    _floating_dtypes,
+    _integer_dtypes,
+)
+
+
+def nargs(func):
+    return len(getfullargspec(func).args)
+
+
+def test_function_types():
+    # Test that every function accepts only the required input types. We only
+    # test the negative cases here (error). The positive cases are tested in
+    # the array API test suite.
+
+    elementwise_function_input_types = {
+        "abs": "numeric",
+        "acos": "floating-point",
+        "acosh": "floating-point",
+        "add": "numeric",
+        "asin": "floating-point",
+        "asinh": "floating-point",
+        "atan": "floating-point",
+        "atan2": "floating-point",
+        "atanh": "floating-point",
+        "bitwise_and": "integer or boolean",
+        "bitwise_invert": "integer or boolean",
+        "bitwise_left_shift": "integer",
+        "bitwise_or": "integer or boolean",
+        "bitwise_right_shift": "integer",
+        "bitwise_xor": "integer or boolean",
+        "ceil": "numeric",
+        "cos": "floating-point",
+        "cosh": "floating-point",
+        "divide": "floating-point",
+        "equal": "all",
+        "exp": "floating-point",
+        "expm1": "floating-point",
+        "floor": "numeric",
+        "floor_divide": "numeric",
+        "greater": "numeric",
+        "greater_equal": "numeric",
+        "isfinite": "numeric",
+        "isinf": "numeric",
+        "isnan": "numeric",
+        "less": "numeric",
+        "less_equal": "numeric",
+        "log": "floating-point",
+        "logaddexp": "floating-point",
+        "log10": "floating-point",
+        "log1p": "floating-point",
+        "log2": "floating-point",
+        "logical_and": "boolean",
+        "logical_not": "boolean",
+        "logical_or": "boolean",
+        "logical_xor": "boolean",
+        "multiply": "numeric",
+        "negative": "numeric",
+        "not_equal": "all",
+        "positive": "numeric",
+        "pow": "floating-point",
+        "remainder": "numeric",
+        "round": "numeric",
+        "sign": "numeric",
+        "sin": "floating-point",
+        "sinh": "floating-point",
+        "sqrt": "floating-point",
+        "square": "numeric",
+        "subtract": "numeric",
+        "tan": "floating-point",
+        "tanh": "floating-point",
+        "trunc": "numeric",
+    }
+
+    def _array_vals():
+        for d in _integer_dtypes:
+            yield asarray(1, dtype=d)
+        for d in _boolean_dtypes:
+            yield asarray(False, dtype=d)
+        for d in _floating_dtypes:
+            yield asarray(1.0, dtype=d)
+
+    for x in _array_vals():
+        for func_name, types in elementwise_function_input_types.items():
+            dtypes = _dtype_categories[types]
+            func = getattr(_elementwise_functions, func_name)
+            if nargs(func) == 2:
+                for y in _array_vals():
+                    if x.dtype not in dtypes or y.dtype not in dtypes:
+                        assert_raises(TypeError, lambda: func(x, y))
+            else:
+                if x.dtype not in dtypes:
+                    assert_raises(TypeError, lambda: func(x))
+
+
+def test_bitwise_shift_error():
+    # bitwise shift functions should raise when the second argument is negative
+    assert_raises(
+        ValueError, lambda: bitwise_left_shift(asarray([1, 1]), asarray([1, -1]))
+    )
+    assert_raises(
+        ValueError, lambda: bitwise_right_shift(asarray([1, 1]), asarray([1, -1]))
+    )
diff --git a/numpy/char.pyi b/numpy/char.pyi
deleted file mode 100644 (file)
index 4904aa2..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-from typing import Any, List
-
-from numpy import (
-    chararray as chararray,
-)
-
-__all__: List[str]
-
-def equal(x1, x2): ...
-def not_equal(x1, x2): ...
-def greater_equal(x1, x2): ...
-def less_equal(x1, x2): ...
-def greater(x1, x2): ...
-def less(x1, x2): ...
-def str_len(a): ...
-def add(x1, x2): ...
-def multiply(a, i): ...
-def mod(a, values): ...
-def capitalize(a): ...
-def center(a, width, fillchar=...): ...
-def count(a, sub, start=..., end=...): ...
-def decode(a, encoding=..., errors=...): ...
-def encode(a, encoding=..., errors=...): ...
-def endswith(a, suffix, start=..., end=...): ...
-def expandtabs(a, tabsize=...): ...
-def find(a, sub, start=..., end=...): ...
-def index(a, sub, start=..., end=...): ...
-def isalnum(a): ...
-def isalpha(a): ...
-def isdigit(a): ...
-def islower(a): ...
-def isspace(a): ...
-def istitle(a): ...
-def isupper(a): ...
-def join(sep, seq): ...
-def ljust(a, width, fillchar=...): ...
-def lower(a): ...
-def lstrip(a, chars=...): ...
-def partition(a, sep): ...
-def replace(a, old, new, count=...): ...
-def rfind(a, sub, start=..., end=...): ...
-def rindex(a, sub, start=..., end=...): ...
-def rjust(a, width, fillchar=...): ...
-def rpartition(a, sep): ...
-def rsplit(a, sep=..., maxsplit=...): ...
-def rstrip(a, chars=...): ...
-def split(a, sep=..., maxsplit=...): ...
-def splitlines(a, keepends=...): ...
-def startswith(a, prefix, start=..., end=...): ...
-def strip(a, chars=...): ...
-def swapcase(a): ...
-def title(a): ...
-def translate(a, table, deletechars=...): ...
-def upper(a): ...
-def zfill(a, width): ...
-def isnumeric(a): ...
-def isdecimal(a): ...
-def array(obj, itemsize=..., copy=..., unicode=..., order=...): ...
-def asarray(obj, itemsize=..., unicode=..., order=...): ...
index 5704610711fd07af4c39200e14f49fac5d462792..3d10bb988c2f03587af7bd677065b50f8284963b 100644 (file)
@@ -20,10 +20,6 @@ import sys
 import os
 from pathlib import Path
 import io
-
-import abc
-from abc import ABC as abc_ABC
-
 try:
     import pickle5 as pickle
 except ImportError:
index e15ee08451e784c3fedd9a4e2a8276ea5ea7e7dd..fd5fdd77d2241f6b80dff78e2a51d06a60b63ef1 100644 (file)
@@ -33,7 +33,7 @@ hypothesis.settings.register_profile(
     suppress_health_check=hypothesis.HealthCheck.all(),
 )
 # Note that the default profile is chosen based on the presence 
-# of pytest.ini, but can be overriden by passing the 
+# of pytest.ini, but can be overridden by passing the 
 # --hypothesis-profile=NAME argument to pytest.
 _pytest_ini = os.path.join(os.path.dirname(__file__), "..", "pytest.ini")
 hypothesis.settings.load_profile(
index dad9293e1a19e8cae141e14fbfb23acc0f0f7ff6..b89e27f0f7650eb9500fdb8885d5d5289197d18c 100644 (file)
@@ -9,6 +9,7 @@ are available in the main ``numpy`` namespace - use that instead.
 from numpy.version import version as __version__
 
 import os
+import warnings
 
 # disables OpenBLAS affinity setting of the main thread that limits
 # python threads or processes to one core
@@ -80,8 +81,8 @@ from .memmap import *
 from .defchararray import chararray
 from . import function_base
 from .function_base import *
-from . import machar
-from .machar import *
+from . import _machar
+from ._machar import *
 from . import getlimits
 from .getlimits import *
 from . import shape_base
@@ -105,11 +106,9 @@ from . import _methods
 
 __all__ = ['char', 'rec', 'memmap']
 __all__ += numeric.__all__
-__all__ += fromnumeric.__all__
 __all__ += ['record', 'recarray', 'format_parser']
 __all__ += ['chararray']
 __all__ += function_base.__all__
-__all__ += machar.__all__
 __all__ += getlimits.__all__
 __all__ += shape_base.__all__
 __all__ += einsumfunc.__all__
@@ -151,6 +150,17 @@ def _DType_reduce(DType):
     return _DType_reconstruct, (scalar_type,)
 
 
+def __getattr__(name):
+    # Deprecated 2021-10-20, NumPy 1.22
+    if name == "machar":
+        warnings.warn(
+            "The `np.core.machar` module is deprecated (NumPy 1.22)",
+            DeprecationWarning, stacklevel=2,
+        )
+        return _machar
+    raise AttributeError(f"Module {__name__!r} has no attribute {name!r}")
+
+
 import copyreg
 
 copyreg.pickle(ufunc, _ufunc_reduce)
index b8f0ee907b4b2166d6afaa022cbc5133de94a440..078c5897678c5f1b95f501bb0473f317ddc559b4 100644 (file)
@@ -328,7 +328,7 @@ add_newdoc('numpy.core', 'nditer',
     ...     with it:
     ...         for (a, b, c) in it:
     ...             addop(a, b, out=c)
-    ...     return it.operands[2]
+    ...         return it.operands[2]
 
     Here is the same function, but following the C-style pattern:
 
@@ -478,7 +478,7 @@ add_newdoc('numpy.core', 'nditer', ('iternext',
 
 add_newdoc('numpy.core', 'nditer', ('remove_axis',
     """
-    remove_axis(i)
+    remove_axis(i, /)
 
     Removes axis `i` from the iterator. Requires that the flag "multi_index"
     be enabled.
@@ -504,6 +504,9 @@ add_newdoc('numpy.core', 'nditer', ('reset',
 
 add_newdoc('numpy.core', 'nested_iters',
     """
+    nested_iters(op, axes, flags=None, op_flags=None, op_dtypes=None, \
+    order="K", casting="safe", buffersize=0)
+
     Create nditers for use in nested loops
 
     Create a tuple of `nditer` objects which iterate in nested loops over
@@ -796,6 +799,8 @@ add_newdoc('numpy.core.multiarray', 'array',
     object : array_like
         An array, any object exposing the array interface, an object whose
         __array__ method returns an array, or any (nested) sequence.
+        If object is a scalar, a 0-dimensional array containing object is
+        returned.
     dtype : data-type, optional
         The desired data-type for the array.  If not given, then the type will
         be determined as the minimum type required to hold the objects in the
@@ -924,7 +929,7 @@ add_newdoc('numpy.core.multiarray', 'asarray',
         'F' column-major (Fortran-style) memory representation.
         'A' (any) means 'F' if `a` is Fortran contiguous, 'C' otherwise
         'K' (keep) preserve input order
-        Defaults to 'C'.
+        Defaults to 'K'.
     ${ARRAY_FUNCTION_LIKE}
 
         .. versionadded:: 1.20.0
@@ -1280,7 +1285,7 @@ add_newdoc('numpy.core.multiarray', 'set_typeDict',
 
 add_newdoc('numpy.core.multiarray', 'fromstring',
     """
-    fromstring(string, dtype=float, count=-1, sep='', *, like=None)
+    fromstring(string, dtype=float, count=-1, *, sep, like=None)
 
     A new 1-D array initialized from text data in a string.
 
@@ -1346,16 +1351,16 @@ add_newdoc('numpy.core.multiarray', 'fromstring',
 
 add_newdoc('numpy.core.multiarray', 'compare_chararrays',
     """
-    compare_chararrays(a, b, cmp_op, rstrip)
+    compare_chararrays(a1, a2, cmp, rstrip)
 
     Performs element-wise comparison of two string arrays using the
     comparison operator specified by `cmp_op`.
 
     Parameters
     ----------
-    a, b : array_like
+    a1, a2 : array_like
         Arrays to be compared.
-    cmp_op : {"<", "<=", "==", ">=", ">", "!="}
+    cmp : {"<", "<=", "==", ">=", ">", "!="}
         Type of comparison.
     rstrip : Boolean
         If True, the spaces at the end of Strings are removed before the comparison.
@@ -1536,6 +1541,10 @@ add_newdoc('numpy.core.multiarray', 'frombuffer',
 
         .. versionadded:: 1.20.0
 
+    Returns
+    -------
+    out : ndarray
+
     Notes
     -----
     If the buffer has data that is not in machine byte-order, this should
@@ -1564,6 +1573,19 @@ add_newdoc('numpy.core.multiarray', 'frombuffer',
         array_function_like_doc,
     ))
 
+add_newdoc('numpy.core.multiarray', '_from_dlpack',
+    """
+    _from_dlpack(x, /)
+
+    Create a NumPy array from an object implementing the ``__dlpack__``
+    protocol.
+
+    See Also
+    --------
+    `Array API documentation
+    <https://data-apis.org/array-api/latest/design_topics/data_interchange.html#syntax-for-data-interchange-with-dlpack>`_
+    """)
+
 add_newdoc('numpy.core', 'fastCopyAndTranspose',
     """_fastCopyAndTranspose(a)""")
 
@@ -1581,8 +1603,8 @@ add_newdoc('numpy.core.multiarray', 'arange',
     For integer arguments the function is equivalent to the Python built-in
     `range` function, but returns an ndarray rather than a list.
 
-    When using a non-integer step, such as 0.1, the results will often not
-    be consistent.  It is better to use `numpy.linspace` for these cases.
+    When using a non-integer step, such as 0.1, it is often better to use
+    `numpy.linspace`. See the warnings section below for more information.
 
     Parameters
     ----------
@@ -1615,6 +1637,25 @@ add_newdoc('numpy.core.multiarray', 'arange',
         this rule may result in the last element of `out` being greater
         than `stop`.
 
+    Warnings
+    --------
+    The length of the output might not be numerically stable.
+
+    Another stability issue is due to the internal implementation of
+    `numpy.arange`.
+    The actual step value used to populate the array is
+    ``dtype(start + step) - dtype(start)`` and not `step`. Precision loss
+    can occur here, due to casting or due to using floating points when
+    `start` is much larger than `step`. This can lead to unexpected
+    behaviour. For example::
+
+      >>> np.arange(0, 5, 0.5, dtype=int)
+      array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
+      >>> np.arange(-3, 3, 0.5, dtype=int)
+      array([-3, -2, -1,  0,  1,  2,  3,  4,  5,  6,  7,  8])
+
+    In such cases, the use of `numpy.linspace` should be preferred.
+
     See Also
     --------
     numpy.linspace : Evenly spaced numbers with careful handling of endpoints.
@@ -2176,8 +2217,8 @@ add_newdoc('numpy.core.multiarray', 'ndarray',
     empty : Create an array, but leave its allocated memory unchanged (i.e.,
             it contains "garbage").
     dtype : Create a data-type.
-    numpy.typing.NDArray : A :term:`generic <generic type>` version
-                           of ndarray.
+    numpy.typing.NDArray : An ndarray alias :term:`generic <generic type>`
+                           w.r.t. its `dtype.type <numpy.dtype.type>`.
 
     Notes
     -----
@@ -2235,6 +2276,15 @@ add_newdoc('numpy.core.multiarray', 'ndarray', ('__array_priority__',
 add_newdoc('numpy.core.multiarray', 'ndarray', ('__array_struct__',
     """Array protocol: C-struct side."""))
 
+add_newdoc('numpy.core.multiarray', 'ndarray', ('__dlpack__',
+    """a.__dlpack__(*, stream=None)
+    
+    DLPack Protocol: Part of the Array API."""))
+
+add_newdoc('numpy.core.multiarray', 'ndarray', ('__dlpack_device__',
+    """a.__dlpack_device__()
+    
+    DLPack Protocol: Part of the Array API."""))
 
 add_newdoc('numpy.core.multiarray', 'ndarray', ('base',
     """
@@ -2748,13 +2798,17 @@ add_newdoc('numpy.core.multiarray', 'ndarray', ('__array__',
 
 
 add_newdoc('numpy.core.multiarray', 'ndarray', ('__array_prepare__',
-    """a.__array_prepare__(obj) -> Object of same type as ndarray object obj.
+    """a.__array_prepare__(array[, context], /)
+
+    Returns a view of `array` with the same type as self.
 
     """))
 
 
 add_newdoc('numpy.core.multiarray', 'ndarray', ('__array_wrap__',
-    """a.__array_wrap__(obj) -> Object of same type as ndarray object a.
+    """a.__array_wrap__(array[, context], /)
+
+    Returns a view of `array` with the same type as self.
 
     """))
 
@@ -2769,6 +2823,39 @@ add_newdoc('numpy.core.multiarray', 'ndarray', ('__copy__',
     """))
 
 
+add_newdoc('numpy.core.multiarray', 'ndarray', ('__class_getitem__',
+    """a.__class_getitem__(item, /)
+
+    Return a parametrized wrapper around the `~numpy.ndarray` type.
+
+    .. versionadded:: 1.22
+
+    Returns
+    -------
+    alias : types.GenericAlias
+        A parametrized `~numpy.ndarray` type.
+
+    Examples
+    --------
+    >>> from typing import Any
+    >>> import numpy as np
+
+    >>> np.ndarray[Any, np.dtype[Any]]
+    numpy.ndarray[typing.Any, numpy.dtype[typing.Any]]
+
+    Notes
+    -----
+    This method is only available for python 3.9 and later.
+
+    See Also
+    --------
+    :pep:`585` : Type hinting generics in standard collections.
+    numpy.typing.NDArray : An ndarray alias :term:`generic <generic type>`
+                        w.r.t. its `dtype.type <numpy.dtype.type>`.
+
+    """))
+
+
 add_newdoc('numpy.core.multiarray', 'ndarray', ('__deepcopy__',
     """a.__deepcopy__(memo, /) -> Deep copy of array.
 
@@ -3198,33 +3285,7 @@ add_newdoc('numpy.core.multiarray', 'ndarray', ('diagonal',
     """))
 
 
-add_newdoc('numpy.core.multiarray', 'ndarray', ('dot',
-    """
-    a.dot(b, out=None)
-
-    Dot product of two arrays.
-
-    Refer to `numpy.dot` for full documentation.
-
-    See Also
-    --------
-    numpy.dot : equivalent function
-
-    Examples
-    --------
-    >>> a = np.eye(2)
-    >>> b = np.ones((2, 2)) * 2
-    >>> a.dot(b)
-    array([[2.,  2.],
-           [2.,  2.]])
-
-    This array method can be conveniently chained:
-
-    >>> a.dot(b).dot(b)
-    array([[8.,  8.],
-           [8.,  8.]])
-
-    """))
+add_newdoc('numpy.core.multiarray', 'ndarray', ('dot'))
 
 
 add_newdoc('numpy.core.multiarray', 'ndarray', ('dump',
@@ -3249,7 +3310,7 @@ add_newdoc('numpy.core.multiarray', 'ndarray', ('dumps',
     a.dumps()
 
     Returns the pickle of the array as a string.
-    pickle.loads or numpy.loads will convert the string back to an array.
+    pickle.loads will convert the string back to an array.
 
     Parameters
     ----------
@@ -3538,7 +3599,7 @@ add_newdoc('numpy.core.multiarray', 'ndarray', ('newbyteorder',
         * 'S' - swap dtype from current to opposite endian
         * {'<', 'little'} - little endian
         * {'>', 'big'} - big endian
-        * '=' - native order, equivalent to `sys.byteorder`
+        * {'=', 'native'} - native order, equivalent to `sys.byteorder`
         * {'|', 'I'} - ignore (no change to byte order)
 
         The default value ('S') results in swapping the current
@@ -4005,6 +4066,9 @@ add_newdoc('numpy.core.multiarray', 'ndarray', ('partition',
         The order of all elements in the partitions is undefined.
         If provided with a sequence of kth it will partition all elements
         indexed by kth of them into their sorted position at once.
+
+        .. deprecated:: 1.22.0
+            Passing booleans as index is deprecated.
     axis : int, optional
         Axis along which to sort. Default is -1, which means sort along the
         last axis.
@@ -4471,7 +4535,7 @@ add_newdoc('numpy.core.multiarray', 'ndarray', ('view',
 
 add_newdoc('numpy.core.umath', 'frompyfunc',
     """
-    frompyfunc(func, nin, nout, *[, identity])
+    frompyfunc(func, /, nin, nout, *[, identity])
 
     Takes an arbitrary Python function and returns a NumPy ufunc.
 
@@ -4585,7 +4649,7 @@ add_newdoc('numpy.core.umath', 'geterrobj',
 
 add_newdoc('numpy.core.umath', 'seterrobj',
     """
-    seterrobj(errobj)
+    seterrobj(errobj, /)
 
     Set the object that defines floating-point error handling.
 
@@ -4685,6 +4749,26 @@ add_newdoc('numpy.core.umath', '_add_newdoc_ufunc',
     and then throwing away the ufunc.
     """)
 
+add_newdoc('numpy.core.multiarray', 'get_handler_name',
+    """
+    get_handler_name(a: ndarray) -> str,None
+
+    Return the name of the memory handler used by `a`. If not provided, return
+    the name of the memory handler that will be used to allocate data for the
+    next `ndarray` in this context. May return None if `a` does not own its
+    memory, in which case you can traverse ``a.base`` for a memory handler.
+    """)
+
+add_newdoc('numpy.core.multiarray', 'get_handler_version',
+    """
+    get_handler_version(a: ndarray) -> int,None
+
+    Return the version of the memory handler used by `a`. If not provided,
+    return the version of the memory handler that will be used to allocate data
+    for the next `ndarray` in this context. May return None if `a` does not own
+    its memory, in which case you can traverse ``a.base`` for a memory handler.
+    """)
+
 add_newdoc('numpy.core.multiarray', '_set_madvise_hugepage',
     """
     _set_madvise_hugepage(enabled: bool) -> bool
@@ -5998,7 +6082,7 @@ add_newdoc('numpy.core.multiarray', 'dtype', ('newbyteorder',
         * 'S' - swap dtype from current to opposite endian
         * {'<', 'little'} - little endian
         * {'>', 'big'} - big endian
-        * '=' - native order
+        * {'=', 'native'} - native order
         * {'|', 'I'} - ignore (no change to byte order)
 
     Returns
@@ -6041,6 +6125,97 @@ add_newdoc('numpy.core.multiarray', 'dtype', ('newbyteorder',
 
     """))
 
+add_newdoc('numpy.core.multiarray', 'dtype', ('__class_getitem__',
+    """
+    __class_getitem__(item, /)
+
+    Return a parametrized wrapper around the `~numpy.dtype` type.
+
+    .. versionadded:: 1.22
+
+    Returns
+    -------
+    alias : types.GenericAlias
+        A parametrized `~numpy.dtype` type.
+
+    Examples
+    --------
+    >>> import numpy as np
+
+    >>> np.dtype[np.int64]
+    numpy.dtype[numpy.int64]
+
+    Notes
+    -----
+    This method is only available for python 3.9 and later.
+
+    See Also
+    --------
+    :pep:`585` : Type hinting generics in standard collections.
+
+    """))
+
+add_newdoc('numpy.core.multiarray', 'dtype', ('__ge__',
+    """
+    __ge__(value, /)
+
+    Return ``self >= value``.
+
+    Equivalent to ``np.can_cast(value, self, casting="safe")``.
+
+    See Also
+    --------
+    can_cast : Returns True if cast between data types can occur according to
+               the casting rule.
+
+    """))
+
+add_newdoc('numpy.core.multiarray', 'dtype', ('__le__',
+    """
+    __le__(value, /)
+
+    Return ``self <= value``.
+
+    Equivalent to ``np.can_cast(self, value, casting="safe")``.
+
+    See Also
+    --------
+    can_cast : Returns True if cast between data types can occur according to
+               the casting rule.
+
+    """))
+
+add_newdoc('numpy.core.multiarray', 'dtype', ('__gt__',
+    """
+    __ge__(value, /)
+
+    Return ``self > value``.
+
+    Equivalent to
+    ``self != value and np.can_cast(value, self, casting="safe")``.
+
+    See Also
+    --------
+    can_cast : Returns True if cast between data types can occur according to
+               the casting rule.
+
+    """))
+
+add_newdoc('numpy.core.multiarray', 'dtype', ('__lt__',
+    """
+    __lt__(value, /)
+
+    Return ``self < value``.
+
+    Equivalent to
+    ``self != value and np.can_cast(self, value, casting="safe")``.
+
+    See Also
+    --------
+    can_cast : Returns True if cast between data types can occur according to
+               the casting rule.
+
+    """))
 
 ##############################################################################
 #
@@ -6369,7 +6544,7 @@ add_newdoc('numpy.core.numerictypes', 'generic', ('newbyteorder',
     * 'S' - swap dtype from current to opposite endian
     * {'<', 'little'} - little endian
     * {'>', 'big'} - big endian
-    * '=' - native order
+    * {'=', 'native'} - native order
     * {'|', 'I'} - ignore (no change to byte order)
 
     Parameters
@@ -6462,6 +6637,36 @@ add_newdoc('numpy.core.numerictypes', 'generic',
 add_newdoc('numpy.core.numerictypes', 'generic',
            refer_to_array_attribute('view'))
 
+add_newdoc('numpy.core.numerictypes', 'number', ('__class_getitem__',
+    """
+    __class_getitem__(item, /)
+
+    Return a parametrized wrapper around the `~numpy.number` type.
+
+    .. versionadded:: 1.22
+
+    Returns
+    -------
+    alias : types.GenericAlias
+        A parametrized `~numpy.number` type.
+
+    Examples
+    --------
+    >>> from typing import Any
+    >>> import numpy as np
+
+    >>> np.signedinteger[Any]
+    numpy.signedinteger[typing.Any]
+
+    Notes
+    -----
+    This method is only available for python 3.9 and later.
+
+    See Also
+    --------
+    :pep:`585` : Type hinting generics in standard collections.
+
+    """))
 
 ##############################################################################
 #
index 602b1db6e64adf17fb4fb164956bbd34ad949be3..94859a9d556d8e91a9f426c138175b13aedf057e 100644 (file)
@@ -205,12 +205,12 @@ add_newdoc_for_scalar_type('bytes_', ['string_'],
 add_newdoc_for_scalar_type('void', [],
     r"""
     Either an opaque sequence of bytes, or a structure.
-    
+
     >>> np.void(b'abcd')
     void(b'\x61\x62\x63\x64')
-    
+
     Structured `void` scalars can only be constructed via extraction from :ref:`structured_arrays`:
-    
+
     >>> arr = np.array((1, 2), dtype=[('x', np.int8), ('y', np.int8)])
     >>> arr[()]
     (1, 2)  # looks like a tuple, but is `np.void`
@@ -226,20 +226,36 @@ add_newdoc_for_scalar_type('datetime64', [],
     >>> np.datetime64(10, 'Y')
     numpy.datetime64('1980')
     >>> np.datetime64('1980', 'Y')
-    numpy.datetime64('1980')   
+    numpy.datetime64('1980')
     >>> np.datetime64(10, 'D')
     numpy.datetime64('1970-01-11')
-    
+
     See :ref:`arrays.datetime` for more information.
     """)
 
 add_newdoc_for_scalar_type('timedelta64', [],
     """
     A timedelta stored as a 64-bit integer.
-    
+
     See :ref:`arrays.datetime` for more information.
     """)
 
+add_newdoc('numpy.core.numerictypes', "integer", ('is_integer',
+    """
+    integer.is_integer() -> bool
+
+    Return ``True`` if the number is finite with integral value.
+
+    .. versionadded:: 1.22
+
+    Examples
+    --------
+    >>> np.int64(-2).is_integer()
+    True
+    >>> np.uint32(5).is_integer()
+    True
+    """))
+
 # TODO: work out how to put this on the base class, np.floating
 for float_name in ('half', 'single', 'double', 'longdouble'):
     add_newdoc('numpy.core.numerictypes', float_name, ('as_integer_ratio',
@@ -257,3 +273,39 @@ for float_name in ('half', 'single', 'double', 'longdouble'):
         >>> np.{ftype}(-.25).as_integer_ratio()
         (-1, 4)
         """.format(ftype=float_name)))
+
+    add_newdoc('numpy.core.numerictypes', float_name, ('is_integer',
+        f"""
+        {float_name}.is_integer() -> bool
+
+        Return ``True`` if the floating point number is finite with integral
+        value, and ``False`` otherwise.
+
+        .. versionadded:: 1.22
+
+        Examples
+        --------
+        >>> np.{float_name}(-2.0).is_integer()
+        True
+        >>> np.{float_name}(3.2).is_integer()
+        False
+        """))
+
+for int_name in ('int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32',
+        'int64', 'uint64', 'int64', 'uint64', 'int64', 'uint64'):
+    # Add negative examples for signed cases by checking typecode
+    add_newdoc('numpy.core.numerictypes', int_name, ('bit_count',
+        f"""
+        {int_name}.bit_count() -> int
+
+        Computes the number of 1-bits in the absolute value of the input.
+        Analogous to the builtin `int.bit_count` or ``popcount`` in C++.
+
+        Examples
+        --------
+        >>> np.{int_name}(127).bit_count()
+        7""" +
+        (f"""
+        >>> np.{int_name}(-127).bit_count()
+        7
+        """ if dtype(int_name).char.islower() else "")))
index ee21fc0f1492f906927501f7f879cd4d1b4ec70a..fee9b7b6e0e000c3635dd12a4bafbfcb89db0a72 100644 (file)
@@ -1,50 +1,10 @@
-import sys
-from typing import TypeVar, Union, Iterable, overload
+from typing import TypeVar, Union, Iterable, overload, Literal
 
-from numpy import ndarray, _OrderKACF
+from numpy import ndarray
 from numpy.typing import ArrayLike, DTypeLike
 
-if sys.version_info >= (3, 8):
-    from typing import Literal
-else:
-    from typing_extensions import Literal
-
 _ArrayType = TypeVar("_ArrayType", bound=ndarray)
 
-# TODO: The following functions are now defined in C, so should be defined
-#       in a (not yet existing) `multiarray.pyi`.
-#       (with the exception of `require`)
-
-def asarray(
-    a: object,
-    dtype: DTypeLike = ...,
-    order: _OrderKACF = ...,
-    *,
-    like: ArrayLike = ...
-) -> ndarray: ...
-@overload
-def asanyarray(
-    a: _ArrayType,
-    dtype: None = ...,
-    order: _OrderKACF = ...,
-    *,
-    like: ArrayLike = ...
-) -> _ArrayType: ...
-@overload
-def asanyarray(
-    a: object,
-    dtype: DTypeLike = ...,
-    order: _OrderKACF = ...,
-    *,
-    like: ArrayLike = ...
-) -> ndarray: ...
-def ascontiguousarray(
-    a: object, dtype: DTypeLike = ..., *, like: ArrayLike = ...
-) -> ndarray: ...
-def asfortranarray(
-    a: object, dtype: DTypeLike = ..., *, like: ArrayLike = ...
-) -> ndarray: ...
-
 _Requirements = Literal[
     "C", "C_CONTIGUOUS", "CONTIGUOUS",
     "F", "F_CONTIGUOUS", "FORTRAN",
index 4249071ffe9878477d2e21b90b2889b055a7ec87..c3a22b1c6bb0eee60916fb334996ca5ab4901e4f 100644 (file)
@@ -200,30 +200,37 @@ def _struct_dict_str(dtype, includealignedflag):
 
     # Build up a string to make the dictionary
 
+    if np.core.arrayprint._get_legacy_print_mode() <= 121:
+        colon = ":"
+        fieldsep = ","
+    else:
+        colon = ": "
+        fieldsep = ", "
+
     # First, the names
-    ret = "{'names':["
-    ret += ",".join(repr(name) for name in names)
+    ret = "{'names'%s[" % colon
+    ret += fieldsep.join(repr(name) for name in names)
 
     # Second, the formats
-    ret += "], 'formats':["
-    ret += ",".join(
+    ret += "], 'formats'%s[" % colon
+    ret += fieldsep.join(
         _construction_repr(fld_dtype, short=True) for fld_dtype in fld_dtypes)
 
     # Third, the offsets
-    ret += "], 'offsets':["
-    ret += ",".join("%d" % offset for offset in offsets)
+    ret += "], 'offsets'%s[" % colon
+    ret += fieldsep.join("%d" % offset for offset in offsets)
 
     # Fourth, the titles
     if any(title is not None for title in titles):
-        ret += "], 'titles':["
-        ret += ",".join(repr(title) for title in titles)
+        ret += "], 'titles'%s[" % colon
+        ret += fieldsep.join(repr(title) for title in titles)
 
     # Fifth, the itemsize
-    ret += "], 'itemsize':%d" % dtype.itemsize
+    ret += "], 'itemsize'%s%d" % (colon, dtype.itemsize)
 
     if (includealignedflag and dtype.isalignedstruct):
         # Finally, the aligned flag
-        ret += ", 'aligned':True}"
+        ret += ", 'aligned'%sTrue}" % colon
     else:
         ret += "}"
 
index 77aa2f6e19260fb7444f4fe95e1fd7439d0837a4..3cd8042ce180390304727ee4ff509f3070eb9bcb 100644 (file)
@@ -122,20 +122,94 @@ class TooHardError(RuntimeError):
 
 @set_module('numpy')
 class AxisError(ValueError, IndexError):
-    """ Axis supplied was invalid. """
-    def __init__(self, axis, ndim=None, msg_prefix=None):
-        # single-argument form just delegates to base class
-        if ndim is None and msg_prefix is None:
-            msg = axis
+    """Axis supplied was invalid.
+
+    This is raised whenever an ``axis`` parameter is specified that is larger
+    than the number of array dimensions.
+    For compatibility with code written against older numpy versions, which
+    raised a mixture of `ValueError` and `IndexError` for this situation, this
+    exception subclasses both to ensure that ``except ValueError`` and
+    ``except IndexError`` statements continue to catch `AxisError`.
+
+    .. versionadded:: 1.13
+
+    Parameters
+    ----------
+    axis : int or str
+        The out of bounds axis or a custom exception message.
+        If an axis is provided, then `ndim` should be specified as well.
+    ndim : int, optional
+        The number of array dimensions.
+    msg_prefix : str, optional
+        A prefix for the exception message.
+
+    Attributes
+    ----------
+    axis : int, optional
+        The out of bounds axis or ``None`` if a custom exception
+        message was provided. This should be the axis as passed by
+        the user, before any normalization to resolve negative indices.
+
+        .. versionadded:: 1.22
+    ndim : int, optional
+        The number of array dimensions or ``None`` if a custom exception
+        message was provided.
+
+        .. versionadded:: 1.22
+
+
+    Examples
+    --------
+    >>> array_1d = np.arange(10)
+    >>> np.cumsum(array_1d, axis=1)
+    Traceback (most recent call last):
+      ...
+    numpy.AxisError: axis 1 is out of bounds for array of dimension 1
+
+    Negative axes are preserved:
+
+    >>> np.cumsum(array_1d, axis=-2)
+    Traceback (most recent call last):
+      ...
+    numpy.AxisError: axis -2 is out of bounds for array of dimension 1
 
-        # do the string formatting here, to save work in the C code
+    The class constructor generally takes the axis and arrays'
+    dimensionality as arguments:
+
+    >>> print(np.AxisError(2, 1, msg_prefix='error'))
+    error: axis 2 is out of bounds for array of dimension 1
+
+    Alternatively, a custom exception message can be passed:
+
+    >>> print(np.AxisError('Custom error message'))
+    Custom error message
+
+    """
+
+    __slots__ = ("axis", "ndim", "_msg")
+
+    def __init__(self, axis, ndim=None, msg_prefix=None):
+        if ndim is msg_prefix is None:
+            # single-argument form: directly set the error message
+            self._msg = axis
+            self.axis = None
+            self.ndim = None
         else:
-            msg = ("axis {} is out of bounds for array of dimension {}"
-                   .format(axis, ndim))
-            if msg_prefix is not None:
-                msg = "{}: {}".format(msg_prefix, msg)
+            self._msg = msg_prefix
+            self.axis = axis
+            self.ndim = ndim
 
-        super().__init__(msg)
+    def __str__(self):
+        axis = self.axis
+        ndim = self.ndim
+
+        if axis is ndim is None:
+            return self._msg
+        else:
+            msg = f"axis {axis} is out of bounds for array of dimension {ndim}"
+            if self._msg is not None:
+                msg = f"{self._msg}: {msg}"
+            return msg
 
 
 @_display_as_base
index 3b0c464674b6ec5c50ad60d724613c666b881721..8942955f60c63ec5689304c41f5878f8807847d4 100644 (file)
@@ -324,10 +324,10 @@ class _ctypes:
         """
         (c_intp*self.ndim): A ctypes array of length self.ndim where
         the basetype is the C-integer corresponding to ``dtype('p')`` on this
-        platform. This base-type could be `ctypes.c_int`, `ctypes.c_long`, or
-        `ctypes.c_longlong` depending on the platform.
-        The c_intp type is defined accordingly in `numpy.ctypeslib`.
-        The ctypes array contains the shape of the underlying array.
+        platform (see `~numpy.ctypeslib.c_intp`). This base-type could be
+        `ctypes.c_int`, `ctypes.c_long`, or `ctypes.c_longlong` depending on
+        the platform. The ctypes array contains the shape of
+        the underlying array.
         """
         return self.shape_as(_getintp_ctype())
 
@@ -876,35 +876,3 @@ def npy_ctypes_check(cls):
         return '_ctypes' in ctype_base.__module__
     except Exception:
         return False
-
-
-class recursive:
-    '''
-    A decorator class for recursive nested functions.
-    Naive recursive nested functions hold a reference to themselves:
-
-    def outer(*args):
-        def stringify_leaky(arg0, *arg1):
-            if len(arg1) > 0:
-                return stringify_leaky(*arg1)  # <- HERE
-            return str(arg0)
-        stringify_leaky(*args)
-
-    This design pattern creates a reference cycle that is difficult for a
-    garbage collector to resolve. The decorator class prevents the
-    cycle by passing the nested function in as an argument `self`:
-
-    def outer(*args):
-        @recursive
-        def stringify(self, arg0, *arg1):
-            if len(arg1) > 0:
-                return self(*arg1)
-            return str(arg0)
-        stringify(*args)
-
-    '''
-    def __init__(self, func):
-        self.func = func
-    def __call__(self, *args, **kwargs):
-        return self.func(self, *args, **kwargs)
-
index 1ef1c9fa156411e836d6c0030feaa040267cecad..f4bfd770f0f2e03cf0f6e04c8d2fe6592a696e73 100644 (file)
@@ -2,6 +2,7 @@ from typing import Any, TypeVar, Type, overload, Optional, Generic
 import ctypes as ct
 
 from numpy import ndarray
+from numpy.ctypeslib import c_intp
 
 _CastT = TypeVar("_CastT", bound=ct._CanCastTo)  # Copied from `ctypes.cast`
 _CT = TypeVar("_CT", bound=ct._CData)
@@ -15,18 +16,12 @@ class _ctypes(Generic[_PT]):
     def __new__(cls, array: ndarray[Any, Any], ptr: None = ...) -> _ctypes[None]: ...
     @overload
     def __new__(cls, array: ndarray[Any, Any], ptr: _PT) -> _ctypes[_PT]: ...
-
-    # NOTE: In practice `shape` and `strides` return one of the concrete
-    # platform dependant array-types (`c_int`, `c_long` or `c_longlong`)
-    # corresponding to C's `int_ptr_t`, as determined by `_getintp_ctype`
-    # TODO: Hook this in to the mypy plugin so that a more appropiate
-    # `ctypes._SimpleCData[int]` sub-type can be returned
     @property
     def data(self) -> _PT: ...
     @property
-    def shape(self) -> ct.Array[ct.c_int64]: ...
+    def shape(self) -> ct.Array[c_intp]: ...
     @property
-    def strides(self) -> ct.Array[ct.c_int64]: ...
+    def strides(self) -> ct.Array[c_intp]: ...
     @property
     def _as_parameter_(self) -> ct.c_void_p: ...
 
diff --git a/numpy/core/_machar.py b/numpy/core/_machar.py
new file mode 100644 (file)
index 0000000..ace19a4
--- /dev/null
@@ -0,0 +1,355 @@
+"""
+Machine arithmetic - determine the parameters of the
+floating-point arithmetic system
+
+Author: Pearu Peterson, September 2003
+
+"""
+__all__ = ['MachAr']
+
+from numpy.core.fromnumeric import any
+from numpy.core._ufunc_config import errstate
+from numpy.core.overrides import set_module
+
+# Need to speed this up...especially for longfloat
+
+# Deprecated 2021-10-20, NumPy 1.22
+@set_module('numpy')
+class MachAr:
+    """
+    Diagnosing machine parameters.
+
+    Attributes
+    ----------
+    ibeta : int
+        Radix in which numbers are represented.
+    it : int
+        Number of base-`ibeta` digits in the floating point mantissa M.
+    machep : int
+        Exponent of the smallest (most negative) power of `ibeta` that,
+        added to 1.0, gives something different from 1.0
+    eps : float
+        Floating-point number ``beta**machep`` (floating point precision)
+    negep : int
+        Exponent of the smallest power of `ibeta` that, subtracted
+        from 1.0, gives something different from 1.0.
+    epsneg : float
+        Floating-point number ``beta**negep``.
+    iexp : int
+        Number of bits in the exponent (including its sign and bias).
+    minexp : int
+        Smallest (most negative) power of `ibeta` consistent with there
+        being no leading zeros in the mantissa.
+    xmin : float
+        Floating-point number ``beta**minexp`` (the smallest [in
+        magnitude] positive floating point number with full precision).
+    maxexp : int
+        Smallest (positive) power of `ibeta` that causes overflow.
+    xmax : float
+        ``(1-epsneg) * beta**maxexp`` (the largest [in magnitude]
+        usable floating value).
+    irnd : int
+        In ``range(6)``, information on what kind of rounding is done
+        in addition, and on how underflow is handled.
+    ngrd : int
+        Number of 'guard digits' used when truncating the product
+        of two mantissas to fit the representation.
+    epsilon : float
+        Same as `eps`.
+    tiny : float
+        An alias for `smallest_normal`, kept for backwards compatibility.
+    huge : float
+        Same as `xmax`.
+    precision : float
+        ``- int(-log10(eps))``
+    resolution : float
+        ``- 10**(-precision)``
+    smallest_normal : float
+        The smallest positive floating point number with 1 as leading bit in
+        the mantissa following IEEE-754. Same as `xmin`.
+    smallest_subnormal : float
+        The smallest positive floating point number with 0 as leading bit in
+        the mantissa following IEEE-754.
+
+    Parameters
+    ----------
+    float_conv : function, optional
+        Function that converts an integer or integer array to a float
+        or float array. Default is `float`.
+    int_conv : function, optional
+        Function that converts a float or float array to an integer or
+        integer array. Default is `int`.
+    float_to_float : function, optional
+        Function that converts a float array to float. Default is `float`.
+        Note that this does not seem to do anything useful in the current
+        implementation.
+    float_to_str : function, optional
+        Function that converts a single float to a string. Default is
+        ``lambda v:'%24.16e' %v``.
+    title : str, optional
+        Title that is printed in the string representation of `MachAr`.
+
+    See Also
+    --------
+    finfo : Machine limits for floating point types.
+    iinfo : Machine limits for integer types.
+
+    References
+    ----------
+    .. [1] Press, Teukolsky, Vetterling and Flannery,
+           "Numerical Recipes in C++," 2nd ed,
+           Cambridge University Press, 2002, p. 31.
+
+    """
+
+    def __init__(self, float_conv=float,int_conv=int,
+                 float_to_float=float,
+                 float_to_str=lambda v:'%24.16e' % v,
+                 title='Python floating point number'):
+        """
+
+        float_conv - convert integer to float (array)
+        int_conv   - convert float (array) to integer
+        float_to_float - convert float array to float
+        float_to_str - convert array float to str
+        title        - description of used floating point numbers
+
+        """
+        # We ignore all errors here because we are purposely triggering
+        # underflow to detect the properties of the runninng arch.
+        with errstate(under='ignore'):
+            self._do_init(float_conv, int_conv, float_to_float, float_to_str, title)
+
+    def _do_init(self, float_conv, int_conv, float_to_float, float_to_str, title):
+        max_iterN = 10000
+        msg = "Did not converge after %d tries with %s"
+        one = float_conv(1)
+        two = one + one
+        zero = one - one
+
+        # Do we really need to do this?  Aren't they 2 and 2.0?
+        # Determine ibeta and beta
+        a = one
+        for _ in range(max_iterN):
+            a = a + a
+            temp = a + one
+            temp1 = temp - a
+            if any(temp1 - one != zero):
+                break
+        else:
+            raise RuntimeError(msg % (_, one.dtype))
+        b = one
+        for _ in range(max_iterN):
+            b = b + b
+            temp = a + b
+            itemp = int_conv(temp-a)
+            if any(itemp != 0):
+                break
+        else:
+            raise RuntimeError(msg % (_, one.dtype))
+        ibeta = itemp
+        beta = float_conv(ibeta)
+
+        # Determine it and irnd
+        it = -1
+        b = one
+        for _ in range(max_iterN):
+            it = it + 1
+            b = b * beta
+            temp = b + one
+            temp1 = temp - b
+            if any(temp1 - one != zero):
+                break
+        else:
+            raise RuntimeError(msg % (_, one.dtype))
+
+        betah = beta / two
+        a = one
+        for _ in range(max_iterN):
+            a = a + a
+            temp = a + one
+            temp1 = temp - a
+            if any(temp1 - one != zero):
+                break
+        else:
+            raise RuntimeError(msg % (_, one.dtype))
+        temp = a + betah
+        irnd = 0
+        if any(temp-a != zero):
+            irnd = 1
+        tempa = a + beta
+        temp = tempa + betah
+        if irnd == 0 and any(temp-tempa != zero):
+            irnd = 2
+
+        # Determine negep and epsneg
+        negep = it + 3
+        betain = one / beta
+        a = one
+        for i in range(negep):
+            a = a * betain
+        b = a
+        for _ in range(max_iterN):
+            temp = one - a
+            if any(temp-one != zero):
+                break
+            a = a * beta
+            negep = negep - 1
+            # Prevent infinite loop on PPC with gcc 4.0:
+            if negep < 0:
+                raise RuntimeError("could not determine machine tolerance "
+                                   "for 'negep', locals() -> %s" % (locals()))
+        else:
+            raise RuntimeError(msg % (_, one.dtype))
+        negep = -negep
+        epsneg = a
+
+        # Determine machep and eps
+        machep = - it - 3
+        a = b
+
+        for _ in range(max_iterN):
+            temp = one + a
+            if any(temp-one != zero):
+                break
+            a = a * beta
+            machep = machep + 1
+        else:
+            raise RuntimeError(msg % (_, one.dtype))
+        eps = a
+
+        # Determine ngrd
+        ngrd = 0
+        temp = one + eps
+        if irnd == 0 and any(temp*one - one != zero):
+            ngrd = 1
+
+        # Determine iexp
+        i = 0
+        k = 1
+        z = betain
+        t = one + eps
+        nxres = 0
+        for _ in range(max_iterN):
+            y = z
+            z = y*y
+            a = z*one  # Check here for underflow
+            temp = z*t
+            if any(a+a == zero) or any(abs(z) >= y):
+                break
+            temp1 = temp * betain
+            if any(temp1*beta == z):
+                break
+            i = i + 1
+            k = k + k
+        else:
+            raise RuntimeError(msg % (_, one.dtype))
+        if ibeta != 10:
+            iexp = i + 1
+            mx = k + k
+        else:
+            iexp = 2
+            iz = ibeta
+            while k >= iz:
+                iz = iz * ibeta
+                iexp = iexp + 1
+            mx = iz + iz - 1
+
+        # Determine minexp and xmin
+        for _ in range(max_iterN):
+            xmin = y
+            y = y * betain
+            a = y * one
+            temp = y * t
+            if any((a + a) != zero) and any(abs(y) < xmin):
+                k = k + 1
+                temp1 = temp * betain
+                if any(temp1*beta == y) and any(temp != y):
+                    nxres = 3
+                    xmin = y
+                    break
+            else:
+                break
+        else:
+            raise RuntimeError(msg % (_, one.dtype))
+        minexp = -k
+
+        # Determine maxexp, xmax
+        if mx <= k + k - 3 and ibeta != 10:
+            mx = mx + mx
+            iexp = iexp + 1
+        maxexp = mx + minexp
+        irnd = irnd + nxres
+        if irnd >= 2:
+            maxexp = maxexp - 2
+        i = maxexp + minexp
+        if ibeta == 2 and not i:
+            maxexp = maxexp - 1
+        if i > 20:
+            maxexp = maxexp - 1
+        if any(a != y):
+            maxexp = maxexp - 2
+        xmax = one - epsneg
+        if any(xmax*one != xmax):
+            xmax = one - beta*epsneg
+        xmax = xmax / (xmin*beta*beta*beta)
+        i = maxexp + minexp + 3
+        for j in range(i):
+            if ibeta == 2:
+                xmax = xmax + xmax
+            else:
+                xmax = xmax * beta
+
+        smallest_subnormal = abs(xmin / beta ** (it))
+
+        self.ibeta = ibeta
+        self.it = it
+        self.negep = negep
+        self.epsneg = float_to_float(epsneg)
+        self._str_epsneg = float_to_str(epsneg)
+        self.machep = machep
+        self.eps = float_to_float(eps)
+        self._str_eps = float_to_str(eps)
+        self.ngrd = ngrd
+        self.iexp = iexp
+        self.minexp = minexp
+        self.xmin = float_to_float(xmin)
+        self._str_xmin = float_to_str(xmin)
+        self.maxexp = maxexp
+        self.xmax = float_to_float(xmax)
+        self._str_xmax = float_to_str(xmax)
+        self.irnd = irnd
+
+        self.title = title
+        # Commonly used parameters
+        self.epsilon = self.eps
+        self.tiny = self.xmin
+        self.huge = self.xmax
+        self.smallest_normal = self.xmin
+        self.smallest_subnormal = float_to_float(smallest_subnormal)
+
+        import math
+        self.precision = int(-math.log10(float_to_float(self.eps)))
+        ten = two + two + two + two + two
+        resolution = ten ** (-self.precision)
+        self.resolution = float_to_float(resolution)
+        self._str_resolution = float_to_str(resolution)
+
+    def __str__(self):
+        fmt = (
+           'Machine parameters for %(title)s\n'
+           '---------------------------------------------------------------------\n'
+           'ibeta=%(ibeta)s it=%(it)s iexp=%(iexp)s ngrd=%(ngrd)s irnd=%(irnd)s\n'
+           'machep=%(machep)s     eps=%(_str_eps)s (beta**machep == epsilon)\n'
+           'negep =%(negep)s  epsneg=%(_str_epsneg)s (beta**epsneg)\n'
+           'minexp=%(minexp)s   xmin=%(_str_xmin)s (beta**minexp == tiny)\n'
+           'maxexp=%(maxexp)s    xmax=%(_str_xmax)s ((1-epsneg)*beta**maxexp == huge)\n'
+           'smallest_normal=%(smallest_normal)s    '
+           'smallest_subnormal=%(smallest_subnormal)s\n'
+           '---------------------------------------------------------------------\n'
+           )
+        return fmt % self.__dict__
+
+
+if __name__ == '__main__':
+    print(MachAr())
index e475b94dfb4e3d708b1b09cb231a9061f1607bb8..a239e2c87eb7658a542a1bfaec57496453c0aec1 100644 (file)
@@ -221,8 +221,10 @@ def _var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False, *,
     if isinstance(arrmean, mu.ndarray):
         arrmean = um.true_divide(arrmean, div, out=arrmean, casting='unsafe',
                                  subok=False)
-    else:
+    elif hasattr(arrmean, "dtype"):
         arrmean = arrmean.dtype.type(arrmean / rcount)
+    else:
+        arrmean = arrmean / rcount
 
     # Compute sum of squared deviations from mean
     # Note that x may not be inexact and that we need it to be an array,
index 67addef483f6f97b9b3b3aaae544345ceb91c4b7..3765a0d34e18d7faee5dbb682c7fdc49aa7d021e 100644 (file)
@@ -115,15 +115,6 @@ def _add_aliases():
         # add forward, reverse, and string mapping to numarray
         sctypeDict[char] = info.type
 
-    # Add deprecated numeric-style type aliases manually, at some point
-    # we may want to deprecate the lower case "bytes0" version as well.
-    for name in ["Bytes0", "Datetime64", "Str0", "Uint32", "Uint64"]:
-        if english_lower(name) not in allTypes:
-            # Only one of Uint32 or Uint64, aliases of `np.uintp`, was (and is) defined, note that this
-            # is not UInt32/UInt64 (capital i), which is removed.
-            continue
-        allTypes[name] = allTypes[english_lower(name)]
-        sctypeDict[name] = sctypeDict[english_lower(name)]
 
 _add_aliases()
 
index 6a1099cd3fada48bd150f0a1858f3da7efa05c3a..c10d072f9f0b2cf4b94757bf776787d5084ec314 100644 (file)
@@ -1,13 +1,7 @@
-import sys
-from typing import Dict, Union, Type, List
+from typing import Dict, Union, Type, List, TypedDict
 
 from numpy import generic, signedinteger, unsignedinteger, floating, complexfloating
 
-if sys.version_info >= (3, 8):
-    from typing import TypedDict
-else:
-    from typing_extensions import TypedDict
-
 class _SCTypes(TypedDict):
     int: List[Type[signedinteger]]
     uint: List[Type[unsignedinteger]]
index e90f1c510ad4139aaa3713306002c989819693bd..cd7129bcb140fb56bf98a873caf816206142d7b4 100644 (file)
@@ -1,17 +1,10 @@
-import sys
-from typing import Optional, Union, Callable, Any
+from typing import Optional, Union, Callable, Any, Literal, TypedDict
 
-if sys.version_info >= (3, 8):
-    from typing import Literal, Protocol, TypedDict
-else:
-    from typing_extensions import Literal, Protocol, TypedDict
+from numpy import _SupportsWrite
 
 _ErrKind = Literal["ignore", "warn", "raise", "call", "print", "log"]
 _ErrFunc = Callable[[str, int], Any]
 
-class _SupportsWrite(Protocol):
-    def write(self, __msg: str) -> Any: ...
-
 class _ErrDict(TypedDict):
     divide: _ErrKind
     over: _ErrKind
@@ -36,8 +29,8 @@ def geterr() -> _ErrDict: ...
 def setbufsize(size: int) -> int: ...
 def getbufsize() -> int: ...
 def seterrcall(
-    func: Union[None, _ErrFunc, _SupportsWrite]
-) -> Union[None, _ErrFunc, _SupportsWrite]: ...
-def geterrcall() -> Union[None, _ErrFunc, _SupportsWrite]: ...
+    func: Union[None, _ErrFunc, _SupportsWrite[str]]
+) -> Union[None, _ErrFunc, _SupportsWrite[str]]: ...
+def geterrcall() -> Union[None, _ErrFunc, _SupportsWrite[str]]: ...
 
 # See `numpy/__init__.pyi` for the `errstate` class
index f16bcfd39e57aadf66fa615678c7c8d3050ff1b2..d7e9bf79534c49f2056e2d81b968d6c83535de52 100644 (file)
@@ -24,6 +24,7 @@ __docformat__ = 'restructuredtext'
 
 import functools
 import numbers
+import sys
 try:
     from _thread import get_ident
 except ImportError:
@@ -56,12 +57,17 @@ _format_options = {
     'infstr': 'inf',
     'sign': '-',
     'formatter': None,
-    'legacy': False}
+    # Internally stored as an int to simplify comparisons; converted from/to
+    # str/False on the way in/out.
+    'legacy': sys.maxsize}
 
 def _make_options_dict(precision=None, threshold=None, edgeitems=None,
                        linewidth=None, suppress=None, nanstr=None, infstr=None,
                        sign=None, formatter=None, floatmode=None, legacy=None):
-    """ make a dictionary out of the non-None arguments, plus sanity checks """
+    """
+    Make a dictionary out of the non-None arguments, plus conversion of
+    *legacy* and sanity checks.
+    """
 
     options = {k: v for k, v in locals().items() if v is not None}
 
@@ -76,9 +82,18 @@ def _make_options_dict(precision=None, threshold=None, edgeitems=None,
     if sign not in [None, '-', '+', ' ']:
         raise ValueError("sign option must be one of ' ', '+', or '-'")
 
-    if legacy not in [None, False, '1.13']:
-        warnings.warn("legacy printing option can currently only be '1.13' or "
-                      "`False`", stacklevel=3)
+    if legacy == False:
+        options['legacy'] = sys.maxsize
+    elif legacy == '1.13':
+        options['legacy'] = 113
+    elif legacy == '1.21':
+        options['legacy'] = 121
+    elif legacy is None:
+        pass  # OK, do nothing.
+    else:
+        warnings.warn(
+            "legacy printing option can currently only be '1.13', '1.21', or "
+            "`False`", stacklevel=3)
 
     if threshold is not None:
         # forbid the bad threshold arg suggested by stack overflow, gh-12351
@@ -186,11 +201,21 @@ def set_printoptions(precision=None, threshold=None, edgeitems=None,
     legacy : string or `False`, optional
         If set to the string `'1.13'` enables 1.13 legacy printing mode. This
         approximates numpy 1.13 print output by including a space in the sign
-        position of floats and different behavior for 0d arrays. If set to
-        `False`, disables legacy mode. Unrecognized strings will be ignored
-        with a warning for forward compatibility.
+        position of floats and different behavior for 0d arrays. This also
+        enables 1.21 legacy printing mode (described below).
+
+        If set to the string `'1.21'` enables 1.21 legacy printing mode. This
+        approximates numpy 1.21 print output of complex structured dtypes
+        by not inserting spaces after commas that separate fields and after
+        colons.
+
+        If set to `False`, disables legacy mode.
+
+        Unrecognized strings will be ignored with a warning for forward
+        compatibility.
 
         .. versionadded:: 1.14.0
+        .. versionchanged:: 1.22.0
 
     See Also
     --------
@@ -257,11 +282,13 @@ def set_printoptions(precision=None, threshold=None, edgeitems=None,
     _format_options.update(opt)
 
     # set the C variable for legacy mode
-    if _format_options['legacy'] == '1.13':
+    if _format_options['legacy'] == 113:
         set_legacy_print_mode(113)
         # reset the sign option in legacy mode to avoid confusion
         _format_options['sign'] = '-'
-    elif _format_options['legacy'] is False:
+    elif _format_options['legacy'] == 121:
+        set_legacy_print_mode(121)
+    elif _format_options['legacy'] == sys.maxsize:
         set_legacy_print_mode(0)
 
 
@@ -292,7 +319,16 @@ def get_printoptions():
     set_printoptions, printoptions, set_string_function
 
     """
-    return _format_options.copy()
+    opts = _format_options.copy()
+    opts['legacy'] = {
+        113: '1.13', 121: '1.21', sys.maxsize: False,
+    }[opts['legacy']]
+    return opts
+
+
+def _get_legacy_print_mode():
+    """Return the legacy print mode as an int."""
+    return _format_options['legacy']
 
 
 @set_module('numpy')
@@ -420,7 +456,9 @@ def _get_format_function(data, **options):
     dtype_ = data.dtype
     dtypeobj = dtype_.type
     formatdict = _get_formatdict(data, **options)
-    if issubclass(dtypeobj, _nt.bool_):
+    if dtypeobj is None:
+        return formatdict["numpystr"]()
+    elif issubclass(dtypeobj, _nt.bool_):
         return formatdict['bool']()
     elif issubclass(dtypeobj, _nt.integer):
         if issubclass(dtypeobj, _nt.timedelta64):
@@ -676,7 +714,7 @@ def array2string(a, max_line_width=None, precision=None,
     options = _format_options.copy()
     options.update(overrides)
 
-    if options['legacy'] == '1.13':
+    if options['legacy'] <= 113:
         if style is np._NoValue:
             style = repr
 
@@ -688,7 +726,7 @@ def array2string(a, max_line_width=None, precision=None,
                       " except in 1.13 'legacy' mode",
                       DeprecationWarning, stacklevel=3)
 
-    if options['legacy'] != '1.13':
+    if options['legacy'] > 113:
         options['linewidth'] -= len(suffix)
 
     # treat as a null array if any of shape elements == 0
@@ -700,7 +738,7 @@ def array2string(a, max_line_width=None, precision=None,
 
 def _extendLine(s, line, word, line_width, next_line_prefix, legacy):
     needs_wrap = len(line) + len(word) > line_width
-    if legacy != '1.13':
+    if legacy > 113:
         # don't wrap lines if it won't help
         if len(line) <= len(next_line_prefix):
             needs_wrap = False
@@ -717,7 +755,7 @@ def _extendLine_pretty(s, line, word, line_width, next_line_prefix, legacy):
     Extends line with nicely formatted (possibly multi-line) string ``word``.
     """
     words = word.splitlines()
-    if len(words) == 1 or legacy == '1.13':
+    if len(words) == 1 or legacy <= 113:
         return _extendLine(s, line, word, line_width, next_line_prefix, legacy)
 
     max_word_length = max(len(word) for word in words)
@@ -763,7 +801,7 @@ def _formatArray(a, format_function, line_width, next_line_prefix,
         # when recursing, add a space to align with the [ added, and reduce the
         # length of the line by 1
         next_hanging_indent = hanging_indent + ' '
-        if legacy == '1.13':
+        if legacy <= 113:
             next_width = curr_width
         else:
             next_width = curr_width - len(']')
@@ -783,7 +821,7 @@ def _formatArray(a, format_function, line_width, next_line_prefix,
         # last axis (rows) - wrap elements if they would not fit on one line
         if axes_left == 1:
             # the length up until the beginning of the separator / bracket
-            if legacy == '1.13':
+            if legacy <= 113:
                 elem_width = curr_width - len(separator.rstrip())
             else:
                 elem_width = curr_width - max(len(separator.rstrip()), len(']'))
@@ -798,7 +836,7 @@ def _formatArray(a, format_function, line_width, next_line_prefix,
             if show_summary:
                 s, line = _extendLine(
                     s, line, summary_insert, elem_width, hanging_indent, legacy)
-                if legacy == '1.13':
+                if legacy <= 113:
                     line += ", "
                 else:
                     line += separator
@@ -809,7 +847,7 @@ def _formatArray(a, format_function, line_width, next_line_prefix,
                     s, line, word, elem_width, hanging_indent, legacy)
                 line += separator
 
-            if legacy == '1.13':
+            if legacy <= 113:
                 # width of the separator is not considered on 1.13
                 elem_width = curr_width
             word = recurser(index + (-1,), next_hanging_indent, next_width)
@@ -828,7 +866,7 @@ def _formatArray(a, format_function, line_width, next_line_prefix,
                 s += hanging_indent + nested + line_sep
 
             if show_summary:
-                if legacy == '1.13':
+                if legacy <= 113:
                     # trailing space, fixed nbr of newlines, and fixed separator
                     s += hanging_indent + summary_insert + ", \n"
                 else:
@@ -873,7 +911,7 @@ class FloatingFormat:
             sign = '+' if sign else '-'
 
         self._legacy = legacy
-        if self._legacy == '1.13':
+        if self._legacy <= 113:
             # when not 0d, legacy does not support '-'
             if data.shape != () and sign == '-':
                 sign = ' '
@@ -917,7 +955,7 @@ class FloatingFormat:
             self.min_digits = None
         elif self.exp_format:
             trim, unique = '.', True
-            if self.floatmode == 'fixed' or self._legacy == '1.13':
+            if self.floatmode == 'fixed' or self._legacy <= 113:
                 trim, unique = 'k', False
             strs = (dragon4_scientific(x, precision=self.precision,
                                unique=unique, trim=trim, sign=self.sign == '+')
@@ -932,7 +970,7 @@ class FloatingFormat:
             self.unique = unique
 
             # for back-compat with np 1.13, use 2 spaces & sign and full prec
-            if self._legacy == '1.13':
+            if self._legacy <= 113:
                 self.pad_left = 3
             else:
                 # this should be only 1 or 2. Can be calculated from sign.
@@ -949,7 +987,7 @@ class FloatingFormat:
                                        sign=self.sign == '+')
                     for x in finite_vals)
             int_part, frac_part = zip(*(s.split('.') for s in strs))
-            if self._legacy == '1.13':
+            if self._legacy <= 113:
                 self.pad_left = 1 + max(len(s.lstrip('-+')) for s in int_part)
             else:
                 self.pad_left = max(len(s) for s in int_part)
@@ -964,7 +1002,7 @@ class FloatingFormat:
                 self.trim = '.'
                 self.min_digits = 0
 
-        if self._legacy != '1.13':
+        if self._legacy > 113:
             # account for sign = ' ' by adding one to pad_left
             if self.sign == ' ' and not any(np.signbit(finite_vals)):
                 self.pad_left += 1
@@ -1213,7 +1251,7 @@ class ComplexFloatingFormat:
             sign = '+' if sign else '-'
 
         floatmode_real = floatmode_imag = floatmode
-        if legacy == '1.13':
+        if legacy <= 113:
             floatmode_real = 'maxprec_equal'
             floatmode_imag = 'maxprec'
 
@@ -1284,7 +1322,7 @@ class DatetimeFormat(_TimelikeFormat):
         super().__init__(x)
 
     def __call__(self, x):
-        if self.legacy == '1.13':
+        if self.legacy <= 113:
             return self._format_non_nat(x)
         return super().__call__(x)
 
@@ -1388,7 +1426,7 @@ def dtype_is_implied(dtype):
     array([1, 2, 3], dtype=int8)
     """
     dtype = np.dtype(dtype)
-    if _format_options['legacy'] == '1.13' and dtype.type == bool_:
+    if _format_options['legacy'] <= 113 and dtype.type == bool_:
         return False
 
     # not just void types can be structured, and names are not part of the repr
@@ -1408,6 +1446,9 @@ def dtype_short_repr(dtype):
     >>> dt = np.int64([1, 2]).dtype
     >>> assert eval(dtype_short_repr(dt)) == dt
     """
+    if type(dtype).__repr__ != np.dtype.__repr__:
+        # TODO: Custom repr for user DTypes, logic should likely move.
+        return repr(dtype)
     if dtype.names is not None:
         # structured dtypes give a list or tuple repr
         return str(dtype)
@@ -1440,7 +1481,7 @@ def _array_repr_implementation(
     prefix = class_name + "("
     suffix = ")" if skipdtype else ","
 
-    if (_format_options['legacy'] == '1.13' and
+    if (_format_options['legacy'] <= 113 and
             arr.shape == () and not arr.dtype.names):
         lst = repr(arr.item())
     elif arr.size > 0 or arr.shape == (0,):
@@ -1461,7 +1502,7 @@ def _array_repr_implementation(
     # Note: This line gives the correct result even when rfind returns -1.
     last_line_len = len(arr_str) - (arr_str.rfind('\n') + 1)
     spacer = " "
-    if _format_options['legacy'] == '1.13':
+    if _format_options['legacy'] <= 113:
         if issubclass(arr.dtype.type, flexible):
             spacer = '\n' + ' '*len(class_name + "(")
     elif last_line_len + len(dtype_str) + 1 > max_line_width:
@@ -1535,7 +1576,7 @@ def _array_str_implementation(
         a, max_line_width=None, precision=None, suppress_small=None,
         array2string=array2string):
     """Internal version of array_str() that allows overriding array2string."""
-    if (_format_options['legacy'] == '1.13' and
+    if (_format_options['legacy'] <= 113 and
             a.shape == () and not a.dtype.names):
         return str(a.item())
 
index ac2b6f5a8abbe53663666f32b4f0744dae116ee1..0d338206f604831ccbd171e11c93b7ef2901503c 100644 (file)
@@ -1,9 +1,8 @@
-import sys
 from types import TracebackType
-from typing import Any, Optional, Callable, Union, Type
+from typing import Any, Optional, Callable, Union, Type, Literal, TypedDict, SupportsIndex
 
-# Using a private class is by no means ideal, but it is simply a consquence
-# of a `contextlib.context` returning an instance of aformentioned class
+# Using a private class is by no means ideal, but it is simply a consequence
+# of a `contextlib.context` returning an instance of aforementioned class
 from contextlib import _GeneratorContextManager
 
 from numpy import (
@@ -23,11 +22,6 @@ from numpy import (
 )
 from numpy.typing import ArrayLike, _CharLike_co, _FloatLike_co
 
-if sys.version_info > (3, 8):
-    from typing import Literal, TypedDict, SupportsIndex
-else:
-    from typing_extensions import Literal, TypedDict, SupportsIndex
-
 _FloatMode = Literal["fixed", "unique", "maxprec", "maxprec_equal"]
 
 class _FormatDict(TypedDict, total=False):
@@ -59,7 +53,7 @@ class _FormatOptions(TypedDict):
     formatter: Optional[_FormatDict]
     sign: Literal["-", "+", " "]
     floatmode: _FloatMode
-    legacy: Literal[False, "1.13"]
+    legacy: Literal[False, "1.13", "1.21"]
 
 def set_printoptions(
     precision: Optional[SupportsIndex] = ...,
@@ -73,7 +67,7 @@ def set_printoptions(
     sign: Optional[Literal["-", "+", " "]] = ...,
     floatmode: Optional[_FloatMode] = ...,
     *,
-    legacy: Optional[Literal[False, "1.13"]] = ...
+    legacy: Optional[Literal[False, "1.13", "1.21"]] = ...
 ) -> None: ...
 def get_printoptions() -> _FormatOptions: ...
 def array2string(
@@ -93,7 +87,7 @@ def array2string(
     sign: Optional[Literal["-", "+", " "]] = ...,
     floatmode: Optional[_FloatMode] = ...,
     suffix: str = ...,
-    legacy: Optional[Literal[False, "1.13"]] = ...,
+    legacy: Optional[Literal[False, "1.13", "1.21"]] = ...,
 ) -> str: ...
 def format_float_scientific(
     x: _FloatLike_co,
@@ -143,5 +137,5 @@ def printoptions(
     sign: Optional[Literal["-", "+", " "]] = ...,
     floatmode: Optional[_FloatMode] = ...,
     *,
-    legacy: Optional[Literal[False, "1.13"]] = ...
+    legacy: Optional[Literal[False, "1.13", "1.21"]] = ...
 ) -> _GeneratorContextManager[_FormatOptions]: ...
index 09c1c31e03eff6b28489f60ffb5c7375b65f1db7..e7b3ef697edc5996dac79a13803838ed3a8120d3 100644 (file)
@@ -1,6 +1,8 @@
 # Hash below were defined from numpy_api_order.txt and ufunc_api_order.txt
 # When adding a new version here for a new minor release, also add the same
-# version as NPY_x_y_API_VERSION in numpyconfig.h
+# version as NPY_x_y_API_VERSION in numpyconfig.h and C_API_VERSION in
+# setup_common.py.
+
 0x00000001 = 603580d224763e58c5e7147f804dc0f5
 0x00000002 = 8ecb29306758515ae69749c803a75da1
 0x00000003 = bf22c0d05b31625d2a7015988d61ce5a
@@ -57,3 +59,6 @@
 # A new field was added to the end of PyArrayObject_fields.
 # Version 14 (NumPy 1.21) No change.
 0x0000000e = 17a0f366e55ec05e5c5c149123478452
+
+# Version 15 (NumPy 1.22) Configurable memory allocations
+0x0000000f = b8783365b873681cd204be50cdfb448d
index c2458c2b5d80334067316903eea7b21b8279fc95..b401ee6a581e905b9321460a2ab5f23fed2b73ba 100644 (file)
@@ -41,6 +41,7 @@ API_FILES = [join('multiarray', 'alloc.c'),
              join('multiarray', 'datetime_busdaycal.c'),
              join('multiarray', 'datetime_strings.c'),
              join('multiarray', 'descriptor.c'),
+             join('multiarray', 'dlpack.c'),
              join('multiarray', 'dtypemeta.c'),
              join('multiarray', 'einsum.c.src'),
              join('multiarray', 'flagsobject.c'),
index 7997135bb07ab47de534e105e52b6326027bb353..37975966f6255fccffb758b758aee6ed4ed045a3 100644 (file)
@@ -177,9 +177,6 @@ def do_generate_api(targets, sources):
     numpyapi_list = genapi.get_api_functions('NUMPY_API',
                                              multiarray_funcs)
 
-    # FIXME: ordered_funcs_api is unused
-    ordered_funcs_api = genapi.order_dict(multiarray_funcs)
-
     # Create dict name -> *Api instance
     api_name = 'PyArray_API'
     multiarray_api_dict = {}
index d567b2eb9aaf2a120dbd7070910afe2f2545fe67..292d9e0d37e2690ac7acfc2e6f694786f2fe357a 100644 (file)
@@ -329,7 +329,7 @@ defdict = {
           'PyUFunc_DivisionTypeResolver',
           TD(ints, cfunc_alias='divide',
               dispatch=[('loops_arithmetic', 'bBhHiIlLqQ')]),
-          TD(flts + cmplx),
+          TD(flts),
           [TypeDescription('m', FullTypeDescr, 'mq', 'm'),
            TypeDescription('m', FullTypeDescr, 'md', 'm'),
            TypeDescription('m', FullTypeDescr, 'mm', 'q'),
@@ -359,7 +359,7 @@ defdict = {
           docstrings.get('numpy.core.umath.fmod'),
           None,
           TD(ints),
-          TD(flts, f='fmod', astype={'e':'f'}),
+          TD(flts, f='fmod', astype={'e': 'f'}),
           TD(P, f='fmod'),
           ),
 'square':
@@ -390,7 +390,7 @@ defdict = {
           docstrings.get('numpy.core.umath.power'),
           None,
           TD(ints),
-          TD(inexact, f='pow', astype={'e':'f'}),
+          TD(inexact, f='pow', astype={'e': 'f'}),
           TD(O, f='npy_ObjectPower'),
           ),
 'float_power':
@@ -551,13 +551,13 @@ defdict = {
     Ufunc(2, 1, MinusInfinity,
           docstrings.get('numpy.core.umath.logaddexp'),
           None,
-          TD(flts, f="logaddexp", astype={'e':'f'})
+          TD(flts, f="logaddexp", astype={'e': 'f'})
           ),
 'logaddexp2':
     Ufunc(2, 1, MinusInfinity,
           docstrings.get('numpy.core.umath.logaddexp2'),
           None,
-          TD(flts, f="logaddexp2", astype={'e':'f'})
+          TD(flts, f="logaddexp2", astype={'e': 'f'})
           ),
 'bitwise_and':
     Ufunc(2, 1, AllOnes,
@@ -605,80 +605,93 @@ defdict = {
     Ufunc(2, 1, None,
           docstrings.get('numpy.core.umath.heaviside'),
           None,
-          TD(flts, f='heaviside', astype={'e':'f'}),
+          TD(flts, f='heaviside', astype={'e': 'f'}),
           ),
 'degrees':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.degrees'),
           None,
-          TD(fltsP, f='degrees', astype={'e':'f'}),
+          TD(fltsP, f='degrees', astype={'e': 'f'}),
           ),
 'rad2deg':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.rad2deg'),
           None,
-          TD(fltsP, f='rad2deg', astype={'e':'f'}),
+          TD(fltsP, f='rad2deg', astype={'e': 'f'}),
           ),
 'radians':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.radians'),
           None,
-          TD(fltsP, f='radians', astype={'e':'f'}),
+          TD(fltsP, f='radians', astype={'e': 'f'}),
           ),
 'deg2rad':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.deg2rad'),
           None,
-          TD(fltsP, f='deg2rad', astype={'e':'f'}),
+          TD(fltsP, f='deg2rad', astype={'e': 'f'}),
           ),
 'arccos':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.arccos'),
           None,
-          TD(inexact, f='acos', astype={'e':'f'}),
+          TD('e', f='acos', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='acos', astype={'e': 'f'}),
           TD(P, f='arccos'),
           ),
 'arccosh':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.arccosh'),
           None,
-          TD(inexact, f='acosh', astype={'e':'f'}),
+          TD('e', f='acosh', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='acosh', astype={'e': 'f'}),
           TD(P, f='arccosh'),
           ),
 'arcsin':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.arcsin'),
           None,
-          TD(inexact, f='asin', astype={'e':'f'}),
+          TD('e', f='asin', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='asin', astype={'e': 'f'}),
           TD(P, f='arcsin'),
           ),
 'arcsinh':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.arcsinh'),
           None,
-          TD(inexact, f='asinh', astype={'e':'f'}),
+          TD('e', f='asinh', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='asinh', astype={'e': 'f'}),
           TD(P, f='arcsinh'),
           ),
 'arctan':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.arctan'),
           None,
-          TD(inexact, f='atan', astype={'e':'f'}),
+          TD('e', f='atan', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='atan', astype={'e': 'f'}),
           TD(P, f='arctan'),
           ),
 'arctanh':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.arctanh'),
           None,
-          TD(inexact, f='atanh', astype={'e':'f'}),
+          TD('e', f='atanh', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='atanh', astype={'e': 'f'}),
           TD(P, f='arctanh'),
           ),
 'cos':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.cos'),
           None,
-          TD('e', f='cos', astype={'e':'f'}),
+          TD('e', f='cos', astype={'e': 'f'}),
           TD('f', dispatch=[('loops_trigonometric', 'f')]),
+          TD('d', dispatch=[('loops_umath_fp', 'd')]),
           TD('fdg' + cmplx, f='cos'),
           TD(P, f='cos'),
           ),
@@ -686,8 +699,9 @@ defdict = {
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.sin'),
           None,
-          TD('e', f='sin', astype={'e':'f'}),
+          TD('e', f='sin', astype={'e': 'f'}),
           TD('f', dispatch=[('loops_trigonometric', 'f')]),
+          TD('d', dispatch=[('loops_umath_fp', 'd')]),
           TD('fdg' + cmplx, f='sin'),
           TD(P, f='sin'),
           ),
@@ -695,35 +709,43 @@ defdict = {
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.tan'),
           None,
-          TD(inexact, f='tan', astype={'e':'f'}),
+          TD('e', f='tan', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='tan', astype={'e': 'f'}),
           TD(P, f='tan'),
           ),
 'cosh':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.cosh'),
           None,
-          TD(inexact, f='cosh', astype={'e':'f'}),
+          TD('e', f='cosh', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='cosh', astype={'e': 'f'}),
           TD(P, f='cosh'),
           ),
 'sinh':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.sinh'),
           None,
-          TD(inexact, f='sinh', astype={'e':'f'}),
+          TD('e', f='sinh', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='sinh', astype={'e': 'f'}),
           TD(P, f='sinh'),
           ),
 'tanh':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.tanh'),
           None,
-          TD(inexact, f='tanh', astype={'e':'f'}),
+          TD('e', f='tanh', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='tanh', astype={'e': 'f'}),
           TD(P, f='tanh'),
           ),
 'exp':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.exp'),
           None,
-          TD('e', f='exp', astype={'e':'f'}),
+          TD('e', f='exp', astype={'e': 'f'}),
           TD('fd', dispatch=[('loops_exponent_log', 'fd')]),
           TD('fdg' + cmplx, f='exp'),
           TD(P, f='exp'),
@@ -732,21 +754,25 @@ defdict = {
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.exp2'),
           None,
-          TD(inexact, f='exp2', astype={'e':'f'}),
+          TD('e', f='exp2', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='exp2', astype={'e': 'f'}),
           TD(P, f='exp2'),
           ),
 'expm1':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.expm1'),
           None,
-          TD(inexact, f='expm1', astype={'e':'f'}),
+          TD('e', f='expm1', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='expm1', astype={'e': 'f'}),
           TD(P, f='expm1'),
           ),
 'log':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.log'),
           None,
-          TD('e', f='log', astype={'e':'f'}),
+          TD('e', f='log', astype={'e': 'f'}),
           TD('fd', dispatch=[('loops_exponent_log', 'fd')]),
           TD('fdg' + cmplx, f='log'),
           TD(P, f='log'),
@@ -755,28 +781,34 @@ defdict = {
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.log2'),
           None,
-          TD(inexact, f='log2', astype={'e':'f'}),
+          TD('e', f='log2', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='log2', astype={'e': 'f'}),
           TD(P, f='log2'),
           ),
 'log10':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.log10'),
           None,
-          TD(inexact, f='log10', astype={'e':'f'}),
+          TD('e', f='log10', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='log10', astype={'e': 'f'}),
           TD(P, f='log10'),
           ),
 'log1p':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.log1p'),
           None,
-          TD(inexact, f='log1p', astype={'e':'f'}),
+          TD('e', f='log1p', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(inexact, f='log1p', astype={'e': 'f'}),
           TD(P, f='log1p'),
           ),
 'sqrt':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.sqrt'),
           None,
-          TD('e', f='sqrt', astype={'e':'f'}),
+          TD('e', f='sqrt', astype={'e': 'f'}),
           TD(inexactvec, dispatch=[('loops_unary_fp', 'fd')]),
           TD('fdg' + cmplx, f='sqrt'),
           TD(P, f='sqrt'),
@@ -785,15 +817,17 @@ defdict = {
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.cbrt'),
           None,
-          TD(flts, f='cbrt', astype={'e':'f'}),
+          TD('e', f='cbrt', astype={'e': 'f'}),
+          TD('fd', dispatch=[('loops_umath_fp', 'fd')]),
+          TD(flts, f='cbrt', astype={'e': 'f'}),
           TD(P, f='cbrt'),
           ),
 'ceil':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.ceil'),
           None,
-          TD('e', f='ceil', astype={'e':'f'}),
-          TD(inexactvec, simd=[('fma', 'fd'), ('avx512f', 'fd')]),
+          TD('e', f='ceil', astype={'e': 'f'}),
+          TD(inexactvec, dispatch=[('loops_unary_fp', 'fd')]),
           TD('fdg', f='ceil'),
           TD(O, f='npy_ObjectCeil'),
           ),
@@ -801,7 +835,7 @@ defdict = {
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.trunc'),
           None,
-          TD('e', f='trunc', astype={'e':'f'}),
+          TD('e', f='trunc', astype={'e': 'f'}),
           TD(inexactvec, simd=[('fma', 'fd'), ('avx512f', 'fd')]),
           TD('fdg', f='trunc'),
           TD(O, f='npy_ObjectTrunc'),
@@ -810,14 +844,14 @@ defdict = {
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.fabs'),
           None,
-          TD(flts, f='fabs', astype={'e':'f'}),
+          TD(flts, f='fabs', astype={'e': 'f'}),
           TD(P, f='fabs'),
        ),
 'floor':
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.floor'),
           None,
-          TD('e', f='floor', astype={'e':'f'}),
+          TD('e', f='floor', astype={'e': 'f'}),
           TD(inexactvec, simd=[('fma', 'fd'), ('avx512f', 'fd')]),
           TD('fdg', f='floor'),
           TD(O, f='npy_ObjectFloor'),
@@ -826,7 +860,7 @@ defdict = {
     Ufunc(1, 1, None,
           docstrings.get('numpy.core.umath.rint'),
           None,
-          TD('e', f='rint', astype={'e':'f'}),
+          TD('e', f='rint', astype={'e': 'f'}),
           TD(inexactvec, simd=[('fma', 'fd'), ('avx512f', 'fd')]),
           TD('fdg' + cmplx, f='rint'),
           TD(P, f='rint'),
@@ -835,7 +869,7 @@ defdict = {
     Ufunc(2, 1, None,
           docstrings.get('numpy.core.umath.arctan2'),
           None,
-          TD(flts, f='atan2', astype={'e':'f'}),
+          TD(flts, f='atan2', astype={'e': 'f'}),
           TD(P, f='arctan2'),
           ),
 'remainder':
@@ -858,7 +892,7 @@ defdict = {
     Ufunc(2, 1, Zero,
           docstrings.get('numpy.core.umath.hypot'),
           None,
-          TD(flts, f='hypot', astype={'e':'f'}),
+          TD(flts, f='hypot', astype={'e': 'f'}),
           TD(P, f='hypot'),
           ),
 'isnan':
index fbd3233680fa8a210f38eb6130f569aa1476c63a..d12d62d8fe9aec0408f804a97687abef81ba60e8 100644 (file)
@@ -19,6 +19,7 @@ from code_generators.genapi import StealRef, NonNull
 multiarray_global_vars = {
     'NPY_NUMUSERTYPES':             (7, 'int'),
     'NPY_DEFAULT_ASSIGN_CASTING':   (292, 'NPY_CASTING'),
+    'PyDataMem_DefaultHandler':     (306, 'PyObject*'),
 }
 
 multiarray_scalar_bool_values = {
@@ -76,9 +77,9 @@ multiarray_types_api = {
     # End 1.6 API
 }
 
-#define NPY_NUMUSERTYPES (*(int *)PyArray_API[6])
-#define PyBoolArrType_Type (*(PyTypeObject *)PyArray_API[7])
-#define _PyArrayScalar_BoolValues ((PyBoolScalarObject *)PyArray_API[8])
+# define NPY_NUMUSERTYPES (*(int *)PyArray_API[6])
+# define PyBoolArrType_Type (*(PyTypeObject *)PyArray_API[7])
+# define _PyArrayScalar_BoolValues ((PyBoolScalarObject *)PyArray_API[8])
 
 multiarray_funcs_api = {
     'PyArray_GetNDArrayCVersion':           (0,),
@@ -350,6 +351,9 @@ multiarray_funcs_api = {
     'PyArray_ResolveWritebackIfCopy':       (302,),
     'PyArray_SetWritebackIfCopyBase':       (303,),
     # End 1.14 API
+    'PyDataMem_SetHandler':                 (304,),
+    'PyDataMem_GetHandler':                 (305,),
+    # End 1.21 API
 }
 
 ufunc_types_api = {
index f19946be408ae049a8ef2f9408c12c71d95fd84f..c9be945693dca5846d2ac40db930142b312e991a 100644 (file)
@@ -201,7 +201,8 @@ add_newdoc('numpy.core.umath', 'arccos',
     References
     ----------
     M. Abramowitz and I.A. Stegun, "Handbook of Mathematical Functions",
-    10th printing, 1964, pp. 79. http://www.math.sfu.ca/~cbm/aands/
+    10th printing, 1964, pp. 79.
+    https://personal.math.ubc.ca/~cbm/aands/page_79.htm
 
     Examples
     --------
@@ -258,7 +259,8 @@ add_newdoc('numpy.core.umath', 'arccosh',
     References
     ----------
     .. [1] M. Abramowitz and I.A. Stegun, "Handbook of Mathematical Functions",
-           10th printing, 1964, pp. 86. http://www.math.sfu.ca/~cbm/aands/
+           10th printing, 1964, pp. 86.
+           https://personal.math.ubc.ca/~cbm/aands/page_86.htm
     .. [2] Wikipedia, "Inverse hyperbolic function",
            https://en.wikipedia.org/wiki/Arccosh
 
@@ -312,7 +314,7 @@ add_newdoc('numpy.core.umath', 'arcsin',
     ----------
     Abramowitz, M. and Stegun, I. A., *Handbook of Mathematical Functions*,
     10th printing, New York: Dover, 1964, pp. 79ff.
-    http://www.math.sfu.ca/~cbm/aands/
+    https://personal.math.ubc.ca/~cbm/aands/page_79.htm
 
     Examples
     --------
@@ -360,7 +362,8 @@ add_newdoc('numpy.core.umath', 'arcsinh',
     References
     ----------
     .. [1] M. Abramowitz and I.A. Stegun, "Handbook of Mathematical Functions",
-           10th printing, 1964, pp. 86. http://www.math.sfu.ca/~cbm/aands/
+           10th printing, 1964, pp. 86.
+           https://personal.math.ubc.ca/~cbm/aands/page_86.htm
     .. [2] Wikipedia, "Inverse hyperbolic function",
            https://en.wikipedia.org/wiki/Arcsinh
 
@@ -415,7 +418,7 @@ add_newdoc('numpy.core.umath', 'arctan',
     ----------
     Abramowitz, M. and Stegun, I. A., *Handbook of Mathematical Functions*,
     10th printing, New York: Dover, 1964, pp. 79.
-    http://www.math.sfu.ca/~cbm/aands/
+    https://personal.math.ubc.ca/~cbm/aands/page_79.htm
 
     Examples
     --------
@@ -560,7 +563,8 @@ add_newdoc('numpy.core.umath', 'arctanh',
     References
     ----------
     .. [1] M. Abramowitz and I.A. Stegun, "Handbook of Mathematical Functions",
-           10th printing, 1964, pp. 86. http://www.math.sfu.ca/~cbm/aands/
+           10th printing, 1964, pp. 86.
+           https://personal.math.ubc.ca/~cbm/aands/page_86.htm
     .. [2] Wikipedia, "Inverse hyperbolic function",
            https://en.wikipedia.org/wiki/Arctanh
 
@@ -664,7 +668,7 @@ add_newdoc('numpy.core.umath', 'bitwise_or',
 
     Examples
     --------
-    The number 13 has the binaray representation ``00001101``. Likewise,
+    The number 13 has the binary representation ``00001101``. Likewise,
     16 is represented by ``00010000``.  The bit-wise OR of 13 and 16 is
     then ``000111011``, or 29:
 
@@ -1087,9 +1091,7 @@ add_newdoc('numpy.core.umath', 'divide',
 
     Behavior on division by zero can be changed using ``seterr``.
 
-    In Python 2, when both ``x1`` and ``x2`` are of an integer type,
-    ``divide`` will behave like ``floor_divide``. In Python 3, it behaves
-    like ``true_divide``.
+    Behaves like ``true_divide``.
 
     Examples
     --------
@@ -1102,27 +1104,6 @@ add_newdoc('numpy.core.umath', 'divide',
            [ Inf,  4. ,  2.5],
            [ Inf,  7. ,  4. ]])
 
-    Note the behavior with integer types (Python 2 only):
-
-    >>> np.divide(2, 4)
-    0
-    >>> np.divide(2, 4.)
-    0.5
-
-    Division by zero always yields zero in integer arithmetic (again,
-    Python 2 only), and does not raise an exception or a warning:
-
-    >>> np.divide(np.array([0, 1], dtype=int), np.array([0, 0], dtype=int))
-    array([0, 0])
-
-    Division by zero can, however, be caught using ``seterr``:
-
-    >>> old_err_state = np.seterr(divide='raise')
-    >>> np.divide(1, 0)
-    Traceback (most recent call last):
-      File "<stdin>", line 1, in <module>
-    FloatingPointError: divide by zero encountered in divide
-
     >>> ignored_states = np.seterr(**old_err_state)
     >>> np.divide(1, 0)
     0
@@ -1222,7 +1203,7 @@ add_newdoc('numpy.core.umath', 'exp',
            https://en.wikipedia.org/wiki/Exponential_function
     .. [2] M. Abramovitz and I. A. Stegun, "Handbook of Mathematical Functions
            with Formulas, Graphs, and Mathematical Tables," Dover, 1964, p. 69,
-           http://www.math.sfu.ca/~cbm/aands/page_69.htm
+           https://personal.math.ubc.ca/~cbm/aands/page_69.htm
 
     Examples
     --------
@@ -1439,7 +1420,7 @@ add_newdoc('numpy.core.umath', 'floor_divide',
 
 add_newdoc('numpy.core.umath', 'fmod',
     """
-    Return the element-wise remainder of division.
+    Returns the element-wise remainder of division.
 
     This is the NumPy implementation of the C library function fmod, the
     remainder has the same sign as the dividend `x1`. It is equivalent to
@@ -1697,7 +1678,7 @@ add_newdoc('numpy.core.umath', 'invert',
 
 add_newdoc('numpy.core.umath', 'isfinite',
     """
-    Test element-wise for finiteness (not infinity or not Not a Number).
+    Test element-wise for finiteness (not infinity and not Not a Number).
 
     The result is returned as a boolean array.
 
@@ -2052,7 +2033,8 @@ add_newdoc('numpy.core.umath', 'log',
     References
     ----------
     .. [1] M. Abramowitz and I.A. Stegun, "Handbook of Mathematical Functions",
-           10th printing, 1964, pp. 67. http://www.math.sfu.ca/~cbm/aands/
+           10th printing, 1964, pp. 67.
+           https://personal.math.ubc.ca/~cbm/aands/page_67.htm
     .. [2] Wikipedia, "Logarithm". https://en.wikipedia.org/wiki/Logarithm
 
     Examples
@@ -2101,7 +2083,8 @@ add_newdoc('numpy.core.umath', 'log10',
     References
     ----------
     .. [1] M. Abramowitz and I.A. Stegun, "Handbook of Mathematical Functions",
-           10th printing, 1964, pp. 67. http://www.math.sfu.ca/~cbm/aands/
+           10th printing, 1964, pp. 67.
+           https://personal.math.ubc.ca/~cbm/aands/page_67.htm
     .. [2] Wikipedia, "Logarithm". https://en.wikipedia.org/wiki/Logarithm
 
     Examples
@@ -2289,7 +2272,8 @@ add_newdoc('numpy.core.umath', 'log1p',
     References
     ----------
     .. [1] M. Abramowitz and I.A. Stegun, "Handbook of Mathematical Functions",
-           10th printing, 1964, pp. 67. http://www.math.sfu.ca/~cbm/aands/
+           10th printing, 1964, pp. 67.
+           https://personal.math.ubc.ca/~cbm/aands/page_67.htm
     .. [2] Wikipedia, "Logarithm". https://en.wikipedia.org/wiki/Logarithm
 
     Examples
@@ -3081,8 +3065,14 @@ add_newdoc('numpy.core.umath', 'power',
     First array elements raised to powers from second array, element-wise.
 
     Raise each base in `x1` to the positionally-corresponding power in
-    `x2`.  `x1` and `x2` must be broadcastable to the same shape. Note that an
-    integer type raised to a negative integer power will raise a ValueError.
+    `x2`.  `x1` and `x2` must be broadcastable to the same shape.
+
+    An integer type raised to a negative integer power will raise a
+    ``ValueError``.
+
+    Negative values raised to a non-integral value will return ``nan``.
+    To get complex results, cast the input to complex, or specify the
+    ``dtype`` to be ``complex`` (see the example below).
 
     Parameters
     ----------
@@ -3137,6 +3127,21 @@ add_newdoc('numpy.core.umath', 'power',
     >>> x1 ** x2
     array([ 0,  1,  8, 27, 16,  5])
 
+    Negative values raised to a non-integral value will result in ``nan``
+    (and a warning will be generated).
+
+    >>> x3 = np.array([-1.0, -4.0])
+    >>> with np.errstate(invalid='ignore'):
+    ...     p = np.power(x3, 1.5)
+    ...
+    >>> p
+    array([nan, nan])
+
+    To get complex results, give the argument ``dtype=complex``.
+
+    >>> np.power(x3, 1.5, dtype=complex)
+    array([-1.83697020e-16-1.j, -1.46957616e-15-8.j])
+
     """)
 
 add_newdoc('numpy.core.umath', 'float_power',
@@ -3150,6 +3155,10 @@ add_newdoc('numpy.core.umath', 'float_power',
     inexact.  The intent is that the function will return a usable result for
     negative powers and seldom overflow for positive powers.
 
+    Negative values raised to a non-integral value will return ``nan``.
+    To get complex results, cast the input to complex, or specify the
+    ``dtype`` to be ``complex`` (see the example below).
+
     .. versionadded:: 1.12.0
 
     Parameters
@@ -3197,6 +3206,21 @@ add_newdoc('numpy.core.umath', 'float_power',
     array([[  0.,   1.,   8.,  27.,  16.,   5.],
            [  0.,   1.,   8.,  27.,  16.,   5.]])
 
+    Negative values raised to a non-integral value will result in ``nan``
+    (and a warning will be generated).
+
+    >>> x3 = np.array([-1, -4])
+    >>> with np.errstate(invalid='ignore'):
+    ...     p = np.float_power(x3, 1.5)
+    ...
+    >>> p
+    array([nan, nan])
+
+    To get complex results, give the argument ``dtype=complex``.
+
+    >>> np.float_power(x3, 1.5, dtype=complex)
+    array([-1.83697020e-16-1.j, -1.46957616e-15-8.j])
+
     """)
 
 add_newdoc('numpy.core.umath', 'radians',
@@ -3308,7 +3332,7 @@ add_newdoc('numpy.core.umath', 'reciprocal',
 
 add_newdoc('numpy.core.umath', 'remainder',
     """
-    Return element-wise remainder of division.
+    Returns the element-wise remainder of division.
 
     Computes the remainder complementary to the `floor_divide` function.  It is
     equivalent to the Python modulus operator``x1 % x2`` and has the same sign
@@ -4002,7 +4026,7 @@ add_newdoc('numpy.core.umath', 'tanh',
     ----------
     .. [1] M. Abramowitz and I. A. Stegun, Handbook of Mathematical Functions.
            New York, NY: Dover, 1972, pg. 83.
-           http://www.math.sfu.ca/~cbm/aands/
+           https://personal.math.ubc.ca/~cbm/aands/page_83.htm
 
     .. [2] Wikipedia, "Hyperbolic function",
            https://en.wikipedia.org/wiki/Hyperbolic_function
@@ -4031,9 +4055,8 @@ add_newdoc('numpy.core.umath', 'true_divide',
     """
     Returns a true division of the inputs, element-wise.
 
-    Instead of the Python traditional 'floor division', this returns a true
-    division.  True division adjusts the output type to present the best
-    answer, regardless of input types.
+    Unlike 'floor division', true division adjusts the output type
+    to present the best answer, regardless of input types.
 
     Parameters
     ----------
index ab1166ad263f22eddf0cb207ac6c0a8d936ba0b1..3521e778e1bde865dd249c792dcd1fe9e064e75f 100644 (file)
@@ -16,7 +16,6 @@ The preferred alias for `defchararray` is `numpy.char`.
 
 """
 import functools
-import sys
 from .numerictypes import (
     string_, unicode_, integer, int_, object_, bool_, character)
 from .numeric import ndarray, compare_chararrays
@@ -2610,6 +2609,7 @@ class chararray(ndarray):
         return isdecimal(self)
 
 
+@set_module("numpy.char")
 def array(obj, itemsize=None, copy=True, unicode=None, order=None):
     """
     Create a `chararray`.
@@ -2743,6 +2743,7 @@ def array(obj, itemsize=None, copy=True, unicode=None, order=None):
     return val.view(chararray)
 
 
+@set_module("numpy.char")
 def asarray(obj, itemsize=None, unicode=None, order=None):
     """
     Convert the input to a `chararray`, copying the data only if
diff --git a/numpy/core/defchararray.pyi b/numpy/core/defchararray.pyi
new file mode 100644 (file)
index 0000000..28d247b
--- /dev/null
@@ -0,0 +1,422 @@
+from typing import (
+    Literal as L,
+    overload,
+    TypeVar,
+    Any,
+    List,
+)
+
+from numpy import (
+    chararray as chararray,
+    dtype,
+    str_,
+    bytes_,
+    int_,
+    bool_,
+    object_,
+    _OrderKACF,
+)
+
+from numpy.typing import (
+    NDArray,
+    _ArrayLikeStr_co as U_co,
+    _ArrayLikeBytes_co as S_co,
+    _ArrayLikeInt_co as i_co,
+    _ArrayLikeBool_co as b_co,
+)
+
+from numpy.core.multiarray import compare_chararrays as compare_chararrays
+
+_SCT = TypeVar("_SCT", str_, bytes_)
+_CharArray = chararray[Any, dtype[_SCT]]
+
+__all__: List[str]
+
+# Comparison
+@overload
+def equal(x1: U_co, x2: U_co) -> NDArray[bool_]: ...
+@overload
+def equal(x1: S_co, x2: S_co) -> NDArray[bool_]: ...
+
+@overload
+def not_equal(x1: U_co, x2: U_co) -> NDArray[bool_]: ...
+@overload
+def not_equal(x1: S_co, x2: S_co) -> NDArray[bool_]: ...
+
+@overload
+def greater_equal(x1: U_co, x2: U_co) -> NDArray[bool_]: ...
+@overload
+def greater_equal(x1: S_co, x2: S_co) -> NDArray[bool_]: ...
+
+@overload
+def less_equal(x1: U_co, x2: U_co) -> NDArray[bool_]: ...
+@overload
+def less_equal(x1: S_co, x2: S_co) -> NDArray[bool_]: ...
+
+@overload
+def greater(x1: U_co, x2: U_co) -> NDArray[bool_]: ...
+@overload
+def greater(x1: S_co, x2: S_co) -> NDArray[bool_]: ...
+
+@overload
+def less(x1: U_co, x2: U_co) -> NDArray[bool_]: ...
+@overload
+def less(x1: S_co, x2: S_co) -> NDArray[bool_]: ...
+
+# String operations
+@overload
+def add(x1: U_co, x2: U_co) -> NDArray[str_]: ...
+@overload
+def add(x1: S_co, x2: S_co) -> NDArray[bytes_]: ...
+
+@overload
+def multiply(a: U_co, i: i_co) -> NDArray[str_]: ...
+@overload
+def multiply(a: S_co, i: i_co) -> NDArray[bytes_]: ...
+
+@overload
+def mod(a: U_co, value: Any) -> NDArray[str_]: ...
+@overload
+def mod(a: S_co, value: Any) -> NDArray[bytes_]: ...
+
+@overload
+def capitalize(a: U_co) -> NDArray[str_]: ...
+@overload
+def capitalize(a: S_co) -> NDArray[bytes_]: ...
+
+@overload
+def center(a: U_co, width: i_co, fillchar: U_co = ...) -> NDArray[str_]: ...
+@overload
+def center(a: S_co, width: i_co, fillchar: S_co = ...) -> NDArray[bytes_]: ...
+
+def decode(
+    a: S_co,
+    encoding: None | str = ...,
+    errors: None | str = ...,
+) -> NDArray[str_]: ...
+
+def encode(
+    a: U_co,
+    encoding: None | str = ...,
+    errors: None | str = ...,
+) -> NDArray[bytes_]: ...
+
+@overload
+def expandtabs(a: U_co, tabsize: i_co = ...) -> NDArray[str_]: ...
+@overload
+def expandtabs(a: S_co, tabsize: i_co = ...) -> NDArray[bytes_]: ...
+
+@overload
+def join(sep: U_co, seq: U_co) -> NDArray[str_]: ...
+@overload
+def join(sep: S_co, seq: S_co) -> NDArray[bytes_]: ...
+
+@overload
+def ljust(a: U_co, width: i_co, fillchar: U_co = ...) -> NDArray[str_]: ...
+@overload
+def ljust(a: S_co, width: i_co, fillchar: S_co = ...) -> NDArray[bytes_]: ...
+
+@overload
+def lower(a: U_co) -> NDArray[str_]: ...
+@overload
+def lower(a: S_co) -> NDArray[bytes_]: ...
+
+@overload
+def lstrip(a: U_co, chars: None | U_co = ...) -> NDArray[str_]: ...
+@overload
+def lstrip(a: S_co, chars: None | S_co = ...) -> NDArray[bytes_]: ...
+
+@overload
+def partition(a: U_co, sep: U_co) -> NDArray[str_]: ...
+@overload
+def partition(a: S_co, sep: S_co) -> NDArray[bytes_]: ...
+
+@overload
+def replace(
+    a: U_co,
+    old: U_co,
+    new: U_co,
+    count: None | i_co = ...,
+) -> NDArray[str_]: ...
+@overload
+def replace(
+    a: S_co,
+    old: S_co,
+    new: S_co,
+    count: None | i_co = ...,
+) -> NDArray[bytes_]: ...
+
+@overload
+def rjust(
+    a: U_co,
+    width: i_co,
+    fillchar: U_co = ...,
+) -> NDArray[str_]: ...
+@overload
+def rjust(
+    a: S_co,
+    width: i_co,
+    fillchar: S_co = ...,
+) -> NDArray[bytes_]: ...
+
+@overload
+def rpartition(a: U_co, sep: U_co) -> NDArray[str_]: ...
+@overload
+def rpartition(a: S_co, sep: S_co) -> NDArray[bytes_]: ...
+
+@overload
+def rsplit(
+    a: U_co,
+    sep: None | U_co = ...,
+    maxsplit: None | i_co = ...,
+) -> NDArray[object_]: ...
+@overload
+def rsplit(
+    a: S_co,
+    sep: None | S_co = ...,
+    maxsplit: None | i_co = ...,
+) -> NDArray[object_]: ...
+
+@overload
+def rstrip(a: U_co, chars: None | U_co = ...) -> NDArray[str_]: ...
+@overload
+def rstrip(a: S_co, chars: None | S_co = ...) -> NDArray[bytes_]: ...
+
+@overload
+def split(
+    a: U_co,
+    sep: None | U_co = ...,
+    maxsplit: None | i_co = ...,
+) -> NDArray[object_]: ...
+@overload
+def split(
+    a: S_co,
+    sep: None | S_co = ...,
+    maxsplit: None | i_co = ...,
+) -> NDArray[object_]: ...
+
+@overload
+def splitlines(a: U_co, keepends: None | b_co = ...) -> NDArray[object_]: ...
+@overload
+def splitlines(a: S_co, keepends: None | b_co = ...) -> NDArray[object_]: ...
+
+@overload
+def strip(a: U_co, chars: None | U_co = ...) -> NDArray[str_]: ...
+@overload
+def strip(a: S_co, chars: None | S_co = ...) -> NDArray[bytes_]: ...
+
+@overload
+def swapcase(a: U_co) -> NDArray[str_]: ...
+@overload
+def swapcase(a: S_co) -> NDArray[bytes_]: ...
+
+@overload
+def title(a: U_co) -> NDArray[str_]: ...
+@overload
+def title(a: S_co) -> NDArray[bytes_]: ...
+
+@overload
+def translate(
+    a: U_co,
+    table: U_co,
+    deletechars: None | U_co = ...,
+) -> NDArray[str_]: ...
+@overload
+def translate(
+    a: S_co,
+    table: S_co,
+    deletechars: None | S_co = ...,
+) -> NDArray[bytes_]: ...
+
+@overload
+def upper(a: U_co) -> NDArray[str_]: ...
+@overload
+def upper(a: S_co) -> NDArray[bytes_]: ...
+
+@overload
+def zfill(a: U_co, width: i_co) -> NDArray[str_]: ...
+@overload
+def zfill(a: S_co, width: i_co) -> NDArray[bytes_]: ...
+
+# String information
+@overload
+def count(
+    a: U_co,
+    sub: U_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[int_]: ...
+@overload
+def count(
+    a: S_co,
+    sub: S_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[int_]: ...
+
+@overload
+def endswith(
+    a: U_co,
+    suffix: U_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[bool_]: ...
+@overload
+def endswith(
+    a: S_co,
+    suffix: S_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[bool_]: ...
+
+@overload
+def find(
+    a: U_co,
+    sub: U_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[int_]: ...
+@overload
+def find(
+    a: S_co,
+    sub: S_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[int_]: ...
+
+@overload
+def index(
+    a: U_co,
+    sub: U_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[int_]: ...
+@overload
+def index(
+    a: S_co,
+    sub: S_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[int_]: ...
+
+def isalpha(a: U_co | S_co) -> NDArray[bool_]: ...
+def isalnum(a: U_co | S_co) -> NDArray[bool_]: ...
+def isdecimal(a: U_co | S_co) -> NDArray[bool_]: ...
+def isdigit(a: U_co | S_co) -> NDArray[bool_]: ...
+def islower(a: U_co | S_co) -> NDArray[bool_]: ...
+def isnumeric(a: U_co | S_co) -> NDArray[bool_]: ...
+def isspace(a: U_co | S_co) -> NDArray[bool_]: ...
+def istitle(a: U_co | S_co) -> NDArray[bool_]: ...
+def isupper(a: U_co | S_co) -> NDArray[bool_]: ...
+
+@overload
+def rfind(
+    a: U_co,
+    sub: U_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[int_]: ...
+@overload
+def rfind(
+    a: S_co,
+    sub: S_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[int_]: ...
+
+@overload
+def rindex(
+    a: U_co,
+    sub: U_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[int_]: ...
+@overload
+def rindex(
+    a: S_co,
+    sub: S_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[int_]: ...
+
+@overload
+def startswith(
+    a: U_co,
+    prefix: U_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[bool_]: ...
+@overload
+def startswith(
+    a: S_co,
+    prefix: S_co,
+    start: i_co = ...,
+    end: None | i_co = ...,
+) -> NDArray[bool_]: ...
+
+def str_len(A: U_co | S_co) -> NDArray[int_]: ...
+
+# Overload 1 and 2: str- or bytes-based array-likes
+# overload 3: arbitrary object with unicode=False  (-> bytes_)
+# overload 4: arbitrary object with unicode=True  (-> str_)
+@overload
+def array(
+    obj: U_co,
+    itemsize: None | int = ...,
+    copy: bool = ...,
+    unicode: L[False] = ...,
+    order: _OrderKACF = ...,
+) -> _CharArray[str_]: ...
+@overload
+def array(
+    obj: S_co,
+    itemsize: None | int = ...,
+    copy: bool = ...,
+    unicode: L[False] = ...,
+    order: _OrderKACF = ...,
+) -> _CharArray[bytes_]: ...
+@overload
+def array(
+    obj: object,
+    itemsize: None | int = ...,
+    copy: bool = ...,
+    unicode: L[False] = ...,
+    order: _OrderKACF = ...,
+) -> _CharArray[bytes_]: ...
+@overload
+def array(
+    obj: object,
+    itemsize: None | int = ...,
+    copy: bool = ...,
+    unicode: L[True] = ...,
+    order: _OrderKACF = ...,
+) -> _CharArray[str_]: ...
+
+@overload
+def asarray(
+    obj: U_co,
+    itemsize: None | int = ...,
+    unicode: L[False] = ...,
+    order: _OrderKACF = ...,
+) -> _CharArray[str_]: ...
+@overload
+def asarray(
+    obj: S_co,
+    itemsize: None | int = ...,
+    unicode: L[False] = ...,
+    order: _OrderKACF = ...,
+) -> _CharArray[bytes_]: ...
+@overload
+def asarray(
+    obj: object,
+    itemsize: None | int = ...,
+    unicode: L[False] = ...,
+    order: _OrderKACF = ...,
+) -> _CharArray[bytes_]: ...
+@overload
+def asarray(
+    obj: object,
+    itemsize: None | int = ...,
+    unicode: L[True] = ...,
+    order: _OrderKACF = ...,
+) -> _CharArray[str_]: ...
index 18157641aaf4d6805c3cec19814295388bebb5e0..c78d3db23abcbf2a2dae92c8ca5ce8a836f3e878 100644 (file)
@@ -987,7 +987,7 @@ def einsum_path(*operands, optimize='greedy', einsum_call=False):
 
 
 def _einsum_dispatcher(*operands, out=None, optimize=None, **kwargs):
-    # Arguably we dispatch on more arguments that we really should; see note in
+    # Arguably we dispatch on more arguments than we really should; see note in
     # _einsum_path_dispatcher for why.
     yield from operands
     yield out
index 2457e8719df43385d8a08240d7c8113c376ea342..aabb04c478b9f3d9e7eb83ee486d16fe59effe43 100644 (file)
@@ -1,5 +1,4 @@
-import sys
-from typing import List, TypeVar, Optional, Any, overload, Union, Tuple, Sequence
+from typing import List, TypeVar, Optional, Any, overload, Union, Tuple, Sequence, Literal
 
 from numpy import (
     ndarray,
@@ -26,11 +25,6 @@ from numpy.typing import (
     _DTypeLikeComplex_co,
 )
 
-if sys.version_info >= (3, 8):
-    from typing import Literal
-else:
-    from typing_extensions import Literal
-
 _ArrayType = TypeVar(
     "_ArrayType",
     bound=ndarray[Any, dtype[Union[bool_, number[Any]]]],
@@ -47,12 +41,13 @@ __all__: List[str]
 # TODO: Properly handle the `casting`-based combinatorics
 # TODO: We need to evaluate the content `__subscripts` in order
 # to identify whether or an array or scalar is returned. At a cursory
-# glance this seems like something that can quite easilly be done with
+# glance this seems like something that can quite easily be done with
 # a mypy plugin.
 # Something like `is_scalar = bool(__subscripts.partition("->")[-1])`
 @overload
 def einsum(
-    __subscripts: str,
+    subscripts: str,
+    /,
     *operands: _ArrayLikeBool_co,
     out: None = ...,
     dtype: Optional[_DTypeLikeBool] = ...,
@@ -62,7 +57,8 @@ def einsum(
 ) -> Any: ...
 @overload
 def einsum(
-    __subscripts: str,
+    subscripts: str,
+    /,
     *operands: _ArrayLikeUInt_co,
     out: None = ...,
     dtype: Optional[_DTypeLikeUInt] = ...,
@@ -72,7 +68,8 @@ def einsum(
 ) -> Any: ...
 @overload
 def einsum(
-    __subscripts: str,
+    subscripts: str,
+    /,
     *operands: _ArrayLikeInt_co,
     out: None = ...,
     dtype: Optional[_DTypeLikeInt] = ...,
@@ -82,7 +79,8 @@ def einsum(
 ) -> Any: ...
 @overload
 def einsum(
-    __subscripts: str,
+    subscripts: str,
+    /,
     *operands: _ArrayLikeFloat_co,
     out: None = ...,
     dtype: Optional[_DTypeLikeFloat] = ...,
@@ -92,7 +90,8 @@ def einsum(
 ) -> Any: ...
 @overload
 def einsum(
-    __subscripts: str,
+    subscripts: str,
+    /,
     *operands: _ArrayLikeComplex_co,
     out: None = ...,
     dtype: Optional[_DTypeLikeComplex] = ...,
@@ -102,7 +101,8 @@ def einsum(
 ) -> Any: ...
 @overload
 def einsum(
-    __subscripts: str,
+    subscripts: str,
+    /,
     *operands: Any,
     casting: _CastingUnsafe,
     dtype: Optional[_DTypeLikeComplex_co] = ...,
@@ -112,7 +112,8 @@ def einsum(
 ) -> Any: ...
 @overload
 def einsum(
-    __subscripts: str,
+    subscripts: str,
+    /,
     *operands: _ArrayLikeComplex_co,
     out: _ArrayType,
     dtype: Optional[_DTypeLikeComplex_co] = ...,
@@ -122,7 +123,8 @@ def einsum(
 ) -> _ArrayType: ...
 @overload
 def einsum(
-    __subscripts: str,
+    subscripts: str,
+    /,
     *operands: Any,
     out: _ArrayType,
     casting: _CastingUnsafe,
@@ -136,7 +138,8 @@ def einsum(
 # NOTE: In practice the list consists of a `str` (first element)
 # and a variable number of integer tuples.
 def einsum_path(
-    __subscripts: str,
+    subscripts: str,
+    /,
     *operands: _ArrayLikeComplex_co,
     optimize: _OptimizeKind = ...,
 ) -> Tuple[List[Any], str]: ...
index 65a42eb1ee72c7843efbf8a2cf8f8c47d0b17644..3242124acf50826580b228ea61d5a372e5a6ba59 100644 (file)
@@ -689,6 +689,9 @@ def partition(a, kth, axis=-1, kind='introselect', order=None):
         it. The order of all elements in the partitions is undefined. If
         provided with a sequence of k-th it will partition all elements
         indexed by k-th  of them into their sorted position at once.
+
+        .. deprecated:: 1.22.0
+            Passing booleans as index is deprecated.
     axis : int or None, optional
         Axis along which to sort. If None, the array is flattened before
         sorting. The default is -1, which sorts along the last axis.
@@ -781,6 +784,9 @@ def argpartition(a, kth, axis=-1, kind='introselect', order=None):
         elements in the partitions is undefined. If provided with a
         sequence of k-th it will partition all of them into their sorted
         position at once.
+
+        .. deprecated:: 1.22.0
+            Passing booleans as index is deprecated.
     axis : int or None, optional
         Axis along which to sort. The default is -1 (the last axis). If
         None, the flattened array is used.
@@ -1114,12 +1120,12 @@ def argsort(a, axis=-1, kind=None, order=None):
     return _wrapfunc(a, 'argsort', axis=axis, kind=kind, order=order)
 
 
-def _argmax_dispatcher(a, axis=None, out=None):
+def _argmax_dispatcher(a, axis=None, out=None, *, keepdims=np._NoValue):
     return (a, out)
 
 
 @array_function_dispatch(_argmax_dispatcher)
-def argmax(a, axis=None, out=None):
+def argmax(a, axis=None, out=None, *, keepdims=np._NoValue):
     """
     Returns the indices of the maximum values along an axis.
 
@@ -1133,12 +1139,20 @@ def argmax(a, axis=None, out=None):
     out : array, optional
         If provided, the result will be inserted into this array. It should
         be of the appropriate shape and dtype.
+    keepdims : bool, optional
+        If this is set to True, the axes which are reduced are left
+        in the result as dimensions with size one. With this option,
+        the result will broadcast correctly against the array.
+
+        .. versionadded:: 1.22.0
 
     Returns
     -------
     index_array : ndarray of ints
         Array of indices into the array. It has the same shape as `a.shape`
-        with the dimension along `axis` removed.
+        with the dimension along `axis` removed. If `keepdims` is set to True,
+        then the size of `axis` will be 1 with the resulting array having same
+        shape as `a.shape`.
 
     See Also
     --------
@@ -1183,24 +1197,31 @@ def argmax(a, axis=None, out=None):
 
     >>> x = np.array([[4,2,3], [1,0,3]])
     >>> index_array = np.argmax(x, axis=-1)
-    >>> # Same as np.max(x, axis=-1, keepdims=True)
+    >>> # Same as np.amax(x, axis=-1, keepdims=True)
     >>> np.take_along_axis(x, np.expand_dims(index_array, axis=-1), axis=-1)
     array([[4],
            [3]])
-    >>> # Same as np.max(x, axis=-1)
+    >>> # Same as np.amax(x, axis=-1)
     >>> np.take_along_axis(x, np.expand_dims(index_array, axis=-1), axis=-1).squeeze(axis=-1)
     array([4, 3])
 
+    Setting `keepdims` to `True`,
+
+    >>> x = np.arange(24).reshape((2, 3, 4))
+    >>> res = np.argmax(x, axis=1, keepdims=True)
+    >>> res.shape
+    (2, 1, 4)
     """
-    return _wrapfunc(a, 'argmax', axis=axis, out=out)
+    kwds = {'keepdims': keepdims} if keepdims is not np._NoValue else {}
+    return _wrapfunc(a, 'argmax', axis=axis, out=out, **kwds)
 
 
-def _argmin_dispatcher(a, axis=None, out=None):
+def _argmin_dispatcher(a, axis=None, out=None, *, keepdims=np._NoValue):
     return (a, out)
 
 
 @array_function_dispatch(_argmin_dispatcher)
-def argmin(a, axis=None, out=None):
+def argmin(a, axis=None, out=None, *, keepdims=np._NoValue):
     """
     Returns the indices of the minimum values along an axis.
 
@@ -1214,12 +1235,20 @@ def argmin(a, axis=None, out=None):
     out : array, optional
         If provided, the result will be inserted into this array. It should
         be of the appropriate shape and dtype.
+    keepdims : bool, optional
+        If this is set to True, the axes which are reduced are left
+        in the result as dimensions with size one. With this option,
+        the result will broadcast correctly against the array.
+
+        .. versionadded:: 1.22.0
 
     Returns
     -------
     index_array : ndarray of ints
         Array of indices into the array. It has the same shape as `a.shape`
-        with the dimension along `axis` removed.
+        with the dimension along `axis` removed. If `keepdims` is set to True,
+        then the size of `axis` will be 1 with the resulting array having same
+        shape as `a.shape`.
 
     See Also
     --------
@@ -1264,16 +1293,23 @@ def argmin(a, axis=None, out=None):
 
     >>> x = np.array([[4,2,3], [1,0,3]])
     >>> index_array = np.argmin(x, axis=-1)
-    >>> # Same as np.min(x, axis=-1, keepdims=True)
+    >>> # Same as np.amin(x, axis=-1, keepdims=True)
     >>> np.take_along_axis(x, np.expand_dims(index_array, axis=-1), axis=-1)
     array([[2],
            [0]])
-    >>> # Same as np.max(x, axis=-1)
+    >>> # Same as np.amax(x, axis=-1)
     >>> np.take_along_axis(x, np.expand_dims(index_array, axis=-1), axis=-1).squeeze(axis=-1)
     array([2, 0])
 
+    Setting `keepdims` to `True`,
+
+    >>> x = np.arange(24).reshape((2, 3, 4))
+    >>> res = np.argmin(x, axis=1, keepdims=True)
+    >>> res.shape
+    (2, 1, 4)
     """
-    return _wrapfunc(a, 'argmin', axis=axis, out=out)
+    kwds = {'keepdims': keepdims} if keepdims is not np._NoValue else {}
+    return _wrapfunc(a, 'argmin', axis=axis, out=out, **kwds)
 
 
 def _searchsorted_dispatcher(a, v, side=None, sorter=None):
@@ -1318,8 +1354,9 @@ def searchsorted(a, v, side='left', sorter=None):
 
     Returns
     -------
-    indices : array of ints
-        Array of insertion points with the same shape as `v`.
+    indices : int or array of ints
+        Array of insertion points with the same shape as `v`,
+        or an integer if `v` is a scalar.
 
     See Also
     --------
@@ -1381,9 +1418,9 @@ def resize(a, new_shape):
 
     See Also
     --------
-    np.reshape : Reshape an array without changing the total size.
-    np.pad : Enlarge and pad an array.
-    np.repeat : Repeat elements of an array.
+    numpy.reshape : Reshape an array without changing the total size.
+    numpy.pad : Enlarge and pad an array.
+    numpy.repeat : Repeat elements of an array.
     ndarray.resize : resize an array in-place.
 
     Notes
@@ -2088,9 +2125,9 @@ def clip(a, a_min, a_max, out=None, **kwargs):
 
     Notes
     -----
-    When `a_min` is greater than `a_max`, `clip` returns an 
-    array in which all values are equal to `a_max`, 
-    as shown in the second example.  
+    When `a_min` is greater than `a_max`, `clip` returns an
+    array in which all values are equal to `a_max`,
+    as shown in the second example.
 
     Examples
     --------
@@ -2525,7 +2562,7 @@ def cumsum(a, axis=None, dtype=None, out=None):
     >>> b = np.array([1, 2e-9, 3e-9] * 1000000)
     >>> b.cumsum()[-1]
     1000000.0050045159
-    >>> b.sum()                    
+    >>> b.sum()
     1000000.0050000029
 
     """
@@ -2739,14 +2776,14 @@ def amax(a, axis=None, out=None, keepdims=np._NoValue, initial=np._NoValue,
     You can use an initial value to compute the maximum of an empty slice, or
     to initialize it to a different value:
 
-    >>> np.max([[-50], [10]], axis=-1, initial=0)
+    >>> np.amax([[-50], [10]], axis=-1, initial=0)
     array([ 0, 10])
 
     Notice that the initial value is used as one of the elements for which the
     maximum is determined, unlike for the default argument Python's max
     function, which is only used for empty iterables.
 
-    >>> np.max([5], initial=6)
+    >>> np.amax([5], initial=6)
     6
     >>> max([5], default=6)
     5
@@ -2862,7 +2899,7 @@ def amin(a, axis=None, out=None, keepdims=np._NoValue, initial=np._NoValue,
     >>> np.nanmin(b)
     0.0
 
-    >>> np.min([[-50], [10]], axis=-1, initial=0)
+    >>> np.amin([[-50], [10]], axis=-1, initial=0)
     array([-50,   0])
 
     Notice that the initial value is used as one of the elements for which the
@@ -2871,7 +2908,7 @@ def amin(a, axis=None, out=None, keepdims=np._NoValue, initial=np._NoValue,
 
     Notice that this isn't the same as Python's ``default`` argument.
 
-    >>> np.min([6], initial=5)
+    >>> np.amin([6], initial=5)
     5
     >>> min([6], default=5)
     6
@@ -3293,18 +3330,15 @@ def around(a, decimals=0, out=None):
     ----------
     .. [1] "Lecture Notes on the Status of IEEE 754", William Kahan,
            https://people.eecs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF
-    .. [2] "How Futile are Mindless Assessments of
-           Roundoff in Floating-Point Computation?", William Kahan,
-           https://people.eecs.berkeley.edu/~wkahan/Mindless.pdf
 
     Examples
     --------
     >>> np.around([0.37, 1.64])
-    array([0.,  2.])
+    array([0., 2.])
     >>> np.around([0.37, 1.64], decimals=1)
-    array([0.4,  1.6])
+    array([0.4, 1.6])
     >>> np.around([.5, 1.5, 2.5, 3.5, 4.5]) # rounds to nearest even value
-    array([0.,  2.,  2.,  4.,  4.])
+    array([0., 2., 2., 4., 4.])
     >>> np.around([1,2,3,11], decimals=1) # ndarray of ints is returned
     array([ 1,  2,  3, 11])
     >>> np.around([1,2,3,11], decimals=-1)
index 3342ec3ac47b36db262be29c9eb395791d658d05..3cbe1d5c5ce25c5003562efccb773d5a96002f73 100644 (file)
@@ -1,6 +1,5 @@
-import sys
 import datetime as dt
-from typing import Optional, Union, Sequence, Tuple, Any, overload, TypeVar
+from typing import Optional, Union, Sequence, Tuple, Any, overload, TypeVar, Literal
 
 from numpy import (
     ndarray,
@@ -26,11 +25,6 @@ from numpy.typing import (
     _NumberLike_co,
 )
 
-if sys.version_info >= (3, 8):
-    from typing import Literal
-else:
-    from typing_extensions import Literal
-
 # Various annotations for scalars
 
 # While dt.datetime and dt.timedelta are not technically part of NumPy,
@@ -130,12 +124,16 @@ def argmax(
     a: ArrayLike,
     axis: None = ...,
     out: Optional[ndarray] = ...,
+    *,
+    keepdims: Literal[False] = ...,
 ) -> intp: ...
 @overload
 def argmax(
     a: ArrayLike,
     axis: Optional[int] = ...,
     out: Optional[ndarray] = ...,
+    *,
+    keepdims: bool = ...,
 ) -> Any: ...
 
 @overload
@@ -143,12 +141,16 @@ def argmin(
     a: ArrayLike,
     axis: None = ...,
     out: Optional[ndarray] = ...,
+    *,
+    keepdims: Literal[False] = ...,
 ) -> intp: ...
 @overload
 def argmin(
     a: ArrayLike,
     axis: Optional[int] = ...,
     out: Optional[ndarray] = ...,
+    *,
+    keepdims: bool = ...,
 ) -> Any: ...
 
 @overload
index b5d6ca6abe88cfd0d583ab1a204468439ba3e8e3..68d3b3a98f5766c27cef8c8052d71abda16da9c3 100644 (file)
@@ -1,19 +1,16 @@
-import sys
-from typing import overload, Tuple, Union, Sequence, Any
+from typing import overload, Tuple, Union, Sequence, Any, SupportsIndex, Literal, List
 
 from numpy import ndarray
 from numpy.typing import ArrayLike, DTypeLike, _SupportsArray, _NumberLike_co
 
-if sys.version_info >= (3, 8):
-    from typing import SupportsIndex, Literal
-else:
-    from typing_extensions import SupportsIndex, Literal
-
 # TODO: wait for support for recursive types
 _ArrayLikeNested = Sequence[Sequence[Any]]
 _ArrayLikeNumber = Union[
     _NumberLike_co, Sequence[_NumberLike_co], ndarray, _SupportsArray, _ArrayLikeNested
 ]
+
+__all__: List[str]
+
 @overload
 def linspace(
     start: _ArrayLikeNumber,
@@ -53,3 +50,11 @@ def geomspace(
     dtype: DTypeLike = ...,
     axis: SupportsIndex = ...,
 ) -> ndarray: ...
+
+# Re-exported to `np.lib.function_base`
+def add_newdoc(
+    place: str,
+    obj: str,
+    doc: str | Tuple[str, str] | List[Tuple[str, str]],
+    warn_on_python: bool = ...,
+) -> None: ...
index fcb73e8ba3a4db50af279fa1d6ce3e9d103e6a26..ab4a4d2be696de9471d3d7eb84a4218050623a28 100644 (file)
@@ -5,13 +5,12 @@ __all__ = ['finfo', 'iinfo']
 
 import warnings
 
-from .machar import MachAr
+from ._machar import MachAr
 from .overrides import set_module
 from . import numeric
 from . import numerictypes as ntypes
-from .numeric import array, inf
-from .umath import log10, exp2
-from . import umath
+from .numeric import array, inf, NaN
+from .umath import log10, exp2, nextafter, isnan
 
 
 def _fr0(a):
@@ -29,32 +28,96 @@ def _fr1(a):
         a.shape = ()
     return a
 
+
 class MachArLike:
     """ Object to simulate MachAr instance """
-
-    def __init__(self,
-                 ftype,
-                 *, eps, epsneg, huge, tiny, ibeta, **kwargs):
-        params = _MACHAR_PARAMS[ftype]
-        float_conv = lambda v: array([v], ftype)
-        float_to_float = lambda v : _fr1(float_conv(v))
-        float_to_str = lambda v: (params['fmt'] % array(_fr0(v)[0], ftype))
-
-        self.title = params['title']
+    def __init__(self, ftype, *, eps, epsneg, huge, tiny,
+                 ibeta, smallest_subnormal=None, **kwargs):
+        self.params = _MACHAR_PARAMS[ftype]
+        self.ftype = ftype
+        self.title = self.params['title']
         # Parameter types same as for discovered MachAr object.
-        self.epsilon = self.eps = float_to_float(eps)
-        self.epsneg = float_to_float(epsneg)
-        self.xmax = self.huge = float_to_float(huge)
-        self.xmin = self.tiny = float_to_float(tiny)
-        self.ibeta = params['itype'](ibeta)
+        if not smallest_subnormal:
+            self._smallest_subnormal = nextafter(
+                self.ftype(0), self.ftype(1), dtype=self.ftype)
+        else:
+            self._smallest_subnormal = smallest_subnormal
+        self.epsilon = self.eps = self._float_to_float(eps)
+        self.epsneg = self._float_to_float(epsneg)
+        self.xmax = self.huge = self._float_to_float(huge)
+        self.xmin = self._float_to_float(tiny)
+        self.smallest_normal = self.tiny = self._float_to_float(tiny)
+        self.ibeta = self.params['itype'](ibeta)
         self.__dict__.update(kwargs)
         self.precision = int(-log10(self.eps))
-        self.resolution = float_to_float(float_conv(10) ** (-self.precision))
-        self._str_eps = float_to_str(self.eps)
-        self._str_epsneg = float_to_str(self.epsneg)
-        self._str_xmin = float_to_str(self.xmin)
-        self._str_xmax = float_to_str(self.xmax)
-        self._str_resolution = float_to_str(self.resolution)
+        self.resolution = self._float_to_float(
+            self._float_conv(10) ** (-self.precision))
+        self._str_eps = self._float_to_str(self.eps)
+        self._str_epsneg = self._float_to_str(self.epsneg)
+        self._str_xmin = self._float_to_str(self.xmin)
+        self._str_xmax = self._float_to_str(self.xmax)
+        self._str_resolution = self._float_to_str(self.resolution)
+        self._str_smallest_normal = self._float_to_str(self.xmin)
+
+    @property
+    def smallest_subnormal(self):
+        """Return the value for the smallest subnormal.
+
+        Returns
+        -------
+        smallest_subnormal : float
+            value for the smallest subnormal.
+
+        Warns
+        -----
+        UserWarning
+            If the calculated value for the smallest subnormal is zero.
+        """
+        # Check that the calculated value is not zero, in case it raises a
+        # warning.
+        value = self._smallest_subnormal
+        if self.ftype(0) == value:
+            warnings.warn(
+                'The value of the smallest subnormal for {} type '
+                'is zero.'.format(self.ftype), UserWarning, stacklevel=2)
+
+        return self._float_to_float(value)
+
+    @property
+    def _str_smallest_subnormal(self):
+        """Return the string representation of the smallest subnormal."""
+        return self._float_to_str(self.smallest_subnormal)
+
+    def _float_to_float(self, value):
+        """Converts float to float.
+
+        Parameters
+        ----------
+        value : float
+            value to be converted.
+        """
+        return _fr1(self._float_conv(value))
+
+    def _float_conv(self, value):
+        """Converts float to conv.
+
+        Parameters
+        ----------
+        value : float
+            value to be converted.
+        """
+        return array([value], self.ftype)
+
+    def _float_to_str(self, value):
+        """Converts float to str.
+
+        Parameters
+        ----------
+        value : float
+            value to be converted.
+        """
+        return self.params['fmt'] % array(_fr0(value)[0], self.ftype)
+
 
 _convert_to_float = {
     ntypes.csingle: ntypes.single,
@@ -91,6 +154,7 @@ def _register_type(machar, bytepat):
     _KNOWN_TYPES[bytepat] = machar
 _float_ma = {}
 
+
 def _register_known_types():
     # Known parameters for float16
     # See docstring of MachAr class for description of parameters.
@@ -208,23 +272,27 @@ def _register_known_types():
     # https://en.wikipedia.org/wiki/Quadruple-precision_floating-point_format#Double-double_arithmetic
     # These numbers have the same exponent range as float64, but extended number of
     # digits in the significand.
-    huge_dd = (umath.nextafter(ld(inf), ld(0))
-                if hasattr(umath, 'nextafter')  # Missing on some platforms?
-                else float64_ma.huge)
+    huge_dd = nextafter(ld(inf), ld(0), dtype=ld)
+    # As the smallest_normal in double double is so hard to calculate we set
+    # it to NaN.
+    smallest_normal_dd = NaN
+    # Leave the same value for the smallest subnormal as double
+    smallest_subnormal_dd = ld(nextafter(0., 1.))
     float_dd_ma = MachArLike(ld,
-                              machep=-105,
-                              negep=-106,
-                              minexp=-1022,
-                              maxexp=1024,
-                              it=105,
-                              iexp=11,
-                              ibeta=2,
-                              irnd=5,
-                              ngrd=0,
-                              eps=exp2(ld(-105)),
-                              epsneg= exp2(ld(-106)),
-                              huge=huge_dd,
-                              tiny=exp2(ld(-1022)))
+                             machep=-105,
+                             negep=-106,
+                             minexp=-1022,
+                             maxexp=1024,
+                             it=105,
+                             iexp=11,
+                             ibeta=2,
+                             irnd=5,
+                             ngrd=0,
+                             eps=exp2(ld(-105)),
+                             epsneg=exp2(ld(-106)),
+                             huge=huge_dd,
+                             tiny=smallest_normal_dd,
+                             smallest_subnormal=smallest_subnormal_dd)
     # double double; low, high order (e.g. PPC 64)
     _register_type(float_dd_ma,
         b'\x9a\x99\x99\x99\x99\x99Y<\x9a\x99\x99\x99\x99\x99\xb9\xbf')
@@ -317,6 +385,8 @@ class finfo:
     machar : MachAr
         The object which calculated these parameters and holds more
         detailed information.
+
+        .. deprecated:: 1.22
     machep : int
         The exponent that yields `eps`.
     max : floating point number of the appropriate type
@@ -341,8 +411,13 @@ class finfo:
         The approximate decimal resolution of this type, i.e.,
         ``10**-precision``.
     tiny : float
-        The smallest positive floating point number with full precision
-        (see Notes).
+        An alias for `smallest_normal`, kept for backwards compatibility.
+    smallest_normal : float
+        The smallest positive floating point number with 1 as leading bit in
+        the mantissa following IEEE-754 (see Notes).
+    smallest_subnormal : float
+        The smallest positive floating point number with 0 as leading bit in
+        the mantissa following IEEE-754.
 
     Parameters
     ----------
@@ -363,12 +438,12 @@ class finfo:
     impacts import times.  These objects are cached, so calling ``finfo()``
     repeatedly inside your functions is not a problem.
 
-    Note that ``tiny`` is not actually the smallest positive representable
-    value in a NumPy floating point type. As in the IEEE-754 standard [1]_,
-    NumPy floating point types make use of subnormal numbers to fill the
-    gap between 0 and ``tiny``. However, subnormal numbers may have
-    significantly reduced precision [2]_.
-    
+    Note that ``smallest_normal`` is not actually the smallest positive
+    representable value in a NumPy floating point type. As in the IEEE-754
+    standard [1]_, NumPy floating point types make use of subnormal numbers to
+    fill the gap between 0 and ``smallest_normal``. However, subnormal numbers
+    may have significantly reduced precision [2]_.
+
     References
     ----------
     .. [1] IEEE Standard for Floating-Point Arithmetic, IEEE Std 754-2008,
@@ -420,7 +495,7 @@ class finfo:
                      'maxexp', 'minexp', 'negep',
                      'machep']:
             setattr(self, word, getattr(machar, word))
-        for word in ['tiny', 'resolution', 'epsneg']:
+        for word in ['resolution', 'epsneg', 'smallest_subnormal']:
             setattr(self, word, getattr(machar, word).flat[0])
         self.bits = self.dtype.itemsize * 8
         self.max = machar.huge.flat[0]
@@ -428,12 +503,14 @@ class finfo:
         self.eps = machar.eps.flat[0]
         self.nexp = machar.iexp
         self.nmant = machar.it
-        self.machar = machar
+        self._machar = machar
         self._str_tiny = machar._str_xmin.strip()
         self._str_max = machar._str_xmax.strip()
         self._str_epsneg = machar._str_epsneg.strip()
         self._str_eps = machar._str_eps.strip()
         self._str_resolution = machar._str_resolution.strip()
+        self._str_smallest_normal = machar._str_smallest_normal.strip()
+        self._str_smallest_subnormal = machar._str_smallest_subnormal.strip()
         return self
 
     def __str__(self):
@@ -446,6 +523,8 @@ class finfo:
             'minexp = %(minexp)6s   tiny =       %(_str_tiny)s\n'
             'maxexp = %(maxexp)6s   max =        %(_str_max)s\n'
             'nexp =   %(nexp)6s   min =        -max\n'
+            'smallest_normal = %(_str_smallest_normal)s   '
+            'smallest_subnormal = %(_str_smallest_subnormal)s\n'
             '---------------------------------------------------------------\n'
             )
         return fmt % self.__dict__
@@ -457,6 +536,60 @@ class finfo:
         return (("%(klass)s(resolution=%(resolution)s, min=-%(_str_max)s,"
                  " max=%(_str_max)s, dtype=%(dtype)s)") % d)
 
+    @property
+    def smallest_normal(self):
+        """Return the value for the smallest normal.
+
+        Returns
+        -------
+        smallest_normal : float
+            Value for the smallest normal.
+
+        Warns
+        -----
+        UserWarning
+            If the calculated value for the smallest normal is requested for
+            double-double.
+        """
+        # This check is necessary because the value for smallest_normal is
+        # platform dependent for longdouble types.
+        if isnan(self._machar.smallest_normal.flat[0]):
+            warnings.warn(
+                'The value of smallest normal is undefined for double double',
+                UserWarning, stacklevel=2)
+        return self._machar.smallest_normal.flat[0]
+
+    @property
+    def tiny(self):
+        """Return the value for tiny, alias of smallest_normal.
+
+        Returns
+        -------
+        tiny : float
+            Value for the smallest normal, alias of smallest_normal.
+
+        Warns
+        -----
+        UserWarning
+            If the calculated value for the smallest normal is requested for
+            double-double.
+        """
+        return self.smallest_normal
+
+    @property
+    def machar(self):
+        """The object which calculated these parameters and holds more
+        detailed information.
+
+        .. deprecated:: 1.22
+        """
+        # Deprecated 2021-10-27, NumPy 1.22
+        warnings.warn(
+            "`finfo.machar` is deprecated (NumPy 1.22)",
+            DeprecationWarning, stacklevel=2,
+        )
+        return self._machar
+
 
 @set_module('numpy')
 class iinfo:
diff --git a/numpy/core/getlimits.pyi b/numpy/core/getlimits.pyi
new file mode 100644 (file)
index 0000000..66d0629
--- /dev/null
@@ -0,0 +1,8 @@
+from typing import List
+
+from numpy import (
+    finfo as finfo,
+    iinfo as iinfo,
+)
+
+__all__: List[str]
diff --git a/numpy/core/include/numpy/.doxyfile b/numpy/core/include/numpy/.doxyfile
new file mode 100644 (file)
index 0000000..ed2aeff
--- /dev/null
@@ -0,0 +1,2 @@
+INCLUDE_PATH += @CUR_DIR
+PREDEFINED += NPY_INTERNAL_BUILD
index e8860cbc73bbab08b8c5391b2401e2bad38bdcde..07e2363d00c30f6b14eedc06a2d9e1ff767a2ec8 100644 (file)
@@ -1,4 +1,4 @@
-#ifndef _NPY_INCLUDE_NEIGHBORHOOD_IMP
+#ifndef NUMPY_CORE_INCLUDE_NUMPY__NEIGHBORHOOD_IMP_H_
 #error You should not include this header directly
 #endif
 /*
index 4f46d6b1ac91da10689474b788e30de21901bb83..da47bb09627aefe8501abb39b8d2a9225985e3fc 100644 (file)
@@ -1,4 +1,5 @@
-#ifndef Py_ARRAYOBJECT_H
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_ARRAYOBJECT_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_ARRAYOBJECT_H_
 #define Py_ARRAYOBJECT_H
 
 #include "ndarrayobject.h"
@@ -8,4 +9,4 @@
 #include "noprefix.h"
 #endif
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_ARRAYOBJECT_H_ */
index 14a31988fe428ff77025ae380b0e11f43ac57e8f..a20a6801686da6b0dc3bd280af15db14067214a1 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ARRAYSCALARS_H_
-#define _NPY_ARRAYSCALARS_H_
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_ARRAYSCALARS_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_ARRAYSCALARS_H_
 
 #ifndef _MULTIARRAYMODULE
 typedef struct {
@@ -179,4 +179,4 @@ typedef struct {
 #define PyArrayScalar_ASSIGN(obj, cls, val) \
         PyArrayScalar_VAL(obj, cls) = val
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_ARRAYSCALARS_H_ */
diff --git a/numpy/core/include/numpy/experimental_dtype_api.h b/numpy/core/include/numpy/experimental_dtype_api.h
new file mode 100644 (file)
index 0000000..effa66b
--- /dev/null
@@ -0,0 +1,386 @@
+/*
+ * This header exports the new experimental DType API as proposed in
+ * NEPs 41 to 43.  For background, please check these NEPs.  Otherwise,
+ * this header also serves as documentation for the time being.
+ *
+ * Please do not hesitate to contact @seberg with questions.  This is
+ * developed together with https://github.com/seberg/experimental_user_dtypes
+ * and those interested in experimenting are encouraged to contribute there.
+ *
+ * To use the functions defined in the header, call::
+ *
+ *     if (import_experimental_dtype_api(version) < 0) {
+ *         return NULL;
+ *     }
+ *
+ * in your module init.  (A version mismatch will be reported, just update
+ * to the correct one, this will alert you of possible changes.)
+ *
+ * The following lists the main symbols currently exported.  Please do not
+ * hesitate to ask for help or clarification:
+ *
+ * - PyUFunc_AddLoopFromSpec:
+ *
+ *     Register a new loop for a ufunc.  This uses the `PyArrayMethod_Spec`
+ *     which must be filled in (see in-line comments).
+ *
+ * - PyUFunc_AddPromoter:
+ *
+ *     Register a new promoter for a ufunc.  A promoter is a function stored
+ *     in a PyCapsule (see in-line comments).  It is passed the operation and
+ *     requested DType signatures and can mutate it to attempt a new search
+ *     for a matching loop/promoter.
+ *     I.e. for Numba a promoter could even add the desired loop.
+ *
+ * - PyArrayInitDTypeMeta_FromSpec:
+ *
+ *     Initialize a new DType.  It must currently be a static Python C type
+ *     that is declared as `PyArray_DTypeMeta` and not `PyTypeObject`.
+ *     Further, it must subclass `np.dtype` and set its type to
+ *     `PyArrayDTypeMeta_Type` (before calling `PyType_Read()`).
+ *
+ * - PyArray_CommonDType:
+ *
+ *     Find the common-dtype ("promotion") for two DType classes.  Similar
+ *     to `np.result_type`, but works on the classes and not instances.
+ *
+ * - PyArray_PromoteDTypeSequence:
+ *
+ *     Same as CommonDType, but works with an arbitrary number of DTypes.
+ *     This function is smarter and can often return successful and unambiguous
+ *     results when `common_dtype(common_dtype(dt1, dt2), dt3)` would
+ *     depend on the operation order or fail.  Nevertheless, DTypes should
+ *     aim to ensure that their common-dtype implementation is associative
+ *     and commutative!  (Mainly, unsigned and signed integers are not.)
+ *
+ *     For guaranteed consistent results DTypes must implement common-Dtype
+ *     "transitively".  If A promotes B and B promotes C, than A must generally
+ *     also promote C; where "promotes" means implements the promotion.
+ *     (There are some exceptions for abstract DTypes)
+ *
+ * WARNING
+ * =======
+ *
+ * By using this header, you understand that this is a fully experimental
+ * exposure.  Details are expected to change, and some options may have no
+ * effect.  (Please contact @seberg if you have questions!)
+ * If the exposure stops working, please file a bug report with NumPy.
+ * Further, a DType created using this API/header should still be expected
+ * to be incompatible with some functionality inside and outside of NumPy.
+ * In this case crashes must be expected.  Please report any such problems
+ * so that they can be fixed before final exposure.
+ * Furthermore, expect missing checks for programming errors which the final
+ * API is expected to have.
+ *
+ * Symbols with a leading underscore are likely to not be included in the
+ * first public version, if these are central to your use-case, please let
+ * us know, so that we can reconsider.
+ *
+ * "Array-like" consumer API not yet under considerations
+ * ======================================================
+ *
+ * The new DType API is designed in a way to make it potentially useful for
+ * alternative "array-like" implementations.  This will require careful
+ * exposure of details and functions and is not part of this experimental API.
+ */
+
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_EXPERIMENTAL_DTYPE_API_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_EXPERIMENTAL_DTYPE_API_H_
+
+#include <Python.h>
+#include "ndarraytypes.h"
+
+
+/*
+ * Just a hack so I don't forget importing as much myself, I spend way too
+ * much time noticing it the first time around :).
+ */
+static void
+__not_imported(void)
+{
+    printf("*****\nCritical error, dtype API not imported\n*****\n");
+}
+static void *__uninitialized_table[] = {
+        &__not_imported, &__not_imported, &__not_imported, &__not_imported,
+        &__not_imported, &__not_imported, &__not_imported, &__not_imported};
+
+
+static void **__experimental_dtype_api_table = __uninitialized_table;
+
+
+/*
+ * DTypeMeta struct, the content may be made fully opaque (except the size).
+ * We may also move everything into a single `void *dt_slots`.
+ */
+typedef struct {
+    PyHeapTypeObject super;
+    PyArray_Descr *singleton;
+    int type_num;
+    PyTypeObject *scalar_type;
+    npy_uint64 flags;
+    void *dt_slots;
+    void *reserved[3];
+} PyArray_DTypeMeta;
+
+
+/*
+ * ******************************************************
+ *         ArrayMethod API (Casting and UFuncs)
+ * ******************************************************
+ */
+/*
+ * NOTE: Expected changes:
+ *       * invert logic of floating point error flag
+ *       * probably split runtime and general flags into two
+ *       * should possibly not use an enum for typdef for more stable ABI?
+ */
+typedef enum {
+    /* Flag for whether the GIL is required */
+    NPY_METH_REQUIRES_PYAPI = 1 << 1,
+    /*
+     * Some functions cannot set floating point error flags, this flag
+     * gives us the option (not requirement) to skip floating point error
+     * setup/check. No function should set error flags and ignore them
+     * since it would interfere with chaining operations (e.g. casting).
+     */
+    NPY_METH_NO_FLOATINGPOINT_ERRORS = 1 << 2,
+    /* Whether the method supports unaligned access (not runtime) */
+    NPY_METH_SUPPORTS_UNALIGNED = 1 << 3,
+
+    /* All flags which can change at runtime */
+    NPY_METH_RUNTIME_FLAGS = (
+            NPY_METH_REQUIRES_PYAPI |
+            NPY_METH_NO_FLOATINGPOINT_ERRORS),
+} NPY_ARRAYMETHOD_FLAGS;
+
+
+/*
+ * The main object for creating a new ArrayMethod. We use the typical `slots`
+ * mechanism used by the Python limited API (see below for the slot defs).
+ */
+typedef struct {
+    const char *name;
+    int nin, nout;
+    NPY_CASTING casting;
+    NPY_ARRAYMETHOD_FLAGS flags;
+    PyObject **dtypes;  /* array of DType class objects */
+    PyType_Slot *slots;
+} PyArrayMethod_Spec;
+
+
+typedef PyObject *_ufunc_addloop_fromspec_func(
+        PyObject *ufunc, PyArrayMethod_Spec *spec);
+/*
+ * The main ufunc registration function.  This adds a new implementation/loop
+ * to a ufunc.  It replaces `PyUFunc_RegisterLoopForType`.
+ */
+#define PyUFunc_AddLoopFromSpec \
+    (*(_ufunc_addloop_fromspec_func *)(__experimental_dtype_api_table[0]))
+
+
+/*
+ * Type of the C promoter function, which must be wrapped into a
+ * PyCapsule with name "numpy._ufunc_promoter".
+ *
+ * Note that currently the output dtypes are always NULL unless they are
+ * also part of the signature.  This is an implementation detail and could
+ * change in the future.  However, in general promoters should not have a
+ * need for output dtypes.
+ * (There are potential use-cases, these are currently unsupported.)
+ */
+typedef int promoter_function(PyObject *ufunc,
+        PyArray_DTypeMeta *op_dtypes[], PyArray_DTypeMeta *signature[],
+        PyArray_DTypeMeta *new_op_dtypes[]);
+
+/*
+ * Function to register a promoter.
+ *
+ * @param ufunc The ufunc object to register the promoter with.
+ * @param DType_tuple A Python tuple containing DTypes or None matching the
+ *        number of inputs and outputs of the ufunc.
+ * @param promoter A PyCapsule with name "numpy._ufunc_promoter" containing
+ *        a pointer to a `promoter_function`.
+ */
+typedef int _ufunc_addpromoter_func(
+        PyObject *ufunc, PyObject *DType_tuple, PyObject *promoter);
+#define PyUFunc_AddPromoter \
+    (*(_ufunc_addpromoter_func *)(__experimental_dtype_api_table[1]))
+
+/*
+ * In addition to the normal casting levels, NPY_CAST_IS_VIEW indicates
+ * that no cast operation is necessary at all (although a copy usually will be)
+ *
+ * NOTE: The most likely modification here is to add an additional
+ *       `view_offset` output to resolve_descriptors.  If set, it would
+ *       indicate both that it is a view and what offset to use.  This means that
+ *       e.g. `arr.imag` could be implemented by an ArrayMethod.
+ */
+#define NPY_CAST_IS_VIEW _NPY_CAST_IS_VIEW
+
+/*
+ * The resolve descriptors function, must be able to handle NULL values for
+ * all output (but not input) `given_descrs` and fill `loop_descrs`.
+ * Return -1 on error or 0 if the operation is not possible without an error
+ * set.  (This may still be in flux.)
+ * Otherwise must return the "casting safety", for normal functions, this is
+ * almost always "safe" (or even "equivalent"?).
+ *
+ * `resolve_descriptors` is optional if all output DTypes are non-parametric.
+ */
+#define NPY_METH_resolve_descriptors 1
+typedef NPY_CASTING (resolve_descriptors_function)(
+        /* "method" is currently opaque (necessary e.g. to wrap Python) */
+        PyObject *method,
+        /* DTypes the method was created for */
+        PyObject **dtypes,
+        /* Input descriptors (instances).  Outputs may be NULL. */
+        PyArray_Descr **given_descrs,
+        /* Exact loop descriptors to use, must not hold references on error */
+        PyArray_Descr **loop_descrs);
+
+/* NOT public yet: Signature needs adapting as external API. */
+#define _NPY_METH_get_loop 2
+
+/*
+ * Current public API to define fast inner-loops.  You must provide a
+ * strided loop.  If this is a cast between two "versions" of the same dtype
+ * you must also provide an unaligned strided loop.
+ * Other loops are useful to optimize the very common contiguous case.
+ *
+ * NOTE: As of now, NumPy will NOT use unaligned loops in ufuncs!
+ */
+#define NPY_METH_strided_loop 3
+#define NPY_METH_contiguous_loop 4
+#define NPY_METH_unaligned_strided_loop 5
+#define NPY_METH_unaligned_contiguous_loop 6
+
+
+typedef struct {
+    PyObject *caller;  /* E.g. the original ufunc, may be NULL */
+    PyObject *method;  /* The method "self". Currently an opaque object */
+
+    /* Operand descriptors, filled in by resolve_descriptors */
+    PyArray_Descr **descriptors;
+    /* Structure may grow (this is harmless for DType authors) */
+} PyArrayMethod_Context;
+
+typedef int (PyArrayMethod_StridedLoop)(PyArrayMethod_Context *context,
+        char *const *data, const npy_intp *dimensions, const npy_intp *strides,
+        NpyAuxData *transferdata);
+
+
+
+/*
+ * ****************************
+ *          DTYPE API
+ * ****************************
+ */
+
+#define NPY_DT_ABSTRACT 1 << 1
+#define NPY_DT_PARAMETRIC 1 << 2
+
+#define NPY_DT_discover_descr_from_pyobject 1
+#define _NPY_DT_is_known_scalar_type 2
+#define NPY_DT_default_descr 3
+#define NPY_DT_common_dtype 4
+#define NPY_DT_common_instance 5
+#define NPY_DT_setitem 6
+#define NPY_DT_getitem 7
+
+
+// TODO: These slots probably still need some thought, and/or a way to "grow"?
+typedef struct{
+    PyTypeObject *typeobj;    /* type of python scalar or NULL */
+    int flags;                /* flags, including parametric and abstract */
+    /* NULL terminated cast definitions. Use NULL for the newly created DType */
+    PyArrayMethod_Spec **casts;
+    PyType_Slot *slots;
+    /* Baseclass or NULL (will always subclass `np.dtype`) */
+    PyTypeObject *baseclass;
+} PyArrayDTypeMeta_Spec;
+
+
+#define PyArrayDTypeMeta_Type \
+    (*(PyTypeObject *)__experimental_dtype_api_table[2])
+typedef int __dtypemeta_fromspec(
+        PyArray_DTypeMeta *DType, PyArrayDTypeMeta_Spec *dtype_spec);
+/*
+ * Finalize creation of a DTypeMeta.  You must ensure that the DTypeMeta is
+ * a proper subclass.  The DTypeMeta object has additional fields compared to
+ * a normal PyTypeObject!
+ * The only (easy) creation of a new DType is to create a static Type which
+ * inherits `PyArray_DescrType`, sets its type to `PyArrayDTypeMeta_Type` and
+ * uses `PyArray_DTypeMeta` defined above as the C-structure.
+ */
+#define PyArrayInitDTypeMeta_FromSpec \
+    ((__dtypemeta_fromspec *)(__experimental_dtype_api_table[3]))
+
+
+/*
+ * *************************************
+ *          WORKING WITH DTYPES
+ * *************************************
+ */
+
+typedef PyArray_DTypeMeta *__common_dtype(
+        PyArray_DTypeMeta *DType1, PyArray_DTypeMeta *DType2);
+#define PyArray_CommonDType \
+    ((__common_dtype *)(__experimental_dtype_api_table[4]))
+
+
+typedef PyArray_DTypeMeta *__promote_dtype_sequence(
+        npy_intp num, PyArray_DTypeMeta *DTypes[]);
+#define PyArray_PromoteDTypeSequence \
+    ((__promote_dtype_sequence *)(__experimental_dtype_api_table[5]))
+
+
+/*
+ * ********************************
+ *         Initialization
+ * ********************************
+ *
+ * Import the experimental API, the version must match the one defined in
+ * the header to ensure changes are taken into account. NumPy will further
+ * runtime-check this.
+ * You must call this function to use the symbols defined in this file.
+ */
+#define __EXPERIMENTAL_DTYPE_VERSION 2
+
+static int
+import_experimental_dtype_api(int version)
+{
+    if (version != __EXPERIMENTAL_DTYPE_VERSION) {
+        PyErr_Format(PyExc_RuntimeError,
+                "DType API version %d did not match header version %d. Please "
+                "update the import statement and check for API changes.",
+                version, __EXPERIMENTAL_DTYPE_VERSION);
+        return -1;
+    }
+    if (__experimental_dtype_api_table != __uninitialized_table) {
+        /* already imported. */
+        return 0;
+    }
+
+    PyObject *multiarray = PyImport_ImportModule("numpy.core._multiarray_umath");
+    if (multiarray == NULL) {
+        return -1;
+    }
+
+    PyObject *api = PyObject_CallMethod(multiarray,
+        "_get_experimental_dtype_api", "i", version);
+    Py_DECREF(multiarray);
+    if (api == NULL) {
+        return -1;
+    }
+    __experimental_dtype_api_table = PyCapsule_GetPointer(api,
+            "experimental_dtype_api_table");
+    Py_DECREF(api);
+
+    if (__experimental_dtype_api_table == NULL) {
+        __experimental_dtype_api_table = __uninitialized_table;
+        return -1;
+    }
+    return 0;
+}
+
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_EXPERIMENTAL_DTYPE_API_H_ */
index ab0d221fb4317d63de98608396a12b9e68396016..950401664e101d17ce5461ecb21c7d3bdf824f42 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __NPY_HALFFLOAT_H__
-#define __NPY_HALFFLOAT_H__
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_HALFFLOAT_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_HALFFLOAT_H_
 
 #include <Python.h>
 #include <numpy/npy_math.h>
@@ -67,4 +67,4 @@ npy_uint64 npy_halfbits_to_doublebits(npy_uint16 h);
 }
 #endif
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_HALFFLOAT_H_ */
index 81057b7b43de92de4a185c113aa71eb2ff6a20be..f4eb8039b50c21c0977a38ee5f47c8f89307d482 100644 (file)
@@ -8,8 +8,8 @@
 // You may use libdivide under the terms of either of these.
 // See LICENSE.txt for more details.
 
-#ifndef LIBDIVIDE_H
-#define LIBDIVIDE_H
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_LIBDIVIDE_LIBDIVIDE_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_LIBDIVIDE_LIBDIVIDE_H_
 
 #define LIBDIVIDE_VERSION "3.0"
 #define LIBDIVIDE_VERSION_MAJOR 3
@@ -2072,8 +2072,8 @@ T& operator/=(T& n, const divider<T, ALGO>& div) {
 template <typename T>
 using branchfree_divider = divider<T, BRANCHFREE>;
 
-} // namespace libdivide
+}  // namespace libdivide
 
-#endif // __cplusplus
+#endif  // __cplusplus
 
-#endif // LIBDIVIDE_H
+#endif  // NUMPY_CORE_INCLUDE_NUMPY_LIBDIVIDE_LIBDIVIDE_H_
index 5ef1f10aa33a9219b561d7c334b7ccecb958b42e..2eb951486e82fc578efdb459f4614224a5e14dd1 100644 (file)
@@ -1,9 +1,9 @@
 /*
  * DON'T INCLUDE THIS DIRECTLY.
  */
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_NDARRAYOBJECT_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_NDARRAYOBJECT_H_
 
-#ifndef NPY_NDARRAYOBJECT_H
-#define NPY_NDARRAYOBJECT_H
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -265,4 +265,4 @@ PyArray_XDECREF_ERR(PyArrayObject *arr)
 #endif
 
 
-#endif /* NPY_NDARRAYOBJECT_H */
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_NDARRAYOBJECT_H_ */
index d1acfdf26235e990605bcf406b84220927b9b7fb..6240adc0c7f17ba310eb5961c91bf9ea236410b5 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef NDARRAYTYPES_H
-#define NDARRAYTYPES_H
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_NDARRAYTYPES_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_NDARRAYTYPES_H_
 
 #include "npy_common.h"
 #include "npy_endian.h"
@@ -355,12 +355,10 @@ struct NpyAuxData_tag {
 #define NPY_ERR(str) fprintf(stderr, #str); fflush(stderr);
 #define NPY_ERR2(str) fprintf(stderr, str); fflush(stderr);
 
-  /*
-   * Macros to define how array, and dimension/strides data is
-   * allocated.
-   */
-
-  /* Data buffer - PyDataMem_NEW/FREE/RENEW are in multiarraymodule.c */
+/*
+* Macros to define how array, and dimension/strides data is
+* allocated. These should be made private
+*/
 
 #define NPY_USE_PYMEM 1
 
@@ -666,6 +664,29 @@ typedef struct _arr_descr {
         PyObject *shape;       /* a tuple */
 } PyArray_ArrayDescr;
 
+/*
+ * Memory handler structure for array data.
+ */
+/* The declaration of free differs from PyMemAllocatorEx */
+typedef struct {
+    void *ctx;
+    void* (*malloc) (void *ctx, size_t size);
+    void* (*calloc) (void *ctx, size_t nelem, size_t elsize);
+    void* (*realloc) (void *ctx, void *ptr, size_t new_size);
+    void (*free) (void *ctx, void *ptr, size_t size);
+    /*
+     * This is the end of the version=1 struct. Only add new fields after
+     * this line
+     */
+} PyDataMemAllocator;
+
+typedef struct {
+    char name[127];  /* multiple of 64 to keep the struct aligned */
+    uint8_t version; /* currently 1 */
+    PyDataMemAllocator allocator;
+} PyDataMem_Handler;
+
+
 /*
  * The main array object structure.
  *
@@ -716,6 +737,10 @@ typedef struct tagPyArrayObject_fields {
     /* For weak references */
     PyObject *weakreflist;
     void *_buffer_info;  /* private buffer info, tagged to allow warning */
+    /*
+     * For malloc/calloc/realloc/free per object
+     */
+    PyObject *mem_handler;
 } PyArrayObject_fields;
 
 /*
@@ -843,7 +868,7 @@ typedef int (PyArray_FinalizeFunc)(PyArrayObject *, PyObject *);
 
 /*
  * Always copy the array. Returned arrays are always CONTIGUOUS,
- * ALIGNED, and WRITEABLE.
+ * ALIGNED, and WRITEABLE. See also: NPY_ARRAY_ENSURENOCOPY = 0x4000.
  *
  * This flag may be requested in constructor functions.
  */
@@ -912,6 +937,13 @@ typedef int (PyArray_FinalizeFunc)(PyArrayObject *, PyObject *);
 #define NPY_ARRAY_UPDATEIFCOPY    0x1000 /* Deprecated in 1.14 */
 #define NPY_ARRAY_WRITEBACKIFCOPY 0x2000
 
+/*
+ * No copy may be made while converting from an object/array (result is a view)
+ *
+ * This flag may be requested in constructor functions.
+ */
+#define NPY_ARRAY_ENSURENOCOPY 0x4000
+
 /*
  * NOTE: there are also internal flags defined in multiarray/arrayobject.h,
  * which start at bit 31 and work down.
@@ -1236,6 +1268,8 @@ struct PyArrayIterObject_tag {
                 _PyAIT(it)->dataptr = PyArray_BYTES(_PyAIT(it)->ao); \
                 for (__npy_i = 0; __npy_i<=_PyAIT(it)->nd_m1; \
                      __npy_i++) { \
+                        _PyAIT(it)->coordinates[__npy_i] = \
+                                (__npy_ind / _PyAIT(it)->factors[__npy_i]); \
                         _PyAIT(it)->dataptr += \
                                 (__npy_ind / _PyAIT(it)->factors[__npy_i]) \
                                 * _PyAIT(it)->strides[__npy_i]; \
@@ -1306,7 +1340,6 @@ typedef struct {
 #define PyArray_MultiIter_NOTDONE(multi)                \
         (_PyMIT(multi)->index < _PyMIT(multi)->size)
 
-
 /*
  * Store the information needed for fancy-indexing over an array. The
  * fields are slightly unordered to keep consec, dataptr and subspace
@@ -1463,9 +1496,11 @@ PyArrayNeighborhoodIter_Next2D(PyArrayNeighborhoodIterObject* iter);
  * Include inline implementations - functions defined there are not
  * considered public API
  */
-#define _NPY_INCLUDE_NEIGHBORHOOD_IMP
+#define NUMPY_CORE_INCLUDE_NUMPY__NEIGHBORHOOD_IMP_H_
 #include "_neighborhood_iterator_imp.h"
-#undef _NPY_INCLUDE_NEIGHBORHOOD_IMP
+#undef NUMPY_CORE_INCLUDE_NUMPY__NEIGHBORHOOD_IMP_H_
+
+
 
 /* The default array type */
 #define NPY_DEFAULT_TYPE NPY_DOUBLE
@@ -1656,6 +1691,12 @@ PyArray_CLEARFLAGS(PyArrayObject *arr, int flags)
     ((PyArrayObject_fields *)arr)->flags &= ~flags;
 }
 
+static NPY_INLINE NPY_RETURNS_BORROWED_REF PyObject *
+PyArray_HANDLER(PyArrayObject *arr)
+{
+    return ((PyArrayObject_fields *)arr)->mem_handler;
+}
+
 #define PyTypeNum_ISBOOL(type) ((type) == NPY_BOOL)
 
 #define PyTypeNum_ISUNSIGNED(type) (((type) == NPY_UBYTE) ||   \
@@ -1855,34 +1896,14 @@ typedef void (PyDataMem_EventHookFunc)(void *inp, void *outp, size_t size,
  */
 #if defined(NPY_INTERNAL_BUILD) && NPY_INTERNAL_BUILD
     /*
-     * The Structures defined in this block are considered private API and
-     * may change without warning!
+     * The Structures defined in this block are currently considered
+     * private API and may change without warning!
+     * Part of this (at least the size) is exepcted to be public API without
+     * further modifications.
      */
     /* TODO: Make this definition public in the API, as soon as its settled */
     NPY_NO_EXPORT extern PyTypeObject PyArrayDTypeMeta_Type;
 
-    typedef struct PyArray_DTypeMeta_tag PyArray_DTypeMeta;
-
-    typedef PyArray_Descr *(discover_descr_from_pyobject_function)(
-            PyArray_DTypeMeta *cls, PyObject *obj);
-
-    /*
-     * Before making this public, we should decide whether it should pass
-     * the type, or allow looking at the object. A possible use-case:
-     * `np.array(np.array([0]), dtype=np.ndarray)`
-     * Could consider arrays that are not `dtype=ndarray` "scalars".
-     */
-    typedef int (is_known_scalar_type_function)(
-            PyArray_DTypeMeta *cls, PyTypeObject *obj);
-
-    typedef PyArray_Descr *(default_descr_function)(PyArray_DTypeMeta *cls);
-    typedef PyArray_DTypeMeta *(common_dtype_function)(
-            PyArray_DTypeMeta *dtype1, PyArray_DTypeMeta *dtyep2);
-    typedef PyArray_DTypeMeta *(common_dtype_with_value_function)(
-        PyArray_DTypeMeta *dtype1, PyArray_DTypeMeta *dtyep2, PyObject *value);
-    typedef PyArray_Descr *(common_instance_function)(
-            PyArray_Descr *dtype1, PyArray_Descr *dtyep2);
-
     /*
      * While NumPy DTypes would not need to be heap types the plan is to
      * make DTypes available in Python at which point they will be heap types.
@@ -1893,7 +1914,7 @@ typedef void (PyDataMem_EventHookFunc)(void *inp, void *outp, size_t size,
      * it is a fairly complex construct which may be better to allow
      * refactoring of.
      */
-    struct PyArray_DTypeMeta_tag {
+    typedef struct {
         PyHeapTypeObject super;
 
         /*
@@ -1902,56 +1923,26 @@ typedef void (PyDataMem_EventHookFunc)(void *inp, void *outp, size_t size,
          * may be a pointer to the *prototype* instance?
          */
         PyArray_Descr *singleton;
-        /*
-         * Is this DType created using the old API? This exists mainly to
-         * allow for assertions in paths specific to wrapping legacy types.
-         */
-        npy_bool legacy;
-        /* The values stored by a parametric datatype depend on its instance */
-        npy_bool parametric;
-        /* whether the DType can be instantiated (i.e. np.dtype cannot) */
-        npy_bool abstract;
+        /* Copy of the legacy DTypes type number, usually invalid. */
+        int type_num;
 
-        /*
-         * The following fields replicate the most important dtype information.
-         * In the legacy implementation most of these are stored in the
-         * PyArray_Descr struct.
-         */
         /* The type object of the scalar instances (may be NULL?) */
         PyTypeObject *scalar_type;
-        /* kind for this type */
-        char kind;
-        /* unique-character representing this type */
-        char type;
-        /* flags describing data type */
-        char flags;
-        /* number representing this type */
-        int type_num;
         /*
-         * Point to the original ArrFuncs.
-         * NOTE: We could make a copy to detect changes to `f`.
+         * DType flags to signal legacy, parametric, or
+         * abstract.  But plenty of space for additional information/flags.
          */
-        PyArray_ArrFuncs *f;
+        npy_uint64 flags;
 
-        /* DType methods, these could be moved into its own struct */
-        discover_descr_from_pyobject_function *discover_descr_from_pyobject;
-        is_known_scalar_type_function *is_known_scalar_type;
-        default_descr_function *default_descr;
-        common_dtype_function *common_dtype;
-        common_dtype_with_value_function *common_dtype_with_value;
-        common_instance_function *common_instance;
-        /*
-         * The casting implementation (ArrayMethod) to convert between two
-         * instances of this DType, stored explicitly for fast access:
-         */
-        PyObject *within_dtype_castingimpl;
         /*
-         * Dictionary of ArrayMethods representing most possible casts
-         * (structured and object are exceptions).
-         * This should potentially become a weak mapping in the future.
+         * Use indirection in order to allow a fixed size for this struct.
+         * A stable ABI size makes creating a static DType less painful
+         * while also ensuring flexibility for all opaque API (with one
+         * indirection due the pointer lookup).
          */
-        PyObject *castingimpls;
-    };
+        void *dt_slots;
+        void *reserved[3];
+    } PyArray_DTypeMeta;
 
 #endif  /* NPY_INTERNAL_BUILD */
 
@@ -1982,4 +1973,4 @@ typedef void (PyDataMem_EventHookFunc)(void *inp, void *outp, size_t size,
  */
 #undef NPY_DEPRECATED_INCLUDES
 
-#endif /* NPY_ARRAYTYPES_H */
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_NDARRAYTYPES_H_ */
index 041f301928ecaf134f5371375f28d7adf1529c87..2c0ce1420e2c895819659c02036d08032c469aa5 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef NPY_NOPREFIX_H
-#define NPY_NOPREFIX_H
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_NOPREFIX_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_NOPREFIX_H_
 
 /*
  * You can directly include noprefix.h as a backward
 #define MAX_ELSIZE NPY_MAX_ELSIZE
 #endif
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_NOPREFIX_H_ */
index a4f90e0199ea554686a5226df6e65bb211bb9a34..4fd4015a991a8bfe1c853561087d56435e86cabc 100644 (file)
@@ -1,10 +1,10 @@
-#ifndef _NPY_1_7_DEPRECATED_API_H
-#define _NPY_1_7_DEPRECATED_API_H
-
 #ifndef NPY_DEPRECATED_INCLUDES
 #error "Should never include npy_*_*_deprecated_api directly."
 #endif
 
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_NPY_1_7_DEPRECATED_API_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_NPY_1_7_DEPRECATED_API_H_
+
 /* Emit a warning if the user did not specifically request the old API */
 #ifndef NPY_NO_DEPRECATED_API
 #if defined(_WIN32)
  */
 #include "old_defines.h"
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_NPY_1_7_DEPRECATED_API_H_ */
index 551ec6be8c2d0a17989fff586c6e4e62011d4018..22c103e93da95844b795bcadf8b7cc071f78bebe 100644 (file)
@@ -7,8 +7,8 @@
  * strong backwards compatibility guarantees at the moment.
  */
 
-#ifndef _NPY_3KCOMPAT_H_
-#define _NPY_3KCOMPAT_H_
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_NPY_3KCOMPAT_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_NPY_3KCOMPAT_H_
 
 #include <Python.h>
 #include <stdio.h>
@@ -592,4 +592,4 @@ NpyCapsule_Check(PyObject *ptr)
 #endif
 
 
-#endif /* _NPY_3KCOMPAT_H_ */
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_NPY_3KCOMPAT_H_ */
index 23b70edd72b07f479d582ba476623f2d001e2d01..88794ca07e369d3940a0d4c6b5bc510b9336d18a 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_COMMON_H_
-#define _NPY_COMMON_H_
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_NPY_COMMON_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_NPY_COMMON_H_
 
 /* need Python.h for npy_intp, npy_uintp */
 #include <Python.h>
@@ -1124,4 +1124,4 @@ typedef npy_int64 npy_datetime;
 
 /* End of typedefs for numarray style bit-width names */
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_NPY_COMMON_H_ */
index bc1fad72f7681ddc5a6d65ee724bed25f05c6053..78d229e7dfc594ee4ba74ade06aa989a10d6773b 100644 (file)
  *              NPY_CPU_ARCEL
  *              NPY_CPU_ARCEB
  *              NPY_CPU_RISCV64
+ *              NPY_CPU_LOONGARCH
  *              NPY_CPU_WASM
  */
-#ifndef _NPY_CPUARCH_H_
-#define _NPY_CPUARCH_H_
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_NPY_CPU_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_NPY_CPU_H_
 
 #include "numpyconfig.h"
 
     #define NPY_CPU_ARCEB
 #elif defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 64
     #define NPY_CPU_RISCV64
+#elif defined(__loongarch__)
+    #define NPY_CPU_LOONGARCH
 #elif defined(__EMSCRIPTEN__)
     /* __EMSCRIPTEN__ is defined by emscripten: an LLVM-to-Web compiler */
     #define NPY_CPU_WASM
     information about your platform (OS, CPU and compiler)
 #endif
 
-/* 
+/*
  * Except for the following architectures, memory access is limited to the natural
  * alignment of data types otherwise it may lead to bus error or performance regression.
  * For more details about unaligned access, see https://www.kernel.org/doc/Documentation/unaligned-memory-access.txt.
     #define NPY_ALIGNMENT_REQUIRED 1
 #endif
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_NPY_CPU_H_ */
index aa367a002f0c5e014223c5053f29ad7cd9df8cb1..5e58a7f52cee2c21e8f3a4bbc535e7c0982f7de0 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ENDIAN_H_
-#define _NPY_ENDIAN_H_
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_NPY_ENDIAN_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_NPY_ENDIAN_H_
 
 /*
  * NPY_BYTE_ORDER is set to the same value as BYTE_ORDER set by glibc in
             || defined(NPY_CPU_PPC64LE)       \
             || defined(NPY_CPU_ARCEL)         \
             || defined(NPY_CPU_RISCV64)       \
+            || defined(NPY_CPU_LOONGARCH)     \
             || defined(NPY_CPU_WASM)
         #define NPY_BYTE_ORDER NPY_LITTLE_ENDIAN
+
     #elif defined(NPY_CPU_PPC)                \
             || defined(NPY_CPU_SPARC)         \
             || defined(NPY_CPU_S390)          \
             || defined(NPY_CPU_M68K)          \
             || defined(NPY_CPU_ARCEB)
         #define NPY_BYTE_ORDER NPY_BIG_ENDIAN
+
     #else
         #error Unknown CPU: can not set endianness
     #endif
-#endif
 
 #endif
+
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_NPY_ENDIAN_H_ */
index bcb539326e88028096032270e77843700d9c314e..69a0374dd8e997e5096d89db42977be2557175a1 100644 (file)
@@ -14,8 +14,8 @@
  * https://github.com/python/cpython/pull/20599).
  */
 
-#ifndef NPY_INTERRUPT_H
-#define NPY_INTERRUPT_H
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_NPY_INTERRUPT_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_NPY_INTERRUPT_H_
 
 #ifndef NPY_NO_SIGNAL
 
         PyOS_setsig(SIGINT, _npy_sig_save);                       \
         }
 
-#else /* NPY_NO_SIGNAL  */
+#else  /* NPY_NO_SIGNAL  */
 
 #define NPY_SIGINT_ON
 #define NPY_SIGINT_OFF
 
-#endif /* HAVE_SIGSETJMP */
+#endif  /* HAVE_SIGSETJMP */
 
-#endif /* NPY_INTERRUPT_H */
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_NPY_INTERRUPT_H_ */
index f32e298f081fbb3f4295ac6dd903abd492ed35dc..bead0dc140646f23da966d1f90b383f9d585473b 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __NPY_MATH_C99_H_
-#define __NPY_MATH_C99_H_
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_NPY_MATH_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_NPY_MATH_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -150,6 +150,17 @@ NPY_INPLACE npy_long npy_lshiftl(npy_long a, npy_long b);
 NPY_INPLACE npy_longlong npy_rshiftll(npy_longlong a, npy_longlong b);
 NPY_INPLACE npy_longlong npy_lshiftll(npy_longlong a, npy_longlong b);
 
+NPY_INPLACE uint8_t npy_popcountuhh(npy_ubyte a);
+NPY_INPLACE uint8_t npy_popcountuh(npy_ushort a);
+NPY_INPLACE uint8_t npy_popcountu(npy_uint a);
+NPY_INPLACE uint8_t npy_popcountul(npy_ulong a);
+NPY_INPLACE uint8_t npy_popcountull(npy_ulonglong a);
+NPY_INPLACE uint8_t npy_popcounthh(npy_byte a);
+NPY_INPLACE uint8_t npy_popcounth(npy_short a);
+NPY_INPLACE uint8_t npy_popcount(npy_int a);
+NPY_INPLACE uint8_t npy_popcountl(npy_long a);
+NPY_INPLACE uint8_t npy_popcountll(npy_longlong a);
+
 /*
  * C99 double math funcs
  */
@@ -391,7 +402,7 @@ NPY_INPLACE npy_longdouble npy_heavisidel(npy_longdouble x, npy_longdouble h0);
     union {                                  \
         ctype z;                             \
         type a[2];                           \
-    } z1;;                                   \
+    } z1;                                    \
                                              \
     z1.a[0] = (x);                           \
     z1.a[1] = (y);                           \
@@ -585,4 +596,4 @@ void npy_set_floatstatus_invalid(void);
 #include "npy_math_internal.h"
 #endif
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_NPY_MATH_H_ */
index 6183dc2784a78cced397e5bec4d3505122b9de53..39658c0bd2d61aacd25f75439e81ea16c3e33db8 100644 (file)
@@ -9,11 +9,12 @@
 #ifndef NPY_NO_DEPRECATED_API
 
 /* put this check here since there may be multiple includes in C extensions. */
-#if defined(NDARRAYTYPES_H) || defined(_NPY_DEPRECATED_API_H) || \
-    defined(OLD_DEFINES_H)
+#if defined(NUMPY_CORE_INCLUDE_NUMPY_NDARRAYTYPES_H_) || \
+    defined(NUMPY_CORE_INCLUDE_NUMPY_NPY_DEPRECATED_API_H) || \
+    defined(NUMPY_CORE_INCLUDE_NUMPY_OLD_DEFINES_H_)
 #error "npy_no_deprecated_api.h" must be first among numpy includes.
 #else
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #endif
 
-#endif
+#endif  /* NPY_NO_DEPRECATED_API */
index 9228c3916eab57b3275c7786ab0572619044596c..efa0e4012f91b85dbfdc7818a9a2818fc8747962 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_OS_H_
-#define _NPY_OS_H_
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_NPY_OS_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_NPY_OS_H_
 
 #if defined(linux) || defined(__linux) || defined(__linux__)
     #define NPY_OS_LINUX
@@ -27,4 +27,4 @@
     #define NPY_OS_UNKNOWN
 #endif
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_NPY_OS_H_ */
index 3909aa9c8776aae78c591ab5dc7f3da39332bcb7..e4c17f7e19a5c25e4987319c145d3f1fd4f63500 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_NUMPYCONFIG_H_
-#define _NPY_NUMPYCONFIG_H_
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_NPY_NUMPYCONFIG_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_NPY_NUMPYCONFIG_H_
 
 #include "_numpyconfig.h"
 
     #undef NPY_SIZEOF_LONGDOUBLE
     #undef NPY_SIZEOF_COMPLEX_LONGDOUBLE
 
-    #ifdef __x86_64
-        #define NPY_SIZEOF_LONGDOUBLE         16
-        #define NPY_SIZEOF_COMPLEX_LONGDOUBLE 32
-    #elif defined(__arm64__)
+    #if defined(__arm64__)
         #define NPY_SIZEOF_LONGDOUBLE         8
         #define NPY_SIZEOF_COMPLEX_LONGDOUBLE 16
+    #elif defined(__x86_64)
+        #define NPY_SIZEOF_LONGDOUBLE         16
+        #define NPY_SIZEOF_COMPLEX_LONGDOUBLE 32
+    #elif defined (__i386)
+        #define NPY_SIZEOF_LONGDOUBLE         12
+        #define NPY_SIZEOF_COMPLEX_LONGDOUBLE 24
+    #elif defined(__ppc__) || defined (__ppc64__)
+        #define NPY_SIZEOF_LONGDOUBLE         16
+        #define NPY_SIZEOF_COMPLEX_LONGDOUBLE 32
     #else
         #error "unknown architecture"
     #endif
@@ -56,5 +62,6 @@
 #define NPY_1_19_API_VERSION 0x00000008
 #define NPY_1_20_API_VERSION 0x0000000e
 #define NPY_1_21_API_VERSION 0x0000000e
+#define NPY_1_22_API_VERSION 0x0000000f
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_NPY_NUMPYCONFIG_H_ */
index abf81595ae1602b9a6ade9cd97388f815bbf6518..b3fa677512c4680500b9eedf4e2ea0d29ad39928 100644 (file)
@@ -1,6 +1,6 @@
 /* This header is deprecated as of NumPy 1.7 */
-#ifndef OLD_DEFINES_H
-#define OLD_DEFINES_H
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_OLD_DEFINES_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_OLD_DEFINES_H_
 
 #if defined(NPY_NO_DEPRECATED_API) && NPY_NO_DEPRECATED_API >= NPY_1_7_API_VERSION
 #error The header "old_defines.h" is deprecated as of NumPy 1.7.
 
 #define PyArray_UCS4 npy_ucs4
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_OLD_DEFINES_H_ */
index 38530faf045a9cfc54750be6b12ec725c77cf231..6604e8d17847c894af4fbb6de27d83cc8715db2e 100644 (file)
@@ -1,3 +1,8 @@
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_OLDNUMERIC_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_OLDNUMERIC_H_
+
+/* FIXME -- this file can be deleted? */
+
 #include "arrayobject.h"
 
 #ifndef PYPY_VERSION
@@ -23,3 +28,5 @@
 
 #undef import_array
 #define import_array() { if (_import_array() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import"); } }
+
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_OLDNUMERIC_H_ */
index 83c2858ddf1dd5de3bdb988c752ec2bf8427281c..162dd5c5753079eb1d76efa7fc8a3847c2ad6602 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _RANDOM_BITGEN_H
-#define _RANDOM_BITGEN_H
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_RANDOM_BITGEN_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_RANDOM_BITGEN_H_
 
 #pragma once
 #include <stddef.h>
@@ -17,4 +17,4 @@ typedef struct bitgen {
 } bitgen_t;
 
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_RANDOM_BITGEN_H_ */
index c58024605ff514393155727458076eb6f8990f27..dacf7782909f87e0cf877d06d9c5842148caaf97 100644 (file)
@@ -1,11 +1,11 @@
-#ifndef _RANDOMDGEN__DISTRIBUTIONS_H_
-#define _RANDOMDGEN__DISTRIBUTIONS_H_
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_RANDOM_DISTRIBUTIONS_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_RANDOM_DISTRIBUTIONS_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#include "Python.h"
+#include <Python.h>
 #include "numpy/npy_common.h"
 #include <stddef.h>
 #include <stdbool.h>
@@ -28,7 +28,7 @@ extern "C" {
 #define RAND_INT_MAX INT64_MAX
 #endif
 
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__CYGWIN__)
 #define DECLDIR __declspec(dllexport)
 #else
 #define DECLDIR extern
@@ -206,4 +206,4 @@ static NPY_INLINE double next_double(bitgen_t *bitgen_state) {
 }
 #endif
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_RANDOM_DISTRIBUTIONS_H_ */
index 333a326ee60e7c61ed10a2839c2c48a62bf3607e..1d7050bbe5a374c2b18112515fe88305415127a8 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef Py_UFUNCOBJECT_H
-#define Py_UFUNCOBJECT_H
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_UFUNCOBJECT_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_UFUNCOBJECT_H_
 
 #include <numpy/npy_math.h>
 #include <numpy/npy_common.h>
@@ -66,27 +66,14 @@ typedef int (PyUFunc_TypeResolutionFunc)(
                                 PyArray_Descr **out_dtypes);
 
 /*
- * Given an array of DTypes as returned by the PyUFunc_TypeResolutionFunc,
- * and an array of fixed strides (the array will contain NPY_MAX_INTP for
- * strides which are not necessarily fixed), returns an inner loop
- * with associated auxiliary data.
- *
- * For backwards compatibility, there is a variant of the inner loop
- * selection which returns an inner loop irrespective of the strides,
- * and with a void* static auxiliary data instead of an NpyAuxData *
- * dynamically allocatable auxiliary data.
+ * Legacy loop selector. (This should NOT normally be used and we can expect
+ * that only the `PyUFunc_DefaultLegacyInnerLoopSelector` is ever set).
+ * However, unlike the masked version, it probably still works.
  *
  * ufunc:             The ufunc object.
  * dtypes:            An array which has been populated with dtypes,
  *                    in most cases by the type resolution function
  *                    for the same ufunc.
- * fixed_strides:     For each input/output, either the stride that
- *                    will be used every time the function is called
- *                    or NPY_MAX_INTP if the stride might change or
- *                    is not known ahead of time. The loop selection
- *                    function may use this stride to pick inner loops
- *                    which are optimized for contiguous or 0-stride
- *                    cases.
  * out_innerloop:     Should be populated with the correct ufunc inner
  *                    loop for the given type.
  * out_innerloopdata: Should be populated with the void* data to
@@ -101,15 +88,7 @@ typedef int (PyUFunc_LegacyInnerLoopSelectionFunc)(
                             PyUFuncGenericFunction *out_innerloop,
                             void **out_innerloopdata,
                             int *out_needs_api);
-typedef int (PyUFunc_MaskedInnerLoopSelectionFunc)(
-                            struct _tagPyUFuncObject *ufunc,
-                            PyArray_Descr **dtypes,
-                            PyArray_Descr *mask_dtype,
-                            npy_intp *fixed_strides,
-                            npy_intp fixed_mask_stride,
-                            PyUFunc_MaskedStridedInnerLoopFunc **out_innerloop,
-                            NpyAuxData **out_innerloopdata,
-                            int *out_needs_api);
+
 
 typedef struct _tagPyUFuncObject {
         PyObject_HEAD
@@ -194,15 +173,10 @@ typedef struct _tagPyUFuncObject {
          * but this was never implemented. (This is also why the above
          * selector is called the "legacy" selector.)
          */
-    #if PY_VERSION_HEX >= 0x03080000
         vectorcallfunc vectorcall;
-    #else
-        void *reserved2;
-    #endif
-        /*
-         * A function which returns a masked inner loop for the ufunc.
-         */
-        PyUFunc_MaskedInnerLoopSelectionFunc *masked_inner_loop_selector;
+
+        /* Was previously the `PyUFunc_MaskedInnerLoopSelectionFunc` */
+        void *_always_null_previously_masked_innerloop_selector;
 
         /*
          * List of flags for each operand when ufunc is called by nditer object.
@@ -234,6 +208,12 @@ typedef struct _tagPyUFuncObject {
         /* Identity for reduction, when identity == PyUFunc_IdentityValue */
         PyObject *identity_value;
 
+        /* New in NPY_API_VERSION 0x0000000F and above */
+
+        /* New private fields related to dispatching */
+        void *_dispatch_cache;
+        /* A PyListObject of `(tuple of DTypes, ArrayMethod/Promoter)` */
+        PyObject *_loops;
 } PyUFuncObject;
 
 #include "arrayobject.h"
@@ -366,8 +346,8 @@ typedef struct _loop1d_info {
 #endif
 #endif
 
-
 #ifdef __cplusplus
 }
 #endif
-#endif /* !Py_UFUNCOBJECT_H */
+
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_UFUNCOBJECT_H_ */
index e251a5201c715aef4176213a8dfbee9b1c958201..e2b57f9e508d47171c8361f44b53c5a50a5377d2 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __NUMPY_UTILS_HEADER__
-#define __NUMPY_UTILS_HEADER__
+#ifndef NUMPY_CORE_INCLUDE_NUMPY_UTILS_H_
+#define NUMPY_CORE_INCLUDE_NUMPY_UTILS_H_
 
 #ifndef __COMP_NPY_UNUSED
     #if defined(__GNUC__)
@@ -34,4 +34,4 @@
 #define NPY_CAT_(a, b) NPY_CAT__(a, b)
 #define NPY_CAT(a, b) NPY_CAT_(a, b)
 
-#endif
+#endif  /* NUMPY_CORE_INCLUDE_NUMPY_UTILS_H_ */
diff --git a/numpy/core/machar.py b/numpy/core/machar.py
deleted file mode 100644 (file)
index 55285fe..0000000
+++ /dev/null
@@ -1,342 +0,0 @@
-"""
-Machine arithmetics - determine the parameters of the
-floating-point arithmetic system
-
-Author: Pearu Peterson, September 2003
-
-"""
-__all__ = ['MachAr']
-
-from numpy.core.fromnumeric import any
-from numpy.core._ufunc_config import errstate
-from numpy.core.overrides import set_module
-
-# Need to speed this up...especially for longfloat
-
-@set_module('numpy')
-class MachAr:
-    """
-    Diagnosing machine parameters.
-
-    Attributes
-    ----------
-    ibeta : int
-        Radix in which numbers are represented.
-    it : int
-        Number of base-`ibeta` digits in the floating point mantissa M.
-    machep : int
-        Exponent of the smallest (most negative) power of `ibeta` that,
-        added to 1.0, gives something different from 1.0
-    eps : float
-        Floating-point number ``beta**machep`` (floating point precision)
-    negep : int
-        Exponent of the smallest power of `ibeta` that, subtracted
-        from 1.0, gives something different from 1.0.
-    epsneg : float
-        Floating-point number ``beta**negep``.
-    iexp : int
-        Number of bits in the exponent (including its sign and bias).
-    minexp : int
-        Smallest (most negative) power of `ibeta` consistent with there
-        being no leading zeros in the mantissa.
-    xmin : float
-        Floating-point number ``beta**minexp`` (the smallest [in
-        magnitude] positive floating point number with full precision).
-    maxexp : int
-        Smallest (positive) power of `ibeta` that causes overflow.
-    xmax : float
-        ``(1-epsneg) * beta**maxexp`` (the largest [in magnitude]
-        usable floating value).
-    irnd : int
-        In ``range(6)``, information on what kind of rounding is done
-        in addition, and on how underflow is handled.
-    ngrd : int
-        Number of 'guard digits' used when truncating the product
-        of two mantissas to fit the representation.
-    epsilon : float
-        Same as `eps`.
-    tiny : float
-        Same as `xmin`.
-    huge : float
-        Same as `xmax`.
-    precision : float
-        ``- int(-log10(eps))``
-    resolution : float
-        ``- 10**(-precision)``
-
-    Parameters
-    ----------
-    float_conv : function, optional
-        Function that converts an integer or integer array to a float
-        or float array. Default is `float`.
-    int_conv : function, optional
-        Function that converts a float or float array to an integer or
-        integer array. Default is `int`.
-    float_to_float : function, optional
-        Function that converts a float array to float. Default is `float`.
-        Note that this does not seem to do anything useful in the current
-        implementation.
-    float_to_str : function, optional
-        Function that converts a single float to a string. Default is
-        ``lambda v:'%24.16e' %v``.
-    title : str, optional
-        Title that is printed in the string representation of `MachAr`.
-
-    See Also
-    --------
-    finfo : Machine limits for floating point types.
-    iinfo : Machine limits for integer types.
-
-    References
-    ----------
-    .. [1] Press, Teukolsky, Vetterling and Flannery,
-           "Numerical Recipes in C++," 2nd ed,
-           Cambridge University Press, 2002, p. 31.
-
-    """
-
-    def __init__(self, float_conv=float,int_conv=int,
-                 float_to_float=float,
-                 float_to_str=lambda v:'%24.16e' % v,
-                 title='Python floating point number'):
-        """
-
-        float_conv - convert integer to float (array)
-        int_conv   - convert float (array) to integer
-        float_to_float - convert float array to float
-        float_to_str - convert array float to str
-        title        - description of used floating point numbers
-
-        """
-        # We ignore all errors here because we are purposely triggering
-        # underflow to detect the properties of the runninng arch.
-        with errstate(under='ignore'):
-            self._do_init(float_conv, int_conv, float_to_float, float_to_str, title)
-
-    def _do_init(self, float_conv, int_conv, float_to_float, float_to_str, title):
-        max_iterN = 10000
-        msg = "Did not converge after %d tries with %s"
-        one = float_conv(1)
-        two = one + one
-        zero = one - one
-
-        # Do we really need to do this?  Aren't they 2 and 2.0?
-        # Determine ibeta and beta
-        a = one
-        for _ in range(max_iterN):
-            a = a + a
-            temp = a + one
-            temp1 = temp - a
-            if any(temp1 - one != zero):
-                break
-        else:
-            raise RuntimeError(msg % (_, one.dtype))
-        b = one
-        for _ in range(max_iterN):
-            b = b + b
-            temp = a + b
-            itemp = int_conv(temp-a)
-            if any(itemp != 0):
-                break
-        else:
-            raise RuntimeError(msg % (_, one.dtype))
-        ibeta = itemp
-        beta = float_conv(ibeta)
-
-        # Determine it and irnd
-        it = -1
-        b = one
-        for _ in range(max_iterN):
-            it = it + 1
-            b = b * beta
-            temp = b + one
-            temp1 = temp - b
-            if any(temp1 - one != zero):
-                break
-        else:
-            raise RuntimeError(msg % (_, one.dtype))
-
-        betah = beta / two
-        a = one
-        for _ in range(max_iterN):
-            a = a + a
-            temp = a + one
-            temp1 = temp - a
-            if any(temp1 - one != zero):
-                break
-        else:
-            raise RuntimeError(msg % (_, one.dtype))
-        temp = a + betah
-        irnd = 0
-        if any(temp-a != zero):
-            irnd = 1
-        tempa = a + beta
-        temp = tempa + betah
-        if irnd == 0 and any(temp-tempa != zero):
-            irnd = 2
-
-        # Determine negep and epsneg
-        negep = it + 3
-        betain = one / beta
-        a = one
-        for i in range(negep):
-            a = a * betain
-        b = a
-        for _ in range(max_iterN):
-            temp = one - a
-            if any(temp-one != zero):
-                break
-            a = a * beta
-            negep = negep - 1
-            # Prevent infinite loop on PPC with gcc 4.0:
-            if negep < 0:
-                raise RuntimeError("could not determine machine tolerance "
-                                   "for 'negep', locals() -> %s" % (locals()))
-        else:
-            raise RuntimeError(msg % (_, one.dtype))
-        negep = -negep
-        epsneg = a
-
-        # Determine machep and eps
-        machep = - it - 3
-        a = b
-
-        for _ in range(max_iterN):
-            temp = one + a
-            if any(temp-one != zero):
-                break
-            a = a * beta
-            machep = machep + 1
-        else:
-            raise RuntimeError(msg % (_, one.dtype))
-        eps = a
-
-        # Determine ngrd
-        ngrd = 0
-        temp = one + eps
-        if irnd == 0 and any(temp*one - one != zero):
-            ngrd = 1
-
-        # Determine iexp
-        i = 0
-        k = 1
-        z = betain
-        t = one + eps
-        nxres = 0
-        for _ in range(max_iterN):
-            y = z
-            z = y*y
-            a = z*one  # Check here for underflow
-            temp = z*t
-            if any(a+a == zero) or any(abs(z) >= y):
-                break
-            temp1 = temp * betain
-            if any(temp1*beta == z):
-                break
-            i = i + 1
-            k = k + k
-        else:
-            raise RuntimeError(msg % (_, one.dtype))
-        if ibeta != 10:
-            iexp = i + 1
-            mx = k + k
-        else:
-            iexp = 2
-            iz = ibeta
-            while k >= iz:
-                iz = iz * ibeta
-                iexp = iexp + 1
-            mx = iz + iz - 1
-
-        # Determine minexp and xmin
-        for _ in range(max_iterN):
-            xmin = y
-            y = y * betain
-            a = y * one
-            temp = y * t
-            if any((a + a) != zero) and any(abs(y) < xmin):
-                k = k + 1
-                temp1 = temp * betain
-                if any(temp1*beta == y) and any(temp != y):
-                    nxres = 3
-                    xmin = y
-                    break
-            else:
-                break
-        else:
-            raise RuntimeError(msg % (_, one.dtype))
-        minexp = -k
-
-        # Determine maxexp, xmax
-        if mx <= k + k - 3 and ibeta != 10:
-            mx = mx + mx
-            iexp = iexp + 1
-        maxexp = mx + minexp
-        irnd = irnd + nxres
-        if irnd >= 2:
-            maxexp = maxexp - 2
-        i = maxexp + minexp
-        if ibeta == 2 and not i:
-            maxexp = maxexp - 1
-        if i > 20:
-            maxexp = maxexp - 1
-        if any(a != y):
-            maxexp = maxexp - 2
-        xmax = one - epsneg
-        if any(xmax*one != xmax):
-            xmax = one - beta*epsneg
-        xmax = xmax / (xmin*beta*beta*beta)
-        i = maxexp + minexp + 3
-        for j in range(i):
-            if ibeta == 2:
-                xmax = xmax + xmax
-            else:
-                xmax = xmax * beta
-
-        self.ibeta = ibeta
-        self.it = it
-        self.negep = negep
-        self.epsneg = float_to_float(epsneg)
-        self._str_epsneg = float_to_str(epsneg)
-        self.machep = machep
-        self.eps = float_to_float(eps)
-        self._str_eps = float_to_str(eps)
-        self.ngrd = ngrd
-        self.iexp = iexp
-        self.minexp = minexp
-        self.xmin = float_to_float(xmin)
-        self._str_xmin = float_to_str(xmin)
-        self.maxexp = maxexp
-        self.xmax = float_to_float(xmax)
-        self._str_xmax = float_to_str(xmax)
-        self.irnd = irnd
-
-        self.title = title
-        # Commonly used parameters
-        self.epsilon = self.eps
-        self.tiny = self.xmin
-        self.huge = self.xmax
-
-        import math
-        self.precision = int(-math.log10(float_to_float(self.eps)))
-        ten = two + two + two + two + two
-        resolution = ten ** (-self.precision)
-        self.resolution = float_to_float(resolution)
-        self._str_resolution = float_to_str(resolution)
-
-    def __str__(self):
-        fmt = (
-           'Machine parameters for %(title)s\n'
-           '---------------------------------------------------------------------\n'
-           'ibeta=%(ibeta)s it=%(it)s iexp=%(iexp)s ngrd=%(ngrd)s irnd=%(irnd)s\n'
-           'machep=%(machep)s     eps=%(_str_eps)s (beta**machep == epsilon)\n'
-           'negep =%(negep)s  epsneg=%(_str_epsneg)s (beta**epsneg)\n'
-           'minexp=%(minexp)s   xmin=%(_str_xmin)s (beta**minexp == tiny)\n'
-           'maxexp=%(maxexp)s    xmax=%(_str_xmax)s ((1-epsneg)*beta**maxexp == huge)\n'
-           '---------------------------------------------------------------------\n'
-           )
-        return fmt % self.__dict__
-
-
-if __name__ == '__main__':
-    print(MachAr())
diff --git a/numpy/core/memmap.pyi b/numpy/core/memmap.pyi
new file mode 100644 (file)
index 0000000..ba595bf
--- /dev/null
@@ -0,0 +1,5 @@
+from typing import List
+
+from numpy import memmap as memmap
+
+__all__: List[str]
index b7a3a8d675346541abcec2658a1a77f48bd6c36d..f88d75978697516973fb2d91392f5a92295833b6 100644 (file)
@@ -7,8 +7,6 @@ by importing from the extension module.
 """
 
 import functools
-import warnings
-
 from . import overrides
 from . import _multiarray_umath
 from ._multiarray_umath import *  # noqa: F403
@@ -16,8 +14,9 @@ from ._multiarray_umath import *  # noqa: F403
 # do not change them. issue gh-15518
 # _get_ndarray_c_version is semi-public, on purpose not added to __all__
 from ._multiarray_umath import (
-    _fastCopyAndTranspose, _flagdict, _insert, _reconstruct, _vec_string,
-    _ARRAY_API, _monotonicity, _get_ndarray_c_version, _set_madvise_hugepage,
+    _fastCopyAndTranspose, _flagdict, _from_dlpack, _insert, _reconstruct,
+    _vec_string, _ARRAY_API, _monotonicity, _get_ndarray_c_version,
+    _set_madvise_hugepage,
     )
 
 __all__ = [
@@ -25,29 +24,30 @@ __all__ = [
     'ITEM_HASOBJECT', 'ITEM_IS_POINTER', 'LIST_PICKLE', 'MAXDIMS',
     'MAY_SHARE_BOUNDS', 'MAY_SHARE_EXACT', 'NEEDS_INIT', 'NEEDS_PYAPI',
     'RAISE', 'USE_GETITEM', 'USE_SETITEM', 'WRAP', '_fastCopyAndTranspose',
-    '_flagdict', '_insert', '_reconstruct', '_vec_string', '_monotonicity',
-    'add_docstring', 'arange', 'array', 'asarray', 'asanyarray',
-    'ascontiguousarray', 'asfortranarray', 'bincount', 'broadcast',
-    'busday_count', 'busday_offset', 'busdaycalendar', 'can_cast',
+    '_flagdict', '_from_dlpack', '_insert', '_reconstruct', '_vec_string',
+    '_monotonicity', 'add_docstring', 'arange', 'array', 'asarray',
+    'asanyarray', 'ascontiguousarray', 'asfortranarray', 'bincount',
+    'broadcast', 'busday_count', 'busday_offset', 'busdaycalendar', 'can_cast',
     'compare_chararrays', 'concatenate', 'copyto', 'correlate', 'correlate2',
     'count_nonzero', 'c_einsum', 'datetime_as_string', 'datetime_data',
-    'digitize', 'dot', 'dragon4_positional', 'dragon4_scientific', 'dtype',
+    'dot', 'dragon4_positional', 'dragon4_scientific', 'dtype',
     'empty', 'empty_like', 'error', 'flagsobj', 'flatiter', 'format_longfloat',
-    'frombuffer', 'fromfile', 'fromiter', 'fromstring', 'inner',
-    'interp', 'interp_complex', 'is_busday', 'lexsort',
-    'matmul', 'may_share_memory', 'min_scalar_type', 'ndarray', 'nditer',
-    'nested_iters', 'normalize_axis_index', 'packbits',
-    'promote_types', 'putmask', 'ravel_multi_index', 'result_type', 'scalar',
-    'set_datetimeparse_function', 'set_legacy_print_mode', 'set_numeric_ops',
-    'set_string_function', 'set_typeDict', 'shares_memory',
-    'tracemalloc_domain', 'typeinfo', 'unpackbits', 'unravel_index', 'vdot',
-    'where', 'zeros']
+    'frombuffer', 'fromfile', 'fromiter', 'fromstring',
+    'get_handler_name', 'get_handler_version', 'inner', 'interp',
+    'interp_complex', 'is_busday', 'lexsort', 'matmul', 'may_share_memory',
+    'min_scalar_type', 'ndarray', 'nditer', 'nested_iters',
+    'normalize_axis_index', 'packbits', 'promote_types', 'putmask',
+    'ravel_multi_index', 'result_type', 'scalar', 'set_datetimeparse_function',
+    'set_legacy_print_mode', 'set_numeric_ops', 'set_string_function',
+    'set_typeDict', 'shares_memory', 'tracemalloc_domain', 'typeinfo',
+    'unpackbits', 'unravel_index', 'vdot', 'where', 'zeros']
 
 # For backward compatibility, make sure pickle imports these functions from here
 _reconstruct.__module__ = 'numpy.core.multiarray'
 scalar.__module__ = 'numpy.core.multiarray'
 
 
+_from_dlpack.__module__ = 'numpy'
 arange.__module__ = 'numpy'
 array.__module__ = 'numpy'
 asarray.__module__ = 'numpy'
@@ -249,7 +249,7 @@ def concatenate(arrays, axis=None, out=None, *, dtype=None, casting=None):
 @array_function_from_c_func_and_dispatcher(_multiarray_umath.inner)
 def inner(a, b):
     """
-    inner(a, b)
+    inner(a, b, /)
 
     Inner product of two arrays.
 
@@ -341,7 +341,7 @@ def inner(a, b):
 @array_function_from_c_func_and_dispatcher(_multiarray_umath.where)
 def where(condition, x=None, y=None):
     """
-    where(condition, [x, y])
+    where(condition, [x, y], /)
 
     Return elements chosen from `x` or `y` depending on `condition`.
 
@@ -613,7 +613,7 @@ def can_cast(from_, to, casting=None):
 @array_function_from_c_func_and_dispatcher(_multiarray_umath.min_scalar_type)
 def min_scalar_type(a):
     """
-    min_scalar_type(a)
+    min_scalar_type(a, /)
 
     For scalar ``a``, returns the data type with the smallest size
     and smallest scalar kind which can hold its value.  For non-scalar
@@ -825,7 +825,7 @@ def dot(a, b, out=None):
 @array_function_from_c_func_and_dispatcher(_multiarray_umath.vdot)
 def vdot(a, b):
     """
-    vdot(a, b)
+    vdot(a, b, /)
 
     Return the dot product of two vectors.
 
@@ -883,7 +883,7 @@ def vdot(a, b):
 @array_function_from_c_func_and_dispatcher(_multiarray_umath.bincount)
 def bincount(x, weights=None, minlength=None):
     """
-    bincount(x, weights=None, minlength=0)
+    bincount(x, /, weights=None, minlength=0)
 
     Count number of occurrences of each value in array of non-negative ints.
 
@@ -1151,7 +1151,7 @@ def putmask(a, mask, values):
 @array_function_from_c_func_and_dispatcher(_multiarray_umath.packbits)
 def packbits(a, axis=None, bitorder='big'):
     """
-    packbits(a, axis=None, bitorder='big')
+    packbits(a, /, axis=None, bitorder='big')
 
     Packs the elements of a binary-valued array into bits in a uint8 array.
 
@@ -1209,7 +1209,7 @@ def packbits(a, axis=None, bitorder='big'):
 @array_function_from_c_func_and_dispatcher(_multiarray_umath.unpackbits)
 def unpackbits(a, axis=None, count=None, bitorder='big'):
     """
-    unpackbits(a, axis=None, count=None, bitorder='big')
+    unpackbits(a, /, axis=None, count=None, bitorder='big')
 
     Unpacks elements of a uint8 array into a binary-valued output array.
 
@@ -1293,7 +1293,7 @@ def unpackbits(a, axis=None, count=None, bitorder='big'):
 @array_function_from_c_func_and_dispatcher(_multiarray_umath.shares_memory)
 def shares_memory(a, b, max_work=None):
     """
-    shares_memory(a, b, max_work=None)
+    shares_memory(a, b, /, max_work=None)
 
     Determine if two arrays share memory.
 
@@ -1368,7 +1368,7 @@ def shares_memory(a, b, max_work=None):
 @array_function_from_c_func_and_dispatcher(_multiarray_umath.may_share_memory)
 def may_share_memory(a, b, max_work=None):
     """
-    may_share_memory(a, b, max_work=None)
+    may_share_memory(a, b, /, max_work=None)
 
     Determine if two arrays might share memory
 
diff --git a/numpy/core/multiarray.pyi b/numpy/core/multiarray.pyi
new file mode 100644 (file)
index 0000000..a9f68e1
--- /dev/null
@@ -0,0 +1,1027 @@
+# TODO: Sort out any and all missing functions in this namespace
+
+import os
+import datetime as dt
+from typing import (
+    Literal as L,
+    Any,
+    Callable,
+    Iterable,
+    Optional,
+    overload,
+    TypeVar,
+    List,
+    Type,
+    Union,
+    Sequence,
+    Tuple,
+    SupportsIndex,
+    final,
+    Final,
+    Protocol,
+)
+
+from numpy import (
+    # Re-exports
+    busdaycalendar as busdaycalendar,
+    broadcast as broadcast,
+    dtype as dtype,
+    ndarray as ndarray,
+    nditer as nditer,
+
+    # The rest
+    ufunc,
+    str_,
+    bool_,
+    uint8,
+    intp,
+    int_,
+    float64,
+    timedelta64,
+    datetime64,
+    generic,
+    unsignedinteger,
+    signedinteger,
+    floating,
+    complexfloating,
+    _OrderKACF,
+    _OrderCF,
+    _CastingKind,
+    _ModeKind,
+    _SupportsBuffer,
+    _IOProtocol,
+    _CopyMode,
+    _NDIterFlagsKind,
+    _NDIterOpFlagsKind,
+)
+
+from numpy.typing import (
+    # Shapes
+    _ShapeLike,
+
+    # DTypes
+    DTypeLike,
+    _SupportsDType,
+
+    # Arrays
+    NDArray,
+    ArrayLike,
+    _SupportsArray,
+    _FiniteNestedSequence,
+    _ArrayLikeBool_co,
+    _ArrayLikeUInt_co,
+    _ArrayLikeInt_co,
+    _ArrayLikeFloat_co,
+    _ArrayLikeComplex_co,
+    _ArrayLikeTD64_co,
+    _ArrayLikeDT64_co,
+    _ArrayLikeObject_co,
+    _ArrayLikeStr_co,
+    _ArrayLikeBytes_co,
+    _ScalarLike_co,
+    _IntLike_co,
+    _FloatLike_co,
+    _TD64Like_co,
+)
+
+_SCT = TypeVar("_SCT", bound=generic)
+_ArrayType = TypeVar("_ArrayType", bound=NDArray[Any])
+
+# Subscriptable subsets of `npt.DTypeLike` and `npt.ArrayLike`
+_DTypeLike = Union[
+    dtype[_SCT],
+    Type[_SCT],
+    _SupportsDType[dtype[_SCT]],
+]
+_ArrayLike = _FiniteNestedSequence[_SupportsArray[dtype[_SCT]]]
+
+# Valid time units
+_UnitKind = L[
+    "Y",
+    "M",
+    "D",
+    "h",
+    "m",
+    "s",
+    "ms",
+    "us", "μs",
+    "ns",
+    "ps",
+    "fs",
+    "as",
+]
+_RollKind = L[  # `raise` is deliberately excluded
+    "nat",
+    "forward",
+    "following",
+    "backward",
+    "preceding",
+    "modifiedfollowing",
+    "modifiedpreceding",
+]
+
+__all__: List[str]
+
+ALLOW_THREADS: Final[int]  # 0 or 1 (system-specific)
+BUFSIZE: L[8192]
+CLIP: L[0]
+WRAP: L[1]
+RAISE: L[2]
+MAXDIMS: L[32]
+MAY_SHARE_BOUNDS: L[0]
+MAY_SHARE_EXACT: L[-1]
+tracemalloc_domain: L[389047]
+
+@overload
+def empty_like(
+    prototype: _ArrayType,
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    shape: Optional[_ShapeLike] = ...,
+) -> _ArrayType: ...
+@overload
+def empty_like(
+    prototype: _ArrayLike[_SCT],
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    shape: Optional[_ShapeLike] = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def empty_like(
+    prototype: object,
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    shape: Optional[_ShapeLike] = ...,
+) -> NDArray[Any]: ...
+@overload
+def empty_like(
+    prototype: Any,
+    dtype: _DTypeLike[_SCT],
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    shape: Optional[_ShapeLike] = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def empty_like(
+    prototype: Any,
+    dtype: DTypeLike,
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    shape: Optional[_ShapeLike] = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def array(
+    object: _ArrayType,
+    dtype: None = ...,
+    *,
+    copy: bool | _CopyMode = ...,
+    order: _OrderKACF = ...,
+    subok: L[True],
+    ndmin: int = ...,
+    like: ArrayLike = ...,
+) -> _ArrayType: ...
+@overload
+def array(
+    object: _ArrayLike[_SCT],
+    dtype: None = ...,
+    *,
+    copy: bool | _CopyMode = ...,
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    ndmin: int = ...,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def array(
+    object: object,
+    dtype: None = ...,
+    *,
+    copy: bool | _CopyMode = ...,
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    ndmin: int = ...,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+@overload
+def array(
+    object: Any,
+    dtype: _DTypeLike[_SCT],
+    *,
+    copy: bool | _CopyMode = ...,
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    ndmin: int = ...,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def array(
+    object: Any,
+    dtype: DTypeLike,
+    *,
+    copy: bool | _CopyMode = ...,
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    ndmin: int = ...,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def zeros(
+    shape: _ShapeLike,
+    dtype: None = ...,
+    order: _OrderCF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[float64]: ...
+@overload
+def zeros(
+    shape: _ShapeLike,
+    dtype: _DTypeLike[_SCT],
+    order: _OrderCF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def zeros(
+    shape: _ShapeLike,
+    dtype: DTypeLike,
+    order: _OrderCF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def empty(
+    shape: _ShapeLike,
+    dtype: None = ...,
+    order: _OrderCF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[float64]: ...
+@overload
+def empty(
+    shape: _ShapeLike,
+    dtype: _DTypeLike[_SCT],
+    order: _OrderCF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def empty(
+    shape: _ShapeLike,
+    dtype: DTypeLike,
+    order: _OrderCF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def unravel_index(  # type: ignore[misc]
+    indices: _IntLike_co,
+    shape: _ShapeLike,
+    order: _OrderCF = ...,
+) -> Tuple[intp, ...]: ...
+@overload
+def unravel_index(
+    indices: _ArrayLikeInt_co,
+    shape: _ShapeLike,
+    order: _OrderCF = ...,
+) -> Tuple[NDArray[intp], ...]: ...
+
+@overload
+def ravel_multi_index(  # type: ignore[misc]
+    multi_index: Sequence[_IntLike_co],
+    dims: Sequence[SupportsIndex],
+    mode: Union[_ModeKind, Tuple[_ModeKind, ...]] = ...,
+    order: _OrderCF = ...,
+) -> intp: ...
+@overload
+def ravel_multi_index(
+    multi_index: Sequence[_ArrayLikeInt_co],
+    dims: Sequence[SupportsIndex],
+    mode: Union[_ModeKind, Tuple[_ModeKind, ...]] = ...,
+    order: _OrderCF = ...,
+) -> NDArray[intp]: ...
+
+@overload
+def concatenate(  # type: ignore[misc]
+    arrays: _ArrayLike[_SCT],
+    /,
+    axis: Optional[SupportsIndex] = ...,
+    out: None = ...,
+    *,
+    dtype: None = ...,
+    casting: Optional[_CastingKind] = ...
+) -> NDArray[_SCT]: ...
+@overload
+def concatenate(  # type: ignore[misc]
+    arrays: ArrayLike,
+    /,
+    axis: Optional[SupportsIndex] = ...,
+    out: None = ...,
+    *,
+    dtype: None = ...,
+    casting: Optional[_CastingKind] = ...
+) -> NDArray[Any]: ...
+@overload
+def concatenate(  # type: ignore[misc]
+    arrays: ArrayLike,
+    /,
+    axis: Optional[SupportsIndex] = ...,
+    out: None = ...,
+    *,
+    dtype: _DTypeLike[_SCT],
+    casting: Optional[_CastingKind] = ...
+) -> NDArray[_SCT]: ...
+@overload
+def concatenate(  # type: ignore[misc]
+    arrays: ArrayLike,
+    /,
+    axis: Optional[SupportsIndex] = ...,
+    out: None = ...,
+    *,
+    dtype: DTypeLike,
+    casting: Optional[_CastingKind] = ...
+) -> NDArray[Any]: ...
+@overload
+def concatenate(
+    arrays: ArrayLike,
+    /,
+    axis: Optional[SupportsIndex] = ...,
+    out: _ArrayType = ...,
+    *,
+    dtype: DTypeLike = ...,
+    casting: Optional[_CastingKind] = ...
+) -> _ArrayType: ...
+
+def inner(
+    a: ArrayLike,
+    b: ArrayLike,
+    /,
+) -> Any: ...
+
+@overload
+def where(
+    condition: ArrayLike,
+    /,
+) -> Tuple[NDArray[intp], ...]: ...
+@overload
+def where(
+    condition: ArrayLike,
+    x: ArrayLike,
+    y: ArrayLike,
+    /,
+) -> NDArray[Any]: ...
+
+def lexsort(
+    keys: ArrayLike,
+    axis: Optional[SupportsIndex] = ...,
+) -> Any: ...
+
+def can_cast(
+    from_: Union[ArrayLike, DTypeLike],
+    to: DTypeLike,
+    casting: Optional[_CastingKind] = ...,
+) -> bool: ...
+
+def min_scalar_type(
+    a: ArrayLike, /,
+) -> dtype[Any]: ...
+
+def result_type(
+    *arrays_and_dtypes: Union[ArrayLike, DTypeLike],
+) -> dtype[Any]: ...
+
+@overload
+def dot(a: ArrayLike, b: ArrayLike, out: None = ...) -> Any: ...
+@overload
+def dot(a: ArrayLike, b: ArrayLike, out: _ArrayType) -> _ArrayType: ...
+
+@overload
+def vdot(a: _ArrayLikeBool_co, b: _ArrayLikeBool_co, /) -> bool_: ...  # type: ignore[misc]
+@overload
+def vdot(a: _ArrayLikeUInt_co, b: _ArrayLikeUInt_co, /) -> unsignedinteger[Any]: ...  # type: ignore[misc]
+@overload
+def vdot(a: _ArrayLikeInt_co, b: _ArrayLikeInt_co, /) -> signedinteger[Any]: ... # type: ignore[misc]
+@overload
+def vdot(a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co, /) -> floating[Any]: ...  # type: ignore[misc]
+@overload
+def vdot(a: _ArrayLikeComplex_co, b: _ArrayLikeComplex_co, /) -> complexfloating[Any, Any]: ...  # type: ignore[misc]
+@overload
+def vdot(a: _ArrayLikeTD64_co, b: _ArrayLikeTD64_co, /) -> timedelta64: ...
+@overload
+def vdot(a: _ArrayLikeObject_co, b: Any, /) -> Any: ...
+@overload
+def vdot(a: Any, b: _ArrayLikeObject_co, /) -> Any: ...
+
+def bincount(
+    x: ArrayLike,
+    /,
+    weights: Optional[ArrayLike] = ...,
+    minlength: SupportsIndex = ...,
+) -> NDArray[intp]: ...
+
+def copyto(
+    dst: NDArray[Any],
+    src: ArrayLike,
+    casting: Optional[_CastingKind] = ...,
+    where: Optional[_ArrayLikeBool_co] = ...,
+) -> None: ...
+
+def putmask(
+    a: NDArray[Any],
+    mask: _ArrayLikeBool_co,
+    values: ArrayLike,
+) -> None: ...
+
+def packbits(
+    a: _ArrayLikeInt_co,
+    /,
+    axis: Optional[SupportsIndex] = ...,
+    bitorder: L["big", "little"] = ...,
+) -> NDArray[uint8]: ...
+
+def unpackbits(
+    a: _ArrayLike[uint8],
+    /,
+    axis: Optional[SupportsIndex] = ...,
+    count: Optional[SupportsIndex] = ...,
+    bitorder: L["big", "little"] = ...,
+) -> NDArray[uint8]: ...
+
+def shares_memory(
+    a: object,
+    b: object,
+    /,
+    max_work: Optional[int] = ...,
+) -> bool: ...
+
+def may_share_memory(
+    a: object,
+    b: object,
+    /,
+    max_work: Optional[int] = ...,
+) -> bool: ...
+
+@overload
+def asarray(
+    a: _ArrayLike[_SCT],
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def asarray(
+    a: object,
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+@overload
+def asarray(
+    a: Any,
+    dtype: _DTypeLike[_SCT],
+    order: _OrderKACF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def asarray(
+    a: Any,
+    dtype: DTypeLike,
+    order: _OrderKACF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def asanyarray(
+    a: _ArrayType,  # Preserve subclass-information
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> _ArrayType: ...
+@overload
+def asanyarray(
+    a: _ArrayLike[_SCT],
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def asanyarray(
+    a: object,
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+@overload
+def asanyarray(
+    a: Any,
+    dtype: _DTypeLike[_SCT],
+    order: _OrderKACF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def asanyarray(
+    a: Any,
+    dtype: DTypeLike,
+    order: _OrderKACF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def ascontiguousarray(
+    a: _ArrayLike[_SCT],
+    dtype: None = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def ascontiguousarray(
+    a: object,
+    dtype: None = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+@overload
+def ascontiguousarray(
+    a: Any,
+    dtype: _DTypeLike[_SCT],
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def ascontiguousarray(
+    a: Any,
+    dtype: DTypeLike,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def asfortranarray(
+    a: _ArrayLike[_SCT],
+    dtype: None = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def asfortranarray(
+    a: object,
+    dtype: None = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+@overload
+def asfortranarray(
+    a: Any,
+    dtype: _DTypeLike[_SCT],
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def asfortranarray(
+    a: Any,
+    dtype: DTypeLike,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+# In practice `List[Any]` is list with an int, int and a valid
+# `np.seterrcall()` object
+def geterrobj() -> List[Any]: ...
+def seterrobj(errobj: List[Any], /) -> None: ...
+
+def promote_types(__type1: DTypeLike, __type2: DTypeLike) -> dtype[Any]: ...
+
+# `sep` is a de facto mandatory argument, as its default value is deprecated
+@overload
+def fromstring(
+    string: str | bytes,
+    dtype: None = ...,
+    count: SupportsIndex = ...,
+    *,
+    sep: str,
+    like: ArrayLike = ...,
+) -> NDArray[float64]: ...
+@overload
+def fromstring(
+    string: str | bytes,
+    dtype: _DTypeLike[_SCT],
+    count: SupportsIndex = ...,
+    *,
+    sep: str,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def fromstring(
+    string: str | bytes,
+    dtype: DTypeLike,
+    count: SupportsIndex = ...,
+    *,
+    sep: str,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+def frompyfunc(
+    func: Callable[..., Any], /,
+    nin: SupportsIndex,
+    nout: SupportsIndex,
+    *,
+    identity: Any = ...,
+) -> ufunc: ...
+
+@overload
+def fromfile(
+    file: str | bytes | os.PathLike[Any] | _IOProtocol,
+    dtype: None = ...,
+    count: SupportsIndex = ...,
+    sep: str = ...,
+    offset: SupportsIndex = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[float64]: ...
+@overload
+def fromfile(
+    file: str | bytes | os.PathLike[Any] | _IOProtocol,
+    dtype: _DTypeLike[_SCT],
+    count: SupportsIndex = ...,
+    sep: str = ...,
+    offset: SupportsIndex = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def fromfile(
+    file: str | bytes | os.PathLike[Any] | _IOProtocol,
+    dtype: DTypeLike,
+    count: SupportsIndex = ...,
+    sep: str = ...,
+    offset: SupportsIndex = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def fromiter(
+    iter: Iterable[Any],
+    dtype: _DTypeLike[_SCT],
+    count: SupportsIndex = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def fromiter(
+    iter: Iterable[Any],
+    dtype: DTypeLike,
+    count: SupportsIndex = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def frombuffer(
+    buffer: _SupportsBuffer,
+    dtype: None = ...,
+    count: SupportsIndex = ...,
+    offset: SupportsIndex = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[float64]: ...
+@overload
+def frombuffer(
+    buffer: _SupportsBuffer,
+    dtype: _DTypeLike[_SCT],
+    count: SupportsIndex = ...,
+    offset: SupportsIndex = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def frombuffer(
+    buffer: _SupportsBuffer,
+    dtype: DTypeLike,
+    count: SupportsIndex = ...,
+    offset: SupportsIndex = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def arange(  # type: ignore[misc]
+    stop: _IntLike_co,
+    /, *,
+    dtype: None = ...,
+    like: ArrayLike = ...,
+) -> NDArray[signedinteger[Any]]: ...
+@overload
+def arange(  # type: ignore[misc]
+    start: _IntLike_co,
+    stop: _IntLike_co,
+    step: _IntLike_co = ...,
+    dtype: None = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[signedinteger[Any]]: ...
+@overload
+def arange(  # type: ignore[misc]
+    stop: _FloatLike_co,
+    /, *,
+    dtype: None = ...,
+    like: ArrayLike = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def arange(  # type: ignore[misc]
+    start: _FloatLike_co,
+    stop: _FloatLike_co,
+    step: _FloatLike_co = ...,
+    dtype: None = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def arange(
+    stop: _TD64Like_co,
+    /, *,
+    dtype: None = ...,
+    like: ArrayLike = ...,
+) -> NDArray[timedelta64]: ...
+@overload
+def arange(
+    start: _TD64Like_co,
+    stop: _TD64Like_co,
+    step: _TD64Like_co = ...,
+    dtype: None = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[timedelta64]: ...
+@overload
+def arange(  # both start and stop must always be specified for datetime64
+    start: datetime64,
+    stop: datetime64,
+    step: datetime64 = ...,
+    dtype: None = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[datetime64]: ...
+@overload
+def arange(
+    stop: Any,
+    /, *,
+    dtype: _DTypeLike[_SCT],
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def arange(
+    start: Any,
+    stop: Any,
+    step: Any = ...,
+    dtype: _DTypeLike[_SCT] = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def arange(
+    stop: Any, /,
+    *,
+    dtype: DTypeLike,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+@overload
+def arange(
+    start: Any,
+    stop: Any,
+    step: Any = ...,
+    dtype: DTypeLike = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+def datetime_data(
+    dtype: str | _DTypeLike[datetime64] | _DTypeLike[timedelta64], /,
+) -> Tuple[str, int]: ...
+
+# The datetime functions perform unsafe casts to `datetime64[D]`,
+# so a lot of different argument types are allowed here
+
+@overload
+def busday_count(  # type: ignore[misc]
+    begindates: _ScalarLike_co,
+    enddates: _ScalarLike_co,
+    weekmask: ArrayLike = ...,
+    holidays: None | ArrayLike = ...,
+    busdaycal: None | busdaycalendar = ...,
+    out: None = ...,
+) -> int_: ...
+@overload
+def busday_count(  # type: ignore[misc]
+    begindates: ArrayLike,
+    enddates: ArrayLike,
+    weekmask: ArrayLike = ...,
+    holidays: None | ArrayLike = ...,
+    busdaycal: None | busdaycalendar = ...,
+    out: None = ...,
+) -> NDArray[int_]: ...
+@overload
+def busday_count(
+    begindates: ArrayLike,
+    enddates: ArrayLike,
+    weekmask: ArrayLike = ...,
+    holidays: None | ArrayLike = ...,
+    busdaycal: None | busdaycalendar = ...,
+    out: _ArrayType = ...,
+) -> _ArrayType: ...
+
+# `roll="raise"` is (more or less?) equivalent to `casting="safe"`
+@overload
+def busday_offset(  # type: ignore[misc]
+    dates: datetime64,
+    offsets: _TD64Like_co,
+    roll: L["raise"] = ...,
+    weekmask: ArrayLike = ...,
+    holidays: None | ArrayLike = ...,
+    busdaycal: None | busdaycalendar = ...,
+    out: None = ...,
+) -> datetime64: ...
+@overload
+def busday_offset(  # type: ignore[misc]
+    dates: _ArrayLike[datetime64],
+    offsets: _ArrayLikeTD64_co,
+    roll: L["raise"] = ...,
+    weekmask: ArrayLike = ...,
+    holidays: None | ArrayLike = ...,
+    busdaycal: None | busdaycalendar = ...,
+    out: None = ...,
+) -> NDArray[datetime64]: ...
+@overload
+def busday_offset(  # type: ignore[misc]
+    dates: _ArrayLike[datetime64],
+    offsets: _ArrayLike[timedelta64],
+    roll: L["raise"] = ...,
+    weekmask: ArrayLike = ...,
+    holidays: None | ArrayLike = ...,
+    busdaycal: None | busdaycalendar = ...,
+    out: _ArrayType = ...,
+) -> _ArrayType: ...
+@overload
+def busday_offset(  # type: ignore[misc]
+    dates: _ScalarLike_co,
+    offsets: _ScalarLike_co,
+    roll: _RollKind,
+    weekmask: ArrayLike = ...,
+    holidays: None | ArrayLike = ...,
+    busdaycal: None | busdaycalendar = ...,
+    out: None = ...,
+) -> datetime64: ...
+@overload
+def busday_offset(  # type: ignore[misc]
+    dates: ArrayLike,
+    offsets: ArrayLike,
+    roll: _RollKind,
+    weekmask: ArrayLike = ...,
+    holidays: None | ArrayLike = ...,
+    busdaycal: None | busdaycalendar = ...,
+    out: None = ...,
+) -> NDArray[datetime64]: ...
+@overload
+def busday_offset(
+    dates: ArrayLike,
+    offsets: ArrayLike,
+    roll: _RollKind,
+    weekmask: ArrayLike = ...,
+    holidays: None | ArrayLike = ...,
+    busdaycal: None | busdaycalendar = ...,
+    out: _ArrayType = ...,
+) -> _ArrayType: ...
+
+@overload
+def is_busday(  # type: ignore[misc]
+    dates: _ScalarLike_co,
+    weekmask: ArrayLike = ...,
+    holidays: None | ArrayLike = ...,
+    busdaycal: None | busdaycalendar = ...,
+    out: None = ...,
+) -> bool_: ...
+@overload
+def is_busday(  # type: ignore[misc]
+    dates: ArrayLike,
+    weekmask: ArrayLike = ...,
+    holidays: None | ArrayLike = ...,
+    busdaycal: None | busdaycalendar = ...,
+    out: None = ...,
+) -> NDArray[bool_]: ...
+@overload
+def is_busday(
+    dates: ArrayLike,
+    weekmask: ArrayLike = ...,
+    holidays: None | ArrayLike = ...,
+    busdaycal: None | busdaycalendar = ...,
+    out: _ArrayType = ...,
+) -> _ArrayType: ...
+
+@overload
+def datetime_as_string(  # type: ignore[misc]
+    arr: datetime64,
+    unit: None | L["auto"] | _UnitKind = ...,
+    timezone: L["naive", "UTC", "local"] | dt.tzinfo = ...,
+    casting: _CastingKind = ...,
+) -> str_: ...
+@overload
+def datetime_as_string(
+    arr: _ArrayLikeDT64_co,
+    unit: None | L["auto"] | _UnitKind = ...,
+    timezone: L["naive", "UTC", "local"] | dt.tzinfo = ...,
+    casting: _CastingKind = ...,
+) -> NDArray[str_]: ...
+
+@overload
+def compare_chararrays(
+    a1: _ArrayLikeStr_co,
+    a2: _ArrayLikeStr_co,
+    cmp: L["<", "<=", "==", ">=", ">", "!="],
+    rstrip: bool,
+) -> NDArray[bool_]: ...
+@overload
+def compare_chararrays(
+    a1: _ArrayLikeBytes_co,
+    a2: _ArrayLikeBytes_co,
+    cmp: L["<", "<=", "==", ">=", ">", "!="],
+    rstrip: bool,
+) -> NDArray[bool_]: ...
+
+def add_docstring(obj: Callable[..., Any], docstring: str, /) -> None: ...
+
+_GetItemKeys = L[
+    "C", "CONTIGUOUS", "C_CONTIGUOUS",
+    "F", "FORTRAN", "F_CONTIGUOUS",
+    "W", "WRITEABLE",
+    "B", "BEHAVED",
+    "O", "OWNDATA",
+    "A", "ALIGNED",
+    "X", "WRITEBACKIFCOPY",
+    "CA", "CARRAY",
+    "FA", "FARRAY",
+    "FNC",
+    "FORC",
+]
+_SetItemKeys = L[
+    "A", "ALIGNED",
+    "W", "WRITABLE",
+    "X", "WRITEBACKIFCOPY",
+]
+
+@final
+class flagsobj:
+    __hash__: None  # type: ignore[assignment]
+    aligned: bool
+    # NOTE: deprecated
+    # updateifcopy: bool
+    writeable: bool
+    writebackifcopy: bool
+    @property
+    def behaved(self) -> bool: ...
+    @property
+    def c_contiguous(self) -> bool: ...
+    @property
+    def carray(self) -> bool: ...
+    @property
+    def contiguous(self) -> bool: ...
+    @property
+    def f_contiguous(self) -> bool: ...
+    @property
+    def farray(self) -> bool: ...
+    @property
+    def fnc(self) -> bool: ...
+    @property
+    def forc(self) -> bool: ...
+    @property
+    def fortran(self) -> bool: ...
+    @property
+    def num(self) -> int: ...
+    @property
+    def owndata(self) -> bool: ...
+    def __getitem__(self, key: _GetItemKeys) -> bool: ...
+    def __setitem__(self, key: _SetItemKeys, value: bool) -> None: ...
+
+def nested_iters(
+    op: ArrayLike | Sequence[ArrayLike],
+    axes: Sequence[Sequence[SupportsIndex]],
+    flags: None | Sequence[_NDIterFlagsKind] = ...,
+    op_flags: None | Sequence[Sequence[_NDIterOpFlagsKind]] = ...,
+    op_dtypes: DTypeLike | Sequence[DTypeLike] = ...,
+    order: _OrderKACF = ...,
+    casting: _CastingKind = ...,
+    buffersize: SupportsIndex = ...,
+) -> Tuple[nditer, ...]: ...
index 8bb37e2910163b30a176d31242d6845d8215efc0..344d40d934cfb50224c97a58c201d0531562093d 100644 (file)
@@ -13,8 +13,8 @@ from .multiarray import (
     WRAP, arange, array, asarray, asanyarray, ascontiguousarray,
     asfortranarray, broadcast, can_cast, compare_chararrays,
     concatenate, copyto, dot, dtype, empty,
-    empty_like, flatiter, frombuffer, fromfile, fromiter, fromstring,
-    inner, lexsort, matmul, may_share_memory,
+    empty_like, flatiter, frombuffer, _from_dlpack, fromfile, fromiter,
+    fromstring, inner, lexsort, matmul, may_share_memory,
     min_scalar_type, ndarray, nditer, nested_iters, promote_types,
     putmask, result_type, set_numeric_ops, shares_memory, vdot, where,
     zeros, normalize_axis_index)
@@ -41,7 +41,7 @@ __all__ = [
     'newaxis', 'ndarray', 'flatiter', 'nditer', 'nested_iters', 'ufunc',
     'arange', 'array', 'asarray', 'asanyarray', 'ascontiguousarray',
     'asfortranarray', 'zeros', 'count_nonzero', 'empty', 'broadcast', 'dtype',
-    'fromstring', 'fromfile', 'frombuffer', 'where',
+    'fromstring', 'fromfile', 'frombuffer', '_from_dlpack', 'where',
     'argwhere', 'copyto', 'concatenate', 'fastCopyAndTranspose', 'lexsort',
     'set_numeric_ops', 'can_cast', 'promote_types', 'min_scalar_type',
     'result_type', 'isfortran', 'empty_like', 'zeros_like', 'ones_like',
@@ -1184,7 +1184,7 @@ def roll(a, shift, axis=None):
     >>> np.roll(x, -2)
     array([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])
 
-    >>> x2 = np.reshape(x, (2,5))
+    >>> x2 = np.reshape(x, (2, 5))
     >>> x2
     array([[0, 1, 2, 3, 4],
            [5, 6, 7, 8, 9]])
@@ -1206,6 +1206,12 @@ def roll(a, shift, axis=None):
     >>> np.roll(x2, -1, axis=1)
     array([[1, 2, 3, 4, 0],
            [6, 7, 8, 9, 5]])
+    >>> np.roll(x2, (1, 1), axis=(1, 0))
+    array([[9, 5, 6, 7, 8],
+           [4, 0, 1, 2, 3]])
+    >>> np.roll(x2, (2, 1), axis=(1, 0))
+    array([[8, 9, 5, 6, 7],
+           [3, 4, 0, 1, 2]])
 
     """
     a = asanyarray(a)
@@ -1466,11 +1472,6 @@ def moveaxis(a, source, destination):
     return result
 
 
-# fix hack in scipy which imports this function
-def _move_axis_to_0(a, axis):
-    return moveaxis(a, axis, 0)
-
-
 def _cross_dispatcher(a, b, axisa=None, axisb=None, axisc=None, axis=None):
     return (a, b)
 
@@ -2231,6 +2232,7 @@ def allclose(a, b, rtol=1.e-5, atol=1.e-8, equal_nan=False):
     `equal` but not `array_equal`.
 
     `allclose` is not defined for non-numeric data types.
+    `bool` is considered a numeric data-type for this purpose.
 
     Examples
     --------
@@ -2312,6 +2314,7 @@ def isclose(a, b, rtol=1.e-5, atol=1.e-8, equal_nan=False):
     for `atol` will result in `False` if either `a` or `b` is zero.
 
     `isclose` is not defined for non-numeric data types.
+    `bool` is considered a numeric data-type for this purpose.
 
     Examples
     --------
index f579514349daf1fe5d92adf79b8d534e967cbcec..d7ec303518a20cd3c0dd304b3a00b28c27528540 100644 (file)
@@ -1,7 +1,5 @@
-import sys
 from typing import (
     Any,
-    Optional,
     Union,
     Sequence,
     Tuple,
@@ -9,22 +7,64 @@ from typing import (
     List,
     overload,
     TypeVar,
-    Iterable,
+    Literal,
+    Type,
+    SupportsAbs,
+    SupportsIndex,
+    NoReturn,
+)
+from typing_extensions import TypeGuard
+
+from numpy import (
+    ComplexWarning as ComplexWarning,
+    dtype,
+    generic,
+    unsignedinteger,
+    signedinteger,
+    floating,
+    complexfloating,
+    bool_,
+    int_,
+    intp,
+    float64,
+    timedelta64,
+    object_,
+    _OrderKACF,
+    _OrderCF,
 )
 
-from numpy import ndarray, generic, dtype, bool_, signedinteger, _OrderKACF, _OrderCF
-from numpy.typing import ArrayLike, DTypeLike, _ShapeLike
-
-if sys.version_info >= (3, 8):
-    from typing import Literal
-else:
-    from typing_extensions import Literal
+from numpy.typing import (
+    ArrayLike,
+    NDArray,
+    DTypeLike,
+    _ShapeLike,
+    _SupportsDType,
+    _FiniteNestedSequence,
+    _SupportsArray,
+    _ScalarLike_co,
+    _ArrayLikeBool_co,
+    _ArrayLikeUInt_co,
+    _ArrayLikeInt_co,
+    _ArrayLikeFloat_co,
+    _ArrayLikeComplex_co,
+    _ArrayLikeTD64_co,
+    _ArrayLikeObject_co,
+)
 
 _T = TypeVar("_T")
-_ArrayType = TypeVar("_ArrayType", bound=ndarray)
-
+_SCT = TypeVar("_SCT", bound=generic)
+_ArrayType = TypeVar("_ArrayType", bound=NDArray[Any])
+
+_DTypeLike = Union[
+    dtype[_SCT],
+    Type[_SCT],
+    _SupportsDType[dtype[_SCT]],
+]
+_ArrayLike = _FiniteNestedSequence[_SupportsArray[dtype[_SCT]]]
 _CorrelateMode = Literal["valid", "same", "full"]
 
+__all__: List[str]
+
 @overload
 def zeros_like(
     a: _ArrayType,
@@ -35,20 +75,61 @@ def zeros_like(
 ) -> _ArrayType: ...
 @overload
 def zeros_like(
-    a: ArrayLike,
-    dtype: DTypeLike = ...,
+    a: _ArrayLike[_SCT],
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    shape: None | _ShapeLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def zeros_like(
+    a: object,
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    shape: None | _ShapeLike= ...,
+) -> NDArray[Any]: ...
+@overload
+def zeros_like(
+    a: Any,
+    dtype: _DTypeLike[_SCT],
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    shape: None | _ShapeLike= ...,
+) -> NDArray[_SCT]: ...
+@overload
+def zeros_like(
+    a: Any,
+    dtype: DTypeLike,
     order: _OrderKACF = ...,
     subok: bool = ...,
-    shape: Optional[_ShapeLike] = ...,
-) -> ndarray: ...
+    shape: None | _ShapeLike= ...,
+) -> NDArray[Any]: ...
 
+@overload
 def ones(
     shape: _ShapeLike,
-    dtype: DTypeLike = ...,
+    dtype: None = ...,
+    order: _OrderCF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[float64]: ...
+@overload
+def ones(
+    shape: _ShapeLike,
+    dtype: _DTypeLike[_SCT],
     order: _OrderCF = ...,
     *,
     like: ArrayLike = ...,
-) -> ndarray: ...
+) -> NDArray[_SCT]: ...
+@overload
+def ones(
+    shape: _ShapeLike,
+    dtype: DTypeLike,
+    order: _OrderCF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
 
 @overload
 def ones_like(
@@ -60,38 +141,64 @@ def ones_like(
 ) -> _ArrayType: ...
 @overload
 def ones_like(
-    a: ArrayLike,
-    dtype: DTypeLike = ...,
+    a: _ArrayLike[_SCT],
+    dtype: None = ...,
     order: _OrderKACF = ...,
     subok: bool = ...,
-    shape: Optional[_ShapeLike] = ...,
-) -> ndarray: ...
-
+    shape: None | _ShapeLike = ...,
+) -> NDArray[_SCT]: ...
 @overload
-def empty_like(
-    a: _ArrayType,
+def ones_like(
+    a: object,
     dtype: None = ...,
     order: _OrderKACF = ...,
-    subok: Literal[True] = ...,
-    shape: None = ...,
-) -> _ArrayType: ...
+    subok: bool = ...,
+    shape: None | _ShapeLike= ...,
+) -> NDArray[Any]: ...
 @overload
-def empty_like(
-    a: ArrayLike,
-    dtype: DTypeLike = ...,
+def ones_like(
+    a: Any,
+    dtype: _DTypeLike[_SCT],
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    shape: None | _ShapeLike= ...,
+) -> NDArray[_SCT]: ...
+@overload
+def ones_like(
+    a: Any,
+    dtype: DTypeLike,
     order: _OrderKACF = ...,
     subok: bool = ...,
-    shape: Optional[_ShapeLike] = ...,
-) -> ndarray: ...
+    shape: None | _ShapeLike= ...,
+) -> NDArray[Any]: ...
 
+@overload
 def full(
     shape: _ShapeLike,
     fill_value: Any,
-    dtype: DTypeLike = ...,
+    dtype: None = ...,
     order: _OrderCF = ...,
     *,
     like: ArrayLike = ...,
-) -> ndarray: ...
+) -> NDArray[Any]: ...
+@overload
+def full(
+    shape: _ShapeLike,
+    fill_value: Any,
+    dtype: _DTypeLike[_SCT],
+    order: _OrderCF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def full(
+    shape: _ShapeLike,
+    fill_value: Any,
+    dtype: DTypeLike,
+    order: _OrderCF = ...,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
 
 @overload
 def full_like(
@@ -104,13 +211,40 @@ def full_like(
 ) -> _ArrayType: ...
 @overload
 def full_like(
-    a: ArrayLike,
+    a: _ArrayLike[_SCT],
     fill_value: Any,
-    dtype: DTypeLike = ...,
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    shape: None | _ShapeLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def full_like(
+    a: object,
+    fill_value: Any,
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    shape: None | _ShapeLike= ...,
+) -> NDArray[Any]: ...
+@overload
+def full_like(
+    a: Any,
+    fill_value: Any,
+    dtype: _DTypeLike[_SCT],
+    order: _OrderKACF = ...,
+    subok: bool = ...,
+    shape: None | _ShapeLike= ...,
+) -> NDArray[_SCT]: ...
+@overload
+def full_like(
+    a: Any,
+    fill_value: Any,
+    dtype: DTypeLike,
     order: _OrderKACF = ...,
     subok: bool = ...,
-    shape: Optional[_ShapeLike] = ...,
-) -> ndarray: ...
+    shape: None | _ShapeLike= ...,
+) -> NDArray[Any]: ...
 
 @overload
 def count_nonzero(
@@ -127,78 +261,306 @@ def count_nonzero(
     keepdims: bool = ...,
 ) -> Any: ...  # TODO: np.intp or ndarray[np.intp]
 
-def isfortran(a: Union[ndarray, generic]) -> bool: ...
+def isfortran(a: NDArray[Any] | generic) -> bool: ...
 
-def argwhere(a: ArrayLike) -> ndarray: ...
+def argwhere(a: ArrayLike) -> NDArray[intp]: ...
 
-def flatnonzero(a: ArrayLike) -> ndarray: ...
+def flatnonzero(a: ArrayLike) -> NDArray[intp]: ...
 
+@overload
 def correlate(
-    a: ArrayLike,
-    v: ArrayLike,
+    a: _ArrayLikeBool_co,
+    v: _ArrayLikeBool_co,
+    mode: _CorrelateMode = ...,
+) -> NDArray[bool_]: ...
+@overload
+def correlate(
+    a: _ArrayLikeUInt_co,
+    v: _ArrayLikeUInt_co,
+    mode: _CorrelateMode = ...,
+) -> NDArray[unsignedinteger[Any]]: ...
+@overload
+def correlate(
+    a: _ArrayLikeInt_co,
+    v: _ArrayLikeInt_co,
+    mode: _CorrelateMode = ...,
+) -> NDArray[signedinteger[Any]]: ...
+@overload
+def correlate(
+    a: _ArrayLikeFloat_co,
+    v: _ArrayLikeFloat_co,
+    mode: _CorrelateMode = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def correlate(
+    a: _ArrayLikeComplex_co,
+    v: _ArrayLikeComplex_co,
     mode: _CorrelateMode = ...,
-) -> ndarray: ...
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def correlate(
+    a: _ArrayLikeTD64_co,
+    v: _ArrayLikeTD64_co,
+    mode: _CorrelateMode = ...,
+) -> NDArray[timedelta64]: ...
+@overload
+def correlate(
+    a: _ArrayLikeObject_co,
+    v: _ArrayLikeObject_co,
+    mode: _CorrelateMode = ...,
+) -> NDArray[object_]: ...
 
+@overload
 def convolve(
-    a: ArrayLike,
-    v: ArrayLike,
+    a: _ArrayLikeBool_co,
+    v: _ArrayLikeBool_co,
+    mode: _CorrelateMode = ...,
+) -> NDArray[bool_]: ...
+@overload
+def convolve(
+    a: _ArrayLikeUInt_co,
+    v: _ArrayLikeUInt_co,
+    mode: _CorrelateMode = ...,
+) -> NDArray[unsignedinteger[Any]]: ...
+@overload
+def convolve(
+    a: _ArrayLikeInt_co,
+    v: _ArrayLikeInt_co,
     mode: _CorrelateMode = ...,
-) -> ndarray: ...
+) -> NDArray[signedinteger[Any]]: ...
+@overload
+def convolve(
+    a: _ArrayLikeFloat_co,
+    v: _ArrayLikeFloat_co,
+    mode: _CorrelateMode = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def convolve(
+    a: _ArrayLikeComplex_co,
+    v: _ArrayLikeComplex_co,
+    mode: _CorrelateMode = ...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def convolve(
+    a: _ArrayLikeTD64_co,
+    v: _ArrayLikeTD64_co,
+    mode: _CorrelateMode = ...,
+) -> NDArray[timedelta64]: ...
+@overload
+def convolve(
+    a: _ArrayLikeObject_co,
+    v: _ArrayLikeObject_co,
+    mode: _CorrelateMode = ...,
+) -> NDArray[object_]: ...
 
 @overload
 def outer(
-    a: ArrayLike,
-    b: ArrayLike,
+    a: _ArrayLikeBool_co,
+    b: _ArrayLikeBool_co,
     out: None = ...,
-) -> ndarray: ...
+) -> NDArray[bool_]: ...
 @overload
 def outer(
-    a: ArrayLike,
-    b: ArrayLike,
-    out: _ArrayType = ...,
+    a: _ArrayLikeUInt_co,
+    b: _ArrayLikeUInt_co,
+    out: None = ...,
+) -> NDArray[unsignedinteger[Any]]: ...
+@overload
+def outer(
+    a: _ArrayLikeInt_co,
+    b: _ArrayLikeInt_co,
+    out: None = ...,
+) -> NDArray[signedinteger[Any]]: ...
+@overload
+def outer(
+    a: _ArrayLikeFloat_co,
+    b: _ArrayLikeFloat_co,
+    out: None = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def outer(
+    a: _ArrayLikeComplex_co,
+    b: _ArrayLikeComplex_co,
+    out: None = ...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def outer(
+    a: _ArrayLikeTD64_co,
+    b: _ArrayLikeTD64_co,
+    out: None = ...,
+) -> NDArray[timedelta64]: ...
+@overload
+def outer(
+    a: _ArrayLikeObject_co,
+    b: _ArrayLikeObject_co,
+    out: None = ...,
+) -> NDArray[object_]: ...
+@overload
+def outer(
+    a: _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeObject_co,
+    b: _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeObject_co,
+    out: _ArrayType,
 ) -> _ArrayType: ...
 
+@overload
 def tensordot(
-    a: ArrayLike,
-    b: ArrayLike,
-    axes: Union[int, Tuple[_ShapeLike, _ShapeLike]] = ...,
-) -> ndarray: ...
+    a: _ArrayLikeBool_co,
+    b: _ArrayLikeBool_co,
+    axes: int | Tuple[_ShapeLike, _ShapeLike] = ...,
+) -> NDArray[bool_]: ...
+@overload
+def tensordot(
+    a: _ArrayLikeUInt_co,
+    b: _ArrayLikeUInt_co,
+    axes: int | Tuple[_ShapeLike, _ShapeLike] = ...,
+) -> NDArray[unsignedinteger[Any]]: ...
+@overload
+def tensordot(
+    a: _ArrayLikeInt_co,
+    b: _ArrayLikeInt_co,
+    axes: int | Tuple[_ShapeLike, _ShapeLike] = ...,
+) -> NDArray[signedinteger[Any]]: ...
+@overload
+def tensordot(
+    a: _ArrayLikeFloat_co,
+    b: _ArrayLikeFloat_co,
+    axes: int | Tuple[_ShapeLike, _ShapeLike] = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def tensordot(
+    a: _ArrayLikeComplex_co,
+    b: _ArrayLikeComplex_co,
+    axes: int | Tuple[_ShapeLike, _ShapeLike] = ...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def tensordot(
+    a: _ArrayLikeTD64_co,
+    b: _ArrayLikeTD64_co,
+    axes: int | Tuple[_ShapeLike, _ShapeLike] = ...,
+) -> NDArray[timedelta64]: ...
+@overload
+def tensordot(
+    a: _ArrayLikeObject_co,
+    b: _ArrayLikeObject_co,
+    axes: int | Tuple[_ShapeLike, _ShapeLike] = ...,
+) -> NDArray[object_]: ...
 
+@overload
+def roll(
+    a: _ArrayLike[_SCT],
+    shift: _ShapeLike,
+    axis: None | _ShapeLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
 def roll(
     a: ArrayLike,
     shift: _ShapeLike,
-    axis: Optional[_ShapeLike] = ...,
-) -> ndarray: ...
+    axis: None | _ShapeLike = ...,
+) -> NDArray[Any]: ...
 
-def rollaxis(a: ndarray, axis: int, start: int = ...) -> ndarray: ...
+def rollaxis(
+    a: NDArray[_SCT],
+    axis: int,
+    start: int = ...,
+) -> NDArray[_SCT]: ...
 
 def moveaxis(
-    a: ndarray,
+    a: NDArray[_SCT],
     source: _ShapeLike,
     destination: _ShapeLike,
-) -> ndarray: ...
+) -> NDArray[_SCT]: ...
 
+@overload
 def cross(
-    a: ArrayLike,
-    b: ArrayLike,
+    a: _ArrayLikeBool_co,
+    b: _ArrayLikeBool_co,
+    axisa: int = ...,
+    axisb: int = ...,
+    axisc: int = ...,
+    axis: None | int = ...,
+) -> NoReturn: ...
+@overload
+def cross(
+    a: _ArrayLikeUInt_co,
+    b: _ArrayLikeUInt_co,
+    axisa: int = ...,
+    axisb: int = ...,
+    axisc: int = ...,
+    axis: None | int = ...,
+) -> NDArray[unsignedinteger[Any]]: ...
+@overload
+def cross(
+    a: _ArrayLikeInt_co,
+    b: _ArrayLikeInt_co,
     axisa: int = ...,
     axisb: int = ...,
     axisc: int = ...,
-    axis: Optional[int] = ...,
-) -> ndarray: ...
+    axis: None | int = ...,
+) -> NDArray[signedinteger[Any]]: ...
+@overload
+def cross(
+    a: _ArrayLikeFloat_co,
+    b: _ArrayLikeFloat_co,
+    axisa: int = ...,
+    axisb: int = ...,
+    axisc: int = ...,
+    axis: None | int = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def cross(
+    a: _ArrayLikeComplex_co,
+    b: _ArrayLikeComplex_co,
+    axisa: int = ...,
+    axisb: int = ...,
+    axisc: int = ...,
+    axis: None | int = ...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def cross(
+    a: _ArrayLikeObject_co,
+    b: _ArrayLikeObject_co,
+    axisa: int = ...,
+    axisb: int = ...,
+    axisc: int = ...,
+    axis: None | int = ...,
+) -> NDArray[object_]: ...
 
 @overload
 def indices(
     dimensions: Sequence[int],
-    dtype: DTypeLike = ...,
+    dtype: Type[int] = ...,
     sparse: Literal[False] = ...,
-) -> ndarray: ...
+) -> NDArray[int_]: ...
 @overload
 def indices(
     dimensions: Sequence[int],
-    dtype: DTypeLike = ...,
+    dtype: Type[int] = ...,
     sparse: Literal[True] = ...,
-) -> Tuple[ndarray, ...]: ...
+) -> Tuple[NDArray[int_], ...]: ...
+@overload
+def indices(
+    dimensions: Sequence[int],
+    dtype: _DTypeLike[_SCT],
+    sparse: Literal[False] = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def indices(
+    dimensions: Sequence[int],
+    dtype: _DTypeLike[_SCT],
+    sparse: Literal[True],
+) -> Tuple[NDArray[_SCT], ...]: ...
+@overload
+def indices(
+    dimensions: Sequence[int],
+    dtype: DTypeLike,
+    sparse: Literal[False] = ...,
+) -> NDArray[Any]: ...
+@overload
+def indices(
+    dimensions: Sequence[int],
+    dtype: DTypeLike,
+    sparse: Literal[True],
+) -> Tuple[NDArray[Any], ...]: ...
 
 def fromfunction(
     function: Callable[..., _T],
@@ -209,18 +571,39 @@ def fromfunction(
     **kwargs: Any,
 ) -> _T: ...
 
-def isscalar(element: Any) -> bool: ...
+def isscalar(element: object) -> TypeGuard[
+    generic | bool | int | float | complex | str | bytes | memoryview
+]: ...
 
-def binary_repr(num: int, width: Optional[int] = ...) -> str: ...
+def binary_repr(num: int, width: None | int = ...) -> str: ...
 
-def base_repr(number: int, base: int = ..., padding: int = ...) -> str: ...
+def base_repr(
+    number: SupportsAbs[float],
+    base: float = ...,
+    padding: SupportsIndex = ...,
+) -> str: ...
 
+@overload
 def identity(
     n: int,
-    dtype: DTypeLike = ...,
+    dtype: None = ...,
     *,
     like: ArrayLike = ...,
-) -> ndarray: ...
+) -> NDArray[float64]: ...
+@overload
+def identity(
+    n: int,
+    dtype: _DTypeLike[_SCT],
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def identity(
+    n: int,
+    dtype: DTypeLike,
+    *,
+    like: ArrayLike = ...,
+) -> NDArray[Any]: ...
 
 def allclose(
     a: ArrayLike,
@@ -230,13 +613,22 @@ def allclose(
     equal_nan: bool = ...,
 ) -> bool: ...
 
+@overload
+def isclose(
+    a: _ScalarLike_co,
+    b: _ScalarLike_co,
+    rtol: float = ...,
+    atol: float = ...,
+    equal_nan: bool = ...,
+) -> bool_: ...
+@overload
 def isclose(
     a: ArrayLike,
     b: ArrayLike,
     rtol: float = ...,
     atol: float = ...,
     equal_nan: bool = ...,
-) -> Any: ...
+) -> NDArray[bool_]: ...
 
 def array_equal(a1: ArrayLike, a2: ArrayLike, equal_nan: bool = ...) -> bool: ...
 
index 12f424fd4167ddee54955814f7e7d5628ca5cb8a..8e5de852bcff88cad299af61a3b9e6d85f787d9f 100644 (file)
@@ -80,12 +80,10 @@ Exported symbols include:
 
 """
 import numbers
-import warnings
 
 from numpy.core.multiarray import (
-        typeinfo, ndarray, array, empty, dtype, datetime_data,
-        datetime_as_string, busday_offset, busday_count, is_busday,
-        busdaycalendar
+        ndarray, array, dtype, datetime_data, datetime_as_string,
+        busday_offset, busday_count, is_busday, busdaycalendar
         )
 from numpy.core.overrides import set_module
 
index fd4aa3fdada3ac04045dfb88c86848fc4208a6f3..1d3ff773bbd71166a8d37566113684f37c94efc1 100644 (file)
@@ -1,16 +1,18 @@
 import sys
+import types
 from typing import (
-    TypeVar,
-    Optional,
+    Literal as L,
     Type,
     Union,
     Tuple,
-    Sequence,
     overload,
     Any,
     TypeVar,
     Dict,
     List,
+    Iterable,
+    Protocol,
+    TypedDict,
 )
 
 from numpy import (
@@ -48,15 +50,17 @@ from numpy.core._type_aliases import (
     sctypes as sctypes,
 )
 
-from numpy.typing import DTypeLike, ArrayLike
-
-if sys.version_info >= (3, 8):
-    from typing import Literal, Protocol, TypedDict
-else:
-    from typing_extensions import Literal, Protocol, TypedDict
+from numpy.typing import DTypeLike, ArrayLike, _SupportsDType
 
 _T = TypeVar("_T")
-_ScalarType = TypeVar("_ScalarType", bound=generic)
+_SCT = TypeVar("_SCT", bound=generic)
+
+# A paramtrizable subset of `npt.DTypeLike`
+_DTypeLike = Union[
+    Type[_SCT],
+    dtype[_SCT],
+    _SupportsDType[dtype[_SCT]],
+]
 
 class _CastFunc(Protocol):
     def __call__(
@@ -64,42 +68,71 @@ class _CastFunc(Protocol):
     ) -> ndarray[Any, dtype[Any]]: ...
 
 class _TypeCodes(TypedDict):
-    Character: Literal['c']
-    Integer: Literal['bhilqp']
-    UnsignedInteger: Literal['BHILQP']
-    Float: Literal['efdg']
-    Complex: Literal['FDG']
-    AllInteger: Literal['bBhHiIlLqQpP']
-    AllFloat: Literal['efdgFDG']
-    Datetime: Literal['Mm']
-    All: Literal['?bhilqpBHILQPefdgFDGSUVOMm']
+    Character: L['c']
+    Integer: L['bhilqp']
+    UnsignedInteger: L['BHILQP']
+    Float: L['efdg']
+    Complex: L['FDG']
+    AllInteger: L['bBhHiIlLqQpP']
+    AllFloat: L['efdgFDG']
+    Datetime: L['Mm']
+    All: L['?bhilqpBHILQPefdgFDGSUVOMm']
 
 class _typedict(Dict[Type[generic], _T]):
     def __getitem__(self, key: DTypeLike) -> _T: ...
 
+if sys.version_info >= (3, 10):
+    _TypeTuple = Union[
+        Type[Any],
+        types.UnionType,
+        Tuple[Union[Type[Any], types.UnionType, Tuple[Any, ...]], ...],
+    ]
+else:
+    _TypeTuple = Union[
+        Type[Any],
+        Tuple[Union[Type[Any], Tuple[Any, ...]], ...],
+    ]
+
 __all__: List[str]
 
-# TODO: Clean up the annotations for the 7 functions below
+@overload
+def maximum_sctype(t: _DTypeLike[_SCT]) -> Type[_SCT]: ...
+@overload
+def maximum_sctype(t: DTypeLike) -> Type[Any]: ...
+
+@overload
+def issctype(rep: dtype[Any] | Type[Any]) -> bool: ...
+@overload
+def issctype(rep: object) -> L[False]: ...
 
-def maximum_sctype(t: DTypeLike) -> dtype: ...
-def issctype(rep: object) -> bool: ...
 @overload
-def obj2sctype(rep: object) -> Optional[generic]: ...
+def obj2sctype(rep: _DTypeLike[_SCT], default: None = ...) -> None | Type[_SCT]: ...
+@overload
+def obj2sctype(rep: _DTypeLike[_SCT], default: _T) -> _T | Type[_SCT]: ...
+@overload
+def obj2sctype(rep: DTypeLike, default: None = ...) -> None | Type[Any]: ...
 @overload
-def obj2sctype(rep: object, default: None) -> Optional[generic]: ...
+def obj2sctype(rep: DTypeLike, default: _T) -> _T | Type[Any]: ...
+@overload
+def obj2sctype(rep: object, default: None = ...) -> None: ...
+@overload
+def obj2sctype(rep: object, default: _T) -> _T: ...
+
 @overload
-def obj2sctype(
-    rep: object, default: Type[_T]
-) -> Union[generic, Type[_T]]: ...
-def issubclass_(arg1: object, arg2: Union[object, Tuple[object, ...]]) -> bool: ...
-def issubsctype(
-    arg1: Union[ndarray, DTypeLike], arg2: Union[ndarray, DTypeLike]
-) -> bool: ...
+def issubclass_(arg1: Type[Any], arg2: _TypeTuple) -> bool: ...
+@overload
+def issubclass_(arg1: object, arg2: object) -> L[False]: ...
+
+def issubsctype(arg1: DTypeLike, arg2: DTypeLike) -> bool: ...
+
 def issubdtype(arg1: DTypeLike, arg2: DTypeLike) -> bool: ...
-def sctype2char(sctype: object) -> str: ...
+
+def sctype2char(sctype: DTypeLike) -> str: ...
+
 def find_common_type(
-    array_types: Sequence[DTypeLike], scalar_types: Sequence[DTypeLike]
-) -> dtype: ...
+    array_types: Iterable[DTypeLike],
+    scalar_types: Iterable[DTypeLike],
+) -> dtype[Any]: ...
 
 cast: _typedict[_CastFunc]
 nbytes: _typedict[int]
index 70085d896fe71b1d6213fa043524fd76890a0f88..840cf38c9ccbb55701eb6c97de0078d623062279 100644 (file)
@@ -2,7 +2,6 @@
 import collections
 import functools
 import os
-import textwrap
 
 from numpy.core._multiarray_umath import (
     add_docstring, implement_array_function, _get_implementing_args)
@@ -126,18 +125,6 @@ def set_module(module):
     return decorator
 
 
-
-# Call textwrap.dedent here instead of in the function so as to avoid
-# calling dedent multiple times on the same text
-_wrapped_func_source = textwrap.dedent("""
-    @functools.wraps(implementation)
-    def {name}(*args, **kwargs):
-        relevant_args = dispatcher(*args, **kwargs)
-        return implement_array_function(
-            implementation, {name}, relevant_args, args, kwargs)
-    """)
-
-
 def array_function_dispatch(dispatcher, module=None, verify=True,
                             docs_from_dispatcher=False):
     """Decorator for adding dispatch with the __array_function__ protocol.
@@ -187,25 +174,15 @@ def array_function_dispatch(dispatcher, module=None, verify=True,
         if docs_from_dispatcher:
             add_docstring(implementation, dispatcher.__doc__)
 
-        # Equivalently, we could define this function directly instead of using
-        # exec. This version has the advantage of giving the helper function a
-        # more interpettable name. Otherwise, the original function does not
-        # show up at all in many cases, e.g., if it's written in C or if the
-        # dispatcher gets an invalid keyword argument.
-        source = _wrapped_func_source.format(name=implementation.__name__)
-
-        source_object = compile(
-            source, filename='<__array_function__ internals>', mode='exec')
-        scope = {
-            'implementation': implementation,
-            'dispatcher': dispatcher,
-            'functools': functools,
-            'implement_array_function': implement_array_function,
-        }
-        exec(source_object, scope)
-
-        public_api = scope[implementation.__name__]
+        @functools.wraps(implementation)
+        def public_api(*args, **kwargs):
+            relevant_args = dispatcher(*args, **kwargs)
+            return implement_array_function(
+                implementation, public_api, relevant_args, args, kwargs)
 
+        public_api.__code__ = public_api.__code__.replace(
+                co_name=implementation.__name__,
+                co_filename='<__array_function__ internals>')
         if module is not None:
             public_api.__module__ = module
 
index 5bd13a698739a7de35747753d8b5f6adedb87b70..c014bc97cda82490e02dd27af1aab85fa747be22 100644 (file)
@@ -33,7 +33,6 @@ Record arrays allow us to access fields as properties::
   array([2., 2.])
 
 """
-import os
 import warnings
 from collections import Counter
 from contextlib import nullcontext
@@ -42,7 +41,7 @@ from . import numeric as sb
 from . import numerictypes as nt
 from numpy.compat import os_fspath
 from numpy.core.overrides import set_module
-from .arrayprint import get_printoptions
+from .arrayprint import _get_legacy_print_mode
 
 # All of the functions allow formats to be a dtype
 __all__ = [
@@ -69,7 +68,7 @@ _byteorderconv = {'b':'>',
                   'i':'|'}
 
 # formats regular expression
-# allows multidimension spec with a tuple syntax in front
+# allows multidimensional spec with a tuple syntax in front
 # of the letter code '(2,3)f4' and ' (  2 ,  3  )  f4  '
 # are equally allowed
 
@@ -231,12 +230,12 @@ class record(nt.void):
     __module__ = 'numpy'
 
     def __repr__(self):
-        if get_printoptions()['legacy'] == '1.13':
+        if _get_legacy_print_mode() <= 113:
             return self.__str__()
         return super().__repr__()
 
     def __str__(self):
-        if get_printoptions()['legacy'] == '1.13':
+        if _get_legacy_print_mode() <= 113:
             return str(self.item())
         return super().__str__()
 
@@ -552,7 +551,7 @@ class recarray(ndarray):
             lst = "[], shape=%s" % (repr(self.shape),)
 
         lf = '\n'+' '*len(prefix)
-        if get_printoptions()['legacy'] == '1.13':
+        if _get_legacy_print_mode() <= 113:
             lf = ' ' + lf  # trailing space
         return fmt % (lst, lf, repr_dtype)
 
@@ -586,6 +585,7 @@ def _deprecate_shape_0_as_None(shape):
         return shape
 
 
+@set_module("numpy.rec")
 def fromarrays(arrayList, dtype=None, shape=None, formats=None,
                names=None, titles=None, aligned=False, byteorder=None):
     """Create a record array from a (flat) list of arrays
@@ -665,20 +665,22 @@ def fromarrays(arrayList, dtype=None, shape=None, formats=None,
     if nn > 0:
         shape = shape[:-nn]
 
+    _array = recarray(shape, descr)
+
+    # populate the record array (makes a copy)
     for k, obj in enumerate(arrayList):
         nn = descr[k].ndim
         testshape = obj.shape[:obj.ndim - nn]
+        name = _names[k]
         if testshape != shape:
-            raise ValueError("array-shape mismatch in array %d" % k)
+            raise ValueError(f'array-shape mismatch in array {k} ("{name}")')
 
-    _array = recarray(shape, descr)
-
-    # populate the record array (makes a copy)
-    for i in range(len(arrayList)):
-        _array[_names[i]] = arrayList[i]
+        _array[name] = obj
 
     return _array
 
+
+@set_module("numpy.rec")
 def fromrecords(recList, dtype=None, shape=None, formats=None, names=None,
                 titles=None, aligned=False, byteorder=None):
     """Create a recarray from a list of records in text form.
@@ -763,6 +765,7 @@ def fromrecords(recList, dtype=None, shape=None, formats=None, names=None,
     return res
 
 
+@set_module("numpy.rec")
 def fromstring(datastring, dtype=None, shape=None, offset=0, formats=None,
                names=None, titles=None, aligned=False, byteorder=None):
     r"""Create a record array from binary data
@@ -845,6 +848,8 @@ def get_remaining_size(fd):
     finally:
         fd.seek(pos, 0)
 
+
+@set_module("numpy.rec")
 def fromfile(fd, dtype=None, shape=None, offset=0, formats=None,
              names=None, titles=None, aligned=False, byteorder=None):
     """Create an array from binary file data
@@ -940,10 +945,12 @@ def fromfile(fd, dtype=None, shape=None, offset=0, formats=None,
         _array = recarray(shape, descr)
         nbytesread = fd.readinto(_array.data)
         if nbytesread != nbytes:
-            raise IOError("Didn't read as many bytes as expected")
+            raise OSError("Didn't read as many bytes as expected")
 
     return _array
 
+
+@set_module("numpy.rec")
 def array(obj, dtype=None, shape=None, offset=0, strides=None, formats=None,
           names=None, titles=None, aligned=False, byteorder=None, copy=True):
     """
diff --git a/numpy/core/records.pyi b/numpy/core/records.pyi
new file mode 100644 (file)
index 0000000..172bab3
--- /dev/null
@@ -0,0 +1,237 @@
+import os
+from typing import (
+    List,
+    Sequence,
+    Any,
+    TypeVar,
+    Iterable,
+    overload,
+    Tuple,
+    Protocol,
+)
+
+from numpy import (
+    format_parser as format_parser,
+    record as record,
+    recarray as recarray,
+    dtype,
+    generic,
+    void,
+    _ByteOrder,
+    _SupportsBuffer,
+)
+
+from numpy.typing import (
+    ArrayLike,
+    DTypeLike,
+    NDArray,
+    _ShapeLike,
+    _ArrayLikeVoid_co,
+    _NestedSequence,
+)
+
+_SCT = TypeVar("_SCT", bound=generic)
+
+_RecArray = recarray[Any, dtype[_SCT]]
+
+class _SupportsReadInto(Protocol):
+    def seek(self, offset: int, whence: int, /) -> object: ...
+    def tell(self, /) -> int: ...
+    def readinto(self, buffer: memoryview, /) -> int: ...
+
+__all__: List[str]
+
+@overload
+def fromarrays(
+    arrayList: Iterable[ArrayLike],
+    dtype: DTypeLike = ...,
+    shape: None | _ShapeLike = ...,
+    formats: None = ...,
+    names: None = ...,
+    titles: None = ...,
+    aligned: bool = ...,
+    byteorder: None = ...,
+) -> _RecArray[Any]: ...
+@overload
+def fromarrays(
+    arrayList: Iterable[ArrayLike],
+    dtype: None = ...,
+    shape: None | _ShapeLike = ...,
+    *,
+    formats: DTypeLike,
+    names: None | str | Sequence[str] = ...,
+    titles: None | str | Sequence[str] = ...,
+    aligned: bool = ...,
+    byteorder: None | _ByteOrder = ...,
+) -> _RecArray[record]: ...
+
+@overload
+def fromrecords(
+    recList: _ArrayLikeVoid_co | Tuple[Any, ...] | _NestedSequence[Tuple[Any, ...]],
+    dtype: DTypeLike = ...,
+    shape: None | _ShapeLike = ...,
+    formats: None = ...,
+    names: None = ...,
+    titles: None = ...,
+    aligned: bool = ...,
+    byteorder: None = ...,
+) -> _RecArray[record]: ...
+@overload
+def fromrecords(
+    recList: _ArrayLikeVoid_co | Tuple[Any, ...] | _NestedSequence[Tuple[Any, ...]],
+    dtype: None = ...,
+    shape: None | _ShapeLike = ...,
+    *,
+    formats: DTypeLike,
+    names: None | str | Sequence[str] = ...,
+    titles: None | str | Sequence[str] = ...,
+    aligned: bool = ...,
+    byteorder: None | _ByteOrder = ...,
+) -> _RecArray[record]: ...
+
+@overload
+def fromstring(
+    datastring: _SupportsBuffer,
+    dtype: DTypeLike,
+    shape: None | _ShapeLike = ...,
+    offset: int = ...,
+    formats: None = ...,
+    names: None = ...,
+    titles: None = ...,
+    aligned: bool = ...,
+    byteorder: None = ...,
+) -> _RecArray[record]: ...
+@overload
+def fromstring(
+    datastring: _SupportsBuffer,
+    dtype: None = ...,
+    shape: None | _ShapeLike = ...,
+    offset: int = ...,
+    *,
+    formats: DTypeLike,
+    names: None | str | Sequence[str] = ...,
+    titles: None | str | Sequence[str] = ...,
+    aligned: bool = ...,
+    byteorder: None | _ByteOrder = ...,
+) -> _RecArray[record]: ...
+
+@overload
+def fromfile(
+    fd: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _SupportsReadInto,
+    dtype: DTypeLike,
+    shape: None | _ShapeLike = ...,
+    offset: int = ...,
+    formats: None = ...,
+    names: None = ...,
+    titles: None = ...,
+    aligned: bool = ...,
+    byteorder: None = ...,
+) -> _RecArray[Any]: ...
+@overload
+def fromfile(
+    fd: str | bytes | os.PathLike[str] | os.PathLike[bytes] | _SupportsReadInto,
+    dtype: None = ...,
+    shape: None | _ShapeLike = ...,
+    offset: int = ...,
+    *,
+    formats: DTypeLike,
+    names: None | str | Sequence[str] = ...,
+    titles: None | str | Sequence[str] = ...,
+    aligned: bool = ...,
+    byteorder: None | _ByteOrder = ...,
+) -> _RecArray[record]: ...
+
+@overload
+def array(
+    obj: _SCT | NDArray[_SCT],
+    dtype: None = ...,
+    shape: None | _ShapeLike = ...,
+    offset: int = ...,
+    formats: None = ...,
+    names: None = ...,
+    titles: None = ...,
+    aligned: bool = ...,
+    byteorder: None = ...,
+    copy: bool = ...,
+) -> _RecArray[_SCT]: ...
+@overload
+def array(
+    obj: ArrayLike,
+    dtype: DTypeLike,
+    shape: None | _ShapeLike = ...,
+    offset: int = ...,
+    formats: None = ...,
+    names: None = ...,
+    titles: None = ...,
+    aligned: bool = ...,
+    byteorder: None = ...,
+    copy: bool = ...,
+) -> _RecArray[Any]: ...
+@overload
+def array(
+    obj: ArrayLike,
+    dtype: None = ...,
+    shape: None | _ShapeLike = ...,
+    offset: int = ...,
+    *,
+    formats: DTypeLike,
+    names: None | str | Sequence[str] = ...,
+    titles: None | str | Sequence[str] = ...,
+    aligned: bool = ...,
+    byteorder: None | _ByteOrder = ...,
+    copy: bool = ...,
+) -> _RecArray[record]: ...
+@overload
+def array(
+    obj: None,
+    dtype: DTypeLike,
+    shape: _ShapeLike,
+    offset: int = ...,
+    formats: None = ...,
+    names: None = ...,
+    titles: None = ...,
+    aligned: bool = ...,
+    byteorder: None = ...,
+    copy: bool = ...,
+) -> _RecArray[Any]: ...
+@overload
+def array(
+    obj: None,
+    dtype: None = ...,
+    *,
+    shape: _ShapeLike,
+    offset: int = ...,
+    formats: DTypeLike,
+    names: None | str | Sequence[str] = ...,
+    titles: None | str | Sequence[str] = ...,
+    aligned: bool = ...,
+    byteorder: None | _ByteOrder = ...,
+    copy: bool = ...,
+) -> _RecArray[record]: ...
+@overload
+def array(
+    obj: _SupportsReadInto,
+    dtype: DTypeLike,
+    shape: None | _ShapeLike = ...,
+    offset: int = ...,
+    formats: None = ...,
+    names: None = ...,
+    titles: None = ...,
+    aligned: bool = ...,
+    byteorder: None = ...,
+    copy: bool = ...,
+) -> _RecArray[Any]: ...
+@overload
+def array(
+    obj: _SupportsReadInto,
+    dtype: None = ...,
+    shape: None | _ShapeLike = ...,
+    offset: int = ...,
+    *,
+    formats: DTypeLike,
+    names: None | str | Sequence[str] = ...,
+    titles: None | str | Sequence[str] = ...,
+    aligned: bool = ...,
+    byteorder: None | _ByteOrder = ...,
+    copy: bool = ...,
+) -> _RecArray[record]: ...
index b03e9f99005ebff02f65c69be30d96ffa28a0cb1..a5f423d8fe4f54548a4689f07c6241e9889b6eae 100644 (file)
@@ -5,6 +5,7 @@ import copy
 import warnings
 import platform
 import textwrap
+import glob
 from os.path import join
 
 from numpy.distutils import log
@@ -63,6 +64,20 @@ class CallOnceOnly:
             out = copy.deepcopy(pickle.loads(self._check_complex))
         return out
 
+def can_link_svml():
+    """SVML library is supported only on x86_64 architecture and currently
+    only on linux
+    """
+    machine = platform.machine()
+    system = platform.system()
+    return "x86_64" in machine and system == "Linux"
+
+def check_svml_submodule(svmlpath):
+    if not os.path.exists(svmlpath + "/README.md"):
+        raise RuntimeError("Missing `SVML` submodule! Run `git submodule "
+                           "update --init` to fix this.")
+    return True
+
 def pythonlib_dir():
     """return path where libpython* is."""
     if sys.platform == 'win32':
@@ -381,9 +396,9 @@ def check_mathlib(config_cmd):
             mathlibs = libs
             break
     else:
-        raise EnvironmentError("math library missing; rerun "
-                               "setup.py after setting the "
-                               "MATHLIB env variable")
+        raise RuntimeError(
+            "math library missing; rerun setup.py after setting the "
+            "MATHLIB env variable")
     return mathlibs
 
 def visibility_define(config):
@@ -455,6 +470,9 @@ def configuration(parent_package='',top_path=None):
             # Inline check
             inline = config_cmd.check_inline()
 
+            if can_link_svml():
+                moredefs.append(('NPY_CAN_LINK_SVML', 1))
+
             # Use relaxed stride checking
             if NPY_RELAXED_STRIDES_CHECKING:
                 moredefs.append(('NPY_RELAXED_STRIDES_CHECKING', 1))
@@ -496,7 +514,7 @@ def configuration(parent_package='',top_path=None):
                 # add the guard to make sure config.h is never included directly,
                 # but always through npy_config.h
                 target_f.write(textwrap.dedent("""
-                    #ifndef _NPY_NPY_CONFIG_H_
+                    #ifndef NUMPY_CORE_SRC_COMMON_NPY_CONFIG_H_
                     #error config.h should never be included directly, include npy_config.h instead
                     #endif
                     """))
@@ -654,16 +672,38 @@ def configuration(parent_package='',top_path=None):
         # but we cannot use add_installed_pkg_config here either, so we only
         # update the substitution dictionary during npymath build
         config_cmd = config.get_config_cmd()
-
         # Check that the toolchain works, to fail early if it doesn't
         # (avoid late errors with MATHLIB which are confusing if the
         # compiler does not work).
-        st = config_cmd.try_link('int main(void) { return 0;}')
-        if not st:
-            # rerun the failing command in verbose mode
-            config_cmd.compiler.verbose = True
-            config_cmd.try_link('int main(void) { return 0;}')
-            raise RuntimeError("Broken toolchain: cannot link a simple C program")
+        for lang, test_code, note in (
+            ('c', 'int main(void) { return 0;}', ''),
+            ('c++', (
+                    'int main(void)'
+                    '{ auto x = 0.0; return static_cast<int>(x); }'
+                ), (
+                    'note: A compiler with support for C++11 language '
+                    'features is required.'
+                )
+             ),
+        ):
+            is_cpp = lang == 'c++'
+            if is_cpp:
+                # this a workround to get rid of invalid c++ flags
+                # without doing big changes to config.
+                # c tested first, compiler should be here
+                bk_c = config_cmd.compiler
+                config_cmd.compiler = bk_c.cxx_compiler()
+            st = config_cmd.try_link(test_code, lang=lang)
+            if not st:
+                # rerun the failing command in verbose mode
+                config_cmd.compiler.verbose = True
+                config_cmd.try_link(test_code, lang=lang)
+                raise RuntimeError(
+                    f"Broken toolchain: cannot link a simple {lang.upper()} "
+                    f"program. {note}"
+                )
+            if is_cpp:
+                config_cmd.compiler = bk_c
         mlibs = check_mathlib(config_cmd)
 
         posix_mlib = ' '.join(['-l%s' % l for l in mlibs])
@@ -678,16 +718,24 @@ def configuration(parent_package='',top_path=None):
                        join('src', 'npymath', 'halffloat.c')
                        ]
 
-    # Must be true for CRT compilers but not MinGW/cygwin. See gh-9977.
-    # Intel and Clang also don't seem happy with /GL
-    is_msvc = (platform.platform().startswith('Windows') and
-               platform.python_compiler().startswith('MS'))
+    def gl_if_msvc(build_cmd):
+        """ Add flag if we are using MSVC compiler
+
+        We can't see this in our scope, because we have not initialized the
+        distutils build command, so use this deferred calculation to run when
+        we are building the library.
+        """
+        if build_cmd.compiler.compiler_type == 'msvc':
+            # explicitly disable whole-program optimization
+            return ['/GL-']
+        return []
+
     config.add_installed_library('npymath',
             sources=npymath_sources + [get_mathlib_info],
             install_dir='lib',
             build_info={
                 'include_dirs' : [],  # empty list required for creating npy_math_internal.h
-                'extra_compiler_args' : (['/GL-'] if is_msvc else []),
+                'extra_compiler_args': [gl_if_msvc],
             })
     config.add_npy_pkg_config("npymath.ini.in", "lib/npy-pkg-config",
             subst_dict)
@@ -701,9 +749,11 @@ def configuration(parent_package='',top_path=None):
     config.add_extension('_multiarray_tests',
                     sources=[join('src', 'multiarray', '_multiarray_tests.c.src'),
                              join('src', 'common', 'mem_overlap.c'),
-                             join('src', 'common', 'npy_argparse.c')],
+                             join('src', 'common', 'npy_argparse.c'),
+                             join('src', 'common', 'npy_hashtable.c')],
                     depends=[join('src', 'common', 'mem_overlap.h'),
                              join('src', 'common', 'npy_argparse.h'),
+                             join('src', 'common', 'npy_hashtable.h'),
                              join('src', 'common', 'npy_extint128.h')],
                     libraries=['npymath'])
 
@@ -712,6 +762,7 @@ def configuration(parent_package='',top_path=None):
     #######################################################################
 
     common_deps = [
+            join('src', 'common', 'dlpack', 'dlpack.h'),
             join('src', 'common', 'array_assign.h'),
             join('src', 'common', 'binop_override.h'),
             join('src', 'common', 'cblasfuncs.h'),
@@ -721,9 +772,12 @@ def configuration(parent_package='',top_path=None):
             join('src', 'common', 'npy_cblas.h'),
             join('src', 'common', 'npy_config.h'),
             join('src', 'common', 'npy_ctypes.h'),
+            join('src', 'common', 'npy_dlpack.h'),
             join('src', 'common', 'npy_extint128.h'),
             join('src', 'common', 'npy_import.h'),
+            join('src', 'common', 'npy_hashtable.h'),
             join('src', 'common', 'npy_longdouble.h'),
+            join('src', 'common', 'npy_svml.h'),
             join('src', 'common', 'templ_common.h.src'),
             join('src', 'common', 'ucsnarrow.h'),
             join('src', 'common', 'ufunc_override.h'),
@@ -737,6 +791,7 @@ def configuration(parent_package='',top_path=None):
             join('src', 'common', 'array_assign.c'),
             join('src', 'common', 'mem_overlap.c'),
             join('src', 'common', 'npy_argparse.c'),
+            join('src', 'common', 'npy_hashtable.c'),
             join('src', 'common', 'npy_longdouble.c'),
             join('src', 'common', 'templ_common.h.src'),
             join('src', 'common', 'ucsnarrow.c'),
@@ -787,6 +842,7 @@ def configuration(parent_package='',top_path=None):
             join('src', 'multiarray', 'dragon4.h'),
             join('src', 'multiarray', 'einsum_debug.h'),
             join('src', 'multiarray', 'einsum_sumprod.h'),
+            join('src', 'multiarray', 'experimental_public_dtype_api.h'),
             join('src', 'multiarray', 'getset.h'),
             join('src', 'multiarray', 'hashdescr.h'),
             join('src', 'multiarray', 'iterators.h'),
@@ -849,11 +905,13 @@ def configuration(parent_package='',top_path=None):
             join('src', 'multiarray', 'datetime_busday.c'),
             join('src', 'multiarray', 'datetime_busdaycal.c'),
             join('src', 'multiarray', 'descriptor.c'),
+            join('src', 'multiarray', 'dlpack.c'),
             join('src', 'multiarray', 'dtypemeta.c'),
             join('src', 'multiarray', 'dragon4.c'),
             join('src', 'multiarray', 'dtype_transfer.c'),
             join('src', 'multiarray', 'einsum.c.src'),
             join('src', 'multiarray', 'einsum_sumprod.c.src'),
+            join('src', 'multiarray', 'experimental_public_dtype_api.c'),
             join('src', 'multiarray', 'flagsobject.c'),
             join('src', 'multiarray', 'getset.c'),
             join('src', 'multiarray', 'hashdescr.c'),
@@ -884,7 +942,7 @@ def configuration(parent_package='',top_path=None):
             join('src', 'npysort', 'mergesort.c.src'),
             join('src', 'npysort', 'timsort.c.src'),
             join('src', 'npysort', 'heapsort.c.src'),
-            join('src', 'npysort', 'radixsort.c.src'),
+            join('src', 'npysort', 'radixsort.cpp'),
             join('src', 'common', 'npy_partition.h.src'),
             join('src', 'npysort', 'selection.c.src'),
             join('src', 'common', 'npy_binsearch.h.src'),
@@ -919,16 +977,21 @@ def configuration(parent_package='',top_path=None):
             join('src', 'umath', 'loops_arithm_fp.dispatch.c.src'),
             join('src', 'umath', 'loops_arithmetic.dispatch.c.src'),
             join('src', 'umath', 'loops_trigonometric.dispatch.c.src'),
+            join('src', 'umath', 'loops_umath_fp.dispatch.c.src'),
             join('src', 'umath', 'loops_exponent_log.dispatch.c.src'),
             join('src', 'umath', 'matmul.h.src'),
             join('src', 'umath', 'matmul.c.src'),
-            join('src', 'umath', 'clip.h.src'),
-            join('src', 'umath', 'clip.c.src'),
+            join('src', 'umath', 'clip.h'),
+            join('src', 'umath', 'clip.cpp'),
+            join('src', 'umath', 'dispatching.c'),
+            join('src', 'umath', 'legacy_array_method.c'),
             join('src', 'umath', 'ufunc_object.c'),
             join('src', 'umath', 'extobj.c'),
             join('src', 'umath', 'scalarmath.c.src'),
             join('src', 'umath', 'ufunc_type_resolution.c'),
             join('src', 'umath', 'override.c'),
+            # For testing. Eventually, should use public API and be separate:
+            join('src', 'umath', '_scaled_float_dtype.c'),
             ]
 
     umath_deps = [
@@ -943,7 +1006,15 @@ def configuration(parent_package='',top_path=None):
             join(codegen_dir, 'generate_ufunc_api.py'),
             ]
 
+    svml_path = join('numpy', 'core', 'src', 'umath', 'svml')
+    svml_objs = []
+    if can_link_svml() and check_svml_submodule(svml_path):
+        svml_objs = glob.glob(svml_path + '/**/*.s', recursive=True)
+
     config.add_extension('_multiarray_umath',
+                         # Forcing C language even though we have C++ sources.
+                         # It forces the C linker and don't link C++ runtime.
+                         language = 'c',
                          sources=multiarray_src + umath_src +
                                  common_src +
                                  [generate_config_h,
@@ -957,7 +1028,12 @@ def configuration(parent_package='',top_path=None):
                          depends=deps + multiarray_deps + umath_deps +
                                 common_deps,
                          libraries=['npymath'],
-                         extra_info=extra_info)
+                         extra_objects=svml_objs,
+                         extra_info=extra_info,
+                         extra_cxx_compile_args=['-std=c++11',
+                                                 '-D__STDC_VERSION__=0',
+                                                 '-fno-exceptions',
+                                                 '-fno-rtti'])
 
     #######################################################################
     #                        umath_tests module                           #
index a700610d3dec29fa459861eb39ce4ec7da025b12..70e8fc89705add792e19fde1e83a3cba5b01cd75 100644 (file)
@@ -43,7 +43,8 @@ C_ABI_VERSION = 0x01000009
 # 0x0000000d - 1.19.x
 # 0x0000000e - 1.20.x
 # 0x0000000e - 1.21.x
-C_API_VERSION = 0x0000000e
+# 0x0000000f - 1.22.x
+C_API_VERSION = 0x0000000f
 
 class MismatchCAPIWarning(Warning):
     pass
index ec40a88143b14f1be31e0332314c4655ace00558..159ad2781c05f920327ccc755982d43ecb4221e0 100644 (file)
@@ -1,39 +1,66 @@
-import sys
-from typing import TypeVar, overload, List, Sequence
+from typing import TypeVar, overload, List, Sequence, Any, SupportsIndex
 
-from numpy import ndarray
-from numpy.typing import ArrayLike
+from numpy import generic, dtype
+from numpy.typing import ArrayLike, NDArray, _FiniteNestedSequence, _SupportsArray
 
-if sys.version_info >= (3, 8):
-    from typing import SupportsIndex
-else:
-    from typing_extensions import SupportsIndex
+_SCT = TypeVar("_SCT", bound=generic)
+_ArrayType = TypeVar("_ArrayType", bound=NDArray[Any])
 
-_ArrayType = TypeVar("_ArrayType", bound=ndarray)
+_ArrayLike = _FiniteNestedSequence[_SupportsArray[dtype[_SCT]]]
 
+__all__: List[str]
+
+@overload
+def atleast_1d(arys: _ArrayLike[_SCT], /) -> NDArray[_SCT]: ...
+@overload
+def atleast_1d(arys: ArrayLike, /) -> NDArray[Any]: ...
+@overload
+def atleast_1d(*arys: ArrayLike) -> List[NDArray[Any]]: ...
+
+@overload
+def atleast_2d(arys: _ArrayLike[_SCT], /) -> NDArray[_SCT]: ...
 @overload
-def atleast_1d(__arys: ArrayLike) -> ndarray: ...
+def atleast_2d(arys: ArrayLike, /) -> NDArray[Any]: ...
 @overload
-def atleast_1d(*arys: ArrayLike) -> List[ndarray]: ...
+def atleast_2d(*arys: ArrayLike) -> List[NDArray[Any]]: ...
 
 @overload
-def atleast_2d(__arys: ArrayLike) -> ndarray: ...
+def atleast_3d(arys: _ArrayLike[_SCT], /) -> NDArray[_SCT]: ...
 @overload
-def atleast_2d(*arys: ArrayLike) -> List[ndarray]: ...
+def atleast_3d(arys: ArrayLike, /) -> NDArray[Any]: ...
+@overload
+def atleast_3d(*arys: ArrayLike) -> List[NDArray[Any]]: ...
 
 @overload
-def atleast_3d(__arys: ArrayLike) -> ndarray: ...
+def vstack(tup: Sequence[_ArrayLike[_SCT]]) -> NDArray[_SCT]: ...
 @overload
-def atleast_3d(*arys: ArrayLike) -> List[ndarray]: ...
+def vstack(tup: Sequence[ArrayLike]) -> NDArray[Any]: ...
 
-def vstack(tup: Sequence[ArrayLike]) -> ndarray: ...
-def hstack(tup: Sequence[ArrayLike]) -> ndarray: ...
+@overload
+def hstack(tup: Sequence[_ArrayLike[_SCT]]) -> NDArray[_SCT]: ...
+@overload
+def hstack(tup: Sequence[ArrayLike]) -> NDArray[Any]: ...
+
+@overload
+def stack(
+    arrays: Sequence[_ArrayLike[_SCT]],
+    axis: SupportsIndex = ...,
+    out: None = ...,
+) -> NDArray[_SCT]: ...
 @overload
 def stack(
-    arrays: Sequence[ArrayLike], axis: SupportsIndex = ..., out: None = ...
-) -> ndarray: ...
+    arrays: Sequence[ArrayLike],
+    axis: SupportsIndex = ...,
+    out: None = ...,
+) -> NDArray[Any]: ...
 @overload
 def stack(
-    arrays: Sequence[ArrayLike], axis: SupportsIndex = ..., out: _ArrayType = ...
+    arrays: Sequence[ArrayLike],
+    axis: SupportsIndex = ...,
+    out: _ArrayType = ...,
 ) -> _ArrayType: ...
-def block(arrays: ArrayLike) -> ndarray: ...
+
+@overload
+def block(arrays: _ArrayLike[_SCT]) -> NDArray[_SCT]: ...
+@overload
+def block(arrays: ArrayLike) -> NDArray[Any]: ...
index 54770959c3626ddfa43231dd45a9298de46cd70a..84de9a059fc8b8023a3246746269149b8edfb71e 100644 (file)
@@ -381,7 +381,7 @@ SIMD_IMPL_INTRIN_1(sumup_@sfx@, @esfx@, v@sfx@)
  ***************************/
 #if @fp_only@
 /**begin repeat1
- * #intrin = sqrt, recip, abs, square#
+ * #intrin = sqrt, recip, abs, square, ceil, trunc#
  */
 SIMD_IMPL_INTRIN_1(@intrin@_@sfx@, v@sfx@, v@sfx@)
 /**end repeat1**/
@@ -615,7 +615,7 @@ SIMD_INTRIN_DEF(sumup_@sfx@)
  ***************************/
 #if @fp_only@
 /**begin repeat1
- * #intrin = sqrt, recip, abs, square#
+ * #intrin = sqrt, recip, abs, square, ceil, trunc#
  */
 SIMD_INTRIN_DEF(@intrin@_@sfx@)
 /**end repeat1**/
index 73869ef1f7bba6b43cdc7f29f1a0a20478443002..46e044479a5678ecac3c453b0c9847ba1ff9a847 100644 (file)
@@ -94,6 +94,7 @@ simd_sequence_from_iterable(PyObject *obj, simd_data_type dtype, Py_ssize_t min_
             "minimum acceptable size of the required sequence is %d, given(%d)",
             min_size, seq_size
         );
+        Py_DECREF(seq_obj);
         return NULL;
     }
     npyv_lanetype_u8 *dst = simd_sequence_new(seq_size, dtype);
index 9858fc0dc624b0fe9a8bb10392f0bdb8a1f6e420..fbdf982c29841f3e07d2e1cc16cfacf34716ccad 100644 (file)
@@ -113,7 +113,7 @@ typedef struct
     int is_scalar:1;
     // returns '1' if the type represent a vector
     int is_vector:1;
-    // returns the len of multi-vector if the type reprsent x2 or x3 vector
+    // returns the len of multi-vector if the type represent x2 or x3 vector
     // otherwise returns 0, e.g. returns 2 if data type is simd_data_vu8x2
     int is_vectorx;
     // returns the equivalent scalar data type e.g. simd_data_vu8 -> simd_data_u8
index d4b6310fde04df342a7db712e615a1511ace0399..3d0c1537507445622efbbe2d3d37344b69ba2f0e 100644 (file)
@@ -33,7 +33,7 @@ static PySequenceMethods simd__vector_as_sequence = {
 };
 
 static PyObject *
-simd__vector_name(PySIMDVectorObject *self)
+simd__vector_name(PySIMDVectorObject *self, void *NPY_UNUSED(ignored))
 {
     return PyUnicode_FromString(simd_data_getinfo(self->dtype)->pyname);
 }
diff --git a/numpy/core/src/common/.doxyfile b/numpy/core/src/common/.doxyfile
new file mode 100644 (file)
index 0000000..462cbbc
--- /dev/null
@@ -0,0 +1 @@
+INCLUDE_PATH += @CUR_DIR
index c55f6bdb4624ae00a90708639ac7b6f873a3bb75..b7495fc0993057564ff9af520578d2d3d5aba2fe 100644 (file)
@@ -7,12 +7,12 @@
  *
  * See LICENSE.txt for the license.
  */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include <numpy/ndarraytypes.h>
 #include "npy_config.h"
 #include "npy_pycompat.h"
index f5d884dd9981d7f2eb6b6db196dd90071447d99a..8a28ed1d3a01308405e7bc9f39b548d9baf83d44 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_PRIVATE__ARRAY_ASSIGN_H_
-#define _NPY_PRIVATE__ARRAY_ASSIGN_H_
+#ifndef NUMPY_CORE_SRC_COMMON_ARRAY_ASSIGN_H_
+#define NUMPY_CORE_SRC_COMMON_ARRAY_ASSIGN_H_
 
 /*
  * An array assignment function for copying arrays, treating the
@@ -115,4 +115,4 @@ NPY_NO_EXPORT int
 arrays_overlap(PyArrayObject *arr1, PyArrayObject *arr2);
 
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_ARRAY_ASSIGN_H_ */
index c5e7ab808f54771e756b627521c5504843874305..61bc05ef37197864d04f0b19c56aa5e8ea8b8f35 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __BINOP_OVERRIDE_H
-#define __BINOP_OVERRIDE_H
+#ifndef NUMPY_CORE_SRC_COMMON_BINOP_OVERRIDE_H_
+#define NUMPY_CORE_SRC_COMMON_BINOP_OVERRIDE_H_
 
 #include <string.h>
 #include <Python.h>
@@ -212,4 +212,4 @@ binop_should_defer(PyObject *self, PyObject *other, int inplace)
         }                                                               \
     } while (0)
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_BINOP_OVERRIDE_H_ */
index e78587de06d8dabdb1f4602cfedc5a200232ceab..714636782663c0a2aee889f2c02c0fa4407d583a 100644 (file)
@@ -2,17 +2,19 @@
  * This module provides a BLAS optimized matrix multiply,
  * inner product and dot for numpy arrays
  */
-
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
 
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include <assert.h>
-#include <numpy/arrayobject.h>
+
+#include "numpy/arrayobject.h"
 #include "npy_cblas.h"
 #include "arraytypes.h"
 #include "common.h"
 
+#include <assert.h>
+
 
 static const double oneD[2] = {1.0, 0.0}, zeroD[2] = {0.0, 0.0};
 static const float oneF[2] = {1.0, 0.0}, zeroF[2] = {0.0, 0.0};
index 66ce4ca5becb05f7436cd55f2866520b2caa474c..71c533f369a478f9d56e4de0c18e3dfcf07c2745 100644 (file)
@@ -1,7 +1,7 @@
-#ifndef _NPY_CBLASFUNCS_H_
-#define _NPY_CBLASFUNCS_H_
+#ifndef NUMPY_CORE_SRC_COMMON_CBLASFUNCS_H_
+#define NUMPY_CORE_SRC_COMMON_CBLASFUNCS_H_
 
 NPY_NO_EXPORT PyObject *
 cblas_matrixproduct(int, PyArrayObject *, PyArrayObject *, PyArrayObject *);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_CBLASFUNCS_H_ */
diff --git a/numpy/core/src/common/dlpack/dlpack.h b/numpy/core/src/common/dlpack/dlpack.h
new file mode 100644 (file)
index 0000000..29209ae
--- /dev/null
@@ -0,0 +1,201 @@
+// Taken from:
+// https://github.com/dmlc/dlpack/blob/9b6176fdecb55e9bf39b16f08b96913ed3f275b4/include/dlpack/dlpack.h
+/*!
+ *  Copyright (c) 2017 by Contributors
+ * \file dlpack.h
+ * \brief The common header of DLPack.
+ */
+#ifndef DLPACK_DLPACK_H_
+#define DLPACK_DLPACK_H_
+
+#ifdef __cplusplus
+#define DLPACK_EXTERN_C extern "C"
+#else
+#define DLPACK_EXTERN_C
+#endif
+
+/*! \brief The current version of dlpack */
+#define DLPACK_VERSION 050
+
+/*! \brief DLPACK_DLL prefix for windows */
+#ifdef _WIN32
+#ifdef DLPACK_EXPORTS
+#define DLPACK_DLL __declspec(dllexport)
+#else
+#define DLPACK_DLL __declspec(dllimport)
+#endif
+#else
+#define DLPACK_DLL
+#endif
+
+#include <stdint.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*!
+ * \brief The device type in DLDevice.
+ */
+typedef enum {
+  /*! \brief CPU device */
+  kDLCPU = 1,
+  /*! \brief CUDA GPU device */
+  kDLCUDA = 2,
+  /*!
+   * \brief Pinned CUDA CPU memory by cudaMallocHost
+   */
+  kDLCUDAHost = 3,
+  /*! \brief OpenCL devices. */
+  kDLOpenCL = 4,
+  /*! \brief Vulkan buffer for next generation graphics. */
+  kDLVulkan = 7,
+  /*! \brief Metal for Apple GPU. */
+  kDLMetal = 8,
+  /*! \brief Verilog simulator buffer */
+  kDLVPI = 9,
+  /*! \brief ROCm GPUs for AMD GPUs */
+  kDLROCM = 10,
+  /*!
+   * \brief Pinned ROCm CPU memory allocated by hipMallocHost
+   */
+  kDLROCMHost = 11,
+  /*!
+   * \brief Reserved extension device type,
+   * used for quickly test extension device
+   * The semantics can differ depending on the implementation.
+   */
+  kDLExtDev = 12,
+  /*!
+   * \brief CUDA managed/unified memory allocated by cudaMallocManaged
+   */
+  kDLCUDAManaged = 13,
+} DLDeviceType;
+
+/*!
+ * \brief A Device for Tensor and operator.
+ */
+typedef struct {
+  /*! \brief The device type used in the device. */
+  DLDeviceType device_type;
+  /*!
+   * \brief The device index.
+   * For vanilla CPU memory, pinned memory, or managed memory, this is set to 0.
+   */
+  int device_id;
+} DLDevice;
+
+/*!
+ * \brief The type code options DLDataType.
+ */
+typedef enum {
+  /*! \brief signed integer */
+  kDLInt = 0U,
+  /*! \brief unsigned integer */
+  kDLUInt = 1U,
+  /*! \brief IEEE floating point */
+  kDLFloat = 2U,
+  /*!
+   * \brief Opaque handle type, reserved for testing purposes.
+   * Frameworks need to agree on the handle data type for the exchange to be well-defined.
+   */
+  kDLOpaqueHandle = 3U,
+  /*! \brief bfloat16 */
+  kDLBfloat = 4U,
+  /*!
+   * \brief complex number
+   * (C/C++/Python layout: compact struct per complex number)
+   */
+  kDLComplex = 5U,
+} DLDataTypeCode;
+
+/*!
+ * \brief The data type the tensor can hold.
+ *
+ *  Examples
+ *   - float: type_code = 2, bits = 32, lanes=1
+ *   - float4(vectorized 4 float): type_code = 2, bits = 32, lanes=4
+ *   - int8: type_code = 0, bits = 8, lanes=1
+ *   - std::complex<float>: type_code = 5, bits = 64, lanes = 1
+ */
+typedef struct {
+  /*!
+   * \brief Type code of base types.
+   * We keep it uint8_t instead of DLDataTypeCode for minimal memory
+   * footprint, but the value should be one of DLDataTypeCode enum values.
+   * */
+  uint8_t code;
+  /*!
+   * \brief Number of bits, common choices are 8, 16, 32.
+   */
+  uint8_t bits;
+  /*! \brief Number of lanes in the type, used for vector types. */
+  uint16_t lanes;
+} DLDataType;
+
+/*!
+ * \brief Plain C Tensor object, does not manage memory.
+ */
+typedef struct {
+  /*!
+   * \brief The opaque data pointer points to the allocated data. This will be
+   * CUDA device pointer or cl_mem handle in OpenCL. This pointer is always
+   * aligned to 256 bytes as in CUDA.
+   *
+   * For given DLTensor, the size of memory required to store the contents of
+   * data is calculated as follows:
+   *
+   * \code{.c}
+   * static inline size_t GetDataSize(const DLTensor* t) {
+   *   size_t size = 1;
+   *   for (tvm_index_t i = 0; i < t->ndim; ++i) {
+   *     size *= t->shape[i];
+   *   }
+   *   size *= (t->dtype.bits * t->dtype.lanes + 7) / 8;
+   *   return size;
+   * }
+   * \endcode
+   */
+  void* data;
+  /*! \brief The device of the tensor */
+  DLDevice device;
+  /*! \brief Number of dimensions */
+  int ndim;
+  /*! \brief The data type of the pointer*/
+  DLDataType dtype;
+  /*! \brief The shape of the tensor */
+  int64_t* shape;
+  /*!
+   * \brief strides of the tensor (in number of elements, not bytes)
+   *  can be NULL, indicating tensor is compact and row-majored.
+   */
+  int64_t* strides;
+  /*! \brief The offset in bytes to the beginning pointer to data */
+  uint64_t byte_offset;
+} DLTensor;
+
+/*!
+ * \brief C Tensor object, manage memory of DLTensor. This data structure is
+ *  intended to facilitate the borrowing of DLTensor by another framework. It is
+ *  not meant to transfer the tensor. When the borrowing framework doesn't need
+ *  the tensor, it should call the deleter to notify the host that the resource
+ *  is no longer needed.
+ */
+typedef struct DLManagedTensor {
+  /*! \brief DLTensor which is being memory managed */
+  DLTensor dl_tensor;
+  /*! \brief the context of the original host framework of DLManagedTensor in
+   *   which DLManagedTensor is used in the framework. It can also be NULL.
+   */
+  void * manager_ctx;
+  /*! \brief Destructor signature void (*)(void*) - this should be called
+   *   to destruct manager_ctx which holds the DLManagedTensor. It can be NULL
+   *   if there is no way for the caller to provide a reasonable destructor.
+   *   The destructors deletes the argument self as well.
+   */
+  void (*deleter)(struct DLManagedTensor * self);
+} DLManagedTensor;
+#ifdef __cplusplus
+}  // DLPACK_EXTERN_C
+#endif
+#endif  // DLPACK_DLPACK_H_
index 8b7cf1c5be363585b3617b7d09571065a9c607f2..3b23b2e6619bb59c4565d36ed76d0d6935fb5f7b 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __GET_ATTR_STRING_H
-#define __GET_ATTR_STRING_H
+#ifndef NUMPY_CORE_SRC_COMMON_GET_ATTR_STRING_H_
+#define NUMPY_CORE_SRC_COMMON_GET_ATTR_STRING_H_
 
 static NPY_INLINE npy_bool
 _is_basic_python_type(PyTypeObject *tp)
@@ -113,4 +113,4 @@ PyArray_LookupSpecial_OnInstance(PyObject *obj, char const *name)
     return maybe_get_attr(obj, name);
 }
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_GET_ATTR_STRING_H_ */
index 3df054b407277f3a6f9440f09db58418ceeffd2c..ad86c04895a9e6c29f3fa80673878fed1e5a9304 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef __LOWLEVEL_STRIDED_LOOPS_H
-#define __LOWLEVEL_STRIDED_LOOPS_H
+#ifndef NUMPY_CORE_SRC_COMMON_LOWLEVEL_STRIDED_LOOPS_H_
+#define NUMPY_CORE_SRC_COMMON_LOWLEVEL_STRIDED_LOOPS_H_
 #include "common.h"
-#include <npy_config.h>
-#include <array_method.h>
+#include "npy_config.h"
+#include "array_method.h"
 #include "dtype_transfer.h"
 #include "mem_overlap.h"
 
@@ -770,4 +770,4 @@ PyArray_EQUIVALENTLY_ITERABLE_OVERLAP_OK(PyArrayObject *arr1, PyArrayObject *arr
                     stride2 = PyArray_TRIVIAL_PAIR_ITERATION_STRIDE(size2, arr2); \
                 }
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_LOWLEVEL_STRIDED_LOOPS_H_ */
index 9da33bfc1f76fac81e528ad27e104b6f3f2668ce..2632e1413f4814a443fe2db929d189449e5f1263 100644 (file)
   All rights reserved.
   Licensed under 3-clause BSD license, see LICENSE.txt.
 */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #include "numpy/ndarraytypes.h"
 #include "mem_overlap.h"
 #include "npy_extint128.h"
index 8044f1663198f9aa1e4f9a2a6978d71a6fa12ba7..3aa4f798b370d6a6440f3c60c088d4e8c6eb855c 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef MEM_OVERLAP_H_
-#define MEM_OVERLAP_H_
+#ifndef NUMPY_CORE_SRC_COMMON_MEM_OVERLAP_H_
+#define NUMPY_CORE_SRC_COMMON_MEM_OVERLAP_H_
 
 #include "npy_config.h"
 #include "numpy/ndarraytypes.h"
@@ -46,5 +46,4 @@ offset_bounds_from_strides(const int itemsize, const int nd,
                            const npy_intp *dims, const npy_intp *strides,
                            npy_intp *lower_offset, npy_intp *upper_offset);
 
-#endif
-
+#endif  /* NUMPY_CORE_SRC_COMMON_MEM_OVERLAP_H_ */
index 8460a38e6461bf3ad611070fe25e17b0e1913f94..76123c1ed8645b017b8f890073d84871f86e4894 100644 (file)
@@ -1,8 +1,9 @@
-#include "Python.h"
-
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
 
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
 #include "numpy/ndarraytypes.h"
 #include "npy_argparse.h"
 #include "npy_pycompat.h"
index 5da535c9171fa674c876cc6c37efe219629a98a9..f4122103d22b156db57e6d3716612e23f0c3c1ba 100644 (file)
@@ -1,7 +1,7 @@
-#ifndef _NPY_ARGPARSE_H
-#define _NPY_ARGPARSE_H
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_ARGPARSE_H
+#define NUMPY_CORE_SRC_COMMON_NPY_ARGPARSE_H
 
-#include "Python.h"
+#include <Python.h>
 #include "numpy/ndarraytypes.h"
 
 /*
@@ -93,4 +93,4 @@ _npy_parse_arguments(const char *funcname,
         _npy_parse_arguments(funcname, &__argparse_cache,                \
                 args, len_args, kwnames, __VA_ARGS__)
 
-#endif /* _NPY_ARGPARSE_H */
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_ARGPARSE_H */
index 072993ec2be13fc4b3b206d77ab3341066636f1f..30fec1a653d89242057abaac407d9b1906ab1db7 100644 (file)
@@ -3,8 +3,8 @@
  * because not all providers of cblas provide cblas.h. For instance, MKL provides
  * mkl_cblas.h and also typedefs the CBLAS_XXX enums.
  */
-#ifndef _NPY_CBLAS_H_
-#define _NPY_CBLAS_H_
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_CBLAS_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_CBLAS_H_
 
 #include <stddef.h>
 
@@ -98,4 +98,4 @@ blas_stride(npy_intp stride, unsigned itemsize)
 }
 #endif
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_CBLAS_H_ */
index 792b6f09ecffb9b202b680a7060240ca664814a0..12dfb2e784f9114d12c16254a33ebe391ff031e0 100644 (file)
@@ -9,6 +9,9 @@
  * Prototypes for level 1 BLAS functions (complex are recast as routines)
  * ===========================================================================
  */
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_CBLAS_BASE_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_CBLAS_BASE_H_
+
 float  BLASNAME(cblas_sdsdot)(const BLASINT N, const float alpha, const float *X,
                               const BLASINT incX, const float *Y, const BLASINT incY);
 double BLASNAME(cblas_dsdot)(const BLASINT N, const float *X, const BLASINT incX, const float *Y,
@@ -555,3 +558,5 @@ void BLASNAME(cblas_zher2k)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO
                             void *C, const BLASINT ldc);
 
 void BLASNAME(cblas_xerbla)(BLASINT p, const char *rout, const char *form, ...);
+
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_CBLAS_BASE_H_ */
index 61cc3c7f18d4e1d769877096cb83c9945a3e114c..fd0f1855c8d310dde7672414dbeb092d6ffeecc5 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_NPY_CONFIG_H_
-#define _NPY_NPY_CONFIG_H_
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_CONFIG_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_CONFIG_H_
 
 #include "config.h"
 #include "npy_cpu_features.h"
 #undef HAVE_POWL
 #endif
 
+#ifdef __CYGWIN__
+/* Loss of precision */
+#undef HAVE_CASINHL
+#undef HAVE_CASINH
+#undef HAVE_CASINHF
+
+/* Loss of precision */
+#undef HAVE_CATANHL
+#undef HAVE_CATANH
+#undef HAVE_CATANHF
+
+/* Loss of precision and branch cuts */
+#undef HAVE_CATANL
+#undef HAVE_CATAN
+#undef HAVE_CATANF
+
+/* Branch cuts */
+#undef HAVE_CACOSHF
+#undef HAVE_CACOSH
+
+/* Branch cuts */
+#undef HAVE_CSQRTF
+#undef HAVE_CSQRT
+
+/* Branch cuts and loss of precision */
+#undef HAVE_CASINF
+#undef HAVE_CASIN
+#undef HAVE_CASINL
+
+/* Branch cuts */
+#undef HAVE_CACOSF
+#undef HAVE_CACOS
+
+/* log2(exp2(i)) off by a few eps */
+#undef HAVE_LOG2
+
+/* np.power(..., dtype=np.complex256) doesn't report overflow */
+#undef HAVE_CPOWL
+#undef HAVE_CEXPL
+
+/* Builtin abs reports overflow */
+#undef HAVE_CABSL
+#undef HAVE_HYPOTL
+#endif
+
 /* Disable broken gnu trig functions */
 #if defined(HAVE_FEATURES_H)
 #include <features.h>
 #undef HAVE_CACOSHF
 #undef HAVE_CACOSHL
 
-#endif /* __GLIBC_PREREQ(2, 18) */
-#endif /* defined(__GLIBC_PREREQ) */
+#endif  /* __GLIBC_PREREQ(2, 18) */
+#endif  /* defined(__GLIBC_PREREQ) */
 
-#endif /* defined(HAVE_FEATURES_H) */
+#endif  /* defined(HAVE_FEATURES_H) */
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_CONFIG_H_ */
index c8411104a867c33f5942a9060ddf40d048004ea0..e814cd425e831f137aba7c23b63a333e8155a6b6 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef NPY_CPU_DISPATCH_H_
-#define NPY_CPU_DISPATCH_H_
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_CPU_DISPATCH_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_CPU_DISPATCH_H_
 /**
  * This file is part of the NumPy CPU dispatcher. Please have a look at doc/reference/simd-optimizations.html
  * To get a better understanding of the mechanism behind it.
@@ -57,7 +57,7 @@
  * avoid linking duplications due to the nature of the dispatch-able sources.
  *
  * Example:
- *    @targets baseline avx avx512_skx vsx3 asimdhp // configration statments
+ *    @targets baseline avx avx512_skx vsx3 asimdhp // configuration statements
  *
  *    void NPY_CPU_DISPATCH_CURFX(dispatch_me)(const int *src, int *dst)
  *    {
  * Macro NPY_CPU_DISPATCH_DECLARE_XB(LEFT, ...)
  *
  * Same as `NPY_CPU_DISPATCH_DECLARE` but exclude the baseline declaration even
- * if it was provided within the configration statments.
+ * if it was provided within the configuration statements.
  */
 #define NPY_CPU_DISPATCH_DECLARE_XB(...) \
     NPY__CPU_DISPATCH_CALL(NPY_CPU_DISPATCH_DECLARE_CHK_, NPY_CPU_DISPATCH_DECLARE_CB_, __VA_ARGS__)
  * Example:
  *  Assume we have a dispatch-able source exporting the following function:
  *
- *    @targets baseline avx2 avx512_skx // configration statments
+ *    @targets baseline avx2 avx512_skx // configuration statements
  *
  *    void NPY_CPU_DISPATCH_CURFX(dispatch_me)(const int *src, int *dst)
  *    {
  * Macro NPY_CPU_DISPATCH_CALL_XB(LEFT, ...)
  *
  * Same as `NPY_CPU_DISPATCH_DECLARE` but exclude the baseline declaration even
- * if it was provided within the configration statements.
+ * if it was provided within the configuration statements.
  * Returns void.
  */
 #define NPY_CPU_DISPATCH_CALL_XB_CB_(TESTED_FEATURES, TARGET_NAME, LEFT, ...) \
 #define NPY_CPU_DISPATCH_CALL_ALL_BASE_CB_(LEFT, ...) \
     ( LEFT __VA_ARGS__ )
 
-#endif // NPY_CPU_DISPATCH_H_
+#endif  // NUMPY_CORE_SRC_COMMON_NPY_CPU_DISPATCH_H_
index 1e0f4a57179d130ead3ecce5612d7a6c338ed894..a2383c45f61d49dc407833e1a5ead6c31510bfd9 100644 (file)
@@ -230,7 +230,7 @@ npy__cpu_try_disable_env(void)
             notsupp_cur[flen] = ' '; notsupp_cur += flen + 1;
             goto next;
         }
-        // Finaly we can disable it
+        // Finally we can disable it
         npy__cpu_have[feature_id] = 0;
     next:
         feature = strtok(NULL, delim);
index 28dd000323a3c816f6d1780c47cfb2edbbd10d11..ce1fc822ac038eb261555cd4ce44586d8b6a2a82 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_CPU_FEATURES_H_
-#define _NPY_CPU_FEATURES_H_
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_CPU_FEATURES_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_CPU_FEATURES_H_
 
 #include <Python.h> // for PyObject
 #include "numpy/numpyconfig.h" // for NPY_VISIBILITY_HIDDEN
@@ -168,4 +168,4 @@ npy_cpu_dispatch_list(void);
 }
 #endif
 
-#endif // _NPY_CPU_FEATURES_H_
+#endif  // NUMPY_CORE_SRC_COMMON_NPY_CPU_FEATURES_H_
index f4540f6ab17054d5333260dd17661c1cdf7ed884..364873a23ed6aed4018a8e7a49361d5ac318ce84 100644 (file)
@@ -25,8 +25,8 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-#ifndef __NPY_CPUINFO_PARSER_H__
-#define __NPY_CPUINFO_PARSER_H__
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_CPUINFO_PARSER_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_CPUINFO_PARSER_H_
 #include <errno.h>
 #include <stdio.h>
 #include <fcntl.h>
@@ -123,7 +123,7 @@ read_file(const char*  pathname, char*  buffer, size_t  buffsize)
 }
 
 /* 
- * Extract the content of a the first occurence of a given field in
+ * Extract the content of a the first occurrence of a given field in
  * the content of /proc/cpuinfo and return it as a heap-allocated
  * string that must be freed by the caller.
  *
@@ -138,7 +138,7 @@ extract_cpuinfo_field(const char* buffer, int buflen, const char* field)
     int len;
     const char *p, *q;
 
-    /* Look for first field occurence, and ensures it starts the line. */
+    /* Look for first field occurrence, and ensures it starts the line. */
     p = buffer;
     for (;;) {
         p = memmem(p, bufend-p, field, fieldlen);
@@ -259,4 +259,4 @@ get_feature_from_proc_cpuinfo(unsigned long *hwcap, unsigned long *hwcap2) {
     *hwcap2 |= has_list_item(cpuFeatures, "crc32") ? NPY__HWCAP2_CRC32 : 0;
     return 1;
 }
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_CPUINFO_PARSER_H_ */
index c0cc4f1a19b3675ac1e7937987d7e409ffffde91..05761cad3c1c46c5adf33f0ea3bd9e008a530d7a 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef NPY_CTYPES_H
-#define NPY_CTYPES_H
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_CTYPES_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_CTYPES_H_
 
 #include <Python.h>
 
@@ -47,4 +47,4 @@ fail:
     return 0;
 }
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_CTYPES_H_ */
diff --git a/numpy/core/src/common/npy_dlpack.h b/numpy/core/src/common/npy_dlpack.h
new file mode 100644 (file)
index 0000000..14ca352
--- /dev/null
@@ -0,0 +1,28 @@
+#include "Python.h"
+#include "dlpack/dlpack.h"
+
+#ifndef NPY_DLPACK_H
+#define NPY_DLPACK_H
+
+// Part of the Array API specification.
+#define NPY_DLPACK_CAPSULE_NAME "dltensor"
+#define NPY_DLPACK_USED_CAPSULE_NAME "used_dltensor"
+
+// Used internally by NumPy to store a base object
+// as it has to release a reference to the original
+// capsule.
+#define NPY_DLPACK_INTERNAL_CAPSULE_NAME "numpy_dltensor"
+
+PyObject *
+array_dlpack(PyArrayObject *self, PyObject *const *args, Py_ssize_t len_args,
+             PyObject *kwnames);
+
+
+PyObject *
+array_dlpack_device(PyArrayObject *self, PyObject *NPY_UNUSED(args));
+
+
+NPY_NO_EXPORT PyObject *
+_from_dlpack(PyObject *NPY_UNUSED(self), PyObject *obj);
+
+#endif
index a887ff317a6e18247a0f36055d2c9a567289d65f..d563c2ac858861f492fcdc8832ba17ebf6b6a91c 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef NPY_EXTINT128_H_
-#define NPY_EXTINT128_H_
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_EXTINT128_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_EXTINT128_H_
 
 
 typedef struct {
@@ -314,4 +314,4 @@ ceildiv_128_64(npy_extint128_t a, npy_int64 b)
     return result;
 }
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_EXTINT128_H_ */
index dbb3fb23dde64de64bdb368edfa3e3bf71a93cb0..27e9ea3f4ecec2bb395b6452e5bc0fc4debe4538 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_NPY_FPMATH_H_
-#define _NPY_NPY_FPMATH_H_
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_NPY_FPMATH_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_NPY_FPMATH_H_
 
 #include "npy_config.h"
 
@@ -27,4 +27,4 @@
     #define HAVE_LDOUBLE_DOUBLE_DOUBLE_BE
 #endif
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_NPY_FPMATH_H_ */
diff --git a/numpy/core/src/common/npy_hashtable.c b/numpy/core/src/common/npy_hashtable.c
new file mode 100644 (file)
index 0000000..af9e2df
--- /dev/null
@@ -0,0 +1,220 @@
+/*
+ * This functionality is designed specifically for the ufunc machinery to
+ * dispatch based on multiple DTypes.  Since this is designed to be used
+ * as purely a cache, it currently does no reference counting.
+ * Even though this is a cache, there is currently no maximum size.  It may
+ * make sense to limit the size, or count collisions:  If too many collisions
+ * occur, we could grow the cache, otherwise, just replace an old item that
+ * was presumably not used for a long time.
+ *
+ * If a different part of NumPy requires a custom hashtable, the code should
+ * be reused with care since specializing it more for the ufunc dispatching
+ * case is likely desired.
+ */
+
+#include "templ_common.h"
+#include "npy_hashtable.h"
+
+
+
+#if SIZEOF_PY_UHASH_T > 4
+#define _NpyHASH_XXPRIME_1 ((Py_uhash_t)11400714785074694791ULL)
+#define _NpyHASH_XXPRIME_2 ((Py_uhash_t)14029467366897019727ULL)
+#define _NpyHASH_XXPRIME_5 ((Py_uhash_t)2870177450012600261ULL)
+#define _NpyHASH_XXROTATE(x) ((x << 31) | (x >> 33))  /* Rotate left 31 bits */
+#else
+#define _NpyHASH_XXPRIME_1 ((Py_uhash_t)2654435761UL)
+#define _NpyHASH_XXPRIME_2 ((Py_uhash_t)2246822519UL)
+#define _NpyHASH_XXPRIME_5 ((Py_uhash_t)374761393UL)
+#define _NpyHASH_XXROTATE(x) ((x << 13) | (x >> 19))  /* Rotate left 13 bits */
+#endif
+
+/*
+ * This hashing function is basically the Python tuple hash with the type
+ * identity hash inlined. The tuple hash itself is a reduced version of xxHash.
+ *
+ * Users cannot control pointers, so we do not have to worry about DoS attacks?
+ */
+static NPY_INLINE Py_hash_t
+identity_list_hash(PyObject *const *v, int len)
+{
+    Py_uhash_t acc = _NpyHASH_XXPRIME_5;
+    for (int i = 0; i < len; i++) {
+        /*
+         * Lane is the single item hash, which for us is the rotated pointer.
+         * Identical to the python type hash (pointers end with 0s normally).
+         */
+        size_t y = (size_t)v[i];
+        Py_uhash_t lane = (y >> 4) | (y << (8 * SIZEOF_VOID_P - 4));
+        acc += lane * _NpyHASH_XXPRIME_2;
+        acc = _NpyHASH_XXROTATE(acc);
+        acc *= _NpyHASH_XXPRIME_1;
+    }
+    return acc;
+}
+#undef _NpyHASH_XXPRIME_1
+#undef _NpyHASH_XXPRIME_2
+#undef _NpyHASH_XXPRIME_5
+#undef _NpyHASH_XXROTATE
+
+
+static NPY_INLINE PyObject **
+find_item(PyArrayIdentityHash const *tb, PyObject *const *key)
+{
+    Py_hash_t hash = identity_list_hash(key, tb->key_len);
+    npy_uintp perturb = (npy_uintp)hash;
+    npy_intp bucket;
+    npy_intp mask = tb->size - 1 ;
+    PyObject **item;
+
+    bucket = (npy_intp)hash & mask;
+    while (1) {
+        item = &(tb->buckets[bucket * (tb->key_len + 1)]);
+
+        if (item[0] == NULL) {
+            /* The item is not in the cache; return the empty bucket */
+            return item;
+        }
+        if (memcmp(item+1, key, tb->key_len * sizeof(PyObject *)) == 0) {
+            /* This is a match, so return the item/bucket */
+            return item;
+        }
+        /* Hash collision, perturb like Python (must happen rarely!) */
+        perturb >>= 5;  /* Python uses the macro PERTURB_SHIFT == 5 */
+        bucket = mask & (bucket * 5 + perturb + 1);
+    }
+}
+
+
+NPY_NO_EXPORT PyArrayIdentityHash *
+PyArrayIdentityHash_New(int key_len)
+{
+    PyArrayIdentityHash *res = PyMem_Malloc(sizeof(PyArrayIdentityHash));
+    if (res == NULL) {
+        PyErr_NoMemory();
+        return NULL;
+    }
+
+    assert(key_len > 0);
+    res->key_len = key_len;
+    res->size = 4;  /* Start with a size of 4 */
+    res->nelem = 0;
+
+    res->buckets = PyMem_Calloc(4 * (key_len + 1), sizeof(PyObject *));
+    if (res->buckets == NULL) {
+        PyErr_NoMemory();
+        PyMem_Free(res);
+        return NULL;
+    }
+    return res;
+}
+
+
+NPY_NO_EXPORT void
+PyArrayIdentityHash_Dealloc(PyArrayIdentityHash *tb)
+{
+    PyMem_Free(tb->buckets);
+    PyMem_Free(tb);
+}
+
+
+static int
+_resize_if_necessary(PyArrayIdentityHash *tb)
+{
+    npy_intp new_size, prev_size = tb->size;
+    PyObject **old_table = tb->buckets;
+    assert(prev_size > 0);
+
+    if ((tb->nelem + 1) * 2 > prev_size) {
+        /* Double in size */
+        new_size = prev_size * 2;
+    }
+    else {
+        new_size = prev_size;
+        while ((tb->nelem + 8) * 2 < new_size / 2) {
+            /*
+             * Should possibly be improved.  However, we assume that we
+             * almost never shrink.  Still if we do, do not shrink as much
+             * as possible to avoid growing right away.
+             */
+            new_size /= 2;
+        }
+        assert(new_size >= 4);
+    }
+    if (new_size == prev_size) {
+        return 0;
+    }
+
+    npy_intp alloc_size;
+    if (npy_mul_with_overflow_intp(&alloc_size, new_size, tb->key_len + 1)) {
+        return -1;
+    }
+    tb->buckets = PyMem_Calloc(alloc_size, sizeof(PyObject *));
+    if (tb->buckets == NULL) {
+        tb->buckets = old_table;
+        PyErr_NoMemory();
+        return -1;
+    }
+
+    tb->size = new_size;
+    for (npy_intp i = 0; i < prev_size; i++) {
+        PyObject **item = &old_table[i * (tb->key_len + 1)];
+        if (item[0] != NULL) {
+            tb->nelem -= 1;  /* Decrement, setitem will increment again */
+            PyArrayIdentityHash_SetItem(tb, item+1, item[0], 1);
+        }
+    }
+    PyMem_Free(old_table);
+    return 0;
+}
+
+
+/**
+ * Add an item to the identity cache.  The storage location must not change
+ * unless the cache is cleared.
+ *
+ * @param tb The mapping.
+ * @param key The key, must be a C-array of pointers of the length
+ *        corresponding to the mapping.
+ * @param value Normally a Python object, no reference counting is done.
+ *        use NULL to clear an item.  If the item does not exist, no
+ *        action is performed for NULL.
+ * @param replace If 1, allow replacements.
+ * @returns 0 on success, -1 with a MemoryError or RuntimeError (if an item
+ *        is added which is already in the cache).  The caller should avoid
+ *        the RuntimeError.
+ */
+NPY_NO_EXPORT int
+PyArrayIdentityHash_SetItem(PyArrayIdentityHash *tb,
+        PyObject *const *key, PyObject *value, int replace)
+{
+    if (value != NULL && _resize_if_necessary(tb) < 0) {
+        /* Shrink, only if a new value is added. */
+        return -1;
+    }
+
+    PyObject **tb_item = find_item(tb, key);
+    if (value != NULL) {
+        if (tb_item[0] != NULL && !replace) {
+            PyErr_SetString(PyExc_RuntimeError,
+                    "Identity cache already includes the item.");
+            return -1;
+        }
+        tb_item[0] = value;
+        memcpy(tb_item+1, key, tb->key_len * sizeof(PyObject *));
+        tb->nelem += 1;
+    }
+    else {
+        /* Clear the bucket -- just the value should be enough though. */
+        memset(tb_item, 0, (tb->key_len + 1) * sizeof(PyObject *));
+    }
+
+    return 0;
+}
+
+
+NPY_NO_EXPORT PyObject *
+PyArrayIdentityHash_GetItem(PyArrayIdentityHash const *tb, PyObject *const *key)
+{
+    return find_item(tb, key)[0];
+}
diff --git a/numpy/core/src/common/npy_hashtable.h b/numpy/core/src/common/npy_hashtable.h
new file mode 100644 (file)
index 0000000..a0bf819
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_NPY_HASHTABLE_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_NPY_HASHTABLE_H_
+
+#include <Python.h>
+
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#include "numpy/ndarraytypes.h"
+
+
+typedef struct {
+    int key_len;  /* number of identities used */
+    /* Buckets stores: val1, key1[0], key1[1], ..., val2, key2[0], ... */
+    PyObject **buckets;
+    npy_intp size;  /* current size */
+    npy_intp nelem;  /* number of elements */
+} PyArrayIdentityHash;
+
+
+NPY_NO_EXPORT int
+PyArrayIdentityHash_SetItem(PyArrayIdentityHash *tb,
+        PyObject *const *key, PyObject *value, int replace);
+
+NPY_NO_EXPORT PyObject *
+PyArrayIdentityHash_GetItem(PyArrayIdentityHash const *tb, PyObject *const *key);
+
+NPY_NO_EXPORT PyArrayIdentityHash *
+PyArrayIdentityHash_New(int key_len);
+
+NPY_NO_EXPORT void
+PyArrayIdentityHash_Dealloc(PyArrayIdentityHash *tb);
+
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_NPY_HASHTABLE_H_ */
index f485514d1cd128d397d82e1e1db61525a0f763d8..f36b6924a864b4524a8e4204d62dd6bb39d2aa17 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef NPY_IMPORT_H
-#define NPY_IMPORT_H
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_IMPORT_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_IMPORT_H_
 
 #include <Python.h>
 
@@ -29,4 +29,4 @@ npy_cache_import(const char *module, const char *attr, PyObject **cache)
     }
 }
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_IMPORT_H_ */
index 260e02a64b1b48b6b76b9c9ca48ffeb8e0fa3d0d..38dfd325c6855d2360dafabcc695b2d431aa8be3 100644 (file)
@@ -1,8 +1,9 @@
-#include <Python.h>
-
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
 
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
 #include "numpy/ndarraytypes.h"
 #include "numpy/npy_math.h"
 #include "npy_pycompat.h"
index 01db06de76f942e033f64dbe16caadc8d33c899a..cf8b37bc9f25c045f9f67a4f4e08b47aa5905cf9 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __NPY_LONGDOUBLE_H
-#define __NPY_LONGDOUBLE_H
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_LONGDOUBLE_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_LONGDOUBLE_H_
 
 #include "npy_config.h"
 #include "numpy/ndarraytypes.h"
@@ -24,4 +24,4 @@ npy_longdouble_to_PyLong(npy_longdouble ldval);
 NPY_VISIBILITY_HIDDEN npy_longdouble
 npy_longdouble_from_PyLong(PyObject *long_obj);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_LONGDOUBLE_H_ */
index 9e94a971090a3e360b95238b95334d024b3c53e9..6641cd59109f17e9c2facbbe218eecdd8c8d4f27 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_PYCOMPAT_H_
-#define _NPY_PYCOMPAT_H_
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_PYCOMPAT_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_PYCOMPAT_H_
 
 #include "numpy/npy_3kcompat.h"
 
@@ -19,4 +19,4 @@ Npy_HashDouble(PyObject *NPY_UNUSED(identity), double val)
 #endif
 
 
-#endif /* _NPY_COMPAT_H_ */
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_PYCOMPAT_H_ */
index ddbde0c9be1095ab34e9a3a4823d2f12628b6562..b4a1e9b0cad97943ebcfe2e084397a37a760c96e 100644 (file)
@@ -49,9 +49,14 @@ NPY_NO_EXPORT int atimsort_@suff@(void *vec, npy_intp *ind, npy_intp cnt, void *
  * #suff = bool, byte, ubyte, short, ushort, int, uint, long, ulong,
  *         longlong, ulonglong#
  */
-
+#ifdef __cplusplus
+extern "C" {
+#endif
 NPY_NO_EXPORT int radixsort_@suff@(void *vec, npy_intp cnt, void *null);
 NPY_NO_EXPORT int aradixsort_@suff@(void *vec, npy_intp *ind, npy_intp cnt, void *null);
+#ifdef __cplusplus
+}
+#endif
 
 /**end repeat**/
 
diff --git a/numpy/core/src/common/npy_svml.h b/numpy/core/src/common/npy_svml.h
new file mode 100644 (file)
index 0000000..4292f70
--- /dev/null
@@ -0,0 +1,41 @@
+#if NPY_SIMD && defined(NPY_HAVE_AVX512_SKX) && defined(NPY_CAN_LINK_SVML)
+extern __m512 __svml_exp2f16(__m512 x);
+extern __m512 __svml_log2f16(__m512 x);
+extern __m512 __svml_log10f16(__m512 x);
+extern __m512 __svml_expm1f16(__m512 x);
+extern __m512 __svml_log1pf16(__m512 x);
+extern __m512 __svml_cbrtf16(__m512 x);
+extern __m512 __svml_sinf16(__m512 x);
+extern __m512 __svml_cosf16(__m512 x);
+extern __m512 __svml_tanf16(__m512 x);
+extern __m512 __svml_asinf16(__m512 x);
+extern __m512 __svml_acosf16(__m512 x);
+extern __m512 __svml_atanf16(__m512 x);
+extern __m512 __svml_atan2f16(__m512 x);
+extern __m512 __svml_sinhf16(__m512 x);
+extern __m512 __svml_coshf16(__m512 x);
+extern __m512 __svml_tanhf16(__m512 x);
+extern __m512 __svml_asinhf16(__m512 x);
+extern __m512 __svml_acoshf16(__m512 x);
+extern __m512 __svml_atanhf16(__m512 x);
+
+extern __m512d __svml_exp28(__m512d x);
+extern __m512d __svml_log28(__m512d x);
+extern __m512d __svml_log108(__m512d x);
+extern __m512d __svml_expm18(__m512d x);
+extern __m512d __svml_log1p8(__m512d x);
+extern __m512d __svml_cbrt8(__m512d x);
+extern __m512d __svml_sin8(__m512d x);
+extern __m512d __svml_cos8(__m512d x);
+extern __m512d __svml_tan8(__m512d x);
+extern __m512d __svml_asin8(__m512d x);
+extern __m512d __svml_acos8(__m512d x);
+extern __m512d __svml_atan8(__m512d x);
+extern __m512d __svml_atan28(__m512d x);
+extern __m512d __svml_sinh8(__m512d x);
+extern __m512d __svml_cosh8(__m512d x);
+extern __m512d __svml_tanh8(__m512d x);
+extern __m512d __svml_asinh8(__m512d x);
+extern __m512d __svml_acosh8(__m512d x);
+extern __m512d __svml_atanh8(__m512d x);
+#endif
diff --git a/numpy/core/src/common/numpy_tag.h b/numpy/core/src/common/numpy_tag.h
new file mode 100644 (file)
index 0000000..dc8d528
--- /dev/null
@@ -0,0 +1,78 @@
+#ifndef _NPY_COMMON_TAG_H_
+#define _NPY_COMMON_TAG_H_
+
+namespace npy {
+
+struct integral_tag {
+};
+struct floating_point_tag {
+};
+struct complex_tag {
+};
+struct date_tag {
+};
+
+struct bool_tag : integral_tag {
+    using type = npy_bool;
+};
+struct byte_tag : integral_tag {
+    using type = npy_byte;
+};
+struct ubyte_tag : integral_tag {
+    using type = npy_ubyte;
+};
+struct short_tag : integral_tag {
+    using type = npy_short;
+};
+struct ushort_tag : integral_tag {
+    using type = npy_ushort;
+};
+struct int_tag : integral_tag {
+    using type = npy_int;
+};
+struct uint_tag : integral_tag {
+    using type = npy_uint;
+};
+struct long_tag : integral_tag {
+    using type = npy_long;
+};
+struct ulong_tag : integral_tag {
+    using type = npy_ulong;
+};
+struct longlong_tag : integral_tag {
+    using type = npy_longlong;
+};
+struct ulonglong_tag : integral_tag {
+    using type = npy_ulonglong;
+};
+struct half_tag {
+    using type = npy_half;
+};
+struct float_tag : floating_point_tag {
+    using type = npy_float;
+};
+struct double_tag : floating_point_tag {
+    using type = npy_double;
+};
+struct longdouble_tag : floating_point_tag {
+    using type = npy_longdouble;
+};
+struct cfloat_tag : complex_tag {
+    using type = npy_cfloat;
+};
+struct cdouble_tag : complex_tag {
+    using type = npy_cdouble;
+};
+struct clongdouble_tag : complex_tag {
+    using type = npy_clongdouble;
+};
+struct datetime_tag : date_tag {
+    using type = npy_datetime;
+};
+struct timedelta_tag : date_tag {
+    using type = npy_timedelta;
+};
+
+}  // namespace npy
+
+#endif
index 42a71777bb421386fb247561f359c53b1c9f7213..4551a06a2ba111dcd8bd8de4c529758246a73c93 100644 (file)
@@ -1,11 +1,9 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
-#include <locale.h>
-#include <stdio.h>
-
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/npy_math.h"
 
 
 #include "npy_pycompat.h"
 
+#include <locale.h>
+#include <stdio.h>
+
 #ifdef HAVE_STRTOLD_L
 #include <stdlib.h>
 #ifdef HAVE_XLOCALE_H
-    /*
-     * the defines from xlocale.h are included in locale.h on some systems;
-     * see gh-8367
-     */
-    #include <xlocale.h>
+#include <xlocale.h>  // xlocale was removed in glibc 2.26, see gh-8367
 #endif
 #endif
 
index 4deed8400be89e5c6738b0401c52c564600d4939..ce49cbea7f6eee86ca95b9f60b4eb4621d1dceba 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_NUMPYOS_H_
-#define _NPY_NUMPYOS_H_
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_NUMPYOS_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_NUMPYOS_H_
 
 NPY_NO_EXPORT char*
 NumPyOS_ascii_formatd(char *buffer, size_t buf_size,
@@ -38,4 +38,5 @@ NumPyOS_strtoll(const char *str, char **endptr, int base);
 /* Convert a string to an int in an arbitrary base */
 NPY_NO_EXPORT npy_ulonglong
 NumPyOS_strtoull(const char *str, char **endptr, int base);
-#endif
+
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_NUMPYOS_H_ */
index fe2f718b2e58765030b444dc4c7346370f54d789..37a41408be222e47668df60b7b22a0ee5c044fab 100644 (file)
@@ -1,4 +1,6 @@
-#include "Python.h"
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
 #include "numpy/npy_common.h"
 #include "npy_cblas.h"
 
index e1b170863a3445c61c617f806061467619f0efa1..ad9688338772d8506b2990495504831df9d6869c 100644 (file)
@@ -284,7 +284,7 @@ NPY_FINLINE npy_uint32 npyv_sum_u32(npyv_u32 a)
 {
     __m256i s0 = _mm256_hadd_epi32(a, a);
             s0 = _mm256_hadd_epi32(s0, s0);
-    __m128i s1 = _mm256_extracti128_si256(s0, 1);;
+    __m128i s1 = _mm256_extracti128_si256(s0, 1);
             s1 = _mm_add_epi32(_mm256_castsi256_si128(s0), s1);
     return _mm_cvtsi128_si32(s1);
 }
index 9460183df5bb1a9e37144371e348a4c28e7ffedf..ec15e50e1fdb9e7a94aaa21f8dd8918193ef3383 100644 (file)
@@ -105,4 +105,12 @@ NPY_FINLINE npyv_s64 npyv_min_s64(npyv_s64 a, npyv_s64 b)
     return _mm256_blendv_epi8(a, b, _mm256_cmpgt_epi64(a, b));
 }
 
+// ceil
+#define npyv_ceil_f32 _mm256_ceil_ps
+#define npyv_ceil_f64 _mm256_ceil_pd
+
+// trunc
+#define npyv_trunc_f32(A) _mm256_round_ps(A, _MM_FROUND_TO_ZERO)
+#define npyv_trunc_f64(A) _mm256_round_pd(A, _MM_FROUND_TO_ZERO)
+
 #endif // _NPY_SIMD_AVX2_MATH_H
index 0949b2b06fe7423a904202199bd60295ebfab502..f30e50ad05dfeb5037ba921751023af5e0b85ab4 100644 (file)
@@ -112,4 +112,12 @@ NPY_FINLINE npyv_f64 npyv_minp_f64(npyv_f64 a, npyv_f64 b)
 #define npyv_min_u64 _mm512_min_epu64
 #define npyv_min_s64 _mm512_min_epi64
 
+// ceil
+#define npyv_ceil_f32(A) _mm512_roundscale_ps(A, _MM_FROUND_TO_POS_INF)
+#define npyv_ceil_f64(A) _mm512_roundscale_pd(A, _MM_FROUND_TO_POS_INF)
+
+// trunc
+#define npyv_trunc_f32(A) _mm512_roundscale_ps(A, _MM_FROUND_TO_ZERO)
+#define npyv_trunc_f64(A) _mm512_roundscale_pd(A, _MM_FROUND_TO_ZERO)
+
 #endif // _NPY_SIMD_AVX512_MATH_H
index 8066283c6b1d5de81b2e8ca6320547edd6b3dd6c..c3079283f4917ac83b265dd90ac64143984cb74a 100644 (file)
@@ -26,7 +26,7 @@
     #define npyv512_combine_ps256(A, B) _mm512_insertf32x8(_mm512_castps256_ps512(A), B, 1)
 #else
     #define npyv512_combine_ps256(A, B) \
-        _mm512_castsi512_ps(npyv512_combine_si256(_mm512_castps_si512(A), _mm512_castps_si512(B)))
+        _mm512_castsi512_ps(npyv512_combine_si256(_mm256_castps_si256(A), _mm256_castps_si256(B)))
 #endif
 
 #define NPYV_IMPL_AVX512_FROM_AVX2_1ARG(FN_NAME, INTRIN) \
         return npyv512_combine_si256(l_a, h_a);          \
     }
 
+#define NPYV_IMPL_AVX512_FROM_AVX2_PS_1ARG(FN_NAME, INTRIN) \
+    NPY_FINLINE __m512 FN_NAME(__m512 a)                    \
+    {                                                       \
+        __m256 l_a  = npyv512_lower_ps256(a);               \
+        __m256 h_a  = npyv512_higher_ps256(a);              \
+        l_a = INTRIN(l_a);                                  \
+        h_a = INTRIN(h_a);                                  \
+        return npyv512_combine_ps256(l_a, h_a);             \
+    }
+
+#define NPYV_IMPL_AVX512_FROM_AVX2_PD_1ARG(FN_NAME, INTRIN) \
+    NPY_FINLINE __m512d FN_NAME(__m512d a)                  \
+    {                                                       \
+        __m256d l_a  = npyv512_lower_pd256(a);              \
+        __m256d h_a  = npyv512_higher_pd256(a);             \
+        l_a = INTRIN(l_a);                                  \
+        h_a = INTRIN(h_a);                                  \
+        return npyv512_combine_pd256(l_a, h_a);             \
+    }
+
 #define NPYV_IMPL_AVX512_FROM_AVX2_2ARG(FN_NAME, INTRIN) \
     NPY_FINLINE __m512i FN_NAME(__m512i a, __m512i b)    \
     {                                                    \
index 7e7446bc56ef64208f4487e44b99e86d7e851425..41e397c2d3012f941a3e2def489c38292481a65b 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * This header is used internaly by all current supported SIMD extention,
+ * This header is used internally by all current supported SIMD extensions,
  * execpt for AVX512.
  */
 #ifndef NPY_SIMD
index 7df4abfd29e8257b375e21ffaeb8a856e9a1b3d0..a7a461721dba8d5eb3f42a7003bc11f3b4896a39 100644 (file)
@@ -39,7 +39,7 @@
  *    for (; len >= vstep; src += vstep, dst += vstep, len -= vstep) {
  *        npyv_s32 a = npyv_load_s32(*src);       // load s32 vector from memory
  *                 a = npyv_divc_s32(a, divisor); // divide all elements by x
- *        npyv_store_s32(dst, a);                 // store s32 vector into memroy
+ *        npyv_store_s32(dst, a);                 // store s32 vector into memory
  *    }
  *
  ** NOTES:
index ced82d1de65f659e71fe65f7bf2241eb901c835a..19e5cd846f7d7a352ea80134d406903fae164f73 100644 (file)
@@ -31,7 +31,7 @@ NPY_FINLINE npyv_f32 npyv_square_f32(npyv_f32 a)
         const npyv_f32 zero = vdupq_n_f32(0.0f);
         const npyv_u32 pinf = vdupq_n_u32(0x7f800000);
         npyv_u32 is_zero = vceqq_f32(a, zero), is_inf = vceqq_u32(vreinterpretq_u32_f32(a), pinf);
-        // guard agianst floating-point division-by-zero error
+        // guard against floating-point division-by-zero error
         npyv_f32 guard_byz = vbslq_f32(is_zero, vreinterpretq_f32_u32(pinf), a);
         // estimate to (1/√a)
         npyv_f32 rsqrte = vrsqrteq_f32(guard_byz);
@@ -88,16 +88,16 @@ NPY_FINLINE npyv_f32 npyv_recip_f32(npyv_f32 a)
 #define npyv_max_f64 vmaxq_f64
 // Maximum, supports IEEE floating-point arithmetic (IEC 60559),
 // - If one of the two vectors contains NaN, the equivalent element of the other vector is set
-// - Only if both corresponded elements are NaN, NaN is set. 
+// - Only if both corresponded elements are NaN, NaN is set.
 #ifdef NPY_HAVE_ASIMD
     #define npyv_maxp_f32 vmaxnmq_f32
 #else
     NPY_FINLINE npyv_f32 npyv_maxp_f32(npyv_f32 a, npyv_f32 b)
-    { 
+    {
         npyv_u32 nn_a = vceqq_f32(a, a);
         npyv_u32 nn_b = vceqq_f32(b, b);
         return vmaxq_f32(vbslq_f32(nn_a, a, b), vbslq_f32(nn_b, b, a));
-    } 
+    }
 #endif
 #if NPY_SIMD_F64
     #define npyv_maxp_f64 vmaxnmq_f64
@@ -123,16 +123,16 @@ NPY_FINLINE npyv_s64 npyv_max_s64(npyv_s64 a, npyv_s64 b)
 #define npyv_min_f64 vminq_f64
 // Minimum, supports IEEE floating-point arithmetic (IEC 60559),
 // - If one of the two vectors contains NaN, the equivalent element of the other vector is set
-// - Only if both corresponded elements are NaN, NaN is set. 
+// - Only if both corresponded elements are NaN, NaN is set.
 #ifdef NPY_HAVE_ASIMD
     #define npyv_minp_f32 vminnmq_f32
 #else
     NPY_FINLINE npyv_f32 npyv_minp_f32(npyv_f32 a, npyv_f32 b)
-    { 
+    {
         npyv_u32 nn_a = vceqq_f32(a, a);
         npyv_u32 nn_b = vceqq_f32(b, b);
         return vminq_f32(vbslq_f32(nn_a, a, b), vbslq_f32(nn_b, b, a));
-    } 
+    }
 #endif
 #if NPY_SIMD_F64
     #define npyv_minp_f64 vminnmq_f64
@@ -153,4 +153,74 @@ NPY_FINLINE npyv_s64 npyv_min_s64(npyv_s64 a, npyv_s64 b)
     return vbslq_s64(npyv_cmplt_s64(a, b), a, b);
 }
 
+// ceil
+#ifdef NPY_HAVE_ASIMD
+    #define npyv_ceil_f32 vrndpq_f32
+#else
+   NPY_FINLINE npyv_f32 npyv_ceil_f32(npyv_f32 a)
+   {
+        const npyv_s32 szero = vreinterpretq_s32_f32(vdupq_n_f32(-0.0f));
+        const npyv_u32 one = vreinterpretq_u32_f32(vdupq_n_f32(1.0f));
+        const npyv_s32 max_int = vdupq_n_s32(0x7fffffff);
+        /**
+         * On armv7, vcvtq.f32 handles special cases as follows:
+         *  NaN return 0
+         * +inf or +outrange return 0x80000000(-0.0f)
+         * -inf or -outrange return 0x7fffffff(nan)
+         */
+        npyv_s32 roundi = vcvtq_s32_f32(a);
+        npyv_f32 round = vcvtq_f32_s32(roundi);
+        npyv_f32 ceil = vaddq_f32(round, vreinterpretq_f32_u32(
+            vandq_u32(vcltq_f32(round, a), one))
+        );
+        // respect signed zero, e.g. -0.5 -> -0.0
+        npyv_f32 rzero = vreinterpretq_f32_s32(vorrq_s32(
+            vreinterpretq_s32_f32(ceil),
+            vandq_s32(vreinterpretq_s32_f32(a), szero)
+        ));
+        // if nan or overflow return a
+        npyv_u32 nnan = npyv_notnan_f32(a);
+        npyv_u32 overflow = vorrq_u32(
+            vceqq_s32(roundi, szero), vceqq_s32(roundi, max_int)
+        );
+        return vbslq_f32(vbicq_u32(nnan, overflow), rzero, a);
+   }
+#endif
+#if NPY_SIMD_F64
+    #define npyv_ceil_f64 vrndpq_f64
+#endif // NPY_SIMD_F64
+
+// trunc
+#ifdef NPY_HAVE_ASIMD
+    #define npyv_trunc_f32 vrndq_f32
+#else
+   NPY_FINLINE npyv_f32 npyv_trunc_f32(npyv_f32 a)
+   {
+        const npyv_s32 szero = vreinterpretq_s32_f32(vdupq_n_f32(-0.0f));
+        const npyv_s32 max_int = vdupq_n_s32(0x7fffffff);
+        /**
+         * On armv7, vcvtq.f32 handles special cases as follows:
+         *  NaN return 0
+         * +inf or +outrange return 0x80000000(-0.0f)
+         * -inf or -outrange return 0x7fffffff(nan)
+         */
+        npyv_s32 roundi = vcvtq_s32_f32(a);
+        npyv_f32 round = vcvtq_f32_s32(roundi);
+        // respect signed zero, e.g. -0.5 -> -0.0
+        npyv_f32 rzero = vreinterpretq_f32_s32(vorrq_s32(
+            vreinterpretq_s32_f32(round),
+            vandq_s32(vreinterpretq_s32_f32(a), szero)
+        ));
+        // if nan or overflow return a
+        npyv_u32 nnan = npyv_notnan_f32(a);
+        npyv_u32 overflow = vorrq_u32(
+            vceqq_s32(roundi, szero), vceqq_s32(roundi, max_int)
+        );
+        return vbslq_f32(vbicq_u32(nnan, overflow), rzero, a);
+   }
+#endif
+#if NPY_SIMD_F64
+    #define npyv_trunc_f64 vrndq_f64
+#endif // NPY_SIMD_F64
+
 #endif // _NPY_SIMD_NEON_MATH_H
index 97d35afc5e04fa9c8b6c96cf49998b320d492631..5daf7711e416da7dfcca9bbe5e81a28ea44e6471 100644 (file)
@@ -143,4 +143,63 @@ NPY_FINLINE npyv_s64 npyv_min_s64(npyv_s64 a, npyv_s64 b)
     return npyv_select_s64(npyv_cmplt_s64(a, b), a, b);
 }
 
+// ceil
+#ifdef NPY_HAVE_SSE41
+    #define npyv_ceil_f32 _mm_ceil_ps
+    #define npyv_ceil_f64 _mm_ceil_pd
+#else
+    NPY_FINLINE npyv_f32 npyv_ceil_f32(npyv_f32 a)
+    {
+        const npyv_f32 szero = _mm_set1_ps(-0.0f);
+        const npyv_f32 one = _mm_set1_ps(1.0f);
+        npyv_s32 roundi = _mm_cvttps_epi32(a);
+        npyv_f32 round = _mm_cvtepi32_ps(roundi);
+        npyv_f32 ceil = _mm_add_ps(round, _mm_and_ps(_mm_cmplt_ps(round, a), one));
+        // respect signed zero, e.g. -0.5 -> -0.0
+        npyv_f32 rzero = _mm_or_ps(ceil, _mm_and_ps(a, szero));
+        // if overflow return a
+        return npyv_select_f32(_mm_cmpeq_epi32(roundi, _mm_castps_si128(szero)), a, rzero);
+    }
+    NPY_FINLINE npyv_f64 npyv_ceil_f64(npyv_f64 a)
+    {
+        const npyv_f64 szero = _mm_set1_pd(-0.0);
+        const npyv_f64 one = _mm_set1_pd(1.0);
+        const npyv_f64 two_power_52 = _mm_set1_pd(0x10000000000000);
+        npyv_f64 sign_two52 = _mm_or_pd(two_power_52, _mm_and_pd(a, szero));
+        // round by add magic number 2^52
+        npyv_f64 round = _mm_sub_pd(_mm_add_pd(a, sign_two52), sign_two52);
+        npyv_f64 ceil = _mm_add_pd(round, _mm_and_pd(_mm_cmplt_pd(round, a), one));
+        // respect signed zero, e.g. -0.5 -> -0.0
+        return _mm_or_pd(ceil, _mm_and_pd(a, szero));
+    }
+#endif
+
+// trunc
+#ifdef NPY_HAVE_SSE41
+    #define npyv_trunc_f32(A) _mm_round_ps(A, _MM_FROUND_TO_ZERO)
+    #define npyv_trunc_f64(A) _mm_round_pd(A, _MM_FROUND_TO_ZERO)
+#else
+    NPY_FINLINE npyv_f32 npyv_trunc_f32(npyv_f32 a)
+    {
+        const npyv_f32 szero = _mm_set1_ps(-0.0f);
+        npyv_s32 roundi = _mm_cvttps_epi32(a);
+        npyv_f32 trunc = _mm_cvtepi32_ps(roundi);
+        // respect signed zero, e.g. -0.5 -> -0.0
+        npyv_f32 rzero = _mm_or_ps(trunc, _mm_and_ps(a, szero));
+        // if overflow return a
+        return npyv_select_f32(_mm_cmpeq_epi32(roundi, _mm_castps_si128(szero)), a, rzero);
+    }
+    NPY_FINLINE npyv_f64 npyv_trunc_f64(npyv_f64 a)
+    {
+        const npyv_f64 szero = _mm_set1_pd(-0.0);
+        const npyv_f64 one = _mm_set1_pd(1.0);
+        const npyv_f64 two_power_52 = _mm_set1_pd(0x10000000000000);
+        npyv_f64 abs_a = npyv_abs_f64(a);
+        // round by add magic number 2^52
+        npyv_f64 abs_round = _mm_sub_pd(_mm_add_pd(abs_a, two_power_52), two_power_52);
+        npyv_f64 subtrahend = _mm_and_pd(_mm_cmpgt_pd(abs_round, abs_a), one);
+        return _mm_or_pd(_mm_sub_pd(abs_round, subtrahend), _mm_and_pd(a, szero));
+    }
+#endif
+
 #endif // _NPY_SIMD_SSE_MATH_H
index b2e393c7cf773f92683b2a89fc0db5cfd4b71b10..d138cae8a24d87ed1871764448fda01bba6c6e7d 100644 (file)
@@ -69,4 +69,12 @@ NPY_FINLINE npyv_f64 npyv_square_f64(npyv_f64 a)
 #define npyv_min_u64 vec_min
 #define npyv_min_s64 vec_min
 
+// ceil
+#define npyv_ceil_f32 vec_ceil
+#define npyv_ceil_f64 vec_ceil
+
+// trunc
+#define npyv_trunc_f32 vec_trunc
+#define npyv_trunc_f64 vec_trunc
+
 #endif // _NPY_SIMD_VSX_MATH_H
index 23c5d0dbe70c6efef4f7cbf4bf5c29028ae41bc1..d34057ff3f38dbdae68f6b1b4435814717349336 100644 (file)
@@ -103,7 +103,7 @@ NPYV_IMPL_VSX_BIN_B64(or)
 NPYV_IMPL_VSX_BIN_B64(xor)
 
 // NOT
-// note: we implement npyv_not_b*(boolen types) for internal use*/
+// note: we implement npyv_not_b*(boolean types) for internal use*/
 #define NPYV_IMPL_VSX_NOT_INT(VEC_LEN)                                 \
     NPY_FINLINE npyv_u##VEC_LEN npyv_not_u##VEC_LEN(npyv_u##VEC_LEN a) \
     { return vec_nor(a, a); }                                          \
index 3ef5d687820b8db293b597e6a6e933a8b3d85786..4bea4beee38431ec1ff7f013680dddd81c327df6 100644 (file)
@@ -1,12 +1,9 @@
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
-#include <locale.h>
-#include <stdio.h>
-
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/npy_math.h"
 
index c811e1f2c52c9ab0cdcab9940afc1acdf60fdaa3..6fe157199877549e0dd44ffe9c00ffca0abcd799 100644 (file)
@@ -1,7 +1,7 @@
-#ifndef _NPY_UCSNARROW_H_
-#define _NPY_UCSNARROW_H_
+#ifndef NUMPY_CORE_SRC_COMMON_NPY_UCSNARROW_H_
+#define NUMPY_CORE_SRC_COMMON_NPY_UCSNARROW_H_
 
 NPY_NO_EXPORT PyUnicodeObject *
 PyUnicode_FromUCS4(char *src, Py_ssize_t size, int swap, int align);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_COMMON_NPY_UCSNARROW_H_ */
index bf86865c9090d9bfffc9525d9feb4de77a20af85..5da95fb2980376cf1f6d893a19347e8566685382 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __UFUNC_OVERRIDE_H
-#define __UFUNC_OVERRIDE_H
+#ifndef NUMPY_CORE_SRC_COMMON_UFUNC_OVERRIDE_H_
+#define NUMPY_CORE_SRC_COMMON_UFUNC_OVERRIDE_H_
 
 #include "npy_config.h"
 
@@ -34,4 +34,5 @@ PyUFunc_HasOverride(PyObject *obj);
  */
 NPY_NO_EXPORT int
 PyUFuncOverride_GetOutObjects(PyObject *kwds, PyObject **out_kwd_obj, PyObject ***out_objs);
-#endif
+
+#endif  /* NUMPY_CORE_SRC_COMMON_UFUNC_OVERRIDE_H_ */
index 6998596ee729d89c65975c4f5268dadaa4fae301..6d4169ad5f8a9420a0834cf890afc75c9a2f4a0b 100644 (file)
@@ -1,8 +1,14 @@
+#ifndef NUMPY_CORE_SRC_COMMON_UMATHMODULE_H_
+#define NUMPY_CORE_SRC_COMMON_UMATHMODULE_H_
+
 #include "__umath_generated.c"
 #include "__ufunc_api.c"
 
+NPY_NO_EXPORT PyObject *
+get_sfloat_dtype(PyObject *NPY_UNUSED(mod), PyObject *NPY_UNUSED(args));
+
 PyObject * add_newdoc_ufunc(PyObject *NPY_UNUSED(dummy), PyObject *args);
 PyObject * ufunc_frompyfunc(PyObject *NPY_UNUSED(dummy), PyObject *args, PyObject *NPY_UNUSED(kwds));
 int initumath(PyObject *m);
 
-
+#endif  /* NUMPY_CORE_SRC_COMMON_UMATHMODULE_H_ */
index e26875736d234a148114d816e79dc5f69ab9ef20..7284ffd68545a251eb7abaf540324226bc24563b 100644 (file)
@@ -4,12 +4,13 @@
  * This is a dummy module whose purpose is to get distutils to generate the
  * configuration files before the libraries are made.
  */
-
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define NO_IMPORT_ARRAY
 
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include <npy_pycompat.h>
+
+#include "npy_pycompat.h"
 
 static struct PyMethodDef methods[] = {
     {NULL, NULL, 0, NULL}
index c0d2f19675814d76d88503addba917a792a912b5..2ebeb1dff98833e7ab3402c6a85d7c3356579a3f 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_PRIVATE__DATETIME_H_
-#define _NPY_PRIVATE__DATETIME_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY__DATETIME_H_
+#define NUMPY_CORE_SRC_MULTIARRAY__DATETIME_H_
 
 extern NPY_NO_EXPORT char const *_datetime_strings[NPY_DATETIME_NUMUNITS];
 extern NPY_NO_EXPORT int _days_per_month_table[2][12];
@@ -376,4 +376,4 @@ find_object_datetime_type(PyObject *obj, int type_num);
 NPY_NO_EXPORT int
 PyArray_InitializeDatetimeCasts(void);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY__DATETIME_H_ */
index 0cb295957126177e09d9919468cf156e8e5d2291..9486b7cffa5b6e8d0a60047e228abaf9c0efe194 100644 (file)
@@ -1,6 +1,8 @@
 /* -*-c-*- */
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
+
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _NPY_NO_DEPRECATIONS /* for NPY_CHAR */
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
@@ -11,6 +13,8 @@
 #include "mem_overlap.h"
 #include "npy_extint128.h"
 #include "array_method.h"
+#include "npy_hashtable.h"
+#include "dtypemeta.h"
 
 #if defined(MS_WIN32) || defined(__CYGWIN__)
 #define EXPORT(x) __declspec(dllexport) x
@@ -87,7 +91,7 @@ static int copy_@name@(PyArrayIterObject *itx, PyArrayNeighborhoodIterObject *ni
      * For each point in itx, copy the current neighborhood into an array which
      * is appended at the output list
      */
-    for (i = 0; i < itx->size; ++i) {
+    for (i = itx->index; i < itx->size; ++i) {
         PyArrayNeighborhoodIter_Reset(niterx);
 
         for (j = 0; j < PyArray_NDIM(itx->ao); ++j) {
@@ -130,7 +134,7 @@ static int copy_object(PyArrayIterObject *itx, PyArrayNeighborhoodIterObject *ni
      * For each point in itx, copy the current neighborhood into an array which
      * is appended at the output list
      */
-    for (i = 0; i < itx->size; ++i) {
+    for (i = itx->index; i < itx->size; ++i) {
         PyArrayNeighborhoodIter_Reset(niterx);
 
         for (j = 0; j < PyArray_NDIM(itx->ao); ++j) {
@@ -161,10 +165,11 @@ test_neighborhood_iterator(PyObject* NPY_UNUSED(self), PyObject* args)
     PyArrayObject *ax, *afill;
     PyArrayIterObject *itx;
     int i, typenum, mode, st;
+    Py_ssize_t idxstart = 0;
     npy_intp bounds[NPY_MAXDIMS*2];
     PyArrayNeighborhoodIterObject *niterx;
 
-    if (!PyArg_ParseTuple(args, "OOOi", &x, &b, &fill, &mode)) {
+    if (!PyArg_ParseTuple(args, "OOOi|n", &x, &b, &fill, &mode, &idxstart)) {
         return NULL;
     }
 
@@ -224,12 +229,20 @@ test_neighborhood_iterator(PyObject* NPY_UNUSED(self), PyObject* args)
         }
     }
 
+    if (idxstart >= itx->size) {
+        PyErr_SetString(PyExc_ValueError,
+                "start index not compatible with x input");
+        goto clean_itx;
+    }
+
     niterx = (PyArrayNeighborhoodIterObject*)PyArray_NeighborhoodIterNew(
                     (PyArrayIterObject*)itx, bounds, mode, afill);
     if (niterx == NULL) {
         goto clean_afill;
     }
 
+    PyArray_ITER_GOTO1D((PyArrayIterObject*)itx, idxstart);
+
     switch (typenum) {
         case NPY_OBJECT:
             st = copy_object(itx, niterx, bounds, &out);
@@ -1054,7 +1067,7 @@ get_all_cast_information(PyObject *NPY_UNUSED(mod), PyObject *NPY_UNUSED(args))
     for (Py_ssize_t  i = 0; i < nclass; i++) {
         PyArray_DTypeMeta *from_dtype = (
                 (PyArray_DTypeMeta *)PySequence_Fast_GET_ITEM(classes, i));
-        if (from_dtype->abstract) {
+        if (NPY_DT_is_abstract(from_dtype)) {
             /*
              * TODO: In principle probably needs to recursively check this,
              *       also we may allow casts to abstract dtypes at some point.
@@ -1065,7 +1078,8 @@ get_all_cast_information(PyObject *NPY_UNUSED(mod), PyObject *NPY_UNUSED(args))
         PyObject *to_dtype, *cast_obj;
         Py_ssize_t pos = 0;
 
-        while (PyDict_Next(from_dtype->castingimpls, &pos, &to_dtype, &cast_obj)) {
+        while (PyDict_Next(NPY_DT_SLOTS(from_dtype)->castingimpls,
+                           &pos, &to_dtype, &cast_obj)) {
             if (cast_obj == Py_None) {
                 continue;
             }
@@ -1106,6 +1120,92 @@ get_all_cast_information(PyObject *NPY_UNUSED(mod), PyObject *NPY_UNUSED(args))
 }
 
 
+/*
+ * Helper to test the identity cache, takes a list of values and adds
+ * all to the cache except the last key/value pair.  The last value is
+ * ignored, instead the last key is looked up.
+ * None is returned, if the key is not found.
+ * If `replace` is True, duplicate entries are ignored when adding to the
+ * hashtable.
+ */
+static PyObject *
+identityhash_tester(PyObject *NPY_UNUSED(mod),
+        PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames)
+{
+    NPY_PREPARE_ARGPARSER;
+
+    int key_len;
+    int replace;
+    PyObject *replace_obj = Py_False;
+    PyObject *sequence;
+    PyObject *result = NULL;
+
+    if (npy_parse_arguments("identityhash_tester", args, len_args, kwnames,
+            "key_len", &PyArray_PythonPyIntFromInt, &key_len,
+            "sequence", NULL, &sequence,
+            "|replace", NULL, &replace_obj,
+            NULL, NULL, NULL) < 0) {
+        return NULL;
+    }
+    replace = PyObject_IsTrue(replace_obj);
+    if (error_converting(replace)) {
+        return NULL;
+    }
+
+    if (key_len < 1 || key_len >= NPY_MAXARGS) {
+        PyErr_SetString(PyExc_ValueError, "must have 1 to max-args keys.");
+        return NULL;
+    }
+    PyArrayIdentityHash *tb = PyArrayIdentityHash_New(key_len);
+    if (tb == NULL) {
+        return NULL;
+    }
+
+    /* Replace the sequence with a guaranteed fast-sequence */
+    sequence = PySequence_Fast(sequence, "converting sequence.");
+    if (sequence == NULL) {
+        goto finish;
+    }
+
+    Py_ssize_t length = PySequence_Fast_GET_SIZE(sequence);
+    for (Py_ssize_t i = 0; i < length; i++) {
+        PyObject *key_val = PySequence_Fast_GET_ITEM(sequence, i);
+        if (!PyTuple_CheckExact(key_val) || PyTuple_GET_SIZE(key_val) != 2) {
+            PyErr_SetString(PyExc_TypeError, "bad key-value pair.");
+            goto finish;
+        }
+        PyObject *key = PyTuple_GET_ITEM(key_val, 0);
+        PyObject *value = PyTuple_GET_ITEM(key_val, 1);
+        if (!PyTuple_CheckExact(key) || PyTuple_GET_SIZE(key) != key_len) {
+            PyErr_SetString(PyExc_TypeError, "bad key tuple.");
+            goto finish;
+        }
+
+        PyObject *keys[NPY_MAXARGS];
+        for (int j = 0; j < key_len; j++) {
+            keys[j] = PyTuple_GET_ITEM(key, j);
+        }
+        if (i != length - 1) {
+            if (PyArrayIdentityHash_SetItem(tb, keys, value, replace) < 0) {
+                goto finish;
+            }
+        }
+        else {
+            result = PyArrayIdentityHash_GetItem(tb, keys);
+            if (result == NULL) {
+                result = Py_None;
+            }
+            Py_INCREF(result);
+        }
+    }
+
+  finish:
+    Py_DECREF(sequence);
+    PyArrayIdentityHash_Dealloc(tb);
+    return result;
+}
+
+
 /*
  * Test C-api level item getting.
  */
@@ -2263,6 +2363,17 @@ run_intp_converter(PyObject* NPY_UNUSED(self), PyObject *args)
     return tup;
 }
 
+/* used to test NPY_ARRAY_ENSURENOCOPY raises ValueError */
+static PyObject*
+npy_ensurenocopy(PyObject* NPY_UNUSED(self), PyObject* args)
+{
+    int flags = NPY_ARRAY_ENSURENOCOPY;
+    if (!PyArray_CheckFromAny(args, NULL, 0, 0, flags, NULL)) {
+        return NULL;
+    }
+    Py_RETURN_NONE;
+}
+
 static PyMethodDef Multiarray_TestsMethods[] = {
     {"argparse_example_function",
          (PyCFunction)argparse_example_function,
@@ -2324,6 +2435,9 @@ static PyMethodDef Multiarray_TestsMethods[] = {
     {"npy_discard",
         npy_discard,
         METH_O, NULL},
+    {"npy_ensurenocopy",
+        npy_ensurenocopy,
+        METH_O, NULL},
     {"get_buffer_info",
         get_buffer_info,
         METH_VARARGS, NULL},
@@ -2336,6 +2450,9 @@ static PyMethodDef Multiarray_TestsMethods[] = {
         "Return a list with info on all available casts. Some of the info"
         "may differ for an actual cast if it uses value-based casting "
         "(flexible types)."},
+    {"identityhash_tester",
+        (PyCFunction)identityhash_tester,
+        METH_KEYWORDS | METH_FASTCALL, NULL},
     {"array_indexing",
         array_indexing,
         METH_VARARGS, NULL},
index 587d91c49cdaebd9ba22c80247f526e6a165abb4..cc1d7fad823387c099ff64f562484bc7c6ccc4e0 100644 (file)
@@ -1,10 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
-
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/ndarraytypes.h"
 #include "numpy/arrayobject.h"
 
@@ -150,19 +150,19 @@ initialize_and_map_pytypes_to_dtypes()
 static PyArray_DTypeMeta *
 int_common_dtype(PyArray_DTypeMeta *NPY_UNUSED(cls), PyArray_DTypeMeta *other)
 {
-    if (other->legacy && other->type_num < NPY_NTYPES) {
+    if (NPY_DT_is_legacy(other) && other->type_num < NPY_NTYPES) {
         if (other->type_num == NPY_BOOL) {
             /* Use the default integer for bools: */
             return PyArray_DTypeFromTypeNum(NPY_LONG);
         }
         else if (PyTypeNum_ISNUMBER(other->type_num) ||
                  other->type_num == NPY_TIMEDELTA) {
-            /* All other numeric types (ant timdelta) are preserved: */
+            /* All other numeric types (ant timedelta) are preserved: */
             Py_INCREF(other);
             return other;
         }
     }
-    else if (other->legacy) {
+    else if (NPY_DT_is_legacy(other)) {
         /* This is a back-compat fallback to usually do the right thing... */
         return PyArray_DTypeFromTypeNum(NPY_UINT8);
     }
@@ -174,7 +174,7 @@ int_common_dtype(PyArray_DTypeMeta *NPY_UNUSED(cls), PyArray_DTypeMeta *other)
 static PyArray_DTypeMeta *
 float_common_dtype(PyArray_DTypeMeta *cls, PyArray_DTypeMeta *other)
 {
-    if (other->legacy && other->type_num < NPY_NTYPES) {
+    if (NPY_DT_is_legacy(other) && other->type_num < NPY_NTYPES) {
         if (other->type_num == NPY_BOOL || PyTypeNum_ISINTEGER(other->type_num)) {
             /* Use the default integer for bools and ints: */
             return PyArray_DTypeFromTypeNum(NPY_DOUBLE);
@@ -189,7 +189,7 @@ float_common_dtype(PyArray_DTypeMeta *cls, PyArray_DTypeMeta *other)
         Py_INCREF(cls);
         return cls;
     }
-    else if (other->legacy) {
+    else if (NPY_DT_is_legacy(other)) {
         /* This is a back-compat fallback to usually do the right thing... */
         return PyArray_DTypeFromTypeNum(NPY_HALF);
     }
@@ -201,7 +201,7 @@ float_common_dtype(PyArray_DTypeMeta *cls, PyArray_DTypeMeta *other)
 static PyArray_DTypeMeta *
 complex_common_dtype(PyArray_DTypeMeta *cls, PyArray_DTypeMeta *other)
 {
-    if (other->legacy && other->type_num < NPY_NTYPES) {
+    if (NPY_DT_is_legacy(other) && other->type_num < NPY_NTYPES) {
         if (other->type_num == NPY_BOOL ||
                 PyTypeNum_ISINTEGER(other->type_num)) {
             /* Use the default integer for bools and ints: */
@@ -227,7 +227,7 @@ complex_common_dtype(PyArray_DTypeMeta *cls, PyArray_DTypeMeta *other)
             return other;
         }
     }
-    else if (other->legacy) {
+    else if (NPY_DT_is_legacy(other)) {
         /* This is a back-compat fallback to usually do the right thing... */
         return PyArray_DTypeFromTypeNum(NPY_CFLOAT);
     }
@@ -246,17 +246,27 @@ complex_common_dtype(PyArray_DTypeMeta *cls, PyArray_DTypeMeta *other)
  *       `Floating`, `Complex`, and `Integer` (both signed and unsigned).
  *       They will have to be renamed and exposed in that capacity.
  */
+NPY_DType_Slots pyintabstractdtype_slots = {
+    .default_descr = int_default_descriptor,
+    .discover_descr_from_pyobject = discover_descriptor_from_pyint,
+    .common_dtype = int_common_dtype,
+};
+
 NPY_NO_EXPORT PyArray_DTypeMeta PyArray_PyIntAbstractDType = {{{
         PyVarObject_HEAD_INIT(&PyArrayDTypeMeta_Type, 0)
         .tp_basicsize = sizeof(PyArray_Descr),
         .tp_flags = Py_TPFLAGS_DEFAULT,
         .tp_name = "numpy._IntegerAbstractDType",
     },},
-    .abstract = 1,
-    .default_descr = int_default_descriptor,
-    .discover_descr_from_pyobject = discover_descriptor_from_pyint,
-    .common_dtype = int_common_dtype,
-    .kind = 'i',
+    .flags = NPY_DT_ABSTRACT,
+    .dt_slots = &pyintabstractdtype_slots,
+};
+
+
+NPY_DType_Slots pyfloatabstractdtype_slots = {
+    .default_descr = float_default_descriptor,
+    .discover_descr_from_pyobject = discover_descriptor_from_pyfloat,
+    .common_dtype = float_common_dtype,
 };
 
 NPY_NO_EXPORT PyArray_DTypeMeta PyArray_PyFloatAbstractDType = {{{
@@ -265,11 +275,15 @@ NPY_NO_EXPORT PyArray_DTypeMeta PyArray_PyFloatAbstractDType = {{{
        .tp_flags = Py_TPFLAGS_DEFAULT,
         .tp_name = "numpy._FloatAbstractDType",
     },},
-    .abstract = 1,
-    .default_descr = float_default_descriptor,
-    .discover_descr_from_pyobject = discover_descriptor_from_pyfloat,
-    .common_dtype = float_common_dtype,
-    .kind = 'f',
+    .flags = NPY_DT_ABSTRACT,
+    .dt_slots = &pyfloatabstractdtype_slots,
+};
+
+
+NPY_DType_Slots pycomplexabstractdtype_slots = {
+    .default_descr = complex_default_descriptor,
+    .discover_descr_from_pyobject = discover_descriptor_from_pycomplex,
+    .common_dtype = complex_common_dtype,
 };
 
 NPY_NO_EXPORT PyArray_DTypeMeta PyArray_PyComplexAbstractDType = {{{
@@ -278,9 +292,6 @@ NPY_NO_EXPORT PyArray_DTypeMeta PyArray_PyComplexAbstractDType = {{{
          .tp_flags = Py_TPFLAGS_DEFAULT,
         .tp_name = "numpy._ComplexAbstractDType",
     },},
-    .abstract = 1,
-    .default_descr = complex_default_descriptor,
-    .discover_descr_from_pyobject = discover_descriptor_from_pycomplex,
-    .common_dtype = complex_common_dtype,
-    .kind = 'c',
+    .flags = NPY_DT_ABSTRACT,
+    .dt_slots = &pycomplexabstractdtype_slots,
 };
index a6c5267170322d322e4721f5aac71cd3939cd799..42c192cac7b82837e9c957728acc6a4c69d4e78f 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ABSTRACTDTYPES_H
-#define _NPY_ABSTRACTDTYPES_H
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_ABSTRACTDTYPES_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_ABSTRACTDTYPES_H_
 
 #include "dtypemeta.h"
 
@@ -16,4 +16,4 @@ NPY_NO_EXPORT extern PyArray_DTypeMeta PyArray_PyComplexAbstractDType;
 NPY_NO_EXPORT int
 initialize_and_map_pytypes_to_dtypes(void);
 
-#endif  /*_NPY_ABSTRACTDTYPES_H */
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_ABSTRACTDTYPES_H_ */
index 887deff53457acdaec878cab552fc23b70696876..0a694cf62662dda114549067bc2d4f9e2e3d80dc 100644 (file)
@@ -1,25 +1,18 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
-
+#include <structmember.h>
 #include <pymem.h>
-/* public api in 3.7 */
-#if PY_VERSION_HEX < 0x03070000
-#define PyTraceMalloc_Track _PyTraceMalloc_Track
-#define PyTraceMalloc_Untrack _PyTraceMalloc_Untrack
-#endif
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
-#include <numpy/ndarraytypes.h>
+#include "numpy/ndarraytypes.h"
 #include "numpy/arrayobject.h"
-#include <numpy/npy_common.h>
+#include "numpy/npy_common.h"
 #include "npy_config.h"
 #include "alloc.h"
 
-
 #include <assert.h>
-
 #ifdef NPY_OS_LINUX
 #include <sys/mman.h>
 #ifndef MADV_HUGEPAGE
@@ -140,9 +133,10 @@ npy_alloc_cache(npy_uintp sz)
 
 /* zero initialized data, sz is number of bytes to allocate */
 NPY_NO_EXPORT void *
-npy_alloc_cache_zero(npy_uintp sz)
+npy_alloc_cache_zero(size_t nmemb, size_t size)
 {
     void * p;
+    size_t sz = nmemb * size;
     NPY_BEGIN_THREADS_DEF;
     if (sz < NBUCKETS) {
         p = _npy_alloc_cache(sz, 1, NBUCKETS, datacache, &PyDataMem_NEW);
@@ -152,7 +146,7 @@ npy_alloc_cache_zero(npy_uintp sz)
         return p;
     }
     NPY_BEGIN_THREADS;
-    p = PyDataMem_NEW_ZEROED(sz, 1);
+    p = PyDataMem_NEW_ZEROED(nmemb, size);
     NPY_END_THREADS;
     return p;
 }
@@ -194,8 +188,8 @@ npy_free_cache_dim(void * p, npy_uintp sz)
 
 
 /* malloc/free/realloc hook */
-NPY_NO_EXPORT PyDataMem_EventHookFunc *_PyDataMem_eventhook;
-NPY_NO_EXPORT void *_PyDataMem_eventhook_user_data;
+NPY_NO_EXPORT PyDataMem_EventHookFunc *_PyDataMem_eventhook = NULL;
+NPY_NO_EXPORT void *_PyDataMem_eventhook_user_data = NULL;
 
 /*NUMPY_API
  * Sets the allocation event hook for numpy array data.
@@ -261,21 +255,21 @@ PyDataMem_NEW(size_t size)
  * Allocates zeroed memory for array data.
  */
 NPY_NO_EXPORT void *
-PyDataMem_NEW_ZEROED(size_t size, size_t elsize)
+PyDataMem_NEW_ZEROED(size_t nmemb, size_t size)
 {
     void *result;
 
-    result = calloc(size, elsize);
+    result = calloc(nmemb, size);
     if (_PyDataMem_eventhook != NULL) {
         NPY_ALLOW_C_API_DEF
         NPY_ALLOW_C_API
         if (_PyDataMem_eventhook != NULL) {
-            (*_PyDataMem_eventhook)(NULL, result, size * elsize,
+            (*_PyDataMem_eventhook)(NULL, result, nmemb * size,
                                     _PyDataMem_eventhook_user_data);
         }
         NPY_DISABLE_C_API
     }
-    PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
+    PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, nmemb * size);
     return result;
 }
 
@@ -323,3 +317,344 @@ PyDataMem_RENEW(void *ptr, size_t size)
     }
     return result;
 }
+
+// The default data mem allocator malloc routine does not make use of a ctx.
+// It should be called only through PyDataMem_UserNEW
+// since itself does not handle eventhook and tracemalloc logic.
+static NPY_INLINE void *
+default_malloc(void *NPY_UNUSED(ctx), size_t size)
+{
+    return _npy_alloc_cache(size, 1, NBUCKETS, datacache, &malloc);
+}
+
+// The default data mem allocator calloc routine does not make use of a ctx.
+// It should be called only through PyDataMem_UserNEW_ZEROED
+// since itself does not handle eventhook and tracemalloc logic.
+static NPY_INLINE void *
+default_calloc(void *NPY_UNUSED(ctx), size_t nelem, size_t elsize)
+{
+    void * p;
+    size_t sz = nelem * elsize;
+    NPY_BEGIN_THREADS_DEF;
+    if (sz < NBUCKETS) {
+        p = _npy_alloc_cache(sz, 1, NBUCKETS, datacache, &malloc);
+        if (p) {
+            memset(p, 0, sz);
+        }
+        return p;
+    }
+    NPY_BEGIN_THREADS;
+    p = calloc(nelem, elsize);
+    NPY_END_THREADS;
+    return p;
+}
+
+// The default data mem allocator realloc routine does not make use of a ctx.
+// It should be called only through PyDataMem_UserRENEW
+// since itself does not handle eventhook and tracemalloc logic.
+static NPY_INLINE void *
+default_realloc(void *NPY_UNUSED(ctx), void *ptr, size_t new_size)
+{
+    return realloc(ptr, new_size);
+}
+
+// The default data mem allocator free routine does not make use of a ctx.
+// It should be called only through PyDataMem_UserFREE
+// since itself does not handle eventhook and tracemalloc logic.
+static NPY_INLINE void
+default_free(void *NPY_UNUSED(ctx), void *ptr, size_t size)
+{
+    _npy_free_cache(ptr, size, NBUCKETS, datacache, &free);
+}
+
+/* Memory handler global default */
+PyDataMem_Handler default_handler = {
+    "default_allocator",
+    1,
+    {
+        NULL,            /* ctx */
+        default_malloc,  /* malloc */
+        default_calloc,  /* calloc */
+        default_realloc, /* realloc */
+        default_free     /* free */
+    }
+};
+/* singleton capsule of the default handler */
+PyObject *PyDataMem_DefaultHandler;
+
+#if (!defined(PYPY_VERSION_NUM) || PYPY_VERSION_NUM >= 0x07030600)
+PyObject *current_handler;
+#endif
+
+int uo_index=0;   /* user_override index */
+
+/* Wrappers for the default or any user-assigned PyDataMem_Handler */
+
+NPY_NO_EXPORT void *
+PyDataMem_UserNEW(size_t size, PyObject *mem_handler)
+{
+    void *result;
+    PyDataMem_Handler *handler = (PyDataMem_Handler *) PyCapsule_GetPointer(mem_handler, "mem_handler");
+    if (handler == NULL) {
+        return NULL;
+    }
+    assert(size != 0);
+    result = handler->allocator.malloc(handler->allocator.ctx, size);
+    if (_PyDataMem_eventhook != NULL) {
+        NPY_ALLOW_C_API_DEF
+        NPY_ALLOW_C_API
+        if (_PyDataMem_eventhook != NULL) {
+            (*_PyDataMem_eventhook)(NULL, result, size,
+                                    _PyDataMem_eventhook_user_data);
+        }
+        NPY_DISABLE_C_API
+    }
+    PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
+    return result;
+}
+
+NPY_NO_EXPORT void *
+PyDataMem_UserNEW_ZEROED(size_t nmemb, size_t size, PyObject *mem_handler)
+{
+    void *result;
+    PyDataMem_Handler *handler = (PyDataMem_Handler *) PyCapsule_GetPointer(mem_handler, "mem_handler");
+    if (handler == NULL) {
+        return NULL;
+    }
+    result = handler->allocator.calloc(handler->allocator.ctx, nmemb, size);
+    if (_PyDataMem_eventhook != NULL) {
+        NPY_ALLOW_C_API_DEF
+        NPY_ALLOW_C_API
+        if (_PyDataMem_eventhook != NULL) {
+            (*_PyDataMem_eventhook)(NULL, result, nmemb * size,
+                                    _PyDataMem_eventhook_user_data);
+        }
+        NPY_DISABLE_C_API
+    }
+    PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, nmemb * size);
+    return result;
+}
+
+/* Similar to array_dealloc in arrayobject.c */
+static NPY_INLINE void
+WARN_IN_FREE(PyObject* warning, const char * msg) {
+    if (PyErr_WarnEx(warning, msg, 1) < 0) {
+        PyObject * s;
+
+        s = PyUnicode_FromString("PyDataMem_UserFREE");
+        if (s) {
+            PyErr_WriteUnraisable(s);
+            Py_DECREF(s);
+        }
+        else {
+            PyErr_WriteUnraisable(Py_None);
+        }
+    }
+}
+
+
+
+NPY_NO_EXPORT void
+PyDataMem_UserFREE(void *ptr, size_t size, PyObject *mem_handler)
+{
+    PyDataMem_Handler *handler = (PyDataMem_Handler *) PyCapsule_GetPointer(mem_handler, "mem_handler");
+    if (handler == NULL) {
+        WARN_IN_FREE(PyExc_RuntimeWarning,
+                     "Could not get pointer to 'mem_handler' from PyCapsule");
+        PyErr_Clear();
+        return;
+    }
+    PyTraceMalloc_Untrack(NPY_TRACE_DOMAIN, (npy_uintp)ptr);
+    handler->allocator.free(handler->allocator.ctx, ptr, size);
+    if (_PyDataMem_eventhook != NULL) {
+        NPY_ALLOW_C_API_DEF
+        NPY_ALLOW_C_API
+        if (_PyDataMem_eventhook != NULL) {
+            (*_PyDataMem_eventhook)(ptr, NULL, 0,
+                                    _PyDataMem_eventhook_user_data);
+        }
+        NPY_DISABLE_C_API
+    }
+}
+
+NPY_NO_EXPORT void *
+PyDataMem_UserRENEW(void *ptr, size_t size, PyObject *mem_handler)
+{
+    void *result;
+    PyDataMem_Handler *handler = (PyDataMem_Handler *) PyCapsule_GetPointer(mem_handler, "mem_handler");
+    if (handler == NULL) {
+        return NULL;
+    }
+
+    assert(size != 0);
+    result = handler->allocator.realloc(handler->allocator.ctx, ptr, size);
+    if (result != ptr) {
+        PyTraceMalloc_Untrack(NPY_TRACE_DOMAIN, (npy_uintp)ptr);
+    }
+    PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
+    if (_PyDataMem_eventhook != NULL) {
+        NPY_ALLOW_C_API_DEF
+        NPY_ALLOW_C_API
+        if (_PyDataMem_eventhook != NULL) {
+            (*_PyDataMem_eventhook)(ptr, result, size,
+                                    _PyDataMem_eventhook_user_data);
+        }
+        NPY_DISABLE_C_API
+    }
+    return result;
+}
+
+/*NUMPY_API
+ * Set a new allocation policy. If the input value is NULL, will reset
+ * the policy to the default. Return the previous policy, or
+ * return NULL if an error has occurred. We wrap the user-provided
+ * functions so they will still call the python and numpy
+ * memory management callback hooks.
+ */
+NPY_NO_EXPORT PyObject *
+PyDataMem_SetHandler(PyObject *handler)
+{
+    PyObject *old_handler;
+#if (!defined(PYPY_VERSION_NUM) || PYPY_VERSION_NUM >= 0x07030600)
+    PyObject *token;
+    if (PyContextVar_Get(current_handler, NULL, &old_handler)) {
+        return NULL;
+    }
+    if (handler == NULL) {
+        handler = PyDataMem_DefaultHandler;
+    }
+    token = PyContextVar_Set(current_handler, handler);
+    if (token == NULL) {
+        Py_DECREF(old_handler);
+        return NULL;
+    }
+    Py_DECREF(token);
+    return old_handler;
+#else
+    PyObject *p;
+    p = PyThreadState_GetDict();
+    if (p == NULL) {
+        return NULL;
+    }
+    old_handler = PyDict_GetItemString(p, "current_allocator");
+    if (old_handler == NULL) {
+        old_handler = PyDataMem_DefaultHandler
+    }
+    Py_INCREF(old_handler);
+    if (handler == NULL) {
+        handler = PyDataMem_DefaultHandler;
+    }
+    const int error = PyDict_SetItemString(p, "current_allocator", handler);
+    if (error) {
+        Py_DECREF(old_handler);
+        return NULL;
+    }
+    return old_handler;
+#endif
+}
+
+/*NUMPY_API
+ * Return the policy that will be used to allocate data
+ * for the next PyArrayObject. On failure, return NULL.
+ */
+NPY_NO_EXPORT PyObject *
+PyDataMem_GetHandler()
+{
+    PyObject *handler;
+#if (!defined(PYPY_VERSION_NUM) || PYPY_VERSION_NUM >= 0x07030600)
+    if (PyContextVar_Get(current_handler, NULL, &handler)) {
+        return NULL;
+    }
+    return handler;
+#else
+    PyObject *p = PyThreadState_GetDict();
+    if (p == NULL) {
+        return NULL;
+    }
+    handler = PyDict_GetItemString(p, "current_allocator");
+    if (handler == NULL) {
+        handler = PyCapsule_New(&default_handler, "mem_handler", NULL);
+        if (handler == NULL) {
+            return NULL;
+        }
+    }
+    else {
+        Py_INCREF(handler);
+    }
+    return handler;
+#endif
+}
+
+NPY_NO_EXPORT PyObject *
+get_handler_name(PyObject *NPY_UNUSED(self), PyObject *args)
+{
+    PyObject *arr=NULL;
+    if (!PyArg_ParseTuple(args, "|O:get_handler_name", &arr)) {
+        return NULL;
+    }
+    if (arr != NULL && !PyArray_Check(arr)) {
+         PyErr_SetString(PyExc_ValueError, "if supplied, argument must be an ndarray");
+         return NULL;
+    }
+    PyObject *mem_handler;
+    PyDataMem_Handler *handler;
+    PyObject *name;
+    if (arr != NULL) {
+        mem_handler = PyArray_HANDLER((PyArrayObject *) arr);
+        if (mem_handler == NULL) {
+            Py_RETURN_NONE;
+        }
+        Py_INCREF(mem_handler);
+    }
+    else {
+        mem_handler = PyDataMem_GetHandler();
+        if (mem_handler == NULL) {
+            return NULL;
+        }
+    }
+    handler = (PyDataMem_Handler *) PyCapsule_GetPointer(mem_handler, "mem_handler");
+    if (handler == NULL) {
+        Py_DECREF(mem_handler);
+        return NULL;
+    }
+    name = PyUnicode_FromString(handler->name);
+    Py_DECREF(mem_handler);
+    return name;
+}
+
+NPY_NO_EXPORT PyObject *
+get_handler_version(PyObject *NPY_UNUSED(self), PyObject *args)
+{
+    PyObject *arr=NULL;
+    if (!PyArg_ParseTuple(args, "|O:get_handler_version", &arr)) {
+        return NULL;
+    }
+    if (arr != NULL && !PyArray_Check(arr)) {
+         PyErr_SetString(PyExc_ValueError, "if supplied, argument must be an ndarray");
+         return NULL;
+    }
+    PyObject *mem_handler;
+    PyDataMem_Handler *handler;
+    PyObject *version;
+    if (arr != NULL) {
+        mem_handler = PyArray_HANDLER((PyArrayObject *) arr);
+        if (mem_handler == NULL) {
+            Py_RETURN_NONE;
+        }
+        Py_INCREF(mem_handler);
+    }
+    else {
+        mem_handler = PyDataMem_GetHandler();
+        if (mem_handler == NULL) {
+            return NULL;
+        }
+    }
+    handler = (PyDataMem_Handler *) PyCapsule_GetPointer(mem_handler, "mem_handler");
+    if (handler == NULL) {
+        Py_DECREF(mem_handler);
+        return NULL;
+    }
+    version = PyLong_FromLong(handler->version);
+    Py_DECREF(mem_handler);
+    return version;
+}
index 15e31ebb5f2ff998968b961c7c0a1eb26ee1dd76..13c82845813dc26292671718d40a9baf2d6bab3b 100644 (file)
@@ -1,8 +1,9 @@
-#ifndef _NPY_ARRAY_ALLOC_H_
-#define _NPY_ARRAY_ALLOC_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_ALLOC_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_ALLOC_H_
+
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
-#include <numpy/ndarraytypes.h>
+#include "numpy/ndarraytypes.h"
 
 #define NPY_TRACE_DOMAIN 389047
 
@@ -10,13 +11,16 @@ NPY_NO_EXPORT PyObject *
 _set_madvise_hugepage(PyObject *NPY_UNUSED(self), PyObject *enabled_obj);
 
 NPY_NO_EXPORT void *
-npy_alloc_cache(npy_uintp sz);
+PyDataMem_UserNEW(npy_uintp sz, PyObject *mem_handler);
 
 NPY_NO_EXPORT void *
-npy_alloc_cache_zero(npy_uintp sz);
+PyDataMem_UserNEW_ZEROED(size_t nmemb, size_t size, PyObject *mem_handler);
 
 NPY_NO_EXPORT void
-npy_free_cache(void * p, npy_uintp sd);
+PyDataMem_UserFREE(void * p, npy_uintp sd, PyObject *mem_handler);
+
+NPY_NO_EXPORT void *
+PyDataMem_UserRENEW(void *ptr, size_t size, PyObject *mem_handler);
 
 NPY_NO_EXPORT void *
 npy_alloc_cache_dim(npy_uintp sz);
@@ -36,4 +40,14 @@ npy_free_cache_dim_array(PyArrayObject * arr)
     npy_free_cache_dim(PyArray_DIMS(arr), PyArray_NDIM(arr));
 }
 
+extern PyDataMem_Handler default_handler;
+#if (!defined(PYPY_VERSION_NUM) || PYPY_VERSION_NUM >= 0x07030600)
+extern PyObject *current_handler; /* PyContextVar/PyCapsule */
 #endif
+
+NPY_NO_EXPORT PyObject *
+get_handler_name(PyObject *NPY_UNUSED(self), PyObject *obj);
+NPY_NO_EXPORT PyObject *
+get_handler_version(PyObject *NPY_UNUSED(self), PyObject *obj);
+
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_ALLOC_H_ */
index 665dadfbfb640339dce21846977279305b8b806b..020a7f29a61524e74f3aeeeb59cb03cf1a8da0e6 100644 (file)
@@ -6,13 +6,13 @@
  *
  * See LICENSE.txt for the license.
  */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
-#include <numpy/ndarraytypes.h>
+#include "numpy/ndarraytypes.h"
 
 #include "npy_config.h"
 #include "npy_pycompat.h"
index 6cd5f4ad9be5493acfc8f0cb3eb2b840d89f793a..4ffef7ecc96e61b2fcb2cb548838b2e1c5a06cab 100644 (file)
@@ -6,12 +6,12 @@
  *
  * See LICENSE.txt for the license.
  */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include <numpy/ndarraytypes.h>
 
 #include "npy_config.h"
index 22050a56ff6bafb8bf7578fe5c16a1b286be4b7f..2598e4bde6ea1720b06f8a54e745a54b84a689a9 100644 (file)
@@ -1,8 +1,9 @@
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _UMATHMODULE
 #define _MULTIARRAYMODULE
+#define _UMATHMODULE
 
-#include "Python.h"
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
 
 #include "numpy/npy_3kcompat.h"
 
@@ -135,7 +136,7 @@ _prime_global_pytype_to_type_dict(void)
  *
  * This assumes that the DType class is guaranteed to hold on the
  * python type (this assumption is guaranteed).
- * This functionality supercedes ``_typenum_fromtypeobj``.
+ * This functionality supersedes ``_typenum_fromtypeobj``.
  *
  * @param DType DType to map the python type to
  * @param pytype Python type to map from
@@ -154,7 +155,7 @@ _PyArray_MapPyTypeToDType(
          * We expect that user dtypes (for now) will subclass some numpy
          * scalar class to allow automatic discovery.
          */
-        if (DType->legacy) {
+        if (NPY_DT_is_legacy(DType)) {
             /*
              * For legacy user dtypes, discovery relied on subclassing, but
              * arbitrary type objects are supported, so do nothing.
@@ -257,8 +258,7 @@ discover_dtype_from_pyobject(
          * asked to attempt to do so later, if no other matching DType exists.)
          */
         if ((Py_TYPE(obj) == fixed_DType->scalar_type) ||
-                (fixed_DType->is_known_scalar_type != NULL &&
-                 fixed_DType->is_known_scalar_type(fixed_DType, Py_TYPE(obj)))) {
+                NPY_DT_CALL_is_known_scalar_type(fixed_DType, Py_TYPE(obj))) {
             Py_INCREF(fixed_DType);
             return fixed_DType;
         }
@@ -346,10 +346,10 @@ find_scalar_descriptor(
          * chance.  This allows for example string, to call `str(obj)` to
          * figure out the length for arbitrary objects.
          */
-        descr = fixed_DType->discover_descr_from_pyobject(fixed_DType, obj);
+        descr = NPY_DT_CALL_discover_descr_from_pyobject(fixed_DType, obj);
     }
     else {
-        descr = DType->discover_descr_from_pyobject(DType, obj);
+        descr = NPY_DT_CALL_discover_descr_from_pyobject(DType, obj);
     }
     if (descr == NULL) {
         return NULL;
@@ -425,7 +425,7 @@ PyArray_Pack(PyArray_Descr *descr, char *item, PyObject *value)
         return descr->f->setitem(value, item, &arr_fields);
     }
     PyArray_Descr *tmp_descr;
-    tmp_descr = DType->discover_descr_from_pyobject(DType, value);
+    tmp_descr = NPY_DT_CALL_discover_descr_from_pyobject(DType, value);
     Py_DECREF(DType);
     if (tmp_descr == NULL) {
         return -1;
@@ -555,6 +555,7 @@ npy_new_coercion_cache(
         cache = PyMem_Malloc(sizeof(coercion_cache_obj));
     }
     if (cache == NULL) {
+        Py_DECREF(arr_or_sequence);
         PyErr_NoMemory();
         return -1;
     }
@@ -713,7 +714,7 @@ find_descriptor_from_array(
         return 0;
     }
 
-    if (NPY_UNLIKELY(DType->parametric && PyArray_ISOBJECT(arr))) {
+    if (NPY_UNLIKELY(NPY_DT_is_parametric(DType) && PyArray_ISOBJECT(arr))) {
         /*
          * We have one special case, if (and only if) the input array is of
          * object DType and the dtype is not fixed already but parametric.
@@ -833,7 +834,7 @@ PyArray_AdaptDescriptorToArray(PyArrayObject *arr, PyObject *dtype)
         }
         if (new_dtype == NULL) {
             /* This is an object array but contained no elements, use default */
-            new_dtype = new_DType->default_descr(new_DType);
+            new_dtype = NPY_DT_CALL_default_descr(new_DType);
         }
     }
     Py_DECREF(new_DType);
@@ -857,6 +858,7 @@ PyArray_AdaptDescriptorToArray(PyArrayObject *arr, PyObject *dtype)
  *        (Initially it is a pointer to the user-provided head pointer).
  * @param fixed_DType User provided fixed DType class
  * @param flags Discovery flags (reporting and behaviour flags, see def.)
+ * @param never_copy Specifies if a copy is allowed during array creation.
  * @return The updated number of maximum dimensions (i.e. scalars will set
  *         this to the current dimensions).
  */
@@ -865,7 +867,8 @@ PyArray_DiscoverDTypeAndShape_Recursive(
         PyObject *obj, int curr_dims, int max_dims, PyArray_Descr**out_descr,
         npy_intp out_shape[NPY_MAXDIMS],
         coercion_cache_obj ***coercion_cache_tail_ptr,
-        PyArray_DTypeMeta *fixed_DType, enum _dtype_discovery_flags *flags)
+        PyArray_DTypeMeta *fixed_DType, enum _dtype_discovery_flags *flags,
+        int never_copy)
 {
     PyArrayObject *arr = NULL;
     PyObject *seq;
@@ -923,7 +926,7 @@ PyArray_DiscoverDTypeAndShape_Recursive(
             requested_descr = *out_descr;
         }
         arr = (PyArrayObject *)_array_from_array_like(obj,
-                requested_descr, 0, NULL);
+                requested_descr, 0, NULL, never_copy);
         if (arr == NULL) {
             return -1;
         }
@@ -1117,7 +1120,7 @@ PyArray_DiscoverDTypeAndShape_Recursive(
         max_dims = PyArray_DiscoverDTypeAndShape_Recursive(
                 objects[i], curr_dims + 1, max_dims,
                 out_descr, out_shape, coercion_cache_tail_ptr, fixed_DType,
-                flags);
+                flags, never_copy);
 
         if (max_dims < 0) {
             return -1;
@@ -1157,6 +1160,7 @@ PyArray_DiscoverDTypeAndShape_Recursive(
  *        The result may be unchanged (remain NULL) when converting a
  *        sequence with no elements. In this case it is callers responsibility
  *        to choose a default.
+ * @param never_copy Specifies that a copy is not allowed.
  * @return dimensions of the discovered object or -1 on error.
  *         WARNING: If (and only if) the output is a single array, the ndim
  *         returned _can_ exceed the maximum allowed number of dimensions.
@@ -1169,7 +1173,7 @@ PyArray_DiscoverDTypeAndShape(
         npy_intp out_shape[NPY_MAXDIMS],
         coercion_cache_obj **coercion_cache,
         PyArray_DTypeMeta *fixed_DType, PyArray_Descr *requested_descr,
-        PyArray_Descr **out_descr)
+        PyArray_Descr **out_descr, int never_copy)
 {
     coercion_cache_obj **coercion_cache_head = coercion_cache;
     *coercion_cache = NULL;
@@ -1214,7 +1218,7 @@ PyArray_DiscoverDTypeAndShape(
 
     int ndim = PyArray_DiscoverDTypeAndShape_Recursive(
             obj, 0, max_dims, out_descr, out_shape, &coercion_cache,
-            fixed_DType, &flags);
+            fixed_DType, &flags, never_copy);
     if (ndim < 0) {
         goto fail;
     }
@@ -1376,7 +1380,7 @@ PyArray_DiscoverDTypeAndShape(
          * the correct default.
          */
         if (fixed_DType != NULL) {
-            *out_descr = fixed_DType->default_descr(fixed_DType);
+            *out_descr = NPY_DT_CALL_default_descr(fixed_DType);
             if (*out_descr == NULL) {
                 goto fail;
             }
@@ -1400,7 +1404,7 @@ PyArray_DiscoverDTypeAndShape(
  * These should be largely deprecated, and represent only the DType class
  * for most `dtype` parameters.
  *
- * TODO: This function should eventually recieve a deprecation warning and
+ * TODO: This function should eventually receive a deprecation warning and
  *       be removed.
  *
  * @param descr
@@ -1499,7 +1503,7 @@ _discover_array_parameters(PyObject *NPY_UNUSED(self),
     int ndim = PyArray_DiscoverDTypeAndShape(
             obj, NPY_MAXDIMS, shape,
             &coercion_cache,
-            fixed_DType, fixed_descriptor, (PyArray_Descr **)&out_dtype);
+            fixed_DType, fixed_descriptor, (PyArray_Descr **)&out_dtype, 0);
     Py_XDECREF(fixed_DType);
     Py_XDECREF(fixed_descriptor);
     if (ndim < 0) {
index c5ccad2255499723162801d1bc99119ca9bc6dd6..f2482cecc0058248ac1f9985b4f1d69ecd2cec7f 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ARRAY_COERCION_H
-#define _NPY_ARRAY_COERCION_H
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_ARRAY_COERCION_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_ARRAY_COERCION_H_
 
 
 /*
@@ -31,7 +31,7 @@ PyArray_DiscoverDTypeAndShape(
         npy_intp out_shape[NPY_MAXDIMS],
         coercion_cache_obj **coercion_cache,
         PyArray_DTypeMeta *fixed_DType, PyArray_Descr *requested_descr,
-        PyArray_Descr **out_descr);
+        PyArray_Descr **out_descr, int never_copy);
 
 NPY_NO_EXPORT int
 PyArray_ExtractDTypeAndDescriptor(PyObject *dtype,
@@ -54,4 +54,4 @@ npy_unlink_coercion_cache(coercion_cache_obj *current);
 NPY_NO_EXPORT int
 PyArray_AssignFromCache(PyArrayObject *self, coercion_cache_obj *cache);
 
-#endif  /* _NPY_ARRAY_COERCION_H */
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_ARRAY_COERCION_H_ */
index 3ecc20d1d60c718f98a6d89d7d0787a6b1c6cb28..d93dac5069494354e7b1973afdc786f79e9a2c30 100644 (file)
  *    It is then sufficient for a ufunc (or other owner) to only hold a
  *    weak reference to the input DTypes.
  */
-
-
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
+
 #include <npy_pycompat.h>
 #include "arrayobject.h"
 #include "array_method.h"
 #include "dtypemeta.h"
 #include "common_dtype.h"
 #include "convert_datatype.h"
+#include "common.h"
 
 
 /*
@@ -58,60 +58,24 @@ default_resolve_descriptors(
 {
     int nin = method->nin;
     int nout = method->nout;
-    int all_defined = 1;
 
     for (int i = 0; i < nin + nout; i++) {
         PyArray_DTypeMeta *dtype = dtypes[i];
-        if (dtype == NULL) {
-            output_descrs[i] = NULL;
-            all_defined = 0;
-            continue;
-        }
-        if (NPY_DTYPE(input_descrs[i]) == dtype) {
+        if (input_descrs[i] != NULL) {
             output_descrs[i] = ensure_dtype_nbo(input_descrs[i]);
         }
         else {
-            output_descrs[i] = dtype->default_descr(dtype);
+            output_descrs[i] = NPY_DT_CALL_default_descr(dtype);
         }
         if (NPY_UNLIKELY(output_descrs[i] == NULL)) {
             goto fail;
         }
     }
-    if (all_defined) {
-        return method->casting;
-    }
-
-    if (NPY_UNLIKELY(nin == 0 || dtypes[0] == NULL)) {
-        /* Registration should reject this, so this would be indicates a bug */
-        PyErr_SetString(PyExc_RuntimeError,
-                "Invalid use of default resolver without inputs or with "
-                "input or output DType incorrectly missing.");
-        goto fail;
-    }
-    /* We find the common dtype of all inputs, and use it for the unknowns */
-    PyArray_DTypeMeta *common_dtype = dtypes[0];
-    assert(common_dtype != NULL);
-    for (int i = 1; i < nin; i++) {
-        Py_SETREF(common_dtype, PyArray_CommonDType(common_dtype, dtypes[i]));
-        if (common_dtype == NULL) {
-            goto fail;
-        }
-    }
-    for (int i = nin; i < nin + nout; i++) {
-        if (output_descrs[i] != NULL) {
-            continue;
-        }
-        if (NPY_DTYPE(input_descrs[i]) == common_dtype) {
-            output_descrs[i] = ensure_dtype_nbo(input_descrs[i]);
-        }
-        else {
-            output_descrs[i] = common_dtype->default_descr(common_dtype);
-        }
-        if (NPY_UNLIKELY(output_descrs[i] == NULL)) {
-            goto fail;
-        }
-    }
-
+    /*
+     * If we relax the requirement for specifying all `dtypes` (e.g. allow
+     * abstract ones or unspecified outputs).  We can use the common-dtype
+     * operation to provide a default here.
+     */
     return method->casting;
 
   fail:
@@ -219,9 +183,18 @@ validate_spec(PyArrayMethod_Spec *spec)
     }
 
     for (int i = 0; i < nargs; i++) {
-        if (spec->dtypes[i] == NULL && i < spec->nin) {
+        /*
+         * Note that we could allow for output dtypes to not be specified
+         * (the array-method would have to make sure to support this).
+         * We could even allow for some dtypes to be abstract.
+         * For now, assume that this is better handled in a promotion step.
+         * One problem with providing all DTypes is the definite need to
+         * hold references.  We probably, eventually, have to implement
+         * traversal and trust the GC to deal with it.
+         */
+        if (spec->dtypes[i] == NULL) {
             PyErr_Format(PyExc_TypeError,
-                    "ArrayMethod must have well defined input DTypes. "
+                    "ArrayMethod must provide all input and output DTypes. "
                     "(method: %s)", spec->name);
             return -1;
         }
@@ -231,10 +204,10 @@ validate_spec(PyArrayMethod_Spec *spec)
                     "(method: %s)", spec->dtypes[i], spec->name);
             return -1;
         }
-        if (spec->dtypes[i]->abstract && i < spec->nin) {
+        if (NPY_DT_is_abstract(spec->dtypes[i])) {
             PyErr_Format(PyExc_TypeError,
-                    "abstract DType %S are currently not allowed for inputs."
-                    "(method: %s defined at %s)", spec->dtypes[i], spec->name);
+                    "abstract DType %S are currently not supported."
+                    "(method: %s)", spec->dtypes[i], spec->name);
             return -1;
         }
     }
@@ -323,11 +296,11 @@ fill_arraymethod_from_slots(
                     PyErr_Format(PyExc_TypeError,
                             "Must specify output DTypes or use custom "
                             "`resolve_descriptors` when there are no inputs. "
-                            "(method: %s defined at %s)", spec->name);
+                            "(method: %s)", spec->name);
                     return -1;
                 }
             }
-            if (i >= meth->nin && res->dtypes[i]->parametric) {
+            if (i >= meth->nin && NPY_DT_is_parametric(res->dtypes[i])) {
                 PyErr_Format(PyExc_TypeError,
                         "must provide a `resolve_descriptors` function if any "
                         "output DType is parametric. (method: %s)",
@@ -370,6 +343,26 @@ fill_arraymethod_from_slots(
 }
 
 
+/*
+ * Public version of `PyArrayMethod_FromSpec_int` (see below).
+ *
+ * TODO: Error paths will probably need to be improved before a release into
+ *       the non-experimental public API.
+ */
+NPY_NO_EXPORT PyObject *
+PyArrayMethod_FromSpec(PyArrayMethod_Spec *spec)
+{
+    for (int i = 0; i < spec->nin + spec->nout; i++) {
+        if (!PyObject_TypeCheck(spec->dtypes[i], &PyArrayDTypeMeta_Type)) {
+            PyErr_SetString(PyExc_RuntimeError,
+                    "ArrayMethod spec contained a non DType.");
+            return NULL;
+        }
+    }
+    return (PyObject *)PyArrayMethod_FromSpec_int(spec, 0);
+}
+
+
 /**
  * Create a new ArrayMethod (internal version).
  *
@@ -466,22 +459,20 @@ NPY_NO_EXPORT PyTypeObject PyArrayMethod_Type = {
 };
 
 
-
 static PyObject *
 boundarraymethod_repr(PyBoundArrayMethodObject *self)
 {
     int nargs = self->method->nin + self->method->nout;
-    PyObject *dtypes = PyTuple_New(nargs);
+    PyObject *dtypes = PyArray_TupleFromItems(
+            nargs, (PyObject **)self->dtypes, 0);
     if (dtypes == NULL) {
         return NULL;
     }
-    for (int i = 0; i < nargs; i++) {
-        Py_INCREF(self->dtypes[i]);
-        PyTuple_SET_ITEM(dtypes, i, (PyObject *)self->dtypes[i]);
-    }
-    return PyUnicode_FromFormat(
-            "<np._BoundArrayMethod `%s` for dtypes %S>",
-            self->method->name, dtypes);
+    PyObject *repr = PyUnicode_FromFormat(
+                        "<np._BoundArrayMethod `%s` for dtypes %S>",
+                        self->method->name, dtypes);
+    Py_DECREF(dtypes);
+    return repr;
 }
 
 
@@ -587,7 +578,7 @@ boundarraymethod__resolve_descripors(
      */
     int parametric = 0;
     for (int i = 0; i < nin + nout; i++) {
-        if (self->dtypes[i]->parametric) {
+        if (NPY_DT_is_parametric(self->dtypes[i])) {
             parametric = 1;
             break;
         }
@@ -685,7 +676,7 @@ boundarraymethod__simple_strided_call(
                     "All arrays must have the same length.");
             return NULL;
         }
-        if (i >= nout) {
+        if (i >= nin) {
             if (PyArray_FailUnlessWriteable(
                     arrays[i], "_simple_strided_call() output") < 0) {
                 return NULL;
@@ -758,6 +749,132 @@ boundarraymethod__simple_strided_call(
 }
 
 
+/*
+ * Support for masked inner-strided loops.  Masked inner-strided loops are
+ * only used in the ufunc machinery.  So this special cases them.
+ * In the future it probably makes sense to create an::
+ *
+ *     Arraymethod->get_masked_strided_loop()
+ *
+ * Function which this can wrap instead.
+ */
+typedef struct {
+    NpyAuxData base;
+    PyArrayMethod_StridedLoop *unmasked_stridedloop;
+    NpyAuxData *unmasked_auxdata;
+    int nargs;
+    char *dataptrs[];
+} _masked_stridedloop_data;
+
+
+static void
+_masked_stridedloop_data_free(NpyAuxData *auxdata)
+{
+    _masked_stridedloop_data *data = (_masked_stridedloop_data *)auxdata;
+    NPY_AUXDATA_FREE(data->unmasked_auxdata);
+    PyMem_Free(data);
+}
+
+
+/*
+ * This function wraps a regular unmasked strided-loop as a
+ * masked strided-loop, only calling the function for elements
+ * where the mask is True.
+ *
+ * TODO: Reductions also use this code to implement masked reductions.
+ *       Before consolidating them, reductions had a special case for
+ *       broadcasts: when the mask stride was 0 the code does not check all
+ *       elements as `npy_memchr` currently does.
+ *       It may be worthwhile to add such an optimization again if broadcasted
+ *       masks are common enough.
+ */
+static int
+generic_masked_strided_loop(PyArrayMethod_Context *context,
+        char *const *data, const npy_intp *dimensions,
+        const npy_intp *strides, NpyAuxData *_auxdata)
+{
+    _masked_stridedloop_data *auxdata = (_masked_stridedloop_data *)_auxdata;
+    int nargs = auxdata->nargs;
+    PyArrayMethod_StridedLoop *strided_loop = auxdata->unmasked_stridedloop;
+    NpyAuxData *strided_loop_auxdata = auxdata->unmasked_auxdata;
+
+    char **dataptrs = auxdata->dataptrs;
+    memcpy(dataptrs, data, nargs * sizeof(char *));
+    char *mask = data[nargs];
+    npy_intp mask_stride = strides[nargs];
+
+    npy_intp N = dimensions[0];
+    /* Process the data as runs of unmasked values */
+    do {
+        Py_ssize_t subloopsize;
+
+        /* Skip masked values */
+        mask = npy_memchr(mask, 0, mask_stride, N, &subloopsize, 1);
+        for (int i = 0; i < nargs; i++) {
+            dataptrs[i] += subloopsize * strides[i];
+        }
+        N -= subloopsize;
+
+        /* Process unmasked values */
+        mask = npy_memchr(mask, 0, mask_stride, N, &subloopsize, 0);
+        int res = strided_loop(context,
+                dataptrs, &subloopsize, strides, strided_loop_auxdata);
+        if (res != 0) {
+            return res;
+        }
+        for (int i = 0; i < nargs; i++) {
+            dataptrs[i] += subloopsize * strides[i];
+        }
+        N -= subloopsize;
+    } while (N > 0);
+
+    return 0;
+}
+
+
+/*
+ * Fetches a strided-loop function that supports a boolean mask as additional
+ * (last) operand to the strided-loop.  It is otherwise largely identical to
+ * the `get_loop` method which it wraps.
+ * This is the core implementation for the ufunc `where=...` keyword argument.
+ *
+ * NOTE: This function does not support `move_references` or inner dimensions.
+ */
+NPY_NO_EXPORT int
+PyArrayMethod_GetMaskedStridedLoop(
+        PyArrayMethod_Context *context,
+        int aligned, npy_intp *fixed_strides,
+        PyArrayMethod_StridedLoop **out_loop,
+        NpyAuxData **out_transferdata,
+        NPY_ARRAYMETHOD_FLAGS *flags)
+{
+    _masked_stridedloop_data *data;
+    int nargs = context->method->nin + context->method->nout;
+
+    /* Add working memory for the data pointers, to modify them in-place */
+    data = PyMem_Malloc(sizeof(_masked_stridedloop_data) +
+                        sizeof(char *) * nargs);
+    if (data == NULL) {
+        PyErr_NoMemory();
+        return -1;
+    }
+    data->base.free = _masked_stridedloop_data_free;
+    data->base.clone = NULL;  /* not currently used */
+    data->unmasked_stridedloop = NULL;
+    data->nargs = nargs;
+
+    if (context->method->get_strided_loop(context,
+            aligned, 0, fixed_strides,
+            &data->unmasked_stridedloop, &data->unmasked_auxdata, flags) < 0) {
+        PyMem_Free(data);
+        return -1;
+    }
+    *out_transferdata = (NpyAuxData *)data;
+    *out_loop = generic_masked_strided_loop;
+    return 0;
+}
+
+
 PyMethodDef boundarraymethod_methods[] = {
     {"_resolve_descriptors", (PyCFunction)boundarraymethod__resolve_descripors,
      METH_O, "Resolve the given dtypes."},
index 88167a6bb231476c98a325f91ee76cca6819840a..7b7372bd0b59834b21d039e6ef2e6f0f504d1ebe 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ARRAY_METHOD_H
-#define _NPY_ARRAY_METHOD_H
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_ARRAY_METHOD_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_ARRAY_METHOD_H_
 
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
@@ -17,9 +17,21 @@ typedef enum {
      * setup/check. No function should set error flags and ignore them
      * since it would interfere with chaining operations (e.g. casting).
      */
+    /* TODO: Change this into a positive flag */
     NPY_METH_NO_FLOATINGPOINT_ERRORS = 1 << 2,
     /* Whether the method supports unaligned access (not runtime) */
     NPY_METH_SUPPORTS_UNALIGNED = 1 << 3,
+    /*
+     * Private flag for now for *logic* functions.  The logical functions
+     * `logical_or` and `logical_and` can always cast the inputs to booleans
+     * "safely" (because that is how the cast to bool is defined).
+     * @seberg: I am not sure this is the best way to handle this, so its
+     * private for now (also it is very limited anyway).
+     * There is one "exception". NA aware dtypes cannot cast to bool
+     * (hopefully), so the `??->?` loop should error even with this flag.
+     * But a second NA fallback loop will be necessary.
+     */
+    _NPY_METH_FORCE_CAST_INPUTS = 1 << 17,
 
     /* All flags which can change at runtime */
     NPY_METH_RUNTIME_FLAGS = (
@@ -159,6 +171,21 @@ npy_default_get_strided_loop(
         NPY_ARRAYMETHOD_FLAGS *flags);
 
 
+NPY_NO_EXPORT int
+PyArrayMethod_GetMaskedStridedLoop(
+        PyArrayMethod_Context *context,
+        int aligned,
+        npy_intp *fixed_strides,
+        PyArrayMethod_StridedLoop **out_loop,
+        NpyAuxData **out_transferdata,
+        NPY_ARRAYMETHOD_FLAGS *flags);
+
+
+
+NPY_NO_EXPORT PyObject *
+PyArrayMethod_FromSpec(PyArrayMethod_Spec *spec);
+
+
 /*
  * TODO: This function is the internal version, and its error paths may
  *       need better tests when a public version is exposed.
@@ -166,4 +193,4 @@ npy_default_get_strided_loop(
 NPY_NO_EXPORT PyBoundArrayMethodObject *
 PyArrayMethod_FromSpec_int(PyArrayMethod_Spec *spec, int private);
 
-#endif  /*_NPY_ARRAY_METHOD_H*/
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_ARRAY_METHOD_H_ */
index fdf0dfcaf3f52de2ab7fa756659cb1bf61e1b66d..09f7ee5480edf50612e6ff77bcc5a50c4ec12542 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_PRIVATE__ARRAYFUNCTION_OVERRIDE_H
-#define _NPY_PRIVATE__ARRAYFUNCTION_OVERRIDE_H
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_ARRAYFUNCTION_OVERRIDE_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_ARRAYFUNCTION_OVERRIDE_H_
 
 NPY_NO_EXPORT PyObject *
 array_implement_array_function(
@@ -19,4 +19,4 @@ NPY_NO_EXPORT PyObject *
 array_function_method_impl(PyObject *func, PyObject *types, PyObject *args,
                            PyObject *kwargs);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_ARRAYFUNCTION_OVERRIDE_H_ */
index 0f772c689954318bd5c597481bda43794aa582c2..f99de2a39b4f7038ac52cbc18b8c17a6d31bfd86 100644 (file)
@@ -20,13 +20,13 @@ maintainer email:  oliphant.travis@ieee.org
   Space Science Telescope Institute
   (J. Todd Miller, Perry Greenfield, Rick White)
 */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-/*#include <stdio.h>*/
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 
@@ -263,7 +263,7 @@ PyArray_CopyObject(PyArrayObject *dest, PyObject *src_object)
      */
     ndim = PyArray_DiscoverDTypeAndShape(src_object,
             PyArray_NDIM(dest), dims, &cache,
-            NPY_DTYPE(PyArray_DESCR(dest)), PyArray_DESCR(dest), &dtype);
+            NPY_DTYPE(PyArray_DESCR(dest)), PyArray_DESCR(dest), &dtype, 0);
     if (ndim < 0) {
         return -1;
     }
@@ -493,7 +493,29 @@ array_dealloc(PyArrayObject *self)
         if (PyDataType_FLAGCHK(fa->descr, NPY_ITEM_REFCOUNT)) {
             PyArray_XDECREF(self);
         }
-        npy_free_cache(fa->data, PyArray_NBYTES(self));
+        if (fa->mem_handler == NULL) {
+            char *env = getenv("NUMPY_WARN_IF_NO_MEM_POLICY");
+            if ((env != NULL) && (strncmp(env, "1", 1) == 0)) {
+                char const * msg = "Trying to dealloc data, but a memory policy "
+                    "is not set. If you take ownership of the data, you must "
+                    "set a base owning the data (e.g. a PyCapsule).";
+                WARN_IN_DEALLOC(PyExc_RuntimeWarning, msg);
+            }
+            // Guess at malloc/free ???
+            free(fa->data);
+        }
+        else {
+            /*
+             * In theory `PyArray_NBYTES_ALLOCATED`, but differs somewhere?
+             * So instead just use the knowledge that 0 is impossible.
+             */
+            size_t nbytes = PyArray_NBYTES(self);
+            if (nbytes == 0) {
+                nbytes = 1;
+            }
+            PyDataMem_UserFREE(fa->data, nbytes, fa->mem_handler);
+            Py_DECREF(fa->mem_handler);
+        }
     }
 
     /* must match allocation in PyArray_NewFromDescr */
@@ -858,7 +880,7 @@ _uni_release(char *ptr, int nc)
                 relfunc(aptr, N1);                              \
                 return -1;                                      \
             }                                                   \
-            val = compfunc(aptr, bptr, N1, N2);                  \
+            val = compfunc(aptr, bptr, N1, N2);                 \
             *dptr = (val CMP 0);                                \
             PyArray_ITER_NEXT(iself);                           \
             PyArray_ITER_NEXT(iother);                          \
@@ -870,7 +892,7 @@ _uni_release(char *ptr, int nc)
 
 #define _reg_loop(CMP) {                                \
         while(size--) {                                 \
-            val = compfunc((void *)iself->dataptr,       \
+            val = compfunc((void *)iself->dataptr,      \
                           (void *)iother->dataptr,      \
                           N1, N2);                      \
             *dptr = (val CMP 0);                        \
@@ -972,8 +994,7 @@ _strings_richcompare(PyArrayObject *self, PyArrayObject *other, int cmp_op,
     PyArrayMultiIterObject *mit;
     int val;
 
-    /* Cast arrays to a common type */
-    if (PyArray_TYPE(self) != PyArray_DESCR(other)->type_num) {
+    if (PyArray_TYPE(self) != PyArray_TYPE(other)) {
         /*
          * Comparison between Bytes and Unicode is not defined in Py3K;
          * we follow.
@@ -982,53 +1003,22 @@ _strings_richcompare(PyArrayObject *self, PyArrayObject *other, int cmp_op,
         return Py_NotImplemented;
     }
     if (PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(other)) {
-        PyObject *new;
-        if (PyArray_TYPE(self) == NPY_STRING &&
-                PyArray_DESCR(other)->type_num == NPY_UNICODE) {
-            PyArray_Descr* unicode = PyArray_DescrNew(PyArray_DESCR(other));
-            unicode->elsize = PyArray_DESCR(self)->elsize << 2;
-            new = PyArray_FromAny((PyObject *)self, unicode,
-                                  0, 0, 0, NULL);
-            if (new == NULL) {
-                return NULL;
-            }
-            Py_INCREF(other);
-            self = (PyArrayObject *)new;
-        }
-        else if ((PyArray_TYPE(self) == NPY_UNICODE) &&
-                 ((PyArray_DESCR(other)->type_num == NPY_STRING) ||
-                 (PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(other)))) {
-            PyArray_Descr* unicode = PyArray_DescrNew(PyArray_DESCR(self));
-
-            if (PyArray_DESCR(other)->type_num == NPY_STRING) {
-                unicode->elsize = PyArray_DESCR(other)->elsize << 2;
-            }
-            else {
-                unicode->elsize = PyArray_DESCR(other)->elsize;
-            }
-            new = PyArray_FromAny((PyObject *)other, unicode,
-                                  0, 0, 0, NULL);
-            if (new == NULL) {
-                return NULL;
-            }
-            Py_INCREF(self);
-            other = (PyArrayObject *)new;
-        }
-        else {
-            PyErr_SetString(PyExc_TypeError,
-                            "invalid string data-types "
-                            "in comparison");
+        /* Cast `other` to the same byte order as `self` (both unicode here) */
+        PyArray_Descr* unicode = PyArray_DescrNew(PyArray_DESCR(self));
+        unicode->elsize = PyArray_DESCR(other)->elsize;
+        PyObject *new = PyArray_FromAny((PyObject *)other,
+                unicode, 0, 0, 0, NULL);
+        if (new == NULL) {
             return NULL;
         }
+        other = (PyArrayObject *)new;
     }
     else {
-        Py_INCREF(self);
         Py_INCREF(other);
     }
 
     /* Broad-cast the arrays to a common shape */
     mit = (PyArrayMultiIterObject *)PyArray_MultiIterNew(2, self, other);
-    Py_DECREF(self);
     Py_DECREF(other);
     if (mit == NULL) {
         return NULL;
@@ -1737,22 +1727,6 @@ array_iter(PyArrayObject *arr)
     return PySeqIter_New((PyObject *)arr);
 }
 
-static PyObject *
-array_alloc(PyTypeObject *type, Py_ssize_t NPY_UNUSED(nitems))
-{
-    /* nitems will always be 0 */
-    PyObject *obj = PyObject_Malloc(type->tp_basicsize);
-    PyObject_Init(obj, type);
-    return obj;
-}
-
-static void
-array_free(PyObject * v)
-{
-    /* avoid same deallocator as PyBaseObject, see gentype_free */
-    PyObject_Free(v);
-}
-
 
 NPY_NO_EXPORT PyTypeObject PyArray_Type = {
     PyVarObject_HEAD_INIT(NULL, 0)
@@ -1773,7 +1747,5 @@ NPY_NO_EXPORT PyTypeObject PyArray_Type = {
     .tp_iter = (getiterfunc)array_iter,
     .tp_methods = array_methods,
     .tp_getset = array_getsetlist,
-    .tp_alloc = (allocfunc)array_alloc,
     .tp_new = (newfunc)array_new,
-    .tp_free = (freefunc)array_free,
 };
index 9b74944ffe9f4372714d30136e20d08001170f50..fb9b0bd8120ff248422f3d5b55323b807657e5cb 100644 (file)
@@ -1,10 +1,10 @@
-#ifndef _NPY_INTERNAL_ARRAYOBJECT_H_
-#define _NPY_INTERNAL_ARRAYOBJECT_H_
-
 #ifndef _MULTIARRAYMODULE
 #error You should not include this
 #endif
 
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_ARRAYOBJECT_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_ARRAYOBJECT_H_
+
 NPY_NO_EXPORT PyObject *
 _strings_richcompare(PyArrayObject *self, PyArrayObject *other, int cmp_op,
                      int rstrip);
@@ -26,4 +26,4 @@ array_might_be_written(PyArrayObject *obj);
  */
 static const int NPY_ARRAY_WARN_ON_WRITE = (1 << 31);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_ARRAYOBJECT_H_ */
index 7f545d6cffb3ce0fa5ed6084400a1a206a2275e2..71808cc48aa3452ad7f32d31ad02febde6859143 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- c -*- */
 #define PY_SSIZE_T_CLEAN
-#include "Python.h"
-#include "structmember.h"
+#include <Python.h>
+#include <structmember.h>
 #include <limits.h>
 #include <assert.h>
 
@@ -62,7 +62,7 @@ get_dummy_stack_array(PyArrayObject *orig)
     PyArrayObject_fields new_fields;
     new_fields.flags = PyArray_FLAGS(orig);
     /* Set to NULL so the dummy object can be distinguished from the real one */
-    Py_TYPE(&new_fields) = NULL;
+    Py_SET_TYPE(&new_fields, NULL);
     new_fields.base = (PyObject *)orig;
     return new_fields;
 }
@@ -3093,6 +3093,10 @@ VOID_compare(char *ip1, char *ip2, PyArrayObject *ap)
     if (!PyArray_HASFIELDS(ap)) {
         return STRING_compare(ip1, ip2, ap);
     }
+    PyObject *mem_handler = PyDataMem_GetHandler();
+    if (mem_handler == NULL) {
+        goto finish;
+    }
     descr = PyArray_DESCR(ap);
     /*
      * Compare on the first-field.  If equal, then
@@ -3107,15 +3111,19 @@ VOID_compare(char *ip1, char *ip2, PyArrayObject *ap)
         if (_unpack_field(tup, &new, &offset) < 0) {
             goto finish;
         }
-        /* descr is the only field checked by compare or copyswap */
+        /* Set the fields needed by compare or copyswap */
         dummy_struct.descr = new;
+
         swap = PyArray_ISBYTESWAPPED(dummy);
         nip1 = ip1 + offset;
         nip2 = ip2 + offset;
         if (swap || new->alignment > 1) {
             if (swap || !npy_is_aligned(nip1, new->alignment)) {
-                /* create buffer and copy */
-                nip1 = npy_alloc_cache(new->elsize);
+                /*
+                 * create temporary buffer and copy,
+                 * always use the current handler for internal allocations
+                 */
+                nip1 = PyDataMem_UserNEW(new->elsize, mem_handler);
                 if (nip1 == NULL) {
                     goto finish;
                 }
@@ -3124,11 +3132,15 @@ VOID_compare(char *ip1, char *ip2, PyArrayObject *ap)
                     new->f->copyswap(nip1, NULL, swap, dummy);
             }
             if (swap || !npy_is_aligned(nip2, new->alignment)) {
-                /* create buffer and copy */
-                nip2 = npy_alloc_cache(new->elsize);
+                /*
+                 * create temporary buffer and copy,
+                 * always use the current handler for internal allocations
+                 */
+                nip2 = PyDataMem_UserNEW(new->elsize, mem_handler);
                 if (nip2 == NULL) {
                     if (nip1 != ip1 + offset) {
-                        npy_free_cache(nip1, new->elsize);
+                        /* destroy temporary buffer */
+                        PyDataMem_UserFREE(nip1, new->elsize, mem_handler);
                     }
                     goto finish;
                 }
@@ -3140,10 +3152,12 @@ VOID_compare(char *ip1, char *ip2, PyArrayObject *ap)
         res = new->f->compare(nip1, nip2, dummy);
         if (swap || new->alignment > 1) {
             if (nip1 != ip1 + offset) {
-                npy_free_cache(nip1, new->elsize);
+                /* destroy temporary buffer */
+                PyDataMem_UserFREE(nip1, new->elsize, mem_handler);
             }
             if (nip2 != ip2 + offset) {
-                npy_free_cache(nip2, new->elsize);
+                /* destroy temporary buffer */
+                PyDataMem_UserFREE(nip2, new->elsize, mem_handler);
             }
         }
         if (res != 0) {
@@ -3152,6 +3166,7 @@ VOID_compare(char *ip1, char *ip2, PyArrayObject *ap)
     }
 
 finish:
+    Py_XDECREF(mem_handler);
     return res;
 }
 
index a9469aef737d61166791886cdceea3d270eb2c2a..b3a13b297da1be016eace975db1a74dd82497c60 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ARRAYTYPES_H_
-#define _NPY_ARRAYTYPES_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_ARRAYTYPES_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_ARRAYTYPES_H_
 
 #include "common.h"
 
@@ -28,4 +28,4 @@ small_correlate(const char * d_, npy_intp dstride,
                 npy_intp nk, enum NPY_TYPES ktype,
                 char * out_, npy_intp ostride);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_ARRAYTYPES_H_ */
index 5458c81cccecf48df6cb58e3544bb3a4594f333d..d10122c4f190265334d1a51f53d255f4dd6f6234 100644 (file)
@@ -1,9 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 
index de67b35b53d6186eff461f490181439ae9d8f347..327f685d4ffcb8b7cdd9eb9bac800acebaeff382 100644 (file)
@@ -1,9 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "lowlevel_strided_loops.h"
 
@@ -34,18 +35,25 @@ power_of_ten(int n)
     return ret;
 }
 
-/*NUMPY_API
- * ArgMax
- */
 NPY_NO_EXPORT PyObject *
-PyArray_ArgMax(PyArrayObject *op, int axis, PyArrayObject *out)
+_PyArray_ArgMinMaxCommon(PyArrayObject *op,
+        int axis, PyArrayObject *out, int keepdims,
+        npy_bool is_argmax)
 {
     PyArrayObject *ap = NULL, *rp = NULL;
-    PyArray_ArgFunc* arg_func;
-    char *ip;
+    PyArray_ArgFunc* arg_func = NULL;
+    char *ip, *func_name;
     npy_intp *rptr;
     npy_intp i, n, m;
     int elsize;
+    // Keep a copy because axis changes via call to PyArray_CheckAxis
+    int axis_copy = axis;
+    npy_intp _shape_buf[NPY_MAXDIMS];
+    npy_intp *out_shape;
+    // Keep the number of dimensions and shape of 
+    // original array. Helps when `keepdims` is True.
+    npy_intp* original_op_shape = PyArray_DIMS(op);
+    int out_ndim = PyArray_NDIM(op);
     NPY_BEGIN_THREADS_DEF;
 
     if ((ap = (PyArrayObject *)PyArray_CheckAxis(op, &axis, 0)) == NULL) {
@@ -86,123 +94,37 @@ PyArray_ArgMax(PyArrayObject *op, int axis, PyArrayObject *out)
     if (ap == NULL) {
         return NULL;
     }
-    arg_func = PyArray_DESCR(ap)->f->argmax;
-    if (arg_func == NULL) {
-        PyErr_SetString(PyExc_TypeError,
-                "data type not ordered");
-        goto fail;
-    }
-    elsize = PyArray_DESCR(ap)->elsize;
-    m = PyArray_DIMS(ap)[PyArray_NDIM(ap)-1];
-    if (m == 0) {
-        PyErr_SetString(PyExc_ValueError,
-                "attempt to get argmax of an empty sequence");
-        goto fail;
-    }
 
-    if (!out) {
-        rp = (PyArrayObject *)PyArray_NewFromDescr(
-                Py_TYPE(ap), PyArray_DescrFromType(NPY_INTP),
-                PyArray_NDIM(ap) - 1, PyArray_DIMS(ap), NULL, NULL,
-                0, (PyObject *)ap);
-        if (rp == NULL) {
-            goto fail;
-        }
+    // Decides the shape of the output array.
+    if (!keepdims) {
+        out_ndim = PyArray_NDIM(ap) - 1;
+        out_shape = PyArray_DIMS(ap);
     }
     else {
-        if ((PyArray_NDIM(out) != PyArray_NDIM(ap) - 1) ||
-                !PyArray_CompareLists(PyArray_DIMS(out), PyArray_DIMS(ap),
-                                      PyArray_NDIM(out))) {
-            PyErr_SetString(PyExc_ValueError,
-                    "output array does not match result of np.argmax.");
-            goto fail;
-        }
-        rp = (PyArrayObject *)PyArray_FromArray(out,
-                              PyArray_DescrFromType(NPY_INTP),
-                              NPY_ARRAY_CARRAY | NPY_ARRAY_WRITEBACKIFCOPY);
-        if (rp == NULL) {
-            goto fail;
+        out_shape = _shape_buf;
+        if (axis_copy == NPY_MAXDIMS) {
+            for (int i = 0; i < out_ndim; i++) {
+                out_shape[i] = 1;
+            }
+        } 
+        else {
+            /* 
+             * While `ap` may be transposed, we can ignore this for `out` because the
+             * transpose only reorders the size 1 `axis` (not changing memory layout).
+             */
+            memcpy(out_shape, original_op_shape, out_ndim * sizeof(npy_intp));
+            out_shape[axis] = 1;
         }
     }
 
-    NPY_BEGIN_THREADS_DESCR(PyArray_DESCR(ap));
-    n = PyArray_SIZE(ap)/m;
-    rptr = (npy_intp *)PyArray_DATA(rp);
-    for (ip = PyArray_DATA(ap), i = 0; i < n; i++, ip += elsize*m) {
-        arg_func(ip, m, rptr, ap);
-        rptr += 1;
-    }
-    NPY_END_THREADS_DESCR(PyArray_DESCR(ap));
-
-    Py_DECREF(ap);
-    /* Trigger the UPDATEIFCOPY/WRTIEBACKIFCOPY if necessary */
-    if (out != NULL && out != rp) {
-        PyArray_ResolveWritebackIfCopy(rp);
-        Py_DECREF(rp);
-        rp = out;
-        Py_INCREF(rp);
-    }
-    return (PyObject *)rp;
-
- fail:
-    Py_DECREF(ap);
-    Py_XDECREF(rp);
-    return NULL;
-}
-
-/*NUMPY_API
- * ArgMin
- */
-NPY_NO_EXPORT PyObject *
-PyArray_ArgMin(PyArrayObject *op, int axis, PyArrayObject *out)
-{
-    PyArrayObject *ap = NULL, *rp = NULL;
-    PyArray_ArgFunc* arg_func;
-    char *ip;
-    npy_intp *rptr;
-    npy_intp i, n, m;
-    int elsize;
-    NPY_BEGIN_THREADS_DEF;
-
-    if ((ap = (PyArrayObject *)PyArray_CheckAxis(op, &axis, 0)) == NULL) {
-        return NULL;
-    }
-    /*
-     * We need to permute the array so that axis is placed at the end.
-     * And all other dimensions are shifted left.
-     */
-    if (axis != PyArray_NDIM(ap)-1) {
-        PyArray_Dims newaxes;
-        npy_intp dims[NPY_MAXDIMS];
-        int i;
-
-        newaxes.ptr = dims;
-        newaxes.len = PyArray_NDIM(ap);
-        for (i = 0; i < axis; i++) {
-            dims[i] = i;
-        }
-        for (i = axis; i < PyArray_NDIM(ap) - 1; i++) {
-            dims[i] = i + 1;
-        }
-        dims[PyArray_NDIM(ap) - 1] = axis;
-        op = (PyArrayObject *)PyArray_Transpose(ap, &newaxes);
-        Py_DECREF(ap);
-        if (op == NULL) {
-            return NULL;
-        }
+    if (is_argmax) {
+        func_name = "argmax";
+        arg_func = PyArray_DESCR(ap)->f->argmax;
     }
     else {
-        op = ap;
+        func_name = "argmin";
+        arg_func = PyArray_DESCR(ap)->f->argmin;
     }
-
-    /* Will get native-byte order contiguous copy. */
-    ap = (PyArrayObject *)PyArray_ContiguousFromAny((PyObject *)op,
-                                  PyArray_DESCR(op)->type_num, 1, 0);
-    Py_DECREF(op);
-    if (ap == NULL) {
-        return NULL;
-    }
-    arg_func = PyArray_DESCR(ap)->f->argmin;
     if (arg_func == NULL) {
         PyErr_SetString(PyExc_TypeError,
                 "data type not ordered");
@@ -211,26 +133,28 @@ PyArray_ArgMin(PyArrayObject *op, int axis, PyArrayObject *out)
     elsize = PyArray_DESCR(ap)->elsize;
     m = PyArray_DIMS(ap)[PyArray_NDIM(ap)-1];
     if (m == 0) {
-        PyErr_SetString(PyExc_ValueError,
-                "attempt to get argmin of an empty sequence");
+        PyErr_Format(PyExc_ValueError,
+                    "attempt to get %s of an empty sequence",
+                    func_name);
         goto fail;
     }
 
     if (!out) {
         rp = (PyArrayObject *)PyArray_NewFromDescr(
                 Py_TYPE(ap), PyArray_DescrFromType(NPY_INTP),
-                PyArray_NDIM(ap) - 1, PyArray_DIMS(ap), NULL, NULL,
+                out_ndim, out_shape, NULL, NULL,
                 0, (PyObject *)ap);
         if (rp == NULL) {
             goto fail;
         }
     }
     else {
-        if ((PyArray_NDIM(out) != PyArray_NDIM(ap) - 1) ||
-                !PyArray_CompareLists(PyArray_DIMS(out), PyArray_DIMS(ap),
-                                      PyArray_NDIM(out))) {
-            PyErr_SetString(PyExc_ValueError,
-                    "output array does not match result of np.argmin.");
+        if ((PyArray_NDIM(out) != out_ndim) ||
+                !PyArray_CompareLists(PyArray_DIMS(out), out_shape,
+                                        out_ndim)) {
+            PyErr_Format(PyExc_ValueError,
+                    "output array does not match result of np.%s.",
+                    func_name);
             goto fail;
         }
         rp = (PyArrayObject *)PyArray_FromArray(out,
@@ -266,6 +190,38 @@ PyArray_ArgMin(PyArrayObject *op, int axis, PyArrayObject *out)
     return NULL;
 }
 
+NPY_NO_EXPORT PyObject*
+_PyArray_ArgMaxWithKeepdims(PyArrayObject *op,
+        int axis, PyArrayObject *out, int keepdims)
+{
+    return _PyArray_ArgMinMaxCommon(op, axis, out, keepdims, 1);
+}
+
+/*NUMPY_API
+ * ArgMax
+ */
+NPY_NO_EXPORT PyObject *
+PyArray_ArgMax(PyArrayObject *op, int axis, PyArrayObject *out)
+{
+    return _PyArray_ArgMinMaxCommon(op, axis, out, 0, 1);
+}
+
+NPY_NO_EXPORT PyObject *
+_PyArray_ArgMinWithKeepdims(PyArrayObject *op,
+        int axis, PyArrayObject *out, int keepdims)
+{
+    return _PyArray_ArgMinMaxCommon(op, axis, out, keepdims, 0);
+}
+
+/*NUMPY_API
+ * ArgMin
+ */
+NPY_NO_EXPORT PyObject *
+PyArray_ArgMin(PyArrayObject *op, int axis, PyArrayObject *out)
+{
+    return _PyArray_ArgMinMaxCommon(op, axis, out, 0, 0);
+}
+
 /*NUMPY_API
  * Max
  */
index 34bc31f6980624442b3553c2bffeaa4f1b36f133..6a9c3c7c9d2b29eb743af5ed440603f4f72e9a80 100644 (file)
@@ -1,12 +1,18 @@
-#ifndef _NPY_CALCULATION_H_
-#define _NPY_CALCULATION_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_CALCULATION_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_CALCULATION_H_
 
 NPY_NO_EXPORT PyObject*
 PyArray_ArgMax(PyArrayObject* self, int axis, PyArrayObject *out);
 
+NPY_NO_EXPORT PyObject*
+_PyArray_ArgMaxWithKeepdims(PyArrayObject* self, int axis, PyArrayObject *out, int keepdims);
+
 NPY_NO_EXPORT PyObject*
 PyArray_ArgMin(PyArrayObject* self, int axis, PyArrayObject *out);
 
+NPY_NO_EXPORT PyObject*
+_PyArray_ArgMinWithKeepdims(PyArrayObject* self, int axis, PyArrayObject *out, int keepdims);
+
 NPY_NO_EXPORT PyObject*
 PyArray_Max(PyArrayObject* self, int axis, PyArrayObject* out);
 
@@ -61,4 +67,4 @@ PyArray_All(PyArrayObject* self, int axis, PyArrayObject* out);
 NPY_NO_EXPORT PyObject*
 PyArray_Any(PyArrayObject* self, int axis, PyArrayObject* out);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_CALCULATION_H_ */
index 841ed799db54e65463019197e179bf5b7f7c3ed3..aa95d285a8ca93a7d09d77435725539ebdaad3a4 100644 (file)
@@ -1,8 +1,9 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 
 #include "npy_config.h"
@@ -46,8 +47,8 @@ _array_find_python_scalar_type(PyObject *op)
         return PyArray_DescrFromType(NPY_CDOUBLE);
     }
     else if (PyLong_Check(op)) {
-        return PyArray_PyIntAbstractDType.discover_descr_from_pyobject(
-                    &PyArray_PyIntAbstractDType, op);
+        return NPY_DT_CALL_discover_descr_from_pyobject(
+                &PyArray_PyIntAbstractDType, op);
     }
     return NULL;
 }
@@ -118,7 +119,7 @@ PyArray_DTypeFromObject(PyObject *obj, int maxdims, PyArray_Descr **out_dtype)
     int ndim;
 
     ndim = PyArray_DiscoverDTypeAndShape(
-            obj, maxdims, shape, &cache, NULL, NULL, out_dtype);
+            obj, maxdims, shape, &cache, NULL, NULL, out_dtype, 0);
     if (ndim < 0) {
         return -1;
     }
index 83209cd38b9480fa7ea5d0c30130a8d269541101..85fd3aab1f40f5ca3e33b8b3c446f536a6a2d839 100644 (file)
@@ -1,10 +1,11 @@
-#ifndef _NPY_PRIVATE_COMMON_H_
-#define _NPY_PRIVATE_COMMON_H_
-#include "structmember.h"
-#include <numpy/npy_common.h>
-#include <numpy/ndarraytypes.h>
-#include <limits.h>
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_COMMON_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_COMMON_H_
+
+#include <structmember.h>
+#include "numpy/npy_common.h"
+#include "numpy/ndarraytypes.h"
 #include "npy_import.h"
+#include <limits.h>
 
 #define error_converting(x)  (((x) == -1) && PyErr_Occurred())
 
@@ -291,6 +292,63 @@ npy_memchr(char * haystack, char needle,
     return p;
 }
 
+/*
+ * Helper to work around issues with the allocation strategy currently
+ * allocating not 1 byte for empty arrays, but enough for an array where
+ * all 0 dimensions are replaced with size 1 (if the itemsize is not 0).
+ *
+ * This means that we can fill in nice (nonzero) strides and still handle
+ * slicing direct math without being in danger of leaving the allocated byte
+ * bounds.
+ * In practice, that probably does not matter, but in principle this would be
+ * undefined behaviour in C.  Another solution may be to force the strides
+ * to 0 in these cases.  See also gh-15788.
+ *
+ * Unlike the code in `PyArray_NewFromDescr` does no overflow checks.
+ */
+static NPY_INLINE npy_intp
+PyArray_NBYTES_ALLOCATED(PyArrayObject *arr)
+{
+    if (PyArray_ITEMSIZE(arr) == 0) {
+        return 1;
+    }
+    npy_intp nbytes = PyArray_ITEMSIZE(arr);
+    for (int i = 0; i < PyArray_NDIM(arr); i++) {
+        if (PyArray_DIMS(arr)[i] != 0) {
+            nbytes *= PyArray_DIMS(arr)[i];
+        }
+    }
+    return nbytes;
+}
+
+
+/*
+ * Simple helper to create a tuple from an array of items. The `make_null_none`
+ * flag means that NULL entries are replaced with None, which is occasionally
+ * useful.
+ */
+static NPY_INLINE PyObject *
+PyArray_TupleFromItems(int n, PyObject *const *items, int make_null_none)
+{
+    PyObject *tuple = PyTuple_New(n);
+    if (tuple == NULL) {
+        return NULL;
+    }
+    for (int i = 0; i < n; i ++) {
+        PyObject *tmp;
+        if (!make_null_none || items[i] != NULL) {
+            tmp = items[i];
+        }
+        else {
+            tmp = Py_None;
+        }
+        Py_INCREF(tmp);
+        PyTuple_SET_ITEM(tuple, i, tmp);
+    }
+    return tuple;
+}
+
+
 #include "ucsnarrow.h"
 
 /*
@@ -315,5 +373,4 @@ new_array_for_sum(PyArrayObject *ap1, PyArrayObject *ap2, PyArrayObject* out,
  */
 #define NPY_ITER_REDUCTION_AXIS(axis) (axis + (1 << (NPY_BITSOF_INT - 2)))
 
-#endif
-
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_COMMON_H_ */
index a88085f6f084a06de0b0408783248929a73cc0c6..ca80b1ed7002830c9efa511333d98c8a536d5e66 100644 (file)
@@ -1,9 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
-#include <numpy/npy_common.h>
+#include "numpy/npy_common.h"
 #include "numpy/arrayobject.h"
 
 #include "common_dtype.h"
@@ -50,10 +51,10 @@ PyArray_CommonDType(PyArray_DTypeMeta *dtype1, PyArray_DTypeMeta *dtype2)
 
     PyArray_DTypeMeta *common_dtype;
 
-    common_dtype = dtype1->common_dtype(dtype1, dtype2);
+    common_dtype = NPY_DT_CALL_common_dtype(dtype1, dtype2);
     if (common_dtype == (PyArray_DTypeMeta *)Py_NotImplemented) {
         Py_DECREF(common_dtype);
-        common_dtype = dtype2->common_dtype(dtype2, dtype1);
+        common_dtype = NPY_DT_CALL_common_dtype(dtype2, dtype1);
     }
     if (common_dtype == NULL) {
         return NULL;
@@ -128,7 +129,7 @@ reduce_dtypes_to_most_knowledgeable(
             Py_XSETREF(res, dtypes[low]);
         }
         else {
-            if (dtypes[high]->abstract) {
+            if (NPY_DT_is_abstract(dtypes[high])) {
                 /*
                  * Priority inversion, start with abstract, because if it
                  * returns `other`, we can let other pass instead.
@@ -138,7 +139,7 @@ reduce_dtypes_to_most_knowledgeable(
                 dtypes[high] = tmp;
             }
 
-            Py_XSETREF(res, dtypes[low]->common_dtype(dtypes[low], dtypes[high]));
+            Py_XSETREF(res, NPY_DT_CALL_common_dtype(dtypes[low], dtypes[high]));
             if (res == NULL) {
                 return NULL;
             }
@@ -270,7 +271,7 @@ PyArray_PromoteDTypeSequence(
          * a higher category). We assume that the result is not in a lower
          * category.
          */
-        PyArray_DTypeMeta *promotion = main_dtype->common_dtype(
+        PyArray_DTypeMeta *promotion = NPY_DT_CALL_common_dtype(
                 main_dtype, dtypes[i]);
         if (promotion == NULL) {
             Py_XSETREF(result, NULL);
index b3666531a532ca9cb7843bf4b107b7badfd873ca..13d38ddf816ab2b8b920a2c236d682348039b86d 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_COMMON_DTYPE_H_
-#define _NPY_COMMON_DTYPE_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_COMMON_DTYPE_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_COMMON_DTYPE_H_
 
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
@@ -14,4 +14,4 @@ NPY_NO_EXPORT PyArray_DTypeMeta *
 PyArray_PromoteDTypeSequence(
         npy_intp length, PyArray_DTypeMeta **dtypes_in);
 
-#endif  /* _NPY_COMMON_DTYPE_H_ */
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_COMMON_DTYPE_H_ */
index 6b76e570f8e6e08e4b891af46d16a38fa6d168f9..5853e068b0b72d9f84a98d012c43d96b437e4288 100644 (file)
@@ -1,9 +1,10 @@
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
 #include <structmember.h>
-#include <string.h>
 
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/npy_3kcompat.h"
 #include "numpy/npy_math.h"
@@ -15,6 +16,8 @@
 #include "common.h"
 #include "simd/simd.h"
 
+#include <string.h>
+
 typedef enum {
     PACK_ORDER_LITTLE = 0,
     PACK_ORDER_BIG
@@ -1390,7 +1393,7 @@ arr_add_docstring(PyObject *NPY_UNUSED(dummy), PyObject *args)
 {
     PyObject *obj;
     PyObject *str;
-    #if PY_VERSION_HEX >= 0x030700A2 && (!defined(PYPY_VERSION_NUM) || PYPY_VERSION_NUM > 0x07030300)
+    #if !defined(PYPY_VERSION_NUM) || PYPY_VERSION_NUM > 0x07030300
     const char *docstr;
     #else
     char *docstr;
index 082139910717656e908703c284b94b23d5262088..d3bc08cb233ba5b19a667ce6713070d992464de7 100644 (file)
@@ -1,6 +1,7 @@
-#ifndef _NPY_PRIVATE__COMPILED_BASE_H_
-#define _NPY_PRIVATE__COMPILED_BASE_H_
-#include <numpy/ndarraytypes.h>
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_COMPILED_BASE_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_COMPILED_BASE_H_
+
+#include "numpy/ndarraytypes.h"
 
 NPY_NO_EXPORT PyObject *
 arr_insert(PyObject *, PyObject *, PyObject *);
@@ -23,4 +24,4 @@ io_pack(PyObject *, PyObject *, PyObject *);
 NPY_NO_EXPORT PyObject *
 io_unpack(PyObject *, PyObject *, PyObject *);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_COMPILED_BASE_H_ */
index adfff11292a3909b2b45327fa4c574d13881bcf6..a1de580d953725df199a40a4e3f3185d717bd1a9 100644 (file)
@@ -1,9 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 
@@ -162,6 +163,42 @@ PyArray_OptionalIntpConverter(PyObject *obj, PyArray_Dims *seq)
     return PyArray_IntpConverter(obj, seq);
 }
 
+NPY_NO_EXPORT int
+PyArray_CopyConverter(PyObject *obj, _PyArray_CopyMode *copymode) {
+    if (obj == Py_None) {
+        PyErr_SetString(PyExc_ValueError,
+                        "NoneType copy mode not allowed.");
+        return NPY_FAIL;
+    }
+
+    int int_copymode;
+    static PyObject* numpy_CopyMode = NULL;
+    npy_cache_import("numpy", "_CopyMode", &numpy_CopyMode);
+
+    if (numpy_CopyMode != NULL && (PyObject *)Py_TYPE(obj) == numpy_CopyMode) {
+        PyObject* mode_value = PyObject_GetAttrString(obj, "value");
+        if (mode_value == NULL) {
+            return NPY_FAIL;
+        }
+
+        int_copymode = (int)PyLong_AsLong(mode_value);
+        Py_DECREF(mode_value);
+        if (error_converting(int_copymode)) {
+            return NPY_FAIL;
+        }
+    }
+    else {
+        npy_bool bool_copymode;
+        if (!PyArray_BoolConverter(obj, &bool_copymode)) {
+            return NPY_FAIL;
+        }
+        int_copymode = (int)bool_copymode;
+    }
+
+    *copymode = (_PyArray_CopyMode)int_copymode;
+    return NPY_SUCCEED;
+}
+
 /*NUMPY_API
  * Get buffer chunk from object
  *
index 55c0cdd3578f471ad9fb7e78d35c5c8fcc774908..4072841ee1c74aba898081bf7b1630846fe5313c 100644 (file)
@@ -1,7 +1,7 @@
-#ifndef _NPY_PRIVATE_CONVERSION_UTILS_H_
-#define _NPY_PRIVATE_CONVERSION_UTILS_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_CONVERSION_UTILS_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_CONVERSION_UTILS_H_
 
-#include <numpy/ndarraytypes.h>
+#include "numpy/ndarraytypes.h"
 
 NPY_NO_EXPORT int
 PyArray_IntpConverter(PyObject *obj, PyArray_Dims *seq);
@@ -9,6 +9,15 @@ PyArray_IntpConverter(PyObject *obj, PyArray_Dims *seq);
 NPY_NO_EXPORT int
 PyArray_OptionalIntpConverter(PyObject *obj, PyArray_Dims *seq);
 
+typedef enum {
+    NPY_COPY_IF_NEEDED = 0,
+    NPY_COPY_ALWAYS = 1,
+    NPY_COPY_NEVER = 2,
+} _PyArray_CopyMode;
+
+NPY_NO_EXPORT int
+PyArray_CopyConverter(PyObject *obj, _PyArray_CopyMode *copyflag);
+
 NPY_NO_EXPORT int
 PyArray_BufferConverter(PyObject *obj, PyArray_Chunk *buf);
 
@@ -82,4 +91,4 @@ PyArray_ConvertMultiAxis(PyObject *axis_in, int ndim, npy_bool *out_axis_flags);
  */
 extern NPY_NO_EXPORT int evil_global_disable_warn_O4O8_flag;
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_CONVERSION_UTILS_H_ */
index 29a2bb0e8c5f47ca6d04e607905105e94fbb7043..2f68db07c9886a47b3e90388871408c1d35e8bae 100644 (file)
@@ -1,11 +1,12 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#include <npy_config.h>
+#include "npy_config.h"
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 #include "npy_pycompat.h"
@@ -61,7 +62,7 @@ npy_fallocate(npy_intp nbytes, FILE * fp)
      * early exit on no space, other errors will also get found during fwrite
      */
     if (r == -1 && errno == ENOSPC) {
-        PyErr_Format(PyExc_IOError, "Not enough free space to write "
+        PyErr_Format(PyExc_OSError, "Not enough free space to write "
                      "%"NPY_INTP_FMT" bytes", nbytes);
         return -1;
     }
@@ -138,7 +139,7 @@ PyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format)
     if (n3 == 0) {
         /* binary data */
         if (PyDataType_FLAGCHK(PyArray_DESCR(self), NPY_LIST_PICKLE)) {
-            PyErr_SetString(PyExc_IOError,
+            PyErr_SetString(PyExc_OSError,
                     "cannot write object arrays to a file in binary mode");
             return -1;
         }
@@ -182,7 +183,7 @@ PyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format)
 #endif
             NPY_END_ALLOW_THREADS;
             if (n < size) {
-                PyErr_Format(PyExc_IOError,
+                PyErr_Format(PyExc_OSError,
                         "%ld requested and %ld written",
                         (long) size, (long) n);
                 return -1;
@@ -198,7 +199,7 @@ PyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format)
                             (size_t) PyArray_DESCR(self)->elsize,
                             1, fp) < 1) {
                     NPY_END_THREADS;
-                    PyErr_Format(PyExc_IOError,
+                    PyErr_Format(PyExc_OSError,
                             "problem writing element %" NPY_INTP_FMT
                             " to file", it->index);
                     Py_DECREF(it);
@@ -266,7 +267,7 @@ PyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format)
             NPY_END_ALLOW_THREADS;
             Py_DECREF(byteobj);
             if (n < n2) {
-                PyErr_Format(PyExc_IOError,
+                PyErr_Format(PyExc_OSError,
                         "problem writing element %" NPY_INTP_FMT
                         " to file", it->index);
                 Py_DECREF(strobj);
@@ -276,7 +277,7 @@ PyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format)
             /* write separator for all but last one */
             if (it->index != it->size-1) {
                 if (fwrite(sep, 1, n3, fp) < n3) {
-                    PyErr_Format(PyExc_IOError,
+                    PyErr_Format(PyExc_OSError,
                             "problem writing separator to file");
                     Py_DECREF(strobj);
                     Py_DECREF(it);
index 96df1971193e23d239f1bffe06852dd6e027e962..d64d9be3fa097e8ba3df82faeaf49e7cd8dbdee2 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef _NPY_ARRAYOBJECT_CONVERT_H_
-#define _NPY_ARRAYOBJECT_CONVERT_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_CONVERT_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_CONVERT_H_
 
 NPY_NO_EXPORT int
 PyArray_AssignZero(PyArrayObject *dst,
                    PyArrayObject *wheremask);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_CONVERT_H_ */
index 49e4550804b6abd905df36896ef6cfec2a1f11b8..3135d69894b3efb048724aa8320e8b986d54a710 100644 (file)
@@ -1,9 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 
@@ -70,10 +71,10 @@ PyArray_GetCastingImpl(PyArray_DTypeMeta *from, PyArray_DTypeMeta *to)
 {
     PyObject *res;
     if (from == to) {
-        res = from->within_dtype_castingimpl;
+        res = NPY_DT_SLOTS(from)->within_dtype_castingimpl;
     }
     else {
-        res = PyDict_GetItemWithError(from->castingimpls, (PyObject *)to);
+        res = PyDict_GetItemWithError(NPY_DT_SLOTS(from)->castingimpls, (PyObject *)to);
     }
     if (res != NULL || PyErr_Occurred()) {
         Py_XINCREF(res);
@@ -105,11 +106,11 @@ PyArray_GetCastingImpl(PyArray_DTypeMeta *from, PyArray_DTypeMeta *to)
         return NULL;
     }
     else {
-        if (from->parametric || to->parametric) {
+        if (NPY_DT_is_parametric(from) || NPY_DT_is_parametric(to)) {
             Py_RETURN_NONE;
         }
         /* Reject non-legacy dtypes (they need to use the new API) */
-        if (!from->legacy || !to->legacy) {
+        if (!NPY_DT_is_legacy(from) || !NPY_DT_is_legacy(to)) {
             Py_RETURN_NONE;
         }
         if (from != to) {
@@ -119,7 +120,8 @@ PyArray_GetCastingImpl(PyArray_DTypeMeta *from, PyArray_DTypeMeta *to)
             if (castfunc == NULL) {
                 PyErr_Clear();
                 /* Remember that this cast is not possible */
-                if (PyDict_SetItem(from->castingimpls, (PyObject *) to, Py_None) < 0) {
+                if (PyDict_SetItem(NPY_DT_SLOTS(from)->castingimpls,
+                            (PyObject *) to, Py_None) < 0) {
                     return NULL;
                 }
                 Py_RETURN_NONE;
@@ -147,7 +149,8 @@ PyArray_GetCastingImpl(PyArray_DTypeMeta *from, PyArray_DTypeMeta *to)
         Py_DECREF(res);
         return NULL;
     }
-    if (PyDict_SetItem(from->castingimpls, (PyObject *)to, res) < 0) {
+    if (PyDict_SetItem(NPY_DT_SLOTS(from)->castingimpls,
+                (PyObject *)to, res) < 0) {
         Py_DECREF(res);
         return NULL;
     }
@@ -391,7 +394,16 @@ _get_cast_safety_from_castingimpl(PyArrayMethodObject *castingimpl,
   finish:
     Py_DECREF(out_descrs[0]);
     Py_DECREF(out_descrs[1]);
-    /* NPY_NO_CASTING has to be used for (NPY_EQUIV_CASTING|_NPY_CAST_IS_VIEW) */
+    /*
+     * Check for less harmful non-standard returns.  The following two returns
+     * should never happen. They would be roughly equivalent, but less precise,
+     * versions of `(NPY_NO_CASTING|_NPY_CAST_IS_VIEW)`.
+     * 1. No-casting must imply cast-is-view.
+     * 2. Equivalent-casting + cast-is-view is (currently) the definition
+     *    of a "no" cast (there may be reasons to relax this).
+     * Note that e.g. `(NPY_UNSAFE_CASTING|_NPY_CAST_IS_VIEW)` is valid.
+     */
+    assert(casting != NPY_NO_CASTING);
     assert(casting != (NPY_EQUIV_CASTING|_NPY_CAST_IS_VIEW));
     return casting;
 }
@@ -438,7 +450,7 @@ PyArray_GetCastSafety(
 
 /**
  * Check whether a cast is safe, see also `PyArray_GetCastSafety` for
- * a similiar function.  Unlike GetCastSafety, this function checks the
+ * a similar function.  Unlike GetCastSafety, this function checks the
  * `castingimpl->casting` when available.  This allows for two things:
  *
  * 1. It avoids  calling `resolve_descriptors` in some cases.
@@ -937,12 +949,12 @@ PyArray_CastDescrToDType(PyArray_Descr *descr, PyArray_DTypeMeta *given_DType)
         Py_INCREF(descr);
         return descr;
     }
-    if (!given_DType->parametric) {
+    if (!NPY_DT_is_parametric(given_DType)) {
         /*
          * Don't actually do anything, the default is always the result
          * of any cast.
          */
-        return given_DType->default_descr(given_DType);
+        return NPY_DT_CALL_default_descr(given_DType);
     }
     if (PyObject_TypeCheck((PyObject *)descr, (PyTypeObject *)given_DType)) {
         Py_INCREF(descr);
@@ -1031,7 +1043,7 @@ PyArray_FindConcatenationDescriptor(
             Py_SETREF(result, NULL);
             goto finish;
         }
-        Py_SETREF(result, common_dtype->common_instance(result, curr));
+        Py_SETREF(result, NPY_DT_SLOTS(common_dtype)->common_instance(result, curr));
         Py_DECREF(curr);
         if (result == NULL) {
             goto finish;
@@ -1065,9 +1077,9 @@ PyArray_PromoteTypes(PyArray_Descr *type1, PyArray_Descr *type2)
         return NULL;
     }
 
-    if (!common_dtype->parametric) {
+    if (!NPY_DT_is_parametric(common_dtype)) {
         /* Note that this path loses all metadata */
-        res = common_dtype->default_descr(common_dtype);
+        res = NPY_DT_CALL_default_descr(common_dtype);
         Py_DECREF(common_dtype);
         return res;
     }
@@ -1089,7 +1101,7 @@ PyArray_PromoteTypes(PyArray_Descr *type1, PyArray_Descr *type2)
      * And find the common instance of the two inputs
      * NOTE: Common instance preserves metadata (normally and of one input)
      */
-    res = common_dtype->common_instance(type1, type2);
+    res = NPY_DT_SLOTS(common_dtype)->common_instance(type1, type2);
     Py_DECREF(type1);
     Py_DECREF(type2);
     Py_DECREF(common_dtype);
@@ -1494,7 +1506,7 @@ should_use_min_scalar(npy_intp narrs, PyArrayObject **arr,
 
         /* Compute the maximum "kinds" and whether everything is scalar */
         for (npy_intp i = 0; i < narrs; ++i) {
-            if (!NPY_DTYPE(PyArray_DESCR(arr[i]))->legacy) {
+            if (!NPY_DT_is_legacy(NPY_DTYPE(PyArray_DESCR(arr[i])))) {
                 return 0;
             }
             if (PyArray_NDIM(arr[i]) == 0) {
@@ -1518,7 +1530,7 @@ should_use_min_scalar(npy_intp narrs, PyArrayObject **arr,
          * finish computing the max array kind
          */
         for (npy_intp i = 0; i < ndtypes; ++i) {
-            if (!NPY_DTYPE(dtypes[i])->legacy) {
+            if (!NPY_DT_is_legacy(NPY_DTYPE(dtypes[i]))) {
                 return 0;
             }
             int kind = dtype_kind_to_simplified_ordering(dtypes[i]->kind);
@@ -1564,7 +1576,7 @@ get_descr_from_cast_or_value(
         if (tmp == NULL) {
             return NULL;
         }
-        curr = common_dtype->discover_descr_from_pyobject(common_dtype, tmp);
+        curr = NPY_DT_CALL_discover_descr_from_pyobject(common_dtype, tmp);
         Py_DECREF(tmp);
     }
     return curr;
@@ -1671,7 +1683,7 @@ PyArray_ResultType(
         }
         Py_INCREF(all_DTypes[i_all]);
         /*
-         * Leave the decriptor empty, if we need it, we will have to go
+         * Leave the descriptor empty, if we need it, we will have to go
          * to more extreme lengths unfortunately.
          */
         all_descriptors[i_all] = NULL;
@@ -1686,9 +1698,9 @@ PyArray_ResultType(
         goto error;
     }
 
-    if (common_dtype->abstract) {
+    if (NPY_DT_is_abstract(common_dtype)) {
         /* (ab)use default descriptor to define a default */
-        PyArray_Descr *tmp_descr = common_dtype->default_descr(common_dtype);
+        PyArray_Descr *tmp_descr = NPY_DT_CALL_default_descr(common_dtype);
         if (tmp_descr == NULL) {
             goto error;
         }
@@ -1701,9 +1713,9 @@ PyArray_ResultType(
      * NOTE: Code duplicates `PyArray_CastToDTypeAndPromoteDescriptors`, but
      *       supports special handling of the abstract values.
      */
-    if (!common_dtype->parametric) {
+    if (!NPY_DT_is_parametric(common_dtype)) {
         /* Note that this "fast" path loses all metadata */
-        result = common_dtype->default_descr(common_dtype);
+        result = NPY_DT_CALL_default_descr(common_dtype);
     }
     else {
         result = get_descr_from_cast_or_value(
@@ -1718,7 +1730,7 @@ PyArray_ResultType(
             if (curr == NULL) {
                 goto error;
             }
-            Py_SETREF(result, common_dtype->common_instance(result, curr));
+            Py_SETREF(result, NPY_DT_SLOTS(common_dtype)->common_instance(result, curr));
             Py_DECREF(curr);
             if (result == NULL) {
                 goto error;
@@ -1896,10 +1908,10 @@ PyArray_CastToDTypeAndPromoteDescriptors(
     if (result == NULL || ndescr == 1) {
         return result;
     }
-    if (!DType->parametric) {
+    if (!NPY_DT_is_parametric(DType)) {
         /* Note that this "fast" path loses all metadata */
         Py_DECREF(result);
-        return DType->default_descr(DType);
+        return NPY_DT_CALL_default_descr(DType);
     }
 
     for (npy_intp i = 1; i < ndescr; i++) {
@@ -1908,7 +1920,7 @@ PyArray_CastToDTypeAndPromoteDescriptors(
             Py_DECREF(result);
             return NULL;
         }
-        Py_SETREF(result, DType->common_instance(result, curr));
+        Py_SETREF(result, NPY_DT_SLOTS(DType)->common_instance(result, curr));
         Py_DECREF(curr);
         if (result == NULL) {
             return NULL;
@@ -2078,7 +2090,7 @@ PyArray_ObjectType(PyObject *op, int minimum_type)
     if (dtype == NULL) {
         ret = NPY_DEFAULT_TYPE;
     }
-    else if (!NPY_DTYPE(dtype)->legacy) {
+    else if (!NPY_DT_is_legacy(NPY_DTYPE(dtype))) {
         /*
          * TODO: If we keep all type number style API working, by defining
          *       type numbers always. We may be able to allow this again.
@@ -2107,7 +2119,7 @@ PyArray_ObjectType(PyObject *op, int minimum_type)
  * This function is only used in one place within NumPy and should
  * generally be avoided. It is provided mainly for backward compatibility.
  *
- * The user of the function has to free the returned array.
+ * The user of the function has to free the returned array with PyDataMem_FREE.
  */
 NPY_NO_EXPORT PyArrayObject **
 PyArray_ConvertToCommonType(PyObject *op, int *retn)
@@ -2222,25 +2234,26 @@ PyArray_AddCastingImplementation(PyBoundArrayMethodObject *meth)
                     meth->method->name);
             return -1;
         }
-        if (meth->dtypes[0]->within_dtype_castingimpl != NULL) {
+        if (NPY_DT_SLOTS(meth->dtypes[0])->within_dtype_castingimpl != NULL) {
             PyErr_Format(PyExc_RuntimeError,
                     "A cast was already added for %S -> %S. (method: %s)",
                     meth->dtypes[0], meth->dtypes[1], meth->method->name);
             return -1;
         }
         Py_INCREF(meth->method);
-        meth->dtypes[0]->within_dtype_castingimpl = (PyObject *)meth->method;
+        NPY_DT_SLOTS(meth->dtypes[0])->within_dtype_castingimpl = (
+                (PyObject *)meth->method);
 
         return 0;
     }
-    if (PyDict_Contains(meth->dtypes[0]->castingimpls,
+    if (PyDict_Contains(NPY_DT_SLOTS(meth->dtypes[0])->castingimpls,
             (PyObject *)meth->dtypes[1])) {
         PyErr_Format(PyExc_RuntimeError,
                 "A cast was already added for %S -> %S. (method: %s)",
                 meth->dtypes[0], meth->dtypes[1], meth->method->name);
         return -1;
     }
-    if (PyDict_SetItem(meth->dtypes[0]->castingimpls,
+    if (PyDict_SetItem(NPY_DT_SLOTS(meth->dtypes[0])->castingimpls,
             (PyObject *)meth->dtypes[1], (PyObject *)meth->method) < 0) {
         return -1;
     }
@@ -2251,7 +2264,7 @@ PyArray_AddCastingImplementation(PyBoundArrayMethodObject *meth)
  * Add a new casting implementation using a PyArrayMethod_Spec.
  *
  * @param spec
- * @param private If private, allow slots not publically exposed.
+ * @param private If private, allow slots not publicly exposed.
  * @return 0 on success -1 on failure
  */
 NPY_NO_EXPORT int
@@ -2343,7 +2356,7 @@ simple_cast_resolve_descriptors(
         PyArray_Descr *given_descrs[2],
         PyArray_Descr *loop_descrs[2])
 {
-    assert(dtypes[0]->legacy && dtypes[1]->legacy);
+    assert(NPY_DT_is_legacy(dtypes[0]) && NPY_DT_is_legacy(dtypes[1]));
 
     loop_descrs[0] = ensure_dtype_nbo(given_descrs[0]);
     if (loop_descrs[0] == NULL) {
@@ -2357,7 +2370,7 @@ simple_cast_resolve_descriptors(
         }
     }
     else {
-        loop_descrs[1] = dtypes[1]->default_descr(dtypes[1]);
+        loop_descrs[1] = NPY_DT_CALL_default_descr(dtypes[1]);
     }
 
     if (self->casting != NPY_NO_CASTING) {
@@ -2492,7 +2505,8 @@ add_numeric_cast(PyArray_DTypeMeta *from, PyArray_DTypeMeta *to)
     assert(slots[1].pfunc && slots[2].pfunc && slots[3].pfunc && slots[4].pfunc);
 
     /* Find the correct casting level, and special case no-cast */
-    if (dtypes[0]->kind == dtypes[1]->kind && from_itemsize == to_itemsize) {
+    if (dtypes[0]->singleton->kind == dtypes[1]->singleton->kind
+            && from_itemsize == to_itemsize) {
         spec.casting = NPY_EQUIV_CASTING;
 
         /* When there is no casting (equivalent C-types) use byteswap loops */
@@ -2509,8 +2523,8 @@ add_numeric_cast(PyArray_DTypeMeta *from, PyArray_DTypeMeta *to)
     else if (_npy_can_cast_safely_table[from->type_num][to->type_num]) {
         spec.casting = NPY_SAFE_CASTING;
     }
-    else if (dtype_kind_to_ordering(dtypes[0]->kind) <=
-             dtype_kind_to_ordering(dtypes[1]->kind)) {
+    else if (dtype_kind_to_ordering(dtypes[0]->singleton->kind) <=
+             dtype_kind_to_ordering(dtypes[1]->singleton->kind)) {
         spec.casting = NPY_SAME_KIND_CASTING;
     }
     else {
@@ -2568,7 +2582,7 @@ cast_to_string_resolve_descriptors(
      * a multiple of eight.
      */
     npy_intp size = -1;
-    switch (dtypes[0]->type_num) {
+    switch (given_descrs[0]->type_num) {
         case NPY_BOOL:
         case NPY_UBYTE:
         case NPY_BYTE:
@@ -2580,18 +2594,18 @@ cast_to_string_resolve_descriptors(
         case NPY_LONG:
         case NPY_ULONGLONG:
         case NPY_LONGLONG:
-            assert(dtypes[0]->singleton->elsize <= 8);
-            assert(dtypes[0]->singleton->elsize > 0);
-            if (dtypes[0]->kind == 'b') {
+            assert(given_descrs[0]->elsize <= 8);
+            assert(given_descrs[0]->elsize > 0);
+            if (given_descrs[0]->kind == 'b') {
                 /* 5 chars needed for cast to 'True' or 'False' */
                 size = 5;
             }
-            else if (dtypes[0]->kind == 'u') {
-                size = REQUIRED_STR_LEN[dtypes[0]->singleton->elsize];
+            else if (given_descrs[0]->kind == 'u') {
+                size = REQUIRED_STR_LEN[given_descrs[0]->elsize];
             }
-            else if (dtypes[0]->kind == 'i') {
+            else if (given_descrs[0]->kind == 'i') {
                 /* Add character for sign symbol */
-                size = REQUIRED_STR_LEN[dtypes[0]->singleton->elsize] + 1;
+                size = REQUIRED_STR_LEN[given_descrs[0]->elsize] + 1;
             }
             break;
         case NPY_HALF:
@@ -3079,7 +3093,7 @@ structured_to_nonstructured_resolve_descriptors(
 
     /* Void dtypes always do the full cast. */
     if (given_descrs[1] == NULL) {
-        loop_descrs[1] = dtypes[1]->default_descr(dtypes[1]);
+        loop_descrs[1] = NPY_DT_CALL_default_descr(dtypes[1]);
         /*
          * Special case strings here, it should be useless (and only actually
          * work for empty arrays).  Possibly this should simply raise for
@@ -3438,7 +3452,7 @@ object_to_any_resolve_descriptors(
          * here is that e.g. "M8" input is considered to be the DType class,
          * and by allowing it here, we go back to the "M8" instance.
          */
-        if (dtypes[1]->parametric) {
+        if (NPY_DT_is_parametric(dtypes[1])) {
             PyErr_Format(PyExc_TypeError,
                     "casting from object to the parametric DType %S requires "
                     "the specified output dtype instance. "
@@ -3446,7 +3460,7 @@ object_to_any_resolve_descriptors(
                     "should be discovered automatically, however.", dtypes[1]);
             return -1;
         }
-        loop_descrs[1] = dtypes[1]->default_descr(dtypes[1]);
+        loop_descrs[1] = NPY_DT_CALL_default_descr(dtypes[1]);
         if (loop_descrs[1] == NULL) {
             return -1;
         }
@@ -3502,7 +3516,7 @@ any_to_object_resolve_descriptors(
         PyArray_Descr *loop_descrs[2])
 {
     if (given_descrs[1] == NULL) {
-        loop_descrs[1] = dtypes[1]->default_descr(dtypes[1]);
+        loop_descrs[1] = NPY_DT_CALL_default_descr(dtypes[1]);
         if (loop_descrs[1] == NULL) {
             return -1;
         }
index 22b3859d2ab3ec9a8b7c0ce9aed87f8dd2535a6d..5e0682f2267d05aec2a2fffb034e669facac4bf1 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ARRAY_CONVERT_DATATYPE_H_
-#define _NPY_ARRAY_CONVERT_DATATYPE_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_CONVERT_DATATYPE_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_CONVERT_DATATYPE_H_
 
 #include "array_method.h"
 
@@ -78,9 +78,9 @@ PyArray_CheckCastSafety(NPY_CASTING casting,
 NPY_NO_EXPORT NPY_CASTING
 legacy_same_dtype_resolve_descriptors(
         PyArrayMethodObject *self,
-        PyArray_DTypeMeta **dtypes,
-        PyArray_Descr **given_descrs,
-        PyArray_Descr **loop_descrs);
+        PyArray_DTypeMeta *dtypes[2],
+        PyArray_Descr *given_descrs[2],
+        PyArray_Descr *loop_descrs[2]);
 
 NPY_NO_EXPORT int
 legacy_cast_get_strided_loop(
@@ -92,11 +92,11 @@ legacy_cast_get_strided_loop(
 NPY_NO_EXPORT NPY_CASTING
 simple_cast_resolve_descriptors(
         PyArrayMethodObject *self,
-        PyArray_DTypeMeta **dtypes,
-        PyArray_Descr **input_descrs,
-        PyArray_Descr **loop_descrs);
+        PyArray_DTypeMeta *dtypes[2],
+        PyArray_Descr *input_descrs[2],
+        PyArray_Descr *loop_descrs[2]);
 
 NPY_NO_EXPORT int
 PyArray_InitializeCasts(void);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_CONVERT_DATATYPE_H_ */
index ef28d7797926559040c0046bd0834927bd831615..78003306afe942cba083fd2a7b56b0e64db55d58 100644 (file)
@@ -1,9 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 
@@ -725,6 +726,7 @@ PyArray_NewFromDescr_int(
     fa->nd = nd;
     fa->dimensions = NULL;
     fa->data = NULL;
+    fa->mem_handler = NULL;
 
     if (data == NULL) {
         fa->flags = NPY_ARRAY_DEFAULT;
@@ -752,14 +754,20 @@ PyArray_NewFromDescr_int(
         }
         fa->strides = fa->dimensions + nd;
 
-        /* Copy dimensions, check them, and find total array size `nbytes` */
+        /*
+         * Copy dimensions, check them, and find total array size `nbytes`
+         *
+         * Note that we ignore 0-length dimensions, to match this in the `free`
+         * calls, `PyArray_NBYTES_ALLOCATED` is a private helper matching this
+         * behaviour, but without overflow checking.
+         */
         for (int i = 0; i < nd; i++) {
             fa->dimensions[i] = dims[i];
 
             if (fa->dimensions[i] == 0) {
                 /*
                  * Compare to PyArray_OverflowMultiplyList that
-                 * returns 0 in this case.
+                 * returns 0 in this case. See also `PyArray_NBYTES_ALLOCATED`.
                  */
                 continue;
             }
@@ -804,12 +812,19 @@ PyArray_NewFromDescr_int(
         fa->flags |= NPY_ARRAY_C_CONTIGUOUS|NPY_ARRAY_F_CONTIGUOUS;
     }
 
+
     if (data == NULL) {
+        /* Store the handler in case the default is modified */
+        fa->mem_handler = PyDataMem_GetHandler();
+        if (fa->mem_handler == NULL) {
+            goto fail;
+        }
         /*
          * Allocate something even for zero-space arrays
          * e.g. shape=(0,) -- otherwise buffer exposure
          * (a.data) doesn't work as it should.
          * Could probably just allocate a few bytes here. -- Chuck
+         * Note: always sync this with calls to PyDataMem_UserFREE
          */
         if (nbytes == 0) {
             nbytes = descr->elsize ? descr->elsize : 1;
@@ -819,21 +834,23 @@ PyArray_NewFromDescr_int(
          * which could also be sub-fields of a VOID array
          */
         if (zeroed || PyDataType_FLAGCHK(descr, NPY_NEEDS_INIT)) {
-            data = npy_alloc_cache_zero(nbytes);
+            data = PyDataMem_UserNEW_ZEROED(nbytes, 1, fa->mem_handler);
         }
         else {
-            data = npy_alloc_cache(nbytes);
+            data = PyDataMem_UserNEW(nbytes, fa->mem_handler);
         }
         if (data == NULL) {
             raise_memory_error(fa->nd, fa->dimensions, descr);
             goto fail;
         }
+
         fa->flags |= NPY_ARRAY_OWNDATA;
     }
     else {
+        /* The handlers should never be called in this case */
+        fa->mem_handler = NULL;
         /*
-         * If data is passed in, this object won't own it by default.
-         * Caller must arrange for this to be reset if truly desired
+         * If data is passed in, this object won't own it.
          */
         fa->flags &= ~NPY_ARRAY_OWNDATA;
     }
@@ -901,6 +918,7 @@ PyArray_NewFromDescr_int(
     return (PyObject *)fa;
 
  fail:
+    Py_XDECREF(fa->mem_handler);
     Py_DECREF(fa);
     return NULL;
 }
@@ -1019,6 +1037,17 @@ PyArray_NewLikeArrayWithShape(PyArrayObject *prototype, NPY_ORDER order,
 
         /* Build the new strides */
         stride = dtype->elsize;
+        if (stride == 0 && PyDataType_ISSTRING(dtype)) {
+            /* Special case for dtype=str or dtype=bytes. */
+            if (dtype->type_num == NPY_STRING) {
+                /* dtype is bytes */
+                stride = 1;
+            }
+            else {
+                /* dtype is str (type_num is NPY_UNICODE) */
+                stride = 4;
+            }
+        }
         for (idim = ndim-1; idim >= 0; --idim) {
             npy_intp i_perm = strideperm[idim].perm;
             strides[i_perm] = stride;
@@ -1261,6 +1290,7 @@ fail:
  *                       DType may be used, but is not enforced.
  * @param writeable whether the result must be writeable.
  * @param context Unused parameter, must be NULL (should be removed later).
+ * @param never_copy Specifies that a copy is not allowed.
  *
  * @returns The array object, Py_NotImplemented if op is not array-like,
  *          or NULL with an error set. (A new reference to Py_NotImplemented
@@ -1268,7 +1298,8 @@ fail:
  */
 NPY_NO_EXPORT PyObject *
 _array_from_array_like(PyObject *op,
-        PyArray_Descr *requested_dtype, npy_bool writeable, PyObject *context) {
+        PyArray_Descr *requested_dtype, npy_bool writeable, PyObject *context,
+        int never_copy) {
     PyObject* tmp;
 
     /*
@@ -1276,9 +1307,10 @@ _array_from_array_like(PyObject *op,
      * We skip bytes and unicode since they are considered scalars. Unicode
      * would fail but bytes would be incorrectly converted to a uint8 array.
      */
-    if (!PyBytes_Check(op) && !PyUnicode_Check(op)) {
+    if (PyObject_CheckBuffer(op) && !PyBytes_Check(op) && !PyUnicode_Check(op)) {
         PyObject *memoryview = PyMemoryView_FromObject(op);
         if (memoryview == NULL) {
+            /* TODO: Should probably not blanket ignore errors. */
             PyErr_Clear();
         }
         else {
@@ -1324,7 +1356,7 @@ _array_from_array_like(PyObject *op,
      *      this should be changed!
      */
     if (!writeable && tmp == Py_NotImplemented) {
-        tmp = PyArray_FromArrayAttr(op, requested_dtype, context);
+        tmp = PyArray_FromArrayAttr_int(op, requested_dtype, never_copy);
         if (tmp == NULL) {
             return NULL;
         }
@@ -1424,7 +1456,7 @@ setArrayFromSequence(PyArrayObject *a, PyObject *s,
     }
 
     /* Try __array__ before using s as a sequence */
-    PyObject *tmp = _array_from_array_like(s, NULL, 0, NULL);
+    PyObject *tmp = _array_from_array_like(s, NULL, 0, NULL, 0);
     if (tmp == NULL) {
         goto fail;
     }
@@ -1552,7 +1584,8 @@ PyArray_FromAny(PyObject *op, PyArray_Descr *newtype, int min_depth,
     Py_XDECREF(newtype);
 
     ndim = PyArray_DiscoverDTypeAndShape(op,
-            NPY_MAXDIMS, dims, &cache, fixed_DType, fixed_descriptor, &dtype);
+            NPY_MAXDIMS, dims, &cache, fixed_DType, fixed_descriptor, &dtype,
+            flags & NPY_ARRAY_ENSURENOCOPY);
 
     Py_XDECREF(fixed_descriptor);
     Py_XDECREF(fixed_DType);
@@ -1677,7 +1710,19 @@ PyArray_FromAny(PyObject *op, PyArray_Descr *newtype, int min_depth,
                 ((PyVoidScalarObject *)op)->flags,
                 NULL, op);
     }
-    else if (cache == 0 && newtype != NULL &&
+    /*
+     * If we got this far, we definitely have to create a copy, since we are
+     * converting either from a scalar (cache == NULL) or a (nested) sequence.
+     */
+    if (flags & NPY_ARRAY_ENSURENOCOPY ) {
+        PyErr_SetString(PyExc_ValueError,
+                "Unable to avoid copy while creating an array.");
+        Py_DECREF(dtype);
+        npy_free_coercion_cache(cache);
+        return NULL;
+    }
+
+    if (cache == NULL && newtype != NULL &&
             PyDataType_ISSIGNED(newtype) && PyArray_IsScalar(op, Generic)) {
         assert(ndim == 0);
         /*
@@ -1778,7 +1823,8 @@ PyArray_FromAny(PyObject *op, PyArray_Descr *newtype, int min_depth,
  * NPY_ARRAY_WRITEBACKIFCOPY,
  * NPY_ARRAY_FORCECAST,
  * NPY_ARRAY_ENSUREARRAY,
- * NPY_ARRAY_ELEMENTSTRIDES
+ * NPY_ARRAY_ELEMENTSTRIDES,
+ * NPY_ARRAY_ENSURENOCOPY
  *
  * or'd (|) together
  *
@@ -1839,9 +1885,15 @@ PyArray_CheckFromAny(PyObject *op, PyArray_Descr *descr, int min_depth,
     if (obj == NULL) {
         return NULL;
     }
-    if ((requires & NPY_ARRAY_ELEMENTSTRIDES) &&
-        !PyArray_ElementStrides(obj)) {
+
+    if ((requires & NPY_ARRAY_ELEMENTSTRIDES)
+            && !PyArray_ElementStrides(obj)) {
         PyObject *ret;
+        if (requires & NPY_ARRAY_ENSURENOCOPY) {
+            PyErr_SetString(PyExc_ValueError,
+                    "Unable to avoid copy while creating a new array.");
+            return NULL;
+        }
         ret = PyArray_NewCopy((PyArrayObject *)obj, NPY_ANYORDER);
         Py_DECREF(obj);
         obj = ret;
@@ -1916,6 +1968,13 @@ PyArray_FromArray(PyArrayObject *arr, PyArray_Descr *newtype, int flags)
            !PyArray_EquivTypes(oldtype, newtype);
 
     if (copy) {
+        if (flags & NPY_ARRAY_ENSURENOCOPY ) {
+            PyErr_SetString(PyExc_ValueError,
+                    "Unable to avoid copy while creating an array from given array.");
+            Py_DECREF(newtype);
+            return NULL;
+        }
+
         NPY_ORDER order = NPY_KEEPORDER;
         int subok = 1;
 
@@ -1988,7 +2047,6 @@ PyArray_FromArray(PyArrayObject *arr, PyArray_Descr *newtype, int flags)
             if (flags & NPY_ARRAY_ENSUREARRAY) {
                 subtype = &PyArray_Type;
             }
-
             ret = (PyArrayObject *)PyArray_View(arr, NULL, subtype);
             if (ret == NULL) {
                 return NULL;
@@ -2413,18 +2471,30 @@ PyArray_FromInterface(PyObject *origin)
     return NULL;
 }
 
-/*NUMPY_API
+
+/**
+ * Check for an __array__ attribute and call it when it exists.
+ *
+ *  .. warning:
+ *      If returned, `NotImplemented` is borrowed and must not be Decref'd
+ *
+ * @param op The Python object to convert to an array.
+ * @param descr The desired `arr.dtype`, passed into the `__array__` call,
+ *        as information but is not checked/enforced!
+ * @param never_copy Specifies that a copy is not allowed.
+ *        NOTE: Currently, this means an error is raised instead of calling
+ *        `op.__array__()`.  In the future we could call for example call
+ *        `op.__array__(never_copy=True)` instead.
+ * @returns NotImplemented if `__array__` is not defined or a NumPy array
+ *          (or subclass).  On error, return NULL.
  */
 NPY_NO_EXPORT PyObject *
-PyArray_FromArrayAttr(PyObject *op, PyArray_Descr *typecode, PyObject *context)
+PyArray_FromArrayAttr_int(
+        PyObject *op, PyArray_Descr *descr, int never_copy)
 {
     PyObject *new;
     PyObject *array_meth;
 
-    if (context != NULL) {
-        PyErr_SetString(PyExc_RuntimeError, "'context' must be NULL");
-        return NULL;
-    }
     array_meth = PyArray_LookupSpecial_OnInstance(op, "__array__");
     if (array_meth == NULL) {
         if (PyErr_Occurred()) {
@@ -2440,6 +2510,16 @@ PyArray_FromArrayAttr(PyObject *op, PyArray_Descr *typecode, PyObject *context)
         }
         return Py_NotImplemented;
     }
+    if (never_copy) {
+        /* Currently, we must always assume that `__array__` returns a copy */
+        PyErr_SetString(PyExc_ValueError,
+                "Unable to avoid copy while converting from an object "
+                "implementing the `__array__` protocol.  NumPy cannot ensure "
+                "that no copy will be made.");
+        Py_DECREF(array_meth);
+        return NULL;
+    }
+
     if (PyType_Check(op) && PyObject_HasAttrString(array_meth, "__get__")) {
         /*
          * If the input is a class `array_meth` may be a property-like object.
@@ -2450,11 +2530,11 @@ PyArray_FromArrayAttr(PyObject *op, PyArray_Descr *typecode, PyObject *context)
         Py_DECREF(array_meth);
         return Py_NotImplemented;
     }
-    if (typecode == NULL) {
+    if (descr == NULL) {
         new = PyObject_CallFunction(array_meth, NULL);
     }
     else {
-        new = PyObject_CallFunction(array_meth, "O", typecode);
+        new = PyObject_CallFunction(array_meth, "O", descr);
     }
     Py_DECREF(array_meth);
     if (new == NULL) {
@@ -2470,6 +2550,21 @@ PyArray_FromArrayAttr(PyObject *op, PyArray_Descr *typecode, PyObject *context)
     return new;
 }
 
+
+/*NUMPY_API
+ */
+NPY_NO_EXPORT PyObject *
+PyArray_FromArrayAttr(PyObject *op, PyArray_Descr *typecode, PyObject *context)
+{
+    if (context != NULL) {
+        PyErr_SetString(PyExc_RuntimeError, "'context' must be NULL");
+        return NULL;
+    }
+
+    return PyArray_FromArrayAttr_int(op, typecode, 0);
+}
+
+
 /*NUMPY_API
 * new reference -- accepts NULL for mintype
 */
@@ -2705,7 +2800,7 @@ PyArray_CopyAsFlat(PyArrayObject *dst, PyArrayObject *src, NPY_ORDER order)
         /* If we exhausted the dst block, refresh it */
         if (dst_count == count) {
             res = dst_iternext(dst_iter);
-            if (!res) {
+            if (res == 0) {
                 break;
             }
             dst_count = *dst_countptr;
@@ -2719,7 +2814,7 @@ PyArray_CopyAsFlat(PyArrayObject *dst, PyArrayObject *src, NPY_ORDER order)
         /* If we exhausted the src block, refresh it */
         if (src_count == count) {
             res = src_iternext(src_iter);
-            if (!res) {
+            if (res == 0) {
                 break;
             }
             src_count = *src_countptr;
@@ -2736,10 +2831,6 @@ PyArray_CopyAsFlat(PyArrayObject *dst, PyArrayObject *src, NPY_ORDER order)
     NPY_cast_info_xfree(&cast_info);
     NpyIter_Deallocate(dst_iter);
     NpyIter_Deallocate(src_iter);
-    if (res > 0) {
-        /* The iteration stopped successfully, do not report an error */
-        return 0;
-    }
     return res;
 }
 
@@ -3321,7 +3412,7 @@ array_fromfile_binary(FILE *fp, PyArray_Descr *dtype, npy_intp num, size_t *nrea
             fail = 1;
         }
         if (fail) {
-            PyErr_SetString(PyExc_IOError,
+            PyErr_SetString(PyExc_OSError,
                             "could not seek in file");
             return NULL;
         }
@@ -3401,7 +3492,9 @@ array_from_text(PyArray_Descr *dtype, npy_intp num, char const *sep, size_t *nre
         dptr += dtype->elsize;
         if (num < 0 && thisbuf == size) {
             totalbytes += bytes;
-            tmp = PyDataMem_RENEW(PyArray_DATA(r), totalbytes);
+            /* The handler is always valid */
+            tmp = PyDataMem_UserRENEW(PyArray_DATA(r), totalbytes,
+                                  PyArray_HANDLER(r));
             if (tmp == NULL) {
                 err = 1;
                 break;
@@ -3423,7 +3516,9 @@ array_from_text(PyArray_Descr *dtype, npy_intp num, char const *sep, size_t *nre
         const size_t nsize = PyArray_MAX(*nread,1)*dtype->elsize;
 
         if (nsize != 0) {
-            tmp = PyDataMem_RENEW(PyArray_DATA(r), nsize);
+            /* The handler is always valid */
+            tmp = PyDataMem_UserRENEW(PyArray_DATA(r), nsize,
+                                  PyArray_HANDLER(r));
             if (tmp == NULL) {
                 err = 1;
             }
@@ -3528,7 +3623,9 @@ PyArray_FromFile(FILE *fp, PyArray_Descr *dtype, npy_intp num, char *sep)
         const size_t nsize = PyArray_MAX(nread,1) * dtype->elsize;
         char *tmp;
 
-        if ((tmp = PyDataMem_RENEW(PyArray_DATA(ret), nsize)) == NULL) {
+        /* The handler is always valid */
+        if((tmp = PyDataMem_UserRENEW(PyArray_DATA(ret), nsize,
+                                     PyArray_HANDLER(ret))) == NULL) {
             Py_DECREF(dtype);
             Py_DECREF(ret);
             return PyErr_NoMemory();
@@ -3812,7 +3909,9 @@ PyArray_FromIter(PyObject *obj, PyArray_Descr *dtype, npy_intp count)
             */
             elcount = (i >> 1) + (i < 4 ? 4 : 2) + i;
             if (!npy_mul_with_overflow_intp(&nbytes, elcount, elsize)) {
-                new_data = PyDataMem_RENEW(PyArray_DATA(ret), nbytes);
+                /* The handler is always valid */
+                new_data = PyDataMem_UserRENEW(PyArray_DATA(ret), nbytes,
+                                  PyArray_HANDLER(ret));
             }
             else {
                 new_data = NULL;
@@ -3850,10 +3949,12 @@ PyArray_FromIter(PyObject *obj, PyArray_Descr *dtype, npy_intp count)
      * (assuming realloc is reasonably good about reusing space...)
      */
     if (i == 0 || elsize == 0) {
-        /* The size cannot be zero for PyDataMem_RENEW. */
+        /* The size cannot be zero for realloc. */
         goto done;
     }
-    new_data = PyDataMem_RENEW(PyArray_DATA(ret), i * elsize);
+    /* The handler is always valid */
+    new_data = PyDataMem_UserRENEW(PyArray_DATA(ret), i * elsize,
+                                   PyArray_HANDLER(ret));
     if (new_data == NULL) {
         PyErr_SetString(PyExc_MemoryError,
                 "cannot allocate array memory");
@@ -3983,8 +4084,8 @@ _array_fill_strides(npy_intp *strides, npy_intp const *dims, int nd, size_t item
 NPY_NO_EXPORT PyArrayObject *
 PyArray_SubclassWrap(PyArrayObject *arr_of_subclass, PyArrayObject *towrap)
 {
-    PyObject *wrapped = PyObject_CallMethod((PyObject *)arr_of_subclass,
-                                        "__array_wrap__", "O", towrap);
+    PyObject *wrapped = PyObject_CallMethodObjArgs((PyObject *)arr_of_subclass,
+            npy_ma_str_array_wrap, (PyObject *)towrap, NULL);
     if (wrapped == NULL) {
         return NULL;
     }
index 8db1412c71c90026f33c5cb5a649e389b540cc95..98160b1cc48fdefb447b71d3455f451232a78fb6 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ARRAY_CTORS_H_
-#define _NPY_ARRAY_CTORS_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_CTORS_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_CTORS_H_
 
 NPY_NO_EXPORT PyObject *
 PyArray_NewFromDescr(
@@ -32,7 +32,8 @@ PyArray_New(
 
 NPY_NO_EXPORT PyObject *
 _array_from_array_like(PyObject *op,
-        PyArray_Descr *requested_dtype, npy_bool writeable, PyObject *context);
+        PyArray_Descr *requested_dtype, npy_bool writeable, PyObject *context,
+        int never_copy);
 
 NPY_NO_EXPORT PyObject *
 PyArray_FromAny(PyObject *op, PyArray_Descr *newtype, int min_depth,
@@ -51,6 +52,10 @@ PyArray_FromStructInterface(PyObject *input);
 NPY_NO_EXPORT PyObject *
 PyArray_FromInterface(PyObject *input);
 
+NPY_NO_EXPORT PyObject *
+PyArray_FromArrayAttr_int(
+        PyObject *op, PyArray_Descr *descr, int never_copy);
+
 NPY_NO_EXPORT PyObject *
 PyArray_FromArrayAttr(PyObject *op, PyArray_Descr *typecode,
                       PyObject *context);
@@ -102,4 +107,4 @@ NPY_NO_EXPORT PyArrayObject *
 PyArray_SubclassWrap(PyArrayObject *arr_of_subclass, PyArrayObject *towrap);
 
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_CTORS_H_ */
index b9d81e8368c5bea196006359a1ddfedf8a79d7ea..e0064c017361bce1d29c6331f7457b1f53d4bb18 100644 (file)
@@ -6,16 +6,14 @@
  *
  * See LICENSE.txt for the license.
  */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include <datetime.h>
 
-#include <time.h>
-
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
-#include <numpy/arrayobject.h>
+#include "numpy/arrayobject.h"
+#include "numpyos.h"
 
 #include "npy_config.h"
 #include "npy_pycompat.h"
 #include "usertypes.h"
 
 #include "dtype_transfer.h"
-#include <lowlevel_strided_loops.h>
+#include "lowlevel_strided_loops.h"
+
+#include <datetime.h>
+#include <time.h>
+
 
 /*
  * Computes the python `ret, d = divmod(d, unit)`.
@@ -426,7 +428,7 @@ PyArray_DatetimeStructToDatetime(
 }
 
 /*NUMPY_API
- * Create a timdelta value from a filled timedelta struct and resolution unit.
+ * Create a timedelta value from a filled timedelta struct and resolution unit.
  *
  * TO BE REMOVED - NOT USED INTERNALLY.
  */
@@ -722,12 +724,21 @@ parse_datetime_extended_unit_from_string(char const *str, Py_ssize_t len,
 {
     char const *substr = str, *substrend = NULL;
     int den = 1;
+    npy_longlong true_meta_val;
 
     /* First comes an optional integer multiplier */
     out_meta->num = (int)strtol_const(substr, &substrend, 10);
     if (substr == substrend) {
         out_meta->num = 1;
     }
+    else {
+        // check for 32-bit integer overflow
+        char *endptr = NULL;
+        true_meta_val = NumPyOS_strtoll(substr, &endptr, 10);
+        if (true_meta_val > INT_MAX || true_meta_val < 0) {
+            goto bad_input;
+        }
+    }
     substr = substrend;
 
     /* Next comes the unit itself, followed by either '/' or the string end */
@@ -1159,7 +1170,7 @@ get_datetime_conversion_factor(PyArray_DatetimeMetaData *src_meta,
     }
 
     /* If something overflowed, make both num and denom 0 */
-    if (denom == 0 || num == 0) {
+    if (num == 0) {
         PyErr_Format(PyExc_OverflowError,
                     "Integer overflow while computing the conversion "
                     "factor between NumPy datetime units %s and %s",
@@ -3775,7 +3786,17 @@ time_to_time_resolve_descriptors(
     meta2 = get_datetime_metadata_from_dtype(loop_descrs[1]);
     assert(meta2 != NULL);
 
-    if (meta1->base == meta2->base && meta1->num == meta2->num) {
+    if ((meta1->base == meta2->base && meta1->num == meta2->num) ||
+            // handle some common metric prefix conversions
+            // 1000 fold conversions
+            ((meta2->base >= 7) && (meta1->base - meta2->base == 1)
+              && ((meta1->num / meta2->num) == 1000)) ||
+            // 10^6 fold conversions
+            ((meta2->base >= 7) && (meta1->base - meta2->base == 2)
+              && ((meta1->num / meta2->num) == 1000000)) ||
+            // 10^9 fold conversions
+            ((meta2->base >= 7) && (meta1->base - meta2->base == 3)
+              && ((meta1->num / meta2->num) == 1000000000))) {
         if (byteorder_may_allow_view) {
             return NPY_NO_CASTING | byteorder_may_allow_view;
         }
@@ -3996,7 +4017,7 @@ string_to_datetime_cast_resolve_descriptors(
 {
     if (given_descrs[1] == NULL) {
         /* NOTE: This doesn't actually work, and will error during the cast */
-        loop_descrs[1] = dtypes[1]->default_descr(dtypes[1]);
+        loop_descrs[1] = NPY_DT_CALL_default_descr(dtypes[1]);
         if (loop_descrs[1] == NULL) {
             return -1;
         }
index f0564146d9e6cf9d0839e54169a9f745f10a1208..d3e9e14513018ef58b211b7ad29137eb9e9b162d 100644 (file)
@@ -6,12 +6,12 @@
  *
  * See LICENSE.txt for the license.
  */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include <numpy/arrayobject.h>
 
 #include "npy_config.h"
index 483151122b2a9748cfe835e6445f4265d7f50361..b53a250102474f6cd6f60426be17f66863541564 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_PRIVATE__DATETIME_BUSDAY_H_
-#define _NPY_PRIVATE__DATETIME_BUSDAY_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_DATETIME_BUSDAY_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_DATETIME_BUSDAY_H_
 
 /*
  * This is the 'busday_offset' function exposed for calling
@@ -25,4 +25,4 @@ NPY_NO_EXPORT PyObject *
 array_is_busday(PyObject *NPY_UNUSED(self),
                       PyObject *args, PyObject *kwds);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_DATETIME_BUSDAY_H_ */
index d48141d4cb7d98d3ddaa5cdaca518aa80a1b0c48..880efe934c0991c467b374a91f495794616c8a69 100644 (file)
@@ -7,19 +7,19 @@
  *
  * See LICENSE.txt for the license.
  */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
-#include <numpy/arrayobject.h>
+#include "numpy/arrayobject.h"
+#include "numpy/arrayscalars.h"
 
 #include "npy_config.h"
 #include "npy_pycompat.h"
 
 #include "common.h"
-#include "numpy/arrayscalars.h"
 #include "lowlevel_strided_loops.h"
 #include "_datetime.h"
 #include "datetime_busday.h"
@@ -434,7 +434,7 @@ busdaycalendar_dealloc(NpyBusDayCalendar *self)
 }
 
 static PyObject *
-busdaycalendar_weekmask_get(NpyBusDayCalendar *self)
+busdaycalendar_weekmask_get(NpyBusDayCalendar *self, void *NPY_UNUSED(ignored))
 {
     PyArrayObject *ret;
     npy_intp size = 7;
@@ -452,7 +452,7 @@ busdaycalendar_weekmask_get(NpyBusDayCalendar *self)
 }
 
 static PyObject *
-busdaycalendar_holidays_get(NpyBusDayCalendar *self)
+busdaycalendar_holidays_get(NpyBusDayCalendar *self, void *NPY_UNUSED(ignored))
 {
     PyArrayObject *ret;
     PyArray_Descr *date_dtype;
index 02903e3d20a0a51496b985a7d716862d5e8c9652..20efebe0a3b479e3312cd529bc215bd8e25f0ab8 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_PRIVATE__DATETIME_BUSDAYDEF_H_
-#define _NPY_PRIVATE__DATETIME_BUSDAYDEF_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_DATETIME_BUSDAYCAL_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_DATETIME_BUSDAYCAL_H_
 
 /*
  * A list of holidays, which should be sorted, not contain any
@@ -59,4 +59,4 @@ PyArray_HolidaysConverter(PyObject *dates_in, npy_holidayslist *holidays);
 
 
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_DATETIME_BUSDAYCAL_H_ */
index 360868568478fcb861b45e96d0f5e89573b74348..5080647cb1b4fda9d934dd9e7e9ef2e30738157e 100644 (file)
@@ -6,15 +6,14 @@
  *
  * See LICENSE.txt for the license.
  */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
-#include <time.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
-#include <numpy/arrayobject.h>
+#include "numpy/arrayobject.h"
 
 #include "npy_config.h"
 #include "npy_pycompat.h"
@@ -24,6 +23,8 @@
 #include "_datetime.h"
 #include "datetime_strings.h"
 
+#include <time.h>
+
 /*
  * Platform-specific time_t typedef. Some platforms use 32 bit, some use 64 bit
  * and we just use the default with the exception of mingw, where we must use
index 148369595f18f2568368cb026bdf5233d62b60c6..ca35d29c8fc70960b966035b4b5bd6bcfe9c7814 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_PRIVATE__DATETIME_STRINGS_H_
-#define _NPY_PRIVATE__DATETIME_STRINGS_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_DATETIME_STRINGS_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_DATETIME_STRINGS_H_
 
 /*
  * Parses (almost) standard ISO 8601 date strings. The differences are:
@@ -81,4 +81,4 @@ NPY_NO_EXPORT PyObject *
 array_datetime_as_string(PyObject *NPY_UNUSED(self), PyObject *args,
                                 PyObject *kwds);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_DATETIME_STRINGS_H_ */
index fa24f1a87dbf1693c5cd71ea34afa45d827d7aa5..0c539053c9e764cd5d2318f6a49ae6888d92d99c 100644 (file)
@@ -1,11 +1,11 @@
 /* Array Descr Object */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 
@@ -20,6 +20,7 @@
 #include "alloc.h"
 #include "assert.h"
 #include "npy_buffer.h"
+#include "dtypemeta.h"
 
 /*
  * offset:    A starting offset.
@@ -256,7 +257,7 @@ static PyArray_Descr *
 _convert_from_tuple(PyObject *obj, int align)
 {
     if (PyTuple_GET_SIZE(obj) != 2) {
-        PyErr_Format(PyExc_TypeError, 
+        PyErr_Format(PyExc_TypeError,
                "Tuple must have size 2, but has size %zd",
                PyTuple_GET_SIZE(obj));
         return NULL;
@@ -448,8 +449,8 @@ _convert_from_array_descr(PyObject *obj, int align)
     for (int i = 0; i < n; i++) {
         PyObject *item = PyList_GET_ITEM(obj, i);
         if (!PyTuple_Check(item) || (PyTuple_GET_SIZE(item) < 2)) {
-            PyErr_Format(PyExc_TypeError, 
-                        "Field elements must be 2- or 3-tuples, got '%R'", 
+            PyErr_Format(PyExc_TypeError,
+                        "Field elements must be 2- or 3-tuples, got '%R'",
                         item);
             goto fail;
         }
@@ -460,7 +461,7 @@ _convert_from_array_descr(PyObject *obj, int align)
         }
         else if (PyTuple_Check(name)) {
             if (PyTuple_GET_SIZE(name) != 2) {
-                PyErr_Format(PyExc_TypeError, 
+                PyErr_Format(PyExc_TypeError,
                                "If a tuple, the first element of a field tuple must have "
                                "two elements, not %zd",
                                PyTuple_GET_SIZE(name));
@@ -474,7 +475,7 @@ _convert_from_array_descr(PyObject *obj, int align)
             }
         }
         else {
-            PyErr_SetString(PyExc_TypeError, 
+            PyErr_SetString(PyExc_TypeError,
                                    "First element of field tuple is "
                                    "neither a tuple nor str");
             goto fail;
@@ -1722,22 +1723,6 @@ _convert_from_str(PyObject *obj, int align)
             goto fail;
         }
 
-        /* Check for a deprecated Numeric-style typecode */
-        /* `Uint` has deliberately weird uppercasing */
-        char *dep_tps[] = {"Bytes", "Datetime64", "Str", "Uint"};
-        int ndep_tps = sizeof(dep_tps) / sizeof(dep_tps[0]);
-        for (int i = 0; i < ndep_tps; ++i) {
-            char *dep_tp = dep_tps[i];
-
-            if (strncmp(type, dep_tp, strlen(dep_tp)) == 0) {
-                /* Deprecated 2020-06-09, NumPy 1.20 */
-                if (DEPRECATE("Numeric-style type codes are "
-                              "deprecated and will result in "
-                              "an error in the future.") < 0) {
-                    goto fail;
-                }
-            }
-        }
         /*
          * Probably only ever dispatches to `_convert_from_type`, but who
          * knows what users are injecting into `np.typeDict`.
@@ -1895,7 +1880,7 @@ static PyMemberDef arraydescr_members[] = {
 };
 
 static PyObject *
-arraydescr_subdescr_get(PyArray_Descr *self)
+arraydescr_subdescr_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     if (!PyDataType_HASSUBARRAY(self)) {
         Py_RETURN_NONE;
@@ -1905,7 +1890,7 @@ arraydescr_subdescr_get(PyArray_Descr *self)
 }
 
 NPY_NO_EXPORT PyObject *
-arraydescr_protocol_typestr_get(PyArray_Descr *self)
+arraydescr_protocol_typestr_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     char basic_ = self->kind;
     char endian = self->byteorder;
@@ -1951,7 +1936,7 @@ arraydescr_protocol_typestr_get(PyArray_Descr *self)
 }
 
 static PyObject *
-arraydescr_name_get(PyArray_Descr *self)
+arraydescr_name_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     /* let python handle this */
     PyObject *_numpy_dtype;
@@ -1966,7 +1951,7 @@ arraydescr_name_get(PyArray_Descr *self)
 }
 
 static PyObject *
-arraydescr_base_get(PyArray_Descr *self)
+arraydescr_base_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     if (!PyDataType_HASSUBARRAY(self)) {
         Py_INCREF(self);
@@ -1977,7 +1962,7 @@ arraydescr_base_get(PyArray_Descr *self)
 }
 
 static PyObject *
-arraydescr_shape_get(PyArray_Descr *self)
+arraydescr_shape_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     if (!PyDataType_HASSUBARRAY(self)) {
         return PyTuple_New(0);
@@ -1988,7 +1973,7 @@ arraydescr_shape_get(PyArray_Descr *self)
 }
 
 static PyObject *
-arraydescr_ndim_get(PyArray_Descr *self)
+arraydescr_ndim_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     Py_ssize_t ndim;
 
@@ -2006,7 +1991,7 @@ arraydescr_ndim_get(PyArray_Descr *self)
 
 
 NPY_NO_EXPORT PyObject *
-arraydescr_protocol_descr_get(PyArray_Descr *self)
+arraydescr_protocol_descr_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     PyObject *dobj, *res;
     PyObject *_numpy_internal;
@@ -2018,7 +2003,7 @@ arraydescr_protocol_descr_get(PyArray_Descr *self)
             return NULL;
         }
         PyTuple_SET_ITEM(dobj, 0, PyUnicode_FromString(""));
-        PyTuple_SET_ITEM(dobj, 1, arraydescr_protocol_typestr_get(self));
+        PyTuple_SET_ITEM(dobj, 1, arraydescr_protocol_typestr_get(self, NULL));
         res = PyList_New(1);
         if (res == NULL) {
             Py_DECREF(dobj);
@@ -2043,7 +2028,7 @@ arraydescr_protocol_descr_get(PyArray_Descr *self)
  * return 0 if neither (i.e. it's a copy of one)
  */
 static PyObject *
-arraydescr_isbuiltin_get(PyArray_Descr *self)
+arraydescr_isbuiltin_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     long val;
     val = 0;
@@ -2090,7 +2075,7 @@ _arraydescr_isnative(PyArray_Descr *self)
  * fields are defined
  */
 static PyObject *
-arraydescr_isnative_get(PyArray_Descr *self)
+arraydescr_isnative_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     PyObject *ret;
     int retval;
@@ -2104,7 +2089,7 @@ arraydescr_isnative_get(PyArray_Descr *self)
 }
 
 static PyObject *
-arraydescr_isalignedstruct_get(PyArray_Descr *self)
+arraydescr_isalignedstruct_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     PyObject *ret;
     ret = (self->flags&NPY_ALIGNED_STRUCT) ? Py_True : Py_False;
@@ -2113,7 +2098,7 @@ arraydescr_isalignedstruct_get(PyArray_Descr *self)
 }
 
 static PyObject *
-arraydescr_fields_get(PyArray_Descr *self)
+arraydescr_fields_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     if (!PyDataType_HASFIELDS(self)) {
         Py_RETURN_NONE;
@@ -2122,7 +2107,7 @@ arraydescr_fields_get(PyArray_Descr *self)
 }
 
 static PyObject *
-arraydescr_metadata_get(PyArray_Descr *self)
+arraydescr_metadata_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     if (self->metadata == NULL) {
         Py_RETURN_NONE;
@@ -2131,7 +2116,7 @@ arraydescr_metadata_get(PyArray_Descr *self)
 }
 
 static PyObject *
-arraydescr_hasobject_get(PyArray_Descr *self)
+arraydescr_hasobject_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     if (PyDataType_FLAGCHK(self, NPY_ITEM_HASOBJECT)) {
         Py_RETURN_TRUE;
@@ -2142,7 +2127,7 @@ arraydescr_hasobject_get(PyArray_Descr *self)
 }
 
 static PyObject *
-arraydescr_names_get(PyArray_Descr *self)
+arraydescr_names_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
 {
     if (!PyDataType_HASFIELDS(self)) {
         Py_RETURN_NONE;
@@ -2152,7 +2137,8 @@ arraydescr_names_get(PyArray_Descr *self)
 }
 
 static int
-arraydescr_names_set(PyArray_Descr *self, PyObject *val)
+arraydescr_names_set(
+        PyArray_Descr *self, PyObject *val, void *NPY_UNUSED(ignored))
 {
     int N = 0;
     int i;
@@ -2318,9 +2304,39 @@ arraydescr_new(PyTypeObject *subtype,
                 PyObject *args, PyObject *kwds)
 {
     if (subtype != &PyArrayDescr_Type) {
+        if (Py_TYPE(subtype) == &PyArrayDTypeMeta_Type &&
+                (NPY_DT_SLOTS((PyArray_DTypeMeta *)subtype)) != NULL &&
+                !NPY_DT_is_legacy((PyArray_DTypeMeta *)subtype) &&
+                subtype->tp_new != PyArrayDescr_Type.tp_new) {
+            /*
+             * Appears to be a properly initialized user DType. Allocate
+             * it and initialize the main part as best we can.
+             * TODO: This should probably be a user function, and enforce
+             *       things like the `elsize` being correctly set.
+             * TODO: This is EXPERIMENTAL API!
+             */
+            PyArray_DTypeMeta *DType = (PyArray_DTypeMeta *)subtype;
+            PyArray_Descr *descr = (PyArray_Descr *)subtype->tp_alloc(subtype, 0);
+            if (descr == 0) {
+                PyErr_NoMemory();
+                return NULL;
+            }
+            PyObject_Init((PyObject *)descr, subtype);
+            descr->f = &NPY_DT_SLOTS(DType)->f;
+            Py_XINCREF(DType->scalar_type);
+            descr->typeobj = DType->scalar_type;
+            descr->type_num = DType->type_num;
+            descr->flags = NPY_USE_GETITEM|NPY_USE_SETITEM;
+            descr->byteorder = '|';  /* If DType uses it, let it override */
+            descr->elsize = -1;  /* Initialize to invalid value */
+            descr->hash = -1;
+            return (PyObject *)descr;
+        }
         /* The DTypeMeta class should prevent this from happening. */
         PyErr_Format(PyExc_SystemError,
-                "'%S' must not inherit np.dtype.__new__().", subtype);
+                "'%S' must not inherit np.dtype.__new__(). User DTypes should "
+                "currently call `PyArrayDescr_Type.tp_new` from their new.",
+                subtype);
         return NULL;
     }
 
@@ -2536,7 +2552,7 @@ arraydescr_reduce(PyArray_Descr *self, PyObject *NPY_UNUSED(args))
     }
 
     PyTuple_SET_ITEM(state, 1, PyUnicode_FromFormat("%c", endian));
-    PyTuple_SET_ITEM(state, 2, arraydescr_subdescr_get(self));
+    PyTuple_SET_ITEM(state, 2, arraydescr_subdescr_get(self, NULL));
     if (PyDataType_HASFIELDS(self)) {
         Py_INCREF(self->names);
         Py_INCREF(self->fields);
@@ -3115,6 +3131,30 @@ arraydescr_newbyteorder(PyArray_Descr *self, PyObject *args)
     return (PyObject *)PyArray_DescrNewByteorder(self, endian);
 }
 
+static PyObject *
+arraydescr_class_getitem(PyObject *cls, PyObject *args)
+{
+    PyObject *generic_alias;
+
+#ifdef Py_GENERICALIASOBJECT_H
+    Py_ssize_t args_len;
+
+    args_len = PyTuple_Check(args) ? PyTuple_Size(args) : 1;
+    if (args_len != 1) {
+        return PyErr_Format(PyExc_TypeError,
+                            "Too %s arguments for %s",
+                            args_len > 1 ? "many" : "few",
+                            ((PyTypeObject *)cls)->tp_name);
+    }
+    generic_alias = Py_GenericAlias(cls, args);
+#else
+    PyErr_SetString(PyExc_TypeError,
+                    "Type subscription requires python >= 3.9");
+    generic_alias = NULL;
+#endif
+    return generic_alias;
+}
+
 static PyMethodDef arraydescr_methods[] = {
     /* for pickling */
     {"__reduce__",
@@ -3126,6 +3166,10 @@ static PyMethodDef arraydescr_methods[] = {
     {"newbyteorder",
         (PyCFunction)arraydescr_newbyteorder,
         METH_VARARGS, NULL},
+    /* for typing; requires python >= 3.9 */
+    {"__class_getitem__",
+        (PyCFunction)arraydescr_class_getitem,
+        METH_CLASS | METH_O, NULL},
     {NULL, NULL, 0, NULL}           /* sentinel */
 };
 
@@ -3543,9 +3587,7 @@ NPY_NO_EXPORT PyArray_DTypeMeta PyArrayDescr_TypeFull = {
         .tp_new = arraydescr_new,
     },},
     .type_num = -1,
-    .kind = '\0',
-    .abstract = 1,
-    .parametric = 0,
-    .singleton = 0,
+    .flags = NPY_DT_ABSTRACT,
+    .singleton = NULL,
     .scalar_type = NULL,
 };
index fc9e0895b88ef8c157b7aa3819bae32e3647f336..f832958dae902f1b449ed3230a4c34bb3cb76b43 100644 (file)
@@ -1,8 +1,10 @@
-#ifndef _NPY_ARRAYDESCR_H_
-#define _NPY_ARRAYDESCR_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_DESCRIPTOR_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_DESCRIPTOR_H_
 
-NPY_NO_EXPORT PyObject *arraydescr_protocol_typestr_get(PyArray_Descr *);
-NPY_NO_EXPORT PyObject *arraydescr_protocol_descr_get(PyArray_Descr *self);
+NPY_NO_EXPORT PyObject *arraydescr_protocol_typestr_get(
+        PyArray_Descr *, void *);
+NPY_NO_EXPORT PyObject *arraydescr_protocol_descr_get(
+        PyArray_Descr *self, void *);
 
 NPY_NO_EXPORT PyObject *
 array_set_typeDict(PyObject *NPY_UNUSED(ignored), PyObject *args);
@@ -28,4 +30,4 @@ arraydescr_field_subset_view(PyArray_Descr *self, PyObject *ind);
 
 extern NPY_NO_EXPORT char const *_datetime_strings[];
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_DESCRIPTOR_H_ */
diff --git a/numpy/core/src/multiarray/dlpack.c b/numpy/core/src/multiarray/dlpack.c
new file mode 100644 (file)
index 0000000..291e60a
--- /dev/null
@@ -0,0 +1,408 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+#include <dlpack/dlpack.h>
+
+#include "numpy/arrayobject.h"
+#include "common/npy_argparse.h"
+
+#include "common/dlpack/dlpack.h"
+#include "common/npy_dlpack.h"
+
+static void
+array_dlpack_deleter(DLManagedTensor *self)
+{
+    PyArrayObject *array = (PyArrayObject *)self->manager_ctx;
+    // This will also free the strides as it's one allocation.
+    PyMem_Free(self->dl_tensor.shape);
+    PyMem_Free(self);
+    Py_XDECREF(array);
+}
+
+/* This is exactly as mandated by dlpack */
+static void dlpack_capsule_deleter(PyObject *self) {
+    if (PyCapsule_IsValid(self, NPY_DLPACK_USED_CAPSULE_NAME)) {
+        return;
+    }
+
+    /* an exception may be in-flight, we must save it in case we create another one */
+    PyObject *type, *value, *traceback;
+    PyErr_Fetch(&type, &value, &traceback);
+
+    DLManagedTensor *managed =
+        (DLManagedTensor *)PyCapsule_GetPointer(self, NPY_DLPACK_CAPSULE_NAME);
+    if (managed == NULL) {
+        PyErr_WriteUnraisable(self);
+        goto done;
+    }
+    /*
+     *  the spec says the deleter can be NULL if there is no way for the caller
+     * to provide a reasonable destructor.
+     */
+    if (managed->deleter) {
+        managed->deleter(managed);
+        /* TODO: is the deleter allowed to set a python exception? */
+        assert(!PyErr_Occurred());
+    }
+
+done:
+    PyErr_Restore(type, value, traceback);
+}
+
+/* used internally, almost identical to dlpack_capsule_deleter() */
+static void array_dlpack_internal_capsule_deleter(PyObject *self)
+{
+    /* an exception may be in-flight, we must save it in case we create another one */
+    PyObject *type, *value, *traceback;
+    PyErr_Fetch(&type, &value, &traceback);
+
+    DLManagedTensor *managed =
+        (DLManagedTensor *)PyCapsule_GetPointer(self, NPY_DLPACK_INTERNAL_CAPSULE_NAME);
+    if (managed == NULL) {
+        PyErr_WriteUnraisable(self);
+        goto done;
+    }
+    /*
+     *  the spec says the deleter can be NULL if there is no way for the caller
+     * to provide a reasonable destructor.
+     */
+    if (managed->deleter) {
+        managed->deleter(managed);
+        /* TODO: is the deleter allowed to set a python exception? */
+        assert(!PyErr_Occurred());
+    }
+
+done:
+    PyErr_Restore(type, value, traceback);
+}
+
+
+// This function cannot return NULL, but it can fail,
+// So call PyErr_Occurred to check if it failed after
+// calling it.
+static DLDevice
+array_get_dl_device(PyArrayObject *self) {
+    DLDevice ret;
+    ret.device_type = kDLCPU;
+    ret.device_id = 0;
+    PyObject *base = PyArray_BASE(self);
+    // The outer if is due to the fact that NumPy arrays are on the CPU
+    // by default (if not created from DLPack).
+    if (PyCapsule_IsValid(base, NPY_DLPACK_INTERNAL_CAPSULE_NAME)) {
+        DLManagedTensor *managed = PyCapsule_GetPointer(
+                base, NPY_DLPACK_INTERNAL_CAPSULE_NAME);
+        if (managed == NULL) {
+            return ret;
+        }
+        return managed->dl_tensor.device;
+    }
+    return ret;
+}
+
+
+PyObject *
+array_dlpack(PyArrayObject *self,
+        PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames)
+{
+    PyObject *stream = Py_None;
+    NPY_PREPARE_ARGPARSER;
+    if (npy_parse_arguments("__dlpack__", args, len_args, kwnames,
+            "$stream", NULL, &stream, NULL, NULL, NULL)) {
+        return NULL;
+    }
+
+    if (stream != Py_None) {
+        PyErr_SetString(PyExc_RuntimeError, "NumPy only supports "
+                "stream=None.");
+        return NULL;
+    }
+
+    if ( !(PyArray_FLAGS(self) & NPY_ARRAY_WRITEABLE)) {
+        PyErr_SetString(PyExc_TypeError, "NumPy currently only supports "
+                "dlpack for writeable arrays");
+        return NULL;
+    }
+
+    npy_intp itemsize = PyArray_ITEMSIZE(self);
+    int ndim = PyArray_NDIM(self);
+    npy_intp *strides = PyArray_STRIDES(self);
+    npy_intp *shape = PyArray_SHAPE(self);
+
+    if (!PyArray_IS_C_CONTIGUOUS(self) && PyArray_SIZE(self) != 1) {
+        for (int i = 0; i < ndim; ++i) {
+            if (strides[i] % itemsize != 0) {
+                PyErr_SetString(PyExc_RuntimeError,
+                        "DLPack only supports strides which are a multiple of "
+                        "itemsize.");
+                return NULL;
+            }
+        }
+    }
+
+    DLDataType managed_dtype;
+    PyArray_Descr *dtype = PyArray_DESCR(self);
+
+    if (PyDataType_ISBYTESWAPPED(dtype)) {
+        PyErr_SetString(PyExc_TypeError, "DLPack only supports native "
+                    "byte swapping.");
+            return NULL;
+    }
+
+    managed_dtype.bits = 8 * itemsize;
+    managed_dtype.lanes = 1;
+
+    if (PyDataType_ISSIGNED(dtype)) {
+        managed_dtype.code = kDLInt;
+    }
+    else if (PyDataType_ISUNSIGNED(dtype)) {
+        managed_dtype.code = kDLUInt;
+    }
+    else if (PyDataType_ISFLOAT(dtype)) {
+        // We can't be sure that the dtype is
+        // IEEE or padded.
+        if (itemsize > 8) {
+            PyErr_SetString(PyExc_TypeError, "DLPack only supports IEEE "
+                    "floating point types without padding.");
+            return NULL;
+        }
+        managed_dtype.code = kDLFloat;
+    }
+    else if (PyDataType_ISCOMPLEX(dtype)) {
+        // We can't be sure that the dtype is
+        // IEEE or padded.
+        if (itemsize > 16) {
+            PyErr_SetString(PyExc_TypeError, "DLPack only supports IEEE "
+                    "complex point types without padding.");
+            return NULL;
+        }
+        managed_dtype.code = kDLComplex;
+    }
+    else {
+        PyErr_SetString(PyExc_TypeError,
+                        "DLPack only supports signed/unsigned integers, float "
+                        "and complex dtypes.");
+        return NULL;
+    }
+
+    DLDevice device = array_get_dl_device(self);
+    if (PyErr_Occurred()) {
+        return NULL;
+    }
+
+    DLManagedTensor *managed = PyMem_Malloc(sizeof(DLManagedTensor));
+    if (managed == NULL) {
+        PyErr_NoMemory();
+        return NULL;
+    }
+
+    /*
+     * Note: the `dlpack.h` header suggests/standardizes that `data` must be
+     * 256-byte aligned.  We ignore this intentionally, because `__dlpack__`
+     * standardizes that `byte_offset` must be 0 (for now) to not break pytorch:
+     * https://github.com/data-apis/array-api/issues/293#issuecomment-964111413
+     *
+     * We further assume that exporting fully unaligned data is OK even without
+     * `byte_offset` since the standard does not reject it.
+     * Presumably, pytorch will support importing `byte_offset != 0` and NumPy
+     * can choose to use it starting about 2023.  At that point, it may be
+     * that NumPy MUST use `byte_offset` to adhere to the standard (as
+     * specified in the header)!
+     */
+    managed->dl_tensor.data = PyArray_DATA(self);
+    managed->dl_tensor.byte_offset = 0;
+    managed->dl_tensor.device = device;
+    managed->dl_tensor.dtype = managed_dtype;
+
+    int64_t *managed_shape_strides = PyMem_Malloc(sizeof(int64_t) * ndim * 2);
+    if (managed_shape_strides == NULL) {
+        PyErr_NoMemory();
+        PyMem_Free(managed);
+        return NULL;
+    }
+
+    int64_t *managed_shape = managed_shape_strides;
+    int64_t *managed_strides = managed_shape_strides + ndim;
+    for (int i = 0; i < ndim; ++i) {
+        managed_shape[i] = shape[i];
+        // Strides in DLPack are items; in NumPy are bytes.
+        managed_strides[i] = strides[i] / itemsize;
+    }
+
+    managed->dl_tensor.ndim = ndim;
+    managed->dl_tensor.shape = managed_shape;
+    managed->dl_tensor.strides = NULL;
+    if (PyArray_SIZE(self) != 1 && !PyArray_IS_C_CONTIGUOUS(self)) {
+        managed->dl_tensor.strides = managed_strides;
+    }
+    managed->dl_tensor.byte_offset = 0;
+    managed->manager_ctx = self;
+    managed->deleter = array_dlpack_deleter;
+
+    PyObject *capsule = PyCapsule_New(managed, NPY_DLPACK_CAPSULE_NAME,
+            dlpack_capsule_deleter);
+    if (capsule == NULL) {
+        PyMem_Free(managed);
+        PyMem_Free(managed_shape_strides);
+        return NULL;
+    }
+
+    // the capsule holds a reference
+    Py_INCREF(self);
+    return capsule;
+}
+
+PyObject *
+array_dlpack_device(PyArrayObject *self, PyObject *NPY_UNUSED(args))
+{
+    DLDevice device = array_get_dl_device(self);
+    if (PyErr_Occurred()) {
+        return NULL;
+    }
+    return Py_BuildValue("ii", device.device_type, device.device_id);
+}
+
+NPY_NO_EXPORT PyObject *
+_from_dlpack(PyObject *NPY_UNUSED(self), PyObject *obj) {
+    PyObject *capsule = PyObject_CallMethod((PyObject *)obj->ob_type,
+            "__dlpack__", "O", obj);
+    if (capsule == NULL) {
+        return NULL;
+    }
+
+    DLManagedTensor *managed =
+        (DLManagedTensor *)PyCapsule_GetPointer(capsule,
+        NPY_DLPACK_CAPSULE_NAME);
+
+    if (managed == NULL) {
+        Py_DECREF(capsule);
+        return NULL;
+    }
+
+    const int ndim = managed->dl_tensor.ndim;
+    if (ndim > NPY_MAXDIMS) {
+        PyErr_SetString(PyExc_RuntimeError,
+                "maxdims of DLPack tensor is higher than the supported "
+                "maxdims.");
+        Py_DECREF(capsule);
+        return NULL;
+    }
+
+    DLDeviceType device_type = managed->dl_tensor.device.device_type;
+    if (device_type != kDLCPU &&
+            device_type != kDLCUDAHost &&
+            device_type != kDLROCMHost &&
+            device_type != kDLCUDAManaged) {
+        PyErr_SetString(PyExc_RuntimeError,
+                "Unsupported device in DLTensor.");
+        Py_DECREF(capsule);
+        return NULL;
+    }
+
+    if (managed->dl_tensor.dtype.lanes != 1) {
+        PyErr_SetString(PyExc_RuntimeError,
+                "Unsupported lanes in DLTensor dtype.");
+        Py_DECREF(capsule);
+        return NULL;
+    }
+
+    int typenum = -1;
+    const uint8_t bits = managed->dl_tensor.dtype.bits;
+    const npy_intp itemsize = bits / 8;
+    switch (managed->dl_tensor.dtype.code) {
+    case kDLInt:
+        switch (bits)
+        {
+            case 8: typenum = NPY_INT8; break;
+            case 16: typenum = NPY_INT16; break;
+            case 32: typenum = NPY_INT32; break;
+            case 64: typenum = NPY_INT64; break;
+        }
+        break;
+    case kDLUInt:
+        switch (bits)
+        {
+            case 8: typenum = NPY_UINT8; break;
+            case 16: typenum = NPY_UINT16; break;
+            case 32: typenum = NPY_UINT32; break;
+            case 64: typenum = NPY_UINT64; break;
+        }
+        break;
+    case kDLFloat:
+        switch (bits)
+        {
+            case 16: typenum = NPY_FLOAT16; break;
+            case 32: typenum = NPY_FLOAT32; break;
+            case 64: typenum = NPY_FLOAT64; break;
+        }
+        break;
+    case kDLComplex:
+        switch (bits)
+        {
+            case 64: typenum = NPY_COMPLEX64; break;
+            case 128: typenum = NPY_COMPLEX128; break;
+        }
+        break;
+    }
+
+    if (typenum == -1) {
+        PyErr_SetString(PyExc_RuntimeError,
+                "Unsupported dtype in DLTensor.");
+        Py_DECREF(capsule);
+        return NULL;
+    }
+
+    npy_intp shape[NPY_MAXDIMS];
+    npy_intp strides[NPY_MAXDIMS];
+
+    for (int i = 0; i < ndim; ++i) {
+        shape[i] = managed->dl_tensor.shape[i];
+        // DLPack has elements as stride units, NumPy has bytes.
+        if (managed->dl_tensor.strides != NULL) {
+            strides[i] = managed->dl_tensor.strides[i] * itemsize;
+        }
+    }
+
+    char *data = (char *)managed->dl_tensor.data +
+            managed->dl_tensor.byte_offset;
+
+    PyArray_Descr *descr = PyArray_DescrFromType(typenum);
+    if (descr == NULL) {
+        Py_DECREF(capsule);
+        return NULL;
+    }
+
+    PyObject *ret = PyArray_NewFromDescr(&PyArray_Type, descr, ndim, shape,
+            managed->dl_tensor.strides != NULL ? strides : NULL, data, 0, NULL);
+    if (ret == NULL) {
+        Py_DECREF(capsule);
+        return NULL;
+    }
+
+    PyObject *new_capsule = PyCapsule_New(managed,
+            NPY_DLPACK_INTERNAL_CAPSULE_NAME,
+            array_dlpack_internal_capsule_deleter);
+    if (new_capsule == NULL) {
+        Py_DECREF(capsule);
+        Py_DECREF(ret);
+        return NULL;
+    }
+
+    if (PyArray_SetBaseObject((PyArrayObject *)ret, new_capsule) < 0) {
+        Py_DECREF(capsule);
+        Py_DECREF(ret);
+        return NULL;
+    }
+
+    if (PyCapsule_SetName(capsule, NPY_DLPACK_USED_CAPSULE_NAME) < 0) {
+        Py_DECREF(capsule);
+        Py_DECREF(ret);
+        return NULL;
+    }
+
+    Py_DECREF(capsule);
+    return ret;
+}
+
+
index 1d8c275700a2c34b398629e60b62c97144a917a2..ce02936152284ee1f7c8555568a86d796b3a7388 100644 (file)
@@ -2206,7 +2206,7 @@ Dragon4_PrintFloat_IEEE_binary16(
         Dragon4_Scratch *scratch, npy_half *value, Dragon4_Options *opt)
 {
     char *buffer = scratch->repr;
-    npy_uint32 bufferSize = sizeof(scratch->repr);
+    const npy_uint32 bufferSize = sizeof(scratch->repr);
     BigInt *bigints = scratch->bigints;
 
     npy_uint16 val = *value;
@@ -2218,15 +2218,6 @@ Dragon4_PrintFloat_IEEE_binary16(
     npy_bool hasUnequalMargins;
     char signbit = '\0';
 
-    if (bufferSize == 0) {
-        return 0;
-    }
-
-    if (bufferSize == 1) {
-        buffer[0] = '\0';
-        return 0;
-    }
-
     /* deconstruct the floating point value */
     floatMantissa = val & bitmask_u32(10);
     floatExponent = (val >> 10) & bitmask_u32(5);
@@ -2303,7 +2294,7 @@ Dragon4_PrintFloat_IEEE_binary32(
         Dragon4_Options *opt)
 {
     char *buffer = scratch->repr;
-    npy_uint32 bufferSize = sizeof(scratch->repr);
+    const npy_uint32 bufferSize = sizeof(scratch->repr);
     BigInt *bigints = scratch->bigints;
 
     union
@@ -2319,15 +2310,6 @@ Dragon4_PrintFloat_IEEE_binary32(
     npy_bool hasUnequalMargins;
     char signbit = '\0';
 
-    if (bufferSize == 0) {
-        return 0;
-    }
-
-    if (bufferSize == 1) {
-        buffer[0] = '\0';
-        return 0;
-    }
-
     /* deconstruct the floating point value */
     floatUnion.floatingPoint = *value;
     floatMantissa = floatUnion.integer & bitmask_u32(23);
@@ -2404,7 +2386,7 @@ Dragon4_PrintFloat_IEEE_binary64(
         Dragon4_Scratch *scratch, npy_float64 *value, Dragon4_Options *opt)
 {
     char *buffer = scratch->repr;
-    npy_uint32 bufferSize = sizeof(scratch->repr);
+    const npy_uint32 bufferSize = sizeof(scratch->repr);
     BigInt *bigints = scratch->bigints;
 
     union
@@ -2421,14 +2403,6 @@ Dragon4_PrintFloat_IEEE_binary64(
     npy_bool hasUnequalMargins;
     char signbit = '\0';
 
-    if (bufferSize == 0) {
-        return 0;
-    }
-
-    if (bufferSize == 1) {
-        buffer[0] = '\0';
-        return 0;
-    }
 
     /* deconstruct the floating point value */
     floatUnion.floatingPoint = *value;
@@ -2527,7 +2501,7 @@ Dragon4_PrintFloat_Intel_extended(
     Dragon4_Scratch *scratch, FloatVal128 value, Dragon4_Options *opt)
 {
     char *buffer = scratch->repr;
-    npy_uint32 bufferSize = sizeof(scratch->repr);
+    const npy_uint32 bufferSize = sizeof(scratch->repr);
     BigInt *bigints = scratch->bigints;
 
     npy_uint32 floatExponent, floatSign;
@@ -2539,15 +2513,6 @@ Dragon4_PrintFloat_Intel_extended(
     npy_bool hasUnequalMargins;
     char signbit = '\0';
 
-    if (bufferSize == 0) {
-        return 0;
-    }
-
-    if (bufferSize == 1) {
-        buffer[0] = '\0';
-        return 0;
-    }
-
     /* deconstruct the floating point value (we ignore the intbit) */
     floatMantissa = value.lo & bitmask_u64(63);
     floatExponent = value.hi & bitmask_u32(15);
@@ -2748,7 +2713,7 @@ Dragon4_PrintFloat_IEEE_binary128(
     Dragon4_Scratch *scratch, FloatVal128 val128, Dragon4_Options *opt)
 {
     char *buffer = scratch->repr;
-    npy_uint32 bufferSize = sizeof(scratch->repr);
+    const npy_uint32 bufferSize = sizeof(scratch->repr);
     BigInt *bigints = scratch->bigints;
 
     npy_uint32 floatExponent, floatSign;
@@ -2759,15 +2724,6 @@ Dragon4_PrintFloat_IEEE_binary128(
     npy_bool hasUnequalMargins;
     char signbit = '\0';
 
-    if (bufferSize == 0) {
-        return 0;
-    }
-
-    if (bufferSize == 1) {
-        buffer[0] = '\0';
-        return 0;
-    }
-
     mantissa_hi = val128.hi & bitmask_u64(48);
     mantissa_lo = val128.lo;
     floatExponent = (val128.hi >> 48) & bitmask_u32(15);
@@ -2917,7 +2873,7 @@ Dragon4_PrintFloat_IBM_double_double(
     Dragon4_Scratch *scratch, npy_float128 *value, Dragon4_Options *opt)
 {
     char *buffer = scratch->repr;
-    npy_uint32 bufferSize = sizeof(scratch->repr);
+    const npy_uint32 bufferSize = sizeof(scratch->repr);
     BigInt *bigints = scratch->bigints;
 
     FloatVal128 val128;
@@ -2934,15 +2890,6 @@ Dragon4_PrintFloat_IBM_double_double(
     npy_bool hasUnequalMargins;
     char signbit = '\0';
 
-    if (bufferSize == 0) {
-        return 0;
-    }
-
-    if (bufferSize == 1) {
-        buffer[0] = '\0';
-        return 0;
-    }
-
     /* The high part always comes before the low part, regardless of the
      * endianness of the system. */
     buf128.floatingPoint = *value;
index 4b76bf9e582c3518f588f28ed31c3293c352293a..e3325bfa2ca81f69791579b2c7e192306b09fdd0 100644 (file)
  * Ryan Juckett's original code was under the Zlib license; he gave numpy
  * permission to include it under the MIT license instead.
  */
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_DRAGON4_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_DRAGON4_H_
 
-#ifndef _NPY_DRAGON4_H_
-#define _NPY_DRAGON4_H_
-
-#include "Python.h"
-#include "structmember.h"
+#include <Python.h>
+#include <structmember.h>
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
@@ -136,5 +135,4 @@ Dragon4_Scientific(PyObject *obj, DigitMode digit_mode, int precision,
                    int min_digits, int sign, TrimMode trim, int pad_left,
                    int exp_digits);
 
-#endif
-
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_DRAGON4_H_ */
index 50db627eafd307da2b91cec60b0baa17ec49aaa7..8fb44c4f6c5bd02579596a27edbc3670fd1a334f 100644 (file)
@@ -7,16 +7,16 @@
  * The University of British Columbia
  *
  * See LICENSE.txt for the license.
-
+ *
  */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
-#include "Python.h"
-#include "structmember.h"
+#include <Python.h>
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
-#include <numpy/arrayobject.h>
+#include "numpy/arrayobject.h"
 
 #include "lowlevel_strided_loops.h"
 #include "npy_pycompat.h"
index e29ac40b890046e1240d3b02ec9571aaef9a496d..c7e0a029f990ed8a35d0de67ed4b5f1c5bf7131f 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_DTYPE_TRANSFER_H
-#define _NPY_DTYPE_TRANSFER_H
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_DTYPE_TRANSFER_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_DTYPE_TRANSFER_H_
 
 #include "array_method.h"
 
@@ -202,4 +202,4 @@ get_wrapped_legacy_cast_function(int aligned,
         int *out_needs_api, int allow_wrapped);
 
 
-#endif  /* _NPY_DTYPE_TRANSFER_H */
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_DTYPE_TRANSFER_H_  */
index 4ee721964a9145c5b51d9707e99dd52e06235134..cd489d5e7c9d963731758cb18236c460d53037f8 100644 (file)
@@ -1,12 +1,11 @@
 /* Array Descr Object */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
-#include "assert.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include <numpy/ndarraytypes.h>
 #include <numpy/arrayscalars.h>
 #include "npy_pycompat.h"
@@ -19,6 +18,7 @@
 #include "convert_datatype.h"
 #include "usertypes.h"
 
+#include <assert.h>
 
 static void
 dtypemeta_dealloc(PyArray_DTypeMeta *self) {
@@ -27,7 +27,8 @@ dtypemeta_dealloc(PyArray_DTypeMeta *self) {
 
     Py_XDECREF(self->scalar_type);
     Py_XDECREF(self->singleton);
-    Py_XDECREF(self->castingimpls);
+    Py_XDECREF(NPY_DT_SLOTS(self)->castingimpls);
+    PyMem_Free(self->dt_slots);
     PyType_Type.tp_dealloc((PyObject *) self);
 }
 
@@ -89,7 +90,7 @@ dtypemeta_traverse(PyArray_DTypeMeta *type, visitproc visit, void *arg)
      * defined types). It should be revised at that time.
      */
     assert(0);
-    assert(!type->legacy && (PyTypeObject *)type != &PyArrayDescr_Type);
+    assert(!NPY_DT_is_legacy(type) && (PyTypeObject *)type != &PyArrayDescr_Type);
     Py_VISIT(type->singleton);
     Py_VISIT(type->scalar_type);
     return PyType_Type.tp_traverse((PyObject *)type, visit, arg);
@@ -100,8 +101,8 @@ static PyObject *
 legacy_dtype_default_new(PyArray_DTypeMeta *self,
         PyObject *args, PyObject *kwargs)
 {
-    /* TODO: This should allow endianess and possibly metadata */
-    if (self->parametric) {
+    /* TODO: This should allow endianness and possibly metadata */
+    if (NPY_DT_is_parametric(self)) {
         /* reject parametric ones since we would need to get unit, etc. info */
         PyErr_Format(PyExc_TypeError,
                 "Preliminary-API: Flexible/Parametric legacy DType '%S' can "
@@ -126,7 +127,7 @@ nonparametric_discover_descr_from_pyobject(
         PyArray_DTypeMeta *cls, PyObject *obj)
 {
     /* If the object is of the correct scalar type return our singleton */
-    assert(!cls->parametric);
+    assert(!NPY_DT_is_parametric(cls));
     Py_INCREF(cls->singleton);
     return cls->singleton;
 }
@@ -289,7 +290,7 @@ void_common_instance(PyArray_Descr *descr1, PyArray_Descr *descr2)
     return descr1;
 }
 
-static int
+NPY_NO_EXPORT int
 python_builtins_are_known_scalar_types(
         PyArray_DTypeMeta *NPY_UNUSED(cls), PyTypeObject *pytype)
 {
@@ -382,7 +383,7 @@ static PyArray_DTypeMeta *
 default_builtin_common_dtype(PyArray_DTypeMeta *cls, PyArray_DTypeMeta *other)
 {
     assert(cls->type_num < NPY_NTYPES);
-    if (!other->legacy || other->type_num > cls->type_num) {
+    if (!NPY_DT_is_legacy(other) || other->type_num > cls->type_num) {
         /*
          * Let the more generic (larger type number) DType handle this
          * (note that half is after all others, which works out here.)
@@ -409,7 +410,7 @@ static PyArray_DTypeMeta *
 string_unicode_common_dtype(PyArray_DTypeMeta *cls, PyArray_DTypeMeta *other)
 {
     assert(cls->type_num < NPY_NTYPES && cls != other);
-    if (!other->legacy || (!PyTypeNum_ISNUMBER(other->type_num) &&
+    if (!NPY_DT_is_legacy(other) || (!PyTypeNum_ISNUMBER(other->type_num) &&
             /* Not numeric so defer unless cls is unicode and other is string */
             !(cls->type_num == NPY_UNICODE && other->type_num == NPY_STRING))) {
         Py_INCREF(Py_NotImplemented);
@@ -536,7 +537,7 @@ dtypemeta_wrap_legacy_descriptor(PyArray_Descr *descr)
     }
     Py_ssize_t name_length = strlen(scalar_name) + 14;
 
-    char *tp_name = malloc(name_length);
+    char *tp_name = PyMem_Malloc(name_length);
     if (tp_name == NULL) {
         PyErr_NoMemory();
         return -1;
@@ -544,11 +545,20 @@ dtypemeta_wrap_legacy_descriptor(PyArray_Descr *descr)
 
     snprintf(tp_name, name_length, "numpy.dtype[%s]", scalar_name);
 
-    PyArray_DTypeMeta *dtype_class = malloc(sizeof(PyArray_DTypeMeta));
+    NPY_DType_Slots *dt_slots = PyMem_Malloc(sizeof(NPY_DType_Slots));
+    if (dt_slots == NULL) {
+        PyMem_Free(tp_name);
+        return -1;
+    }
+    memset(dt_slots, '\0', sizeof(NPY_DType_Slots));
+
+    PyArray_DTypeMeta *dtype_class = PyMem_Malloc(sizeof(PyArray_DTypeMeta));
     if (dtype_class == NULL) {
-        PyDataMem_FREE(tp_name);
+        PyMem_Free(tp_name);
+        PyMem_Free(dt_slots);
         return -1;
     }
+
     /*
      * Initialize the struct fields identically to static code by copying
      * a prototype instances for everything except our own fields which
@@ -567,21 +577,21 @@ dtypemeta_wrap_legacy_descriptor(PyArray_Descr *descr)
             .tp_base = &PyArrayDescr_Type,
             .tp_new = (newfunc)legacy_dtype_default_new,
         },},
-        .legacy = 1,
-        .abstract = 0, /* this is a concrete DType */
+        .flags = NPY_DT_LEGACY,
         /* Further fields are not common between DTypes */
     };
     memcpy(dtype_class, &prototype, sizeof(PyArray_DTypeMeta));
     /* Fix name of the Type*/
     ((PyTypeObject *)dtype_class)->tp_name = tp_name;
+    dtype_class->dt_slots = dt_slots;
 
     /* Let python finish the initialization (probably unnecessary) */
     if (PyType_Ready((PyTypeObject *)dtype_class) < 0) {
         Py_DECREF(dtype_class);
         return -1;
     }
-    dtype_class->castingimpls = PyDict_New();
-    if (dtype_class->castingimpls == NULL) {
+    dt_slots->castingimpls = PyDict_New();
+    if (dt_slots->castingimpls == NULL) {
         Py_DECREF(dtype_class);
         return -1;
     }
@@ -594,56 +604,54 @@ dtypemeta_wrap_legacy_descriptor(PyArray_Descr *descr)
     Py_INCREF(descr->typeobj);
     dtype_class->scalar_type = descr->typeobj;
     dtype_class->type_num = descr->type_num;
-    dtype_class->type = descr->type;
-    dtype_class->f = descr->f;
-    dtype_class->kind = descr->kind;
+    dt_slots->f = *(descr->f);
 
     /* Set default functions (correct for most dtypes, override below) */
-    dtype_class->default_descr = nonparametric_default_descr;
-    dtype_class->discover_descr_from_pyobject = (
+    dt_slots->default_descr = nonparametric_default_descr;
+    dt_slots->discover_descr_from_pyobject = (
             nonparametric_discover_descr_from_pyobject);
-    dtype_class->is_known_scalar_type = python_builtins_are_known_scalar_types;
-    dtype_class->common_dtype = default_builtin_common_dtype;
-    dtype_class->common_instance = NULL;
+    dt_slots->is_known_scalar_type = python_builtins_are_known_scalar_types;
+    dt_slots->common_dtype = default_builtin_common_dtype;
+    dt_slots->common_instance = NULL;
 
     if (PyTypeNum_ISSIGNED(dtype_class->type_num)) {
         /* Convert our scalars (raise on too large unsigned and NaN, etc.) */
-        dtype_class->is_known_scalar_type = signed_integers_is_known_scalar_types;
+        dt_slots->is_known_scalar_type = signed_integers_is_known_scalar_types;
     }
 
     if (PyTypeNum_ISUSERDEF(descr->type_num)) {
-        dtype_class->common_dtype = legacy_userdtype_common_dtype_function;
+        dt_slots->common_dtype = legacy_userdtype_common_dtype_function;
     }
     else if (descr->type_num == NPY_OBJECT) {
-        dtype_class->common_dtype = object_common_dtype;
+        dt_slots->common_dtype = object_common_dtype;
     }
     else if (PyTypeNum_ISDATETIME(descr->type_num)) {
         /* Datetimes are flexible, but were not considered previously */
-        dtype_class->parametric = NPY_TRUE;
-        dtype_class->default_descr = datetime_and_timedelta_default_descr;
-        dtype_class->discover_descr_from_pyobject = (
+        dtype_class->flags |= NPY_DT_PARAMETRIC;
+        dt_slots->default_descr = datetime_and_timedelta_default_descr;
+        dt_slots->discover_descr_from_pyobject = (
                 discover_datetime_and_timedelta_from_pyobject);
-        dtype_class->common_dtype = datetime_common_dtype;
-        dtype_class->common_instance = datetime_type_promotion;
+        dt_slots->common_dtype = datetime_common_dtype;
+        dt_slots->common_instance = datetime_type_promotion;
         if (descr->type_num == NPY_DATETIME) {
-            dtype_class->is_known_scalar_type = datetime_known_scalar_types;
+            dt_slots->is_known_scalar_type = datetime_known_scalar_types;
         }
     }
     else if (PyTypeNum_ISFLEXIBLE(descr->type_num)) {
-        dtype_class->parametric = NPY_TRUE;
+        dtype_class->flags |= NPY_DT_PARAMETRIC;
         if (descr->type_num == NPY_VOID) {
-            dtype_class->default_descr = void_default_descr;
-            dtype_class->discover_descr_from_pyobject = (
+            dt_slots->default_descr = void_default_descr;
+            dt_slots->discover_descr_from_pyobject = (
                     void_discover_descr_from_pyobject);
-            dtype_class->common_instance = void_common_instance;
+            dt_slots->common_instance = void_common_instance;
         }
         else {
-            dtype_class->default_descr = string_and_unicode_default_descr;
-            dtype_class->is_known_scalar_type = string_known_scalar_types;
-            dtype_class->discover_descr_from_pyobject = (
+            dt_slots->default_descr = string_and_unicode_default_descr;
+            dt_slots->is_known_scalar_type = string_known_scalar_types;
+            dt_slots->discover_descr_from_pyobject = (
                     string_discover_descr_from_pyobject);
-            dtype_class->common_dtype = string_unicode_common_dtype;
-            dtype_class->common_instance = string_unicode_common_instance;
+            dt_slots->common_dtype = string_unicode_common_dtype;
+            dt_slots->common_instance = string_unicode_common_instance;
         }
     }
 
@@ -660,17 +668,28 @@ dtypemeta_wrap_legacy_descriptor(PyArray_Descr *descr)
 }
 
 
+static PyObject *
+dtypemeta_get_abstract(PyArray_DTypeMeta *self) {
+    return PyBool_FromLong(NPY_DT_is_abstract(self));
+}
+
+static PyObject *
+dtypemeta_get_parametric(PyArray_DTypeMeta *self) {
+    return PyBool_FromLong(NPY_DT_is_parametric(self));
+}
+
 /*
- * Simple exposed information, defined for each DType (class). This is
- * preliminary (the flags should also return bools).
+ * Simple exposed information, defined for each DType (class).
  */
+static PyGetSetDef dtypemeta_getset[] = {
+        {"_abstract", (getter)dtypemeta_get_abstract, NULL, NULL, NULL},
+        {"_parametric", (getter)dtypemeta_get_parametric, NULL, NULL, NULL},
+        {NULL, NULL, NULL, NULL, NULL}
+};
+
 static PyMemberDef dtypemeta_members[] = {
-    {"_abstract",
-        T_BYTE, offsetof(PyArray_DTypeMeta, abstract), READONLY, NULL},
     {"type",
         T_OBJECT, offsetof(PyArray_DTypeMeta, scalar_type), READONLY, NULL},
-    {"_parametric",
-        T_BYTE, offsetof(PyArray_DTypeMeta, parametric), READONLY, NULL},
     {NULL, 0, 0, 0, NULL},
 };
 
@@ -683,6 +702,7 @@ NPY_NO_EXPORT PyTypeObject PyArrayDTypeMeta_Type = {
     /* Types are garbage collected (see dtypemeta_is_gc documentation) */
     .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
     .tp_doc = "Preliminary NumPy API: The Type of NumPy DTypes (metaclass)",
+    .tp_getset = dtypemeta_getset,
     .tp_members = dtypemeta_members,
     .tp_base = NULL,  /* set to PyType_Type at import time */
     .tp_alloc = dtypemeta_alloc,
index 83cf7c07e94407a18d52ebb0ffcfab7e6a795178..2a61fe39de37fb981cb905b01d141aa1e5f8fac5 100644 (file)
@@ -1,7 +1,103 @@
-#ifndef _NPY_DTYPEMETA_H
-#define _NPY_DTYPEMETA_H
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_DTYPEMETA_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_DTYPEMETA_H_
+
+
+/* DType flags, currently private, since we may just expose functions */
+#define NPY_DT_LEGACY 1 << 0
+#define NPY_DT_ABSTRACT 1 << 1
+#define NPY_DT_PARAMETRIC 1 << 2
+
+
+typedef PyArray_Descr *(discover_descr_from_pyobject_function)(
+        PyArray_DTypeMeta *cls, PyObject *obj);
+
+/*
+ * Before making this public, we should decide whether it should pass
+ * the type, or allow looking at the object. A possible use-case:
+ * `np.array(np.array([0]), dtype=np.ndarray)`
+ * Could consider arrays that are not `dtype=ndarray` "scalars".
+ */
+typedef int (is_known_scalar_type_function)(
+        PyArray_DTypeMeta *cls, PyTypeObject *obj);
+
+typedef PyArray_Descr *(default_descr_function)(PyArray_DTypeMeta *cls);
+typedef PyArray_DTypeMeta *(common_dtype_function)(
+        PyArray_DTypeMeta *dtype1, PyArray_DTypeMeta *dtype2);
+typedef PyArray_Descr *(common_instance_function)(
+        PyArray_Descr *dtype1, PyArray_Descr *dtype2);
+
+/*
+ * TODO: These two functions are currently only used for experimental DType
+ *       API support.  Their relation should be "reversed": NumPy should
+ *       always use them internally.
+ *       There are open points about "casting safety" though, e.g. setting
+ *       elements is currently always unsafe.
+ */
+typedef int(setitemfunction)(PyArray_Descr *, PyObject *, char *);
+typedef PyObject *(getitemfunction)(PyArray_Descr *, char *);
+
+
+typedef struct {
+    /* DType methods, these could be moved into its own struct */
+    discover_descr_from_pyobject_function *discover_descr_from_pyobject;
+    is_known_scalar_type_function *is_known_scalar_type;
+    default_descr_function *default_descr;
+    common_dtype_function *common_dtype;
+    common_instance_function *common_instance;
+    /*
+     * Currently only used for experimental user DTypes.
+     * Typing as `void *` until NumPy itself uses these (directly).
+     */
+    setitemfunction *setitem;
+    getitemfunction *getitem;
+    /*
+     * The casting implementation (ArrayMethod) to convert between two
+     * instances of this DType, stored explicitly for fast access:
+     */
+    PyObject *within_dtype_castingimpl;
+    /*
+     * Dictionary of ArrayMethods representing most possible casts
+     * (structured and object are exceptions).
+     * This should potentially become a weak mapping in the future.
+     */
+    PyObject *castingimpls;
+
+    /*
+     * Storage for `descr->f`, since we may need to allow some customizatoin
+     * here at least in a transition period and we need to set it on every
+     * dtype instance for backward compatibility.  (Keep this at end)
+     */
+    PyArray_ArrFuncs f;
+} NPY_DType_Slots;
+
 
 #define NPY_DTYPE(descr) ((PyArray_DTypeMeta *)Py_TYPE(descr))
+#define NPY_DT_SLOTS(dtype) ((NPY_DType_Slots *)(dtype)->dt_slots)
+
+#define NPY_DT_is_legacy(dtype) (((dtype)->flags & NPY_DT_LEGACY) != 0)
+#define NPY_DT_is_abstract(dtype) (((dtype)->flags & NPY_DT_ABSTRACT) != 0)
+#define NPY_DT_is_parametric(dtype) (((dtype)->flags & NPY_DT_PARAMETRIC) != 0)
+
+/*
+ * Macros for convenient classmethod calls, since these require
+ * the DType both for the slot lookup and as first arguments.
+ *
+ * (Macros may include NULL checks where appropriate)
+ */
+#define NPY_DT_CALL_discover_descr_from_pyobject(dtype, obj)  \
+    NPY_DT_SLOTS(dtype)->discover_descr_from_pyobject(dtype, obj)
+#define NPY_DT_CALL_is_known_scalar_type(dtype, obj)  \
+    (NPY_DT_SLOTS(dtype)->is_known_scalar_type != NULL  \
+        && NPY_DT_SLOTS(dtype)->is_known_scalar_type(dtype, obj))
+#define NPY_DT_CALL_default_descr(dtype)  \
+    NPY_DT_SLOTS(dtype)->default_descr(dtype)
+#define NPY_DT_CALL_common_dtype(dtype, other)  \
+    NPY_DT_SLOTS(dtype)->common_dtype(dtype, other)
+#define NPY_DT_CALL_getitem(descr, data_ptr)  \
+    NPY_DT_SLOTS(NPY_DTYPE(descr))->getitem(descr, data_ptr)
+#define NPY_DT_CALL_setitem(descr, value, data_ptr)  \
+    NPY_DT_SLOTS(NPY_DTYPE(descr))->setitem(descr, value, data_ptr)
+
 /*
  * This function will hopefully be phased out or replaced, but was convenient
  * for incremental implementation of new DTypes based on DTypeMeta.
@@ -19,7 +115,11 @@ PyArray_DTypeFromTypeNum(int typenum)
 }
 
 
+NPY_NO_EXPORT int
+python_builtins_are_known_scalar_types(
+        PyArray_DTypeMeta *cls, PyTypeObject *pytype);
+
 NPY_NO_EXPORT int
 dtypemeta_wrap_legacy_descriptor(PyArray_Descr *dtypem);
 
-#endif  /*_NPY_DTYPEMETA_H */
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_DTYPEMETA_H_ */
index 85806fab3612fb5e8fb8435efd40bdebf88acd9b..cd1a5898269ad351105a40cdfcc181ad1866783a 100644 (file)
@@ -9,8 +9,8 @@
  */
 
 #define PY_SSIZE_T_CLEAN
-#include "Python.h"
-#include "structmember.h"
+#include <Python.h>
+#include <structmember.h>
 
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
index 9aa81fcbd7764507a0fe5383afc32217e20c9f9d..964964743141e8127ef215c907664398ba49c187 100644 (file)
@@ -6,8 +6,8 @@
  *
  * See LICENSE.txt for the license.
  */
-#ifndef _NPY_MULTIARRAY_EINSUM_DEBUG_H
-#define _NPY_MULTIARRAY_EINSUM_DEBUG_H
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_EINSUM_DEBUG_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_EINSUM_DEBUG_H_
 
 /********** PRINTF DEBUG TRACING **************/
 #define NPY_EINSUM_DBG_TRACING 0
@@ -25,4 +25,4 @@
 #define NPY_EINSUM_DBG_PRINT3(s, p1, p2, p3)
 #endif
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_EINSUM_DEBUG_H_ */
index 4a3a460e40ff1f2529430749bffbcc8d2a5c1ab5..3114a58960efa5613e367b3a6abccbf80e9ca0d6 100644 (file)
@@ -80,7 +80,7 @@ static NPY_GCC_OPT_3 @temptype@ @name@_sum_of_arr(@type@ *data, npy_intp count)
     /* Use aligned instructions if possible */
     const int is_aligned = EINSUM_IS_ALIGNED(data);
     const int vstep = npyv_nlanes_@sfx@;
-    npyv_@sfx@ vaccum = npyv_zero_@sfx@();
+    npyv_@sfx@ v_accum = npyv_zero_@sfx@();
     const npy_intp vstepx4 = vstep * 4;
 
     /**begin repeat1
@@ -98,15 +98,15 @@ static NPY_GCC_OPT_3 @temptype@ @name@_sum_of_arr(@type@ *data, npy_intp count)
             npyv_@sfx@ a01   = npyv_add_@sfx@(a0, a1);
             npyv_@sfx@ a23   = npyv_add_@sfx@(a2, a3);
             npyv_@sfx@ a0123 = npyv_add_@sfx@(a01, a23);
-                      vaccum = npyv_add_@sfx@(a0123, vaccum);
+                     v_accum = npyv_add_@sfx@(a0123, v_accum);
         }
     }
     /**end repeat1**/
     for (; count > 0; count -= vstep, data += vstep) {
         npyv_@sfx@ a = npyv_load_tillz_@sfx@(data, count);
-        vaccum = npyv_add_@sfx@(a, vaccum);
+        v_accum = npyv_add_@sfx@(a, v_accum);
     }
-    accum = npyv_sum_@sfx@(vaccum);
+    accum = npyv_sum_@sfx@(v_accum);
     npyv_cleanup();
 #else
 #ifndef NPY_DISABLE_OPTIMIZATION
@@ -485,7 +485,7 @@ static NPY_GCC_OPT_3 void
     /* Use aligned instructions if possible */
     const int is_aligned = EINSUM_IS_ALIGNED(data0) && EINSUM_IS_ALIGNED(data1);
     const int vstep = npyv_nlanes_@sfx@;
-    npyv_@sfx@ vaccum = npyv_zero_@sfx@();
+    npyv_@sfx@ v_accum = npyv_zero_@sfx@();
 
     /**begin repeat2
      * #cond = if(is_aligned), else#
@@ -501,19 +501,19 @@ static NPY_GCC_OPT_3 void
             npyv_@sfx@ a@i@ = npyv_@ld@_@sfx@(data0 + vstep * @i@);
             npyv_@sfx@ b@i@ = npyv_@ld@_@sfx@(data1 + vstep * @i@);
             /**end repeat3**/
-            npyv_@sfx@ ab3 = npyv_muladd_@sfx@(a3, b3, vaccum);
+            npyv_@sfx@ ab3 = npyv_muladd_@sfx@(a3, b3, v_accum);
             npyv_@sfx@ ab2 = npyv_muladd_@sfx@(a2, b2, ab3);
             npyv_@sfx@ ab1 = npyv_muladd_@sfx@(a1, b1, ab2);
-                    vaccum = npyv_muladd_@sfx@(a0, b0, ab1);
+                   v_accum = npyv_muladd_@sfx@(a0, b0, ab1);
         }
     }
     /**end repeat2**/
     for (; count > 0; count -= vstep, data0 += vstep, data1 += vstep) {
         npyv_@sfx@ a = npyv_load_tillz_@sfx@(data0, count);
         npyv_@sfx@ b = npyv_load_tillz_@sfx@(data1, count);
-        vaccum = npyv_muladd_@sfx@(a, b, vaccum);
+        v_accum = npyv_muladd_@sfx@(a, b, v_accum);
     }
-    accum = npyv_sum_@sfx@(vaccum);
+    accum = npyv_sum_@sfx@(v_accum);
     npyv_cleanup();
 #else
 #ifndef NPY_DISABLE_OPTIMIZATION
index c6cf18ec60944f35f95b1f4803babf01e02a1be9..29ddaea14e2bf17da02d32dceaa636b393a281d5 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_MULTIARRAY_EINSUM_SUMPROD_H
-#define _NPY_MULTIARRAY_EINSUM_SUMPROD_H
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_EINSUM_SUMPROD_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_EINSUM_SUMPROD_H_
 
 #include <numpy/npy_common.h>
 
@@ -9,4 +9,4 @@ NPY_VISIBILITY_HIDDEN sum_of_products_fn
 get_sum_of_products_function(int nop, int type_num,
                              npy_intp itemsize, npy_intp const *fixed_strides);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_EINSUM_SUMPROD_H_ */
diff --git a/numpy/core/src/multiarray/experimental_public_dtype_api.c b/numpy/core/src/multiarray/experimental_public_dtype_api.c
new file mode 100644 (file)
index 0000000..4b9c719
--- /dev/null
@@ -0,0 +1,400 @@
+#include <Python.h>
+
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _UMATHMODULE
+#define _MULTIARRAYMODULE
+#include <numpy/npy_common.h>
+#include "numpy/arrayobject.h"
+#include "numpy/ufuncobject.h"
+#include "common.h"
+
+#include "experimental_public_dtype_api.h"
+#include "array_method.h"
+#include "dtypemeta.h"
+#include "array_coercion.h"
+#include "convert_datatype.h"
+#include "common_dtype.h"
+
+
+#define EXPERIMENTAL_DTYPE_API_VERSION 2
+
+
+typedef struct{
+    PyTypeObject *typeobj;    /* type of python scalar or NULL */
+    int flags;                /* flags, including parametric and abstract */
+    /* NULL terminated cast definitions. Use NULL for the newly created DType */
+    PyArrayMethod_Spec **casts;
+    PyType_Slot *slots;
+} PyArrayDTypeMeta_Spec;
+
+
+
+static PyArray_DTypeMeta *
+dtype_does_not_promote(
+        PyArray_DTypeMeta *NPY_UNUSED(self), PyArray_DTypeMeta *NPY_UNUSED(other))
+{
+    /* `other` is guaranteed not to be `self`, so we don't have to do much... */
+    Py_INCREF(Py_NotImplemented);
+    return (PyArray_DTypeMeta *)Py_NotImplemented;
+}
+
+
+static PyArray_Descr *
+discover_as_default(PyArray_DTypeMeta *cls, PyObject *NPY_UNUSED(obj))
+{
+    return NPY_DT_CALL_default_descr(cls);
+}
+
+
+static PyArray_Descr *
+use_new_as_default(PyArray_DTypeMeta *self)
+{
+    PyObject *res = PyObject_CallObject((PyObject *)self, NULL);
+    if (res == NULL) {
+        return NULL;
+    }
+    /*
+     * Lets not trust that the DType is implemented correctly
+     * TODO: Should probably do an exact type-check (at least unless this is
+     *       an abstract DType).
+     */
+    if (!PyArray_DescrCheck(res)) {
+        PyErr_Format(PyExc_RuntimeError,
+                "Instantiating %S did not return a dtype instance, this is "
+                "invalid (especially without a custom `default_descr()`).",
+                self);
+        Py_DECREF(res);
+        return NULL;
+    }
+    PyArray_Descr *descr = (PyArray_Descr *)res;
+    /*
+     * Should probably do some more sanity checks here on the descriptor
+     * to ensure the user is not being naughty. But in the end, we have
+     * only limited control anyway.
+     */
+    return descr;
+}
+
+
+static int
+legacy_setitem_using_DType(PyObject *obj, void *data, void *arr)
+{
+    if (arr == NULL) {
+        PyErr_SetString(PyExc_RuntimeError,
+                "Using legacy SETITEM with NULL array object is only "
+                "supported for basic NumPy DTypes.");
+        return -1;
+    }
+    setitemfunction *setitem;
+    setitem = NPY_DT_SLOTS(NPY_DTYPE(PyArray_DESCR(arr)))->setitem;
+    return setitem(PyArray_DESCR(arr), obj, data);
+}
+
+
+static PyObject *
+legacy_getitem_using_DType(void *data, void *arr)
+{
+    if (arr == NULL) {
+        PyErr_SetString(PyExc_RuntimeError,
+                "Using legacy SETITEM with NULL array object is only "
+                "supported for basic NumPy DTypes.");
+        return NULL;
+    }
+    getitemfunction *getitem;
+    getitem = NPY_DT_SLOTS(NPY_DTYPE(PyArray_DESCR(arr)))->getitem;
+    return getitem(PyArray_DESCR(arr), data);
+}
+
+
+/*
+ * The descr->f structure used user-DTypes.  Some functions may be filled
+ * from the user in the future and more could get defaults for compatibility.
+ */
+PyArray_ArrFuncs default_funcs = {
+        .setitem = &legacy_setitem_using_DType,
+        .getitem = &legacy_getitem_using_DType
+};
+
+
+/* other slots are in order, so keep only last around: */
+#define NUM_DTYPE_SLOTS 7
+
+
+int
+PyArrayInitDTypeMeta_FromSpec(
+        PyArray_DTypeMeta *DType, PyArrayDTypeMeta_Spec *spec)
+{
+    if (!PyObject_TypeCheck(DType, &PyArrayDTypeMeta_Type)) {
+        PyErr_SetString(PyExc_RuntimeError,
+                "Passed in DType must be a valid (initialized) DTypeMeta "
+                "instance!");
+        return -1;
+    }
+
+    if (((PyTypeObject *)DType)->tp_repr == PyArrayDescr_Type.tp_repr
+            || ((PyTypeObject *)DType)->tp_str == PyArrayDescr_Type.tp_str) {
+        PyErr_SetString(PyExc_TypeError,
+                "A custom DType must implement `__repr__` and `__str__` since "
+                "the default inherited version (currently) fails.");
+        return -1;
+    }
+
+    if (spec->typeobj == NULL || !PyType_Check(spec->typeobj)) {
+        PyErr_SetString(PyExc_TypeError,
+                "Not giving a type object is currently not supported, but "
+                "is expected to be supported eventually.  This would mean "
+                "that e.g. indexing a NumPy array will return a 0-D array "
+                "and not a scalar.");
+        return -1;
+    }
+
+    if (DType->dt_slots != NULL) {
+        PyErr_Format(PyExc_RuntimeError,
+                "DType %R appears already registered?", DType);
+        return -1;
+    }
+
+    /* Check and handle flags: */
+    if (spec->flags & ~(NPY_DT_PARAMETRIC|NPY_DT_ABSTRACT)) {
+        PyErr_SetString(PyExc_RuntimeError,
+                "invalid DType flags specified, only parametric and abstract "
+                "are valid flags for user DTypes.");
+        return -1;
+    }
+
+    DType->flags = spec->flags;
+    DType->dt_slots = PyMem_Calloc(1, sizeof(NPY_DType_Slots));
+    if (DType->dt_slots == NULL) {
+        return -1;
+    }
+
+    /* Set default values (where applicable) */
+    NPY_DT_SLOTS(DType)->discover_descr_from_pyobject = &discover_as_default;
+    NPY_DT_SLOTS(DType)->is_known_scalar_type = (
+            &python_builtins_are_known_scalar_types);
+    NPY_DT_SLOTS(DType)->default_descr = use_new_as_default;
+    NPY_DT_SLOTS(DType)->common_dtype = dtype_does_not_promote;
+    /* May need a default for non-parametric? */
+    NPY_DT_SLOTS(DType)->common_instance = NULL;
+    NPY_DT_SLOTS(DType)->setitem = NULL;
+    NPY_DT_SLOTS(DType)->getitem = NULL;
+
+    PyType_Slot *spec_slot = spec->slots;
+    while (1) {
+        int slot = spec_slot->slot;
+        void *pfunc = spec_slot->pfunc;
+        spec_slot++;
+        if (slot == 0) {
+            break;
+        }
+        if (slot > NUM_DTYPE_SLOTS || slot < 0) {
+            PyErr_Format(PyExc_RuntimeError,
+                    "Invalid slot with value %d passed in.", slot);
+            return -1;
+        }
+        /*
+         * It is up to the user to get this right, and slots are sorted
+         * exactly like they are stored right now:
+         */
+        void **current = (void **)(&(
+                NPY_DT_SLOTS(DType)->discover_descr_from_pyobject));
+        current += slot - 1;
+        *current = pfunc;
+    }
+    if (NPY_DT_SLOTS(DType)->setitem == NULL
+            || NPY_DT_SLOTS(DType)->getitem == NULL) {
+        PyErr_SetString(PyExc_RuntimeError,
+                "A DType must provide a getitem/setitem (there may be an "
+                "exception here in the future if no scalar type is provided)");
+        return -1;
+    }
+
+    /*
+     * Now that the spec is read we can check that all required functions were
+     * defined by the user.
+     */
+    if (spec->flags & NPY_DT_PARAMETRIC) {
+        if (NPY_DT_SLOTS(DType)->common_instance == NULL ||
+                NPY_DT_SLOTS(DType)->discover_descr_from_pyobject
+                        == &discover_as_default) {
+            PyErr_SetString(PyExc_RuntimeError,
+                    "Parametric DType must define a common-instance and "
+                    "descriptor discovery function!");
+            return -1;
+        }
+    }
+    NPY_DT_SLOTS(DType)->f = default_funcs;
+    /* invalid type num. Ideally, we get away with it! */
+    DType->type_num = -1;
+
+    /*
+     * Handle the scalar type mapping.
+     */
+    Py_INCREF(spec->typeobj);
+    DType->scalar_type = spec->typeobj;
+    if (PyType_GetFlags(spec->typeobj) & Py_TPFLAGS_HEAPTYPE) {
+        if (PyObject_SetAttrString((PyObject *)DType->scalar_type,
+                "__associated_array_dtype__", (PyObject *)DType) < 0) {
+            Py_DECREF(DType);
+            return -1;
+        }
+    }
+    if (_PyArray_MapPyTypeToDType(DType, DType->scalar_type, 0) < 0) {
+        Py_DECREF(DType);
+        return -1;
+    }
+
+    /* Ensure cast dict is defined (not sure we have to do it here) */
+    NPY_DT_SLOTS(DType)->castingimpls = PyDict_New();
+    if (NPY_DT_SLOTS(DType)->castingimpls == NULL) {
+        return -1;
+    }
+    /*
+     * And now, register all the casts that are currently defined!
+     */
+    PyArrayMethod_Spec **next_meth_spec = spec->casts;
+    while (1) {
+        PyArrayMethod_Spec *meth_spec = *next_meth_spec;
+        next_meth_spec++;
+        if (meth_spec == NULL) {
+            break;
+        }
+        /*
+         * The user doesn't know the name of DType yet, so we have to fill it
+         * in for them!
+         */
+        for (int i=0; i < meth_spec->nin + meth_spec->nout; i++) {
+            if (meth_spec->dtypes[i] == NULL) {
+                meth_spec->dtypes[i] = DType;
+            }
+        }
+        /* Register the cast! */
+        int res = PyArray_AddCastingImplementation_FromSpec(meth_spec, 0);
+
+        /* Also clean up again, so nobody can get bad ideas... */
+        for (int i=0; i < meth_spec->nin + meth_spec->nout; i++) {
+            if (meth_spec->dtypes[i] == DType) {
+                meth_spec->dtypes[i] = NULL;
+            }
+        }
+
+        if (res < 0) {
+            return -1;
+        }
+    }
+
+    if (NPY_DT_SLOTS(DType)->within_dtype_castingimpl == NULL) {
+        /*
+         * We expect this for now. We should have a default for DType that
+         * only supports simple copy (and possibly byte-order assuming that
+         * they swap the full itemsize).
+         */
+        PyErr_SetString(PyExc_RuntimeError,
+                "DType must provide a function to cast (or just copy) between "
+                "its own instances!");
+        return -1;
+    }
+
+    /* And finally, we have to register all the casts! */
+    return 0;
+}
+
+
+/* Function is defined in umath/dispatching.c (same/one compilation unit) */
+NPY_NO_EXPORT int
+PyUFunc_AddLoop(PyUFuncObject *ufunc, PyObject *info, int ignore_duplicate);
+
+static int
+PyUFunc_AddLoopFromSpec(PyObject *ufunc, PyArrayMethod_Spec *spec)
+{
+    if (!PyObject_TypeCheck(ufunc, &PyUFunc_Type)) {
+        PyErr_SetString(PyExc_TypeError,
+                "ufunc object passed is not a ufunc!");
+        return -1;
+    }
+    PyBoundArrayMethodObject *bmeth =
+            (PyBoundArrayMethodObject *)PyArrayMethod_FromSpec(spec);
+    if (bmeth == NULL) {
+        return -1;
+    }
+    int nargs = bmeth->method->nin + bmeth->method->nout;
+    PyObject *dtypes = PyArray_TupleFromItems(
+            nargs, (PyObject **)bmeth->dtypes, 1);
+    if (dtypes == NULL) {
+        return -1;
+    }
+    PyObject *info = PyTuple_Pack(2, dtypes, bmeth->method);
+    Py_DECREF(bmeth);
+    Py_DECREF(dtypes);
+    if (info == NULL) {
+        return -1;
+    }
+    return PyUFunc_AddLoop((PyUFuncObject *)ufunc, info, 0);
+}
+
+
+static int
+PyUFunc_AddPromoter(
+        PyObject *ufunc, PyObject *DType_tuple, PyObject *promoter)
+{
+    if (!PyObject_TypeCheck(ufunc, &PyUFunc_Type)) {
+        PyErr_SetString(PyExc_TypeError,
+                "ufunc object passed is not a ufunc!");
+        return -1;
+    }
+    if (!PyCapsule_CheckExact(promoter)) {
+        PyErr_SetString(PyExc_TypeError,
+                "promoter must (currently) be a PyCapsule.");
+        return -1;
+    }
+    if (PyCapsule_GetPointer(promoter, "numpy._ufunc_promoter") == NULL) {
+        return -1;
+    }
+    PyObject *info = PyTuple_Pack(2, DType_tuple, promoter);
+    if (info == NULL) {
+        return -1;
+    }
+    return PyUFunc_AddLoop((PyUFuncObject *)ufunc, info, 0);
+}
+
+
+NPY_NO_EXPORT PyObject *
+_get_experimental_dtype_api(PyObject *NPY_UNUSED(mod), PyObject *arg)
+{
+    static void *experimental_api_table[] = {
+            &PyUFunc_AddLoopFromSpec,
+            &PyUFunc_AddPromoter,
+            &PyArrayDTypeMeta_Type,
+            &PyArrayInitDTypeMeta_FromSpec,
+            &PyArray_CommonDType,
+            &PyArray_PromoteDTypeSequence,
+            NULL,
+    };
+
+    char *env = getenv("NUMPY_EXPERIMENTAL_DTYPE_API");
+    if (env == NULL || strcmp(env, "1") != 0) {
+        PyErr_Format(PyExc_RuntimeError,
+                "The new DType API is currently in an exploratory phase and "
+                "should NOT be used for production code.  "
+                "Expect modifications and crashes!  "
+                "To experiment with the new API you must set "
+                "`NUMPY_EXPERIMENTAL_DTYPE_API=1` as an environment variable.");
+        return NULL;
+    }
+
+    long version = PyLong_AsLong(arg);
+    if (error_converting(version)) {
+        return NULL;
+    }
+    if (version != EXPERIMENTAL_DTYPE_API_VERSION) {
+        PyErr_Format(PyExc_RuntimeError,
+                "Experimental DType API version %d requested, but NumPy "
+                "is exporting version %d.  Recompile your DType and/or upgrade "
+                "NumPy to match.",
+                version, EXPERIMENTAL_DTYPE_API_VERSION);
+        return NULL;
+    }
+
+    return PyCapsule_New(&experimental_api_table,
+            "experimental_dtype_api_table", NULL);
+}
diff --git a/numpy/core/src/multiarray/experimental_public_dtype_api.h b/numpy/core/src/multiarray/experimental_public_dtype_api.h
new file mode 100644 (file)
index 0000000..270cb82
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * This file exports the experimental dtype API as exposed via the
+ * `numpy/core/include/numpy/experimental_dtype_api.h`
+ * header file.
+ *
+ * This file is a stub, all important definitions are in the code file.
+ *
+ * NOTE: This file is considered in-flux, exploratory and transitional.
+ */
+
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_EXPERIMENTAL_PUBLIC_DTYPE_API_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_EXPERIMENTAL_PUBLIC_DTYPE_API_H_
+
+NPY_NO_EXPORT PyObject *
+_get_experimental_dtype_api(PyObject *mod, PyObject *arg);
+
+
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_EXPERIMENTAL_PUBLIC_DTYPE_API_H_ */
index 9b7d8deaee339b01a6160b697c70adab9d73854c..3b1b4f406194474ca2b19a7f0583adec70cdf90c 100644 (file)
@@ -1,11 +1,11 @@
 /* Array Flags Object */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "arrayobject.h"
 #include "numpy/arrayscalars.h"
@@ -200,7 +200,8 @@ arrayflags_dealloc(PyArrayFlagsObject *self)
 
 #define _define_get(UPPER, lower) \
     static PyObject * \
-    arrayflags_ ## lower ## _get(PyArrayFlagsObject *self) \
+    arrayflags_ ## lower ## _get( \
+            PyArrayFlagsObject *self, void *NPY_UNUSED(ignored)) \
     { \
         return PyBool_FromLong((self->flags & (UPPER)) == (UPPER)); \
     }
@@ -211,7 +212,8 @@ static char *msg = "future versions will not create a writeable "
 
 #define _define_get_warn(UPPER, lower) \
     static PyObject * \
-    arrayflags_ ## lower ## _get(PyArrayFlagsObject *self) \
+    arrayflags_ ## lower ## _get( \
+            PyArrayFlagsObject *self, void *NPY_UNUSED(ignored)) \
     { \
         if (self->flags & NPY_ARRAY_WARN_ON_WRITE) { \
             if (PyErr_Warn(PyExc_FutureWarning, msg) < 0) {\
@@ -236,7 +238,7 @@ _define_get_warn(NPY_ARRAY_ALIGNED|
             NPY_ARRAY_C_CONTIGUOUS, carray)
 
 static PyObject *
-arrayflags_updateifcopy_get(PyArrayFlagsObject *self)
+arrayflags_updateifcopy_get(PyArrayFlagsObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *item;
     /* 2017-Nov-10 1.14 */
@@ -255,7 +257,7 @@ arrayflags_updateifcopy_get(PyArrayFlagsObject *self)
 
 
 static PyObject *
-arrayflags_forc_get(PyArrayFlagsObject *self)
+arrayflags_forc_get(PyArrayFlagsObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *item;
 
@@ -271,7 +273,7 @@ arrayflags_forc_get(PyArrayFlagsObject *self)
 }
 
 static PyObject *
-arrayflags_fnc_get(PyArrayFlagsObject *self)
+arrayflags_fnc_get(PyArrayFlagsObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *item;
 
@@ -287,7 +289,7 @@ arrayflags_fnc_get(PyArrayFlagsObject *self)
 }
 
 static PyObject *
-arrayflags_farray_get(PyArrayFlagsObject *self)
+arrayflags_farray_get(PyArrayFlagsObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *item;
 
@@ -305,14 +307,15 @@ arrayflags_farray_get(PyArrayFlagsObject *self)
 }
 
 static PyObject *
-arrayflags_num_get(PyArrayFlagsObject *self)
+arrayflags_num_get(PyArrayFlagsObject *self, void *NPY_UNUSED(ignored))
 {
     return PyLong_FromLong(self->flags);
 }
 
 /* relies on setflags order being write, align, uic */
 static int
-arrayflags_updateifcopy_set(PyArrayFlagsObject *self, PyObject *obj)
+arrayflags_updateifcopy_set(
+        PyArrayFlagsObject *self, PyObject *obj, void *NPY_UNUSED(ignored))
 {
     PyObject *res;
 
@@ -341,7 +344,8 @@ arrayflags_updateifcopy_set(PyArrayFlagsObject *self, PyObject *obj)
 
 /* relies on setflags order being write, align, uic */
 static int
-arrayflags_writebackifcopy_set(PyArrayFlagsObject *self, PyObject *obj)
+arrayflags_writebackifcopy_set(
+        PyArrayFlagsObject *self, PyObject *obj, void *NPY_UNUSED(ignored))
 {
     PyObject *res;
 
@@ -365,7 +369,8 @@ arrayflags_writebackifcopy_set(PyArrayFlagsObject *self, PyObject *obj)
 }
 
 static int
-arrayflags_aligned_set(PyArrayFlagsObject *self, PyObject *obj)
+arrayflags_aligned_set(
+        PyArrayFlagsObject *self, PyObject *obj, void *NPY_UNUSED(ignored))
 {
     PyObject *res;
 
@@ -390,7 +395,8 @@ arrayflags_aligned_set(PyArrayFlagsObject *self, PyObject *obj)
 }
 
 static int
-arrayflags_writeable_set(PyArrayFlagsObject *self, PyObject *obj)
+arrayflags_writeable_set(
+        PyArrayFlagsObject *self, PyObject *obj, void *NPY_UNUSED(ignored))
 {
     PyObject *res;
 
@@ -415,7 +421,8 @@ arrayflags_writeable_set(PyArrayFlagsObject *self, PyObject *obj)
 }
 
 static int
-arrayflags_warn_on_write_set(PyArrayFlagsObject *self, PyObject *obj)
+arrayflags_warn_on_write_set(
+        PyArrayFlagsObject *self, PyObject *obj, void *NPY_UNUSED(ignored))
 {
     /*
      * This code should go away in a future release, so do not mangle the
@@ -554,89 +561,89 @@ arrayflags_getitem(PyArrayFlagsObject *self, PyObject *ind)
     case 1:
         switch(key[0]) {
         case 'C':
-            return arrayflags_contiguous_get(self);
+            return arrayflags_contiguous_get(self, NULL);
         case 'F':
-            return arrayflags_fortran_get(self);
+            return arrayflags_fortran_get(self, NULL);
         case 'W':
-            return arrayflags_writeable_get(self);
+            return arrayflags_writeable_get(self, NULL);
         case 'B':
-            return arrayflags_behaved_get(self);
+            return arrayflags_behaved_get(self, NULL);
         case 'O':
-            return arrayflags_owndata_get(self);
+            return arrayflags_owndata_get(self, NULL);
         case 'A':
-            return arrayflags_aligned_get(self);
+            return arrayflags_aligned_get(self, NULL);
         case 'X':
-            return arrayflags_writebackifcopy_get(self);
+            return arrayflags_writebackifcopy_get(self, NULL);
         case 'U':
-            return arrayflags_updateifcopy_get(self);
+            return arrayflags_updateifcopy_get(self, NULL);
         default:
             goto fail;
         }
         break;
     case 2:
         if (strncmp(key, "CA", n) == 0) {
-            return arrayflags_carray_get(self);
+            return arrayflags_carray_get(self, NULL);
         }
         if (strncmp(key, "FA", n) == 0) {
-            return arrayflags_farray_get(self);
+            return arrayflags_farray_get(self, NULL);
         }
         break;
     case 3:
         if (strncmp(key, "FNC", n) == 0) {
-            return arrayflags_fnc_get(self);
+            return arrayflags_fnc_get(self, NULL);
         }
         break;
     case 4:
         if (strncmp(key, "FORC", n) == 0) {
-            return arrayflags_forc_get(self);
+            return arrayflags_forc_get(self, NULL);
         }
         break;
     case 6:
         if (strncmp(key, "CARRAY", n) == 0) {
-            return arrayflags_carray_get(self);
+            return arrayflags_carray_get(self, NULL);
         }
         if (strncmp(key, "FARRAY", n) == 0) {
-            return arrayflags_farray_get(self);
+            return arrayflags_farray_get(self, NULL);
         }
         break;
     case 7:
         if (strncmp(key,"FORTRAN",n) == 0) {
-            return arrayflags_fortran_get(self);
+            return arrayflags_fortran_get(self, NULL);
         }
         if (strncmp(key,"BEHAVED",n) == 0) {
-            return arrayflags_behaved_get(self);
+            return arrayflags_behaved_get(self, NULL);
         }
         if (strncmp(key,"OWNDATA",n) == 0) {
-            return arrayflags_owndata_get(self);
+            return arrayflags_owndata_get(self, NULL);
         }
         if (strncmp(key,"ALIGNED",n) == 0) {
-            return arrayflags_aligned_get(self);
+            return arrayflags_aligned_get(self, NULL);
         }
         break;
     case 9:
         if (strncmp(key,"WRITEABLE",n) == 0) {
-            return arrayflags_writeable_get(self);
+            return arrayflags_writeable_get(self, NULL);
         }
         break;
     case 10:
         if (strncmp(key,"CONTIGUOUS",n) == 0) {
-            return arrayflags_contiguous_get(self);
+            return arrayflags_contiguous_get(self, NULL);
         }
         break;
     case 12:
         if (strncmp(key, "UPDATEIFCOPY", n) == 0) {
-            return arrayflags_updateifcopy_get(self);
+            return arrayflags_updateifcopy_get(self, NULL);
         }
         if (strncmp(key, "C_CONTIGUOUS", n) == 0) {
-            return arrayflags_contiguous_get(self);
+            return arrayflags_contiguous_get(self, NULL);
         }
         if (strncmp(key, "F_CONTIGUOUS", n) == 0) {
-            return arrayflags_fortran_get(self);
+            return arrayflags_fortran_get(self, NULL);
         }
         break;
     case 15:
         if (strncmp(key, "WRITEBACKIFCOPY", n) == 0) {
-            return arrayflags_writebackifcopy_get(self);
+            return arrayflags_writebackifcopy_get(self, NULL);
         }
         break;
     }
@@ -671,19 +678,19 @@ arrayflags_setitem(PyArrayFlagsObject *self, PyObject *ind, PyObject *item)
     }
     if (((n==9) && (strncmp(key, "WRITEABLE", n) == 0)) ||
         ((n==1) && (strncmp(key, "W", n) == 0))) {
-        return arrayflags_writeable_set(self, item);
+        return arrayflags_writeable_set(self, item, NULL);
     }
     else if (((n==7) && (strncmp(key, "ALIGNED", n) == 0)) ||
              ((n==1) && (strncmp(key, "A", n) == 0))) {
-        return arrayflags_aligned_set(self, item);
+        return arrayflags_aligned_set(self, item, NULL);
     }
     else if (((n==12) && (strncmp(key, "UPDATEIFCOPY", n) == 0)) ||
              ((n==1) && (strncmp(key, "U", n) == 0))) {
-        return arrayflags_updateifcopy_set(self, item);
+        return arrayflags_updateifcopy_set(self, item, NULL);
     }
     else if (((n==15) && (strncmp(key, "WRITEBACKIFCOPY", n) == 0)) ||
              ((n==1) && (strncmp(key, "X", n) == 0))) {
-        return arrayflags_writebackifcopy_set(self, item);
+        return arrayflags_writebackifcopy_set(self, item, NULL);
     }
 
  fail:
@@ -772,7 +779,7 @@ arrayflags_new(PyTypeObject *NPY_UNUSED(self), PyObject *args, PyObject *NPY_UNU
 
 NPY_NO_EXPORT PyTypeObject PyArrayFlags_Type = {
     PyVarObject_HEAD_INIT(NULL, 0)
-    .tp_name = "numpy.flagsobj",
+    .tp_name = "numpy.core.multiarray.flagsobj",
     .tp_basicsize = sizeof(PyArrayFlagsObject),
     .tp_dealloc = (destructor)arrayflags_dealloc,
     .tp_repr = (reprfunc)arrayflags_print,
index bccbb7b0c54ab39290765a612ff128f909b48aa0..a92ac44b78460f3f9821de6a984865586b64f553 100644 (file)
@@ -1,11 +1,11 @@
 /* Array Descr Object */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 
 #include "npy_config.h"
 /*******************  array attribute get and set routines ******************/
 
 static PyObject *
-array_ndim_get(PyArrayObject *self)
+array_ndim_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     return PyLong_FromLong(PyArray_NDIM(self));
 }
 
 static PyObject *
-array_flags_get(PyArrayObject *self)
+array_flags_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     return PyArray_NewFlagsObject((PyObject *)self);
 }
 
 static PyObject *
-array_shape_get(PyArrayObject *self)
+array_shape_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     return PyArray_IntTupleFromIntp(PyArray_NDIM(self), PyArray_DIMS(self));
 }
 
 
 static int
-array_shape_set(PyArrayObject *self, PyObject *val)
+array_shape_set(PyArrayObject *self, PyObject *val, void* NPY_UNUSED(ignored))
 {
     int nd;
     PyArrayObject *ret;
@@ -103,13 +103,13 @@ array_shape_set(PyArrayObject *self, PyObject *val)
 
 
 static PyObject *
-array_strides_get(PyArrayObject *self)
+array_strides_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     return PyArray_IntTupleFromIntp(PyArray_NDIM(self), PyArray_STRIDES(self));
 }
 
 static int
-array_strides_set(PyArrayObject *self, PyObject *obj)
+array_strides_set(PyArrayObject *self, PyObject *obj, void *NPY_UNUSED(ignored))
 {
     PyArray_Dims newstrides = {NULL, -1};
     PyArrayObject *new;
@@ -182,7 +182,7 @@ array_strides_set(PyArrayObject *self, PyObject *obj)
 
 
 static PyObject *
-array_priority_get(PyArrayObject *NPY_UNUSED(self))
+array_priority_get(PyArrayObject *NPY_UNUSED(self), void *NPY_UNUSED(ignored))
 {
     return PyFloat_FromDouble(NPY_PRIORITY);
 }
@@ -190,11 +190,11 @@ array_priority_get(PyArrayObject *NPY_UNUSED(self))
 static PyObject *
 array_typestr_get(PyArrayObject *self)
 {
-    return arraydescr_protocol_typestr_get(PyArray_DESCR(self));
+    return arraydescr_protocol_typestr_get(PyArray_DESCR(self), NULL);
 }
 
 static PyObject *
-array_descr_get(PyArrayObject *self)
+array_descr_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     Py_INCREF(PyArray_DESCR(self));
     return (PyObject *)PyArray_DESCR(self);
@@ -206,7 +206,7 @@ array_protocol_descr_get(PyArrayObject *self)
     PyObject *res;
     PyObject *dobj;
 
-    res = arraydescr_protocol_descr_get(PyArray_DESCR(self));
+    res = arraydescr_protocol_descr_get(PyArray_DESCR(self), NULL);
     if (res) {
         return res;
     }
@@ -240,7 +240,7 @@ array_protocol_strides_get(PyArrayObject *self)
 
 
 static PyObject *
-array_dataptr_get(PyArrayObject *self)
+array_dataptr_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     return Py_BuildValue("NO",
                          PyLong_FromVoidPtr(PyArray_DATA(self)),
@@ -250,7 +250,7 @@ array_dataptr_get(PyArrayObject *self)
 }
 
 static PyObject *
-array_ctypes_get(PyArrayObject *self)
+array_ctypes_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *_numpy_internal;
     PyObject *ret;
@@ -265,7 +265,7 @@ array_ctypes_get(PyArrayObject *self)
 }
 
 static PyObject *
-array_interface_get(PyArrayObject *self)
+array_interface_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *dict;
     PyObject *obj;
@@ -278,7 +278,7 @@ array_interface_get(PyArrayObject *self)
     int ret;
 
     /* dataptr */
-    obj = array_dataptr_get(self);
+    obj = array_dataptr_get(self, NULL);
     ret = PyDict_SetItemString(dict, "data", obj);
     Py_DECREF(obj);
     if (ret < 0) {
@@ -302,7 +302,7 @@ array_interface_get(PyArrayObject *self)
         return NULL;
     }
 
-    obj = arraydescr_protocol_typestr_get(PyArray_DESCR(self));
+    obj = arraydescr_protocol_typestr_get(PyArray_DESCR(self), NULL);
     ret = PyDict_SetItemString(dict, "typestr", obj);
     Py_DECREF(obj);
     if (ret < 0) {
@@ -310,7 +310,7 @@ array_interface_get(PyArrayObject *self)
         return NULL;
     }
 
-    obj = array_shape_get(self);
+    obj = array_shape_get(self, NULL);
     ret = PyDict_SetItemString(dict, "shape", obj);
     Py_DECREF(obj);
     if (ret < 0) {
@@ -330,13 +330,13 @@ array_interface_get(PyArrayObject *self)
 }
 
 static PyObject *
-array_data_get(PyArrayObject *self)
+array_data_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     return PyMemoryView_FromObject((PyObject *)self);
 }
 
 static int
-array_data_set(PyArrayObject *self, PyObject *op)
+array_data_set(PyArrayObject *self, PyObject *op, void *NPY_UNUSED(ignored))
 {
     void *buf;
     Py_ssize_t buf_len;
@@ -384,7 +384,16 @@ array_data_set(PyArrayObject *self, PyObject *op)
     }
     if (PyArray_FLAGS(self) & NPY_ARRAY_OWNDATA) {
         PyArray_XDECREF(self);
-        PyDataMem_FREE(PyArray_DATA(self));
+        size_t nbytes = PyArray_NBYTES_ALLOCATED(self);
+        PyObject *handler = PyArray_HANDLER(self);
+        if (handler == NULL) {
+            /* This can happen if someone arbitrarily sets NPY_ARRAY_OWNDATA */
+            PyErr_SetString(PyExc_RuntimeError,
+                            "no memory handler found but OWNDATA flag set");
+            return -1;
+        }
+        PyDataMem_UserFREE(PyArray_DATA(self), nbytes, handler);
+        Py_CLEAR(((PyArrayObject_fields *)self)->mem_handler);
     }
     if (PyArray_BASE(self)) {
         if ((PyArray_FLAGS(self) & NPY_ARRAY_WRITEBACKIFCOPY) ||
@@ -411,19 +420,19 @@ array_data_set(PyArrayObject *self, PyObject *op)
 
 
 static PyObject *
-array_itemsize_get(PyArrayObject *self)
+array_itemsize_get(PyArrayObject *self, void* NPY_UNUSED(ignored))
 {
     return PyLong_FromLong((long) PyArray_DESCR(self)->elsize);
 }
 
 static PyObject *
-array_size_get(PyArrayObject *self)
+array_size_get(PyArrayObject *self, void* NPY_UNUSED(ignored))
 {
     return PyArray_PyIntFromIntp(PyArray_SIZE(self));
 }
 
 static PyObject *
-array_nbytes_get(PyArrayObject *self)
+array_nbytes_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     return PyArray_PyIntFromIntp(PyArray_NBYTES(self));
 }
@@ -438,7 +447,7 @@ array_nbytes_get(PyArrayObject *self)
  * will be adjusted in that case as well.
  */
 static int
-array_descr_set(PyArrayObject *self, PyObject *arg)
+array_descr_set(PyArrayObject *self, PyObject *arg, void *NPY_UNUSED(ignored))
 {
     PyArray_Descr *newtype = NULL;
 
@@ -598,7 +607,7 @@ array_descr_set(PyArrayObject *self, PyObject *arg)
 }
 
 static PyObject *
-array_struct_get(PyArrayObject *self)
+array_struct_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     PyArrayInterface *inter;
 
@@ -641,7 +650,7 @@ array_struct_get(PyArrayObject *self)
     }
     inter->data = PyArray_DATA(self);
     if (PyDataType_HASFIELDS(PyArray_DESCR(self))) {
-        inter->descr = arraydescr_protocol_descr_get(PyArray_DESCR(self));
+        inter->descr = arraydescr_protocol_descr_get(PyArray_DESCR(self), NULL);
         if (inter->descr == NULL) {
             PyErr_Clear();
         }
@@ -664,7 +673,7 @@ array_struct_get(PyArrayObject *self)
 }
 
 static PyObject *
-array_base_get(PyArrayObject *self)
+array_base_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     if (PyArray_BASE(self) == NULL) {
         Py_RETURN_NONE;
@@ -734,7 +743,7 @@ _get_part(PyArrayObject *self, int imag)
  */
 
 static PyObject *
-array_real_get(PyArrayObject *self)
+array_real_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     PyArrayObject *ret;
 
@@ -750,7 +759,7 @@ array_real_get(PyArrayObject *self)
 
 
 static int
-array_real_set(PyArrayObject *self, PyObject *val)
+array_real_set(PyArrayObject *self, PyObject *val, void *NPY_UNUSED(ignored))
 {
     PyArrayObject *ret;
     PyArrayObject *new;
@@ -788,7 +797,7 @@ array_real_set(PyArrayObject *self, PyObject *val)
 */
 
 static PyObject *
-array_imag_get(PyArrayObject *self)
+array_imag_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     PyArrayObject *ret;
 
@@ -816,7 +825,7 @@ array_imag_get(PyArrayObject *self)
 }
 
 static int
-array_imag_set(PyArrayObject *self, PyObject *val)
+array_imag_set(PyArrayObject *self, PyObject *val, void *NPY_UNUSED(ignored))
 {
     if (val == NULL) {
         PyErr_SetString(PyExc_AttributeError,
@@ -850,13 +859,13 @@ array_imag_set(PyArrayObject *self, PyObject *val)
 }
 
 static PyObject *
-array_flat_get(PyArrayObject *self)
+array_flat_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     return PyArray_IterNew((PyObject *)self);
 }
 
 static int
-array_flat_set(PyArrayObject *self, PyObject *val)
+array_flat_set(PyArrayObject *self, PyObject *val, void *NPY_UNUSED(ignored))
 {
     PyArrayObject *arr = NULL;
     int retval = -1;
@@ -928,7 +937,7 @@ array_flat_set(PyArrayObject *self, PyObject *val)
 }
 
 static PyObject *
-array_transpose_get(PyArrayObject *self)
+array_transpose_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
 {
     return PyArray_Transpose(self, NULL);
 }
@@ -937,7 +946,7 @@ array_transpose_get(PyArrayObject *self)
    --- default sub-class behavior
 */
 static PyObject *
-array_finalize_get(PyArrayObject *NPY_UNUSED(self))
+array_finalize_get(PyArrayObject *NPY_UNUSED(self), void *NPY_UNUSED(ignored))
 {
     Py_RETURN_NONE;
 }
index 4f1209de5a648ca16017c079a244719bee701b53..a95c98020a1891ca32bf7456ee921a5d2c13fbc9 100644 (file)
@@ -1,6 +1,6 @@
-#ifndef _NPY_ARRAY_GETSET_H_
-#define _NPY_ARRAY_GETSET_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_GETSET_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_GETSET_H_
 
 extern NPY_NO_EXPORT PyGetSetDef array_getsetlist[];
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_GETSET_H_ */
index e9a99cc8fa8f37b5e27702cb253d0452958cb9d2..a3c9e986bf4059033576a7d53b37e720305c97e0 100644 (file)
@@ -1,7 +1,9 @@
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
 #include <numpy/arrayobject.h>
 
 #include "npy_config.h"
index 8d577e7b0fdce5693f59442215fa0855fcbf9622..97375b4afab30a006beace4fe520fe0e04c1a8ea 100644 (file)
@@ -1,7 +1,7 @@
-#ifndef _NPY_HASHDESCR_H_
-#define _NPY_HASHDESCR_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_HASHDESCR_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_HASHDESCR_H_
 
 NPY_NO_EXPORT npy_hash_t
 PyArray_DescrHash(PyObject* odescr);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_HASHDESCR_H_ */
index 47d78f25592242ef774069a6534c03ffc6260079..086b674c809eb327138db0c40245abd6d8bf032a 100644 (file)
@@ -1,10 +1,10 @@
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#include "structmember.h"
-
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
 
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+#include <structmember.h>
+
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 
@@ -776,6 +776,7 @@ PyArray_Repeat(PyArrayObject *aop, PyObject *op, int axis)
     return NULL;
 }
 
+
 /*NUMPY_API
  */
 NPY_NO_EXPORT PyObject *
@@ -907,7 +908,7 @@ PyArray_Choose(PyArrayObject *ip, PyObject *op, PyArrayObject *out,
         Py_XDECREF(mps[i]);
     }
     Py_DECREF(ap);
-    npy_free_cache(mps, n * sizeof(mps[0]));
+    PyDataMem_FREE(mps);
     if (out != NULL && out != obj) {
         Py_INCREF(out);
         PyArray_ResolveWritebackIfCopy(obj);
@@ -922,7 +923,7 @@ PyArray_Choose(PyArrayObject *ip, PyObject *op, PyArrayObject *out,
         Py_XDECREF(mps[i]);
     }
     Py_XDECREF(ap);
-    npy_free_cache(mps, n * sizeof(mps[0]));
+    PyDataMem_FREE(mps);
     PyArray_DiscardWritebackIfCopy(obj);
     Py_XDECREF(obj);
     return NULL;
@@ -962,14 +963,19 @@ _new_sortlike(PyArrayObject *op, int axis, PyArray_SortFunc *sort,
         return 0;
     }
 
+    PyObject *mem_handler = PyDataMem_GetHandler();
+    if (mem_handler == NULL) {
+        return -1;
+    }
     it = (PyArrayIterObject *)PyArray_IterAllButAxis((PyObject *)op, &axis);
     if (it == NULL) {
+        Py_DECREF(mem_handler);
         return -1;
     }
     size = it->size;
 
     if (needcopy) {
-        buffer = npy_alloc_cache(N * elsize);
+        buffer = PyDataMem_UserNEW(N * elsize, mem_handler);
         if (buffer == NULL) {
             ret = -1;
             goto fail;
@@ -1053,12 +1059,14 @@ _new_sortlike(PyArrayObject *op, int axis, PyArray_SortFunc *sort,
 
 fail:
     NPY_END_THREADS_DESCR(PyArray_DESCR(op));
-    npy_free_cache(buffer, N * elsize);
+    /* cleanup internal buffer */
+    PyDataMem_UserFREE(buffer, N * elsize, mem_handler);
     if (ret < 0 && !PyErr_Occurred()) {
         /* Out of memory during sorting or buffer creation */
         PyErr_NoMemory();
     }
     Py_DECREF(it);
+    Py_DECREF(mem_handler);
 
     return ret;
 }
@@ -1090,11 +1098,16 @@ _new_argsortlike(PyArrayObject *op, int axis, PyArray_ArgSortFunc *argsort,
 
     NPY_BEGIN_THREADS_DEF;
 
+    PyObject *mem_handler = PyDataMem_GetHandler();
+    if (mem_handler == NULL) {
+        return NULL;
+    }
     rop = (PyArrayObject *)PyArray_NewFromDescr(
             Py_TYPE(op), PyArray_DescrFromType(NPY_INTP),
             PyArray_NDIM(op), PyArray_DIMS(op), NULL, NULL,
             0, (PyObject *)op);
     if (rop == NULL) {
+        Py_DECREF(mem_handler);
         return NULL;
     }
     rstride = PyArray_STRIDE(rop, axis);
@@ -1102,6 +1115,7 @@ _new_argsortlike(PyArrayObject *op, int axis, PyArray_ArgSortFunc *argsort,
 
     /* Check if there is any argsorting to do */
     if (N <= 1 || PyArray_SIZE(op) == 0) {
+        Py_DECREF(mem_handler);
         memset(PyArray_DATA(rop), 0, PyArray_NBYTES(rop));
         return (PyObject *)rop;
     }
@@ -1115,7 +1129,7 @@ _new_argsortlike(PyArrayObject *op, int axis, PyArray_ArgSortFunc *argsort,
     size = it->size;
 
     if (needcopy) {
-        valbuffer = npy_alloc_cache(N * elsize);
+        valbuffer = PyDataMem_UserNEW(N * elsize, mem_handler);
         if (valbuffer == NULL) {
             ret = -1;
             goto fail;
@@ -1123,7 +1137,8 @@ _new_argsortlike(PyArrayObject *op, int axis, PyArray_ArgSortFunc *argsort,
     }
 
     if (needidxbuffer) {
-        idxbuffer = (npy_intp *)npy_alloc_cache(N * sizeof(npy_intp));
+        idxbuffer = (npy_intp *)PyDataMem_UserNEW(N * sizeof(npy_intp),
+                                                  mem_handler);
         if (idxbuffer == NULL) {
             ret = -1;
             goto fail;
@@ -1212,8 +1227,9 @@ _new_argsortlike(PyArrayObject *op, int axis, PyArray_ArgSortFunc *argsort,
 
 fail:
     NPY_END_THREADS_DESCR(PyArray_DESCR(op));
-    npy_free_cache(valbuffer, N * elsize);
-    npy_free_cache(idxbuffer, N * sizeof(npy_intp));
+    /* cleanup internal buffers */
+    PyDataMem_UserFREE(valbuffer, N * elsize, mem_handler);
+    PyDataMem_UserFREE(idxbuffer, N * sizeof(npy_intp), mem_handler);
     if (ret < 0) {
         if (!PyErr_Occurred()) {
             /* Out of memory during sorting or buffer creation */
@@ -1224,6 +1240,7 @@ fail:
     }
     Py_XDECREF(it);
     Py_XDECREF(rit);
+    Py_DECREF(mem_handler);
 
     return (PyObject *)rop;
 }
@@ -1292,7 +1309,15 @@ partition_prep_kth_array(PyArrayObject * ktharray,
     npy_intp * kth;
     npy_intp nkth, i;
 
-    if (!PyArray_CanCastSafely(PyArray_TYPE(ktharray), NPY_INTP)) {
+    if (PyArray_ISBOOL(ktharray)) {
+        /* 2021-09-29, NumPy 1.22 */
+        if (DEPRECATE(
+                "Passing booleans as partition index is deprecated"
+                " (warning added in NumPy 1.22)") < 0) {
+            return NULL;
+        }
+    }
+    else if (!PyArray_ISINTEGER(ktharray)) {
         PyErr_Format(PyExc_TypeError, "Partition index must be integer");
         return NULL;
     }
index c1c8b5567b624efdbd24dc79579226bf45f58541..40d9eb298f4833f3abce6292895742c9e5f95f1e 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_PRIVATE__ITEM_SELECTION_H_
-#define _NPY_PRIVATE__ITEM_SELECTION_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_ITEM_SELECTION_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_ITEM_SELECTION_H_
 
 /*
  * Counts the number of True values in a raw boolean array. This
@@ -27,4 +27,4 @@ NPY_NO_EXPORT int
 PyArray_MultiIndexSetItem(PyArrayObject *self, const npy_intp *multi_index,
                                                 PyObject *obj);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_ITEM_SELECTION_H_ */
index 576ea89b32fc8b94eb352474d1b9580758767316..f959162fd015e53efa3a79181d08007a9bc846ef 100644 (file)
@@ -1,9 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 
@@ -1067,13 +1068,13 @@ static PyMemberDef iter_members[] = {
 };
 
 static PyObject *
-iter_index_get(PyArrayIterObject *self)
+iter_index_get(PyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     return PyArray_PyIntFromIntp(self->index);
 }
 
 static PyObject *
-iter_coords_get(PyArrayIterObject *self)
+iter_coords_get(PyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     int nd;
     nd = PyArray_NDIM(self->ao);
@@ -1123,6 +1124,35 @@ NPY_NO_EXPORT PyTypeObject PyArrayIter_Type = {
 
 /** END of Array Iterator **/
 
+
+static int
+set_shape_mismatch_exception(PyArrayMultiIterObject *mit, int i1, int i2)
+{
+    PyObject *shape1, *shape2, *msg;
+
+    shape1 = PyObject_GetAttrString((PyObject *) mit->iters[i1]->ao, "shape");
+    if (shape1 == NULL) {
+        return -1;
+    }
+    shape2 = PyObject_GetAttrString((PyObject *) mit->iters[i2]->ao, "shape");
+    if (shape2 == NULL) {
+        Py_DECREF(shape1);
+        return -1;
+    }
+    msg = PyUnicode_FromFormat("shape mismatch: objects cannot be broadcast "
+                               "to a single shape.  Mismatch is between arg %d "
+                               "with shape %S and arg %d with shape %S.",
+                               i1, shape1, i2, shape2);
+    Py_DECREF(shape1);
+    Py_DECREF(shape2);
+    if (msg == NULL) {
+        return -1;
+    }
+    PyErr_SetObject(PyExc_ValueError, msg);
+    Py_DECREF(msg);
+    return 0;
+}
+
 /* Adjust dimensionality and strides for index object iterators
    --- i.e. broadcast
 */
@@ -1131,6 +1161,7 @@ NPY_NO_EXPORT int
 PyArray_Broadcast(PyArrayMultiIterObject *mit)
 {
     int i, nd, k, j;
+    int src_iter = -1;  /* Initializing avoids a compiler warning. */
     npy_intp tmp;
     PyArrayIterObject *it;
 
@@ -1154,12 +1185,10 @@ PyArray_Broadcast(PyArrayMultiIterObject *mit)
                 }
                 if (mit->dimensions[i] == 1) {
                     mit->dimensions[i] = tmp;
+                    src_iter = j;
                 }
                 else if (mit->dimensions[i] != tmp) {
-                    PyErr_SetString(PyExc_ValueError,
-                                    "shape mismatch: objects" \
-                                    " cannot be broadcast" \
-                                    " to a single shape");
+                    set_shape_mismatch_exception(mit, src_iter, j);
                     return -1;
                 }
             }
@@ -1413,25 +1442,25 @@ arraymultiter_dealloc(PyArrayMultiIterObject *multi)
 }
 
 static PyObject *
-arraymultiter_size_get(PyArrayMultiIterObject *self)
+arraymultiter_size_get(PyArrayMultiIterObject *self, void *NPY_UNUSED(ignored))
 {
     return PyArray_PyIntFromIntp(self->size);
 }
 
 static PyObject *
-arraymultiter_index_get(PyArrayMultiIterObject *self)
+arraymultiter_index_get(PyArrayMultiIterObject *self, void *NPY_UNUSED(ignored))
 {
     return PyArray_PyIntFromIntp(self->index);
 }
 
 static PyObject *
-arraymultiter_shape_get(PyArrayMultiIterObject *self)
+arraymultiter_shape_get(PyArrayMultiIterObject *self, void *NPY_UNUSED(ignored))
 {
     return PyArray_IntTupleFromIntp(self->nd, self->dimensions);
 }
 
 static PyObject *
-arraymultiter_iters_get(PyArrayMultiIterObject *self)
+arraymultiter_iters_get(PyArrayMultiIterObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *res;
     int i, n;
index d942f45b8750bc2201047fe22d07c1a81dbf6258..883615cc9993508a59442a8d1dee302a37b290e4 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ARRAYITERATORS_H_
-#define _NPY_ARRAYITERATORS_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_ITERATORS_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_ITERATORS_H_
 
 NPY_NO_EXPORT PyObject
 *iter_subscript(PyArrayIterObject *, PyObject *);
@@ -10,4 +10,4 @@ iter_ass_subscript(PyArrayIterObject *, PyObject *, PyObject *);
 NPY_NO_EXPORT void
 PyArray_RawIterBaseInit(PyArrayIterObject *it, PyArrayObject *ao);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_ITERATORS_H_ */
index 9b4946da3c7c6042182bc75f386b8cc956deb4b9..72a52d7a87c0b661b469f575e898eebc8376313a 100644 (file)
@@ -6,9 +6,9 @@
  * until such a time where legay user dtypes are deprecated and removed
  * entirely.
  */
-
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
+
 #include "numpy/arrayobject.h"
 #include "scalartypes.h"
 #include "_datetime.h"
index b36eb019a45241269e48b235a808f2044ea5c4ee..04f455cde0bdd2aea011ea8f7b10b77295ddd33b 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef _NPY_LEGACY_DTYPE_IMPLEMENTATION_H
-#define _NPY_LEGACY_DTYPE_IMPLEMENTATION_H
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_LEGACY_DTYPE_IMPLEMENTATION_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_LEGACY_DTYPE_IMPLEMENTATION_H_
 
 NPY_NO_EXPORT npy_bool
 PyArray_LegacyCanCastTypeTo(PyArray_Descr *from, PyArray_Descr *to,
         NPY_CASTING casting);
 
-#endif /*_NPY_LEGACY_DTYPE_IMPLEMENTATION_H*/
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_LEGACY_DTYPE_IMPLEMENTATION_H_ */
index e533e4932f3ed119b16e5b6d806cec835370df56..e313d244768d5e5bab5ab33a87f2b4d3f79fb5d4 100644 (file)
@@ -9,7 +9,7 @@
  */
 
 #define PY_SSIZE_T_CLEAN
-#include "Python.h"
+#include <Python.h>
 
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
@@ -819,6 +819,10 @@ NPY_NO_EXPORT PyArrayMethod_StridedLoop *
 #    define _CONVERT_FN(x) npy_floatbits_to_halfbits(x)
 #  elif @is_double1@
 #    define _CONVERT_FN(x) npy_doublebits_to_halfbits(x)
+#  elif @is_half1@
+#    define _CONVERT_FN(x) (x)
+#  elif @is_bool1@
+#    define _CONVERT_FN(x) npy_float_to_half((float)(x!=0))
 #  else
 #    define _CONVERT_FN(x) npy_float_to_half((float)x)
 #  endif
@@ -1845,7 +1849,7 @@ mapiter_@name@(PyArrayMapIterObject *mit)
                         return -1;
                     }
 #else
-                    /* The operand order is reveresed here */
+                    /* The operand order is reversed here */
                     char *args[2] = {subspace_ptrs[1], subspace_ptrs[0]};
                     npy_intp strides[2] = {subspace_strides[1], subspace_strides[0]};
                     if (NPY_UNLIKELY(cast_info.func(&cast_info.context,
index 41311b03f3314713a9762a88c56203c5d4244594..014a863d547127db907ca1fd4d44a7eb43dedc7f 100644 (file)
@@ -1,10 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-/*#include <stdio.h>*/
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "arrayobject.h"
 
index 4e22f79df2c9cab1b49b7d98a134961e937c7628..e929b8b3f72928e9fda047943541641d83963fea 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ARRAYMAPPING_H_
-#define _NPY_ARRAYMAPPING_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_MAPPING_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_MAPPING_H_
 
 extern NPY_NO_EXPORT PyMappingMethods array_as_mapping;
 
@@ -70,4 +70,4 @@ PyArray_MapIterNew(npy_index_info *indices , int index_num, int index_type,
                    npy_uint32 subspace_iter_flags, npy_uint32 subspace_flags,
                    npy_uint32 extra_op_flags, PyArrayObject *extra_op,
                    PyArray_Descr *extra_op_dtype);
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_MAPPING_H_ */
index 251e527a6b9650bdc211e861efb4a7d7c88621d9..c31a8292ce325d4ffe4f6a47beb1a2fe1744561f 100644 (file)
@@ -1,14 +1,14 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
-#include <stdarg.h>
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
-#include "arrayobject.h"
 #include "numpy/arrayscalars.h"
 
+#include "arrayobject.h"
 #include "arrayfunction_override.h"
 #include "npy_argparse.h"
 #include "npy_config.h"
 #include "shape.h"
 #include "strfuncs.h"
 #include "array_assign.h"
+#include "npy_dlpack.h"
 
 #include "methods.h"
 #include "alloc.h"
 
+#include <stdarg.h>
+
 
 /* NpyArg_ParseKeywords
  *
@@ -284,16 +287,18 @@ array_argmax(PyArrayObject *self,
 {
     int axis = NPY_MAXDIMS;
     PyArrayObject *out = NULL;
+    npy_bool keepdims = NPY_FALSE;
     NPY_PREPARE_ARGPARSER;
 
     if (npy_parse_arguments("argmax", args, len_args, kwnames,
             "|axis", &PyArray_AxisConverter, &axis,
             "|out", &PyArray_OutputConverter, &out,
+            "$keepdims", &PyArray_BoolConverter, &keepdims,
             NULL, NULL, NULL) < 0) {
         return NULL;
     }
 
-    PyObject *ret = PyArray_ArgMax(self, axis, out);
+    PyObject *ret = _PyArray_ArgMaxWithKeepdims(self, axis, out, keepdims);
 
     /* this matches the unpacking behavior of ufuncs */
     if (out == NULL) {
@@ -310,16 +315,17 @@ array_argmin(PyArrayObject *self,
 {
     int axis = NPY_MAXDIMS;
     PyArrayObject *out = NULL;
+    npy_bool keepdims = NPY_FALSE;
     NPY_PREPARE_ARGPARSER;
-
     if (npy_parse_arguments("argmin", args, len_args, kwnames,
             "|axis", &PyArray_AxisConverter, &axis,
             "|out", &PyArray_OutputConverter, &out,
+            "$keepdims", &PyArray_BoolConverter, &keepdims,
             NULL, NULL, NULL) < 0) {
         return NULL;
     }
 
-    PyObject *ret = PyArray_ArgMin(self, axis, out);
+    PyObject *ret = _PyArray_ArgMinWithKeepdims(self, axis, out, keepdims);
 
     /* this matches the unpacking behavior of ufuncs */
     if (out == NULL) {
@@ -828,15 +834,15 @@ array_astype(PyArrayObject *self,
      */
     NPY_CASTING casting = NPY_UNSAFE_CASTING;
     NPY_ORDER order = NPY_KEEPORDER;
-    int forcecopy = 1, subok = 1;
+    _PyArray_CopyMode forcecopy = 1;
+    int subok = 1;
     NPY_PREPARE_ARGPARSER;
-
     if (npy_parse_arguments("astype", args, len_args, kwnames,
             "dtype", &PyArray_DescrConverter, &dtype,
             "|order", &PyArray_OrderConverter, &order,
             "|casting", &PyArray_CastingConverter, &casting,
             "|subok", &PyArray_PythonPyIntFromInt, &subok,
-            "|copy", &PyArray_PythonPyIntFromInt, &forcecopy,
+            "|copy", &PyArray_CopyConverter, &forcecopy,
             NULL, NULL, NULL) < 0) {
         Py_XDECREF(dtype);
         return NULL;
@@ -853,20 +859,29 @@ array_astype(PyArrayObject *self,
      * and it's not a subtype if subok is False, then we
      * can skip the copy.
      */
-    if (!forcecopy && (order == NPY_KEEPORDER ||
-                       (order == NPY_ANYORDER &&
-                            (PyArray_IS_C_CONTIGUOUS(self) ||
-                            PyArray_IS_F_CONTIGUOUS(self))) ||
-                       (order == NPY_CORDER &&
-                            PyArray_IS_C_CONTIGUOUS(self)) ||
-                       (order == NPY_FORTRANORDER &&
-                            PyArray_IS_F_CONTIGUOUS(self))) &&
-                    (subok || PyArray_CheckExact(self)) &&
-                    PyArray_EquivTypes(dtype, PyArray_DESCR(self))) {
+    if (forcecopy != NPY_COPY_ALWAYS && 
+                    (order == NPY_KEEPORDER ||
+                    (order == NPY_ANYORDER &&
+                        (PyArray_IS_C_CONTIGUOUS(self) ||
+                        PyArray_IS_F_CONTIGUOUS(self))) ||
+                    (order == NPY_CORDER &&
+                        PyArray_IS_C_CONTIGUOUS(self)) ||
+                    (order == NPY_FORTRANORDER &&
+                        PyArray_IS_F_CONTIGUOUS(self))) &&
+                (subok || PyArray_CheckExact(self)) &&
+                PyArray_EquivTypes(dtype, PyArray_DESCR(self))) {
         Py_DECREF(dtype);
         Py_INCREF(self);
         return (PyObject *)self;
     }
+
+    if (forcecopy == NPY_COPY_NEVER) {
+        PyErr_SetString(PyExc_ValueError,
+                "Unable to avoid copy while casting in never copy mode.");
+        Py_DECREF(dtype);
+        return NULL;
+    }
+    
     if (!PyArray_CanCastArrayTo(self, dtype, casting)) {
         PyErr_Clear();
         npy_set_invalid_cast_error(
@@ -1816,22 +1831,8 @@ array_reduce_ex_picklebuffer(PyArrayObject *self, int protocol)
 
     descr = PyArray_DESCR(self);
 
-    /* if the python version is below 3.8, the pickle module does not provide
-     * built-in support for protocol 5. We try importing the pickle5
-     * backport instead */
-#if PY_VERSION_HEX >= 0x03080000
     /* we expect protocol 5 to be available in Python 3.8 */
     pickle_module = PyImport_ImportModule("pickle");
-#else
-    pickle_module = PyImport_ImportModule("pickle5");
-    if (pickle_module == NULL) {
-        /* for protocol 5, raise a clear ImportError if pickle5 is not found
-         */
-        PyErr_SetString(PyExc_ImportError, "Using pickle protocol 5 "
-                "requires the pickle5 module for Python >=3.6 and <3.8");
-        return NULL;
-    }
-#endif
     if (pickle_module == NULL){
         return NULL;
     }
@@ -1933,7 +1934,7 @@ array_setstate(PyArrayObject *self, PyObject *args)
     PyObject *rawdata = NULL;
     char *datastr;
     Py_ssize_t len;
-    npy_intp size, dimensions[NPY_MAXDIMS];
+    npy_intp dimensions[NPY_MAXDIMS];
     int nd;
     npy_intp nbytes;
     int overflowed;
@@ -1970,6 +1971,12 @@ array_setstate(PyArrayObject *self, PyObject *args)
         return NULL;
     }
 
+    /*
+     * Reassigning fa->descr messes with the reallocation strategy,
+     * since fa could be a 0-d or scalar, and then
+     * PyDataMem_UserFREE will be confused
+     */
+    size_t n_tofree = PyArray_NBYTES_ALLOCATED(self);
     Py_XDECREF(PyArray_DESCR(self));
     fa->descr = typecode;
     Py_INCREF(typecode);
@@ -1977,17 +1984,39 @@ array_setstate(PyArrayObject *self, PyObject *args)
     if (nd < 0) {
         return NULL;
     }
-    size = PyArray_MultiplyList(dimensions, nd);
-    if (size < 0) {
-        /* More items than are addressable */
-        return PyErr_NoMemory();
+    /*
+     * We should do two things here:
+     * 1. Validate the input, that it is neither invalid, nor "too big"
+     *    ("too big" ignores dimensios of size 0).
+     * 2. Find `PyArray_NBYTES` of the result, as this is what we may need to
+     *    copy from the pickled data (may not match allocation currently if 0).
+     * Compare with `PyArray_NewFromDescr`, raise MemoryError for simplicity.
+     */
+    npy_bool empty = NPY_FALSE;
+    nbytes = 1;
+    for (int i = 0; i < nd; i++) {
+        if (dimensions[i] < 0) {
+            PyErr_SetString(PyExc_TypeError,
+                    "impossible dimension while unpickling array");
+            return NULL;
+        }
+        if (dimensions[i] == 0) {
+            empty = NPY_TRUE;
+        }
+        overflowed = npy_mul_with_overflow_intp(
+                &nbytes, nbytes, dimensions[i]);
+        if (overflowed) {
+            return PyErr_NoMemory();
+        }
     }
     overflowed = npy_mul_with_overflow_intp(
-        &nbytes, size, PyArray_DESCR(self)->elsize);
+            &nbytes, nbytes, PyArray_DESCR(self)->elsize);
     if (overflowed) {
-        /* More bytes than are addressable */
         return PyErr_NoMemory();
     }
+    if (empty) {
+        nbytes = 0;
+    }
 
     if (PyDataType_FLAGCHK(typecode, NPY_LIST_PICKLE)) {
         if (!PyList_Check(rawdata)) {
@@ -2028,15 +2057,25 @@ array_setstate(PyArrayObject *self, PyObject *args)
 
         if (len != nbytes) {
             PyErr_SetString(PyExc_ValueError,
-                            "buffer size does not"  \
-                            " match array size");
+                    "buffer size does not match array size");
             Py_DECREF(rawdata);
             return NULL;
         }
     }
 
     if ((PyArray_FLAGS(self) & NPY_ARRAY_OWNDATA)) {
-        PyDataMem_FREE(PyArray_DATA(self));
+        /*
+         * Allocation will never be 0, see comment in ctors.c
+         * line 820
+         */
+        PyObject *handler = PyArray_HANDLER(self);
+        if (handler == NULL) {
+            /* This can happen if someone arbitrarily sets NPY_ARRAY_OWNDATA */
+            PyErr_SetString(PyExc_RuntimeError,
+                            "no memory handler found but OWNDATA flag set");
+            return NULL;
+        }
+        PyDataMem_UserFREE(PyArray_DATA(self), n_tofree, handler);
         PyArray_CLEARFLAGS(self, NPY_ARRAY_OWNDATA);
     }
     Py_XDECREF(PyArray_BASE(self));
@@ -2072,17 +2111,21 @@ array_setstate(PyArrayObject *self, PyObject *args)
 
     if (!PyDataType_FLAGCHK(typecode, NPY_LIST_PICKLE)) {
         int swap = PyArray_ISBYTESWAPPED(self);
-        fa->data = datastr;
         /* Bytes should always be considered immutable, but we just grab the
          * pointer if they are large, to save memory. */
         if (!IsAligned(self) || swap || (len <= 1000)) {
-            npy_intp num = PyArray_NBYTES(self);
-            if (num == 0) {
+            npy_intp num = PyArray_NBYTES_ALLOCATED(self);
+            /* Store the handler in case the default is modified */
+            Py_XDECREF(fa->mem_handler);
+            fa->mem_handler = PyDataMem_GetHandler();
+            if (fa->mem_handler == NULL) {
+                Py_CLEAR(fa->mem_handler);
                 Py_DECREF(rawdata);
-                Py_RETURN_NONE;
+                return NULL;
             }
-            fa->data = PyDataMem_NEW(num);
+            fa->data = PyDataMem_UserNEW(num, PyArray_HANDLER(self));
             if (PyArray_DATA(self) == NULL) {
+                Py_CLEAR(fa->mem_handler);
                 Py_DECREF(rawdata);
                 return PyErr_NoMemory();
             }
@@ -2118,19 +2161,28 @@ array_setstate(PyArrayObject *self, PyObject *args)
             Py_DECREF(rawdata);
         }
         else {
+            /* The handlers should never be called in this case */
+            Py_XDECREF(fa->mem_handler);
+            fa->mem_handler = NULL;
+            fa->data = datastr;
             if (PyArray_SetBaseObject(self, rawdata) < 0) {
+                Py_DECREF(rawdata);
                 return NULL;
             }
         }
     }
     else {
-        npy_intp num = PyArray_NBYTES(self);
-        int elsize = PyArray_DESCR(self)->elsize;
-        if (num == 0 || elsize == 0) {
-            Py_RETURN_NONE;
+        npy_intp num = PyArray_NBYTES_ALLOCATED(self);
+
+        /* Store the functions in case the default handler is modified */
+        Py_XDECREF(fa->mem_handler);
+        fa->mem_handler = PyDataMem_GetHandler();
+        if (fa->mem_handler == NULL) {
+            return NULL;
         }
-        fa->data = PyDataMem_NEW(num);
+        fa->data = PyDataMem_UserNEW(num, PyArray_HANDLER(self));
         if (PyArray_DATA(self) == NULL) {
+            Py_CLEAR(fa->mem_handler);
             return PyErr_NoMemory();
         }
         if (PyDataType_FLAGCHK(PyArray_DESCR(self), NPY_NEEDS_INIT)) {
@@ -2204,7 +2256,7 @@ array_dumps(PyArrayObject *self, PyObject *args, PyObject *kwds)
 
 
 static PyObject *
-array_sizeof(PyArrayObject *self)
+array_sizeof(PyArrayObject *self, PyObject *NPY_UNUSED(args))
 {
     /* object + dimension and strides */
     Py_ssize_t nbytes = Py_TYPE(self)->tp_basicsize +
@@ -2694,6 +2746,30 @@ array_complex(PyArrayObject *self, PyObject *NPY_UNUSED(args))
     return c;
 }
 
+static PyObject *
+array_class_getitem(PyObject *cls, PyObject *args)
+{
+    PyObject *generic_alias;
+
+#ifdef Py_GENERICALIASOBJECT_H
+    Py_ssize_t args_len;
+
+    args_len = PyTuple_Check(args) ? PyTuple_Size(args) : 1;
+    if (args_len != 2) {
+        return PyErr_Format(PyExc_TypeError,
+                            "Too %s arguments for %s",
+                            args_len > 2 ? "many" : "few",
+                            ((PyTypeObject *)cls)->tp_name);
+    }
+    generic_alias = Py_GenericAlias(cls, args);
+#else
+    PyErr_SetString(PyExc_TypeError,
+                    "Type subscription requires python >= 3.9");
+    generic_alias = NULL;
+#endif
+    return generic_alias;
+}
+
 NPY_NO_EXPORT PyMethodDef array_methods[] = {
 
     /* for subtypes */
@@ -2751,6 +2827,11 @@ NPY_NO_EXPORT PyMethodDef array_methods[] = {
         (PyCFunction) array_format,
         METH_VARARGS, NULL},
 
+    /* for typing; requires python >= 3.9 */
+    {"__class_getitem__",
+        (PyCFunction)array_class_getitem,
+        METH_CLASS | METH_O, NULL},
+
     /* Original and Extended methods added 2005 */
     {"all",
         (PyCFunction)array_all,
@@ -2914,5 +2995,13 @@ NPY_NO_EXPORT PyMethodDef array_methods[] = {
     {"view",
         (PyCFunction)array_view,
         METH_FASTCALL | METH_KEYWORDS, NULL},
+    // For data interchange between libraries
+    {"__dlpack__",
+        (PyCFunction)array_dlpack,
+        METH_FASTCALL | METH_KEYWORDS, NULL},
+
+    {"__dlpack_device__",
+        (PyCFunction)array_dlpack_device,
+        METH_NOARGS, NULL},
     {NULL, NULL, 0, NULL}           /* sentinel */
 };
index c0de23c35601322553d41ce112368a88cb5c21e1..bcada0fea89723f73f8c74ff23909f39a94e358c 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ARRAY_METHODS_H_
-#define _NPY_ARRAY_METHODS_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_METHODS_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_METHODS_H_
 
 #include "npy_import.h"
 
@@ -31,4 +31,4 @@ NpyPath_PathlikeToFspath(PyObject *file)
     return PyObject_CallFunctionObjArgs(os_fspath, file, NULL);
 }
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_METHODS_H_ */
index bc5194483c06a7efc7729708cbb2f85da7be7561..576c39f5d9ec6d20cdde375a142c7f9244129eab 100644 (file)
   oliphant@ee.byu.edu
   Brigham Young University
 */
-
-/* $Id: multiarraymodule.c,v 1.36 2005/09/14 00:14:00 teoliphant Exp $ */
-
-#define PY_SSIZE_T_CLEAN
-#include "Python.h"
-#include "structmember.h"
-
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _UMATHMODULE
 #define _MULTIARRAYMODULE
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+#include <structmember.h>
+
 #include <numpy/npy_common.h>
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
@@ -70,6 +68,9 @@ NPY_NO_EXPORT int NPY_NUMUSERTYPES = 0;
 #include "typeinfo.h"
 
 #include "get_attr_string.h"
+#include "experimental_public_dtype_api.h"  /* _get_experimental_dtype_api */
+
+#include "npy_dlpack.h"
 
 /*
  *****************************************************************************
@@ -84,11 +85,12 @@ NPY_NO_EXPORT int set_matmul_flags(PyObject *d); /* in ufunc_object.c */
 
 /*
  * global variable to determine if legacy printing is enabled, accessible from
- * C. For simplicity the mode is encoded as an integer where '0' means no
- * legacy mode, and '113' means 1.13 legacy mode. We can upgrade this if we
- * have more complex requirements in the future.
+ * C. For simplicity the mode is encoded as an integer where INT_MAX means no
+ * legacy mode, and '113'/'121' means 1.13/1.21 legacy mode; and 0 maps to
+ * INT_MAX. We can upgrade this if we have more complex requirements in the
+ * future.
  */
-int npy_legacy_print_mode = 0;
+int npy_legacy_print_mode = INT_MAX;
 
 static PyObject *
 set_legacy_print_mode(PyObject *NPY_UNUSED(self), PyObject *args)
@@ -96,6 +98,9 @@ set_legacy_print_mode(PyObject *NPY_UNUSED(self), PyObject *args)
     if (!PyArg_ParseTuple(args, "i", &npy_legacy_print_mode)) {
         return NULL;
     }
+    if (!npy_legacy_print_mode) {
+        npy_legacy_print_mode = INT_MAX;
+    }
     Py_RETURN_NONE;
 }
 
@@ -1575,7 +1580,7 @@ _prepend_ones(PyArrayObject *arr, int nd, int ndmin, NPY_ORDER order)
 
 static NPY_INLINE PyObject *
 _array_fromobject_generic(
-        PyObject *op, PyArray_Descr *type, npy_bool copy, NPY_ORDER order,
+        PyObject *op, PyArray_Descr *type, _PyArray_CopyMode copy, NPY_ORDER order,
         npy_bool subok, int ndmin)
 {
     PyArrayObject *oparr = NULL, *ret = NULL;
@@ -1592,12 +1597,17 @@ _array_fromobject_generic(
     if (PyArray_CheckExact(op) || (subok && PyArray_Check(op))) {
         oparr = (PyArrayObject *)op;
         if (type == NULL) {
-            if (!copy && STRIDING_OK(oparr, order)) {
+            if (copy != NPY_COPY_ALWAYS && STRIDING_OK(oparr, order)) {
                 ret = oparr;
                 Py_INCREF(ret);
                 goto finish;
             }
             else {
+                if (copy == NPY_COPY_NEVER) {
+                    PyErr_SetString(PyExc_ValueError,
+                            "Unable to avoid copy while creating a new array.");
+                    return NULL;
+                }
                 ret = (PyArrayObject *)PyArray_NewCopy(oparr, order);
                 goto finish;
             }
@@ -1605,12 +1615,17 @@ _array_fromobject_generic(
         /* One more chance */
         oldtype = PyArray_DESCR(oparr);
         if (PyArray_EquivTypes(oldtype, type)) {
-            if (!copy && STRIDING_OK(oparr, order)) {
+            if (copy != NPY_COPY_ALWAYS && STRIDING_OK(oparr, order)) {
                 Py_INCREF(op);
                 ret = oparr;
                 goto finish;
             }
             else {
+                if (copy == NPY_COPY_NEVER) {
+                    PyErr_SetString(PyExc_ValueError,
+                            "Unable to avoid copy while creating a new array.");
+                    return NULL;
+                }
                 ret = (PyArrayObject *)PyArray_NewCopy(oparr, order);
                 if (oldtype == type || ret == NULL) {
                     goto finish;
@@ -1623,9 +1638,12 @@ _array_fromobject_generic(
         }
     }
 
-    if (copy) {
+    if (copy == NPY_COPY_ALWAYS) {
         flags = NPY_ARRAY_ENSURECOPY;
     }
+    else if (copy == NPY_COPY_NEVER ) {
+        flags = NPY_ARRAY_ENSURENOCOPY;
+    }
     if (order == NPY_CORDER) {
         flags |= NPY_ARRAY_C_CONTIGUOUS;
     }
@@ -1669,7 +1687,7 @@ array_array(PyObject *NPY_UNUSED(ignored),
 {
     PyObject *op;
     npy_bool subok = NPY_FALSE;
-    npy_bool copy = NPY_TRUE;
+    _PyArray_CopyMode copy = NPY_COPY_ALWAYS;
     int ndmin = 0;
     PyArray_Descr *type = NULL;
     NPY_ORDER order = NPY_KEEPORDER;
@@ -1680,7 +1698,7 @@ array_array(PyObject *NPY_UNUSED(ignored),
         if (npy_parse_arguments("array", args, len_args, kwnames,
                 "object", NULL, &op,
                 "|dtype", &PyArray_DescrConverter2, &type,
-                "$copy", &PyArray_BoolConverter, &copy,
+                "$copy", &PyArray_CopyConverter, &copy,
                 "$order", &PyArray_OrderConverter, &order,
                 "$subok", &PyArray_BoolConverter, &subok,
                 "$ndmin", &PyArray_PythonPyIntFromInt, &ndmin,
@@ -2288,7 +2306,7 @@ array_fromfile(PyObject *NPY_UNUSED(ignored), PyObject *args, PyObject *keywds)
         return NULL;
     }
     if (npy_fseek(fp, offset, SEEK_CUR) != 0) {
-        PyErr_SetFromErrno(PyExc_IOError);
+        PyErr_SetFromErrno(PyExc_OSError);
         goto cleanup;
     }
     if (type == NULL) {
@@ -4212,7 +4230,7 @@ normalize_axis_index(PyObject *NPY_UNUSED(self),
 
 
 static PyObject *
-_reload_guard(PyObject *NPY_UNUSED(self)) {
+_reload_guard(PyObject *NPY_UNUSED(self), PyObject *NPY_UNUSED(args)) {
     static int initialized = 0;
 
 #if !defined(PYPY_VERSION)
@@ -4246,7 +4264,6 @@ _reload_guard(PyObject *NPY_UNUSED(self)) {
     Py_RETURN_NONE;
 }
 
-
 static struct PyMethodDef array_module_methods[] = {
     {"_get_implementing_args",
         (PyCFunction)array__get_implementing_args,
@@ -4435,7 +4452,9 @@ static struct PyMethodDef array_module_methods[] = {
     {"_discover_array_parameters", (PyCFunction)_discover_array_parameters,
         METH_VARARGS | METH_KEYWORDS, NULL},
     {"_get_castingimpl",  (PyCFunction)_get_castingimpl,
-     METH_VARARGS | METH_KEYWORDS, NULL},
+        METH_VARARGS | METH_KEYWORDS, NULL},
+    {"_get_experimental_dtype_api", (PyCFunction)_get_experimental_dtype_api,
+        METH_O, NULL},
     /* from umath */
     {"frompyfunc",
         (PyCFunction) ufunc_frompyfunc,
@@ -4446,13 +4465,23 @@ static struct PyMethodDef array_module_methods[] = {
     {"geterrobj",
         (PyCFunction) ufunc_geterr,
         METH_VARARGS, NULL},
+    {"get_handler_name",
+        (PyCFunction) get_handler_name,
+        METH_VARARGS, NULL},
+    {"get_handler_version",
+        (PyCFunction) get_handler_version,
+        METH_VARARGS, NULL},
     {"_add_newdoc_ufunc", (PyCFunction)add_newdoc_ufunc,
         METH_VARARGS, NULL},
+    {"_get_sfloat_dtype",
+        get_sfloat_dtype, METH_NOARGS, NULL},
     {"_set_madvise_hugepage", (PyCFunction)_set_madvise_hugepage,
         METH_O, NULL},
     {"_reload_guard", (PyCFunction)_reload_guard,
         METH_NOARGS,
         "Give a warning on reload and big warning in sub-interpreters."},
+    {"_from_dlpack", (PyCFunction)_from_dlpack,
+        METH_O, NULL},
     {NULL, NULL, 0, NULL}                /* sentinel */
 };
 
@@ -4624,16 +4653,9 @@ set_flaginfo(PyObject *d)
     return;
 }
 
-NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_array = NULL;
-NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_array_prepare = NULL;
 NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_array_wrap = NULL;
 NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_array_finalize = NULL;
-NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_ufunc = NULL;
 NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_implementation = NULL;
-NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_order = NULL;
-NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_copy = NULL;
-NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_dtype = NULL;
-NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_ndmin = NULL;
 NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_axis1 = NULL;
 NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_axis2 = NULL;
 NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_like = NULL;
@@ -4642,27 +4664,35 @@ NPY_VISIBILITY_HIDDEN PyObject * npy_ma_str_numpy = NULL;
 static int
 intern_strings(void)
 {
-    npy_ma_str_array = PyUnicode_InternFromString("__array__");
-    npy_ma_str_array_prepare = PyUnicode_InternFromString("__array_prepare__");
     npy_ma_str_array_wrap = PyUnicode_InternFromString("__array_wrap__");
+    if (npy_ma_str_array_wrap == NULL) {
+        return -1;
+    }
     npy_ma_str_array_finalize = PyUnicode_InternFromString("__array_finalize__");
-    npy_ma_str_ufunc = PyUnicode_InternFromString("__array_ufunc__");
+    if (npy_ma_str_array_finalize == NULL) {
+        return -1;
+    }
     npy_ma_str_implementation = PyUnicode_InternFromString("_implementation");
-    npy_ma_str_order = PyUnicode_InternFromString("order");
-    npy_ma_str_copy = PyUnicode_InternFromString("copy");
-    npy_ma_str_dtype = PyUnicode_InternFromString("dtype");
-    npy_ma_str_ndmin = PyUnicode_InternFromString("ndmin");
+    if (npy_ma_str_implementation == NULL) {
+        return -1;
+    }
     npy_ma_str_axis1 = PyUnicode_InternFromString("axis1");
+    if (npy_ma_str_axis1 == NULL) {
+        return -1;
+    }
     npy_ma_str_axis2 = PyUnicode_InternFromString("axis2");
+    if (npy_ma_str_axis2 == NULL) {
+        return -1;
+    }
     npy_ma_str_like = PyUnicode_InternFromString("like");
+    if (npy_ma_str_like == NULL) {
+        return -1;
+    }
     npy_ma_str_numpy = PyUnicode_InternFromString("numpy");
-
-    return npy_ma_str_array && npy_ma_str_array_prepare &&
-           npy_ma_str_array_wrap && npy_ma_str_array_finalize &&
-           npy_ma_str_ufunc && npy_ma_str_implementation &&
-           npy_ma_str_order && npy_ma_str_copy && npy_ma_str_dtype &&
-           npy_ma_str_ndmin && npy_ma_str_axis1 && npy_ma_str_axis2 &&
-           npy_ma_str_like && npy_ma_str_numpy;
+    if (npy_ma_str_numpy == NULL) {
+        return -1;
+    }
+    return 0;
 }
 
 static struct PyModuleDef moduledef = {
@@ -4682,14 +4712,14 @@ PyMODINIT_FUNC PyInit__multiarray_umath(void) {
     PyObject *m, *d, *s;
     PyObject *c_api;
 
-    /* Initialize CPU features */
-    if (npy_cpu_init() < 0) {
-        goto err;
-    }
-
     /* Create the module and add the functions */
     m = PyModule_Create(&moduledef);
     if (!m) {
+        return NULL;
+    }
+
+    /* Initialize CPU features */
+    if (npy_cpu_init() < 0) {
         goto err;
     }
 
@@ -4719,15 +4749,6 @@ PyMODINIT_FUNC PyInit__multiarray_umath(void) {
         goto err;
     }
 
-    /* Load the ufunc operators into the array module's namespace */
-    if (InitOperators(d) < 0) {
-        goto err;
-    }
-
-    if (set_matmul_flags(d) < 0) {
-        goto err;
-    }
-
     PyArrayDTypeMeta_Type.tp_base = &PyType_Type;
     if (PyType_Ready(&PyArrayDTypeMeta_Type) < 0) {
         goto err;
@@ -4741,6 +4762,7 @@ PyMODINIT_FUNC PyInit__multiarray_umath(void) {
 
     initialize_casting_tables();
     initialize_numeric_types();
+
     if (initscalarmath(m) < 0) {
         goto err;
     }
@@ -4751,6 +4773,7 @@ PyMODINIT_FUNC PyInit__multiarray_umath(void) {
     if (setup_scalartypes(d) < 0) {
         goto err;
     }
+
     PyArrayIter_Type.tp_iter = PyObject_SelfIter;
     NpyIter_Type.tp_iter = PyObject_SelfIter;
     PyArrayMultiIter_Type.tp_iter = PyObject_SelfIter;
@@ -4894,7 +4917,7 @@ PyMODINIT_FUNC PyInit__multiarray_umath(void) {
         goto err;
     }
 
-    if (!intern_strings()) {
+    if (intern_strings() < 0) {
         goto err;
     }
 
@@ -4915,9 +4938,35 @@ PyMODINIT_FUNC PyInit__multiarray_umath(void) {
         goto err;
     }
 
+    /* Load the ufunc operators into the array module's namespace */
+    if (InitOperators(d) < 0) {
+        goto err;
+    }
+
+    if (set_matmul_flags(d) < 0) {
+        goto err;
+    }
+
     if (initumath(m) != 0) {
         goto err;
     }
+    /*
+     * Initialize the default PyDataMem_Handler capsule singleton.
+     */
+    PyDataMem_DefaultHandler = PyCapsule_New(&default_handler, "mem_handler", NULL);
+    if (PyDataMem_DefaultHandler == NULL) {
+        goto err;
+    }
+#if (!defined(PYPY_VERSION_NUM) || PYPY_VERSION_NUM >= 0x07030600)
+    /*
+     * Initialize the context-local current handler
+     * with the default PyDataMem_Handler capsule.
+    */
+    current_handler = PyContextVar_New("current_allocator", PyDataMem_DefaultHandler);
+    if (current_handler == NULL) {
+        goto err;
+    }
+#endif
     return m;
 
  err:
@@ -4925,5 +4974,6 @@ PyMODINIT_FUNC PyInit__multiarray_umath(void) {
         PyErr_SetString(PyExc_RuntimeError,
                         "cannot load multiarray module.");
     }
+    Py_DECREF(m);
     return NULL;
 }
index d3ee3337c25a345401864016d0648e2edd79a142..640940d2a9787bad69f6a23848ae6ed25be8669d 100644 (file)
@@ -1,19 +1,12 @@
-#ifndef _NPY_MULTIARRAY_H_
-#define _NPY_MULTIARRAY_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_MULTIARRAYMODULE_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_MULTIARRAYMODULE_H_
 
-NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_array;
-NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_array_prepare;
 NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_array_wrap;
 NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_array_finalize;
-NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_ufunc;
 NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_implementation;
-NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_order;
-NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_copy;
-NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_dtype;
-NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_ndmin;
 NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_axis1;
 NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_axis2;
 NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_like;
 NPY_VISIBILITY_HIDDEN extern PyObject * npy_ma_str_numpy;
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_MULTIARRAYMODULE_H_ */
index a1ca5bff51d4c604983c8bf478b3d78dd2abeff9..860c8c1f65fa93dc1590b2010329aae2560a1e45 100644 (file)
@@ -11,8 +11,9 @@
  */
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 
-/* Indicate that this .c file is allowed to include the header */
+/* Allow this .c file to include nditer_impl.h */
 #define NPY_ITERATOR_IMPLEMENTATION_CODE
+
 #include "nditer_impl.h"
 #include "templ_common.h"
 #include "ctors.h"
@@ -115,7 +116,7 @@ NpyIter_RemoveAxis(NpyIter *iter, int axis)
                 --p;
             }
         }
-        else if (p <= 0) {
+        else {
             if (p < -1-axis) {
                 ++p;
             }
@@ -2129,7 +2130,7 @@ npyiter_copy_to_buffers(NpyIter *iter, char **prev_dataptrs)
         /*
          * Try to do make the outersize as big as possible. This allows
          * it to shrink when processing the last bit of the outer reduce loop,
-         * then grow again at the beginnning of the next outer reduce loop.
+         * then grow again at the beginning of the next outer reduce loop.
          */
         NBF_REDUCE_OUTERSIZE(bufferdata) = (NAD_SHAPE(reduce_outeraxisdata)-
                                             NAD_INDEX(reduce_outeraxisdata));
@@ -2803,9 +2804,9 @@ npyiter_checkreducesize(NpyIter *iter, npy_intp count,
     if (coord != 0) {
         /*
          * In this case, it is only safe to reuse the buffer if the amount
-         * of data copied is not more then the current axes, as is the
+         * of data copied is not more than the current axes, as is the
          * case when reuse_reduce_loops was active already.
-         * It should be in principle OK when the idim loop returns immidiatly.
+         * It should be in principle OK when the idim loop returns immediately.
          */
         NIT_ITFLAGS(iter) &= ~NPY_ITFLAG_REUSE_REDUCE_LOOPS;
     }
index a0154e4744f63bd8d8162ea5dcd385b2ef37f4c9..bf32e1f6b706a6246c95f2194f5c52049b731fd2 100644 (file)
  */
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 
-/* Indicate that this .c file is allowed to include the header */
+/* Allow this .c file to include nditer_impl.h */
 #define NPY_ITERATOR_IMPLEMENTATION_CODE
-#include "nditer_impl.h"
 
+#include "nditer_impl.h"
 #include "arrayobject.h"
 #include "array_coercion.h"
 #include "templ_common.h"
@@ -449,6 +449,11 @@ NpyIter_AdvancedNew(int nop, PyArrayObject **op_in, npy_uint32 flags,
     /*
      * If REFS_OK was specified, check whether there are any
      * reference arrays and flag it if so.
+     *
+     * NOTE: This really should be unnecessary, but chances are someone relies
+     *       on it.  The iterator itself does not require the API here
+     *       as it only does so for casting/buffering.  But in almost all
+     *       use-cases the API will be required for whatever operation is done.
      */
     if (flags & NPY_ITER_REFS_OK) {
         for (iop = 0; iop < nop; ++iop) {
@@ -1400,7 +1405,7 @@ check_mask_for_writemasked_reduction(NpyIter *iter, int iop)
 /*
  * Check whether a reduction is OK based on the flags and the operand being
  * readwrite. This path is deprecated, since usually only specific axes
- * should be reduced. If axes are specified explicitely, the flag is
+ * should be reduced. If axes are specified explicitly, the flag is
  * unnecessary.
  */
 static int
index a5a9177e5f97d227a1b0fec2215c00f4e3a9a3f6..2a82b7e5410d84437a025c89b8ddd14d5e3e5dc3 100644 (file)
@@ -4,20 +4,21 @@
  * should use the exposed iterator API.
  */
 #ifndef NPY_ITERATOR_IMPLEMENTATION_CODE
-#error "This header is intended for use ONLY by iterator implementation code."
+#error This header is intended for use ONLY by iterator implementation code.
 #endif
 
-#ifndef _NPY_PRIVATE__NDITER_IMPL_H_
-#define _NPY_PRIVATE__NDITER_IMPL_H_
-
-#define PY_SSIZE_T_CLEAN
-#include "Python.h"
-#include "structmember.h"
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_NDITER_IMPL_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_NDITER_IMPL_H_
 
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
-#include <numpy/arrayobject.h>
-#include <npy_pycompat.h>
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+#include <structmember.h>
+
+#include "numpy/arrayobject.h"
+#include "npy_pycompat.h"
 #include "convert_datatype.h"
 
 #include "lowlevel_strided_loops.h"
@@ -288,7 +289,7 @@ struct NpyIter_AxisData_tag {
         1 + \
         /* intp stride[nop+1] AND char* ptr[nop+1] */ \
         2*((nop)+1) \
-        )*NPY_SIZEOF_INTP )
+        )*(size_t)NPY_SIZEOF_INTP)
 
 /*
  * Macro to advance an AXISDATA pointer by a specified count.
@@ -355,4 +356,4 @@ npyiter_copy_to_buffers(NpyIter *iter, char **prev_dataptrs);
 NPY_NO_EXPORT void
 npyiter_clear_buffers(NpyIter *iter);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_NDITER_IMPL_H_ */
index 73df962e4520bdab43e072e002a4ce57b35f9d06..2675496ab4d6f9871438d6713e2ea3da739dfd35 100644 (file)
@@ -6,13 +6,14 @@
  *
  * See LICENSE.txt for the license.
  */
-#define PY_SSIZE_T_CLEAN
-#include "Python.h"
-#include "structmember.h"
-
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
-#include <numpy/arrayobject.h>
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+#include <structmember.h>
+
+#include "numpy/arrayobject.h"
 #include "npy_config.h"
 #include "npy_pycompat.h"
 #include "alloc.h"
@@ -1189,7 +1190,7 @@ npyiter_resetbasepointers(NewNpyArrayIterObject *self)
 }
 
 static PyObject *
-npyiter_reset(NewNpyArrayIterObject *self)
+npyiter_reset(NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
 {
     if (self->iter == NULL) {
         PyErr_SetString(PyExc_ValueError,
@@ -1226,7 +1227,7 @@ npyiter_reset(NewNpyArrayIterObject *self)
  * copied.
  */
 static PyObject *
-npyiter_copy(NewNpyArrayIterObject *self)
+npyiter_copy(NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
 {
     NewNpyArrayIterObject *iter;
 
@@ -1262,7 +1263,7 @@ npyiter_copy(NewNpyArrayIterObject *self)
 }
 
 static PyObject *
-npyiter_iternext(NewNpyArrayIterObject *self)
+npyiter_iternext(NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
 {
     if (self->iter != NULL && self->iternext != NULL &&
                         !self->finished && self->iternext(self->iter)) {
@@ -1319,7 +1320,8 @@ npyiter_remove_axis(NewNpyArrayIterObject *self, PyObject *args)
 }
 
 static PyObject *
-npyiter_remove_multi_index(NewNpyArrayIterObject *self)
+npyiter_remove_multi_index(
+    NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
 {
     if (self->iter == NULL) {
         PyErr_SetString(PyExc_ValueError,
@@ -1344,7 +1346,8 @@ npyiter_remove_multi_index(NewNpyArrayIterObject *self)
 }
 
 static PyObject *
-npyiter_enable_external_loop(NewNpyArrayIterObject *self)
+npyiter_enable_external_loop(
+    NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
 {
     if (self->iter == NULL) {
         PyErr_SetString(PyExc_ValueError,
@@ -1369,7 +1372,7 @@ npyiter_enable_external_loop(NewNpyArrayIterObject *self)
 }
 
 static PyObject *
-npyiter_debug_print(NewNpyArrayIterObject *self)
+npyiter_debug_print(NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
 {
     if (self->iter != NULL) {
         NpyIter_DebugPrint(self->iter);
@@ -1384,7 +1387,8 @@ npyiter_debug_print(NewNpyArrayIterObject *self)
 NPY_NO_EXPORT PyObject *
 npyiter_seq_item(NewNpyArrayIterObject *self, Py_ssize_t i);
 
-static PyObject *npyiter_value_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_value_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *ret;
 
@@ -1420,7 +1424,8 @@ static PyObject *npyiter_value_get(NewNpyArrayIterObject *self)
     return ret;
 }
 
-static PyObject *npyiter_operands_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_operands_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *ret;
 
@@ -1449,7 +1454,8 @@ static PyObject *npyiter_operands_get(NewNpyArrayIterObject *self)
     return ret;
 }
 
-static PyObject *npyiter_itviews_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_itviews_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *ret;
 
@@ -1508,10 +1514,11 @@ npyiter_next(NewNpyArrayIterObject *self)
     }
     self->started = 1;
 
-    return npyiter_value_get(self);
+    return npyiter_value_get(self, NULL);
 };
 
-static PyObject *npyiter_shape_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_shape_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     npy_intp ndim, shape[NPY_MAXDIMS];
 
@@ -1529,7 +1536,8 @@ static PyObject *npyiter_shape_get(NewNpyArrayIterObject *self)
     return NULL;
 }
 
-static PyObject *npyiter_multi_index_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_multi_index_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     npy_intp ndim, multi_index[NPY_MAXDIMS];
 
@@ -1565,7 +1573,8 @@ static PyObject *npyiter_multi_index_get(NewNpyArrayIterObject *self)
 }
 
 static int
-npyiter_multi_index_set(NewNpyArrayIterObject *self, PyObject *value)
+npyiter_multi_index_set(
+        NewNpyArrayIterObject *self, PyObject *value, void *NPY_UNUSED(ignored))
 {
     npy_intp idim, ndim, multi_index[NPY_MAXDIMS];
 
@@ -1620,7 +1629,8 @@ npyiter_multi_index_set(NewNpyArrayIterObject *self, PyObject *value)
     }
 }
 
-static PyObject *npyiter_index_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_index_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     if (self->iter == NULL || self->finished) {
         PyErr_SetString(PyExc_ValueError,
@@ -1639,7 +1649,9 @@ static PyObject *npyiter_index_get(NewNpyArrayIterObject *self)
     }
 }
 
-static int npyiter_index_set(NewNpyArrayIterObject *self, PyObject *value)
+static int
+npyiter_index_set(
+        NewNpyArrayIterObject *self, PyObject *value, void *NPY_UNUSED(ignored))
 {
     if (value == NULL) {
         PyErr_SetString(PyExc_AttributeError,
@@ -1678,7 +1690,8 @@ static int npyiter_index_set(NewNpyArrayIterObject *self, PyObject *value)
     }
 }
 
-static PyObject *npyiter_iterindex_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_iterindex_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     if (self->iter == NULL || self->finished) {
         PyErr_SetString(PyExc_ValueError,
@@ -1689,7 +1702,9 @@ static PyObject *npyiter_iterindex_get(NewNpyArrayIterObject *self)
     return PyLong_FromLong(NpyIter_GetIterIndex(self->iter));
 }
 
-static int npyiter_iterindex_set(NewNpyArrayIterObject *self, PyObject *value)
+static int
+npyiter_iterindex_set(
+        NewNpyArrayIterObject *self, PyObject *value, void *NPY_UNUSED(ignored))
 {
     npy_intp iterindex;
 
@@ -1722,7 +1737,8 @@ static int npyiter_iterindex_set(NewNpyArrayIterObject *self, PyObject *value)
     return 0;
 }
 
-static PyObject *npyiter_iterrange_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_iterrange_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     npy_intp istart = 0, iend = 0;
     PyObject *ret;
@@ -1746,7 +1762,9 @@ static PyObject *npyiter_iterrange_get(NewNpyArrayIterObject *self)
     return ret;
 }
 
-static int npyiter_iterrange_set(NewNpyArrayIterObject *self, PyObject *value)
+static int
+npyiter_iterrange_set(
+        NewNpyArrayIterObject *self, PyObject *value, void *NPY_UNUSED(ignored))
 {
     npy_intp istart = 0, iend = 0;
 
@@ -1788,7 +1806,9 @@ static int npyiter_iterrange_set(NewNpyArrayIterObject *self, PyObject *value)
     return 0;
 }
 
-static PyObject *npyiter_has_delayed_bufalloc_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_has_delayed_bufalloc_get(
+        NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     if (self->iter == NULL) {
         PyErr_SetString(PyExc_ValueError,
@@ -1804,7 +1824,9 @@ static PyObject *npyiter_has_delayed_bufalloc_get(NewNpyArrayIterObject *self)
     }
 }
 
-static PyObject *npyiter_iterationneedsapi_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_iterationneedsapi_get(
+        NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     if (self->iter == NULL) {
         PyErr_SetString(PyExc_ValueError,
@@ -1820,7 +1842,9 @@ static PyObject *npyiter_iterationneedsapi_get(NewNpyArrayIterObject *self)
     }
 }
 
-static PyObject *npyiter_has_multi_index_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_has_multi_index_get(
+        NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     if (self->iter == NULL) {
         PyErr_SetString(PyExc_ValueError,
@@ -1836,7 +1860,8 @@ static PyObject *npyiter_has_multi_index_get(NewNpyArrayIterObject *self)
     }
 }
 
-static PyObject *npyiter_has_index_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_has_index_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     if (self->iter == NULL) {
         PyErr_SetString(PyExc_ValueError,
@@ -1852,7 +1877,8 @@ static PyObject *npyiter_has_index_get(NewNpyArrayIterObject *self)
     }
 }
 
-static PyObject *npyiter_dtypes_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_dtypes_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *ret;
 
@@ -1881,7 +1907,8 @@ static PyObject *npyiter_dtypes_get(NewNpyArrayIterObject *self)
     return ret;
 }
 
-static PyObject *npyiter_ndim_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_ndim_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     if (self->iter == NULL) {
         PyErr_SetString(PyExc_ValueError,
@@ -1892,7 +1919,8 @@ static PyObject *npyiter_ndim_get(NewNpyArrayIterObject *self)
     return PyLong_FromLong(NpyIter_GetNDim(self->iter));
 }
 
-static PyObject *npyiter_nop_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_nop_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     if (self->iter == NULL) {
         PyErr_SetString(PyExc_ValueError,
@@ -1903,7 +1931,8 @@ static PyObject *npyiter_nop_get(NewNpyArrayIterObject *self)
     return PyLong_FromLong(NpyIter_GetNOp(self->iter));
 }
 
-static PyObject *npyiter_itersize_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_itersize_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     if (self->iter == NULL) {
         PyErr_SetString(PyExc_ValueError,
@@ -1914,7 +1943,8 @@ static PyObject *npyiter_itersize_get(NewNpyArrayIterObject *self)
     return PyLong_FromLong(NpyIter_GetIterSize(self->iter));
 }
 
-static PyObject *npyiter_finished_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_finished_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
 {
     if (self->iter == NULL || !self->finished) {
         Py_RETURN_FALSE;
@@ -2287,7 +2317,7 @@ npyiter_ass_subscript(NewNpyArrayIterObject *self, PyObject *op,
 }
 
 static PyObject *
-npyiter_enter(NewNpyArrayIterObject *self)
+npyiter_enter(NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
 {
     if (self->iter == NULL) {
         PyErr_SetString(PyExc_RuntimeError, "operation on non-initialized iterator");
@@ -2298,7 +2328,7 @@ npyiter_enter(NewNpyArrayIterObject *self)
 }
 
 static PyObject *
-npyiter_close(NewNpyArrayIterObject *self)
+npyiter_close(NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
 {
     NpyIter *iter = self->iter;
     int ret;
@@ -2319,7 +2349,7 @@ static PyObject *
 npyiter_exit(NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
 {
     /* even if called via exception handling, writeback any data */
-    return npyiter_close(self);
+    return npyiter_close(self, NULL);
 }
 
 static PyMethodDef npyiter_methods[] = {
index 49eb5d89de00d2884e78e032ca28c45acd8f1d1b..d2fcafebd94f634c63bbc8efa692b603888249f5 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef __NDITER_PYWRAP_H
-#define __NDITER_PYWRAP_H
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_NDITER_PYWRAP_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_NDITER_PYWRAP_H_
 
 NPY_NO_EXPORT PyObject *
 NpyIter_NestedIters(PyObject *NPY_UNUSED(self),
                     PyObject *args, PyObject *kwds);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_NDITER_PYWRAP_H_ */
index 05ce6ae753137d85d06b38978d87fb84221a3bf6..3f91a482b461e8759edfe01d465ca9102196d690 100644 (file)
@@ -132,7 +132,7 @@ npyiter_iternext_itflags@tag_itflags@_dims@tag_ndim@_iters@tag_nop@(
         /* Reset the 1st and 2nd indices to 0 */
         NAD_INDEX(axisdata0) = 0;
         NAD_INDEX(axisdata1) = 0;
-        /* Reset the 1st and 2nd pointers to the value of the 3nd */
+        /* Reset the 1st and 2nd pointers to the value of the 3rd */
         for (istrides = 0; istrides < nstrides; ++istrides) {
             NAD_PTRS(axisdata0)[istrides] = NAD_PTRS(axisdata2)[istrides];
             NAD_PTRS(axisdata1)[istrides] = NAD_PTRS(axisdata2)[istrides];
index d10f1a020446f50b5f9a3fa07b1e65bfd6449de3..62e08573c74d489958478cea19b0cd97bff51dce 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_PRIVATE_BUFFER_H_
-#define _NPY_PRIVATE_BUFFER_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_NPY_BUFFER_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_NPY_BUFFER_H_
 
 extern NPY_NO_EXPORT PyBufferProcs array_as_buffer;
 
@@ -12,4 +12,4 @@ _descriptor_from_pep3118_format(char const *s);
 NPY_NO_EXPORT int
 void_getbuffer(PyObject *obj, Py_buffer *view, int flags);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_NPY_BUFFER_H_ */
index a6277674877575b43fdd151cccc7e248e07ed255..292ef55a630fc5a50f15065d8d2e77c3747bcdd1 100644 (file)
@@ -1,10 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-/*#include <stdio.h>*/
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 
 #include "npy_config.h"
@@ -429,6 +429,7 @@ is_scalar_with_conversion(PyObject *o2, double* out_exponent)
             return NPY_NOSCALAR;
         }
         val = PyLong_AsSsize_t(value);
+        Py_DECREF(value);
         if (error_converting(val)) {
             PyErr_Clear();
             return NPY_NOSCALAR;
index 4f426f964ca75842e4f0b8126324a4474f3de05e..054840305103bc629fcb6c0dcdd8ade8cb33b860 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ARRAY_NUMBER_H_
-#define _NPY_ARRAY_NUMBER_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_NUMBER_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_NUMBER_H_
 
 typedef struct {
     PyObject *add;
@@ -69,4 +69,4 @@ NPY_NO_EXPORT PyObject *
 PyArray_GenericAccumulateFunction(PyArrayObject *m1, PyObject *op, int axis,
                                   int rtype, PyArrayObject *out);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_NUMBER_H_ */
index 41dd059b0ac15ee08edc3027ef44ffd351ea865c..a1c310700fa927487dfa39600f2be41a3c1543c3 100644 (file)
@@ -2,13 +2,13 @@
  * This module corresponds to the `Special functions for NPY_OBJECT`
  * section in the numpy reference for C-API.
  */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 #include "iterators.h"
index 761d53dd0d79fc83279090e5066da09e2ed659c4..959eef5bacfef64a3dd827e7d874549bb0790669 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_PRIVATE_REFCOUNT_H_
-#define _NPY_PRIVATE_REFCOUNT_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_REFCOUNT_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_REFCOUNT_H_
 
 NPY_NO_EXPORT void
 PyArray_Item_INCREF(char *data, PyArray_Descr *descr);
@@ -16,4 +16,4 @@ PyArray_XDECREF(PyArrayObject *mp);
 NPY_NO_EXPORT void
 PyArray_FillObjectArray(PyArrayObject *arr, PyObject *obj);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_REFCOUNT_H_ */
index 0e93cbbe9f575adabbb9af21bc7b7a7fd0dc65fa..564352f1fd3f42e64e81bf89b421a6575dfb2c8e 100644 (file)
@@ -1,9 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 
@@ -232,8 +233,12 @@ PyArray_CastScalarToCtype(PyObject *scalar, void *ctypeptr,
     PyArray_VectorUnaryFunc* castfunc;
 
     descr = PyArray_DescrFromScalar(scalar);
+    if (descr == NULL) {
+        return -1;
+    }
     castfunc = PyArray_GetCastFunc(descr, outcode->type_num);
     if (castfunc == NULL) {
+        Py_DECREF(descr);
         return -1;
     }
     if (PyTypeNum_ISEXTENDED(descr->type_num) ||
@@ -253,6 +258,7 @@ PyArray_CastScalarToCtype(PyObject *scalar, void *ctypeptr,
                     NPY_ARRAY_CARRAY, NULL);
         if (aout == NULL) {
             Py_DECREF(ain);
+            Py_DECREF(descr);
             return -1;
         }
         castfunc(PyArray_DATA(ain), PyArray_DATA(aout), 1, ain, aout);
index 9930f7791d6e8b7a926116dbdef4b968d17d9af5..013526ff0c3e841af2d7b53b7f829ed7eeecf45f 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- c -*- */
 #define PY_SSIZE_T_CLEAN
-#include "Python.h"
-#include "structmember.h"
+#include <Python.h>
+#include <structmember.h>
 
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #ifndef _MULTIARRAYMODULE
 
 #include "binop_override.h"
 
+/*
+ * used for allocating a single scalar, so use the default numpy
+ * memory allocators instead of the (maybe) user overrides
+ */
+NPY_NO_EXPORT void *
+npy_alloc_cache_zero(size_t nmemb, size_t size);
+
+NPY_NO_EXPORT void
+npy_free_cache(void * p, npy_uintp sz);
+
 NPY_NO_EXPORT PyBoolScalarObject _PyArrayScalar_BoolValues[] = {
     {PyObject_HEAD_INIT(&PyBoolArrType_Type) 0},
     {PyObject_HEAD_INIT(&PyBoolArrType_Type) 1},
@@ -208,6 +218,27 @@ gentype_multiply(PyObject *m1, PyObject *m2)
     return PyArray_Type.tp_as_number->nb_multiply(m1, m2);
 }
 
+/**begin repeat
+ * #TYPE    = BYTE, UBYTE, SHORT, USHORT, INT, UINT,
+ *            LONG, ULONG, LONGLONG, ULONGLONG#
+ * #type    = npy_byte, npy_ubyte, npy_short, npy_ushort, npy_int, npy_uint,
+ *            npy_long, npy_ulong, npy_longlong, npy_ulonglong#
+ * #c       = hh, uhh, h, uh,, u, l, ul, ll, ull#
+ * #Name    = Byte, UByte, Short, UShort, Int, UInt,
+ *            Long, ULong, LongLong, ULongLong#
+ * #convert = Long*8, LongLong*2#
+ */
+static PyObject *
+@type@_bit_count(PyObject *self, PyObject *NPY_UNUSED(args))
+{
+    @type@ scalar = PyArrayScalar_VAL(self, @Name@);
+    uint8_t count = npy_popcount@c@(scalar);
+    PyObject *result = PyLong_From@convert@(count);
+
+    return result;
+}
+/**end repeat**/
+
 /**begin repeat
  *
  * #name = positive, negative, absolute, invert, int, float#
@@ -866,7 +897,7 @@ static PyObject *
 {
     npy_@name@ absval;
 
-    if (npy_legacy_print_mode == 113) {
+    if (npy_legacy_print_mode <= 113) {
         return legacy_@name@_format@kind@(val);
     }
 
@@ -892,7 +923,7 @@ c@name@type_@kind@(PyObject *self)
     npy_c@name@ val = PyArrayScalar_VAL(self, C@Name@);
     TrimMode trim = TrimMode_DptZeros;
 
-    if (npy_legacy_print_mode == 113) {
+    if (npy_legacy_print_mode <= 113) {
         return legacy_c@name@_format@kind@(val);
     }
 
@@ -957,7 +988,7 @@ halftype_@kind@(PyObject *self)
     float floatval = npy_half_to_float(val);
     float absval;
 
-    if (npy_legacy_print_mode == 113) {
+    if (npy_legacy_print_mode <= 113) {
         return legacy_float_format@kind@(floatval);
     }
 
@@ -1054,19 +1085,19 @@ gentype_richcompare(PyObject *self, PyObject *other, int cmp_op)
 }
 
 static PyObject *
-gentype_ndim_get(PyObject *NPY_UNUSED(self))
+gentype_ndim_get(PyObject *NPY_UNUSED(self), void *NPY_UNUSED(ignored))
 {
     return PyLong_FromLong(0);
 }
 
 static PyObject *
-gentype_flags_get(PyObject *NPY_UNUSED(self))
+gentype_flags_get(PyObject *NPY_UNUSED(self), void *NPY_UNUSED(ignored))
 {
     return PyArray_NewFlagsObject(NULL);
 }
 
 static PyObject *
-voidtype_flags_get(PyVoidScalarObject *self)
+voidtype_flags_get(PyVoidScalarObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *flagobj;
     flagobj = PyArrayFlags_Type.tp_alloc(&PyArrayFlags_Type, 0);
@@ -1079,7 +1110,7 @@ voidtype_flags_get(PyVoidScalarObject *self)
 }
 
 static PyObject *
-voidtype_dtypedescr_get(PyVoidScalarObject *self)
+voidtype_dtypedescr_get(PyVoidScalarObject *self, void *NPY_UNUSED(ignored))
 {
     Py_INCREF(self->descr);
     return (PyObject *)self->descr;
@@ -1087,7 +1118,7 @@ voidtype_dtypedescr_get(PyVoidScalarObject *self)
 
 
 static PyObject *
-inttype_numerator_get(PyObject *self)
+inttype_numerator_get(PyObject *self, void *NPY_UNUSED(ignored))
 {
     Py_INCREF(self);
     return self;
@@ -1095,21 +1126,21 @@ inttype_numerator_get(PyObject *self)
 
 
 static PyObject *
-inttype_denominator_get(PyObject *self)
+inttype_denominator_get(PyObject *self, void *NPY_UNUSED(ignored))
 {
     return PyLong_FromLong(1);
 }
 
 
 static PyObject *
-gentype_data_get(PyObject *self)
+gentype_data_get(PyObject *self, void *NPY_UNUSED(ignored))
 {
     return PyMemoryView_FromObject(self);
 }
 
 
 static PyObject *
-gentype_itemsize_get(PyObject *self)
+gentype_itemsize_get(PyObject *self, void *NPY_UNUSED(ignored))
 {
     PyArray_Descr *typecode;
     PyObject *ret;
@@ -1123,16 +1154,16 @@ gentype_itemsize_get(PyObject *self)
 }
 
 static PyObject *
-gentype_size_get(PyObject *NPY_UNUSED(self))
+gentype_size_get(PyObject *NPY_UNUSED(self), void *NPY_UNUSED(ignored))
 {
     return PyLong_FromLong(1);
 }
 
 static PyObject *
-gentype_sizeof(PyObject *self)
+gentype_sizeof(PyObject *self, PyObject *NPY_UNUSED(args))
 {
     Py_ssize_t nbytes;
-    PyObject * isz = gentype_itemsize_get(self);
+    PyObject * isz = gentype_itemsize_get(self, NULL);
     if (isz == NULL) {
         return NULL;
     }
@@ -1161,7 +1192,7 @@ gentype_struct_free(PyObject *ptr)
 }
 
 static PyObject *
-gentype_struct_get(PyObject *self)
+gentype_struct_get(PyObject *self, void *NPY_UNUSED(ignored))
 {
     PyArrayObject *arr;
     PyArrayInterface *inter;
@@ -1187,20 +1218,20 @@ gentype_struct_get(PyObject *self)
 }
 
 static PyObject *
-gentype_priority_get(PyObject *NPY_UNUSED(self))
+gentype_priority_get(PyObject *NPY_UNUSED(self), void *NPY_UNUSED(ignored))
 {
     return PyFloat_FromDouble(NPY_SCALAR_PRIORITY);
 }
 
 static PyObject *
-gentype_shape_get(PyObject *NPY_UNUSED(self))
+gentype_shape_get(PyObject *NPY_UNUSED(self), void *NPY_UNUSED(ignored))
 {
     return PyTuple_New(0);
 }
 
 
 static PyObject *
-gentype_interface_get(PyObject *self)
+gentype_interface_get(PyObject *self, void *NPY_UNUSED(ignored))
 {
     PyArrayObject *arr;
     PyObject *inter;
@@ -1220,20 +1251,20 @@ gentype_interface_get(PyObject *self)
 
 
 static PyObject *
-gentype_typedescr_get(PyObject *self)
+gentype_typedescr_get(PyObject *self, void *NPY_UNUSED(ignored))
 {
     return (PyObject *)PyArray_DescrFromScalar(self);
 }
 
 
 static PyObject *
-gentype_base_get(PyObject *NPY_UNUSED(self))
+gentype_base_get(PyObject *NPY_UNUSED(self), void *NPY_UNUSED(ignored))
 {
     Py_RETURN_NONE;
 }
 
 static PyObject *
-voidtype_base_get(PyVoidScalarObject *self)
+voidtype_base_get(PyVoidScalarObject *self, void *NPY_UNUSED(ignored))
 {
     if (self->base == NULL) {
         Py_RETURN_NONE;
@@ -1264,7 +1295,7 @@ _realdescr_fromcomplexscalar(PyObject *self, int *typenum)
 }
 
 static PyObject *
-gentype_real_get(PyObject *self)
+gentype_real_get(PyObject *self, void *NPY_UNUSED(ignored))
 {
     PyArray_Descr *typecode;
     PyObject *ret;
@@ -1291,7 +1322,7 @@ gentype_real_get(PyObject *self)
 }
 
 static PyObject *
-gentype_imag_get(PyObject *self)
+gentype_imag_get(PyObject *self, void *NPY_UNUSED(ignored))
 {
     PyArray_Descr *typecode=NULL;
     PyObject *ret;
@@ -1321,7 +1352,7 @@ gentype_imag_get(PyObject *self)
         int elsize;
         typecode = PyArray_DescrFromScalar(self);
         elsize = typecode->elsize;
-        temp = npy_alloc_cache_zero(elsize);
+        temp = npy_alloc_cache_zero(1, elsize);
         ret = PyArray_Scalar(temp, typecode, NULL);
         npy_free_cache(temp, elsize);
     }
@@ -1331,7 +1362,7 @@ gentype_imag_get(PyObject *self)
 }
 
 static PyObject *
-gentype_flat_get(PyObject *self)
+gentype_flat_get(PyObject *self, void *NPY_UNUSED(ignored))
 {
     PyObject *ret, *arr;
 
@@ -1346,7 +1377,7 @@ gentype_flat_get(PyObject *self)
 
 
 static PyObject *
-gentype_transpose_get(PyObject *self)
+gentype_transpose_get(PyObject *self, void *NPY_UNUSED(ignored))
 {
     Py_INCREF(self);
     return self;
@@ -1805,6 +1836,59 @@ gentype_setflags(PyObject *NPY_UNUSED(self), PyObject *NPY_UNUSED(args),
     Py_RETURN_NONE;
 }
 
+static PyObject *
+numbertype_class_getitem_abc(PyObject *cls, PyObject *args)
+{
+    PyObject *generic_alias;
+
+#ifdef Py_GENERICALIASOBJECT_H
+    Py_ssize_t args_len;
+    int args_len_expected;
+
+    /* complexfloating should take 2 parameters, all others take 1 */
+    if (PyType_IsSubtype((PyTypeObject *)cls,
+                         &PyComplexFloatingArrType_Type)) {
+        args_len_expected = 2;
+    }
+    else {
+        args_len_expected = 1;
+    }
+
+    args_len = PyTuple_Check(args) ? PyTuple_Size(args) : 1;
+    if (args_len != args_len_expected) {
+        return PyErr_Format(PyExc_TypeError,
+                            "Too %s arguments for %s",
+                            args_len > args_len_expected ? "many" : "few",
+                            ((PyTypeObject *)cls)->tp_name);
+    }
+    generic_alias = Py_GenericAlias(cls, args);
+#else
+    PyErr_SetString(PyExc_TypeError,
+                    "Type subscription requires python >= 3.9");
+    generic_alias = NULL;
+#endif
+    return generic_alias;
+}
+
+/*
+ * Use for concrete np.number subclasses, making them act as if they
+ * were subtyped from e.g. np.signedinteger[object], thus lacking any
+ * free subscription parameters. Requires python >= 3.9.
+ */
+static PyObject *
+numbertype_class_getitem(PyObject *cls, PyObject *args)
+{
+#ifdef Py_GENERICALIASOBJECT_H
+    PyErr_Format(PyExc_TypeError,
+                 "There are no type variables left in %s",
+                 ((PyTypeObject *)cls)->tp_name);
+#else
+    PyErr_SetString(PyExc_TypeError,
+                    "Type subscription requires python >= 3.9");
+#endif
+    return NULL;
+}
+
 /*
  * casting complex numbers (that don't inherit from Python complex)
  * to Python complex
@@ -1834,7 +1918,7 @@ static PyObject *
  */
 /* Heavily copied from the builtin float.as_integer_ratio */
 static PyObject *
-@name@_as_integer_ratio(PyObject *self)
+@name@_as_integer_ratio(PyObject *self, PyObject *NPY_UNUSED(args))
 {
 #if @is_half@
     npy_double val = npy_half_to_double(PyArrayScalar_VAL(self, @Name@));
@@ -1908,6 +1992,39 @@ error:
 }
 /**end repeat**/
 
+/**begin repeat
+ *  #name = half, float, double, longdouble#
+ *  #Name = Half, Float, Double, LongDouble#
+ *  #is_half = 1,0,0,0#
+ *  #c    = f, f, , l#
+ */
+static PyObject *
+@name@_is_integer(PyObject *self, PyObject *NPY_UNUSED(args))
+{
+#if @is_half@
+    npy_double val = npy_half_to_double(PyArrayScalar_VAL(self, @Name@));
+#else
+    npy_@name@ val = PyArrayScalar_VAL(self, @Name@);
+#endif
+    PyObject *ret;
+
+    if (npy_isnan(val)) {
+        Py_RETURN_FALSE;
+    }
+    if (!npy_isfinite(val)) {
+        Py_RETURN_FALSE;
+    }
+
+    ret = (npy_floor@c@(val) == val) ? Py_True : Py_False;
+    Py_INCREF(ret);
+    return ret;
+}
+/**end repeat**/
+
+static PyObject *
+integer_is_integer(PyObject *self, PyObject *NPY_UNUSED(args)) {
+    Py_RETURN_TRUE;
+}
 
 /*
  * need to fill in doc-strings for these methods on import -- copy from
@@ -2155,6 +2272,14 @@ static PyGetSetDef inttype_getsets[] = {
     {NULL, NULL, NULL, NULL, NULL}
 };
 
+static PyMethodDef numbertype_methods[] = {
+    /* for typing; requires python >= 3.9 */
+    {"__class_getitem__",
+        (PyCFunction)numbertype_class_getitem_abc,
+        METH_CLASS | METH_O, NULL},
+    {NULL, NULL, 0, NULL}  /* sentinel */
+};
+
 /**begin repeat
  * #name = cfloat,clongdouble#
  */
@@ -2162,12 +2287,16 @@ static PyMethodDef @name@type_methods[] = {
     {"__complex__",
         (PyCFunction)@name@_complex,
         METH_VARARGS | METH_KEYWORDS, NULL},
+    /* for typing; requires python >= 3.9 */
+    {"__class_getitem__",
+        (PyCFunction)numbertype_class_getitem,
+        METH_CLASS | METH_O, NULL},
     {NULL, NULL, 0, NULL}
 };
 /**end repeat**/
 
 /**begin repeat
- * #name = integer,floating, complexfloating#
+ * #name = floating, complexfloating#
  */
 static PyMethodDef @name@type_methods[] = {
     /* Hook for the round() builtin */
@@ -2178,6 +2307,17 @@ static PyMethodDef @name@type_methods[] = {
 };
 /**end repeat**/
 
+static PyMethodDef integertype_methods[] = {
+    /* Hook for the round() builtin */
+    {"__round__",
+        (PyCFunction)integertype_dunder_round,
+        METH_VARARGS | METH_KEYWORDS, NULL},
+    {"is_integer",
+        (PyCFunction)integer_is_integer,
+        METH_NOARGS, NULL},
+    {NULL, NULL, 0, NULL} /* sentinel */
+};
+
 /**begin repeat
  * #name = half,float,double,longdouble#
  */
@@ -2185,10 +2325,46 @@ static PyMethodDef @name@type_methods[] = {
     {"as_integer_ratio",
         (PyCFunction)@name@_as_integer_ratio,
         METH_NOARGS, NULL},
+    {"is_integer",
+        (PyCFunction)@name@_is_integer,
+        METH_NOARGS, NULL},
+    /* for typing; requires python >= 3.9 */
+    {"__class_getitem__",
+        (PyCFunction)numbertype_class_getitem,
+        METH_CLASS | METH_O, NULL},
     {NULL, NULL, 0, NULL}
 };
 /**end repeat**/
 
+/**begin repeat
+ * #name = timedelta, cdouble#
+ */
+static PyMethodDef @name@type_methods[] = {
+    /* for typing; requires python >= 3.9 */
+    {"__class_getitem__",
+        (PyCFunction)numbertype_class_getitem,
+        METH_CLASS | METH_O, NULL},
+    {NULL, NULL, 0, NULL}
+};
+/**end repeat**/
+
+/**begin repeat
+ * #name = byte, ubyte, short, ushort, int, uint,
+ *         long, ulong, longlong, ulonglong#
+ */
+static PyMethodDef @name@type_methods[] = {
+    /* for typing; requires python >= 3.9 */
+    {"__class_getitem__",
+        (PyCFunction)numbertype_class_getitem,
+        METH_CLASS | METH_O, NULL},
+    {"bit_count",
+        (PyCFunction)npy_@name@_bit_count,
+        METH_NOARGS, NULL},
+    {NULL, NULL, 0, NULL} /* sentinel */
+};
+/**end repeat**/
+
+
 /************* As_mapping functions for void array scalar ************/
 
 static Py_ssize_t
@@ -2409,6 +2585,7 @@ gentype_arrtype_getbuffer(PyObject *self, Py_buffer *view, int flags)
                 "user-defined scalar %R registered for built-in dtype %S? "
                 "This should be impossible.",
                 self, descr);
+        Py_DECREF(descr);
         return -1;
     }
     view->ndim = 0;
@@ -3022,7 +3199,10 @@ void_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
                     (int) NPY_MAX_INT);
             return NULL;
         }
-        destptr = npy_alloc_cache_zero(memu);
+        if (memu == 0) {
+            memu = 1;
+        }
+        destptr = npy_alloc_cache_zero(memu, 1);
         if (destptr == NULL) {
             return PyErr_NoMemory();
         }
@@ -3904,6 +4084,8 @@ initialize_numeric_types(void)
 
     PyIntegerArrType_Type.tp_getset = inttype_getsets;
 
+    PyNumberArrType_Type.tp_methods = numbertype_methods;
+
     /**begin repeat
      * #NAME= Number, Integer, SignedInteger, UnsignedInteger, Inexact,
      *        Floating, ComplexFloating, Flexible, Character#
@@ -3960,6 +4142,17 @@ initialize_numeric_types(void)
 
     /**end repeat**/
 
+    /**begin repeat
+     * #name = byte, short, int, long, longlong,
+     *         ubyte, ushort, uint, ulong, ulonglong#
+     * #Name = Byte, Short, Int, Long, LongLong,
+     *         UByte, UShort, UInt, ULong, ULongLong#
+     */
+
+    Py@Name@ArrType_Type.tp_methods = @name@type_methods;
+
+    /**end repeat**/
+
     /**begin repeat
      * #name = half, float, double, longdouble#
      * #Name = Half, Float, Double, LongDouble#
@@ -3969,6 +4162,17 @@ initialize_numeric_types(void)
 
     /**end repeat**/
 
+    /**begin repeat
+     * #name = byte, short, int, long, longlong, ubyte, ushort,
+     *         uint, ulong, ulonglong, timedelta, cdouble#
+     * #Name = Byte, Short, Int, Long, LongLong, UByte, UShort,
+     *         UInt, ULong, ULongLong, Timedelta, CDouble#
+     */
+
+    Py@Name@ArrType_Type.tp_methods = @name@type_methods;
+
+    /**end repeat**/
+
     /* We won't be inheriting from Python Int type. */
     PyIntArrType_Type.tp_hash = int_arrtype_hash;
 
index 861f2c943e987f01cf52f7b605f35662777dd30b..95a2f66c6fbcc6edd41692d284f157a8778f7799 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_SCALARTYPES_H_
-#define _NPY_SCALARTYPES_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_SCALARTYPES_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_SCALARTYPES_H_
 
 /* Internal look-up tables */
 extern NPY_NO_EXPORT unsigned char
@@ -31,4 +31,4 @@ _typenum_fromtypeobj(PyObject *type, int user);
 NPY_NO_EXPORT void *
 scalar_value(PyObject *scalar, PyArray_Descr *descr);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_SCALARTYPES_H_ */
index 1c74f17199f24949a08f58846ed740fedcdb1804..8db0690a1d75ab1eff654aad22fbfb4aa5505be6 100644 (file)
@@ -1,9 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 
index b28c50d975ca9fe0b0559cd930feb55a29b0d152..aff6aeb7ea97911629eba1528de18b05a2a0b998 100644 (file)
@@ -1,6 +1,6 @@
-#ifndef _NPY_ARRAY_SEQUENCE_H_
-#define _NPY_ARRAY_SEQUENCE_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_SEQUENCE_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_SEQUENCE_H_
 
 extern NPY_NO_EXPORT PySequenceMethods array_as_sequence;
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_SEQUENCE_H_ */
index 02c349759528504bde9e48f738ccc1e6b5e41e46..162abd6a49c8e01cef3c516c8a2c44bbe5c1a0b8 100644 (file)
@@ -1,9 +1,10 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 
@@ -120,8 +121,16 @@ PyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape, int refcheck,
         }
 
         /* Reallocate space if needed - allocating 0 is forbidden */
-        new_data = PyDataMem_RENEW(
-            PyArray_DATA(self), newnbytes == 0 ? elsize : newnbytes);
+        PyObject *handler = PyArray_HANDLER(self);
+        if (handler == NULL) {
+            /* This can happen if someone arbitrarily sets NPY_ARRAY_OWNDATA */
+            PyErr_SetString(PyExc_RuntimeError,
+                            "no memory handler found but OWNDATA flag set");
+            return NULL;
+        }
+        new_data = PyDataMem_UserRENEW(PyArray_DATA(self),
+                                       newnbytes == 0 ? elsize : newnbytes,
+                                       handler);
         if (new_data == NULL) {
             PyErr_SetString(PyExc_MemoryError,
                     "cannot allocate memory for array");
index 875b5430f2e8935d99476ed81628510d89640ffb..bef386ed136fb7f382470e696f357110d0a2892f 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ARRAY_SHAPE_H_
-#define _NPY_ARRAY_SHAPE_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_SHAPE_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_SHAPE_H_
 
 /*
  * Creates a sorted stride perm matching the KEEPORDER behavior
@@ -21,4 +21,4 @@ PyArray_CreateMultiSortedStridePerm(int narrays, PyArrayObject **arrays,
 NPY_NO_EXPORT PyObject *
 PyArray_SqueezeSelected(PyArrayObject *self, npy_bool *axis_flags);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_SHAPE_H_ */
index d9d9b7c0aaf88e33de3aef9abf5741054412c0b5..ba457f4f41d41c88e4bcb7ee518b3346f95d58cc 100644 (file)
@@ -1,8 +1,10 @@
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
 
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include <numpy/arrayobject.h>
+
+#include "numpy/arrayobject.h"
 #include "npy_pycompat.h"
 #include "npy_import.h"
 #include "strfuncs.h"
index 5dd661a20dc404690cf3ebf3346fb5396c78bcf0..134b56ed3fef114d0975f0e1731f05118a682b01 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_ARRAY_STRFUNCS_H_
-#define _NPY_ARRAY_STRFUNCS_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_STRFUNCS_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_STRFUNCS_H_
 
 NPY_NO_EXPORT void
 PyArray_SetStringFunction(PyObject *op, int repr);
@@ -13,4 +13,4 @@ array_str(PyArrayObject *self);
 NPY_NO_EXPORT PyObject *
 array_format(PyArrayObject *self, PyObject *args);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_STRFUNCS_H_ */
index 2b4621744427e886172546c59596f720909f2f07..f615aa3360e69e561f8d36b9190dde23575845b6 100644 (file)
@@ -1,8 +1,9 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "npy_config.h"
 #include "numpy/arrayobject.h"
 
index 206bb025381eab1576e5d6a2c877c4ea184e0134..a1fec98d5a8726fdf85903c86a450305e07d5d16 100644 (file)
@@ -1,5 +1,6 @@
-#ifndef _NPY_ARRAY_TEMP_AVOID_H_
-#define _NPY_ARRAY_TEMP_AVOID_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_TEMP_ELIDE_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_TEMP_ELIDE_H_
+
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
 #include <numpy/ndarraytypes.h>
@@ -12,4 +13,4 @@ try_binary_elide(PyObject * m1, PyObject * m2,
                  PyObject * (inplace_op)(PyArrayObject * m1, PyObject * m2),
                  PyObject ** res, int commutative);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_TEMP_ELIDE_H_ */
index b0563b3c0ef87b1e4a7e51fbf55c39e46e32289a..8cf6bc1e005ddc71c99bc0424459d348c8676d96 100644 (file)
@@ -3,6 +3,10 @@
  * Unfortunately, we need two different types to cover the cases where min/max
  * do and do not appear in the tuple.
  */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
+#include "npy_pycompat.h"
 #include "typeinfo.h"
 
 #if (defined(PYPY_VERSION_NUM) && (PYPY_VERSION_NUM <= 0x07030000))
@@ -10,9 +14,6 @@
 #include <structseq.h>
 #endif
 
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
-#include "npy_pycompat.h"
 
 
 static PyTypeObject PyArray_typeinfoType;
index 28afa4120446d45ec9faeee54ff68aceb39199bf..af4637fc92df36c418fb6b00415dde21aae95d19 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_PRIVATE_TYPEINFO_H_
-#define _NPY_PRIVATE_TYPEINFO_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_TYPEINFO_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_TYPEINFO_H_
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
@@ -18,4 +18,4 @@ PyArray_typeinforanged(
     char typechar, int typenum, int nbits, int align,
     PyObject *max, PyObject *min, PyTypeObject *type_obj);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_TYPEINFO_H_ */
index 15d46800c471c834e1c1df64e21dbf67a682df0a..a338d712dad7c7a5b37bd685a719e8befd78cebe 100644 (file)
@@ -20,13 +20,13 @@ maintainer email:  oliphant.travis@ieee.org
   Space Science Telescope Institute
   (J. Todd Miller, Perry Greenfield, Rick White)
 */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
-#include "structmember.h"
+#include <structmember.h>
 
-/*#include <stdio.h>*/
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
 #include "numpy/arrayobject.h"
 #include "numpy/arrayscalars.h"
 
@@ -268,6 +268,56 @@ PyArray_RegisterDataType(PyArray_Descr *descr)
     return typenum;
 }
 
+
+/*
+ * Checks that there is no cast already cached using the new casting-impl
+ * mechanism.
+ * In that case, we do not clear out the cache (but otherwise silently
+ * continue).  Users should not modify casts after they have been used,
+ * but this may also happen accidentally during setup (and may never have
+ * mattered).  See https://github.com/numpy/numpy/issues/20009
+ */
+static int _warn_if_cast_exists_already(
+        PyArray_Descr *descr, int totype, char *funcname)
+{
+    PyArray_DTypeMeta *to_DType = PyArray_DTypeFromTypeNum(totype);
+    if (to_DType == NULL) {
+        return -1;
+    }
+    PyObject *cast_impl = PyDict_GetItemWithError(
+            NPY_DT_SLOTS(NPY_DTYPE(descr))->castingimpls, (PyObject *)to_DType);
+    Py_DECREF(to_DType);
+    if (cast_impl == NULL) {
+        if (PyErr_Occurred()) {
+            return -1;
+        }
+    }
+    else {
+        char *extra_msg;
+        if (cast_impl == Py_None) {
+            extra_msg = "the cast will continue to be considered impossible.";
+        }
+        else {
+            extra_msg = "the previous definition will continue to be used.";
+        }
+        Py_DECREF(cast_impl);
+        PyArray_Descr *to_descr = PyArray_DescrFromType(totype);
+        int ret = PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
+                "A cast from %R to %R was registered/modified using `%s` "
+                "after the cast had been used.  "
+                "This registration will have (mostly) no effect: %s\n"
+                "The most likely fix is to ensure that casts are the first "
+                "thing initialized after dtype registration.  "
+                "Please contact the NumPy developers with any questions!",
+                descr, to_descr, funcname, extra_msg);
+        Py_DECREF(to_descr);
+        if (ret < 0) {
+            return -1;
+        }
+    }
+    return 0;
+}
+
 /*NUMPY_API
   Register Casting Function
   Replaces any function currently stored.
@@ -279,14 +329,19 @@ PyArray_RegisterCastFunc(PyArray_Descr *descr, int totype,
     PyObject *cobj, *key;
     int ret;
 
-    if (totype < NPY_NTYPES_ABI_COMPATIBLE) {
-        descr->f->cast[totype] = castfunc;
-        return 0;
-    }
     if (totype >= NPY_NTYPES && !PyTypeNum_ISUSERDEF(totype)) {
         PyErr_SetString(PyExc_TypeError, "invalid type number.");
         return -1;
     }
+    if (_warn_if_cast_exists_already(
+            descr, totype, "PyArray_RegisterCastFunc") < 0) {
+        return -1;
+    }
+
+    if (totype < NPY_NTYPES_ABI_COMPATIBLE) {
+        descr->f->cast[totype] = castfunc;
+        return 0;
+    }
     if (descr->f->castdict == NULL) {
         descr->f->castdict = PyDict_New();
         if (descr->f->castdict == NULL) {
@@ -328,6 +383,10 @@ PyArray_RegisterCanCast(PyArray_Descr *descr, int totype,
                         "RegisterCanCast must be user-defined.");
         return -1;
     }
+    if (_warn_if_cast_exists_already(
+            descr, totype, "PyArray_RegisterCanCast") < 0) {
+        return -1;
+    }
 
     if (scalar == NPY_NOSCALAR) {
         /*
@@ -388,7 +447,7 @@ legacy_userdtype_common_dtype_function(
 {
     int skind1 = NPY_NOSCALAR, skind2 = NPY_NOSCALAR, skind;
 
-    if (!other->legacy) {
+    if (!NPY_DT_is_legacy(other)) {
         /* legacy DTypes can always defer to new style ones */
         Py_INCREF(Py_NotImplemented);
         return (PyArray_DTypeMeta *)Py_NotImplemented;
@@ -422,7 +481,7 @@ legacy_userdtype_common_dtype_function(
      */
 
     /* Convert the 'kind' char into a scalar kind */
-    switch (cls->kind) {
+    switch (cls->singleton->kind) {
         case 'b':
             skind1 = NPY_BOOL_SCALAR;
             break;
@@ -439,7 +498,7 @@ legacy_userdtype_common_dtype_function(
             skind1 = NPY_COMPLEX_SCALAR;
             break;
     }
-    switch (other->kind) {
+    switch (other->singleton->kind) {
         case 'b':
             skind2 = NPY_BOOL_SCALAR;
             break;
index 8b2fc80e6ad64e806bfe77752aa04cd28eb6adfa..6768e2c4219a13a88a8e7c20aa9b1813f8339a75 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_PRIVATE_USERTYPES_H_
-#define _NPY_PRIVATE_USERTYPES_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_USERTYPES_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_USERTYPES_H_
 
 #include "array_method.h"
 
@@ -27,4 +27,4 @@ NPY_NO_EXPORT int
 PyArray_AddLegacyWrapping_CastingImpl(
         PyArray_DTypeMeta *from, PyArray_DTypeMeta *to, NPY_CASTING casting);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_USERTYPES_H_ */
index 9b5d1952202960dc8914e66bcf13ac8c29b1e205..ff08ed2d4b07a01ae52b94bb051c8f1f8cab3fff 100644 (file)
@@ -1,7 +1,9 @@
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #define _MULTIARRAYMODULE
 
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
+
 #include "common.h"
 #include "vdot.h"
 #include "npy_cblas.h"
index 0f60ca6d19a50ee96f16c37914efd76fa825a2ed..f6da5ddea03c9a1e9700052ff2144fe514e5a040 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _NPY_VDOT_H_
-#define _NPY_VDOT_H_
+#ifndef NUMPY_CORE_SRC_MULTIARRAY_VDOT_H_
+#define NUMPY_CORE_SRC_MULTIARRAY_VDOT_H_
 
 #include "common.h"
 
@@ -15,4 +15,4 @@ CLONGDOUBLE_vdot(char *, npy_intp, char *, npy_intp, char *, npy_intp, void *);
 NPY_NO_EXPORT void
 OBJECT_vdot(char *, npy_intp, char *, npy_intp, char *, npy_intp, void *);
 
-#endif
+#endif  /* NUMPY_CORE_SRC_MULTIARRAY_VDOT_H_ */
index cbaa11e43c3180c55f7223ca9c15da47c9475ca2..51948c736276fbffa641c3796dfffde599b2ed98 100644 (file)
@@ -1,4 +1,5 @@
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
+
 #include "numpy/halffloat.h"
 
 /*
index a18f2dc6dbc9805467c0f3fe761cacb04cdf7823..5b418342f25ef7d10a470cca486f241dec97f449 100644 (file)
  */
 #include "npy_math_private.h"
 
+/* Magic binary numbers used by bit_count
+ * For type T, the magic numbers are computed as follows:
+ * Magic[0]: 01 01 01 01 01 01... = (T)~(T)0/3
+ * Magic[1]: 0011 0011 0011...    = (T)~(T)0/15  * 3
+ * Magic[2]: 00001111 00001111... = (T)~(T)0/255 * 15
+ * Magic[3]: 00000001 00000001... = (T)~(T)0/255
+ *
+ * Counting bits set, in parallel
+ * Based on: http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
+ *
+ * Generic Algorithm for type T:
+ * a = a - ((a >> 1) & (T)~(T)0/3);
+ * a = (a & (T)~(T)0/15*3) + ((a >> 2) & (T)~(T)0/15*3);
+ * a = (a + (a >> 4)) & (T)~(T)0/255*15;
+ * c = (T)(a * ((T)~(T)0/255)) >> (sizeof(T) - 1) * CHAR_BIT;
+*/
+
+static const npy_uint8  MAGIC8[]  = {0x55u,                 0x33u,                 0x0Fu,                 0x01u};
+static const npy_uint16 MAGIC16[] = {0x5555u,               0x3333u,               0x0F0Fu,               0x0101u};
+static const npy_uint32 MAGIC32[] = {0x55555555ul,          0x33333333ul,          0x0F0F0F0Ful,          0x01010101ul};
+static const npy_uint64 MAGIC64[] = {0x5555555555555555ull, 0x3333333333333333ull, 0x0F0F0F0F0F0F0F0Full, 0x0101010101010101ull};
+
+
 /*
  *****************************************************************************
  **                     BASIC MATH FUNCTIONS                                **
@@ -398,8 +421,8 @@ NPY_INPLACE @type@ npy_@kind@@c@(@type@ x)
 /**end repeat1**/
 
 /**begin repeat1
- * #kind = atan2,hypot,pow,copysign#
- * #KIND = ATAN2,HYPOT,POW,COPYSIGN#
+ * #kind = atan2,hypot,pow,fmod,copysign#
+ * #KIND = ATAN2,HYPOT,POW,FMOD,COPYSIGN#
  */
 #ifdef @kind@@c@
 #undef @kind@@c@
@@ -412,32 +435,6 @@ NPY_INPLACE @type@ npy_@kind@@c@(@type@ x, @type@ y)
 #endif
 /**end repeat1**/
 
-/**begin repeat1
- * #kind = fmod#
- * #KIND = FMOD#
- */
-#ifdef @kind@@c@
-#undef @kind@@c@
-#endif
-#ifndef HAVE_MODF@C@
-NPY_INPLACE @type@
-npy_@kind@@c@(@type@ x, @type@ y)
-{
-    int are_inputs_inf = (npy_isinf(x) && npy_isinf(y));
-    /* force set invalid flag, doesnt raise by default on gcc < 8 */
-    if (npy_isnan(x) || npy_isnan(y)) {
-        npy_set_floatstatus_invalid();
-    }
-    if (are_inputs_inf || !y) {
-        if (!npy_isnan(x)) {
-            npy_set_floatstatus_invalid();
-        }
-    }
-    return (@type@) npy_@kind@((double)x, (double) y);
-}
-#endif
-/**end repeat1**/
-
 #ifdef modf@c@
 #undef modf@c@
 #endif
@@ -524,8 +521,8 @@ NPY_INPLACE @type@ npy_@kind@@c@(@type@ x)
 #undef WORKAROUND_APPLE_TRIG_BUG
 
 /**begin repeat1
- * #kind = atan2,hypot,pow,copysign#
- * #KIND = ATAN2,HYPOT,POW,COPYSIGN#
+ * #kind = atan2,hypot,pow,fmod,copysign#
+ * #KIND = ATAN2,HYPOT,POW,FMOD,COPYSIGN#
  */
 #ifdef HAVE_@KIND@@C@
 NPY_INPLACE @type@ npy_@kind@@c@(@type@ x, @type@ y)
@@ -535,29 +532,6 @@ NPY_INPLACE @type@ npy_@kind@@c@(@type@ x, @type@ y)
 #endif
 /**end repeat1**/
 
-/**begin repeat1
- * #kind = fmod#
- * #KIND = FMOD#
- */
-#ifdef HAVE_FMOD@C@
-NPY_INPLACE @type@
-npy_@kind@@c@(@type@ x, @type@ y)
-{
-    int are_inputs_inf = (npy_isinf(x) && npy_isinf(y));
-    /* force set invalid flag, doesnt raise by default on gcc < 8 */
-    if (npy_isnan(x) || npy_isnan(y)) {
-        npy_set_floatstatus_invalid();
-    }
-    if (are_inputs_inf || !y) {
-        if (!npy_isnan(x)) {
-            npy_set_floatstatus_invalid();
-        }
-    }
-    return @kind@@c@(x, y);
-}
-#endif
-/**end repeat1**/
-
 #ifdef HAVE_MODF@C@
 NPY_INPLACE @type@ npy_modf@c@(@type@ x, @type@ *iptr)
 {
@@ -713,8 +687,14 @@ npy_remainder@c@(@type@ a, @type@ b)
 {
     @type@ mod;
     if (NPY_UNLIKELY(!b)) {
+        /*
+         * in2 == 0 (and not NaN): normal fmod will give the correct
+         * result (always NaN). `divmod` may set additional FPE for the
+         * division by zero creating an inf.
+         */
         mod = npy_fmod@c@(a, b);
-    } else {
+    }
+    else {
         npy_divmod@c@(a, b, &mod);
     }
     return mod;
@@ -724,13 +704,14 @@ NPY_INPLACE @type@
 npy_floor_divide@c@(@type@ a, @type@ b) {
     @type@ div, mod;
     if (NPY_UNLIKELY(!b)) {
+        /*
+         * in2 == 0 (and not NaN): normal division will give the correct
+         * result (Inf or NaN). `divmod` may set additional FPE for the modulo
+         * evaluating to NaN.
+         */
         div = a / b;
-        if (!a || npy_isnan(a)) {
-            npy_set_floatstatus_invalid();
-        } else {
-            npy_set_floatstatus_divbyzero();
-        }
-    } else {
+    }
+    else {
         div = npy_divmod@c@(a, b, &mod);
     }
     return div;
@@ -746,19 +727,11 @@ npy_divmod@c@(@type@ a, @type@ b, @type@ *modulus)
 {
     @type@ div, mod, floordiv;
 
-    /* force set invalid flag, doesnt raise by default on gcc < 8 */
-    if (npy_isnan(a) || npy_isnan(b)) {
-        npy_set_floatstatus_invalid();
-    }
     mod = npy_fmod@c@(a, b);
     if (NPY_UNLIKELY(!b)) {
-        div = a / b;
-        if (a && !npy_isnan(a)) {
-            npy_set_floatstatus_divbyzero();
-        }
-        /* If b == 0, return result of fmod. For IEEE is nan */
+        /* b == 0 (not NaN): return result of fmod. For IEEE is nan */
         *modulus = mod;
-        return div;
+        return a / b;
     }
 
     /* a - mod should be very nearly an integer multiple of b */
@@ -766,7 +739,7 @@ npy_divmod@c@(@type@ a, @type@ b, @type@ *modulus)
 
     /* adjust fmod result to conform to Python convention of remainder */
     if (mod) {
-        if ((b < 0) != (mod < 0)) {
+        if (isless(b, 0) != isless(mod, 0)) {
             mod += b;
             div -= 1.0@c@;
         }
@@ -779,7 +752,7 @@ npy_divmod@c@(@type@ a, @type@ b, @type@ *modulus)
     /* snap quotient to nearest integral value */
     if (div) {
         floordiv = npy_floor@c@(div);
-        if (div - floordiv > 0.5@c@)
+        if (isgreater(div - floordiv, 0.5@c@))
             floordiv += 1.0@c@;
     }
     else {
@@ -876,3 +849,66 @@ npy_rshift@u@@c@(npy_@u@@type@ a, npy_@u@@type@ b)
 }
 /**end repeat1**/
 /**end repeat**/
+
+
+#define __popcnt32 __popcnt
+/**begin repeat
+ *
+ * #type  = ubyte, ushort, uint, ulong, ulonglong#
+ * #STYPE = BYTE,  SHORT,  INT,  LONG,  LONGLONG#
+ * #c     = hh,    h,      ,     l,     ll#
+ */
+#undef TO_BITS_LEN
+#if 0
+/**begin repeat1
+ * #len = 8, 16, 32, 64#
+ */
+#elif NPY_BITSOF_@STYPE@ == @len@
+    #define TO_BITS_LEN(X) X##@len@
+/**end repeat1**/
+#endif
+
+
+NPY_INPLACE uint8_t
+npy_popcount_parallel@c@(npy_@type@ a)
+{
+    a = a - ((a >> 1) & (npy_@type@) TO_BITS_LEN(MAGIC)[0]);
+    a = ((a & (npy_@type@) TO_BITS_LEN(MAGIC)[1])) + ((a >> 2) & (npy_@type@) TO_BITS_LEN(MAGIC)[1]);
+    a = (a + (a >> 4)) & (npy_@type@) TO_BITS_LEN(MAGIC)[2];
+    return (npy_@type@) (a * (npy_@type@) TO_BITS_LEN(MAGIC)[3]) >> ((NPY_SIZEOF_@STYPE@ - 1) * CHAR_BIT);
+}
+
+NPY_INPLACE uint8_t
+npy_popcountu@c@(npy_@type@ a)
+{
+/* use built-in popcount if present, else use our implementation */
+#if (defined(__clang__) || defined(__GNUC__)) && NPY_BITSOF_@STYPE@ >= 32
+    return __builtin_popcount@c@(a);
+#elif defined(_MSC_VER) && NPY_BITSOF_@STYPE@ >= 16
+    /* no builtin __popcnt64 for 32 bits */
+    #if defined(_WIN64) || (defined(_WIN32) && NPY_BITSOF_@STYPE@ != 64)
+        return TO_BITS_LEN(__popcnt)(a);
+    /* split 64 bit number into two 32 bit ints and return sum of counts */
+    #elif (defined(_WIN32) && NPY_BITSOF_@STYPE@ == 64)
+        npy_uint32 left  = (npy_uint32) (a>>32);
+        npy_uint32 right = (npy_uint32) a;
+        return __popcnt32(left) + __popcnt32(right);
+    #endif
+#else
+    return npy_popcount_parallel@c@(a);
+#endif
+}
+/**end repeat**/
+
+/**begin repeat
+ *
+ * #type = byte, short, int, long, longlong#
+ * #c    = hh,   h,     ,    l,    ll#
+ */
+NPY_INPLACE uint8_t
+npy_popcount@c@(npy_@type@ a)
+{
+    /* Return popcount of abs(a) */
+    return npy_popcountu@c@(a < 0 ? -a : a);
+}
+/**end repeat**/
index 212d11a0b342e6ded3806a05ab0a8bafca903d35..7ca0c5ba0f83d3ea495ce88eed9fa05350e8ab51 100644 (file)
 #define _NPY_MATH_PRIVATE_H_
 
 #include <Python.h>
+#ifdef __cplusplus
+#include <cmath>
+using std::isgreater;
+using std::isless;
+#else
 #include <math.h>
+#endif
 
 #include "npy_config.h"
 #include "npy_fpmath.h"
@@ -507,17 +513,29 @@ typedef union {
 #else /* !_MSC_VER */
 typedef union {
         npy_cdouble npy_z;
+#ifdef __cplusplus
+        std::complex<double> c99z;
+#else
         complex double c99_z;
+#endif
 } __npy_cdouble_to_c99_cast;
 
 typedef union {
         npy_cfloat npy_z;
+#ifdef __cplusplus
+        std::complex<float> c99z;
+#else
         complex float c99_z;
+#endif
 } __npy_cfloat_to_c99_cast;
 
 typedef union {
         npy_clongdouble npy_z;
+#ifdef __cplusplus
+        std::complex<long double> c99_z;
+#else
         complex long double c99_z;
+#endif
 } __npy_clongdouble_to_c99_cast;
 #endif /* !_MSC_VER */
 
diff --git a/numpy/core/src/npysort/radixsort.c.src b/numpy/core/src/npysort/radixsort.c.src
deleted file mode 100644 (file)
index 99d8ed4..0000000
+++ /dev/null
@@ -1,231 +0,0 @@
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-
-#include "npy_sort.h"
-#include "npysort_common.h"
-#include <stdlib.h>
-
-/*
- *****************************************************************************
- **                            INTEGER SORTS                                **
- *****************************************************************************
- */
-
-
-/**begin repeat
- *
- * #TYPE = BOOL, BYTE, UBYTE, SHORT, USHORT, INT, UINT, LONG, ULONG,
- *         LONGLONG, ULONGLONG#
- * #suff = bool, byte, ubyte, short, ushort, int, uint, long, ulong,
- *         longlong, ulonglong#
- * #type = npy_ubyte, npy_ubyte, npy_ubyte, npy_ushort, npy_ushort, npy_uint,
- *         npy_uint, npy_ulong, npy_ulong, npy_ulonglong, npy_ulonglong#
- * #sign = 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0#
- * #floating = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0#
- */
-
-// Reference: https://github.com/eloj/radix-sorting#-key-derivation
-#if @sign@
-    // Floating-point is currently disabled.
-    // Floating-point tests succeed for double and float on macOS but not on Windows/Linux.
-    // Basic sorting tests succeed but others relying on sort fail.
-    // Possibly related to floating-point normalisation or multiple NaN reprs? Not sure.
-    #if @floating@
-        // For floats, we invert the key if the sign bit is set, else we invert the sign bit.
-        #define KEY_OF(x) ((x) ^ (-((x) >> (sizeof(@type@) * 8 - 1)) | ((@type@)1 << (sizeof(@type@) * 8 - 1))))
-    #else
-        // For signed ints, we flip the sign bit so the negatives are below the positives.
-        #define KEY_OF(x) ((x) ^ ((@type@)1 << (sizeof(@type@) * 8 - 1)))
-    #endif
-#else
-    // For unsigned ints, the key is as-is
-    #define KEY_OF(x) (x)
-#endif
-
-static inline npy_ubyte
-nth_byte_@suff@(@type@ key, npy_intp l) {
-    return (key >> (l << 3)) & 0xFF;
-}
-
-static @type@*
-radixsort0_@suff@(@type@ *arr, @type@ *aux, npy_intp num)
-{
-    npy_intp cnt[sizeof(@type@)][1 << 8] = { { 0 } };
-    npy_intp i;
-    size_t l;
-    @type@ key0 = KEY_OF(arr[0]);
-    size_t ncols = 0;
-    npy_ubyte cols[sizeof(@type@)];
-
-    for (i = 0; i < num; i++) {
-        @type@ k = KEY_OF(arr[i]);
-
-        for (l = 0; l < sizeof(@type@); l++) {
-            cnt[l][nth_byte_@suff@(k, l)]++;
-        }
-    }
-
-    for (l = 0; l < sizeof(@type@); l++) {
-           if (cnt[l][nth_byte_@suff@(key0, l)] != num) {
-               cols[ncols++] = l;
-        }
-    }
-
-    for (l = 0; l < ncols; l++) {
-        npy_intp a = 0;
-        for (i = 0; i < 256; i++) {
-            npy_intp b = cnt[cols[l]][i];
-            cnt[cols[l]][i] = a;
-            a += b;
-        }
-    }
-
-    for (l = 0; l < ncols; l++) {
-        @type@* temp;
-        for (i = 0; i < num; i++) {
-            @type@ k = KEY_OF(arr[i]);
-            npy_intp dst = cnt[cols[l]][nth_byte_@suff@(k, cols[l])]++;
-            aux[dst] = arr[i];
-        }
-
-        temp = aux;
-        aux = arr;
-        arr = temp;
-    }
-
-    return arr;
-}
-
-NPY_NO_EXPORT int
-radixsort_@suff@(void *start, npy_intp num, void *NPY_UNUSED(varr))
-{
-    void *sorted;
-    @type@ *aux;
-    @type@ *arr = start;
-    @type@ k1, k2;
-    npy_bool all_sorted = 1;
-
-    if (num < 2) {
-        return 0;
-    }
-
-    k1 = KEY_OF(arr[0]);
-    for (npy_intp i = 1; i < num; i++) {
-        k2 = KEY_OF(arr[i]);
-        if (k1 > k2) {
-            all_sorted = 0;
-            break;
-        }
-        k1 = k2;
-    }
-
-    if (all_sorted) {
-        return 0;
-    }
-
-    aux = malloc(num * sizeof(@type@));
-    if (aux == NULL) {
-        return -NPY_ENOMEM;
-    }
-
-    sorted = radixsort0_@suff@(start, aux, num);
-    if (sorted != start) {
-        memcpy(start, sorted, num * sizeof(@type@));
-    }
-
-    free(aux);
-    return 0;
-}
-
-static npy_intp*
-aradixsort0_@suff@(@type@ *arr, npy_intp *aux, npy_intp *tosort, npy_intp num)
-{
-    npy_intp cnt[sizeof(@type@)][1 << 8] = { { 0 } };
-    npy_intp i;
-    size_t l;
-    @type@ key0 = KEY_OF(arr[0]);
-    size_t ncols = 0;
-    npy_ubyte cols[sizeof(@type@)];
-
-    for (i = 0; i < num; i++) {
-        @type@ k = KEY_OF(arr[i]);
-
-        for (l = 0; l < sizeof(@type@); l++) {
-            cnt[l][nth_byte_@suff@(k, l)]++;
-        }
-    }
-
-    for (l = 0; l < sizeof(@type@); l++) {
-        if (cnt[l][nth_byte_@suff@(key0, l)] != num) {
-            cols[ncols++] = l;
-        }
-    }
-
-    for (l = 0; l < ncols; l++) {
-        npy_intp a = 0;
-        for (i = 0; i < 256; i++) {
-            npy_intp b = cnt[cols[l]][i];
-            cnt[cols[l]][i] = a;
-            a += b;
-        }
-    }
-
-    for (l = 0; l < ncols; l++) {
-        npy_intp* temp;
-        for (i = 0; i < num; i++) {
-            @type@ k = KEY_OF(arr[tosort[i]]);
-            npy_intp dst = cnt[cols[l]][nth_byte_@suff@(k, cols[l])]++;
-            aux[dst] = tosort[i];
-        }
-
-        temp = aux;
-        aux = tosort;
-        tosort = temp;
-    }
-
-    return tosort;
-}
-
-NPY_NO_EXPORT int
-aradixsort_@suff@(void *start, npy_intp* tosort, npy_intp num, void *NPY_UNUSED(varr))
-{
-    npy_intp *sorted;
-    npy_intp *aux;
-    @type@ *arr = start;
-    @type@ k1, k2;
-    npy_bool all_sorted = 1;
-
-    if (num < 2) {
-        return 0;
-    }
-
-    k1 = KEY_OF(arr[tosort[0]]);
-    for (npy_intp i = 1; i < num; i++) {
-        k2 = KEY_OF(arr[tosort[i]]);
-        if (k1 > k2) {
-            all_sorted = 0;
-            break;
-        }
-        k1 = k2;
-    }
-
-    if (all_sorted) {
-        return 0;
-    }
-
-    aux = malloc(num * sizeof(npy_intp));
-    if (aux == NULL) {
-        return -NPY_ENOMEM;
-    }
-
-    sorted = aradixsort0_@suff@(start, aux, tosort, num);
-    if (sorted != tosort) {
-        memcpy(tosort, sorted, num * sizeof(npy_intp));
-    }
-
-    free(aux);
-    return 0;
-}
-
-#undef KEY_OF
-
-/**end repeat**/
diff --git a/numpy/core/src/npysort/radixsort.cpp b/numpy/core/src/npysort/radixsort.cpp
new file mode 100644 (file)
index 0000000..5393869
--- /dev/null
@@ -0,0 +1,356 @@
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+
+#include "npy_sort.h"
+#include "npysort_common.h"
+
+#include "../common/numpy_tag.h"
+#include <stdlib.h>
+#include <type_traits>
+
+/*
+ *****************************************************************************
+ **                            INTEGER SORTS                                **
+ *****************************************************************************
+ */
+
+// Reference: https://github.com/eloj/radix-sorting#-key-derivation
+template <class T, class UT>
+UT
+KEY_OF(UT x)
+{
+    // Floating-point is currently disabled.
+    // Floating-point tests succeed for double and float on macOS but not on
+    // Windows/Linux. Basic sorting tests succeed but others relying on sort
+    // fail. Possibly related to floating-point normalisation or multiple NaN
+    // reprs? Not sure.
+    if (std::is_floating_point<T>::value) {
+        // For floats, we invert the key if the sign bit is set, else we invert
+        // the sign bit.
+        return ((x) ^ (-((x) >> (sizeof(T) * 8 - 1)) |
+                       ((UT)1 << (sizeof(T) * 8 - 1))));
+    }
+    else if (std::is_signed<T>::value) {
+        // For signed ints, we flip the sign bit so the negatives are below the
+        // positives.
+        return ((x) ^ ((UT)1 << (sizeof(UT) * 8 - 1)));
+    }
+    else {
+        return x;
+    }
+}
+
+template <class T>
+static inline npy_ubyte
+nth_byte(T key, npy_intp l)
+{
+    return (key >> (l << 3)) & 0xFF;
+}
+
+template <class T, class UT>
+static UT *
+radixsort0(UT *start, UT *aux, npy_intp num)
+{
+    npy_intp cnt[sizeof(UT)][1 << 8] = {{0}};
+    UT key0 = KEY_OF<T>(start[0]);
+
+    for (npy_intp i = 0; i < num; i++) {
+        UT k = KEY_OF<T>(start[i]);
+
+        for (size_t l = 0; l < sizeof(UT); l++) {
+            cnt[l][nth_byte(k, l)]++;
+        }
+    }
+
+    size_t ncols = 0;
+    npy_ubyte cols[sizeof(UT)];
+    for (size_t l = 0; l < sizeof(UT); l++) {
+        if (cnt[l][nth_byte(key0, l)] != num) {
+            cols[ncols++] = l;
+        }
+    }
+
+    for (size_t l = 0; l < ncols; l++) {
+        npy_intp a = 0;
+        for (npy_intp i = 0; i < 256; i++) {
+            npy_intp b = cnt[cols[l]][i];
+            cnt[cols[l]][i] = a;
+            a += b;
+        }
+    }
+
+    for (size_t l = 0; l < ncols; l++) {
+        UT *temp;
+        for (npy_intp i = 0; i < num; i++) {
+            UT k = KEY_OF<T>(start[i]);
+            npy_intp dst = cnt[cols[l]][nth_byte(k, cols[l])]++;
+            aux[dst] = start[i];
+        }
+
+        temp = aux;
+        aux = start;
+        start = temp;
+    }
+
+    return start;
+}
+
+template <class T, class UT>
+static int
+radixsort_(UT *start, npy_intp num)
+{
+    if (num < 2) {
+        return 0;
+    }
+
+    npy_bool all_sorted = 1;
+    UT k1 = KEY_OF<T>(start[0]);
+    for (npy_intp i = 1; i < num; i++) {
+        UT k2 = KEY_OF<T>(start[i]);
+        if (k1 > k2) {
+            all_sorted = 0;
+            break;
+        }
+        k1 = k2;
+    }
+
+    if (all_sorted) {
+        return 0;
+    }
+
+    UT *aux = (UT *)malloc(num * sizeof(UT));
+    if (aux == nullptr) {
+        return -NPY_ENOMEM;
+    }
+
+    UT *sorted = radixsort0<T>(start, aux, num);
+    if (sorted != start) {
+        memcpy(start, sorted, num * sizeof(UT));
+    }
+
+    free(aux);
+    return 0;
+}
+
+template <class T>
+static int
+radixsort(void *start, npy_intp num)
+{
+    using UT = typename std::make_unsigned<T>::type;
+    return radixsort_<T>((UT *)start, num);
+}
+
+template <class T, class UT>
+static npy_intp *
+aradixsort0(UT *start, npy_intp *aux, npy_intp *tosort, npy_intp num)
+{
+    npy_intp cnt[sizeof(UT)][1 << 8] = {{0}};
+    UT key0 = KEY_OF<T>(start[0]);
+
+    for (npy_intp i = 0; i < num; i++) {
+        UT k = KEY_OF<T>(start[i]);
+
+        for (size_t l = 0; l < sizeof(UT); l++) {
+            cnt[l][nth_byte(k, l)]++;
+        }
+    }
+
+    size_t ncols = 0;
+    npy_ubyte cols[sizeof(UT)];
+    for (size_t l = 0; l < sizeof(UT); l++) {
+        if (cnt[l][nth_byte(key0, l)] != num) {
+            cols[ncols++] = l;
+        }
+    }
+
+    for (size_t l = 0; l < ncols; l++) {
+        npy_intp a = 0;
+        for (npy_intp i = 0; i < 256; i++) {
+            npy_intp b = cnt[cols[l]][i];
+            cnt[cols[l]][i] = a;
+            a += b;
+        }
+    }
+
+    for (size_t l = 0; l < ncols; l++) {
+        npy_intp *temp;
+        for (npy_intp i = 0; i < num; i++) {
+            UT k = KEY_OF<T>(start[tosort[i]]);
+            npy_intp dst = cnt[cols[l]][nth_byte(k, cols[l])]++;
+            aux[dst] = tosort[i];
+        }
+
+        temp = aux;
+        aux = tosort;
+        tosort = temp;
+    }
+
+    return tosort;
+}
+
+template <class T, class UT>
+static int
+aradixsort_(UT *start, npy_intp *tosort, npy_intp num)
+{
+    npy_intp *sorted;
+    npy_intp *aux;
+    UT k1, k2;
+    npy_bool all_sorted = 1;
+
+    if (num < 2) {
+        return 0;
+    }
+
+    k1 = KEY_OF<T>(start[tosort[0]]);
+    for (npy_intp i = 1; i < num; i++) {
+        k2 = KEY_OF<T>(start[tosort[i]]);
+        if (k1 > k2) {
+            all_sorted = 0;
+            break;
+        }
+        k1 = k2;
+    }
+
+    if (all_sorted) {
+        return 0;
+    }
+
+    aux = (npy_intp *)malloc(num * sizeof(npy_intp));
+    if (aux == NULL) {
+        return -NPY_ENOMEM;
+    }
+
+    sorted = aradixsort0<T>(start, aux, tosort, num);
+    if (sorted != tosort) {
+        memcpy(tosort, sorted, num * sizeof(npy_intp));
+    }
+
+    free(aux);
+    return 0;
+}
+
+template <class T>
+static int
+aradixsort(void *start, npy_intp *tosort, npy_intp num)
+{
+    using UT = typename std::make_unsigned<T>::type;
+    return aradixsort_<T>((UT *)start, tosort, num);
+}
+
+extern "C" {
+NPY_NO_EXPORT int
+radixsort_bool(void *vec, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return radixsort<npy_bool>(vec, cnt);
+}
+NPY_NO_EXPORT int
+radixsort_byte(void *vec, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return radixsort<npy_byte>(vec, cnt);
+}
+NPY_NO_EXPORT int
+radixsort_ubyte(void *vec, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return radixsort<npy_ubyte>(vec, cnt);
+}
+NPY_NO_EXPORT int
+radixsort_short(void *vec, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return radixsort<npy_short>(vec, cnt);
+}
+NPY_NO_EXPORT int
+radixsort_ushort(void *vec, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return radixsort<npy_ushort>(vec, cnt);
+}
+NPY_NO_EXPORT int
+radixsort_int(void *vec, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return radixsort<npy_int>(vec, cnt);
+}
+NPY_NO_EXPORT int
+radixsort_uint(void *vec, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return radixsort<npy_uint>(vec, cnt);
+}
+NPY_NO_EXPORT int
+radixsort_long(void *vec, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return radixsort<npy_long>(vec, cnt);
+}
+NPY_NO_EXPORT int
+radixsort_ulong(void *vec, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return radixsort<npy_ulong>(vec, cnt);
+}
+NPY_NO_EXPORT int
+radixsort_longlong(void *vec, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return radixsort<npy_longlong>(vec, cnt);
+}
+NPY_NO_EXPORT int
+radixsort_ulonglong(void *vec, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return radixsort<npy_ulonglong>(vec, cnt);
+}
+NPY_NO_EXPORT int
+aradixsort_bool(void *vec, npy_intp *ind, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return aradixsort<npy_bool>(vec, ind, cnt);
+}
+NPY_NO_EXPORT int
+aradixsort_byte(void *vec, npy_intp *ind, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return aradixsort<npy_byte>(vec, ind, cnt);
+}
+NPY_NO_EXPORT int
+aradixsort_ubyte(void *vec, npy_intp *ind, npy_intp cnt,
+                 void *NPY_UNUSED(null))
+{
+    return aradixsort<npy_ubyte>(vec, ind, cnt);
+}
+NPY_NO_EXPORT int
+aradixsort_short(void *vec, npy_intp *ind, npy_intp cnt,
+                 void *NPY_UNUSED(null))
+{
+    return aradixsort<npy_short>(vec, ind, cnt);
+}
+NPY_NO_EXPORT int
+aradixsort_ushort(void *vec, npy_intp *ind, npy_intp cnt,
+                  void *NPY_UNUSED(null))
+{
+    return aradixsort<npy_ushort>(vec, ind, cnt);
+}
+NPY_NO_EXPORT int
+aradixsort_int(void *vec, npy_intp *ind, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return aradixsort<npy_int>(vec, ind, cnt);
+}
+NPY_NO_EXPORT int
+aradixsort_uint(void *vec, npy_intp *ind, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return aradixsort<npy_uint>(vec, ind, cnt);
+}
+NPY_NO_EXPORT int
+aradixsort_long(void *vec, npy_intp *ind, npy_intp cnt, void *NPY_UNUSED(null))
+{
+    return aradixsort<npy_long>(vec, ind, cnt);
+}
+NPY_NO_EXPORT int
+aradixsort_ulong(void *vec, npy_intp *ind, npy_intp cnt,
+                 void *NPY_UNUSED(null))
+{
+    return aradixsort<npy_ulong>(vec, ind, cnt);
+}
+NPY_NO_EXPORT int
+aradixsort_longlong(void *vec, npy_intp *ind, npy_intp cnt,
+                    void *NPY_UNUSED(null))
+{
+    return aradixsort<npy_longlong>(vec, ind, cnt);
+}
+NPY_NO_EXPORT int
+aradixsort_ulonglong(void *vec, npy_intp *ind, npy_intp cnt,
+                     void *NPY_UNUSED(null))
+{
+    return aradixsort<npy_ulonglong>(vec, ind, cnt);
+}
+}
index d22a5c507750e2bff57dde6a58dd7599369240d5..c59e13baf6b11400fb87096360709c57e3c00463 100644 (file)
@@ -1,6 +1,7 @@
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
+
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #include <numpy/arrayobject.h>
 #include <numpy/ufuncobject.h>
 #include "numpy/npy_3kcompat.h"
index 7b1e5627ae7fcbd5205f335c1078563d2846ffa3..bf50a2226ad18e16e7643628c0aaee3b5dcd5215 100644 (file)
@@ -1,16 +1,16 @@
 /* Fixed size rational numbers exposed to Python */
-
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
 #include <structmember.h>
-#include <numpy/arrayobject.h>
-#include <numpy/ufuncobject.h>
-#include <numpy/npy_3kcompat.h>
-#include <math.h>
 
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#include "numpy/arrayobject.h"
+#include "numpy/ufuncobject.h"
+#include "numpy/npy_3kcompat.h"
 #include "common.h"  /* for error_converting */
 
+#include <math.h>
+
 
 /* Relevant arithmetic exceptions */
 
diff --git a/numpy/core/src/umath/_scaled_float_dtype.c b/numpy/core/src/umath/_scaled_float_dtype.c
new file mode 100644 (file)
index 0000000..b6c1936
--- /dev/null
@@ -0,0 +1,821 @@
+/*
+ * This file implements a basic scaled float64 DType.  The reason is to have
+ * a simple parametric DType for testing.  It is not meant to be a useful
+ * DType by itself, but due to the scaling factor has similar properties as
+ * a Unit DType.
+ *
+ * The code here should be seen as a work in progress.  Some choices are made
+ * to test certain code paths, but that does not mean that they must not
+ * be modified.
+ *
+ * NOTE: The tests were initially written using private API and ABI, ideally
+ *       they should be replaced/modified with versions using public API.
+ */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+#define _UMATHMODULE
+
+#include "numpy/ndarrayobject.h"
+#include "numpy/ufuncobject.h"
+
+#include "array_method.h"
+#include "common.h"
+#include "numpy/npy_math.h"
+#include "convert_datatype.h"
+#include "dtypemeta.h"
+#include "dispatching.h"
+
+
+typedef struct {
+    PyArray_Descr base;
+    double scaling;
+} PyArray_SFloatDescr;
+
+static PyArray_DTypeMeta PyArray_SFloatDType;
+static PyArray_SFloatDescr SFloatSingleton;
+
+
+static int
+sfloat_is_known_scalar_type(PyArray_DTypeMeta *NPY_UNUSED(cls), PyTypeObject *type)
+{
+    /* Accept only floats (some others may work due to normal casting) */
+    if (type == &PyFloat_Type) {
+        return 1;
+    }
+    return 0;
+}
+
+
+static PyArray_Descr *
+sfloat_default_descr(PyArray_DTypeMeta *NPY_UNUSED(cls))
+{
+    Py_INCREF(&SFloatSingleton);
+    return (PyArray_Descr *)&SFloatSingleton;
+}
+
+
+static PyArray_Descr *
+sfloat_discover_from_pyobject(PyArray_DTypeMeta *cls, PyObject *NPY_UNUSED(obj))
+{
+    return sfloat_default_descr(cls);
+}
+
+
+static PyArray_DTypeMeta *
+sfloat_common_dtype(PyArray_DTypeMeta *cls, PyArray_DTypeMeta *other)
+{
+    if (NPY_DT_is_legacy(other) && other->type_num == NPY_DOUBLE) {
+        Py_INCREF(cls);
+        return cls;
+    }
+    Py_INCREF(Py_NotImplemented);
+    return (PyArray_DTypeMeta *)Py_NotImplemented;
+}
+
+
+static PyArray_Descr *
+sfloat_common_instance(PyArray_Descr *descr1, PyArray_Descr *descr2)
+{
+    PyArray_SFloatDescr *sf1 = (PyArray_SFloatDescr *)descr1;
+    PyArray_SFloatDescr *sf2 = (PyArray_SFloatDescr *)descr2;
+    /* We make the choice of using the larger scaling */
+    if (sf1->scaling >= sf2->scaling) {
+        Py_INCREF(descr1);
+        return descr1;
+    }
+    Py_INCREF(descr2);
+    return descr2;
+}
+
+
+/*
+ * Implement minimal getitem and setitem to make this DType mostly(?) safe to
+ * expose in Python.
+ * TODO: This should not use the old-style API, but the new-style is missing!
+*/
+
+static PyObject *
+sfloat_getitem(char *data, PyArrayObject *arr)
+{
+    PyArray_SFloatDescr *descr = (PyArray_SFloatDescr *)PyArray_DESCR(arr);
+    double value;
+
+    memcpy(&value, data, sizeof(double));
+    return PyFloat_FromDouble(value * descr->scaling);
+}
+
+
+static int
+sfloat_setitem(PyObject *obj, char *data, PyArrayObject *arr)
+{
+    if (!PyFloat_CheckExact(obj)) {
+        PyErr_SetString(PyExc_NotImplementedError,
+                "Currently only accepts floats");
+        return -1;
+    }
+
+    PyArray_SFloatDescr *descr = (PyArray_SFloatDescr *)PyArray_DESCR(arr);
+    double value = PyFloat_AsDouble(obj);
+    value /= descr->scaling;
+
+    memcpy(data, &value, sizeof(double));
+    return 0;
+}
+
+
+/* Special DType methods and the descr->f slot storage */
+NPY_DType_Slots sfloat_slots = {
+    .default_descr = &sfloat_default_descr,
+    .discover_descr_from_pyobject = &sfloat_discover_from_pyobject,
+    .is_known_scalar_type = &sfloat_is_known_scalar_type,
+    .common_dtype = &sfloat_common_dtype,
+    .common_instance = &sfloat_common_instance,
+    .f = {
+        .getitem = (PyArray_GetItemFunc *)&sfloat_getitem,
+        .setitem = (PyArray_SetItemFunc *)&sfloat_setitem,
+    }
+};
+
+
+static PyArray_SFloatDescr SFloatSingleton = {{
+        .elsize = sizeof(double),
+        .alignment = _ALIGN(double),
+        .flags = NPY_USE_GETITEM|NPY_USE_SETITEM,
+        .type_num = -1,
+        .f = &sfloat_slots.f,
+        .byteorder = '|',  /* do not bother with byte-swapping... */
+    },
+    .scaling = 1,
+};
+
+
+static PyArray_Descr *
+sfloat_scaled_copy(PyArray_SFloatDescr *self, double factor) {
+    PyArray_SFloatDescr *new = PyObject_New(
+            PyArray_SFloatDescr, (PyTypeObject *)&PyArray_SFloatDType);
+    if (new == NULL) {
+        return NULL;
+    }
+    /* Don't copy PyObject_HEAD part */
+    memcpy((char *)new + sizeof(PyObject),
+            (char *)self + sizeof(PyObject),
+            sizeof(PyArray_SFloatDescr) - sizeof(PyObject));
+
+    new->scaling = new->scaling * factor;
+    return (PyArray_Descr *)new;
+}
+
+
+PyObject *
+python_sfloat_scaled_copy(PyArray_SFloatDescr *self, PyObject *arg)
+{
+    if (!PyFloat_Check(arg)) {
+        PyErr_SetString(PyExc_TypeError,
+                "Scaling factor must be a python float.");
+        return NULL;
+    }
+    double factor = PyFloat_AsDouble(arg);
+
+    return (PyObject *)sfloat_scaled_copy(self, factor);
+}
+
+
+static PyObject *
+sfloat_get_scaling(PyArray_SFloatDescr *self, PyObject *NPY_UNUSED(args))
+{
+    return PyFloat_FromDouble(self->scaling);
+}
+
+
+PyMethodDef sfloat_methods[] = {
+    {"scaled_by",
+         (PyCFunction)python_sfloat_scaled_copy, METH_O,
+        "Method to get a dtype copy with different scaling, mainly to "
+        "avoid having to implement many ways to create new instances."},
+    {"get_scaling",
+        (PyCFunction)sfloat_get_scaling, METH_NOARGS, NULL},
+    {NULL, NULL, 0, NULL}
+};
+
+
+static PyObject *
+sfloat_new(PyTypeObject *NPY_UNUSED(cls), PyObject *args, PyObject *kwds)
+{
+    double scaling = 1.;
+    static char *kwargs_strs[] = {"scaling", NULL};
+
+    if (!PyArg_ParseTupleAndKeywords(
+            args, kwds, "|d:_ScaledFloatTestDType", kwargs_strs, &scaling)) {
+        return NULL;
+    }
+    if (scaling == 1.) {
+        Py_INCREF(&SFloatSingleton);
+        return (PyObject *)&SFloatSingleton;
+    }
+    return (PyObject *)sfloat_scaled_copy(&SFloatSingleton, scaling);
+}
+
+
+static PyObject *
+sfloat_repr(PyArray_SFloatDescr *self)
+{
+    PyObject *scaling = PyFloat_FromDouble(self->scaling);
+    if (scaling == NULL) {
+        return NULL;
+    }
+    PyObject *res = PyUnicode_FromFormat(
+            "_ScaledFloatTestDType(scaling=%R)", scaling);
+    Py_DECREF(scaling);
+    return res;
+}
+
+
+static PyArray_DTypeMeta PyArray_SFloatDType = {{{
+        PyVarObject_HEAD_INIT(NULL, 0)
+        .tp_name = "numpy._ScaledFloatTestDType",
+        .tp_methods = sfloat_methods,
+        .tp_new = sfloat_new,
+        .tp_repr = (reprfunc)sfloat_repr,
+        .tp_str = (reprfunc)sfloat_repr,
+        .tp_basicsize = sizeof(PyArray_SFloatDescr),
+    }},
+    .type_num = -1,
+    .scalar_type = NULL,
+    .flags = NPY_DT_PARAMETRIC,
+    .dt_slots = &sfloat_slots,
+};
+
+
+/*
+ * Implement some casts.
+ */
+
+/*
+ * It would make more sense to test this early on, but this allows testing
+ * error returns.
+ */
+static int
+check_factor(double factor) {
+    if (npy_isfinite(factor) && factor != 0.) {
+        return 0;
+    }
+    NPY_ALLOW_C_API_DEF;
+    NPY_ALLOW_C_API;
+    PyErr_SetString(PyExc_TypeError,
+            "error raised inside the core-loop: non-finite factor!");
+    NPY_DISABLE_C_API;
+    return -1;
+}
+
+
+static int
+cast_sfloat_to_sfloat_unaligned(PyArrayMethod_Context *context,
+        char *const data[], npy_intp const dimensions[],
+        npy_intp const strides[], NpyAuxData *NPY_UNUSED(auxdata))
+{
+    /* could also be moved into auxdata: */
+    double factor = ((PyArray_SFloatDescr *)context->descriptors[0])->scaling;
+    factor /= ((PyArray_SFloatDescr *)context->descriptors[1])->scaling;
+    if (check_factor(factor) < 0) {
+        return -1;
+    }
+
+    npy_intp N = dimensions[0];
+    char *in = data[0];
+    char *out = data[1];
+    for (npy_intp i = 0; i < N; i++) {
+        double tmp;
+        memcpy(&tmp, in, sizeof(double));
+        tmp *= factor;
+        memcpy(out, &tmp, sizeof(double));
+
+        in += strides[0];
+        out += strides[1];
+    }
+    return 0;
+}
+
+
+static int
+cast_sfloat_to_sfloat_aligned(PyArrayMethod_Context *context,
+        char *const data[], npy_intp const dimensions[],
+        npy_intp const strides[], NpyAuxData *NPY_UNUSED(auxdata))
+{
+    /* could also be moved into auxdata: */
+    double factor = ((PyArray_SFloatDescr *)context->descriptors[0])->scaling;
+    factor /= ((PyArray_SFloatDescr *)context->descriptors[1])->scaling;
+    if (check_factor(factor) < 0) {
+        return -1;
+    }
+
+    npy_intp N = dimensions[0];
+    char *in = data[0];
+    char *out = data[1];
+    for (npy_intp i = 0; i < N; i++) {
+        *(double *)out = *(double *)in * factor;
+        in += strides[0];
+        out += strides[1];
+    }
+    return 0;
+}
+
+
+static NPY_CASTING
+sfloat_to_sfloat_resolve_descriptors(
+            PyArrayMethodObject *NPY_UNUSED(self),
+            PyArray_DTypeMeta *NPY_UNUSED(dtypes[2]),
+            PyArray_Descr *given_descrs[2],
+            PyArray_Descr *loop_descrs[2])
+{
+    loop_descrs[0] = given_descrs[0];
+    Py_INCREF(loop_descrs[0]);
+
+    if (given_descrs[1] == NULL) {
+        loop_descrs[1] = given_descrs[0];
+    }
+    else {
+        loop_descrs[1] = given_descrs[1];
+    }
+    Py_INCREF(loop_descrs[1]);
+
+    if (((PyArray_SFloatDescr *)loop_descrs[0])->scaling
+            == ((PyArray_SFloatDescr *)loop_descrs[1])->scaling) {
+        /* same scaling is just a view */
+        return NPY_NO_CASTING | _NPY_CAST_IS_VIEW;
+    }
+    else if (-((PyArray_SFloatDescr *)loop_descrs[0])->scaling
+             == ((PyArray_SFloatDescr *)loop_descrs[1])->scaling) {
+        /* changing the sign does not lose precision */
+        return NPY_EQUIV_CASTING;
+    }
+    /* Technically, this is not a safe cast, since over/underflows can occur */
+    return NPY_SAME_KIND_CASTING;
+}
+
+
+/*
+ * Casting to and from doubles.
+ *
+ * To keep things interesting, we ONLY define the trivial cast with a factor
+ * of 1.  All other casts have to be handled by the sfloat to sfloat cast.
+ *
+ * The casting machinery should optimize this step away normally, since we
+ * flag the this is a view.
+ */
+static int
+cast_float_to_from_sfloat(PyArrayMethod_Context *NPY_UNUSED(context),
+        char *const data[], npy_intp const dimensions[],
+        npy_intp const strides[], NpyAuxData *NPY_UNUSED(auxdata))
+{
+    npy_intp N = dimensions[0];
+    char *in = data[0];
+    char *out = data[1];
+    for (npy_intp i = 0; i < N; i++) {
+        *(double *)out = *(double *)in;
+        in += strides[0];
+        out += strides[1];
+    }
+    return 0;
+}
+
+
+static NPY_CASTING
+float_to_from_sfloat_resolve_descriptors(
+        PyArrayMethodObject *NPY_UNUSED(self),
+        PyArray_DTypeMeta *dtypes[2],
+        PyArray_Descr *NPY_UNUSED(given_descrs[2]),
+        PyArray_Descr *loop_descrs[2])
+{
+    loop_descrs[0] = NPY_DT_CALL_default_descr(dtypes[0]);
+    if (loop_descrs[0] == NULL) {
+        return -1;
+    }
+    loop_descrs[1] = NPY_DT_CALL_default_descr(dtypes[1]);
+    if (loop_descrs[1] == NULL) {
+        return -1;
+    }
+    return NPY_NO_CASTING | _NPY_CAST_IS_VIEW;
+}
+
+
+/*
+ * Cast to boolean (for testing the logical functions a bit better).
+ */
+static int
+cast_sfloat_to_bool(PyArrayMethod_Context *NPY_UNUSED(context),
+        char *const data[], npy_intp const dimensions[],
+        npy_intp const strides[], NpyAuxData *NPY_UNUSED(auxdata))
+{
+    npy_intp N = dimensions[0];
+    char *in = data[0];
+    char *out = data[1];
+    for (npy_intp i = 0; i < N; i++) {
+        *(npy_bool *)out = *(double *)in != 0;
+        in += strides[0];
+        out += strides[1];
+    }
+    return 0;
+}
+
+static NPY_CASTING
+sfloat_to_bool_resolve_descriptors(
+        PyArrayMethodObject *NPY_UNUSED(self),
+        PyArray_DTypeMeta *NPY_UNUSED(dtypes[2]),
+        PyArray_Descr *given_descrs[2],
+        PyArray_Descr *loop_descrs[2])
+{
+    Py_INCREF(given_descrs[0]);
+    loop_descrs[0] = given_descrs[0];
+    if (loop_descrs[0] == NULL) {
+        return -1;
+    }
+    loop_descrs[1] = PyArray_DescrFromType(NPY_BOOL);  /* cannot fail */
+    return NPY_UNSAFE_CASTING;
+}
+
+
+static int
+init_casts(void)
+{
+    PyArray_DTypeMeta *dtypes[2] = {&PyArray_SFloatDType, &PyArray_SFloatDType};
+    PyType_Slot slots[4] = {{0, NULL}};
+    PyArrayMethod_Spec spec = {
+        .name = "sfloat_to_sfloat_cast",
+        .nin = 1,
+        .nout = 1,
+        .flags = NPY_METH_SUPPORTS_UNALIGNED,
+        .dtypes = dtypes,
+        .slots = slots,
+        /* minimal guaranteed casting */
+        .casting = NPY_SAME_KIND_CASTING,
+    };
+
+    slots[0].slot = NPY_METH_resolve_descriptors;
+    slots[0].pfunc = &sfloat_to_sfloat_resolve_descriptors;
+
+    slots[1].slot = NPY_METH_strided_loop;
+    slots[1].pfunc = &cast_sfloat_to_sfloat_aligned;
+
+    slots[2].slot = NPY_METH_unaligned_strided_loop;
+    slots[2].pfunc = &cast_sfloat_to_sfloat_unaligned;
+
+    if (PyArray_AddCastingImplementation_FromSpec(&spec, 0)) {
+        return -1;
+    }
+
+    spec.name = "float_to_sfloat_cast";
+    /* Technically, it is just a copy currently so this is fine: */
+    spec.flags = NPY_METH_NO_FLOATINGPOINT_ERRORS;
+    PyArray_DTypeMeta *double_DType = PyArray_DTypeFromTypeNum(NPY_DOUBLE);
+    Py_DECREF(double_DType);  /* immortal anyway */
+    dtypes[0] = double_DType;
+
+    slots[0].slot = NPY_METH_resolve_descriptors;
+    slots[0].pfunc = &float_to_from_sfloat_resolve_descriptors;
+    slots[1].slot = NPY_METH_strided_loop;
+    slots[1].pfunc = &cast_float_to_from_sfloat;
+    slots[2].slot = 0;
+    slots[2].pfunc = NULL;
+
+    if (PyArray_AddCastingImplementation_FromSpec(&spec, 0)) {
+        return -1;
+    }
+
+    spec.name = "sfloat_to_float_cast";
+    dtypes[0] = &PyArray_SFloatDType;
+    dtypes[1] = double_DType;
+
+    if (PyArray_AddCastingImplementation_FromSpec(&spec, 0)) {
+        return -1;
+    }
+
+    slots[0].slot = NPY_METH_resolve_descriptors;
+    slots[0].pfunc = &sfloat_to_bool_resolve_descriptors;
+    slots[1].slot = NPY_METH_strided_loop;
+    slots[1].pfunc = &cast_sfloat_to_bool;
+    slots[2].slot = 0;
+    slots[2].pfunc = NULL;
+
+    spec.name = "sfloat_to_bool_cast";
+    dtypes[0] = &PyArray_SFloatDType;
+    dtypes[1] = PyArray_DTypeFromTypeNum(NPY_BOOL);
+    Py_DECREF(dtypes[1]);  /* immortal anyway */
+
+    if (PyArray_AddCastingImplementation_FromSpec(&spec, 0)) {
+        return -1;
+    }
+
+    return 0;
+}
+
+
+/*
+ * We also wish to test very simple ufunc functionality.  So create two
+ * ufunc loops:
+ * 1. Multiplication, which can multiply the factors and work with that.
+ * 2. Addition, which needs to use the common instance, and runs into
+ *    cast safety subtleties since we will implement it without an additional
+ *    cast.
+ */
+static int
+multiply_sfloats(PyArrayMethod_Context *NPY_UNUSED(context),
+        char *const data[], npy_intp const dimensions[],
+        npy_intp const strides[], NpyAuxData *NPY_UNUSED(auxdata))
+{
+    npy_intp N = dimensions[0];
+    char *in1 = data[0];
+    char *in2 = data[1];
+    char *out = data[2];
+    for (npy_intp i = 0; i < N; i++) {
+        *(double *)out = *(double *)in1 * *(double *)in2;
+        in1 += strides[0];
+        in2 += strides[1];
+        out += strides[2];
+    }
+    return 0;
+}
+
+
+static NPY_CASTING
+multiply_sfloats_resolve_descriptors(
+        PyArrayMethodObject *NPY_UNUSED(self),
+        PyArray_DTypeMeta *NPY_UNUSED(dtypes[3]),
+        PyArray_Descr *given_descrs[3],
+        PyArray_Descr *loop_descrs[3])
+{
+    /*
+     * Multiply the scaling for the result.  If the result was passed in we
+     * simply ignore it and let the casting machinery fix it up here.
+     */
+    double factor = ((PyArray_SFloatDescr *)given_descrs[1])->scaling;
+    loop_descrs[2] = sfloat_scaled_copy(
+            (PyArray_SFloatDescr *)given_descrs[0], factor);
+    if (loop_descrs[2] == 0) {
+        return -1;
+    }
+    Py_INCREF(given_descrs[0]);
+    loop_descrs[0] = given_descrs[0];
+    Py_INCREF(given_descrs[1]);
+    loop_descrs[1] = given_descrs[1];
+    return NPY_NO_CASTING;
+}
+
+
+/*
+ * Unlike the multiplication implementation above, this loops deals with
+ * scaling (casting) internally.  This allows to test some different paths.
+ */
+static int
+add_sfloats(PyArrayMethod_Context *context,
+        char *const data[], npy_intp const dimensions[],
+        npy_intp const strides[], NpyAuxData *NPY_UNUSED(auxdata))
+{
+    double fin1 = ((PyArray_SFloatDescr *)context->descriptors[0])->scaling;
+    double fin2 = ((PyArray_SFloatDescr *)context->descriptors[1])->scaling;
+    double fout = ((PyArray_SFloatDescr *)context->descriptors[2])->scaling;
+
+    double fact1 = fin1 / fout;
+    double fact2 = fin2 / fout;
+    if (check_factor(fact1) < 0) {
+        return -1;
+    }
+    if (check_factor(fact2) < 0) {
+        return -1;
+    }
+
+    npy_intp N = dimensions[0];
+    char *in1 = data[0];
+    char *in2 = data[1];
+    char *out = data[2];
+    for (npy_intp i = 0; i < N; i++) {
+        *(double *)out = (*(double *)in1 * fact1) + (*(double *)in2 * fact2);
+        in1 += strides[0];
+        in2 += strides[1];
+        out += strides[2];
+    }
+    return 0;
+}
+
+
+static NPY_CASTING
+add_sfloats_resolve_descriptors(
+        PyArrayMethodObject *NPY_UNUSED(self),
+        PyArray_DTypeMeta *NPY_UNUSED(dtypes[3]),
+        PyArray_Descr *given_descrs[3],
+        PyArray_Descr *loop_descrs[3])
+{
+    /*
+     * Here we accept an output descriptor (the inner loop can deal with it),
+     * if none is given, we use the "common instance":
+     */
+    if (given_descrs[2] == NULL) {
+        loop_descrs[2] = sfloat_common_instance(
+                given_descrs[0], given_descrs[1]);
+        if (loop_descrs[2] == 0) {
+            return -1;
+        }
+    }
+    else {
+        Py_INCREF(given_descrs[2]);
+        loop_descrs[2] = given_descrs[2];
+    }
+    Py_INCREF(given_descrs[0]);
+    loop_descrs[0] = given_descrs[0];
+    Py_INCREF(given_descrs[1]);
+    loop_descrs[1] = given_descrs[1];
+
+    /* If the factors mismatch, we do implicit casting inside the ufunc! */
+    double fin1 = ((PyArray_SFloatDescr *)loop_descrs[0])->scaling;
+    double fin2 = ((PyArray_SFloatDescr *)loop_descrs[1])->scaling;
+    double fout = ((PyArray_SFloatDescr *)loop_descrs[2])->scaling;
+
+    if (fin1 == fout && fin2 == fout) {
+        return NPY_NO_CASTING;
+    }
+    if (npy_fabs(fin1) == npy_fabs(fout) && npy_fabs(fin2) == npy_fabs(fout)) {
+        return NPY_EQUIV_CASTING;
+    }
+    return NPY_SAME_KIND_CASTING;
+}
+
+
+static int
+add_loop(const char *ufunc_name,
+        PyArray_DTypeMeta *dtypes[3], PyObject *meth_or_promoter)
+{
+    PyObject *mod = PyImport_ImportModule("numpy");
+    if (mod == NULL) {
+        return -1;
+    }
+    PyObject *ufunc = PyObject_GetAttrString(mod, ufunc_name);
+    Py_DECREF(mod);
+    if (!PyObject_TypeCheck(ufunc, &PyUFunc_Type)) {
+        Py_DECREF(ufunc);
+        PyErr_Format(PyExc_TypeError,
+                "numpy.%s was not a ufunc!", ufunc_name);
+        return -1;
+    }
+    PyObject *dtype_tup = PyArray_TupleFromItems(3, (PyObject **)dtypes, 1);
+    if (dtype_tup == NULL) {
+        Py_DECREF(ufunc);
+        return -1;
+    }
+    PyObject *info = PyTuple_Pack(2, dtype_tup, meth_or_promoter);
+    Py_DECREF(dtype_tup);
+    if (info == NULL) {
+        Py_DECREF(ufunc);
+        return -1;
+    }
+    int res = PyUFunc_AddLoop((PyUFuncObject *)ufunc, info, 0);
+    Py_DECREF(ufunc);
+    Py_DECREF(info);
+    return res;
+}
+
+
+
+/*
+ * We add some very basic promoters to allow multiplying normal and scaled
+ */
+static int
+promote_to_sfloat(PyUFuncObject *NPY_UNUSED(ufunc),
+        PyArray_DTypeMeta *const NPY_UNUSED(dtypes[3]),
+        PyArray_DTypeMeta *const signature[3],
+        PyArray_DTypeMeta *new_dtypes[3])
+{
+    for (int i = 0; i < 3; i++) {
+        PyArray_DTypeMeta *new = &PyArray_SFloatDType;
+        if (signature[i] != NULL) {
+            new = signature[i];
+        }
+        Py_INCREF(new);
+        new_dtypes[i] = new;
+    }
+    return 0;
+}
+
+
+/*
+ * Add new ufunc loops (this is somewhat clumsy as of writing it, but should
+ * get less so with the introduction of public API).
+ */
+static int
+init_ufuncs(void) {
+    PyArray_DTypeMeta *dtypes[3] = {
+            &PyArray_SFloatDType, &PyArray_SFloatDType, &PyArray_SFloatDType};
+    PyType_Slot slots[3] = {{0, NULL}};
+    PyArrayMethod_Spec spec = {
+        .nin = 2,
+        .nout =1,
+        .dtypes = dtypes,
+        .slots = slots,
+    };
+    spec.name = "sfloat_multiply";
+    spec.casting = NPY_NO_CASTING;
+
+    slots[0].slot = NPY_METH_resolve_descriptors;
+    slots[0].pfunc = &multiply_sfloats_resolve_descriptors;
+    slots[1].slot = NPY_METH_strided_loop;
+    slots[1].pfunc = &multiply_sfloats;
+    PyBoundArrayMethodObject *bmeth = PyArrayMethod_FromSpec_int(&spec, 0);
+    if (bmeth == NULL) {
+        return -1;
+    }
+    int res = add_loop("multiply",
+            bmeth->dtypes, (PyObject *)bmeth->method);
+    Py_DECREF(bmeth);
+    if (res < 0) {
+        return -1;
+    }
+
+    spec.name = "sfloat_add";
+    spec.casting = NPY_SAME_KIND_CASTING;
+
+    slots[0].slot = NPY_METH_resolve_descriptors;
+    slots[0].pfunc = &add_sfloats_resolve_descriptors;
+    slots[1].slot = NPY_METH_strided_loop;
+    slots[1].pfunc = &add_sfloats;
+    bmeth = PyArrayMethod_FromSpec_int(&spec, 0);
+    if (bmeth == NULL) {
+        return -1;
+    }
+    res = add_loop("add",
+            bmeth->dtypes, (PyObject *)bmeth->method);
+    Py_DECREF(bmeth);
+    if (res < 0) {
+        return -1;
+    }
+
+    /*
+     * Add a promoter for both directions of multiply with double.
+     */
+    PyArray_DTypeMeta *double_DType = PyArray_DTypeFromTypeNum(NPY_DOUBLE);
+    Py_DECREF(double_DType);  /* immortal anyway */
+
+    PyArray_DTypeMeta *promoter_dtypes[3] = {
+            &PyArray_SFloatDType, double_DType, NULL};
+
+    PyObject *promoter = PyCapsule_New(
+            &promote_to_sfloat, "numpy._ufunc_promoter", NULL);
+    if (promoter == NULL) {
+        return -1;
+    }
+    res = add_loop("multiply", promoter_dtypes, promoter);
+    if (res < 0) {
+        Py_DECREF(promoter);
+        return -1;
+    }
+    promoter_dtypes[0] = double_DType;
+    promoter_dtypes[1] = &PyArray_SFloatDType;
+    res = add_loop("multiply", promoter_dtypes, promoter);
+    Py_DECREF(promoter);
+    if (res < 0) {
+        return -1;
+    }
+
+    return 0;
+}
+
+
+/*
+ * Python entry point, exported via `umathmodule.h` and `multiarraymodule.c`.
+ * TODO: Should be moved when the necessary API is not internal anymore.
+ */
+NPY_NO_EXPORT PyObject *
+get_sfloat_dtype(PyObject *NPY_UNUSED(mod), PyObject *NPY_UNUSED(args))
+{
+    /* Allow calling the function multiple times. */
+    static npy_bool initialized = NPY_FALSE;
+
+    if (initialized) {
+        Py_INCREF(&PyArray_SFloatDType);
+        return (PyObject *)&PyArray_SFloatDType;
+    }
+
+    PyArray_SFloatDType.super.ht_type.tp_base = &PyArrayDescr_Type;
+
+    if (PyType_Ready((PyTypeObject *)&PyArray_SFloatDType) < 0) {
+        return NULL;
+    }
+    NPY_DT_SLOTS(&PyArray_SFloatDType)->castingimpls = PyDict_New();
+    if (NPY_DT_SLOTS(&PyArray_SFloatDType)->castingimpls == NULL) {
+        return NULL;
+    }
+
+    PyObject *o = PyObject_Init(
+            (PyObject *)&SFloatSingleton, (PyTypeObject *)&PyArray_SFloatDType);
+    if (o == NULL) {
+        return NULL;
+    }
+
+    if (init_casts() < 0) {
+        return NULL;
+    }
+
+    if (init_ufuncs() < 0) {
+        return NULL;
+    }
+
+    initialized = NPY_TRUE;
+    return (PyObject *)&PyArray_SFloatDType;
+}
index d602656c85e7d78ebedea6cf44e70a0d1eec7139..ee71c4698f79b890021631204b5ff791cff2d4a7 100644 (file)
@@ -1,11 +1,13 @@
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
 
-#include "Python.h"
-#include "math.h"
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #include "numpy/ndarraytypes.h"
 #include "numpy/ufuncobject.h"
 #include "numpy/npy_3kcompat.h"
 
+#include <math.h>
+
 
 /*
  * struct_ufunc_test.c
index 2e79d377e3d447034990231b19eeca8a345d1a3b..ce42fc2711a388fca3a5cb52d2505d04c557612d 100644 (file)
@@ -5,9 +5,10 @@
  **                            INCLUDES                                     **
  *****************************************************************************
  */
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
 
-#include "Python.h"
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #include "numpy/arrayobject.h"
 #include "numpy/ufuncobject.h"
 #include "numpy/npy_math.h"
  *****************************************************************************
  */
 
+static void
+always_error_loop(
+        char **NPY_UNUSED(args), npy_intp const *NPY_UNUSED(dimensions),
+        npy_intp const *NPY_UNUSED(steps), void *NPY_UNUSED(func))
+{
+    NPY_ALLOW_C_API_DEF
+    NPY_ALLOW_C_API;
+    PyErr_SetString(PyExc_RuntimeError, "How unexpected :)!");
+    NPY_DISABLE_C_API;
+    return;
+}
+
+
 char *inner1d_signature = "(i),(i)->()";
 
 /**begin repeat
@@ -347,6 +361,9 @@ defdict = {
 
 */
 
+static PyUFuncGenericFunction always_error_functions[] = { always_error_loop };
+static void *always_error_data[] = { (void *)NULL };
+static char always_error_signatures[] = { NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE };
 static PyUFuncGenericFunction inner1d_functions[] = { LONG_inner1d, DOUBLE_inner1d };
 static void *inner1d_data[] = { (void *)NULL, (void *)NULL };
 static char inner1d_signatures[] = { NPY_LONG, NPY_LONG, NPY_LONG, NPY_DOUBLE, NPY_DOUBLE, NPY_DOUBLE };
@@ -374,6 +391,25 @@ static int
 addUfuncs(PyObject *dictionary) {
     PyObject *f;
 
+    f = PyUFunc_FromFuncAndData(always_error_functions, always_error_data,
+            always_error_signatures, 1, 2, 1, PyUFunc_None, "always_error",
+            "simply, broken, ufunc that sets an error (but releases the GIL).",
+            0);
+    if (f == NULL) {
+        return -1;
+    }
+    PyDict_SetItemString(dictionary, "always_error", f);
+    Py_DECREF(f);
+    f = PyUFunc_FromFuncAndDataAndSignature(always_error_functions,
+            always_error_data, always_error_signatures, 1, 2, 1, PyUFunc_None,
+            "always_error_gufunc",
+            "simply, broken, gufunc that sets an error (but releases the GIL).",
+            0, "(i),()->()");
+    if (f == NULL) {
+        return -1;
+    }
+    PyDict_SetItemString(dictionary, "always_error_gufunc", f);
+    Py_DECREF(f);
     f = PyUFunc_FromFuncAndDataAndSignature(inner1d_functions, inner1d_data,
                     inner1d_signatures, 2, 2, 1, PyUFunc_None, "inner1d",
                     "inner on the last dimension and broadcast on the rest \n"
@@ -585,7 +621,7 @@ fail:
     return NULL;
 }
 
-// Testing the utilites of the CPU dispatcher
+// Testing the utilities of the CPU dispatcher
 #ifndef NPY_DISABLE_OPTIMIZATION
     #include "_umath_tests.dispatch.h"
 #endif
index 85f3650106ea7ab6f3b3a25dbb2d4f01fb6773ad..9d8df4c86d36f830928bac53dfd4b13e842eb827 100644 (file)
@@ -1,12 +1,14 @@
 /**
- * Testing the utilites of the CPU dispatcher
+ * Testing the utilities of the CPU dispatcher
  *
  * @targets $werror baseline
  * SSE2 SSE41 AVX2
  * VSX VSX2 VSX3
  * NEON ASIMD ASIMDHP
  */
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
+
 #include "npy_cpu_dispatch.h"
 
 #ifndef NPY_DISABLE_OPTIMIZATION
diff --git a/numpy/core/src/umath/clip.c.src b/numpy/core/src/umath/clip.c.src
deleted file mode 100644 (file)
index 9c4bac2..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- * This module provides the inner loops for the clip ufunc
- */
-#define _UMATHMODULE
-#define _MULTIARRAYMODULE
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-
-#include "Python.h"
-
-#include "numpy/halffloat.h"
-#include "numpy/npy_math.h"
-#include "numpy/ndarraytypes.h"
-#include "numpy/npy_common.h"
-#include "numpy/utils.h"
-#include "fast_loop_macros.h"
-
-/*
- * Produce macros that perform nan/nat-propagating min and max
- */
-
-/**begin repeat
- * #name = BOOL,
- *         BYTE, UBYTE, SHORT, USHORT, INT, UINT,
- *         LONG, ULONG, LONGLONG, ULONGLONG#
- */
-#define _NPY_@name@_MIN(a, b) PyArray_MIN(a, b)
-#define _NPY_@name@_MAX(a, b) PyArray_MAX(a, b)
-/**end repeat**/
-
-#define _NPY_HALF_MIN(a, b) (npy_half_isnan(a) || npy_half_le(a, b) ? (a) : (b))
-#define _NPY_HALF_MAX(a, b) (npy_half_isnan(a) || npy_half_ge(a, b) ? (a) : (b))
-
-/**begin repeat
- * #name = FLOAT, DOUBLE, LONGDOUBLE#
- */
-#define _NPY_@name@_MIN(a, b) (npy_isnan(a) ? (a) : PyArray_MIN(a, b))
-#define _NPY_@name@_MAX(a, b) (npy_isnan(a) ? (a) : PyArray_MAX(a, b))
-/**end repeat**/
-
-/**begin repeat
- * #name = CFLOAT, CDOUBLE, CLONGDOUBLE#
- */
-#define _NPY_@name@_MIN(a, b) (npy_isnan((a).real) || npy_isnan((a).imag) || PyArray_CLT(a, b) ? (a) : (b))
-#define _NPY_@name@_MAX(a, b) (npy_isnan((a).real) || npy_isnan((a).imag) || PyArray_CGT(a, b) ? (a) : (b))
-/**end repeat**/
-
-/**begin repeat
- * #name = DATETIME, TIMEDELTA#
- */
-#define _NPY_@name@_MIN(a, b) ( \
-    (a) == NPY_DATETIME_NAT ? (a) : \
-    (b) == NPY_DATETIME_NAT ? (b) : \
-    (a) < (b) ? (a) : (b) \
-)
-#define _NPY_@name@_MAX(a, b) ( \
-    (a) == NPY_DATETIME_NAT ? (a) : \
-    (b) == NPY_DATETIME_NAT ? (b) : \
-    (a) > (b) ? (a) : (b) \
-)
-/**end repeat**/
-
-/**begin repeat
- *
- * #name = BOOL,
- *         BYTE, UBYTE, SHORT, USHORT, INT, UINT,
- *         LONG, ULONG, LONGLONG, ULONGLONG,
- *         HALF, FLOAT, DOUBLE, LONGDOUBLE,
- *         CFLOAT, CDOUBLE, CLONGDOUBLE,
- *         DATETIME, TIMEDELTA#
- * #type = npy_bool,
- *         npy_byte, npy_ubyte, npy_short, npy_ushort, npy_int, npy_uint,
- *         npy_long, npy_ulong, npy_longlong, npy_ulonglong,
- *         npy_half, npy_float, npy_double, npy_longdouble,
- *         npy_cfloat, npy_cdouble, npy_clongdouble,
- *         npy_datetime, npy_timedelta#
- */
-
-#define _NPY_CLIP(x, min, max) \
-    _NPY_@name@_MIN(_NPY_@name@_MAX((x), (min)), (max))
-
-NPY_NO_EXPORT void
-@name@_clip(char **args, npy_intp const *dimensions, npy_intp const *steps, void *NPY_UNUSED(func))
-{
-    if (steps[1] == 0 && steps[2] == 0) {
-        /* min and max are constant throughout the loop, the most common case */
-        /* NOTE: it may be possible to optimize these checks for nan */
-        @type@ min_val = *(@type@ *)args[1];
-        @type@ max_val = *(@type@ *)args[2];
-
-        char *ip1 = args[0], *op1 = args[3];
-        npy_intp is1 = steps[0], os1 = steps[3];
-        npy_intp n = dimensions[0];
-
-        /* contiguous, branch to let the compiler optimize */
-        if (is1 == sizeof(@type@) && os1 == sizeof(@type@)) {
-            for(npy_intp i = 0; i < n; i++, ip1 += is1, op1 += os1) {
-                *(@type@ *)op1 = _NPY_CLIP(*(@type@ *)ip1, min_val, max_val);
-            }
-        }
-        else {
-            for(npy_intp i = 0; i < n; i++, ip1 += is1, op1 += os1) {
-                *(@type@ *)op1 = _NPY_CLIP(*(@type@ *)ip1, min_val, max_val);
-            }
-        }
-    }
-    else {
-        TERNARY_LOOP {
-            *(@type@ *)op1 = _NPY_CLIP(*(@type@ *)ip1, *(@type@ *)ip2, *(@type@ *)ip3);
-        }
-    }
-    npy_clear_floatstatus_barrier((char*)dimensions);
-}
-
-// clean up the macros we defined above
-#undef _NPY_CLIP
-#undef _NPY_@name@_MAX
-#undef _NPY_@name@_MIN
-
-/**end repeat**/
diff --git a/numpy/core/src/umath/clip.cpp b/numpy/core/src/umath/clip.cpp
new file mode 100644 (file)
index 0000000..19d05c8
--- /dev/null
@@ -0,0 +1,282 @@
+/**
+ * This module provides the inner loops for the clip ufunc
+ */
+#define _UMATHMODULE
+#define _MULTIARRAYMODULE
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
+#include "numpy/halffloat.h"
+#include "numpy/ndarraytypes.h"
+#include "numpy/npy_common.h"
+#include "numpy/npy_math.h"
+#include "numpy/utils.h"
+
+#include "fast_loop_macros.h"
+
+#include "../common/numpy_tag.h"
+
+template <class T>
+T
+_NPY_MIN(T a, T b, npy::integral_tag const &)
+{
+    return PyArray_MIN(a, b);
+}
+template <class T>
+T
+_NPY_MAX(T a, T b, npy::integral_tag const &)
+{
+    return PyArray_MAX(a, b);
+}
+
+npy_half
+_NPY_MIN(npy_half a, npy_half b, npy::half_tag const &)
+{
+    return npy_half_isnan(a) || npy_half_le(a, b) ? (a) : (b);
+}
+npy_half
+_NPY_MAX(npy_half a, npy_half b, npy::half_tag const &)
+{
+    return npy_half_isnan(a) || npy_half_ge(a, b) ? (a) : (b);
+}
+
+template <class T>
+T
+_NPY_MIN(T a, T b, npy::floating_point_tag const &)
+{
+    return npy_isnan(a) ? (a) : PyArray_MIN(a, b);
+}
+template <class T>
+T
+_NPY_MAX(T a, T b, npy::floating_point_tag const &)
+{
+    return npy_isnan(a) ? (a) : PyArray_MAX(a, b);
+}
+
+template <class T>
+T
+_NPY_MIN(T a, T b, npy::complex_tag const &)
+{
+    return npy_isnan((a).real) || npy_isnan((a).imag) || PyArray_CLT(a, b)
+                   ? (a)
+                   : (b);
+}
+template <class T>
+T
+_NPY_MAX(T a, T b, npy::complex_tag const &)
+{
+    return npy_isnan((a).real) || npy_isnan((a).imag) || PyArray_CGT(a, b)
+                   ? (a)
+                   : (b);
+}
+
+template <class T>
+T
+_NPY_MIN(T a, T b, npy::date_tag const &)
+{
+    return (a) == NPY_DATETIME_NAT   ? (a)
+           : (b) == NPY_DATETIME_NAT ? (b)
+           : (a) < (b)               ? (a)
+                                     : (b);
+}
+template <class T>
+T
+_NPY_MAX(T a, T b, npy::date_tag const &)
+{
+    return (a) == NPY_DATETIME_NAT   ? (a)
+           : (b) == NPY_DATETIME_NAT ? (b)
+           : (a) > (b)               ? (a)
+                                     : (b);
+}
+
+/* generic dispatcher */
+template <class Tag, class T = typename Tag::type>
+T
+_NPY_MIN(T const &a, T const &b)
+{
+    return _NPY_MIN(a, b, Tag{});
+}
+template <class Tag, class T = typename Tag::type>
+T
+_NPY_MAX(T const &a, T const &b)
+{
+    return _NPY_MAX(a, b, Tag{});
+}
+
+template <class Tag, class T>
+T
+_NPY_CLIP(T x, T min, T max)
+{
+    return _NPY_MIN<Tag>(_NPY_MAX<Tag>((x), (min)), (max));
+}
+
+template <class Tag, class T = typename Tag::type>
+static void
+_npy_clip_(T **args, npy_intp const *dimensions, npy_intp const *steps)
+{
+    npy_intp n = dimensions[0];
+    if (steps[1] == 0 && steps[2] == 0) {
+        /* min and max are constant throughout the loop, the most common case
+         */
+        /* NOTE: it may be possible to optimize these checks for nan */
+        T min_val = *args[1];
+        T max_val = *args[2];
+
+        T *ip1 = args[0], *op1 = args[3];
+        npy_intp is1 = steps[0] / sizeof(T), os1 = steps[3] / sizeof(T);
+
+        /* contiguous, branch to let the compiler optimize */
+        if (is1 == 1 && os1 == 1) {
+            for (npy_intp i = 0; i < n; i++, ip1++, op1++) {
+                *op1 = _NPY_CLIP<Tag>(*ip1, min_val, max_val);
+            }
+        }
+        else {
+            for (npy_intp i = 0; i < n; i++, ip1 += is1, op1 += os1) {
+                *op1 = _NPY_CLIP<Tag>(*ip1, min_val, max_val);
+            }
+        }
+    }
+    else {
+        T *ip1 = args[0], *ip2 = args[1], *ip3 = args[2], *op1 = args[3];
+        npy_intp is1 = steps[0] / sizeof(T), is2 = steps[1] / sizeof(T),
+                 is3 = steps[2] / sizeof(T), os1 = steps[3] / sizeof(T);
+        for (npy_intp i = 0; i < n;
+             i++, ip1 += is1, ip2 += is2, ip3 += is3, op1 += os1)
+            *op1 = _NPY_CLIP<Tag>(*ip1, *ip2, *ip3);
+    }
+    npy_clear_floatstatus_barrier((char *)dimensions);
+}
+
+template <class Tag>
+static void
+_npy_clip(char **args, npy_intp const *dimensions, npy_intp const *steps)
+{
+    using T = typename Tag::type;
+    return _npy_clip_<Tag>((T **)args, dimensions, steps);
+}
+
+extern "C" {
+NPY_NO_EXPORT void
+BOOL_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+          void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::bool_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+BYTE_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+          void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::byte_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+UBYTE_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+           void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::ubyte_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+SHORT_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+           void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::short_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+USHORT_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+            void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::ushort_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+INT_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+         void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::int_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+UINT_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+          void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::uint_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+LONG_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+          void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::long_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+ULONG_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+           void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::ulong_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+LONGLONG_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+              void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::longlong_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+ULONGLONG_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+               void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::ulonglong_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+HALF_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+          void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::half_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+FLOAT_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+           void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::float_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+DOUBLE_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+            void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::double_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+LONGDOUBLE_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+                void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::longdouble_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+CFLOAT_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+            void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::cfloat_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+CDOUBLE_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+             void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::cdouble_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+CLONGDOUBLE_clip(char **args, npy_intp const *dimensions,
+                 npy_intp const *steps, void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::clongdouble_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+DATETIME_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+              void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::datetime_tag>(args, dimensions, steps);
+}
+NPY_NO_EXPORT void
+TIMEDELTA_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+               void *NPY_UNUSED(func))
+{
+    return _npy_clip<npy::timedelta_tag>(args, dimensions, steps);
+}
+}
diff --git a/numpy/core/src/umath/clip.h b/numpy/core/src/umath/clip.h
new file mode 100644 (file)
index 0000000..f69ebd1
--- /dev/null
@@ -0,0 +1,73 @@
+#ifndef _NPY_UMATH_CLIP_H_
+#define _NPY_UMATH_CLIP_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+NPY_NO_EXPORT void
+BOOL_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+          void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+BYTE_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+          void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+UBYTE_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+           void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+SHORT_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+           void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+USHORT_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+            void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+INT_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+         void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+UINT_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+          void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+LONG_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+          void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+ULONG_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+           void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+LONGLONG_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+              void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+ULONGLONG_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+               void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+HALF_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+          void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+FLOAT_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+           void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+DOUBLE_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+            void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+LONGDOUBLE_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+                void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+CFLOAT_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+            void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+CDOUBLE_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+             void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+CLONGDOUBLE_clip(char **args, npy_intp const *dimensions,
+                 npy_intp const *steps, void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+DATETIME_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+              void *NPY_UNUSED(func));
+NPY_NO_EXPORT void
+TIMEDELTA_clip(char **args, npy_intp const *dimensions, npy_intp const *steps,
+               void *NPY_UNUSED(func));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/numpy/core/src/umath/clip.h.src b/numpy/core/src/umath/clip.h.src
deleted file mode 100644 (file)
index f16856c..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef _NPY_UMATH_CLIP_H_
-#define _NPY_UMATH_CLIP_H_
-
-
-/**begin repeat
- *
- * #name = BOOL,
- *         BYTE, UBYTE, SHORT, USHORT, INT, UINT,
- *         LONG, ULONG, LONGLONG, ULONGLONG,
- *         HALF, FLOAT, DOUBLE, LONGDOUBLE,
- *         CFLOAT, CDOUBLE, CLONGDOUBLE,
- *         DATETIME, TIMEDELTA#
- */
-NPY_NO_EXPORT void
-@name@_clip(char **args, npy_intp const *dimensions, npy_intp const *steps, void *NPY_UNUSED(func));
-/**end repeat**/
-
-#endif
diff --git a/numpy/core/src/umath/dispatching.c b/numpy/core/src/umath/dispatching.c
new file mode 100644 (file)
index 0000000..81d47a0
--- /dev/null
@@ -0,0 +1,1091 @@
+/*
+ * This file implements universal function dispatching and promotion (which
+ * is necessary to happen before dispatching).
+ * This is part of the UFunc object.  Promotion and dispatching uses the
+ * following things:
+ *
+ * - operand_DTypes:  The datatypes as passed in by the user.
+ * - signature: The DTypes fixed by the user with `dtype=` or `signature=`.
+ * - ufunc._loops: A list of all ArrayMethods and promoters, it contains
+ *   tuples `(dtypes, ArrayMethod)` or `(dtypes, promoter)`.
+ * - ufunc._dispatch_cache: A cache to store previous promotion and/or
+ *   dispatching results.
+ * - The actual arrays are used to support the old code paths where necessary.
+ *   (this includes any value-based casting/promotion logic)
+ *
+ * In general, `operand_Dtypes` is always overridden by `signature`.  If a
+ * DType is included in the `signature` it must match precisely.
+ *
+ * The process of dispatching and promotion can be summarized in the following
+ * steps:
+ *
+ * 1. Override any `operand_DTypes` from `signature`.
+ * 2. Check if the new `operand_Dtypes` is cached (if it is, got to 4.)
+ * 3. Find the best matching "loop".  This is done using multiple dispatching
+ *    on all `operand_DTypes` and loop `dtypes`.  A matching loop must be
+ *    one whose DTypes are superclasses of the `operand_DTypes` (that are
+ *    defined).  The best matching loop must be better than any other matching
+ *    loop.  This result is cached.
+ * 4. If the found loop is a promoter: We call the promoter. It can modify
+ *    the `operand_DTypes` currently.  Then go back to step 2.
+ *    (The promoter can call arbitrary code, so it could even add the matching
+ *    loop first.)
+ * 5. The final `ArrayMethod` is found, its registered `dtypes` is copied
+ *    into the `signature` so that it is available to the ufunc loop.
+ *
+ */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+#define _UMATHMODULE
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
+#include "numpy/ndarraytypes.h"
+#include "common.h"
+
+#include "dispatching.h"
+#include "dtypemeta.h"
+#include "common_dtype.h"
+#include "npy_hashtable.h"
+#include "legacy_array_method.h"
+#include "ufunc_object.h"
+#include "ufunc_type_resolution.h"
+
+
+#define PROMOTION_DEBUG_TRACING 0
+
+
+/* forward declaration */
+static NPY_INLINE PyObject *
+promote_and_get_info_and_ufuncimpl(PyUFuncObject *ufunc,
+        PyArrayObject *const ops[],
+        PyArray_DTypeMeta *signature[],
+        PyArray_DTypeMeta *op_dtypes[],
+        npy_bool allow_legacy_promotion);
+
+
+/**
+ * Function to add a new loop to the ufunc.  This mainly appends it to the
+ * list (as it currently is just a list).
+ *
+ * @param ufunc The universal function to add the loop to.
+ * @param info The tuple (dtype_tuple, ArrayMethod/promoter).
+ * @param ignore_duplicate If 1 and a loop with the same `dtype_tuple` is
+ *        found, the function does nothing.
+ */
+NPY_NO_EXPORT int
+PyUFunc_AddLoop(PyUFuncObject *ufunc, PyObject *info, int ignore_duplicate)
+{
+    /*
+     * Validate the info object, this should likely move to to a different
+     * entry-point in the future (and is mostly unnecessary currently).
+     */
+    if (!PyTuple_CheckExact(info) || PyTuple_GET_SIZE(info) != 2) {
+        PyErr_SetString(PyExc_TypeError,
+                "Info must be a tuple: "
+                "(tuple of DTypes or None, ArrayMethod or promoter)");
+        return -1;
+    }
+    PyObject *DType_tuple = PyTuple_GetItem(info, 0);
+    if (PyTuple_GET_SIZE(DType_tuple) != ufunc->nargs) {
+        PyErr_SetString(PyExc_TypeError,
+                "DType tuple length does not match ufunc number of operands");
+        return -1;
+    }
+    for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(DType_tuple); i++) {
+        PyObject *item = PyTuple_GET_ITEM(DType_tuple, i);
+        if (item != Py_None
+                && !PyObject_TypeCheck(item, &PyArrayDTypeMeta_Type)) {
+            PyErr_SetString(PyExc_TypeError,
+                    "DType tuple may only contain None and DType classes");
+            return -1;
+        }
+    }
+    PyObject *meth_or_promoter = PyTuple_GET_ITEM(info, 1);
+    if (!PyObject_TypeCheck(meth_or_promoter, &PyArrayMethod_Type)
+            && !PyCapsule_IsValid(meth_or_promoter, "numpy._ufunc_promoter")) {
+        PyErr_SetString(PyExc_TypeError,
+                "Second argument to info must be an ArrayMethod or promoter");
+        return -1;
+    }
+
+    if (ufunc->_loops == NULL) {
+        ufunc->_loops = PyList_New(0);
+        if (ufunc->_loops == NULL) {
+            return -1;
+        }
+    }
+
+    PyObject *loops = ufunc->_loops;
+    Py_ssize_t length = PyList_Size(loops);
+    for (Py_ssize_t i = 0; i < length; i++) {
+        PyObject *item = PyList_GetItem(loops, i);
+        PyObject *cur_DType_tuple = PyTuple_GetItem(item, 0);
+        int cmp = PyObject_RichCompareBool(cur_DType_tuple, DType_tuple, Py_EQ);
+        if (cmp < 0) {
+            return -1;
+        }
+        if (cmp == 0) {
+            continue;
+        }
+        if (ignore_duplicate) {
+            return 0;
+        }
+        PyErr_Format(PyExc_TypeError,
+                "A loop/promoter has already been registered with '%s' for %R",
+                ufunc_get_name_cstr(ufunc), DType_tuple);
+        return -1;
+    }
+
+    if (PyList_Append(loops, info) < 0) {
+        return -1;
+    }
+    return 0;
+}
+
+
+/**
+ * Resolves the implementation to use, this uses typical multiple dispatching
+ * methods of finding the best matching implementation or resolver.
+ * (Based on `isinstance()`, the knowledge that non-abstract DTypes cannot
+ * be subclassed is used, however.)
+ *
+ * NOTE: This currently does not take into account output dtypes which do not
+ *       have to match.  The possible extension here is that if an output
+ *       is given (and thus an output dtype), but not part of the signature
+ *       we could ignore it for matching, but *prefer* a loop that matches
+ *       better.
+ *       Why is this not done currently?  First, it seems a niche feature that
+ *       loops can only be distinguished based on the output dtype.  Second,
+ *       there are some nasty theoretical things because:
+ *
+ *            np.add(f4, f4, out=f8)
+ *            np.add(f4, f4, out=f8, dtype=f8)
+ *
+ *       are different, the first uses the f4 loop, the second the f8 loop.
+ *       The problem is, that the current cache only uses the op_dtypes and
+ *       both are `(f4, f4, f8)`.  The cache would need to store also which
+ *       output was provided by `dtype=`/`signature=`.
+ *
+ * @param ufunc
+ * @param op_dtypes The DTypes that are either passed in (defined by an
+ *        operand) or defined by the `signature` as also passed in as
+ *        `fixed_DTypes`.
+ * @param out_info Returns the tuple describing the best implementation
+ *        (consisting of dtypes and ArrayMethod or promoter).
+ *        WARNING: Returns a borrowed reference!
+ * @returns -1 on error 0 on success.  Note that the output can be NULL on
+ *          success if nothing is found.
+ */
+static int
+resolve_implementation_info(PyUFuncObject *ufunc,
+        PyArray_DTypeMeta *op_dtypes[], npy_bool only_promoters,
+        PyObject **out_info)
+{
+    int nin = ufunc->nin, nargs = ufunc->nargs;
+    Py_ssize_t size = PySequence_Length(ufunc->_loops);
+    PyObject *best_dtypes = NULL;
+    PyObject *best_resolver_info = NULL;
+
+#if PROMOTION_DEBUG_TRACING
+    printf("Promoting for '%s' promoters only: %d\n",
+            ufunc->name ? ufunc->name : "<unknown>", (int)only_promoters);
+    printf("    DTypes: ");
+    PyObject *tmp = PyArray_TupleFromItems(ufunc->nargs, op_dtypes, 1);
+    PyObject_Print(tmp, stdout, 0);
+    Py_DECREF(tmp);
+    printf("\n");
+    Py_DECREF(tmp);
+#endif
+
+    for (Py_ssize_t res_idx = 0; res_idx < size; res_idx++) {
+        /* Test all resolvers  */
+        PyObject *resolver_info = PySequence_Fast_GET_ITEM(
+                ufunc->_loops, res_idx);
+
+        if (only_promoters && PyObject_TypeCheck(
+                    PyTuple_GET_ITEM(resolver_info, 1), &PyArrayMethod_Type)) {
+            continue;
+        }
+
+        PyObject *curr_dtypes = PyTuple_GET_ITEM(resolver_info, 0);
+        /*
+         * Test if the current resolver matches, it could make sense to
+         * reorder these checks to avoid the IsSubclass check as much as
+         * possible.
+         */
+
+        npy_bool matches = NPY_TRUE;
+        /*
+         * NOTE: We currently match the output dtype exactly here, this is
+         *       actually only necessary if the signature includes.
+         *       Currently, we rely that op-dtypes[nin:nout] is NULLed if not.
+         */
+        for (Py_ssize_t i = 0; i < nargs; i++) {
+            PyArray_DTypeMeta *given_dtype = op_dtypes[i];
+            PyArray_DTypeMeta *resolver_dtype = (
+                    (PyArray_DTypeMeta *)PyTuple_GET_ITEM(curr_dtypes, i));
+            assert((PyObject *)given_dtype != Py_None);
+            if (given_dtype == NULL) {
+                if (i >= nin) {
+                    /* Unspecified out always matches (see below for inputs) */
+                    continue;
+                }
+                /*
+                 * This is a reduce-like operation, which always have the form
+                 * `(res_DType, op_DType, res_DType)`.  If the first and last
+                 * dtype of the loops match, this should be reduce-compatible.
+                 */
+                if (PyTuple_GET_ITEM(curr_dtypes, 0)
+                        == PyTuple_GET_ITEM(curr_dtypes, 2)) {
+                    continue;
+                }
+            }
+
+            if (resolver_dtype == (PyArray_DTypeMeta *)Py_None) {
+                /* always matches */
+                continue;
+            }
+            if (given_dtype == resolver_dtype) {
+                continue;
+            }
+            if (!NPY_DT_is_abstract(resolver_dtype)) {
+                matches = NPY_FALSE;
+                break;
+            }
+
+            int subclass = PyObject_IsSubclass(
+                    (PyObject *)given_dtype, (PyObject *)resolver_dtype);
+            if (subclass < 0) {
+                return -1;
+            }
+            if (!subclass) {
+                matches = NPY_FALSE;
+                break;
+            }
+            /*
+             * TODO: Could consider allowing reverse subclass relation, i.e.
+             *       the operation DType passed in to be abstract.  That
+             *       definitely is OK for outputs (and potentially useful,
+             *       you could enforce e.g. an inexact result).
+             *       It might also be useful for some stranger promoters.
+             */
+        }
+        if (!matches) {
+            continue;
+        }
+
+        /* The resolver matches, but we have to check if it is better */
+        if (best_dtypes != NULL) {
+            int current_best = -1;  /* -1 neither, 0 current best, 1 new */
+            /*
+             * If both have concrete and None in the same position and
+             * they are identical, we will continue searching using the
+             * first best for comparison, in an attempt to find a better
+             * one.
+             * In all cases, we give up resolution, since it would be
+             * necessary to compare to two "best" cases.
+             */
+            for (Py_ssize_t i = 0; i < nargs; i++) {
+                if (i == ufunc->nin && current_best != -1) {
+                    /* inputs prefer one loop and outputs have lower priority */
+                    break;
+                }
+
+                int best;
+
+                PyObject *prev_dtype = PyTuple_GET_ITEM(best_dtypes, i);
+                PyObject *new_dtype = PyTuple_GET_ITEM(curr_dtypes, i);
+
+                if (prev_dtype == new_dtype) {
+                    /* equivalent, so this entry does not matter */
+                    continue;
+                }
+                if (op_dtypes[i] == NULL) {
+                    /*
+                     * If an a dtype is NULL it always matches, so there is no
+                     * point in defining one as more precise than the other.
+                     */
+                    continue;
+                }
+                /* If either is None, the other is strictly more specific */
+                if (prev_dtype == Py_None) {
+                    best = 1;
+                }
+                else if (new_dtype == Py_None) {
+                    best = 0;
+                }
+                /*
+                 * If both are concrete and not identical, this is
+                 * ambiguous.
+                 */
+                else if (!NPY_DT_is_abstract((PyArray_DTypeMeta *)prev_dtype) &&
+                         !NPY_DT_is_abstract((PyArray_DTypeMeta *)new_dtype)) {
+                    /*
+                     * Ambiguous unless they are identical (checked above),
+                     * or one matches exactly.
+                     */
+                    if (prev_dtype == (PyObject *)op_dtypes[i]) {
+                        best = 0;
+                    }
+                    else if (new_dtype == (PyObject *)op_dtypes[i]) {
+                        best = 1;
+                    }
+                    else {
+                        best = -1;
+                    }
+                }
+                else if (!NPY_DT_is_abstract((PyArray_DTypeMeta *)prev_dtype)) {
+                    /* old is not abstract, so better (both not possible) */
+                    best = 0;
+                }
+                else if (!NPY_DT_is_abstract((PyArray_DTypeMeta *)new_dtype)) {
+                    /* new is not abstract, so better (both not possible) */
+                    best = 1;
+                }
+                /*
+                 * TODO: This will need logic for abstract DTypes to decide if
+                 *       one is a subclass of the other (And their subclass
+                 *       relation is well defined).  For now, we bail out
+                 *       in cas someone manages to get here.
+                 */
+                else {
+                    PyErr_SetString(PyExc_NotImplementedError,
+                            "deciding which one of two abstract dtypes is "
+                            "a better match is not yet implemented.  This "
+                            "will pick the better (or bail) in the future.");
+                    *out_info = NULL;
+                    return -1;
+                }
+
+                if (best == -1) {
+                    /* no new info, nothing to update */
+                    continue;
+                }
+                if ((current_best != -1) && (current_best != best)) {
+                    /*
+                     * We need a clear best, this could be tricky, unless
+                     * the signature is identical, we would have to compare
+                     * against both of the found ones until we find a
+                     * better one.
+                     * Instead, only support the case where they are
+                     * identical.
+                     */
+                    /* TODO: Document the above comment, may need relaxing? */
+                    current_best = -1;
+                    break;
+                }
+                current_best = best;
+            }
+
+            if (current_best == -1) {
+                /*
+                 * We could not find a best loop, but promoters should be
+                 * designed in a way to disambiguate such scenarios, so we
+                 * retry the whole lookup using only promoters.
+                 * (There is a small chance we already got two promoters.
+                 * We just redo it anyway for simplicity.)
+                 */
+                if (!only_promoters) {
+                    return resolve_implementation_info(ufunc,
+                            op_dtypes, NPY_TRUE, out_info);
+                }
+                /*
+                 * If this is already the retry, we are out of luck.  Promoters
+                 * should be designed in a way that this cannot happen!
+                 * (It should be noted, that the retry might not find anything
+                 * and we still do a legacy lookup later.)
+                 */
+                PyObject *given = PyArray_TupleFromItems(
+                        ufunc->nargs, (PyObject **)op_dtypes, 1);
+                if (given != NULL) {
+                    PyErr_Format(PyExc_RuntimeError,
+                            "Could not find a loop for the inputs:\n    %S\n"
+                            "The two promoters %S and %S matched the input "
+                            "equally well.  Promoters must be designed "
+                            "to be unambiguous.  NOTE: This indicates an error "
+                            "in NumPy or an extending library and should be "
+                            "reported.",
+                            given, best_dtypes, curr_dtypes);
+                    Py_DECREF(given);
+                }
+                *out_info = NULL;
+                return 0;
+            }
+            else if (current_best == 0) {
+                /* The new match is not better, continue looking. */
+                continue;
+            }
+        }
+        /* The new match is better (or there was no previous match) */
+        best_dtypes = curr_dtypes;
+        best_resolver_info = resolver_info;
+    }
+    if (best_dtypes == NULL) {
+        /* The non-legacy lookup failed */
+        *out_info = NULL;
+        return 0;
+    }
+
+    *out_info = best_resolver_info;
+    return 0;
+}
+
+
+/*
+ * A promoter can currently be either a C-Capsule containing a promoter
+ * function pointer, or a Python function.  Both of these can at this time
+ * only return new operation DTypes (i.e. mutate the input while leaving
+ * those defined by the `signature` unmodified).
+ */
+static PyObject *
+call_promoter_and_recurse(PyUFuncObject *ufunc, PyObject *promoter,
+        PyArray_DTypeMeta *op_dtypes[], PyArray_DTypeMeta *signature[],
+        PyArrayObject *const operands[])
+{
+    int nargs = ufunc->nargs;
+    PyObject *resolved_info = NULL;
+
+    int promoter_result;
+    PyArray_DTypeMeta *new_op_dtypes[NPY_MAXARGS];
+
+    if (PyCapsule_CheckExact(promoter)) {
+        /* We could also go the other way and wrap up the python function... */
+        promoter_function *promoter_function = PyCapsule_GetPointer(promoter,
+                "numpy._ufunc_promoter");
+        if (promoter_function == NULL) {
+            return NULL;
+        }
+        promoter_result = promoter_function(ufunc,
+                op_dtypes, signature, new_op_dtypes);
+    }
+    else {
+        PyErr_SetString(PyExc_NotImplementedError,
+                "Calling python functions for promotion is not implemented.");
+        return NULL;
+    }
+    if (promoter_result < 0) {
+        return NULL;
+    }
+    /*
+     * If none of the dtypes changes, we would recurse infinitely, abort.
+     * (Of course it is nevertheless possible to recurse infinitely.)
+     */
+    int dtypes_changed = 0;
+    for (int i = 0; i < nargs; i++) {
+        if (new_op_dtypes[i] != op_dtypes[i]) {
+            dtypes_changed = 1;
+            break;
+        }
+    }
+    if (!dtypes_changed) {
+        goto finish;
+    }
+
+    /*
+     * Do a recursive call, the promotion function has to ensure that the
+     * new tuple is strictly more precise (thus guaranteeing eventual finishing)
+     */
+    if (Py_EnterRecursiveCall(" during ufunc promotion.") != 0) {
+        goto finish;
+    }
+    resolved_info = promote_and_get_info_and_ufuncimpl(ufunc,
+            operands, signature, new_op_dtypes,
+            /* no legacy promotion */ NPY_FALSE);
+
+    Py_LeaveRecursiveCall();
+
+  finish:
+    for (int i = 0; i < nargs; i++) {
+        Py_XDECREF(new_op_dtypes[i]);
+    }
+    return resolved_info;
+}
+
+
+/*
+ * Convert the DType `signature` into the tuple of descriptors that is used
+ * by the old ufunc type resolvers in `ufunc_type_resolution.c`.
+ *
+ * Note that we do not need to pass the type tuple when we use the legacy path
+ * for type resolution rather than promotion, since the signature is always
+ * correct in that case.
+ */
+static int
+_make_new_typetup(
+        int nop, PyArray_DTypeMeta *signature[], PyObject **out_typetup) {
+    *out_typetup = PyTuple_New(nop);
+    if (*out_typetup == NULL) {
+        return -1;
+    }
+
+    int none_count = 0;
+    for (int i = 0; i < nop; i++) {
+        PyObject *item;
+        if (signature[i] == NULL) {
+            item = Py_None;
+            none_count++;
+        }
+        else {
+            if (!NPY_DT_is_legacy(signature[i])
+                    || NPY_DT_is_abstract(signature[i])) {
+                /*
+                 * The legacy type resolution can't deal with these.
+                 * This path will return `None` or so in the future to
+                 * set an error later if the legacy type resolution is used.
+                 */
+                PyErr_SetString(PyExc_RuntimeError,
+                        "Internal NumPy error: new DType in signature not yet "
+                        "supported. (This should be unreachable code!)");
+                Py_SETREF(*out_typetup, NULL);
+                return -1;
+            }
+            item = (PyObject *)signature[i]->singleton;
+        }
+        Py_INCREF(item);
+        PyTuple_SET_ITEM(*out_typetup, i, item);
+    }
+    if (none_count == nop) {
+        /* The whole signature was None, simply ignore type tuple */
+        Py_DECREF(*out_typetup);
+        *out_typetup = NULL;
+    }
+    return 0;
+}
+
+
+/*
+ * Fills in the operation_DTypes with borrowed references.  This may change
+ * the content, since it will use the legacy type resolution, which can special
+ * case 0-D arrays (using value-based logic).
+ */
+static int
+legacy_promote_using_legacy_type_resolver(PyUFuncObject *ufunc,
+        PyArrayObject *const *ops, PyArray_DTypeMeta *signature[],
+        PyArray_DTypeMeta *operation_DTypes[], int *out_cacheable)
+{
+    int nargs = ufunc->nargs;
+    PyArray_Descr *out_descrs[NPY_MAXARGS] = {NULL};
+
+    PyObject *type_tuple = NULL;
+    if (_make_new_typetup(nargs, signature, &type_tuple) < 0) {
+        return -1;
+    }
+
+    /*
+     * We use unsafe casting. This is of course not accurate, but that is OK
+     * here, because for promotion/dispatching the casting safety makes no
+     * difference.  Whether the actual operands can be casts must be checked
+     * during the type resolution step (which may _also_ calls this!).
+     */
+    if (ufunc->type_resolver(ufunc,
+            NPY_UNSAFE_CASTING, (PyArrayObject **)ops, type_tuple,
+            out_descrs) < 0) {
+        Py_XDECREF(type_tuple);
+        /* Not all legacy resolvers clean up on failures: */
+        for (int i = 0; i < nargs; i++) {
+            Py_CLEAR(out_descrs[i]);
+        }
+        return -1;
+    }
+    Py_XDECREF(type_tuple);
+
+    for (int i = 0; i < nargs; i++) {
+        Py_XSETREF(operation_DTypes[i], NPY_DTYPE(out_descrs[i]));
+        Py_INCREF(operation_DTypes[i]);
+        Py_DECREF(out_descrs[i]);
+    }
+    /*
+     * The PyUFunc_SimpleBinaryComparisonTypeResolver has a deprecation
+     * warning (ignoring `dtype=`) and cannot be cached.
+     * All datetime ones *should* have a warning, but currently don't,
+     * but ignore all signature passing also.  So they can also
+     * not be cached, and they mutate the signature which of course is wrong,
+     * but not doing it would confuse the code later.
+     */
+    for (int i = 0; i < nargs; i++) {
+        if (signature[i] != NULL && signature[i] != operation_DTypes[i]) {
+            Py_INCREF(operation_DTypes[i]);
+            Py_SETREF(signature[i], operation_DTypes[i]);
+            *out_cacheable = 0;
+        }
+    }
+    return 0;
+}
+
+
+/*
+ * Note, this function returns a BORROWED references to info since it adds
+ * it to the loops.
+ */
+NPY_NO_EXPORT PyObject *
+add_and_return_legacy_wrapping_ufunc_loop(PyUFuncObject *ufunc,
+        PyArray_DTypeMeta *operation_dtypes[], int ignore_duplicate)
+{
+    PyObject *DType_tuple = PyArray_TupleFromItems(ufunc->nargs,
+            (PyObject **)operation_dtypes, 0);
+    if (DType_tuple == NULL) {
+        return NULL;
+    }
+
+    PyArrayMethodObject *method = PyArray_NewLegacyWrappingArrayMethod(
+            ufunc, operation_dtypes);
+    if (method == NULL) {
+        Py_DECREF(DType_tuple);
+        return NULL;
+    }
+    PyObject *info = PyTuple_Pack(2, DType_tuple, method);
+    Py_DECREF(DType_tuple);
+    Py_DECREF(method);
+    if (info == NULL) {
+        return NULL;
+    }
+    if (PyUFunc_AddLoop(ufunc, info, ignore_duplicate) < 0) {
+        Py_DECREF(info);
+        return NULL;
+    }
+    Py_DECREF(info);  /* now borrowed from the ufunc's list of loops */
+    return info;
+}
+
+
+/*
+ * The main implementation to find the correct DType signature and ArrayMethod
+ * to use for a ufunc.  This function may recurse with `do_legacy_fallback`
+ * set to False.
+ *
+ * If value-based promotion is necessary, this is handled ahead of time by
+ * `promote_and_get_ufuncimpl`.
+ */
+static NPY_INLINE PyObject *
+promote_and_get_info_and_ufuncimpl(PyUFuncObject *ufunc,
+        PyArrayObject *const ops[],
+        PyArray_DTypeMeta *signature[],
+        PyArray_DTypeMeta *op_dtypes[],
+        npy_bool allow_legacy_promotion)
+{
+    /*
+     * Fetch the dispatching info which consists of the implementation and
+     * the DType signature tuple.  There are three steps:
+     *
+     * 1. Check the cache.
+     * 2. Check all registered loops/promoters to find the best match.
+     * 3. Fall back to the legacy implementation if no match was found.
+     */
+    PyObject *info = PyArrayIdentityHash_GetItem(ufunc->_dispatch_cache,
+                (PyObject **)op_dtypes);
+    if (info != NULL && PyObject_TypeCheck(
+            PyTuple_GET_ITEM(info, 1), &PyArrayMethod_Type)) {
+        /* Found the ArrayMethod and NOT a promoter: return it */
+        return info;
+    }
+
+    /*
+     * If `info == NULL`, loading from cache failed, use the full resolution
+     * in `resolve_implementation_info` (which caches its result on success).
+     */
+    if (info == NULL) {
+        if (resolve_implementation_info(ufunc,
+                op_dtypes, NPY_FALSE, &info) < 0) {
+            return NULL;
+        }
+        if (info != NULL && PyObject_TypeCheck(
+                PyTuple_GET_ITEM(info, 1), &PyArrayMethod_Type)) {
+            /*
+             * Found the ArrayMethod and NOT promoter.  Before returning it
+             * add it to the cache for faster lookup in the future.
+             */
+            if (PyArrayIdentityHash_SetItem(ufunc->_dispatch_cache,
+                    (PyObject **)op_dtypes, info, 0) < 0) {
+                return NULL;
+            }
+            return info;
+        }
+    }
+
+    /*
+     * At this point `info` is NULL if there is no matching loop, or it is
+     * a promoter that needs to be used/called:
+     */
+    if (info != NULL) {
+        PyObject *promoter = PyTuple_GET_ITEM(info, 1);
+
+        info = call_promoter_and_recurse(ufunc,
+                promoter, op_dtypes, signature, ops);
+        if (info == NULL && PyErr_Occurred()) {
+            return NULL;
+        }
+        else if (info != NULL) {
+            /* Add result to the cache using the original types: */
+            if (PyArrayIdentityHash_SetItem(ufunc->_dispatch_cache,
+                    (PyObject **)op_dtypes, info, 0) < 0) {
+                return NULL;
+            }
+            return info;
+        }
+    }
+
+    /*
+     * Even using promotion no loop was found.
+     * Using promotion failed, this should normally be an error.
+     * However, we need to give the legacy implementation a chance here.
+     * (it will modify `op_dtypes`).
+     */
+    if (!allow_legacy_promotion || ufunc->type_resolver == NULL ||
+            (ufunc->ntypes == 0 && ufunc->userloops == NULL)) {
+        /* Already tried or not a "legacy" ufunc (no loop found, return) */
+        return NULL;
+    }
+
+    PyArray_DTypeMeta *new_op_dtypes[NPY_MAXARGS] = {NULL};
+    int cacheable = 1;  /* TODO: only the comparison deprecation needs this */
+    if (legacy_promote_using_legacy_type_resolver(ufunc,
+            ops, signature, new_op_dtypes, &cacheable) < 0) {
+        return NULL;
+    }
+    info = promote_and_get_info_and_ufuncimpl(ufunc,
+            ops, signature, new_op_dtypes, NPY_FALSE);
+    for (int i = 0; i < ufunc->nargs; i++) {
+        Py_XDECREF(new_op_dtypes[i]);
+    }
+
+    /* Add this to the cache using the original types: */
+    if (cacheable && PyArrayIdentityHash_SetItem(ufunc->_dispatch_cache,
+            (PyObject **)op_dtypes, info, 0) < 0) {
+        return NULL;
+    }
+    return info;
+}
+
+
+/**
+ * The central entry-point for the promotion and dispatching machinery.
+ *
+ * It currently may work with the operands (although it would be possible to
+ * only work with DType (classes/types).  This is because it has to ensure
+ * that legacy (value-based promotion) is used when necessary.
+ *
+ * NOTE: The machinery here currently ignores output arguments unless
+ *       they are part of the signature.  This slightly limits unsafe loop
+ *       specializations, which is important for the `ensure_reduce_compatible`
+ *       fallback mode.
+ *       To fix this, the caching mechanism (and dispatching) can be extended.
+ *       When/if that happens, the `ensure_reduce_compatible` could be
+ *       deprecated (it should never kick in because promotion kick in first).
+ *
+ * @param ufunc The ufunc object, used mainly for the fallback.
+ * @param ops The array operands (used only for the fallback).
+ * @param signature As input, the DType signature fixed explicitly by the user.
+ *        The signature is *filled* in with the operation signature we end up
+ *        using.
+ * @param op_dtypes The operand DTypes (without casting) which are specified
+ *        either by the `signature` or by an `operand`.
+ *        (outputs and the second input can be NULL for reductions).
+ *        NOTE: In some cases, the promotion machinery may currently modify
+ *        these including clearing the output.
+ * @param force_legacy_promotion If set, we have to use the old type resolution
+ *        to implement value-based promotion/casting.
+ * @param ensure_reduce_compatible Must be set for reductions, in which case
+ *        the found implementation is checked for reduce-like compatibility.
+ *        If it is *not* compatible and `signature[2] != NULL`, we assume its
+ *        output DType is correct (see NOTE above).
+ *        If removed, promotion may require information about whether this
+ *        is a reduction, so the more likely case is to always keep fixing this
+ *        when necessary, but push down the handling so it can be cached.
+ */
+NPY_NO_EXPORT PyArrayMethodObject *
+promote_and_get_ufuncimpl(PyUFuncObject *ufunc,
+        PyArrayObject *const ops[],
+        PyArray_DTypeMeta *signature[],
+        PyArray_DTypeMeta *op_dtypes[],
+        npy_bool force_legacy_promotion,
+        npy_bool allow_legacy_promotion,
+        npy_bool ensure_reduce_compatible)
+{
+    int nin = ufunc->nin, nargs = ufunc->nargs;
+
+    /*
+     * Get the actual DTypes we operate with by mixing the operand array
+     * ones with the passed signature.
+     */
+    for (int i = 0; i < nargs; i++) {
+        if (signature[i] != NULL) {
+            /*
+             * ignore the operand input, we cannot overwrite signature yet
+             * since it is fixed (cannot be promoted!)
+             */
+            Py_INCREF(signature[i]);
+            Py_XSETREF(op_dtypes[i], signature[i]);
+            assert(i >= ufunc->nin || !NPY_DT_is_abstract(signature[i]));
+        }
+        else if (i >= nin) {
+            /*
+             * We currently just ignore outputs if not in signature, this will
+             * always give the/a correct result (limits registering specialized
+             * loops which include the cast).
+             * (See also comment in resolve_implementation_info.)
+             */
+            Py_CLEAR(op_dtypes[i]);
+        }
+    }
+
+    if (force_legacy_promotion) {
+        /*
+         * We must use legacy promotion for value-based logic. Call the old
+         * resolver once up-front to get the "actual" loop dtypes.
+         * After this (additional) promotion, we can even use normal caching.
+         */
+        int cacheable = 1;  /* unused, as we modify the original `op_dtypes` */
+        if (legacy_promote_using_legacy_type_resolver(ufunc,
+                ops, signature, op_dtypes, &cacheable) < 0) {
+            return NULL;
+        }
+    }
+
+    PyObject *info = promote_and_get_info_and_ufuncimpl(ufunc,
+            ops, signature, op_dtypes, allow_legacy_promotion);
+
+    if (info == NULL) {
+        if (!PyErr_Occurred()) {
+            raise_no_loop_found_error(ufunc, (PyObject **)op_dtypes);
+        }
+        return NULL;
+    }
+
+    PyArrayMethodObject *method = (PyArrayMethodObject *)PyTuple_GET_ITEM(info, 1);
+
+    /*
+     * In certain cases (only the logical ufuncs really), the loop we found may
+     * not be reduce-compatible.  Since the machinery can't distinguish a
+     * reduction with an output from a normal ufunc call, we have to assume
+     * the result DType is correct and force it for the input (if not forced
+     * already).
+     * NOTE: This does assume that all loops are "safe" see the NOTE in this
+     *       comment.  That could be relaxed, in which case we may need to
+     *       cache if a call was for a reduction.
+     */
+    PyObject *all_dtypes = PyTuple_GET_ITEM(info, 0);
+    if (ensure_reduce_compatible && signature[0] == NULL &&
+            PyTuple_GET_ITEM(all_dtypes, 0) != PyTuple_GET_ITEM(all_dtypes, 2)) {
+        signature[0] = (PyArray_DTypeMeta *)PyTuple_GET_ITEM(all_dtypes, 2);
+        Py_INCREF(signature[0]);
+        return promote_and_get_ufuncimpl(ufunc,
+                ops, signature, op_dtypes,
+                force_legacy_promotion, allow_legacy_promotion, NPY_FALSE);
+    }
+
+    for (int i = 0; i < nargs; i++) {
+        if (signature[i] == NULL) {
+            signature[i] = (PyArray_DTypeMeta *)PyTuple_GET_ITEM(all_dtypes, i);
+            Py_INCREF(signature[i]);
+        }
+        else {
+            assert((PyObject *)signature[i] == PyTuple_GET_ITEM(all_dtypes, i));
+        }
+    }
+
+    return method;
+}
+
+
+/*
+ * Generic promoter used by as a final fallback on ufuncs.  Most operations are
+ * homogeneous, so we can try to find the homogeneous dtype on the inputs
+ * and use that.
+ * We need to special case the reduction case, where op_dtypes[0] == NULL
+ * is possible.
+ */
+NPY_NO_EXPORT int
+default_ufunc_promoter(PyUFuncObject *ufunc,
+        PyArray_DTypeMeta *op_dtypes[], PyArray_DTypeMeta *signature[],
+        PyArray_DTypeMeta *new_op_dtypes[])
+{
+    if (ufunc->type_resolver == &PyUFunc_SimpleBinaryComparisonTypeResolver
+            && signature[0] == NULL && signature[1] == NULL
+            && signature[2] != NULL && signature[2]->type_num != NPY_BOOL) {
+        /* bail out, this is _only_ to give future/deprecation warning! */
+        return -1;
+    }
+
+    /* If nin < 2 promotion is a no-op, so it should not be registered */
+    assert(ufunc->nin > 1);
+    if (op_dtypes[0] == NULL) {
+        assert(ufunc->nin == 2 && ufunc->nout == 1);  /* must be reduction */
+        Py_INCREF(op_dtypes[1]);
+        new_op_dtypes[0] = op_dtypes[1];
+        Py_INCREF(op_dtypes[1]);
+        new_op_dtypes[1] = op_dtypes[1];
+        Py_INCREF(op_dtypes[1]);
+        new_op_dtypes[2] = op_dtypes[1];
+        return 0;
+    }
+    PyArray_DTypeMeta *common = NULL;
+    /*
+     * If a signature is used and homogeneous in its outputs use that
+     * (Could/should likely be rather applied to inputs also, although outs
+     * only could have some advantage and input dtypes are rarely enforced.)
+     */
+    for (int i = ufunc->nin; i < ufunc->nargs; i++) {
+        if (signature[i] != NULL) {
+            if (common == NULL) {
+                Py_INCREF(signature[i]);
+                common = signature[i];
+            }
+            else if (common != signature[i]) {
+                Py_CLEAR(common);  /* Not homogeneous, unset common */
+                break;
+            }
+        }
+    }
+    /* Otherwise, use the common DType of all input operands */
+    if (common == NULL) {
+        common = PyArray_PromoteDTypeSequence(ufunc->nin, op_dtypes);
+        if (common == NULL) {
+            if (PyErr_ExceptionMatches(PyExc_TypeError)) {
+                PyErr_Clear();  /* Do not propagate normal promotion errors */
+            }
+            return -1;
+        }
+    }
+
+    for (int i = 0; i < ufunc->nargs; i++) {
+        PyArray_DTypeMeta *tmp = common;
+        if (signature[i]) {
+            tmp = signature[i];  /* never replace a fixed one. */
+        }
+        Py_INCREF(tmp);
+        new_op_dtypes[i] = tmp;
+    }
+    for (int i = ufunc->nin; i < ufunc->nargs; i++) {
+        Py_XINCREF(op_dtypes[i]);
+        new_op_dtypes[i] = op_dtypes[i];
+    }
+
+    Py_DECREF(common);
+    return 0;
+}
+
+
+/*
+ * In some cases, we assume that there will only ever be object loops,
+ * and the object loop should *always* be chosen.
+ * (in those cases more specific loops should not really be registered, but
+ * we do not check that.)
+ *
+ * We default to this for "old-style" ufuncs which have exactly one loop
+ * consisting only of objects (during registration time, numba mutates this
+ * but presumably).
+ */
+NPY_NO_EXPORT int
+object_only_ufunc_promoter(PyUFuncObject *ufunc,
+        PyArray_DTypeMeta *NPY_UNUSED(op_dtypes[]),
+        PyArray_DTypeMeta *signature[],
+        PyArray_DTypeMeta *new_op_dtypes[])
+{
+    PyArray_DTypeMeta *object_DType = PyArray_DTypeFromTypeNum(NPY_OBJECT);
+
+    for (int i = 0; i < ufunc->nargs; i++) {
+        if (signature[i] == NULL) {
+            Py_INCREF(object_DType);
+            new_op_dtypes[i] = object_DType;
+        }
+    }
+    Py_DECREF(object_DType);
+    return 0;
+}
+
+/*
+ * Special promoter for the logical ufuncs.  The logical ufuncs can always
+ * use the ??->? and still get the correct output (as long as the output
+ * is not supposed to be `object`).
+ */
+static int
+logical_ufunc_promoter(PyUFuncObject *NPY_UNUSED(ufunc),
+        PyArray_DTypeMeta *op_dtypes[], PyArray_DTypeMeta *signature[],
+        PyArray_DTypeMeta *new_op_dtypes[])
+{
+    /*
+     * If we find any object DType at all, we currently force to object.
+     * However, if the output is specified and not object, there is no point,
+     * it should be just as well to cast the input rather than doing the
+     * unsafe out cast.
+     */
+    int force_object = 0;
+
+    if (signature[0] == NULL && signature[1] == NULL
+            && signature[2] != NULL && signature[2]->type_num != NPY_BOOL) {
+        /* bail out, this is _only_ to give future/deprecation warning! */
+        return -1;
+    }
+
+    for (int i = 0; i < 3; i++) {
+        PyArray_DTypeMeta *item;
+        if (signature[i] != NULL) {
+            item = signature[i];
+            Py_INCREF(item);
+            if (item->type_num == NPY_OBJECT) {
+                force_object = 1;
+            }
+        }
+        else {
+            /* Always override to boolean */
+            item = PyArray_DTypeFromTypeNum(NPY_BOOL);
+            if (op_dtypes[i] != NULL && op_dtypes[i]->type_num == NPY_OBJECT) {
+                force_object = 1;
+            }
+        }
+        new_op_dtypes[i] = item;
+    }
+
+    if (!force_object || (op_dtypes[2] != NULL
+                          && op_dtypes[2]->type_num != NPY_OBJECT)) {
+        return 0;
+    }
+    /*
+     * Actually, we have to use the OBJECT loop after all, set all we can
+     * to object (that might not work out, but try).
+     *
+     * NOTE: Change this to check for `op_dtypes[0] == NULL` to STOP
+     *       returning `object` for `np.logical_and.reduce(obj_arr)`
+     *       which will also affect `np.all` and `np.any`!
+     */
+    for (int i = 0; i < 3; i++) {
+        if (signature[i] != NULL) {
+            continue;
+        }
+        Py_SETREF(new_op_dtypes[i], PyArray_DTypeFromTypeNum(NPY_OBJECT));
+    }
+    return 0;
+}
+
+
+NPY_NO_EXPORT int
+install_logical_ufunc_promoter(PyObject *ufunc)
+{
+    if (PyObject_Type(ufunc) != (PyObject *)&PyUFunc_Type) {
+        PyErr_SetString(PyExc_RuntimeError,
+                "internal numpy array, logical ufunc was not a ufunc?!");
+        return -1;
+    }
+    PyObject *dtype_tuple = PyTuple_Pack(3,
+            &PyArrayDescr_Type, &PyArrayDescr_Type, &PyArrayDescr_Type, NULL);
+    if (dtype_tuple == NULL) {
+        return -1;
+    }
+    PyObject *promoter = PyCapsule_New(&logical_ufunc_promoter,
+            "numpy._ufunc_promoter", NULL);
+    if (promoter == NULL) {
+        Py_DECREF(dtype_tuple);
+        return -1;
+    }
+
+    PyObject *info = PyTuple_Pack(2, dtype_tuple, promoter);
+    Py_DECREF(dtype_tuple);
+    Py_DECREF(promoter);
+    if (info == NULL) {
+        return -1;
+    }
+
+    return PyUFunc_AddLoop((PyUFuncObject *)ufunc, info, 0);
+}
diff --git a/numpy/core/src/umath/dispatching.h b/numpy/core/src/umath/dispatching.h
new file mode 100644 (file)
index 0000000..a7e9e88
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef _NPY_DISPATCHING_H
+#define _NPY_DISPATCHING_H
+
+#define _UMATHMODULE
+
+#include <numpy/ufuncobject.h>
+#include "array_method.h"
+
+
+typedef int promoter_function(PyUFuncObject *ufunc,
+        PyArray_DTypeMeta *op_dtypes[], PyArray_DTypeMeta *signature[],
+        PyArray_DTypeMeta *new_op_dtypes[]);
+
+NPY_NO_EXPORT int
+PyUFunc_AddLoop(PyUFuncObject *ufunc, PyObject *info, int ignore_duplicate);
+
+NPY_NO_EXPORT PyArrayMethodObject *
+promote_and_get_ufuncimpl(PyUFuncObject *ufunc,
+        PyArrayObject *const ops[],
+        PyArray_DTypeMeta *signature[],
+        PyArray_DTypeMeta *op_dtypes[],
+        npy_bool force_legacy_promotion,
+        npy_bool allow_legacy_promotion,
+        npy_bool ensure_reduce_compatible);
+
+NPY_NO_EXPORT PyObject *
+add_and_return_legacy_wrapping_ufunc_loop(PyUFuncObject *ufunc,
+        PyArray_DTypeMeta *operation_dtypes[], int ignore_duplicate);
+
+NPY_NO_EXPORT int
+default_ufunc_promoter(PyUFuncObject *ufunc,
+        PyArray_DTypeMeta *op_dtypes[], PyArray_DTypeMeta *signature[],
+        PyArray_DTypeMeta *new_op_dtypes[]);
+
+NPY_NO_EXPORT int
+object_only_ufunc_promoter(PyUFuncObject *ufunc,
+        PyArray_DTypeMeta *NPY_UNUSED(op_dtypes[]),
+        PyArray_DTypeMeta *signature[],
+        PyArray_DTypeMeta *new_op_dtypes[]);
+
+NPY_NO_EXPORT int
+install_logical_ufunc_promoter(PyObject *ufunc);
+
+
+#endif  /*_NPY_DISPATCHING_H */
index cd81f773470b6bcbfb998c68c4ff926fde850c7b..6b9a27e2621aef223083720639ebbc1bc3c1af70 100644 (file)
@@ -1,7 +1,8 @@
-#define _UMATHMODULE
-#define _MULTIARRAYMODULE
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+#define _UMATHMODULE
 
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
 #include "npy_config.h"
diff --git a/numpy/core/src/umath/legacy_array_method.c b/numpy/core/src/umath/legacy_array_method.c
new file mode 100644 (file)
index 0000000..ef24edf
--- /dev/null
@@ -0,0 +1,312 @@
+/*
+ * This file defines most of the machinery in order to wrap legacy style
+ * ufunc loops into new style arraymethods.
+ */
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+#define _UMATHMODULE
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
+#include "numpy/ndarraytypes.h"
+
+#include "convert_datatype.h"
+#include "array_method.h"
+#include "dtype_transfer.h"
+#include "legacy_array_method.h"
+#include "dtypemeta.h"
+
+
+typedef struct {
+    NpyAuxData base;
+    /* The legacy loop and additional user data: */
+    PyUFuncGenericFunction loop;
+    void *user_data;
+    /* Whether to check for PyErr_Occurred(), must require GIL if used */
+    int pyerr_check;
+} legacy_array_method_auxdata;
+
+
+/* Use a free list, since we should normally only need one at a time */
+#define NPY_LOOP_DATA_CACHE_SIZE 5
+static int loop_data_num_cached = 0;
+static  legacy_array_method_auxdata *loop_data_cache[NPY_LOOP_DATA_CACHE_SIZE];
+
+
+static void
+legacy_array_method_auxdata_free(NpyAuxData *data)
+{
+    if (loop_data_num_cached < NPY_LOOP_DATA_CACHE_SIZE) {
+        loop_data_cache[loop_data_num_cached] = (
+                (legacy_array_method_auxdata *)data);
+        loop_data_num_cached++;
+    }
+    else {
+        PyMem_Free(data);
+    }
+}
+
+#undef NPY_LOOP_DATA_CACHE_SIZE
+
+
+NpyAuxData *
+get_new_loop_data(
+        PyUFuncGenericFunction loop, void *user_data, int pyerr_check)
+{
+    legacy_array_method_auxdata *data;
+    if (NPY_LIKELY(loop_data_num_cached > 0)) {
+        loop_data_num_cached--;
+        data = loop_data_cache[loop_data_num_cached];
+    }
+    else {
+        data = PyMem_Malloc(sizeof(legacy_array_method_auxdata));
+        if (data == NULL) {
+            return NULL;
+        }
+        data->base.free = legacy_array_method_auxdata_free;
+        data->base.clone = NULL;  /* no need for cloning (at least for now) */
+    }
+    data->loop = loop;
+    data->user_data = user_data;
+    data->pyerr_check = pyerr_check;
+    return (NpyAuxData *)data;
+}
+
+
+/*
+ * This is a thin wrapper around the legacy loop signature.
+ */
+static int
+generic_wrapped_legacy_loop(PyArrayMethod_Context *NPY_UNUSED(context),
+        char *const *data, const npy_intp *dimensions, const npy_intp *strides,
+        NpyAuxData *auxdata)
+{
+    legacy_array_method_auxdata *ldata = (legacy_array_method_auxdata *)auxdata;
+
+    ldata->loop((char **)data, dimensions, strides, ldata->user_data);
+    if (ldata->pyerr_check && PyErr_Occurred()) {
+        return -1;
+    }
+    return 0;
+}
+
+
+/*
+ * Signal that the old type-resolution function must be used to resolve
+ * the descriptors (mainly/only used for datetimes due to the unit).
+ *
+ * ArrayMethod's are expected to implement this, but it is too tricky
+ * to support properly.  So we simply set an error that should never be seen.
+ */
+NPY_NO_EXPORT NPY_CASTING
+wrapped_legacy_resolve_descriptors(PyArrayMethodObject *NPY_UNUSED(self),
+        PyArray_DTypeMeta *NPY_UNUSED(dtypes[]),
+        PyArray_Descr *NPY_UNUSED(given_descrs[]),
+        PyArray_Descr *NPY_UNUSED(loop_descrs[]))
+{
+    PyErr_SetString(PyExc_RuntimeError,
+            "cannot use legacy wrapping ArrayMethod without calling the ufunc "
+            "itself.  If this error is hit, the solution will be to port the "
+            "legacy ufunc loop implementation to the new API.");
+    return -1;
+}
+
+/*
+ * Much the same as the default type resolver, but tries a bit harder to
+ * preserve metadata.
+ */
+static NPY_CASTING
+simple_legacy_resolve_descriptors(
+        PyArrayMethodObject *method,
+        PyArray_DTypeMeta **dtypes,
+        PyArray_Descr **given_descrs,
+        PyArray_Descr **output_descrs)
+{
+    int i = 0;
+    int nin = method->nin;
+    int nout = method->nout;
+
+    if (nin == 2 && nout == 1 && given_descrs[2] != NULL
+            && dtypes[0] == dtypes[2]) {
+        /*
+         * Could be a reduction, which requires `descr[0] is descr[2]`
+         * (identity) at least currently. This is because `op[0] is op[2]`.
+         * (If the output descriptor is not passed, the below works.)
+         */
+        output_descrs[2] = ensure_dtype_nbo(given_descrs[2]);
+        if (output_descrs[2] == NULL) {
+            Py_CLEAR(output_descrs[2]);
+            return -1;
+        }
+        Py_INCREF(output_descrs[2]);
+        output_descrs[0] = output_descrs[2];
+        if (dtypes[1] == dtypes[2]) {
+            /* Same for the second one (accumulation is stricter) */
+            Py_INCREF(output_descrs[2]);
+            output_descrs[1] = output_descrs[2];
+        }
+        else {
+            output_descrs[1] = ensure_dtype_nbo(given_descrs[1]);
+            if (output_descrs[1] == NULL) {
+                i = 2;
+                goto fail;
+            }
+        }
+        return NPY_NO_CASTING;
+    }
+
+    for (; i < nin + nout; i++) {
+        if (given_descrs[i] != NULL) {
+            output_descrs[i] = ensure_dtype_nbo(given_descrs[i]);
+        }
+        else if (dtypes[i] == dtypes[0] && i > 0) {
+            /* Preserve metadata from the first operand if same dtype */
+            Py_INCREF(output_descrs[0]);
+            output_descrs[i] = output_descrs[0];
+        }
+        else {
+            output_descrs[i] = NPY_DT_CALL_default_descr(dtypes[i]);
+        }
+        if (output_descrs[i] == NULL) {
+            goto fail;
+        }
+    }
+
+    return NPY_NO_CASTING;
+
+  fail:
+    for (; i >= 0; i--) {
+        Py_CLEAR(output_descrs[i]);
+    }
+    return -1;
+}
+
+
+/*
+ * This function grabs the legacy inner-loop.  If this turns out to be slow
+ * we could probably cache it (with some care).
+ */
+NPY_NO_EXPORT int
+get_wrapped_legacy_ufunc_loop(PyArrayMethod_Context *context,
+        int aligned, int move_references,
+        npy_intp *NPY_UNUSED(strides),
+        PyArrayMethod_StridedLoop **out_loop,
+        NpyAuxData **out_transferdata,
+        NPY_ARRAYMETHOD_FLAGS *flags)
+{
+    assert(aligned);
+    assert(!move_references);
+
+    if (context->caller == NULL ||
+            !PyObject_TypeCheck(context->caller, &PyUFunc_Type)) {
+        PyErr_Format(PyExc_RuntimeError,
+                "cannot call %s without its ufunc as caller context.",
+                context->method->name);
+        return -1;
+    }
+
+    PyUFuncObject *ufunc = (PyUFuncObject *)context->caller;
+    void *user_data;
+    int needs_api = 0;
+
+    PyUFuncGenericFunction loop = NULL;
+    /* Note that `needs_api` is not reliable (it was in fact unused normally) */
+    if (ufunc->legacy_inner_loop_selector(ufunc,
+            context->descriptors, &loop, &user_data, &needs_api) < 0) {
+        return -1;
+    }
+    *flags = context->method->flags & NPY_METH_RUNTIME_FLAGS;
+    if (needs_api) {
+        *flags |= NPY_METH_REQUIRES_PYAPI;
+    }
+
+    *out_loop = &generic_wrapped_legacy_loop;
+    *out_transferdata = get_new_loop_data(
+            loop, user_data, (*flags & NPY_METH_REQUIRES_PYAPI) != 0);
+    if (*out_transferdata == NULL) {
+        PyErr_NoMemory();
+        return -1;
+    }
+    return 0;
+}
+
+
+/*
+ * Get the unbound ArrayMethod which wraps the instances of the ufunc.
+ * Note that this function stores the result on the ufunc and then only
+ * returns the same one.
+ */
+NPY_NO_EXPORT PyArrayMethodObject *
+PyArray_NewLegacyWrappingArrayMethod(PyUFuncObject *ufunc,
+        PyArray_DTypeMeta *signature[])
+{
+    char method_name[101];
+    const char *name = ufunc->name ? ufunc->name : "<unknown>";
+    snprintf(method_name, 100, "legacy_ufunc_wrapper_for_%s", name);
+
+    /*
+     * Assume that we require the Python API when any of the (legacy) dtypes
+     * flags it.
+     */
+    int any_output_flexible = 0;
+    NPY_ARRAYMETHOD_FLAGS flags = 0;
+    if (ufunc->nargs == 3 &&
+            signature[0]->type_num == NPY_BOOL &&
+            signature[1]->type_num == NPY_BOOL &&
+            signature[2]->type_num == NPY_BOOL && (
+                strcmp(ufunc->name, "logical_or") == 0 ||
+                strcmp(ufunc->name, "logical_and") == 0 ||
+                strcmp(ufunc->name, "logical_xor") == 0)) {
+        /*
+         * This is a logical ufunc, and the `??->?` loop`. It is always OK
+         * to cast any input to bool, because that cast is defined by
+         * truthiness.
+         * This allows to ensure two things:
+         * 1. `np.all`/`np.any` know that force casting the input is OK
+         *    (they must do this since there are no `?l->?`, etc. loops)
+         * 2. The logical functions automatically work for any DType
+         *    implementing a cast to boolean.
+         */
+        flags = _NPY_METH_FORCE_CAST_INPUTS;
+    }
+
+    for (int i = 0; i < ufunc->nin+ufunc->nout; i++) {
+        if (signature[i]->singleton->flags & (
+                NPY_ITEM_REFCOUNT | NPY_ITEM_IS_POINTER | NPY_NEEDS_PYAPI)) {
+            flags |= NPY_METH_REQUIRES_PYAPI;
+        }
+        if (NPY_DT_is_parametric(signature[i])) {
+            any_output_flexible = 1;
+        }
+    }
+
+    PyType_Slot slots[3] = {
+        {NPY_METH_get_loop, &get_wrapped_legacy_ufunc_loop},
+        {NPY_METH_resolve_descriptors, &simple_legacy_resolve_descriptors},
+        {0, NULL},
+    };
+    if (any_output_flexible) {
+        /* We cannot use the default descriptor resolver. */
+        slots[1].pfunc = &wrapped_legacy_resolve_descriptors;
+    }
+
+    PyArrayMethod_Spec spec = {
+        .name = method_name,
+        .nin = ufunc->nin,
+        .nout = ufunc->nout,
+        .dtypes = signature,
+        .flags = flags,
+        .slots = slots,
+        .casting = NPY_NO_CASTING,
+    };
+
+    PyBoundArrayMethodObject *bound_res = PyArrayMethod_FromSpec_int(&spec, 1);
+    if (bound_res == NULL) {
+        return NULL;
+    }
+    PyArrayMethodObject *res = bound_res->method;
+    Py_INCREF(res);
+    Py_DECREF(bound_res);
+    return res;
+}
diff --git a/numpy/core/src/umath/legacy_array_method.h b/numpy/core/src/umath/legacy_array_method.h
new file mode 100644 (file)
index 0000000..0dec1fb
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef _NPY_LEGACY_ARRAY_METHOD_H
+#define _NPY_LEGACY_ARRAY_METHOD_H
+
+#include "numpy/ndarraytypes.h"
+#include "numpy/ufuncobject.h"
+#include "array_method.h"
+
+
+NPY_NO_EXPORT PyArrayMethodObject *
+PyArray_NewLegacyWrappingArrayMethod(PyUFuncObject *ufunc,
+        PyArray_DTypeMeta *signature[]);
+
+
+
+/*
+ * The following two symbols are in the header so that other places can use
+ * them to probe for special cases (or whether an ArrayMethod is a "legacy"
+ * one).
+ */
+NPY_NO_EXPORT int
+get_wrapped_legacy_ufunc_loop(PyArrayMethod_Context *context,
+        int aligned, int move_references,
+        npy_intp *NPY_UNUSED(strides),
+        PyArrayMethod_StridedLoop **out_loop,
+        NpyAuxData **out_transferdata,
+        NPY_ARRAYMETHOD_FLAGS *flags);
+
+NPY_NO_EXPORT NPY_CASTING
+wrapped_legacy_resolve_descriptors(PyArrayMethodObject *,
+        PyArray_DTypeMeta **, PyArray_Descr **, PyArray_Descr **);
+
+
+#endif  /*_NPY_LEGACY_ARRAY_METHOD_H */
index 683bd0178bf02b5a90a4ca28baacb73262fc955d..aaa694f34dbba408fd2193369e41903743564942 100644 (file)
@@ -1,11 +1,11 @@
 /* -*- c -*- */
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
 
 #define _UMATHMODULE
 #define _MULTIARRAYMODULE
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 
-#include "Python.h"
-
 #include "npy_config.h"
 #include "numpy/npy_common.h"
 #include "numpy/arrayobject.h"
@@ -1340,7 +1340,7 @@ TIMEDELTA_mq_m_divide(char **args, npy_intp const *dimensions, npy_intp const *s
                     *((npy_timedelta *)op1) = NPY_DATETIME_NAT;
                 }
                 else {
-                    *((npy_timedelta *)op1) = libdivide_s64_do(in1, &fast_d);;
+                    *((npy_timedelta *)op1) = libdivide_s64_do(in1, &fast_d);
                 }
             }
         }
@@ -1532,8 +1532,8 @@ TIMEDELTA_mm_qm_divmod(char **args, npy_intp const *dimensions, npy_intp const *
  */
 
 /**begin repeat
- *  #func = rint, ceil, floor, trunc#
- *  #scalarf = npy_rint, npy_ceil, npy_floor, npy_trunc#
+ *  #func = rint, floor, trunc#
+ *  #scalarf = npy_rint, npy_floor, npy_trunc#
  */
 
 /**begin repeat1
@@ -1568,8 +1568,8 @@ NPY_NO_EXPORT NPY_GCC_OPT_3 void
  */
 
 /**begin repeat2
- *  #func = rint, ceil, floor, trunc#
- *  #scalarf = npy_rint, npy_ceil, npy_floor, npy_trunc#
+ *  #func = rint, floor, trunc#
+ *  #scalarf = npy_rint, npy_floor, npy_trunc#
  */
 
 NPY_NO_EXPORT NPY_GCC_OPT_3 void
@@ -2416,42 +2416,6 @@ NPY_NO_EXPORT void
 }
 
 
-NPY_NO_EXPORT void
-@TYPE@_floor_divide(char **args, npy_intp const *dimensions, npy_intp const *steps, void *NPY_UNUSED(func))
-{
-    BINARY_LOOP {
-        const @ftype@ in1r = ((@ftype@ *)ip1)[0];
-        const @ftype@ in1i = ((@ftype@ *)ip1)[1];
-        const @ftype@ in2r = ((@ftype@ *)ip2)[0];
-        const @ftype@ in2i = ((@ftype@ *)ip2)[1];
-#if defined(__APPLE__) && defined(__aarch64__)
-        // On macos-arm64 without this block of code,
-        // when branch prediction goes wrong, the floating point exception
-        // register does not get cleared and an exception for the
-        // wrong branch is thrown.
-        if (in2i == 0) {
-            ((@ftype@ *)op1)[0] = npy_floor@c@(in1r/in2r);
-            ((@ftype@ *)op1)[1] = 0;
-        }
-        else if (in2r == 0) {
-            ((@ftype@ *)op1)[0] = npy_floor@c@(in1i/in2i);
-            ((@ftype@ *)op1)[1] = 0;
-        }
-        else
-#endif
-        if (npy_fabs@c@(in2r) >= npy_fabs@c@(in2i)) {
-            const @ftype@ rat = in2i/in2r;
-            ((@ftype@ *)op1)[0] = npy_floor@c@((in1r + in1i*rat)/(in2r + in2i*rat));
-            ((@ftype@ *)op1)[1] = 0;
-        }
-        else {
-            const @ftype@ rat = in2r/in2i;
-            ((@ftype@ *)op1)[0] = npy_floor@c@((in1r*rat + in1i)/(in2i + in2r*rat));
-            ((@ftype@ *)op1)[1] = 0;
-        }
-    }
-}
-
 /**begin repeat1
  * #kind= greater, greater_equal, less, less_equal, equal, not_equal#
  * #OP = CGT, CGE, CLT, CLE, CEQ, CNE#
index bb07e047c372a84236e534ab24b2754334e0a56b..081ca99571a101684ca57280f96ee56cd253e309 100644 (file)
@@ -187,7 +187,7 @@ NPY_NO_EXPORT void
  *  #TYPE = FLOAT, DOUBLE#
  */
 /**begin repeat1
- * #kind = sqrt, absolute, square, reciprocal#
+ * #kind = ceil, sqrt, absolute, square, reciprocal#
  */
 NPY_CPU_DISPATCH_DECLARE(NPY_NO_EXPORT void @TYPE@_@kind@,
    (char **args, npy_intp const *dimensions, npy_intp const *steps, void *NPY_UNUSED(data)))
@@ -210,6 +210,32 @@ NPY_CPU_DISPATCH_DECLARE(NPY_NO_EXPORT void @TYPE@_@kind@,
 /**end repeat1**/
 /**end repeat**/
 
+#ifndef NPY_DISABLE_OPTIMIZATION
+    #include "loops_umath_fp.dispatch.h"
+#endif
+
+/**begin repeat
+ *  #TYPE = FLOAT, DOUBLE#
+ */
+/**begin repeat1
+ * #func = tanh, exp2, log2, log10, expm1, log1p, cbrt, tan, arcsin, arccos, arctan, sinh, cosh, arcsinh, arccosh, arctanh#
+ */
+
+NPY_CPU_DISPATCH_DECLARE(NPY_NO_EXPORT void @TYPE@_@func@,
+    (char **args, npy_intp const *dimensions, npy_intp const *steps, void *NPY_UNUSED(func)))
+
+/**end repeat1**/
+/**end repeat**/
+
+/**begin repeat
+ * #func = sin, cos#
+ */
+
+NPY_CPU_DISPATCH_DECLARE(NPY_NO_EXPORT void DOUBLE_@func@,
+    (char **args, npy_intp const *dimensions, npy_intp const *steps, void *NPY_UNUSED(func)))
+
+/**end repeat**/
+
 /**begin repeat
  *  #TYPE = FLOAT, DOUBLE#
  */
@@ -249,7 +275,7 @@ NPY_CPU_DISPATCH_DECLARE(NPY_NO_EXPORT void @TYPE@_@kind@, (
 /**end repeat**/
 
 /**begin repeat
- *  #func = rint, ceil, floor, trunc#
+ *  #func = rint, floor, trunc#
  */
 
 /**begin repeat1
@@ -420,9 +446,6 @@ C@TYPE@_@kind@(char **args, npy_intp const *dimensions, npy_intp const *steps, v
 NPY_NO_EXPORT void
 C@TYPE@_divide(char **args, npy_intp const *dimensions, npy_intp const *steps, void *NPY_UNUSED(func));
 
-NPY_NO_EXPORT void
-C@TYPE@_floor_divide(char **args, npy_intp const *dimensions, npy_intp const *steps, void *NPY_UNUSED(func));
-
 /**begin repeat1
  * #kind= greater, greater_equal, less, less_equal, equal, not_equal#
  * #OP = CGT, CGE, CLT, CLE, CEQ, CNE#
index d8c8fdc9e41e5f26c3e5a33af0a0f07685146944..51b1678440972c7b7459b54cb5e184c827e425cc 100644 (file)
@@ -565,36 +565,36 @@ NPY_NO_EXPORT void NPY_CPU_DISPATCH_CURFX(@TYPE@_@kind@)
 #endif
 
 #ifdef AVX512F_NOMSVC
-static NPY_INLINE __mmask16
+NPY_FINLINE __mmask16
 avx512_get_full_load_mask_ps(void)
 {
     return 0xFFFF;
 }
 
-static NPY_INLINE __mmask8
+NPY_FINLINE __mmask8
 avx512_get_full_load_mask_pd(void)
 {
     return 0xFF;
 }
-static NPY_INLINE __m512
+NPY_FINLINE __m512
 avx512_masked_load_ps(__mmask16 mask, npy_float* addr)
 {
     return _mm512_maskz_loadu_ps(mask, (__m512 *)addr);
 }
 
-static NPY_INLINE __m512d
+NPY_FINLINE __m512d
 avx512_masked_load_pd(__mmask8 mask, npy_double* addr)
 {
     return _mm512_maskz_loadu_pd(mask, (__m512d *)addr);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask16
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask16
 avx512_get_partial_load_mask_ps(const npy_int num_elem, const npy_int total_elem)
 {
     return (0x0001 << num_elem) - 0x0001;
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask8
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask8
 avx512_get_partial_load_mask_pd(const npy_int num_elem, const npy_int total_elem)
 {
     return (0x01 << num_elem) - 0x01;
@@ -613,18 +613,18 @@ avx512_get_partial_load_mask_pd(const npy_int num_elem, const npy_int total_elem
  *  #INF = NPY_INFINITYF, NPY_INFINITY#
  *  #NAN = NPY_NANF, NPY_NAN#
  */
-static @vtype@
+NPY_FINLINE @vtype@
 avx512_hadd_@vsub@(const @vtype@ x)
 {
     return _mm512_add_@vsub@(x, _mm512_permute_@vsub@(x, @perm_@));
 }
 
-static @vtype@
+NPY_FINLINE @vtype@
 avx512_hsub_@vsub@(const @vtype@ x)
 {
     return _mm512_sub_@vsub@(x, _mm512_permute_@vsub@(x, @perm_@));
 }
-static NPY_INLINE @vtype@
+NPY_FINLINE @vtype@
 avx512_cmul_@vsub@(@vtype@ x1, @vtype@ x2)
 {
     // x1 = r1, i1
index 41e0bf37b6f8243fab02b87afdf6473f6795b50b..2dd43fb85362e1d753ccff1a33f951478dd279e2 100644 (file)
 
 #ifdef SIMD_AVX2_FMA3
 
-static NPY_INLINE __m256
+NPY_FINLINE __m256
 fma_get_full_load_mask_ps(void)
 {
     return _mm256_set1_ps(-1.0);
 }
 
-static NPY_INLINE __m256i
+NPY_FINLINE __m256i
 fma_get_full_load_mask_pd(void)
 {
     return _mm256_castpd_si256(_mm256_set1_pd(-1.0));
 }
 
-static NPY_INLINE __m256
+NPY_FINLINE __m256
 fma_get_partial_load_mask_ps(const npy_int num_elem, const npy_int num_lanes)
 {
     float maskint[16] = {-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,
@@ -66,7 +66,7 @@ fma_get_partial_load_mask_ps(const npy_int num_elem, const npy_int num_lanes)
     return _mm256_loadu_ps(addr);
 }
 
-static NPY_INLINE __m256i
+NPY_FINLINE __m256i
 fma_get_partial_load_mask_pd(const npy_int num_elem, const npy_int num_lanes)
 {
     npy_int maskint[16] = {-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1};
@@ -74,7 +74,7 @@ fma_get_partial_load_mask_pd(const npy_int num_elem, const npy_int num_lanes)
     return _mm256_loadu_si256((__m256i*) addr);
 }
 
-static NPY_INLINE __m256
+NPY_FINLINE __m256
 fma_masked_gather_ps(__m256 src,
                      npy_float* addr,
                      __m256i vindex,
@@ -83,7 +83,7 @@ fma_masked_gather_ps(__m256 src,
     return _mm256_mask_i32gather_ps(src, addr, vindex, mask, 4);
 }
 
-static NPY_INLINE __m256d
+NPY_FINLINE __m256d
 fma_masked_gather_pd(__m256d src,
                      npy_double* addr,
                      __m128i vindex,
@@ -92,49 +92,49 @@ fma_masked_gather_pd(__m256d src,
     return _mm256_mask_i32gather_pd(src, addr, vindex, mask, 8);
 }
 
-static NPY_INLINE __m256
+NPY_FINLINE __m256
 fma_masked_load_ps(__m256 mask, npy_float* addr)
 {
     return _mm256_maskload_ps(addr, _mm256_cvtps_epi32(mask));
 }
 
-static NPY_INLINE __m256d
+NPY_FINLINE __m256d
 fma_masked_load_pd(__m256i mask, npy_double* addr)
 {
     return _mm256_maskload_pd(addr, mask);
 }
 
-static NPY_INLINE __m256
+NPY_FINLINE __m256
 fma_set_masked_lanes_ps(__m256 x, __m256 val, __m256 mask)
 {
     return _mm256_blendv_ps(x, val, mask);
 }
 
-static NPY_INLINE __m256d
+NPY_FINLINE __m256d
 fma_set_masked_lanes_pd(__m256d x, __m256d val, __m256d mask)
 {
     return _mm256_blendv_pd(x, val, mask);
 }
 
-static NPY_INLINE __m256
+NPY_FINLINE __m256
 fma_blend(__m256 x, __m256 y, __m256 ymask)
 {
     return _mm256_blendv_ps(x, y, ymask);
 }
 
-static NPY_INLINE __m256
+NPY_FINLINE __m256
 fma_invert_mask_ps(__m256 ymask)
 {
     return _mm256_andnot_ps(ymask, _mm256_set1_ps(-1.0));
 }
 
-static NPY_INLINE __m256i
+NPY_FINLINE __m256i
 fma_invert_mask_pd(__m256i ymask)
 {
     return _mm256_andnot_si256(ymask, _mm256_set1_epi32(0xFFFFFFFF));
 }
 
-static NPY_INLINE __m256
+NPY_FINLINE __m256
 fma_get_exponent(__m256 x)
 {
     /*
@@ -149,8 +149,8 @@ fma_get_exponent(__m256 x)
     __m256 normal_mask = _mm256_cmp_ps(x, _mm256_set1_ps(FLT_MIN), _CMP_GE_OQ);
 
     /*
-     * It is necessary for temp1 to be volatile, a bug in clang optimizes it out which leads
-     * to an overflow warning in some cases. See https://github.com/numpy/numpy/issues/18005
+     * The volatile is probably unnecessary now since we compile clang with
+     * `-ftrapping-math`: https://github.com/numpy/numpy/issues/18005
      */
     volatile __m256 temp1 = _mm256_blendv_ps(x, _mm256_set1_ps(0.0f), normal_mask);
     __m256 temp = _mm256_mul_ps(temp1, two_power_100);
@@ -165,7 +165,7 @@ fma_get_exponent(__m256 x)
     return _mm256_blendv_ps(exp, denorm_exp, denormal_mask);
 }
 
-static NPY_INLINE __m256
+NPY_FINLINE __m256
 fma_get_mantissa(__m256 x)
 {
     /*
@@ -180,8 +180,8 @@ fma_get_mantissa(__m256 x)
     __m256 normal_mask = _mm256_cmp_ps(x, _mm256_set1_ps(FLT_MIN), _CMP_GE_OQ);
 
     /*
-     * It is necessary for temp1 to be volatile, a bug in clang optimizes it out which leads
-     * to an overflow warning in some cases. See https://github.com/numpy/numpy/issues/18005
+     * The volatile is probably unnecessary now since we compile clang with
+     * `-ftrapping-math`: https://github.com/numpy/numpy/issues/18005
      */
     volatile __m256 temp1 = _mm256_blendv_ps(x, _mm256_set1_ps(0.0f), normal_mask);
     __m256 temp = _mm256_mul_ps(temp1, two_power_100);
@@ -195,7 +195,7 @@ fma_get_mantissa(__m256 x)
                         _mm256_castps_si256(x), mantissa_bits), exp_126_bits));
 }
 
-static NPY_INLINE __m256
+NPY_FINLINE __m256
 fma_scalef_ps(__m256 poly, __m256 quadrant)
 {
     /*
@@ -238,31 +238,31 @@ fma_scalef_ps(__m256 poly, __m256 quadrant)
 
 #ifdef SIMD_AVX512F
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask16
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask16
 avx512_get_full_load_mask_ps(void)
 {
     return 0xFFFF;
 }
 
-static NPY_INLINE __mmask8
+NPY_FINLINE __mmask8
 avx512_get_full_load_mask_pd(void)
 {
     return 0xFF;
 }
 
-static NPY_INLINE __mmask16
+NPY_FINLINE __mmask16
 avx512_get_partial_load_mask_ps(const npy_int num_elem, const npy_int total_elem)
 {
     return (0x0001 << num_elem) - 0x0001;
 }
 
-static NPY_INLINE __mmask8
+NPY_FINLINE __mmask8
 avx512_get_partial_load_mask_pd(const npy_int num_elem, const npy_int total_elem)
 {
     return (0x01 << num_elem) - 0x01;
 }
 
-static NPY_INLINE __m512
+NPY_FINLINE __m512
 avx512_masked_gather_ps(__m512 src,
                         npy_float* addr,
                         __m512i vindex,
@@ -271,7 +271,7 @@ avx512_masked_gather_ps(__m512 src,
     return _mm512_mask_i32gather_ps(src, kmask, vindex, addr, 4);
 }
 
-static NPY_INLINE __m512d
+NPY_FINLINE __m512d
 avx512_masked_gather_pd(__m512d src,
                         npy_double* addr,
                         __m256i vindex,
@@ -280,67 +280,67 @@ avx512_masked_gather_pd(__m512d src,
     return _mm512_mask_i32gather_pd(src, kmask, vindex, addr, 8);
 }
 
-static NPY_INLINE __m512
+NPY_FINLINE __m512
 avx512_masked_load_ps(__mmask16 mask, npy_float* addr)
 {
     return _mm512_maskz_loadu_ps(mask, (__m512 *)addr);
 }
 
-static NPY_INLINE __m512d
+NPY_FINLINE __m512d
 avx512_masked_load_pd(__mmask8 mask, npy_double* addr)
 {
     return _mm512_maskz_loadu_pd(mask, (__m512d *)addr);
 }
 
-static NPY_INLINE __m512
+NPY_FINLINE __m512
 avx512_set_masked_lanes_ps(__m512 x, __m512 val, __mmask16 mask)
 {
     return _mm512_mask_blend_ps(mask, x, val);
 }
 
-static NPY_INLINE __m512d
+NPY_FINLINE __m512d
 avx512_set_masked_lanes_pd(__m512d x, __m512d val, __mmask8 mask)
 {
     return _mm512_mask_blend_pd(mask, x, val);
 }
 
-static NPY_INLINE __m512
+NPY_FINLINE __m512
 avx512_blend(__m512 x, __m512 y, __mmask16 ymask)
 {
     return _mm512_mask_mov_ps(x, ymask, y);
 }
 
-static NPY_INLINE __mmask16
+NPY_FINLINE __mmask16
 avx512_invert_mask_ps(__mmask16 ymask)
 {
     return _mm512_knot(ymask);
 }
 
-static NPY_INLINE __mmask8
+NPY_FINLINE __mmask8
 avx512_invert_mask_pd(__mmask8 ymask)
 {
     return _mm512_knot(ymask);
 }
 
-static NPY_INLINE __m512
+NPY_FINLINE __m512
 avx512_get_exponent(__m512 x)
 {
     return _mm512_add_ps(_mm512_getexp_ps(x), _mm512_set1_ps(1.0f));
 }
 
-static NPY_INLINE __m512
+NPY_FINLINE __m512
 avx512_get_mantissa(__m512 x)
 {
     return _mm512_getmant_ps(x, _MM_MANT_NORM_p5_1, _MM_MANT_SIGN_src);
 }
 
-static NPY_INLINE __m512
+NPY_FINLINE __m512
 avx512_scalef_ps(__m512 poly, __m512 quadrant)
 {
     return _mm512_scalef_ps(poly, quadrant);
 }
 
-static NPY_INLINE __m512d
+NPY_FINLINE __m512d
 avx512_permute_x4var_pd(__m512d t0,
                         __m512d t1,
                         __m512d t2,
@@ -355,7 +355,7 @@ avx512_permute_x4var_pd(__m512d t0,
     return _mm512_mask_blend_pd(lut_mask, res1, res2);
 }
 
-static NPY_INLINE __m512d
+NPY_FINLINE __m512d
 avx512_permute_x8var_pd(__m512d t0, __m512d t1, __m512d t2, __m512d t3,
                         __m512d t4, __m512d t5, __m512d t6, __m512d t7,
                         __m512i index)
@@ -386,7 +386,7 @@ avx512_permute_x8var_pd(__m512d t0, __m512d t1, __m512d t2, __m512d t3,
  * #and_masks =_mm256_and_ps, _mm512_kand#
  * #xor_masks =_mm256_xor_ps, _mm512_kxor#
  * #fmadd = _mm256_fmadd_ps, _mm512_fmadd_ps#
- * #mask_to_int = _mm256_movemask_ps, #
+ * #mask_to_int = _mm256_movemask_ps, npyv_tobits_b32#
  * #full_mask= 0xFF, 0xFFFF#
  * #masked_store = _mm256_maskstore_ps, _mm512_mask_storeu_ps#
  * #cvtps_epi32 = _mm256_cvtps_epi32, #
@@ -401,7 +401,7 @@ avx512_permute_x8var_pd(__m512d t0, __m512d t1, __m512d t2, __m512d t3,
  * 3) x* = x - y*c3
  * c1, c2 are exact floating points, c3 = C - c1 - c2 simulates higher precision
  */
-static NPY_INLINE @vtype@
+NPY_FINLINE @vtype@
 simd_range_reduction(@vtype@ x, @vtype@ y, @vtype@ c1, @vtype@ c2, @vtype@ c3)
 {
     @vtype@ reduced_x = @fmadd@(y, c1, x);
@@ -800,7 +800,7 @@ AVX512F_exp_DOUBLE(npy_double * op,
         q = _mm512_fmadd_pd(q, r, mA2);
         q = _mm512_fmadd_pd(q, r, mA1);
         q = _mm512_mul_pd(q, r);
-        __m512d p = _mm512_fmadd_pd(r, q, r2);;
+        __m512d p = _mm512_fmadd_pd(r, q, r2);
         p = _mm512_add_pd(r1, p);
 
         /* Get 2^(j/32) from lookup table */
@@ -833,11 +833,19 @@ AVX512F_exp_DOUBLE(npy_double * op,
         op += num_lanes;
         num_remaining_elements -= num_lanes;
     }
-    if (overflow_mask) {
+    /*
+     * Don't count on the compiler for cast between mask and int registers.
+     * On gcc7 with flags -march>=nocona -O3 can cause FP stack overflow
+     * which may lead to putting NaN into certain HW/FP calculations.
+     *
+     * For more details, please check the comments in:
+     * - https://github.com/numpy/numpy/issues/20356
+     */
+    if (npyv_tobits_b64(overflow_mask)) {
         npy_set_floatstatus_overflow();
     }
 
-    if (underflow_mask) {
+    if (npyv_tobits_b64(underflow_mask)) {
         npy_set_floatstatus_underflow();
     }
 }
@@ -868,6 +876,32 @@ AVX512F_exp_DOUBLE(npy_double * op,
  *               = p(r)
  *               = 2((r/2) + 1/3*(r/2)^3 + 1/5*(r/2)^5 + ...)
  */
+
+/* LLVM has a bug where AVX-512F intrinsic `_mm512_mask_mul_pd` emits an
+ * unmasked operation with a masked store.  This can cause FP exceptions to
+ * occur for the lanes that are suppose to have been masked.
+ *
+ * See https://bugs.llvm.org/show_bug.cgi?id=51988
+ *
+ * Note, this affects LLVM based compilers like Apple Clang, Clang, and Intel's
+ * ICX.
+ */
+#if defined(__clang__)
+    #if defined(__apple_build_version__)
+    // Apple Clang
+        #if __apple_build_version__ > 11000000
+        // Apple Clang after v11
+        #define WORKAROUND_LLVM__mm512_mask_mul_pd
+        #endif
+    #else
+    // Clang, not Apple Clang
+        #if __clang_major__ > 9
+        // Clang v9+
+        #define WORKAROUND_LLVM__mm512_mask_mul_pd
+        #endif
+    #endif
+#endif
+
 static void
 AVX512F_log_DOUBLE(npy_double * op,
                 npy_double * ip,
@@ -954,8 +988,12 @@ AVX512F_log_DOUBLE(npy_double * op,
             denormal_mask = _mm512_cmp_epi64_mask(top12, _mm512_set1_epi64(0),
                                 _CMP_EQ_OQ);
             denormal_mask = (~zero_mask) & denormal_mask;
+            __m512d masked_x = x;
+            #ifdef WORKAROUND_LLVM__mm512_mask_mul_pd
+            masked_x = avx512_set_masked_lanes_pd(masked_x, zeros_d, (~denormal_mask));
+            #endif
             ix = _mm512_castpd_si512(_mm512_mask_mul_pd(x, denormal_mask,
-                                    x, _mm512_set1_pd(0x1p52)));
+                                    masked_x, _mm512_set1_pd(0x1p52)));
             ix = _mm512_mask_sub_epi64(ix, denormal_mask,
                                     ix, _mm512_set1_epi64(52ULL << 52));
 
@@ -1032,13 +1070,16 @@ AVX512F_log_DOUBLE(npy_double * op,
         num_remaining_elements -= num_lanes;
     }
 
-    if (invalid_mask) {
+    if (npyv_tobits_b64(invalid_mask)) {
         npy_set_floatstatus_invalid();
     }
-    if (divide_by_zero_mask) {
+    if (npyv_tobits_b64(divide_by_zero_mask)) {
         npy_set_floatstatus_divbyzero();
     }
 }
+
+#undef WORKAROUND_LLVM__mm512_mask_mul_pd
+
 #endif // AVX512F_NOCLANG_BUG
 
 #ifdef SIMD_AVX512_SKX
index 8c2c83e7c998b2f90b9cd5955d048ce3cbff79e6..cd9b2ed547ffffdbda1d3409cfced4a04e1e4fd0 100644 (file)
@@ -209,7 +209,7 @@ NPY_NO_EXPORT void NPY_CPU_DISPATCH_CURFX(FLOAT_@func@)
     const npy_intp ssrc = steps[0] / lsize;
     const npy_intp sdst = steps[1] / lsize;
     npy_intp len = dimensions[0];
-    assert(steps[0] % lsize == 0 && steps[1] % lsize == 0);
+    assert(len <= 1 || (steps[0] % lsize == 0 && steps[1] % lsize == 0));
 #if NPY_SIMD_FMA3
     if (is_mem_overlap(src, steps[0], dst, steps[1], len) ||
         !npyv_loadable_stride_f32(ssrc) || !npyv_storable_stride_f32(sdst)
diff --git a/numpy/core/src/umath/loops_umath_fp.dispatch.c.src b/numpy/core/src/umath/loops_umath_fp.dispatch.c.src
new file mode 100644 (file)
index 0000000..a8289fc
--- /dev/null
@@ -0,0 +1,141 @@
+/*@targets
+ ** $maxopt baseline avx512_skx
+ */
+#include "numpy/npy_math.h"
+#include "simd/simd.h"
+#include "loops_utils.h"
+#include "loops.h"
+#include "npy_svml.h"
+#include "fast_loop_macros.h"
+
+#if NPY_SIMD && defined(NPY_HAVE_AVX512_SKX) && defined(NPY_CAN_LINK_SVML)
+/**begin repeat
+ * #sfx = f32, f64#
+ * #func_suffix = f16, 8#
+ */
+/**begin repeat1
+ * #func = tanh, exp2, log2, log10, expm1, log1p, cbrt, tan, asin, acos, atan, sinh, cosh, asinh, acosh, atanh#
+ * #default_val = 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0#
+ */
+static void
+simd_@func@_@sfx@(const npyv_lanetype_@sfx@ *src, npy_intp ssrc,
+                        npyv_lanetype_@sfx@ *dst, npy_intp sdst, npy_intp len)
+{
+    const int vstep = npyv_nlanes_@sfx@;
+    for (; len > 0; len -= vstep, src += ssrc*vstep, dst += sdst*vstep) {
+        npyv_@sfx@ x;
+        #if @default_val@
+            if (ssrc == 1) {
+                x = npyv_load_till_@sfx@(src, len, @default_val@);
+            } else {
+                x = npyv_loadn_till_@sfx@(src, ssrc, len, @default_val@);
+            }
+        #else
+            if (ssrc == 1) {
+                x = npyv_load_tillz_@sfx@(src, len);
+            } else {
+                x = npyv_loadn_tillz_@sfx@(src, ssrc, len);
+            }
+        #endif
+        npyv_@sfx@ out = __svml_@func@@func_suffix@(x);
+        if (sdst == 1) {
+            npyv_store_till_@sfx@(dst, len, out);
+        } else {
+            npyv_storen_till_@sfx@(dst, sdst, len, out);
+        }
+    }
+    npyv_cleanup();
+}
+/**end repeat1**/
+/**end repeat**/
+
+/**begin repeat
+ * #func = sin, cos#
+ */
+static void
+simd_@func@_f64(const double *src, npy_intp ssrc,
+                      double *dst, npy_intp sdst, npy_intp len)
+{
+    const int vstep = npyv_nlanes_f64;
+    for (; len > 0; len -= vstep, src += ssrc*vstep, dst += sdst*vstep) {
+        npyv_f64 x;
+        if (ssrc == 1) {
+            x = npyv_load_tillz_f64(src, len);
+        } else {
+            x = npyv_loadn_tillz_f64(src, ssrc, len);
+        }
+        npyv_f64 out = __svml_@func@8(x);
+        if (sdst == 1) {
+            npyv_store_till_f64(dst, len, out);
+        } else {
+            npyv_storen_till_f64(dst, sdst, len, out);
+        }
+    }
+    npyv_cleanup();
+}
+/**end repeat**/
+#endif
+
+/**begin repeat
+ *  #TYPE = DOUBLE, FLOAT#
+ *  #type = npy_double, npy_float#
+ *  #vsub = , f#
+ *  #sfx  = f64, f32#
+ */
+/**begin repeat1
+ *  #func = tanh, exp2, log2, log10, expm1, log1p, cbrt, tan, arcsin, arccos, arctan, sinh, cosh, arcsinh, arccosh, arctanh#
+ *  #intrin = tanh, exp2, log2, log10, expm1, log1p, cbrt, tan, asin, acos, atan, sinh, cosh, asinh, acosh, atanh#
+ */
+NPY_NO_EXPORT void NPY_CPU_DISPATCH_CURFX(@TYPE@_@func@)
+(char **args, npy_intp const *dimensions, npy_intp const *steps, void *NPY_UNUSED(data))
+{
+#if NPY_SIMD && defined(NPY_HAVE_AVX512_SKX) && defined(NPY_CAN_LINK_SVML)
+    const @type@ *src = (@type@*)args[0];
+          @type@ *dst = (@type@*)args[1];
+    const int lsize = sizeof(src[0]);
+    const npy_intp ssrc = steps[0] / lsize;
+    const npy_intp sdst = steps[1] / lsize;
+    const npy_intp len = dimensions[0];
+    assert(len <= 1 || (steps[0] % lsize == 0 && steps[1] % lsize == 0));
+    if (!is_mem_overlap(src, steps[0], dst, steps[1], len) &&
+        npyv_loadable_stride_@sfx@(ssrc) &&
+        npyv_storable_stride_@sfx@(sdst)) {
+        simd_@intrin@_@sfx@(src, ssrc, dst, sdst, len);
+        return;
+    }
+#endif
+    UNARY_LOOP {
+        const @type@ in1 = *(@type@ *)ip1;
+        *(@type@ *)op1 = npy_@intrin@@vsub@(in1);
+    }
+}
+/**end repeat1**/
+/**end repeat**/
+
+/**begin repeat
+ *  #func = sin, cos#
+ */
+NPY_NO_EXPORT void NPY_CPU_DISPATCH_CURFX(DOUBLE_@func@)
+(char **args, npy_intp const *dimensions, npy_intp const *steps, void *NPY_UNUSED(data))
+{
+#if NPY_SIMD && defined(NPY_HAVE_AVX512_SKX) && defined(NPY_CAN_LINK_SVML)
+    const double *src = (double*)args[0];
+          double *dst = (double*)args[1];
+    const int lsize = sizeof(src[0]);
+    const npy_intp ssrc = steps[0] / lsize;
+    const npy_intp sdst = steps[1] / lsize;
+    const npy_intp len = dimensions[0];
+    assert(len <= 1 || (steps[0] % lsize == 0 && steps[1] % lsize == 0));
+    if (!is_mem_overlap(src, steps[0], dst, steps[1], len) &&
+        npyv_loadable_stride_f64(ssrc) &&
+        npyv_storable_stride_f64(sdst)) {
+        simd_@func@_f64(src, ssrc, dst, sdst, len);
+        return;
+    }
+#endif
+    UNARY_LOOP {
+        const npy_double in1 = *(npy_double *)ip1;
+        *(npy_double *)op1 = npy_@func@(in1);
+    }
+}
+/**end repeat**/
index 2d5917282c26b2e5d37d4e512487bbce2244853f..93761b98c04ee900923a92c3333678b7b1386719 100644 (file)
@@ -1,6 +1,8 @@
 /*@targets
  ** $maxopt baseline
- ** sse2 vsx2 neon
+ ** sse2 sse41
+ ** vsx2
+ ** neon asimd
  **/
 /**
  * Force use SSE only on x86, even if AVX2 or AVX512F are enabled
@@ -65,6 +67,9 @@ NPY_FINLINE double c_square_f64(double a)
     #define c_sqrt_f64 npy_sqrt
 #endif
 
+#define c_ceil_f32 npy_ceilf
+#define c_ceil_f64 npy_ceil
+
 /********************************************************************************
  ** Defining the SIMD kernels
  ********************************************************************************/
@@ -134,10 +139,10 @@ NPY_FINLINE double c_square_f64(double a)
  */
 #if @VCHK@
 /**begin repeat1
- * #kind     = sqrt, absolute, square, reciprocal#
- * #intr     = sqrt, abs,      square, recip#
- * #repl_0w1 = 0,    0,        0,      1#
- * #RECIP_WORKAROUND = 0, 0,   0,      WORKAROUND_CLANG_RECIPROCAL_BUG#
+ * #kind     = ceil, sqrt, absolute, square, reciprocal#
+ * #intr     = ceil, sqrt, abs,      square, recip#
+ * #repl_0w1 = 0,    0,    0,        0,      1#
+ * #RECIP_WORKAROUND = 0, 0, 0, 0, WORKAROUND_CLANG_RECIPROCAL_BUG#
  */
 /**begin repeat2
  * #STYPE  = CONTIG, NCONTIG, CONTIG,  NCONTIG#
@@ -245,9 +250,9 @@ static void simd_@TYPE@_@kind@_@STYPE@_@DTYPE@
  * #VCHK = NPY_SIMD, NPY_SIMD_F64#
  */
 /**begin repeat1
- * #kind  = sqrt, absolute, square, reciprocal#
- * #intr  = sqrt, abs,      square, recip#
- * #clear = 0,    1,        0,      0#
+ * #kind  = ceil, sqrt, absolute, square, reciprocal#
+ * #intr  = ceil, sqrt, abs,      square, recip#
+ * #clear = 0,    0,    1,        0,      0#
  */
 NPY_NO_EXPORT void NPY_CPU_DISPATCH_CURFX(@TYPE@_@kind@)
 (char **args, npy_intp const *dimensions, npy_intp const *steps, void *NPY_UNUSED(func))
@@ -258,7 +263,7 @@ NPY_NO_EXPORT void NPY_CPU_DISPATCH_CURFX(@TYPE@_@kind@)
     npy_intp len = dimensions[0];
 #if @VCHK@
     const int lsize = sizeof(npyv_lanetype_@sfx@);
-    assert(src_step % lsize == 0 && dst_step % lsize == 0);
+    assert(len <= 1 || (src_step % lsize == 0 && dst_step % lsize == 0));
     if (is_mem_overlap(src, src_step, dst, dst_step, len)) {
         goto no_unroll;
     }
index 1a2a5a32ba20629327d5bd246193909f5760562b..762e9ee59bede5a6cc705023f6e2856aa46c1cea 100644 (file)
@@ -6,7 +6,7 @@
 
 /**
  * Old versions of MSVC causes ambiguous link errors when we deal with large SIMD kernels
- * which lead to break the build, probably releated to the following bug:
+ * which lead to break the build, probably related to the following bug:
  * https://developercommunity.visualstudio.com/content/problem/415095/internal-compiler-error-with-perfectly-forwarded-r.html
  */
 #if defined(_MSC_VER) && _MSC_VER < 1916
index 0e47d1ab53c94a891c1428eb51d27317af386cb3..4dd0c475968e6c373aa1c1f62bd40341e82268a5 100644 (file)
@@ -1,11 +1,11 @@
 /* -*- c -*- */
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
 
 #define _UMATHMODULE
 #define _MULTIARRAYMODULE
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 
-#include "Python.h"
-
 #include "npy_config.h"
 #include "numpy/npy_common.h"
 #include "numpy/arrayobject.h"
index f1423d8b9afcc6ba8e594bc1647b776ec4981fec..8cb44d4338a7b1cbfe853bfb681e393304c55903 100644 (file)
@@ -6,15 +6,15 @@
  *
  * See LICENSE.txt for the license.
  */
-#define _UMATHMODULE
-#define _MULTIARRAYMODULE
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+#define _UMATHMODULE
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
 #include "npy_config.h"
-#include <numpy/arrayobject.h>
+#include "numpy/arrayobject.h"
 
 #include "npy_pycompat.h"
 #include "ctors.h"
@@ -145,14 +145,12 @@ PyArray_CopyInitialReduceValues(
  * boilerplate code, just calling the appropriate inner loop function where
  * necessary.
  *
+ * context     : The ArrayMethod context (with ufunc, method, and descriptors).
  * operand     : The array to be reduced.
  * out         : NULL, or the array into which to place the result.
  * wheremask   : NOT YET SUPPORTED, but this parameter is placed here
  *               so that support can be added in the future without breaking
  *               API compatibility. Pass in NULL.
- * operand_dtype : The dtype the inner loop expects for the operand.
- * result_dtype : The dtype the inner loop expects for the result.
- * casting     : The casting rule to apply to the operands.
  * axis_flags  : Flags indicating the reduction axes of 'operand'.
  * reorderable : If True, the reduction being done is reorderable, which
  *               means specifying multiple axes of reduction at once is ok,
@@ -166,7 +164,7 @@ PyArray_CopyInitialReduceValues(
  * identity    : If Py_None, PyArray_CopyInitialReduceValues is used, otherwise
  *               this value is used to initialize the result to
  *               the reduction's unit.
- * loop        : The loop which does the reduction.
+ * loop        : `reduce_loop` from `ufunc_object.c`.  TODO: Refactor
  * data        : Data which is passed to the inner loop.
  * buffersize  : Buffer size for the iterator. For the default, pass in 0.
  * funcname    : The name of the reduction function, for error messages.
@@ -182,18 +180,13 @@ PyArray_CopyInitialReduceValues(
  * generalized ufuncs!)
  */
 NPY_NO_EXPORT PyArrayObject *
-PyUFunc_ReduceWrapper(PyArrayObject *operand, PyArrayObject *out,
-                      PyArrayObject *wheremask,
-                      PyArray_Descr *operand_dtype,
-                      PyArray_Descr *result_dtype,
-                      NPY_CASTING casting,
-                      npy_bool *axis_flags, int reorderable,
-                      int keepdims,
-                      PyObject *identity,
-                      PyArray_ReduceLoopFunc *loop,
-                      void *data, npy_intp buffersize, const char *funcname,
-                      int errormask)
+PyUFunc_ReduceWrapper(PyArrayMethod_Context *context,
+        PyArrayObject *operand, PyArrayObject *out, PyArrayObject *wheremask,
+        npy_bool *axis_flags, int reorderable, int keepdims,
+        PyObject *identity, PyArray_ReduceLoopFunc *loop,
+        void *data, npy_intp buffersize, const char *funcname, int errormask)
 {
+    assert(loop != NULL);
     PyArrayObject *result = NULL;
     npy_intp skip_first_count = 0;
 
@@ -201,7 +194,9 @@ PyUFunc_ReduceWrapper(PyArrayObject *operand, PyArrayObject *out,
     NpyIter *iter = NULL;
     PyArrayObject *op[3];
     PyArray_Descr *op_dtypes[3];
-    npy_uint32 flags, op_flags[3];
+    npy_uint32 it_flags, op_flags[3];
+    /* Loop auxdata (must be freed on error) */
+    NpyAuxData *auxdata = NULL;
 
     /* More than one axis means multiple orders are possible */
     if (!reorderable && count_axes(PyArray_NDIM(operand), axis_flags) > 1) {
@@ -224,10 +219,10 @@ PyUFunc_ReduceWrapper(PyArrayObject *operand, PyArrayObject *out,
     /* Set up the iterator */
     op[0] = out;
     op[1] = operand;
-    op_dtypes[0] = result_dtype;
-    op_dtypes[1] = operand_dtype;
+    op_dtypes[0] = context->descriptors[0];
+    op_dtypes[1] = context->descriptors[1];
 
-    flags = NPY_ITER_BUFFERED |
+    it_flags = NPY_ITER_BUFFERED |
             NPY_ITER_EXTERNAL_LOOP |
             NPY_ITER_GROWINNER |
             NPY_ITER_DONT_NEGATE_STRIDES |
@@ -293,8 +288,8 @@ PyUFunc_ReduceWrapper(PyArrayObject *operand, PyArrayObject *out,
         }
     }
 
-    iter = NpyIter_AdvancedNew(wheremask == NULL ? 2 : 3, op, flags,
-                               NPY_KEEPORDER, casting,
+    iter = NpyIter_AdvancedNew(wheremask == NULL ? 2 : 3, op, it_flags,
+                               NPY_KEEPORDER, NPY_UNSAFE_CASTING,
                                op_flags,
                                op_dtypes,
                                PyArray_NDIM(operand), op_axes, NULL, buffersize);
@@ -304,11 +299,20 @@ PyUFunc_ReduceWrapper(PyArrayObject *operand, PyArrayObject *out,
 
     result = NpyIter_GetOperandArray(iter)[0];
 
+    PyArrayMethod_StridedLoop *strided_loop;
+    NPY_ARRAYMETHOD_FLAGS flags = 0;
+
+    int needs_api = (flags & NPY_METH_REQUIRES_PYAPI) != 0;
+    needs_api |= NpyIter_IterationNeedsAPI(iter);
+    if (!(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        /* Start with the floating-point exception flags cleared */
+        npy_clear_floatstatus_barrier((char*)&iter);
+    }
+
     /*
      * Initialize the result to the reduction unit if possible,
      * otherwise copy the initial values and get a view to the rest.
      */
-
     if (identity != Py_None) {
         if (PyArray_FillWithScalar(result, identity) < 0) {
             goto fail;
@@ -331,15 +335,30 @@ PyUFunc_ReduceWrapper(PyArrayObject *operand, PyArrayObject *out,
         goto fail;
     }
 
-    /* Start with the floating-point exception flags cleared */
-    npy_clear_floatstatus_barrier((char*)&iter);
+    /*
+     * Note that we need to ensure that the iterator is reset before getting
+     * the fixed strides.  (The buffer information is unitialized before.)
+     */
+    npy_intp fixed_strides[3];
+    NpyIter_GetInnerFixedStrideArray(iter, fixed_strides);
+    if (wheremask != NULL) {
+        if (PyArrayMethod_GetMaskedStridedLoop(context,
+                1, fixed_strides, &strided_loop, &auxdata, &flags) < 0) {
+            goto fail;
+        }
+    }
+    else {
+        if (context->method->get_strided_loop(context,
+                1, 0, fixed_strides, &strided_loop, &auxdata, &flags) < 0) {
+            goto fail;
+        }
+    }
 
     if (NpyIter_GetIterSize(iter) != 0) {
         NpyIter_IterNextFunc *iternext;
         char **dataptr;
         npy_intp *strideptr;
         npy_intp *countptr;
-        int needs_api;
 
         iternext = NpyIter_GetIterNext(iter, NULL);
         if (iternext == NULL) {
@@ -349,33 +368,26 @@ PyUFunc_ReduceWrapper(PyArrayObject *operand, PyArrayObject *out,
         strideptr = NpyIter_GetInnerStrideArray(iter);
         countptr = NpyIter_GetInnerLoopSizePtr(iter);
 
-        needs_api = NpyIter_IterationNeedsAPI(iter);
-
-        /* Straightforward reduction */
-        if (loop == NULL) {
-            PyErr_Format(PyExc_RuntimeError,
-                    "reduction operation %s did not supply an "
-                    "inner loop function", funcname);
+        if (loop(context, strided_loop, auxdata,
+                iter, dataptr, strideptr, countptr, iternext,
+                needs_api, skip_first_count) < 0) {
             goto fail;
         }
+    }
 
-        if (loop(iter, dataptr, strideptr, countptr,
-                        iternext, needs_api, skip_first_count, data) < 0) {
+    if (!(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        /* NOTE: We could check float errors even on error */
+        if (_check_ufunc_fperr(errormask, NULL, "reduce") < 0) {
             goto fail;
         }
     }
 
-    /* Check whether any errors occurred during the loop */
-    if (PyErr_Occurred() ||
-            _check_ufunc_fperr(errormask, NULL, "reduce") < 0) {
-        goto fail;
-    }
-
     if (out != NULL) {
         result = out;
     }
     Py_INCREF(result);
 
+    NPY_AUXDATA_FREE(auxdata);
     if (!NpyIter_Deallocate(iter)) {
         Py_DECREF(result);
         return NULL;
@@ -383,6 +395,7 @@ PyUFunc_ReduceWrapper(PyArrayObject *operand, PyArrayObject *out,
     return result;
 
 fail:
+    NPY_AUXDATA_FREE(auxdata);
     if (iter != NULL) {
         NpyIter_Deallocate(iter);
     }
index 372605dba43c1d396471b2979fd7f1616ed8c1a7..2170e27a7f9ef45c466f9a1430aaf08ddf8bbae6 100644 (file)
@@ -19,93 +19,17 @@ typedef int (PyArray_AssignReduceIdentityFunc)(PyArrayObject *result,
                                                void *data);
 
 /*
- * This is a function for the reduce loop.
+ * Inner definition of the reduce loop, only used for a static function.
+ * At some point around NumPy 1.6, there was probably an intention to make
+ * the reduce loop customizable at this level (per ufunc?).
  *
- * The needs_api parameter indicates whether it's ok to release the GIL during
- * the loop, such as when the iternext() function never calls
- * a function which could raise a Python exception.
- *
- * The skip_first_count parameter indicates how many elements need to be
- * skipped based on NpyIter_IsFirstVisit checks. This can only be positive
- * when the 'assign_identity' parameter was NULL when calling
- * PyArray_ReduceWrapper.
- *
- * The loop gets two data pointers and two strides, and should
- * look roughly like this:
- *  {
- *      NPY_BEGIN_THREADS_DEF;
- *      if (!needs_api) {
- *          NPY_BEGIN_THREADS;
- *      }
- *      // This first-visit loop can be skipped if 'assign_identity' was non-NULL
- *      if (skip_first_count > 0) {
- *          do {
- *              char *data0 = dataptr[0], *data1 = dataptr[1];
- *              npy_intp stride0 = strideptr[0], stride1 = strideptr[1];
- *              npy_intp count = *countptr;
- *
- *              // Skip any first-visit elements
- *              if (NpyIter_IsFirstVisit(iter, 0)) {
- *                  if (stride0 == 0) {
- *                      --count;
- *                      --skip_first_count;
- *                      data1 += stride1;
- *                  }
- *                  else {
- *                      skip_first_count -= count;
- *                      count = 0;
- *                  }
- *              }
- *
- *              while (count--) {
- *                  *(result_t *)data0 = my_reduce_op(*(result_t *)data0,
- *                                                    *(operand_t *)data1);
- *                  data0 += stride0;
- *                  data1 += stride1;
- *              }
- *
- *              // Jump to the faster loop when skipping is done
- *              if (skip_first_count == 0) {
- *                  if (iternext(iter)) {
- *                      break;
- *                  }
- *                  else {
- *                      goto finish_loop;
- *                  }
- *              }
- *          } while (iternext(iter));
- *      }
- *      do {
- *          char *data0 = dataptr[0], *data1 = dataptr[1];
- *          npy_intp stride0 = strideptr[0], stride1 = strideptr[1];
- *          npy_intp count = *countptr;
- *
- *          while (count--) {
- *              *(result_t *)data0 = my_reduce_op(*(result_t *)data0,
- *                                                *(operand_t *)data1);
- *              data0 += stride0;
- *              data1 += stride1;
- *          }
- *      } while (iternext(iter));
- *  finish_loop:
- *      if (!needs_api) {
- *          NPY_END_THREADS;
- *      }
- *      return (needs_api && PyErr_Occurred()) ? -1 : 0;
- *  }
- *
- * If needs_api is True, this function should call PyErr_Occurred()
- * to check if an error occurred during processing, and return -1 for
- * error, 0 for success.
+ * TODO: This should be refactored/removed.
  */
-typedef int (PyArray_ReduceLoopFunc)(NpyIter *iter,
-                                            char **dataptr,
-                                            npy_intp const *strideptr,
-                                            npy_intp const *countptr,
-                                            NpyIter_IterNextFunc *iternext,
-                                            int needs_api,
-                                            npy_intp skip_first_count,
-                                            void *data);
+typedef int (PyArray_ReduceLoopFunc)(PyArrayMethod_Context *context,
+        PyArrayMethod_StridedLoop *strided_loop, NpyAuxData *auxdata,
+        NpyIter *iter, char **dataptrs, npy_intp const *strides,
+        npy_intp const *countptr, NpyIter_IterNextFunc *iternext,
+        int needs_api, npy_intp skip_first_count);
 
 /*
  * This function executes all the standard NumPy reduction function
@@ -138,16 +62,10 @@ typedef int (PyArray_ReduceLoopFunc)(NpyIter *iter,
  * errormask   : forwarded from _get_bufsize_errmask
  */
 NPY_NO_EXPORT PyArrayObject *
-PyUFunc_ReduceWrapper(PyArrayObject *operand, PyArrayObject *out,
-                      PyArrayObject *wheremask,
-                      PyArray_Descr *operand_dtype,
-                      PyArray_Descr *result_dtype,
-                      NPY_CASTING casting,
-                      npy_bool *axis_flags, int reorderable,
-                      int keepdims,
-                      PyObject *identity,
-                      PyArray_ReduceLoopFunc *loop,
-                      void *data, npy_intp buffersize, const char *funcname,
-                      int errormask);
+PyUFunc_ReduceWrapper(PyArrayMethod_Context *context,
+        PyArrayObject *operand, PyArrayObject *out, PyArrayObject *wheremask,
+        npy_bool *axis_flags, int reorderable, int keepdims,
+        PyObject *identity, PyArray_ReduceLoopFunc *loop,
+        void *data, npy_intp buffersize, const char *funcname, int errormask);
 
 #endif
index 66f97a8314310789cfb86b1c8b2990a72122a9bf..402e6b561717bfda611d87e900f3147233b37cd5 100644 (file)
@@ -5,12 +5,13 @@
 
    but still supports error-modes.
 */
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
 
 #define _UMATHMODULE
 #define _MULTIARRAYMODULE
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 
-#include "Python.h"
 #include "npy_config.h"
 #include "numpy/arrayobject.h"
 #include "numpy/ufuncobject.h"
@@ -283,19 +284,13 @@ static void
 
 static void
 @name@_ctype_floor_divide(@type@ a, @type@ b, @type@ *out) {
-    @type@ mod;
-
-    if (!b) {
-        *out = a / b;
-    } else {
-        *out = npy_divmod@c@(a, b, &mod);
-    }
+    *out = npy_floor_divide@c@(a, b);
 }
 
 
 static void
 @name@_ctype_remainder(@type@ a, @type@ b, @type@ *out) {
-    npy_divmod@c@(a, b, out);
+    *out = npy_remainder@c@(a, b);
 }
 
 
index 1a345b1fbaec7189583d2676fe68d913b8f2a75e..0e2c1ab8b31b591038dc1bbef3f019ed77b09ada 100644 (file)
@@ -116,9 +116,8 @@ run_binary_avx512f_@func@_@TYPE@(char **args, npy_intp const *dimensions, npy_in
 #endif
     return 0;
 }
-
-
 /**end repeat1**/
+
 /**end repeat**/
 
 /**begin repeat
@@ -170,7 +169,7 @@ run_@func@_avx512_skx_@TYPE@(char **args, npy_intp const *dimensions, npy_intp c
  */
 
 /**begin repeat2
- *  #func = rint, floor, ceil, trunc#
+ *  #func = rint, floor, trunc#
  */
 
 #if defined @CHK@ && defined NPY_HAVE_SSE2_INTRINSICS
@@ -205,9 +204,9 @@ run_unary_@isa@_@func@_@TYPE@(char **args, npy_intp const *dimensions, npy_intp
  */
 
 /**begin repeat1
- * #func = absolute, negative, minimum, maximum#
- * #check = IS_BLOCKABLE_UNARY*2, IS_BLOCKABLE_REDUCE*2 #
- * #name = unary*2, unary_reduce*2#
+ * #func = negative, minimum, maximum#
+ * #check = IS_BLOCKABLE_UNARY, IS_BLOCKABLE_REDUCE*2 #
+ * #name = unary, unary_reduce*2#
  */
 
 #if @vector@ && defined NPY_HAVE_SSE2_INTRINSICS
@@ -399,7 +398,7 @@ run_unary_simd_@kind@_BOOL(char **args, npy_intp const *dimensions, npy_intp con
 * # VOP = min, max#
 */
 
-static NPY_INLINE npy_float sse2_horizontal_@VOP@___m128(__m128 v)
+NPY_FINLINE npy_float sse2_horizontal_@VOP@___m128(__m128 v)
 {
     npy_float r;
     __m128 tmp = _mm_movehl_ps(v, v);                   /* c     d     ... */
@@ -409,7 +408,7 @@ static NPY_INLINE npy_float sse2_horizontal_@VOP@___m128(__m128 v)
     return r;
 }
 
-static NPY_INLINE npy_double sse2_horizontal_@VOP@___m128d(__m128d v)
+NPY_FINLINE npy_double sse2_horizontal_@VOP@___m128d(__m128d v)
 {
     npy_double r;
     __m128d tmp = _mm_unpackhi_pd(v, v);    /* b     b */
@@ -440,7 +439,7 @@ static NPY_INLINE npy_double sse2_horizontal_@VOP@___m128d(__m128d v)
  * the last vector is passed as a pointer as MSVC 2010 is unable to ignore the
  * calling convention leading to C2719 on 32 bit, see #4795
  */
-static NPY_INLINE void
+NPY_FINLINE void
 sse2_compress4_to_byte_@TYPE@(@vtype@ r1, @vtype@ r2, @vtype@ r3, @vtype@ * r4,
                               npy_bool * op)
 {
@@ -557,7 +556,7 @@ sse2_@kind@_@TYPE@(npy_bool * op, @type@ * ip1, npy_intp n)
 */
 
 /* sets invalid fpu flag on QNaN for consistency with packed compare */
-static NPY_INLINE int
+NPY_FINLINE int
 sse2_ordered_cmp_@kind@_@TYPE@(const @type@ a, const @type@ b)
 {
     @vtype@ one = @vpre@_set1_@vsuf@(1);
@@ -644,26 +643,9 @@ sse2_binary_scalar2_@kind@_@TYPE@(npy_bool * op, @type@ * ip1, @type@ * ip2, npy
 }
 /**end repeat1**/
 
-static NPY_INLINE
-@type@ scalar_abs_@type@(@type@ v)
-{
-    /* add 0 to clear -0.0 */
-    return (v > 0 ? v: -v) + 0;
-}
-
-static NPY_INLINE
-@type@ scalar_neg_@type@(@type@ v)
-{
-    return -v;
-}
 
-/**begin repeat1
- * #kind = absolute, negative#
- * #VOP = andnot, xor#
- * #scalar = scalar_abs, scalar_neg#
- **/
 static void
-sse2_@kind@_@TYPE@(@type@ * op, @type@ * ip, const npy_intp n)
+sse2_negative_@TYPE@(@type@ * op, @type@ * ip, const npy_intp n)
 {
     /*
      * get 0x7FFFFFFF mask (everything but signbit set)
@@ -674,24 +656,24 @@ sse2_@kind@_@TYPE@(@type@ * op, @type@ * ip, const npy_intp n)
 
     /* align output to VECTOR_SIZE_BYTES bytes */
     LOOP_BLOCK_ALIGN_VAR(op, @type@, VECTOR_SIZE_BYTES) {
-        op[i] = @scalar@_@type@(ip[i]);
+        op[i] = -ip[i];
     }
     assert((npy_uintp)n < (VECTOR_SIZE_BYTES / sizeof(@type@)) ||
            npy_is_aligned(&op[i], VECTOR_SIZE_BYTES));
     if (npy_is_aligned(&ip[i], VECTOR_SIZE_BYTES)) {
         LOOP_BLOCKED(@type@, VECTOR_SIZE_BYTES) {
             @vtype@ a = @vpre@_load_@vsuf@(&ip[i]);
-            @vpre@_store_@vsuf@(&op[i], @vpre@_@VOP@_@vsuf@(mask, a));
+            @vpre@_store_@vsuf@(&op[i], @vpre@_xor_@vsuf@(mask, a));
         }
     }
     else {
         LOOP_BLOCKED(@type@, VECTOR_SIZE_BYTES) {
             @vtype@ a = @vpre@_loadu_@vsuf@(&ip[i]);
-            @vpre@_store_@vsuf@(&op[i], @vpre@_@VOP@_@vsuf@(mask, a));
+            @vpre@_store_@vsuf@(&op[i], @vpre@_xor_@vsuf@(mask, a));
         }
     }
     LOOP_BLOCKED_END {
-        op[i] = @scalar@_@type@(ip[i]);
+        op[i] = -ip[i];
     }
 }
 /**end repeat1**/
@@ -750,19 +732,19 @@ sse2_@kind@_@TYPE@(@type@ * ip, @type@ * op, const npy_intp n)
 /* bunch of helper functions used in ISA_exp/log_FLOAT*/
 
 #if defined HAVE_ATTRIBUTE_TARGET_AVX2_WITH_INTRINSICS
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
 fma_get_full_load_mask_ps(void)
 {
     return _mm256_set1_ps(-1.0);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256i
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256i
 fma_get_full_load_mask_pd(void)
 {
     return _mm256_castpd_si256(_mm256_set1_pd(-1.0));
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
 fma_get_partial_load_mask_ps(const npy_int num_elem, const npy_int num_lanes)
 {
     float maskint[16] = {-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,
@@ -771,7 +753,7 @@ fma_get_partial_load_mask_ps(const npy_int num_elem, const npy_int num_lanes)
     return _mm256_loadu_ps(addr);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256i
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256i
 fma_get_partial_load_mask_pd(const npy_int num_elem, const npy_int num_lanes)
 {
     npy_int maskint[16] = {-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1};
@@ -779,7 +761,7 @@ fma_get_partial_load_mask_pd(const npy_int num_elem, const npy_int num_lanes)
     return _mm256_loadu_si256((__m256i*) addr);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
 fma_masked_gather_ps(__m256 src,
                      npy_float* addr,
                      __m256i vindex,
@@ -788,7 +770,7 @@ fma_masked_gather_ps(__m256 src,
     return _mm256_mask_i32gather_ps(src, addr, vindex, mask, 4);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256d
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256d
 fma_masked_gather_pd(__m256d src,
                      npy_double* addr,
                      __m128i vindex,
@@ -797,43 +779,43 @@ fma_masked_gather_pd(__m256d src,
     return _mm256_mask_i32gather_pd(src, addr, vindex, mask, 8);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
 fma_masked_load_ps(__m256 mask, npy_float* addr)
 {
     return _mm256_maskload_ps(addr, _mm256_cvtps_epi32(mask));
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256d
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256d
 fma_masked_load_pd(__m256i mask, npy_double* addr)
 {
     return _mm256_maskload_pd(addr, mask);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
 fma_set_masked_lanes_ps(__m256 x, __m256 val, __m256 mask)
 {
     return _mm256_blendv_ps(x, val, mask);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256d
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256d
 fma_set_masked_lanes_pd(__m256d x, __m256d val, __m256d mask)
 {
     return _mm256_blendv_pd(x, val, mask);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
 fma_blend(__m256 x, __m256 y, __m256 ymask)
 {
     return _mm256_blendv_ps(x, y, ymask);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256
 fma_invert_mask_ps(__m256 ymask)
 {
     return _mm256_andnot_ps(ymask, _mm256_set1_ps(-1.0));
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256i
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA __m256i
 fma_invert_mask_pd(__m256i ymask)
 {
     return _mm256_andnot_si256(ymask, _mm256_set1_epi32(0xFFFFFFFF));
@@ -843,37 +825,31 @@ fma_invert_mask_pd(__m256i ymask)
  *  #vsub = ps, pd#
  *  #vtype = __m256, __m256d#
  */
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA @vtype@
 fma_abs_@vsub@(@vtype@ x)
 {
     return _mm256_andnot_@vsub@(_mm256_set1_@vsub@(-0.0), x);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA @vtype@
 fma_reciprocal_@vsub@(@vtype@ x)
 {
     return _mm256_div_@vsub@(_mm256_set1_@vsub@(1.0f), x);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA @vtype@
 fma_rint_@vsub@(@vtype@ x)
 {
     return _mm256_round_@vsub@(x, _MM_FROUND_TO_NEAREST_INT);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA @vtype@
 fma_floor_@vsub@(@vtype@ x)
 {
     return _mm256_round_@vsub@(x, _MM_FROUND_TO_NEG_INF);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA @vtype@
-fma_ceil_@vsub@(@vtype@ x)
-{
-    return _mm256_round_@vsub@(x, _MM_FROUND_TO_POS_INF);
-}
-
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_FMA @vtype@
 fma_trunc_@vsub@(@vtype@ x)
 {
     return _mm256_round_@vsub@(x, _MM_FROUND_TO_ZERO);
@@ -882,31 +858,31 @@ fma_trunc_@vsub@(@vtype@ x)
 #endif
 
 #if defined HAVE_ATTRIBUTE_TARGET_AVX512F_WITH_INTRINSICS
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask16
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask16
 avx512_get_full_load_mask_ps(void)
 {
     return 0xFFFF;
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask8
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask8
 avx512_get_full_load_mask_pd(void)
 {
     return 0xFF;
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask16
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask16
 avx512_get_partial_load_mask_ps(const npy_int num_elem, const npy_int total_elem)
 {
     return (0x0001 << num_elem) - 0x0001;
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask8
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask8
 avx512_get_partial_load_mask_pd(const npy_int num_elem, const npy_int total_elem)
 {
     return (0x01 << num_elem) - 0x01;
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512
 avx512_masked_gather_ps(__m512 src,
                         npy_float* addr,
                         __m512i vindex,
@@ -915,7 +891,7 @@ avx512_masked_gather_ps(__m512 src,
     return _mm512_mask_i32gather_ps(src, kmask, vindex, addr, 4);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512d
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512d
 avx512_masked_gather_pd(__m512d src,
                         npy_double* addr,
                         __m256i vindex,
@@ -924,43 +900,43 @@ avx512_masked_gather_pd(__m512d src,
     return _mm512_mask_i32gather_pd(src, kmask, vindex, addr, 8);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512
 avx512_masked_load_ps(__mmask16 mask, npy_float* addr)
 {
     return _mm512_maskz_loadu_ps(mask, (__m512 *)addr);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512d
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512d
 avx512_masked_load_pd(__mmask8 mask, npy_double* addr)
 {
     return _mm512_maskz_loadu_pd(mask, (__m512d *)addr);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512
 avx512_set_masked_lanes_ps(__m512 x, __m512 val, __mmask16 mask)
 {
     return _mm512_mask_blend_ps(mask, x, val);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512d
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512d
 avx512_set_masked_lanes_pd(__m512d x, __m512d val, __mmask8 mask)
 {
     return _mm512_mask_blend_pd(mask, x, val);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __m512
 avx512_blend(__m512 x, __m512 y, __mmask16 ymask)
 {
     return _mm512_mask_mov_ps(x, ymask, y);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask16
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask16
 avx512_invert_mask_ps(__mmask16 ymask)
 {
     return _mm512_knot(ymask);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask8
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F __mmask8
 avx512_invert_mask_pd(__mmask8 ymask)
 {
     return _mm512_knot(ymask);
@@ -980,56 +956,50 @@ avx512_invert_mask_pd(__mmask8 ymask)
  *  #INF = NPY_INFINITYF, NPY_INFINITY#
  *  #NAN = NPY_NANF, NPY_NAN#
  */
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
 avx512_abs_@vsub@(@vtype@ x)
 {
     return (@vtype@) _mm512_and_@epi_vsub@((__m512i) x,
                                    _mm512_set1_@epi_vsub@ (@and_const@));
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
 avx512_reciprocal_@vsub@(@vtype@ x)
 {
     return _mm512_div_@vsub@(_mm512_set1_@vsub@(1.0f), x);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
 avx512_rint_@vsub@(@vtype@ x)
 {
     return _mm512_roundscale_@vsub@(x, 0x08);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
 avx512_floor_@vsub@(@vtype@ x)
 {
     return _mm512_roundscale_@vsub@(x, 0x09);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
-avx512_ceil_@vsub@(@vtype@ x)
-{
-    return _mm512_roundscale_@vsub@(x, 0x0A);
-}
-
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
 avx512_trunc_@vsub@(@vtype@ x)
 {
     return _mm512_roundscale_@vsub@(x, 0x0B);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
 avx512_hadd_@vsub@(const @vtype@ x)
 {
     return _mm512_add_@vsub@(x, _mm512_permute_@vsub@(x, @perm_@));
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
 avx512_hsub_@vsub@(const @vtype@ x)
 {
     return _mm512_sub_@vsub@(x, _mm512_permute_@vsub@(x, @perm_@));
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
 avx512_cabsolute_@vsub@(const @vtype@ x1,
                         const @vtype@ x2,
                         const __m512i re_indices,
@@ -1074,7 +1044,7 @@ avx512_cabsolute_@vsub@(const @vtype@ x1,
     return _mm512_mul_@vsub@(hypot, larger);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
 avx512_conjugate_@vsub@(const @vtype@ x)
 {
     /*
@@ -1087,7 +1057,7 @@ avx512_conjugate_@vsub@(const @vtype@ x)
     return _mm512_castsi512_@vsub@(res);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
 avx512_cmul_@vsub@(@vtype@ x1, @vtype@ x2)
 {
     // x1 = r1, i1
@@ -1100,7 +1070,7 @@ avx512_cmul_@vsub@(@vtype@ x1, @vtype@ x2)
     return _mm512_mask_blend_@vsub@(@cmpx_img_mask@, outreal, outimg);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_AVX512F @vtype@
 avx512_csquare_@vsub@(@vtype@ x)
 {
     return avx512_cmul_@vsub@(x, x);
@@ -1123,25 +1093,25 @@ avx512_csquare_@vsub@(@vtype@ x)
 
 #if defined @CHK@
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_@ISA@ @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_@ISA@ @vtype@
 @isa@_sqrt_ps(@vtype@ x)
 {
     return _mm@vsize@_sqrt_ps(x);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_@ISA@ @vtype@d
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_@ISA@ @vtype@d
 @isa@_sqrt_pd(@vtype@d x)
 {
     return _mm@vsize@_sqrt_pd(x);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_@ISA@ @vtype@
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_@ISA@ @vtype@
 @isa@_square_ps(@vtype@ x)
 {
     return _mm@vsize@_mul_ps(x,x);
 }
 
-static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_@ISA@ @vtype@d
+NPY_FINLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_@ISA@ @vtype@d
 @isa@_square_pd(@vtype@d x)
 {
     return _mm@vsize@_mul_pd(x,x);
@@ -1169,6 +1139,7 @@ static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_@ISA@ @vtype@d
  * #is_finite = 0, 1, 0, 0#
  * #is_signbit = 0, 0, 0, 1#
  */
+
 #if defined HAVE_ATTRIBUTE_TARGET_AVX512_SKX_WITH_INTRINSICS && defined NPY_HAVE_SSE2_INTRINSICS
 static NPY_INLINE NPY_GCC_TARGET_AVX512_SKX void
 AVX512_SKX_@func@_@TYPE@(npy_bool* op, @type@* ip, const npy_intp array_size, const npy_intp steps)
@@ -1344,8 +1315,8 @@ AVX512F_@func@_@TYPE@(char **args, npy_intp const *dimensions, npy_intp const *s
  */
 
 /**begin repeat1
- *  #func = rint, ceil, floor, trunc#
- *  #vectorf = rint, ceil, floor, trunc#
+ *  #func = rint, floor, trunc#
+ *  #vectorf = rint, floor, trunc#
  */
 
 #if defined @CHK@
@@ -1415,8 +1386,8 @@ static NPY_INLINE NPY_GCC_OPT_3 NPY_GCC_TARGET_@ISA@ void
  */
 
 /**begin repeat1
- *  #func = rint, ceil, floor, trunc#
- *  #vectorf =  rint, ceil, floor, trunc#
+ *  #func = rint, floor, trunc#
+ *  #vectorf =  rint, floor, trunc#
  */
 
 #if defined @CHK@
@@ -1632,7 +1603,7 @@ AVX512F_absolute_@TYPE@(@type@ * op,
  * you never know
  */
 #if !@and@
-static NPY_INLINE @vtype@ byte_to_true(@vtype@ v)
+NPY_FINLINE @vtype@ byte_to_true(@vtype@ v)
 {
     const @vtype@ zero = @vpre@_setzero_@vsuf@();
     const @vtype@ truemask = @vpre@_set1_epi8(1 == 1);
diff --git a/numpy/core/src/umath/svml/LICENSE b/numpy/core/src/umath/svml/LICENSE
new file mode 100644 (file)
index 0000000..4723d4e
--- /dev/null
@@ -0,0 +1,30 @@
+Copyright (c) 2005-2021, NumPy Developers.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+       notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+       copyright notice, this list of conditions and the following
+       disclaimer in the documentation and/or other materials provided
+       with the distribution.
+
+    * Neither the name of the NumPy Developers nor the names of any
+       contributors may be used to endorse or promote products derived
+       from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/numpy/core/src/umath/svml/README.md b/numpy/core/src/umath/svml/README.md
new file mode 100644 (file)
index 0000000..65ab981
--- /dev/null
@@ -0,0 +1,4 @@
+Short Vector Math Library (SVML)
+
+Provides vectorized implementations of commonly used math functions (currently
+supports only x86_64 AVX-512).
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_acos_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_acos_d_la.s
new file mode 100644 (file)
index 0000000..993c91f
--- /dev/null
@@ -0,0 +1,2644 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+
+       .text
+.L_2__routine_start___svml_acos8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_acos8
+
+__svml_acos8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   __svml_dacos_data_internal(%rip), %zmm7
+        vmovups   64+__svml_dacos_data_internal(%rip), %zmm8
+
+/* S ~ 2*sqrt(Y) */
+        vmovups   128+__svml_dacos_data_internal(%rip), %zmm11
+        vmovups   384+__svml_dacos_data_internal(%rip), %zmm14
+        vmovups   448+__svml_dacos_data_internal(%rip), %zmm15
+        vmovups   512+__svml_dacos_data_internal(%rip), %zmm2
+        vmovups   576+__svml_dacos_data_internal(%rip), %zmm1
+        vmovups   256+__svml_dacos_data_internal(%rip), %zmm10
+        vmovaps   %zmm0, %zmm6
+
+/* x = -|arg| */
+        vorpd     %zmm6, %zmm7, %zmm5
+        vandpd    %zmm6, %zmm7, %zmm4
+
+/* Y = 0.5 + 0.5*(-x) */
+        vfmadd231pd {rn-sae}, %zmm5, %zmm8, %zmm8
+
+/* x^2 */
+        vmulpd    {rn-sae}, %zmm5, %zmm5, %zmm9
+        vrsqrt14pd %zmm8, %zmm12
+        vcmppd    $17, {sae}, %zmm11, %zmm8, %k2
+        vcmppd    $17, {sae}, %zmm10, %zmm5, %k0
+        vmovups   960+__svml_dacos_data_internal(%rip), %zmm10
+        vmovups   1088+__svml_dacos_data_internal(%rip), %zmm11
+        vminpd    {sae}, %zmm8, %zmm9, %zmm3
+        vmovups   832+__svml_dacos_data_internal(%rip), %zmm9
+        vxorpd    %zmm12, %zmm12, %zmm12{%k2}
+        vaddpd    {rn-sae}, %zmm8, %zmm8, %zmm0
+        vcmppd    $21, {sae}, %zmm8, %zmm3, %k1
+
+/* X<X^2 iff X<0 */
+        vcmppd    $17, {sae}, %zmm3, %zmm6, %k3
+        vmulpd    {rn-sae}, %zmm12, %zmm12, %zmm13
+        vmulpd    {rn-sae}, %zmm12, %zmm0, %zmm7
+        vmovups   896+__svml_dacos_data_internal(%rip), %zmm12
+
+/* polynomial */
+        vmovups   704+__svml_dacos_data_internal(%rip), %zmm8
+        vfmsub213pd {rn-sae}, %zmm14, %zmm13, %zmm0
+        vmovups   640+__svml_dacos_data_internal(%rip), %zmm13
+        vfmadd231pd {rn-sae}, %zmm3, %zmm9, %zmm12
+        vmovups   1344+__svml_dacos_data_internal(%rip), %zmm9
+        vfmadd231pd {rn-sae}, %zmm0, %zmm15, %zmm2
+        vmovups   1216+__svml_dacos_data_internal(%rip), %zmm15
+        vmulpd    {rn-sae}, %zmm0, %zmm7, %zmm14
+        vfmadd213pd {rn-sae}, %zmm1, %zmm0, %zmm2
+        vmovups   768+__svml_dacos_data_internal(%rip), %zmm1
+        kmovw     %k1, %eax
+        kmovw     %k3, %ecx
+        kmovw     %k0, %edx
+        vfmadd213pd {rn-sae}, %zmm13, %zmm0, %zmm2
+        vfmadd231pd {rn-sae}, %zmm3, %zmm8, %zmm1
+        vmovups   1280+__svml_dacos_data_internal(%rip), %zmm8
+        vmulpd    {rn-sae}, %zmm3, %zmm3, %zmm0
+        vfnmadd213pd {rn-sae}, %zmm7, %zmm14, %zmm2
+        vmovups   1024+__svml_dacos_data_internal(%rip), %zmm7
+        vfmadd231pd {rn-sae}, %zmm3, %zmm15, %zmm8
+        vfmadd213pd {rn-sae}, %zmm12, %zmm0, %zmm1
+        vblendmpd %zmm2, %zmm5, %zmm2{%k1}
+        vfmadd231pd {rn-sae}, %zmm3, %zmm10, %zmm7
+        vmovups   1152+__svml_dacos_data_internal(%rip), %zmm10
+        vfmadd231pd {rn-sae}, %zmm3, %zmm11, %zmm10
+        andl      %eax, %ecx
+        vmovups   1408+__svml_dacos_data_internal(%rip), %zmm11
+        kmovw     %ecx, %k2
+        vfmadd213pd {rn-sae}, %zmm10, %zmm0, %zmm7
+        vfmadd231pd {rn-sae}, %zmm3, %zmm9, %zmm11
+        vmulpd    {rn-sae}, %zmm0, %zmm0, %zmm10
+        vfmadd213pd {rn-sae}, %zmm7, %zmm10, %zmm1
+        vfmadd213pd {rn-sae}, %zmm8, %zmm0, %zmm1
+        vfmadd213pd {rn-sae}, %zmm11, %zmm0, %zmm1
+        vmovups   1664+__svml_dacos_data_internal(%rip), %zmm0
+        vmulpd    {rn-sae}, %zmm3, %zmm1, %zmm1
+        vxorpd    %zmm4, %zmm2, %zmm3
+        vxorpd    %zmm0, %zmm0, %zmm0{%k1}
+        vfmadd213pd {rn-sae}, %zmm3, %zmm3, %zmm1
+        vorpd     1536+__svml_dacos_data_internal(%rip), %zmm0, %zmm0{%k2}
+        vaddpd    {rn-sae}, %zmm1, %zmm0, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm6, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dacos_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_acos8,@function
+       .size   __svml_acos8,.-__svml_acos8
+..LN__svml_acos8.0:
+
+.L_2__routine_start___svml_dacos_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dacos_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    6(%rdi), %edx
+        andl      $32752, %edx
+        movb      7(%rdi), %cl
+        movsd     (%rdi), %xmm1
+        cmpl      $32752, %edx
+        je        .LBL_2_20
+
+
+        movsd     %xmm1, -32(%rsp)
+        andb      $127, %cl
+        movb      %cl, -25(%rsp)
+        movsd     -32(%rsp), %xmm12
+        movsd     4168+_vmldACosHATab(%rip), %xmm0
+        comisd    %xmm12, %xmm0
+        jbe       .LBL_2_14
+
+
+        movsd     4176+_vmldACosHATab(%rip), %xmm1
+        comisd    %xmm12, %xmm1
+        jbe       .LBL_2_10
+
+
+        comisd    4128+_vmldACosHATab(%rip), %xmm12
+        jbe       .LBL_2_9
+
+
+        movsd     4104+_vmldACosHATab(%rip), %xmm6
+        movaps    %xmm12, %xmm8
+        mulsd     %xmm12, %xmm6
+        movaps    %xmm12, %xmm7
+        movsd     %xmm6, -40(%rsp)
+        movsd     -40(%rsp), %xmm13
+        movsd     4104+_vmldACosHATab(%rip), %xmm5
+        subsd     -32(%rsp), %xmm13
+        movsd     %xmm13, -48(%rsp)
+        movsd     -40(%rsp), %xmm15
+        movsd     -48(%rsp), %xmm14
+        subsd     %xmm14, %xmm15
+        movaps    %xmm12, %xmm14
+        movsd     %xmm15, -40(%rsp)
+        movsd     -40(%rsp), %xmm6
+        subsd     %xmm6, %xmm8
+        movsd     %xmm8, -48(%rsp)
+        movsd     -40(%rsp), %xmm9
+        movaps    %xmm9, %xmm4
+        addsd     %xmm9, %xmm7
+        mulsd     %xmm9, %xmm4
+        movsd     -48(%rsp), %xmm10
+        movaps    %xmm4, %xmm11
+        mulsd     %xmm10, %xmm7
+        mulsd     %xmm4, %xmm5
+        addsd     %xmm7, %xmm11
+        movsd     4312+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm11, %xmm8
+        movsd     %xmm5, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     4104+_vmldACosHATab(%rip), %xmm5
+        subsd     %xmm4, %xmm1
+        addsd     4304+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm11, %xmm8
+        movsd     %xmm1, -48(%rsp)
+        movsd     -40(%rsp), %xmm0
+        movsd     -48(%rsp), %xmm2
+        addsd     4296+_vmldACosHATab(%rip), %xmm8
+        subsd     %xmm2, %xmm0
+        mulsd     %xmm11, %xmm8
+        movsd     %xmm0, -40(%rsp)
+        movsd     -40(%rsp), %xmm3
+        addsd     4288+_vmldACosHATab(%rip), %xmm8
+        subsd     %xmm3, %xmm4
+        mulsd     %xmm11, %xmm8
+        movsd     %xmm4, -48(%rsp)
+        movsd     -40(%rsp), %xmm6
+        mulsd     %xmm6, %xmm9
+        addsd     4280+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm6, %xmm10
+        mulsd     %xmm11, %xmm8
+        mulsd     %xmm9, %xmm5
+        addsd     4272+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm11, %xmm8
+        movaps    %xmm9, %xmm0
+        movsd     -48(%rsp), %xmm13
+        movaps    %xmm6, %xmm4
+        movsd     %xmm5, -40(%rsp)
+        addsd     %xmm13, %xmm7
+        addsd     4264+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm7, %xmm14
+        mulsd     %xmm11, %xmm8
+        addsd     %xmm14, %xmm10
+        addsd     4256+_vmldACosHATab(%rip), %xmm8
+        movsd     -40(%rsp), %xmm1
+        mulsd     %xmm11, %xmm8
+        subsd     %xmm9, %xmm1
+        addsd     %xmm10, %xmm9
+        addsd     4248+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm9, %xmm7
+        mulsd     %xmm11, %xmm8
+        movsd     %xmm1, -48(%rsp)
+        movsd     -40(%rsp), %xmm2
+        movsd     -48(%rsp), %xmm15
+        subsd     %xmm15, %xmm2
+        addsd     4240+_vmldACosHATab(%rip), %xmm8
+        movsd     %xmm2, -40(%rsp)
+        movsd     -40(%rsp), %xmm5
+        mulsd     %xmm11, %xmm8
+        subsd     %xmm5, %xmm0
+        movsd     %xmm0, -48(%rsp)
+        movsd     -40(%rsp), %xmm3
+        movsd     -48(%rsp), %xmm5
+        movaps    %xmm5, %xmm13
+        addsd     4232+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm3, %xmm4
+        addsd     %xmm10, %xmm13
+        mulsd     %xmm11, %xmm8
+        mulsd     %xmm13, %xmm6
+        addsd     4224+_vmldACosHATab(%rip), %xmm8
+        addsd     %xmm7, %xmm6
+        mulsd     %xmm11, %xmm8
+        movsd     4104+_vmldACosHATab(%rip), %xmm7
+        movaps    %xmm4, %xmm13
+        mulsd     %xmm4, %xmm7
+        addsd     4216+_vmldACosHATab(%rip), %xmm8
+        movsd     %xmm7, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     4200+_vmldACosHATab(%rip), %xmm11
+        subsd     %xmm4, %xmm1
+        mulsd     %xmm9, %xmm11
+        addsd     %xmm6, %xmm4
+        movsd     %xmm1, -48(%rsp)
+        movaps    %xmm12, %xmm9
+        movsd     -40(%rsp), %xmm0
+        movsd     -48(%rsp), %xmm2
+        movsd     4192+_vmldACosHATab(%rip), %xmm1
+        subsd     %xmm2, %xmm0
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm1, %xmm10
+        mulsd     %xmm4, %xmm8
+        addsd     %xmm3, %xmm9
+        mulsd     %xmm1, %xmm5
+        addsd     %xmm10, %xmm11
+        movsd     %xmm0, -40(%rsp)
+        addsd     %xmm11, %xmm8
+        movsd     -40(%rsp), %xmm7
+        addsd     %xmm5, %xmm8
+        subsd     %xmm7, %xmm13
+        movsd     %xmm13, -48(%rsp)
+        movsd     -40(%rsp), %xmm0
+        movsd     -48(%rsp), %xmm2
+        movsd     %xmm9, -40(%rsp)
+        addsd     %xmm2, %xmm6
+        movsd     -40(%rsp), %xmm10
+        movsd     %xmm3, -56(%rsp)
+        subsd     %xmm10, %xmm12
+        movsd     4208+_vmldACosHATab(%rip), %xmm4
+        addsd     %xmm12, %xmm3
+        mulsd     %xmm4, %xmm0
+        mulsd     %xmm4, %xmm6
+        movsd     %xmm3, -48(%rsp)
+        movsd     -40(%rsp), %xmm3
+        movaps    %xmm3, %xmm12
+        movsd     -48(%rsp), %xmm7
+        addsd     %xmm0, %xmm12
+        addsd     %xmm7, %xmm8
+        movsd     %xmm12, -40(%rsp)
+        movsd     -40(%rsp), %xmm12
+        subsd     %xmm12, %xmm3
+        addsd     %xmm3, %xmm0
+        movsd     %xmm0, -48(%rsp)
+        movsd     -40(%rsp), %xmm3
+        movsd     -48(%rsp), %xmm0
+        movsd     (%rdi), %xmm1
+        addsd     %xmm8, %xmm0
+        comisd    4184+_vmldACosHATab(%rip), %xmm1
+        addsd     %xmm0, %xmm6
+        jbe       .LBL_2_7
+
+
+        movsd     4136+_vmldACosHATab(%rip), %xmm2
+        movaps    %xmm2, %xmm0
+        subsd     %xmm3, %xmm0
+        movsd     %xmm0, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     4144+_vmldACosHATab(%rip), %xmm0
+        subsd     %xmm1, %xmm2
+        subsd     %xmm6, %xmm0
+        subsd     %xmm3, %xmm2
+        movsd     %xmm2, -48(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     -48(%rsp), %xmm3
+        addsd     %xmm3, %xmm0
+        jmp       .LBL_2_8
+
+.LBL_2_7:
+
+        movsd     4136+_vmldACosHATab(%rip), %xmm2
+        movaps    %xmm3, %xmm0
+        addsd     %xmm2, %xmm0
+        movsd     %xmm0, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        subsd     %xmm1, %xmm2
+        addsd     %xmm2, %xmm3
+        movsd     %xmm3, -48(%rsp)
+        movsd     4144+_vmldACosHATab(%rip), %xmm3
+        movsd     -40(%rsp), %xmm1
+        addsd     %xmm3, %xmm6
+        movsd     -48(%rsp), %xmm0
+        addsd     %xmm6, %xmm0
+
+.LBL_2_8:
+
+        addsd     %xmm0, %xmm1
+        movsd     %xmm1, (%rsi)
+        ret
+
+.LBL_2_9:
+
+        movsd     4144+_vmldACosHATab(%rip), %xmm1
+        addsd     %xmm0, %xmm12
+        movsd     %xmm12, -40(%rsp)
+        movsd     -40(%rsp), %xmm0
+        mulsd     -32(%rsp), %xmm0
+        movsd     %xmm0, -56(%rsp)
+        movb      -49(%rsp), %dl
+        movb      7(%rdi), %dil
+        andb      $127, %dl
+        andb      $-128, %dil
+        orb       %dil, %dl
+        movb      %dl, -49(%rsp)
+        subsd     -56(%rsp), %xmm1
+        addsd     4136+_vmldACosHATab(%rip), %xmm1
+        movsd     %xmm1, (%rsi)
+        ret
+
+.LBL_2_10:
+
+        movaps    %xmm0, %xmm8
+        movzwl    4174+_vmldACosHATab(%rip), %r9d
+        pxor      %xmm13, %xmm13
+        andl      $-32753, %r9d
+        subsd     %xmm12, %xmm8
+        subsd     %xmm0, %xmm13
+        mulsd     %xmm8, %xmm1
+        movsd     %xmm1, -56(%rsp)
+        movzwl    -50(%rsp), %ecx
+        andl      $32752, %ecx
+        shrl      $4, %ecx
+        addl      $-1023, %ecx
+        movl      %ecx, %r8d
+        movl      %ecx, %edx
+        negl      %r8d
+        addl      $1023, %r8d
+        andl      $2047, %r8d
+        shll      $4, %r8d
+        movsd     %xmm0, -32(%rsp)
+        orl       %r8d, %r9d
+        movw      %r9w, -26(%rsp)
+        andl      $1, %edx
+        movsd     -32(%rsp), %xmm4
+        lea       _vmldACosHATab(%rip), %r8
+        mulsd     %xmm4, %xmm1
+        movl      %edx, %r10d
+        movaps    %xmm1, %xmm15
+        movsd     4112+_vmldACosHATab(%rip), %xmm6
+        addsd     %xmm1, %xmm15
+        jne       ..L54
+        movaps    %xmm1, %xmm15
+..L54:
+        mulsd     %xmm15, %xmm6
+        movaps    %xmm15, %xmm7
+        movaps    %xmm6, %xmm9
+        subl      %edx, %ecx
+        movsd     4120+_vmldACosHATab(%rip), %xmm11
+        subsd     %xmm15, %xmm9
+        addsd     %xmm1, %xmm11
+        movsd     %xmm9, -48(%rsp)
+        movsd     -48(%rsp), %xmm10
+        movsd     %xmm11, -24(%rsp)
+        subsd     %xmm10, %xmm6
+        movl      -24(%rsp), %r11d
+        movaps    %xmm6, %xmm14
+        shll      $8, %r10d
+        andl      $511, %r11d
+        addl      %r10d, %r11d
+        subsd     %xmm6, %xmm7
+        movsd     (%r8,%r11,8), %xmm5
+        addsd     %xmm7, %xmm14
+        mulsd     %xmm5, %xmm6
+        movaps    %xmm5, %xmm12
+        mulsd     %xmm5, %xmm12
+        mulsd     %xmm12, %xmm14
+        movsd     4512+_vmldACosHATab(%rip), %xmm4
+        addsd     %xmm13, %xmm14
+        mulsd     %xmm14, %xmm4
+        shrl      $1, %ecx
+        addsd     4504+_vmldACosHATab(%rip), %xmm4
+        mulsd     %xmm14, %xmm4
+        addl      $1023, %ecx
+        andl      $2047, %ecx
+        addsd     4496+_vmldACosHATab(%rip), %xmm4
+        mulsd     %xmm14, %xmm4
+        movzwl    4174+_vmldACosHATab(%rip), %r9d
+        shll      $4, %ecx
+        andl      $-32753, %r9d
+        movsd     %xmm0, -16(%rsp)
+        orl       %ecx, %r9d
+        movw      %r9w, -10(%rsp)
+        movsd     -16(%rsp), %xmm9
+        mulsd     %xmm9, %xmm6
+        addsd     4488+_vmldACosHATab(%rip), %xmm4
+        mulsd     %xmm14, %xmm4
+        movsd     4104+_vmldACosHATab(%rip), %xmm3
+        mulsd     %xmm6, %xmm3
+        addsd     4480+_vmldACosHATab(%rip), %xmm4
+        mulsd     %xmm14, %xmm4
+        movsd     %xmm3, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     4352+_vmldACosHATab(%rip), %xmm11
+        subsd     %xmm6, %xmm1
+        addsd     4472+_vmldACosHATab(%rip), %xmm4
+        addsd     4360+_vmldACosHATab(%rip), %xmm11
+        mulsd     %xmm14, %xmm4
+        mulsd     %xmm8, %xmm11
+        addsd     4464+_vmldACosHATab(%rip), %xmm4
+        mulsd     %xmm14, %xmm4
+        mulsd     %xmm15, %xmm4
+        movsd     %xmm1, -48(%rsp)
+        addsd     %xmm4, %xmm7
+        mulsd     %xmm5, %xmm7
+        movsd     4456+_vmldACosHATab(%rip), %xmm5
+        mulsd     %xmm8, %xmm5
+        mulsd     %xmm9, %xmm7
+        addsd     4448+_vmldACosHATab(%rip), %xmm5
+        mulsd     %xmm8, %xmm5
+        movsd     -40(%rsp), %xmm2
+        movsd     -48(%rsp), %xmm0
+        movsd     4104+_vmldACosHATab(%rip), %xmm4
+        subsd     %xmm0, %xmm2
+        mulsd     %xmm8, %xmm4
+        addsd     4440+_vmldACosHATab(%rip), %xmm5
+        mulsd     %xmm8, %xmm5
+        movaps    %xmm8, %xmm0
+        movsd     %xmm2, -40(%rsp)
+        movsd     -40(%rsp), %xmm14
+        movsd     4104+_vmldACosHATab(%rip), %xmm2
+        subsd     %xmm14, %xmm6
+        addsd     4432+_vmldACosHATab(%rip), %xmm5
+        mulsd     %xmm8, %xmm5
+        movsd     %xmm6, -48(%rsp)
+        movsd     -40(%rsp), %xmm6
+        movsd     -48(%rsp), %xmm10
+        movsd     %xmm4, -40(%rsp)
+        addsd     %xmm10, %xmm7
+        addsd     4424+_vmldACosHATab(%rip), %xmm5
+        mulsd     %xmm8, %xmm5
+        movsd     -40(%rsp), %xmm3
+        movsd     4336+_vmldACosHATab(%rip), %xmm12
+        subsd     %xmm8, %xmm3
+        addsd     4416+_vmldACosHATab(%rip), %xmm5
+        addsd     4344+_vmldACosHATab(%rip), %xmm12
+        mulsd     %xmm8, %xmm5
+        addsd     %xmm11, %xmm12
+        addsd     4408+_vmldACosHATab(%rip), %xmm5
+        mulsd     %xmm8, %xmm12
+        mulsd     %xmm8, %xmm5
+        movsd     %xmm3, -48(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     -48(%rsp), %xmm15
+        movsd     4320+_vmldACosHATab(%rip), %xmm13
+        subsd     %xmm15, %xmm1
+        addsd     4400+_vmldACosHATab(%rip), %xmm5
+        addsd     4328+_vmldACosHATab(%rip), %xmm13
+        mulsd     %xmm8, %xmm5
+        addsd     %xmm12, %xmm13
+        addsd     4392+_vmldACosHATab(%rip), %xmm5
+        movsd     %xmm1, -40(%rsp)
+        mulsd     %xmm8, %xmm5
+        movsd     -40(%rsp), %xmm4
+        subsd     %xmm4, %xmm0
+        addsd     4384+_vmldACosHATab(%rip), %xmm5
+        movsd     %xmm0, -48(%rsp)
+        movsd     -40(%rsp), %xmm4
+        movaps    %xmm4, %xmm14
+        mulsd     %xmm4, %xmm14
+        mulsd     %xmm8, %xmm5
+        mulsd     %xmm14, %xmm2
+        addsd     4376+_vmldACosHATab(%rip), %xmm5
+        movsd     -48(%rsp), %xmm3
+        movsd     %xmm2, -40(%rsp)
+        movsd     -40(%rsp), %xmm9
+        mulsd     %xmm8, %xmm5
+        subsd     %xmm14, %xmm9
+        movsd     %xmm9, -48(%rsp)
+        movsd     -40(%rsp), %xmm11
+        movsd     -48(%rsp), %xmm10
+        movsd     4336+_vmldACosHATab(%rip), %xmm0
+        subsd     %xmm10, %xmm11
+        mulsd     %xmm4, %xmm0
+        addsd     4368+_vmldACosHATab(%rip), %xmm5
+        addsd     %xmm8, %xmm4
+        mulsd     %xmm8, %xmm5
+        mulsd     %xmm3, %xmm4
+        mulsd     %xmm8, %xmm5
+        movsd     %xmm11, -40(%rsp)
+        movaps    %xmm0, %xmm1
+        movsd     -40(%rsp), %xmm12
+        mulsd     %xmm8, %xmm5
+        subsd     %xmm12, %xmm14
+        movsd     %xmm14, -48(%rsp)
+        addsd     %xmm5, %xmm13
+        movsd     -40(%rsp), %xmm9
+        mulsd     4352+_vmldACosHATab(%rip), %xmm9
+        mulsd     %xmm13, %xmm7
+        addsd     %xmm9, %xmm1
+        movsd     -48(%rsp), %xmm2
+        movsd     %xmm1, -40(%rsp)
+        addsd     %xmm2, %xmm4
+        movsd     -40(%rsp), %xmm13
+        movsd     %xmm9, -24(%rsp)
+        subsd     %xmm13, %xmm0
+        mulsd     4352+_vmldACosHATab(%rip), %xmm4
+        addsd     %xmm0, %xmm9
+        movsd     %xmm9, -48(%rsp)
+        movsd     -40(%rsp), %xmm12
+        movsd     4320+_vmldACosHATab(%rip), %xmm10
+        movsd     -48(%rsp), %xmm1
+        addsd     %xmm12, %xmm10
+        movsd     %xmm10, -40(%rsp)
+        movsd     -40(%rsp), %xmm15
+        movsd     4320+_vmldACosHATab(%rip), %xmm11
+        movsd     4104+_vmldACosHATab(%rip), %xmm9
+        subsd     %xmm15, %xmm11
+        movsd     4336+_vmldACosHATab(%rip), %xmm2
+        addsd     %xmm11, %xmm12
+        mulsd     %xmm3, %xmm2
+        movsd     %xmm12, -48(%rsp)
+        movsd     -40(%rsp), %xmm15
+        mulsd     %xmm15, %xmm9
+        movsd     -48(%rsp), %xmm0
+        movsd     %xmm9, -40(%rsp)
+        movsd     -40(%rsp), %xmm10
+        movsd     4360+_vmldACosHATab(%rip), %xmm3
+        subsd     %xmm15, %xmm10
+        mulsd     %xmm8, %xmm3
+        movsd     %xmm10, -48(%rsp)
+        movsd     -40(%rsp), %xmm11
+        movsd     -48(%rsp), %xmm13
+        subsd     %xmm13, %xmm11
+        addsd     4344+_vmldACosHATab(%rip), %xmm3
+        movsd     %xmm11, -40(%rsp)
+        movsd     -40(%rsp), %xmm14
+        mulsd     %xmm8, %xmm3
+        subsd     %xmm14, %xmm15
+        movsd     %xmm15, -48(%rsp)
+        movsd     -40(%rsp), %xmm10
+        movsd     -48(%rsp), %xmm9
+        addsd     %xmm9, %xmm4
+        addsd     4328+_vmldACosHATab(%rip), %xmm3
+        addsd     %xmm2, %xmm4
+        addsd     %xmm5, %xmm3
+        addsd     %xmm1, %xmm4
+        addsd     %xmm0, %xmm4
+        addsd     %xmm3, %xmm4
+        mulsd     %xmm6, %xmm4
+        mulsd     %xmm10, %xmm6
+        addsd     %xmm7, %xmm4
+        movsd     (%rdi), %xmm7
+        comisd    4184+_vmldACosHATab(%rip), %xmm7
+        ja        .LBL_2_13
+
+
+        movsd     4152+_vmldACosHATab(%rip), %xmm2
+        movaps    %xmm2, %xmm0
+        movsd     4160+_vmldACosHATab(%rip), %xmm5
+        subsd     %xmm6, %xmm0
+        subsd     %xmm4, %xmm5
+        movsd     %xmm0, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     %xmm6, -56(%rsp)
+        subsd     %xmm1, %xmm2
+        subsd     %xmm6, %xmm2
+        movsd     %xmm2, -48(%rsp)
+        movsd     -40(%rsp), %xmm6
+        movsd     -48(%rsp), %xmm3
+        movaps    %xmm3, %xmm4
+        addsd     %xmm5, %xmm4
+
+.LBL_2_13:
+
+        addsd     %xmm4, %xmm6
+        movsd     %xmm6, (%rsi)
+        ret
+
+.LBL_2_14:
+
+        ucomisd   %xmm0, %xmm1
+        jp        .LBL_2_15
+        je        .LBL_2_19
+
+.LBL_2_15:
+
+        xorps     .L_2il0floatpacket.197(%rip), %xmm0
+        ucomisd   %xmm0, %xmm1
+        jp        .LBL_2_16
+        je        .LBL_2_18
+
+.LBL_2_16:
+
+        movl      $1, %eax
+        pxor      %xmm1, %xmm1
+        pxor      %xmm0, %xmm0
+        divsd     %xmm0, %xmm1
+        movsd     %xmm1, (%rsi)
+
+.LBL_2_17:
+
+        ret
+
+.LBL_2_18:
+
+        movsd     4152+_vmldACosHATab(%rip), %xmm0
+        addsd     4160+_vmldACosHATab(%rip), %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_19:
+
+        movq      4184+_vmldACosHATab(%rip), %rdx
+        movq      %rdx, (%rsi)
+        ret
+
+.LBL_2_20:
+
+        divsd     %xmm1, %xmm1
+        movsd     %xmm1, (%rsi)
+        testl     $1048575, 4(%rdi)
+        jne       .LBL_2_17
+
+
+        cmpl      $0, (%rdi)
+        sete      %al
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dacos_cout_rare_internal,@function
+       .size   __svml_dacos_cout_rare_internal,.-__svml_dacos_cout_rare_internal
+..LN__svml_dacos_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dacos_data_internal:
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   856972295
+       .long   1017226790
+       .long   856972295
+       .long   1017226790
+       .long   856972295
+       .long   1017226790
+       .long   856972295
+       .long   1017226790
+       .long   856972295
+       .long   1017226790
+       .long   856972295
+       .long   1017226790
+       .long   856972295
+       .long   1017226790
+       .long   856972295
+       .long   1017226790
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   4293918720
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   3220176896
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2147483648
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .type   __svml_dacos_data_internal,@object
+       .size   __svml_dacos_data_internal,2496
+       .align 32
+_vmldACosHATab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072689152
+       .long   0
+       .long   1072685056
+       .long   0
+       .long   1072680960
+       .long   0
+       .long   1072676864
+       .long   0
+       .long   1072672768
+       .long   0
+       .long   1072668672
+       .long   0
+       .long   1072665600
+       .long   0
+       .long   1072661504
+       .long   0
+       .long   1072657408
+       .long   0
+       .long   1072653312
+       .long   0
+       .long   1072649216
+       .long   0
+       .long   1072646144
+       .long   0
+       .long   1072642048
+       .long   0
+       .long   1072637952
+       .long   0
+       .long   1072634880
+       .long   0
+       .long   1072630784
+       .long   0
+       .long   1072626688
+       .long   0
+       .long   1072623616
+       .long   0
+       .long   1072619520
+       .long   0
+       .long   1072615424
+       .long   0
+       .long   1072612352
+       .long   0
+       .long   1072608256
+       .long   0
+       .long   1072605184
+       .long   0
+       .long   1072601088
+       .long   0
+       .long   1072598016
+       .long   0
+       .long   1072593920
+       .long   0
+       .long   1072590848
+       .long   0
+       .long   1072586752
+       .long   0
+       .long   1072583680
+       .long   0
+       .long   1072580608
+       .long   0
+       .long   1072576512
+       .long   0
+       .long   1072573440
+       .long   0
+       .long   1072570368
+       .long   0
+       .long   1072566272
+       .long   0
+       .long   1072563200
+       .long   0
+       .long   1072560128
+       .long   0
+       .long   1072556032
+       .long   0
+       .long   1072552960
+       .long   0
+       .long   1072549888
+       .long   0
+       .long   1072546816
+       .long   0
+       .long   1072542720
+       .long   0
+       .long   1072539648
+       .long   0
+       .long   1072536576
+       .long   0
+       .long   1072533504
+       .long   0
+       .long   1072530432
+       .long   0
+       .long   1072527360
+       .long   0
+       .long   1072523264
+       .long   0
+       .long   1072520192
+       .long   0
+       .long   1072517120
+       .long   0
+       .long   1072514048
+       .long   0
+       .long   1072510976
+       .long   0
+       .long   1072507904
+       .long   0
+       .long   1072504832
+       .long   0
+       .long   1072501760
+       .long   0
+       .long   1072498688
+       .long   0
+       .long   1072495616
+       .long   0
+       .long   1072492544
+       .long   0
+       .long   1072489472
+       .long   0
+       .long   1072486400
+       .long   0
+       .long   1072483328
+       .long   0
+       .long   1072480256
+       .long   0
+       .long   1072478208
+       .long   0
+       .long   1072475136
+       .long   0
+       .long   1072472064
+       .long   0
+       .long   1072468992
+       .long   0
+       .long   1072465920
+       .long   0
+       .long   1072462848
+       .long   0
+       .long   1072459776
+       .long   0
+       .long   1072457728
+       .long   0
+       .long   1072454656
+       .long   0
+       .long   1072451584
+       .long   0
+       .long   1072448512
+       .long   0
+       .long   1072446464
+       .long   0
+       .long   1072443392
+       .long   0
+       .long   1072440320
+       .long   0
+       .long   1072437248
+       .long   0
+       .long   1072435200
+       .long   0
+       .long   1072432128
+       .long   0
+       .long   1072429056
+       .long   0
+       .long   1072427008
+       .long   0
+       .long   1072423936
+       .long   0
+       .long   1072420864
+       .long   0
+       .long   1072418816
+       .long   0
+       .long   1072415744
+       .long   0
+       .long   1072412672
+       .long   0
+       .long   1072410624
+       .long   0
+       .long   1072407552
+       .long   0
+       .long   1072405504
+       .long   0
+       .long   1072402432
+       .long   0
+       .long   1072400384
+       .long   0
+       .long   1072397312
+       .long   0
+       .long   1072395264
+       .long   0
+       .long   1072392192
+       .long   0
+       .long   1072390144
+       .long   0
+       .long   1072387072
+       .long   0
+       .long   1072385024
+       .long   0
+       .long   1072381952
+       .long   0
+       .long   1072379904
+       .long   0
+       .long   1072376832
+       .long   0
+       .long   1072374784
+       .long   0
+       .long   1072371712
+       .long   0
+       .long   1072369664
+       .long   0
+       .long   1072366592
+       .long   0
+       .long   1072364544
+       .long   0
+       .long   1072362496
+       .long   0
+       .long   1072359424
+       .long   0
+       .long   1072357376
+       .long   0
+       .long   1072355328
+       .long   0
+       .long   1072352256
+       .long   0
+       .long   1072350208
+       .long   0
+       .long   1072347136
+       .long   0
+       .long   1072345088
+       .long   0
+       .long   1072343040
+       .long   0
+       .long   1072340992
+       .long   0
+       .long   1072337920
+       .long   0
+       .long   1072335872
+       .long   0
+       .long   1072333824
+       .long   0
+       .long   1072330752
+       .long   0
+       .long   1072328704
+       .long   0
+       .long   1072326656
+       .long   0
+       .long   1072324608
+       .long   0
+       .long   1072321536
+       .long   0
+       .long   1072319488
+       .long   0
+       .long   1072317440
+       .long   0
+       .long   1072315392
+       .long   0
+       .long   1072313344
+       .long   0
+       .long   1072310272
+       .long   0
+       .long   1072308224
+       .long   0
+       .long   1072306176
+       .long   0
+       .long   1072304128
+       .long   0
+       .long   1072302080
+       .long   0
+       .long   1072300032
+       .long   0
+       .long   1072296960
+       .long   0
+       .long   1072294912
+       .long   0
+       .long   1072292864
+       .long   0
+       .long   1072290816
+       .long   0
+       .long   1072288768
+       .long   0
+       .long   1072286720
+       .long   0
+       .long   1072284672
+       .long   0
+       .long   1072282624
+       .long   0
+       .long   1072280576
+       .long   0
+       .long   1072278528
+       .long   0
+       .long   1072275456
+       .long   0
+       .long   1072273408
+       .long   0
+       .long   1072271360
+       .long   0
+       .long   1072269312
+       .long   0
+       .long   1072267264
+       .long   0
+       .long   1072265216
+       .long   0
+       .long   1072263168
+       .long   0
+       .long   1072261120
+       .long   0
+       .long   1072259072
+       .long   0
+       .long   1072257024
+       .long   0
+       .long   1072254976
+       .long   0
+       .long   1072252928
+       .long   0
+       .long   1072250880
+       .long   0
+       .long   1072248832
+       .long   0
+       .long   1072246784
+       .long   0
+       .long   1072244736
+       .long   0
+       .long   1072243712
+       .long   0
+       .long   1072241664
+       .long   0
+       .long   1072239616
+       .long   0
+       .long   1072237568
+       .long   0
+       .long   1072235520
+       .long   0
+       .long   1072233472
+       .long   0
+       .long   1072231424
+       .long   0
+       .long   1072229376
+       .long   0
+       .long   1072227328
+       .long   0
+       .long   1072225280
+       .long   0
+       .long   1072223232
+       .long   0
+       .long   1072222208
+       .long   0
+       .long   1072220160
+       .long   0
+       .long   1072218112
+       .long   0
+       .long   1072216064
+       .long   0
+       .long   1072214016
+       .long   0
+       .long   1072211968
+       .long   0
+       .long   1072210944
+       .long   0
+       .long   1072208896
+       .long   0
+       .long   1072206848
+       .long   0
+       .long   1072204800
+       .long   0
+       .long   1072202752
+       .long   0
+       .long   1072201728
+       .long   0
+       .long   1072199680
+       .long   0
+       .long   1072197632
+       .long   0
+       .long   1072195584
+       .long   0
+       .long   1072193536
+       .long   0
+       .long   1072192512
+       .long   0
+       .long   1072190464
+       .long   0
+       .long   1072188416
+       .long   0
+       .long   1072186368
+       .long   0
+       .long   1072185344
+       .long   0
+       .long   1072183296
+       .long   0
+       .long   1072181248
+       .long   0
+       .long   1072179200
+       .long   0
+       .long   1072178176
+       .long   0
+       .long   1072176128
+       .long   0
+       .long   1072174080
+       .long   0
+       .long   1072173056
+       .long   0
+       .long   1072171008
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072167936
+       .long   0
+       .long   1072165888
+       .long   0
+       .long   1072163840
+       .long   0
+       .long   1072161792
+       .long   0
+       .long   1072160768
+       .long   0
+       .long   1072158720
+       .long   0
+       .long   1072157696
+       .long   0
+       .long   1072155648
+       .long   0
+       .long   1072153600
+       .long   0
+       .long   1072152576
+       .long   0
+       .long   1072150528
+       .long   0
+       .long   1072148480
+       .long   0
+       .long   1072147456
+       .long   0
+       .long   1072145408
+       .long   0
+       .long   1072143360
+       .long   0
+       .long   1072142336
+       .long   0
+       .long   1072140288
+       .long   0
+       .long   1072139264
+       .long   0
+       .long   1072137216
+       .long   0
+       .long   1072135168
+       .long   0
+       .long   1072134144
+       .long   0
+       .long   1072132096
+       .long   0
+       .long   1072131072
+       .long   0
+       .long   1072129024
+       .long   0
+       .long   1072128000
+       .long   0
+       .long   1072125952
+       .long   0
+       .long   1072124928
+       .long   0
+       .long   1072122880
+       .long   0
+       .long   1072120832
+       .long   0
+       .long   1072119808
+       .long   0
+       .long   1072117760
+       .long   0
+       .long   1072116736
+       .long   0
+       .long   1072114688
+       .long   0
+       .long   1072113664
+       .long   0
+       .long   1072111616
+       .long   0
+       .long   1072110592
+       .long   0
+       .long   1072108544
+       .long   0
+       .long   1072107520
+       .long   0
+       .long   1072105472
+       .long   0
+       .long   1072104448
+       .long   0
+       .long   1072102400
+       .long   0
+       .long   1072101376
+       .long   0
+       .long   1072099328
+       .long   0
+       .long   1072098304
+       .long   0
+       .long   1072096256
+       .long   0
+       .long   1072095232
+       .long   0
+       .long   1072094208
+       .long   0
+       .long   1072092160
+       .long   0
+       .long   1072091136
+       .long   0
+       .long   1072089088
+       .long   0
+       .long   1072088064
+       .long   0
+       .long   1072086016
+       .long   0
+       .long   1072084992
+       .long   0
+       .long   1072082944
+       .long   0
+       .long   1072081920
+       .long   0
+       .long   1072080896
+       .long   0
+       .long   1072078848
+       .long   0
+       .long   1072075776
+       .long   0
+       .long   1072073728
+       .long   0
+       .long   1072070656
+       .long   0
+       .long   1072067584
+       .long   0
+       .long   1072064512
+       .long   0
+       .long   1072061440
+       .long   0
+       .long   1072059392
+       .long   0
+       .long   1072056320
+       .long   0
+       .long   1072053248
+       .long   0
+       .long   1072051200
+       .long   0
+       .long   1072048128
+       .long   0
+       .long   1072045056
+       .long   0
+       .long   1072043008
+       .long   0
+       .long   1072039936
+       .long   0
+       .long   1072037888
+       .long   0
+       .long   1072034816
+       .long   0
+       .long   1072031744
+       .long   0
+       .long   1072029696
+       .long   0
+       .long   1072026624
+       .long   0
+       .long   1072024576
+       .long   0
+       .long   1072021504
+       .long   0
+       .long   1072019456
+       .long   0
+       .long   1072016384
+       .long   0
+       .long   1072014336
+       .long   0
+       .long   1072011264
+       .long   0
+       .long   1072009216
+       .long   0
+       .long   1072006144
+       .long   0
+       .long   1072004096
+       .long   0
+       .long   1072002048
+       .long   0
+       .long   1071998976
+       .long   0
+       .long   1071996928
+       .long   0
+       .long   1071993856
+       .long   0
+       .long   1071991808
+       .long   0
+       .long   1071989760
+       .long   0
+       .long   1071986688
+       .long   0
+       .long   1071984640
+       .long   0
+       .long   1071982592
+       .long   0
+       .long   1071979520
+       .long   0
+       .long   1071977472
+       .long   0
+       .long   1071975424
+       .long   0
+       .long   1071972352
+       .long   0
+       .long   1071970304
+       .long   0
+       .long   1071968256
+       .long   0
+       .long   1071966208
+       .long   0
+       .long   1071964160
+       .long   0
+       .long   1071961088
+       .long   0
+       .long   1071959040
+       .long   0
+       .long   1071956992
+       .long   0
+       .long   1071954944
+       .long   0
+       .long   1071952896
+       .long   0
+       .long   1071949824
+       .long   0
+       .long   1071947776
+       .long   0
+       .long   1071945728
+       .long   0
+       .long   1071943680
+       .long   0
+       .long   1071941632
+       .long   0
+       .long   1071939584
+       .long   0
+       .long   1071937536
+       .long   0
+       .long   1071935488
+       .long   0
+       .long   1071933440
+       .long   0
+       .long   1071930368
+       .long   0
+       .long   1071928320
+       .long   0
+       .long   1071926272
+       .long   0
+       .long   1071924224
+       .long   0
+       .long   1071922176
+       .long   0
+       .long   1071920128
+       .long   0
+       .long   1071918080
+       .long   0
+       .long   1071916032
+       .long   0
+       .long   1071913984
+       .long   0
+       .long   1071911936
+       .long   0
+       .long   1071909888
+       .long   0
+       .long   1071907840
+       .long   0
+       .long   1071905792
+       .long   0
+       .long   1071903744
+       .long   0
+       .long   1071901696
+       .long   0
+       .long   1071900672
+       .long   0
+       .long   1071898624
+       .long   0
+       .long   1071896576
+       .long   0
+       .long   1071894528
+       .long   0
+       .long   1071892480
+       .long   0
+       .long   1071890432
+       .long   0
+       .long   1071888384
+       .long   0
+       .long   1071886336
+       .long   0
+       .long   1071884288
+       .long   0
+       .long   1071883264
+       .long   0
+       .long   1071881216
+       .long   0
+       .long   1071879168
+       .long   0
+       .long   1071877120
+       .long   0
+       .long   1071875072
+       .long   0
+       .long   1071873024
+       .long   0
+       .long   1071872000
+       .long   0
+       .long   1071869952
+       .long   0
+       .long   1071867904
+       .long   0
+       .long   1071865856
+       .long   0
+       .long   1071864832
+       .long   0
+       .long   1071862784
+       .long   0
+       .long   1071860736
+       .long   0
+       .long   1071858688
+       .long   0
+       .long   1071856640
+       .long   0
+       .long   1071855616
+       .long   0
+       .long   1071853568
+       .long   0
+       .long   1071851520
+       .long   0
+       .long   1071850496
+       .long   0
+       .long   1071848448
+       .long   0
+       .long   1071846400
+       .long   0
+       .long   1071844352
+       .long   0
+       .long   1071843328
+       .long   0
+       .long   1071841280
+       .long   0
+       .long   1071839232
+       .long   0
+       .long   1071838208
+       .long   0
+       .long   1071836160
+       .long   0
+       .long   1071834112
+       .long   0
+       .long   1071833088
+       .long   0
+       .long   1071831040
+       .long   0
+       .long   1071830016
+       .long   0
+       .long   1071827968
+       .long   0
+       .long   1071825920
+       .long   0
+       .long   1071824896
+       .long   0
+       .long   1071822848
+       .long   0
+       .long   1071821824
+       .long   0
+       .long   1071819776
+       .long   0
+       .long   1071817728
+       .long   0
+       .long   1071816704
+       .long   0
+       .long   1071814656
+       .long   0
+       .long   1071813632
+       .long   0
+       .long   1071811584
+       .long   0
+       .long   1071810560
+       .long   0
+       .long   1071808512
+       .long   0
+       .long   1071806464
+       .long   0
+       .long   1071805440
+       .long   0
+       .long   1071803392
+       .long   0
+       .long   1071802368
+       .long   0
+       .long   1071800320
+       .long   0
+       .long   1071799296
+       .long   0
+       .long   1071797248
+       .long   0
+       .long   1071796224
+       .long   0
+       .long   1071794176
+       .long   0
+       .long   1071793152
+       .long   0
+       .long   1071791104
+       .long   0
+       .long   1071790080
+       .long   0
+       .long   1071788032
+       .long   0
+       .long   1071787008
+       .long   0
+       .long   1071784960
+       .long   0
+       .long   1071783936
+       .long   0
+       .long   1071782912
+       .long   0
+       .long   1071780864
+       .long   0
+       .long   1071779840
+       .long   0
+       .long   1071777792
+       .long   0
+       .long   1071776768
+       .long   0
+       .long   1071774720
+       .long   0
+       .long   1071773696
+       .long   0
+       .long   1071772672
+       .long   0
+       .long   1071770624
+       .long   0
+       .long   1071769600
+       .long   0
+       .long   1071767552
+       .long   0
+       .long   1071766528
+       .long   0
+       .long   1071765504
+       .long   0
+       .long   1071763456
+       .long   0
+       .long   1071762432
+       .long   0
+       .long   1071760384
+       .long   0
+       .long   1071759360
+       .long   0
+       .long   1071758336
+       .long   0
+       .long   1071756288
+       .long   0
+       .long   1071755264
+       .long   0
+       .long   1071754240
+       .long   0
+       .long   1071752192
+       .long   0
+       .long   1071751168
+       .long   0
+       .long   1071750144
+       .long   0
+       .long   1071748096
+       .long   0
+       .long   1071747072
+       .long   0
+       .long   1071746048
+       .long   0
+       .long   1071744000
+       .long   0
+       .long   1071742976
+       .long   0
+       .long   1071741952
+       .long   0
+       .long   1071739904
+       .long   0
+       .long   1071738880
+       .long   0
+       .long   1071737856
+       .long   0
+       .long   1071736832
+       .long   0
+       .long   1071734784
+       .long   0
+       .long   1071733760
+       .long   0
+       .long   1071732736
+       .long   0
+       .long   1071730688
+       .long   0
+       .long   1071729664
+       .long   0
+       .long   1071728640
+       .long   0
+       .long   1071727616
+       .long   0
+       .long   1071725568
+       .long   0
+       .long   1071724544
+       .long   0
+       .long   1071723520
+       .long   0
+       .long   1071722496
+       .long   0
+       .long   1071720448
+       .long   0
+       .long   1071719424
+       .long   0
+       .long   1071718400
+       .long   0
+       .long   1071717376
+       .long   0
+       .long   1071715328
+       .long   0
+       .long   1071714304
+       .long   0
+       .long   1071713280
+       .long   0
+       .long   1071712256
+       .long   0
+       .long   1071711232
+       .long   0
+       .long   1071709184
+       .long   0
+       .long   1071708160
+       .long   0
+       .long   1071707136
+       .long   0
+       .long   1071706112
+       .long   0
+       .long   1071705088
+       .long   0
+       .long   1071704064
+       .long   0
+       .long   1071702016
+       .long   0
+       .long   1071700992
+       .long   0
+       .long   1071699968
+       .long   0
+       .long   1071698944
+       .long   0
+       .long   1071697920
+       .long   0
+       .long   1071696896
+       .long   0
+       .long   1071694848
+       .long   0
+       .long   1071693824
+       .long   0
+       .long   1071692800
+       .long   0
+       .long   1071691776
+       .long   0
+       .long   1071690752
+       .long   0
+       .long   1071689728
+       .long   0
+       .long   1071688704
+       .long   0
+       .long   1071686656
+       .long   0
+       .long   1071685632
+       .long   0
+       .long   1071684608
+       .long   0
+       .long   1071683584
+       .long   0
+       .long   1071682560
+       .long   0
+       .long   1071681536
+       .long   0
+       .long   1071680512
+       .long   0
+       .long   1071679488
+       .long   0
+       .long   1071677440
+       .long   0
+       .long   1071676416
+       .long   0
+       .long   1071675392
+       .long   0
+       .long   1071674368
+       .long   0
+       .long   1071673344
+       .long   0
+       .long   1071672320
+       .long   0
+       .long   1071671296
+       .long   0
+       .long   1071670272
+       .long   0
+       .long   1071669248
+       .long   0
+       .long   1071668224
+       .long   0
+       .long   1071667200
+       .long   0
+       .long   1071666176
+       .long   0
+       .long   1071665152
+       .long   0
+       .long   1071663104
+       .long   0
+       .long   1071662080
+       .long   0
+       .long   1071661056
+       .long   0
+       .long   1071660032
+       .long   0
+       .long   1071659008
+       .long   0
+       .long   1071657984
+       .long   0
+       .long   1071656960
+       .long   0
+       .long   1071655936
+       .long   0
+       .long   1071654912
+       .long   0
+       .long   1071653888
+       .long   0
+       .long   1071652864
+       .long   0
+       .long   1071651840
+       .long   0
+       .long   1071650816
+       .long   0
+       .long   1071649792
+       .long   0
+       .long   1071648768
+       .long   0
+       .long   1071647744
+       .long   0
+       .long   1071646720
+       .long   0
+       .long   1071645696
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1101004800
+       .long   1073741824
+       .long   1095761920
+       .long   256
+       .long   1118830592
+       .long   0
+       .long   1017118720
+       .long   1413754136
+       .long   1073291771
+       .long   856972295
+       .long   1016178214
+       .long   1413754136
+       .long   1074340347
+       .long   856972295
+       .long   1017226790
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   0
+       .long   1476395008
+       .long   1069897045
+       .long   1768958041
+       .long   3189069141
+       .long   805306368
+       .long   1068708659
+       .long   3580333578
+       .long   1040816593
+       .long   3067382784
+       .long   1067899757
+       .long   3397590151
+       .long   1067392113
+       .long   2939529726
+       .long   1066854585
+       .long   1423429166
+       .long   1066517752
+       .long   1775218934
+       .long   1066178574
+       .long   1185392460
+       .long   1065859647
+       .long   289998670
+       .long   1065577550
+       .long   3179807072
+       .long   1065648121
+       .long   3781007284
+       .long   1061576176
+       .long   2482106687
+       .long   1067019199
+       .long   763519713
+       .long   3214591591
+       .long   3695107454
+       .long   1067530646
+       .long   0
+       .long   1073741824
+       .long   1124791109
+       .long   1006764147
+       .long   1476395008
+       .long   1069897045
+       .long   1953913876
+       .long   3189069141
+       .long   805306368
+       .long   1067660083
+       .long   165110192
+       .long   1039768033
+       .long   3067304082
+       .long   1065802605
+       .long   3404727379
+       .long   1064246385
+       .long   2737480376
+       .long   1062660281
+       .long   933797922
+       .long   1061274873
+       .long   1475716730
+       .long   1059887095
+       .long   1511619763
+       .long   1058519827
+       .long   556024211
+       .long   1057187555
+       .long   3482101045
+       .long   1056217350
+       .long   1174622859
+       .long   1050762633
+       .long   899668651
+       .long   1055506366
+       .long   1081094694
+       .long   3202035365
+       .long   2559814773
+       .long   1053906576
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   3218341888
+       .long   0
+       .long   1070694400
+       .long   0
+       .long   3218046976
+       .long   0
+       .long   1070391296
+       .long   0
+       .long   3217739776
+       .type   _vmldACosHATab,@object
+       .size   _vmldACosHATab,4520
+       .space 88, 0x00         
+       .align 16
+.L_2il0floatpacket.197:
+       .long   0x00000000,0x80000000,0x00000000,0x00000000
+       .type   .L_2il0floatpacket.197,@object
+       .size   .L_2il0floatpacket.197,16
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_acos_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_acos_s_la.s
new file mode 100644 (file)
index 0000000..0212411
--- /dev/null
@@ -0,0 +1,2294 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+
+       .text
+.L_2__routine_start___svml_acosf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_acosf16
+
+__svml_acosf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   __svml_sacos_data_internal(%rip), %zmm5
+        vmovups   64+__svml_sacos_data_internal(%rip), %zmm6
+
+/* SQ ~ 2*sqrt(Y) */
+        vmovups   192+__svml_sacos_data_internal(%rip), %zmm9
+        vmovups   256+__svml_sacos_data_internal(%rip), %zmm8
+        vmovups   448+__svml_sacos_data_internal(%rip), %zmm12
+        vmovups   512+__svml_sacos_data_internal(%rip), %zmm13
+        vmovaps   %zmm0, %zmm4
+
+/* x = -|arg| */
+        vorps     %zmm4, %zmm5, %zmm3
+        vandps    %zmm4, %zmm5, %zmm2
+        vmovups   576+__svml_sacos_data_internal(%rip), %zmm0
+
+/* Y = 0.5 + 0.5*(-x) */
+        vfmadd231ps {rn-sae}, %zmm3, %zmm6, %zmm6
+
+/* x^2 */
+        vmulps    {rn-sae}, %zmm3, %zmm3, %zmm7
+        vrsqrt14ps %zmm6, %zmm10
+        vcmpps    $17, {sae}, %zmm9, %zmm6, %k2
+        vcmpps    $22, {sae}, %zmm3, %zmm8, %k0
+        vmovups   832+__svml_sacos_data_internal(%rip), %zmm9
+        vminps    {sae}, %zmm6, %zmm7, %zmm1
+        vmovups   768+__svml_sacos_data_internal(%rip), %zmm7
+        vxorps    %zmm10, %zmm10, %zmm10{%k2}
+        vaddps    {rn-sae}, %zmm6, %zmm6, %zmm14
+        vmulps    {rn-sae}, %zmm1, %zmm1, %zmm8
+        vmulps    {rn-sae}, %zmm10, %zmm10, %zmm11
+        vmulps    {rn-sae}, %zmm10, %zmm14, %zmm5
+        vcmpps    $21, {sae}, %zmm6, %zmm1, %k1
+
+/* X<X^2 iff X<0 */
+        vcmpps    $17, {sae}, %zmm1, %zmm4, %k3
+
+/* polynomial */
+        vmovups   640+__svml_sacos_data_internal(%rip), %zmm6
+        vfmsub213ps {rn-sae}, %zmm12, %zmm11, %zmm14
+        vmovups   704+__svml_sacos_data_internal(%rip), %zmm11
+        vfmadd231ps {rn-sae}, %zmm1, %zmm7, %zmm9
+        vmovups   896+__svml_sacos_data_internal(%rip), %zmm10
+        vmovups   960+__svml_sacos_data_internal(%rip), %zmm12
+        vfmadd231ps {rn-sae}, %zmm14, %zmm13, %zmm0
+        vfmadd231ps {rn-sae}, %zmm1, %zmm6, %zmm11
+        vmulps    {rn-sae}, %zmm14, %zmm5, %zmm15
+        vfmadd213ps {rn-sae}, %zmm9, %zmm8, %zmm11
+        vxorps    %zmm12, %zmm12, %zmm12{%k1}
+        vfnmadd213ps {rn-sae}, %zmm5, %zmm15, %zmm0
+        vfmadd213ps {rn-sae}, %zmm10, %zmm1, %zmm11
+        kmovw     %k1, %eax
+        kmovw     %k3, %ecx
+        kmovw     %k0, %edx
+        vmulps    {rn-sae}, %zmm1, %zmm11, %zmm13
+        vblendmps %zmm0, %zmm3, %zmm0{%k1}
+        vxorps    %zmm2, %zmm0, %zmm1
+        andl      %eax, %ecx
+        kmovw     %ecx, %k2
+        vfmadd213ps {rn-sae}, %zmm1, %zmm1, %zmm13
+        vorps     1088+__svml_sacos_data_internal(%rip), %zmm12, %zmm12{%k2}
+        vaddps    {rn-sae}, %zmm13, %zmm12, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm4, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_sacos_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_acosf16,@function
+       .size   __svml_acosf16,.-__svml_acosf16
+..LN__svml_acosf16.0:
+
+.L_2__routine_start___svml_sacos_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_sacos_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    2(%rdi), %edx
+        andl      $32640, %edx
+        movss     (%rdi), %xmm1
+        cmpl      $32640, %edx
+        je        .LBL_2_20
+
+
+        cvtss2sd  %xmm1, %xmm1
+        movsd     %xmm1, -32(%rsp)
+        andb      $127, -25(%rsp)
+        movsd     -32(%rsp), %xmm12
+        movsd     4168+_vmldACosHATab(%rip), %xmm0
+        comisd    %xmm12, %xmm0
+        jbe       .LBL_2_14
+
+
+        movsd     4176+_vmldACosHATab(%rip), %xmm1
+        comisd    %xmm12, %xmm1
+        jbe       .LBL_2_10
+
+
+        comisd    4128+_vmldACosHATab(%rip), %xmm12
+        jbe       .LBL_2_9
+
+
+        movsd     4104+_vmldACosHATab(%rip), %xmm6
+        movaps    %xmm12, %xmm8
+        mulsd     %xmm12, %xmm6
+        movaps    %xmm12, %xmm7
+        movsd     %xmm6, -40(%rsp)
+        movsd     -40(%rsp), %xmm13
+        movsd     4104+_vmldACosHATab(%rip), %xmm5
+        subsd     -32(%rsp), %xmm13
+        movsd     %xmm13, -48(%rsp)
+        movsd     -40(%rsp), %xmm15
+        movsd     -48(%rsp), %xmm14
+        subsd     %xmm14, %xmm15
+        movaps    %xmm12, %xmm14
+        movsd     %xmm15, -40(%rsp)
+        movsd     -40(%rsp), %xmm6
+        subsd     %xmm6, %xmm8
+        movsd     %xmm8, -48(%rsp)
+        movsd     -40(%rsp), %xmm9
+        movaps    %xmm9, %xmm4
+        addsd     %xmm9, %xmm7
+        mulsd     %xmm9, %xmm4
+        movsd     -48(%rsp), %xmm10
+        movaps    %xmm4, %xmm11
+        mulsd     %xmm10, %xmm7
+        mulsd     %xmm4, %xmm5
+        addsd     %xmm7, %xmm11
+        movsd     4312+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm11, %xmm8
+        movsd     %xmm5, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     4104+_vmldACosHATab(%rip), %xmm5
+        subsd     %xmm4, %xmm1
+        addsd     4304+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm11, %xmm8
+        movsd     %xmm1, -48(%rsp)
+        movsd     -40(%rsp), %xmm0
+        movsd     -48(%rsp), %xmm2
+        addsd     4296+_vmldACosHATab(%rip), %xmm8
+        subsd     %xmm2, %xmm0
+        mulsd     %xmm11, %xmm8
+        movsd     %xmm0, -40(%rsp)
+        movsd     -40(%rsp), %xmm3
+        addsd     4288+_vmldACosHATab(%rip), %xmm8
+        subsd     %xmm3, %xmm4
+        mulsd     %xmm11, %xmm8
+        movsd     %xmm4, -48(%rsp)
+        movsd     -40(%rsp), %xmm6
+        mulsd     %xmm6, %xmm9
+        addsd     4280+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm6, %xmm10
+        mulsd     %xmm11, %xmm8
+        mulsd     %xmm9, %xmm5
+        addsd     4272+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm11, %xmm8
+        movaps    %xmm9, %xmm0
+        movsd     -48(%rsp), %xmm13
+        movaps    %xmm6, %xmm4
+        movsd     %xmm5, -40(%rsp)
+        addsd     %xmm13, %xmm7
+        addsd     4264+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm7, %xmm14
+        mulsd     %xmm11, %xmm8
+        addsd     %xmm14, %xmm10
+        addsd     4256+_vmldACosHATab(%rip), %xmm8
+        movsd     -40(%rsp), %xmm1
+        mulsd     %xmm11, %xmm8
+        subsd     %xmm9, %xmm1
+        addsd     %xmm10, %xmm9
+        addsd     4248+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm9, %xmm7
+        mulsd     %xmm11, %xmm8
+        movsd     %xmm1, -48(%rsp)
+        movsd     -40(%rsp), %xmm2
+        movsd     -48(%rsp), %xmm15
+        subsd     %xmm15, %xmm2
+        addsd     4240+_vmldACosHATab(%rip), %xmm8
+        movsd     %xmm2, -40(%rsp)
+        movsd     -40(%rsp), %xmm5
+        mulsd     %xmm11, %xmm8
+        subsd     %xmm5, %xmm0
+        movsd     %xmm0, -48(%rsp)
+        movsd     -40(%rsp), %xmm3
+        movsd     -48(%rsp), %xmm5
+        movaps    %xmm5, %xmm13
+        addsd     4232+_vmldACosHATab(%rip), %xmm8
+        mulsd     %xmm3, %xmm4
+        addsd     %xmm10, %xmm13
+        mulsd     %xmm11, %xmm8
+        mulsd     %xmm13, %xmm6
+        addsd     4224+_vmldACosHATab(%rip), %xmm8
+        addsd     %xmm7, %xmm6
+        mulsd     %xmm11, %xmm8
+        movsd     4104+_vmldACosHATab(%rip), %xmm7
+        movaps    %xmm4, %xmm13
+        mulsd     %xmm4, %xmm7
+        addsd     4216+_vmldACosHATab(%rip), %xmm8
+        movsd     %xmm7, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     4200+_vmldACosHATab(%rip), %xmm11
+        subsd     %xmm4, %xmm1
+        mulsd     %xmm9, %xmm11
+        addsd     %xmm6, %xmm4
+        movsd     %xmm1, -48(%rsp)
+        movaps    %xmm12, %xmm9
+        movsd     -40(%rsp), %xmm0
+        movsd     -48(%rsp), %xmm2
+        movsd     4192+_vmldACosHATab(%rip), %xmm1
+        subsd     %xmm2, %xmm0
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm1, %xmm10
+        mulsd     %xmm4, %xmm8
+        addsd     %xmm3, %xmm9
+        mulsd     %xmm1, %xmm5
+        addsd     %xmm10, %xmm11
+        movsd     %xmm0, -40(%rsp)
+        pxor      %xmm1, %xmm1
+        movsd     -40(%rsp), %xmm7
+        addsd     %xmm11, %xmm8
+        subsd     %xmm7, %xmm13
+        addsd     %xmm5, %xmm8
+        movsd     %xmm13, -48(%rsp)
+        movsd     -40(%rsp), %xmm0
+        movsd     -48(%rsp), %xmm2
+        movsd     %xmm9, -40(%rsp)
+        addsd     %xmm2, %xmm6
+        movsd     -40(%rsp), %xmm10
+        movsd     %xmm3, -56(%rsp)
+        subsd     %xmm10, %xmm12
+        movsd     4208+_vmldACosHATab(%rip), %xmm4
+        addsd     %xmm12, %xmm3
+        mulsd     %xmm4, %xmm0
+        mulsd     %xmm4, %xmm6
+        movsd     %xmm3, -48(%rsp)
+        movsd     -40(%rsp), %xmm3
+        movaps    %xmm3, %xmm12
+        movsd     -48(%rsp), %xmm7
+        addsd     %xmm0, %xmm12
+        addsd     %xmm7, %xmm8
+        movsd     %xmm12, -40(%rsp)
+        movsd     -40(%rsp), %xmm12
+        subsd     %xmm12, %xmm3
+        addsd     %xmm3, %xmm0
+        movsd     %xmm0, -48(%rsp)
+        movsd     -40(%rsp), %xmm3
+        movsd     -48(%rsp), %xmm0
+        cvtss2sd  (%rdi), %xmm1
+        addsd     %xmm8, %xmm0
+        comisd    4184+_vmldACosHATab(%rip), %xmm1
+        addsd     %xmm0, %xmm6
+        jbe       .LBL_2_7
+
+
+        movsd     4136+_vmldACosHATab(%rip), %xmm2
+        movaps    %xmm2, %xmm0
+        subsd     %xmm3, %xmm0
+        movsd     %xmm0, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     4144+_vmldACosHATab(%rip), %xmm0
+        subsd     %xmm1, %xmm2
+        subsd     %xmm6, %xmm0
+        subsd     %xmm3, %xmm2
+        movsd     %xmm2, -48(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     -48(%rsp), %xmm3
+        addsd     %xmm3, %xmm0
+        jmp       .LBL_2_8
+
+.LBL_2_7:
+
+        movsd     4136+_vmldACosHATab(%rip), %xmm2
+        movaps    %xmm3, %xmm0
+        addsd     %xmm2, %xmm0
+        movsd     %xmm0, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        subsd     %xmm1, %xmm2
+        addsd     %xmm2, %xmm3
+        movsd     %xmm3, -48(%rsp)
+        movsd     4144+_vmldACosHATab(%rip), %xmm3
+        movsd     -40(%rsp), %xmm1
+        addsd     %xmm3, %xmm6
+        movsd     -48(%rsp), %xmm0
+        addsd     %xmm6, %xmm0
+
+.LBL_2_8:
+
+        addsd     %xmm0, %xmm1
+        cvtsd2ss  %xmm1, %xmm1
+        movss     %xmm1, (%rsi)
+        ret
+
+.LBL_2_9:
+
+        movsd     4144+_vmldACosHATab(%rip), %xmm1
+        addsd     %xmm0, %xmm12
+        movsd     %xmm12, -40(%rsp)
+        movsd     -40(%rsp), %xmm0
+        mulsd     -32(%rsp), %xmm0
+        movsd     %xmm0, -56(%rsp)
+        movb      -49(%rsp), %dl
+        movb      3(%rdi), %dil
+        andb      $127, %dl
+        andb      $-128, %dil
+        orb       %dil, %dl
+        movb      %dl, -49(%rsp)
+        subsd     -56(%rsp), %xmm1
+        addsd     4136+_vmldACosHATab(%rip), %xmm1
+        cvtsd2ss  %xmm1, %xmm1
+        movss     %xmm1, (%rsi)
+        ret
+
+.LBL_2_10:
+
+        movaps    %xmm0, %xmm8
+        movzwl    4174+_vmldACosHATab(%rip), %r9d
+        pxor      %xmm13, %xmm13
+        andl      $-32753, %r9d
+        subsd     %xmm12, %xmm8
+        subsd     %xmm0, %xmm13
+        mulsd     %xmm8, %xmm1
+        movsd     %xmm1, -56(%rsp)
+        movzwl    -50(%rsp), %ecx
+        andl      $32752, %ecx
+        shrl      $4, %ecx
+        addl      $-1023, %ecx
+        movl      %ecx, %r8d
+        movl      %ecx, %edx
+        negl      %r8d
+        addl      $1023, %r8d
+        andl      $2047, %r8d
+        shll      $4, %r8d
+        movsd     %xmm0, -32(%rsp)
+        orl       %r8d, %r9d
+        movw      %r9w, -26(%rsp)
+        andl      $1, %edx
+        movsd     -32(%rsp), %xmm4
+        lea       _vmldACosHATab(%rip), %r8
+        mulsd     %xmm4, %xmm1
+        movl      %edx, %r10d
+        movaps    %xmm1, %xmm15
+        movsd     4112+_vmldACosHATab(%rip), %xmm6
+        addsd     %xmm1, %xmm15
+        jne       ..L54
+        movaps    %xmm1, %xmm15
+..L54:
+        mulsd     %xmm15, %xmm6
+        movaps    %xmm15, %xmm7
+        movaps    %xmm6, %xmm9
+        subl      %edx, %ecx
+        movsd     4120+_vmldACosHATab(%rip), %xmm11
+        subsd     %xmm15, %xmm9
+        addsd     %xmm1, %xmm11
+        movsd     %xmm9, -48(%rsp)
+        movsd     -48(%rsp), %xmm10
+        movsd     %xmm11, -24(%rsp)
+        subsd     %xmm10, %xmm6
+        movl      -24(%rsp), %r11d
+        movaps    %xmm6, %xmm14
+        shll      $8, %r10d
+        andl      $511, %r11d
+        addl      %r10d, %r11d
+        subsd     %xmm6, %xmm7
+        movsd     (%r8,%r11,8), %xmm5
+        addsd     %xmm7, %xmm14
+        mulsd     %xmm5, %xmm6
+        movaps    %xmm5, %xmm12
+        mulsd     %xmm5, %xmm12
+        mulsd     %xmm12, %xmm14
+        movsd     4512+_vmldACosHATab(%rip), %xmm4
+        addsd     %xmm13, %xmm14
+        mulsd     %xmm14, %xmm4
+        shrl      $1, %ecx
+        addsd     4504+_vmldACosHATab(%rip), %xmm4
+        mulsd     %xmm14, %xmm4
+        addl      $1023, %ecx
+        andl      $2047, %ecx
+        addsd     4496+_vmldACosHATab(%rip), %xmm4
+        mulsd     %xmm14, %xmm4
+        movzwl    4174+_vmldACosHATab(%rip), %r9d
+        shll      $4, %ecx
+        andl      $-32753, %r9d
+        movsd     %xmm0, -16(%rsp)
+        orl       %ecx, %r9d
+        movw      %r9w, -10(%rsp)
+        movsd     -16(%rsp), %xmm9
+        mulsd     %xmm9, %xmm6
+        addsd     4488+_vmldACosHATab(%rip), %xmm4
+        mulsd     %xmm14, %xmm4
+        movsd     4104+_vmldACosHATab(%rip), %xmm3
+        mulsd     %xmm6, %xmm3
+        addsd     4480+_vmldACosHATab(%rip), %xmm4
+        mulsd     %xmm14, %xmm4
+        movsd     %xmm3, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     4352+_vmldACosHATab(%rip), %xmm11
+        subsd     %xmm6, %xmm1
+        addsd     4472+_vmldACosHATab(%rip), %xmm4
+        addsd     4360+_vmldACosHATab(%rip), %xmm11
+        mulsd     %xmm14, %xmm4
+        mulsd     %xmm8, %xmm11
+        addsd     4464+_vmldACosHATab(%rip), %xmm4
+        mulsd     %xmm14, %xmm4
+        mulsd     %xmm15, %xmm4
+        movsd     %xmm1, -48(%rsp)
+        addsd     %xmm4, %xmm7
+        mulsd     %xmm5, %xmm7
+        movsd     4456+_vmldACosHATab(%rip), %xmm5
+        mulsd     %xmm8, %xmm5
+        mulsd     %xmm9, %xmm7
+        addsd     4448+_vmldACosHATab(%rip), %xmm5
+        mulsd     %xmm8, %xmm5
+        movsd     -40(%rsp), %xmm2
+        movsd     -48(%rsp), %xmm0
+        movsd     4104+_vmldACosHATab(%rip), %xmm4
+        subsd     %xmm0, %xmm2
+        mulsd     %xmm8, %xmm4
+        addsd     4440+_vmldACosHATab(%rip), %xmm5
+        mulsd     %xmm8, %xmm5
+        movaps    %xmm8, %xmm0
+        movsd     %xmm2, -40(%rsp)
+        movsd     -40(%rsp), %xmm14
+        movsd     4104+_vmldACosHATab(%rip), %xmm2
+        subsd     %xmm14, %xmm6
+        addsd     4432+_vmldACosHATab(%rip), %xmm5
+        mulsd     %xmm8, %xmm5
+        movsd     %xmm6, -48(%rsp)
+        movsd     -40(%rsp), %xmm6
+        movsd     -48(%rsp), %xmm10
+        movsd     %xmm4, -40(%rsp)
+        addsd     %xmm10, %xmm7
+        addsd     4424+_vmldACosHATab(%rip), %xmm5
+        mulsd     %xmm8, %xmm5
+        movsd     -40(%rsp), %xmm3
+        movsd     4336+_vmldACosHATab(%rip), %xmm12
+        subsd     %xmm8, %xmm3
+        addsd     4416+_vmldACosHATab(%rip), %xmm5
+        addsd     4344+_vmldACosHATab(%rip), %xmm12
+        mulsd     %xmm8, %xmm5
+        addsd     %xmm11, %xmm12
+        addsd     4408+_vmldACosHATab(%rip), %xmm5
+        mulsd     %xmm8, %xmm12
+        mulsd     %xmm8, %xmm5
+        movsd     %xmm3, -48(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     -48(%rsp), %xmm15
+        movsd     4320+_vmldACosHATab(%rip), %xmm13
+        subsd     %xmm15, %xmm1
+        addsd     4400+_vmldACosHATab(%rip), %xmm5
+        addsd     4328+_vmldACosHATab(%rip), %xmm13
+        mulsd     %xmm8, %xmm5
+        addsd     %xmm12, %xmm13
+        addsd     4392+_vmldACosHATab(%rip), %xmm5
+        movsd     %xmm1, -40(%rsp)
+        mulsd     %xmm8, %xmm5
+        movsd     -40(%rsp), %xmm4
+        subsd     %xmm4, %xmm0
+        addsd     4384+_vmldACosHATab(%rip), %xmm5
+        movsd     %xmm0, -48(%rsp)
+        movsd     -40(%rsp), %xmm4
+        movaps    %xmm4, %xmm14
+        mulsd     %xmm4, %xmm14
+        mulsd     %xmm8, %xmm5
+        mulsd     %xmm14, %xmm2
+        addsd     4376+_vmldACosHATab(%rip), %xmm5
+        movsd     -48(%rsp), %xmm3
+        movsd     %xmm2, -40(%rsp)
+        movsd     -40(%rsp), %xmm9
+        mulsd     %xmm8, %xmm5
+        subsd     %xmm14, %xmm9
+        movsd     %xmm9, -48(%rsp)
+        movsd     -40(%rsp), %xmm11
+        movsd     -48(%rsp), %xmm10
+        movsd     4336+_vmldACosHATab(%rip), %xmm0
+        subsd     %xmm10, %xmm11
+        mulsd     %xmm4, %xmm0
+        addsd     4368+_vmldACosHATab(%rip), %xmm5
+        addsd     %xmm8, %xmm4
+        mulsd     %xmm8, %xmm5
+        mulsd     %xmm3, %xmm4
+        mulsd     %xmm8, %xmm5
+        movsd     %xmm11, -40(%rsp)
+        movaps    %xmm0, %xmm1
+        movsd     -40(%rsp), %xmm12
+        mulsd     %xmm8, %xmm5
+        subsd     %xmm12, %xmm14
+        movsd     %xmm14, -48(%rsp)
+        addsd     %xmm5, %xmm13
+        movsd     -40(%rsp), %xmm9
+        mulsd     4352+_vmldACosHATab(%rip), %xmm9
+        mulsd     %xmm13, %xmm7
+        addsd     %xmm9, %xmm1
+        movsd     -48(%rsp), %xmm2
+        movsd     %xmm1, -40(%rsp)
+        addsd     %xmm2, %xmm4
+        movsd     -40(%rsp), %xmm13
+        movsd     %xmm9, -24(%rsp)
+        subsd     %xmm13, %xmm0
+        mulsd     4352+_vmldACosHATab(%rip), %xmm4
+        addsd     %xmm0, %xmm9
+        movsd     %xmm9, -48(%rsp)
+        movsd     -40(%rsp), %xmm12
+        movsd     4320+_vmldACosHATab(%rip), %xmm10
+        movsd     -48(%rsp), %xmm1
+        addsd     %xmm12, %xmm10
+        movsd     %xmm10, -40(%rsp)
+        movsd     -40(%rsp), %xmm15
+        movsd     4320+_vmldACosHATab(%rip), %xmm11
+        movsd     4104+_vmldACosHATab(%rip), %xmm9
+        subsd     %xmm15, %xmm11
+        movsd     4336+_vmldACosHATab(%rip), %xmm2
+        addsd     %xmm11, %xmm12
+        mulsd     %xmm3, %xmm2
+        movsd     %xmm12, -48(%rsp)
+        movsd     -40(%rsp), %xmm15
+        mulsd     %xmm15, %xmm9
+        movsd     -48(%rsp), %xmm0
+        movsd     %xmm9, -40(%rsp)
+        movsd     -40(%rsp), %xmm10
+        movsd     4360+_vmldACosHATab(%rip), %xmm3
+        subsd     %xmm15, %xmm10
+        mulsd     %xmm8, %xmm3
+        movsd     %xmm10, -48(%rsp)
+        movsd     -40(%rsp), %xmm11
+        movsd     -48(%rsp), %xmm13
+        subsd     %xmm13, %xmm11
+        addsd     4344+_vmldACosHATab(%rip), %xmm3
+        movsd     %xmm11, -40(%rsp)
+        movsd     -40(%rsp), %xmm14
+        mulsd     %xmm8, %xmm3
+        subsd     %xmm14, %xmm15
+        movsd     %xmm15, -48(%rsp)
+        movsd     -40(%rsp), %xmm10
+        movsd     -48(%rsp), %xmm9
+        addsd     %xmm9, %xmm4
+        addsd     4328+_vmldACosHATab(%rip), %xmm3
+        addsd     %xmm2, %xmm4
+        addsd     %xmm5, %xmm3
+        addsd     %xmm1, %xmm4
+        addsd     %xmm0, %xmm4
+        addsd     %xmm3, %xmm4
+        mulsd     %xmm6, %xmm4
+        mulsd     %xmm10, %xmm6
+        addsd     %xmm7, %xmm4
+        pxor      %xmm7, %xmm7
+        cvtss2sd  (%rdi), %xmm7
+        comisd    4184+_vmldACosHATab(%rip), %xmm7
+        ja        .LBL_2_13
+
+
+        movsd     4152+_vmldACosHATab(%rip), %xmm2
+        movaps    %xmm2, %xmm0
+        movsd     4160+_vmldACosHATab(%rip), %xmm5
+        subsd     %xmm6, %xmm0
+        subsd     %xmm4, %xmm5
+        movsd     %xmm0, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        movsd     %xmm6, -56(%rsp)
+        subsd     %xmm1, %xmm2
+        subsd     %xmm6, %xmm2
+        movsd     %xmm2, -48(%rsp)
+        movsd     -40(%rsp), %xmm6
+        movsd     -48(%rsp), %xmm3
+        movaps    %xmm3, %xmm4
+        addsd     %xmm5, %xmm4
+
+.LBL_2_13:
+
+        addsd     %xmm4, %xmm6
+        cvtsd2ss  %xmm6, %xmm6
+        movss     %xmm6, (%rsi)
+        ret
+
+.LBL_2_14:
+
+        ucomisd   %xmm0, %xmm1
+        jp        .LBL_2_15
+        je        .LBL_2_19
+
+.LBL_2_15:
+
+        xorps     .L_2il0floatpacket.199(%rip), %xmm0
+        ucomisd   %xmm0, %xmm1
+        jp        .LBL_2_16
+        je        .LBL_2_18
+
+.LBL_2_16:
+
+        movl      $1, %eax
+        pxor      %xmm1, %xmm1
+        pxor      %xmm0, %xmm0
+        divss     %xmm0, %xmm1
+        movss     %xmm1, (%rsi)
+
+
+        ret
+
+.LBL_2_18:
+
+        movsd     4152+_vmldACosHATab(%rip), %xmm0
+        addsd     4160+_vmldACosHATab(%rip), %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_19:
+
+        movsd     4184+_vmldACosHATab(%rip), %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_20:
+
+        divss     %xmm1, %xmm1
+        testl     $8388607, (%rdi)
+        movss     %xmm1, (%rsi)
+        sete      %al
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_sacos_cout_rare_internal,@function
+       .size   __svml_sacos_cout_rare_internal,.-__svml_sacos_cout_rare_internal
+..LN__svml_sacos_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_sacos_data_internal:
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .type   __svml_sacos_data_internal,@object
+       .size   __svml_sacos_data_internal,1600
+       .align 32
+_vmldACosHATab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072689152
+       .long   0
+       .long   1072685056
+       .long   0
+       .long   1072680960
+       .long   0
+       .long   1072676864
+       .long   0
+       .long   1072672768
+       .long   0
+       .long   1072668672
+       .long   0
+       .long   1072665600
+       .long   0
+       .long   1072661504
+       .long   0
+       .long   1072657408
+       .long   0
+       .long   1072653312
+       .long   0
+       .long   1072649216
+       .long   0
+       .long   1072646144
+       .long   0
+       .long   1072642048
+       .long   0
+       .long   1072637952
+       .long   0
+       .long   1072634880
+       .long   0
+       .long   1072630784
+       .long   0
+       .long   1072626688
+       .long   0
+       .long   1072623616
+       .long   0
+       .long   1072619520
+       .long   0
+       .long   1072615424
+       .long   0
+       .long   1072612352
+       .long   0
+       .long   1072608256
+       .long   0
+       .long   1072605184
+       .long   0
+       .long   1072601088
+       .long   0
+       .long   1072598016
+       .long   0
+       .long   1072593920
+       .long   0
+       .long   1072590848
+       .long   0
+       .long   1072586752
+       .long   0
+       .long   1072583680
+       .long   0
+       .long   1072580608
+       .long   0
+       .long   1072576512
+       .long   0
+       .long   1072573440
+       .long   0
+       .long   1072570368
+       .long   0
+       .long   1072566272
+       .long   0
+       .long   1072563200
+       .long   0
+       .long   1072560128
+       .long   0
+       .long   1072556032
+       .long   0
+       .long   1072552960
+       .long   0
+       .long   1072549888
+       .long   0
+       .long   1072546816
+       .long   0
+       .long   1072542720
+       .long   0
+       .long   1072539648
+       .long   0
+       .long   1072536576
+       .long   0
+       .long   1072533504
+       .long   0
+       .long   1072530432
+       .long   0
+       .long   1072527360
+       .long   0
+       .long   1072523264
+       .long   0
+       .long   1072520192
+       .long   0
+       .long   1072517120
+       .long   0
+       .long   1072514048
+       .long   0
+       .long   1072510976
+       .long   0
+       .long   1072507904
+       .long   0
+       .long   1072504832
+       .long   0
+       .long   1072501760
+       .long   0
+       .long   1072498688
+       .long   0
+       .long   1072495616
+       .long   0
+       .long   1072492544
+       .long   0
+       .long   1072489472
+       .long   0
+       .long   1072486400
+       .long   0
+       .long   1072483328
+       .long   0
+       .long   1072480256
+       .long   0
+       .long   1072478208
+       .long   0
+       .long   1072475136
+       .long   0
+       .long   1072472064
+       .long   0
+       .long   1072468992
+       .long   0
+       .long   1072465920
+       .long   0
+       .long   1072462848
+       .long   0
+       .long   1072459776
+       .long   0
+       .long   1072457728
+       .long   0
+       .long   1072454656
+       .long   0
+       .long   1072451584
+       .long   0
+       .long   1072448512
+       .long   0
+       .long   1072446464
+       .long   0
+       .long   1072443392
+       .long   0
+       .long   1072440320
+       .long   0
+       .long   1072437248
+       .long   0
+       .long   1072435200
+       .long   0
+       .long   1072432128
+       .long   0
+       .long   1072429056
+       .long   0
+       .long   1072427008
+       .long   0
+       .long   1072423936
+       .long   0
+       .long   1072420864
+       .long   0
+       .long   1072418816
+       .long   0
+       .long   1072415744
+       .long   0
+       .long   1072412672
+       .long   0
+       .long   1072410624
+       .long   0
+       .long   1072407552
+       .long   0
+       .long   1072405504
+       .long   0
+       .long   1072402432
+       .long   0
+       .long   1072400384
+       .long   0
+       .long   1072397312
+       .long   0
+       .long   1072395264
+       .long   0
+       .long   1072392192
+       .long   0
+       .long   1072390144
+       .long   0
+       .long   1072387072
+       .long   0
+       .long   1072385024
+       .long   0
+       .long   1072381952
+       .long   0
+       .long   1072379904
+       .long   0
+       .long   1072376832
+       .long   0
+       .long   1072374784
+       .long   0
+       .long   1072371712
+       .long   0
+       .long   1072369664
+       .long   0
+       .long   1072366592
+       .long   0
+       .long   1072364544
+       .long   0
+       .long   1072362496
+       .long   0
+       .long   1072359424
+       .long   0
+       .long   1072357376
+       .long   0
+       .long   1072355328
+       .long   0
+       .long   1072352256
+       .long   0
+       .long   1072350208
+       .long   0
+       .long   1072347136
+       .long   0
+       .long   1072345088
+       .long   0
+       .long   1072343040
+       .long   0
+       .long   1072340992
+       .long   0
+       .long   1072337920
+       .long   0
+       .long   1072335872
+       .long   0
+       .long   1072333824
+       .long   0
+       .long   1072330752
+       .long   0
+       .long   1072328704
+       .long   0
+       .long   1072326656
+       .long   0
+       .long   1072324608
+       .long   0
+       .long   1072321536
+       .long   0
+       .long   1072319488
+       .long   0
+       .long   1072317440
+       .long   0
+       .long   1072315392
+       .long   0
+       .long   1072313344
+       .long   0
+       .long   1072310272
+       .long   0
+       .long   1072308224
+       .long   0
+       .long   1072306176
+       .long   0
+       .long   1072304128
+       .long   0
+       .long   1072302080
+       .long   0
+       .long   1072300032
+       .long   0
+       .long   1072296960
+       .long   0
+       .long   1072294912
+       .long   0
+       .long   1072292864
+       .long   0
+       .long   1072290816
+       .long   0
+       .long   1072288768
+       .long   0
+       .long   1072286720
+       .long   0
+       .long   1072284672
+       .long   0
+       .long   1072282624
+       .long   0
+       .long   1072280576
+       .long   0
+       .long   1072278528
+       .long   0
+       .long   1072275456
+       .long   0
+       .long   1072273408
+       .long   0
+       .long   1072271360
+       .long   0
+       .long   1072269312
+       .long   0
+       .long   1072267264
+       .long   0
+       .long   1072265216
+       .long   0
+       .long   1072263168
+       .long   0
+       .long   1072261120
+       .long   0
+       .long   1072259072
+       .long   0
+       .long   1072257024
+       .long   0
+       .long   1072254976
+       .long   0
+       .long   1072252928
+       .long   0
+       .long   1072250880
+       .long   0
+       .long   1072248832
+       .long   0
+       .long   1072246784
+       .long   0
+       .long   1072244736
+       .long   0
+       .long   1072243712
+       .long   0
+       .long   1072241664
+       .long   0
+       .long   1072239616
+       .long   0
+       .long   1072237568
+       .long   0
+       .long   1072235520
+       .long   0
+       .long   1072233472
+       .long   0
+       .long   1072231424
+       .long   0
+       .long   1072229376
+       .long   0
+       .long   1072227328
+       .long   0
+       .long   1072225280
+       .long   0
+       .long   1072223232
+       .long   0
+       .long   1072222208
+       .long   0
+       .long   1072220160
+       .long   0
+       .long   1072218112
+       .long   0
+       .long   1072216064
+       .long   0
+       .long   1072214016
+       .long   0
+       .long   1072211968
+       .long   0
+       .long   1072210944
+       .long   0
+       .long   1072208896
+       .long   0
+       .long   1072206848
+       .long   0
+       .long   1072204800
+       .long   0
+       .long   1072202752
+       .long   0
+       .long   1072201728
+       .long   0
+       .long   1072199680
+       .long   0
+       .long   1072197632
+       .long   0
+       .long   1072195584
+       .long   0
+       .long   1072193536
+       .long   0
+       .long   1072192512
+       .long   0
+       .long   1072190464
+       .long   0
+       .long   1072188416
+       .long   0
+       .long   1072186368
+       .long   0
+       .long   1072185344
+       .long   0
+       .long   1072183296
+       .long   0
+       .long   1072181248
+       .long   0
+       .long   1072179200
+       .long   0
+       .long   1072178176
+       .long   0
+       .long   1072176128
+       .long   0
+       .long   1072174080
+       .long   0
+       .long   1072173056
+       .long   0
+       .long   1072171008
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072167936
+       .long   0
+       .long   1072165888
+       .long   0
+       .long   1072163840
+       .long   0
+       .long   1072161792
+       .long   0
+       .long   1072160768
+       .long   0
+       .long   1072158720
+       .long   0
+       .long   1072157696
+       .long   0
+       .long   1072155648
+       .long   0
+       .long   1072153600
+       .long   0
+       .long   1072152576
+       .long   0
+       .long   1072150528
+       .long   0
+       .long   1072148480
+       .long   0
+       .long   1072147456
+       .long   0
+       .long   1072145408
+       .long   0
+       .long   1072143360
+       .long   0
+       .long   1072142336
+       .long   0
+       .long   1072140288
+       .long   0
+       .long   1072139264
+       .long   0
+       .long   1072137216
+       .long   0
+       .long   1072135168
+       .long   0
+       .long   1072134144
+       .long   0
+       .long   1072132096
+       .long   0
+       .long   1072131072
+       .long   0
+       .long   1072129024
+       .long   0
+       .long   1072128000
+       .long   0
+       .long   1072125952
+       .long   0
+       .long   1072124928
+       .long   0
+       .long   1072122880
+       .long   0
+       .long   1072120832
+       .long   0
+       .long   1072119808
+       .long   0
+       .long   1072117760
+       .long   0
+       .long   1072116736
+       .long   0
+       .long   1072114688
+       .long   0
+       .long   1072113664
+       .long   0
+       .long   1072111616
+       .long   0
+       .long   1072110592
+       .long   0
+       .long   1072108544
+       .long   0
+       .long   1072107520
+       .long   0
+       .long   1072105472
+       .long   0
+       .long   1072104448
+       .long   0
+       .long   1072102400
+       .long   0
+       .long   1072101376
+       .long   0
+       .long   1072099328
+       .long   0
+       .long   1072098304
+       .long   0
+       .long   1072096256
+       .long   0
+       .long   1072095232
+       .long   0
+       .long   1072094208
+       .long   0
+       .long   1072092160
+       .long   0
+       .long   1072091136
+       .long   0
+       .long   1072089088
+       .long   0
+       .long   1072088064
+       .long   0
+       .long   1072086016
+       .long   0
+       .long   1072084992
+       .long   0
+       .long   1072082944
+       .long   0
+       .long   1072081920
+       .long   0
+       .long   1072080896
+       .long   0
+       .long   1072078848
+       .long   0
+       .long   1072075776
+       .long   0
+       .long   1072073728
+       .long   0
+       .long   1072070656
+       .long   0
+       .long   1072067584
+       .long   0
+       .long   1072064512
+       .long   0
+       .long   1072061440
+       .long   0
+       .long   1072059392
+       .long   0
+       .long   1072056320
+       .long   0
+       .long   1072053248
+       .long   0
+       .long   1072051200
+       .long   0
+       .long   1072048128
+       .long   0
+       .long   1072045056
+       .long   0
+       .long   1072043008
+       .long   0
+       .long   1072039936
+       .long   0
+       .long   1072037888
+       .long   0
+       .long   1072034816
+       .long   0
+       .long   1072031744
+       .long   0
+       .long   1072029696
+       .long   0
+       .long   1072026624
+       .long   0
+       .long   1072024576
+       .long   0
+       .long   1072021504
+       .long   0
+       .long   1072019456
+       .long   0
+       .long   1072016384
+       .long   0
+       .long   1072014336
+       .long   0
+       .long   1072011264
+       .long   0
+       .long   1072009216
+       .long   0
+       .long   1072006144
+       .long   0
+       .long   1072004096
+       .long   0
+       .long   1072002048
+       .long   0
+       .long   1071998976
+       .long   0
+       .long   1071996928
+       .long   0
+       .long   1071993856
+       .long   0
+       .long   1071991808
+       .long   0
+       .long   1071989760
+       .long   0
+       .long   1071986688
+       .long   0
+       .long   1071984640
+       .long   0
+       .long   1071982592
+       .long   0
+       .long   1071979520
+       .long   0
+       .long   1071977472
+       .long   0
+       .long   1071975424
+       .long   0
+       .long   1071972352
+       .long   0
+       .long   1071970304
+       .long   0
+       .long   1071968256
+       .long   0
+       .long   1071966208
+       .long   0
+       .long   1071964160
+       .long   0
+       .long   1071961088
+       .long   0
+       .long   1071959040
+       .long   0
+       .long   1071956992
+       .long   0
+       .long   1071954944
+       .long   0
+       .long   1071952896
+       .long   0
+       .long   1071949824
+       .long   0
+       .long   1071947776
+       .long   0
+       .long   1071945728
+       .long   0
+       .long   1071943680
+       .long   0
+       .long   1071941632
+       .long   0
+       .long   1071939584
+       .long   0
+       .long   1071937536
+       .long   0
+       .long   1071935488
+       .long   0
+       .long   1071933440
+       .long   0
+       .long   1071930368
+       .long   0
+       .long   1071928320
+       .long   0
+       .long   1071926272
+       .long   0
+       .long   1071924224
+       .long   0
+       .long   1071922176
+       .long   0
+       .long   1071920128
+       .long   0
+       .long   1071918080
+       .long   0
+       .long   1071916032
+       .long   0
+       .long   1071913984
+       .long   0
+       .long   1071911936
+       .long   0
+       .long   1071909888
+       .long   0
+       .long   1071907840
+       .long   0
+       .long   1071905792
+       .long   0
+       .long   1071903744
+       .long   0
+       .long   1071901696
+       .long   0
+       .long   1071900672
+       .long   0
+       .long   1071898624
+       .long   0
+       .long   1071896576
+       .long   0
+       .long   1071894528
+       .long   0
+       .long   1071892480
+       .long   0
+       .long   1071890432
+       .long   0
+       .long   1071888384
+       .long   0
+       .long   1071886336
+       .long   0
+       .long   1071884288
+       .long   0
+       .long   1071883264
+       .long   0
+       .long   1071881216
+       .long   0
+       .long   1071879168
+       .long   0
+       .long   1071877120
+       .long   0
+       .long   1071875072
+       .long   0
+       .long   1071873024
+       .long   0
+       .long   1071872000
+       .long   0
+       .long   1071869952
+       .long   0
+       .long   1071867904
+       .long   0
+       .long   1071865856
+       .long   0
+       .long   1071864832
+       .long   0
+       .long   1071862784
+       .long   0
+       .long   1071860736
+       .long   0
+       .long   1071858688
+       .long   0
+       .long   1071856640
+       .long   0
+       .long   1071855616
+       .long   0
+       .long   1071853568
+       .long   0
+       .long   1071851520
+       .long   0
+       .long   1071850496
+       .long   0
+       .long   1071848448
+       .long   0
+       .long   1071846400
+       .long   0
+       .long   1071844352
+       .long   0
+       .long   1071843328
+       .long   0
+       .long   1071841280
+       .long   0
+       .long   1071839232
+       .long   0
+       .long   1071838208
+       .long   0
+       .long   1071836160
+       .long   0
+       .long   1071834112
+       .long   0
+       .long   1071833088
+       .long   0
+       .long   1071831040
+       .long   0
+       .long   1071830016
+       .long   0
+       .long   1071827968
+       .long   0
+       .long   1071825920
+       .long   0
+       .long   1071824896
+       .long   0
+       .long   1071822848
+       .long   0
+       .long   1071821824
+       .long   0
+       .long   1071819776
+       .long   0
+       .long   1071817728
+       .long   0
+       .long   1071816704
+       .long   0
+       .long   1071814656
+       .long   0
+       .long   1071813632
+       .long   0
+       .long   1071811584
+       .long   0
+       .long   1071810560
+       .long   0
+       .long   1071808512
+       .long   0
+       .long   1071806464
+       .long   0
+       .long   1071805440
+       .long   0
+       .long   1071803392
+       .long   0
+       .long   1071802368
+       .long   0
+       .long   1071800320
+       .long   0
+       .long   1071799296
+       .long   0
+       .long   1071797248
+       .long   0
+       .long   1071796224
+       .long   0
+       .long   1071794176
+       .long   0
+       .long   1071793152
+       .long   0
+       .long   1071791104
+       .long   0
+       .long   1071790080
+       .long   0
+       .long   1071788032
+       .long   0
+       .long   1071787008
+       .long   0
+       .long   1071784960
+       .long   0
+       .long   1071783936
+       .long   0
+       .long   1071782912
+       .long   0
+       .long   1071780864
+       .long   0
+       .long   1071779840
+       .long   0
+       .long   1071777792
+       .long   0
+       .long   1071776768
+       .long   0
+       .long   1071774720
+       .long   0
+       .long   1071773696
+       .long   0
+       .long   1071772672
+       .long   0
+       .long   1071770624
+       .long   0
+       .long   1071769600
+       .long   0
+       .long   1071767552
+       .long   0
+       .long   1071766528
+       .long   0
+       .long   1071765504
+       .long   0
+       .long   1071763456
+       .long   0
+       .long   1071762432
+       .long   0
+       .long   1071760384
+       .long   0
+       .long   1071759360
+       .long   0
+       .long   1071758336
+       .long   0
+       .long   1071756288
+       .long   0
+       .long   1071755264
+       .long   0
+       .long   1071754240
+       .long   0
+       .long   1071752192
+       .long   0
+       .long   1071751168
+       .long   0
+       .long   1071750144
+       .long   0
+       .long   1071748096
+       .long   0
+       .long   1071747072
+       .long   0
+       .long   1071746048
+       .long   0
+       .long   1071744000
+       .long   0
+       .long   1071742976
+       .long   0
+       .long   1071741952
+       .long   0
+       .long   1071739904
+       .long   0
+       .long   1071738880
+       .long   0
+       .long   1071737856
+       .long   0
+       .long   1071736832
+       .long   0
+       .long   1071734784
+       .long   0
+       .long   1071733760
+       .long   0
+       .long   1071732736
+       .long   0
+       .long   1071730688
+       .long   0
+       .long   1071729664
+       .long   0
+       .long   1071728640
+       .long   0
+       .long   1071727616
+       .long   0
+       .long   1071725568
+       .long   0
+       .long   1071724544
+       .long   0
+       .long   1071723520
+       .long   0
+       .long   1071722496
+       .long   0
+       .long   1071720448
+       .long   0
+       .long   1071719424
+       .long   0
+       .long   1071718400
+       .long   0
+       .long   1071717376
+       .long   0
+       .long   1071715328
+       .long   0
+       .long   1071714304
+       .long   0
+       .long   1071713280
+       .long   0
+       .long   1071712256
+       .long   0
+       .long   1071711232
+       .long   0
+       .long   1071709184
+       .long   0
+       .long   1071708160
+       .long   0
+       .long   1071707136
+       .long   0
+       .long   1071706112
+       .long   0
+       .long   1071705088
+       .long   0
+       .long   1071704064
+       .long   0
+       .long   1071702016
+       .long   0
+       .long   1071700992
+       .long   0
+       .long   1071699968
+       .long   0
+       .long   1071698944
+       .long   0
+       .long   1071697920
+       .long   0
+       .long   1071696896
+       .long   0
+       .long   1071694848
+       .long   0
+       .long   1071693824
+       .long   0
+       .long   1071692800
+       .long   0
+       .long   1071691776
+       .long   0
+       .long   1071690752
+       .long   0
+       .long   1071689728
+       .long   0
+       .long   1071688704
+       .long   0
+       .long   1071686656
+       .long   0
+       .long   1071685632
+       .long   0
+       .long   1071684608
+       .long   0
+       .long   1071683584
+       .long   0
+       .long   1071682560
+       .long   0
+       .long   1071681536
+       .long   0
+       .long   1071680512
+       .long   0
+       .long   1071679488
+       .long   0
+       .long   1071677440
+       .long   0
+       .long   1071676416
+       .long   0
+       .long   1071675392
+       .long   0
+       .long   1071674368
+       .long   0
+       .long   1071673344
+       .long   0
+       .long   1071672320
+       .long   0
+       .long   1071671296
+       .long   0
+       .long   1071670272
+       .long   0
+       .long   1071669248
+       .long   0
+       .long   1071668224
+       .long   0
+       .long   1071667200
+       .long   0
+       .long   1071666176
+       .long   0
+       .long   1071665152
+       .long   0
+       .long   1071663104
+       .long   0
+       .long   1071662080
+       .long   0
+       .long   1071661056
+       .long   0
+       .long   1071660032
+       .long   0
+       .long   1071659008
+       .long   0
+       .long   1071657984
+       .long   0
+       .long   1071656960
+       .long   0
+       .long   1071655936
+       .long   0
+       .long   1071654912
+       .long   0
+       .long   1071653888
+       .long   0
+       .long   1071652864
+       .long   0
+       .long   1071651840
+       .long   0
+       .long   1071650816
+       .long   0
+       .long   1071649792
+       .long   0
+       .long   1071648768
+       .long   0
+       .long   1071647744
+       .long   0
+       .long   1071646720
+       .long   0
+       .long   1071645696
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1101004800
+       .long   1073741824
+       .long   1095761920
+       .long   256
+       .long   1118830592
+       .long   0
+       .long   1017118720
+       .long   1413754136
+       .long   1073291771
+       .long   856972295
+       .long   1016178214
+       .long   1413754136
+       .long   1074340347
+       .long   856972295
+       .long   1017226790
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   0
+       .long   1476395008
+       .long   1069897045
+       .long   1768958041
+       .long   3189069141
+       .long   805306368
+       .long   1068708659
+       .long   3580333578
+       .long   1040816593
+       .long   3067382784
+       .long   1067899757
+       .long   3397590151
+       .long   1067392113
+       .long   2939529726
+       .long   1066854585
+       .long   1423429166
+       .long   1066517752
+       .long   1775218934
+       .long   1066178574
+       .long   1185392460
+       .long   1065859647
+       .long   289998670
+       .long   1065577550
+       .long   3179807072
+       .long   1065648121
+       .long   3781007284
+       .long   1061576176
+       .long   2482106687
+       .long   1067019199
+       .long   763519713
+       .long   3214591591
+       .long   3695107454
+       .long   1067530646
+       .long   0
+       .long   1073741824
+       .long   1124791109
+       .long   1006764147
+       .long   1476395008
+       .long   1069897045
+       .long   1953913876
+       .long   3189069141
+       .long   805306368
+       .long   1067660083
+       .long   165110192
+       .long   1039768033
+       .long   3067304082
+       .long   1065802605
+       .long   3404727379
+       .long   1064246385
+       .long   2737480376
+       .long   1062660281
+       .long   933797922
+       .long   1061274873
+       .long   1475716730
+       .long   1059887095
+       .long   1511619763
+       .long   1058519827
+       .long   556024211
+       .long   1057187555
+       .long   3482101045
+       .long   1056217350
+       .long   1174622859
+       .long   1050762633
+       .long   899668651
+       .long   1055506366
+       .long   1081094694
+       .long   3202035365
+       .long   2559814773
+       .long   1053906576
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   3218341888
+       .long   0
+       .long   1070694400
+       .long   0
+       .long   3218046976
+       .long   0
+       .long   1070391296
+       .long   0
+       .long   3217739776
+       .type   _vmldACosHATab,@object
+       .size   _vmldACosHATab,4520
+       .space 88, 0x00         
+       .align 16
+.L_2il0floatpacket.199:
+       .long   0x00000000,0x80000000,0x00000000,0x00000000
+       .type   .L_2il0floatpacket.199,@object
+       .size   .L_2il0floatpacket.199,16
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_acosh_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_acosh_d_la.s
new file mode 100644 (file)
index 0000000..348ad7e
--- /dev/null
@@ -0,0 +1,893 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *
+ *  *   Compute log(x+sqrt(x*x-1)) using RSQRT14/RSQRT28 for starting the
+ *  *   square root approximation, and small table lookups for log (mapping to
+ *  *   AVX3 permute instructions).
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_acosh8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_acosh8
+
+__svml_acosh8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   256+__svml_dacosh_data_internal_avx512(%rip), %zmm5
+
+/* polynomial computation for small inputs */
+        vmovups   576+__svml_dacosh_data_internal_avx512(%rip), %zmm13
+        vmovups   640+__svml_dacosh_data_internal_avx512(%rip), %zmm14
+
+/*
+ * sqrt(1+x^2) ~ Sh + Sl + Sh*Eh*poly_s
+ * poly_s = c1+c2*Eh+c3*Eh^2
+ */
+        vmovups   704+__svml_dacosh_data_internal_avx512(%rip), %zmm1
+        vmovups   832+__svml_dacosh_data_internal_avx512(%rip), %zmm2
+        vmovups   896+__svml_dacosh_data_internal_avx512(%rip), %zmm6
+
+/* very large inputs ? */
+        vmovups   448+__svml_dacosh_data_internal_avx512(%rip), %zmm15
+
+/* out of range inputs? */
+        vmovups   512+__svml_dacosh_data_internal_avx512(%rip), %zmm3
+
+/* not a very small input ? */
+        vmovups   384+__svml_dacosh_data_internal_avx512(%rip), %zmm10
+        vmovaps   %zmm0, %zmm12
+
+/* x^2 - 1 */
+        vmovaps   %zmm5, %zmm11
+        vfmsub231pd {rn-sae}, %zmm12, %zmm12, %zmm11
+        vcmppd    $21, {sae}, %zmm15, %zmm12, %k2
+        vcmppd    $22, {sae}, %zmm3, %zmm12, %k0
+        vcmppd    $18, {sae}, %zmm5, %zmm12, %k1
+        vrsqrt14pd %zmm11, %zmm4
+        vcmppd    $21, {sae}, %zmm10, %zmm11, %k3
+        vfmadd231pd {rn-sae}, %zmm11, %zmm13, %zmm14
+        vmovups   768+__svml_dacosh_data_internal_avx512(%rip), %zmm13
+
+/* Sh ~sqrt(-1+x^2) */
+        vmulpd    {rn-sae}, %zmm4, %zmm11, %zmm9
+        vmulpd    {rn-sae}, %zmm11, %zmm14, %zmm8
+
+/* Sh+x */
+        vaddpd    {rn-sae}, %zmm12, %zmm9, %zmm15
+        kmovw     %k0, %edx
+        kmovw     %k1, %eax
+
+/* Shh */
+        vsubpd    {rn-sae}, %zmm12, %zmm15, %zmm14
+
+/* (Yh*R0)_low */
+        vmovaps   %zmm11, %zmm0
+        orl       %eax, %edx
+
+/* rel. error term: Eh=1-Sh*R0 */
+        vmovaps   %zmm5, %zmm7
+        vfmsub213pd {rn-sae}, %zmm9, %zmm4, %zmm0
+        vfnmadd231pd {rn-sae}, %zmm9, %zmm4, %zmm7
+
+/* rel. error term: Eh=(1-Sh*R0)-Sl*R0 */
+        vfnmadd231pd {rn-sae}, %zmm0, %zmm4, %zmm7
+
+/* Shl */
+        vsubpd    {rn-sae}, %zmm14, %zmm9, %zmm4
+        vmovups   1472+__svml_dacosh_data_internal_avx512(%rip), %zmm14
+        vfmadd231pd {rn-sae}, %zmm7, %zmm1, %zmm13
+        vfmadd213pd {rn-sae}, %zmm2, %zmm7, %zmm13
+        vfmadd213pd {rn-sae}, %zmm6, %zmm7, %zmm13
+
+/* Sh*Eh */
+        vmulpd    {rn-sae}, %zmm7, %zmm9, %zmm7
+
+/* Sl + Sh*Eh*poly_s */
+        vfmadd213pd {rn-sae}, %zmm0, %zmm13, %zmm7
+
+/* polynomials */
+        vmovups   1344+__svml_dacosh_data_internal_avx512(%rip), %zmm13
+
+/* polynomial computation for small inputs */
+        vaddpd    {rn-sae}, %zmm7, %zmm9, %zmm0
+
+/* Xin0+Sl+Sh*Eh*poly_s ~ x+sqrt(1+x^2) */
+        vaddpd    {rn-sae}, %zmm7, %zmm15, %zmm6
+        vfmadd231pd {rn-sae}, %zmm0, %zmm8, %zmm0
+
+/* fixup for very large inputs */
+        vmovups   1216+__svml_dacosh_data_internal_avx512(%rip), %zmm8
+
+/* Sl_high */
+        vsubpd    {rn-sae}, %zmm15, %zmm6, %zmm9
+        vmovups   1536+__svml_dacosh_data_internal_avx512(%rip), %zmm15
+        vmulpd    {rn-sae}, %zmm8, %zmm12, %zmm6{%k2}
+
+/* Sl_l */
+        vsubpd    {rn-sae}, %zmm9, %zmm7, %zmm3
+        vrcp14pd  %zmm6, %zmm1
+
+/* Xin_low */
+        vaddpd    {rn-sae}, %zmm4, %zmm3, %zmm7
+
+/* Table lookups */
+        vmovups   __svml_dacosh_data_internal_avx512(%rip), %zmm3
+
+/* round reciprocal to 1+4b mantissas */
+        vpaddq    1088+__svml_dacosh_data_internal_avx512(%rip), %zmm1, %zmm2
+
+/* fixup for very large inputs */
+        vxorpd    %zmm7, %zmm7, %zmm7{%k2}
+        vmovups   1408+__svml_dacosh_data_internal_avx512(%rip), %zmm1
+        vandpd    1152+__svml_dacosh_data_internal_avx512(%rip), %zmm2, %zmm8
+        vmovups   128+__svml_dacosh_data_internal_avx512(%rip), %zmm2
+
+/* Prepare table index */
+        vpsrlq    $48, %zmm8, %zmm9
+
+/* reduced argument for log(): (Rcp*Xin-1)+Rcp*Xin_low */
+        vfmsub231pd {rn-sae}, %zmm8, %zmm6, %zmm5
+
+/* exponents */
+        vgetexppd {sae}, %zmm8, %zmm4
+        vmovups   1280+__svml_dacosh_data_internal_avx512(%rip), %zmm6
+        vpermt2pd 64+__svml_dacosh_data_internal_avx512(%rip), %zmm9, %zmm3
+        vpermt2pd 192+__svml_dacosh_data_internal_avx512(%rip), %zmm9, %zmm2
+        vsubpd    {rn-sae}, %zmm6, %zmm4, %zmm4{%k2}
+        vfmadd231pd {rn-sae}, %zmm8, %zmm7, %zmm5
+        vmovups   1600+__svml_dacosh_data_internal_avx512(%rip), %zmm6
+        vmovups   1664+__svml_dacosh_data_internal_avx512(%rip), %zmm7
+
+/* -K*L2H + Th */
+        vmovups   1920+__svml_dacosh_data_internal_avx512(%rip), %zmm8
+
+/* -K*L2L + Tl */
+        vmovups   1984+__svml_dacosh_data_internal_avx512(%rip), %zmm9
+        vfmadd231pd {rn-sae}, %zmm5, %zmm13, %zmm1
+        vmovups   1792+__svml_dacosh_data_internal_avx512(%rip), %zmm13
+        vfnmadd231pd {rn-sae}, %zmm4, %zmm8, %zmm3
+        vfnmadd213pd {rn-sae}, %zmm2, %zmm9, %zmm4
+        vfmadd213pd {rn-sae}, %zmm14, %zmm5, %zmm1
+        vmovups   1728+__svml_dacosh_data_internal_avx512(%rip), %zmm2
+        vmovups   1856+__svml_dacosh_data_internal_avx512(%rip), %zmm14
+        vfmadd213pd {rn-sae}, %zmm15, %zmm5, %zmm1
+
+/* R^2 */
+        vmulpd    {rn-sae}, %zmm5, %zmm5, %zmm15
+        vfmadd213pd {rn-sae}, %zmm6, %zmm5, %zmm1
+        vfmadd213pd {rn-sae}, %zmm7, %zmm5, %zmm1
+        vfmadd213pd {rn-sae}, %zmm2, %zmm5, %zmm1
+        vfmadd213pd {rn-sae}, %zmm13, %zmm5, %zmm1
+        vfmadd213pd {rn-sae}, %zmm14, %zmm5, %zmm1
+
+/* Tl + R^2*Poly */
+        vfmadd213pd {rn-sae}, %zmm4, %zmm15, %zmm1
+
+/* R+Tl + R^2*Poly */
+        vaddpd    {rn-sae}, %zmm5, %zmm1, %zmm5
+        vaddpd    {rn-sae}, %zmm5, %zmm3, %zmm0{%k3}
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm12, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dacosh_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_acosh8,@function
+       .size   __svml_acosh8,.-__svml_acosh8
+..LN__svml_acosh8.0:
+
+.L_2__routine_start___svml_dacosh_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dacosh_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        movzwl    6(%rdi), %eax
+        andl      $32752, %eax
+        movsd     (%rdi), %xmm0
+        cmpl      $32752, %eax
+        je        .LBL_2_9
+
+.LBL_2_2:
+
+        movsd     %xmm0, -8(%rsp)
+
+
+        cmpl      $0, -8(%rsp)
+        jne       .LBL_2_8
+
+
+        cmpl      $1072693248, -4(%rsp)
+        je        .LBL_2_7
+
+
+        cmpl      $2146435072, -4(%rsp)
+        jne       .LBL_2_8
+
+
+        movsd     %xmm0, (%rsi)
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_7:
+
+        movq      8+__dacosh_la_CoutTab(%rip), %rax
+        movq      %rax, (%rsi)
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_8:
+
+        movsd     16+__dacosh_la_CoutTab(%rip), %xmm0
+        movl      $1, %eax
+        mulsd     8+__dacosh_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_9:
+
+        testl     $1048575, 4(%rdi)
+        jne       .LBL_2_12
+
+
+        cmpl      $0, (%rdi)
+        je        .LBL_2_2
+
+.LBL_2_12:
+
+        mulsd     %xmm0, %xmm0
+        xorl      %eax, %eax
+        movsd     %xmm0, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dacosh_cout_rare_internal,@function
+       .size   __svml_dacosh_cout_rare_internal,.-__svml_dacosh_cout_rare_internal
+..LN__svml_dacosh_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dacosh_data_internal_avx512:
+       .long   0
+       .long   0
+       .long   3222405120
+       .long   3215919664
+       .long   1848311808
+       .long   3216910087
+       .long   1890025472
+       .long   3217424176
+       .long   3348791296
+       .long   3217854455
+       .long   2880159744
+       .long   3218171740
+       .long   3256631296
+       .long   3218366859
+       .long   4139499520
+       .long   3218553303
+       .long   3971973120
+       .long   3218731811
+       .long   3348791296
+       .long   3218903031
+       .long   1605304320
+       .long   3219067535
+       .long   3827638272
+       .long   3219177074
+       .long   1584414720
+       .long   3219253343
+       .long   860823552
+       .long   3219326935
+       .long   3896934400
+       .long   3219398031
+       .long   643547136
+       .long   3219466797
+       .long   0
+       .long   0
+       .long   3496399314
+       .long   1028893491
+       .long   720371772
+       .long   1026176044
+       .long   1944193543
+       .long   3175338952
+       .long   634920691
+       .long   3175752108
+       .long   1664625295
+       .long   1029304828
+       .long   192624563
+       .long   3177103997
+       .long   3796653051
+       .long   3176138396
+       .long   3062724207
+       .long   3176680434
+       .long   634920691
+       .long   3176800684
+       .long   1913570380
+       .long   3174806221
+       .long   825194088
+       .long   3176465773
+       .long   2335489660
+       .long   3172599741
+       .long   2497625109
+       .long   1029604288
+       .long   914782743
+       .long   1029350199
+       .long   3743595607
+       .long   3175525305
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   0
+       .long   1055916032
+       .long   0
+       .long   1055916032
+       .long   0
+       .long   1055916032
+       .long   0
+       .long   1055916032
+       .long   0
+       .long   1055916032
+       .long   0
+       .long   1055916032
+       .long   0
+       .long   1055916032
+       .long   0
+       .long   1055916032
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .type   __svml_dacosh_data_internal_avx512,@object
+       .size   __svml_dacosh_data_internal_avx512,2048
+       .align 8
+__dacosh_la_CoutTab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   4293918720
+       .type   __dacosh_la_CoutTab,@object
+       .size   __dacosh_la_CoutTab,32
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_acosh_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_acosh_s_la.s
new file mode 100644 (file)
index 0000000..68f7a49
--- /dev/null
@@ -0,0 +1,687 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *
+ *  *   Compute log(x+sqrt(x*x-1)) using RSQRT14/RSQRT28 for starting the
+ *  *   square root approximation, and small table lookups for log (mapping to
+ *  *   AVX3 permute instructions).
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_acoshf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_acoshf16
+
+__svml_acoshf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   256+__svml_sacosh_data_internal_avx512(%rip), %zmm1
+
+/*
+ * sqrt(1+x^2) ~ Sh + Sl + Sh*Eh*poly_s
+ * poly_s = c1+c2*Eh
+ */
+        vmovups   640+__svml_sacosh_data_internal_avx512(%rip), %zmm13
+        vmovups   704+__svml_sacosh_data_internal_avx512(%rip), %zmm15
+
+/* polynomial computation for small inputs */
+        vmovups   576+__svml_sacosh_data_internal_avx512(%rip), %zmm9
+
+/* very large inputs ? */
+        vmovups   448+__svml_sacosh_data_internal_avx512(%rip), %zmm10
+
+/* out of range inputs? */
+        vmovups   512+__svml_sacosh_data_internal_avx512(%rip), %zmm11
+
+/* not a very small input ? */
+        vmovups   384+__svml_sacosh_data_internal_avx512(%rip), %zmm6
+        vmovaps   %zmm0, %zmm8
+
+/* x^2 - 1 */
+        vmovaps   %zmm1, %zmm7
+        vfmsub231ps {rn-sae}, %zmm8, %zmm8, %zmm7
+        vcmpps    $21, {sae}, %zmm10, %zmm8, %k2
+        vcmpps    $22, {sae}, %zmm11, %zmm8, %k0
+        vcmpps    $18, {sae}, %zmm1, %zmm8, %k1
+        vrsqrt14ps %zmm7, %zmm12
+        vcmpps    $21, {sae}, %zmm6, %zmm7, %k3
+        vmulps    {rn-sae}, %zmm9, %zmm7, %zmm4
+
+/* Sh ~sqrt(-1+x^2) */
+        vmulps    {rn-sae}, %zmm12, %zmm7, %zmm5
+        kmovw     %k0, %edx
+        kmovw     %k1, %eax
+
+/* Sh+x */
+        vaddps    {rn-sae}, %zmm8, %zmm5, %zmm9
+
+/* (Yh*R0)_low */
+        vmovaps   %zmm7, %zmm0
+        orl       %eax, %edx
+
+/* rel. error term: Eh=1-Sh*R0 */
+        vmovaps   %zmm1, %zmm14
+        vfmsub213ps {rn-sae}, %zmm5, %zmm12, %zmm0
+        vfnmadd231ps {rn-sae}, %zmm5, %zmm12, %zmm14
+
+/* rel. error term: Eh=(1-Sh*R0)-Sl*R0 */
+        vfnmadd231ps {rn-sae}, %zmm0, %zmm12, %zmm14
+
+/* Sh*Eh */
+        vmulps    {rn-sae}, %zmm14, %zmm5, %zmm3
+        vfmadd231ps {rn-sae}, %zmm14, %zmm13, %zmm15
+
+/* Sl + Sh*Eh*poly_s */
+        vfmadd213ps {rn-sae}, %zmm0, %zmm15, %zmm3
+
+/* Shh */
+        vsubps    {rn-sae}, %zmm8, %zmm9, %zmm15
+
+/* polynomial computation for small inputs */
+        vaddps    {rn-sae}, %zmm3, %zmm5, %zmm0
+
+/* Xin0+Sl+Sh*Eh*poly_s ~ x+sqrt(1+x^2) */
+        vaddps    {rn-sae}, %zmm3, %zmm9, %zmm2
+
+/* Shl */
+        vsubps    {rn-sae}, %zmm15, %zmm5, %zmm10
+        vfmadd231ps {rn-sae}, %zmm0, %zmm4, %zmm0
+
+/* fixup for very large inputs */
+        vmovups   896+__svml_sacosh_data_internal_avx512(%rip), %zmm4
+
+/* Sl_high */
+        vsubps    {rn-sae}, %zmm9, %zmm2, %zmm5
+
+/* polynomial */
+        vmovups   1024+__svml_sacosh_data_internal_avx512(%rip), %zmm9
+        vmulps    {rn-sae}, %zmm4, %zmm8, %zmm2{%k2}
+
+/* -K*L2L + Tl */
+        vmovups   1280+__svml_sacosh_data_internal_avx512(%rip), %zmm4
+
+/* Sl_l */
+        vsubps    {rn-sae}, %zmm5, %zmm3, %zmm3
+        vrcp14ps  %zmm2, %zmm11
+        vmovups   128+__svml_sacosh_data_internal_avx512(%rip), %zmm5
+
+/* Xin_low */
+        vaddps    {rn-sae}, %zmm10, %zmm3, %zmm13
+
+/* round reciprocal to 1+4b mantissas */
+        vpaddd    768+__svml_sacosh_data_internal_avx512(%rip), %zmm11, %zmm12
+        vmovups   1152+__svml_sacosh_data_internal_avx512(%rip), %zmm10
+        vandps    832+__svml_sacosh_data_internal_avx512(%rip), %zmm12, %zmm14
+
+/* fixup for very large inputs */
+        vxorps    %zmm13, %zmm13, %zmm13{%k2}
+
+/* reduced argument for log(): (Rcp*Xin-1)+Rcp*Xin_low */
+        vfmsub231ps {rn-sae}, %zmm14, %zmm2, %zmm1
+
+/* exponents */
+        vgetexpps {sae}, %zmm14, %zmm12
+        vmovups   960+__svml_sacosh_data_internal_avx512(%rip), %zmm2
+
+/* Prepare table index */
+        vpsrld    $18, %zmm14, %zmm3
+        vfmadd231ps {rn-sae}, %zmm14, %zmm13, %zmm1
+        vmovups   1088+__svml_sacosh_data_internal_avx512(%rip), %zmm13
+
+/* Table lookups */
+        vmovups   __svml_sacosh_data_internal_avx512(%rip), %zmm14
+        vsubps    {rn-sae}, %zmm2, %zmm12, %zmm12{%k2}
+        vpermt2ps 192+__svml_sacosh_data_internal_avx512(%rip), %zmm3, %zmm5
+        vpermt2ps 64+__svml_sacosh_data_internal_avx512(%rip), %zmm3, %zmm14
+
+/* R^2 */
+        vmulps    {rn-sae}, %zmm1, %zmm1, %zmm11
+
+/* -K*L2H + Th */
+        vmovups   1216+__svml_sacosh_data_internal_avx512(%rip), %zmm2
+        vfmadd231ps {rn-sae}, %zmm1, %zmm9, %zmm13
+        vfnmadd231ps {rn-sae}, %zmm12, %zmm2, %zmm14
+        vfnmadd213ps {rn-sae}, %zmm5, %zmm4, %zmm12
+        vfmadd213ps {rn-sae}, %zmm10, %zmm1, %zmm13
+
+/* Tl + R^2*Poly */
+        vfmadd213ps {rn-sae}, %zmm12, %zmm11, %zmm13
+
+/* R+Tl + R^2*Poly */
+        vaddps    {rn-sae}, %zmm1, %zmm13, %zmm1
+        vaddps    {rn-sae}, %zmm1, %zmm14, %zmm0{%k3}
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm8, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_sacosh_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_acoshf16,@function
+       .size   __svml_acoshf16,.-__svml_acoshf16
+..LN__svml_acoshf16.0:
+
+.L_2__routine_start___svml_sacosh_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_sacosh_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        movl      (%rdi), %eax
+        movl      %eax, -8(%rsp)
+        andl      $2139095040, %eax
+        cmpl      $2139095040, %eax
+        je        .LBL_2_8
+
+.LBL_2_2:
+
+        movl      -8(%rsp), %eax
+        cmpl      $1065353216, %eax
+        je        .LBL_2_7
+
+
+        cmpl      $2139095040, %eax
+        jne       .LBL_2_5
+
+
+        movl      8+__sacosh_la__iml_sacosh_cout_tab(%rip), %eax
+        movl      %eax, (%rsi)
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_5:
+
+        movss     8+__sacosh_la__iml_sacosh_cout_tab(%rip), %xmm0
+        movl      $1, %eax
+        mulss     4+__sacosh_la__iml_sacosh_cout_tab(%rip), %xmm0
+        movss     %xmm0, (%rsi)
+
+
+        ret
+
+.LBL_2_7:
+
+        movl      4+__sacosh_la__iml_sacosh_cout_tab(%rip), %eax
+        movl      %eax, (%rsi)
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_8:
+
+        testl     $8388607, -8(%rsp)
+        je        .LBL_2_2
+
+
+        movss     -8(%rsp), %xmm0
+        xorl      %eax, %eax
+        mulss     -8(%rsp), %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_sacosh_cout_rare_internal,@function
+       .size   __svml_sacosh_cout_rare_internal,.-__svml_sacosh_cout_rare_internal
+..LN__svml_sacosh_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_sacosh_data_internal_avx512:
+       .long   0
+       .long   3170631680
+       .long   3178790912
+       .long   3182919680
+       .long   3186704384
+       .long   3189022720
+       .long   3190816768
+       .long   3192561664
+       .long   3194257408
+       .long   3195912192
+       .long   3196796928
+       .long   3197583360
+       .long   3198357504
+       .long   3199111168
+       .long   3199848448
+       .long   3200569344
+       .long   3201277952
+       .long   3201966080
+       .long   3202646016
+       .long   3203309568
+       .long   3203960832
+       .long   3204524032
+       .long   3204837376
+       .long   3205146624
+       .long   3205447680
+       .long   3205744640
+       .long   3206037504
+       .long   3206324224
+       .long   3206606848
+       .long   3206883328
+       .long   3207155712
+       .long   3207424000
+       .long   2147483648
+       .long   3072770974
+       .long   943319038
+       .long   3075640037
+       .long   930648533
+       .long   3089726480
+       .long   936349528
+       .long   944943494
+       .long   897812054
+       .long   3087808175
+       .long   941839444
+       .long   3093478113
+       .long   937982919
+       .long   931430736
+       .long   924853521
+       .long   3075349253
+       .long   945558336
+       .long   3094838221
+       .long   906200662
+       .long   3084126596
+       .long   3088015279
+       .long   3089451852
+       .long   3093678154
+       .long   938521645
+       .long   3091119329
+       .long   3090949395
+       .long   933442244
+       .long   930702671
+       .long   945827699
+       .long   913590776
+       .long   3082066287
+       .long   3087046763
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .type   __svml_sacosh_data_internal_avx512,@object
+       .size   __svml_sacosh_data_internal_avx512,1344
+       .align 4
+__sacosh_la__iml_sacosh_cout_tab:
+       .long   1065353216
+       .long   0
+       .long   2139095040
+       .type   __sacosh_la__iml_sacosh_cout_tab,@object
+       .size   __sacosh_la__iml_sacosh_cout_tab,12
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_asin_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_asin_d_la.s
new file mode 100644 (file)
index 0000000..09b6ce3
--- /dev/null
@@ -0,0 +1,2553 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+
+       .text
+.L_2__routine_start___svml_asin8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_asin8
+
+__svml_asin8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   64+__svml_dasin_data_internal(%rip), %zmm8
+
+/* S ~ -2*sqrt(Y) */
+        vmovups   128+__svml_dasin_data_internal(%rip), %zmm10
+        vmovups   384+__svml_dasin_data_internal(%rip), %zmm14
+        vmovups   448+__svml_dasin_data_internal(%rip), %zmm15
+        vmovups   512+__svml_dasin_data_internal(%rip), %zmm2
+        vmovups   576+__svml_dasin_data_internal(%rip), %zmm1
+        vmovups   256+__svml_dasin_data_internal(%rip), %zmm9
+        vmovaps   %zmm0, %zmm6
+
+/* x = |arg| */
+        vandpd    __svml_dasin_data_internal(%rip), %zmm6, %zmm4
+
+/* Y = 0.5 - 0.5*x */
+        vmovaps   %zmm8, %zmm11
+        vfnmadd231pd {rn-sae}, %zmm4, %zmm8, %zmm11
+
+/* x^2 */
+        vmulpd    {rn-sae}, %zmm4, %zmm4, %zmm7
+        vrsqrt14pd %zmm11, %zmm12
+        vcmppd    $17, {sae}, %zmm10, %zmm11, %k1
+        vcmppd    $21, {sae}, %zmm8, %zmm4, %k2
+        vcmppd    $17, {sae}, %zmm4, %zmm9, %k0
+        vmovups   960+__svml_dasin_data_internal(%rip), %zmm10
+
+/* polynomial */
+        vmovups   704+__svml_dasin_data_internal(%rip), %zmm8
+        vmovups   832+__svml_dasin_data_internal(%rip), %zmm9
+        vminpd    {sae}, %zmm11, %zmm7, %zmm3
+        vxorpd    %zmm12, %zmm12, %zmm12{%k1}
+        vaddpd    {rn-sae}, %zmm11, %zmm11, %zmm0
+        vxorpd    %zmm6, %zmm4, %zmm5
+        vmulpd    {rn-sae}, %zmm12, %zmm12, %zmm13
+        vmulpd    {rn-sae}, %zmm12, %zmm0, %zmm7
+        vmovups   1088+__svml_dasin_data_internal(%rip), %zmm11
+        vmovups   896+__svml_dasin_data_internal(%rip), %zmm12
+        vfmsub213pd {rn-sae}, %zmm14, %zmm13, %zmm0
+        vmovups   640+__svml_dasin_data_internal(%rip), %zmm13
+        vfmadd231pd {rn-sae}, %zmm3, %zmm9, %zmm12
+        vmovups   1344+__svml_dasin_data_internal(%rip), %zmm9
+        vfmadd231pd {rn-sae}, %zmm0, %zmm15, %zmm2
+        vmovups   1216+__svml_dasin_data_internal(%rip), %zmm15
+        vmulpd    {rn-sae}, %zmm0, %zmm7, %zmm14
+        vfmadd213pd {rn-sae}, %zmm1, %zmm0, %zmm2
+        vmovups   768+__svml_dasin_data_internal(%rip), %zmm1
+        kmovw     %k0, %edx
+        vfmadd213pd {rn-sae}, %zmm13, %zmm0, %zmm2
+        vfmadd231pd {rn-sae}, %zmm3, %zmm8, %zmm1
+        vmovups   1280+__svml_dasin_data_internal(%rip), %zmm8
+        vmulpd    {rn-sae}, %zmm3, %zmm3, %zmm0
+        vfmsub213pd {rn-sae}, %zmm7, %zmm14, %zmm2
+        vmovups   1024+__svml_dasin_data_internal(%rip), %zmm7
+        vfmadd231pd {rn-sae}, %zmm3, %zmm15, %zmm8
+        vfmadd213pd {rn-sae}, %zmm12, %zmm0, %zmm1
+        vblendmpd %zmm2, %zmm4, %zmm2{%k2}
+        vfmadd231pd {rn-sae}, %zmm3, %zmm10, %zmm7
+        vmovups   1152+__svml_dasin_data_internal(%rip), %zmm10
+        vmovups   1472+__svml_dasin_data_internal(%rip), %zmm4
+        vfmadd231pd {rn-sae}, %zmm3, %zmm11, %zmm10
+        vmovups   1408+__svml_dasin_data_internal(%rip), %zmm11
+        vfmadd213pd {rn-sae}, %zmm10, %zmm0, %zmm7
+        vfmadd231pd {rn-sae}, %zmm3, %zmm9, %zmm11
+        vmulpd    {rn-sae}, %zmm0, %zmm0, %zmm10
+        vfmadd213pd {rn-sae}, %zmm7, %zmm10, %zmm1
+        vfmadd213pd {rn-sae}, %zmm8, %zmm0, %zmm1
+        vfmadd213pd {rn-sae}, %zmm11, %zmm0, %zmm1
+        vmulpd    {rn-sae}, %zmm3, %zmm1, %zmm3
+        vfmadd213pd {rn-sae}, %zmm2, %zmm2, %zmm3
+        vaddpd    {rn-sae}, %zmm4, %zmm3, %zmm3{%k2}
+        vxorpd    %zmm5, %zmm3, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm6, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dasin_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_asin8,@function
+       .size   __svml_asin8,.-__svml_asin8
+..LN__svml_asin8.0:
+
+.L_2__routine_start___svml_dasin_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dasin_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    6(%rdi), %edx
+        andl      $32752, %edx
+        cmpl      $32752, %edx
+        je        .LBL_2_12
+
+
+        movq      (%rdi), %rdx
+        movq      %rdx, -32(%rsp)
+        shrq      $56, %rdx
+        movsd     4160+_vmldASinHATab(%rip), %xmm0
+        andl      $127, %edx
+        movb      %dl, -25(%rsp)
+        movsd     -32(%rsp), %xmm12
+        comisd    %xmm12, %xmm0
+        jb        .LBL_2_10
+
+
+        movsd     4168+_vmldASinHATab(%rip), %xmm1
+        comisd    %xmm12, %xmm1
+        jbe       .LBL_2_9
+
+
+        comisd    4136+_vmldASinHATab(%rip), %xmm12
+        jbe       .LBL_2_6
+
+
+        movsd     4104+_vmldASinHATab(%rip), %xmm13
+        movaps    %xmm12, %xmm5
+        mulsd     %xmm12, %xmm13
+        movaps    %xmm12, %xmm7
+        movsd     %xmm13, -48(%rsp)
+        movsd     -48(%rsp), %xmm14
+        movsd     4104+_vmldASinHATab(%rip), %xmm1
+        subsd     -32(%rsp), %xmm14
+        movsd     %xmm14, -56(%rsp)
+        movsd     -48(%rsp), %xmm8
+        movsd     -56(%rsp), %xmm15
+        subsd     %xmm15, %xmm8
+        movsd     %xmm8, -48(%rsp)
+        movsd     -48(%rsp), %xmm6
+        movsd     4296+_vmldASinHATab(%rip), %xmm8
+        subsd     %xmm6, %xmm5
+        movsd     %xmm5, -56(%rsp)
+        movaps    %xmm12, %xmm5
+        movsd     -48(%rsp), %xmm9
+        movaps    %xmm9, %xmm13
+        addsd     %xmm9, %xmm7
+        mulsd     %xmm9, %xmm13
+        movsd     -56(%rsp), %xmm11
+        movaps    %xmm13, %xmm10
+        mulsd     %xmm11, %xmm7
+        mulsd     %xmm13, %xmm1
+        addsd     %xmm7, %xmm10
+        mulsd     %xmm10, %xmm8
+        movsd     %xmm1, -48(%rsp)
+        movsd     -48(%rsp), %xmm2
+        movsd     4104+_vmldASinHATab(%rip), %xmm1
+        subsd     %xmm13, %xmm2
+        addsd     4288+_vmldASinHATab(%rip), %xmm8
+        mulsd     %xmm10, %xmm8
+        movsd     %xmm2, -56(%rsp)
+        movsd     -48(%rsp), %xmm3
+        movsd     -56(%rsp), %xmm0
+        addsd     4280+_vmldASinHATab(%rip), %xmm8
+        subsd     %xmm0, %xmm3
+        mulsd     %xmm10, %xmm8
+        movsd     %xmm3, -48(%rsp)
+        movsd     -48(%rsp), %xmm4
+        addsd     4272+_vmldASinHATab(%rip), %xmm8
+        subsd     %xmm4, %xmm13
+        mulsd     %xmm10, %xmm8
+        movsd     %xmm13, -56(%rsp)
+        movsd     -48(%rsp), %xmm6
+        mulsd     %xmm6, %xmm9
+        addsd     4264+_vmldASinHATab(%rip), %xmm8
+        mulsd     %xmm6, %xmm11
+        mulsd     %xmm10, %xmm8
+        mulsd     %xmm9, %xmm1
+        addsd     4256+_vmldASinHATab(%rip), %xmm8
+        mulsd     %xmm10, %xmm8
+        movaps    %xmm9, %xmm3
+        movsd     -56(%rsp), %xmm14
+        movaps    %xmm6, %xmm4
+        movsd     %xmm1, -48(%rsp)
+        addsd     %xmm14, %xmm7
+        addsd     4248+_vmldASinHATab(%rip), %xmm8
+        mulsd     %xmm7, %xmm5
+        mulsd     %xmm10, %xmm8
+        addsd     %xmm5, %xmm11
+        addsd     4240+_vmldASinHATab(%rip), %xmm8
+        movsd     -48(%rsp), %xmm2
+        mulsd     %xmm10, %xmm8
+        subsd     %xmm9, %xmm2
+        addsd     %xmm11, %xmm9
+        addsd     4232+_vmldASinHATab(%rip), %xmm8
+        mulsd     %xmm9, %xmm7
+        mulsd     %xmm10, %xmm8
+        movsd     %xmm2, -56(%rsp)
+        movsd     -48(%rsp), %xmm0
+        movsd     -56(%rsp), %xmm15
+        subsd     %xmm15, %xmm0
+        addsd     4224+_vmldASinHATab(%rip), %xmm8
+        movsd     %xmm0, -48(%rsp)
+        movsd     -48(%rsp), %xmm5
+        mulsd     %xmm10, %xmm8
+        subsd     %xmm5, %xmm3
+        movsd     %xmm3, -56(%rsp)
+        movsd     -48(%rsp), %xmm3
+        movsd     -56(%rsp), %xmm5
+        movaps    %xmm5, %xmm13
+        addsd     4216+_vmldASinHATab(%rip), %xmm8
+        mulsd     %xmm3, %xmm4
+        addsd     %xmm11, %xmm13
+        mulsd     %xmm10, %xmm8
+        mulsd     %xmm13, %xmm6
+        addsd     4208+_vmldASinHATab(%rip), %xmm8
+        addsd     %xmm7, %xmm6
+        mulsd     %xmm10, %xmm8
+        movsd     4104+_vmldASinHATab(%rip), %xmm7
+        movaps    %xmm4, %xmm13
+        mulsd     %xmm4, %xmm7
+        addsd     4200+_vmldASinHATab(%rip), %xmm8
+        movsd     %xmm7, -48(%rsp)
+        movsd     -48(%rsp), %xmm1
+        movsd     4184+_vmldASinHATab(%rip), %xmm10
+        subsd     %xmm4, %xmm1
+        mulsd     %xmm9, %xmm10
+        addsd     %xmm6, %xmm4
+        movsd     %xmm1, -56(%rsp)
+        movaps    %xmm12, %xmm9
+        movsd     -48(%rsp), %xmm0
+        movsd     -56(%rsp), %xmm2
+        movsd     4176+_vmldASinHATab(%rip), %xmm1
+        subsd     %xmm2, %xmm0
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm1, %xmm11
+        mulsd     %xmm4, %xmm8
+        addsd     %xmm3, %xmm9
+        mulsd     %xmm1, %xmm5
+        addsd     %xmm11, %xmm10
+        movsd     %xmm0, -48(%rsp)
+        addsd     %xmm10, %xmm8
+        movsd     -48(%rsp), %xmm7
+        addsd     %xmm5, %xmm8
+        subsd     %xmm7, %xmm13
+        movsd     %xmm13, -56(%rsp)
+        movsd     -48(%rsp), %xmm0
+        movsd     -56(%rsp), %xmm2
+        movsd     %xmm9, -48(%rsp)
+        addsd     %xmm2, %xmm6
+        movsd     -48(%rsp), %xmm11
+        movsd     4192+_vmldASinHATab(%rip), %xmm4
+        subsd     %xmm11, %xmm12
+        mulsd     %xmm4, %xmm0
+        mulsd     %xmm4, %xmm6
+        addsd     %xmm12, %xmm3
+        movsd     %xmm3, -56(%rsp)
+        movsd     -48(%rsp), %xmm3
+        movaps    %xmm3, %xmm12
+        movsd     -56(%rsp), %xmm7
+        addsd     %xmm0, %xmm12
+        addsd     %xmm7, %xmm8
+        movsd     %xmm12, -48(%rsp)
+        movsd     -48(%rsp), %xmm12
+        subsd     %xmm12, %xmm3
+        addsd     %xmm3, %xmm0
+        movsd     %xmm0, -56(%rsp)
+        movsd     -48(%rsp), %xmm9
+        movsd     -56(%rsp), %xmm0
+        movb      7(%rdi), %dil
+        addsd     %xmm0, %xmm8
+        andb      $-128, %dil
+        addsd     %xmm8, %xmm9
+        addsd     %xmm9, %xmm6
+        movsd     %xmm6, -40(%rsp)
+        movb      -33(%rsp), %dl
+        andb      $127, %dl
+        orb       %dil, %dl
+        movb      %dl, -33(%rsp)
+        movq      -40(%rsp), %rcx
+        movq      %rcx, (%rsi)
+        ret
+
+.LBL_2_6:
+
+        comisd    4128+_vmldASinHATab(%rip), %xmm12
+        jb        .LBL_2_8
+
+
+        addsd     %xmm0, %xmm12
+        movsd     %xmm12, -48(%rsp)
+        movsd     -48(%rsp), %xmm0
+        mulsd     -32(%rsp), %xmm0
+        movsd     %xmm0, -40(%rsp)
+        movb      -33(%rsp), %dl
+        movb      7(%rdi), %dil
+        andb      $127, %dl
+        andb      $-128, %dil
+        orb       %dil, %dl
+        movb      %dl, -33(%rsp)
+        movq      -40(%rsp), %rcx
+        movq      %rcx, (%rsi)
+        ret
+
+.LBL_2_8:
+
+        mulsd     %xmm12, %xmm12
+        movsd     %xmm12, -48(%rsp)
+        movsd     -48(%rsp), %xmm0
+        movb      7(%rdi), %dil
+        andb      $-128, %dil
+        addsd     -32(%rsp), %xmm0
+        movsd     %xmm0, -40(%rsp)
+        movb      -33(%rsp), %dl
+        andb      $127, %dl
+        orb       %dil, %dl
+        movb      %dl, -33(%rsp)
+        movq      -40(%rsp), %rcx
+        movq      %rcx, (%rsi)
+        ret
+
+.LBL_2_9:
+
+        movaps    %xmm0, %xmm9
+        movzwl    4166+_vmldASinHATab(%rip), %r9d
+        pxor      %xmm15, %xmm15
+        andl      $-32753, %r9d
+        subsd     %xmm12, %xmm9
+        subsd     %xmm0, %xmm15
+        mulsd     %xmm9, %xmm1
+        movsd     %xmm1, -32(%rsp)
+        movzwl    -26(%rsp), %ecx
+        andl      $32752, %ecx
+        shrl      $4, %ecx
+        addl      $-1023, %ecx
+        movl      %ecx, %r8d
+        movl      %ecx, %edx
+        negl      %r8d
+        addl      $1023, %r8d
+        andl      $2047, %r8d
+        shll      $4, %r8d
+        movsd     %xmm0, -24(%rsp)
+        orl       %r8d, %r9d
+        movw      %r9w, -18(%rsp)
+        andl      $1, %edx
+        movsd     -24(%rsp), %xmm10
+        movl      %edx, %r10d
+        mulsd     %xmm10, %xmm1
+        lea       _vmldASinHATab(%rip), %r8
+        movaps    %xmm1, %xmm6
+        movsd     4112+_vmldASinHATab(%rip), %xmm7
+        addsd     %xmm1, %xmm6
+        jne       ..L54
+        movaps    %xmm1, %xmm6
+..L54:
+        mulsd     %xmm6, %xmm7
+        movaps    %xmm6, %xmm8
+        movaps    %xmm7, %xmm11
+        subl      %edx, %ecx
+        movsd     4120+_vmldASinHATab(%rip), %xmm13
+        subsd     %xmm6, %xmm11
+        addsd     %xmm1, %xmm13
+        movsd     %xmm11, -56(%rsp)
+        movsd     -56(%rsp), %xmm12
+        movsd     %xmm13, -16(%rsp)
+        subsd     %xmm12, %xmm7
+        movl      -16(%rsp), %r11d
+        movaps    %xmm7, %xmm4
+        shll      $8, %r10d
+        andl      $511, %r11d
+        addl      %r10d, %r11d
+        subsd     %xmm7, %xmm8
+        movsd     (%r8,%r11,8), %xmm3
+        addsd     %xmm8, %xmm4
+        mulsd     %xmm3, %xmm7
+        movaps    %xmm3, %xmm14
+        mulsd     %xmm3, %xmm14
+        mulsd     %xmm14, %xmm4
+        movsd     4496+_vmldASinHATab(%rip), %xmm5
+        addsd     %xmm15, %xmm4
+        mulsd     %xmm4, %xmm5
+        shrl      $1, %ecx
+        addsd     4488+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        addl      $1023, %ecx
+        andl      $2047, %ecx
+        addsd     4480+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        movzwl    4166+_vmldASinHATab(%rip), %r9d
+        shll      $4, %ecx
+        andl      $-32753, %r9d
+        movsd     %xmm0, -8(%rsp)
+        orl       %ecx, %r9d
+        movw      %r9w, -2(%rsp)
+        movsd     -8(%rsp), %xmm12
+        mulsd     %xmm12, %xmm7
+        addsd     4472+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        movsd     4104+_vmldASinHATab(%rip), %xmm1
+        mulsd     %xmm7, %xmm1
+        addsd     4464+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        movsd     %xmm1, -48(%rsp)
+        movsd     -48(%rsp), %xmm0
+        movsd     4336+_vmldASinHATab(%rip), %xmm13
+        subsd     %xmm7, %xmm0
+        addsd     4456+_vmldASinHATab(%rip), %xmm5
+        addsd     4344+_vmldASinHATab(%rip), %xmm13
+        mulsd     %xmm4, %xmm5
+        mulsd     %xmm9, %xmm13
+        addsd     4448+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        mulsd     %xmm6, %xmm5
+        movsd     %xmm0, -56(%rsp)
+        addsd     %xmm5, %xmm8
+        movsd     4440+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        mulsd     %xmm3, %xmm8
+        addsd     4432+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm12, %xmm8
+        mulsd     %xmm9, %xmm5
+        movsd     -48(%rsp), %xmm10
+        movsd     -56(%rsp), %xmm2
+        movsd     4320+_vmldASinHATab(%rip), %xmm14
+        subsd     %xmm2, %xmm10
+        addsd     4424+_vmldASinHATab(%rip), %xmm5
+        addsd     4328+_vmldASinHATab(%rip), %xmm14
+        mulsd     %xmm9, %xmm5
+        addsd     %xmm13, %xmm14
+        addsd     4416+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm14
+        mulsd     %xmm9, %xmm5
+        movsd     %xmm10, -48(%rsp)
+        movaps    %xmm9, %xmm2
+        movsd     -48(%rsp), %xmm11
+        movsd     4104+_vmldASinHATab(%rip), %xmm3
+        subsd     %xmm11, %xmm7
+        mulsd     %xmm9, %xmm3
+        addsd     4408+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        movsd     4304+_vmldASinHATab(%rip), %xmm4
+        movsd     %xmm7, -56(%rsp)
+        movsd     -48(%rsp), %xmm6
+        movsd     -56(%rsp), %xmm7
+        movsd     %xmm3, -48(%rsp)
+        addsd     %xmm7, %xmm8
+        addsd     4400+_vmldASinHATab(%rip), %xmm5
+        addsd     4312+_vmldASinHATab(%rip), %xmm4
+        mulsd     %xmm9, %xmm5
+        addsd     %xmm14, %xmm4
+        addsd     4392+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        movsd     -48(%rsp), %xmm1
+        movsd     4104+_vmldASinHATab(%rip), %xmm7
+        subsd     %xmm9, %xmm1
+        addsd     4384+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        movsd     %xmm1, -56(%rsp)
+        movsd     -48(%rsp), %xmm0
+        movsd     -56(%rsp), %xmm15
+        addsd     4376+_vmldASinHATab(%rip), %xmm5
+        subsd     %xmm15, %xmm0
+        mulsd     %xmm9, %xmm5
+        movsd     %xmm0, -48(%rsp)
+        movsd     4320+_vmldASinHATab(%rip), %xmm0
+        addsd     4368+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        addsd     4360+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        addsd     4352+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        mulsd     %xmm9, %xmm5
+        mulsd     %xmm9, %xmm5
+        addsd     %xmm5, %xmm4
+        mulsd     %xmm4, %xmm8
+        movsd     -48(%rsp), %xmm4
+        subsd     %xmm4, %xmm2
+        movsd     %xmm2, -56(%rsp)
+        movsd     -48(%rsp), %xmm4
+        movaps    %xmm4, %xmm13
+        mulsd     %xmm4, %xmm13
+        mulsd     %xmm4, %xmm0
+        addsd     %xmm9, %xmm4
+        mulsd     %xmm13, %xmm7
+        movsd     -56(%rsp), %xmm3
+        movsd     %xmm7, -48(%rsp)
+        movsd     -48(%rsp), %xmm10
+        mulsd     %xmm3, %xmm4
+        subsd     %xmm13, %xmm10
+        movsd     %xmm10, -56(%rsp)
+        movsd     -48(%rsp), %xmm11
+        movsd     -56(%rsp), %xmm1
+        movsd     4304+_vmldASinHATab(%rip), %xmm10
+        subsd     %xmm1, %xmm11
+        movsd     %xmm11, -48(%rsp)
+        movaps    %xmm0, %xmm1
+        movsd     -48(%rsp), %xmm12
+        movsd     4304+_vmldASinHATab(%rip), %xmm11
+        subsd     %xmm12, %xmm13
+        movsd     %xmm13, -56(%rsp)
+        movsd     -48(%rsp), %xmm7
+        mulsd     4336+_vmldASinHATab(%rip), %xmm7
+        movsd     -56(%rsp), %xmm2
+        addsd     %xmm7, %xmm1
+        addsd     %xmm2, %xmm4
+        movsd     %xmm1, -48(%rsp)
+        movsd     -48(%rsp), %xmm14
+        movsd     %xmm7, -16(%rsp)
+        subsd     %xmm14, %xmm0
+        mulsd     4336+_vmldASinHATab(%rip), %xmm4
+        addsd     %xmm0, %xmm7
+        movsd     %xmm7, -56(%rsp)
+        movsd     -48(%rsp), %xmm12
+        movsd     -56(%rsp), %xmm1
+        addsd     %xmm12, %xmm10
+        movsd     %xmm10, -48(%rsp)
+        movsd     -48(%rsp), %xmm15
+        movsd     4104+_vmldASinHATab(%rip), %xmm7
+        subsd     %xmm15, %xmm11
+        movsd     4320+_vmldASinHATab(%rip), %xmm2
+        addsd     %xmm11, %xmm12
+        mulsd     %xmm3, %xmm2
+        movsd     %xmm12, -56(%rsp)
+        movsd     -48(%rsp), %xmm15
+        mulsd     %xmm15, %xmm7
+        movsd     -56(%rsp), %xmm0
+        movsd     %xmm7, -48(%rsp)
+        movsd     -48(%rsp), %xmm10
+        movsd     4344+_vmldASinHATab(%rip), %xmm3
+        subsd     %xmm15, %xmm10
+        mulsd     %xmm9, %xmm3
+        movsd     %xmm10, -56(%rsp)
+        movsd     -48(%rsp), %xmm11
+        movsd     -56(%rsp), %xmm13
+        subsd     %xmm13, %xmm11
+        addsd     4328+_vmldASinHATab(%rip), %xmm3
+        movsd     %xmm11, -48(%rsp)
+        movsd     -48(%rsp), %xmm14
+        mulsd     %xmm9, %xmm3
+        subsd     %xmm14, %xmm15
+        movsd     %xmm15, -56(%rsp)
+        movsd     -48(%rsp), %xmm10
+        movsd     -56(%rsp), %xmm7
+        addsd     %xmm7, %xmm4
+        addsd     4312+_vmldASinHATab(%rip), %xmm3
+        addsd     %xmm2, %xmm4
+        addsd     %xmm5, %xmm3
+        addsd     %xmm1, %xmm4
+        addsd     %xmm0, %xmm4
+        movsd     4144+_vmldASinHATab(%rip), %xmm0
+        addsd     %xmm3, %xmm4
+        mulsd     %xmm6, %xmm4
+        mulsd     %xmm10, %xmm6
+        addsd     %xmm8, %xmm4
+        movaps    %xmm0, %xmm8
+        subsd     %xmm6, %xmm8
+        movsd     %xmm8, -48(%rsp)
+        movsd     -48(%rsp), %xmm9
+        subsd     %xmm9, %xmm0
+        subsd     %xmm6, %xmm0
+        movsd     %xmm0, -56(%rsp)
+        movsd     -48(%rsp), %xmm2
+        movsd     -56(%rsp), %xmm1
+        movb      7(%rdi), %dil
+        andb      $-128, %dil
+        addsd     4152+_vmldASinHATab(%rip), %xmm1
+        subsd     %xmm4, %xmm1
+        addsd     %xmm1, %xmm2
+        movsd     %xmm2, -40(%rsp)
+        movb      -33(%rsp), %dl
+        andb      $127, %dl
+        orb       %dil, %dl
+        movb      %dl, -33(%rsp)
+        movq      -40(%rsp), %rcx
+        movq      %rcx, (%rsi)
+        ret
+
+.LBL_2_10:
+
+        movl      $1, %eax
+        pxor      %xmm1, %xmm1
+        pxor      %xmm0, %xmm0
+        divsd     %xmm0, %xmm1
+        movsd     %xmm1, (%rsi)
+
+.LBL_2_11:
+
+        ret
+
+.LBL_2_12:
+
+        movsd     (%rdi), %xmm0
+        divsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        testl     $1048575, 4(%rdi)
+        jne       .LBL_2_11
+
+
+        cmpl      $0, (%rdi)
+        sete      %al
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dasin_cout_rare_internal,@function
+       .size   __svml_dasin_cout_rare_internal,.-__svml_dasin_cout_rare_internal
+..LN__svml_dasin_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dasin_data_internal:
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   805306368
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   4294967040
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   4227858432
+       .long   4294967295
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1073741824
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   2570790083
+       .long   3213983744
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   1869665325
+       .long   1067712512
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294966935
+       .long   3216506879
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   4294967197
+       .long   1070596095
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   3339630857
+       .long   1067480352
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   4158370029
+       .long   3213949719
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   3216784302
+       .long   1066680132
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   2513723093
+       .long   1064982579
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   721210070
+       .long   1065941212
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   3414736215
+       .long   1066167739
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   4114132270
+       .long   1066518236
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3957258973
+       .long   1066854556
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3778730174
+       .long   1067392114
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   3014936056
+       .long   1067899757
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   859300062
+       .long   1068708659
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1431655068
+       .long   1069897045
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   0
+       .long   4294705152
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   4131758366
+       .long   1067674714
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   3936260738
+       .long   1066197319
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   354394453
+       .long   1067472564
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   709676628
+       .long   1067895021
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   3958922090
+       .long   1068708761
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   2160605765
+       .long   1069897044
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   4293918720
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   3220176896
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2147483648
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .type   __svml_dasin_data_internal,@object
+       .size   __svml_dasin_data_internal,2368
+       .align 32
+_vmldASinHATab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072689152
+       .long   0
+       .long   1072685056
+       .long   0
+       .long   1072680960
+       .long   0
+       .long   1072676864
+       .long   0
+       .long   1072672768
+       .long   0
+       .long   1072668672
+       .long   0
+       .long   1072665600
+       .long   0
+       .long   1072661504
+       .long   0
+       .long   1072657408
+       .long   0
+       .long   1072653312
+       .long   0
+       .long   1072649216
+       .long   0
+       .long   1072646144
+       .long   0
+       .long   1072642048
+       .long   0
+       .long   1072637952
+       .long   0
+       .long   1072634880
+       .long   0
+       .long   1072630784
+       .long   0
+       .long   1072626688
+       .long   0
+       .long   1072623616
+       .long   0
+       .long   1072619520
+       .long   0
+       .long   1072615424
+       .long   0
+       .long   1072612352
+       .long   0
+       .long   1072608256
+       .long   0
+       .long   1072605184
+       .long   0
+       .long   1072601088
+       .long   0
+       .long   1072598016
+       .long   0
+       .long   1072593920
+       .long   0
+       .long   1072590848
+       .long   0
+       .long   1072586752
+       .long   0
+       .long   1072583680
+       .long   0
+       .long   1072580608
+       .long   0
+       .long   1072576512
+       .long   0
+       .long   1072573440
+       .long   0
+       .long   1072570368
+       .long   0
+       .long   1072566272
+       .long   0
+       .long   1072563200
+       .long   0
+       .long   1072560128
+       .long   0
+       .long   1072556032
+       .long   0
+       .long   1072552960
+       .long   0
+       .long   1072549888
+       .long   0
+       .long   1072546816
+       .long   0
+       .long   1072542720
+       .long   0
+       .long   1072539648
+       .long   0
+       .long   1072536576
+       .long   0
+       .long   1072533504
+       .long   0
+       .long   1072530432
+       .long   0
+       .long   1072527360
+       .long   0
+       .long   1072523264
+       .long   0
+       .long   1072520192
+       .long   0
+       .long   1072517120
+       .long   0
+       .long   1072514048
+       .long   0
+       .long   1072510976
+       .long   0
+       .long   1072507904
+       .long   0
+       .long   1072504832
+       .long   0
+       .long   1072501760
+       .long   0
+       .long   1072498688
+       .long   0
+       .long   1072495616
+       .long   0
+       .long   1072492544
+       .long   0
+       .long   1072489472
+       .long   0
+       .long   1072486400
+       .long   0
+       .long   1072483328
+       .long   0
+       .long   1072480256
+       .long   0
+       .long   1072478208
+       .long   0
+       .long   1072475136
+       .long   0
+       .long   1072472064
+       .long   0
+       .long   1072468992
+       .long   0
+       .long   1072465920
+       .long   0
+       .long   1072462848
+       .long   0
+       .long   1072459776
+       .long   0
+       .long   1072457728
+       .long   0
+       .long   1072454656
+       .long   0
+       .long   1072451584
+       .long   0
+       .long   1072448512
+       .long   0
+       .long   1072446464
+       .long   0
+       .long   1072443392
+       .long   0
+       .long   1072440320
+       .long   0
+       .long   1072437248
+       .long   0
+       .long   1072435200
+       .long   0
+       .long   1072432128
+       .long   0
+       .long   1072429056
+       .long   0
+       .long   1072427008
+       .long   0
+       .long   1072423936
+       .long   0
+       .long   1072420864
+       .long   0
+       .long   1072418816
+       .long   0
+       .long   1072415744
+       .long   0
+       .long   1072412672
+       .long   0
+       .long   1072410624
+       .long   0
+       .long   1072407552
+       .long   0
+       .long   1072405504
+       .long   0
+       .long   1072402432
+       .long   0
+       .long   1072400384
+       .long   0
+       .long   1072397312
+       .long   0
+       .long   1072395264
+       .long   0
+       .long   1072392192
+       .long   0
+       .long   1072390144
+       .long   0
+       .long   1072387072
+       .long   0
+       .long   1072385024
+       .long   0
+       .long   1072381952
+       .long   0
+       .long   1072379904
+       .long   0
+       .long   1072376832
+       .long   0
+       .long   1072374784
+       .long   0
+       .long   1072371712
+       .long   0
+       .long   1072369664
+       .long   0
+       .long   1072366592
+       .long   0
+       .long   1072364544
+       .long   0
+       .long   1072362496
+       .long   0
+       .long   1072359424
+       .long   0
+       .long   1072357376
+       .long   0
+       .long   1072355328
+       .long   0
+       .long   1072352256
+       .long   0
+       .long   1072350208
+       .long   0
+       .long   1072347136
+       .long   0
+       .long   1072345088
+       .long   0
+       .long   1072343040
+       .long   0
+       .long   1072340992
+       .long   0
+       .long   1072337920
+       .long   0
+       .long   1072335872
+       .long   0
+       .long   1072333824
+       .long   0
+       .long   1072330752
+       .long   0
+       .long   1072328704
+       .long   0
+       .long   1072326656
+       .long   0
+       .long   1072324608
+       .long   0
+       .long   1072321536
+       .long   0
+       .long   1072319488
+       .long   0
+       .long   1072317440
+       .long   0
+       .long   1072315392
+       .long   0
+       .long   1072313344
+       .long   0
+       .long   1072310272
+       .long   0
+       .long   1072308224
+       .long   0
+       .long   1072306176
+       .long   0
+       .long   1072304128
+       .long   0
+       .long   1072302080
+       .long   0
+       .long   1072300032
+       .long   0
+       .long   1072296960
+       .long   0
+       .long   1072294912
+       .long   0
+       .long   1072292864
+       .long   0
+       .long   1072290816
+       .long   0
+       .long   1072288768
+       .long   0
+       .long   1072286720
+       .long   0
+       .long   1072284672
+       .long   0
+       .long   1072282624
+       .long   0
+       .long   1072280576
+       .long   0
+       .long   1072278528
+       .long   0
+       .long   1072275456
+       .long   0
+       .long   1072273408
+       .long   0
+       .long   1072271360
+       .long   0
+       .long   1072269312
+       .long   0
+       .long   1072267264
+       .long   0
+       .long   1072265216
+       .long   0
+       .long   1072263168
+       .long   0
+       .long   1072261120
+       .long   0
+       .long   1072259072
+       .long   0
+       .long   1072257024
+       .long   0
+       .long   1072254976
+       .long   0
+       .long   1072252928
+       .long   0
+       .long   1072250880
+       .long   0
+       .long   1072248832
+       .long   0
+       .long   1072246784
+       .long   0
+       .long   1072244736
+       .long   0
+       .long   1072243712
+       .long   0
+       .long   1072241664
+       .long   0
+       .long   1072239616
+       .long   0
+       .long   1072237568
+       .long   0
+       .long   1072235520
+       .long   0
+       .long   1072233472
+       .long   0
+       .long   1072231424
+       .long   0
+       .long   1072229376
+       .long   0
+       .long   1072227328
+       .long   0
+       .long   1072225280
+       .long   0
+       .long   1072223232
+       .long   0
+       .long   1072222208
+       .long   0
+       .long   1072220160
+       .long   0
+       .long   1072218112
+       .long   0
+       .long   1072216064
+       .long   0
+       .long   1072214016
+       .long   0
+       .long   1072211968
+       .long   0
+       .long   1072210944
+       .long   0
+       .long   1072208896
+       .long   0
+       .long   1072206848
+       .long   0
+       .long   1072204800
+       .long   0
+       .long   1072202752
+       .long   0
+       .long   1072201728
+       .long   0
+       .long   1072199680
+       .long   0
+       .long   1072197632
+       .long   0
+       .long   1072195584
+       .long   0
+       .long   1072193536
+       .long   0
+       .long   1072192512
+       .long   0
+       .long   1072190464
+       .long   0
+       .long   1072188416
+       .long   0
+       .long   1072186368
+       .long   0
+       .long   1072185344
+       .long   0
+       .long   1072183296
+       .long   0
+       .long   1072181248
+       .long   0
+       .long   1072179200
+       .long   0
+       .long   1072178176
+       .long   0
+       .long   1072176128
+       .long   0
+       .long   1072174080
+       .long   0
+       .long   1072173056
+       .long   0
+       .long   1072171008
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072167936
+       .long   0
+       .long   1072165888
+       .long   0
+       .long   1072163840
+       .long   0
+       .long   1072161792
+       .long   0
+       .long   1072160768
+       .long   0
+       .long   1072158720
+       .long   0
+       .long   1072157696
+       .long   0
+       .long   1072155648
+       .long   0
+       .long   1072153600
+       .long   0
+       .long   1072152576
+       .long   0
+       .long   1072150528
+       .long   0
+       .long   1072148480
+       .long   0
+       .long   1072147456
+       .long   0
+       .long   1072145408
+       .long   0
+       .long   1072143360
+       .long   0
+       .long   1072142336
+       .long   0
+       .long   1072140288
+       .long   0
+       .long   1072139264
+       .long   0
+       .long   1072137216
+       .long   0
+       .long   1072135168
+       .long   0
+       .long   1072134144
+       .long   0
+       .long   1072132096
+       .long   0
+       .long   1072131072
+       .long   0
+       .long   1072129024
+       .long   0
+       .long   1072128000
+       .long   0
+       .long   1072125952
+       .long   0
+       .long   1072124928
+       .long   0
+       .long   1072122880
+       .long   0
+       .long   1072120832
+       .long   0
+       .long   1072119808
+       .long   0
+       .long   1072117760
+       .long   0
+       .long   1072116736
+       .long   0
+       .long   1072114688
+       .long   0
+       .long   1072113664
+       .long   0
+       .long   1072111616
+       .long   0
+       .long   1072110592
+       .long   0
+       .long   1072108544
+       .long   0
+       .long   1072107520
+       .long   0
+       .long   1072105472
+       .long   0
+       .long   1072104448
+       .long   0
+       .long   1072102400
+       .long   0
+       .long   1072101376
+       .long   0
+       .long   1072099328
+       .long   0
+       .long   1072098304
+       .long   0
+       .long   1072096256
+       .long   0
+       .long   1072095232
+       .long   0
+       .long   1072094208
+       .long   0
+       .long   1072092160
+       .long   0
+       .long   1072091136
+       .long   0
+       .long   1072089088
+       .long   0
+       .long   1072088064
+       .long   0
+       .long   1072086016
+       .long   0
+       .long   1072084992
+       .long   0
+       .long   1072082944
+       .long   0
+       .long   1072081920
+       .long   0
+       .long   1072080896
+       .long   0
+       .long   1072078848
+       .long   0
+       .long   1072075776
+       .long   0
+       .long   1072073728
+       .long   0
+       .long   1072070656
+       .long   0
+       .long   1072067584
+       .long   0
+       .long   1072064512
+       .long   0
+       .long   1072061440
+       .long   0
+       .long   1072059392
+       .long   0
+       .long   1072056320
+       .long   0
+       .long   1072053248
+       .long   0
+       .long   1072051200
+       .long   0
+       .long   1072048128
+       .long   0
+       .long   1072045056
+       .long   0
+       .long   1072043008
+       .long   0
+       .long   1072039936
+       .long   0
+       .long   1072037888
+       .long   0
+       .long   1072034816
+       .long   0
+       .long   1072031744
+       .long   0
+       .long   1072029696
+       .long   0
+       .long   1072026624
+       .long   0
+       .long   1072024576
+       .long   0
+       .long   1072021504
+       .long   0
+       .long   1072019456
+       .long   0
+       .long   1072016384
+       .long   0
+       .long   1072014336
+       .long   0
+       .long   1072011264
+       .long   0
+       .long   1072009216
+       .long   0
+       .long   1072006144
+       .long   0
+       .long   1072004096
+       .long   0
+       .long   1072002048
+       .long   0
+       .long   1071998976
+       .long   0
+       .long   1071996928
+       .long   0
+       .long   1071993856
+       .long   0
+       .long   1071991808
+       .long   0
+       .long   1071989760
+       .long   0
+       .long   1071986688
+       .long   0
+       .long   1071984640
+       .long   0
+       .long   1071982592
+       .long   0
+       .long   1071979520
+       .long   0
+       .long   1071977472
+       .long   0
+       .long   1071975424
+       .long   0
+       .long   1071972352
+       .long   0
+       .long   1071970304
+       .long   0
+       .long   1071968256
+       .long   0
+       .long   1071966208
+       .long   0
+       .long   1071964160
+       .long   0
+       .long   1071961088
+       .long   0
+       .long   1071959040
+       .long   0
+       .long   1071956992
+       .long   0
+       .long   1071954944
+       .long   0
+       .long   1071952896
+       .long   0
+       .long   1071949824
+       .long   0
+       .long   1071947776
+       .long   0
+       .long   1071945728
+       .long   0
+       .long   1071943680
+       .long   0
+       .long   1071941632
+       .long   0
+       .long   1071939584
+       .long   0
+       .long   1071937536
+       .long   0
+       .long   1071935488
+       .long   0
+       .long   1071933440
+       .long   0
+       .long   1071930368
+       .long   0
+       .long   1071928320
+       .long   0
+       .long   1071926272
+       .long   0
+       .long   1071924224
+       .long   0
+       .long   1071922176
+       .long   0
+       .long   1071920128
+       .long   0
+       .long   1071918080
+       .long   0
+       .long   1071916032
+       .long   0
+       .long   1071913984
+       .long   0
+       .long   1071911936
+       .long   0
+       .long   1071909888
+       .long   0
+       .long   1071907840
+       .long   0
+       .long   1071905792
+       .long   0
+       .long   1071903744
+       .long   0
+       .long   1071901696
+       .long   0
+       .long   1071900672
+       .long   0
+       .long   1071898624
+       .long   0
+       .long   1071896576
+       .long   0
+       .long   1071894528
+       .long   0
+       .long   1071892480
+       .long   0
+       .long   1071890432
+       .long   0
+       .long   1071888384
+       .long   0
+       .long   1071886336
+       .long   0
+       .long   1071884288
+       .long   0
+       .long   1071883264
+       .long   0
+       .long   1071881216
+       .long   0
+       .long   1071879168
+       .long   0
+       .long   1071877120
+       .long   0
+       .long   1071875072
+       .long   0
+       .long   1071873024
+       .long   0
+       .long   1071872000
+       .long   0
+       .long   1071869952
+       .long   0
+       .long   1071867904
+       .long   0
+       .long   1071865856
+       .long   0
+       .long   1071864832
+       .long   0
+       .long   1071862784
+       .long   0
+       .long   1071860736
+       .long   0
+       .long   1071858688
+       .long   0
+       .long   1071856640
+       .long   0
+       .long   1071855616
+       .long   0
+       .long   1071853568
+       .long   0
+       .long   1071851520
+       .long   0
+       .long   1071850496
+       .long   0
+       .long   1071848448
+       .long   0
+       .long   1071846400
+       .long   0
+       .long   1071844352
+       .long   0
+       .long   1071843328
+       .long   0
+       .long   1071841280
+       .long   0
+       .long   1071839232
+       .long   0
+       .long   1071838208
+       .long   0
+       .long   1071836160
+       .long   0
+       .long   1071834112
+       .long   0
+       .long   1071833088
+       .long   0
+       .long   1071831040
+       .long   0
+       .long   1071830016
+       .long   0
+       .long   1071827968
+       .long   0
+       .long   1071825920
+       .long   0
+       .long   1071824896
+       .long   0
+       .long   1071822848
+       .long   0
+       .long   1071821824
+       .long   0
+       .long   1071819776
+       .long   0
+       .long   1071817728
+       .long   0
+       .long   1071816704
+       .long   0
+       .long   1071814656
+       .long   0
+       .long   1071813632
+       .long   0
+       .long   1071811584
+       .long   0
+       .long   1071810560
+       .long   0
+       .long   1071808512
+       .long   0
+       .long   1071806464
+       .long   0
+       .long   1071805440
+       .long   0
+       .long   1071803392
+       .long   0
+       .long   1071802368
+       .long   0
+       .long   1071800320
+       .long   0
+       .long   1071799296
+       .long   0
+       .long   1071797248
+       .long   0
+       .long   1071796224
+       .long   0
+       .long   1071794176
+       .long   0
+       .long   1071793152
+       .long   0
+       .long   1071791104
+       .long   0
+       .long   1071790080
+       .long   0
+       .long   1071788032
+       .long   0
+       .long   1071787008
+       .long   0
+       .long   1071784960
+       .long   0
+       .long   1071783936
+       .long   0
+       .long   1071782912
+       .long   0
+       .long   1071780864
+       .long   0
+       .long   1071779840
+       .long   0
+       .long   1071777792
+       .long   0
+       .long   1071776768
+       .long   0
+       .long   1071774720
+       .long   0
+       .long   1071773696
+       .long   0
+       .long   1071772672
+       .long   0
+       .long   1071770624
+       .long   0
+       .long   1071769600
+       .long   0
+       .long   1071767552
+       .long   0
+       .long   1071766528
+       .long   0
+       .long   1071765504
+       .long   0
+       .long   1071763456
+       .long   0
+       .long   1071762432
+       .long   0
+       .long   1071760384
+       .long   0
+       .long   1071759360
+       .long   0
+       .long   1071758336
+       .long   0
+       .long   1071756288
+       .long   0
+       .long   1071755264
+       .long   0
+       .long   1071754240
+       .long   0
+       .long   1071752192
+       .long   0
+       .long   1071751168
+       .long   0
+       .long   1071750144
+       .long   0
+       .long   1071748096
+       .long   0
+       .long   1071747072
+       .long   0
+       .long   1071746048
+       .long   0
+       .long   1071744000
+       .long   0
+       .long   1071742976
+       .long   0
+       .long   1071741952
+       .long   0
+       .long   1071739904
+       .long   0
+       .long   1071738880
+       .long   0
+       .long   1071737856
+       .long   0
+       .long   1071736832
+       .long   0
+       .long   1071734784
+       .long   0
+       .long   1071733760
+       .long   0
+       .long   1071732736
+       .long   0
+       .long   1071730688
+       .long   0
+       .long   1071729664
+       .long   0
+       .long   1071728640
+       .long   0
+       .long   1071727616
+       .long   0
+       .long   1071725568
+       .long   0
+       .long   1071724544
+       .long   0
+       .long   1071723520
+       .long   0
+       .long   1071722496
+       .long   0
+       .long   1071720448
+       .long   0
+       .long   1071719424
+       .long   0
+       .long   1071718400
+       .long   0
+       .long   1071717376
+       .long   0
+       .long   1071715328
+       .long   0
+       .long   1071714304
+       .long   0
+       .long   1071713280
+       .long   0
+       .long   1071712256
+       .long   0
+       .long   1071711232
+       .long   0
+       .long   1071709184
+       .long   0
+       .long   1071708160
+       .long   0
+       .long   1071707136
+       .long   0
+       .long   1071706112
+       .long   0
+       .long   1071705088
+       .long   0
+       .long   1071704064
+       .long   0
+       .long   1071702016
+       .long   0
+       .long   1071700992
+       .long   0
+       .long   1071699968
+       .long   0
+       .long   1071698944
+       .long   0
+       .long   1071697920
+       .long   0
+       .long   1071696896
+       .long   0
+       .long   1071694848
+       .long   0
+       .long   1071693824
+       .long   0
+       .long   1071692800
+       .long   0
+       .long   1071691776
+       .long   0
+       .long   1071690752
+       .long   0
+       .long   1071689728
+       .long   0
+       .long   1071688704
+       .long   0
+       .long   1071686656
+       .long   0
+       .long   1071685632
+       .long   0
+       .long   1071684608
+       .long   0
+       .long   1071683584
+       .long   0
+       .long   1071682560
+       .long   0
+       .long   1071681536
+       .long   0
+       .long   1071680512
+       .long   0
+       .long   1071679488
+       .long   0
+       .long   1071677440
+       .long   0
+       .long   1071676416
+       .long   0
+       .long   1071675392
+       .long   0
+       .long   1071674368
+       .long   0
+       .long   1071673344
+       .long   0
+       .long   1071672320
+       .long   0
+       .long   1071671296
+       .long   0
+       .long   1071670272
+       .long   0
+       .long   1071669248
+       .long   0
+       .long   1071668224
+       .long   0
+       .long   1071667200
+       .long   0
+       .long   1071666176
+       .long   0
+       .long   1071665152
+       .long   0
+       .long   1071663104
+       .long   0
+       .long   1071662080
+       .long   0
+       .long   1071661056
+       .long   0
+       .long   1071660032
+       .long   0
+       .long   1071659008
+       .long   0
+       .long   1071657984
+       .long   0
+       .long   1071656960
+       .long   0
+       .long   1071655936
+       .long   0
+       .long   1071654912
+       .long   0
+       .long   1071653888
+       .long   0
+       .long   1071652864
+       .long   0
+       .long   1071651840
+       .long   0
+       .long   1071650816
+       .long   0
+       .long   1071649792
+       .long   0
+       .long   1071648768
+       .long   0
+       .long   1071647744
+       .long   0
+       .long   1071646720
+       .long   0
+       .long   1071645696
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1101004800
+       .long   1073741824
+       .long   1095761920
+       .long   256
+       .long   1118830592
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1017118720
+       .long   1413754136
+       .long   1073291771
+       .long   856972295
+       .long   1016178214
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1071644672
+       .long   1476395008
+       .long   1069897045
+       .long   1768958041
+       .long   3189069141
+       .long   805306368
+       .long   1068708659
+       .long   3580333578
+       .long   1040816593
+       .long   3067382784
+       .long   1067899757
+       .long   3397590151
+       .long   1067392113
+       .long   2939529726
+       .long   1066854585
+       .long   1423429166
+       .long   1066517752
+       .long   1775218934
+       .long   1066178574
+       .long   1185392460
+       .long   1065859647
+       .long   289998670
+       .long   1065577550
+       .long   3179807072
+       .long   1065648121
+       .long   3781007284
+       .long   1061576176
+       .long   2482106687
+       .long   1067019199
+       .long   763519713
+       .long   3214591591
+       .long   3695107454
+       .long   1067530646
+       .long   0
+       .long   1073741824
+       .long   1124791109
+       .long   1006764147
+       .long   1476395008
+       .long   1069897045
+       .long   1953913876
+       .long   3189069141
+       .long   805306368
+       .long   1067660083
+       .long   165110192
+       .long   1039768033
+       .long   3067304082
+       .long   1065802605
+       .long   3404727379
+       .long   1064246385
+       .long   2737480376
+       .long   1062660281
+       .long   933797922
+       .long   1061274873
+       .long   1475716730
+       .long   1059887095
+       .long   1511619763
+       .long   1058519827
+       .long   556024211
+       .long   1057187555
+       .long   3482101045
+       .long   1056217350
+       .long   1174622859
+       .long   1050762633
+       .long   899668651
+       .long   1055506366
+       .long   1081094694
+       .long   3202035365
+       .long   2559814773
+       .long   1053906576
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   3218341888
+       .long   0
+       .long   1070694400
+       .long   0
+       .long   3218046976
+       .long   0
+       .long   1070391296
+       .long   0
+       .long   3217739776
+       .type   _vmldASinHATab,@object
+       .size   _vmldASinHATab,4504
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_asin_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_asin_s_la.s
new file mode 100644 (file)
index 0000000..9d92dfb
--- /dev/null
@@ -0,0 +1,2201 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+
+       .text
+.L_2__routine_start___svml_asinf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_asinf16
+
+__svml_asinf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   __svml_sasin_data_internal(%rip), %zmm4
+        vmovups   64+__svml_sasin_data_internal(%rip), %zmm6
+
+/* SQ ~ -2*sqrt(Y) */
+        vmovups   192+__svml_sasin_data_internal(%rip), %zmm8
+        vmovups   448+__svml_sasin_data_internal(%rip), %zmm12
+        vmovups   512+__svml_sasin_data_internal(%rip), %zmm13
+        vmovups   256+__svml_sasin_data_internal(%rip), %zmm7
+        vmovaps   %zmm0, %zmm3
+
+/* x = |arg| */
+        vandps    %zmm3, %zmm4, %zmm2
+        vandnps   %zmm3, %zmm4, %zmm1
+
+/* x^2 */
+        vmulps    {rn-sae}, %zmm2, %zmm2, %zmm5
+        vcmpps    $17, {sae}, %zmm2, %zmm7, %k0
+        vcmpps    $21, {sae}, %zmm6, %zmm2, %k2
+        vmovups   704+__svml_sasin_data_internal(%rip), %zmm7
+        kmovw     %k0, %edx
+
+/* Y = 0.5 - 0.5*x */
+        vmovaps   %zmm6, %zmm9
+        vfnmadd231ps {rn-sae}, %zmm2, %zmm6, %zmm9
+        vmovups   896+__svml_sasin_data_internal(%rip), %zmm6
+        vrsqrt14ps %zmm9, %zmm10
+        vcmpps    $17, {sae}, %zmm8, %zmm9, %k1
+        vminps    {sae}, %zmm9, %zmm5, %zmm0
+        vmovups   576+__svml_sasin_data_internal(%rip), %zmm8
+        vmovups   832+__svml_sasin_data_internal(%rip), %zmm5
+        vxorps    %zmm10, %zmm10, %zmm10{%k1}
+        vaddps    {rn-sae}, %zmm9, %zmm9, %zmm14
+        vmulps    {rn-sae}, %zmm10, %zmm10, %zmm11
+        vmulps    {rn-sae}, %zmm10, %zmm14, %zmm4
+        vfmsub213ps {rn-sae}, %zmm12, %zmm11, %zmm14
+        vmulps    {rn-sae}, %zmm14, %zmm4, %zmm15
+        vfmadd231ps {rn-sae}, %zmm14, %zmm13, %zmm8
+        vmovups   768+__svml_sasin_data_internal(%rip), %zmm14
+
+/* polynomial */
+        vmovups   640+__svml_sasin_data_internal(%rip), %zmm13
+        vfmsub213ps {rn-sae}, %zmm4, %zmm15, %zmm8
+        vfmadd231ps {rn-sae}, %zmm0, %zmm14, %zmm5
+        vfmadd231ps {rn-sae}, %zmm0, %zmm13, %zmm7
+        vmulps    {rn-sae}, %zmm0, %zmm0, %zmm15
+        vblendmps %zmm8, %zmm2, %zmm2{%k2}
+        vfmadd213ps {rn-sae}, %zmm5, %zmm15, %zmm7
+        vfmadd213ps {rn-sae}, %zmm6, %zmm0, %zmm7
+        vmulps    {rn-sae}, %zmm0, %zmm7, %zmm9
+        vmovups   960+__svml_sasin_data_internal(%rip), %zmm0
+        vfmadd213ps {rn-sae}, %zmm2, %zmm2, %zmm9
+        vaddps    {rn-sae}, %zmm0, %zmm9, %zmm9{%k2}
+        vxorps    %zmm1, %zmm9, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm3, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_sasin_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_asinf16,@function
+       .size   __svml_asinf16,.-__svml_asinf16
+..LN__svml_asinf16.0:
+
+.L_2__routine_start___svml_sasin_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_sasin_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    2(%rdi), %edx
+        andl      $32640, %edx
+        cmpl      $32640, %edx
+        je        .LBL_2_12
+
+
+        pxor      %xmm0, %xmm0
+        cvtss2sd  (%rdi), %xmm0
+        movsd     %xmm0, -32(%rsp)
+        andb      $127, -25(%rsp)
+        movsd     -32(%rsp), %xmm12
+        movsd     4160+_vmldASinHATab(%rip), %xmm0
+        comisd    %xmm12, %xmm0
+        jb        .LBL_2_10
+
+
+        movsd     4168+_vmldASinHATab(%rip), %xmm1
+        comisd    %xmm12, %xmm1
+        jbe       .LBL_2_9
+
+
+        comisd    4136+_vmldASinHATab(%rip), %xmm12
+        jbe       .LBL_2_6
+
+
+        movsd     4104+_vmldASinHATab(%rip), %xmm13
+        movaps    %xmm12, %xmm5
+        mulsd     %xmm12, %xmm13
+        movaps    %xmm12, %xmm7
+        movsd     %xmm13, -48(%rsp)
+        movsd     -48(%rsp), %xmm14
+        movsd     4104+_vmldASinHATab(%rip), %xmm1
+        subsd     -32(%rsp), %xmm14
+        movsd     %xmm14, -56(%rsp)
+        movsd     -48(%rsp), %xmm8
+        movsd     -56(%rsp), %xmm15
+        subsd     %xmm15, %xmm8
+        movsd     %xmm8, -48(%rsp)
+        movsd     -48(%rsp), %xmm6
+        movsd     4296+_vmldASinHATab(%rip), %xmm8
+        subsd     %xmm6, %xmm5
+        movsd     %xmm5, -56(%rsp)
+        movaps    %xmm12, %xmm5
+        movsd     -48(%rsp), %xmm9
+        movaps    %xmm9, %xmm13
+        addsd     %xmm9, %xmm7
+        mulsd     %xmm9, %xmm13
+        movsd     -56(%rsp), %xmm11
+        movaps    %xmm13, %xmm10
+        mulsd     %xmm11, %xmm7
+        mulsd     %xmm13, %xmm1
+        addsd     %xmm7, %xmm10
+        mulsd     %xmm10, %xmm8
+        movsd     %xmm1, -48(%rsp)
+        movsd     -48(%rsp), %xmm2
+        movsd     4104+_vmldASinHATab(%rip), %xmm1
+        subsd     %xmm13, %xmm2
+        addsd     4288+_vmldASinHATab(%rip), %xmm8
+        mulsd     %xmm10, %xmm8
+        movsd     %xmm2, -56(%rsp)
+        movsd     -48(%rsp), %xmm3
+        movsd     -56(%rsp), %xmm0
+        addsd     4280+_vmldASinHATab(%rip), %xmm8
+        subsd     %xmm0, %xmm3
+        mulsd     %xmm10, %xmm8
+        movsd     %xmm3, -48(%rsp)
+        movsd     -48(%rsp), %xmm4
+        addsd     4272+_vmldASinHATab(%rip), %xmm8
+        subsd     %xmm4, %xmm13
+        mulsd     %xmm10, %xmm8
+        movsd     %xmm13, -56(%rsp)
+        movsd     -48(%rsp), %xmm6
+        mulsd     %xmm6, %xmm9
+        addsd     4264+_vmldASinHATab(%rip), %xmm8
+        mulsd     %xmm6, %xmm11
+        mulsd     %xmm10, %xmm8
+        mulsd     %xmm9, %xmm1
+        addsd     4256+_vmldASinHATab(%rip), %xmm8
+        mulsd     %xmm10, %xmm8
+        movaps    %xmm9, %xmm3
+        movsd     -56(%rsp), %xmm14
+        movaps    %xmm6, %xmm4
+        movsd     %xmm1, -48(%rsp)
+        addsd     %xmm14, %xmm7
+        addsd     4248+_vmldASinHATab(%rip), %xmm8
+        mulsd     %xmm7, %xmm5
+        mulsd     %xmm10, %xmm8
+        addsd     %xmm5, %xmm11
+        addsd     4240+_vmldASinHATab(%rip), %xmm8
+        movsd     -48(%rsp), %xmm2
+        mulsd     %xmm10, %xmm8
+        subsd     %xmm9, %xmm2
+        addsd     %xmm11, %xmm9
+        addsd     4232+_vmldASinHATab(%rip), %xmm8
+        mulsd     %xmm9, %xmm7
+        mulsd     %xmm10, %xmm8
+        movsd     %xmm2, -56(%rsp)
+        movsd     -48(%rsp), %xmm0
+        movsd     -56(%rsp), %xmm15
+        subsd     %xmm15, %xmm0
+        addsd     4224+_vmldASinHATab(%rip), %xmm8
+        movsd     %xmm0, -48(%rsp)
+        movsd     -48(%rsp), %xmm5
+        mulsd     %xmm10, %xmm8
+        subsd     %xmm5, %xmm3
+        movsd     %xmm3, -56(%rsp)
+        movsd     -48(%rsp), %xmm3
+        movsd     -56(%rsp), %xmm5
+        movaps    %xmm5, %xmm13
+        addsd     4216+_vmldASinHATab(%rip), %xmm8
+        mulsd     %xmm3, %xmm4
+        addsd     %xmm11, %xmm13
+        mulsd     %xmm10, %xmm8
+        mulsd     %xmm13, %xmm6
+        addsd     4208+_vmldASinHATab(%rip), %xmm8
+        addsd     %xmm7, %xmm6
+        mulsd     %xmm10, %xmm8
+        movsd     4104+_vmldASinHATab(%rip), %xmm7
+        movaps    %xmm4, %xmm13
+        mulsd     %xmm4, %xmm7
+        addsd     4200+_vmldASinHATab(%rip), %xmm8
+        movsd     %xmm7, -48(%rsp)
+        movsd     -48(%rsp), %xmm1
+        movsd     4184+_vmldASinHATab(%rip), %xmm10
+        subsd     %xmm4, %xmm1
+        mulsd     %xmm9, %xmm10
+        addsd     %xmm6, %xmm4
+        movsd     %xmm1, -56(%rsp)
+        movaps    %xmm12, %xmm9
+        movsd     -48(%rsp), %xmm0
+        movsd     -56(%rsp), %xmm2
+        movsd     4176+_vmldASinHATab(%rip), %xmm1
+        subsd     %xmm2, %xmm0
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm1, %xmm11
+        mulsd     %xmm4, %xmm8
+        addsd     %xmm3, %xmm9
+        mulsd     %xmm1, %xmm5
+        addsd     %xmm11, %xmm10
+        movsd     %xmm0, -48(%rsp)
+        addsd     %xmm10, %xmm8
+        movsd     -48(%rsp), %xmm7
+        addsd     %xmm5, %xmm8
+        subsd     %xmm7, %xmm13
+        movsd     %xmm13, -56(%rsp)
+        movsd     -48(%rsp), %xmm0
+        movsd     -56(%rsp), %xmm2
+        movsd     %xmm9, -48(%rsp)
+        addsd     %xmm2, %xmm6
+        movsd     -48(%rsp), %xmm11
+        movsd     4192+_vmldASinHATab(%rip), %xmm4
+        subsd     %xmm11, %xmm12
+        mulsd     %xmm4, %xmm0
+        mulsd     %xmm4, %xmm6
+        addsd     %xmm12, %xmm3
+        movsd     %xmm3, -56(%rsp)
+        movsd     -48(%rsp), %xmm3
+        movaps    %xmm3, %xmm12
+        movsd     -56(%rsp), %xmm7
+        addsd     %xmm0, %xmm12
+        addsd     %xmm7, %xmm8
+        movsd     %xmm12, -48(%rsp)
+        movsd     -48(%rsp), %xmm12
+        subsd     %xmm12, %xmm3
+        addsd     %xmm3, %xmm0
+        movsd     %xmm0, -56(%rsp)
+        movsd     -48(%rsp), %xmm9
+        movsd     -56(%rsp), %xmm0
+        movb      3(%rdi), %dil
+        addsd     %xmm0, %xmm8
+        andb      $-128, %dil
+        addsd     %xmm8, %xmm9
+        addsd     %xmm9, %xmm6
+        movsd     %xmm6, -40(%rsp)
+        movb      -33(%rsp), %dl
+        andb      $127, %dl
+        orb       %dil, %dl
+        movb      %dl, -33(%rsp)
+        movsd     -40(%rsp), %xmm1
+        cvtsd2ss  %xmm1, %xmm1
+        movss     %xmm1, (%rsi)
+        ret
+
+.LBL_2_6:
+
+        comisd    4128+_vmldASinHATab(%rip), %xmm12
+        jb        .LBL_2_8
+
+
+        addsd     %xmm0, %xmm12
+        movsd     %xmm12, -48(%rsp)
+        movsd     -48(%rsp), %xmm0
+        mulsd     -32(%rsp), %xmm0
+        movsd     %xmm0, -40(%rsp)
+        movb      -33(%rsp), %dl
+        movb      3(%rdi), %dil
+        andb      $127, %dl
+        andb      $-128, %dil
+        orb       %dil, %dl
+        movb      %dl, -33(%rsp)
+        movsd     -40(%rsp), %xmm1
+        cvtsd2ss  %xmm1, %xmm1
+        movss     %xmm1, (%rsi)
+        ret
+
+.LBL_2_8:
+
+        mulsd     %xmm12, %xmm12
+        movsd     %xmm12, -48(%rsp)
+        movsd     -48(%rsp), %xmm0
+        movb      3(%rdi), %dil
+        andb      $-128, %dil
+        addsd     -32(%rsp), %xmm0
+        movsd     %xmm0, -40(%rsp)
+        movb      -33(%rsp), %dl
+        andb      $127, %dl
+        orb       %dil, %dl
+        movb      %dl, -33(%rsp)
+        movsd     -40(%rsp), %xmm1
+        cvtsd2ss  %xmm1, %xmm1
+        movss     %xmm1, (%rsi)
+        ret
+
+.LBL_2_9:
+
+        movaps    %xmm0, %xmm9
+        movzwl    4166+_vmldASinHATab(%rip), %r9d
+        pxor      %xmm15, %xmm15
+        andl      $-32753, %r9d
+        subsd     %xmm12, %xmm9
+        subsd     %xmm0, %xmm15
+        mulsd     %xmm9, %xmm1
+        movsd     %xmm1, -32(%rsp)
+        movzwl    -26(%rsp), %ecx
+        andl      $32752, %ecx
+        shrl      $4, %ecx
+        addl      $-1023, %ecx
+        movl      %ecx, %r8d
+        movl      %ecx, %edx
+        negl      %r8d
+        addl      $1023, %r8d
+        andl      $2047, %r8d
+        shll      $4, %r8d
+        movsd     %xmm0, -24(%rsp)
+        orl       %r8d, %r9d
+        movw      %r9w, -18(%rsp)
+        andl      $1, %edx
+        movsd     -24(%rsp), %xmm10
+        movl      %edx, %r10d
+        mulsd     %xmm10, %xmm1
+        lea       _vmldASinHATab(%rip), %r8
+        movaps    %xmm1, %xmm6
+        movsd     4112+_vmldASinHATab(%rip), %xmm7
+        addsd     %xmm1, %xmm6
+        jne       ..L54
+        movaps    %xmm1, %xmm6
+..L54:
+        mulsd     %xmm6, %xmm7
+        movaps    %xmm6, %xmm8
+        movaps    %xmm7, %xmm11
+        subl      %edx, %ecx
+        movsd     4120+_vmldASinHATab(%rip), %xmm13
+        subsd     %xmm6, %xmm11
+        addsd     %xmm1, %xmm13
+        movsd     %xmm11, -56(%rsp)
+        movsd     -56(%rsp), %xmm12
+        movsd     %xmm13, -16(%rsp)
+        subsd     %xmm12, %xmm7
+        movl      -16(%rsp), %r11d
+        movaps    %xmm7, %xmm4
+        shll      $8, %r10d
+        andl      $511, %r11d
+        addl      %r10d, %r11d
+        subsd     %xmm7, %xmm8
+        movsd     (%r8,%r11,8), %xmm3
+        addsd     %xmm8, %xmm4
+        mulsd     %xmm3, %xmm7
+        movaps    %xmm3, %xmm14
+        mulsd     %xmm3, %xmm14
+        mulsd     %xmm14, %xmm4
+        movsd     4496+_vmldASinHATab(%rip), %xmm5
+        addsd     %xmm15, %xmm4
+        mulsd     %xmm4, %xmm5
+        shrl      $1, %ecx
+        addsd     4488+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        addl      $1023, %ecx
+        andl      $2047, %ecx
+        addsd     4480+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        movzwl    4166+_vmldASinHATab(%rip), %r9d
+        shll      $4, %ecx
+        andl      $-32753, %r9d
+        movsd     %xmm0, -8(%rsp)
+        orl       %ecx, %r9d
+        movw      %r9w, -2(%rsp)
+        movsd     -8(%rsp), %xmm12
+        mulsd     %xmm12, %xmm7
+        addsd     4472+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        movsd     4104+_vmldASinHATab(%rip), %xmm1
+        mulsd     %xmm7, %xmm1
+        addsd     4464+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        movsd     %xmm1, -48(%rsp)
+        movsd     -48(%rsp), %xmm0
+        movsd     4336+_vmldASinHATab(%rip), %xmm13
+        subsd     %xmm7, %xmm0
+        addsd     4456+_vmldASinHATab(%rip), %xmm5
+        addsd     4344+_vmldASinHATab(%rip), %xmm13
+        mulsd     %xmm4, %xmm5
+        mulsd     %xmm9, %xmm13
+        addsd     4448+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        mulsd     %xmm6, %xmm5
+        movsd     %xmm0, -56(%rsp)
+        addsd     %xmm5, %xmm8
+        movsd     4440+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        mulsd     %xmm3, %xmm8
+        addsd     4432+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm12, %xmm8
+        mulsd     %xmm9, %xmm5
+        movsd     -48(%rsp), %xmm10
+        movsd     -56(%rsp), %xmm2
+        movsd     4320+_vmldASinHATab(%rip), %xmm14
+        subsd     %xmm2, %xmm10
+        addsd     4424+_vmldASinHATab(%rip), %xmm5
+        addsd     4328+_vmldASinHATab(%rip), %xmm14
+        mulsd     %xmm9, %xmm5
+        addsd     %xmm13, %xmm14
+        addsd     4416+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm14
+        mulsd     %xmm9, %xmm5
+        movsd     %xmm10, -48(%rsp)
+        movaps    %xmm9, %xmm2
+        movsd     -48(%rsp), %xmm11
+        movsd     4104+_vmldASinHATab(%rip), %xmm3
+        subsd     %xmm11, %xmm7
+        mulsd     %xmm9, %xmm3
+        addsd     4408+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        movsd     4304+_vmldASinHATab(%rip), %xmm4
+        movsd     %xmm7, -56(%rsp)
+        movsd     -48(%rsp), %xmm6
+        movsd     -56(%rsp), %xmm7
+        movsd     %xmm3, -48(%rsp)
+        addsd     %xmm7, %xmm8
+        addsd     4400+_vmldASinHATab(%rip), %xmm5
+        addsd     4312+_vmldASinHATab(%rip), %xmm4
+        mulsd     %xmm9, %xmm5
+        addsd     %xmm14, %xmm4
+        addsd     4392+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        movsd     -48(%rsp), %xmm1
+        movsd     4104+_vmldASinHATab(%rip), %xmm7
+        subsd     %xmm9, %xmm1
+        addsd     4384+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        movsd     %xmm1, -56(%rsp)
+        movsd     -48(%rsp), %xmm0
+        movsd     -56(%rsp), %xmm15
+        addsd     4376+_vmldASinHATab(%rip), %xmm5
+        subsd     %xmm15, %xmm0
+        mulsd     %xmm9, %xmm5
+        movsd     %xmm0, -48(%rsp)
+        movsd     4320+_vmldASinHATab(%rip), %xmm0
+        addsd     4368+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        addsd     4360+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        addsd     4352+_vmldASinHATab(%rip), %xmm5
+        mulsd     %xmm9, %xmm5
+        mulsd     %xmm9, %xmm5
+        mulsd     %xmm9, %xmm5
+        addsd     %xmm5, %xmm4
+        mulsd     %xmm4, %xmm8
+        movsd     -48(%rsp), %xmm4
+        subsd     %xmm4, %xmm2
+        movsd     %xmm2, -56(%rsp)
+        movsd     -48(%rsp), %xmm4
+        movaps    %xmm4, %xmm13
+        mulsd     %xmm4, %xmm13
+        mulsd     %xmm4, %xmm0
+        addsd     %xmm9, %xmm4
+        mulsd     %xmm13, %xmm7
+        movsd     -56(%rsp), %xmm3
+        movsd     %xmm7, -48(%rsp)
+        movsd     -48(%rsp), %xmm10
+        mulsd     %xmm3, %xmm4
+        subsd     %xmm13, %xmm10
+        movsd     %xmm10, -56(%rsp)
+        movsd     -48(%rsp), %xmm11
+        movsd     -56(%rsp), %xmm1
+        movsd     4304+_vmldASinHATab(%rip), %xmm10
+        subsd     %xmm1, %xmm11
+        movsd     %xmm11, -48(%rsp)
+        movaps    %xmm0, %xmm1
+        movsd     -48(%rsp), %xmm12
+        movsd     4304+_vmldASinHATab(%rip), %xmm11
+        subsd     %xmm12, %xmm13
+        movsd     %xmm13, -56(%rsp)
+        movsd     -48(%rsp), %xmm7
+        mulsd     4336+_vmldASinHATab(%rip), %xmm7
+        movsd     -56(%rsp), %xmm2
+        addsd     %xmm7, %xmm1
+        addsd     %xmm2, %xmm4
+        movsd     %xmm1, -48(%rsp)
+        movsd     -48(%rsp), %xmm14
+        movsd     %xmm7, -16(%rsp)
+        subsd     %xmm14, %xmm0
+        mulsd     4336+_vmldASinHATab(%rip), %xmm4
+        addsd     %xmm0, %xmm7
+        movsd     %xmm7, -56(%rsp)
+        movsd     -48(%rsp), %xmm12
+        movsd     -56(%rsp), %xmm1
+        addsd     %xmm12, %xmm10
+        movsd     %xmm10, -48(%rsp)
+        movsd     -48(%rsp), %xmm15
+        movsd     4104+_vmldASinHATab(%rip), %xmm7
+        subsd     %xmm15, %xmm11
+        movsd     4320+_vmldASinHATab(%rip), %xmm2
+        addsd     %xmm11, %xmm12
+        mulsd     %xmm3, %xmm2
+        movsd     %xmm12, -56(%rsp)
+        movsd     -48(%rsp), %xmm15
+        mulsd     %xmm15, %xmm7
+        movsd     -56(%rsp), %xmm0
+        movsd     %xmm7, -48(%rsp)
+        movsd     -48(%rsp), %xmm10
+        movsd     4344+_vmldASinHATab(%rip), %xmm3
+        subsd     %xmm15, %xmm10
+        mulsd     %xmm9, %xmm3
+        movsd     %xmm10, -56(%rsp)
+        movsd     -48(%rsp), %xmm11
+        movsd     -56(%rsp), %xmm13
+        subsd     %xmm13, %xmm11
+        addsd     4328+_vmldASinHATab(%rip), %xmm3
+        movsd     %xmm11, -48(%rsp)
+        movsd     -48(%rsp), %xmm14
+        mulsd     %xmm9, %xmm3
+        subsd     %xmm14, %xmm15
+        movsd     %xmm15, -56(%rsp)
+        movsd     -48(%rsp), %xmm10
+        movsd     -56(%rsp), %xmm7
+        addsd     %xmm7, %xmm4
+        addsd     4312+_vmldASinHATab(%rip), %xmm3
+        addsd     %xmm2, %xmm4
+        addsd     %xmm5, %xmm3
+        addsd     %xmm1, %xmm4
+        addsd     %xmm0, %xmm4
+        movsd     4144+_vmldASinHATab(%rip), %xmm0
+        addsd     %xmm3, %xmm4
+        mulsd     %xmm6, %xmm4
+        mulsd     %xmm10, %xmm6
+        addsd     %xmm8, %xmm4
+        movaps    %xmm0, %xmm8
+        subsd     %xmm6, %xmm8
+        movsd     %xmm8, -48(%rsp)
+        movsd     -48(%rsp), %xmm9
+        subsd     %xmm9, %xmm0
+        subsd     %xmm6, %xmm0
+        movsd     %xmm0, -56(%rsp)
+        movsd     -48(%rsp), %xmm2
+        movsd     -56(%rsp), %xmm1
+        movb      3(%rdi), %dil
+        andb      $-128, %dil
+        addsd     4152+_vmldASinHATab(%rip), %xmm1
+        subsd     %xmm4, %xmm1
+        addsd     %xmm1, %xmm2
+        movsd     %xmm2, -40(%rsp)
+        movb      -33(%rsp), %dl
+        andb      $127, %dl
+        orb       %dil, %dl
+        movb      %dl, -33(%rsp)
+        movsd     -40(%rsp), %xmm3
+        cvtsd2ss  %xmm3, %xmm3
+        movss     %xmm3, (%rsi)
+        ret
+
+.LBL_2_10:
+
+        movl      $1, %eax
+        pxor      %xmm1, %xmm1
+        pxor      %xmm0, %xmm0
+        divss     %xmm0, %xmm1
+        movss     %xmm1, (%rsi)
+
+
+        ret
+
+.LBL_2_12:
+
+        movss     (%rdi), %xmm0
+        divss     %xmm0, %xmm0
+        testl     $8388607, (%rdi)
+        movss     %xmm0, (%rsi)
+        sete      %al
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_sasin_cout_rare_internal,@function
+       .size   __svml_sasin_cout_rare_internal,.-__svml_sasin_cout_rare_internal
+..LN__svml_sasin_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_sasin_data_internal:
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   4294963200
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294959104
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   4294965248
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   3183476740
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1048576001
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1026481159
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1019423339
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1027250868
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1033468946
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1042983679
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   4290772992
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1036306094
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   1042839218
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .long   939876771
+       .type   __svml_sasin_data_internal,@object
+       .size   __svml_sasin_data_internal,1472
+       .align 32
+_vmldASinHATab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072689152
+       .long   0
+       .long   1072685056
+       .long   0
+       .long   1072680960
+       .long   0
+       .long   1072676864
+       .long   0
+       .long   1072672768
+       .long   0
+       .long   1072668672
+       .long   0
+       .long   1072665600
+       .long   0
+       .long   1072661504
+       .long   0
+       .long   1072657408
+       .long   0
+       .long   1072653312
+       .long   0
+       .long   1072649216
+       .long   0
+       .long   1072646144
+       .long   0
+       .long   1072642048
+       .long   0
+       .long   1072637952
+       .long   0
+       .long   1072634880
+       .long   0
+       .long   1072630784
+       .long   0
+       .long   1072626688
+       .long   0
+       .long   1072623616
+       .long   0
+       .long   1072619520
+       .long   0
+       .long   1072615424
+       .long   0
+       .long   1072612352
+       .long   0
+       .long   1072608256
+       .long   0
+       .long   1072605184
+       .long   0
+       .long   1072601088
+       .long   0
+       .long   1072598016
+       .long   0
+       .long   1072593920
+       .long   0
+       .long   1072590848
+       .long   0
+       .long   1072586752
+       .long   0
+       .long   1072583680
+       .long   0
+       .long   1072580608
+       .long   0
+       .long   1072576512
+       .long   0
+       .long   1072573440
+       .long   0
+       .long   1072570368
+       .long   0
+       .long   1072566272
+       .long   0
+       .long   1072563200
+       .long   0
+       .long   1072560128
+       .long   0
+       .long   1072556032
+       .long   0
+       .long   1072552960
+       .long   0
+       .long   1072549888
+       .long   0
+       .long   1072546816
+       .long   0
+       .long   1072542720
+       .long   0
+       .long   1072539648
+       .long   0
+       .long   1072536576
+       .long   0
+       .long   1072533504
+       .long   0
+       .long   1072530432
+       .long   0
+       .long   1072527360
+       .long   0
+       .long   1072523264
+       .long   0
+       .long   1072520192
+       .long   0
+       .long   1072517120
+       .long   0
+       .long   1072514048
+       .long   0
+       .long   1072510976
+       .long   0
+       .long   1072507904
+       .long   0
+       .long   1072504832
+       .long   0
+       .long   1072501760
+       .long   0
+       .long   1072498688
+       .long   0
+       .long   1072495616
+       .long   0
+       .long   1072492544
+       .long   0
+       .long   1072489472
+       .long   0
+       .long   1072486400
+       .long   0
+       .long   1072483328
+       .long   0
+       .long   1072480256
+       .long   0
+       .long   1072478208
+       .long   0
+       .long   1072475136
+       .long   0
+       .long   1072472064
+       .long   0
+       .long   1072468992
+       .long   0
+       .long   1072465920
+       .long   0
+       .long   1072462848
+       .long   0
+       .long   1072459776
+       .long   0
+       .long   1072457728
+       .long   0
+       .long   1072454656
+       .long   0
+       .long   1072451584
+       .long   0
+       .long   1072448512
+       .long   0
+       .long   1072446464
+       .long   0
+       .long   1072443392
+       .long   0
+       .long   1072440320
+       .long   0
+       .long   1072437248
+       .long   0
+       .long   1072435200
+       .long   0
+       .long   1072432128
+       .long   0
+       .long   1072429056
+       .long   0
+       .long   1072427008
+       .long   0
+       .long   1072423936
+       .long   0
+       .long   1072420864
+       .long   0
+       .long   1072418816
+       .long   0
+       .long   1072415744
+       .long   0
+       .long   1072412672
+       .long   0
+       .long   1072410624
+       .long   0
+       .long   1072407552
+       .long   0
+       .long   1072405504
+       .long   0
+       .long   1072402432
+       .long   0
+       .long   1072400384
+       .long   0
+       .long   1072397312
+       .long   0
+       .long   1072395264
+       .long   0
+       .long   1072392192
+       .long   0
+       .long   1072390144
+       .long   0
+       .long   1072387072
+       .long   0
+       .long   1072385024
+       .long   0
+       .long   1072381952
+       .long   0
+       .long   1072379904
+       .long   0
+       .long   1072376832
+       .long   0
+       .long   1072374784
+       .long   0
+       .long   1072371712
+       .long   0
+       .long   1072369664
+       .long   0
+       .long   1072366592
+       .long   0
+       .long   1072364544
+       .long   0
+       .long   1072362496
+       .long   0
+       .long   1072359424
+       .long   0
+       .long   1072357376
+       .long   0
+       .long   1072355328
+       .long   0
+       .long   1072352256
+       .long   0
+       .long   1072350208
+       .long   0
+       .long   1072347136
+       .long   0
+       .long   1072345088
+       .long   0
+       .long   1072343040
+       .long   0
+       .long   1072340992
+       .long   0
+       .long   1072337920
+       .long   0
+       .long   1072335872
+       .long   0
+       .long   1072333824
+       .long   0
+       .long   1072330752
+       .long   0
+       .long   1072328704
+       .long   0
+       .long   1072326656
+       .long   0
+       .long   1072324608
+       .long   0
+       .long   1072321536
+       .long   0
+       .long   1072319488
+       .long   0
+       .long   1072317440
+       .long   0
+       .long   1072315392
+       .long   0
+       .long   1072313344
+       .long   0
+       .long   1072310272
+       .long   0
+       .long   1072308224
+       .long   0
+       .long   1072306176
+       .long   0
+       .long   1072304128
+       .long   0
+       .long   1072302080
+       .long   0
+       .long   1072300032
+       .long   0
+       .long   1072296960
+       .long   0
+       .long   1072294912
+       .long   0
+       .long   1072292864
+       .long   0
+       .long   1072290816
+       .long   0
+       .long   1072288768
+       .long   0
+       .long   1072286720
+       .long   0
+       .long   1072284672
+       .long   0
+       .long   1072282624
+       .long   0
+       .long   1072280576
+       .long   0
+       .long   1072278528
+       .long   0
+       .long   1072275456
+       .long   0
+       .long   1072273408
+       .long   0
+       .long   1072271360
+       .long   0
+       .long   1072269312
+       .long   0
+       .long   1072267264
+       .long   0
+       .long   1072265216
+       .long   0
+       .long   1072263168
+       .long   0
+       .long   1072261120
+       .long   0
+       .long   1072259072
+       .long   0
+       .long   1072257024
+       .long   0
+       .long   1072254976
+       .long   0
+       .long   1072252928
+       .long   0
+       .long   1072250880
+       .long   0
+       .long   1072248832
+       .long   0
+       .long   1072246784
+       .long   0
+       .long   1072244736
+       .long   0
+       .long   1072243712
+       .long   0
+       .long   1072241664
+       .long   0
+       .long   1072239616
+       .long   0
+       .long   1072237568
+       .long   0
+       .long   1072235520
+       .long   0
+       .long   1072233472
+       .long   0
+       .long   1072231424
+       .long   0
+       .long   1072229376
+       .long   0
+       .long   1072227328
+       .long   0
+       .long   1072225280
+       .long   0
+       .long   1072223232
+       .long   0
+       .long   1072222208
+       .long   0
+       .long   1072220160
+       .long   0
+       .long   1072218112
+       .long   0
+       .long   1072216064
+       .long   0
+       .long   1072214016
+       .long   0
+       .long   1072211968
+       .long   0
+       .long   1072210944
+       .long   0
+       .long   1072208896
+       .long   0
+       .long   1072206848
+       .long   0
+       .long   1072204800
+       .long   0
+       .long   1072202752
+       .long   0
+       .long   1072201728
+       .long   0
+       .long   1072199680
+       .long   0
+       .long   1072197632
+       .long   0
+       .long   1072195584
+       .long   0
+       .long   1072193536
+       .long   0
+       .long   1072192512
+       .long   0
+       .long   1072190464
+       .long   0
+       .long   1072188416
+       .long   0
+       .long   1072186368
+       .long   0
+       .long   1072185344
+       .long   0
+       .long   1072183296
+       .long   0
+       .long   1072181248
+       .long   0
+       .long   1072179200
+       .long   0
+       .long   1072178176
+       .long   0
+       .long   1072176128
+       .long   0
+       .long   1072174080
+       .long   0
+       .long   1072173056
+       .long   0
+       .long   1072171008
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072167936
+       .long   0
+       .long   1072165888
+       .long   0
+       .long   1072163840
+       .long   0
+       .long   1072161792
+       .long   0
+       .long   1072160768
+       .long   0
+       .long   1072158720
+       .long   0
+       .long   1072157696
+       .long   0
+       .long   1072155648
+       .long   0
+       .long   1072153600
+       .long   0
+       .long   1072152576
+       .long   0
+       .long   1072150528
+       .long   0
+       .long   1072148480
+       .long   0
+       .long   1072147456
+       .long   0
+       .long   1072145408
+       .long   0
+       .long   1072143360
+       .long   0
+       .long   1072142336
+       .long   0
+       .long   1072140288
+       .long   0
+       .long   1072139264
+       .long   0
+       .long   1072137216
+       .long   0
+       .long   1072135168
+       .long   0
+       .long   1072134144
+       .long   0
+       .long   1072132096
+       .long   0
+       .long   1072131072
+       .long   0
+       .long   1072129024
+       .long   0
+       .long   1072128000
+       .long   0
+       .long   1072125952
+       .long   0
+       .long   1072124928
+       .long   0
+       .long   1072122880
+       .long   0
+       .long   1072120832
+       .long   0
+       .long   1072119808
+       .long   0
+       .long   1072117760
+       .long   0
+       .long   1072116736
+       .long   0
+       .long   1072114688
+       .long   0
+       .long   1072113664
+       .long   0
+       .long   1072111616
+       .long   0
+       .long   1072110592
+       .long   0
+       .long   1072108544
+       .long   0
+       .long   1072107520
+       .long   0
+       .long   1072105472
+       .long   0
+       .long   1072104448
+       .long   0
+       .long   1072102400
+       .long   0
+       .long   1072101376
+       .long   0
+       .long   1072099328
+       .long   0
+       .long   1072098304
+       .long   0
+       .long   1072096256
+       .long   0
+       .long   1072095232
+       .long   0
+       .long   1072094208
+       .long   0
+       .long   1072092160
+       .long   0
+       .long   1072091136
+       .long   0
+       .long   1072089088
+       .long   0
+       .long   1072088064
+       .long   0
+       .long   1072086016
+       .long   0
+       .long   1072084992
+       .long   0
+       .long   1072082944
+       .long   0
+       .long   1072081920
+       .long   0
+       .long   1072080896
+       .long   0
+       .long   1072078848
+       .long   0
+       .long   1072075776
+       .long   0
+       .long   1072073728
+       .long   0
+       .long   1072070656
+       .long   0
+       .long   1072067584
+       .long   0
+       .long   1072064512
+       .long   0
+       .long   1072061440
+       .long   0
+       .long   1072059392
+       .long   0
+       .long   1072056320
+       .long   0
+       .long   1072053248
+       .long   0
+       .long   1072051200
+       .long   0
+       .long   1072048128
+       .long   0
+       .long   1072045056
+       .long   0
+       .long   1072043008
+       .long   0
+       .long   1072039936
+       .long   0
+       .long   1072037888
+       .long   0
+       .long   1072034816
+       .long   0
+       .long   1072031744
+       .long   0
+       .long   1072029696
+       .long   0
+       .long   1072026624
+       .long   0
+       .long   1072024576
+       .long   0
+       .long   1072021504
+       .long   0
+       .long   1072019456
+       .long   0
+       .long   1072016384
+       .long   0
+       .long   1072014336
+       .long   0
+       .long   1072011264
+       .long   0
+       .long   1072009216
+       .long   0
+       .long   1072006144
+       .long   0
+       .long   1072004096
+       .long   0
+       .long   1072002048
+       .long   0
+       .long   1071998976
+       .long   0
+       .long   1071996928
+       .long   0
+       .long   1071993856
+       .long   0
+       .long   1071991808
+       .long   0
+       .long   1071989760
+       .long   0
+       .long   1071986688
+       .long   0
+       .long   1071984640
+       .long   0
+       .long   1071982592
+       .long   0
+       .long   1071979520
+       .long   0
+       .long   1071977472
+       .long   0
+       .long   1071975424
+       .long   0
+       .long   1071972352
+       .long   0
+       .long   1071970304
+       .long   0
+       .long   1071968256
+       .long   0
+       .long   1071966208
+       .long   0
+       .long   1071964160
+       .long   0
+       .long   1071961088
+       .long   0
+       .long   1071959040
+       .long   0
+       .long   1071956992
+       .long   0
+       .long   1071954944
+       .long   0
+       .long   1071952896
+       .long   0
+       .long   1071949824
+       .long   0
+       .long   1071947776
+       .long   0
+       .long   1071945728
+       .long   0
+       .long   1071943680
+       .long   0
+       .long   1071941632
+       .long   0
+       .long   1071939584
+       .long   0
+       .long   1071937536
+       .long   0
+       .long   1071935488
+       .long   0
+       .long   1071933440
+       .long   0
+       .long   1071930368
+       .long   0
+       .long   1071928320
+       .long   0
+       .long   1071926272
+       .long   0
+       .long   1071924224
+       .long   0
+       .long   1071922176
+       .long   0
+       .long   1071920128
+       .long   0
+       .long   1071918080
+       .long   0
+       .long   1071916032
+       .long   0
+       .long   1071913984
+       .long   0
+       .long   1071911936
+       .long   0
+       .long   1071909888
+       .long   0
+       .long   1071907840
+       .long   0
+       .long   1071905792
+       .long   0
+       .long   1071903744
+       .long   0
+       .long   1071901696
+       .long   0
+       .long   1071900672
+       .long   0
+       .long   1071898624
+       .long   0
+       .long   1071896576
+       .long   0
+       .long   1071894528
+       .long   0
+       .long   1071892480
+       .long   0
+       .long   1071890432
+       .long   0
+       .long   1071888384
+       .long   0
+       .long   1071886336
+       .long   0
+       .long   1071884288
+       .long   0
+       .long   1071883264
+       .long   0
+       .long   1071881216
+       .long   0
+       .long   1071879168
+       .long   0
+       .long   1071877120
+       .long   0
+       .long   1071875072
+       .long   0
+       .long   1071873024
+       .long   0
+       .long   1071872000
+       .long   0
+       .long   1071869952
+       .long   0
+       .long   1071867904
+       .long   0
+       .long   1071865856
+       .long   0
+       .long   1071864832
+       .long   0
+       .long   1071862784
+       .long   0
+       .long   1071860736
+       .long   0
+       .long   1071858688
+       .long   0
+       .long   1071856640
+       .long   0
+       .long   1071855616
+       .long   0
+       .long   1071853568
+       .long   0
+       .long   1071851520
+       .long   0
+       .long   1071850496
+       .long   0
+       .long   1071848448
+       .long   0
+       .long   1071846400
+       .long   0
+       .long   1071844352
+       .long   0
+       .long   1071843328
+       .long   0
+       .long   1071841280
+       .long   0
+       .long   1071839232
+       .long   0
+       .long   1071838208
+       .long   0
+       .long   1071836160
+       .long   0
+       .long   1071834112
+       .long   0
+       .long   1071833088
+       .long   0
+       .long   1071831040
+       .long   0
+       .long   1071830016
+       .long   0
+       .long   1071827968
+       .long   0
+       .long   1071825920
+       .long   0
+       .long   1071824896
+       .long   0
+       .long   1071822848
+       .long   0
+       .long   1071821824
+       .long   0
+       .long   1071819776
+       .long   0
+       .long   1071817728
+       .long   0
+       .long   1071816704
+       .long   0
+       .long   1071814656
+       .long   0
+       .long   1071813632
+       .long   0
+       .long   1071811584
+       .long   0
+       .long   1071810560
+       .long   0
+       .long   1071808512
+       .long   0
+       .long   1071806464
+       .long   0
+       .long   1071805440
+       .long   0
+       .long   1071803392
+       .long   0
+       .long   1071802368
+       .long   0
+       .long   1071800320
+       .long   0
+       .long   1071799296
+       .long   0
+       .long   1071797248
+       .long   0
+       .long   1071796224
+       .long   0
+       .long   1071794176
+       .long   0
+       .long   1071793152
+       .long   0
+       .long   1071791104
+       .long   0
+       .long   1071790080
+       .long   0
+       .long   1071788032
+       .long   0
+       .long   1071787008
+       .long   0
+       .long   1071784960
+       .long   0
+       .long   1071783936
+       .long   0
+       .long   1071782912
+       .long   0
+       .long   1071780864
+       .long   0
+       .long   1071779840
+       .long   0
+       .long   1071777792
+       .long   0
+       .long   1071776768
+       .long   0
+       .long   1071774720
+       .long   0
+       .long   1071773696
+       .long   0
+       .long   1071772672
+       .long   0
+       .long   1071770624
+       .long   0
+       .long   1071769600
+       .long   0
+       .long   1071767552
+       .long   0
+       .long   1071766528
+       .long   0
+       .long   1071765504
+       .long   0
+       .long   1071763456
+       .long   0
+       .long   1071762432
+       .long   0
+       .long   1071760384
+       .long   0
+       .long   1071759360
+       .long   0
+       .long   1071758336
+       .long   0
+       .long   1071756288
+       .long   0
+       .long   1071755264
+       .long   0
+       .long   1071754240
+       .long   0
+       .long   1071752192
+       .long   0
+       .long   1071751168
+       .long   0
+       .long   1071750144
+       .long   0
+       .long   1071748096
+       .long   0
+       .long   1071747072
+       .long   0
+       .long   1071746048
+       .long   0
+       .long   1071744000
+       .long   0
+       .long   1071742976
+       .long   0
+       .long   1071741952
+       .long   0
+       .long   1071739904
+       .long   0
+       .long   1071738880
+       .long   0
+       .long   1071737856
+       .long   0
+       .long   1071736832
+       .long   0
+       .long   1071734784
+       .long   0
+       .long   1071733760
+       .long   0
+       .long   1071732736
+       .long   0
+       .long   1071730688
+       .long   0
+       .long   1071729664
+       .long   0
+       .long   1071728640
+       .long   0
+       .long   1071727616
+       .long   0
+       .long   1071725568
+       .long   0
+       .long   1071724544
+       .long   0
+       .long   1071723520
+       .long   0
+       .long   1071722496
+       .long   0
+       .long   1071720448
+       .long   0
+       .long   1071719424
+       .long   0
+       .long   1071718400
+       .long   0
+       .long   1071717376
+       .long   0
+       .long   1071715328
+       .long   0
+       .long   1071714304
+       .long   0
+       .long   1071713280
+       .long   0
+       .long   1071712256
+       .long   0
+       .long   1071711232
+       .long   0
+       .long   1071709184
+       .long   0
+       .long   1071708160
+       .long   0
+       .long   1071707136
+       .long   0
+       .long   1071706112
+       .long   0
+       .long   1071705088
+       .long   0
+       .long   1071704064
+       .long   0
+       .long   1071702016
+       .long   0
+       .long   1071700992
+       .long   0
+       .long   1071699968
+       .long   0
+       .long   1071698944
+       .long   0
+       .long   1071697920
+       .long   0
+       .long   1071696896
+       .long   0
+       .long   1071694848
+       .long   0
+       .long   1071693824
+       .long   0
+       .long   1071692800
+       .long   0
+       .long   1071691776
+       .long   0
+       .long   1071690752
+       .long   0
+       .long   1071689728
+       .long   0
+       .long   1071688704
+       .long   0
+       .long   1071686656
+       .long   0
+       .long   1071685632
+       .long   0
+       .long   1071684608
+       .long   0
+       .long   1071683584
+       .long   0
+       .long   1071682560
+       .long   0
+       .long   1071681536
+       .long   0
+       .long   1071680512
+       .long   0
+       .long   1071679488
+       .long   0
+       .long   1071677440
+       .long   0
+       .long   1071676416
+       .long   0
+       .long   1071675392
+       .long   0
+       .long   1071674368
+       .long   0
+       .long   1071673344
+       .long   0
+       .long   1071672320
+       .long   0
+       .long   1071671296
+       .long   0
+       .long   1071670272
+       .long   0
+       .long   1071669248
+       .long   0
+       .long   1071668224
+       .long   0
+       .long   1071667200
+       .long   0
+       .long   1071666176
+       .long   0
+       .long   1071665152
+       .long   0
+       .long   1071663104
+       .long   0
+       .long   1071662080
+       .long   0
+       .long   1071661056
+       .long   0
+       .long   1071660032
+       .long   0
+       .long   1071659008
+       .long   0
+       .long   1071657984
+       .long   0
+       .long   1071656960
+       .long   0
+       .long   1071655936
+       .long   0
+       .long   1071654912
+       .long   0
+       .long   1071653888
+       .long   0
+       .long   1071652864
+       .long   0
+       .long   1071651840
+       .long   0
+       .long   1071650816
+       .long   0
+       .long   1071649792
+       .long   0
+       .long   1071648768
+       .long   0
+       .long   1071647744
+       .long   0
+       .long   1071646720
+       .long   0
+       .long   1071645696
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1101004800
+       .long   1073741824
+       .long   1095761920
+       .long   256
+       .long   1118830592
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1017118720
+       .long   1413754136
+       .long   1073291771
+       .long   856972295
+       .long   1016178214
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1071644672
+       .long   1476395008
+       .long   1069897045
+       .long   1768958041
+       .long   3189069141
+       .long   805306368
+       .long   1068708659
+       .long   3580333578
+       .long   1040816593
+       .long   3067382784
+       .long   1067899757
+       .long   3397590151
+       .long   1067392113
+       .long   2939529726
+       .long   1066854585
+       .long   1423429166
+       .long   1066517752
+       .long   1775218934
+       .long   1066178574
+       .long   1185392460
+       .long   1065859647
+       .long   289998670
+       .long   1065577550
+       .long   3179807072
+       .long   1065648121
+       .long   3781007284
+       .long   1061576176
+       .long   2482106687
+       .long   1067019199
+       .long   763519713
+       .long   3214591591
+       .long   3695107454
+       .long   1067530646
+       .long   0
+       .long   1073741824
+       .long   1124791109
+       .long   1006764147
+       .long   1476395008
+       .long   1069897045
+       .long   1953913876
+       .long   3189069141
+       .long   805306368
+       .long   1067660083
+       .long   165110192
+       .long   1039768033
+       .long   3067304082
+       .long   1065802605
+       .long   3404727379
+       .long   1064246385
+       .long   2737480376
+       .long   1062660281
+       .long   933797922
+       .long   1061274873
+       .long   1475716730
+       .long   1059887095
+       .long   1511619763
+       .long   1058519827
+       .long   556024211
+       .long   1057187555
+       .long   3482101045
+       .long   1056217350
+       .long   1174622859
+       .long   1050762633
+       .long   899668651
+       .long   1055506366
+       .long   1081094694
+       .long   3202035365
+       .long   2559814773
+       .long   1053906576
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   3218341888
+       .long   0
+       .long   1070694400
+       .long   0
+       .long   3218046976
+       .long   0
+       .long   1070391296
+       .long   0
+       .long   3217739776
+       .type   _vmldASinHATab,@object
+       .size   _vmldASinHATab,4504
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_asinh_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_asinh_d_la.s
new file mode 100644 (file)
index 0000000..ff70160
--- /dev/null
@@ -0,0 +1,876 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *
+ *  *   Compute log(x+sqrt(x*x+1)) using RSQRT14/RSQRT28 for starting the
+ *  *   square root approximation, and small table lookups for log (mapping to
+ *  *   AVX3 permute instructions).
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_asinh8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_asinh8
+
+__svml_asinh8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovaps   %zmm0, %zmm3
+
+/* x^2 */
+        vmulpd    {rn-sae}, %zmm3, %zmm3, %zmm14
+        vmovups   256+__svml_dasinh_data_internal_avx512(%rip), %zmm9
+
+/* polynomial computation for small inputs */
+        vmovups   576+__svml_dasinh_data_internal_avx512(%rip), %zmm10
+        vmovups   640+__svml_dasinh_data_internal_avx512(%rip), %zmm11
+
+/* not a very small input ? */
+        vmovups   384+__svml_dasinh_data_internal_avx512(%rip), %zmm0
+
+/* A=max(x^2, 1); */
+        vmaxpd    {sae}, %zmm14, %zmm9, %zmm4
+
+/* B=min(x^2, 1); */
+        vminpd    {sae}, %zmm14, %zmm9, %zmm5
+        vfmadd231pd {rn-sae}, %zmm14, %zmm10, %zmm11
+
+/* 1+x^2 */
+        vaddpd    {rn-sae}, %zmm9, %zmm14, %zmm8
+
+/* |input| */
+        vandpd    320+__svml_dasinh_data_internal_avx512(%rip), %zmm3, %zmm1
+        vrsqrt14pd %zmm8, %zmm6
+        vcmppd    $21, {sae}, %zmm0, %zmm1, %k2
+
+/* B_high */
+        vsubpd    {rn-sae}, %zmm4, %zmm8, %zmm7
+
+/* sign bit */
+        vxorpd    %zmm3, %zmm1, %zmm2
+        vmulpd    {rn-sae}, %zmm14, %zmm11, %zmm4
+
+/* B_low */
+        vsubpd    {rn-sae}, %zmm7, %zmm5, %zmm13
+        vmovups   832+__svml_dasinh_data_internal_avx512(%rip), %zmm5
+        vmovups   896+__svml_dasinh_data_internal_avx512(%rip), %zmm7
+
+/* polynomial computation for small inputs */
+        vfmadd213pd {rn-sae}, %zmm1, %zmm1, %zmm4
+
+/* (x^2)_low */
+        vmovaps   %zmm3, %zmm15
+        vfmsub213pd {rn-sae}, %zmm14, %zmm3, %zmm15
+
+/* Sh ~sqrt(1+x^2) */
+        vmulpd    {rn-sae}, %zmm6, %zmm8, %zmm14
+
+/* Yl = (x^2)_low + B_low */
+        vaddpd    {rn-sae}, %zmm15, %zmm13, %zmm13
+
+/* very large inputs ? */
+        vmovups   448+__svml_dasinh_data_internal_avx512(%rip), %zmm15
+
+/* (Yh*R0)_low */
+        vfmsub213pd {rn-sae}, %zmm14, %zmm6, %zmm8
+        vcmppd    $21, {sae}, %zmm15, %zmm1, %k1
+
+/* Sl = (Yh*R0)_low+(R0*Yl) */
+        vfmadd213pd {rn-sae}, %zmm8, %zmm6, %zmm13
+        vmovups   512+__svml_dasinh_data_internal_avx512(%rip), %zmm8
+
+/* rel. error term: Eh=1-Sh*R0 */
+        vmovaps   %zmm9, %zmm12
+        vfnmadd231pd {rn-sae}, %zmm14, %zmm6, %zmm12
+        vcmppd    $22, {sae}, %zmm8, %zmm1, %k0
+
+/* rel. error term: Eh=(1-Sh*R0)-Sl*R0 */
+        vfnmadd231pd {rn-sae}, %zmm13, %zmm6, %zmm12
+
+/*
+ * sqrt(1+x^2) ~ Sh + Sl + Sh*Eh*poly_s
+ * poly_s = c1+c2*Eh+c3*Eh^2
+ */
+        vmovups   704+__svml_dasinh_data_internal_avx512(%rip), %zmm6
+        vmovups   768+__svml_dasinh_data_internal_avx512(%rip), %zmm8
+
+/* Sh*Eh */
+        vmulpd    {rn-sae}, %zmm12, %zmm14, %zmm11
+        vfmadd231pd {rn-sae}, %zmm12, %zmm6, %zmm8
+
+/* Sh+x */
+        vaddpd    {rn-sae}, %zmm1, %zmm14, %zmm6
+        kmovw     %k0, %edx
+        vfmadd213pd {rn-sae}, %zmm5, %zmm12, %zmm8
+        vfmadd213pd {rn-sae}, %zmm7, %zmm12, %zmm8
+
+/* Xh */
+        vsubpd    {rn-sae}, %zmm14, %zmm6, %zmm12
+
+/* Sl + Sh*Eh*poly_s */
+        vfmadd213pd {rn-sae}, %zmm13, %zmm8, %zmm11
+
+/* fixup for very large inputs */
+        vmovups   1216+__svml_dasinh_data_internal_avx512(%rip), %zmm8
+
+/* Xl */
+        vsubpd    {rn-sae}, %zmm12, %zmm1, %zmm12
+
+/* Xin0+Sl+Sh*Eh*poly_s ~ x+sqrt(1+x^2) */
+        vaddpd    {rn-sae}, %zmm11, %zmm6, %zmm10
+
+/* Sl_high */
+        vsubpd    {rn-sae}, %zmm6, %zmm10, %zmm5
+        vmulpd    {rn-sae}, %zmm8, %zmm1, %zmm10{%k1}
+
+/* Table lookups */
+        vmovups   __svml_dasinh_data_internal_avx512(%rip), %zmm6
+
+/* Sl_l */
+        vsubpd    {rn-sae}, %zmm5, %zmm11, %zmm7
+        vrcp14pd  %zmm10, %zmm13
+
+/* Xin_low */
+        vaddpd    {rn-sae}, %zmm12, %zmm7, %zmm14
+        vmovups   128+__svml_dasinh_data_internal_avx512(%rip), %zmm7
+        vmovups   1536+__svml_dasinh_data_internal_avx512(%rip), %zmm12
+
+/* round reciprocal to 1+4b mantissas */
+        vpaddq    1088+__svml_dasinh_data_internal_avx512(%rip), %zmm13, %zmm11
+
+/* fixup for very large inputs */
+        vxorpd    %zmm14, %zmm14, %zmm14{%k1}
+        vmovups   1600+__svml_dasinh_data_internal_avx512(%rip), %zmm13
+        vandpd    1152+__svml_dasinh_data_internal_avx512(%rip), %zmm11, %zmm15
+        vmovups   1472+__svml_dasinh_data_internal_avx512(%rip), %zmm11
+
+/* Prepare table index */
+        vpsrlq    $48, %zmm15, %zmm5
+
+/* reduced argument for log(): (Rcp*Xin-1)+Rcp*Xin_low */
+        vfmsub231pd {rn-sae}, %zmm15, %zmm10, %zmm9
+
+/* exponents */
+        vgetexppd {sae}, %zmm15, %zmm8
+        vmovups   1280+__svml_dasinh_data_internal_avx512(%rip), %zmm10
+        vpermt2pd 64+__svml_dasinh_data_internal_avx512(%rip), %zmm5, %zmm6
+        vpermt2pd 192+__svml_dasinh_data_internal_avx512(%rip), %zmm5, %zmm7
+        vsubpd    {rn-sae}, %zmm10, %zmm8, %zmm8{%k1}
+        vfmadd231pd {rn-sae}, %zmm15, %zmm14, %zmm9
+
+/* polynomials */
+        vmovups   1344+__svml_dasinh_data_internal_avx512(%rip), %zmm10
+        vmovups   1408+__svml_dasinh_data_internal_avx512(%rip), %zmm5
+        vmovups   1664+__svml_dasinh_data_internal_avx512(%rip), %zmm14
+
+/* -K*L2H + Th */
+        vmovups   1920+__svml_dasinh_data_internal_avx512(%rip), %zmm15
+        vfmadd231pd {rn-sae}, %zmm9, %zmm10, %zmm5
+
+/* -K*L2L + Tl */
+        vmovups   1984+__svml_dasinh_data_internal_avx512(%rip), %zmm10
+        vfnmadd231pd {rn-sae}, %zmm8, %zmm15, %zmm6
+        vfmadd213pd {rn-sae}, %zmm11, %zmm9, %zmm5
+        vfnmadd213pd {rn-sae}, %zmm7, %zmm10, %zmm8
+        vmovups   1728+__svml_dasinh_data_internal_avx512(%rip), %zmm7
+        vmovups   1856+__svml_dasinh_data_internal_avx512(%rip), %zmm10
+
+/* R^2 */
+        vmulpd    {rn-sae}, %zmm9, %zmm9, %zmm11
+        vfmadd213pd {rn-sae}, %zmm12, %zmm9, %zmm5
+        vfmadd213pd {rn-sae}, %zmm13, %zmm9, %zmm5
+        vfmadd213pd {rn-sae}, %zmm14, %zmm9, %zmm5
+        vfmadd213pd {rn-sae}, %zmm7, %zmm9, %zmm5
+        vmovups   1792+__svml_dasinh_data_internal_avx512(%rip), %zmm7
+        vfmadd213pd {rn-sae}, %zmm7, %zmm9, %zmm5
+        vfmadd213pd {rn-sae}, %zmm10, %zmm9, %zmm5
+
+/* Tl + R^2*Poly */
+        vfmadd213pd {rn-sae}, %zmm8, %zmm11, %zmm5
+
+/* R+Tl + R^2*Poly */
+        vaddpd    {rn-sae}, %zmm9, %zmm5, %zmm9
+        vaddpd    {rn-sae}, %zmm9, %zmm6, %zmm4{%k2}
+        vxorpd    %zmm2, %zmm4, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm3, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dasinh_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_asinh8,@function
+       .size   __svml_asinh8,.-__svml_asinh8
+..LN__svml_asinh8.0:
+
+.L_2__routine_start___svml_dasinh_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dasinh_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        movzwl    6(%rdi), %eax
+        andl      $32752, %eax
+        movq      (%rdi), %rdx
+        cmpl      $32752, %eax
+        jne       .LBL_2_5
+
+
+        testl     $1048575, 4(%rdi)
+        jne       .LBL_2_4
+
+
+        cmpl      $0, (%rdi)
+        je        .LBL_2_5
+
+.LBL_2_4:
+
+        movsd     (%rdi), %xmm0
+        xorl      %eax, %eax
+        mulsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_5:
+
+        movq      %rdx, (%rsi)
+        xorl      %eax, %eax
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dasinh_cout_rare_internal,@function
+       .size   __svml_dasinh_cout_rare_internal,.-__svml_dasinh_cout_rare_internal
+..LN__svml_dasinh_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dasinh_data_internal_avx512:
+       .long   0
+       .long   0
+       .long   3222405120
+       .long   3215919664
+       .long   1848311808
+       .long   3216910087
+       .long   1890025472
+       .long   3217424176
+       .long   3348791296
+       .long   3217854455
+       .long   2880159744
+       .long   3218171740
+       .long   3256631296
+       .long   3218366859
+       .long   4139499520
+       .long   3218553303
+       .long   3971973120
+       .long   3218731811
+       .long   3348791296
+       .long   3218903031
+       .long   1605304320
+       .long   3219067535
+       .long   3827638272
+       .long   3219177074
+       .long   1584414720
+       .long   3219253343
+       .long   860823552
+       .long   3219326935
+       .long   3896934400
+       .long   3219398031
+       .long   643547136
+       .long   3219466797
+       .long   0
+       .long   0
+       .long   3496399314
+       .long   1028893491
+       .long   720371772
+       .long   1026176044
+       .long   1944193543
+       .long   3175338952
+       .long   634920691
+       .long   3175752108
+       .long   1664625295
+       .long   1029304828
+       .long   192624563
+       .long   3177103997
+       .long   3796653051
+       .long   3176138396
+       .long   3062724207
+       .long   3176680434
+       .long   634920691
+       .long   3176800684
+       .long   1913570380
+       .long   3174806221
+       .long   825194088
+       .long   3176465773
+       .long   2335489660
+       .long   3172599741
+       .long   2497625109
+       .long   1029604288
+       .long   914782743
+       .long   1029350199
+       .long   3743595607
+       .long   3175525305
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   0
+       .long   1064304640
+       .long   0
+       .long   1064304640
+       .long   0
+       .long   1064304640
+       .long   0
+       .long   1064304640
+       .long   0
+       .long   1064304640
+       .long   0
+       .long   1064304640
+       .long   0
+       .long   1064304640
+       .long   0
+       .long   1064304640
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   0
+       .long   1608515584
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   246350567
+       .long   1068708642
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   1431445118
+       .long   3217380693
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   26490386
+       .long   1070694400
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   20643840
+       .long   1070858240
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071120384
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   0
+       .long   1074790400
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1075921768
+       .long   3216615856
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   1847891832
+       .long   1069318246
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   2315602889
+       .long   3217031163
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   4145174257
+       .long   1069697314
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   1436264246
+       .long   3217380693
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   2579396527
+       .long   1070176665
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   4294966373
+       .long   3218079743
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   1431655617
+       .long   1070945621
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .type   __svml_dasinh_data_internal_avx512,@object
+       .size   __svml_dasinh_data_internal_avx512,2048
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_asinh_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_asinh_s_la.s
new file mode 100644 (file)
index 0000000..8aacb0b
--- /dev/null
@@ -0,0 +1,675 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *
+ *  *   Compute log(x+sqrt(x*x+1)) using RSQRT14/RSQRT28 for starting the
+ *  *   square root approximation, and small table lookups for log (mapping to
+ *  *   AVX3 permute instructions).
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_asinhf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_asinhf16
+
+__svml_asinhf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovaps   %zmm0, %zmm10
+
+/* x^2 */
+        vmulps    {rn-sae}, %zmm10, %zmm10, %zmm0
+        vmovups   256+__svml_sasinh_data_internal_avx512(%rip), %zmm2
+
+/* polynomial computation for small inputs */
+        vmovups   576+__svml_sasinh_data_internal_avx512(%rip), %zmm1
+
+/* not a very small input ? */
+        vmovups   384+__svml_sasinh_data_internal_avx512(%rip), %zmm11
+
+/* 1+x^2 */
+        vaddps    {rn-sae}, %zmm2, %zmm0, %zmm7
+
+/* |input| */
+        vandps    320+__svml_sasinh_data_internal_avx512(%rip), %zmm10, %zmm12
+
+/* A=max(x^2, 1); */
+        vmaxps    {sae}, %zmm0, %zmm2, %zmm14
+        vrsqrt14ps %zmm7, %zmm8
+
+/* B=min(x^2, 1); */
+        vminps    {sae}, %zmm0, %zmm2, %zmm15
+        vcmpps    $21, {sae}, %zmm11, %zmm12, %k2
+
+/* B_high */
+        vsubps    {rn-sae}, %zmm14, %zmm7, %zmm9
+
+/* sign bit */
+        vxorps    %zmm10, %zmm12, %zmm13
+
+/* Sh ~sqrt(1+x^2) */
+        vmulps    {rn-sae}, %zmm8, %zmm7, %zmm6
+        vmovups   512+__svml_sasinh_data_internal_avx512(%rip), %zmm14
+
+/* B_low */
+        vsubps    {rn-sae}, %zmm9, %zmm15, %zmm3
+
+/* Sh+x */
+        vaddps    {rn-sae}, %zmm12, %zmm6, %zmm15
+
+/* (Yh*R0)_low */
+        vfmsub213ps {rn-sae}, %zmm6, %zmm8, %zmm7
+        vmulps    {rn-sae}, %zmm1, %zmm0, %zmm9
+        vcmpps    $22, {sae}, %zmm14, %zmm12, %k0
+        vmovups   704+__svml_sasinh_data_internal_avx512(%rip), %zmm1
+
+/* polynomial computation for small inputs */
+        vfmadd213ps {rn-sae}, %zmm12, %zmm12, %zmm9
+        kmovw     %k0, %edx
+
+/* (x^2)_low */
+        vmovaps   %zmm10, %zmm4
+        vfmsub213ps {rn-sae}, %zmm0, %zmm10, %zmm4
+
+/* Yl = (x^2)_low + B_low */
+        vaddps    {rn-sae}, %zmm4, %zmm3, %zmm5
+
+/* rel. error term: Eh=1-Sh*R0 */
+        vmovaps   %zmm2, %zmm0
+        vfnmadd231ps {rn-sae}, %zmm6, %zmm8, %zmm0
+
+/* Sl = (Yh*R0)_low+(R0*Yl) */
+        vfmadd213ps {rn-sae}, %zmm7, %zmm8, %zmm5
+
+/* very large inputs ? */
+        vmovups   448+__svml_sasinh_data_internal_avx512(%rip), %zmm7
+
+/* rel. error term: Eh=(1-Sh*R0)-Sl*R0 */
+        vfnmadd231ps {rn-sae}, %zmm5, %zmm8, %zmm0
+
+/* sqrt(1+x^2) ~ Sh + Sl + Sh*Eh*poly_s */
+        vmovups   640+__svml_sasinh_data_internal_avx512(%rip), %zmm8
+        vcmpps    $21, {sae}, %zmm7, %zmm12, %k1
+
+/* Sh*Eh */
+        vmulps    {rn-sae}, %zmm0, %zmm6, %zmm4
+        vfmadd231ps {rn-sae}, %zmm0, %zmm8, %zmm1
+
+/* Sl + Sh*Eh*poly_s */
+        vfmadd213ps {rn-sae}, %zmm5, %zmm1, %zmm4
+
+/* Xh */
+        vsubps    {rn-sae}, %zmm6, %zmm15, %zmm5
+
+/* fixup for very large inputs */
+        vmovups   896+__svml_sasinh_data_internal_avx512(%rip), %zmm6
+
+/* Xin0+Sl+Sh*Eh*poly_s ~ x+sqrt(1+x^2) */
+        vaddps    {rn-sae}, %zmm4, %zmm15, %zmm3
+
+/* Xl */
+        vsubps    {rn-sae}, %zmm5, %zmm12, %zmm5
+
+/* Sl_high */
+        vsubps    {rn-sae}, %zmm15, %zmm3, %zmm0
+        vmulps    {rn-sae}, %zmm6, %zmm12, %zmm3{%k1}
+
+/* -K*L2H + Th */
+        vmovups   1216+__svml_sasinh_data_internal_avx512(%rip), %zmm15
+
+/* Sl_l */
+        vsubps    {rn-sae}, %zmm0, %zmm4, %zmm1
+        vrcp14ps  %zmm3, %zmm6
+
+/* Table lookups */
+        vmovups   __svml_sasinh_data_internal_avx512(%rip), %zmm0
+
+/* Xin_low */
+        vaddps    {rn-sae}, %zmm5, %zmm1, %zmm7
+
+/* round reciprocal to 1+4b mantissas */
+        vpaddd    768+__svml_sasinh_data_internal_avx512(%rip), %zmm6, %zmm4
+        vmovups   1152+__svml_sasinh_data_internal_avx512(%rip), %zmm5
+        vandps    832+__svml_sasinh_data_internal_avx512(%rip), %zmm4, %zmm8
+
+/* fixup for very large inputs */
+        vxorps    %zmm7, %zmm7, %zmm7{%k1}
+
+/* polynomial */
+        vmovups   1024+__svml_sasinh_data_internal_avx512(%rip), %zmm4
+
+/* reduced argument for log(): (Rcp*Xin-1)+Rcp*Xin_low */
+        vfmsub231ps {rn-sae}, %zmm8, %zmm3, %zmm2
+        vmovups   960+__svml_sasinh_data_internal_avx512(%rip), %zmm3
+
+/* exponents */
+        vgetexpps {sae}, %zmm8, %zmm1
+
+/* Prepare table index */
+        vpsrld    $18, %zmm8, %zmm14
+        vfmadd231ps {rn-sae}, %zmm8, %zmm7, %zmm2
+        vmovups   1088+__svml_sasinh_data_internal_avx512(%rip), %zmm7
+        vsubps    {rn-sae}, %zmm3, %zmm1, %zmm1{%k1}
+        vpermt2ps 64+__svml_sasinh_data_internal_avx512(%rip), %zmm14, %zmm0
+        vmovups   128+__svml_sasinh_data_internal_avx512(%rip), %zmm3
+        vfmadd231ps {rn-sae}, %zmm2, %zmm4, %zmm7
+        vfnmadd231ps {rn-sae}, %zmm1, %zmm15, %zmm0
+
+/* R^2 */
+        vmulps    {rn-sae}, %zmm2, %zmm2, %zmm6
+        vfmadd213ps {rn-sae}, %zmm5, %zmm2, %zmm7
+        vpermt2ps 192+__svml_sasinh_data_internal_avx512(%rip), %zmm14, %zmm3
+
+/* -K*L2L + Tl */
+        vmovups   1280+__svml_sasinh_data_internal_avx512(%rip), %zmm14
+        vfnmadd213ps {rn-sae}, %zmm3, %zmm14, %zmm1
+
+/* Tl + R^2*Poly */
+        vfmadd213ps {rn-sae}, %zmm1, %zmm6, %zmm7
+
+/* R+Tl + R^2*Poly */
+        vaddps    {rn-sae}, %zmm2, %zmm7, %zmm2
+        vaddps    {rn-sae}, %zmm2, %zmm0, %zmm9{%k2}
+        vxorps    %zmm13, %zmm9, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm10, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_sasinh_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_asinhf16,@function
+       .size   __svml_asinhf16,.-__svml_asinhf16
+..LN__svml_asinhf16.0:
+
+.L_2__routine_start___svml_sasinh_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_sasinh_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        movl      (%rdi), %eax
+        movl      %eax, -8(%rsp)
+        andl      $2139095040, %eax
+        cmpl      $2139095040, %eax
+        jne       .LBL_2_4
+
+
+        testl     $8388607, -8(%rsp)
+        je        .LBL_2_4
+
+
+        movss     -8(%rsp), %xmm0
+        xorl      %eax, %eax
+        mulss     -8(%rsp), %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_4:
+
+        movl      -8(%rsp), %eax
+        movl      %eax, (%rsi)
+        xorl      %eax, %eax
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_sasinh_cout_rare_internal,@function
+       .size   __svml_sasinh_cout_rare_internal,.-__svml_sasinh_cout_rare_internal
+..LN__svml_sasinh_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_sasinh_data_internal_avx512:
+       .long   0
+       .long   3170631680
+       .long   3178790912
+       .long   3182919680
+       .long   3186704384
+       .long   3189022720
+       .long   3190816768
+       .long   3192561664
+       .long   3194257408
+       .long   3195912192
+       .long   3196796928
+       .long   3197583360
+       .long   3198357504
+       .long   3199111168
+       .long   3199848448
+       .long   3200569344
+       .long   3201277952
+       .long   3201966080
+       .long   3202646016
+       .long   3203309568
+       .long   3203960832
+       .long   3204524032
+       .long   3204837376
+       .long   3205146624
+       .long   3205447680
+       .long   3205744640
+       .long   3206037504
+       .long   3206324224
+       .long   3206606848
+       .long   3206883328
+       .long   3207155712
+       .long   3207424000
+       .long   2147483648
+       .long   3072770974
+       .long   943319038
+       .long   3075640037
+       .long   930648533
+       .long   3089726480
+       .long   936349528
+       .long   944943494
+       .long   897812054
+       .long   3087808175
+       .long   941839444
+       .long   3093478113
+       .long   937982919
+       .long   931430736
+       .long   924853521
+       .long   3075349253
+       .long   945558336
+       .long   3094838221
+       .long   906200662
+       .long   3084126596
+       .long   3088015279
+       .long   3089451852
+       .long   3093678154
+       .long   938521645
+       .long   3091119329
+       .long   3090949395
+       .long   933442244
+       .long   930702671
+       .long   945827699
+       .long   913590776
+       .long   3082066287
+       .long   3087046763
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1015021568
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   1593835520
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   3190466014
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1052770304
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1040187392
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   1082130432
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .type   __svml_sasinh_data_internal_avx512,@object
+       .size   __svml_sasinh_data_internal_avx512,1344
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_atan2_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_atan2_d_la.s
new file mode 100644 (file)
index 0000000..1f3c838
--- /dev/null
@@ -0,0 +1,2395 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *      For    0.0    <= x <=  7.0/16.0: atan(x) = atan(0.0) + atan(s), where s=(x-0.0)/(1.0+0.0*x)
+ *      For  7.0/16.0 <= x <= 11.0/16.0: atan(x) = atan(0.5) + atan(s), where s=(x-0.5)/(1.0+0.5*x)
+ *      For 11.0/16.0 <= x <= 19.0/16.0: atan(x) = atan(1.0) + atan(s), where s=(x-1.0)/(1.0+1.0*x)
+ *      For 19.0/16.0 <= x <= 39.0/16.0: atan(x) = atan(1.5) + atan(s), where s=(x-1.5)/(1.0+1.5*x)
+ *      For 39.0/16.0 <= x <=    inf   : atan(x) = atan(inf) + atan(s), where s=-1.0/x
+ *      Where atan(s) ~= s+s^3*Poly11(s^2) on interval |s|<7.0/0.16.
+ * --
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_atan28_z0_0:
+
+       .align    16,0x90
+       .globl __svml_atan28
+
+__svml_atan28:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $256, %rsp
+        xorl      %edx, %edx
+
+
+        vmovups   1728+__svml_datan2_data_internal(%rip), %zmm4
+
+/* Argument signs */
+        vmovups   1536+__svml_datan2_data_internal(%rip), %zmm6
+
+/*
+ * 1) If y<x then a= y, b=x, PIO2=0
+ * 2) If y>x then a=-x, b=y, PIO2=Pi/2
+ */
+        vmovups   64+__svml_datan2_data_internal(%rip), %zmm3
+        vandpd    %zmm4, %zmm0, %zmm11
+        vmovaps   %zmm1, %zmm7
+        vandpd    %zmm4, %zmm7, %zmm2
+        vandpd    %zmm6, %zmm7, %zmm5
+        vandpd    %zmm6, %zmm0, %zmm4
+        vorpd     %zmm6, %zmm2, %zmm12
+        vcmppd    $17, {sae}, %zmm2, %zmm11, %k1
+        vmovdqu   1664+__svml_datan2_data_internal(%rip), %ymm6
+        vmovups   %zmm11, 64(%rsp)
+
+/* Check if y and x are on main path. */
+        vpsrlq    $32, %zmm2, %zmm9
+        vblendmpd %zmm11, %zmm12, %zmm13{%k1}
+        vblendmpd %zmm2, %zmm11, %zmm15{%k1}
+        vpsrlq    $32, %zmm11, %zmm8
+        vmovdqu   1600+__svml_datan2_data_internal(%rip), %ymm12
+        vdivpd    {rn-sae}, %zmm15, %zmm13, %zmm1
+        vmovups   %zmm15, (%rsp)
+        vpmovqd   %zmm9, %ymm14
+        vpmovqd   %zmm8, %ymm10
+        vxorpd    %zmm3, %zmm3, %zmm3{%k1}
+        vpsubd    %ymm12, %ymm14, %ymm13
+        vpsubd    %ymm12, %ymm10, %ymm9
+
+/* Polynomial. */
+        vmulpd    {rn-sae}, %zmm1, %zmm1, %zmm12
+        vpcmpgtd  %ymm6, %ymm13, %ymm15
+        vpcmpeqd  %ymm6, %ymm13, %ymm11
+        vmulpd    {rn-sae}, %zmm12, %zmm12, %zmm13
+        vpor      %ymm11, %ymm15, %ymm8
+        vmovups   256+__svml_datan2_data_internal(%rip), %zmm11
+        vmovups   512+__svml_datan2_data_internal(%rip), %zmm15
+        vpcmpgtd  %ymm6, %ymm9, %ymm14
+        vpcmpeqd  %ymm6, %ymm9, %ymm6
+        vpor      %ymm6, %ymm14, %ymm10
+        vmulpd    {rn-sae}, %zmm13, %zmm13, %zmm14
+        vmovups   320+__svml_datan2_data_internal(%rip), %zmm9
+        vpor      %ymm10, %ymm8, %ymm6
+        vmovups   384+__svml_datan2_data_internal(%rip), %zmm10
+        vfmadd231pd {rn-sae}, %zmm14, %zmm11, %zmm15
+        vmovups   576+__svml_datan2_data_internal(%rip), %zmm11
+        vmovups   704+__svml_datan2_data_internal(%rip), %zmm8
+        vfmadd231pd {rn-sae}, %zmm14, %zmm9, %zmm11
+        vmovups   640+__svml_datan2_data_internal(%rip), %zmm9
+        vfmadd231pd {rn-sae}, %zmm14, %zmm10, %zmm9
+        vmovups   448+__svml_datan2_data_internal(%rip), %zmm10
+        vfmadd231pd {rn-sae}, %zmm14, %zmm10, %zmm8
+        vmovups   768+__svml_datan2_data_internal(%rip), %zmm10
+        vfmadd213pd {rn-sae}, %zmm10, %zmm14, %zmm15
+        vmovups   832+__svml_datan2_data_internal(%rip), %zmm10
+        vfmadd213pd {rn-sae}, %zmm10, %zmm14, %zmm11
+        vmovups   896+__svml_datan2_data_internal(%rip), %zmm10
+        vfmadd213pd {rn-sae}, %zmm10, %zmm14, %zmm9
+        vmovups   960+__svml_datan2_data_internal(%rip), %zmm10
+        vfmadd213pd {rn-sae}, %zmm10, %zmm14, %zmm8
+        vmovups   1024+__svml_datan2_data_internal(%rip), %zmm10
+        vfmadd213pd {rn-sae}, %zmm10, %zmm14, %zmm15
+        vmovups   1088+__svml_datan2_data_internal(%rip), %zmm10
+        vfmadd213pd {rn-sae}, %zmm10, %zmm14, %zmm11
+        vmovups   1152+__svml_datan2_data_internal(%rip), %zmm10
+        vfmadd213pd {rn-sae}, %zmm10, %zmm14, %zmm9
+        vmovups   1216+__svml_datan2_data_internal(%rip), %zmm10
+        vfmadd213pd {rn-sae}, %zmm10, %zmm14, %zmm8
+        vmovups   1280+__svml_datan2_data_internal(%rip), %zmm10
+
+/* A00=1.0, account for it later  VQFMA(D, dP4, dP4, dR8, dA00); */
+        vmulpd    {rn-sae}, %zmm14, %zmm8, %zmm8
+        vfmadd213pd {rn-sae}, %zmm10, %zmm14, %zmm15
+        vmovups   1344+__svml_datan2_data_internal(%rip), %zmm10
+        vfmadd213pd {rn-sae}, %zmm10, %zmm14, %zmm11
+        vmovups   1408+__svml_datan2_data_internal(%rip), %zmm10
+        vfmadd213pd {rn-sae}, %zmm11, %zmm12, %zmm15
+        vfmadd213pd {rn-sae}, %zmm10, %zmm14, %zmm9
+        vfmadd213pd {rn-sae}, %zmm8, %zmm12, %zmm9
+        vmovups   __svml_datan2_data_internal(%rip), %zmm8
+        vfmadd213pd {rn-sae}, %zmm9, %zmm13, %zmm15
+
+/*
+ * Reconstruction.
+ * dP=(R+R*dP) + dPIO2
+ */
+        vfmadd213pd {rn-sae}, %zmm1, %zmm1, %zmm15
+        vaddpd    {rn-sae}, %zmm3, %zmm15, %zmm1
+        vorpd     %zmm5, %zmm1, %zmm9
+
+/* if x<0, dPI = Pi, else dPI =0 */
+        vmovups   1792+__svml_datan2_data_internal(%rip), %zmm1
+        vcmppd    $18, {sae}, %zmm1, %zmm7, %k2
+        vaddpd    {rn-sae}, %zmm8, %zmm9, %zmm9{%k2}
+        vmovmskps %ymm6, %eax
+        vorpd     %zmm4, %zmm9, %zmm11
+
+/* =========== Special branch for fast (vector) processing of zero arguments ================ */
+        vmovups   64(%rsp), %zmm9
+        testl     %eax, %eax
+        jne       .LBL_1_12
+
+.LBL_1_2:
+
+
+/*
+ * =========== Special branch for fast (vector) processing of zero arguments ================
+ * -------------- The end of implementation ----------------
+ */
+        testl     %edx, %edx
+        jne       .LBL_1_4
+
+.LBL_1_3:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm11, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_4:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm7, 128(%rsp)
+        vmovups   %zmm11, 192(%rsp)
+        je        .LBL_1_3
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x28, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x38, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x18, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x08, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_8:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_11
+
+.LBL_1_9:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_8
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   192(%rsp), %zmm11
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_3
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x28, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x38, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x18, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x08, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_11:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+        lea       192(%rsp,%r12,8), %rdx
+
+        call      __svml_datan2_cout_rare_internal
+        jmp       .LBL_1_9
+       .cfi_restore 4
+       .cfi_restore 5
+       .cfi_restore 12
+       .cfi_restore 13
+       .cfi_restore 122
+       .cfi_restore 123
+       .cfi_restore 124
+       .cfi_restore 125
+
+.LBL_1_12:
+
+
+/* Check if both X & Y are not NaNs:  iXYnotNAN */
+        vcmppd    $3, {sae}, %zmm7, %zmm7, %k1
+        vcmppd    $3, {sae}, %zmm0, %zmm0, %k2
+
+/* Check if at least on of Y or Y is zero: iAXAYZERO */
+        vmovups   1792+__svml_datan2_data_internal(%rip), %zmm8
+        vpbroadcastq .L_2il0floatpacket.31(%rip), %zmm10
+        vcmppd    $4, {sae}, %zmm8, %zmm2, %k3
+        vmovaps   %zmm10, %zmm12
+        vmovaps   %zmm10, %zmm15
+        vmovaps   %zmm10, %zmm13
+        vpandnq   %zmm7, %zmm7, %zmm12{%k1}
+        vcmppd    $4, {sae}, %zmm8, %zmm9, %k1
+        vpandnq   %zmm2, %zmm2, %zmm15{%k3}
+        vmovaps   %zmm10, %zmm2
+
+/* Res = sign(Y)*(X<0)?(PIO2+PI):PIO2 */
+        vpcmpgtq  %zmm7, %zmm8, %k3
+        vpandnq   %zmm0, %zmm0, %zmm13{%k2}
+        vpandnq   %zmm9, %zmm9, %zmm2{%k1}
+        vandpd    %zmm13, %zmm12, %zmm14
+        vorpd     %zmm2, %zmm15, %zmm9
+        vpsrlq    $32, %zmm14, %zmm1
+        vpsrlq    $32, %zmm9, %zmm2
+        vpmovqd   %zmm1, %ymm1
+        vpmovqd   %zmm2, %ymm9
+
+/* Check if at least on of Y or Y is zero and not NaN: iAXAYZEROnotNAN */
+        vpand     %ymm1, %ymm9, %ymm2
+
+/*
+ * -------- Path for zero arguments (at least one of both) --------------
+ * Check if both args are zeros (den. is zero)
+ */
+        vmovups   (%rsp), %zmm1
+
+/* Exclude from previous callout mask zero (and not NaN) arguments */
+        vpandn    %ymm6, %ymm2, %ymm6
+        vcmppd    $4, {sae}, %zmm8, %zmm1, %k2
+
+/* Go to callout */
+        vmovmskps %ymm6, %edx
+        vpandnq   %zmm1, %zmm1, %zmm10{%k2}
+
+/* Set sPIO2 to zero if den. is zero */
+        vpandnq   %zmm3, %zmm10, %zmm3
+        vpandq    %zmm10, %zmm8, %zmm1
+        vporq     %zmm1, %zmm3, %zmm3
+        vorpd     %zmm5, %zmm3, %zmm1
+        vmovups   __svml_datan2_data_internal(%rip), %zmm5
+        vaddpd    {rn-sae}, %zmm5, %zmm1, %zmm1{%k3}
+        vorpd     %zmm4, %zmm1, %zmm1
+
+/* Merge results from main and spec path */
+        vpmovzxdq %ymm2, %zmm4
+        vpsllq    $32, %zmm4, %zmm2
+        vpord     %zmm2, %zmm4, %zmm3
+        vpandnq   %zmm11, %zmm3, %zmm11
+        vpandq    %zmm3, %zmm1, %zmm1
+        vporq     %zmm1, %zmm11, %zmm11
+        jmp       .LBL_1_2
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_atan28,@function
+       .size   __svml_atan28,.-__svml_atan28
+..LN__svml_atan28.0:
+
+.L_2__routine_start___svml_datan2_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_datan2_cout_rare_internal:
+
+
+       .cfi_startproc
+..L65:
+
+        movq      %rdx, %rcx
+        movsd     1888+__datan2_la_CoutTab(%rip), %xmm1
+        movsd     (%rdi), %xmm2
+        movsd     (%rsi), %xmm0
+        mulsd     %xmm1, %xmm2
+        mulsd     %xmm0, %xmm1
+        movsd     %xmm2, -48(%rsp)
+        movsd     %xmm1, -40(%rsp)
+        movzwl    -42(%rsp), %r9d
+        andl      $32752, %r9d
+        movb      -33(%rsp), %al
+        movzwl    -34(%rsp), %r8d
+        andb      $-128, %al
+        andl      $32752, %r8d
+        shrl      $4, %r9d
+        movb      -41(%rsp), %dl
+        shrb      $7, %dl
+        shrb      $7, %al
+        shrl      $4, %r8d
+        cmpl      $2047, %r9d
+        je        .LBL_2_49
+
+
+        cmpl      $2047, %r8d
+        je        .LBL_2_38
+
+
+        testl     %r9d, %r9d
+        jne       .LBL_2_6
+
+
+        testl     $1048575, -44(%rsp)
+        jne       .LBL_2_6
+
+
+        cmpl      $0, -48(%rsp)
+        je        .LBL_2_31
+
+.LBL_2_6:
+
+        testl     %r8d, %r8d
+        jne       .LBL_2_9
+
+
+        testl     $1048575, -36(%rsp)
+        jne       .LBL_2_9
+
+
+        cmpl      $0, -40(%rsp)
+        je        .LBL_2_29
+
+.LBL_2_9:
+
+        negl      %r8d
+        movsd     %xmm2, -48(%rsp)
+        addl      %r9d, %r8d
+        movsd     %xmm1, -40(%rsp)
+        movb      -41(%rsp), %dil
+        movb      -33(%rsp), %sil
+        andb      $127, %dil
+        andb      $127, %sil
+        cmpl      $-54, %r8d
+        jle       .LBL_2_24
+
+
+        cmpl      $54, %r8d
+        jge       .LBL_2_21
+
+
+        movb      %sil, -33(%rsp)
+        movb      %dil, -41(%rsp)
+        testb     %al, %al
+        jne       .LBL_2_13
+
+
+        movsd     1976+__datan2_la_CoutTab(%rip), %xmm1
+        movaps    %xmm1, %xmm0
+        jmp       .LBL_2_14
+
+.LBL_2_13:
+
+        movsd     1936+__datan2_la_CoutTab(%rip), %xmm1
+        movsd     1944+__datan2_la_CoutTab(%rip), %xmm0
+
+.LBL_2_14:
+
+        movsd     -48(%rsp), %xmm4
+        movsd     -40(%rsp), %xmm2
+        movaps    %xmm4, %xmm5
+        divsd     %xmm2, %xmm5
+        movzwl    -42(%rsp), %esi
+        movsd     %xmm5, -16(%rsp)
+        testl     %r9d, %r9d
+        jle       .LBL_2_37
+
+
+        cmpl      $2046, %r9d
+        jge       .LBL_2_17
+
+
+        andl      $-32753, %esi
+        addl      $-1023, %r9d
+        movsd     %xmm4, -48(%rsp)
+        addl      $16368, %esi
+        movw      %si, -42(%rsp)
+        jmp       .LBL_2_18
+
+.LBL_2_17:
+
+        movsd     1992+__datan2_la_CoutTab(%rip), %xmm3
+        movl      $1022, %r9d
+        mulsd     %xmm3, %xmm4
+        movsd     %xmm4, -48(%rsp)
+
+.LBL_2_18:
+
+        negl      %r9d
+        addl      $1023, %r9d
+        andl      $2047, %r9d
+        movzwl    1894+__datan2_la_CoutTab(%rip), %esi
+        movsd     1888+__datan2_la_CoutTab(%rip), %xmm3
+        andl      $-32753, %esi
+        shll      $4, %r9d
+        movsd     %xmm3, -40(%rsp)
+        orl       %r9d, %esi
+        movw      %si, -34(%rsp)
+        movsd     -40(%rsp), %xmm4
+        mulsd     %xmm4, %xmm2
+        comisd    1880+__datan2_la_CoutTab(%rip), %xmm5
+        jb        .LBL_2_20
+
+
+        movsd     2000+__datan2_la_CoutTab(%rip), %xmm12
+        movaps    %xmm2, %xmm3
+        mulsd     %xmm2, %xmm12
+        movsd     %xmm12, -72(%rsp)
+        movsd     -72(%rsp), %xmm13
+        movsd     %xmm5, -24(%rsp)
+        subsd     %xmm2, %xmm13
+        movsd     %xmm13, -64(%rsp)
+        movsd     -72(%rsp), %xmm15
+        movsd     -64(%rsp), %xmm14
+        movl      -20(%rsp), %r8d
+        movl      %r8d, %r9d
+        andl      $-524288, %r8d
+        andl      $-1048576, %r9d
+        addl      $262144, %r8d
+        subsd     %xmm14, %xmm15
+        movsd     %xmm15, -72(%rsp)
+        andl      $1048575, %r8d
+        movsd     -72(%rsp), %xmm4
+        orl       %r8d, %r9d
+        movl      $0, -24(%rsp)
+        subsd     %xmm4, %xmm3
+        movl      %r9d, -20(%rsp)
+        movsd     %xmm3, -64(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     -24(%rsp), %xmm11
+        movsd     -64(%rsp), %xmm9
+        mulsd     %xmm11, %xmm5
+        mulsd     %xmm11, %xmm9
+        movsd     1968+__datan2_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm8, %xmm5
+        mulsd     %xmm8, %xmm9
+        movaps    %xmm5, %xmm7
+        movzwl    -10(%rsp), %edi
+        addsd     %xmm9, %xmm7
+        movsd     %xmm7, -72(%rsp)
+        andl      $32752, %edi
+        movsd     -72(%rsp), %xmm6
+        shrl      $4, %edi
+        subsd     %xmm6, %xmm5
+        movl      -12(%rsp), %esi
+        addsd     %xmm5, %xmm9
+        movsd     %xmm9, -64(%rsp)
+        andl      $1048575, %esi
+        movsd     -48(%rsp), %xmm9
+        movsd     -72(%rsp), %xmm3
+        movaps    %xmm9, %xmm12
+        movsd     -64(%rsp), %xmm10
+        movaps    %xmm9, %xmm14
+        movaps    %xmm9, %xmm6
+        addsd     %xmm3, %xmm12
+        movsd     %xmm12, -72(%rsp)
+        movsd     -72(%rsp), %xmm13
+        shll      $20, %edi
+        subsd     %xmm13, %xmm14
+        movsd     %xmm14, -64(%rsp)
+        orl       %esi, %edi
+        movsd     -72(%rsp), %xmm4
+        addl      $-1069547520, %edi
+        movsd     -64(%rsp), %xmm15
+        movl      $113, %esi
+        movsd     2000+__datan2_la_CoutTab(%rip), %xmm13
+        addsd     %xmm15, %xmm4
+        movsd     %xmm4, -56(%rsp)
+        movsd     -64(%rsp), %xmm8
+        sarl      $19, %edi
+        addsd     %xmm3, %xmm8
+        movsd     %xmm8, -64(%rsp)
+        cmpl      $113, %edi
+        movsd     -56(%rsp), %xmm7
+        cmovl     %edi, %esi
+        subsd     %xmm7, %xmm6
+        movsd     %xmm6, -56(%rsp)
+        addl      %esi, %esi
+        movsd     -64(%rsp), %xmm12
+        lea       __datan2_la_CoutTab(%rip), %rdi
+        movsd     -56(%rsp), %xmm5
+        movslq    %esi, %rsi
+        addsd     %xmm5, %xmm12
+        movsd     %xmm12, -56(%rsp)
+        movsd     -72(%rsp), %xmm7
+        mulsd     %xmm7, %xmm13
+        movsd     -56(%rsp), %xmm8
+        movsd     %xmm13, -72(%rsp)
+        addsd     %xmm10, %xmm8
+        movsd     -72(%rsp), %xmm4
+        movaps    %xmm9, %xmm10
+        mulsd     2000+__datan2_la_CoutTab(%rip), %xmm10
+        subsd     %xmm7, %xmm4
+        movsd     %xmm4, -64(%rsp)
+        movsd     -72(%rsp), %xmm3
+        movsd     -64(%rsp), %xmm14
+        subsd     %xmm14, %xmm3
+        movsd     %xmm3, -72(%rsp)
+        movsd     -72(%rsp), %xmm15
+        subsd     %xmm15, %xmm7
+        movsd     %xmm7, -64(%rsp)
+        movsd     -72(%rsp), %xmm7
+        movsd     -64(%rsp), %xmm4
+        movsd     %xmm10, -72(%rsp)
+        movaps    %xmm2, %xmm10
+        addsd     %xmm4, %xmm8
+        movsd     -72(%rsp), %xmm4
+        subsd     -48(%rsp), %xmm4
+        movsd     %xmm4, -64(%rsp)
+        movsd     -72(%rsp), %xmm6
+        movsd     -64(%rsp), %xmm3
+        subsd     %xmm3, %xmm6
+        movaps    %xmm2, %xmm3
+        movsd     %xmm6, -72(%rsp)
+        movsd     -72(%rsp), %xmm5
+        subsd     %xmm5, %xmm9
+        movsd     %xmm9, -64(%rsp)
+        movsd     -72(%rsp), %xmm12
+        movsd     -64(%rsp), %xmm9
+        mulsd     %xmm11, %xmm12
+        mulsd     %xmm11, %xmm9
+        movaps    %xmm12, %xmm11
+        addsd     %xmm9, %xmm11
+        movsd     %xmm11, -72(%rsp)
+        movsd     -72(%rsp), %xmm4
+        subsd     %xmm4, %xmm12
+        addsd     %xmm9, %xmm12
+        movsd     %xmm12, -64(%rsp)
+        movsd     -72(%rsp), %xmm15
+        movsd     -64(%rsp), %xmm6
+        addsd     %xmm15, %xmm3
+        movsd     %xmm3, -72(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     2000+__datan2_la_CoutTab(%rip), %xmm3
+        subsd     %xmm5, %xmm10
+        movsd     %xmm10, -64(%rsp)
+        movsd     -72(%rsp), %xmm13
+        movsd     -64(%rsp), %xmm11
+        addsd     %xmm11, %xmm13
+        movsd     %xmm13, -56(%rsp)
+        movsd     -64(%rsp), %xmm14
+        movsd     2000+__datan2_la_CoutTab(%rip), %xmm13
+        addsd     %xmm14, %xmm15
+        movsd     %xmm15, -64(%rsp)
+        movsd     -56(%rsp), %xmm4
+        movsd     1888+__datan2_la_CoutTab(%rip), %xmm14
+        subsd     %xmm4, %xmm2
+        movsd     %xmm2, -56(%rsp)
+        movsd     -64(%rsp), %xmm4
+        movsd     -56(%rsp), %xmm2
+        addsd     %xmm2, %xmm4
+        movsd     %xmm4, -56(%rsp)
+        movsd     -72(%rsp), %xmm12
+        mulsd     %xmm12, %xmm3
+        movsd     -56(%rsp), %xmm5
+        movsd     %xmm3, -72(%rsp)
+        addsd     %xmm6, %xmm5
+        movsd     -72(%rsp), %xmm9
+        subsd     %xmm12, %xmm9
+        movsd     %xmm9, -64(%rsp)
+        movsd     -72(%rsp), %xmm10
+        movsd     -64(%rsp), %xmm2
+        subsd     %xmm2, %xmm10
+        movsd     %xmm10, -72(%rsp)
+        movsd     -72(%rsp), %xmm11
+        subsd     %xmm11, %xmm12
+        movsd     %xmm12, -64(%rsp)
+        movsd     -72(%rsp), %xmm9
+        divsd     %xmm9, %xmm14
+        mulsd     %xmm14, %xmm13
+        movsd     -64(%rsp), %xmm10
+        movsd     %xmm13, -64(%rsp)
+        addsd     %xmm10, %xmm5
+        movsd     -64(%rsp), %xmm15
+        movsd     1888+__datan2_la_CoutTab(%rip), %xmm12
+        subsd     %xmm14, %xmm15
+        movsd     %xmm15, -56(%rsp)
+        movsd     -64(%rsp), %xmm2
+        movsd     -56(%rsp), %xmm4
+        movsd     2000+__datan2_la_CoutTab(%rip), %xmm13
+        subsd     %xmm4, %xmm2
+        movsd     %xmm2, -56(%rsp)
+        movsd     -56(%rsp), %xmm3
+        mulsd     %xmm3, %xmm9
+        movsd     -56(%rsp), %xmm11
+        subsd     %xmm9, %xmm12
+        mulsd     %xmm11, %xmm5
+        movsd     %xmm5, -64(%rsp)
+        movsd     -64(%rsp), %xmm5
+        subsd     %xmm5, %xmm12
+        movsd     %xmm12, -64(%rsp)
+        movsd     -64(%rsp), %xmm2
+        movq      -56(%rsp), %r10
+        movsd     -64(%rsp), %xmm6
+        movsd     -56(%rsp), %xmm4
+        movq      %r10, -40(%rsp)
+        movsd     -40(%rsp), %xmm3
+        movaps    %xmm3, %xmm5
+        addsd     1888+__datan2_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm7, %xmm5
+        mulsd     %xmm6, %xmm2
+        mulsd     %xmm4, %xmm2
+        mulsd     %xmm2, %xmm7
+        mulsd     %xmm8, %xmm2
+        mulsd     %xmm3, %xmm8
+        addsd     %xmm2, %xmm7
+        movsd     1872+__datan2_la_CoutTab(%rip), %xmm3
+        addsd     %xmm8, %xmm7
+        movsd     %xmm7, -72(%rsp)
+        movaps    %xmm5, %xmm7
+        movsd     -72(%rsp), %xmm4
+        movsd     2000+__datan2_la_CoutTab(%rip), %xmm6
+        addsd     %xmm4, %xmm7
+        movsd     %xmm7, -72(%rsp)
+        movsd     -72(%rsp), %xmm8
+        subsd     %xmm8, %xmm5
+        addsd     %xmm4, %xmm5
+        movsd     %xmm5, -64(%rsp)
+        movsd     -72(%rsp), %xmm11
+        movaps    %xmm11, %xmm2
+        mulsd     %xmm11, %xmm2
+        mulsd     %xmm11, %xmm6
+        mulsd     %xmm2, %xmm3
+        movsd     -64(%rsp), %xmm4
+        movsd     %xmm6, -72(%rsp)
+        movsd     -72(%rsp), %xmm7
+        addsd     1864+__datan2_la_CoutTab(%rip), %xmm3
+        subsd     %xmm11, %xmm7
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm7, -64(%rsp)
+        movsd     -72(%rsp), %xmm9
+        movsd     -64(%rsp), %xmm8
+        addsd     1856+__datan2_la_CoutTab(%rip), %xmm3
+        subsd     %xmm8, %xmm9
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm9, -72(%rsp)
+        movsd     -72(%rsp), %xmm10
+        addsd     1848+__datan2_la_CoutTab(%rip), %xmm3
+        subsd     %xmm10, %xmm11
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm11, -64(%rsp)
+        addsd     1840+__datan2_la_CoutTab(%rip), %xmm3
+        mulsd     %xmm2, %xmm3
+        addsd     1832+__datan2_la_CoutTab(%rip), %xmm3
+        mulsd     %xmm2, %xmm3
+        addsd     1824+__datan2_la_CoutTab(%rip), %xmm3
+        mulsd     %xmm2, %xmm3
+        mulsd     %xmm3, %xmm13
+        movsd     -72(%rsp), %xmm2
+        movsd     -64(%rsp), %xmm12
+        movsd     %xmm13, -72(%rsp)
+        addsd     %xmm12, %xmm4
+        movsd     -72(%rsp), %xmm14
+        subsd     %xmm3, %xmm14
+        movsd     %xmm14, -64(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     -64(%rsp), %xmm15
+        subsd     %xmm15, %xmm5
+        movsd     %xmm5, -72(%rsp)
+        movsd     -72(%rsp), %xmm6
+        subsd     %xmm6, %xmm3
+        movsd     %xmm3, -64(%rsp)
+        movsd     -72(%rsp), %xmm6
+        movsd     -64(%rsp), %xmm5
+        movaps    %xmm6, %xmm12
+        movaps    %xmm5, %xmm3
+        mulsd     %xmm4, %xmm6
+        mulsd     %xmm4, %xmm3
+        mulsd     %xmm2, %xmm5
+        mulsd     %xmm2, %xmm12
+        addsd     %xmm3, %xmm6
+        movaps    %xmm12, %xmm7
+        movaps    %xmm12, %xmm8
+        addsd     %xmm5, %xmm6
+        addsd     %xmm2, %xmm7
+        movsd     %xmm6, -72(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     %xmm7, -72(%rsp)
+        movsd     -72(%rsp), %xmm3
+        subsd     %xmm3, %xmm8
+        movsd     %xmm8, -64(%rsp)
+        movsd     -72(%rsp), %xmm10
+        movsd     -64(%rsp), %xmm9
+        addsd     %xmm9, %xmm10
+        movsd     %xmm10, -56(%rsp)
+        movsd     -64(%rsp), %xmm11
+        addsd     %xmm11, %xmm2
+        movsd     %xmm2, -64(%rsp)
+        movsd     -56(%rsp), %xmm2
+        subsd     %xmm2, %xmm12
+        movsd     %xmm12, -56(%rsp)
+        movsd     -64(%rsp), %xmm14
+        movsd     -56(%rsp), %xmm13
+        addsd     %xmm13, %xmm14
+        movsd     %xmm14, -56(%rsp)
+        movq      -72(%rsp), %r11
+        movsd     -56(%rsp), %xmm15
+        movq      %r11, -40(%rsp)
+        addsd     %xmm15, %xmm4
+        movsd     -40(%rsp), %xmm8
+        addsd     %xmm5, %xmm4
+        movsd     %xmm4, -32(%rsp)
+        movaps    %xmm8, %xmm4
+        movaps    %xmm8, %xmm2
+        addsd     (%rdi,%rsi,8), %xmm4
+        movsd     %xmm4, -72(%rsp)
+        movsd     -72(%rsp), %xmm4
+        subsd     %xmm4, %xmm2
+        movsd     %xmm2, -64(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     -64(%rsp), %xmm3
+        addsd     %xmm3, %xmm5
+        movsd     %xmm5, -56(%rsp)
+        movsd     -64(%rsp), %xmm6
+        addsd     (%rdi,%rsi,8), %xmm6
+        movsd     %xmm6, -64(%rsp)
+        movsd     -56(%rsp), %xmm7
+        subsd     %xmm7, %xmm8
+        movsd     %xmm8, -56(%rsp)
+        movsd     -64(%rsp), %xmm10
+        movsd     -56(%rsp), %xmm9
+        addsd     %xmm9, %xmm10
+        movsd     %xmm10, -56(%rsp)
+        movq      -72(%rsp), %r8
+        movq      %r8, -40(%rsp)
+
+
+        movsd     -56(%rsp), %xmm2
+        movaps    %xmm1, %xmm3
+        shrq      $56, %r8
+        addsd     -32(%rsp), %xmm2
+        shlb      $7, %dl
+        addsd     8(%rdi,%rsi,8), %xmm2
+        movb      %al, %sil
+        andb      $127, %r8b
+        shlb      $7, %sil
+        movsd     %xmm2, -32(%rsp)
+        orb       %sil, %r8b
+        movb      %r8b, -33(%rsp)
+        movsd     -40(%rsp), %xmm9
+        movaps    %xmm9, %xmm5
+        addsd     %xmm9, %xmm3
+        movsd     %xmm3, -72(%rsp)
+        movsd     -72(%rsp), %xmm4
+        movb      -25(%rsp), %dil
+        movb      %dil, %r9b
+        shrb      $7, %dil
+        subsd     %xmm4, %xmm5
+        movsd     %xmm5, -64(%rsp)
+        movsd     -72(%rsp), %xmm7
+        movsd     -64(%rsp), %xmm6
+        xorb      %dil, %al
+        andb      $127, %r9b
+        shlb      $7, %al
+        addsd     %xmm6, %xmm7
+        movsd     %xmm7, -56(%rsp)
+        movsd     -64(%rsp), %xmm8
+        addsd     %xmm8, %xmm1
+        movsd     %xmm1, -64(%rsp)
+        orb       %al, %r9b
+        movsd     -56(%rsp), %xmm1
+        movb      %r9b, -25(%rsp)
+        subsd     %xmm1, %xmm9
+        movsd     %xmm9, -56(%rsp)
+        movsd     -64(%rsp), %xmm11
+        movsd     -56(%rsp), %xmm10
+        addsd     %xmm10, %xmm11
+        movsd     %xmm11, -56(%rsp)
+        movq      -72(%rsp), %rax
+        movsd     -56(%rsp), %xmm12
+        movq      %rax, -40(%rsp)
+        addsd     %xmm12, %xmm0
+        movsd     -40(%rsp), %xmm13
+        addsd     -32(%rsp), %xmm0
+        movsd     %xmm0, -32(%rsp)
+        addsd     %xmm0, %xmm13
+        movsd     %xmm13, -24(%rsp)
+        movb      -17(%rsp), %r10b
+        andb      $127, %r10b
+        orb       %dl, %r10b
+        movb      %r10b, -17(%rsp)
+        movq      -24(%rsp), %rdx
+        movq      %rdx, (%rcx)
+        jmp       .LBL_2_36
+
+.LBL_2_20:
+
+        movsd     -48(%rsp), %xmm12
+        movb      %al, %r8b
+        movaps    %xmm12, %xmm7
+        mulsd     2000+__datan2_la_CoutTab(%rip), %xmm7
+        shlb      $7, %r8b
+        shlb      $7, %dl
+        movsd     %xmm7, -72(%rsp)
+        movsd     -72(%rsp), %xmm8
+        movsd     2000+__datan2_la_CoutTab(%rip), %xmm13
+        movsd     1888+__datan2_la_CoutTab(%rip), %xmm7
+        mulsd     %xmm2, %xmm13
+        subsd     -48(%rsp), %xmm8
+        movsd     %xmm8, -64(%rsp)
+        movsd     -72(%rsp), %xmm10
+        movsd     -64(%rsp), %xmm9
+        subsd     %xmm9, %xmm10
+        movsd     %xmm10, -72(%rsp)
+        movsd     -72(%rsp), %xmm11
+        subsd     %xmm11, %xmm12
+        movsd     %xmm12, -64(%rsp)
+        movsd     -72(%rsp), %xmm6
+        movsd     -64(%rsp), %xmm5
+        movsd     %xmm13, -72(%rsp)
+        movsd     -72(%rsp), %xmm14
+        subsd     %xmm2, %xmm14
+        movsd     %xmm14, -64(%rsp)
+        movsd     -72(%rsp), %xmm4
+        movsd     -64(%rsp), %xmm15
+        subsd     %xmm15, %xmm4
+        movsd     %xmm4, -72(%rsp)
+        movsd     -72(%rsp), %xmm3
+        movsd     1888+__datan2_la_CoutTab(%rip), %xmm4
+        subsd     %xmm3, %xmm2
+        movsd     %xmm2, -64(%rsp)
+        movsd     -72(%rsp), %xmm12
+        divsd     %xmm12, %xmm7
+        movsd     2000+__datan2_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm7, %xmm2
+        movsd     -64(%rsp), %xmm14
+        movsd     %xmm2, -64(%rsp)
+        movsd     -64(%rsp), %xmm8
+        subsd     %xmm7, %xmm8
+        movsd     %xmm8, -56(%rsp)
+        movsd     -64(%rsp), %xmm10
+        movsd     -56(%rsp), %xmm9
+        subsd     %xmm9, %xmm10
+        movsd     %xmm10, -56(%rsp)
+        movsd     -56(%rsp), %xmm11
+        mulsd     %xmm11, %xmm12
+        movsd     -56(%rsp), %xmm13
+        subsd     %xmm12, %xmm4
+        mulsd     %xmm13, %xmm14
+        movsd     %xmm14, -64(%rsp)
+        movsd     -64(%rsp), %xmm15
+        movsd     2000+__datan2_la_CoutTab(%rip), %xmm13
+        subsd     %xmm15, %xmm4
+        movsd     %xmm4, -64(%rsp)
+        movsd     -64(%rsp), %xmm7
+        movq      -56(%rsp), %rsi
+        movsd     -64(%rsp), %xmm2
+        movsd     -56(%rsp), %xmm3
+        movq      %rsi, -40(%rsp)
+        movsd     -40(%rsp), %xmm8
+        movaps    %xmm8, %xmm9
+        addsd     1888+__datan2_la_CoutTab(%rip), %xmm7
+        mulsd     %xmm6, %xmm9
+        mulsd     %xmm5, %xmm8
+        mulsd     %xmm2, %xmm7
+        movsd     -16(%rsp), %xmm2
+        mulsd     %xmm2, %xmm2
+        mulsd     %xmm3, %xmm7
+        movsd     1872+__datan2_la_CoutTab(%rip), %xmm3
+        mulsd     %xmm2, %xmm3
+        mulsd     %xmm7, %xmm6
+        mulsd     %xmm5, %xmm7
+        addsd     1864+__datan2_la_CoutTab(%rip), %xmm3
+        addsd     %xmm7, %xmm6
+        mulsd     %xmm2, %xmm3
+        addsd     %xmm8, %xmm6
+        addsd     1856+__datan2_la_CoutTab(%rip), %xmm3
+        mulsd     %xmm2, %xmm3
+        movaps    %xmm9, %xmm5
+        movsd     %xmm6, -72(%rsp)
+        movsd     -72(%rsp), %xmm4
+        addsd     1848+__datan2_la_CoutTab(%rip), %xmm3
+        addsd     %xmm4, %xmm5
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm5, -72(%rsp)
+        movsd     -72(%rsp), %xmm6
+        movsd     2000+__datan2_la_CoutTab(%rip), %xmm5
+        subsd     %xmm6, %xmm9
+        addsd     1840+__datan2_la_CoutTab(%rip), %xmm3
+        addsd     %xmm4, %xmm9
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm9, -64(%rsp)
+        movsd     -72(%rsp), %xmm11
+        mulsd     %xmm11, %xmm5
+        addsd     1832+__datan2_la_CoutTab(%rip), %xmm3
+        movsd     -64(%rsp), %xmm4
+        movsd     %xmm5, -72(%rsp)
+        movsd     -72(%rsp), %xmm7
+        mulsd     %xmm2, %xmm3
+        subsd     %xmm11, %xmm7
+        movsd     %xmm7, -64(%rsp)
+        movsd     -72(%rsp), %xmm8
+        movsd     -64(%rsp), %xmm6
+        addsd     1824+__datan2_la_CoutTab(%rip), %xmm3
+        subsd     %xmm6, %xmm8
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm8, -72(%rsp)
+        movsd     -72(%rsp), %xmm10
+        mulsd     %xmm3, %xmm13
+        subsd     %xmm10, %xmm11
+        movsd     %xmm11, -64(%rsp)
+        movsd     -72(%rsp), %xmm2
+        movsd     -64(%rsp), %xmm12
+        movsd     %xmm13, -72(%rsp)
+        addsd     %xmm12, %xmm4
+        movsd     -72(%rsp), %xmm14
+        subsd     %xmm3, %xmm14
+        movsd     %xmm14, -64(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     -64(%rsp), %xmm15
+        subsd     %xmm15, %xmm5
+        movsd     %xmm5, -72(%rsp)
+        movsd     -72(%rsp), %xmm6
+        subsd     %xmm6, %xmm3
+        movsd     %xmm3, -64(%rsp)
+        movsd     -72(%rsp), %xmm6
+        movsd     -64(%rsp), %xmm5
+        movaps    %xmm6, %xmm12
+        movaps    %xmm5, %xmm3
+        mulsd     %xmm4, %xmm6
+        mulsd     %xmm4, %xmm3
+        mulsd     %xmm2, %xmm5
+        mulsd     %xmm2, %xmm12
+        addsd     %xmm3, %xmm6
+        movaps    %xmm12, %xmm7
+        movaps    %xmm12, %xmm8
+        addsd     %xmm5, %xmm6
+        addsd     %xmm2, %xmm7
+        movsd     %xmm6, -72(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     %xmm7, -72(%rsp)
+        movsd     -72(%rsp), %xmm3
+        subsd     %xmm3, %xmm8
+        movsd     %xmm8, -64(%rsp)
+        movsd     -72(%rsp), %xmm10
+        movsd     -64(%rsp), %xmm9
+        addsd     %xmm9, %xmm10
+        movsd     %xmm10, -56(%rsp)
+        movsd     -64(%rsp), %xmm11
+        addsd     %xmm11, %xmm2
+        movsd     %xmm2, -64(%rsp)
+        movsd     -56(%rsp), %xmm2
+        subsd     %xmm2, %xmm12
+        movsd     %xmm12, -56(%rsp)
+        movsd     -64(%rsp), %xmm14
+        movsd     -56(%rsp), %xmm13
+        addsd     %xmm13, %xmm14
+        movsd     %xmm14, -56(%rsp)
+        movq      -72(%rsp), %rdi
+        movsd     -56(%rsp), %xmm15
+        movq      %rdi, -40(%rsp)
+        addsd     %xmm15, %xmm4
+        shrq      $56, %rdi
+        addsd     %xmm5, %xmm4
+        andb      $127, %dil
+        orb       %r8b, %dil
+        movb      %dil, -33(%rsp)
+        movsd     %xmm4, -32(%rsp)
+        movaps    %xmm1, %xmm4
+        movsd     -40(%rsp), %xmm7
+        movaps    %xmm7, %xmm2
+        addsd     %xmm7, %xmm4
+        movsd     %xmm4, -72(%rsp)
+        movsd     -72(%rsp), %xmm4
+        movb      -25(%rsp), %r9b
+        movb      %r9b, %r10b
+        shrb      $7, %r9b
+        subsd     %xmm4, %xmm2
+        movsd     %xmm2, -64(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     -64(%rsp), %xmm3
+        xorb      %r9b, %al
+        andb      $127, %r10b
+        shlb      $7, %al
+        addsd     %xmm3, %xmm5
+        movsd     %xmm5, -56(%rsp)
+        movsd     -64(%rsp), %xmm6
+        addsd     %xmm6, %xmm1
+        movsd     %xmm1, -64(%rsp)
+        orb       %al, %r10b
+        movsd     -56(%rsp), %xmm1
+        movb      %r10b, -25(%rsp)
+        subsd     %xmm1, %xmm7
+        movsd     %xmm7, -56(%rsp)
+        movsd     -64(%rsp), %xmm2
+        movsd     -56(%rsp), %xmm1
+        addsd     %xmm1, %xmm2
+        movsd     %xmm2, -56(%rsp)
+        movq      -72(%rsp), %rax
+        movsd     -56(%rsp), %xmm3
+        movq      %rax, -40(%rsp)
+        addsd     %xmm3, %xmm0
+        movsd     -40(%rsp), %xmm4
+        addsd     -32(%rsp), %xmm0
+        movsd     %xmm0, -32(%rsp)
+        addsd     %xmm0, %xmm4
+        movsd     %xmm4, -24(%rsp)
+        movb      -17(%rsp), %r11b
+        andb      $127, %r11b
+        orb       %dl, %r11b
+        movb      %r11b, -17(%rsp)
+        movq      -24(%rsp), %rdx
+        movq      %rdx, (%rcx)
+        jmp       .LBL_2_36
+
+.LBL_2_21:
+
+        cmpl      $74, %r8d
+        jge       .LBL_2_53
+
+
+        movb      %dil, -41(%rsp)
+        divsd     -48(%rsp), %xmm1
+        movsd     1928+__datan2_la_CoutTab(%rip), %xmm0
+        shlb      $7, %dl
+        subsd     %xmm1, %xmm0
+        addsd     1920+__datan2_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %dl, %al
+        movb      %al, -17(%rsp)
+        movq      -24(%rsp), %rdx
+        movq      %rdx, (%rcx)
+        jmp       .LBL_2_36
+
+.LBL_2_24:
+
+        testb     %al, %al
+        jne       .LBL_2_35
+
+
+        movb      %dil, -41(%rsp)
+        movb      %sil, -33(%rsp)
+        movsd     -48(%rsp), %xmm2
+        divsd     -40(%rsp), %xmm2
+        movsd     %xmm2, -24(%rsp)
+        movzwl    -18(%rsp), %eax
+        testl     $32752, %eax
+        je        .LBL_2_27
+
+
+        movsd     1888+__datan2_la_CoutTab(%rip), %xmm0
+        shlb      $7, %dl
+        addsd     %xmm2, %xmm0
+        movsd     %xmm0, -72(%rsp)
+        movsd     -72(%rsp), %xmm1
+        mulsd     %xmm1, %xmm2
+        movsd     %xmm2, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %dl, %al
+        movb      %al, -17(%rsp)
+        movq      -24(%rsp), %rdx
+        movq      %rdx, (%rcx)
+        jmp       .LBL_2_36
+
+.LBL_2_27:
+
+        mulsd     %xmm2, %xmm2
+        shlb      $7, %dl
+        movsd     %xmm2, -72(%rsp)
+        movsd     -72(%rsp), %xmm0
+        addsd     -24(%rsp), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %dl, %al
+        movb      %al, -17(%rsp)
+        movq      -24(%rsp), %rdx
+        movq      %rdx, (%rcx)
+        jmp       .LBL_2_36
+
+.LBL_2_29:
+
+        testl     %r9d, %r9d
+        jne       .LBL_2_53
+
+
+        testl     $1048575, -44(%rsp)
+        jne       .LBL_2_53
+        jmp       .LBL_2_57
+
+.LBL_2_31:
+
+        jne       .LBL_2_53
+
+.LBL_2_33:
+
+        testb     %al, %al
+        jne       .LBL_2_35
+
+.LBL_2_34:
+
+        shlb      $7, %dl
+        movq      1976+__datan2_la_CoutTab(%rip), %rax
+        movq      %rax, -24(%rsp)
+        shrq      $56, %rax
+        andb      $127, %al
+        orb       %dl, %al
+        movb      %al, -17(%rsp)
+        movq      -24(%rsp), %rdx
+        movq      %rdx, (%rcx)
+        jmp       .LBL_2_36
+
+.LBL_2_35:
+
+        movsd     1936+__datan2_la_CoutTab(%rip), %xmm0
+        shlb      $7, %dl
+        addsd     1944+__datan2_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %dl, %al
+        movb      %al, -17(%rsp)
+        movq      -24(%rsp), %rdx
+        movq      %rdx, (%rcx)
+
+.LBL_2_36:
+
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_37:
+
+        movsd     1984+__datan2_la_CoutTab(%rip), %xmm3
+        movl      $-1022, %r9d
+        mulsd     %xmm3, %xmm4
+        movsd     %xmm4, -48(%rsp)
+        jmp       .LBL_2_18
+
+.LBL_2_38:
+
+        cmpl      $2047, %r9d
+        je        .LBL_2_49
+
+.LBL_2_39:
+
+        testl     $1048575, -36(%rsp)
+        jne       .LBL_2_41
+
+
+        cmpl      $0, -40(%rsp)
+        je        .LBL_2_42
+
+.LBL_2_41:
+
+        addsd     %xmm1, %xmm2
+        movsd     %xmm2, (%rcx)
+        jmp       .LBL_2_36
+
+.LBL_2_42:
+
+        cmpl      $2047, %r9d
+        je        .LBL_2_46
+
+
+        testb     %al, %al
+        je        .LBL_2_34
+        jmp       .LBL_2_35
+
+.LBL_2_46:
+
+        testb     %al, %al
+        jne       .LBL_2_48
+
+
+        movsd     1904+__datan2_la_CoutTab(%rip), %xmm0
+        shlb      $7, %dl
+        addsd     1912+__datan2_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %dl, %al
+        movb      %al, -17(%rsp)
+        movq      -24(%rsp), %rdx
+        movq      %rdx, (%rcx)
+        jmp       .LBL_2_36
+
+.LBL_2_48:
+
+        movsd     1952+__datan2_la_CoutTab(%rip), %xmm0
+        shlb      $7, %dl
+        addsd     1960+__datan2_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %dl, %al
+        movb      %al, -17(%rsp)
+        movq      -24(%rsp), %rdx
+        movq      %rdx, (%rcx)
+        jmp       .LBL_2_36
+
+.LBL_2_49:
+
+        testl     $1048575, -44(%rsp)
+        jne       .LBL_2_41
+
+
+        cmpl      $0, -48(%rsp)
+        jne       .LBL_2_41
+
+
+        cmpl      $2047, %r8d
+        je        .LBL_2_39
+
+.LBL_2_53:
+
+        movsd     1920+__datan2_la_CoutTab(%rip), %xmm0
+        shlb      $7, %dl
+        addsd     1928+__datan2_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %dl, %al
+        movb      %al, -17(%rsp)
+        movq      -24(%rsp), %rdx
+        movq      %rdx, (%rcx)
+        jmp       .LBL_2_36
+
+.LBL_2_57:
+
+        cmpl      $0, -48(%rsp)
+        jne       .LBL_2_53
+        jmp       .LBL_2_33
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_datan2_cout_rare_internal,@function
+       .size   __svml_datan2_cout_rare_internal,.-__svml_datan2_cout_rare_internal
+..LN__svml_datan2_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_datan2_data_internal:
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   17919630
+       .long   3202334474
+       .long   17919630
+       .long   3202334474
+       .long   17919630
+       .long   3202334474
+       .long   17919630
+       .long   3202334474
+       .long   17919630
+       .long   3202334474
+       .long   17919630
+       .long   3202334474
+       .long   17919630
+       .long   3202334474
+       .long   17919630
+       .long   3202334474
+       .long   350522012
+       .long   1058555694
+       .long   350522012
+       .long   1058555694
+       .long   350522012
+       .long   1058555694
+       .long   350522012
+       .long   1058555694
+       .long   350522012
+       .long   1058555694
+       .long   350522012
+       .long   1058555694
+       .long   350522012
+       .long   1058555694
+       .long   350522012
+       .long   1058555694
+       .long   934004643
+       .long   3203726773
+       .long   934004643
+       .long   3203726773
+       .long   934004643
+       .long   3203726773
+       .long   934004643
+       .long   3203726773
+       .long   934004643
+       .long   3203726773
+       .long   934004643
+       .long   3203726773
+       .long   934004643
+       .long   3203726773
+       .long   934004643
+       .long   3203726773
+       .long   912675337
+       .long   1059908874
+       .long   912675337
+       .long   1059908874
+       .long   912675337
+       .long   1059908874
+       .long   912675337
+       .long   1059908874
+       .long   912675337
+       .long   1059908874
+       .long   912675337
+       .long   1059908874
+       .long   912675337
+       .long   1059908874
+       .long   912675337
+       .long   1059908874
+       .long   2476035107
+       .long   3209881212
+       .long   2476035107
+       .long   3209881212
+       .long   2476035107
+       .long   3209881212
+       .long   2476035107
+       .long   3209881212
+       .long   2476035107
+       .long   3209881212
+       .long   2476035107
+       .long   3209881212
+       .long   2476035107
+       .long   3209881212
+       .long   2476035107
+       .long   3209881212
+       .long   2927800243
+       .long   1064262173
+       .long   2927800243
+       .long   1064262173
+       .long   2927800243
+       .long   1064262173
+       .long   2927800243
+       .long   1064262173
+       .long   2927800243
+       .long   1064262173
+       .long   2927800243
+       .long   1064262173
+       .long   2927800243
+       .long   1064262173
+       .long   2927800243
+       .long   1064262173
+       .long   1636715437
+       .long   3213013740
+       .long   1636715437
+       .long   3213013740
+       .long   1636715437
+       .long   3213013740
+       .long   1636715437
+       .long   3213013740
+       .long   1636715437
+       .long   3213013740
+       .long   1636715437
+       .long   3213013740
+       .long   1636715437
+       .long   3213013740
+       .long   1636715437
+       .long   3213013740
+       .long   1712395941
+       .long   1066487628
+       .long   1712395941
+       .long   1066487628
+       .long   1712395941
+       .long   1066487628
+       .long   1712395941
+       .long   1066487628
+       .long   1712395941
+       .long   1066487628
+       .long   1712395941
+       .long   1066487628
+       .long   1712395941
+       .long   1066487628
+       .long   1712395941
+       .long   1066487628
+       .long   2961307292
+       .long   3214564995
+       .long   2961307292
+       .long   3214564995
+       .long   2961307292
+       .long   3214564995
+       .long   2961307292
+       .long   3214564995
+       .long   2961307292
+       .long   3214564995
+       .long   2961307292
+       .long   3214564995
+       .long   2961307292
+       .long   3214564995
+       .long   2961307292
+       .long   3214564995
+       .long   213298511
+       .long   1067542936
+       .long   213298511
+       .long   1067542936
+       .long   213298511
+       .long   1067542936
+       .long   213298511
+       .long   1067542936
+       .long   213298511
+       .long   1067542936
+       .long   213298511
+       .long   1067542936
+       .long   213298511
+       .long   1067542936
+       .long   213298511
+       .long   1067542936
+       .long   3848520124
+       .long   3215257506
+       .long   3848520124
+       .long   3215257506
+       .long   3848520124
+       .long   3215257506
+       .long   3848520124
+       .long   3215257506
+       .long   3848520124
+       .long   3215257506
+       .long   3848520124
+       .long   3215257506
+       .long   3848520124
+       .long   3215257506
+       .long   3848520124
+       .long   3215257506
+       .long   3159386171
+       .long   1067969551
+       .long   3159386171
+       .long   1067969551
+       .long   3159386171
+       .long   1067969551
+       .long   3159386171
+       .long   1067969551
+       .long   3159386171
+       .long   1067969551
+       .long   3159386171
+       .long   1067969551
+       .long   3159386171
+       .long   1067969551
+       .long   3159386171
+       .long   1067969551
+       .long   3936393556
+       .long   3215643233
+       .long   3936393556
+       .long   3215643233
+       .long   3936393556
+       .long   3215643233
+       .long   3936393556
+       .long   3215643233
+       .long   3936393556
+       .long   3215643233
+       .long   3936393556
+       .long   3215643233
+       .long   3936393556
+       .long   3215643233
+       .long   3936393556
+       .long   3215643233
+       .long   3177262543
+       .long   1068373833
+       .long   3177262543
+       .long   1068373833
+       .long   3177262543
+       .long   1068373833
+       .long   3177262543
+       .long   1068373833
+       .long   3177262543
+       .long   1068373833
+       .long   3177262543
+       .long   1068373833
+       .long   3177262543
+       .long   1068373833
+       .long   3177262543
+       .long   1068373833
+       .long   9713120
+       .long   3216052356
+       .long   9713120
+       .long   3216052356
+       .long   9713120
+       .long   3216052356
+       .long   9713120
+       .long   3216052356
+       .long   9713120
+       .long   3216052356
+       .long   9713120
+       .long   3216052356
+       .long   9713120
+       .long   3216052356
+       .long   9713120
+       .long   3216052356
+       .long   1227445841
+       .long   1068740906
+       .long   1227445841
+       .long   1068740906
+       .long   1227445841
+       .long   1068740906
+       .long   1227445841
+       .long   1068740906
+       .long   1227445841
+       .long   1068740906
+       .long   1227445841
+       .long   1068740906
+       .long   1227445841
+       .long   1068740906
+       .long   1227445841
+       .long   1068740906
+       .long   163240596
+       .long   3216459216
+       .long   163240596
+       .long   3216459216
+       .long   163240596
+       .long   3216459216
+       .long   163240596
+       .long   3216459216
+       .long   163240596
+       .long   3216459216
+       .long   163240596
+       .long   3216459216
+       .long   163240596
+       .long   3216459216
+       .long   163240596
+       .long   3216459216
+       .long   133682613
+       .long   1069314503
+       .long   133682613
+       .long   1069314503
+       .long   133682613
+       .long   1069314503
+       .long   133682613
+       .long   1069314503
+       .long   133682613
+       .long   1069314503
+       .long   133682613
+       .long   1069314503
+       .long   133682613
+       .long   1069314503
+       .long   133682613
+       .long   1069314503
+       .long   2448315847
+       .long   3217180964
+       .long   2448315847
+       .long   3217180964
+       .long   2448315847
+       .long   3217180964
+       .long   2448315847
+       .long   3217180964
+       .long   2448315847
+       .long   3217180964
+       .long   2448315847
+       .long   3217180964
+       .long   2448315847
+       .long   3217180964
+       .long   2448315847
+       .long   3217180964
+       .long   2576870964
+       .long   1070176665
+       .long   2576870964
+       .long   1070176665
+       .long   2576870964
+       .long   1070176665
+       .long   2576870964
+       .long   1070176665
+       .long   2576870964
+       .long   1070176665
+       .long   2576870964
+       .long   1070176665
+       .long   2576870964
+       .long   1070176665
+       .long   2576870964
+       .long   1070176665
+       .long   1431655365
+       .long   3218429269
+       .long   1431655365
+       .long   3218429269
+       .long   1431655365
+       .long   3218429269
+       .long   1431655365
+       .long   3218429269
+       .long   1431655365
+       .long   3218429269
+       .long   1431655365
+       .long   3218429269
+       .long   1431655365
+       .long   3218429269
+       .long   1431655365
+       .long   3218429269
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   2150629376
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4258267136
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   4293918720
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   133169152
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .type   __svml_datan2_data_internal,@object
+       .size   __svml_datan2_data_internal,2304
+       .align 32
+__datan2_la_CoutTab:
+       .long   3892314112
+       .long   1069799150
+       .long   2332892550
+       .long   1039715405
+       .long   1342177280
+       .long   1070305495
+       .long   270726690
+       .long   1041535749
+       .long   939524096
+       .long   1070817911
+       .long   2253973841
+       .long   3188654726
+       .long   3221225472
+       .long   1071277294
+       .long   3853927037
+       .long   1043226911
+       .long   2818572288
+       .long   1071767563
+       .long   2677759107
+       .long   1044314101
+       .long   3355443200
+       .long   1072103591
+       .long   1636578514
+       .long   3191094734
+       .long   1476395008
+       .long   1072475260
+       .long   1864703685
+       .long   3188646936
+       .long   805306368
+       .long   1072747407
+       .long   192551812
+       .long   3192726267
+       .long   2013265920
+       .long   1072892781
+       .long   2240369452
+       .long   1043768538
+       .long   0
+       .long   1072999953
+       .long   3665168337
+       .long   3192705970
+       .long   402653184
+       .long   1073084787
+       .long   1227953434
+       .long   3192313277
+       .long   2013265920
+       .long   1073142981
+       .long   3853283127
+       .long   1045277487
+       .long   805306368
+       .long   1073187261
+       .long   1676192264
+       .long   3192868861
+       .long   134217728
+       .long   1073217000
+       .long   4290763938
+       .long   1042034855
+       .long   671088640
+       .long   1073239386
+       .long   994303084
+       .long   3189643768
+       .long   402653184
+       .long   1073254338
+       .long   1878067156
+       .long   1042652475
+       .long   1610612736
+       .long   1073265562
+       .long   670314820
+       .long   1045138554
+       .long   3221225472
+       .long   1073273048
+       .long   691126919
+       .long   3189987794
+       .long   3489660928
+       .long   1073278664
+       .long   1618990832
+       .long   3188194509
+       .long   1207959552
+       .long   1073282409
+       .long   2198872939
+       .long   1044806069
+       .long   3489660928
+       .long   1073285217
+       .long   2633982383
+       .long   1042307894
+       .long   939524096
+       .long   1073287090
+       .long   1059367786
+       .long   3189114230
+       .long   2281701376
+       .long   1073288494
+       .long   3158525533
+       .long   1044484961
+       .long   3221225472
+       .long   1073289430
+       .long   286581777
+       .long   1044893263
+       .long   4026531840
+       .long   1073290132
+       .long   2000245215
+       .long   3191647611
+       .long   134217728
+       .long   1073290601
+       .long   4205071590
+       .long   1045035927
+       .long   536870912
+       .long   1073290952
+       .long   2334392229
+       .long   1043447393
+       .long   805306368
+       .long   1073291186
+       .long   2281458177
+       .long   3188885569
+       .long   3087007744
+       .long   1073291361
+       .long   691611507
+       .long   1044733832
+       .long   3221225472
+       .long   1073291478
+       .long   1816229550
+       .long   1044363390
+       .long   2281701376
+       .long   1073291566
+       .long   1993843750
+       .long   3189837440
+       .long   134217728
+       .long   1073291625
+       .long   3654754496
+       .long   1044970837
+       .long   4026531840
+       .long   1073291668
+       .long   3224300229
+       .long   3191935390
+       .long   805306368
+       .long   1073291698
+       .long   2988777976
+       .long   3188950659
+       .long   536870912
+       .long   1073291720
+       .long   1030371341
+       .long   1043402665
+       .long   3221225472
+       .long   1073291734
+       .long   1524463765
+       .long   1044361356
+       .long   3087007744
+       .long   1073291745
+       .long   2754295320
+       .long   1044731036
+       .long   134217728
+       .long   1073291753
+       .long   3099629057
+       .long   1044970710
+       .long   2281701376
+       .long   1073291758
+       .long   962914160
+       .long   3189838838
+       .long   805306368
+       .long   1073291762
+       .long   3543908206
+       .long   3188950786
+       .long   4026531840
+       .long   1073291764
+       .long   1849909620
+       .long   3191935434
+       .long   3221225472
+       .long   1073291766
+       .long   1641333636
+       .long   1044361352
+       .long   536870912
+       .long   1073291768
+       .long   1373968792
+       .long   1043402654
+       .long   134217728
+       .long   1073291769
+       .long   2033191599
+       .long   1044970710
+       .long   3087007744
+       .long   1073291769
+       .long   4117947437
+       .long   1044731035
+       .long   805306368
+       .long   1073291770
+       .long   315378368
+       .long   3188950787
+       .long   2281701376
+       .long   1073291770
+       .long   2428571750
+       .long   3189838838
+       .long   3221225472
+       .long   1073291770
+       .long   1608007466
+       .long   1044361352
+       .long   4026531840
+       .long   1073291770
+       .long   1895711420
+       .long   3191935434
+       .long   134217728
+       .long   1073291771
+       .long   2031108713
+       .long   1044970710
+       .long   536870912
+       .long   1073291771
+       .long   1362518342
+       .long   1043402654
+       .long   805306368
+       .long   1073291771
+       .long   317461253
+       .long   3188950787
+       .long   939524096
+       .long   1073291771
+       .long   4117231784
+       .long   1044731035
+       .long   1073741824
+       .long   1073291771
+       .long   1607942376
+       .long   1044361352
+       .long   1207959552
+       .long   1073291771
+       .long   2428929577
+       .long   3189838838
+       .long   1207959552
+       .long   1073291771
+       .long   2031104645
+       .long   1044970710
+       .long   1342177280
+       .long   1073291771
+       .long   1895722602
+       .long   3191935434
+       .long   1342177280
+       .long   1073291771
+       .long   317465322
+       .long   3188950787
+       .long   1342177280
+       .long   1073291771
+       .long   1362515546
+       .long   1043402654
+       .long   1342177280
+       .long   1073291771
+       .long   1607942248
+       .long   1044361352
+       .long   1342177280
+       .long   1073291771
+       .long   4117231610
+       .long   1044731035
+       .long   1342177280
+       .long   1073291771
+       .long   2031104637
+       .long   1044970710
+       .long   1342177280
+       .long   1073291771
+       .long   1540251232
+       .long   1045150466
+       .long   1342177280
+       .long   1073291771
+       .long   2644671394
+       .long   1045270303
+       .long   1342177280
+       .long   1073291771
+       .long   2399244691
+       .long   1045360181
+       .long   1342177280
+       .long   1073291771
+       .long   803971124
+       .long   1045420100
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192879152
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192849193
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192826724
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192811744
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192800509
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192793019
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192787402
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192783657
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192780848
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192778976
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192777572
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192776635
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192775933
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192775465
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192775114
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774880
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192774704
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192774587
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192774500
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192774441
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192774397
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774368
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192774346
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192774331
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192774320
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192774313
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192774308
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774304
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192774301
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192774299
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192774298
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192774297
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192774296
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774296
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192774296
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1466225875
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1343512524
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1251477510
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1190120835
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1144103328
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1113424990
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1090416237
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1075077068
+       .long   3192774295
+       .long   1431655765
+       .long   3218429269
+       .long   2576978363
+       .long   1070176665
+       .long   2453154343
+       .long   3217180964
+       .long   4189149139
+       .long   1069314502
+       .long   1775019125
+       .long   3216459198
+       .long   273199057
+       .long   1068739452
+       .long   874748308
+       .long   3215993277
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1073741824
+       .long   1413754136
+       .long   1072243195
+       .long   856972295
+       .long   1015129638
+       .long   1413754136
+       .long   1073291771
+       .long   856972295
+       .long   1016178214
+       .long   1413754136
+       .long   1074340347
+       .long   856972295
+       .long   1017226790
+       .long   2134057426
+       .long   1073928572
+       .long   1285458442
+       .long   1016756537
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   0
+       .long   0
+       .long   2144337920
+       .long   0
+       .long   1048576
+       .long   33554432
+       .long   1101004800
+       .type   __datan2_la_CoutTab,@object
+       .size   __datan2_la_CoutTab,2008
+       .align 8
+.L_2il0floatpacket.31:
+       .long   0xffffffff,0xffffffff
+       .type   .L_2il0floatpacket.31,@object
+       .size   .L_2il0floatpacket.31,8
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_atan2_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_atan2_s_la.s
new file mode 100644 (file)
index 0000000..6a1fe9c
--- /dev/null
@@ -0,0 +1,2076 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *      For    0.0    <= x <=  7.0/16.0: atan(x) = atan(0.0) + atan(s), where s=(x-0.0)/(1.0+0.0*x)
+ *      For  7.0/16.0 <= x <= 11.0/16.0: atan(x) = atan(0.5) + atan(s), where s=(x-0.5)/(1.0+0.5*x)
+ *      For 11.0/16.0 <= x <= 19.0/16.0: atan(x) = atan(1.0) + atan(s), where s=(x-1.0)/(1.0+1.0*x)
+ *      For 19.0/16.0 <= x <= 39.0/16.0: atan(x) = atan(1.5) + atan(s), where s=(x-1.5)/(1.0+1.5*x)
+ *      For 39.0/16.0 <= x <=    inf   : atan(x) = atan(inf) + atan(s), where s=-1.0/x
+ *      Where atan(s) ~= s+s^3*Poly11(s^2) on interval |s|<7.0/0.16.
+ * --
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_atan2f16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_atan2f16
+
+__svml_atan2f16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $256, %rsp
+        xorl      %edx, %edx
+
+
+        vmovups   256+__svml_satan2_data_internal(%rip), %zmm6
+        vmovups   64+__svml_satan2_data_internal(%rip), %zmm3
+
+/* Testing on working interval. */
+        vmovups   1024+__svml_satan2_data_internal(%rip), %zmm9
+        vmovups   1088+__svml_satan2_data_internal(%rip), %zmm14
+
+/*
+ * 1) If y<x then a= y, b=x, PIO2=0
+ * 2) If y>x then a=-x, b=y, PIO2=Pi/2
+ */
+        vmovups   320+__svml_satan2_data_internal(%rip), %zmm4
+        vpternlogd $255, %zmm13, %zmm13, %zmm13
+        vmovaps   %zmm1, %zmm8
+        vandps    %zmm6, %zmm8, %zmm2
+        vandps    %zmm6, %zmm0, %zmm1
+        vorps     192+__svml_satan2_data_internal(%rip), %zmm2, %zmm5
+        vpsubd    %zmm9, %zmm2, %zmm10
+        vpsubd    %zmm9, %zmm1, %zmm12
+        vxorps    %zmm2, %zmm8, %zmm7
+        vxorps    %zmm1, %zmm0, %zmm6
+        vcmpps    $17, {sae}, %zmm2, %zmm1, %k1
+        vpcmpgtd  %zmm10, %zmm14, %k2
+        vpcmpgtd  %zmm12, %zmm14, %k3
+        vmovups   576+__svml_satan2_data_internal(%rip), %zmm14
+        vblendmps %zmm1, %zmm5, %zmm11{%k1}
+        vblendmps %zmm2, %zmm1, %zmm5{%k1}
+        vxorps    %zmm4, %zmm4, %zmm4{%k1}
+
+/*
+ * Division a/b.
+ * Enabled when FMA is available and
+ * performance is better with NR iteration
+ */
+        vrcp14ps  %zmm5, %zmm15
+        vfnmadd231ps {rn-sae}, %zmm5, %zmm15, %zmm3
+        vfmadd213ps {rn-sae}, %zmm15, %zmm3, %zmm15
+        vmulps    {rn-sae}, %zmm15, %zmm11, %zmm3
+        vfnmadd231ps {rn-sae}, %zmm5, %zmm3, %zmm11
+        vfmadd213ps {rn-sae}, %zmm3, %zmm11, %zmm15
+        vmovups   448+__svml_satan2_data_internal(%rip), %zmm11
+        vpternlogd $255, %zmm3, %zmm3, %zmm3
+
+/* Polynomial. */
+        vmulps    {rn-sae}, %zmm15, %zmm15, %zmm9
+        vpandnd   %zmm10, %zmm10, %zmm13{%k2}
+        vmulps    {rn-sae}, %zmm9, %zmm9, %zmm10
+        vfmadd231ps {rn-sae}, %zmm10, %zmm11, %zmm14
+        vmovups   640+__svml_satan2_data_internal(%rip), %zmm11
+        vpandnd   %zmm12, %zmm12, %zmm3{%k3}
+        vpord     %zmm3, %zmm13, %zmm3
+        vmovups   704+__svml_satan2_data_internal(%rip), %zmm13
+        vmovups   512+__svml_satan2_data_internal(%rip), %zmm12
+        vptestmd  %zmm3, %zmm3, %k0
+        vfmadd213ps {rn-sae}, %zmm13, %zmm10, %zmm14
+        vfmadd231ps {rn-sae}, %zmm10, %zmm12, %zmm11
+        vmovups   768+__svml_satan2_data_internal(%rip), %zmm12
+        vmovups   832+__svml_satan2_data_internal(%rip), %zmm13
+
+/* =========== Special branch for fast (vector) processing of zero arguments ================ */
+        kortestw  %k0, %k0
+        vfmadd213ps {rn-sae}, %zmm12, %zmm10, %zmm11
+        vmovups   896+__svml_satan2_data_internal(%rip), %zmm12
+        vfmadd213ps {rn-sae}, %zmm13, %zmm10, %zmm14
+        vmovups   960+__svml_satan2_data_internal(%rip), %zmm13
+        vfmadd213ps {rn-sae}, %zmm12, %zmm10, %zmm11
+        vfmadd213ps {rn-sae}, %zmm13, %zmm10, %zmm14
+        vfmadd213ps {rn-sae}, %zmm14, %zmm9, %zmm11
+
+/* Reconstruction. */
+        vfmadd213ps {rn-sae}, %zmm4, %zmm15, %zmm11
+
+/* if x<0, sPI = Pi, else sPI =0 */
+        vmovups   __svml_satan2_data_internal(%rip), %zmm15
+        vorps     %zmm7, %zmm11, %zmm9
+        vcmpps    $18, {sae}, %zmm15, %zmm8, %k1
+        vmovups   384+__svml_satan2_data_internal(%rip), %zmm11
+        vaddps    {rn-sae}, %zmm11, %zmm9, %zmm9{%k1}
+        vorps     %zmm6, %zmm9, %zmm10
+        jne       .LBL_1_12
+
+.LBL_1_2:
+
+
+/*
+ * =========== Special branch for fast (vector) processing of zero arguments ================
+ * -------------- The end of implementation ----------------
+ */
+        testl     %edx, %edx
+        jne       .LBL_1_4
+
+.LBL_1_3:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm10, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_4:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm8, 128(%rsp)
+        vmovups   %zmm10, 192(%rsp)
+        je        .LBL_1_3
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x28, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x38, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x18, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x08, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_8:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_11
+
+.LBL_1_9:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_8
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   192(%rsp), %zmm10
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_3
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x28, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x38, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x18, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x08, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_11:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+        lea       192(%rsp,%r12,4), %rdx
+
+        call      __svml_satan2_cout_rare_internal
+        jmp       .LBL_1_9
+       .cfi_restore 4
+       .cfi_restore 5
+       .cfi_restore 12
+       .cfi_restore 13
+       .cfi_restore 122
+       .cfi_restore 123
+       .cfi_restore 124
+       .cfi_restore 125
+
+.LBL_1_12:
+
+
+/* Check if at least on of Y or Y is zero: iAXAYZERO */
+        vmovups   __svml_satan2_data_internal(%rip), %zmm9
+
+/* Check if both X & Y are not NaNs:  iXYnotNAN */
+        vcmpps    $3, {sae}, %zmm8, %zmm8, %k1
+        vcmpps    $3, {sae}, %zmm0, %zmm0, %k2
+        vpcmpd    $4, %zmm9, %zmm2, %k3
+        vpternlogd $255, %zmm12, %zmm12, %zmm12
+        vpternlogd $255, %zmm13, %zmm13, %zmm13
+        vpternlogd $255, %zmm14, %zmm14, %zmm14
+        vpandnd   %zmm8, %zmm8, %zmm12{%k1}
+        vpcmpd    $4, %zmm9, %zmm1, %k1
+        vpandnd   %zmm0, %zmm0, %zmm13{%k2}
+
+/*
+ * -------- Path for zero arguments (at least one of both) --------------
+ * Check if both args are zeros (den. is zero)
+ */
+        vcmpps    $4, {sae}, %zmm9, %zmm5, %k2
+        vandps    %zmm13, %zmm12, %zmm12
+        vpandnd   %zmm2, %zmm2, %zmm14{%k3}
+        vpternlogd $255, %zmm2, %zmm2, %zmm2
+
+/* Res = sign(Y)*(X<0)?(PIO2+PI):PIO2 */
+        vpcmpgtd  %zmm8, %zmm9, %k3
+        vpandnd   %zmm1, %zmm1, %zmm2{%k1}
+        vpord     %zmm2, %zmm14, %zmm15
+        vpternlogd $255, %zmm2, %zmm2, %zmm2
+        vpandnd   %zmm5, %zmm5, %zmm2{%k2}
+
+/* Set sPIO2 to zero if den. is zero */
+        vpandnd   %zmm4, %zmm2, %zmm4
+        vpandd    %zmm2, %zmm9, %zmm5
+        vpord     %zmm5, %zmm4, %zmm2
+        vorps     %zmm7, %zmm2, %zmm7
+        vaddps    {rn-sae}, %zmm11, %zmm7, %zmm7{%k3}
+        vorps     %zmm6, %zmm7, %zmm6
+
+/* Check if at least on of Y or Y is zero and not NaN: iAXAYZEROnotNAN */
+        vpandd    %zmm12, %zmm15, %zmm1
+
+/* Exclude from previous callout mask zero (and not NaN) arguments */
+        vpandnd   %zmm3, %zmm1, %zmm3
+
+/* Go to callout */
+        vptestmd  %zmm3, %zmm3, %k0
+        kmovw     %k0, %edx
+
+/* Merge results from main and spec path */
+        vpandnd   %zmm10, %zmm1, %zmm10
+        vpandd    %zmm1, %zmm6, %zmm11
+        vpord     %zmm11, %zmm10, %zmm10
+        jmp       .LBL_1_2
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_atan2f16,@function
+       .size   __svml_atan2f16,.-__svml_atan2f16
+..LN__svml_atan2f16.0:
+
+.L_2__routine_start___svml_satan2_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_satan2_cout_rare_internal:
+
+
+       .cfi_startproc
+..L61:
+
+        pxor      %xmm0, %xmm0
+        movss     (%rdi), %xmm3
+        pxor      %xmm1, %xmm1
+        movss     (%rsi), %xmm2
+        movq      %rdx, %r8
+        cvtss2sd  %xmm3, %xmm0
+        cvtss2sd  %xmm2, %xmm1
+        movss     %xmm3, -32(%rsp)
+        movss     %xmm2, -28(%rsp)
+        movsd     %xmm0, -48(%rsp)
+        movsd     %xmm1, -40(%rsp)
+        movzwl    -30(%rsp), %edi
+        andl      $32640, %edi
+        movb      -25(%rsp), %dl
+        movzwl    -42(%rsp), %eax
+        andb      $-128, %dl
+        movzwl    -34(%rsp), %r9d
+        andl      $32752, %eax
+        andl      $32752, %r9d
+        shrl      $7, %edi
+        movb      -29(%rsp), %cl
+        shrb      $7, %cl
+        shrb      $7, %dl
+        shrl      $4, %eax
+        shrl      $4, %r9d
+        cmpl      $255, %edi
+        je        .LBL_2_35
+
+
+        movzwl    -26(%rsp), %esi
+        andl      $32640, %esi
+        cmpl      $32640, %esi
+        je        .LBL_2_35
+
+
+        testl     %eax, %eax
+        jne       .LBL_2_5
+
+
+        testl     $8388607, -32(%rsp)
+        je        .LBL_2_30
+
+.LBL_2_5:
+
+        testl     %r9d, %r9d
+        jne       .LBL_2_7
+
+
+        testl     $8388607, -28(%rsp)
+        je        .LBL_2_27
+
+.LBL_2_7:
+
+        negl      %r9d
+        movsd     %xmm0, -48(%rsp)
+        addl      %eax, %r9d
+        movsd     %xmm1, -40(%rsp)
+        movb      -41(%rsp), %dil
+        movb      -33(%rsp), %sil
+        andb      $127, %dil
+        andb      $127, %sil
+        cmpl      $-54, %r9d
+        jle       .LBL_2_22
+
+
+        cmpl      $54, %r9d
+        jge       .LBL_2_19
+
+
+        movb      %sil, -33(%rsp)
+        movb      %dil, -41(%rsp)
+        testb     %dl, %dl
+        jne       .LBL_2_11
+
+
+        movsd     1976+__satan2_la_CoutTab(%rip), %xmm1
+        movaps    %xmm1, %xmm0
+        jmp       .LBL_2_12
+
+.LBL_2_11:
+
+        movsd     1936+__satan2_la_CoutTab(%rip), %xmm1
+        movsd     1944+__satan2_la_CoutTab(%rip), %xmm0
+
+.LBL_2_12:
+
+        movsd     -48(%rsp), %xmm4
+        movsd     -40(%rsp), %xmm2
+        movaps    %xmm4, %xmm5
+        divsd     %xmm2, %xmm5
+        movzwl    -42(%rsp), %esi
+        movsd     %xmm5, -16(%rsp)
+        testl     %eax, %eax
+        jle       .LBL_2_34
+
+
+        cmpl      $2046, %eax
+        jge       .LBL_2_15
+
+
+        andl      $-32753, %esi
+        addl      $-1023, %eax
+        movsd     %xmm4, -48(%rsp)
+        addl      $16368, %esi
+        movw      %si, -42(%rsp)
+        jmp       .LBL_2_16
+
+.LBL_2_15:
+
+        movsd     1992+__satan2_la_CoutTab(%rip), %xmm3
+        movl      $1022, %eax
+        mulsd     %xmm3, %xmm4
+        movsd     %xmm4, -48(%rsp)
+
+.LBL_2_16:
+
+        negl      %eax
+        movq      1888+__satan2_la_CoutTab(%rip), %rsi
+        addl      $1023, %eax
+        movq      %rsi, -40(%rsp)
+        andl      $2047, %eax
+        shrq      $48, %rsi
+        shll      $4, %eax
+        andl      $-32753, %esi
+        orl       %eax, %esi
+        movw      %si, -34(%rsp)
+        movsd     -40(%rsp), %xmm3
+        mulsd     %xmm3, %xmm2
+        comisd    1880+__satan2_la_CoutTab(%rip), %xmm5
+        jb        .LBL_2_18
+
+
+        movsd     2000+__satan2_la_CoutTab(%rip), %xmm12
+        movaps    %xmm2, %xmm3
+        mulsd     %xmm2, %xmm12
+        movsd     %xmm12, -72(%rsp)
+        movsd     -72(%rsp), %xmm13
+        movsd     %xmm5, -24(%rsp)
+        subsd     %xmm2, %xmm13
+        movsd     %xmm13, -64(%rsp)
+        movsd     -72(%rsp), %xmm15
+        movsd     -64(%rsp), %xmm14
+        movl      -20(%rsp), %edi
+        movl      %edi, %r9d
+        andl      $-524288, %edi
+        andl      $-1048576, %r9d
+        addl      $262144, %edi
+        subsd     %xmm14, %xmm15
+        movsd     %xmm15, -72(%rsp)
+        andl      $1048575, %edi
+        movsd     -72(%rsp), %xmm4
+        orl       %edi, %r9d
+        movl      $0, -24(%rsp)
+        subsd     %xmm4, %xmm3
+        movl      %r9d, -20(%rsp)
+        movsd     %xmm3, -64(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     -24(%rsp), %xmm11
+        movsd     -64(%rsp), %xmm9
+        mulsd     %xmm11, %xmm5
+        mulsd     %xmm11, %xmm9
+        movsd     1968+__satan2_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm8, %xmm5
+        mulsd     %xmm8, %xmm9
+        movaps    %xmm5, %xmm7
+        movzwl    -10(%rsp), %esi
+        addsd     %xmm9, %xmm7
+        movsd     %xmm7, -72(%rsp)
+        andl      $32752, %esi
+        movsd     -72(%rsp), %xmm6
+        shrl      $4, %esi
+        subsd     %xmm6, %xmm5
+        movl      -12(%rsp), %eax
+        addsd     %xmm5, %xmm9
+        movsd     %xmm9, -64(%rsp)
+        andl      $1048575, %eax
+        movsd     -48(%rsp), %xmm9
+        movsd     -72(%rsp), %xmm3
+        movaps    %xmm9, %xmm12
+        movsd     -64(%rsp), %xmm10
+        movaps    %xmm9, %xmm14
+        movaps    %xmm9, %xmm6
+        addsd     %xmm3, %xmm12
+        movsd     %xmm12, -72(%rsp)
+        movsd     -72(%rsp), %xmm13
+        shll      $20, %esi
+        subsd     %xmm13, %xmm14
+        movsd     %xmm14, -64(%rsp)
+        orl       %eax, %esi
+        movsd     -72(%rsp), %xmm4
+        addl      $-1069547520, %esi
+        movsd     -64(%rsp), %xmm15
+        movl      $113, %eax
+        movsd     2000+__satan2_la_CoutTab(%rip), %xmm13
+        addsd     %xmm15, %xmm4
+        movsd     %xmm4, -56(%rsp)
+        movsd     -64(%rsp), %xmm8
+        sarl      $19, %esi
+        addsd     %xmm3, %xmm8
+        movsd     %xmm8, -64(%rsp)
+        cmpl      $113, %esi
+        movsd     -56(%rsp), %xmm7
+        cmovl     %esi, %eax
+        subsd     %xmm7, %xmm6
+        movsd     %xmm6, -56(%rsp)
+        addl      %eax, %eax
+        movsd     -64(%rsp), %xmm12
+        lea       __satan2_la_CoutTab(%rip), %rsi
+        movsd     -56(%rsp), %xmm5
+        movslq    %eax, %rax
+        addsd     %xmm5, %xmm12
+        movsd     %xmm12, -56(%rsp)
+        movsd     -72(%rsp), %xmm7
+        mulsd     %xmm7, %xmm13
+        movsd     -56(%rsp), %xmm8
+        movsd     %xmm13, -72(%rsp)
+        addsd     %xmm10, %xmm8
+        movsd     -72(%rsp), %xmm4
+        movaps    %xmm9, %xmm10
+        mulsd     2000+__satan2_la_CoutTab(%rip), %xmm10
+        subsd     %xmm7, %xmm4
+        movsd     %xmm4, -64(%rsp)
+        movsd     -72(%rsp), %xmm3
+        movsd     -64(%rsp), %xmm14
+        subsd     %xmm14, %xmm3
+        movsd     %xmm3, -72(%rsp)
+        movsd     -72(%rsp), %xmm15
+        subsd     %xmm15, %xmm7
+        movsd     %xmm7, -64(%rsp)
+        movsd     -72(%rsp), %xmm7
+        movsd     -64(%rsp), %xmm4
+        movsd     %xmm10, -72(%rsp)
+        movaps    %xmm2, %xmm10
+        addsd     %xmm4, %xmm8
+        movsd     -72(%rsp), %xmm4
+        subsd     -48(%rsp), %xmm4
+        movsd     %xmm4, -64(%rsp)
+        movsd     -72(%rsp), %xmm6
+        movsd     -64(%rsp), %xmm3
+        subsd     %xmm3, %xmm6
+        movaps    %xmm2, %xmm3
+        movsd     %xmm6, -72(%rsp)
+        movsd     -72(%rsp), %xmm5
+        subsd     %xmm5, %xmm9
+        movsd     %xmm9, -64(%rsp)
+        movsd     -72(%rsp), %xmm12
+        movsd     -64(%rsp), %xmm9
+        mulsd     %xmm11, %xmm12
+        mulsd     %xmm11, %xmm9
+        movaps    %xmm12, %xmm11
+        addsd     %xmm9, %xmm11
+        movsd     %xmm11, -72(%rsp)
+        movsd     -72(%rsp), %xmm4
+        subsd     %xmm4, %xmm12
+        addsd     %xmm9, %xmm12
+        movsd     %xmm12, -64(%rsp)
+        movsd     -72(%rsp), %xmm15
+        movsd     -64(%rsp), %xmm6
+        addsd     %xmm15, %xmm3
+        movsd     %xmm3, -72(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     2000+__satan2_la_CoutTab(%rip), %xmm3
+        subsd     %xmm5, %xmm10
+        movsd     %xmm10, -64(%rsp)
+        movsd     -72(%rsp), %xmm13
+        movsd     -64(%rsp), %xmm11
+        addsd     %xmm11, %xmm13
+        movsd     %xmm13, -56(%rsp)
+        movsd     -64(%rsp), %xmm14
+        movsd     2000+__satan2_la_CoutTab(%rip), %xmm13
+        addsd     %xmm14, %xmm15
+        movsd     %xmm15, -64(%rsp)
+        movsd     -56(%rsp), %xmm4
+        movsd     1888+__satan2_la_CoutTab(%rip), %xmm14
+        subsd     %xmm4, %xmm2
+        movsd     %xmm2, -56(%rsp)
+        movsd     -64(%rsp), %xmm4
+        movsd     -56(%rsp), %xmm2
+        addsd     %xmm2, %xmm4
+        movsd     %xmm4, -56(%rsp)
+        movsd     -72(%rsp), %xmm12
+        mulsd     %xmm12, %xmm3
+        movsd     -56(%rsp), %xmm5
+        movsd     %xmm3, -72(%rsp)
+        addsd     %xmm6, %xmm5
+        movsd     -72(%rsp), %xmm9
+        subsd     %xmm12, %xmm9
+        movsd     %xmm9, -64(%rsp)
+        movsd     -72(%rsp), %xmm10
+        movsd     -64(%rsp), %xmm2
+        subsd     %xmm2, %xmm10
+        movsd     %xmm10, -72(%rsp)
+        movsd     -72(%rsp), %xmm11
+        subsd     %xmm11, %xmm12
+        movsd     %xmm12, -64(%rsp)
+        movsd     -72(%rsp), %xmm9
+        divsd     %xmm9, %xmm14
+        mulsd     %xmm14, %xmm13
+        movsd     -64(%rsp), %xmm10
+        movsd     %xmm13, -64(%rsp)
+        addsd     %xmm10, %xmm5
+        movsd     -64(%rsp), %xmm15
+        movsd     1888+__satan2_la_CoutTab(%rip), %xmm12
+        subsd     %xmm14, %xmm15
+        movsd     %xmm15, -56(%rsp)
+        movsd     -64(%rsp), %xmm2
+        movsd     -56(%rsp), %xmm4
+        movsd     2000+__satan2_la_CoutTab(%rip), %xmm13
+        subsd     %xmm4, %xmm2
+        movsd     %xmm2, -56(%rsp)
+        movsd     -56(%rsp), %xmm3
+        mulsd     %xmm3, %xmm9
+        movsd     -56(%rsp), %xmm11
+        subsd     %xmm9, %xmm12
+        mulsd     %xmm11, %xmm5
+        movsd     %xmm5, -64(%rsp)
+        movsd     -64(%rsp), %xmm5
+        subsd     %xmm5, %xmm12
+        movsd     %xmm12, -64(%rsp)
+        movsd     -64(%rsp), %xmm2
+        movq      -56(%rsp), %r10
+        movsd     -64(%rsp), %xmm6
+        movsd     -56(%rsp), %xmm4
+        movq      %r10, -40(%rsp)
+        movsd     -40(%rsp), %xmm3
+        movaps    %xmm3, %xmm5
+        addsd     1888+__satan2_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm7, %xmm5
+        mulsd     %xmm6, %xmm2
+        mulsd     %xmm4, %xmm2
+        mulsd     %xmm2, %xmm7
+        mulsd     %xmm8, %xmm2
+        mulsd     %xmm3, %xmm8
+        addsd     %xmm2, %xmm7
+        movsd     1872+__satan2_la_CoutTab(%rip), %xmm3
+        addsd     %xmm8, %xmm7
+        movsd     %xmm7, -72(%rsp)
+        movaps    %xmm5, %xmm7
+        movsd     -72(%rsp), %xmm4
+        movsd     2000+__satan2_la_CoutTab(%rip), %xmm6
+        addsd     %xmm4, %xmm7
+        movsd     %xmm7, -72(%rsp)
+        movsd     -72(%rsp), %xmm8
+        subsd     %xmm8, %xmm5
+        addsd     %xmm4, %xmm5
+        movsd     %xmm5, -64(%rsp)
+        movsd     -72(%rsp), %xmm11
+        movaps    %xmm11, %xmm2
+        mulsd     %xmm11, %xmm2
+        mulsd     %xmm11, %xmm6
+        mulsd     %xmm2, %xmm3
+        movsd     -64(%rsp), %xmm4
+        movsd     %xmm6, -72(%rsp)
+        movsd     -72(%rsp), %xmm7
+        addsd     1864+__satan2_la_CoutTab(%rip), %xmm3
+        subsd     %xmm11, %xmm7
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm7, -64(%rsp)
+        movsd     -72(%rsp), %xmm9
+        movsd     -64(%rsp), %xmm8
+        addsd     1856+__satan2_la_CoutTab(%rip), %xmm3
+        subsd     %xmm8, %xmm9
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm9, -72(%rsp)
+        movsd     -72(%rsp), %xmm10
+        addsd     1848+__satan2_la_CoutTab(%rip), %xmm3
+        subsd     %xmm10, %xmm11
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm11, -64(%rsp)
+        addsd     1840+__satan2_la_CoutTab(%rip), %xmm3
+        mulsd     %xmm2, %xmm3
+        addsd     1832+__satan2_la_CoutTab(%rip), %xmm3
+        mulsd     %xmm2, %xmm3
+        addsd     1824+__satan2_la_CoutTab(%rip), %xmm3
+        mulsd     %xmm2, %xmm3
+        mulsd     %xmm3, %xmm13
+        movsd     -72(%rsp), %xmm2
+        movsd     -64(%rsp), %xmm12
+        movsd     %xmm13, -72(%rsp)
+        addsd     %xmm12, %xmm4
+        movsd     -72(%rsp), %xmm14
+        subsd     %xmm3, %xmm14
+        movsd     %xmm14, -64(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     -64(%rsp), %xmm15
+        subsd     %xmm15, %xmm5
+        movsd     %xmm5, -72(%rsp)
+        movsd     -72(%rsp), %xmm6
+        subsd     %xmm6, %xmm3
+        movsd     %xmm3, -64(%rsp)
+        movsd     -72(%rsp), %xmm6
+        movsd     -64(%rsp), %xmm5
+        movaps    %xmm6, %xmm12
+        movaps    %xmm5, %xmm3
+        mulsd     %xmm4, %xmm6
+        mulsd     %xmm4, %xmm3
+        mulsd     %xmm2, %xmm5
+        mulsd     %xmm2, %xmm12
+        addsd     %xmm3, %xmm6
+        movaps    %xmm12, %xmm7
+        movaps    %xmm12, %xmm8
+        addsd     %xmm5, %xmm6
+        addsd     %xmm2, %xmm7
+        movsd     %xmm6, -72(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     %xmm7, -72(%rsp)
+        movsd     -72(%rsp), %xmm3
+        subsd     %xmm3, %xmm8
+        movsd     %xmm8, -64(%rsp)
+        movsd     -72(%rsp), %xmm10
+        movsd     -64(%rsp), %xmm9
+        addsd     %xmm9, %xmm10
+        movsd     %xmm10, -56(%rsp)
+        movsd     -64(%rsp), %xmm11
+        addsd     %xmm11, %xmm2
+        movsd     %xmm2, -64(%rsp)
+        movsd     -56(%rsp), %xmm2
+        subsd     %xmm2, %xmm12
+        movsd     %xmm12, -56(%rsp)
+        movsd     -64(%rsp), %xmm14
+        movsd     -56(%rsp), %xmm13
+        addsd     %xmm13, %xmm14
+        movsd     %xmm14, -56(%rsp)
+        movq      -72(%rsp), %r11
+        movsd     -56(%rsp), %xmm15
+        movq      %r11, -40(%rsp)
+        addsd     %xmm15, %xmm4
+        movsd     -40(%rsp), %xmm8
+        addsd     %xmm5, %xmm4
+        movsd     %xmm4, -32(%rsp)
+        movaps    %xmm8, %xmm4
+        movaps    %xmm8, %xmm2
+        addsd     (%rsi,%rax,8), %xmm4
+        movsd     %xmm4, -72(%rsp)
+        movsd     -72(%rsp), %xmm4
+        subsd     %xmm4, %xmm2
+        movsd     %xmm2, -64(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     -64(%rsp), %xmm3
+        addsd     %xmm3, %xmm5
+        movsd     %xmm5, -56(%rsp)
+        movsd     -64(%rsp), %xmm6
+        addsd     (%rsi,%rax,8), %xmm6
+        movsd     %xmm6, -64(%rsp)
+        movsd     -56(%rsp), %xmm7
+        subsd     %xmm7, %xmm8
+        movsd     %xmm8, -56(%rsp)
+        movsd     -64(%rsp), %xmm10
+        movsd     -56(%rsp), %xmm9
+        addsd     %xmm9, %xmm10
+        movsd     %xmm10, -56(%rsp)
+        movq      -72(%rsp), %rdi
+        movq      %rdi, -40(%rsp)
+
+
+        movsd     -56(%rsp), %xmm2
+        movaps    %xmm1, %xmm3
+        shrq      $56, %rdi
+        addsd     -32(%rsp), %xmm2
+        shlb      $7, %cl
+        addsd     8(%rsi,%rax,8), %xmm2
+        movb      %dl, %al
+        andb      $127, %dil
+        shlb      $7, %al
+        movsd     %xmm2, -32(%rsp)
+        orb       %al, %dil
+        movb      %dil, -33(%rsp)
+        movsd     -40(%rsp), %xmm9
+        movaps    %xmm9, %xmm5
+        addsd     %xmm9, %xmm3
+        movsd     %xmm3, -72(%rsp)
+        movsd     -72(%rsp), %xmm4
+        movb      -25(%rsp), %sil
+        movb      %sil, %r9b
+        shrb      $7, %sil
+        subsd     %xmm4, %xmm5
+        movsd     %xmm5, -64(%rsp)
+        movsd     -72(%rsp), %xmm7
+        movsd     -64(%rsp), %xmm6
+        xorb      %sil, %dl
+        andb      $127, %r9b
+        shlb      $7, %dl
+        addsd     %xmm6, %xmm7
+        movsd     %xmm7, -56(%rsp)
+        movsd     -64(%rsp), %xmm8
+        addsd     %xmm8, %xmm1
+        movsd     %xmm1, -64(%rsp)
+        orb       %dl, %r9b
+        movsd     -56(%rsp), %xmm1
+        movb      %r9b, -25(%rsp)
+        subsd     %xmm1, %xmm9
+        movsd     %xmm9, -56(%rsp)
+        movsd     -64(%rsp), %xmm11
+        movsd     -56(%rsp), %xmm10
+        addsd     %xmm10, %xmm11
+        movsd     %xmm11, -56(%rsp)
+        movq      -72(%rsp), %rdx
+        movsd     -56(%rsp), %xmm12
+        movq      %rdx, -40(%rsp)
+        addsd     %xmm12, %xmm0
+        movsd     -40(%rsp), %xmm13
+        addsd     -32(%rsp), %xmm0
+        movsd     %xmm0, -32(%rsp)
+        addsd     %xmm0, %xmm13
+        movsd     %xmm13, -24(%rsp)
+        movb      -17(%rsp), %r10b
+        andb      $127, %r10b
+        orb       %cl, %r10b
+        movb      %r10b, -17(%rsp)
+        movsd     -24(%rsp), %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%r8)
+        jmp       .LBL_2_33
+
+.LBL_2_18:
+
+        movsd     -48(%rsp), %xmm12
+        movb      %dl, %dil
+        movaps    %xmm12, %xmm7
+        mulsd     2000+__satan2_la_CoutTab(%rip), %xmm7
+        shlb      $7, %dil
+        shlb      $7, %cl
+        movsd     %xmm7, -72(%rsp)
+        movsd     -72(%rsp), %xmm8
+        movsd     2000+__satan2_la_CoutTab(%rip), %xmm13
+        movsd     1888+__satan2_la_CoutTab(%rip), %xmm7
+        mulsd     %xmm2, %xmm13
+        subsd     -48(%rsp), %xmm8
+        movsd     %xmm8, -64(%rsp)
+        movsd     -72(%rsp), %xmm10
+        movsd     -64(%rsp), %xmm9
+        subsd     %xmm9, %xmm10
+        movsd     %xmm10, -72(%rsp)
+        movsd     -72(%rsp), %xmm11
+        subsd     %xmm11, %xmm12
+        movsd     %xmm12, -64(%rsp)
+        movsd     -72(%rsp), %xmm6
+        movsd     -64(%rsp), %xmm5
+        movsd     %xmm13, -72(%rsp)
+        movsd     -72(%rsp), %xmm14
+        subsd     %xmm2, %xmm14
+        movsd     %xmm14, -64(%rsp)
+        movsd     -72(%rsp), %xmm4
+        movsd     -64(%rsp), %xmm15
+        subsd     %xmm15, %xmm4
+        movsd     %xmm4, -72(%rsp)
+        movsd     -72(%rsp), %xmm3
+        movsd     1888+__satan2_la_CoutTab(%rip), %xmm4
+        subsd     %xmm3, %xmm2
+        movsd     %xmm2, -64(%rsp)
+        movsd     -72(%rsp), %xmm12
+        divsd     %xmm12, %xmm7
+        movsd     2000+__satan2_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm7, %xmm2
+        movsd     -64(%rsp), %xmm14
+        movsd     %xmm2, -64(%rsp)
+        movsd     -64(%rsp), %xmm8
+        subsd     %xmm7, %xmm8
+        movsd     %xmm8, -56(%rsp)
+        movsd     -64(%rsp), %xmm10
+        movsd     -56(%rsp), %xmm9
+        subsd     %xmm9, %xmm10
+        movsd     %xmm10, -56(%rsp)
+        movsd     -56(%rsp), %xmm11
+        mulsd     %xmm11, %xmm12
+        movsd     -56(%rsp), %xmm13
+        subsd     %xmm12, %xmm4
+        mulsd     %xmm13, %xmm14
+        movsd     %xmm14, -64(%rsp)
+        movsd     -64(%rsp), %xmm15
+        movsd     2000+__satan2_la_CoutTab(%rip), %xmm13
+        subsd     %xmm15, %xmm4
+        movsd     %xmm4, -64(%rsp)
+        movsd     -64(%rsp), %xmm7
+        movq      -56(%rsp), %rax
+        movsd     -64(%rsp), %xmm2
+        movsd     -56(%rsp), %xmm3
+        movq      %rax, -40(%rsp)
+        movsd     -40(%rsp), %xmm8
+        movaps    %xmm8, %xmm9
+        addsd     1888+__satan2_la_CoutTab(%rip), %xmm7
+        mulsd     %xmm6, %xmm9
+        mulsd     %xmm5, %xmm8
+        mulsd     %xmm2, %xmm7
+        movsd     -16(%rsp), %xmm2
+        mulsd     %xmm2, %xmm2
+        mulsd     %xmm3, %xmm7
+        movsd     1872+__satan2_la_CoutTab(%rip), %xmm3
+        mulsd     %xmm2, %xmm3
+        mulsd     %xmm7, %xmm6
+        mulsd     %xmm5, %xmm7
+        addsd     1864+__satan2_la_CoutTab(%rip), %xmm3
+        addsd     %xmm7, %xmm6
+        mulsd     %xmm2, %xmm3
+        addsd     %xmm8, %xmm6
+        addsd     1856+__satan2_la_CoutTab(%rip), %xmm3
+        mulsd     %xmm2, %xmm3
+        movaps    %xmm9, %xmm5
+        movsd     %xmm6, -72(%rsp)
+        movsd     -72(%rsp), %xmm4
+        addsd     1848+__satan2_la_CoutTab(%rip), %xmm3
+        addsd     %xmm4, %xmm5
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm5, -72(%rsp)
+        movsd     -72(%rsp), %xmm6
+        movsd     2000+__satan2_la_CoutTab(%rip), %xmm5
+        subsd     %xmm6, %xmm9
+        addsd     1840+__satan2_la_CoutTab(%rip), %xmm3
+        addsd     %xmm4, %xmm9
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm9, -64(%rsp)
+        movsd     -72(%rsp), %xmm11
+        mulsd     %xmm11, %xmm5
+        addsd     1832+__satan2_la_CoutTab(%rip), %xmm3
+        movsd     -64(%rsp), %xmm4
+        movsd     %xmm5, -72(%rsp)
+        movsd     -72(%rsp), %xmm7
+        mulsd     %xmm2, %xmm3
+        subsd     %xmm11, %xmm7
+        movsd     %xmm7, -64(%rsp)
+        movsd     -72(%rsp), %xmm8
+        movsd     -64(%rsp), %xmm6
+        addsd     1824+__satan2_la_CoutTab(%rip), %xmm3
+        subsd     %xmm6, %xmm8
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm8, -72(%rsp)
+        movsd     -72(%rsp), %xmm10
+        mulsd     %xmm3, %xmm13
+        subsd     %xmm10, %xmm11
+        movsd     %xmm11, -64(%rsp)
+        movsd     -72(%rsp), %xmm2
+        movsd     -64(%rsp), %xmm12
+        movsd     %xmm13, -72(%rsp)
+        addsd     %xmm12, %xmm4
+        movsd     -72(%rsp), %xmm14
+        subsd     %xmm3, %xmm14
+        movsd     %xmm14, -64(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     -64(%rsp), %xmm15
+        subsd     %xmm15, %xmm5
+        movsd     %xmm5, -72(%rsp)
+        movsd     -72(%rsp), %xmm6
+        subsd     %xmm6, %xmm3
+        movsd     %xmm3, -64(%rsp)
+        movsd     -72(%rsp), %xmm6
+        movsd     -64(%rsp), %xmm5
+        movaps    %xmm6, %xmm12
+        movaps    %xmm5, %xmm3
+        mulsd     %xmm4, %xmm6
+        mulsd     %xmm4, %xmm3
+        mulsd     %xmm2, %xmm5
+        mulsd     %xmm2, %xmm12
+        addsd     %xmm3, %xmm6
+        movaps    %xmm12, %xmm7
+        movaps    %xmm12, %xmm8
+        addsd     %xmm5, %xmm6
+        addsd     %xmm2, %xmm7
+        movsd     %xmm6, -72(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     %xmm7, -72(%rsp)
+        movsd     -72(%rsp), %xmm3
+        subsd     %xmm3, %xmm8
+        movsd     %xmm8, -64(%rsp)
+        movsd     -72(%rsp), %xmm10
+        movsd     -64(%rsp), %xmm9
+        addsd     %xmm9, %xmm10
+        movsd     %xmm10, -56(%rsp)
+        movsd     -64(%rsp), %xmm11
+        addsd     %xmm11, %xmm2
+        movsd     %xmm2, -64(%rsp)
+        movsd     -56(%rsp), %xmm2
+        subsd     %xmm2, %xmm12
+        movsd     %xmm12, -56(%rsp)
+        movsd     -64(%rsp), %xmm14
+        movsd     -56(%rsp), %xmm13
+        addsd     %xmm13, %xmm14
+        movsd     %xmm14, -56(%rsp)
+        movq      -72(%rsp), %rsi
+        movsd     -56(%rsp), %xmm15
+        movq      %rsi, -40(%rsp)
+        addsd     %xmm15, %xmm4
+        shrq      $56, %rsi
+        addsd     %xmm5, %xmm4
+        andb      $127, %sil
+        orb       %dil, %sil
+        movb      %sil, -33(%rsp)
+        movsd     %xmm4, -32(%rsp)
+        movaps    %xmm1, %xmm4
+        movsd     -40(%rsp), %xmm7
+        movaps    %xmm7, %xmm2
+        addsd     %xmm7, %xmm4
+        movsd     %xmm4, -72(%rsp)
+        movsd     -72(%rsp), %xmm4
+        movb      -25(%rsp), %r9b
+        movb      %r9b, %r10b
+        shrb      $7, %r9b
+        subsd     %xmm4, %xmm2
+        movsd     %xmm2, -64(%rsp)
+        movsd     -72(%rsp), %xmm5
+        movsd     -64(%rsp), %xmm3
+        xorb      %r9b, %dl
+        andb      $127, %r10b
+        shlb      $7, %dl
+        addsd     %xmm3, %xmm5
+        movsd     %xmm5, -56(%rsp)
+        movsd     -64(%rsp), %xmm6
+        addsd     %xmm6, %xmm1
+        movsd     %xmm1, -64(%rsp)
+        orb       %dl, %r10b
+        movsd     -56(%rsp), %xmm1
+        movb      %r10b, -25(%rsp)
+        subsd     %xmm1, %xmm7
+        movsd     %xmm7, -56(%rsp)
+        movsd     -64(%rsp), %xmm2
+        movsd     -56(%rsp), %xmm1
+        addsd     %xmm1, %xmm2
+        movsd     %xmm2, -56(%rsp)
+        movq      -72(%rsp), %rdx
+        movsd     -56(%rsp), %xmm3
+        movq      %rdx, -40(%rsp)
+        addsd     %xmm3, %xmm0
+        movsd     -40(%rsp), %xmm4
+        addsd     -32(%rsp), %xmm0
+        movsd     %xmm0, -32(%rsp)
+        addsd     %xmm0, %xmm4
+        movsd     %xmm4, -24(%rsp)
+        movb      -17(%rsp), %r11b
+        andb      $127, %r11b
+        orb       %cl, %r11b
+        movb      %r11b, -17(%rsp)
+        movsd     -24(%rsp), %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%r8)
+        jmp       .LBL_2_33
+
+.LBL_2_19:
+
+        cmpl      $74, %r9d
+        jge       .LBL_2_21
+
+
+        movb      %dil, -41(%rsp)
+        divsd     -48(%rsp), %xmm1
+        movsd     1928+__satan2_la_CoutTab(%rip), %xmm0
+        shlb      $7, %cl
+        subsd     %xmm1, %xmm0
+        addsd     1920+__satan2_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %cl, %al
+        movb      %al, -17(%rsp)
+        movsd     -24(%rsp), %xmm1
+        cvtsd2ss  %xmm1, %xmm1
+        movss     %xmm1, (%r8)
+        jmp       .LBL_2_33
+
+.LBL_2_21:
+
+        movsd     1920+__satan2_la_CoutTab(%rip), %xmm0
+        shlb      $7, %cl
+        addsd     1928+__satan2_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %cl, %al
+        movb      %al, -17(%rsp)
+        movsd     -24(%rsp), %xmm1
+        cvtsd2ss  %xmm1, %xmm1
+        movss     %xmm1, (%r8)
+        jmp       .LBL_2_33
+
+.LBL_2_22:
+
+        testb     %dl, %dl
+        jne       .LBL_2_32
+
+
+        movb      %dil, -41(%rsp)
+        pxor      %xmm0, %xmm0
+        movb      %sil, -33(%rsp)
+        movsd     -48(%rsp), %xmm2
+        divsd     -40(%rsp), %xmm2
+        cvtsd2ss  %xmm2, %xmm0
+        movss     %xmm0, -8(%rsp)
+        movzwl    -6(%rsp), %eax
+        movsd     %xmm2, -24(%rsp)
+        testl     $32640, %eax
+        je        .LBL_2_25
+
+
+        movsd     1888+__satan2_la_CoutTab(%rip), %xmm0
+        shlb      $7, %cl
+        addsd     %xmm2, %xmm0
+        movsd     %xmm0, -72(%rsp)
+        movsd     -72(%rsp), %xmm1
+        mulsd     %xmm1, %xmm2
+        movsd     %xmm2, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %cl, %al
+        movb      %al, -17(%rsp)
+        movsd     -24(%rsp), %xmm2
+        cvtsd2ss  %xmm2, %xmm2
+        movss     %xmm2, (%r8)
+        jmp       .LBL_2_33
+
+.LBL_2_25:
+
+        movsd     -24(%rsp), %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        shlb      $7, %cl
+        movss     %xmm0, -8(%rsp)
+        movss     -8(%rsp), %xmm2
+        movss     -8(%rsp), %xmm1
+        mulss     %xmm1, %xmm2
+        movss     %xmm2, -8(%rsp)
+        movss     -8(%rsp), %xmm3
+        cvtss2sd  %xmm3, %xmm3
+        addsd     -24(%rsp), %xmm3
+        movsd     %xmm3, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %cl, %al
+        movb      %al, -17(%rsp)
+        movsd     -24(%rsp), %xmm4
+        cvtsd2ss  %xmm4, %xmm4
+        movss     %xmm4, (%r8)
+        jmp       .LBL_2_33
+
+.LBL_2_27:
+
+        testl     %eax, %eax
+        jne       .LBL_2_21
+
+
+        testl     $8388607, -32(%rsp)
+        jne       .LBL_2_21
+
+.LBL_2_30:
+
+        testb     %dl, %dl
+        jne       .LBL_2_32
+
+.LBL_2_31:
+
+        shlb      $7, %cl
+        movq      1976+__satan2_la_CoutTab(%rip), %rax
+        movq      %rax, -24(%rsp)
+        shrq      $56, %rax
+        andb      $127, %al
+        orb       %cl, %al
+        movb      %al, -17(%rsp)
+        movsd     -24(%rsp), %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%r8)
+        jmp       .LBL_2_33
+
+.LBL_2_32:
+
+        movsd     1936+__satan2_la_CoutTab(%rip), %xmm0
+        shlb      $7, %cl
+        addsd     1944+__satan2_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %cl, %al
+        movb      %al, -17(%rsp)
+        movsd     -24(%rsp), %xmm1
+        cvtsd2ss  %xmm1, %xmm1
+        movss     %xmm1, (%r8)
+
+.LBL_2_33:
+
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_34:
+
+        movsd     1984+__satan2_la_CoutTab(%rip), %xmm3
+        movl      $-1022, %eax
+        mulsd     %xmm3, %xmm4
+        movsd     %xmm4, -48(%rsp)
+        jmp       .LBL_2_16
+
+.LBL_2_35:
+
+        cmpl      $2047, %eax
+        je        .LBL_2_48
+
+.LBL_2_36:
+
+        cmpl      $2047, %r9d
+        je        .LBL_2_46
+
+.LBL_2_37:
+
+        movzwl    -26(%rsp), %eax
+        andl      $32640, %eax
+        cmpl      $32640, %eax
+        jne       .LBL_2_21
+
+
+        cmpl      $255, %edi
+        je        .LBL_2_43
+
+
+        testb     %dl, %dl
+        je        .LBL_2_31
+        jmp       .LBL_2_32
+
+.LBL_2_43:
+
+        testb     %dl, %dl
+        jne       .LBL_2_45
+
+
+        movsd     1904+__satan2_la_CoutTab(%rip), %xmm0
+        shlb      $7, %cl
+        addsd     1912+__satan2_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %cl, %al
+        movb      %al, -17(%rsp)
+        movsd     -24(%rsp), %xmm1
+        cvtsd2ss  %xmm1, %xmm1
+        movss     %xmm1, (%r8)
+        jmp       .LBL_2_33
+
+.LBL_2_45:
+
+        movsd     1952+__satan2_la_CoutTab(%rip), %xmm0
+        shlb      $7, %cl
+        addsd     1960+__satan2_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %al
+        andb      $127, %al
+        orb       %cl, %al
+        movb      %al, -17(%rsp)
+        movsd     -24(%rsp), %xmm1
+        cvtsd2ss  %xmm1, %xmm1
+        movss     %xmm1, (%r8)
+        jmp       .LBL_2_33
+
+.LBL_2_46:
+
+        testl     $8388607, -28(%rsp)
+        je        .LBL_2_37
+
+.LBL_2_47:
+
+        addss     %xmm2, %xmm3
+        movss     %xmm3, (%r8)
+        jmp       .LBL_2_33
+
+.LBL_2_48:
+
+        testl     $8388607, -32(%rsp)
+        jne       .LBL_2_47
+        jmp       .LBL_2_36
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_satan2_cout_rare_internal,@function
+       .size   __svml_satan2_cout_rare_internal,.-__svml_satan2_cout_rare_internal
+..LN__svml_satan2_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_satan2_data_internal:
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   993144000
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   3162449457
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   1026278276
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   3180885545
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   1037657204
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   3188810232
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   1045215135
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   3198855753
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   2164260864
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .long   4227858432
+       .type   __svml_satan2_data_internal,@object
+       .size   __svml_satan2_data_internal,1152
+       .align 32
+__satan2_la_CoutTab:
+       .long   3892314112
+       .long   1069799150
+       .long   2332892550
+       .long   1039715405
+       .long   1342177280
+       .long   1070305495
+       .long   270726690
+       .long   1041535749
+       .long   939524096
+       .long   1070817911
+       .long   2253973841
+       .long   3188654726
+       .long   3221225472
+       .long   1071277294
+       .long   3853927037
+       .long   1043226911
+       .long   2818572288
+       .long   1071767563
+       .long   2677759107
+       .long   1044314101
+       .long   3355443200
+       .long   1072103591
+       .long   1636578514
+       .long   3191094734
+       .long   1476395008
+       .long   1072475260
+       .long   1864703685
+       .long   3188646936
+       .long   805306368
+       .long   1072747407
+       .long   192551812
+       .long   3192726267
+       .long   2013265920
+       .long   1072892781
+       .long   2240369452
+       .long   1043768538
+       .long   0
+       .long   1072999953
+       .long   3665168337
+       .long   3192705970
+       .long   402653184
+       .long   1073084787
+       .long   1227953434
+       .long   3192313277
+       .long   2013265920
+       .long   1073142981
+       .long   3853283127
+       .long   1045277487
+       .long   805306368
+       .long   1073187261
+       .long   1676192264
+       .long   3192868861
+       .long   134217728
+       .long   1073217000
+       .long   4290763938
+       .long   1042034855
+       .long   671088640
+       .long   1073239386
+       .long   994303084
+       .long   3189643768
+       .long   402653184
+       .long   1073254338
+       .long   1878067156
+       .long   1042652475
+       .long   1610612736
+       .long   1073265562
+       .long   670314820
+       .long   1045138554
+       .long   3221225472
+       .long   1073273048
+       .long   691126919
+       .long   3189987794
+       .long   3489660928
+       .long   1073278664
+       .long   1618990832
+       .long   3188194509
+       .long   1207959552
+       .long   1073282409
+       .long   2198872939
+       .long   1044806069
+       .long   3489660928
+       .long   1073285217
+       .long   2633982383
+       .long   1042307894
+       .long   939524096
+       .long   1073287090
+       .long   1059367786
+       .long   3189114230
+       .long   2281701376
+       .long   1073288494
+       .long   3158525533
+       .long   1044484961
+       .long   3221225472
+       .long   1073289430
+       .long   286581777
+       .long   1044893263
+       .long   4026531840
+       .long   1073290132
+       .long   2000245215
+       .long   3191647611
+       .long   134217728
+       .long   1073290601
+       .long   4205071590
+       .long   1045035927
+       .long   536870912
+       .long   1073290952
+       .long   2334392229
+       .long   1043447393
+       .long   805306368
+       .long   1073291186
+       .long   2281458177
+       .long   3188885569
+       .long   3087007744
+       .long   1073291361
+       .long   691611507
+       .long   1044733832
+       .long   3221225472
+       .long   1073291478
+       .long   1816229550
+       .long   1044363390
+       .long   2281701376
+       .long   1073291566
+       .long   1993843750
+       .long   3189837440
+       .long   134217728
+       .long   1073291625
+       .long   3654754496
+       .long   1044970837
+       .long   4026531840
+       .long   1073291668
+       .long   3224300229
+       .long   3191935390
+       .long   805306368
+       .long   1073291698
+       .long   2988777976
+       .long   3188950659
+       .long   536870912
+       .long   1073291720
+       .long   1030371341
+       .long   1043402665
+       .long   3221225472
+       .long   1073291734
+       .long   1524463765
+       .long   1044361356
+       .long   3087007744
+       .long   1073291745
+       .long   2754295320
+       .long   1044731036
+       .long   134217728
+       .long   1073291753
+       .long   3099629057
+       .long   1044970710
+       .long   2281701376
+       .long   1073291758
+       .long   962914160
+       .long   3189838838
+       .long   805306368
+       .long   1073291762
+       .long   3543908206
+       .long   3188950786
+       .long   4026531840
+       .long   1073291764
+       .long   1849909620
+       .long   3191935434
+       .long   3221225472
+       .long   1073291766
+       .long   1641333636
+       .long   1044361352
+       .long   536870912
+       .long   1073291768
+       .long   1373968792
+       .long   1043402654
+       .long   134217728
+       .long   1073291769
+       .long   2033191599
+       .long   1044970710
+       .long   3087007744
+       .long   1073291769
+       .long   4117947437
+       .long   1044731035
+       .long   805306368
+       .long   1073291770
+       .long   315378368
+       .long   3188950787
+       .long   2281701376
+       .long   1073291770
+       .long   2428571750
+       .long   3189838838
+       .long   3221225472
+       .long   1073291770
+       .long   1608007466
+       .long   1044361352
+       .long   4026531840
+       .long   1073291770
+       .long   1895711420
+       .long   3191935434
+       .long   134217728
+       .long   1073291771
+       .long   2031108713
+       .long   1044970710
+       .long   536870912
+       .long   1073291771
+       .long   1362518342
+       .long   1043402654
+       .long   805306368
+       .long   1073291771
+       .long   317461253
+       .long   3188950787
+       .long   939524096
+       .long   1073291771
+       .long   4117231784
+       .long   1044731035
+       .long   1073741824
+       .long   1073291771
+       .long   1607942376
+       .long   1044361352
+       .long   1207959552
+       .long   1073291771
+       .long   2428929577
+       .long   3189838838
+       .long   1207959552
+       .long   1073291771
+       .long   2031104645
+       .long   1044970710
+       .long   1342177280
+       .long   1073291771
+       .long   1895722602
+       .long   3191935434
+       .long   1342177280
+       .long   1073291771
+       .long   317465322
+       .long   3188950787
+       .long   1342177280
+       .long   1073291771
+       .long   1362515546
+       .long   1043402654
+       .long   1342177280
+       .long   1073291771
+       .long   1607942248
+       .long   1044361352
+       .long   1342177280
+       .long   1073291771
+       .long   4117231610
+       .long   1044731035
+       .long   1342177280
+       .long   1073291771
+       .long   2031104637
+       .long   1044970710
+       .long   1342177280
+       .long   1073291771
+       .long   1540251232
+       .long   1045150466
+       .long   1342177280
+       .long   1073291771
+       .long   2644671394
+       .long   1045270303
+       .long   1342177280
+       .long   1073291771
+       .long   2399244691
+       .long   1045360181
+       .long   1342177280
+       .long   1073291771
+       .long   803971124
+       .long   1045420100
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192879152
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192849193
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192826724
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192811744
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192800509
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192793019
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192787402
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192783657
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192780848
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192778976
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192777572
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192776635
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192775933
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192775465
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192775114
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774880
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192774704
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192774587
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192774500
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192774441
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192774397
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774368
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192774346
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192774331
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192774320
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192774313
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192774308
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774304
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192774301
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192774299
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192774298
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192774297
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192774296
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774296
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192774296
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1466225875
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1343512524
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1251477510
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1190120835
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1144103328
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1113424990
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1090416237
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1075077068
+       .long   3192774295
+       .long   1431655765
+       .long   3218429269
+       .long   2576978363
+       .long   1070176665
+       .long   2453154343
+       .long   3217180964
+       .long   4189149139
+       .long   1069314502
+       .long   1775019125
+       .long   3216459198
+       .long   273199057
+       .long   1068739452
+       .long   874748308
+       .long   3215993277
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1073741824
+       .long   1413754136
+       .long   1072243195
+       .long   856972295
+       .long   1015129638
+       .long   1413754136
+       .long   1073291771
+       .long   856972295
+       .long   1016178214
+       .long   1413754136
+       .long   1074340347
+       .long   856972295
+       .long   1017226790
+       .long   2134057426
+       .long   1073928572
+       .long   1285458442
+       .long   1016756537
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   0
+       .long   0
+       .long   2144337920
+       .long   0
+       .long   1048576
+       .long   33554432
+       .long   1101004800
+       .type   __satan2_la_CoutTab,@object
+       .size   __satan2_la_CoutTab,2008
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_atan_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_atan_d_la.s
new file mode 100644 (file)
index 0000000..d77f0cf
--- /dev/null
@@ -0,0 +1,1354 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *      For    0.0    <= x <=  7.0/16.0: atan(x) = atan(0.0) + atan(s), where s=(x-0.0)/(1.0+0.0*x)
+ *      For  7.0/16.0 <= x <= 11.0/16.0: atan(x) = atan(0.5) + atan(s), where s=(x-0.5)/(1.0+0.5*x)
+ *      For 11.0/16.0 <= x <= 19.0/16.0: atan(x) = atan(1.0) + atan(s), where s=(x-1.0)/(1.0+1.0*x)
+ *      For 19.0/16.0 <= x <= 39.0/16.0: atan(x) = atan(1.5) + atan(s), where s=(x-1.5)/(1.0+1.5*x)
+ *      For 39.0/16.0 <= x <=    inf   : atan(x) = atan(inf) + atan(s), where s=-1.0/x
+ *      Where atan(s) ~= s+s^3*Poly11(s^2) on interval |s|<7.0/0.16.
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_atan8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_atan8
+
+__svml_atan8:
+
+
+       .cfi_startproc
+..L2:
+
+        vmovups   64+__svml_datan_data_internal_avx512(%rip), %zmm4
+        vmovups   128+__svml_datan_data_internal_avx512(%rip), %zmm3
+        vmovups   256+__svml_datan_data_internal_avx512(%rip), %zmm9
+
+/* saturate X range */
+        vmovups   320+__svml_datan_data_internal_avx512(%rip), %zmm7
+
+        vandpd    __svml_datan_data_internal_avx512(%rip), %zmm0, %zmm8
+
+/* R+Rl = DiffX/Y */
+        vbroadcastsd .L_2il0floatpacket.14(%rip), %zmm15
+        vaddpd    {rn-sae}, %zmm4, %zmm8, %zmm2
+        vxorpd    %zmm0, %zmm8, %zmm1
+        vcmppd    $29, {sae}, %zmm3, %zmm8, %k2
+
+/* round to 2 bits after binary point */
+        vreducepd $40, {sae}, %zmm8, %zmm6
+        vsubpd    {rn-sae}, %zmm4, %zmm2, %zmm5
+
+/*
+ * if|X|>=MaxThreshold, set DiffX=-1
+ * VMSUB(D, DiffX, LargeMask, Zero, One);
+ */
+        vblendmpd 192+__svml_datan_data_internal_avx512(%rip), %zmm6, %zmm10{%k2}
+        vfmadd231pd {rn-sae}, %zmm8, %zmm5, %zmm9
+        vmovups   960+__svml_datan_data_internal_avx512(%rip), %zmm5
+
+/* table lookup sequence */
+        vmovups   448+__svml_datan_data_internal_avx512(%rip), %zmm6
+        vgetmantpd $0, {sae}, %zmm10, %zmm14
+        vgetexppd {sae}, %zmm10, %zmm11
+        vmovups   1408+__svml_datan_data_internal_avx512(%rip), %zmm10
+
+/*
+ * if|X|>=MaxThreshold, set Y=X
+ * VMADD(D, Y, LargeMask, X, Zero);
+ */
+        vminpd    {sae}, %zmm8, %zmm7, %zmm9{%k2}
+        vcmppd    $29, {sae}, %zmm5, %zmm2, %k1
+        vmovups   576+__svml_datan_data_internal_avx512(%rip), %zmm7
+        vmovups   1152+__svml_datan_data_internal_avx512(%rip), %zmm8
+        vgetmantpd $0, {sae}, %zmm9, %zmm3
+        vgetexppd {sae}, %zmm9, %zmm12
+        vmovups   1280+__svml_datan_data_internal_avx512(%rip), %zmm9
+        vpermt2pd 512+__svml_datan_data_internal_avx512(%rip), %zmm2, %zmm6
+        vsubpd    {rn-sae}, %zmm12, %zmm11, %zmm4
+        vpermt2pd 640+__svml_datan_data_internal_avx512(%rip), %zmm2, %zmm7
+        vrcp14pd  %zmm3, %zmm13
+        vmovups   1344+__svml_datan_data_internal_avx512(%rip), %zmm12
+        vmovups   1472+__svml_datan_data_internal_avx512(%rip), %zmm11
+        vblendmpd %zmm7, %zmm6, %zmm2{%k1}
+        vmulpd    {rn-sae}, %zmm13, %zmm14, %zmm0
+        vfnmadd231pd {rn-sae}, %zmm3, %zmm13, %zmm15
+        vfnmadd213pd {rn-sae}, %zmm14, %zmm0, %zmm3
+        vfmadd213pd {rn-sae}, %zmm15, %zmm15, %zmm15
+        vfmadd213pd {rn-sae}, %zmm13, %zmm13, %zmm15
+        vfmadd213pd {rn-sae}, %zmm0, %zmm15, %zmm3
+        vscalefpd {rn-sae}, %zmm4, %zmm3, %zmm0
+
+/* set table value to Pi/2 for large X */
+        vblendmpd 1024+__svml_datan_data_internal_avx512(%rip), %zmm2, %zmm3{%k2}
+        vmovups   1216+__svml_datan_data_internal_avx512(%rip), %zmm2
+
+/* polynomial evaluation */
+        vmulpd    {rn-sae}, %zmm0, %zmm0, %zmm14
+        vmulpd    {rn-sae}, %zmm14, %zmm14, %zmm13
+        vmulpd    {rn-sae}, %zmm0, %zmm14, %zmm15
+        vfmadd231pd {rn-sae}, %zmm14, %zmm8, %zmm2
+        vfmadd231pd {rn-sae}, %zmm14, %zmm9, %zmm12
+        vfmadd213pd {rn-sae}, %zmm11, %zmm10, %zmm14
+        vfmadd213pd {rn-sae}, %zmm12, %zmm13, %zmm2
+        vfmadd213pd {rn-sae}, %zmm14, %zmm13, %zmm2
+        vfmadd213pd {rn-sae}, %zmm0, %zmm15, %zmm2
+        vaddpd    {rn-sae}, %zmm3, %zmm2, %zmm0
+        vxorpd    %zmm1, %zmm0, %zmm0
+
+/* no invcbrt in libm, so taking it out here */
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_atan8,@function
+       .size   __svml_atan8,.-__svml_atan8
+..LN__svml_atan8.0:
+
+.L_2__routine_start___svml_datan_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_datan_cout_rare_internal:
+
+
+       .cfi_startproc
+..L5:
+
+        movzwl    6(%rdi), %r8d
+        andl      $32752, %r8d
+        shrl      $4, %r8d
+        cmpl      $2047, %r8d
+        je        .LBL_2_12
+
+
+        movq      (%rdi), %rdx
+        movq      %rdx, -16(%rsp)
+        shrq      $56, %rdx
+        movb      7(%rdi), %al
+        andl      $127, %edx
+        movb      %dl, -9(%rsp)
+        movsd     -16(%rsp), %xmm0
+        shrb      $7, %al
+        comisd    1888+__datan_la_CoutTab(%rip), %xmm0
+        movl      -12(%rsp), %ecx
+        jb        .LBL_2_6
+
+
+        movsd     1896+__datan_la_CoutTab(%rip), %xmm1
+        comisd    %xmm0, %xmm1
+        jbe       .LBL_2_5
+
+
+        movl      4(%rdi), %edx
+        movl      %ecx, %edi
+        andl      $-524288, %ecx
+        andl      $-1048576, %edi
+        addl      $262144, %ecx
+        movaps    %xmm0, %xmm9
+        andl      $1048575, %ecx
+        movaps    %xmm0, %xmm10
+        movsd     %xmm0, -56(%rsp)
+        orl       %ecx, %edi
+        movl      $0, -56(%rsp)
+        andl      $1048575, %edx
+        movl      %edi, -52(%rsp)
+        lea       __datan_la_CoutTab(%rip), %rcx
+        movsd     1928+__datan_la_CoutTab(%rip), %xmm4
+        movsd     -56(%rsp), %xmm15
+        shll      $20, %r8d
+        subsd     -56(%rsp), %xmm9
+        mulsd     1928+__datan_la_CoutTab(%rip), %xmm10
+        shlb      $7, %al
+        mulsd     %xmm9, %xmm4
+        movsd     %xmm4, -48(%rsp)
+        orl       %edx, %r8d
+        movsd     -48(%rsp), %xmm5
+        addl      $-1069547520, %r8d
+        sarl      $18, %r8d
+        subsd     %xmm9, %xmm5
+        movsd     %xmm5, -40(%rsp)
+        andl      $-2, %r8d
+        movsd     -48(%rsp), %xmm7
+        movsd     -40(%rsp), %xmm6
+        movslq    %r8d, %r8
+        subsd     %xmm6, %xmm7
+        movsd     %xmm7, -48(%rsp)
+        movsd     -48(%rsp), %xmm8
+        movsd     1904+__datan_la_CoutTab(%rip), %xmm6
+        subsd     %xmm8, %xmm9
+        movsd     %xmm9, -40(%rsp)
+        movsd     -48(%rsp), %xmm2
+        movsd     -40(%rsp), %xmm3
+        movsd     %xmm10, -48(%rsp)
+        movsd     -48(%rsp), %xmm11
+        movsd     1904+__datan_la_CoutTab(%rip), %xmm8
+        subsd     -16(%rsp), %xmm11
+        movsd     %xmm11, -40(%rsp)
+        movsd     -48(%rsp), %xmm13
+        movsd     -40(%rsp), %xmm12
+        subsd     %xmm12, %xmm13
+        movsd     %xmm13, -48(%rsp)
+        movsd     -48(%rsp), %xmm14
+        subsd     %xmm14, %xmm0
+        movsd     1904+__datan_la_CoutTab(%rip), %xmm14
+        movsd     %xmm0, -40(%rsp)
+        movsd     -48(%rsp), %xmm5
+        movsd     -40(%rsp), %xmm4
+        mulsd     %xmm15, %xmm5
+        mulsd     %xmm15, %xmm4
+        movaps    %xmm5, %xmm1
+        addsd     %xmm4, %xmm1
+        movsd     %xmm1, -48(%rsp)
+        movsd     -48(%rsp), %xmm0
+        subsd     %xmm0, %xmm5
+        addsd     %xmm4, %xmm5
+        movsd     1928+__datan_la_CoutTab(%rip), %xmm4
+        movsd     %xmm5, -40(%rsp)
+        movsd     -48(%rsp), %xmm11
+        movsd     -40(%rsp), %xmm1
+        addsd     %xmm11, %xmm6
+        movsd     %xmm6, -48(%rsp)
+        movsd     -48(%rsp), %xmm7
+        subsd     %xmm7, %xmm8
+        movsd     %xmm8, -40(%rsp)
+        movsd     -48(%rsp), %xmm10
+        movsd     -40(%rsp), %xmm9
+        addsd     %xmm9, %xmm10
+        movsd     %xmm10, -32(%rsp)
+        movsd     -40(%rsp), %xmm12
+        movsd     1928+__datan_la_CoutTab(%rip), %xmm10
+        addsd     %xmm11, %xmm12
+        movsd     %xmm12, -40(%rsp)
+        movsd     -32(%rsp), %xmm13
+        movsd     1904+__datan_la_CoutTab(%rip), %xmm11
+        subsd     %xmm13, %xmm14
+        movsd     %xmm14, -32(%rsp)
+        movsd     -40(%rsp), %xmm0
+        movsd     -32(%rsp), %xmm15
+        addsd     %xmm15, %xmm0
+        movsd     %xmm0, -32(%rsp)
+        movsd     -48(%rsp), %xmm9
+        mulsd     %xmm9, %xmm4
+        movsd     -32(%rsp), %xmm0
+        movsd     %xmm4, -48(%rsp)
+        addsd     %xmm1, %xmm0
+        movsd     -48(%rsp), %xmm5
+        subsd     %xmm9, %xmm5
+        movsd     %xmm5, -40(%rsp)
+        movsd     -48(%rsp), %xmm7
+        movsd     -40(%rsp), %xmm6
+        subsd     %xmm6, %xmm7
+        movsd     1904+__datan_la_CoutTab(%rip), %xmm6
+        movsd     %xmm7, -48(%rsp)
+        movsd     -48(%rsp), %xmm8
+        subsd     %xmm8, %xmm9
+        movsd     %xmm9, -40(%rsp)
+        movsd     -48(%rsp), %xmm4
+        divsd     %xmm4, %xmm11
+        mulsd     %xmm11, %xmm10
+        movsd     -40(%rsp), %xmm5
+        movsd     %xmm10, -40(%rsp)
+        addsd     %xmm0, %xmm5
+        movsd     -40(%rsp), %xmm12
+        subsd     %xmm11, %xmm12
+        movsd     %xmm12, -32(%rsp)
+        movsd     -40(%rsp), %xmm10
+        movsd     -32(%rsp), %xmm13
+        subsd     %xmm13, %xmm10
+        movsd     %xmm10, -32(%rsp)
+        movsd     -32(%rsp), %xmm14
+        mulsd     %xmm14, %xmm4
+        movsd     -32(%rsp), %xmm15
+        subsd     %xmm4, %xmm6
+        mulsd     %xmm15, %xmm5
+        movsd     %xmm5, -40(%rsp)
+        movsd     -40(%rsp), %xmm1
+        subsd     %xmm1, %xmm6
+        movsd     %xmm6, -40(%rsp)
+        movsd     -40(%rsp), %xmm4
+        movsd     -32(%rsp), %xmm5
+        movsd     -40(%rsp), %xmm0
+        movaps    %xmm5, %xmm7
+        movsd     -32(%rsp), %xmm1
+        mulsd     %xmm3, %xmm5
+        addsd     1904+__datan_la_CoutTab(%rip), %xmm4
+        mulsd     %xmm2, %xmm7
+        mulsd     %xmm0, %xmm4
+        mulsd     %xmm1, %xmm4
+        mulsd     %xmm4, %xmm3
+        mulsd     %xmm4, %xmm2
+        addsd     %xmm3, %xmm5
+        movsd     1872+__datan_la_CoutTab(%rip), %xmm6
+        addsd     %xmm2, %xmm5
+        movsd     %xmm5, -48(%rsp)
+        movaps    %xmm7, %xmm2
+        movsd     -48(%rsp), %xmm4
+        addsd     %xmm4, %xmm2
+        movsd     %xmm2, -48(%rsp)
+        movsd     -48(%rsp), %xmm3
+        movsd     (%rcx,%r8,8), %xmm2
+        subsd     %xmm3, %xmm7
+        addsd     %xmm4, %xmm7
+        movsd     %xmm7, -40(%rsp)
+        movsd     -48(%rsp), %xmm3
+        movaps    %xmm3, %xmm5
+        movaps    %xmm3, %xmm0
+        mulsd     %xmm3, %xmm5
+        addsd     %xmm2, %xmm0
+        mulsd     %xmm5, %xmm6
+        movsd     -40(%rsp), %xmm10
+        movsd     %xmm0, -48(%rsp)
+        movsd     -48(%rsp), %xmm1
+        addsd     1864+__datan_la_CoutTab(%rip), %xmm6
+        subsd     %xmm1, %xmm2
+        mulsd     %xmm5, %xmm6
+        addsd     %xmm3, %xmm2
+        addsd     1856+__datan_la_CoutTab(%rip), %xmm6
+        mulsd     %xmm5, %xmm6
+        movsd     %xmm2, -40(%rsp)
+        movsd     -48(%rsp), %xmm9
+        movsd     -40(%rsp), %xmm8
+        addsd     1848+__datan_la_CoutTab(%rip), %xmm6
+        mulsd     %xmm5, %xmm6
+        addsd     1840+__datan_la_CoutTab(%rip), %xmm6
+        mulsd     %xmm5, %xmm6
+        addsd     1832+__datan_la_CoutTab(%rip), %xmm6
+        mulsd     %xmm5, %xmm6
+        addsd     1824+__datan_la_CoutTab(%rip), %xmm6
+        mulsd     %xmm5, %xmm6
+        mulsd     %xmm3, %xmm6
+        addsd     %xmm6, %xmm10
+        addsd     8(%rcx,%r8,8), %xmm10
+        addsd     %xmm8, %xmm10
+        addsd     %xmm9, %xmm10
+        movsd     %xmm10, -24(%rsp)
+        movb      -17(%rsp), %r9b
+        andb      $127, %r9b
+        orb       %al, %r9b
+        movb      %r9b, -17(%rsp)
+        movq      -24(%rsp), %rax
+        movq      %rax, (%rsi)
+        jmp       .LBL_2_11
+
+.LBL_2_5:
+
+        movsd     1912+__datan_la_CoutTab(%rip), %xmm0
+        shlb      $7, %al
+        addsd     1920+__datan_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %dl
+        andb      $127, %dl
+        orb       %al, %dl
+        movb      %dl, -17(%rsp)
+        movq      -24(%rsp), %rax
+        movq      %rax, (%rsi)
+        jmp       .LBL_2_11
+
+.LBL_2_6:
+
+        comisd    1880+__datan_la_CoutTab(%rip), %xmm0
+        jb        .LBL_2_8
+
+
+        movaps    %xmm0, %xmm1
+        mulsd     %xmm0, %xmm1
+        shlb      $7, %al
+        movsd     1872+__datan_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1864+__datan_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1856+__datan_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1848+__datan_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1840+__datan_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1832+__datan_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1824+__datan_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm0, %xmm2
+        movsd     %xmm2, -24(%rsp)
+        movb      -17(%rsp), %dl
+        andb      $127, %dl
+        orb       %al, %dl
+        movb      %dl, -17(%rsp)
+        movq      -24(%rsp), %rax
+        movq      %rax, (%rsi)
+        jmp       .LBL_2_11
+
+.LBL_2_8:
+
+        movzwl    -10(%rsp), %edx
+        testl     $32752, %edx
+        je        .LBL_2_10
+
+
+        movsd     1904+__datan_la_CoutTab(%rip), %xmm1
+        shlb      $7, %al
+        addsd     %xmm0, %xmm1
+        movsd     %xmm1, -48(%rsp)
+        movsd     -48(%rsp), %xmm0
+        mulsd     -16(%rsp), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %dl
+        andb      $127, %dl
+        orb       %al, %dl
+        movb      %dl, -17(%rsp)
+        movq      -24(%rsp), %rax
+        movq      %rax, (%rsi)
+        jmp       .LBL_2_11
+
+.LBL_2_10:
+
+        mulsd     %xmm0, %xmm0
+        shlb      $7, %al
+        movsd     %xmm0, -48(%rsp)
+        movsd     -48(%rsp), %xmm0
+        addsd     -16(%rsp), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %dl
+        andb      $127, %dl
+        orb       %al, %dl
+        movb      %dl, -17(%rsp)
+        movq      -24(%rsp), %rax
+        movq      %rax, (%rsi)
+
+.LBL_2_11:
+
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_12:
+
+        testl     $1048575, 4(%rdi)
+        jne       .LBL_2_15
+
+
+        cmpl      $0, (%rdi)
+        jne       .LBL_2_15
+
+
+        movsd     1912+__datan_la_CoutTab(%rip), %xmm0
+        movb      7(%rdi), %al
+        andb      $-128, %al
+        addsd     1920+__datan_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movb      -17(%rsp), %dl
+        andb      $127, %dl
+        orb       %al, %dl
+        movb      %dl, -17(%rsp)
+        movq      -24(%rsp), %rcx
+        movq      %rcx, (%rsi)
+        jmp       .LBL_2_11
+
+.LBL_2_15:
+
+        movsd     (%rdi), %xmm0
+        addsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        jmp       .LBL_2_11
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_datan_cout_rare_internal,@function
+       .size   __svml_datan_cout_rare_internal,.-__svml_datan_cout_rare_internal
+..LN__svml_datan_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_datan_data_internal_avx512:
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   0
+       .long   1125646336
+       .long   0
+       .long   1125646336
+       .long   0
+       .long   1125646336
+       .long   0
+       .long   1125646336
+       .long   0
+       .long   1125646336
+       .long   0
+       .long   1125646336
+       .long   0
+       .long   1125646336
+       .long   0
+       .long   1125646336
+       .long   0
+       .long   1075806208
+       .long   0
+       .long   1075806208
+       .long   0
+       .long   1075806208
+       .long   0
+       .long   1075806208
+       .long   0
+       .long   1075806208
+       .long   0
+       .long   1075806208
+       .long   0
+       .long   1075806208
+       .long   0
+       .long   1075806208
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1206910976
+       .long   0
+       .long   1206910976
+       .long   0
+       .long   1206910976
+       .long   0
+       .long   1206910976
+       .long   0
+       .long   1206910976
+       .long   0
+       .long   1206910976
+       .long   0
+       .long   1206910976
+       .long   0
+       .long   1206910976
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4180443357
+       .long   1070553973
+       .long   90291023
+       .long   1071492199
+       .long   2737217249
+       .long   1071945615
+       .long   1413754136
+       .long   1072243195
+       .long   1468297118
+       .long   1072475260
+       .long   3531732635
+       .long   1072657163
+       .long   744202399
+       .long   1072747407
+       .long   2464923204
+       .long   1072805601
+       .long   1436891685
+       .long   1072853231
+       .long   2037009832
+       .long   1072892781
+       .long   1826698067
+       .long   1072926058
+       .long   1803191648
+       .long   1072954391
+       .long   2205372832
+       .long   1072978772
+       .long   4234512805
+       .long   1072999952
+       .long   3932628503
+       .long   1073018509
+       .long   2501811453
+       .long   1073034892
+       .long   866379431
+       .long   1073049455
+       .long   1376865888
+       .long   1073062480
+       .long   3290094269
+       .long   1073074195
+       .long   354764887
+       .long   1073084787
+       .long   3332975497
+       .long   1073094406
+       .long   1141460092
+       .long   1073103181
+       .long   745761286
+       .long   1073111216
+       .long   1673304509
+       .long   1073118600
+       .long   983388243
+       .long   1073125409
+       .long   3895509104
+       .long   1073131706
+       .long   2128523669
+       .long   1073137548
+       .long   2075485693
+       .long   1073142981
+       .long   121855980
+       .long   1073148047
+       .long   4181733783
+       .long   1073152780
+       .long   2887813284
+       .long   1073157214
+       .long   0
+       .long   0
+       .long   1022865341
+       .long   1013492590
+       .long   573531618
+       .long   1014639487
+       .long   2280825944
+       .long   1014120858
+       .long   856972295
+       .long   1015129638
+       .long   986810987
+       .long   1015077601
+       .long   2062601149
+       .long   1013974920
+       .long   589036912
+       .long   3164328156
+       .long   1787331214
+       .long   1016798022
+       .long   2942272763
+       .long   3164235441
+       .long   2956702105
+       .long   1016472908
+       .long   3903328092
+       .long   3162582135
+       .long   3175026820
+       .long   3158589859
+       .long   787328196
+       .long   1014621351
+       .long   2317874517
+       .long   3163795518
+       .long   4071621134
+       .long   1016673529
+       .long   2492111345
+       .long   3164172103
+       .long   3606178875
+       .long   3162371821
+       .long   3365790232
+       .long   1014547152
+       .long   2710887773
+       .long   1017086651
+       .long   2755350986
+       .long   3162706257
+       .long   198095269
+       .long   3162802133
+       .long   2791076759
+       .long   3164364640
+       .long   4214434319
+       .long   3162164074
+       .long   773754012
+       .long   3164190653
+       .long   139561443
+       .long   3164313657
+       .long   2197796619
+       .long   3164066219
+       .long   3592486882
+       .long   1016669082
+       .long   1148791015
+       .long   3163724934
+       .long   386789398
+       .long   3163117479
+       .long   2518816264
+       .long   3162291736
+       .long   2545101323
+       .long   3164592727
+       .long   16
+       .long   1125646336
+       .long   16
+       .long   1125646336
+       .long   16
+       .long   1125646336
+       .long   16
+       .long   1125646336
+       .long   16
+       .long   1125646336
+       .long   16
+       .long   1125646336
+       .long   16
+       .long   1125646336
+       .long   16
+       .long   1125646336
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   856972295
+       .long   1016178214
+       .long   4123328151
+       .long   1068689849
+       .long   4123328151
+       .long   1068689849
+       .long   4123328151
+       .long   1068689849
+       .long   4123328151
+       .long   1068689849
+       .long   4123328151
+       .long   1068689849
+       .long   4123328151
+       .long   1068689849
+       .long   4123328151
+       .long   1068689849
+       .long   4123328151
+       .long   1068689849
+       .long   3295121612
+       .long   3216458327
+       .long   3295121612
+       .long   3216458327
+       .long   3295121612
+       .long   3216458327
+       .long   3295121612
+       .long   3216458327
+       .long   3295121612
+       .long   3216458327
+       .long   3295121612
+       .long   3216458327
+       .long   3295121612
+       .long   3216458327
+       .long   3295121612
+       .long   3216458327
+       .long   4026078880
+       .long   1069314495
+       .long   4026078880
+       .long   1069314495
+       .long   4026078880
+       .long   1069314495
+       .long   4026078880
+       .long   1069314495
+       .long   4026078880
+       .long   1069314495
+       .long   4026078880
+       .long   1069314495
+       .long   4026078880
+       .long   1069314495
+       .long   4026078880
+       .long   1069314495
+       .long   2398029018
+       .long   3217180964
+       .long   2398029018
+       .long   3217180964
+       .long   2398029018
+       .long   3217180964
+       .long   2398029018
+       .long   3217180964
+       .long   2398029018
+       .long   3217180964
+       .long   2398029018
+       .long   3217180964
+       .long   2398029018
+       .long   3217180964
+       .long   2398029018
+       .long   3217180964
+       .long   2576905246
+       .long   1070176665
+       .long   2576905246
+       .long   1070176665
+       .long   2576905246
+       .long   1070176665
+       .long   2576905246
+       .long   1070176665
+       .long   2576905246
+       .long   1070176665
+       .long   2576905246
+       .long   1070176665
+       .long   2576905246
+       .long   1070176665
+       .long   2576905246
+       .long   1070176665
+       .long   1431655757
+       .long   3218429269
+       .long   1431655757
+       .long   3218429269
+       .long   1431655757
+       .long   3218429269
+       .long   1431655757
+       .long   3218429269
+       .long   1431655757
+       .long   3218429269
+       .long   1431655757
+       .long   3218429269
+       .long   1431655757
+       .long   3218429269
+       .long   1431655757
+       .long   3218429269
+       .type   __svml_datan_data_internal_avx512,@object
+       .size   __svml_datan_data_internal_avx512,1536
+       .align 32
+__datan_la_CoutTab:
+       .long   3892314112
+       .long   1069799150
+       .long   2332892550
+       .long   1039715405
+       .long   1342177280
+       .long   1070305495
+       .long   270726690
+       .long   1041535749
+       .long   939524096
+       .long   1070817911
+       .long   2253973841
+       .long   3188654726
+       .long   3221225472
+       .long   1071277294
+       .long   3853927037
+       .long   1043226911
+       .long   2818572288
+       .long   1071767563
+       .long   2677759107
+       .long   1044314101
+       .long   3355443200
+       .long   1072103591
+       .long   1636578514
+       .long   3191094734
+       .long   1476395008
+       .long   1072475260
+       .long   1864703685
+       .long   3188646936
+       .long   805306368
+       .long   1072747407
+       .long   192551812
+       .long   3192726267
+       .long   2013265920
+       .long   1072892781
+       .long   2240369452
+       .long   1043768538
+       .long   0
+       .long   1072999953
+       .long   3665168337
+       .long   3192705970
+       .long   402653184
+       .long   1073084787
+       .long   1227953434
+       .long   3192313277
+       .long   2013265920
+       .long   1073142981
+       .long   3853283127
+       .long   1045277487
+       .long   805306368
+       .long   1073187261
+       .long   1676192264
+       .long   3192868861
+       .long   134217728
+       .long   1073217000
+       .long   4290763938
+       .long   1042034855
+       .long   671088640
+       .long   1073239386
+       .long   994303084
+       .long   3189643768
+       .long   402653184
+       .long   1073254338
+       .long   1878067156
+       .long   1042652475
+       .long   1610612736
+       .long   1073265562
+       .long   670314820
+       .long   1045138554
+       .long   3221225472
+       .long   1073273048
+       .long   691126919
+       .long   3189987794
+       .long   3489660928
+       .long   1073278664
+       .long   1618990832
+       .long   3188194509
+       .long   1207959552
+       .long   1073282409
+       .long   2198872939
+       .long   1044806069
+       .long   3489660928
+       .long   1073285217
+       .long   2633982383
+       .long   1042307894
+       .long   939524096
+       .long   1073287090
+       .long   1059367786
+       .long   3189114230
+       .long   2281701376
+       .long   1073288494
+       .long   3158525533
+       .long   1044484961
+       .long   3221225472
+       .long   1073289430
+       .long   286581777
+       .long   1044893263
+       .long   4026531840
+       .long   1073290132
+       .long   2000245215
+       .long   3191647611
+       .long   134217728
+       .long   1073290601
+       .long   4205071590
+       .long   1045035927
+       .long   536870912
+       .long   1073290952
+       .long   2334392229
+       .long   1043447393
+       .long   805306368
+       .long   1073291186
+       .long   2281458177
+       .long   3188885569
+       .long   3087007744
+       .long   1073291361
+       .long   691611507
+       .long   1044733832
+       .long   3221225472
+       .long   1073291478
+       .long   1816229550
+       .long   1044363390
+       .long   2281701376
+       .long   1073291566
+       .long   1993843750
+       .long   3189837440
+       .long   134217728
+       .long   1073291625
+       .long   3654754496
+       .long   1044970837
+       .long   4026531840
+       .long   1073291668
+       .long   3224300229
+       .long   3191935390
+       .long   805306368
+       .long   1073291698
+       .long   2988777976
+       .long   3188950659
+       .long   536870912
+       .long   1073291720
+       .long   1030371341
+       .long   1043402665
+       .long   3221225472
+       .long   1073291734
+       .long   1524463765
+       .long   1044361356
+       .long   3087007744
+       .long   1073291745
+       .long   2754295320
+       .long   1044731036
+       .long   134217728
+       .long   1073291753
+       .long   3099629057
+       .long   1044970710
+       .long   2281701376
+       .long   1073291758
+       .long   962914160
+       .long   3189838838
+       .long   805306368
+       .long   1073291762
+       .long   3543908206
+       .long   3188950786
+       .long   4026531840
+       .long   1073291764
+       .long   1849909620
+       .long   3191935434
+       .long   3221225472
+       .long   1073291766
+       .long   1641333636
+       .long   1044361352
+       .long   536870912
+       .long   1073291768
+       .long   1373968792
+       .long   1043402654
+       .long   134217728
+       .long   1073291769
+       .long   2033191599
+       .long   1044970710
+       .long   3087007744
+       .long   1073291769
+       .long   4117947437
+       .long   1044731035
+       .long   805306368
+       .long   1073291770
+       .long   315378368
+       .long   3188950787
+       .long   2281701376
+       .long   1073291770
+       .long   2428571750
+       .long   3189838838
+       .long   3221225472
+       .long   1073291770
+       .long   1608007466
+       .long   1044361352
+       .long   4026531840
+       .long   1073291770
+       .long   1895711420
+       .long   3191935434
+       .long   134217728
+       .long   1073291771
+       .long   2031108713
+       .long   1044970710
+       .long   536870912
+       .long   1073291771
+       .long   1362518342
+       .long   1043402654
+       .long   805306368
+       .long   1073291771
+       .long   317461253
+       .long   3188950787
+       .long   939524096
+       .long   1073291771
+       .long   4117231784
+       .long   1044731035
+       .long   1073741824
+       .long   1073291771
+       .long   1607942376
+       .long   1044361352
+       .long   1207959552
+       .long   1073291771
+       .long   2428929577
+       .long   3189838838
+       .long   1207959552
+       .long   1073291771
+       .long   2031104645
+       .long   1044970710
+       .long   1342177280
+       .long   1073291771
+       .long   1895722602
+       .long   3191935434
+       .long   1342177280
+       .long   1073291771
+       .long   317465322
+       .long   3188950787
+       .long   1342177280
+       .long   1073291771
+       .long   1362515546
+       .long   1043402654
+       .long   1342177280
+       .long   1073291771
+       .long   1607942248
+       .long   1044361352
+       .long   1342177280
+       .long   1073291771
+       .long   4117231610
+       .long   1044731035
+       .long   1342177280
+       .long   1073291771
+       .long   2031104637
+       .long   1044970710
+       .long   1342177280
+       .long   1073291771
+       .long   1540251232
+       .long   1045150466
+       .long   1342177280
+       .long   1073291771
+       .long   2644671394
+       .long   1045270303
+       .long   1342177280
+       .long   1073291771
+       .long   2399244691
+       .long   1045360181
+       .long   1342177280
+       .long   1073291771
+       .long   803971124
+       .long   1045420100
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192879152
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192849193
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192826724
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192811744
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192800509
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192793019
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192787402
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192783657
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192780848
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192778976
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192777572
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192776635
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192775933
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192775465
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192775114
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774880
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192774704
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192774587
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192774500
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192774441
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192774397
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774368
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192774346
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192774331
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192774320
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192774313
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192774308
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774304
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192774301
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192774299
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192774298
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192774297
+       .long   1476395008
+       .long   1073291771
+       .long   3613709523
+       .long   3192774296
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774296
+       .long   1476395008
+       .long   1073291771
+       .long   177735686
+       .long   3192774296
+       .long   1476395008
+       .long   1073291771
+       .long   3490996172
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   2754716064
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   2263862659
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1895722605
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1650295902
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1466225875
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1343512524
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1251477510
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1190120835
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1144103328
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1113424990
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1090416237
+       .long   3192774295
+       .long   1476395008
+       .long   1073291771
+       .long   1075077068
+       .long   3192774295
+       .long   1431655765
+       .long   3218429269
+       .long   2576978363
+       .long   1070176665
+       .long   2453154343
+       .long   3217180964
+       .long   4189149139
+       .long   1069314502
+       .long   1775019125
+       .long   3216459198
+       .long   273199057
+       .long   1068739452
+       .long   874748308
+       .long   3215993277
+       .long   0
+       .long   1017118720
+       .long   0
+       .long   1069547520
+       .long   0
+       .long   1129316352
+       .long   0
+       .long   1072693248
+       .long   1413754136
+       .long   1073291771
+       .long   856972295
+       .long   1016178214
+       .long   33554432
+       .long   1101004800
+       .type   __datan_la_CoutTab,@object
+       .size   __datan_la_CoutTab,1936
+       .align 8
+.L_2il0floatpacket.14:
+       .long   0x00000000,0x3ff00000
+       .type   .L_2il0floatpacket.14,@object
+       .size   .L_2il0floatpacket.14,8
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_atan_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_atan_s_la.s
new file mode 100644 (file)
index 0000000..743ebf4
--- /dev/null
@@ -0,0 +1,357 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *      For    0.0    <= x <=  7.0/16.0: atan(x) = atan(0.0) + atan(s), where s=(x-0.0)/(1.0+0.0*x)
+ *      For  7.0/16.0 <= x <= 11.0/16.0: atan(x) = atan(0.5) + atan(s), where s=(x-0.5)/(1.0+0.5*x)
+ *      For 11.0/16.0 <= x <= 19.0/16.0: atan(x) = atan(1.0) + atan(s), where s=(x-1.0)/(1.0+1.0*x)
+ *      For 19.0/16.0 <= x <= 39.0/16.0: atan(x) = atan(1.5) + atan(s), where s=(x-1.5)/(1.0+1.5*x)
+ *      For 39.0/16.0 <= x <=    inf   : atan(x) = atan(inf) + atan(s), where s=-1.0/x
+ *      Where atan(s) ~= s+s^3*Poly11(s^2) on interval |s|<7.0/0.16.
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_atanf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_atanf16
+
+__svml_atanf16:
+
+
+       .cfi_startproc
+..L2:
+
+        vandps    __svml_satan_data_internal_avx512(%rip), %zmm0, %zmm7
+        vmovups   128+__svml_satan_data_internal_avx512(%rip), %zmm3
+        vmovups   256+__svml_satan_data_internal_avx512(%rip), %zmm8
+
+/* round to 2 bits after binary point */
+        vreduceps $40, {sae}, %zmm7, %zmm5
+
+/* saturate X range */
+        vmovups   320+__svml_satan_data_internal_avx512(%rip), %zmm6
+        vmovups   64+__svml_satan_data_internal_avx512(%rip), %zmm2
+        vcmpps    $29, {sae}, %zmm3, %zmm7, %k1
+
+/* table lookup sequence */
+        vmovups   448+__svml_satan_data_internal_avx512(%rip), %zmm3
+        vsubps    {rn-sae}, %zmm5, %zmm7, %zmm4
+        vaddps    {rn-sae}, %zmm2, %zmm7, %zmm1
+        vxorps    %zmm0, %zmm7, %zmm0
+        vfmadd231ps {rn-sae}, %zmm7, %zmm4, %zmm8
+        vmovups   896+__svml_satan_data_internal_avx512(%rip), %zmm4
+
+/* if|X|>=MaxThreshold, set DiffX=-1 */
+        vblendmps 192+__svml_satan_data_internal_avx512(%rip), %zmm5, %zmm9{%k1}
+        vmovups   960+__svml_satan_data_internal_avx512(%rip), %zmm5
+
+/* if|X|>=MaxThreshold, set Y=X */
+        vminps    {sae}, %zmm7, %zmm6, %zmm8{%k1}
+
+/* R+Rl = DiffX/Y */
+        vgetmantps $0, {sae}, %zmm9, %zmm12
+        vgetexpps {sae}, %zmm9, %zmm10
+        vpermt2ps 512+__svml_satan_data_internal_avx512(%rip), %zmm1, %zmm3
+        vgetmantps $0, {sae}, %zmm8, %zmm15
+        vgetexpps {sae}, %zmm8, %zmm11
+        vmovups   832+__svml_satan_data_internal_avx512(%rip), %zmm1
+
+/* set table value to Pi/2 for large X */
+        vblendmps 704+__svml_satan_data_internal_avx512(%rip), %zmm3, %zmm9{%k1}
+        vrcp14ps  %zmm15, %zmm13
+        vsubps    {rn-sae}, %zmm11, %zmm10, %zmm2
+        vmulps    {rn-sae}, %zmm13, %zmm12, %zmm14
+        vfnmadd213ps {rn-sae}, %zmm12, %zmm14, %zmm15
+        vfmadd213ps {rn-sae}, %zmm14, %zmm13, %zmm15
+        vscalefps {rn-sae}, %zmm2, %zmm15, %zmm7
+
+/* polynomial evaluation */
+        vmulps    {rn-sae}, %zmm7, %zmm7, %zmm8
+        vmulps    {rn-sae}, %zmm7, %zmm8, %zmm6
+        vfmadd231ps {rn-sae}, %zmm8, %zmm1, %zmm4
+        vfmadd213ps {rn-sae}, %zmm5, %zmm4, %zmm8
+        vfmadd213ps {rn-sae}, %zmm7, %zmm6, %zmm8
+        vaddps    {rn-sae}, %zmm9, %zmm8, %zmm10
+        vxorps    %zmm0, %zmm10, %zmm0
+
+/* no invcbrt in libm, so taking it out here */
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_atanf16,@function
+       .size   __svml_atanf16,.-__svml_atanf16
+..LN__svml_atanf16.0:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_satan_data_internal_avx512:
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1241513984
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   1089994752
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   1333788672
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1048239024
+       .long   1055744824
+       .long   1059372157
+       .long   1061752795
+       .long   1063609315
+       .long   1065064543
+       .long   1065786489
+       .long   1066252045
+       .long   1066633083
+       .long   1066949484
+       .long   1067215699
+       .long   1067442363
+       .long   1067637412
+       .long   1067806856
+       .long   1067955311
+       .long   1068086373
+       .long   1068202874
+       .long   1068307075
+       .long   1068400798
+       .long   1068485529
+       .long   1068562486
+       .long   1068632682
+       .long   1068696961
+       .long   1068756035
+       .long   1068810506
+       .long   1068860887
+       .long   1068907620
+       .long   1068951084
+       .long   1068991608
+       .long   1069029480
+       .long   1069064949
+       .long   0
+       .long   2975494116
+       .long   833369962
+       .long   835299256
+       .long   2998648110
+       .long   2995239174
+       .long   3000492182
+       .long   860207626
+       .long   3008447516
+       .long   3005590622
+       .long   3000153675
+       .long   860754741
+       .long   859285590
+       .long   844944488
+       .long   2993069463
+       .long   858157665
+       .long   3006142000
+       .long   3007693206
+       .long   3009342234
+       .long   847469400
+       .long   3006114683
+       .long   852829553
+       .long   847325583
+       .long   860305056
+       .long   846145135
+       .long   2997638646
+       .long   855837703
+       .long   2979047222
+       .long   2995344192
+       .long   854092798
+       .long   3000498637
+       .long   859965578
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   3188697310
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   1045219554
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .long   3198855850
+       .type   __svml_satan_data_internal_avx512,@object
+       .size   __svml_satan_data_internal_avx512,1024
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_atanh_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_atanh_d_la.s
new file mode 100644 (file)
index 0000000..a6a21bc
--- /dev/null
@@ -0,0 +1,658 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *
+ *  *   Compute 0.5*[log(1+x)-log(1-x)], using small table
+ *  *   lookups that map to AVX3 permute instructions
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_atanh8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_atanh8
+
+__svml_atanh8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   256+__svml_datanh_data_internal_avx512(%rip), %zmm15
+
+/* round reciprocals to 1+4b mantissas */
+        vmovups   384+__svml_datanh_data_internal_avx512(%rip), %zmm6
+        vmovups   448+__svml_datanh_data_internal_avx512(%rip), %zmm9
+        vmovaps   %zmm0, %zmm2
+        vandpd    320+__svml_datanh_data_internal_avx512(%rip), %zmm2, %zmm13
+
+/* 1+y */
+        vaddpd    {rn-sae}, %zmm15, %zmm13, %zmm0
+
+/* 1-y */
+        vsubpd    {rn-sae}, %zmm13, %zmm15, %zmm4
+        vxorpd    %zmm13, %zmm2, %zmm1
+
+/* Yp_high */
+        vsubpd    {rn-sae}, %zmm15, %zmm0, %zmm7
+
+/* -Ym_high */
+        vsubpd    {rn-sae}, %zmm15, %zmm4, %zmm12
+
+/* RcpP ~ 1/Yp */
+        vrcp14pd  %zmm0, %zmm3
+
+/* RcpM ~ 1/Ym */
+        vrcp14pd  %zmm4, %zmm5
+
+/* input outside (-1, 1) ? */
+        vcmppd    $21, {sae}, %zmm15, %zmm13, %k0
+        vpaddq    %zmm6, %zmm3, %zmm11
+        vpaddq    %zmm6, %zmm5, %zmm10
+
+/* Yp_low */
+        vsubpd    {rn-sae}, %zmm7, %zmm13, %zmm8
+        vandpd    %zmm9, %zmm11, %zmm14
+        vandpd    %zmm9, %zmm10, %zmm3
+
+/* Ym_low */
+        vaddpd    {rn-sae}, %zmm12, %zmm13, %zmm12
+
+/* Reduced argument: Rp = (RcpP*Yp - 1)+RcpP*Yp_low */
+        vfmsub213pd {rn-sae}, %zmm15, %zmm14, %zmm0
+
+/* Reduced argument: Rm = (RcpM*Ym - 1)+RcpM*Ym_low */
+        vfmsub231pd {rn-sae}, %zmm3, %zmm4, %zmm15
+
+/* exponents */
+        vgetexppd {sae}, %zmm14, %zmm5
+        vgetexppd {sae}, %zmm3, %zmm4
+
+/* Table lookups */
+        vmovups   __svml_datanh_data_internal_avx512(%rip), %zmm9
+        vmovups   64+__svml_datanh_data_internal_avx512(%rip), %zmm13
+        vmovups   128+__svml_datanh_data_internal_avx512(%rip), %zmm7
+        vfmadd231pd {rn-sae}, %zmm14, %zmm8, %zmm0
+        vfnmadd231pd {rn-sae}, %zmm3, %zmm12, %zmm15
+
+/* Prepare table index */
+        vpsrlq    $48, %zmm14, %zmm11
+        vpsrlq    $48, %zmm3, %zmm8
+        vmovups   192+__svml_datanh_data_internal_avx512(%rip), %zmm14
+
+/* polynomials */
+        vmovups   512+__svml_datanh_data_internal_avx512(%rip), %zmm3
+
+/* Km-Kp */
+        vsubpd    {rn-sae}, %zmm5, %zmm4, %zmm5
+        vmovups   576+__svml_datanh_data_internal_avx512(%rip), %zmm4
+        kmovw     %k0, %edx
+        vmovaps   %zmm11, %zmm10
+        vmovaps   %zmm4, %zmm6
+        vpermi2pd %zmm13, %zmm9, %zmm10
+        vpermi2pd %zmm14, %zmm7, %zmm11
+        vpermt2pd %zmm13, %zmm8, %zmm9
+        vpermt2pd %zmm14, %zmm8, %zmm7
+        vmovups   640+__svml_datanh_data_internal_avx512(%rip), %zmm8
+        vfmadd231pd {rn-sae}, %zmm0, %zmm3, %zmm6
+        vfmadd231pd {rn-sae}, %zmm15, %zmm3, %zmm4
+        vmovups   832+__svml_datanh_data_internal_avx512(%rip), %zmm13
+        vmovups   896+__svml_datanh_data_internal_avx512(%rip), %zmm14
+        vfmadd213pd {rn-sae}, %zmm8, %zmm0, %zmm6
+        vfmadd213pd {rn-sae}, %zmm8, %zmm15, %zmm4
+        vmovups   1024+__svml_datanh_data_internal_avx512(%rip), %zmm8
+        vsubpd    {rn-sae}, %zmm11, %zmm7, %zmm12
+
+/* table values */
+        vsubpd    {rn-sae}, %zmm10, %zmm9, %zmm3
+        vmovups   704+__svml_datanh_data_internal_avx512(%rip), %zmm7
+        vmovups   768+__svml_datanh_data_internal_avx512(%rip), %zmm9
+
+/* K*L2H + Th */
+        vmovups   1152+__svml_datanh_data_internal_avx512(%rip), %zmm10
+
+/* K*L2L + Tl */
+        vmovups   1216+__svml_datanh_data_internal_avx512(%rip), %zmm11
+        vfmadd213pd {rn-sae}, %zmm7, %zmm0, %zmm6
+        vfmadd213pd {rn-sae}, %zmm7, %zmm15, %zmm4
+        vmovups   960+__svml_datanh_data_internal_avx512(%rip), %zmm7
+        vfmadd231pd {rn-sae}, %zmm5, %zmm10, %zmm3
+        vfmadd213pd {rn-sae}, %zmm12, %zmm11, %zmm5
+        vfmadd213pd {rn-sae}, %zmm9, %zmm0, %zmm6
+        vfmadd213pd {rn-sae}, %zmm9, %zmm15, %zmm4
+        vfmadd213pd {rn-sae}, %zmm13, %zmm0, %zmm6
+        vfmadd213pd {rn-sae}, %zmm13, %zmm15, %zmm4
+        vfmadd213pd {rn-sae}, %zmm14, %zmm0, %zmm6
+        vfmadd213pd {rn-sae}, %zmm14, %zmm15, %zmm4
+        vfmadd213pd {rn-sae}, %zmm7, %zmm0, %zmm6
+        vfmadd213pd {rn-sae}, %zmm7, %zmm15, %zmm4
+        vfmadd213pd {rn-sae}, %zmm8, %zmm0, %zmm6
+        vfmadd213pd {rn-sae}, %zmm8, %zmm15, %zmm4
+
+/* (K*L2L + Tl) + Rp*PolyP */
+        vfmadd213pd {rn-sae}, %zmm5, %zmm0, %zmm6
+        vorpd     1088+__svml_datanh_data_internal_avx512(%rip), %zmm1, %zmm0
+
+/* (K*L2L + Tl) + Rp*PolyP -Rm*PolyM */
+        vfnmadd213pd {rn-sae}, %zmm6, %zmm15, %zmm4
+        vaddpd    {rn-sae}, %zmm4, %zmm3, %zmm1
+        vmulpd    {rn-sae}, %zmm0, %zmm1, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm2, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_datanh_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_atanh8,@function
+       .size   __svml_atanh8,.-__svml_atanh8
+..LN__svml_atanh8.0:
+
+.L_2__routine_start___svml_datanh_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_datanh_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        movzwl    6(%rdi), %eax
+        andl      $32752, %eax
+        movsd     (%rdi), %xmm0
+        movb      7(%rdi), %dl
+        andb      $127, %dl
+        movsd     %xmm0, -8(%rsp)
+        cmpl      $32752, %eax
+        je        .LBL_2_6
+
+.LBL_2_2:
+
+        cmpl      $0, -8(%rsp)
+        jne       .LBL_2_5
+
+
+        movb      %dl, -1(%rsp)
+        cmpl      $1072693248, -4(%rsp)
+        jne       .LBL_2_5
+
+
+        divsd     8+__datanh_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, (%rsi)
+        movl      $2, %eax
+        ret
+
+.LBL_2_5:
+
+        movsd     8+__datanh_la_CoutTab(%rip), %xmm0
+        movl      $1, %eax
+        mulsd     16+__datanh_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_6:
+
+        testl     $1048575, 4(%rdi)
+        jne       .LBL_2_8
+
+
+        cmpl      $0, (%rdi)
+        je        .LBL_2_2
+
+.LBL_2_8:
+
+        mulsd     %xmm0, %xmm0
+        xorl      %eax, %eax
+        movsd     %xmm0, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_datanh_cout_rare_internal,@function
+       .size   __svml_datanh_cout_rare_internal,.-__svml_datanh_cout_rare_internal
+..LN__svml_datanh_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_datanh_data_internal_avx512:
+       .long   0
+       .long   0
+       .long   3222274048
+       .long   1068436016
+       .long   1848246272
+       .long   1069426439
+       .long   1890058240
+       .long   1069940528
+       .long   3348824064
+       .long   1070370807
+       .long   2880143360
+       .long   1070688092
+       .long   3256647680
+       .long   1070883211
+       .long   4139515904
+       .long   1071069655
+       .long   3971973120
+       .long   1071248163
+       .long   3348791296
+       .long   1071419383
+       .long   1605304320
+       .long   1071583887
+       .long   3827646464
+       .long   1071693426
+       .long   1584414720
+       .long   1071769695
+       .long   860815360
+       .long   1071843287
+       .long   3896934400
+       .long   1071914383
+       .long   643547136
+       .long   1071983149
+       .long   0
+       .long   0
+       .long   399283991
+       .long   1030105702
+       .long   1028718588
+       .long   1030642877
+       .long   3808918910
+       .long   3177909005
+       .long   4136237123
+       .long   3177805716
+       .long   3462654649
+       .long   1029900033
+       .long   2051171366
+       .long   3177225921
+       .long   2396640771
+       .long   3177708721
+       .long   3062724207
+       .long   1029196786
+       .long   634920691
+       .long   1029317036
+       .long   1913570380
+       .long   1027322573
+       .long   1734886604
+       .long   3177545033
+       .long   2335489660
+       .long   1025116093
+       .long   3046154741
+       .long   1029750303
+       .long   914782743
+       .long   3176833847
+       .long   3743595607
+       .long   1028041657
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   32768
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   0
+       .long   4294901760
+       .long   1087603010
+       .long   1069318621
+       .long   1087603010
+       .long   1069318621
+       .long   1087603010
+       .long   1069318621
+       .long   1087603010
+       .long   1069318621
+       .long   1087603010
+       .long   1069318621
+       .long   1087603010
+       .long   1069318621
+       .long   1087603010
+       .long   1069318621
+       .long   1087603010
+       .long   1069318621
+       .long   3090058096
+       .long   3217033020
+       .long   3090058096
+       .long   3217033020
+       .long   3090058096
+       .long   3217033020
+       .long   3090058096
+       .long   3217033020
+       .long   3090058096
+       .long   3217033020
+       .long   3090058096
+       .long   3217033020
+       .long   3090058096
+       .long   3217033020
+       .long   3090058096
+       .long   3217033020
+       .long   2566904552
+       .long   1069697314
+       .long   2566904552
+       .long   1069697314
+       .long   2566904552
+       .long   1069697314
+       .long   2566904552
+       .long   1069697314
+       .long   2566904552
+       .long   1069697314
+       .long   2566904552
+       .long   1069697314
+       .long   2566904552
+       .long   1069697314
+       .long   2566904552
+       .long   1069697314
+       .long   4168213957
+       .long   3217380691
+       .long   4168213957
+       .long   3217380691
+       .long   4168213957
+       .long   3217380691
+       .long   4168213957
+       .long   3217380691
+       .long   4168213957
+       .long   3217380691
+       .long   4168213957
+       .long   3217380691
+       .long   4168213957
+       .long   3217380691
+       .long   4168213957
+       .long   3217380691
+       .long   2580363594
+       .long   1070176665
+       .long   2580363594
+       .long   1070176665
+       .long   2580363594
+       .long   1070176665
+       .long   2580363594
+       .long   1070176665
+       .long   2580363594
+       .long   1070176665
+       .long   2580363594
+       .long   1070176665
+       .long   2580363594
+       .long   1070176665
+       .long   2580363594
+       .long   1070176665
+       .long   797185
+       .long   3218079744
+       .long   797185
+       .long   3218079744
+       .long   797185
+       .long   3218079744
+       .long   797185
+       .long   3218079744
+       .long   797185
+       .long   3218079744
+       .long   797185
+       .long   3218079744
+       .long   797185
+       .long   3218079744
+       .long   797185
+       .long   3218079744
+       .long   1431655522
+       .long   1070945621
+       .long   1431655522
+       .long   1070945621
+       .long   1431655522
+       .long   1070945621
+       .long   1431655522
+       .long   1070945621
+       .long   1431655522
+       .long   1070945621
+       .long   1431655522
+       .long   1070945621
+       .long   1431655522
+       .long   1070945621
+       .long   1431655522
+       .long   1070945621
+       .long   4294967237
+       .long   3219128319
+       .long   4294967237
+       .long   3219128319
+       .long   4294967237
+       .long   3219128319
+       .long   4294967237
+       .long   3219128319
+       .long   4294967237
+       .long   3219128319
+       .long   4294967237
+       .long   3219128319
+       .long   4294967237
+       .long   3219128319
+       .long   4294967237
+       .long   3219128319
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .long   3164471296
+       .long   1031600026
+       .type   __svml_datanh_data_internal_avx512,@object
+       .size   __svml_datanh_data_internal_avx512,1280
+       .align 8
+__datanh_la_CoutTab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   4293918720
+       .type   __datanh_la_CoutTab,@object
+       .size   __datanh_la_CoutTab,32
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_atanh_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_atanh_s_la.s
new file mode 100644 (file)
index 0000000..2ae97c4
--- /dev/null
@@ -0,0 +1,560 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *
+ *  *   Compute 0.5*[log(1+x)-log(1-x)], using small table
+ *  *   lookups that map to AVX3 permute instructions
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_atanhf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_atanhf16
+
+__svml_atanhf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   256+__svml_satanh_data_internal_avx512(%rip), %zmm4
+
+/* round reciprocals to 1+5b mantissas */
+        vmovups   384+__svml_satanh_data_internal_avx512(%rip), %zmm14
+        vmovups   448+__svml_satanh_data_internal_avx512(%rip), %zmm1
+        vmovaps   %zmm0, %zmm11
+        vandps    320+__svml_satanh_data_internal_avx512(%rip), %zmm11, %zmm6
+
+/* 1+y */
+        vaddps    {rn-sae}, %zmm4, %zmm6, %zmm9
+
+/* 1-y */
+        vsubps    {rn-sae}, %zmm6, %zmm4, %zmm8
+        vxorps    %zmm6, %zmm11, %zmm10
+
+/* Yp_high */
+        vsubps    {rn-sae}, %zmm4, %zmm9, %zmm2
+
+/* -Ym_high */
+        vsubps    {rn-sae}, %zmm4, %zmm8, %zmm5
+
+/* RcpP ~ 1/Yp */
+        vrcp14ps  %zmm9, %zmm12
+
+/* RcpM ~ 1/Ym */
+        vrcp14ps  %zmm8, %zmm13
+
+/* input outside (-1, 1) ? */
+        vcmpps    $21, {sae}, %zmm4, %zmm6, %k0
+        vpaddd    %zmm14, %zmm12, %zmm15
+        vpaddd    %zmm14, %zmm13, %zmm0
+
+/* Yp_low */
+        vsubps    {rn-sae}, %zmm2, %zmm6, %zmm3
+        vandps    %zmm1, %zmm15, %zmm7
+        vandps    %zmm1, %zmm0, %zmm12
+
+/* Ym_low */
+        vaddps    {rn-sae}, %zmm5, %zmm6, %zmm5
+
+/* Reduced argument: Rp = (RcpP*Yp - 1)+RcpP*Yp_low */
+        vfmsub213ps {rn-sae}, %zmm4, %zmm7, %zmm9
+
+/* Reduced argument: Rm = (RcpM*Ym - 1)+RcpM*Ym_low */
+        vfmsub231ps {rn-sae}, %zmm12, %zmm8, %zmm4
+        vmovups   128+__svml_satanh_data_internal_avx512(%rip), %zmm8
+        vmovups   192+__svml_satanh_data_internal_avx512(%rip), %zmm13
+
+/* exponents */
+        vgetexpps {sae}, %zmm7, %zmm15
+        vfmadd231ps {rn-sae}, %zmm7, %zmm3, %zmm9
+
+/* Table lookups */
+        vmovups   __svml_satanh_data_internal_avx512(%rip), %zmm6
+        vgetexpps {sae}, %zmm12, %zmm14
+        vfnmadd231ps {rn-sae}, %zmm12, %zmm5, %zmm4
+
+/* Prepare table index */
+        vpsrld    $18, %zmm7, %zmm3
+        vpsrld    $18, %zmm12, %zmm2
+        vmovups   64+__svml_satanh_data_internal_avx512(%rip), %zmm7
+        vmovups   640+__svml_satanh_data_internal_avx512(%rip), %zmm12
+
+/* Km-Kp */
+        vsubps    {rn-sae}, %zmm15, %zmm14, %zmm1
+        kmovw     %k0, %edx
+        vmovaps   %zmm3, %zmm0
+        vpermi2ps %zmm13, %zmm8, %zmm3
+        vpermt2ps %zmm13, %zmm2, %zmm8
+        vpermi2ps %zmm7, %zmm6, %zmm0
+        vpermt2ps %zmm7, %zmm2, %zmm6
+        vsubps    {rn-sae}, %zmm3, %zmm8, %zmm5
+
+/* K*L2H + Th */
+        vmovups   832+__svml_satanh_data_internal_avx512(%rip), %zmm2
+
+/* K*L2L + Tl */
+        vmovups   896+__svml_satanh_data_internal_avx512(%rip), %zmm3
+
+/* polynomials */
+        vmovups   512+__svml_satanh_data_internal_avx512(%rip), %zmm7
+        vmovups   704+__svml_satanh_data_internal_avx512(%rip), %zmm13
+
+/* table values */
+        vsubps    {rn-sae}, %zmm0, %zmm6, %zmm0
+        vfmadd231ps {rn-sae}, %zmm1, %zmm2, %zmm0
+        vfmadd213ps {rn-sae}, %zmm5, %zmm3, %zmm1
+        vmovups   576+__svml_satanh_data_internal_avx512(%rip), %zmm3
+        vmovaps   %zmm3, %zmm2
+        vfmadd231ps {rn-sae}, %zmm9, %zmm7, %zmm2
+        vfmadd231ps {rn-sae}, %zmm4, %zmm7, %zmm3
+        vfmadd213ps {rn-sae}, %zmm12, %zmm9, %zmm2
+        vfmadd213ps {rn-sae}, %zmm12, %zmm4, %zmm3
+        vfmadd213ps {rn-sae}, %zmm13, %zmm9, %zmm2
+        vfmadd213ps {rn-sae}, %zmm13, %zmm4, %zmm3
+
+/* (K*L2L + Tl) + Rp*PolyP */
+        vfmadd213ps {rn-sae}, %zmm1, %zmm9, %zmm2
+        vorps     768+__svml_satanh_data_internal_avx512(%rip), %zmm10, %zmm9
+
+/* (K*L2L + Tl) + Rp*PolyP -Rm*PolyM */
+        vfnmadd213ps {rn-sae}, %zmm2, %zmm4, %zmm3
+        vaddps    {rn-sae}, %zmm3, %zmm0, %zmm4
+        vmulps    {rn-sae}, %zmm9, %zmm4, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm11, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_satanh_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_atanhf16,@function
+       .size   __svml_atanhf16,.-__svml_atanhf16
+..LN__svml_atanhf16.0:
+
+.L_2__routine_start___svml_satanh_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_satanh_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        movzwl    2(%rdi), %edx
+        movss     (%rdi), %xmm1
+        andl      $32640, %edx
+        movb      3(%rdi), %al
+        andb      $127, %al
+        movss     %xmm1, -8(%rsp)
+        movb      %al, -5(%rsp)
+        cmpl      $32640, %edx
+        je        .LBL_2_6
+
+
+        cmpl      $1065353216, -8(%rsp)
+        jne       .LBL_2_4
+
+
+        divss     4+__satanh_la__imlsAtanhTab(%rip), %xmm1
+        movss     %xmm1, (%rsi)
+        movl      $2, %eax
+        ret
+
+.LBL_2_4:
+
+        movss     8+__satanh_la__imlsAtanhTab(%rip), %xmm0
+        movl      $1, %eax
+        mulss     4+__satanh_la__imlsAtanhTab(%rip), %xmm0
+        movss     %xmm0, (%rsi)
+
+
+        ret
+
+.LBL_2_6:
+
+        cmpl      $2139095040, -8(%rsp)
+        jne       .LBL_2_8
+
+
+        movss     4+__satanh_la__imlsAtanhTab(%rip), %xmm0
+        movl      $1, %eax
+        mulss     %xmm0, %xmm1
+        movss     %xmm1, (%rsi)
+        ret
+
+.LBL_2_8:
+
+        mulss     (%rdi), %xmm1
+        xorl      %eax, %eax
+        movss     %xmm1, (%rsi)
+
+
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_satanh_cout_rare_internal,@function
+       .size   __svml_satanh_cout_rare_internal,.-__svml_satanh_cout_rare_internal
+..LN__svml_satanh_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_satanh_data_internal_avx512:
+       .long   0
+       .long   1023148032
+       .long   1031274496
+       .long   1035436032
+       .long   1039204352
+       .long   1041547264
+       .long   1043333120
+       .long   1045069824
+       .long   1046773760
+       .long   1048428544
+       .long   1049313280
+       .long   1050099712
+       .long   1050869760
+       .long   1051623424
+       .long   1052360704
+       .long   1053089792
+       .long   1053794304
+       .long   1054482432
+       .long   1055162368
+       .long   1055825920
+       .long   1056481280
+       .long   1057042432
+       .long   1057353728
+       .long   1057660928
+       .long   1057964032
+       .long   1058263040
+       .long   1058553856
+       .long   1058840576
+       .long   1059123200
+       .long   1059397632
+       .long   1059672064
+       .long   1059942400
+       .long   0
+       .long   925287326
+       .long   950209537
+       .long   928156389
+       .long   954265029
+       .long   3098231288
+       .long   3083833176
+       .long   949397309
+       .long   3045295702
+       .long   940324527
+       .long   3089323092
+       .long   945994465
+       .long   952492302
+       .long   954130348
+       .long   954989406
+       .long   3102096543
+       .long   3093041984
+       .long   947354573
+       .long   3053684310
+       .long   936642948
+       .long   3099086888
+       .long   3098368602
+       .long   946194506
+       .long   952357621
+       .long   943635681
+       .long   3097619830
+       .long   3080925892
+       .long   3078186319
+       .long   3093311347
+       .long   955801008
+       .long   934582639
+       .long   3099571146
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   131072
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   4294705152
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   3196061712
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   1051373854
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .type   __svml_satanh_data_internal_avx512,@object
+       .size   __svml_satanh_data_internal_avx512,960
+       .align 4
+__satanh_la__imlsAtanhTab:
+       .long   1065353216
+       .long   0
+       .long   2139095040
+       .type   __satanh_la__imlsAtanhTab,@object
+       .size   __satanh_la__imlsAtanhTab,12
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_cbrt_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_cbrt_d_la.s
new file mode 100644 (file)
index 0000000..32dbfcc
--- /dev/null
@@ -0,0 +1,913 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *   x=2^{3*k+j} * 1.b1 b2 ... b5 b6 ... b52
+ *   Let r=(x*2^{-3k-j} - 1.b1 b2 ... b5 1)* rcp[b1 b2 ..b5],
+ *   where rcp[b1 b2 .. b5]=1/(1.b1 b2 b3 b4 b5 1) in double precision
+ *   cbrt(2^j * 1. b1 b2 .. b5 1) is approximated as T[j][b1..b5]+D[j][b1..b5]
+ *   (T stores the high 53 bits, D stores the low order bits)
+ *   Result=2^k*T+(2^k*T*r)*P+2^k*D
+ *   where P=p1+p2*r+..+p8*r^7
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_cbrt8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_cbrt8
+
+__svml_cbrt8:
+
+
+       .cfi_startproc
+..L2:
+
+        vgetmantpd $0, {sae}, %zmm0, %zmm14
+
+/* GetExp(x) */
+        vgetexppd {sae}, %zmm0, %zmm7
+        vmovups   384+__svml_dcbrt_data_internal_avx512(%rip), %zmm8
+
+/* exponent/3 */
+        vmovups   512+__svml_dcbrt_data_internal_avx512(%rip), %zmm9
+        vmovups   576+__svml_dcbrt_data_internal_avx512(%rip), %zmm10
+
+/* Reduced argument: R = DblRcp*Mantissa - 1 */
+        vmovups   704+__svml_dcbrt_data_internal_avx512(%rip), %zmm2
+
+/* exponent%3 (to be used as index) */
+        vmovups   640+__svml_dcbrt_data_internal_avx512(%rip), %zmm11
+
+/* DblRcp ~ 1/Mantissa */
+        vrcp14pd  %zmm14, %zmm13
+        vaddpd    {rn-sae}, %zmm8, %zmm7, %zmm12
+        vandpd    448+__svml_dcbrt_data_internal_avx512(%rip), %zmm0, %zmm6
+
+/* round DblRcp to 3 fractional bits (RN mode, no Precision exception) */
+        vrndscalepd $72, {sae}, %zmm13, %zmm15
+        vfmsub231pd {rn-sae}, %zmm12, %zmm9, %zmm10
+
+/* polynomial */
+        vmovups   768+__svml_dcbrt_data_internal_avx512(%rip), %zmm0
+        vmovups   896+__svml_dcbrt_data_internal_avx512(%rip), %zmm7
+        vmovups   960+__svml_dcbrt_data_internal_avx512(%rip), %zmm9
+        vfmsub231pd {rn-sae}, %zmm15, %zmm14, %zmm2
+        vrndscalepd $9, {sae}, %zmm10, %zmm5
+
+/* Table lookup */
+        vmovups   128+__svml_dcbrt_data_internal_avx512(%rip), %zmm10
+        vmovups   1024+__svml_dcbrt_data_internal_avx512(%rip), %zmm8
+        vmovups   1216+__svml_dcbrt_data_internal_avx512(%rip), %zmm13
+        vfmadd231pd {rn-sae}, %zmm2, %zmm7, %zmm9
+        vfnmadd231pd {rn-sae}, %zmm5, %zmm11, %zmm12
+        vmovups   1088+__svml_dcbrt_data_internal_avx512(%rip), %zmm11
+        vmovups   1344+__svml_dcbrt_data_internal_avx512(%rip), %zmm14
+
+/* Prepare table index */
+        vpsrlq    $49, %zmm15, %zmm1
+
+/* Table lookup: 2^(exponent%3) */
+        vpermpd   __svml_dcbrt_data_internal_avx512(%rip), %zmm12, %zmm4
+        vpermpd   64+__svml_dcbrt_data_internal_avx512(%rip), %zmm12, %zmm3
+        vpermt2pd 192+__svml_dcbrt_data_internal_avx512(%rip), %zmm1, %zmm10
+        vmovups   832+__svml_dcbrt_data_internal_avx512(%rip), %zmm1
+        vfmadd231pd {rn-sae}, %zmm2, %zmm8, %zmm11
+        vmovups   1280+__svml_dcbrt_data_internal_avx512(%rip), %zmm12
+        vscalefpd {rn-sae}, %zmm5, %zmm10, %zmm15
+        vfmadd231pd {rn-sae}, %zmm2, %zmm0, %zmm1
+        vmovups   1152+__svml_dcbrt_data_internal_avx512(%rip), %zmm5
+        vfmadd231pd {rn-sae}, %zmm2, %zmm12, %zmm14
+        vmulpd    {rn-sae}, %zmm2, %zmm2, %zmm0
+        vfmadd231pd {rn-sae}, %zmm2, %zmm5, %zmm13
+
+/* Sh*R */
+        vmulpd    {rn-sae}, %zmm2, %zmm4, %zmm2
+        vfmadd213pd {rn-sae}, %zmm9, %zmm0, %zmm1
+        vfmadd213pd {rn-sae}, %zmm11, %zmm0, %zmm1
+        vfmadd213pd {rn-sae}, %zmm13, %zmm0, %zmm1
+        vfmadd213pd {rn-sae}, %zmm14, %zmm0, %zmm1
+
+/* Sl + (Sh*R)*Poly */
+        vfmadd213pd {rn-sae}, %zmm3, %zmm1, %zmm2
+
+/*
+ * branch-free
+ * scaled_Th*(Sh+Sl+Sh*R*Poly)
+ */
+        vaddpd    {rn-sae}, %zmm4, %zmm2, %zmm3
+        vmulpd    {rn-sae}, %zmm15, %zmm3, %zmm4
+        vorpd     %zmm6, %zmm4, %zmm0
+
+/* no invcbrt in libm, so taking it out here */
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_cbrt8,@function
+       .size   __svml_cbrt8,.-__svml_cbrt8
+..LN__svml_cbrt8.0:
+
+.L_2__routine_start___svml_dcbrt_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dcbrt_cout_rare_internal:
+
+
+       .cfi_startproc
+..L5:
+
+        movq      %rsi, %r8
+        movzwl    6(%rdi), %r9d
+        andl      $32752, %r9d
+        shrl      $4, %r9d
+        movb      7(%rdi), %sil
+        movsd     (%rdi), %xmm1
+        cmpl      $2047, %r9d
+        je        .LBL_2_9
+
+
+        ucomisd   432+__dcbrt_la__vmldCbrtTab(%rip), %xmm1
+        jp        .LBL_2_3
+        je        .LBL_2_8
+
+.LBL_2_3:
+
+        movb      %sil, %al
+        lea       440+__dcbrt_la__vmldCbrtTab(%rip), %rdx
+        andb      $-128, %al
+        andb      $127, %sil
+        shrb      $7, %al
+        xorl      %edi, %edi
+        movsd     %xmm1, -56(%rsp)
+        movzbl    %al, %ecx
+        movb      %sil, -49(%rsp)
+        movsd     (%rdx,%rcx,8), %xmm5
+        testl     %r9d, %r9d
+        jne       .LBL_2_5
+
+
+        movsd     -56(%rsp), %xmm0
+        movl      $100, %edi
+        mulsd     360+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        movsd     %xmm0, -56(%rsp)
+        jmp       .LBL_2_6
+
+.LBL_2_5:
+
+        movsd     -56(%rsp), %xmm0
+
+.LBL_2_6:
+
+        movzwl    -50(%rsp), %esi
+        movl      $1431655766, %eax
+        andl      $32752, %esi
+        lea       __dcbrt_la__vmldCbrtTab(%rip), %r11
+        shrl      $4, %esi
+        movsd     %xmm0, -40(%rsp)
+        movsd     368+__dcbrt_la__vmldCbrtTab(%rip), %xmm14
+        imull     %esi
+        movl      $1431655766, %eax
+        lea       (%rdx,%rdx,2), %ecx
+        negl      %ecx
+        addl      %esi, %ecx
+        subl      %ecx, %esi
+        addl      %ecx, %ecx
+        addl      $-1023, %esi
+        imull     %esi
+        sarl      $31, %esi
+        subl      %esi, %edx
+        addl      $1023, %edx
+        subl      %edi, %edx
+        movzwl    -34(%rsp), %edi
+        andl      $2047, %edx
+        andl      $-32753, %edi
+        addl      $16368, %edi
+        movw      %di, -34(%rsp)
+        movsd     -40(%rsp), %xmm11
+        movaps    %xmm11, %xmm6
+        mulsd     376+__dcbrt_la__vmldCbrtTab(%rip), %xmm6
+        movsd     %xmm6, -32(%rsp)
+        movsd     -32(%rsp), %xmm7
+        movl      -36(%rsp), %r10d
+        andl      $1048575, %r10d
+        subsd     -40(%rsp), %xmm7
+        movsd     %xmm7, -24(%rsp)
+        movsd     -32(%rsp), %xmm9
+        movsd     -24(%rsp), %xmm8
+        shrl      $15, %r10d
+        subsd     %xmm8, %xmm9
+        movsd     %xmm9, -32(%rsp)
+        movsd     -32(%rsp), %xmm10
+        movsd     (%r11,%r10,8), %xmm4
+        subsd     %xmm10, %xmm11
+        movaps    %xmm4, %xmm12
+        movaps    %xmm4, %xmm13
+        mulsd     %xmm4, %xmm12
+        movsd     %xmm11, -24(%rsp)
+        movsd     -32(%rsp), %xmm2
+        mulsd     %xmm12, %xmm2
+        mulsd     %xmm2, %xmm13
+        movsd     440+__dcbrt_la__vmldCbrtTab(%rip), %xmm6
+        movsd     -24(%rsp), %xmm3
+        subsd     %xmm13, %xmm6
+        mulsd     %xmm12, %xmm3
+        mulsd     %xmm6, %xmm14
+        mulsd     %xmm3, %xmm4
+        movsd     %xmm14, -32(%rsp)
+        movsd     -32(%rsp), %xmm15
+        xorps     .L_2il0floatpacket.81(%rip), %xmm4
+        subsd     %xmm6, %xmm15
+        movsd     %xmm15, -24(%rsp)
+        movsd     -32(%rsp), %xmm1
+        movsd     -24(%rsp), %xmm0
+        movsd     256+__dcbrt_la__vmldCbrtTab(%rip), %xmm9
+        subsd     %xmm0, %xmm1
+        movsd     %xmm1, -32(%rsp)
+        movsd     -32(%rsp), %xmm13
+        movsd     352+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        subsd     %xmm13, %xmm6
+        movsd     %xmm6, -24(%rsp)
+        movsd     -32(%rsp), %xmm1
+        movsd     -24(%rsp), %xmm7
+        movaps    %xmm1, %xmm8
+        movsd     256+__dcbrt_la__vmldCbrtTab(%rip), %xmm11
+        addsd     %xmm7, %xmm4
+        movsd     256+__dcbrt_la__vmldCbrtTab(%rip), %xmm7
+        addsd     %xmm4, %xmm8
+        mulsd     %xmm8, %xmm0
+        movslq    %ecx, %rcx
+        addsd     344+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        mulsd     %xmm8, %xmm0
+        movq      440+__dcbrt_la__vmldCbrtTab(%rip), %r9
+        movq      %r9, -48(%rsp)
+        shrq      $48, %r9
+        addsd     336+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        mulsd     %xmm8, %xmm0
+        andl      $-32753, %r9d
+        shll      $4, %edx
+        addsd     328+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        mulsd     %xmm8, %xmm0
+        orl       %edx, %r9d
+        movw      %r9w, -42(%rsp)
+        addsd     320+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        mulsd     %xmm8, %xmm0
+        addsd     312+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        mulsd     %xmm8, %xmm0
+        addsd     304+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        mulsd     %xmm8, %xmm0
+        addsd     296+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        mulsd     %xmm8, %xmm0
+        addsd     288+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        mulsd     %xmm8, %xmm0
+        addsd     280+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        mulsd     %xmm8, %xmm0
+        addsd     272+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        mulsd     %xmm8, %xmm0
+        addsd     %xmm0, %xmm9
+        movsd     %xmm9, -32(%rsp)
+        movsd     -32(%rsp), %xmm10
+        movsd     368+__dcbrt_la__vmldCbrtTab(%rip), %xmm9
+        subsd     %xmm10, %xmm11
+        movsd     %xmm11, -24(%rsp)
+        movsd     -32(%rsp), %xmm14
+        movsd     -24(%rsp), %xmm12
+        addsd     %xmm12, %xmm14
+        movsd     %xmm14, -16(%rsp)
+        movaps    %xmm2, %xmm14
+        movsd     -24(%rsp), %xmm6
+        addsd     %xmm0, %xmm6
+        movsd     %xmm6, -24(%rsp)
+        movsd     -16(%rsp), %xmm15
+        subsd     %xmm15, %xmm7
+        movsd     %xmm7, -16(%rsp)
+        movsd     -24(%rsp), %xmm8
+        movsd     -16(%rsp), %xmm0
+        addsd     %xmm0, %xmm8
+        movsd     %xmm8, -16(%rsp)
+        movaps    %xmm1, %xmm8
+        movsd     -32(%rsp), %xmm13
+        mulsd     %xmm13, %xmm9
+        movsd     -16(%rsp), %xmm0
+        movsd     %xmm9, -32(%rsp)
+        movsd     -32(%rsp), %xmm10
+        subsd     %xmm13, %xmm10
+        addsd     264+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        movsd     %xmm10, -24(%rsp)
+        movsd     -32(%rsp), %xmm11
+        movsd     -24(%rsp), %xmm6
+        subsd     %xmm6, %xmm11
+        movsd     %xmm11, -32(%rsp)
+        movsd     -32(%rsp), %xmm12
+        subsd     %xmm12, %xmm13
+        movsd     %xmm13, -24(%rsp)
+        movsd     -32(%rsp), %xmm7
+        movsd     -24(%rsp), %xmm6
+        mulsd     %xmm7, %xmm8
+        addsd     %xmm0, %xmm6
+        mulsd     %xmm4, %xmm7
+        mulsd     %xmm6, %xmm4
+        mulsd     %xmm6, %xmm1
+        addsd     %xmm4, %xmm7
+        movsd     368+__dcbrt_la__vmldCbrtTab(%rip), %xmm4
+        addsd     %xmm1, %xmm7
+        mulsd     %xmm8, %xmm4
+        movsd     %xmm7, -32(%rsp)
+        movsd     -32(%rsp), %xmm10
+        movsd     %xmm4, -32(%rsp)
+        movsd     -32(%rsp), %xmm0
+        subsd     %xmm8, %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movsd     -32(%rsp), %xmm1
+        movsd     -24(%rsp), %xmm4
+        subsd     %xmm4, %xmm1
+        movsd     %xmm1, -32(%rsp)
+        movsd     -32(%rsp), %xmm6
+        subsd     %xmm6, %xmm8
+        movsd     %xmm8, -24(%rsp)
+        movsd     -32(%rsp), %xmm9
+        movsd     -24(%rsp), %xmm7
+        movaps    %xmm9, %xmm1
+        mulsd     %xmm3, %xmm9
+        addsd     %xmm7, %xmm10
+        mulsd     %xmm2, %xmm1
+        movaps    %xmm10, %xmm11
+        movaps    %xmm1, %xmm12
+        mulsd     %xmm3, %xmm10
+        addsd     %xmm2, %xmm12
+        mulsd     %xmm2, %xmm11
+        addsd     %xmm9, %xmm10
+        addsd     %xmm10, %xmm11
+        movsd     %xmm11, -32(%rsp)
+        movsd     -32(%rsp), %xmm0
+        movsd     %xmm12, -32(%rsp)
+        movsd     -32(%rsp), %xmm13
+        subsd     %xmm13, %xmm14
+        movsd     %xmm14, -24(%rsp)
+        movsd     -32(%rsp), %xmm9
+        movsd     -24(%rsp), %xmm15
+        addsd     %xmm15, %xmm9
+        movsd     %xmm9, -16(%rsp)
+        movsd     -24(%rsp), %xmm10
+        addsd     %xmm10, %xmm1
+        movsd     %xmm1, -24(%rsp)
+        movsd     -16(%rsp), %xmm4
+        subsd     %xmm4, %xmm2
+        movsd     368+__dcbrt_la__vmldCbrtTab(%rip), %xmm4
+        movsd     %xmm2, -16(%rsp)
+        movsd     -24(%rsp), %xmm1
+        movsd     -16(%rsp), %xmm2
+        addsd     %xmm2, %xmm1
+        movsd     %xmm1, -16(%rsp)
+        movsd     -32(%rsp), %xmm9
+        mulsd     %xmm9, %xmm4
+        movsd     -16(%rsp), %xmm11
+        movsd     %xmm4, -32(%rsp)
+        movsd     -32(%rsp), %xmm6
+        subsd     %xmm9, %xmm6
+        movsd     %xmm6, -24(%rsp)
+        movsd     -32(%rsp), %xmm7
+        movsd     -24(%rsp), %xmm2
+        subsd     %xmm2, %xmm7
+        movsd     %xmm7, -32(%rsp)
+        movsd     -32(%rsp), %xmm8
+        subsd     %xmm8, %xmm9
+        movsd     %xmm9, -24(%rsp)
+        movsd     -32(%rsp), %xmm12
+        movsd     -24(%rsp), %xmm10
+        addsd     %xmm0, %xmm10
+        addsd     %xmm3, %xmm10
+        movsd     392(%r11,%rcx,8), %xmm3
+        movaps    %xmm3, %xmm0
+        addsd     %xmm10, %xmm11
+        mulsd     %xmm12, %xmm3
+        mulsd     %xmm11, %xmm0
+        movsd     384(%r11,%rcx,8), %xmm10
+        addsd     %xmm3, %xmm0
+        mulsd     %xmm10, %xmm11
+        mulsd     %xmm10, %xmm12
+        addsd     %xmm11, %xmm0
+        movsd     %xmm0, -32(%rsp)
+        movsd     -32(%rsp), %xmm3
+        addsd     %xmm3, %xmm12
+        mulsd     -48(%rsp), %xmm12
+        mulsd     %xmm12, %xmm5
+        movsd     %xmm5, (%r8)
+
+.LBL_2_7:
+
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_8:
+
+        movsd     440+__dcbrt_la__vmldCbrtTab(%rip), %xmm0
+        mulsd     %xmm0, %xmm1
+        movsd     %xmm1, (%r8)
+        jmp       .LBL_2_7
+
+.LBL_2_9:
+
+        addsd     %xmm1, %xmm1
+        movsd     %xmm1, (%r8)
+        jmp       .LBL_2_7
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dcbrt_cout_rare_internal,@function
+       .size   __svml_dcbrt_cout_rare_internal,.-__svml_dcbrt_cout_rare_internal
+..LN__svml_dcbrt_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dcbrt_data_internal_avx512:
+       .long   0
+       .long   1072693248
+       .long   4186796683
+       .long   1072965794
+       .long   2772266557
+       .long   1073309182
+       .long   0
+       .long   0
+       .long   0
+       .long   3220176896
+       .long   4186796683
+       .long   3220449442
+       .long   2772266557
+       .long   3220792830
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1418634270
+       .long   3162364962
+       .long   2576690953
+       .long   3164558313
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1418634270
+       .long   1014881314
+       .long   2576690953
+       .long   1017074665
+       .long   0
+       .long   0
+       .long   4186796683
+       .long   1072965794
+       .long   1554061055
+       .long   1072914931
+       .long   3992368458
+       .long   1072871093
+       .long   3714535808
+       .long   1072832742
+       .long   954824104
+       .long   1072798779
+       .long   3256858690
+       .long   1072768393
+       .long   3858344660
+       .long   1072740974
+       .long   1027250248
+       .long   1072716050
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1418634270
+       .long   3162364962
+       .long   629721892
+       .long   1016287007
+       .long   1776620500
+       .long   3163956186
+       .long   648592220
+       .long   1016269578
+       .long   1295766103
+       .long   3161896715
+       .long   1348094586
+       .long   3164476360
+       .long   2407028709
+       .long   1015925873
+       .long   497428409
+       .long   1014435402
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   1431655766
+       .long   1070945621
+       .long   1431655766
+       .long   1070945621
+       .long   1431655766
+       .long   1070945621
+       .long   1431655766
+       .long   1070945621
+       .long   1431655766
+       .long   1070945621
+       .long   1431655766
+       .long   1070945621
+       .long   1431655766
+       .long   1070945621
+       .long   1431655766
+       .long   1070945621
+       .long   0
+       .long   1126170624
+       .long   0
+       .long   1126170624
+       .long   0
+       .long   1126170624
+       .long   0
+       .long   1126170624
+       .long   0
+       .long   1126170624
+       .long   0
+       .long   1126170624
+       .long   0
+       .long   1126170624
+       .long   0
+       .long   1126170624
+       .long   0
+       .long   1074266112
+       .long   0
+       .long   1074266112
+       .long   0
+       .long   1074266112
+       .long   0
+       .long   1074266112
+       .long   0
+       .long   1074266112
+       .long   0
+       .long   1074266112
+       .long   0
+       .long   1074266112
+       .long   0
+       .long   1074266112
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   1792985698
+       .long   3213372987
+       .long   1792985698
+       .long   3213372987
+       .long   1792985698
+       .long   3213372987
+       .long   1792985698
+       .long   3213372987
+       .long   1792985698
+       .long   3213372987
+       .long   1792985698
+       .long   3213372987
+       .long   1792985698
+       .long   3213372987
+       .long   1792985698
+       .long   3213372987
+       .long   3135539317
+       .long   1066129956
+       .long   3135539317
+       .long   1066129956
+       .long   3135539317
+       .long   1066129956
+       .long   3135539317
+       .long   1066129956
+       .long   3135539317
+       .long   1066129956
+       .long   3135539317
+       .long   1066129956
+       .long   3135539317
+       .long   1066129956
+       .long   3135539317
+       .long   1066129956
+       .long   2087834975
+       .long   3213899448
+       .long   2087834975
+       .long   3213899448
+       .long   2087834975
+       .long   3213899448
+       .long   2087834975
+       .long   3213899448
+       .long   2087834975
+       .long   3213899448
+       .long   2087834975
+       .long   3213899448
+       .long   2087834975
+       .long   3213899448
+       .long   2087834975
+       .long   3213899448
+       .long   2476259604
+       .long   1066628333
+       .long   2476259604
+       .long   1066628333
+       .long   2476259604
+       .long   1066628333
+       .long   2476259604
+       .long   1066628333
+       .long   2476259604
+       .long   1066628333
+       .long   2476259604
+       .long   1066628333
+       .long   2476259604
+       .long   1066628333
+       .long   2476259604
+       .long   1066628333
+       .long   2012366478
+       .long   3214412045
+       .long   2012366478
+       .long   3214412045
+       .long   2012366478
+       .long   3214412045
+       .long   2012366478
+       .long   3214412045
+       .long   2012366478
+       .long   3214412045
+       .long   2012366478
+       .long   3214412045
+       .long   2012366478
+       .long   3214412045
+       .long   2012366478
+       .long   3214412045
+       .long   1104999785
+       .long   1067378449
+       .long   1104999785
+       .long   1067378449
+       .long   1104999785
+       .long   1067378449
+       .long   1104999785
+       .long   1067378449
+       .long   1104999785
+       .long   1067378449
+       .long   1104999785
+       .long   1067378449
+       .long   1104999785
+       .long   1067378449
+       .long   1104999785
+       .long   1067378449
+       .long   3534763582
+       .long   3215266280
+       .long   3534763582
+       .long   3215266280
+       .long   3534763582
+       .long   3215266280
+       .long   3534763582
+       .long   3215266280
+       .long   3534763582
+       .long   3215266280
+       .long   3534763582
+       .long   3215266280
+       .long   3534763582
+       .long   3215266280
+       .long   3534763582
+       .long   3215266280
+       .long   1007386161
+       .long   1068473053
+       .long   1007386161
+       .long   1068473053
+       .long   1007386161
+       .long   1068473053
+       .long   1007386161
+       .long   1068473053
+       .long   1007386161
+       .long   1068473053
+       .long   1007386161
+       .long   1068473053
+       .long   1007386161
+       .long   1068473053
+       .long   1007386161
+       .long   1068473053
+       .long   477218625
+       .long   3216798151
+       .long   477218625
+       .long   3216798151
+       .long   477218625
+       .long   3216798151
+       .long   477218625
+       .long   3216798151
+       .long   477218625
+       .long   3216798151
+       .long   477218625
+       .long   3216798151
+       .long   477218625
+       .long   3216798151
+       .long   477218625
+       .long   3216798151
+       .long   1431655767
+       .long   1070945621
+       .long   1431655767
+       .long   1070945621
+       .long   1431655767
+       .long   1070945621
+       .long   1431655767
+       .long   1070945621
+       .long   1431655767
+       .long   1070945621
+       .long   1431655767
+       .long   1070945621
+       .long   1431655767
+       .long   1070945621
+       .long   1431655767
+       .long   1070945621
+       .type   __svml_dcbrt_data_internal_avx512,@object
+       .size   __svml_dcbrt_data_internal_avx512,1408
+       .align 32
+__dcbrt_la__vmldCbrtTab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072668672
+       .long   0
+       .long   1072644096
+       .long   0
+       .long   1072627712
+       .long   0
+       .long   1072611328
+       .long   0
+       .long   1072586752
+       .long   0
+       .long   1072570368
+       .long   0
+       .long   1072553984
+       .long   0
+       .long   1072537600
+       .long   0
+       .long   1072521216
+       .long   0
+       .long   1072504832
+       .long   0
+       .long   1072488448
+       .long   0
+       .long   1072480256
+       .long   0
+       .long   1072463872
+       .long   0
+       .long   1072447488
+       .long   0
+       .long   1072439296
+       .long   0
+       .long   1072422912
+       .long   0
+       .long   1072414720
+       .long   0
+       .long   1072398336
+       .long   0
+       .long   1072390144
+       .long   0
+       .long   1072373760
+       .long   0
+       .long   1072365568
+       .long   0
+       .long   1072357376
+       .long   0
+       .long   1072340992
+       .long   0
+       .long   1072332800
+       .long   0
+       .long   1072324608
+       .long   0
+       .long   1072308224
+       .long   0
+       .long   1072300032
+       .long   0
+       .long   1072291840
+       .long   0
+       .long   1072283648
+       .long   0
+       .long   1072275456
+       .long   0
+       .long   1072267264
+       .long   1431655765
+       .long   1071994197
+       .long   1431655765
+       .long   1015371093
+       .long   1908874354
+       .long   1071761180
+       .long   1007461464
+       .long   1071618781
+       .long   565592401
+       .long   1071446176
+       .long   241555088
+       .long   1071319599
+       .long   943963244
+       .long   1071221150
+       .long   2330668378
+       .long   1071141453
+       .long   2770428108
+       .long   1071075039
+       .long   3622256836
+       .long   1071018464
+       .long   1497196870
+       .long   1070969433
+       .long   280472551
+       .long   1070926345
+       .long   1585032765
+       .long   1070888044
+       .long   0
+       .long   1387266048
+       .long   33554432
+       .long   1101004800
+       .long   512
+       .long   1117782016
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   4160749568
+       .long   1072965794
+       .long   2921479643
+       .long   1043912488
+       .long   2684354560
+       .long   1073309182
+       .long   4060791142
+       .long   1045755320
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   3220176896
+       .type   __dcbrt_la__vmldCbrtTab,@object
+       .size   __dcbrt_la__vmldCbrtTab,456
+       .space 8, 0x00  
+       .align 16
+.L_2il0floatpacket.81:
+       .long   0x00000000,0x80000000,0x00000000,0x00000000
+       .type   .L_2il0floatpacket.81,@object
+       .size   .L_2il0floatpacket.81,16
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_cbrt_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_cbrt_s_la.s
new file mode 100644 (file)
index 0000000..ba09907
--- /dev/null
@@ -0,0 +1,1014 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *     x=2^{3*k+j} * 1.b1 b2 ... b5 b6 ... b52
+ *     Let r=(x*2^{-3k-j} - 1.b1 b2 ... b5 1)* rcp[b1 b2 ..b5],
+ *     where rcp[b1 b2 .. b5]=1/(1.b1 b2 b3 b4 b5 1) in single precision
+ *     cbrtf(2^j * 1. b1 b2 .. b5 1) is approximated as T[j][b1..b5]+D[j][b1..b5]
+ *     (T stores the high 24 bits, D stores the low order bits)
+ *     Result=2^k*T+(2^k*T*r)*P+2^k*D
+ *      where P=p1+p2*r+..
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_cbrtf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_cbrtf16
+
+__svml_cbrtf16:
+
+
+       .cfi_startproc
+..L2:
+
+        vgetmantps $0, {sae}, %zmm0, %zmm8
+
+/* GetExp(x) */
+        vgetexpps {sae}, %zmm0, %zmm1
+        vmovups   384+__svml_scbrt_data_internal_avx512(%rip), %zmm2
+
+/* exponent/3 */
+        vmovups   512+__svml_scbrt_data_internal_avx512(%rip), %zmm3
+        vmovups   576+__svml_scbrt_data_internal_avx512(%rip), %zmm4
+        vmovups   704+__svml_scbrt_data_internal_avx512(%rip), %zmm15
+
+/* exponent%3 (to be used as index) */
+        vmovups   640+__svml_scbrt_data_internal_avx512(%rip), %zmm5
+
+/* polynomial */
+        vmovups   768+__svml_scbrt_data_internal_avx512(%rip), %zmm11
+        vmovups   896+__svml_scbrt_data_internal_avx512(%rip), %zmm14
+
+/* Table lookup */
+        vmovups   128+__svml_scbrt_data_internal_avx512(%rip), %zmm12
+
+/* DblRcp ~ 1/Mantissa */
+        vrcp14ps  %zmm8, %zmm7
+        vaddps    {rn-sae}, %zmm2, %zmm1, %zmm6
+        vandps    448+__svml_scbrt_data_internal_avx512(%rip), %zmm0, %zmm0
+
+/* round DblRcp to 3 fractional bits (RN mode, no Precision exception) */
+        vrndscaleps $88, {sae}, %zmm7, %zmm9
+        vfmsub231ps {rn-sae}, %zmm6, %zmm3, %zmm4
+        vmovups   832+__svml_scbrt_data_internal_avx512(%rip), %zmm7
+
+/* Reduced argument: R = DblRcp*Mantissa - 1 */
+        vfmsub231ps {rn-sae}, %zmm9, %zmm8, %zmm15
+        vrndscaleps $9, {sae}, %zmm4, %zmm13
+
+/* Prepare table index */
+        vpsrld    $19, %zmm9, %zmm10
+        vfmadd231ps {rn-sae}, %zmm15, %zmm11, %zmm7
+        vfnmadd231ps {rn-sae}, %zmm13, %zmm5, %zmm6
+        vpermt2ps 192+__svml_scbrt_data_internal_avx512(%rip), %zmm10, %zmm12
+        vfmadd213ps {rn-sae}, %zmm14, %zmm15, %zmm7
+        vscalefps {rn-sae}, %zmm13, %zmm12, %zmm2
+
+/* Table lookup: 2^(exponent%3) */
+        vpermps   __svml_scbrt_data_internal_avx512(%rip), %zmm6, %zmm1
+        vpermps   64+__svml_scbrt_data_internal_avx512(%rip), %zmm6, %zmm6
+
+/* Sh*R */
+        vmulps    {rn-sae}, %zmm15, %zmm1, %zmm14
+
+/* Sl + (Sh*R)*Poly */
+        vfmadd213ps {rn-sae}, %zmm6, %zmm7, %zmm14
+
+/*
+ * branch-free
+ * scaled_Th*(Sh+Sl+Sh*R*Poly)
+ */
+        vaddps    {rn-sae}, %zmm1, %zmm14, %zmm15
+        vmulps    {rn-sae}, %zmm2, %zmm15, %zmm3
+        vorps     %zmm0, %zmm3, %zmm0
+
+/* no invcbrt in libm, so taking it out here */
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_cbrtf16,@function
+       .size   __svml_cbrtf16,.-__svml_cbrtf16
+..LN__svml_cbrtf16.0:
+
+.L_2__routine_start___svml_scbrt_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_scbrt_cout_rare_internal:
+
+
+       .cfi_startproc
+..L5:
+
+        movq      %rsi, %r9
+        movl      $1065353216, -24(%rsp)
+        movss     (%rdi), %xmm0
+        movss     -24(%rsp), %xmm1
+        mulss     %xmm0, %xmm1
+        movss     %xmm1, -4(%rsp)
+        movzwl    -2(%rsp), %eax
+        andl      $32640, %eax
+        shrl      $7, %eax
+        cmpl      $255, %eax
+        je        .LBL_2_9
+
+
+        pxor      %xmm0, %xmm0
+        ucomiss   %xmm0, %xmm1
+        jp        .LBL_2_3
+        je        .LBL_2_8
+
+.LBL_2_3:
+
+        testl     %eax, %eax
+        jne       .LBL_2_5
+
+
+        movl      $2122317824, -24(%rsp)
+        movl      $713031680, -20(%rsp)
+        jmp       .LBL_2_6
+
+.LBL_2_5:
+
+        movl      $1065353216, %eax
+        movl      %eax, -24(%rsp)
+        movl      %eax, -20(%rsp)
+
+.LBL_2_6:
+
+        movss     -24(%rsp), %xmm0
+        lea       __scbrt_la_vscbrt_ha_cout_data(%rip), %rsi
+        mulss     %xmm0, %xmm1
+        movd      %xmm1, %ecx
+        movss     %xmm1, -4(%rsp)
+        movl      %ecx, %r10d
+        movl      %ecx, %edi
+        andl      $8388607, %r10d
+        movl      %ecx, %r11d
+        shrl      $23, %edi
+        andl      $8257536, %r11d
+        orl       $-1082130432, %r10d
+        orl       $-1081999360, %r11d
+        movl      %r10d, -16(%rsp)
+        movl      %ecx, %edx
+        movzbl    %dil, %r8d
+        andl      $2147483647, %ecx
+        movl      %r11d, -12(%rsp)
+        andl      $-256, %edi
+        movss     -16(%rsp), %xmm1
+        addl      $2139095040, %ecx
+        shrl      $16, %edx
+        subss     -12(%rsp), %xmm1
+        andl      $124, %edx
+        lea       (%r8,%r8,4), %r10d
+        mulss     (%rsi,%rdx), %xmm1
+        lea       (%r10,%r10), %r11d
+        movss     .L_2il0floatpacket.35(%rip), %xmm4
+        lea       (%r11,%r11), %eax
+        addl      %eax, %eax
+        lea       (%r10,%r11,8), %r10d
+        addl      %eax, %eax
+        decl      %r8d
+        mulss     %xmm1, %xmm4
+        shll      $7, %r8d
+        lea       (%r10,%rax,8), %r11d
+        lea       (%r11,%rax,8), %r10d
+        shrl      $12, %r10d
+        addss     .L_2il0floatpacket.34(%rip), %xmm4
+        mulss     %xmm1, %xmm4
+        lea       85(%r10), %eax
+        orl       %edi, %eax
+        xorl      %edi, %edi
+        cmpl      $-16777217, %ecx
+        addss     .L_2il0floatpacket.33(%rip), %xmm4
+        setg      %dil
+        shll      $7, %r10d
+        negl      %edi
+        subl      %r10d, %r8d
+        addl      %r10d, %r10d
+        subl      %r10d, %r8d
+        notl      %edi
+        addl      %r8d, %edx
+        andl      %edx, %edi
+        shll      $23, %eax
+        addl      %edi, %edi
+        movl      %eax, -8(%rsp)
+        movss     128(%rdi,%rsi), %xmm5
+        movss     -8(%rsp), %xmm2
+        mulss     %xmm1, %xmm4
+        mulss     %xmm2, %xmm5
+        addss     .L_2il0floatpacket.32(%rip), %xmm4
+        mulss     %xmm5, %xmm1
+        movss     132(%rsi,%rdi), %xmm3
+        mulss     %xmm1, %xmm4
+        mulss     %xmm2, %xmm3
+        addss     %xmm3, %xmm4
+        addss     %xmm4, %xmm5
+        mulss     -20(%rsp), %xmm5
+        movss     %xmm5, (%r9)
+
+.LBL_2_7:
+
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_8:
+
+        movss     %xmm1, (%r9)
+        jmp       .LBL_2_7
+
+.LBL_2_9:
+
+        addss     %xmm0, %xmm0
+        movss     %xmm0, (%r9)
+        jmp       .LBL_2_7
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_scbrt_cout_rare_internal,@function
+       .size   __svml_scbrt_cout_rare_internal,.-__svml_scbrt_cout_rare_internal
+..LN__svml_scbrt_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_scbrt_data_internal_avx512:
+       .long   1065353216
+       .long   1067533592
+       .long   1070280693
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2999865775
+       .long   849849800
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1067533592
+       .long   1067322155
+       .long   1067126683
+       .long   1066945178
+       .long   1066775983
+       .long   1066617708
+       .long   1066469175
+       .long   1066329382
+       .long   1066197466
+       .long   1066072682
+       .long   1065954382
+       .long   1065841998
+       .long   1065735031
+       .long   1065633040
+       .long   1065535634
+       .long   1065442463
+       .long   1065353216
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2999865775
+       .long   849353281
+       .long   2992093760
+       .long   858369405
+       .long   861891413
+       .long   3001900484
+       .long   2988845984
+       .long   3009185201
+       .long   3001209163
+       .long   847824101
+       .long   839380496
+       .long   845124191
+       .long   851391835
+       .long   856440803
+       .long   2989578734
+       .long   852890174
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1249902592
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1077936128
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   1031603580
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   3185812323
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .long   1051372202
+       .type   __svml_scbrt_data_internal_avx512,@object
+       .size   __svml_scbrt_data_internal_avx512,960
+       .align 64
+__scbrt_la_vscbrt_ha_cout_data:
+       .long   3212578753
+       .long   3212085645
+       .long   3211621124
+       .long   3211182772
+       .long   3210768440
+       .long   3210376206
+       .long   3210004347
+       .long   3209651317
+       .long   3209315720
+       .long   3208996296
+       .long   3208691905
+       .long   3208401508
+       .long   3208124163
+       .long   3207859009
+       .long   3207605259
+       .long   3207362194
+       .long   3207129151
+       .long   3206905525
+       .long   3206690755
+       .long   3206484326
+       .long   3206285761
+       .long   3206094618
+       .long   3205910490
+       .long   3205732998
+       .long   3205561788
+       .long   3205396533
+       .long   3205236929
+       .long   3205082689
+       .long   3204933547
+       .long   3204789256
+       .long   3204649583
+       .long   3204514308
+       .long   1065396681
+       .long   839340838
+       .long   1065482291
+       .long   867750258
+       .long   1065566215
+       .long   851786446
+       .long   1065648532
+       .long   853949398
+       .long   1065729317
+       .long   864938789
+       .long   1065808640
+       .long   864102364
+       .long   1065886565
+       .long   864209792
+       .long   1065963152
+       .long   865422805
+       .long   1066038457
+       .long   867593594
+       .long   1066112533
+       .long   854482593
+       .long   1066185428
+       .long   848298042
+       .long   1066257188
+       .long   860064854
+       .long   1066327857
+       .long   844792593
+       .long   1066397474
+       .long   870701309
+       .long   1066466079
+       .long   872023170
+       .long   1066533708
+       .long   860255342
+       .long   1066600394
+       .long   849966899
+       .long   1066666169
+       .long   863561479
+       .long   1066731064
+       .long   869115319
+       .long   1066795108
+       .long   871961375
+       .long   1066858329
+       .long   859537336
+       .long   1066920751
+       .long   871954398
+       .long   1066982401
+       .long   863817578
+       .long   1067043301
+       .long   861687921
+       .long   1067103474
+       .long   849594757
+       .long   1067162941
+       .long   816486846
+       .long   1067221722
+       .long   858183533
+       .long   1067279837
+       .long   864500406
+       .long   1067337305
+       .long   850523240
+       .long   1067394143
+       .long   808125243
+       .long   1067450368
+       .long   0
+       .long   1067505996
+       .long   861173761
+       .long   1067588354
+       .long   859000219
+       .long   1067696217
+       .long   823158129
+       .long   1067801953
+       .long   871826232
+       .long   1067905666
+       .long   871183196
+       .long   1068007450
+       .long   839030530
+       .long   1068107390
+       .long   867690638
+       .long   1068205570
+       .long   840440923
+       .long   1068302063
+       .long   868033274
+       .long   1068396942
+       .long   855856030
+       .long   1068490271
+       .long   865094453
+       .long   1068582113
+       .long   860418487
+       .long   1068672525
+       .long   866225006
+       .long   1068761562
+       .long   866458226
+       .long   1068849275
+       .long   865124659
+       .long   1068935712
+       .long   864837702
+       .long   1069020919
+       .long   811742505
+       .long   1069104937
+       .long   869432099
+       .long   1069187809
+       .long   864584201
+       .long   1069269572
+       .long   864183978
+       .long   1069350263
+       .long   844810573
+       .long   1069429915
+       .long   869245699
+       .long   1069508563
+       .long   859556409
+       .long   1069586236
+       .long   870675446
+       .long   1069662966
+       .long   814190139
+       .long   1069738778
+       .long   870686941
+       .long   1069813702
+       .long   861800510
+       .long   1069887762
+       .long   855649163
+       .long   1069960982
+       .long   869347119
+       .long   1070033387
+       .long   864252033
+       .long   1070104998
+       .long   867276215
+       .long   1070175837
+       .long   868189817
+       .long   1070245925
+       .long   849541095
+       .long   1070349689
+       .long   866633177
+       .long   1070485588
+       .long   843967686
+       .long   1070618808
+       .long   857522493
+       .long   1070749478
+       .long   862339487
+       .long   1070877717
+       .long   850054662
+       .long   1071003634
+       .long   864048556
+       .long   1071127332
+       .long   868027089
+       .long   1071248907
+       .long   848093931
+       .long   1071368446
+       .long   865355299
+       .long   1071486034
+       .long   848111485
+       .long   1071601747
+       .long   865557362
+       .long   1071715659
+       .long   870297525
+       .long   1071827839
+       .long   863416216
+       .long   1071938350
+       .long   869675693
+       .long   1072047254
+       .long   865888071
+       .long   1072154608
+       .long   825332584
+       .long   1072260465
+       .long   843309506
+       .long   1072364876
+       .long   870885636
+       .long   1072467891
+       .long   869119784
+       .long   1072569555
+       .long   865466648
+       .long   1072669911
+       .long   867459244
+       .long   1072769001
+       .long   861192764
+       .long   1072866863
+       .long   871247716
+       .long   1072963536
+       .long   864927982
+       .long   1073059054
+       .long   869195129
+       .long   1073153452
+       .long   864849564
+       .long   1073246762
+       .long   840005936
+       .long   1073339014
+       .long   852579258
+       .long   1073430238
+       .long   860852782
+       .long   1073520462
+       .long   869711141
+       .long   1073609714
+       .long   862506141
+       .long   1073698019
+       .long   837959274
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   3173551943
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   1031591658
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   3185806905
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   1051372203
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   8257536
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   3212967936
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   85
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   1
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   2155872256
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .long   4278190079
+       .type   __scbrt_la_vscbrt_ha_cout_data,@object
+       .size   __scbrt_la_vscbrt_ha_cout_data,1920
+       .align 4
+.L_2il0floatpacket.28:
+       .long   0x007fffff
+       .type   .L_2il0floatpacket.28,@object
+       .size   .L_2il0floatpacket.28,4
+       .align 4
+.L_2il0floatpacket.29:
+       .long   0x007e0000
+       .type   .L_2il0floatpacket.29,@object
+       .size   .L_2il0floatpacket.29,4
+       .align 4
+.L_2il0floatpacket.30:
+       .long   0xbf800000
+       .type   .L_2il0floatpacket.30,@object
+       .size   .L_2il0floatpacket.30,4
+       .align 4
+.L_2il0floatpacket.31:
+       .long   0xbf820000
+       .type   .L_2il0floatpacket.31,@object
+       .size   .L_2il0floatpacket.31,4
+       .align 4
+.L_2il0floatpacket.32:
+       .long   0x3eaaaaab
+       .type   .L_2il0floatpacket.32,@object
+       .size   .L_2il0floatpacket.32,4
+       .align 4
+.L_2il0floatpacket.33:
+       .long   0xbde38e39
+       .type   .L_2il0floatpacket.33,@object
+       .size   .L_2il0floatpacket.33,4
+       .align 4
+.L_2il0floatpacket.34:
+       .long   0x3d7cd6ea
+       .type   .L_2il0floatpacket.34,@object
+       .size   .L_2il0floatpacket.34,4
+       .align 4
+.L_2il0floatpacket.35:
+       .long   0xbd288f47
+       .type   .L_2il0floatpacket.35,@object
+       .size   .L_2il0floatpacket.35,4
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_cos_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_cos_d_la.s
new file mode 100644 (file)
index 0000000..d5db3a2
--- /dev/null
@@ -0,0 +1,17676 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *     ( low accuracy ( < 4ulp ) or enhanced performance ( half of correct mantissa ) implementation )
+ * 
+ *     Argument representation:
+ *     arg + Pi/2 = (N*Pi + R)
+ * 
+ *     Result calculation:
+ *     cos(arg) = sin(arg+Pi/2) = sin(N*Pi + R) = (-1)^N * sin(R)
+ *     sin(R) is approximated by corresponding polynomial
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_cos8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_cos8
+
+__svml_cos8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        xorl      %edx, %edx
+        vmovups   1472+__svml_dcos_data_internal(%rip), %zmm2
+        vmovups   1536+__svml_dcos_data_internal(%rip), %zmm5
+
+/* dN + .5 */
+        vmovups   1600+__svml_dcos_data_internal(%rip), %zmm3
+
+/* mask will be used to decide whether long arg. reduction is needed */
+        vmovups   640+__svml_dcos_data_internal(%rip), %zmm8
+        vmovups   704+__svml_dcos_data_internal(%rip), %zmm6
+
+/* ............... Polynomial approximation ................... */
+        vmovups   1280+__svml_dcos_data_internal(%rip), %zmm9
+        vmovups   1152+__svml_dcos_data_internal(%rip), %zmm10
+        vmovups   1088+__svml_dcos_data_internal(%rip), %zmm12
+        vmovups   768+__svml_dcos_data_internal(%rip), %zmm7
+        vmovups   1024+__svml_dcos_data_internal(%rip), %zmm13
+
+/* large arg. condition mask */
+        vmovups   1664+__svml_dcos_data_internal(%rip), %zmm4
+        vmovaps   %zmm0, %zmm11
+        vandpd    1408+__svml_dcos_data_internal(%rip), %zmm11, %zmm1
+        vmovups   1728+__svml_dcos_data_internal(%rip), %zmm0
+        vfmadd231pd {rz-sae}, %zmm1, %zmm2, %zmm5
+        vcmppd    $17, {sae}, %zmm0, %zmm1, %k2
+        vcmppd    $22, {sae}, %zmm4, %zmm5, %k1
+        vpsllq    $63, %zmm5, %zmm15
+        vsubpd    {rn-sae}, %zmm3, %zmm5, %zmm14
+        vmovups   1216+__svml_dcos_data_internal(%rip), %zmm3
+        vfmsub213pd {rn-sae}, %zmm1, %zmm14, %zmm8
+
+/* will branch if long arg. reduction needed */
+        kortestw  %k1, %k1
+        vfmadd231pd {rn-sae}, %zmm14, %zmm6, %zmm8
+        vmulpd    {rn-sae}, %zmm8, %zmm8, %zmm2
+        vfmadd213pd {rn-sae}, %zmm8, %zmm7, %zmm14
+        vfmadd231pd {rn-sae}, %zmm2, %zmm9, %zmm3
+        vmovups   960+__svml_dcos_data_internal(%rip), %zmm9
+        vfmadd213pd {rn-sae}, %zmm10, %zmm2, %zmm3
+        vmovups   832+__svml_dcos_data_internal(%rip), %zmm10
+        vfmadd213pd {rn-sae}, %zmm12, %zmm2, %zmm3
+        vfmadd213pd {rn-sae}, %zmm13, %zmm2, %zmm3
+        vxorpd    %zmm15, %zmm14, %zmm13
+        vfmadd213pd {rn-sae}, %zmm9, %zmm2, %zmm3
+        vmulpd    {rn-sae}, %zmm2, %zmm13, %zmm12
+        vfmadd213pd {rn-sae}, %zmm10, %zmm2, %zmm3
+        vfmadd213pd {rn-sae}, %zmm13, %zmm12, %zmm3
+
+/* result = minabs(result, 1.0) with sign of result preserved */
+        vblendmpd 1344+__svml_dcos_data_internal(%rip), %zmm3, %zmm0{%k2}
+        jne       .LBL_1_12
+
+.LBL_1_2:
+
+        testl     %edx, %edx
+        jne       .LBL_1_4
+
+.LBL_1_3:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_4:
+
+        vmovups   %zmm11, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_3
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_8:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_11
+
+.LBL_1_9:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_8
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_3
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_11:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dcos_cout_rare_internal
+        jmp       .LBL_1_9
+       .cfi_restore 4
+       .cfi_restore 5
+       .cfi_restore 12
+       .cfi_restore 13
+       .cfi_restore 122
+       .cfi_restore 123
+       .cfi_restore 124
+       .cfi_restore 125
+
+.LBL_1_12:
+
+
+/* ............Check for Inf and NaNs................. */
+        vmovups   16512+__svml_dcos_data_internal_ha(%rip), %zmm7
+
+/*
+ * Get the (2^a / 2pi) mod 1 values from the table.
+ * Because VLANG doesn't have L-type gather, we need a trivial cast
+ */
+        lea       __svml_dcos_reduction_data_internal(%rip), %rax
+        vpbroadcastq .L_2il0floatpacket.28(%rip), %zmm9
+        vmovups   %zmm0, (%rsp)
+        vandpd    %zmm11, %zmm7, %zmm8
+        vcmppd    $4, {sae}, %zmm7, %zmm8, %k2
+
+/*
+ * The output is _VRES_Z (high) + _VRES_E (low), and the integer part is _VRES_IND
+ * Now resume the original code.
+ * ..................... Table look-up ........................
+ */
+        lea       __svml_dcos_data_internal_ha(%rip), %rcx
+        vmovaps   %zmm9, %zmm6
+        vpandq    .L_2il0floatpacket.29(%rip){1to8}, %zmm11, %zmm3
+        vpsrlq    $52, %zmm3, %zmm12
+        vpsllq    $1, %zmm12, %zmm1
+        vpaddq    %zmm12, %zmm1, %zmm10
+        vpsllq    $3, %zmm10, %zmm4
+        vpmovqd   %zmm4, %ymm0
+        vpandnq   %zmm8, %zmm8, %zmm6{%k2}
+        vcmppd    $3, {sae}, %zmm6, %zmm6, %k0
+
+/*
+ * Break the P_xxx and m into 32-bit chunks ready for
+ * the long multiplication via 32x32->64 multiplications
+ */
+        vpbroadcastq .L_2il0floatpacket.32(%rip), %zmm6
+        kxnorw    %k0, %k0, %k3
+        kxnorw    %k0, %k0, %k2
+        kmovw     %k0, %edx
+        vpxord    %zmm7, %zmm7, %zmm7
+        vgatherdpd (%rax,%ymm0), %zmm7{%k3}
+        kxnorw    %k0, %k0, %k3
+        vpxord    %zmm8, %zmm8, %zmm8
+        vpxord    %zmm2, %zmm2, %zmm2
+        vgatherdpd 8(%rax,%ymm0), %zmm8{%k2}
+        vgatherdpd 16(%rax,%ymm0), %zmm2{%k3}
+        vpsrlq    $32, %zmm7, %zmm0
+        vpsrlq    $32, %zmm8, %zmm15
+        vpsrlq    $32, %zmm2, %zmm13
+
+/*
+ * Also get the significand as an integer
+ * NB: adding in the integer bit is wrong for denorms!
+ * To make this work for denorms we should do something slightly different
+ */
+        vpandq    .L_2il0floatpacket.30(%rip){1to8}, %zmm11, %zmm5
+        vpaddq    .L_2il0floatpacket.31(%rip){1to8}, %zmm5, %zmm3
+        vpsrlq    $32, %zmm3, %zmm10
+        vpmullq   %zmm13, %zmm10, %zmm1
+        vpandq    %zmm6, %zmm7, %zmm5
+        vpandq    %zmm6, %zmm8, %zmm12
+        vpandq    %zmm6, %zmm2, %zmm7
+        vpandq    %zmm6, %zmm3, %zmm14
+
+/* Now do the big multiplication and carry propagation */
+        vpmullq   %zmm5, %zmm10, %zmm4
+        vpmullq   %zmm15, %zmm10, %zmm3
+        vpmullq   %zmm12, %zmm10, %zmm2
+        vpmullq   %zmm7, %zmm10, %zmm8
+        vpmullq   %zmm15, %zmm14, %zmm10
+        vpmullq   %zmm13, %zmm14, %zmm15
+        vpmullq   %zmm0, %zmm14, %zmm7
+        vpmullq   %zmm12, %zmm14, %zmm0
+        vpmullq   %zmm5, %zmm14, %zmm5
+        vpsrlq    $32, %zmm15, %zmm13
+        vpsrlq    $32, %zmm0, %zmm14
+        vpsrlq    $32, %zmm5, %zmm12
+        vpsrlq    $32, %zmm10, %zmm15
+        vpaddq    %zmm13, %zmm1, %zmm1
+        vpaddq    %zmm14, %zmm2, %zmm13
+        vpaddq    %zmm12, %zmm4, %zmm4
+        vpaddq    %zmm15, %zmm3, %zmm2
+        vpandq    %zmm6, %zmm0, %zmm14
+        vpandq    %zmm6, %zmm10, %zmm12
+        vpandq    %zmm6, %zmm5, %zmm10
+        vpaddq    %zmm1, %zmm14, %zmm5
+        vpaddq    %zmm2, %zmm10, %zmm2
+        vpsrlq    $32, %zmm8, %zmm1
+        vpaddq    %zmm5, %zmm1, %zmm8
+        vpsrlq    $32, %zmm8, %zmm10
+        vpandq    %zmm6, %zmm7, %zmm0
+        vpaddq    %zmm13, %zmm12, %zmm7
+        vpaddq    %zmm4, %zmm0, %zmm3
+        vpaddq    %zmm7, %zmm10, %zmm14
+
+/*
+ * Now round at the 2^-9 bit position for reduction mod pi/2^8
+ * instead of the original 2pi (but still with the same 2pi scaling).
+ * Use a shifter of 2^43 + 2^42.
+ * The N we get is our final version; it has an offset of
+ * 2^9 because of the implicit integer bit, and anyway for negative
+ * starting value it's a 2s complement thing. But we need to mask
+ * off the exponent part anyway so it's fine.
+ */
+        vpbroadcastq .L_2il0floatpacket.35(%rip), %zmm7
+        vpsrlq    $32, %zmm14, %zmm4
+        vpaddq    %zmm2, %zmm4, %zmm15
+        vpsllq    $32, %zmm14, %zmm4
+        vpsrlq    $32, %zmm15, %zmm0
+        vpaddq    %zmm3, %zmm0, %zmm13
+
+/* Assemble reduced argument from the pieces */
+        vpandq    %zmm6, %zmm8, %zmm1
+        vpandq    %zmm6, %zmm15, %zmm10
+        vpsllq    $32, %zmm13, %zmm6
+        vpaddq    %zmm1, %zmm4, %zmm13
+        vpaddq    %zmm10, %zmm6, %zmm10
+        vpsrlq    $12, %zmm10, %zmm0
+        vpandq    .L_2il0floatpacket.38(%rip){1to8}, %zmm13, %zmm3
+        vpsllq    $28, %zmm3, %zmm12
+        vpsrlq    $24, %zmm13, %zmm13
+
+/*
+ * We want to incorporate the original sign now too.
+ * Do it here for convenience in getting the right N value,
+ * though we could wait right to the end if we were prepared
+ * to modify the sign of N later too.
+ * So get the appropriate sign mask now (or sooner).
+ */
+        vpandq    .L_2il0floatpacket.33(%rip){1to8}, %zmm11, %zmm14
+
+/*
+ * Create floating-point high part, implicitly adding integer bit 1
+ * Incorporate overall sign at this stage too.
+ */
+        vpxorq    .L_2il0floatpacket.34(%rip){1to8}, %zmm14, %zmm5
+        vporq     %zmm5, %zmm0, %zmm8
+        vaddpd    {rn-sae}, %zmm8, %zmm7, %zmm2
+        vsubpd    {rn-sae}, %zmm7, %zmm2, %zmm6
+        vsubpd    {rn-sae}, %zmm6, %zmm8, %zmm15
+
+/*
+ * If the magnitude of the input is <= 2^-20, then
+ * just pass through the input, since no reduction will be needed and
+ * the main path will only work accurately if the reduced argument is
+ * about >= 2^-70 (which it is for all large pi multiples)
+ */
+        vpbroadcastq .L_2il0floatpacket.44(%rip), %zmm8
+        vandpd    .L_2il0floatpacket.43(%rip){1to8}, %zmm11, %zmm6
+        vcmppd    $26, {sae}, %zmm8, %zmm6, %k2
+        vcmppd    $22, {sae}, %zmm8, %zmm6, %k3
+
+/*
+ * Create floating-point low and medium parts, respectively
+ * lo_23, ... lo_0, 0, ..., 0
+ * hi_11, ... hi_0, lo_63, ..., lo_24
+ * then subtract off the implicitly added integer bits,
+ * 2^-104 and 2^-52, respectively.
+ * Put the original sign into all of them at this stage.
+ */
+        vpxorq    .L_2il0floatpacket.37(%rip){1to8}, %zmm14, %zmm0
+        vporq     %zmm0, %zmm12, %zmm4
+        vsubpd    {rn-sae}, %zmm0, %zmm4, %zmm3
+        vpxorq    .L_2il0floatpacket.39(%rip){1to8}, %zmm14, %zmm0
+        vpandq    .L_2il0floatpacket.40(%rip){1to8}, %zmm10, %zmm14
+        vpsllq    $40, %zmm14, %zmm10
+        vmovups   17152+__svml_dcos_data_internal_ha(%rip), %zmm14
+        vporq     %zmm13, %zmm10, %zmm10
+        vporq     %zmm0, %zmm10, %zmm4
+        vsubpd    {rn-sae}, %zmm0, %zmm4, %zmm5
+        vpbroadcastq .L_2il0floatpacket.42(%rip), %zmm4
+
+/* Now add them up into 2 reasonably aligned pieces */
+        vaddpd    {rn-sae}, %zmm5, %zmm15, %zmm7
+        vsubpd    {rn-sae}, %zmm7, %zmm15, %zmm15
+        vaddpd    {rn-sae}, %zmm15, %zmm5, %zmm10
+
+/*
+ * Now multiply those numbers all by 2 pi, reasonably accurately.
+ * (RHi + RLo) * (pi_lead + pi_trail) ~=
+ * RHi * pi_lead + (RHi * pi_trail + RLo * pi_lead)
+ */
+        vpbroadcastq .L_2il0floatpacket.41(%rip), %zmm5
+        vaddpd    {rn-sae}, %zmm3, %zmm10, %zmm12
+        vmulpd    {rn-sae}, %zmm5, %zmm7, %zmm1
+        vmovaps   %zmm5, %zmm0
+        vfmsub213pd {rn-sae}, %zmm1, %zmm7, %zmm0
+        vfmadd213pd {rn-sae}, %zmm0, %zmm4, %zmm7
+        vfmadd213pd {rn-sae}, %zmm7, %zmm5, %zmm12
+        vmovaps   %zmm9, %zmm3
+
+/* Grab our final N value as an integer, appropriately masked mod 2^9 */
+        vpandq    .L_2il0floatpacket.36(%rip){1to8}, %zmm2, %zmm2
+        vpsllq    $5, %zmm2, %zmm5
+        vpmovqd   %zmm5, %ymm5
+        vpandnq   %zmm6, %zmm6, %zmm3{%k2}
+        kxnorw    %k0, %k0, %k2
+        vandpd    %zmm1, %zmm3, %zmm4
+        vandpd    %zmm12, %zmm3, %zmm0
+        vmovups   16960+__svml_dcos_data_internal_ha(%rip), %zmm3
+        vpandnq   %zmm6, %zmm6, %zmm9{%k3}
+        vandpd    %zmm11, %zmm9, %zmm10
+        kxnorw    %k0, %k0, %k3
+        vorpd     %zmm4, %zmm10, %zmm4
+
+/* ................. Reconstruction: res_hi ................... */
+        vmovaps   %zmm4, %zmm2
+        vmovaps   %zmm4, %zmm10
+        vpxord    %zmm9, %zmm9, %zmm9
+        vgatherdpd (%rcx,%ymm5), %zmm9{%k2}
+
+/* VGATHER_TABLE( L2D, dSLo, TAB_HA._dT, lIndex, 0, T_ITEM_SIZE, T_ITEM_GRAN, 3 ); */
+        kxnorw    %k0, %k0, %k2
+        vpxord    %zmm7, %zmm7, %zmm7
+        vpxord    %zmm6, %zmm6, %zmm6
+        vgatherdpd 16(%rcx,%ymm5), %zmm7{%k3}
+        vgatherdpd 8(%rcx,%ymm5), %zmm6{%k2}
+        kxnorw    %k0, %k0, %k3
+        vfmadd213pd {rn-sae}, %zmm7, %zmm6, %zmm2
+        vfmadd132pd {rn-sae}, %zmm9, %zmm2, %zmm10
+
+/* ................. Reconstruction: res_lo ................... */
+        vsubpd    {rn-sae}, %zmm2, %zmm7, %zmm1
+        vsubpd    {rn-sae}, %zmm10, %zmm2, %zmm8
+        vfmadd231pd {rn-sae}, %zmm4, %zmm6, %zmm1
+        vmovups   17024+__svml_dcos_data_internal_ha(%rip), %zmm2
+        vfmadd231pd {rn-sae}, %zmm9, %zmm4, %zmm8
+        vaddpd    {rn-sae}, %zmm1, %zmm8, %zmm13
+        vaddpd    {rn-sae}, %zmm6, %zmm9, %zmm1
+
+/* ............... Polynomial approximation ................... */
+        vmulpd    {rn-sae}, %zmm4, %zmm4, %zmm8
+        vmovups   17216+__svml_dcos_data_internal_ha(%rip), %zmm6
+        vmovups   17088+__svml_dcos_data_internal_ha(%rip), %zmm9
+        vfmadd231pd {rn-sae}, %zmm8, %zmm2, %zmm3
+        vfmadd231pd {rn-sae}, %zmm8, %zmm6, %zmm14
+        vmulpd    {rn-sae}, %zmm8, %zmm3, %zmm12
+        vfmadd213pd {rn-sae}, %zmm9, %zmm8, %zmm14
+        vmulpd    {rn-sae}, %zmm4, %zmm12, %zmm15
+        vmulpd    {rn-sae}, %zmm8, %zmm14, %zmm2
+
+/* ................. Reconstruction: res_lo+corr ................... */
+        vfnmadd213pd {rn-sae}, %zmm1, %zmm7, %zmm4
+        vfmadd213pd {rn-sae}, %zmm13, %zmm1, %zmm15
+        vfmadd213pd {rn-sae}, %zmm15, %zmm7, %zmm2
+        vpxord    %zmm7, %zmm7, %zmm7
+        vgatherdpd 24(%rcx,%ymm5), %zmm7{%k3}
+        vfmadd213pd {rn-sae}, %zmm7, %zmm4, %zmm0
+        vaddpd    {rn-sae}, %zmm0, %zmm2, %zmm1
+
+/* .................. Final reconstruction ................... */
+        vmovups   (%rsp), %zmm0
+        vaddpd    {rn-sae}, %zmm1, %zmm10, %zmm0{%k1}
+        jmp       .LBL_1_2
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_cos8,@function
+       .size   __svml_cos8,.-__svml_cos8
+..LN__svml_cos8.0:
+
+.L_2__routine_start___svml_dcos_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dcos_cout_rare_internal:
+
+
+       .cfi_startproc
+..L63:
+
+        movzwl    6(%rdi), %eax
+        andl      $32752, %eax
+        movsd     (%rdi), %xmm1
+        movb      7(%rdi), %dl
+        andb      $127, %dl
+        movsd     %xmm1, -8(%rsp)
+        cmpl      $32752, %eax
+        jne       .LBL_2_6
+
+
+        cmpl      $0, -8(%rsp)
+        jne       .LBL_2_5
+
+
+        movb      %dl, -1(%rsp)
+        cmpl      $2146435072, -4(%rsp)
+        jne       .LBL_2_5
+
+
+        movsd     __dcos_la_CoutTab(%rip), %xmm0
+        movl      $1, %eax
+        mulsd     %xmm0, %xmm1
+        movsd     %xmm1, (%rsi)
+        ret
+
+.LBL_2_5:
+
+        mulsd     %xmm1, %xmm1
+        xorl      %eax, %eax
+        movsd     %xmm1, (%rsi)
+        ret
+
+.LBL_2_6:
+
+        xorl      %eax, %eax
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dcos_cout_rare_internal,@function
+       .size   __svml_dcos_cout_rare_internal,.-__svml_dcos_cout_rare_internal
+..LN__svml_dcos_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dcos_data_internal:
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   0
+       .long   1096810496
+       .long   0
+       .long   1096810496
+       .long   0
+       .long   1096810496
+       .long   0
+       .long   1096810496
+       .long   0
+       .long   1096810496
+       .long   0
+       .long   1096810496
+       .long   0
+       .long   1096810496
+       .long   0
+       .long   1096810496
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   1431655591
+       .long   3217380693
+       .long   1431655591
+       .long   3217380693
+       .long   1431655591
+       .long   3217380693
+       .long   1431655591
+       .long   3217380693
+       .long   1431655591
+       .long   3217380693
+       .long   1431655591
+       .long   3217380693
+       .long   1431655591
+       .long   3217380693
+       .long   1431655591
+       .long   3217380693
+       .long   286303399
+       .long   1065423121
+       .long   286303399
+       .long   1065423121
+       .long   286303399
+       .long   1065423121
+       .long   286303399
+       .long   1065423121
+       .long   286303399
+       .long   1065423121
+       .long   286303399
+       .long   1065423121
+       .long   286303399
+       .long   1065423121
+       .long   286303399
+       .long   1065423121
+       .long   286303400
+       .long   1065423121
+       .long   286303400
+       .long   1065423121
+       .long   286303400
+       .long   1065423121
+       .long   286303400
+       .long   1065423121
+       .long   286303400
+       .long   1065423121
+       .long   286303400
+       .long   1065423121
+       .long   286303400
+       .long   1065423121
+       .long   286303400
+       .long   1065423121
+       .long   430291067
+       .long   3207201184
+       .long   430291067
+       .long   3207201184
+       .long   430291067
+       .long   3207201184
+       .long   430291067
+       .long   3207201184
+       .long   430291067
+       .long   3207201184
+       .long   430291067
+       .long   3207201184
+       .long   430291067
+       .long   3207201184
+       .long   430291067
+       .long   3207201184
+       .long   2150694560
+       .long   1053236707
+       .long   2150694560
+       .long   1053236707
+       .long   2150694560
+       .long   1053236707
+       .long   2150694560
+       .long   1053236707
+       .long   2150694560
+       .long   1053236707
+       .long   2150694560
+       .long   1053236707
+       .long   2150694560
+       .long   1053236707
+       .long   2150694560
+       .long   1053236707
+       .long   1174413873
+       .long   3193628213
+       .long   1174413873
+       .long   3193628213
+       .long   1174413873
+       .long   3193628213
+       .long   1174413873
+       .long   3193628213
+       .long   1174413873
+       .long   3193628213
+       .long   1174413873
+       .long   3193628213
+       .long   1174413873
+       .long   3193628213
+       .long   1174413873
+       .long   3193628213
+       .long   1470296608
+       .long   1038487144
+       .long   1470296608
+       .long   1038487144
+       .long   1470296608
+       .long   1038487144
+       .long   1470296608
+       .long   1038487144
+       .long   1470296608
+       .long   1038487144
+       .long   1470296608
+       .long   1038487144
+       .long   1470296608
+       .long   1038487144
+       .long   1470296608
+       .long   1038487144
+       .long   135375560
+       .long   3177836758
+       .long   135375560
+       .long   3177836758
+       .long   135375560
+       .long   3177836758
+       .long   135375560
+       .long   3177836758
+       .long   135375560
+       .long   3177836758
+       .long   135375560
+       .long   3177836758
+       .long   135375560
+       .long   3177836758
+       .long   135375560
+       .long   3177836758
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   0
+       .long   1127219200
+       .long   0
+       .long   1127219200
+       .long   0
+       .long   1127219200
+       .long   0
+       .long   1127219200
+       .long   0
+       .long   1127219200
+       .long   0
+       .long   1127219200
+       .long   0
+       .long   1127219200
+       .long   0
+       .long   1127219200
+       .long   4294967295
+       .long   1127219199
+       .long   4294967295
+       .long   1127219199
+       .long   4294967295
+       .long   1127219199
+       .long   4294967295
+       .long   1127219199
+       .long   4294967295
+       .long   1127219199
+       .long   4294967295
+       .long   1127219199
+       .long   4294967295
+       .long   1127219199
+       .long   4294967295
+       .long   1127219199
+       .long   8388606
+       .long   1127219200
+       .long   8388606
+       .long   1127219200
+       .long   8388606
+       .long   1127219200
+       .long   8388606
+       .long   1127219200
+       .long   8388606
+       .long   1127219200
+       .long   8388606
+       .long   1127219200
+       .long   8388606
+       .long   1127219200
+       .long   8388606
+       .long   1127219200
+       .long   0
+       .long   1044381696
+       .long   0
+       .long   1044381696
+       .long   0
+       .long   1044381696
+       .long   0
+       .long   1044381696
+       .long   0
+       .long   1044381696
+       .long   0
+       .long   1044381696
+       .long   0
+       .long   1044381696
+       .long   0
+       .long   1044381696
+       .type   __svml_dcos_data_internal,@object
+       .size   __svml_dcos_data_internal,1792
+       .align 64
+__svml_dcos_data_internal_ha:
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   210035182
+       .long   1064007864
+       .long   0
+       .long   3213885440
+       .long   379294427
+       .long   1072693090
+       .long   3221225472
+       .long   1015405987
+       .long   561145352
+       .long   1065056936
+       .long   0
+       .long   3214934016
+       .long   1619315981
+       .long   1072692616
+       .long   1073741824
+       .long   3162584397
+       .long   2896342633
+       .long   3212231467
+       .long   0
+       .long   3214934016
+       .long   4026464093
+       .long   1072691826
+       .long   3221225472
+       .long   3163075789
+       .long   1003003824
+       .long   1066107496
+       .long   0
+       .long   3215982592
+       .long   3816385918
+       .long   1072690721
+       .long   536870912
+       .long   3161216956
+       .long   3237733378
+       .long   1062425136
+       .long   0
+       .long   3215982592
+       .long   1703834029
+       .long   1072689301
+       .long   3758096384
+       .long   1015028364
+       .long   2523975598
+       .long   3213273348
+       .long   0
+       .long   3215982592
+       .long   2902558778
+       .long   1072687565
+       .long   3221225472
+       .long   1013260780
+       .long   711626851
+       .long   3214400320
+       .long   0
+       .long   3215982592
+       .long   4240268041
+       .long   1072685514
+       .long   536870912
+       .long   1013588963
+       .long   257503056
+       .long   1067164005
+       .long   0
+       .long   3217031168
+       .long   2748392742
+       .long   1072683149
+       .long   536870912
+       .long   3163061750
+       .long   3272206680
+       .long   1066288081
+       .long   0
+       .long   3217031168
+       .long   4251821691
+       .long   1072680469
+       .long   2147483648
+       .long   3161841007
+       .long   718380601
+       .long   1063597621
+       .long   0
+       .long   3217031168
+       .long   1893834707
+       .long   1072677476
+       .long   1610612736
+       .long   1015147654
+       .long   3987691371
+       .long   3213074188
+       .long   0
+       .long   3217031168
+       .long   1905645377
+       .long   1072674169
+       .long   1610612736
+       .long   1014087596
+       .long   1953696209
+       .long   3214295171
+       .long   0
+       .long   3217031168
+       .long   2131272983
+       .long   1072670549
+       .long   3221225472
+       .long   3163005096
+       .long   3299146087
+       .long   3215021530
+       .long   0
+       .long   3217031168
+       .long   617154971
+       .long   1072666617
+       .long   3758096384
+       .long   3163433696
+       .long   304938777
+       .long   3215427665
+       .long   0
+       .long   3217031168
+       .long   4201728937
+       .long   1072662372
+       .long   1610612736
+       .long   1014674006
+       .long   2034433221
+       .long   3215832935
+       .long   0
+       .long   3217031168
+       .long   2745245815
+       .long   1072657817
+       .long   3221225472
+       .long   1015566129
+       .long   240740309
+       .long   1068244255
+       .long   0
+       .long   3218079744
+       .long   3489094832
+       .long   1072652951
+       .long   536870912
+       .long   1014325783
+       .long   1765797566
+       .long   1067840895
+       .long   0
+       .long   3218079744
+       .long   990588717
+       .long   1072647776
+       .long   3758096384
+       .long   3162041857
+       .long   2886567144
+       .long   1067426796
+       .long   0
+       .long   3218079744
+       .long   2892293513
+       .long   1072642291
+       .long   2684354560
+       .long   3162340271
+       .long   3587565429
+       .long   1066624384
+       .long   0
+       .long   3218079744
+       .long   4151720666
+       .long   1072636498
+       .long   0
+       .long   3162639544
+       .long   2614369450
+       .long   1065140432
+       .long   0
+       .long   3218079744
+       .long   4220661975
+       .long   1072630398
+       .long   3221225472
+       .long   1014312058
+       .long   2382326656
+       .long   3212045827
+       .long   0
+       .long   3218079744
+       .long   2749658050
+       .long   1072623992
+       .long   1610612736
+       .long   1015427338
+       .long   723478390
+       .long   3213958438
+       .long   0
+       .long   3218079744
+       .long   3882371427
+       .long   1072617280
+       .long   2147483648
+       .long   1014923975
+       .long   4107121629
+       .long   3214750787
+       .long   0
+       .long   3218079744
+       .long   3370060660
+       .long   1072610264
+       .long   1610612736
+       .long   1014787212
+       .long   1991047213
+       .long   3215237169
+       .long   0
+       .long   3218079744
+       .long   1455828442
+       .long   1072602945
+       .long   3758096384
+       .long   1015505073
+       .long   386665102
+       .long   3215630470
+       .long   0
+       .long   3218079744
+       .long   2873938189
+       .long   1072595323
+       .long   1610612736
+       .long   3162311422
+       .long   1348311045
+       .long   3216002418
+       .long   0
+       .long   3218079744
+       .long   3964199186
+       .long   1072587400
+       .long   3758096384
+       .long   3160501078
+       .long   165911977
+       .long   3216197513
+       .long   0
+       .long   3218079744
+       .long   1261158782
+       .long   1072579178
+       .long   2147483648
+       .long   1015711544
+       .long   3601629044
+       .long   3216391785
+       .long   0
+       .long   3218079744
+       .long   83265253
+       .long   1072570657
+       .long   1610612736
+       .long   3162510535
+       .long   1962712856
+       .long   3216585207
+       .long   0
+       .long   3218079744
+       .long   1647164971
+       .long   1072561838
+       .long   2147483648
+       .long   3162838250
+       .long   3286832763
+       .long   3216777748
+       .long   0
+       .long   3218079744
+       .long   3066872380
+       .long   1072552723
+       .long   3221225472
+       .long   1015561271
+       .long   3296146332
+       .long   3216969380
+       .long   0
+       .long   3218079744
+       .long   1647878299
+       .long   1072543314
+       .long   3758096384
+       .long   3162169063
+       .long   1699043957
+       .long   1069418613
+       .long   0
+       .long   3219128320
+       .long   3476196678
+       .long   1072533611
+       .long   0
+       .long   1014257638
+       .long   1896722595
+       .long   1069228886
+       .long   0
+       .long   3219128320
+       .long   1942611595
+       .long   1072523617
+       .long   3221225472
+       .long   3162410081
+       .long   4049357271
+       .long   1069040154
+       .long   0
+       .long   3219128320
+       .long   3511535930
+       .long   1072513332
+       .long   2147483648
+       .long   3162828626
+       .long   1380647130
+       .long   1068852447
+       .long   0
+       .long   3219128320
+       .long   1950234076
+       .long   1072502759
+       .long   536870912
+       .long   3159425498
+       .long   3631910143
+       .long   1068665791
+       .long   0
+       .long   3219128320
+       .long   4097623923
+       .long   1072491898
+       .long   2684354560
+       .long   3160308587
+       .long   1073154251
+       .long   1068461489
+       .long   0
+       .long   3219128320
+       .long   4093443164
+       .long   1072480752
+       .long   536870912
+       .long   1014912865
+       .long   913431823
+       .long   1068092555
+       .long   0
+       .long   3219128320
+       .long   557060597
+       .long   1072469323
+       .long   0
+       .long   3159554934
+       .long   600368053
+       .long   1067725893
+       .long   0
+       .long   3219128320
+       .long   881357723
+       .long   1072457611
+       .long   3221225472
+       .long   1013810890
+       .long   2140183630
+       .long   1067272748
+       .long   0
+       .long   3219128320
+       .long   4051746225
+       .long   1072445618
+       .long   1610612736
+       .long   3161907377
+       .long   3506991783
+       .long   1066548842
+       .long   0
+       .long   3219128320
+       .long   645027145
+       .long   1072433348
+       .long   3221225472
+       .long   1012602239
+       .long   31019393
+       .long   1065162441
+       .long   0
+       .long   3219128320
+       .long   2892993834
+       .long   1072420800
+       .long   536870912
+       .long   3163039143
+       .long   1279178457
+       .long   3211590791
+       .long   0
+       .long   3219128320
+       .long   1731563730
+       .long   1072407978
+       .long   536870912
+       .long   1015540302
+       .long   1220541286
+       .long   3213681126
+       .long   0
+       .long   3219128320
+       .long   1159294526
+       .long   1072394883
+       .long   536870912
+       .long   3163276959
+       .long   2880516564
+       .long   3214487049
+       .long   0
+       .long   3219128320
+       .long   1056266002
+       .long   1072381517
+       .long   2684354560
+       .long   3163469496
+       .long   1102361128
+       .long   3215059765
+       .long   0
+       .long   3219128320
+       .long   1477771776
+       .long   1072367882
+       .long   536870912
+       .long   3163104986
+       .long   1038988426
+       .long   3215406294
+       .long   0
+       .long   3219128320
+       .long   2653017361
+       .long   1072353980
+       .long   0
+       .long   3162800062
+       .long   2598800519
+       .long   3215750067
+       .long   0
+       .long   3219128320
+       .long   688824739
+       .long   1072339814
+       .long   3758096384
+       .long   1010431536
+       .long   3382663878
+       .long   3216036812
+       .long   0
+       .long   3219128320
+       .long   453180130
+       .long   1072325385
+       .long   1073741824
+       .long   3162411281
+       .long   1726519029
+       .long   3216205866
+       .long   0
+       .long   3219128320
+       .long   2688952194
+       .long   1072310695
+       .long   0
+       .long   3161532603
+       .long   802660176
+       .long   3216373465
+       .long   0
+       .long   3219128320
+       .long   4012486548
+       .long   1072295747
+       .long   2684354560
+       .long   1014701564
+       .long   3876290983
+       .long   3216539583
+       .long   0
+       .long   3219128320
+       .long   1207142209
+       .long   1072280544
+       .long   2147483648
+       .long   3162705634
+       .long   2285031318
+       .long   3216704197
+       .long   0
+       .long   3219128320
+       .long   4106737474
+       .long   1072265086
+       .long   2684354560
+       .long   3162592377
+       .long   1224902090
+       .long   3216867281
+       .long   0
+       .long   3219128320
+       .long   1234330619
+       .long   1072249378
+       .long   2684354560
+       .long   1015272473
+       .long   2586490530
+       .long   3217028810
+       .long   0
+       .long   3219128320
+       .long   2750387213
+       .long   1072233420
+       .long   2147483648
+       .long   3160858537
+       .long   2485417816
+       .long   3217109964
+       .long   0
+       .long   3219128320
+       .long   1796544321
+       .long   1072217216
+       .long   536870912
+       .long   3162686945
+       .long   1852581091
+       .long   3217189138
+       .long   0
+       .long   3219128320
+       .long   263859903
+       .long   1072200768
+       .long   0
+       .long   3162692284
+       .long   4019165092
+       .long   3217267498
+       .long   0
+       .long   3219128320
+       .long   201299822
+       .long   1072184078
+       .long   3758096384
+       .long   3161912352
+       .long   1250776663
+       .long   3217345034
+       .long   0
+       .long   3219128320
+       .long   3814135665
+       .long   1072167148
+       .long   3221225472
+       .long   3163146456
+       .long   3526603391
+       .long   3217421732
+       .long   0
+       .long   3219128320
+       .long   577417135
+       .long   1072149983
+       .long   2684354560
+       .long   3161519415
+       .long   4187227697
+       .long   3217497582
+       .long   0
+       .long   3219128320
+       .long   1594061409
+       .long   1072132583
+       .long   2147483648
+       .long   1014353870
+       .long   1416934267
+       .long   3217572573
+       .long   0
+       .long   3219128320
+       .long   938475414
+       .long   1072114952
+       .long   0
+       .long   1015076079
+       .long   2546065654
+       .long   3217646692
+       .long   0
+       .long   3219128320
+       .long   1424664751
+       .long   1072097092
+       .long   3221225472
+       .long   3163405315
+       .long   2583490354
+       .long   3217719929
+       .long   0
+       .long   3219128320
+       .long   1719614413
+       .long   1072079006
+       .long   0
+       .long   3163282740
+       .long   1403691706
+       .long   3217792273
+       .long   0
+       .long   3219128320
+       .long   636516413
+       .long   1072060697
+       .long   3758096384
+       .long   1015823716
+       .long   3753901657
+       .long   3217863712
+       .long   0
+       .long   3219128320
+       .long   1427975391
+       .long   1072042167
+       .long   1073741824
+       .long   3161608627
+       .long   2081278341
+       .long   3217934237
+       .long   0
+       .long   3219128320
+       .long   3194290572
+       .long   1072023419
+       .long   2147483648
+       .long   1015048682
+       .long   2309668539
+       .long   3218003836
+       .long   0
+       .long   3219128320
+       .long   881650848
+       .long   1072004457
+       .long   2147483648
+       .long   3162986272
+       .long   2371640770
+       .long   3218072499
+       .long   0
+       .long   3219128320
+       .long   2460177814
+       .long   1071985282
+       .long   2147483648
+       .long   3162116843
+       .long   3489768009
+       .long   1070535623
+       .long   0
+       .long   3220176896
+       .long   3152274921
+       .long   1071965898
+       .long   3758096384
+       .long   1013170835
+       .long   3239527685
+       .long   1070468863
+       .long   0
+       .long   3220176896
+       .long   2610628921
+       .long   1071946308
+       .long   1610612736
+       .long   3162668769
+       .long   1403757309
+       .long   1070403070
+       .long   0
+       .long   3220176896
+       .long   621354454
+       .long   1071926515
+       .long   536870912
+       .long   1013450602
+       .long   1883353036
+       .long   1070338253
+       .long   0
+       .long   3220176896
+       .long   1397053140
+       .long   1071906521
+       .long   1610612736
+       .long   1015245078
+       .long   3652612115
+       .long   1070274422
+       .long   0
+       .long   3220176896
+       .long   689983673
+       .long   1071886330
+       .long   3758096384
+       .long   1014906405
+       .long   752919289
+       .long   1070211588
+       .long   0
+       .long   3220176896
+       .long   2969983475
+       .long   1071865944
+       .long   2684354560
+       .long   3162635443
+       .long   3761365757
+       .long   1070149758
+       .long   0
+       .long   3220176896
+       .long   4242632757
+       .long   1071845367
+       .long   536870912
+       .long   3161390278
+       .long   1129922991
+       .long   1070088944
+       .long   0
+       .long   3220176896
+       .long   637203434
+       .long   1071824603
+       .long   3221225472
+       .long   3159443841
+       .long   2129093113
+       .long   1070029153
+       .long   0
+       .long   3220176896
+       .long   1289556703
+       .long   1071803653
+       .long   536870912
+       .long   3162888820
+       .long   2482246777
+       .long   1069970395
+       .long   0
+       .long   3220176896
+       .long   2570316633
+       .long   1071782521
+       .long   1610612736
+       .long   3162744753
+       .long   1539668340
+       .long   1069912679
+       .long   0
+       .long   3220176896
+       .long   967731400
+       .long   1071761211
+       .long   536870912
+       .long   1015752157
+       .long   2272832445
+       .long   1069856013
+       .long   0
+       .long   3220176896
+       .long   1675549513
+       .long   1071739725
+       .long   3221225472
+       .long   3163025138
+       .long   2678847490
+       .long   1069800406
+       .long   0
+       .long   3220176896
+       .long   1411074851
+       .long   1071718067
+       .long   1610612736
+       .long   3163484731
+       .long   69903290
+       .long   1069745867
+       .long   0
+       .long   3220176896
+       .long   1297975695
+       .long   1071696240
+       .long   3221225472
+       .long   3163083735
+       .long   3952756490
+       .long   1069692402
+       .long   0
+       .long   3220176896
+       .long   2569207790
+       .long   1071674247
+       .long   1073741824
+       .long   3163183617
+       .long   1663679671
+       .long   1069640022
+       .long   0
+       .long   3220176896
+       .long   2269920951
+       .long   1071652092
+       .long   3758096384
+       .long   3161672245
+       .long   1312926554
+       .long   1069588733
+       .long   0
+       .long   3220176896
+       .long   3690502842
+       .long   1071614884
+       .long   3221225472
+       .long   3157453855
+       .long   3429717432
+       .long   1069529566
+       .long   0
+       .long   3220176896
+       .long   1391425750
+       .long   1071569945
+       .long   3221225472
+       .long   3162362103
+       .long   1945768569
+       .long   1069431400
+       .long   0
+       .long   3220176896
+       .long   939980347
+       .long   1071524701
+       .long   0
+       .long   1012796809
+       .long   1539072807
+       .long   1069335462
+       .long   0
+       .long   3220176896
+       .long   1535566729
+       .long   1071479159
+       .long   2147483648
+       .long   1014321388
+       .long   4133449816
+       .long   1069241766
+       .long   0
+       .long   3220176896
+       .long   2570175582
+       .long   1071433326
+       .long   1073741824
+       .long   1012303118
+       .long   1612193054
+       .long   1069150328
+       .long   0
+       .long   3220176896
+       .long   3623952103
+       .long   1071387209
+       .long   2684354560
+       .long   3161985962
+       .long   1578746984
+       .long   1069061160
+       .long   0
+       .long   3220176896
+       .long   165764288
+       .long   1071340816
+       .long   3221225472
+       .long   1013298018
+       .long   1577996576
+       .long   1068974276
+       .long   0
+       .long   3220176896
+       .long   728580042
+       .long   1071294152
+       .long   1610612736
+       .long   3162332944
+       .long   1972483635
+       .long   1068889689
+       .long   0
+       .long   3220176896
+       .long   1135144330
+       .long   1071247225
+       .long   536870912
+       .long   1013373569
+       .long   1638976426
+       .long   1068807412
+       .long   0
+       .long   3220176896
+       .long   1673302999
+       .long   1071200042
+       .long   2147483648
+       .long   1013351473
+       .long   2255197647
+       .long   1068727457
+       .long   0
+       .long   3220176896
+       .long   2796464483
+       .long   1071152610
+       .long   3221225472
+       .long   3160878317
+       .long   3996842794
+       .long   1068649836
+       .long   0
+       .long   3220176896
+       .long   824036583
+       .long   1071104937
+       .long   0
+       .long   1008313330
+       .long   1234824733
+       .long   1068574562
+       .long   0
+       .long   3220176896
+       .long   821708191
+       .long   1071057029
+       .long   3758096384
+       .long   3161738009
+       .long   4002549419
+       .long   1068501644
+       .long   0
+       .long   3220176896
+       .long   3711903686
+       .long   1071008893
+       .long   1073741824
+       .long   1011944747
+       .long   2962723252
+       .long   1068363247
+       .long   0
+       .long   3220176896
+       .long   1974149085
+       .long   1070960538
+       .long   3221225472
+       .long   3156147648
+       .long   1296295961
+       .long   1068226907
+       .long   0
+       .long   3220176896
+       .long   1115219818
+       .long   1070911970
+       .long   0
+       .long   1013072242
+       .long   997322465
+       .long   1068095345
+       .long   0
+       .long   3220176896
+       .long   2484561409
+       .long   1070863196
+       .long   1073741824
+       .long   1014024572
+       .long   1261629236
+       .long   1067968581
+       .long   0
+       .long   3220176896
+       .long   3269558610
+       .long   1070814224
+       .long   536870912
+       .long   3161705216
+       .long   2476548698
+       .long   1067846634
+       .long   0
+       .long   3220176896
+       .long   785751814
+       .long   1070765062
+       .long   2684354560
+       .long   3161838221
+       .long   1913604284
+       .long   1067729523
+       .long   0
+       .long   3220176896
+       .long   1062001470
+       .long   1070715716
+       .long   0
+       .long   3160875220
+       .long   2306566604
+       .long   1067617265
+       .long   0
+       .long   3220176896
+       .long   1655830135
+       .long   1070666194
+       .long   0
+       .long   1014506690
+       .long   3250111450
+       .long   1067509877
+       .long   0
+       .long   3220176896
+       .long   238550446
+       .long   1070616504
+       .long   2684354560
+       .long   3154383565
+       .long   2377770267
+       .long   1067364384
+       .long   0
+       .long   3220176896
+       .long   2065784603
+       .long   1070537209
+       .long   3758096384
+       .long   3160681966
+       .long   288924873
+       .long   1067169185
+       .long   0
+       .long   3220176896
+       .long   3846521617
+       .long   1070437199
+       .long   536870912
+       .long   1013406610
+       .long   1935888103
+       .long   1066983818
+       .long   0
+       .long   3220176896
+       .long   1786662755
+       .long   1070336898
+       .long   2147483648
+       .long   3155882307
+       .long   2660899430
+       .long   1066808312
+       .long   0
+       .long   3220176896
+       .long   632292433
+       .long   1070236320
+       .long   3758096384
+       .long   3160963333
+       .long   18115067
+       .long   1066642694
+       .long   0
+       .long   3220176896
+       .long   1013556747
+       .long   1070135480
+       .long   2684354560
+       .long   3160567065
+       .long   2346447124
+       .long   1066486987
+       .long   0
+       .long   3220176896
+       .long   3729833777
+       .long   1070034393
+       .long   3758096384
+       .long   1013044718
+       .long   1672287667
+       .long   1066280641
+       .long   0
+       .long   3220176896
+       .long   1149976518
+       .long   1069933076
+       .long   1610612736
+       .long   1013264895
+       .long   3451754846
+       .long   1066009014
+       .long   0
+       .long   3220176896
+       .long   2972270170
+       .long   1069831542
+       .long   1073741824
+       .long   3159524770
+       .long   1037482584
+       .long   1065757344
+       .long   0
+       .long   3220176896
+       .long   1854824762
+       .long   1069729808
+       .long   2684354560
+       .long   1011953664
+       .long   2592747447
+       .long   1065525667
+       .long   0
+       .long   3220176896
+       .long   3470456183
+       .long   1069627888
+       .long   1073741824
+       .long   3160744771
+       .long   2402293340
+       .long   1065274823
+       .long   0
+       .long   3220176896
+       .long   1453945614
+       .long   1069504078
+       .long   1610612736
+       .long   1011492612
+       .long   1227670166
+       .long   1064891649
+       .long   0
+       .long   3220176896
+       .long   3349070549
+       .long   1069299589
+       .long   3758096384
+       .long   3156538269
+       .long   393047345
+       .long   1064548654
+       .long   0
+       .long   3220176896
+       .long   3156849708
+       .long   1069094822
+       .long   3221225472
+       .long   3158189848
+       .long   1118107366
+       .long   1064187139
+       .long   0
+       .long   3220176896
+       .long   177906713
+       .long   1068889808
+       .long   3221225472
+       .long   3159310370
+       .long   4269262315
+       .long   1063662162
+       .long   0
+       .long   3220176896
+       .long   2462980598
+       .long   1068684576
+       .long   2684354560
+       .long   3158941832
+       .long   3810305407
+       .long   1063179572
+       .long   0
+       .long   3220176896
+       .long   2046304480
+       .long   1068459374
+       .long   3758096384
+       .long   3156402667
+       .long   220529721
+       .long   1062452281
+       .long   0
+       .long   3220176896
+       .long   4044216340
+       .long   1068048229
+       .long   0
+       .long   3156808381
+       .long   69373323
+       .long   1061565504
+       .long   0
+       .long   3220176896
+       .long   1972655565
+       .long   1067636837
+       .long   1073741824
+       .long   1009157878
+       .long   3650591271
+       .long   1060355323
+       .long   0
+       .long   3220176896
+       .long   4154680958
+       .long   1067000149
+       .long   0
+       .long   3153796451
+       .long   2376373521
+       .long   1058258220
+       .long   0
+       .long   3220176896
+       .long   4242458500
+       .long   1065951697
+       .long   2684354560
+       .long   1009354638
+       .long   0
+       .long   0
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2376373521
+       .long   1058258220
+       .long   0
+       .long   3220176896
+       .long   4242458500
+       .long   3213435345
+       .long   2684354560
+       .long   3156838286
+       .long   3650591271
+       .long   1060355323
+       .long   0
+       .long   3220176896
+       .long   4154680958
+       .long   3214483797
+       .long   0
+       .long   1006312803
+       .long   69373323
+       .long   1061565504
+       .long   0
+       .long   3220176896
+       .long   1972655565
+       .long   3215120485
+       .long   1073741824
+       .long   3156641526
+       .long   220529721
+       .long   1062452281
+       .long   0
+       .long   3220176896
+       .long   4044216340
+       .long   3215531877
+       .long   0
+       .long   1009324733
+       .long   3810305407
+       .long   1063179572
+       .long   0
+       .long   3220176896
+       .long   2046304480
+       .long   3215943022
+       .long   3758096384
+       .long   1008919019
+       .long   4269262315
+       .long   1063662162
+       .long   0
+       .long   3220176896
+       .long   2462980598
+       .long   3216168224
+       .long   2684354560
+       .long   1011458184
+       .long   1118107366
+       .long   1064187139
+       .long   0
+       .long   3220176896
+       .long   177906713
+       .long   3216373456
+       .long   3221225472
+       .long   1011826722
+       .long   393047345
+       .long   1064548654
+       .long   0
+       .long   3220176896
+       .long   3156849708
+       .long   3216578470
+       .long   3221225472
+       .long   1010706200
+       .long   1227670166
+       .long   1064891649
+       .long   0
+       .long   3220176896
+       .long   3349070549
+       .long   3216783237
+       .long   3758096384
+       .long   1009054621
+       .long   2402293340
+       .long   1065274823
+       .long   0
+       .long   3220176896
+       .long   1453945614
+       .long   3216987726
+       .long   1610612736
+       .long   3158976260
+       .long   2592747447
+       .long   1065525667
+       .long   0
+       .long   3220176896
+       .long   3470456183
+       .long   3217111536
+       .long   1073741824
+       .long   1013261123
+       .long   1037482584
+       .long   1065757344
+       .long   0
+       .long   3220176896
+       .long   1854824762
+       .long   3217213456
+       .long   2684354560
+       .long   3159437312
+       .long   3451754846
+       .long   1066009014
+       .long   0
+       .long   3220176896
+       .long   2972270170
+       .long   3217315190
+       .long   1073741824
+       .long   1012041122
+       .long   1672287667
+       .long   1066280641
+       .long   0
+       .long   3220176896
+       .long   1149976518
+       .long   3217416724
+       .long   1610612736
+       .long   3160748543
+       .long   2346447124
+       .long   1066486987
+       .long   0
+       .long   3220176896
+       .long   3729833777
+       .long   3217518041
+       .long   3758096384
+       .long   3160528366
+       .long   18115067
+       .long   1066642694
+       .long   0
+       .long   3220176896
+       .long   1013556747
+       .long   3217619128
+       .long   2684354560
+       .long   1013083417
+       .long   2660899430
+       .long   1066808312
+       .long   0
+       .long   3220176896
+       .long   632292433
+       .long   3217719968
+       .long   3758096384
+       .long   1013479685
+       .long   1935888103
+       .long   1066983818
+       .long   0
+       .long   3220176896
+       .long   1786662755
+       .long   3217820546
+       .long   2147483648
+       .long   1008398659
+       .long   288924873
+       .long   1067169185
+       .long   0
+       .long   3220176896
+       .long   3846521617
+       .long   3217920847
+       .long   536870912
+       .long   3160890258
+       .long   2377770267
+       .long   1067364384
+       .long   0
+       .long   3220176896
+       .long   2065784603
+       .long   3218020857
+       .long   3758096384
+       .long   1013198318
+       .long   3250111450
+       .long   1067509877
+       .long   0
+       .long   3220176896
+       .long   238550446
+       .long   3218100152
+       .long   2684354560
+       .long   1006899917
+       .long   2306566604
+       .long   1067617265
+       .long   0
+       .long   3220176896
+       .long   1655830135
+       .long   3218149842
+       .long   0
+       .long   3161990338
+       .long   1913604284
+       .long   1067729523
+       .long   0
+       .long   3220176896
+       .long   1062001470
+       .long   3218199364
+       .long   0
+       .long   1013391572
+       .long   2476548698
+       .long   1067846634
+       .long   0
+       .long   3220176896
+       .long   785751814
+       .long   3218248710
+       .long   2684354560
+       .long   1014354573
+       .long   1261629236
+       .long   1067968581
+       .long   0
+       .long   3220176896
+       .long   3269558610
+       .long   3218297872
+       .long   536870912
+       .long   1014221568
+       .long   997322465
+       .long   1068095345
+       .long   0
+       .long   3220176896
+       .long   2484561409
+       .long   3218346844
+       .long   1073741824
+       .long   3161508220
+       .long   1296295961
+       .long   1068226907
+       .long   0
+       .long   3220176896
+       .long   1115219818
+       .long   3218395618
+       .long   0
+       .long   3160555890
+       .long   2962723252
+       .long   1068363247
+       .long   0
+       .long   3220176896
+       .long   1974149085
+       .long   3218444186
+       .long   3221225472
+       .long   1008664000
+       .long   4002549419
+       .long   1068501644
+       .long   0
+       .long   3220176896
+       .long   3711903686
+       .long   3218492541
+       .long   1073741824
+       .long   3159428395
+       .long   1234824733
+       .long   1068574562
+       .long   0
+       .long   3220176896
+       .long   821708191
+       .long   3218540677
+       .long   3758096384
+       .long   1014254361
+       .long   3996842794
+       .long   1068649836
+       .long   0
+       .long   3220176896
+       .long   824036583
+       .long   3218588585
+       .long   0
+       .long   3155796978
+       .long   2255197647
+       .long   1068727457
+       .long   0
+       .long   3220176896
+       .long   2796464483
+       .long   3218636258
+       .long   3221225472
+       .long   1013394669
+       .long   1638976426
+       .long   1068807412
+       .long   0
+       .long   3220176896
+       .long   1673302999
+       .long   3218683690
+       .long   2147483648
+       .long   3160835121
+       .long   1972483635
+       .long   1068889689
+       .long   0
+       .long   3220176896
+       .long   1135144330
+       .long   3218730873
+       .long   536870912
+       .long   3160857217
+       .long   1577996576
+       .long   1068974276
+       .long   0
+       .long   3220176896
+       .long   728580042
+       .long   3218777800
+       .long   1610612736
+       .long   1014849296
+       .long   1578746984
+       .long   1069061160
+       .long   0
+       .long   3220176896
+       .long   165764288
+       .long   3218824464
+       .long   3221225472
+       .long   3160781666
+       .long   1612193054
+       .long   1069150328
+       .long   0
+       .long   3220176896
+       .long   3623952103
+       .long   3218870857
+       .long   2684354560
+       .long   1014502314
+       .long   4133449816
+       .long   1069241766
+       .long   0
+       .long   3220176896
+       .long   2570175582
+       .long   3218916974
+       .long   1073741824
+       .long   3159786766
+       .long   1539072807
+       .long   1069335462
+       .long   0
+       .long   3220176896
+       .long   1535566729
+       .long   3218962807
+       .long   2147483648
+       .long   3161805036
+       .long   1945768569
+       .long   1069431400
+       .long   0
+       .long   3220176896
+       .long   939980347
+       .long   3219008349
+       .long   0
+       .long   3160280457
+       .long   3429717432
+       .long   1069529566
+       .long   0
+       .long   3220176896
+       .long   1391425750
+       .long   3219053593
+       .long   3221225472
+       .long   1014878455
+       .long   1312926554
+       .long   1069588733
+       .long   0
+       .long   3220176896
+       .long   3690502842
+       .long   3219098532
+       .long   3221225472
+       .long   1009970207
+       .long   1663679671
+       .long   1069640022
+       .long   0
+       .long   3220176896
+       .long   2269920951
+       .long   3219135740
+       .long   3758096384
+       .long   1014188597
+       .long   3952756490
+       .long   1069692402
+       .long   0
+       .long   3220176896
+       .long   2569207790
+       .long   3219157895
+       .long   1073741824
+       .long   1015699969
+       .long   69903290
+       .long   1069745867
+       .long   0
+       .long   3220176896
+       .long   1297975695
+       .long   3219179888
+       .long   3221225472
+       .long   1015600087
+       .long   2678847490
+       .long   1069800406
+       .long   0
+       .long   3220176896
+       .long   1411074851
+       .long   3219201715
+       .long   1610612736
+       .long   1016001083
+       .long   2272832445
+       .long   1069856013
+       .long   0
+       .long   3220176896
+       .long   1675549513
+       .long   3219223373
+       .long   3221225472
+       .long   1015541490
+       .long   1539668340
+       .long   1069912679
+       .long   0
+       .long   3220176896
+       .long   967731400
+       .long   3219244859
+       .long   536870912
+       .long   3163235805
+       .long   2482246777
+       .long   1069970395
+       .long   0
+       .long   3220176896
+       .long   2570316633
+       .long   3219266169
+       .long   1610612736
+       .long   1015261105
+       .long   2129093113
+       .long   1070029153
+       .long   0
+       .long   3220176896
+       .long   1289556703
+       .long   3219287301
+       .long   536870912
+       .long   1015405172
+       .long   1129922991
+       .long   1070088944
+       .long   0
+       .long   3220176896
+       .long   637203434
+       .long   3219308251
+       .long   3221225472
+       .long   1011960193
+       .long   3761365757
+       .long   1070149758
+       .long   0
+       .long   3220176896
+       .long   4242632757
+       .long   3219329015
+       .long   536870912
+       .long   1013906630
+       .long   752919289
+       .long   1070211588
+       .long   0
+       .long   3220176896
+       .long   2969983475
+       .long   3219349592
+       .long   2684354560
+       .long   1015151795
+       .long   3652612115
+       .long   1070274422
+       .long   0
+       .long   3220176896
+       .long   689983673
+       .long   3219369978
+       .long   3758096384
+       .long   3162390053
+       .long   1883353036
+       .long   1070338253
+       .long   0
+       .long   3220176896
+       .long   1397053140
+       .long   3219390169
+       .long   1610612736
+       .long   3162728726
+       .long   1403757309
+       .long   1070403070
+       .long   0
+       .long   3220176896
+       .long   621354454
+       .long   3219410163
+       .long   536870912
+       .long   3160934250
+       .long   3239527685
+       .long   1070468863
+       .long   0
+       .long   3220176896
+       .long   2610628921
+       .long   3219429956
+       .long   1610612736
+       .long   1015185121
+       .long   3489768009
+       .long   1070535623
+       .long   0
+       .long   3220176896
+       .long   3152274921
+       .long   3219449546
+       .long   3758096384
+       .long   3160654483
+       .long   2371640770
+       .long   3218072499
+       .long   0
+       .long   3219128320
+       .long   2460177814
+       .long   3219468930
+       .long   2147483648
+       .long   1014633195
+       .long   2309668539
+       .long   3218003836
+       .long   0
+       .long   3219128320
+       .long   881650848
+       .long   3219488105
+       .long   2147483648
+       .long   1015502624
+       .long   2081278341
+       .long   3217934237
+       .long   0
+       .long   3219128320
+       .long   3194290572
+       .long   3219507067
+       .long   2147483648
+       .long   3162532330
+       .long   3753901657
+       .long   3217863712
+       .long   0
+       .long   3219128320
+       .long   1427975391
+       .long   3219525815
+       .long   1073741824
+       .long   1014124979
+       .long   1403691706
+       .long   3217792273
+       .long   0
+       .long   3219128320
+       .long   636516413
+       .long   3219544345
+       .long   3758096384
+       .long   3163307364
+       .long   2583490354
+       .long   3217719929
+       .long   0
+       .long   3219128320
+       .long   1719614413
+       .long   3219562654
+       .long   0
+       .long   1015799092
+       .long   2546065654
+       .long   3217646692
+       .long   0
+       .long   3219128320
+       .long   1424664751
+       .long   3219580740
+       .long   3221225472
+       .long   1015921667
+       .long   1416934267
+       .long   3217572573
+       .long   0
+       .long   3219128320
+       .long   938475414
+       .long   3219598600
+       .long   0
+       .long   3162559727
+       .long   4187227697
+       .long   3217497582
+       .long   0
+       .long   3219128320
+       .long   1594061409
+       .long   3219616231
+       .long   2147483648
+       .long   3161837518
+       .long   3526603391
+       .long   3217421732
+       .long   0
+       .long   3219128320
+       .long   577417135
+       .long   3219633631
+       .long   2684354560
+       .long   1014035767
+       .long   1250776663
+       .long   3217345034
+       .long   0
+       .long   3219128320
+       .long   3814135665
+       .long   3219650796
+       .long   3221225472
+       .long   1015662808
+       .long   4019165092
+       .long   3217267498
+       .long   0
+       .long   3219128320
+       .long   201299822
+       .long   3219667726
+       .long   3758096384
+       .long   1014428704
+       .long   1852581091
+       .long   3217189138
+       .long   0
+       .long   3219128320
+       .long   263859903
+       .long   3219684416
+       .long   0
+       .long   1015208636
+       .long   2485417816
+       .long   3217109964
+       .long   0
+       .long   3219128320
+       .long   1796544321
+       .long   3219700864
+       .long   536870912
+       .long   1015203297
+       .long   2586490530
+       .long   3217028810
+       .long   0
+       .long   3219128320
+       .long   2750387213
+       .long   3219717068
+       .long   2147483648
+       .long   1013374889
+       .long   1224902090
+       .long   3216867281
+       .long   0
+       .long   3219128320
+       .long   1234330619
+       .long   3219733026
+       .long   2684354560
+       .long   3162756121
+       .long   2285031318
+       .long   3216704197
+       .long   0
+       .long   3219128320
+       .long   4106737474
+       .long   3219748734
+       .long   2684354560
+       .long   1015108729
+       .long   3876290983
+       .long   3216539583
+       .long   0
+       .long   3219128320
+       .long   1207142209
+       .long   3219764192
+       .long   2147483648
+       .long   1015221986
+       .long   802660176
+       .long   3216373465
+       .long   0
+       .long   3219128320
+       .long   4012486548
+       .long   3219779395
+       .long   2684354560
+       .long   3162185212
+       .long   1726519029
+       .long   3216205866
+       .long   0
+       .long   3219128320
+       .long   2688952194
+       .long   3219794343
+       .long   0
+       .long   1014048955
+       .long   3382663878
+       .long   3216036812
+       .long   0
+       .long   3219128320
+       .long   453180130
+       .long   3219809033
+       .long   1073741824
+       .long   1014927633
+       .long   2598800519
+       .long   3215750067
+       .long   0
+       .long   3219128320
+       .long   688824739
+       .long   3219823462
+       .long   3758096384
+       .long   3157915184
+       .long   1038988426
+       .long   3215406294
+       .long   0
+       .long   3219128320
+       .long   2653017361
+       .long   3219837628
+       .long   0
+       .long   1015316414
+       .long   1102361128
+       .long   3215059765
+       .long   0
+       .long   3219128320
+       .long   1477771776
+       .long   3219851530
+       .long   536870912
+       .long   1015621338
+       .long   2880516564
+       .long   3214487049
+       .long   0
+       .long   3219128320
+       .long   1056266002
+       .long   3219865165
+       .long   2684354560
+       .long   1015985848
+       .long   1220541286
+       .long   3213681126
+       .long   0
+       .long   3219128320
+       .long   1159294526
+       .long   3219878531
+       .long   536870912
+       .long   1015793311
+       .long   1279178457
+       .long   3211590791
+       .long   0
+       .long   3219128320
+       .long   1731563730
+       .long   3219891626
+       .long   536870912
+       .long   3163023950
+       .long   31019393
+       .long   1065162441
+       .long   0
+       .long   3219128320
+       .long   2892993834
+       .long   3219904448
+       .long   536870912
+       .long   1015555495
+       .long   3506991783
+       .long   1066548842
+       .long   0
+       .long   3219128320
+       .long   645027145
+       .long   3219916996
+       .long   3221225472
+       .long   3160085887
+       .long   2140183630
+       .long   1067272748
+       .long   0
+       .long   3219128320
+       .long   4051746225
+       .long   3219929266
+       .long   1610612736
+       .long   1014423729
+       .long   600368053
+       .long   1067725893
+       .long   0
+       .long   3219128320
+       .long   881357723
+       .long   3219941259
+       .long   3221225472
+       .long   3161294538
+       .long   913431823
+       .long   1068092555
+       .long   0
+       .long   3219128320
+       .long   557060597
+       .long   3219952971
+       .long   0
+       .long   1012071286
+       .long   1073154251
+       .long   1068461489
+       .long   0
+       .long   3219128320
+       .long   4093443164
+       .long   3219964400
+       .long   536870912
+       .long   3162396513
+       .long   3631910143
+       .long   1068665791
+       .long   0
+       .long   3219128320
+       .long   4097623923
+       .long   3219975546
+       .long   2684354560
+       .long   1012824939
+       .long   1380647130
+       .long   1068852447
+       .long   0
+       .long   3219128320
+       .long   1950234076
+       .long   3219986407
+       .long   536870912
+       .long   1011941850
+       .long   4049357271
+       .long   1069040154
+       .long   0
+       .long   3219128320
+       .long   3511535930
+       .long   3219996980
+       .long   2147483648
+       .long   1015344978
+       .long   1896722595
+       .long   1069228886
+       .long   0
+       .long   3219128320
+       .long   1942611595
+       .long   3220007265
+       .long   3221225472
+       .long   1014926433
+       .long   1699043957
+       .long   1069418613
+       .long   0
+       .long   3219128320
+       .long   3476196678
+       .long   3220017259
+       .long   0
+       .long   3161741286
+       .long   3296146332
+       .long   3216969380
+       .long   0
+       .long   3218079744
+       .long   1647878299
+       .long   3220026962
+       .long   3758096384
+       .long   1014685415
+       .long   3286832763
+       .long   3216777748
+       .long   0
+       .long   3218079744
+       .long   3066872380
+       .long   3220036371
+       .long   3221225472
+       .long   3163044919
+       .long   1962712856
+       .long   3216585207
+       .long   0
+       .long   3218079744
+       .long   1647164971
+       .long   3220045486
+       .long   2147483648
+       .long   1015354602
+       .long   3601629044
+       .long   3216391785
+       .long   0
+       .long   3218079744
+       .long   83265253
+       .long   3220054305
+       .long   1610612736
+       .long   1015026887
+       .long   165911977
+       .long   3216197513
+       .long   0
+       .long   3218079744
+       .long   1261158782
+       .long   3220062826
+       .long   2147483648
+       .long   3163195192
+       .long   1348311045
+       .long   3216002418
+       .long   0
+       .long   3218079744
+       .long   3964199186
+       .long   3220071048
+       .long   3758096384
+       .long   1013017430
+       .long   386665102
+       .long   3215630470
+       .long   0
+       .long   3218079744
+       .long   2873938189
+       .long   3220078971
+       .long   1610612736
+       .long   1014827774
+       .long   1991047213
+       .long   3215237169
+       .long   0
+       .long   3218079744
+       .long   1455828442
+       .long   3220086593
+       .long   3758096384
+       .long   3162988721
+       .long   4107121629
+       .long   3214750787
+       .long   0
+       .long   3218079744
+       .long   3370060660
+       .long   3220093912
+       .long   1610612736
+       .long   3162270860
+       .long   723478390
+       .long   3213958438
+       .long   0
+       .long   3218079744
+       .long   3882371427
+       .long   3220100928
+       .long   2147483648
+       .long   3162407623
+       .long   2382326656
+       .long   3212045827
+       .long   0
+       .long   3218079744
+       .long   2749658050
+       .long   3220107640
+       .long   1610612736
+       .long   3162910986
+       .long   2614369450
+       .long   1065140432
+       .long   0
+       .long   3218079744
+       .long   4220661975
+       .long   3220114046
+       .long   3221225472
+       .long   3161795706
+       .long   3587565429
+       .long   1066624384
+       .long   0
+       .long   3218079744
+       .long   4151720666
+       .long   3220120146
+       .long   0
+       .long   1015155896
+       .long   2886567144
+       .long   1067426796
+       .long   0
+       .long   3218079744
+       .long   2892293513
+       .long   3220125939
+       .long   2684354560
+       .long   1014856623
+       .long   1765797566
+       .long   1067840895
+       .long   0
+       .long   3218079744
+       .long   990588717
+       .long   3220131424
+       .long   3758096384
+       .long   1014558209
+       .long   240740309
+       .long   1068244255
+       .long   0
+       .long   3218079744
+       .long   3489094832
+       .long   3220136599
+       .long   536870912
+       .long   3161809431
+       .long   2034433221
+       .long   3215832935
+       .long   0
+       .long   3217031168
+       .long   2745245815
+       .long   3220141465
+       .long   3221225472
+       .long   3163049777
+       .long   304938777
+       .long   3215427665
+       .long   0
+       .long   3217031168
+       .long   4201728937
+       .long   3220146020
+       .long   1610612736
+       .long   3162157654
+       .long   3299146087
+       .long   3215021530
+       .long   0
+       .long   3217031168
+       .long   617154971
+       .long   3220150265
+       .long   3758096384
+       .long   1015950048
+       .long   1953696209
+       .long   3214295171
+       .long   0
+       .long   3217031168
+       .long   2131272983
+       .long   3220154197
+       .long   3221225472
+       .long   1015521448
+       .long   3987691371
+       .long   3213074188
+       .long   0
+       .long   3217031168
+       .long   1905645377
+       .long   3220157817
+       .long   1610612736
+       .long   3161571244
+       .long   718380601
+       .long   1063597621
+       .long   0
+       .long   3217031168
+       .long   1893834707
+       .long   3220161124
+       .long   1610612736
+       .long   3162631302
+       .long   3272206680
+       .long   1066288081
+       .long   0
+       .long   3217031168
+       .long   4251821691
+       .long   3220164117
+       .long   2147483648
+       .long   1014357359
+       .long   257503056
+       .long   1067164005
+       .long   0
+       .long   3217031168
+       .long   2748392742
+       .long   3220166797
+       .long   536870912
+       .long   1015578102
+       .long   711626851
+       .long   3214400320
+       .long   0
+       .long   3215982592
+       .long   4240268041
+       .long   3220169162
+       .long   536870912
+       .long   3161072611
+       .long   2523975598
+       .long   3213273348
+       .long   0
+       .long   3215982592
+       .long   2902558778
+       .long   3220171213
+       .long   3221225472
+       .long   3160744428
+       .long   3237733378
+       .long   1062425136
+       .long   0
+       .long   3215982592
+       .long   1703834029
+       .long   3220172949
+       .long   3758096384
+       .long   3162512012
+       .long   1003003824
+       .long   1066107496
+       .long   0
+       .long   3215982592
+       .long   3816385918
+       .long   3220174369
+       .long   536870912
+       .long   1013733308
+       .long   2896342633
+       .long   3212231467
+       .long   0
+       .long   3214934016
+       .long   4026464093
+       .long   3220175474
+       .long   3221225472
+       .long   1015592141
+       .long   561145352
+       .long   1065056936
+       .long   0
+       .long   3214934016
+       .long   1619315981
+       .long   3220176264
+       .long   1073741824
+       .long   1015100749
+       .long   210035182
+       .long   1064007864
+       .long   0
+       .long   3213885440
+       .long   379294427
+       .long   3220176738
+       .long   3221225472
+       .long   3162889635
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   0
+       .long   210035182
+       .long   3211491512
+       .long   0
+       .long   1066401792
+       .long   379294427
+       .long   3220176738
+       .long   3221225472
+       .long   3162889635
+       .long   561145352
+       .long   3212540584
+       .long   0
+       .long   1067450368
+       .long   1619315981
+       .long   3220176264
+       .long   1073741824
+       .long   1015100749
+       .long   2896342633
+       .long   1064747819
+       .long   0
+       .long   1067450368
+       .long   4026464093
+       .long   3220175474
+       .long   3221225472
+       .long   1015592141
+       .long   1003003824
+       .long   3213591144
+       .long   0
+       .long   1068498944
+       .long   3816385918
+       .long   3220174369
+       .long   536870912
+       .long   1013733308
+       .long   3237733378
+       .long   3209908784
+       .long   0
+       .long   1068498944
+       .long   1703834029
+       .long   3220172949
+       .long   3758096384
+       .long   3162512012
+       .long   2523975598
+       .long   1065789700
+       .long   0
+       .long   1068498944
+       .long   2902558778
+       .long   3220171213
+       .long   3221225472
+       .long   3160744428
+       .long   711626851
+       .long   1066916672
+       .long   0
+       .long   1068498944
+       .long   4240268041
+       .long   3220169162
+       .long   536870912
+       .long   3161072611
+       .long   257503056
+       .long   3214647653
+       .long   0
+       .long   1069547520
+       .long   2748392742
+       .long   3220166797
+       .long   536870912
+       .long   1015578102
+       .long   3272206680
+       .long   3213771729
+       .long   0
+       .long   1069547520
+       .long   4251821691
+       .long   3220164117
+       .long   2147483648
+       .long   1014357359
+       .long   718380601
+       .long   3211081269
+       .long   0
+       .long   1069547520
+       .long   1893834707
+       .long   3220161124
+       .long   1610612736
+       .long   3162631302
+       .long   3987691371
+       .long   1065590540
+       .long   0
+       .long   1069547520
+       .long   1905645377
+       .long   3220157817
+       .long   1610612736
+       .long   3161571244
+       .long   1953696209
+       .long   1066811523
+       .long   0
+       .long   1069547520
+       .long   2131272983
+       .long   3220154197
+       .long   3221225472
+       .long   1015521448
+       .long   3299146087
+       .long   1067537882
+       .long   0
+       .long   1069547520
+       .long   617154971
+       .long   3220150265
+       .long   3758096384
+       .long   1015950048
+       .long   304938777
+       .long   1067944017
+       .long   0
+       .long   1069547520
+       .long   4201728937
+       .long   3220146020
+       .long   1610612736
+       .long   3162157654
+       .long   2034433221
+       .long   1068349287
+       .long   0
+       .long   1069547520
+       .long   2745245815
+       .long   3220141465
+       .long   3221225472
+       .long   3163049777
+       .long   240740309
+       .long   3215727903
+       .long   0
+       .long   1070596096
+       .long   3489094832
+       .long   3220136599
+       .long   536870912
+       .long   3161809431
+       .long   1765797566
+       .long   3215324543
+       .long   0
+       .long   1070596096
+       .long   990588717
+       .long   3220131424
+       .long   3758096384
+       .long   1014558209
+       .long   2886567144
+       .long   3214910444
+       .long   0
+       .long   1070596096
+       .long   2892293513
+       .long   3220125939
+       .long   2684354560
+       .long   1014856623
+       .long   3587565429
+       .long   3214108032
+       .long   0
+       .long   1070596096
+       .long   4151720666
+       .long   3220120146
+       .long   0
+       .long   1015155896
+       .long   2614369450
+       .long   3212624080
+       .long   0
+       .long   1070596096
+       .long   4220661975
+       .long   3220114046
+       .long   3221225472
+       .long   3161795706
+       .long   2382326656
+       .long   1064562179
+       .long   0
+       .long   1070596096
+       .long   2749658050
+       .long   3220107640
+       .long   1610612736
+       .long   3162910986
+       .long   723478390
+       .long   1066474790
+       .long   0
+       .long   1070596096
+       .long   3882371427
+       .long   3220100928
+       .long   2147483648
+       .long   3162407623
+       .long   4107121629
+       .long   1067267139
+       .long   0
+       .long   1070596096
+       .long   3370060660
+       .long   3220093912
+       .long   1610612736
+       .long   3162270860
+       .long   1991047213
+       .long   1067753521
+       .long   0
+       .long   1070596096
+       .long   1455828442
+       .long   3220086593
+       .long   3758096384
+       .long   3162988721
+       .long   386665102
+       .long   1068146822
+       .long   0
+       .long   1070596096
+       .long   2873938189
+       .long   3220078971
+       .long   1610612736
+       .long   1014827774
+       .long   1348311045
+       .long   1068518770
+       .long   0
+       .long   1070596096
+       .long   3964199186
+       .long   3220071048
+       .long   3758096384
+       .long   1013017430
+       .long   165911977
+       .long   1068713865
+       .long   0
+       .long   1070596096
+       .long   1261158782
+       .long   3220062826
+       .long   2147483648
+       .long   3163195192
+       .long   3601629044
+       .long   1068908137
+       .long   0
+       .long   1070596096
+       .long   83265253
+       .long   3220054305
+       .long   1610612736
+       .long   1015026887
+       .long   1962712856
+       .long   1069101559
+       .long   0
+       .long   1070596096
+       .long   1647164971
+       .long   3220045486
+       .long   2147483648
+       .long   1015354602
+       .long   3286832763
+       .long   1069294100
+       .long   0
+       .long   1070596096
+       .long   3066872380
+       .long   3220036371
+       .long   3221225472
+       .long   3163044919
+       .long   3296146332
+       .long   1069485732
+       .long   0
+       .long   1070596096
+       .long   1647878299
+       .long   3220026962
+       .long   3758096384
+       .long   1014685415
+       .long   1699043957
+       .long   3216902261
+       .long   0
+       .long   1071644672
+       .long   3476196678
+       .long   3220017259
+       .long   0
+       .long   3161741286
+       .long   1896722595
+       .long   3216712534
+       .long   0
+       .long   1071644672
+       .long   1942611595
+       .long   3220007265
+       .long   3221225472
+       .long   1014926433
+       .long   4049357271
+       .long   3216523802
+       .long   0
+       .long   1071644672
+       .long   3511535930
+       .long   3219996980
+       .long   2147483648
+       .long   1015344978
+       .long   1380647130
+       .long   3216336095
+       .long   0
+       .long   1071644672
+       .long   1950234076
+       .long   3219986407
+       .long   536870912
+       .long   1011941850
+       .long   3631910143
+       .long   3216149439
+       .long   0
+       .long   1071644672
+       .long   4097623923
+       .long   3219975546
+       .long   2684354560
+       .long   1012824939
+       .long   1073154251
+       .long   3215945137
+       .long   0
+       .long   1071644672
+       .long   4093443164
+       .long   3219964400
+       .long   536870912
+       .long   3162396513
+       .long   913431823
+       .long   3215576203
+       .long   0
+       .long   1071644672
+       .long   557060597
+       .long   3219952971
+       .long   0
+       .long   1012071286
+       .long   600368053
+       .long   3215209541
+       .long   0
+       .long   1071644672
+       .long   881357723
+       .long   3219941259
+       .long   3221225472
+       .long   3161294538
+       .long   2140183630
+       .long   3214756396
+       .long   0
+       .long   1071644672
+       .long   4051746225
+       .long   3219929266
+       .long   1610612736
+       .long   1014423729
+       .long   3506991783
+       .long   3214032490
+       .long   0
+       .long   1071644672
+       .long   645027145
+       .long   3219916996
+       .long   3221225472
+       .long   3160085887
+       .long   31019393
+       .long   3212646089
+       .long   0
+       .long   1071644672
+       .long   2892993834
+       .long   3219904448
+       .long   536870912
+       .long   1015555495
+       .long   1279178457
+       .long   1064107143
+       .long   0
+       .long   1071644672
+       .long   1731563730
+       .long   3219891626
+       .long   536870912
+       .long   3163023950
+       .long   1220541286
+       .long   1066197478
+       .long   0
+       .long   1071644672
+       .long   1159294526
+       .long   3219878531
+       .long   536870912
+       .long   1015793311
+       .long   2880516564
+       .long   1067003401
+       .long   0
+       .long   1071644672
+       .long   1056266002
+       .long   3219865165
+       .long   2684354560
+       .long   1015985848
+       .long   1102361128
+       .long   1067576117
+       .long   0
+       .long   1071644672
+       .long   1477771776
+       .long   3219851530
+       .long   536870912
+       .long   1015621338
+       .long   1038988426
+       .long   1067922646
+       .long   0
+       .long   1071644672
+       .long   2653017361
+       .long   3219837628
+       .long   0
+       .long   1015316414
+       .long   2598800519
+       .long   1068266419
+       .long   0
+       .long   1071644672
+       .long   688824739
+       .long   3219823462
+       .long   3758096384
+       .long   3157915184
+       .long   3382663878
+       .long   1068553164
+       .long   0
+       .long   1071644672
+       .long   453180130
+       .long   3219809033
+       .long   1073741824
+       .long   1014927633
+       .long   1726519029
+       .long   1068722218
+       .long   0
+       .long   1071644672
+       .long   2688952194
+       .long   3219794343
+       .long   0
+       .long   1014048955
+       .long   802660176
+       .long   1068889817
+       .long   0
+       .long   1071644672
+       .long   4012486548
+       .long   3219779395
+       .long   2684354560
+       .long   3162185212
+       .long   3876290983
+       .long   1069055935
+       .long   0
+       .long   1071644672
+       .long   1207142209
+       .long   3219764192
+       .long   2147483648
+       .long   1015221986
+       .long   2285031318
+       .long   1069220549
+       .long   0
+       .long   1071644672
+       .long   4106737474
+       .long   3219748734
+       .long   2684354560
+       .long   1015108729
+       .long   1224902090
+       .long   1069383633
+       .long   0
+       .long   1071644672
+       .long   1234330619
+       .long   3219733026
+       .long   2684354560
+       .long   3162756121
+       .long   2586490530
+       .long   1069545162
+       .long   0
+       .long   1071644672
+       .long   2750387213
+       .long   3219717068
+       .long   2147483648
+       .long   1013374889
+       .long   2485417816
+       .long   1069626316
+       .long   0
+       .long   1071644672
+       .long   1796544321
+       .long   3219700864
+       .long   536870912
+       .long   1015203297
+       .long   1852581091
+       .long   1069705490
+       .long   0
+       .long   1071644672
+       .long   263859903
+       .long   3219684416
+       .long   0
+       .long   1015208636
+       .long   4019165092
+       .long   1069783850
+       .long   0
+       .long   1071644672
+       .long   201299822
+       .long   3219667726
+       .long   3758096384
+       .long   1014428704
+       .long   1250776663
+       .long   1069861386
+       .long   0
+       .long   1071644672
+       .long   3814135665
+       .long   3219650796
+       .long   3221225472
+       .long   1015662808
+       .long   3526603391
+       .long   1069938084
+       .long   0
+       .long   1071644672
+       .long   577417135
+       .long   3219633631
+       .long   2684354560
+       .long   1014035767
+       .long   4187227697
+       .long   1070013934
+       .long   0
+       .long   1071644672
+       .long   1594061409
+       .long   3219616231
+       .long   2147483648
+       .long   3161837518
+       .long   1416934267
+       .long   1070088925
+       .long   0
+       .long   1071644672
+       .long   938475414
+       .long   3219598600
+       .long   0
+       .long   3162559727
+       .long   2546065654
+       .long   1070163044
+       .long   0
+       .long   1071644672
+       .long   1424664751
+       .long   3219580740
+       .long   3221225472
+       .long   1015921667
+       .long   2583490354
+       .long   1070236281
+       .long   0
+       .long   1071644672
+       .long   1719614413
+       .long   3219562654
+       .long   0
+       .long   1015799092
+       .long   1403691706
+       .long   1070308625
+       .long   0
+       .long   1071644672
+       .long   636516413
+       .long   3219544345
+       .long   3758096384
+       .long   3163307364
+       .long   3753901657
+       .long   1070380064
+       .long   0
+       .long   1071644672
+       .long   1427975391
+       .long   3219525815
+       .long   1073741824
+       .long   1014124979
+       .long   2081278341
+       .long   1070450589
+       .long   0
+       .long   1071644672
+       .long   3194290572
+       .long   3219507067
+       .long   2147483648
+       .long   3162532330
+       .long   2309668539
+       .long   1070520188
+       .long   0
+       .long   1071644672
+       .long   881650848
+       .long   3219488105
+       .long   2147483648
+       .long   1015502624
+       .long   2371640770
+       .long   1070588851
+       .long   0
+       .long   1071644672
+       .long   2460177814
+       .long   3219468930
+       .long   2147483648
+       .long   1014633195
+       .long   3489768009
+       .long   3218019271
+       .long   0
+       .long   1072693248
+       .long   3152274921
+       .long   3219449546
+       .long   3758096384
+       .long   3160654483
+       .long   3239527685
+       .long   3217952511
+       .long   0
+       .long   1072693248
+       .long   2610628921
+       .long   3219429956
+       .long   1610612736
+       .long   1015185121
+       .long   1403757309
+       .long   3217886718
+       .long   0
+       .long   1072693248
+       .long   621354454
+       .long   3219410163
+       .long   536870912
+       .long   3160934250
+       .long   1883353036
+       .long   3217821901
+       .long   0
+       .long   1072693248
+       .long   1397053140
+       .long   3219390169
+       .long   1610612736
+       .long   3162728726
+       .long   3652612115
+       .long   3217758070
+       .long   0
+       .long   1072693248
+       .long   689983673
+       .long   3219369978
+       .long   3758096384
+       .long   3162390053
+       .long   752919289
+       .long   3217695236
+       .long   0
+       .long   1072693248
+       .long   2969983475
+       .long   3219349592
+       .long   2684354560
+       .long   1015151795
+       .long   3761365757
+       .long   3217633406
+       .long   0
+       .long   1072693248
+       .long   4242632757
+       .long   3219329015
+       .long   536870912
+       .long   1013906630
+       .long   1129922991
+       .long   3217572592
+       .long   0
+       .long   1072693248
+       .long   637203434
+       .long   3219308251
+       .long   3221225472
+       .long   1011960193
+       .long   2129093113
+       .long   3217512801
+       .long   0
+       .long   1072693248
+       .long   1289556703
+       .long   3219287301
+       .long   536870912
+       .long   1015405172
+       .long   2482246777
+       .long   3217454043
+       .long   0
+       .long   1072693248
+       .long   2570316633
+       .long   3219266169
+       .long   1610612736
+       .long   1015261105
+       .long   1539668340
+       .long   3217396327
+       .long   0
+       .long   1072693248
+       .long   967731400
+       .long   3219244859
+       .long   536870912
+       .long   3163235805
+       .long   2272832445
+       .long   3217339661
+       .long   0
+       .long   1072693248
+       .long   1675549513
+       .long   3219223373
+       .long   3221225472
+       .long   1015541490
+       .long   2678847490
+       .long   3217284054
+       .long   0
+       .long   1072693248
+       .long   1411074851
+       .long   3219201715
+       .long   1610612736
+       .long   1016001083
+       .long   69903290
+       .long   3217229515
+       .long   0
+       .long   1072693248
+       .long   1297975695
+       .long   3219179888
+       .long   3221225472
+       .long   1015600087
+       .long   3952756490
+       .long   3217176050
+       .long   0
+       .long   1072693248
+       .long   2569207790
+       .long   3219157895
+       .long   1073741824
+       .long   1015699969
+       .long   1663679671
+       .long   3217123670
+       .long   0
+       .long   1072693248
+       .long   2269920951
+       .long   3219135740
+       .long   3758096384
+       .long   1014188597
+       .long   1312926554
+       .long   3217072381
+       .long   0
+       .long   1072693248
+       .long   3690502842
+       .long   3219098532
+       .long   3221225472
+       .long   1009970207
+       .long   3429717432
+       .long   3217013214
+       .long   0
+       .long   1072693248
+       .long   1391425750
+       .long   3219053593
+       .long   3221225472
+       .long   1014878455
+       .long   1945768569
+       .long   3216915048
+       .long   0
+       .long   1072693248
+       .long   939980347
+       .long   3219008349
+       .long   0
+       .long   3160280457
+       .long   1539072807
+       .long   3216819110
+       .long   0
+       .long   1072693248
+       .long   1535566729
+       .long   3218962807
+       .long   2147483648
+       .long   3161805036
+       .long   4133449816
+       .long   3216725414
+       .long   0
+       .long   1072693248
+       .long   2570175582
+       .long   3218916974
+       .long   1073741824
+       .long   3159786766
+       .long   1612193054
+       .long   3216633976
+       .long   0
+       .long   1072693248
+       .long   3623952103
+       .long   3218870857
+       .long   2684354560
+       .long   1014502314
+       .long   1578746984
+       .long   3216544808
+       .long   0
+       .long   1072693248
+       .long   165764288
+       .long   3218824464
+       .long   3221225472
+       .long   3160781666
+       .long   1577996576
+       .long   3216457924
+       .long   0
+       .long   1072693248
+       .long   728580042
+       .long   3218777800
+       .long   1610612736
+       .long   1014849296
+       .long   1972483635
+       .long   3216373337
+       .long   0
+       .long   1072693248
+       .long   1135144330
+       .long   3218730873
+       .long   536870912
+       .long   3160857217
+       .long   1638976426
+       .long   3216291060
+       .long   0
+       .long   1072693248
+       .long   1673302999
+       .long   3218683690
+       .long   2147483648
+       .long   3160835121
+       .long   2255197647
+       .long   3216211105
+       .long   0
+       .long   1072693248
+       .long   2796464483
+       .long   3218636258
+       .long   3221225472
+       .long   1013394669
+       .long   3996842794
+       .long   3216133484
+       .long   0
+       .long   1072693248
+       .long   824036583
+       .long   3218588585
+       .long   0
+       .long   3155796978
+       .long   1234824733
+       .long   3216058210
+       .long   0
+       .long   1072693248
+       .long   821708191
+       .long   3218540677
+       .long   3758096384
+       .long   1014254361
+       .long   4002549419
+       .long   3215985292
+       .long   0
+       .long   1072693248
+       .long   3711903686
+       .long   3218492541
+       .long   1073741824
+       .long   3159428395
+       .long   2962723252
+       .long   3215846895
+       .long   0
+       .long   1072693248
+       .long   1974149085
+       .long   3218444186
+       .long   3221225472
+       .long   1008664000
+       .long   1296295961
+       .long   3215710555
+       .long   0
+       .long   1072693248
+       .long   1115219818
+       .long   3218395618
+       .long   0
+       .long   3160555890
+       .long   997322465
+       .long   3215578993
+       .long   0
+       .long   1072693248
+       .long   2484561409
+       .long   3218346844
+       .long   1073741824
+       .long   3161508220
+       .long   1261629236
+       .long   3215452229
+       .long   0
+       .long   1072693248
+       .long   3269558610
+       .long   3218297872
+       .long   536870912
+       .long   1014221568
+       .long   2476548698
+       .long   3215330282
+       .long   0
+       .long   1072693248
+       .long   785751814
+       .long   3218248710
+       .long   2684354560
+       .long   1014354573
+       .long   1913604284
+       .long   3215213171
+       .long   0
+       .long   1072693248
+       .long   1062001470
+       .long   3218199364
+       .long   0
+       .long   1013391572
+       .long   2306566604
+       .long   3215100913
+       .long   0
+       .long   1072693248
+       .long   1655830135
+       .long   3218149842
+       .long   0
+       .long   3161990338
+       .long   3250111450
+       .long   3214993525
+       .long   0
+       .long   1072693248
+       .long   238550446
+       .long   3218100152
+       .long   2684354560
+       .long   1006899917
+       .long   2377770267
+       .long   3214848032
+       .long   0
+       .long   1072693248
+       .long   2065784603
+       .long   3218020857
+       .long   3758096384
+       .long   1013198318
+       .long   288924873
+       .long   3214652833
+       .long   0
+       .long   1072693248
+       .long   3846521617
+       .long   3217920847
+       .long   536870912
+       .long   3160890258
+       .long   1935888103
+       .long   3214467466
+       .long   0
+       .long   1072693248
+       .long   1786662755
+       .long   3217820546
+       .long   2147483648
+       .long   1008398659
+       .long   2660899430
+       .long   3214291960
+       .long   0
+       .long   1072693248
+       .long   632292433
+       .long   3217719968
+       .long   3758096384
+       .long   1013479685
+       .long   18115067
+       .long   3214126342
+       .long   0
+       .long   1072693248
+       .long   1013556747
+       .long   3217619128
+       .long   2684354560
+       .long   1013083417
+       .long   2346447124
+       .long   3213970635
+       .long   0
+       .long   1072693248
+       .long   3729833777
+       .long   3217518041
+       .long   3758096384
+       .long   3160528366
+       .long   1672287667
+       .long   3213764289
+       .long   0
+       .long   1072693248
+       .long   1149976518
+       .long   3217416724
+       .long   1610612736
+       .long   3160748543
+       .long   3451754846
+       .long   3213492662
+       .long   0
+       .long   1072693248
+       .long   2972270170
+       .long   3217315190
+       .long   1073741824
+       .long   1012041122
+       .long   1037482584
+       .long   3213240992
+       .long   0
+       .long   1072693248
+       .long   1854824762
+       .long   3217213456
+       .long   2684354560
+       .long   3159437312
+       .long   2592747447
+       .long   3213009315
+       .long   0
+       .long   1072693248
+       .long   3470456183
+       .long   3217111536
+       .long   1073741824
+       .long   1013261123
+       .long   2402293340
+       .long   3212758471
+       .long   0
+       .long   1072693248
+       .long   1453945614
+       .long   3216987726
+       .long   1610612736
+       .long   3158976260
+       .long   1227670166
+       .long   3212375297
+       .long   0
+       .long   1072693248
+       .long   3349070549
+       .long   3216783237
+       .long   3758096384
+       .long   1009054621
+       .long   393047345
+       .long   3212032302
+       .long   0
+       .long   1072693248
+       .long   3156849708
+       .long   3216578470
+       .long   3221225472
+       .long   1010706200
+       .long   1118107366
+       .long   3211670787
+       .long   0
+       .long   1072693248
+       .long   177906713
+       .long   3216373456
+       .long   3221225472
+       .long   1011826722
+       .long   4269262315
+       .long   3211145810
+       .long   0
+       .long   1072693248
+       .long   2462980598
+       .long   3216168224
+       .long   2684354560
+       .long   1011458184
+       .long   3810305407
+       .long   3210663220
+       .long   0
+       .long   1072693248
+       .long   2046304480
+       .long   3215943022
+       .long   3758096384
+       .long   1008919019
+       .long   220529721
+       .long   3209935929
+       .long   0
+       .long   1072693248
+       .long   4044216340
+       .long   3215531877
+       .long   0
+       .long   1009324733
+       .long   69373323
+       .long   3209049152
+       .long   0
+       .long   1072693248
+       .long   1972655565
+       .long   3215120485
+       .long   1073741824
+       .long   3156641526
+       .long   3650591271
+       .long   3207838971
+       .long   0
+       .long   1072693248
+       .long   4154680958
+       .long   3214483797
+       .long   0
+       .long   1006312803
+       .long   2376373521
+       .long   3205741868
+       .long   0
+       .long   1072693248
+       .long   4242458500
+       .long   3213435345
+       .long   2684354560
+       .long   3156838286
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2376373521
+       .long   3205741868
+       .long   0
+       .long   1072693248
+       .long   4242458500
+       .long   1065951697
+       .long   2684354560
+       .long   1009354638
+       .long   3650591271
+       .long   3207838971
+       .long   0
+       .long   1072693248
+       .long   4154680958
+       .long   1067000149
+       .long   0
+       .long   3153796451
+       .long   69373323
+       .long   3209049152
+       .long   0
+       .long   1072693248
+       .long   1972655565
+       .long   1067636837
+       .long   1073741824
+       .long   1009157878
+       .long   220529721
+       .long   3209935929
+       .long   0
+       .long   1072693248
+       .long   4044216340
+       .long   1068048229
+       .long   0
+       .long   3156808381
+       .long   3810305407
+       .long   3210663220
+       .long   0
+       .long   1072693248
+       .long   2046304480
+       .long   1068459374
+       .long   3758096384
+       .long   3156402667
+       .long   4269262315
+       .long   3211145810
+       .long   0
+       .long   1072693248
+       .long   2462980598
+       .long   1068684576
+       .long   2684354560
+       .long   3158941832
+       .long   1118107366
+       .long   3211670787
+       .long   0
+       .long   1072693248
+       .long   177906713
+       .long   1068889808
+       .long   3221225472
+       .long   3159310370
+       .long   393047345
+       .long   3212032302
+       .long   0
+       .long   1072693248
+       .long   3156849708
+       .long   1069094822
+       .long   3221225472
+       .long   3158189848
+       .long   1227670166
+       .long   3212375297
+       .long   0
+       .long   1072693248
+       .long   3349070549
+       .long   1069299589
+       .long   3758096384
+       .long   3156538269
+       .long   2402293340
+       .long   3212758471
+       .long   0
+       .long   1072693248
+       .long   1453945614
+       .long   1069504078
+       .long   1610612736
+       .long   1011492612
+       .long   2592747447
+       .long   3213009315
+       .long   0
+       .long   1072693248
+       .long   3470456183
+       .long   1069627888
+       .long   1073741824
+       .long   3160744771
+       .long   1037482584
+       .long   3213240992
+       .long   0
+       .long   1072693248
+       .long   1854824762
+       .long   1069729808
+       .long   2684354560
+       .long   1011953664
+       .long   3451754846
+       .long   3213492662
+       .long   0
+       .long   1072693248
+       .long   2972270170
+       .long   1069831542
+       .long   1073741824
+       .long   3159524770
+       .long   1672287667
+       .long   3213764289
+       .long   0
+       .long   1072693248
+       .long   1149976518
+       .long   1069933076
+       .long   1610612736
+       .long   1013264895
+       .long   2346447124
+       .long   3213970635
+       .long   0
+       .long   1072693248
+       .long   3729833777
+       .long   1070034393
+       .long   3758096384
+       .long   1013044718
+       .long   18115067
+       .long   3214126342
+       .long   0
+       .long   1072693248
+       .long   1013556747
+       .long   1070135480
+       .long   2684354560
+       .long   3160567065
+       .long   2660899430
+       .long   3214291960
+       .long   0
+       .long   1072693248
+       .long   632292433
+       .long   1070236320
+       .long   3758096384
+       .long   3160963333
+       .long   1935888103
+       .long   3214467466
+       .long   0
+       .long   1072693248
+       .long   1786662755
+       .long   1070336898
+       .long   2147483648
+       .long   3155882307
+       .long   288924873
+       .long   3214652833
+       .long   0
+       .long   1072693248
+       .long   3846521617
+       .long   1070437199
+       .long   536870912
+       .long   1013406610
+       .long   2377770267
+       .long   3214848032
+       .long   0
+       .long   1072693248
+       .long   2065784603
+       .long   1070537209
+       .long   3758096384
+       .long   3160681966
+       .long   3250111450
+       .long   3214993525
+       .long   0
+       .long   1072693248
+       .long   238550446
+       .long   1070616504
+       .long   2684354560
+       .long   3154383565
+       .long   2306566604
+       .long   3215100913
+       .long   0
+       .long   1072693248
+       .long   1655830135
+       .long   1070666194
+       .long   0
+       .long   1014506690
+       .long   1913604284
+       .long   3215213171
+       .long   0
+       .long   1072693248
+       .long   1062001470
+       .long   1070715716
+       .long   0
+       .long   3160875220
+       .long   2476548698
+       .long   3215330282
+       .long   0
+       .long   1072693248
+       .long   785751814
+       .long   1070765062
+       .long   2684354560
+       .long   3161838221
+       .long   1261629236
+       .long   3215452229
+       .long   0
+       .long   1072693248
+       .long   3269558610
+       .long   1070814224
+       .long   536870912
+       .long   3161705216
+       .long   997322465
+       .long   3215578993
+       .long   0
+       .long   1072693248
+       .long   2484561409
+       .long   1070863196
+       .long   1073741824
+       .long   1014024572
+       .long   1296295961
+       .long   3215710555
+       .long   0
+       .long   1072693248
+       .long   1115219818
+       .long   1070911970
+       .long   0
+       .long   1013072242
+       .long   2962723252
+       .long   3215846895
+       .long   0
+       .long   1072693248
+       .long   1974149085
+       .long   1070960538
+       .long   3221225472
+       .long   3156147648
+       .long   4002549419
+       .long   3215985292
+       .long   0
+       .long   1072693248
+       .long   3711903686
+       .long   1071008893
+       .long   1073741824
+       .long   1011944747
+       .long   1234824733
+       .long   3216058210
+       .long   0
+       .long   1072693248
+       .long   821708191
+       .long   1071057029
+       .long   3758096384
+       .long   3161738009
+       .long   3996842794
+       .long   3216133484
+       .long   0
+       .long   1072693248
+       .long   824036583
+       .long   1071104937
+       .long   0
+       .long   1008313330
+       .long   2255197647
+       .long   3216211105
+       .long   0
+       .long   1072693248
+       .long   2796464483
+       .long   1071152610
+       .long   3221225472
+       .long   3160878317
+       .long   1638976426
+       .long   3216291060
+       .long   0
+       .long   1072693248
+       .long   1673302999
+       .long   1071200042
+       .long   2147483648
+       .long   1013351473
+       .long   1972483635
+       .long   3216373337
+       .long   0
+       .long   1072693248
+       .long   1135144330
+       .long   1071247225
+       .long   536870912
+       .long   1013373569
+       .long   1577996576
+       .long   3216457924
+       .long   0
+       .long   1072693248
+       .long   728580042
+       .long   1071294152
+       .long   1610612736
+       .long   3162332944
+       .long   1578746984
+       .long   3216544808
+       .long   0
+       .long   1072693248
+       .long   165764288
+       .long   1071340816
+       .long   3221225472
+       .long   1013298018
+       .long   1612193054
+       .long   3216633976
+       .long   0
+       .long   1072693248
+       .long   3623952103
+       .long   1071387209
+       .long   2684354560
+       .long   3161985962
+       .long   4133449816
+       .long   3216725414
+       .long   0
+       .long   1072693248
+       .long   2570175582
+       .long   1071433326
+       .long   1073741824
+       .long   1012303118
+       .long   1539072807
+       .long   3216819110
+       .long   0
+       .long   1072693248
+       .long   1535566729
+       .long   1071479159
+       .long   2147483648
+       .long   1014321388
+       .long   1945768569
+       .long   3216915048
+       .long   0
+       .long   1072693248
+       .long   939980347
+       .long   1071524701
+       .long   0
+       .long   1012796809
+       .long   3429717432
+       .long   3217013214
+       .long   0
+       .long   1072693248
+       .long   1391425750
+       .long   1071569945
+       .long   3221225472
+       .long   3162362103
+       .long   1312926554
+       .long   3217072381
+       .long   0
+       .long   1072693248
+       .long   3690502842
+       .long   1071614884
+       .long   3221225472
+       .long   3157453855
+       .long   1663679671
+       .long   3217123670
+       .long   0
+       .long   1072693248
+       .long   2269920951
+       .long   1071652092
+       .long   3758096384
+       .long   3161672245
+       .long   3952756490
+       .long   3217176050
+       .long   0
+       .long   1072693248
+       .long   2569207790
+       .long   1071674247
+       .long   1073741824
+       .long   3163183617
+       .long   69903290
+       .long   3217229515
+       .long   0
+       .long   1072693248
+       .long   1297975695
+       .long   1071696240
+       .long   3221225472
+       .long   3163083735
+       .long   2678847490
+       .long   3217284054
+       .long   0
+       .long   1072693248
+       .long   1411074851
+       .long   1071718067
+       .long   1610612736
+       .long   3163484731
+       .long   2272832445
+       .long   3217339661
+       .long   0
+       .long   1072693248
+       .long   1675549513
+       .long   1071739725
+       .long   3221225472
+       .long   3163025138
+       .long   1539668340
+       .long   3217396327
+       .long   0
+       .long   1072693248
+       .long   967731400
+       .long   1071761211
+       .long   536870912
+       .long   1015752157
+       .long   2482246777
+       .long   3217454043
+       .long   0
+       .long   1072693248
+       .long   2570316633
+       .long   1071782521
+       .long   1610612736
+       .long   3162744753
+       .long   2129093113
+       .long   3217512801
+       .long   0
+       .long   1072693248
+       .long   1289556703
+       .long   1071803653
+       .long   536870912
+       .long   3162888820
+       .long   1129922991
+       .long   3217572592
+       .long   0
+       .long   1072693248
+       .long   637203434
+       .long   1071824603
+       .long   3221225472
+       .long   3159443841
+       .long   3761365757
+       .long   3217633406
+       .long   0
+       .long   1072693248
+       .long   4242632757
+       .long   1071845367
+       .long   536870912
+       .long   3161390278
+       .long   752919289
+       .long   3217695236
+       .long   0
+       .long   1072693248
+       .long   2969983475
+       .long   1071865944
+       .long   2684354560
+       .long   3162635443
+       .long   3652612115
+       .long   3217758070
+       .long   0
+       .long   1072693248
+       .long   689983673
+       .long   1071886330
+       .long   3758096384
+       .long   1014906405
+       .long   1883353036
+       .long   3217821901
+       .long   0
+       .long   1072693248
+       .long   1397053140
+       .long   1071906521
+       .long   1610612736
+       .long   1015245078
+       .long   1403757309
+       .long   3217886718
+       .long   0
+       .long   1072693248
+       .long   621354454
+       .long   1071926515
+       .long   536870912
+       .long   1013450602
+       .long   3239527685
+       .long   3217952511
+       .long   0
+       .long   1072693248
+       .long   2610628921
+       .long   1071946308
+       .long   1610612736
+       .long   3162668769
+       .long   3489768009
+       .long   3218019271
+       .long   0
+       .long   1072693248
+       .long   3152274921
+       .long   1071965898
+       .long   3758096384
+       .long   1013170835
+       .long   2371640770
+       .long   1070588851
+       .long   0
+       .long   1071644672
+       .long   2460177814
+       .long   1071985282
+       .long   2147483648
+       .long   3162116843
+       .long   2309668539
+       .long   1070520188
+       .long   0
+       .long   1071644672
+       .long   881650848
+       .long   1072004457
+       .long   2147483648
+       .long   3162986272
+       .long   2081278341
+       .long   1070450589
+       .long   0
+       .long   1071644672
+       .long   3194290572
+       .long   1072023419
+       .long   2147483648
+       .long   1015048682
+       .long   3753901657
+       .long   1070380064
+       .long   0
+       .long   1071644672
+       .long   1427975391
+       .long   1072042167
+       .long   1073741824
+       .long   3161608627
+       .long   1403691706
+       .long   1070308625
+       .long   0
+       .long   1071644672
+       .long   636516413
+       .long   1072060697
+       .long   3758096384
+       .long   1015823716
+       .long   2583490354
+       .long   1070236281
+       .long   0
+       .long   1071644672
+       .long   1719614413
+       .long   1072079006
+       .long   0
+       .long   3163282740
+       .long   2546065654
+       .long   1070163044
+       .long   0
+       .long   1071644672
+       .long   1424664751
+       .long   1072097092
+       .long   3221225472
+       .long   3163405315
+       .long   1416934267
+       .long   1070088925
+       .long   0
+       .long   1071644672
+       .long   938475414
+       .long   1072114952
+       .long   0
+       .long   1015076079
+       .long   4187227697
+       .long   1070013934
+       .long   0
+       .long   1071644672
+       .long   1594061409
+       .long   1072132583
+       .long   2147483648
+       .long   1014353870
+       .long   3526603391
+       .long   1069938084
+       .long   0
+       .long   1071644672
+       .long   577417135
+       .long   1072149983
+       .long   2684354560
+       .long   3161519415
+       .long   1250776663
+       .long   1069861386
+       .long   0
+       .long   1071644672
+       .long   3814135665
+       .long   1072167148
+       .long   3221225472
+       .long   3163146456
+       .long   4019165092
+       .long   1069783850
+       .long   0
+       .long   1071644672
+       .long   201299822
+       .long   1072184078
+       .long   3758096384
+       .long   3161912352
+       .long   1852581091
+       .long   1069705490
+       .long   0
+       .long   1071644672
+       .long   263859903
+       .long   1072200768
+       .long   0
+       .long   3162692284
+       .long   2485417816
+       .long   1069626316
+       .long   0
+       .long   1071644672
+       .long   1796544321
+       .long   1072217216
+       .long   536870912
+       .long   3162686945
+       .long   2586490530
+       .long   1069545162
+       .long   0
+       .long   1071644672
+       .long   2750387213
+       .long   1072233420
+       .long   2147483648
+       .long   3160858537
+       .long   1224902090
+       .long   1069383633
+       .long   0
+       .long   1071644672
+       .long   1234330619
+       .long   1072249378
+       .long   2684354560
+       .long   1015272473
+       .long   2285031318
+       .long   1069220549
+       .long   0
+       .long   1071644672
+       .long   4106737474
+       .long   1072265086
+       .long   2684354560
+       .long   3162592377
+       .long   3876290983
+       .long   1069055935
+       .long   0
+       .long   1071644672
+       .long   1207142209
+       .long   1072280544
+       .long   2147483648
+       .long   3162705634
+       .long   802660176
+       .long   1068889817
+       .long   0
+       .long   1071644672
+       .long   4012486548
+       .long   1072295747
+       .long   2684354560
+       .long   1014701564
+       .long   1726519029
+       .long   1068722218
+       .long   0
+       .long   1071644672
+       .long   2688952194
+       .long   1072310695
+       .long   0
+       .long   3161532603
+       .long   3382663878
+       .long   1068553164
+       .long   0
+       .long   1071644672
+       .long   453180130
+       .long   1072325385
+       .long   1073741824
+       .long   3162411281
+       .long   2598800519
+       .long   1068266419
+       .long   0
+       .long   1071644672
+       .long   688824739
+       .long   1072339814
+       .long   3758096384
+       .long   1010431536
+       .long   1038988426
+       .long   1067922646
+       .long   0
+       .long   1071644672
+       .long   2653017361
+       .long   1072353980
+       .long   0
+       .long   3162800062
+       .long   1102361128
+       .long   1067576117
+       .long   0
+       .long   1071644672
+       .long   1477771776
+       .long   1072367882
+       .long   536870912
+       .long   3163104986
+       .long   2880516564
+       .long   1067003401
+       .long   0
+       .long   1071644672
+       .long   1056266002
+       .long   1072381517
+       .long   2684354560
+       .long   3163469496
+       .long   1220541286
+       .long   1066197478
+       .long   0
+       .long   1071644672
+       .long   1159294526
+       .long   1072394883
+       .long   536870912
+       .long   3163276959
+       .long   1279178457
+       .long   1064107143
+       .long   0
+       .long   1071644672
+       .long   1731563730
+       .long   1072407978
+       .long   536870912
+       .long   1015540302
+       .long   31019393
+       .long   3212646089
+       .long   0
+       .long   1071644672
+       .long   2892993834
+       .long   1072420800
+       .long   536870912
+       .long   3163039143
+       .long   3506991783
+       .long   3214032490
+       .long   0
+       .long   1071644672
+       .long   645027145
+       .long   1072433348
+       .long   3221225472
+       .long   1012602239
+       .long   2140183630
+       .long   3214756396
+       .long   0
+       .long   1071644672
+       .long   4051746225
+       .long   1072445618
+       .long   1610612736
+       .long   3161907377
+       .long   600368053
+       .long   3215209541
+       .long   0
+       .long   1071644672
+       .long   881357723
+       .long   1072457611
+       .long   3221225472
+       .long   1013810890
+       .long   913431823
+       .long   3215576203
+       .long   0
+       .long   1071644672
+       .long   557060597
+       .long   1072469323
+       .long   0
+       .long   3159554934
+       .long   1073154251
+       .long   3215945137
+       .long   0
+       .long   1071644672
+       .long   4093443164
+       .long   1072480752
+       .long   536870912
+       .long   1014912865
+       .long   3631910143
+       .long   3216149439
+       .long   0
+       .long   1071644672
+       .long   4097623923
+       .long   1072491898
+       .long   2684354560
+       .long   3160308587
+       .long   1380647130
+       .long   3216336095
+       .long   0
+       .long   1071644672
+       .long   1950234076
+       .long   1072502759
+       .long   536870912
+       .long   3159425498
+       .long   4049357271
+       .long   3216523802
+       .long   0
+       .long   1071644672
+       .long   3511535930
+       .long   1072513332
+       .long   2147483648
+       .long   3162828626
+       .long   1896722595
+       .long   3216712534
+       .long   0
+       .long   1071644672
+       .long   1942611595
+       .long   1072523617
+       .long   3221225472
+       .long   3162410081
+       .long   1699043957
+       .long   3216902261
+       .long   0
+       .long   1071644672
+       .long   3476196678
+       .long   1072533611
+       .long   0
+       .long   1014257638
+       .long   3296146332
+       .long   1069485732
+       .long   0
+       .long   1070596096
+       .long   1647878299
+       .long   1072543314
+       .long   3758096384
+       .long   3162169063
+       .long   3286832763
+       .long   1069294100
+       .long   0
+       .long   1070596096
+       .long   3066872380
+       .long   1072552723
+       .long   3221225472
+       .long   1015561271
+       .long   1962712856
+       .long   1069101559
+       .long   0
+       .long   1070596096
+       .long   1647164971
+       .long   1072561838
+       .long   2147483648
+       .long   3162838250
+       .long   3601629044
+       .long   1068908137
+       .long   0
+       .long   1070596096
+       .long   83265253
+       .long   1072570657
+       .long   1610612736
+       .long   3162510535
+       .long   165911977
+       .long   1068713865
+       .long   0
+       .long   1070596096
+       .long   1261158782
+       .long   1072579178
+       .long   2147483648
+       .long   1015711544
+       .long   1348311045
+       .long   1068518770
+       .long   0
+       .long   1070596096
+       .long   3964199186
+       .long   1072587400
+       .long   3758096384
+       .long   3160501078
+       .long   386665102
+       .long   1068146822
+       .long   0
+       .long   1070596096
+       .long   2873938189
+       .long   1072595323
+       .long   1610612736
+       .long   3162311422
+       .long   1991047213
+       .long   1067753521
+       .long   0
+       .long   1070596096
+       .long   1455828442
+       .long   1072602945
+       .long   3758096384
+       .long   1015505073
+       .long   4107121629
+       .long   1067267139
+       .long   0
+       .long   1070596096
+       .long   3370060660
+       .long   1072610264
+       .long   1610612736
+       .long   1014787212
+       .long   723478390
+       .long   1066474790
+       .long   0
+       .long   1070596096
+       .long   3882371427
+       .long   1072617280
+       .long   2147483648
+       .long   1014923975
+       .long   2382326656
+       .long   1064562179
+       .long   0
+       .long   1070596096
+       .long   2749658050
+       .long   1072623992
+       .long   1610612736
+       .long   1015427338
+       .long   2614369450
+       .long   3212624080
+       .long   0
+       .long   1070596096
+       .long   4220661975
+       .long   1072630398
+       .long   3221225472
+       .long   1014312058
+       .long   3587565429
+       .long   3214108032
+       .long   0
+       .long   1070596096
+       .long   4151720666
+       .long   1072636498
+       .long   0
+       .long   3162639544
+       .long   2886567144
+       .long   3214910444
+       .long   0
+       .long   1070596096
+       .long   2892293513
+       .long   1072642291
+       .long   2684354560
+       .long   3162340271
+       .long   1765797566
+       .long   3215324543
+       .long   0
+       .long   1070596096
+       .long   990588717
+       .long   1072647776
+       .long   3758096384
+       .long   3162041857
+       .long   240740309
+       .long   3215727903
+       .long   0
+       .long   1070596096
+       .long   3489094832
+       .long   1072652951
+       .long   536870912
+       .long   1014325783
+       .long   2034433221
+       .long   1068349287
+       .long   0
+       .long   1069547520
+       .long   2745245815
+       .long   1072657817
+       .long   3221225472
+       .long   1015566129
+       .long   304938777
+       .long   1067944017
+       .long   0
+       .long   1069547520
+       .long   4201728937
+       .long   1072662372
+       .long   1610612736
+       .long   1014674006
+       .long   3299146087
+       .long   1067537882
+       .long   0
+       .long   1069547520
+       .long   617154971
+       .long   1072666617
+       .long   3758096384
+       .long   3163433696
+       .long   1953696209
+       .long   1066811523
+       .long   0
+       .long   1069547520
+       .long   2131272983
+       .long   1072670549
+       .long   3221225472
+       .long   3163005096
+       .long   3987691371
+       .long   1065590540
+       .long   0
+       .long   1069547520
+       .long   1905645377
+       .long   1072674169
+       .long   1610612736
+       .long   1014087596
+       .long   718380601
+       .long   3211081269
+       .long   0
+       .long   1069547520
+       .long   1893834707
+       .long   1072677476
+       .long   1610612736
+       .long   1015147654
+       .long   3272206680
+       .long   3213771729
+       .long   0
+       .long   1069547520
+       .long   4251821691
+       .long   1072680469
+       .long   2147483648
+       .long   3161841007
+       .long   257503056
+       .long   3214647653
+       .long   0
+       .long   1069547520
+       .long   2748392742
+       .long   1072683149
+       .long   536870912
+       .long   3163061750
+       .long   711626851
+       .long   1066916672
+       .long   0
+       .long   1068498944
+       .long   4240268041
+       .long   1072685514
+       .long   536870912
+       .long   1013588963
+       .long   2523975598
+       .long   1065789700
+       .long   0
+       .long   1068498944
+       .long   2902558778
+       .long   1072687565
+       .long   3221225472
+       .long   1013260780
+       .long   3237733378
+       .long   3209908784
+       .long   0
+       .long   1068498944
+       .long   1703834029
+       .long   1072689301
+       .long   3758096384
+       .long   1015028364
+       .long   1003003824
+       .long   3213591144
+       .long   0
+       .long   1068498944
+       .long   3816385918
+       .long   1072690721
+       .long   536870912
+       .long   3161216956
+       .long   2896342633
+       .long   1064747819
+       .long   0
+       .long   1067450368
+       .long   4026464093
+       .long   1072691826
+       .long   3221225472
+       .long   3163075789
+       .long   561145352
+       .long   3212540584
+       .long   0
+       .long   1067450368
+       .long   1619315981
+       .long   1072692616
+       .long   1073741824
+       .long   3162584397
+       .long   210035182
+       .long   3211491512
+       .long   0
+       .long   1066401792
+       .long   379294427
+       .long   1072693090
+       .long   3221225472
+       .long   1015405987
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .type   __svml_dcos_data_internal_ha,@object
+       .size   __svml_dcos_data_internal_ha,17280
+       .align 64
+__svml_dcos_reduction_data_internal:
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   5
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   10
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   20
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   40
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   81
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   162
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   325
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   651
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1303
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2607
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   5215
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   10430
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   20860
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   41721
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   83443
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   166886
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   333772
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   667544
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1335088
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2670176
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   5340353
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   10680707
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   21361414
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   42722829
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   85445659
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   170891318
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   341782637
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   683565275
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1367130551
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2734261102
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1173554908
+       .long   1
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2347109817
+       .long   2
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   399252338
+       .long   5
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   798504676
+       .long   10
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1597009353
+       .long   20
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3194018707
+       .long   40
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2093070119
+       .long   81
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4186140238
+       .long   162
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4077313180
+       .long   325
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3859659065
+       .long   651
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3424350834
+       .long   1303
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2553734372
+       .long   2607
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   812501448
+       .long   5215
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1625002897
+       .long   10430
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3250005794
+       .long   20860
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2205044292
+       .long   41721
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   115121288
+       .long   83443
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   230242576
+       .long   166886
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   460485152
+       .long   333772
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   920970305
+       .long   667544
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1841940610
+       .long   1335088
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3683881221
+       .long   2670176
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3072795146
+       .long   5340353
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1850622997
+       .long   10680707
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3701245994
+       .long   21361414
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3107524692
+       .long   42722829
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1920082089
+       .long   85445659
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3840164178
+       .long   170891318
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3385361061
+       .long   341782637
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2475754826
+       .long   683565275
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   656542356
+       .long   1367130551
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1313084713
+       .long   2734261102
+       .long   0
+       .long   0
+       .long   1
+       .long   0
+       .long   2626169427
+       .long   1173554908
+       .long   0
+       .long   0
+       .long   2
+       .long   0
+       .long   957371559
+       .long   2347109817
+       .long   0
+       .long   0
+       .long   5
+       .long   0
+       .long   1914743119
+       .long   399252338
+       .long   0
+       .long   0
+       .long   10
+       .long   0
+       .long   3829486239
+       .long   798504676
+       .long   0
+       .long   0
+       .long   20
+       .long   0
+       .long   3364005183
+       .long   1597009353
+       .long   0
+       .long   0
+       .long   40
+       .long   0
+       .long   2433043071
+       .long   3194018707
+       .long   0
+       .long   0
+       .long   81
+       .long   0
+       .long   571118846
+       .long   2093070119
+       .long   0
+       .long   0
+       .long   162
+       .long   0
+       .long   1142237692
+       .long   4186140238
+       .long   0
+       .long   0
+       .long   325
+       .long   0
+       .long   2284475384
+       .long   4077313180
+       .long   0
+       .long   0
+       .long   651
+       .long   0
+       .long   273983472
+       .long   3859659065
+       .long   0
+       .long   0
+       .long   1303
+       .long   0
+       .long   547966945
+       .long   3424350834
+       .long   0
+       .long   0
+       .long   2607
+       .long   0
+       .long   1095933890
+       .long   2553734372
+       .long   0
+       .long   0
+       .long   5215
+       .long   0
+       .long   2191867780
+       .long   812501448
+       .long   0
+       .long   0
+       .long   10430
+       .long   0
+       .long   88768265
+       .long   1625002897
+       .long   0
+       .long   0
+       .long   20860
+       .long   0
+       .long   177536531
+       .long   3250005794
+       .long   0
+       .long   0
+       .long   41721
+       .long   0
+       .long   355073063
+       .long   2205044292
+       .long   0
+       .long   0
+       .long   83443
+       .long   0
+       .long   710146126
+       .long   115121288
+       .long   0
+       .long   0
+       .long   166886
+       .long   0
+       .long   1420292253
+       .long   230242576
+       .long   0
+       .long   0
+       .long   333772
+       .long   0
+       .long   2840584506
+       .long   460485152
+       .long   0
+       .long   0
+       .long   667544
+       .long   0
+       .long   1386201717
+       .long   920970305
+       .long   0
+       .long   0
+       .long   1335088
+       .long   0
+       .long   2772403434
+       .long   1841940610
+       .long   0
+       .long   0
+       .long   2670176
+       .long   0
+       .long   1249839573
+       .long   3683881221
+       .long   0
+       .long   0
+       .long   5340353
+       .long   0
+       .long   2499679147
+       .long   3072795146
+       .long   0
+       .long   0
+       .long   10680707
+       .long   0
+       .long   704390999
+       .long   1850622997
+       .long   0
+       .long   0
+       .long   21361414
+       .long   0
+       .long   1408781999
+       .long   3701245994
+       .long   0
+       .long   0
+       .long   42722829
+       .long   0
+       .long   2817563999
+       .long   3107524692
+       .long   0
+       .long   0
+       .long   85445659
+       .long   0
+       .long   1340160702
+       .long   1920082089
+       .long   0
+       .long   0
+       .long   170891318
+       .long   0
+       .long   2680321405
+       .long   3840164178
+       .long   0
+       .long   0
+       .long   341782637
+       .long   0
+       .long   1065675514
+       .long   3385361061
+       .long   0
+       .long   0
+       .long   683565275
+       .long   0
+       .long   2131351028
+       .long   2475754826
+       .long   0
+       .long   0
+       .long   1367130551
+       .long   0
+       .long   4262702056
+       .long   656542356
+       .long   0
+       .long   0
+       .long   2734261102
+       .long   0
+       .long   4230436817
+       .long   1313084713
+       .long   0
+       .long   0
+       .long   1173554908
+       .long   1
+       .long   4165906339
+       .long   2626169427
+       .long   0
+       .long   0
+       .long   2347109817
+       .long   2
+       .long   4036845383
+       .long   957371559
+       .long   0
+       .long   0
+       .long   399252338
+       .long   5
+       .long   3778723471
+       .long   1914743119
+       .long   0
+       .long   0
+       .long   798504676
+       .long   10
+       .long   3262479647
+       .long   3829486239
+       .long   0
+       .long   0
+       .long   1597009353
+       .long   20
+       .long   2229991998
+       .long   3364005183
+       .long   0
+       .long   0
+       .long   3194018707
+       .long   40
+       .long   165016701
+       .long   2433043071
+       .long   0
+       .long   0
+       .long   2093070119
+       .long   81
+       .long   330033402
+       .long   571118846
+       .long   0
+       .long   0
+       .long   4186140238
+       .long   162
+       .long   660066805
+       .long   1142237692
+       .long   0
+       .long   0
+       .long   4077313180
+       .long   325
+       .long   1320133610
+       .long   2284475384
+       .long   0
+       .long   0
+       .long   3859659065
+       .long   651
+       .long   2640267220
+       .long   273983472
+       .long   0
+       .long   0
+       .long   3424350834
+       .long   1303
+       .long   985567145
+       .long   547966945
+       .long   0
+       .long   0
+       .long   2553734372
+       .long   2607
+       .long   1971134291
+       .long   1095933890
+       .long   0
+       .long   0
+       .long   812501448
+       .long   5215
+       .long   3942268582
+       .long   2191867780
+       .long   0
+       .long   0
+       .long   1625002897
+       .long   10430
+       .long   3589569869
+       .long   88768265
+       .long   0
+       .long   0
+       .long   3250005794
+       .long   20860
+       .long   2884172442
+       .long   177536531
+       .long   0
+       .long   0
+       .long   2205044292
+       .long   41721
+       .long   1473377588
+       .long   355073063
+       .long   0
+       .long   0
+       .long   115121288
+       .long   83443
+       .long   2946755177
+       .long   710146126
+       .long   0
+       .long   0
+       .long   230242576
+       .long   166886
+       .long   1598543059
+       .long   1420292253
+       .long   0
+       .long   0
+       .long   460485152
+       .long   333772
+       .long   3197086118
+       .long   2840584506
+       .long   0
+       .long   0
+       .long   920970305
+       .long   667544
+       .long   2099204941
+       .long   1386201717
+       .long   0
+       .long   0
+       .long   1841940610
+       .long   1335088
+       .long   4198409883
+       .long   2772403434
+       .long   0
+       .long   0
+       .long   3683881221
+       .long   2670176
+       .long   4101852471
+       .long   1249839573
+       .long   0
+       .long   0
+       .long   3072795146
+       .long   5340353
+       .long   3908737646
+       .long   2499679147
+       .long   0
+       .long   0
+       .long   1850622997
+       .long   10680707
+       .long   3522507997
+       .long   704390999
+       .long   0
+       .long   0
+       .long   3701245994
+       .long   21361414
+       .long   2750048699
+       .long   1408781999
+       .long   0
+       .long   0
+       .long   3107524692
+       .long   42722829
+       .long   1205130103
+       .long   2817563999
+       .long   0
+       .long   0
+       .long   1920082089
+       .long   85445659
+       .long   2410260206
+       .long   1340160702
+       .long   0
+       .long   0
+       .long   3840164178
+       .long   170891318
+       .long   525553116
+       .long   2680321405
+       .long   0
+       .long   0
+       .long   3385361061
+       .long   341782637
+       .long   1051106232
+       .long   1065675514
+       .long   0
+       .long   0
+       .long   2475754826
+       .long   683565275
+       .long   2102212464
+       .long   2131351028
+       .long   0
+       .long   0
+       .long   656542356
+       .long   1367130551
+       .long   4204424928
+       .long   4262702056
+       .long   0
+       .long   0
+       .long   1313084713
+       .long   2734261102
+       .long   4113882560
+       .long   4230436817
+       .long   1
+       .long   0
+       .long   2626169427
+       .long   1173554908
+       .long   3932797825
+       .long   4165906339
+       .long   2
+       .long   0
+       .long   957371559
+       .long   2347109817
+       .long   3570628355
+       .long   4036845383
+       .long   5
+       .long   0
+       .long   1914743119
+       .long   399252338
+       .long   2846289414
+       .long   3778723471
+       .long   10
+       .long   0
+       .long   3829486239
+       .long   798504676
+       .long   1397611533
+       .long   3262479647
+       .long   20
+       .long   0
+       .long   3364005183
+       .long   1597009353
+       .long   2795223067
+       .long   2229991998
+       .long   40
+       .long   0
+       .long   2433043071
+       .long   3194018707
+       .long   1295478838
+       .long   165016701
+       .long   81
+       .long   0
+       .long   571118846
+       .long   2093070119
+       .long   2590957677
+       .long   330033402
+       .long   162
+       .long   0
+       .long   1142237692
+       .long   4186140238
+       .long   886948059
+       .long   660066805
+       .long   325
+       .long   0
+       .long   2284475384
+       .long   4077313180
+       .long   1773896118
+       .long   1320133610
+       .long   651
+       .long   0
+       .long   273983472
+       .long   3859659065
+       .long   3547792237
+       .long   2640267220
+       .long   1303
+       .long   0
+       .long   547966945
+       .long   3424350834
+       .long   2800617179
+       .long   985567145
+       .long   2607
+       .long   0
+       .long   1095933890
+       .long   2553734372
+       .long   1306267062
+       .long   1971134291
+       .long   5215
+       .long   0
+       .long   2191867780
+       .long   812501448
+       .long   2612534124
+       .long   3942268582
+       .long   10430
+       .long   0
+       .long   88768265
+       .long   1625002897
+       .long   930100952
+       .long   3589569869
+       .long   20860
+       .long   0
+       .long   177536531
+       .long   3250005794
+       .long   1860201905
+       .long   2884172442
+       .long   41721
+       .long   0
+       .long   355073063
+       .long   2205044292
+       .long   3720403810
+       .long   1473377588
+       .long   83443
+       .long   0
+       .long   710146126
+       .long   115121288
+       .long   3145840325
+       .long   2946755177
+       .long   166886
+       .long   0
+       .long   1420292253
+       .long   230242576
+       .long   1996713354
+       .long   1598543059
+       .long   333772
+       .long   0
+       .long   2840584506
+       .long   460485152
+       .long   3993426708
+       .long   3197086118
+       .long   667544
+       .long   0
+       .long   1386201717
+       .long   920970305
+       .long   3691886121
+       .long   2099204941
+       .long   1335088
+       .long   0
+       .long   2772403434
+       .long   1841940610
+       .long   3088804946
+       .long   4198409883
+       .long   2670176
+       .long   0
+       .long   1249839573
+       .long   3683881221
+       .long   1882642597
+       .long   4101852471
+       .long   5340353
+       .long   0
+       .long   2499679147
+       .long   3072795146
+       .long   3765285194
+       .long   3908737646
+       .long   10680707
+       .long   0
+       .long   704390999
+       .long   1850622997
+       .long   3235603093
+       .long   3522507997
+       .long   21361414
+       .long   0
+       .long   1408781999
+       .long   3701245994
+       .long   2176238891
+       .long   2750048699
+       .long   42722829
+       .long   0
+       .long   2817563999
+       .long   3107524692
+       .long   57510486
+       .long   1205130103
+       .long   85445659
+       .long   0
+       .long   1340160702
+       .long   1920082089
+       .long   115020972
+       .long   2410260206
+       .long   170891318
+       .long   0
+       .long   2680321405
+       .long   3840164178
+       .long   230041945
+       .long   525553116
+       .long   341782637
+       .long   0
+       .long   1065675514
+       .long   3385361061
+       .long   460083891
+       .long   1051106232
+       .long   683565275
+       .long   0
+       .long   2131351028
+       .long   2475754826
+       .long   920167782
+       .long   2102212464
+       .long   1367130551
+       .long   0
+       .long   4262702056
+       .long   656542356
+       .long   1840335564
+       .long   4204424928
+       .long   2734261102
+       .long   0
+       .long   4230436817
+       .long   1313084713
+       .long   3680671129
+       .long   4113882560
+       .long   1173554908
+       .long   1
+       .long   4165906339
+       .long   2626169427
+       .long   3066374962
+       .long   3932797825
+       .long   2347109817
+       .long   2
+       .long   4036845383
+       .long   957371559
+       .long   1837782628
+       .long   3570628355
+       .long   399252338
+       .long   5
+       .long   3778723471
+       .long   1914743119
+       .long   3675565257
+       .long   2846289414
+       .long   798504676
+       .long   10
+       .long   3262479647
+       .long   3829486239
+       .long   3056163219
+       .long   1397611533
+       .long   1597009353
+       .long   20
+       .long   2229991998
+       .long   3364005183
+       .long   1817359143
+       .long   2795223067
+       .long   3194018707
+       .long   40
+       .long   165016701
+       .long   2433043071
+       .long   3634718287
+       .long   1295478838
+       .long   2093070119
+       .long   81
+       .long   330033402
+       .long   571118846
+       .long   2974469278
+       .long   2590957677
+       .long   4186140238
+       .long   162
+       .long   660066805
+       .long   1142237692
+       .long   1653971260
+       .long   886948059
+       .long   4077313180
+       .long   325
+       .long   1320133610
+       .long   2284475384
+       .long   3307942520
+       .long   1773896118
+       .long   3859659065
+       .long   651
+       .long   2640267220
+       .long   273983472
+       .long   2320917745
+       .long   3547792237
+       .long   3424350834
+       .long   1303
+       .long   985567145
+       .long   547966945
+       .long   346868194
+       .long   2800617179
+       .long   2553734372
+       .long   2607
+       .long   1971134291
+       .long   1095933890
+       .long   693736388
+       .long   1306267062
+       .long   812501448
+       .long   5215
+       .long   3942268582
+       .long   2191867780
+       .long   1387472776
+       .long   2612534124
+       .long   1625002897
+       .long   10430
+       .long   3589569869
+       .long   88768265
+       .long   2774945552
+       .long   930100952
+       .long   3250005794
+       .long   20860
+       .long   2884172442
+       .long   177536531
+       .long   1254923809
+       .long   1860201905
+       .long   2205044292
+       .long   41721
+       .long   1473377588
+       .long   355073063
+       .long   2509847619
+       .long   3720403810
+       .long   115121288
+       .long   83443
+       .long   2946755177
+       .long   710146126
+       .long   724727943
+       .long   3145840325
+       .long   230242576
+       .long   166886
+       .long   1598543059
+       .long   1420292253
+       .long   1449455886
+       .long   1996713354
+       .long   460485152
+       .long   333772
+       .long   3197086118
+       .long   2840584506
+       .long   2898911772
+       .long   3993426708
+       .long   920970305
+       .long   667544
+       .long   2099204941
+       .long   1386201717
+       .long   1502856249
+       .long   3691886121
+       .long   1841940610
+       .long   1335088
+       .long   4198409883
+       .long   2772403434
+       .long   3005712498
+       .long   3088804946
+       .long   3683881221
+       .long   2670176
+       .long   4101852471
+       .long   1249839573
+       .long   1716457700
+       .long   1882642597
+       .long   3072795146
+       .long   5340353
+       .long   3908737646
+       .long   2499679147
+       .long   3432915400
+       .long   3765285194
+       .long   1850622997
+       .long   10680707
+       .long   3522507997
+       .long   704390999
+       .long   2570863504
+       .long   3235603093
+       .long   3701245994
+       .long   21361414
+       .long   2750048699
+       .long   1408781999
+       .long   846759712
+       .long   2176238891
+       .long   3107524692
+       .long   42722829
+       .long   1205130103
+       .long   2817563999
+       .long   1693519425
+       .long   57510486
+       .long   1920082089
+       .long   85445659
+       .long   2410260206
+       .long   1340160702
+       .long   3387038850
+       .long   115020972
+       .long   3840164178
+       .long   170891318
+       .long   525553116
+       .long   2680321405
+       .long   2479110404
+       .long   230041945
+       .long   3385361061
+       .long   341782637
+       .long   1051106232
+       .long   1065675514
+       .long   663253512
+       .long   460083891
+       .long   2475754826
+       .long   683565275
+       .long   2102212464
+       .long   2131351028
+       .long   1326507024
+       .long   920167782
+       .long   656542356
+       .long   1367130551
+       .long   4204424928
+       .long   4262702056
+       .long   2653014048
+       .long   1840335564
+       .long   1313084713
+       .long   2734261102
+       .long   4113882560
+       .long   4230436817
+       .long   1011060801
+       .long   3680671129
+       .long   2626169427
+       .long   1173554908
+       .long   3932797825
+       .long   4165906339
+       .long   2022121603
+       .long   3066374962
+       .long   957371559
+       .long   2347109817
+       .long   3570628355
+       .long   4036845383
+       .long   4044243207
+       .long   1837782628
+       .long   1914743119
+       .long   399252338
+       .long   2846289414
+       .long   3778723471
+       .long   3793519119
+       .long   3675565257
+       .long   3829486239
+       .long   798504676
+       .long   1397611533
+       .long   3262479647
+       .long   3292070943
+       .long   3056163219
+       .long   3364005183
+       .long   1597009353
+       .long   2795223067
+       .long   2229991998
+       .long   2289174591
+       .long   1817359143
+       .long   2433043071
+       .long   3194018707
+       .long   1295478838
+       .long   165016701
+       .long   283381887
+       .long   3634718287
+       .long   571118846
+       .long   2093070119
+       .long   2590957677
+       .long   330033402
+       .long   566763775
+       .long   2974469278
+       .long   1142237692
+       .long   4186140238
+       .long   886948059
+       .long   660066805
+       .long   1133527550
+       .long   1653971260
+       .long   2284475384
+       .long   4077313180
+       .long   1773896118
+       .long   1320133610
+       .long   2267055100
+       .long   3307942520
+       .long   273983472
+       .long   3859659065
+       .long   3547792237
+       .long   2640267220
+       .long   239142905
+       .long   2320917745
+       .long   547966945
+       .long   3424350834
+       .long   2800617179
+       .long   985567145
+       .long   478285810
+       .long   346868194
+       .long   1095933890
+       .long   2553734372
+       .long   1306267062
+       .long   1971134291
+       .long   956571621
+       .long   693736388
+       .long   2191867780
+       .long   812501448
+       .long   2612534124
+       .long   3942268582
+       .long   1913143242
+       .long   1387472776
+       .long   88768265
+       .long   1625002897
+       .long   930100952
+       .long   3589569869
+       .long   3826286484
+       .long   2774945552
+       .long   177536531
+       .long   3250005794
+       .long   1860201905
+       .long   2884172442
+       .long   3357605672
+       .long   1254923809
+       .long   355073063
+       .long   2205044292
+       .long   3720403810
+       .long   1473377588
+       .long   2420244049
+       .long   2509847619
+       .long   710146126
+       .long   115121288
+       .long   3145840325
+       .long   2946755177
+       .long   545520802
+       .long   724727943
+       .long   1420292253
+       .long   230242576
+       .long   1996713354
+       .long   1598543059
+       .long   1091041605
+       .long   1449455886
+       .long   2840584506
+       .long   460485152
+       .long   3993426708
+       .long   3197086118
+       .long   2182083211
+       .long   2898911772
+       .long   1386201717
+       .long   920970305
+       .long   3691886121
+       .long   2099204941
+       .long   69199126
+       .long   1502856249
+       .long   2772403434
+       .long   1841940610
+       .long   3088804946
+       .long   4198409883
+       .long   138398252
+       .long   3005712498
+       .long   1249839573
+       .long   3683881221
+       .long   1882642597
+       .long   4101852471
+       .long   276796504
+       .long   1716457700
+       .long   2499679147
+       .long   3072795146
+       .long   3765285194
+       .long   3908737646
+       .long   553593009
+       .long   3432915400
+       .long   704390999
+       .long   1850622997
+       .long   3235603093
+       .long   3522507997
+       .long   1107186019
+       .long   2570863504
+       .long   1408781999
+       .long   3701245994
+       .long   2176238891
+       .long   2750048699
+       .long   2214372039
+       .long   846759712
+       .long   2817563999
+       .long   3107524692
+       .long   57510486
+       .long   1205130103
+       .long   133776782
+       .long   1693519425
+       .long   1340160702
+       .long   1920082089
+       .long   115020972
+       .long   2410260206
+       .long   267553565
+       .long   3387038850
+       .long   2680321405
+       .long   3840164178
+       .long   230041945
+       .long   525553116
+       .long   535107130
+       .long   2479110404
+       .long   1065675514
+       .long   3385361061
+       .long   460083891
+       .long   1051106232
+       .long   1070214261
+       .long   663253512
+       .long   2131351028
+       .long   2475754826
+       .long   920167782
+       .long   2102212464
+       .long   2140428522
+       .long   1326507024
+       .long   4262702056
+       .long   656542356
+       .long   1840335564
+       .long   4204424928
+       .long   4280857045
+       .long   2653014048
+       .long   4230436817
+       .long   1313084713
+       .long   3680671129
+       .long   4113882560
+       .long   4266746795
+       .long   1011060801
+       .long   4165906339
+       .long   2626169427
+       .long   3066374962
+       .long   3932797825
+       .long   4238526295
+       .long   2022121603
+       .long   4036845383
+       .long   957371559
+       .long   1837782628
+       .long   3570628355
+       .long   4182085295
+       .long   4044243207
+       .long   3778723471
+       .long   1914743119
+       .long   3675565257
+       .long   2846289414
+       .long   4069203294
+       .long   3793519119
+       .long   3262479647
+       .long   3829486239
+       .long   3056163219
+       .long   1397611533
+       .long   3843439293
+       .long   3292070943
+       .long   2229991998
+       .long   3364005183
+       .long   1817359143
+       .long   2795223067
+       .long   3391911291
+       .long   2289174591
+       .long   165016701
+       .long   2433043071
+       .long   3634718287
+       .long   1295478838
+       .long   2488855287
+       .long   283381887
+       .long   330033402
+       .long   571118846
+       .long   2974469278
+       .long   2590957677
+       .long   682743279
+       .long   566763775
+       .long   660066805
+       .long   1142237692
+       .long   1653971260
+       .long   886948059
+       .long   1365486558
+       .long   1133527550
+       .long   1320133610
+       .long   2284475384
+       .long   3307942520
+       .long   1773896118
+       .long   2730973117
+       .long   2267055100
+       .long   2640267220
+       .long   273983472
+       .long   2320917745
+       .long   3547792237
+       .long   1166978938
+       .long   239142905
+       .long   985567145
+       .long   547966945
+       .long   346868194
+       .long   2800617179
+       .long   2333957877
+       .long   478285810
+       .long   1971134291
+       .long   1095933890
+       .long   693736388
+       .long   1306267062
+       .long   372948459
+       .long   956571621
+       .long   3942268582
+       .long   2191867780
+       .long   1387472776
+       .long   2612534124
+       .long   745896919
+       .long   1913143242
+       .long   3589569869
+       .long   88768265
+       .long   2774945552
+       .long   930100952
+       .long   1491793838
+       .long   3826286484
+       .long   2884172442
+       .long   177536531
+       .long   1254923809
+       .long   1860201905
+       .long   2983587677
+       .long   3357605672
+       .long   1473377588
+       .long   355073063
+       .long   2509847619
+       .long   3720403810
+       .long   1672208059
+       .long   2420244049
+       .long   2946755177
+       .long   710146126
+       .long   724727943
+       .long   3145840325
+       .long   3344416119
+       .long   545520802
+       .long   1598543059
+       .long   1420292253
+       .long   1449455886
+       .long   1996713354
+       .long   2393864943
+       .long   1091041605
+       .long   3197086118
+       .long   2840584506
+       .long   2898911772
+       .long   3993426708
+       .long   492762590
+       .long   2182083211
+       .long   2099204941
+       .long   1386201717
+       .long   1502856249
+       .long   3691886121
+       .long   985525180
+       .long   69199126
+       .long   4198409883
+       .long   2772403434
+       .long   3005712498
+       .long   3088804946
+       .long   1971050360
+       .long   138398252
+       .long   4101852471
+       .long   1249839573
+       .long   1716457700
+       .long   1882642597
+       .long   3942100721
+       .long   276796504
+       .long   3908737646
+       .long   2499679147
+       .long   3432915400
+       .long   3765285194
+       .long   3589234146
+       .long   553593009
+       .long   3522507997
+       .long   704390999
+       .long   2570863504
+       .long   3235603093
+       .long   2883500997
+       .long   1107186019
+       .long   2750048699
+       .long   1408781999
+       .long   846759712
+       .long   2176238891
+       .long   1472034698
+       .long   2214372039
+       .long   1205130103
+       .long   2817563999
+       .long   1693519425
+       .long   57510486
+       .long   2944069397
+       .long   133776782
+       .long   2410260206
+       .long   1340160702
+       .long   3387038850
+       .long   115020972
+       .long   1593171499
+       .long   267553565
+       .long   525553116
+       .long   2680321405
+       .long   2479110404
+       .long   230041945
+       .long   3186342998
+       .long   535107130
+       .long   1051106232
+       .long   1065675514
+       .long   663253512
+       .long   460083891
+       .long   2077718700
+       .long   1070214261
+       .long   2102212464
+       .long   2131351028
+       .long   1326507024
+       .long   920167782
+       .long   4155437400
+       .long   2140428522
+       .long   4204424928
+       .long   4262702056
+       .long   2653014048
+       .long   1840335564
+       .long   4015907504
+       .long   4280857045
+       .long   4113882560
+       .long   4230436817
+       .long   1011060801
+       .long   3680671129
+       .long   3736847713
+       .long   4266746795
+       .long   3932797825
+       .long   4165906339
+       .long   2022121603
+       .long   3066374962
+       .long   3178728131
+       .long   4238526295
+       .long   3570628355
+       .long   4036845383
+       .long   4044243207
+       .long   1837782628
+       .long   2062488966
+       .long   4182085295
+       .long   2846289414
+       .long   3778723471
+       .long   3793519119
+       .long   3675565257
+       .long   4124977933
+       .long   4069203294
+       .long   1397611533
+       .long   3262479647
+       .long   3292070943
+       .long   3056163219
+       .long   3954988571
+       .long   3843439293
+       .long   2795223067
+       .long   2229991998
+       .long   2289174591
+       .long   1817359143
+       .long   3615009846
+       .long   3391911291
+       .long   1295478838
+       .long   165016701
+       .long   283381887
+       .long   3634718287
+       .long   2935052397
+       .long   2488855287
+       .long   2590957677
+       .long   330033402
+       .long   566763775
+       .long   2974469278
+       .long   1575137499
+       .long   682743279
+       .long   886948059
+       .long   660066805
+       .long   1133527550
+       .long   1653971260
+       .long   3150274999
+       .long   1365486558
+       .long   1773896118
+       .long   1320133610
+       .long   2267055100
+       .long   3307942520
+       .long   2005582702
+       .long   2730973117
+       .long   3547792237
+       .long   2640267220
+       .long   239142905
+       .long   2320917745
+       .long   4011165404
+       .long   1166978938
+       .long   2800617179
+       .long   985567145
+       .long   478285810
+       .long   346868194
+       .long   3727363513
+       .long   2333957877
+       .long   1306267062
+       .long   1971134291
+       .long   956571621
+       .long   693736388
+       .long   3159759730
+       .long   372948459
+       .long   2612534124
+       .long   3942268582
+       .long   1913143242
+       .long   1387472776
+       .long   2024552164
+       .long   745896919
+       .long   930100952
+       .long   3589569869
+       .long   3826286484
+       .long   2774945552
+       .long   4049104329
+       .long   1491793838
+       .long   1860201905
+       .long   2884172442
+       .long   3357605672
+       .long   1254923809
+       .long   3803241362
+       .long   2983587677
+       .long   3720403810
+       .long   1473377588
+       .long   2420244049
+       .long   2509847619
+       .long   3311515428
+       .long   1672208059
+       .long   3145840325
+       .long   2946755177
+       .long   545520802
+       .long   724727943
+       .long   2328063560
+       .long   3344416119
+       .long   1996713354
+       .long   1598543059
+       .long   1091041605
+       .long   1449455886
+       .long   361159825
+       .long   2393864943
+       .long   3993426708
+       .long   3197086118
+       .long   2182083211
+       .long   2898911772
+       .long   722319651
+       .long   492762590
+       .long   3691886121
+       .long   2099204941
+       .long   69199126
+       .long   1502856249
+       .long   1444639302
+       .long   985525180
+       .long   3088804946
+       .long   4198409883
+       .long   138398252
+       .long   3005712498
+       .long   2889278605
+       .long   1971050360
+       .long   1882642597
+       .long   4101852471
+       .long   276796504
+       .long   1716457700
+       .long   1483589915
+       .long   3942100721
+       .long   3765285194
+       .long   3908737646
+       .long   553593009
+       .long   3432915400
+       .long   2967179831
+       .long   3589234146
+       .long   3235603093
+       .long   3522507997
+       .long   1107186019
+       .long   2570863504
+       .long   1639392366
+       .long   2883500997
+       .long   2176238891
+       .long   2750048699
+       .long   2214372039
+       .long   846759712
+       .long   3278784732
+       .long   1472034698
+       .long   57510486
+       .long   1205130103
+       .long   133776782
+       .long   1693519425
+       .long   2262602168
+       .long   2944069397
+       .long   115020972
+       .long   2410260206
+       .long   267553565
+       .long   3387038850
+       .long   230237041
+       .long   1593171499
+       .long   230041945
+       .long   525553116
+       .long   535107130
+       .long   2479110404
+       .long   460474083
+       .long   3186342998
+       .long   460083891
+       .long   1051106232
+       .long   1070214261
+       .long   663253512
+       .long   920948167
+       .long   2077718700
+       .long   920167782
+       .long   2102212464
+       .long   2140428522
+       .long   1326507024
+       .long   1841896334
+       .long   4155437400
+       .long   1840335564
+       .long   4204424928
+       .long   4280857045
+       .long   2653014048
+       .long   3683792669
+       .long   4015907504
+       .long   3680671129
+       .long   4113882560
+       .long   4266746795
+       .long   1011060801
+       .long   3072618042
+       .long   3736847713
+       .long   3066374962
+       .long   3932797825
+       .long   4238526295
+       .long   2022121603
+       .long   1850268788
+       .long   3178728131
+       .long   1837782628
+       .long   3570628355
+       .long   4182085295
+       .long   4044243207
+       .long   3700537577
+       .long   2062488966
+       .long   3675565257
+       .long   2846289414
+       .long   4069203294
+       .long   3793519119
+       .long   3106107858
+       .long   4124977933
+       .long   3056163219
+       .long   1397611533
+       .long   3843439293
+       .long   3292070943
+       .long   1917248420
+       .long   3954988571
+       .long   1817359143
+       .long   2795223067
+       .long   3391911291
+       .long   2289174591
+       .long   3834496840
+       .long   3615009846
+       .long   3634718287
+       .long   1295478838
+       .long   2488855287
+       .long   283381887
+       .long   3374026384
+       .long   2935052397
+       .long   2974469278
+       .long   2590957677
+       .long   682743279
+       .long   566763775
+       .long   2453085473
+       .long   1575137499
+       .long   1653971260
+       .long   886948059
+       .long   1365486558
+       .long   1133527550
+       .long   611203650
+       .long   3150274999
+       .long   3307942520
+       .long   1773896118
+       .long   2730973117
+       .long   2267055100
+       .long   1222407300
+       .long   2005582702
+       .long   2320917745
+       .long   3547792237
+       .long   1166978938
+       .long   239142905
+       .long   2444814601
+       .long   4011165404
+       .long   346868194
+       .long   2800617179
+       .long   2333957877
+       .long   478285810
+       .long   594661906
+       .long   3727363513
+       .long   693736388
+       .long   1306267062
+       .long   372948459
+       .long   956571621
+       .long   1189323812
+       .long   3159759730
+       .long   1387472776
+       .long   2612534124
+       .long   745896919
+       .long   1913143242
+       .long   2378647625
+       .long   2024552164
+       .long   2774945552
+       .long   930100952
+       .long   1491793838
+       .long   3826286484
+       .long   462327955
+       .long   4049104329
+       .long   1254923809
+       .long   1860201905
+       .long   2983587677
+       .long   3357605672
+       .long   924655910
+       .long   3803241362
+       .long   2509847619
+       .long   3720403810
+       .long   1672208059
+       .long   2420244049
+       .long   1849311821
+       .long   3311515428
+       .long   724727943
+       .long   3145840325
+       .long   3344416119
+       .long   545520802
+       .long   3698623643
+       .long   2328063560
+       .long   1449455886
+       .long   1996713354
+       .long   2393864943
+       .long   1091041605
+       .long   3102279991
+       .long   361159825
+       .long   2898911772
+       .long   3993426708
+       .long   492762590
+       .long   2182083211
+       .long   1909592686
+       .long   722319651
+       .long   1502856249
+       .long   3691886121
+       .long   985525180
+       .long   69199126
+       .long   3819185373
+       .long   1444639302
+       .long   3005712498
+       .long   3088804946
+       .long   1971050360
+       .long   138398252
+       .long   3343403450
+       .long   2889278605
+       .long   1716457700
+       .long   1882642597
+       .long   3942100721
+       .long   276796504
+       .long   2391839604
+       .long   1483589915
+       .long   3432915400
+       .long   3765285194
+       .long   3589234146
+       .long   553593009
+       .long   488711913
+       .long   2967179831
+       .long   2570863504
+       .long   3235603093
+       .long   2883500997
+       .long   1107186019
+       .long   977423826
+       .long   1639392366
+       .long   846759712
+       .long   2176238891
+       .long   1472034698
+       .long   2214372039
+       .long   1954847653
+       .long   3278784732
+       .long   1693519425
+       .long   57510486
+       .long   2944069397
+       .long   133776782
+       .long   3909695307
+       .long   2262602168
+       .long   3387038850
+       .long   115020972
+       .long   1593171499
+       .long   267553565
+       .long   3524423319
+       .long   230237041
+       .long   2479110404
+       .long   230041945
+       .long   3186342998
+       .long   535107130
+       .long   2753879342
+       .long   460474083
+       .long   663253512
+       .long   460083891
+       .long   2077718700
+       .long   1070214261
+       .long   1212791388
+       .long   920948167
+       .long   1326507024
+       .long   920167782
+       .long   4155437400
+       .long   2140428522
+       .long   2425582776
+       .long   1841896334
+       .long   2653014048
+       .long   1840335564
+       .long   4015907504
+       .long   4280857045
+       .long   556198256
+       .long   3683792669
+       .long   1011060801
+       .long   3680671129
+       .long   3736847713
+       .long   4266746795
+       .long   1112396512
+       .long   3072618042
+       .long   2022121603
+       .long   3066374962
+       .long   3178728131
+       .long   4238526295
+       .long   2224793024
+       .long   1850268788
+       .long   4044243207
+       .long   1837782628
+       .long   2062488966
+       .long   4182085295
+       .long   154618752
+       .long   3700537577
+       .long   3793519119
+       .long   3675565257
+       .long   4124977933
+       .long   4069203294
+       .long   309237504
+       .long   3106107858
+       .long   3292070943
+       .long   3056163219
+       .long   3954988571
+       .long   3843439293
+       .long   618475008
+       .long   1917248420
+       .long   2289174591
+       .long   1817359143
+       .long   3615009846
+       .long   3391911291
+       .long   1236950016
+       .long   3834496840
+       .long   283381887
+       .long   3634718287
+       .long   2935052397
+       .long   2488855287
+       .long   2473900033
+       .long   3374026384
+       .long   566763775
+       .long   2974469278
+       .long   1575137499
+       .long   682743279
+       .long   652832771
+       .long   2453085473
+       .long   1133527550
+       .long   1653971260
+       .long   3150274999
+       .long   1365486558
+       .long   1305665542
+       .long   611203650
+       .long   2267055100
+       .long   3307942520
+       .long   2005582702
+       .long   2730973117
+       .long   2611331084
+       .long   1222407300
+       .long   239142905
+       .long   2320917745
+       .long   4011165404
+       .long   1166978938
+       .long   927694873
+       .long   2444814601
+       .long   478285810
+       .long   346868194
+       .long   3727363513
+       .long   2333957877
+       .long   1855389746
+       .long   594661906
+       .long   956571621
+       .long   693736388
+       .long   3159759730
+       .long   372948459
+       .long   3710779492
+       .long   1189323812
+       .long   1913143242
+       .long   1387472776
+       .long   2024552164
+       .long   745896919
+       .long   3126591689
+       .long   2378647625
+       .long   3826286484
+       .long   2774945552
+       .long   4049104329
+       .long   1491793838
+       .long   1958216082
+       .long   462327955
+       .long   3357605672
+       .long   1254923809
+       .long   3803241362
+       .long   2983587677
+       .long   3916432164
+       .long   924655910
+       .long   2420244049
+       .long   2509847619
+       .long   3311515428
+       .long   1672208059
+       .long   3537897033
+       .long   1849311821
+       .long   545520802
+       .long   724727943
+       .long   2328063560
+       .long   3344416119
+       .long   2780826770
+       .long   3698623643
+       .long   1091041605
+       .long   1449455886
+       .long   361159825
+       .long   2393864943
+       .long   1266686244
+       .long   3102279991
+       .long   2182083211
+       .long   2898911772
+       .long   722319651
+       .long   492762590
+       .long   2533372489
+       .long   1909592686
+       .long   69199126
+       .long   1502856249
+       .long   1444639302
+       .long   985525180
+       .long   771777682
+       .long   3819185373
+       .long   138398252
+       .long   3005712498
+       .long   2889278605
+       .long   1971050360
+       .long   1543555365
+       .long   3343403450
+       .long   276796504
+       .long   1716457700
+       .long   1483589915
+       .long   3942100721
+       .long   3087110731
+       .long   2391839604
+       .long   553593009
+       .long   3432915400
+       .long   2967179831
+       .long   3589234146
+       .long   1879254167
+       .long   488711913
+       .long   1107186019
+       .long   2570863504
+       .long   1639392366
+       .long   2883500997
+       .long   3758508334
+       .long   977423826
+       .long   2214372039
+       .long   846759712
+       .long   3278784732
+       .long   1472034698
+       .long   3222049373
+       .long   1954847653
+       .long   133776782
+       .long   1693519425
+       .long   2262602168
+       .long   2944069397
+       .long   2149131451
+       .long   3909695307
+       .long   267553565
+       .long   3387038850
+       .long   230237041
+       .long   1593171499
+       .long   3295607
+       .long   3524423319
+       .long   535107130
+       .long   2479110404
+       .long   460474083
+       .long   3186342998
+       .long   6591214
+       .long   2753879342
+       .long   1070214261
+       .long   663253512
+       .long   920948167
+       .long   2077718700
+       .long   13182429
+       .long   1212791388
+       .long   2140428522
+       .long   1326507024
+       .long   1841896334
+       .long   4155437400
+       .long   26364858
+       .long   2425582776
+       .long   4280857045
+       .long   2653014048
+       .long   3683792669
+       .long   4015907504
+       .long   52729717
+       .long   556198256
+       .long   4266746795
+       .long   1011060801
+       .long   3072618042
+       .long   3736847713
+       .long   105459434
+       .long   1112396512
+       .long   4238526295
+       .long   2022121603
+       .long   1850268788
+       .long   3178728131
+       .long   210918868
+       .long   2224793024
+       .long   4182085295
+       .long   4044243207
+       .long   3700537577
+       .long   2062488966
+       .long   421837736
+       .long   154618752
+       .long   4069203294
+       .long   3793519119
+       .long   3106107858
+       .long   4124977933
+       .long   843675472
+       .long   309237504
+       .long   3843439293
+       .long   3292070943
+       .long   1917248420
+       .long   3954988571
+       .long   1687350944
+       .long   618475008
+       .long   3391911291
+       .long   2289174591
+       .long   3834496840
+       .long   3615009846
+       .long   3374701889
+       .long   1236950016
+       .long   2488855287
+       .long   283381887
+       .long   3374026384
+       .long   2935052397
+       .long   2454436482
+       .long   2473900033
+       .long   682743279
+       .long   566763775
+       .long   2453085473
+       .long   1575137499
+       .long   613905668
+       .long   652832771
+       .long   1365486558
+       .long   1133527550
+       .long   611203650
+       .long   3150274999
+       .long   1227811337
+       .long   1305665542
+       .long   2730973117
+       .long   2267055100
+       .long   1222407300
+       .long   2005582702
+       .long   2455622675
+       .long   2611331084
+       .long   1166978938
+       .long   239142905
+       .long   2444814601
+       .long   4011165404
+       .long   616278055
+       .long   927694873
+       .long   2333957877
+       .long   478285810
+       .long   594661906
+       .long   3727363513
+       .long   1232556110
+       .long   1855389746
+       .long   372948459
+       .long   956571621
+       .long   1189323812
+       .long   3159759730
+       .long   2465112221
+       .long   3710779492
+       .long   745896919
+       .long   1913143242
+       .long   2378647625
+       .long   2024552164
+       .long   635257146
+       .long   3126591689
+       .long   1491793838
+       .long   3826286484
+       .long   462327955
+       .long   4049104329
+       .long   1270514292
+       .long   1958216082
+       .long   2983587677
+       .long   3357605672
+       .long   924655910
+       .long   3803241362
+       .long   2541028584
+       .long   3916432164
+       .long   1672208059
+       .long   2420244049
+       .long   1849311821
+       .long   3311515428
+       .long   787089873
+       .long   3537897033
+       .long   3344416119
+       .long   545520802
+       .long   3698623643
+       .long   2328063560
+       .long   1574179747
+       .long   2780826770
+       .long   2393864943
+       .long   1091041605
+       .long   3102279991
+       .long   361159825
+       .long   3148359494
+       .long   1266686244
+       .long   492762590
+       .long   2182083211
+       .long   1909592686
+       .long   722319651
+       .long   2001751692
+       .long   2533372489
+       .long   985525180
+       .long   69199126
+       .long   3819185373
+       .long   1444639302
+       .long   4003503385
+       .long   771777682
+       .long   1971050360
+       .long   138398252
+       .long   3343403450
+       .long   2889278605
+       .long   3712039474
+       .long   1543555365
+       .long   3942100721
+       .long   276796504
+       .long   2391839604
+       .long   1483589915
+       .long   3129111652
+       .long   3087110731
+       .long   3589234146
+       .long   553593009
+       .long   488711913
+       .long   2967179831
+       .long   1963256009
+       .long   1879254167
+       .long   2883500997
+       .long   1107186019
+       .long   977423826
+       .long   1639392366
+       .long   3926512018
+       .long   3758508334
+       .long   1472034698
+       .long   2214372039
+       .long   1954847653
+       .long   3278784732
+       .long   3558056740
+       .long   3222049373
+       .long   2944069397
+       .long   133776782
+       .long   3909695307
+       .long   2262602168
+       .long   2821146184
+       .long   2149131451
+       .long   1593171499
+       .long   267553565
+       .long   3524423319
+       .long   230237041
+       .long   1347325072
+       .long   3295607
+       .long   3186342998
+       .long   535107130
+       .long   2753879342
+       .long   460474083
+       .long   2694650145
+       .long   6591214
+       .long   2077718700
+       .long   1070214261
+       .long   1212791388
+       .long   920948167
+       .long   1094332995
+       .long   13182429
+       .long   4155437400
+       .long   2140428522
+       .long   2425582776
+       .long   1841896334
+       .long   2188665991
+       .long   26364858
+       .long   4015907504
+       .long   4280857045
+       .long   556198256
+       .long   3683792669
+       .long   82364686
+       .long   52729717
+       .long   3736847713
+       .long   4266746795
+       .long   1112396512
+       .long   3072618042
+       .long   164729372
+       .long   105459434
+       .long   3178728131
+       .long   4238526295
+       .long   2224793024
+       .long   1850268788
+       .long   329458745
+       .long   210918868
+       .long   2062488966
+       .long   4182085295
+       .long   154618752
+       .long   3700537577
+       .long   658917491
+       .long   421837736
+       .long   4124977933
+       .long   4069203294
+       .long   309237504
+       .long   3106107858
+       .long   1317834983
+       .long   843675472
+       .long   3954988571
+       .long   3843439293
+       .long   618475008
+       .long   1917248420
+       .long   2635669967
+       .long   1687350944
+       .long   3615009846
+       .long   3391911291
+       .long   1236950016
+       .long   3834496840
+       .long   976372639
+       .long   3374701889
+       .long   2935052397
+       .long   2488855287
+       .long   2473900033
+       .long   3374026384
+       .long   1952745279
+       .long   2454436482
+       .long   1575137499
+       .long   682743279
+       .long   652832771
+       .long   2453085473
+       .long   3905490559
+       .long   613905668
+       .long   3150274999
+       .long   1365486558
+       .long   1305665542
+       .long   611203650
+       .long   3516013822
+       .long   1227811337
+       .long   2005582702
+       .long   2730973117
+       .long   2611331084
+       .long   1222407300
+       .long   2737060348
+       .long   2455622675
+       .long   4011165404
+       .long   1166978938
+       .long   927694873
+       .long   2444814601
+       .long   1179153400
+       .long   616278055
+       .long   3727363513
+       .long   2333957877
+       .long   1855389746
+       .long   594661906
+       .long   2358306800
+       .long   1232556110
+       .long   3159759730
+       .long   372948459
+       .long   3710779492
+       .long   1189323812
+       .long   421646305
+       .long   2465112221
+       .long   2024552164
+       .long   745896919
+       .long   3126591689
+       .long   2378647625
+       .long   843292611
+       .long   635257146
+       .long   4049104329
+       .long   1491793838
+       .long   1958216082
+       .long   462327955
+       .long   1686585223
+       .long   1270514292
+       .long   3803241362
+       .long   2983587677
+       .long   3916432164
+       .long   924655910
+       .long   3373170446
+       .long   2541028584
+       .long   3311515428
+       .long   1672208059
+       .long   3537897033
+       .long   1849311821
+       .long   2451373597
+       .long   787089873
+       .long   2328063560
+       .long   3344416119
+       .long   2780826770
+       .long   3698623643
+       .long   607779899
+       .long   1574179747
+       .long   361159825
+       .long   2393864943
+       .long   1266686244
+       .long   3102279991
+       .long   1215559799
+       .long   3148359494
+       .long   722319651
+       .long   492762590
+       .long   2533372489
+       .long   1909592686
+       .long   2431119599
+       .long   2001751692
+       .long   1444639302
+       .long   985525180
+       .long   771777682
+       .long   3819185373
+       .long   567271902
+       .long   4003503385
+       .long   2889278605
+       .long   1971050360
+       .long   1543555365
+       .long   3343403450
+       .long   1134543805
+       .long   3712039474
+       .long   1483589915
+       .long   3942100721
+       .long   3087110731
+       .long   2391839604
+       .long   2269087610
+       .long   3129111652
+       .long   2967179831
+       .long   3589234146
+       .long   1879254167
+       .long   488711913
+       .long   243207925
+       .long   1963256009
+       .long   1639392366
+       .long   2883500997
+       .long   3758508334
+       .long   977423826
+       .long   486415851
+       .long   3926512018
+       .long   3278784732
+       .long   1472034698
+       .long   3222049373
+       .long   1954847653
+       .long   972831702
+       .long   3558056740
+       .long   2262602168
+       .long   2944069397
+       .long   2149131451
+       .long   3909695307
+       .long   1945663404
+       .long   2821146184
+       .long   230237041
+       .long   1593171499
+       .long   3295607
+       .long   3524423319
+       .long   3891326808
+       .long   1347325072
+       .long   460474083
+       .long   3186342998
+       .long   6591214
+       .long   2753879342
+       .long   3487686321
+       .long   2694650145
+       .long   920948167
+       .long   2077718700
+       .long   13182429
+       .long   1212791388
+       .long   2680405347
+       .long   1094332995
+       .long   1841896334
+       .long   4155437400
+       .long   26364858
+       .long   2425582776
+       .long   1065843399
+       .long   2188665991
+       .long   3683792669
+       .long   4015907504
+       .long   52729717
+       .long   556198256
+       .long   2131686798
+       .long   82364686
+       .long   3072618042
+       .long   3736847713
+       .long   105459434
+       .long   1112396512
+       .long   4263373596
+       .long   164729372
+       .long   1850268788
+       .long   3178728131
+       .long   210918868
+       .long   2224793024
+       .long   4231779897
+       .long   329458745
+       .long   3700537577
+       .long   2062488966
+       .long   421837736
+       .long   154618752
+       .long   4168592498
+       .long   658917491
+       .long   3106107858
+       .long   4124977933
+       .long   843675472
+       .long   309237504
+       .long   4042217701
+       .long   1317834983
+       .long   1917248420
+       .long   3954988571
+       .long   1687350944
+       .long   618475008
+       .long   3789468107
+       .long   2635669967
+       .long   3834496840
+       .long   3615009846
+       .long   3374701889
+       .long   1236950016
+       .long   3283968918
+       .long   976372639
+       .long   3374026384
+       .long   2935052397
+       .long   2454436482
+       .long   2473900033
+       .long   2272970540
+       .long   1952745279
+       .long   2453085473
+       .long   1575137499
+       .long   613905668
+       .long   652832771
+       .long   250973784
+       .long   3905490559
+       .long   611203650
+       .long   3150274999
+       .long   1227811337
+       .long   1305665542
+       .long   501947569
+       .long   3516013822
+       .long   1222407300
+       .long   2005582702
+       .long   2455622675
+       .long   2611331084
+       .long   1003895138
+       .long   2737060348
+       .long   2444814601
+       .long   4011165404
+       .long   616278055
+       .long   927694873
+       .long   2007790276
+       .long   1179153400
+       .long   594661906
+       .long   3727363513
+       .long   1232556110
+       .long   1855389746
+       .long   4015580553
+       .long   2358306800
+       .long   1189323812
+       .long   3159759730
+       .long   2465112221
+       .long   3710779492
+       .long   3736193810
+       .long   421646305
+       .long   2378647625
+       .long   2024552164
+       .long   635257146
+       .long   3126591689
+       .long   3177420325
+       .long   843292611
+       .long   462327955
+       .long   4049104329
+       .long   1270514292
+       .long   1958216082
+       .long   2059873354
+       .long   1686585223
+       .long   924655910
+       .long   3803241362
+       .long   2541028584
+       .long   3916432164
+       .long   4119746708
+       .long   3373170446
+       .long   1849311821
+       .long   3311515428
+       .long   787089873
+       .long   3537897033
+       .long   3944526121
+       .long   2451373597
+       .long   3698623643
+       .long   2328063560
+       .long   1574179747
+       .long   2780826770
+       .long   3594084947
+       .long   607779899
+       .long   3102279991
+       .long   361159825
+       .long   3148359494
+       .long   1266686244
+       .long   2893202598
+       .long   1215559799
+       .long   1909592686
+       .long   722319651
+       .long   2001751692
+       .long   2533372489
+       .long   1491437901
+       .long   2431119599
+       .long   3819185373
+       .long   1444639302
+       .long   4003503385
+       .long   771777682
+       .long   2982875802
+       .long   567271902
+       .long   3343403450
+       .long   2889278605
+       .long   3712039474
+       .long   1543555365
+       .long   1670784308
+       .long   1134543805
+       .long   2391839604
+       .long   1483589915
+       .long   3129111652
+       .long   3087110731
+       .long   3341568617
+       .long   2269087610
+       .long   488711913
+       .long   2967179831
+       .long   1963256009
+       .long   1879254167
+       .long   2388169939
+       .long   243207925
+       .long   977423826
+       .long   1639392366
+       .long   3926512018
+       .long   3758508334
+       .long   481372583
+       .long   486415851
+       .long   1954847653
+       .long   3278784732
+       .long   3558056740
+       .long   3222049373
+       .long   962745166
+       .long   972831702
+       .long   3909695307
+       .long   2262602168
+       .long   2821146184
+       .long   2149131451
+       .long   1925490332
+       .long   1945663404
+       .long   3524423319
+       .long   230237041
+       .long   1347325072
+       .long   3295607
+       .long   3850980665
+       .long   3891326808
+       .long   2753879342
+       .long   460474083
+       .long   2694650145
+       .long   6591214
+       .long   3406994035
+       .long   3487686321
+       .long   1212791388
+       .long   920948167
+       .long   1094332995
+       .long   13182429
+       .long   2519020775
+       .long   2680405347
+       .long   2425582776
+       .long   1841896334
+       .long   2188665991
+       .long   26364858
+       .long   743074255
+       .long   1065843399
+       .long   556198256
+       .long   3683792669
+       .long   82364686
+       .long   52729717
+       .long   1486148511
+       .long   2131686798
+       .long   1112396512
+       .long   3072618042
+       .long   164729372
+       .long   105459434
+       .long   2972297022
+       .long   4263373596
+       .long   2224793024
+       .long   1850268788
+       .long   329458745
+       .long   210918868
+       .long   1649626749
+       .long   4231779897
+       .long   154618752
+       .long   3700537577
+       .long   658917491
+       .long   421837736
+       .long   3299253499
+       .long   4168592498
+       .long   309237504
+       .long   3106107858
+       .long   1317834983
+       .long   843675472
+       .long   2303539703
+       .long   4042217701
+       .long   618475008
+       .long   1917248420
+       .long   2635669967
+       .long   1687350944
+       .long   312112110
+       .long   3789468107
+       .long   1236950016
+       .long   3834496840
+       .long   976372639
+       .long   3374701889
+       .long   624224221
+       .long   3283968918
+       .long   2473900033
+       .long   3374026384
+       .long   1952745279
+       .long   2454436482
+       .long   1248448442
+       .long   2272970540
+       .long   652832771
+       .long   2453085473
+       .long   3905490559
+       .long   613905668
+       .long   2496896884
+       .long   250973784
+       .long   1305665542
+       .long   611203650
+       .long   3516013822
+       .long   1227811337
+       .long   698826472
+       .long   501947569
+       .long   2611331084
+       .long   1222407300
+       .long   2737060348
+       .long   2455622675
+       .long   1397652945
+       .long   1003895138
+       .long   927694873
+       .long   2444814601
+       .long   1179153400
+       .long   616278055
+       .long   2795305890
+       .long   2007790276
+       .long   1855389746
+       .long   594661906
+       .long   2358306800
+       .long   1232556110
+       .long   1295644484
+       .long   4015580553
+       .long   3710779492
+       .long   1189323812
+       .long   421646305
+       .long   2465112221
+       .long   2591288968
+       .long   3736193810
+       .long   3126591689
+       .long   2378647625
+       .long   843292611
+       .long   635257146
+       .long   887610640
+       .long   3177420325
+       .long   1958216082
+       .long   462327955
+       .long   1686585223
+       .long   1270514292
+       .long   1775221280
+       .long   2059873354
+       .long   3916432164
+       .long   924655910
+       .long   3373170446
+       .long   2541028584
+       .long   3550442561
+       .long   4119746708
+       .long   3537897033
+       .long   1849311821
+       .long   2451373597
+       .long   787089873
+       .long   2805917826
+       .long   3944526121
+       .long   2780826770
+       .long   3698623643
+       .long   607779899
+       .long   1574179747
+       .long   1316868356
+       .long   3594084947
+       .long   1266686244
+       .long   3102279991
+       .long   1215559799
+       .long   3148359494
+       .long   2633736712
+       .long   2893202598
+       .long   2533372489
+       .long   1909592686
+       .long   2431119599
+       .long   2001751692
+       .long   972506129
+       .long   1491437901
+       .long   771777682
+       .long   3819185373
+       .long   567271902
+       .long   4003503385
+       .long   1945012259
+       .long   2982875802
+       .long   1543555365
+       .long   3343403450
+       .long   1134543805
+       .long   3712039474
+       .long   3890024518
+       .long   1670784308
+       .long   3087110731
+       .long   2391839604
+       .long   2269087610
+       .long   3129111652
+       .long   3485081741
+       .long   3341568617
+       .long   1879254167
+       .long   488711913
+       .long   243207925
+       .long   1963256009
+       .long   2675196186
+       .long   2388169939
+       .long   3758508334
+       .long   977423826
+       .long   486415851
+       .long   3926512018
+       .long   1055425077
+       .long   481372583
+       .long   3222049373
+       .long   1954847653
+       .long   972831702
+       .long   3558056740
+       .long   2110850155
+       .long   962745166
+       .long   2149131451
+       .long   3909695307
+       .long   1945663404
+       .long   2821146184
+       .long   4221700311
+       .long   1925490332
+       .long   3295607
+       .long   3524423319
+       .long   3891326808
+       .long   1347325072
+       .long   4148433327
+       .long   3850980665
+       .long   6591214
+       .long   2753879342
+       .long   3487686321
+       .long   2694650145
+       .long   4001899359
+       .long   3406994035
+       .long   13182429
+       .long   1212791388
+       .long   2680405347
+       .long   1094332995
+       .long   3708831422
+       .long   2519020775
+       .long   26364858
+       .long   2425582776
+       .long   1065843399
+       .long   2188665991
+       .long   3122695549
+       .long   743074255
+       .long   52729717
+       .long   556198256
+       .long   2131686798
+       .long   82364686
+       .long   1950423802
+       .long   1486148511
+       .long   105459434
+       .long   1112396512
+       .long   4263373596
+       .long   164729372
+       .long   3900847605
+       .long   2972297022
+       .long   210918868
+       .long   2224793024
+       .long   4231779897
+       .long   329458745
+       .long   3506727914
+       .long   1649626749
+       .long   421837736
+       .long   154618752
+       .long   4168592498
+       .long   658917491
+       .long   2718488532
+       .long   3299253499
+       .long   843675472
+       .long   309237504
+       .long   4042217701
+       .long   1317834983
+       .long   1142009769
+       .long   2303539703
+       .long   1687350944
+       .long   618475008
+       .long   3789468107
+       .long   2635669967
+       .long   2284019538
+       .long   312112110
+       .long   3374701889
+       .long   1236950016
+       .long   3283968918
+       .long   976372639
+       .long   273071781
+       .long   624224221
+       .long   2454436482
+       .long   2473900033
+       .long   2272970540
+       .long   1952745279
+       .long   546143563
+       .long   1248448442
+       .long   613905668
+       .long   652832771
+       .long   250973784
+       .long   3905490559
+       .long   1092287127
+       .long   2496896884
+       .long   1227811337
+       .long   1305665542
+       .long   501947569
+       .long   3516013822
+       .long   2184574254
+       .long   698826472
+       .long   2455622675
+       .long   2611331084
+       .long   1003895138
+       .long   2737060348
+       .long   74181213
+       .long   1397652945
+       .long   616278055
+       .long   927694873
+       .long   2007790276
+       .long   1179153400
+       .long   148362426
+       .long   2795305890
+       .long   1232556110
+       .long   1855389746
+       .long   4015580553
+       .long   2358306800
+       .long   296724853
+       .long   1295644484
+       .long   2465112221
+       .long   3710779492
+       .long   3736193810
+       .long   421646305
+       .long   593449707
+       .long   2591288968
+       .long   635257146
+       .long   3126591689
+       .long   3177420325
+       .long   843292611
+       .long   1186899415
+       .long   887610640
+       .long   1270514292
+       .long   1958216082
+       .long   2059873354
+       .long   1686585223
+       .long   2373798830
+       .long   1775221280
+       .long   2541028584
+       .long   3916432164
+       .long   4119746708
+       .long   3373170446
+       .long   452630365
+       .long   3550442561
+       .long   787089873
+       .long   3537897033
+       .long   3944526121
+       .long   2451373597
+       .long   905260731
+       .long   2805917826
+       .long   1574179747
+       .long   2780826770
+       .long   3594084947
+       .long   607779899
+       .long   1810521462
+       .long   1316868356
+       .long   3148359494
+       .long   1266686244
+       .long   2893202598
+       .long   1215559799
+       .long   3621042925
+       .long   2633736712
+       .long   2001751692
+       .long   2533372489
+       .long   1491437901
+       .long   2431119599
+       .long   2947118554
+       .long   972506129
+       .long   4003503385
+       .long   771777682
+       .long   2982875802
+       .long   567271902
+       .long   1599269812
+       .long   1945012259
+       .long   3712039474
+       .long   1543555365
+       .long   1670784308
+       .long   1134543805
+       .long   3198539624
+       .long   3890024518
+       .long   3129111652
+       .long   3087110731
+       .long   3341568617
+       .long   2269087610
+       .long   2102111953
+       .long   3485081741
+       .long   1963256009
+       .long   1879254167
+       .long   2388169939
+       .long   243207925
+       .long   4204223906
+       .long   2675196186
+       .long   3926512018
+       .long   3758508334
+       .long   481372583
+       .long   486415851
+       .long   4113480516
+       .long   1055425077
+       .long   3558056740
+       .long   3222049373
+       .long   962745166
+       .long   972831702
+       .long   3931993737
+       .long   2110850155
+       .long   2821146184
+       .long   2149131451
+       .long   1925490332
+       .long   1945663404
+       .long   3569020178
+       .long   4221700311
+       .long   1347325072
+       .long   3295607
+       .long   3850980665
+       .long   3891326808
+       .long   2843073060
+       .long   4148433327
+       .long   2694650145
+       .long   6591214
+       .long   3406994035
+       .long   3487686321
+       .long   1391178824
+       .long   4001899359
+       .long   1094332995
+       .long   13182429
+       .long   2519020775
+       .long   2680405347
+       .long   2782357648
+       .long   3708831422
+       .long   2188665991
+       .long   26364858
+       .long   743074255
+       .long   1065843399
+       .long   1269748001
+       .long   3122695549
+       .long   82364686
+       .long   52729717
+       .long   1486148511
+       .long   2131686798
+       .long   2539496002
+       .long   1950423802
+       .long   164729372
+       .long   105459434
+       .long   2972297022
+       .long   4263373596
+       .long   784024708
+       .long   3900847605
+       .long   329458745
+       .long   210918868
+       .long   1649626749
+       .long   4231779897
+       .long   1568049417
+       .long   3506727914
+       .long   658917491
+       .long   421837736
+       .long   3299253499
+       .long   4168592498
+       .long   3136098835
+       .long   2718488532
+       .long   1317834983
+       .long   843675472
+       .long   2303539703
+       .long   4042217701
+       .long   1977230375
+       .long   1142009769
+       .long   2635669967
+       .long   1687350944
+       .long   312112110
+       .long   3789468107
+       .long   3954460750
+       .long   2284019538
+       .long   976372639
+       .long   3374701889
+       .long   624224221
+       .long   3283968918
+       .long   3613954205
+       .long   273071781
+       .long   1952745279
+       .long   2454436482
+       .long   1248448442
+       .long   2272970540
+       .long   2932941114
+       .long   546143563
+       .long   3905490559
+       .long   613905668
+       .long   2496896884
+       .long   250973784
+       .long   1570914932
+       .long   1092287127
+       .long   3516013822
+       .long   1227811337
+       .long   698826472
+       .long   501947569
+       .long   3141829865
+       .long   2184574254
+       .long   2737060348
+       .long   2455622675
+       .long   1397652945
+       .long   1003895138
+       .long   1988692435
+       .long   74181213
+       .long   1179153400
+       .long   616278055
+       .long   2795305890
+       .long   2007790276
+       .long   3977384870
+       .long   148362426
+       .long   2358306800
+       .long   1232556110
+       .long   1295644484
+       .long   4015580553
+       .long   3659802444
+       .long   296724853
+       .long   421646305
+       .long   2465112221
+       .long   2591288968
+       .long   3736193810
+       .long   3024637593
+       .long   593449707
+       .long   843292611
+       .long   635257146
+       .long   887610640
+       .long   3177420325
+       .long   1754307891
+       .long   1186899415
+       .long   1686585223
+       .long   1270514292
+       .long   1775221280
+       .long   2059873354
+       .long   3508615783
+       .long   2373798830
+       .long   3373170446
+       .long   2541028584
+       .long   3550442561
+       .long   4119746708
+       .long   2722264270
+       .long   452630365
+       .long   2451373597
+       .long   787089873
+       .long   2805917826
+       .long   3944526121
+       .long   1149561244
+       .long   905260731
+       .long   607779899
+       .long   1574179747
+       .long   1316868356
+       .long   3594084947
+       .long   2299122488
+       .long   1810521462
+       .long   1215559799
+       .long   3148359494
+       .long   2633736712
+       .long   2893202598
+       .long   303277681
+       .long   3621042925
+       .long   2431119599
+       .long   2001751692
+       .long   972506129
+       .long   1491437901
+       .long   606555363
+       .long   2947118554
+       .long   567271902
+       .long   4003503385
+       .long   1945012259
+       .long   2982875802
+       .long   1213110727
+       .long   1599269812
+       .long   1134543805
+       .long   3712039474
+       .long   3890024518
+       .long   1670784308
+       .long   2426221454
+       .long   3198539624
+       .long   2269087610
+       .long   3129111652
+       .long   3485081741
+       .long   3341568617
+       .long   557475612
+       .long   2102111953
+       .long   243207925
+       .long   1963256009
+       .long   2675196186
+       .long   2388169939
+       .long   1114951224
+       .long   4204223906
+       .long   486415851
+       .long   3926512018
+       .long   1055425077
+       .long   481372583
+       .long   2229902448
+       .long   4113480516
+       .long   972831702
+       .long   3558056740
+       .long   2110850155
+       .long   962745166
+       .long   164837600
+       .long   3931993737
+       .long   1945663404
+       .long   2821146184
+       .long   4221700311
+       .long   1925490332
+       .long   329675200
+       .long   3569020178
+       .long   3891326808
+       .long   1347325072
+       .long   4148433327
+       .long   3850980665
+       .long   659350401
+       .long   2843073060
+       .long   3487686321
+       .long   2694650145
+       .long   4001899359
+       .long   3406994035
+       .long   1318700802
+       .long   1391178824
+       .long   2680405347
+       .long   1094332995
+       .long   3708831422
+       .long   2519020775
+       .long   2637401604
+       .long   2782357648
+       .long   1065843399
+       .long   2188665991
+       .long   3122695549
+       .long   743074255
+       .long   979835913
+       .long   1269748001
+       .long   2131686798
+       .long   82364686
+       .long   1950423802
+       .long   1486148511
+       .long   1959671827
+       .long   2539496002
+       .long   4263373596
+       .long   164729372
+       .long   3900847605
+       .long   2972297022
+       .long   3919343654
+       .long   784024708
+       .long   4231779897
+       .long   329458745
+       .long   3506727914
+       .long   1649626749
+       .long   3543720013
+       .long   1568049417
+       .long   4168592498
+       .long   658917491
+       .long   2718488532
+       .long   3299253499
+       .long   2792472730
+       .long   3136098835
+       .long   4042217701
+       .long   1317834983
+       .long   1142009769
+       .long   2303539703
+       .long   1289978165
+       .long   1977230375
+       .long   3789468107
+       .long   2635669967
+       .long   2284019538
+       .long   312112110
+       .long   2579956331
+       .long   3954460750
+       .long   3283968918
+       .long   976372639
+       .long   273071781
+       .long   624224221
+       .long   864945366
+       .long   3613954205
+       .long   2272970540
+       .long   1952745279
+       .long   546143563
+       .long   1248448442
+       .long   1729890733
+       .long   2932941114
+       .long   250973784
+       .long   3905490559
+       .long   1092287127
+       .long   2496896884
+       .long   3459781466
+       .long   1570914932
+       .long   501947569
+       .long   3516013822
+       .long   2184574254
+       .long   698826472
+       .long   2624595636
+       .long   3141829865
+       .long   1003895138
+       .long   2737060348
+       .long   74181213
+       .long   1397652945
+       .long   954223976
+       .long   1988692435
+       .long   2007790276
+       .long   1179153400
+       .long   148362426
+       .long   2795305890
+       .long   1908447953
+       .long   3977384870
+       .long   4015580553
+       .long   2358306800
+       .long   296724853
+       .long   1295644484
+       .long   3816895906
+       .long   3659802444
+       .long   3736193810
+       .long   421646305
+       .long   593449707
+       .long   2591288968
+       .long   3338824517
+       .long   3024637593
+       .long   3177420325
+       .long   843292611
+       .long   1186899415
+       .long   887610640
+       .long   2382681739
+       .long   1754307891
+       .long   2059873354
+       .long   1686585223
+       .long   2373798830
+       .long   1775221280
+       .long   470396183
+       .long   3508615783
+       .long   4119746708
+       .long   3373170446
+       .long   452630365
+       .long   3550442561
+       .long   940792367
+       .long   2722264270
+       .long   3944526121
+       .long   2451373597
+       .long   905260731
+       .long   2805917826
+       .long   1881584735
+       .long   1149561244
+       .long   3594084947
+       .long   607779899
+       .long   1810521462
+       .long   1316868356
+       .long   3763169470
+       .long   2299122488
+       .long   2893202598
+       .long   1215559799
+       .long   3621042925
+       .long   2633736712
+       .long   3231371645
+       .long   303277681
+       .long   1491437901
+       .long   2431119599
+       .long   2947118554
+       .long   972506129
+       .long   2167775995
+       .long   606555363
+       .long   2982875802
+       .long   567271902
+       .long   1599269812
+       .long   1945012259
+       .long   40584695
+       .long   1213110727
+       .long   1670784308
+       .long   1134543805
+       .long   3198539624
+       .long   3890024518
+       .long   81169391
+       .long   2426221454
+       .long   3341568617
+       .long   2269087610
+       .long   2102111953
+       .long   3485081741
+       .long   162338783
+       .long   557475612
+       .long   2388169939
+       .long   243207925
+       .long   4204223906
+       .long   2675196186
+       .long   324677567
+       .long   1114951224
+       .long   481372583
+       .long   486415851
+       .long   4113480516
+       .long   1055425077
+       .long   649355134
+       .long   2229902448
+       .long   962745166
+       .long   972831702
+       .long   3931993737
+       .long   2110850155
+       .long   1298710268
+       .long   164837600
+       .long   1925490332
+       .long   1945663404
+       .long   3569020178
+       .long   4221700311
+       .long   2597420537
+       .long   329675200
+       .long   3850980665
+       .long   3891326808
+       .long   2843073060
+       .long   4148433327
+       .long   899873778
+       .long   659350401
+       .long   3406994035
+       .long   3487686321
+       .long   1391178824
+       .long   4001899359
+       .long   1799747556
+       .long   1318700802
+       .long   2519020775
+       .long   2680405347
+       .long   2782357648
+       .long   3708831422
+       .long   3599495112
+       .long   2637401604
+       .long   743074255
+       .long   1065843399
+       .long   1269748001
+       .long   3122695549
+       .long   2904022928
+       .long   979835913
+       .long   1486148511
+       .long   2131686798
+       .long   2539496002
+       .long   1950423802
+       .long   1513078560
+       .long   1959671827
+       .long   2972297022
+       .long   4263373596
+       .long   784024708
+       .long   3900847605
+       .long   3026157121
+       .long   3919343654
+       .long   1649626749
+       .long   4231779897
+       .long   1568049417
+       .long   3506727914
+       .long   1757346946
+       .long   3543720013
+       .long   3299253499
+       .long   4168592498
+       .long   3136098835
+       .long   2718488532
+       .long   3514693892
+       .long   2792472730
+       .long   2303539703
+       .long   4042217701
+       .long   1977230375
+       .long   1142009769
+       .long   2734420489
+       .long   1289978165
+       .long   312112110
+       .long   3789468107
+       .long   3954460750
+       .long   2284019538
+       .long   1173873683
+       .long   2579956331
+       .long   624224221
+       .long   3283968918
+       .long   3613954205
+       .long   273071781
+       .long   2347747367
+       .long   864945366
+       .long   1248448442
+       .long   2272970540
+       .long   2932941114
+       .long   546143563
+       .long   400527438
+       .long   1729890733
+       .long   2496896884
+       .long   250973784
+       .long   1570914932
+       .long   1092287127
+       .long   801054876
+       .long   3459781466
+       .long   698826472
+       .long   501947569
+       .long   3141829865
+       .long   2184574254
+       .long   1602109753
+       .long   2624595636
+       .long   1397652945
+       .long   1003895138
+       .long   1988692435
+       .long   74181213
+       .long   3204219507
+       .long   954223976
+       .long   2795305890
+       .long   2007790276
+       .long   3977384870
+       .long   148362426
+       .long   2113471718
+       .long   1908447953
+       .long   1295644484
+       .long   4015580553
+       .long   3659802444
+       .long   296724853
+       .long   4226943436
+       .long   3816895906
+       .long   2591288968
+       .long   3736193810
+       .long   3024637593
+       .long   593449707
+       .long   4158919577
+       .long   3338824517
+       .long   887610640
+       .long   3177420325
+       .long   1754307891
+       .long   1186899415
+       .long   4022871858
+       .long   2382681739
+       .long   1775221280
+       .long   2059873354
+       .long   3508615783
+       .long   2373798830
+       .long   3750776420
+       .long   470396183
+       .long   3550442561
+       .long   4119746708
+       .long   2722264270
+       .long   452630365
+       .long   3206585544
+       .long   940792367
+       .long   2805917826
+       .long   3944526121
+       .long   1149561244
+       .long   905260731
+       .long   2118203793
+       .long   1881584735
+       .long   1316868356
+       .long   3594084947
+       .long   2299122488
+       .long   1810521462
+       .long   4236407587
+       .long   3763169470
+       .long   2633736712
+       .long   2893202598
+       .long   303277681
+       .long   3621042925
+       .long   4177847879
+       .long   3231371645
+       .long   972506129
+       .long   1491437901
+       .long   606555363
+       .long   2947118554
+       .long   4060728462
+       .long   2167775995
+       .long   1945012259
+       .long   2982875802
+       .long   1213110727
+       .long   1599269812
+       .long   3826489629
+       .long   40584695
+       .long   3890024518
+       .long   1670784308
+       .long   2426221454
+       .long   3198539624
+       .long   3358011962
+       .long   81169391
+       .long   3485081741
+       .long   3341568617
+       .long   557475612
+       .long   2102111953
+       .long   2421056629
+       .long   162338783
+       .long   2675196186
+       .long   2388169939
+       .long   1114951224
+       .long   4204223906
+       .long   547145963
+       .long   324677567
+       .long   1055425077
+       .long   481372583
+       .long   2229902448
+       .long   4113480516
+       .long   1094291926
+       .long   649355134
+       .long   2110850155
+       .long   962745166
+       .long   164837600
+       .long   3931993737
+       .long   2188583852
+       .long   1298710268
+       .long   4221700311
+       .long   1925490332
+       .long   329675200
+       .long   3569020178
+       .long   82200408
+       .long   2597420537
+       .long   4148433327
+       .long   3850980665
+       .long   659350401
+       .long   2843073060
+       .long   164400817
+       .long   899873778
+       .long   4001899359
+       .long   3406994035
+       .long   1318700802
+       .long   1391178824
+       .long   328801635
+       .long   1799747556
+       .long   3708831422
+       .long   2519020775
+       .long   2637401604
+       .long   2782357648
+       .long   657603271
+       .long   3599495112
+       .long   3122695549
+       .long   743074255
+       .long   979835913
+       .long   1269748001
+       .long   1315206542
+       .long   2904022928
+       .long   1950423802
+       .long   1486148511
+       .long   1959671827
+       .long   2539496002
+       .long   2630413084
+       .long   1513078560
+       .long   3900847605
+       .long   2972297022
+       .long   3919343654
+       .long   784024708
+       .long   965858873
+       .long   3026157121
+       .long   3506727914
+       .long   1649626749
+       .long   3543720013
+       .long   1568049417
+       .long   1931717747
+       .long   1757346946
+       .long   2718488532
+       .long   3299253499
+       .long   2792472730
+       .long   3136098835
+       .long   3863435494
+       .long   3514693892
+       .long   1142009769
+       .long   2303539703
+       .long   1289978165
+       .long   1977230375
+       .long   3431903692
+       .long   2734420489
+       .long   2284019538
+       .long   312112110
+       .long   2579956331
+       .long   3954460750
+       .long   2568840088
+       .long   1173873683
+       .long   273071781
+       .long   624224221
+       .long   864945366
+       .long   3613954205
+       .long   842712880
+       .long   2347747367
+       .long   546143563
+       .long   1248448442
+       .long   1729890733
+       .long   2932941114
+       .long   1685425760
+       .long   400527438
+       .long   1092287127
+       .long   2496896884
+       .long   3459781466
+       .long   1570914932
+       .long   3370851521
+       .long   801054876
+       .long   2184574254
+       .long   698826472
+       .long   2624595636
+       .long   3141829865
+       .long   2446735747
+       .long   1602109753
+       .long   74181213
+       .long   1397652945
+       .long   954223976
+       .long   1988692435
+       .long   598504198
+       .long   3204219507
+       .long   148362426
+       .long   2795305890
+       .long   1908447953
+       .long   3977384870
+       .long   1197008397
+       .long   2113471718
+       .long   296724853
+       .long   1295644484
+       .long   3816895906
+       .long   3659802444
+       .long   2394016794
+       .long   4226943436
+       .long   593449707
+       .long   2591288968
+       .long   3338824517
+       .long   3024637593
+       .long   493066293
+       .long   4158919577
+       .long   1186899415
+       .long   887610640
+       .long   2382681739
+       .long   1754307891
+       .long   986132586
+       .long   4022871858
+       .long   2373798830
+       .long   1775221280
+       .long   470396183
+       .long   3508615783
+       .long   1972265172
+       .long   3750776420
+       .long   452630365
+       .long   3550442561
+       .long   940792367
+       .long   2722264270
+       .long   3944530345
+       .long   3206585544
+       .long   905260731
+       .long   2805917826
+       .long   1881584735
+       .long   1149561244
+       .long   3594093395
+       .long   2118203793
+       .long   1810521462
+       .long   1316868356
+       .long   3763169470
+       .long   2299122488
+       .long   2893219494
+       .long   4236407587
+       .long   3621042925
+       .long   2633736712
+       .long   3231371645
+       .long   303277681
+       .long   1491471692
+       .long   4177847879
+       .long   2947118554
+       .long   972506129
+       .long   2167775995
+       .long   606555363
+       .long   2982943385
+       .long   4060728462
+       .long   1599269812
+       .long   1945012259
+       .long   40584695
+       .long   1213110727
+       .long   1670919475
+       .long   3826489629
+       .long   3198539624
+       .long   3890024518
+       .long   81169391
+       .long   2426221454
+       .long   3341838951
+       .long   3358011962
+       .long   2102111953
+       .long   3485081741
+       .long   162338783
+       .long   557475612
+       .long   2388710606
+       .long   2421056629
+       .long   4204223906
+       .long   2675196186
+       .long   324677567
+       .long   1114951224
+       .long   482453916
+       .long   547145963
+       .long   4113480516
+       .long   1055425077
+       .long   649355134
+       .long   2229902448
+       .long   964907833
+       .long   1094291926
+       .long   3931993737
+       .long   2110850155
+       .long   1298710268
+       .long   164837600
+       .long   1929815667
+       .long   2188583852
+       .long   3569020178
+       .long   4221700311
+       .long   2597420537
+       .long   329675200
+       .long   3859631335
+       .long   82200408
+       .long   2843073060
+       .long   4148433327
+       .long   899873778
+       .long   659350401
+       .long   3424295375
+       .long   164400817
+       .long   1391178824
+       .long   4001899359
+       .long   1799747556
+       .long   1318700802
+       .long   2553623455
+       .long   328801635
+       .long   2782357648
+       .long   3708831422
+       .long   3599495112
+       .long   2637401604
+       .long   812279614
+       .long   657603271
+       .long   1269748001
+       .long   3122695549
+       .long   2904022928
+       .long   979835913
+       .long   1624559229
+       .long   1315206542
+       .long   2539496002
+       .long   1950423802
+       .long   1513078560
+       .long   1959671827
+       .long   3249118458
+       .long   2630413084
+       .long   784024708
+       .long   3900847605
+       .long   3026157121
+       .long   3919343654
+       .long   2203269620
+       .long   965858873
+       .long   1568049417
+       .long   3506727914
+       .long   1757346946
+       .long   3543720013
+       .long   111571945
+       .long   1931717747
+       .long   3136098835
+       .long   2718488532
+       .long   3514693892
+       .long   2792472730
+       .long   223143890
+       .long   3863435494
+       .long   1977230375
+       .long   1142009769
+       .long   2734420489
+       .long   1289978165
+       .long   446287780
+       .long   3431903692
+       .long   3954460750
+       .long   2284019538
+       .long   1173873683
+       .long   2579956331
+       .long   892575561
+       .long   2568840088
+       .long   3613954205
+       .long   273071781
+       .long   2347747367
+       .long   864945366
+       .long   1785151123
+       .long   842712880
+       .long   2932941114
+       .long   546143563
+       .long   400527438
+       .long   1729890733
+       .long   3570302247
+       .long   1685425760
+       .long   1570914932
+       .long   1092287127
+       .long   801054876
+       .long   3459781466
+       .long   2845637198
+       .long   3370851521
+       .long   3141829865
+       .long   2184574254
+       .long   1602109753
+       .long   2624595636
+       .long   1396307100
+       .long   2446735747
+       .long   1988692435
+       .long   74181213
+       .long   3204219507
+       .long   954223976
+       .long   2792614201
+       .long   598504198
+       .long   3977384870
+       .long   148362426
+       .long   2113471718
+       .long   1908447953
+       .long   1290261106
+       .long   1197008397
+       .long   3659802444
+       .long   296724853
+       .long   4226943436
+       .long   3816895906
+       .long   2580522212
+       .long   2394016794
+       .long   3024637593
+       .long   593449707
+       .long   4158919577
+       .long   3338824517
+       .long   866077128
+       .long   493066293
+       .long   1754307891
+       .long   1186899415
+       .long   4022871858
+       .long   2382681739
+       .long   1732154256
+       .long   986132586
+       .long   3508615783
+       .long   2373798830
+       .long   3750776420
+       .long   470396183
+       .long   3464308513
+       .long   1972265172
+       .long   2722264270
+       .long   452630365
+       .long   3206585544
+       .long   940792367
+       .long   2633649730
+       .long   3944530345
+       .long   1149561244
+       .long   905260731
+       .long   2118203793
+       .long   1881584735
+       .long   972332164
+       .long   3594093395
+       .long   2299122488
+       .long   1810521462
+       .long   4236407587
+       .long   3763169470
+       .long   1944664328
+       .long   2893219494
+       .long   303277681
+       .long   3621042925
+       .long   4177847879
+       .long   3231371645
+       .long   3889328657
+       .long   1491471692
+       .long   606555363
+       .long   2947118554
+       .long   4060728462
+       .long   2167775995
+       .long   3483690018
+       .long   2982943385
+       .long   1213110727
+       .long   1599269812
+       .long   3826489629
+       .long   40584695
+       .long   2672412741
+       .long   1670919475
+       .long   2426221454
+       .long   3198539624
+       .long   3358011962
+       .long   81169391
+       .long   1049858187
+       .long   3341838951
+       .long   557475612
+       .long   2102111953
+       .long   2421056629
+       .long   162338783
+       .long   2099716375
+       .long   2388710606
+       .long   1114951224
+       .long   4204223906
+       .long   547145963
+       .long   324677567
+       .long   4199432751
+       .long   482453916
+       .long   2229902448
+       .long   4113480516
+       .long   1094291926
+       .long   649355134
+       .long   4103898207
+       .long   964907833
+       .long   164837600
+       .long   3931993737
+       .long   2188583852
+       .long   1298710268
+       .long   3912829119
+       .long   1929815667
+       .long   329675200
+       .long   3569020178
+       .long   82200408
+       .long   2597420537
+       .long   3530690942
+       .long   3859631335
+       .long   659350401
+       .long   2843073060
+       .long   164400817
+       .long   899873778
+       .long   2766414588
+       .long   3424295375
+       .long   1318700802
+       .long   1391178824
+       .long   328801635
+       .long   1799747556
+       .long   1237861880
+       .long   2553623455
+       .long   2637401604
+       .long   2782357648
+       .long   657603271
+       .long   3599495112
+       .long   2475723761
+       .long   812279614
+       .long   979835913
+       .long   1269748001
+       .long   1315206542
+       .long   2904022928
+       .long   656480226
+       .long   1624559229
+       .long   1959671827
+       .long   2539496002
+       .long   2630413084
+       .long   1513078560
+       .long   1312960453
+       .long   3249118458
+       .long   3919343654
+       .long   784024708
+       .long   965858873
+       .long   3026157121
+       .long   2625920907
+       .long   2203269620
+       .long   3543720013
+       .long   1568049417
+       .long   1931717747
+       .long   1757346946
+       .long   956874519
+       .long   111571945
+       .long   2792472730
+       .long   3136098835
+       .long   3863435494
+       .long   3514693892
+       .long   1913749038
+       .long   223143890
+       .long   1289978165
+       .long   1977230375
+       .long   3431903692
+       .long   2734420489
+       .long   3827498077
+       .long   446287780
+       .long   2579956331
+       .long   3954460750
+       .long   2568840088
+       .long   1173873683
+       .long   3360028859
+       .long   892575561
+       .long   864945366
+       .long   3613954205
+       .long   842712880
+       .long   2347747367
+       .long   2425090423
+       .long   1785151123
+       .long   1729890733
+       .long   2932941114
+       .long   1685425760
+       .long   400527438
+       .long   555213551
+       .long   3570302247
+       .long   3459781466
+       .long   1570914932
+       .long   3370851521
+       .long   801054876
+       .long   1110427102
+       .long   2845637198
+       .long   2624595636
+       .long   3141829865
+       .long   2446735747
+       .long   1602109753
+       .long   2220854205
+       .long   1396307100
+       .long   954223976
+       .long   1988692435
+       .long   598504198
+       .long   3204219507
+       .long   146741115
+       .long   2792614201
+       .long   1908447953
+       .long   3977384870
+       .long   1197008397
+       .long   2113471718
+       .long   293482231
+       .long   1290261106
+       .long   3816895906
+       .long   3659802444
+       .long   2394016794
+       .long   4226943436
+       .long   586964463
+       .long   2580522212
+       .long   3338824517
+       .long   3024637593
+       .long   493066293
+       .long   4158919577
+       .long   1173928927
+       .long   866077128
+       .long   2382681739
+       .long   1754307891
+       .long   986132586
+       .long   4022871858
+       .long   2347857855
+       .long   1732154256
+       .long   470396183
+       .long   3508615783
+       .long   1972265172
+       .long   3750776420
+       .long   400748414
+       .long   3464308513
+       .long   940792367
+       .long   2722264270
+       .long   3944530345
+       .long   3206585544
+       .long   801496828
+       .long   2633649730
+       .long   1881584735
+       .long   1149561244
+       .long   3594093395
+       .long   2118203793
+       .long   1602993657
+       .long   972332164
+       .long   3763169470
+       .long   2299122488
+       .long   2893219494
+       .long   4236407587
+       .long   3205987314
+       .long   1944664328
+       .long   3231371645
+       .long   303277681
+       .long   1491471692
+       .long   4177847879
+       .long   2117007332
+       .long   3889328657
+       .long   2167775995
+       .long   606555363
+       .long   2982943385
+       .long   4060728462
+       .long   4234014665
+       .long   3483690018
+       .long   40584695
+       .long   1213110727
+       .long   1670919475
+       .long   3826489629
+       .long   4173062034
+       .long   2672412741
+       .long   81169391
+       .long   2426221454
+       .long   3341838951
+       .long   3358011962
+       .long   4051156773
+       .long   1049858187
+       .long   162338783
+       .long   557475612
+       .long   2388710606
+       .long   2421056629
+       .long   3807346250
+       .long   2099716375
+       .long   324677567
+       .long   1114951224
+       .long   482453916
+       .long   547145963
+       .long   3319725204
+       .long   4199432751
+       .long   649355134
+       .long   2229902448
+       .long   964907833
+       .long   1094291926
+       .long   2344483112
+       .long   4103898207
+       .long   1298710268
+       .long   164837600
+       .long   1929815667
+       .long   2188583852
+       .long   393998928
+       .long   3912829119
+       .long   2597420537
+       .long   329675200
+       .long   3859631335
+       .long   82200408
+       .long   787997856
+       .long   3530690942
+       .long   899873778
+       .long   659350401
+       .long   3424295375
+       .long   164400817
+       .long   1575995713
+       .long   2766414588
+       .long   1799747556
+       .long   1318700802
+       .long   2553623455
+       .long   328801635
+       .long   3151991427
+       .long   1237861880
+       .long   3599495112
+       .long   2637401604
+       .long   812279614
+       .long   657603271
+       .long   2009015559
+       .long   2475723761
+       .long   2904022928
+       .long   979835913
+       .long   1624559229
+       .long   1315206542
+       .long   4018031118
+       .long   656480226
+       .long   1513078560
+       .long   1959671827
+       .long   3249118458
+       .long   2630413084
+       .long   3741094941
+       .long   1312960453
+       .long   3026157121
+       .long   3919343654
+       .long   2203269620
+       .long   965858873
+       .long   3187222587
+       .long   2625920907
+       .long   1757346946
+       .long   3543720013
+       .long   111571945
+       .long   1931717747
+       .long   2079477878
+       .long   956874519
+       .long   3514693892
+       .long   2792472730
+       .long   223143890
+       .long   3863435494
+       .long   4158955756
+       .long   1913749038
+       .long   2734420489
+       .long   1289978165
+       .long   446287780
+       .long   3431903692
+       .long   4022944216
+       .long   3827498077
+       .long   1173873683
+       .long   2579956331
+       .long   892575561
+       .long   2568840088
+       .long   3750921137
+       .long   3360028859
+       .long   2347747367
+       .long   864945366
+       .long   1785151123
+       .long   842712880
+       .long   3206874979
+       .long   2425090423
+       .long   400527438
+       .long   1729890733
+       .long   3570302247
+       .long   1685425760
+       .long   2118782663
+       .long   555213551
+       .long   801054876
+       .long   3459781466
+       .long   2845637198
+       .long   3370851521
+       .long   4237565327
+       .long   1110427102
+       .long   1602109753
+       .long   2624595636
+       .long   1396307100
+       .long   2446735747
+       .long   4180163359
+       .long   2220854205
+       .long   3204219507
+       .long   954223976
+       .long   2792614201
+       .long   598504198
+       .long   4065359423
+       .long   146741115
+       .long   2113471718
+       .long   1908447953
+       .long   1290261106
+       .long   1197008397
+       .long   3835751551
+       .long   293482231
+       .long   4226943436
+       .long   3816895906
+       .long   2580522212
+       .long   2394016794
+       .long   3376535807
+       .long   586964463
+       .long   4158919577
+       .long   3338824517
+       .long   866077128
+       .long   493066293
+       .long   2458104319
+       .long   1173928927
+       .long   4022871858
+       .long   2382681739
+       .long   1732154256
+       .long   986132586
+       .long   621241343
+       .long   2347857855
+       .long   3750776420
+       .long   470396183
+       .long   3464308513
+       .long   1972265172
+       .long   1242482686
+       .long   400748414
+       .long   3206585544
+       .long   940792367
+       .long   2633649730
+       .long   3944530345
+       .long   2484965372
+       .long   801496828
+       .long   2118203793
+       .long   1881584735
+       .long   972332164
+       .long   3594093395
+       .long   674963448
+       .long   1602993657
+       .long   4236407587
+       .long   3763169470
+       .long   1944664328
+       .long   2893219494
+       .long   1349926897
+       .long   3205987314
+       .long   4177847879
+       .long   3231371645
+       .long   3889328657
+       .long   1491471692
+       .long   2699853794
+       .long   2117007332
+       .long   4060728462
+       .long   2167775995
+       .long   3483690018
+       .long   2982943385
+       .long   1104740292
+       .long   4234014665
+       .long   3826489629
+       .long   40584695
+       .long   2672412741
+       .long   1670919475
+       .long   2209480585
+       .long   4173062034
+       .long   3358011962
+       .long   81169391
+       .long   1049858187
+       .long   3341838951
+       .long   123993874
+       .long   4051156773
+       .long   2421056629
+       .long   162338783
+       .long   2099716375
+       .long   2388710606
+       .long   247987749
+       .long   3807346250
+       .long   547145963
+       .long   324677567
+       .long   4199432751
+       .long   482453916
+       .long   495975499
+       .long   3319725204
+       .long   1094291926
+       .long   649355134
+       .long   4103898207
+       .long   964907833
+       .long   991950999
+       .long   2344483112
+       .long   2188583852
+       .long   1298710268
+       .long   3912829119
+       .long   1929815667
+       .long   1983901999
+       .long   393998928
+       .long   82200408
+       .long   2597420537
+       .long   3530690942
+       .long   3859631335
+       .long   3967803999
+       .long   787997856
+       .long   164400817
+       .long   899873778
+       .long   2766414588
+       .long   3424295375
+       .long   3640640703
+       .long   1575995713
+       .long   328801635
+       .long   1799747556
+       .long   1237861880
+       .long   2553623455
+       .long   2986314111
+       .long   3151991427
+       .long   657603271
+       .long   3599495112
+       .long   2475723761
+       .long   812279614
+       .long   1677660927
+       .long   2009015559
+       .long   1315206542
+       .long   2904022928
+       .long   656480226
+       .long   1624559229
+       .long   3355321855
+       .long   4018031118
+       .long   2630413084
+       .long   1513078560
+       .long   1312960453
+       .long   3249118458
+       .long   2415676415
+       .long   3741094941
+       .long   965858873
+       .long   3026157121
+       .long   2625920907
+       .long   2203269620
+       .long   536385535
+       .long   3187222587
+       .long   1931717747
+       .long   1757346946
+       .long   956874519
+       .long   111571945
+       .long   1072771071
+       .long   2079477878
+       .long   3863435494
+       .long   3514693892
+       .long   1913749038
+       .long   223143890
+       .long   2145542143
+       .long   4158955756
+       .long   3431903692
+       .long   2734420489
+       .long   3827498077
+       .long   446287780
+       .long   4291084286
+       .long   4022944216
+       .long   2568840088
+       .long   1173873683
+       .long   3360028859
+       .long   892575561
+       .long   4287201277
+       .long   3750921137
+       .long   842712880
+       .long   2347747367
+       .long   2425090423
+       .long   1785151123
+       .long   4279435259
+       .long   3206874979
+       .long   1685425760
+       .long   400527438
+       .long   555213551
+       .long   3570302247
+       .long   4263903223
+       .long   2118782663
+       .long   3370851521
+       .long   801054876
+       .long   1110427102
+       .long   2845637198
+       .long   4232839151
+       .long   4237565327
+       .long   2446735747
+       .long   1602109753
+       .long   2220854205
+       .long   1396307100
+       .long   4170711006
+       .long   4180163359
+       .long   598504198
+       .long   3204219507
+       .long   146741115
+       .long   2792614201
+       .long   4046454716
+       .long   4065359423
+       .long   1197008397
+       .long   2113471718
+       .long   293482231
+       .long   1290261106
+       .long   3797942136
+       .long   3835751551
+       .long   2394016794
+       .long   4226943436
+       .long   586964463
+       .long   2580522212
+       .long   3300916976
+       .long   3376535807
+       .long   493066293
+       .long   4158919577
+       .long   1173928927
+       .long   866077128
+       .long   2306866656
+       .long   2458104319
+       .long   986132586
+       .long   4022871858
+       .long   2347857855
+       .long   1732154256
+       .long   318766016
+       .long   621241343
+       .long   1972265172
+       .long   3750776420
+       .long   400748414
+       .long   3464308513
+       .long   637532033
+       .long   1242482686
+       .long   3944530345
+       .long   3206585544
+       .long   801496828
+       .long   2633649730
+       .long   1275064066
+       .long   2484965372
+       .long   3594093395
+       .long   2118203793
+       .long   1602993657
+       .long   972332164
+       .long   2550128133
+       .long   674963448
+       .long   2893219494
+       .long   4236407587
+       .long   3205987314
+       .long   1944664328
+       .long   805288971
+       .long   1349926897
+       .long   1491471692
+       .long   4177847879
+       .long   2117007332
+       .long   3889328657
+       .long   1610577942
+       .long   2699853794
+       .long   2982943385
+       .long   4060728462
+       .long   4234014665
+       .long   3483690018
+       .long   3221155884
+       .long   1104740292
+       .long   1670919475
+       .long   3826489629
+       .long   4173062034
+       .long   2672412741
+       .long   2147344473
+       .long   2209480585
+       .long   3341838951
+       .long   3358011962
+       .long   4051156773
+       .long   1049858187
+       .long   4294688947
+       .long   123993874
+       .long   2388710606
+       .long   2421056629
+       .long   3807346250
+       .long   2099716375
+       .long   4294410598
+       .long   247987749
+       .long   482453916
+       .long   547145963
+       .long   3319725204
+       .long   4199432751
+       .long   4293853900
+       .long   495975499
+       .long   964907833
+       .long   1094291926
+       .long   2344483112
+       .long   4103898207
+       .long   4292740504
+       .long   991950999
+       .long   1929815667
+       .long   2188583852
+       .long   393998928
+       .long   3912829119
+       .long   4290513712
+       .long   1983901999
+       .long   3859631335
+       .long   82200408
+       .long   787997856
+       .long   3530690942
+       .long   4286060128
+       .long   3967803999
+       .long   3424295375
+       .long   164400817
+       .long   1575995713
+       .long   2766414588
+       .long   4277152960
+       .long   3640640703
+       .long   2553623455
+       .long   328801635
+       .long   3151991427
+       .long   1237861880
+       .long   4259338624
+       .long   2986314111
+       .long   812279614
+       .long   657603271
+       .long   2009015559
+       .long   2475723761
+       .long   4223709953
+       .long   1677660927
+       .long   1624559229
+       .long   1315206542
+       .long   4018031118
+       .long   656480226
+       .long   4152452611
+       .long   3355321855
+       .long   3249118458
+       .long   2630413084
+       .long   3741094941
+       .long   1312960453
+       .long   4009937927
+       .long   2415676415
+       .long   2203269620
+       .long   965858873
+       .long   3187222587
+       .long   2625920907
+       .long   3724908559
+       .long   536385535
+       .long   111571945
+       .long   1931717747
+       .long   2079477878
+       .long   956874519
+       .long   3154849823
+       .long   1072771071
+       .long   223143890
+       .long   3863435494
+       .long   4158955756
+       .long   1913749038
+       .long   2014732351
+       .long   2145542143
+       .long   446287780
+       .long   3431903692
+       .long   4022944216
+       .long   3827498077
+       .long   4029464703
+       .long   4291084286
+       .long   892575561
+       .long   2568840088
+       .long   3750921137
+       .long   3360028859
+       .long   3763962110
+       .long   4287201277
+       .long   1785151123
+       .long   842712880
+       .long   3206874979
+       .long   2425090423
+       .long   3232956925
+       .long   4279435259
+       .long   3570302247
+       .long   1685425760
+       .long   2118782663
+       .long   555213551
+       .long   2170946555
+       .long   4263903223
+       .long   2845637198
+       .long   3370851521
+       .long   4237565327
+       .long   1110427102
+       .long   46925815
+       .long   4232839151
+       .long   1396307100
+       .long   2446735747
+       .long   4180163359
+       .long   2220854205
+       .long   93851631
+       .long   4170711006
+       .long   2792614201
+       .long   598504198
+       .long   4065359423
+       .long   146741115
+       .long   187703262
+       .long   4046454716
+       .long   1290261106
+       .long   1197008397
+       .long   3835751551
+       .long   293482231
+       .long   375406524
+       .long   3797942136
+       .long   2580522212
+       .long   2394016794
+       .long   3376535807
+       .long   586964463
+       .long   750813049
+       .long   3300916976
+       .long   866077128
+       .long   493066293
+       .long   2458104319
+       .long   1173928927
+       .long   1501626098
+       .long   2306866656
+       .long   1732154256
+       .long   986132586
+       .long   621241343
+       .long   2347857855
+       .long   3003252197
+       .long   318766016
+       .long   3464308513
+       .long   1972265172
+       .long   1242482686
+       .long   400748414
+       .long   1711537099
+       .long   637532033
+       .long   2633649730
+       .long   3944530345
+       .long   2484965372
+       .long   801496828
+       .long   3423074199
+       .long   1275064066
+       .long   972332164
+       .long   3594093395
+       .long   674963448
+       .long   1602993657
+       .long   2551181103
+       .long   2550128133
+       .long   1944664328
+       .long   2893219494
+       .long   1349926897
+       .long   3205987314
+       .long   807394910
+       .long   805288971
+       .long   3889328657
+       .long   1491471692
+       .long   2699853794
+       .long   2117007332
+       .long   1614789820
+       .long   1610577942
+       .long   3483690018
+       .long   2982943385
+       .long   1104740292
+       .long   4234014665
+       .long   3229579640
+       .long   3221155884
+       .long   2672412741
+       .long   1670919475
+       .long   2209480585
+       .long   4173062034
+       .long   2164191985
+       .long   2147344473
+       .long   1049858187
+       .long   3341838951
+       .long   123993874
+       .long   4051156773
+       .long   33416674
+       .long   4294688947
+       .long   2099716375
+       .long   2388710606
+       .long   247987749
+       .long   3807346250
+       .long   66833348
+       .long   4294410598
+       .long   4199432751
+       .long   482453916
+       .long   495975499
+       .long   3319725204
+       .long   133666696
+       .long   4293853900
+       .long   4103898207
+       .long   964907833
+       .long   991950999
+       .long   2344483112
+       .long   267333393
+       .long   4292740504
+       .long   3912829119
+       .long   1929815667
+       .long   1983901999
+       .long   393998928
+       .long   534666787
+       .long   4290513712
+       .long   3530690942
+       .long   3859631335
+       .long   3967803999
+       .long   787997856
+       .long   1069333574
+       .long   4286060128
+       .long   2766414588
+       .long   3424295375
+       .long   3640640703
+       .long   1575995713
+       .long   2138667148
+       .long   4277152960
+       .long   1237861880
+       .long   2553623455
+       .long   2986314111
+       .long   3151991427
+       .long   4277334296
+       .long   4259338624
+       .long   2475723761
+       .long   812279614
+       .long   1677660927
+       .long   2009015559
+       .long   4259701297
+       .long   4223709953
+       .long   656480226
+       .long   1624559229
+       .long   3355321855
+       .long   4018031118
+       .long   4224435298
+       .long   4152452611
+       .long   1312960453
+       .long   3249118458
+       .long   2415676415
+       .long   3741094941
+       .long   4153903301
+       .long   4009937927
+       .long   2625920907
+       .long   2203269620
+       .long   536385535
+       .long   3187222587
+       .long   4012839307
+       .long   3724908559
+       .long   956874519
+       .long   111571945
+       .long   1072771071
+       .long   2079477878
+       .long   3730711318
+       .long   3154849823
+       .long   1913749038
+       .long   223143890
+       .long   2145542143
+       .long   4158955756
+       .long   3166455341
+       .long   2014732351
+       .long   3827498077
+       .long   446287780
+       .long   4291084286
+       .long   4022944216
+       .long   2037943386
+       .long   4029464703
+       .long   3360028859
+       .long   892575561
+       .long   4287201277
+       .long   3750921137
+       .long   4075886773
+       .long   3763962110
+       .long   2425090423
+       .long   1785151123
+       .long   4279435259
+       .long   3206874979
+       .long   3856806251
+       .long   3232956925
+       .long   555213551
+       .long   3570302247
+       .long   4263903223
+       .long   2118782663
+       .long   3418645206
+       .long   2170946555
+       .long   1110427102
+       .long   2845637198
+       .long   4232839151
+       .long   4237565327
+       .long   2542323117
+       .long   46925815
+       .long   2220854205
+       .long   1396307100
+       .long   4170711006
+       .long   4180163359
+       .long   789678938
+       .long   93851631
+       .long   146741115
+       .long   2792614201
+       .long   4046454716
+       .long   4065359423
+       .long   1579357876
+       .long   187703262
+       .long   293482231
+       .long   1290261106
+       .long   3797942136
+       .long   3835751551
+       .long   3158715752
+       .long   375406524
+       .long   586964463
+       .long   2580522212
+       .long   3300916976
+       .long   3376535807
+       .long   2022464208
+       .long   750813049
+       .long   1173928927
+       .long   866077128
+       .long   2306866656
+       .long   2458104319
+       .long   4044928416
+       .long   1501626098
+       .long   2347857855
+       .long   1732154256
+       .long   318766016
+       .long   621241343
+       .long   3794889537
+       .long   3003252197
+       .long   400748414
+       .long   3464308513
+       .long   637532033
+       .long   1242482686
+       .long   3294811778
+       .long   1711537099
+       .long   801496828
+       .long   2633649730
+       .long   1275064066
+       .long   2484965372
+       .long   2294656261
+       .long   3423074199
+       .long   1602993657
+       .long   972332164
+       .long   2550128133
+       .long   674963448
+       .long   294345226
+       .long   2551181103
+       .long   3205987314
+       .long   1944664328
+       .long   805288971
+       .long   1349926897
+       .long   588690452
+       .long   807394910
+       .long   2117007332
+       .long   3889328657
+       .long   1610577942
+       .long   2699853794
+       .long   1177380905
+       .long   1614789820
+       .long   4234014665
+       .long   3483690018
+       .long   3221155884
+       .long   1104740292
+       .long   2354761811
+       .long   3229579640
+       .long   4173062034
+       .long   2672412741
+       .long   2147344473
+       .long   2209480585
+       .long   414556326
+       .long   2164191985
+       .long   4051156773
+       .long   1049858187
+       .long   4294688947
+       .long   123993874
+       .long   829112653
+       .long   33416674
+       .long   3807346250
+       .long   2099716375
+       .long   4294410598
+       .long   247987749
+       .long   1658225307
+       .long   66833348
+       .long   3319725204
+       .long   4199432751
+       .long   4293853900
+       .long   495975499
+       .long   3316450614
+       .long   133666696
+       .long   2344483112
+       .long   4103898207
+       .long   4292740504
+       .long   991950999
+       .long   2337933933
+       .long   267333393
+       .long   393998928
+       .long   3912829119
+       .long   4290513712
+       .long   1983901999
+       .long   380900570
+       .long   534666787
+       .long   787997856
+       .long   3530690942
+       .long   4286060128
+       .long   3967803999
+       .long   761801140
+       .long   1069333574
+       .long   1575995713
+       .long   2766414588
+       .long   4277152960
+       .long   3640640703
+       .long   1523602280
+       .long   2138667148
+       .long   3151991427
+       .long   1237861880
+       .long   4259338624
+       .long   2986314111
+       .long   3047204561
+       .long   4277334296
+       .long   2009015559
+       .long   2475723761
+       .long   4223709953
+       .long   1677660927
+       .long   1799441827
+       .long   4259701297
+       .long   4018031118
+       .long   656480226
+       .long   4152452611
+       .long   3355321855
+       .long   3598883655
+       .long   4224435298
+       .long   3741094941
+       .long   1312960453
+       .long   4009937927
+       .long   2415676415
+       .long   2902800015
+       .long   4153903301
+       .long   3187222587
+       .long   2625920907
+       .long   3724908559
+       .long   536385535
+       .long   1510632735
+       .long   4012839307
+       .long   2079477878
+       .long   956874519
+       .long   3154849823
+       .long   1072771071
+       .long   3021265470
+       .long   3730711318
+       .long   4158955756
+       .long   1913749038
+       .long   2014732351
+       .long   2145542143
+       .long   1747563645
+       .long   3166455341
+       .long   4022944216
+       .long   3827498077
+       .long   4029464703
+       .long   4291084286
+       .long   3495127291
+       .long   2037943386
+       .long   3750921137
+       .long   3360028859
+       .long   3763962110
+       .long   4287201277
+       .long   2695287286
+       .long   4075886773
+       .long   3206874979
+       .long   2425090423
+       .long   3232956925
+       .long   4279435259
+       .long   1095607277
+       .long   3856806251
+       .long   2118782663
+       .long   555213551
+       .long   2170946555
+       .long   4263903223
+       .long   2191214555
+       .long   3418645206
+       .long   4237565327
+       .long   1110427102
+       .long   46925815
+       .long   4232839151
+       .long   87461814
+       .long   2542323117
+       .long   4180163359
+       .long   2220854205
+       .long   93851631
+       .long   4170711006
+       .long   174923629
+       .long   789678938
+       .long   4065359423
+       .long   146741115
+       .long   187703262
+       .long   4046454716
+       .long   349847258
+       .long   1579357876
+       .long   3835751551
+       .long   293482231
+       .long   375406524
+       .long   3797942136
+       .long   699694516
+       .long   3158715752
+       .long   3376535807
+       .long   586964463
+       .long   750813049
+       .long   3300916976
+       .long   1399389033
+       .long   2022464208
+       .long   2458104319
+       .long   1173928927
+       .long   1501626098
+       .long   2306866656
+       .long   2798778067
+       .long   4044928416
+       .long   621241343
+       .long   2347857855
+       .long   3003252197
+       .long   318766016
+       .long   1302588838
+       .long   3794889537
+       .long   1242482686
+       .long   400748414
+       .long   1711537099
+       .long   637532033
+       .long   2605177677
+       .long   3294811778
+       .long   2484965372
+       .long   801496828
+       .long   3423074199
+       .long   1275064066
+       .long   915388059
+       .long   2294656261
+       .long   674963448
+       .long   1602993657
+       .long   2551181103
+       .long   2550128133
+       .long   1830776118
+       .long   294345226
+       .long   1349926897
+       .long   3205987314
+       .long   807394910
+       .long   805288971
+       .long   3661552236
+       .long   588690452
+       .long   2699853794
+       .long   2117007332
+       .long   1614789820
+       .long   1610577942
+       .long   3028137177
+       .long   1177380905
+       .long   1104740292
+       .long   4234014665
+       .long   3229579640
+       .long   3221155884
+       .long   1761307059
+       .long   2354761811
+       .long   2209480585
+       .long   4173062034
+       .long   2164191985
+       .long   2147344473
+       .long   3522614119
+       .long   414556326
+       .long   123993874
+       .long   4051156773
+       .long   33416674
+       .long   4294688947
+       .long   2750260943
+       .long   829112653
+       .long   247987749
+       .long   3807346250
+       .long   66833348
+       .long   4294410598
+       .long   1205554591
+       .long   1658225307
+       .long   495975499
+       .long   3319725204
+       .long   133666696
+       .long   4293853900
+       .long   2411109183
+       .long   3316450614
+       .long   991950999
+       .long   2344483112
+       .long   267333393
+       .long   4292740504
+       .long   527251070
+       .long   2337933933
+       .long   1983901999
+       .long   393998928
+       .long   534666787
+       .long   4290513712
+       .long   1054502141
+       .long   380900570
+       .long   3967803999
+       .long   787997856
+       .long   1069333574
+       .long   4286060128
+       .long   2109004283
+       .long   761801140
+       .long   3640640703
+       .long   1575995713
+       .long   2138667148
+       .long   4277152960
+       .long   4218008566
+       .long   1523602280
+       .long   2986314111
+       .long   3151991427
+       .long   4277334296
+       .long   4259338624
+       .long   4141049836
+       .long   3047204561
+       .long   1677660927
+       .long   2009015559
+       .long   4259701297
+       .long   4223709953
+       .long   3987132377
+       .long   1799441827
+       .long   3355321855
+       .long   4018031118
+       .long   4224435298
+       .long   4152452611
+       .long   3679297459
+       .long   3598883655
+       .long   2415676415
+       .long   3741094941
+       .long   4153903301
+       .long   4009937927
+       .long   3063627623
+       .long   2902800015
+       .long   536385535
+       .long   3187222587
+       .long   4012839307
+       .long   3724908559
+       .long   1832287951
+       .long   1510632735
+       .long   1072771071
+       .long   2079477878
+       .long   3730711318
+       .long   3154849823
+       .long   3664575902
+       .long   3021265470
+       .long   2145542143
+       .long   4158955756
+       .long   3166455341
+       .long   2014732351
+       .long   3034184508
+       .long   1747563645
+       .long   4291084286
+       .long   4022944216
+       .long   2037943386
+       .long   4029464703
+       .long   1773401721
+       .long   3495127291
+       .long   4287201277
+       .long   3750921137
+       .long   4075886773
+       .long   3763962110
+       .long   3546803442
+       .long   2695287286
+       .long   4279435259
+       .long   3206874979
+       .long   3856806251
+       .long   3232956925
+       .long   2798639588
+       .long   1095607277
+       .long   4263903223
+       .long   2118782663
+       .long   3418645206
+       .long   2170946555
+       .long   1302311881
+       .long   2191214555
+       .long   4232839151
+       .long   4237565327
+       .long   2542323117
+       .long   46925815
+       .long   2604623763
+       .long   87461814
+       .long   4170711006
+       .long   4180163359
+       .long   789678938
+       .long   93851631
+       .long   914280231
+       .long   174923629
+       .long   4046454716
+       .long   4065359423
+       .long   1579357876
+       .long   187703262
+       .long   1828560463
+       .long   349847258
+       .long   3797942136
+       .long   3835751551
+       .long   3158715752
+       .long   375406524
+       .long   3657120927
+       .long   699694516
+       .long   3300916976
+       .long   3376535807
+       .long   2022464208
+       .long   750813049
+       .long   3019274558
+       .long   1399389033
+       .long   2306866656
+       .long   2458104319
+       .long   4044928416
+       .long   1501626098
+       .long   1743581820
+       .long   2798778067
+       .long   318766016
+       .long   621241343
+       .long   3794889537
+       .long   3003252197
+       .long   3487163641
+       .long   1302588838
+       .long   637532033
+       .long   1242482686
+       .long   3294811778
+       .long   1711537099
+       .long   2679359986
+       .long   2605177677
+       .long   1275064066
+       .long   2484965372
+       .long   2294656261
+       .long   3423074199
+       .long   1063752677
+       .long   915388059
+       .long   2550128133
+       .long   674963448
+       .long   294345226
+       .long   2551181103
+       .long   2127505355
+       .long   1830776118
+       .long   805288971
+       .long   1349926897
+       .long   588690452
+       .long   807394910
+       .long   4255010710
+       .long   3661552236
+       .long   1610577942
+       .long   2699853794
+       .long   1177380905
+       .long   1614789820
+       .long   4215054124
+       .long   3028137177
+       .long   3221155884
+       .long   1104740292
+       .long   2354761811
+       .long   3229579640
+       .long   4135140952
+       .long   1761307059
+       .long   2147344473
+       .long   2209480585
+       .long   414556326
+       .long   2164191985
+       .long   3975314608
+       .long   3522614119
+       .long   4294688947
+       .long   123993874
+       .long   829112653
+       .long   33416674
+       .long   3655661921
+       .long   2750260943
+       .long   4294410598
+       .long   247987749
+       .long   1658225307
+       .long   66833348
+       .long   3016356546
+       .long   1205554591
+       .long   4293853900
+       .long   495975499
+       .long   3316450614
+       .long   133666696
+       .long   1737745796
+       .long   2411109183
+       .long   4292740504
+       .long   991950999
+       .long   2337933933
+       .long   267333393
+       .long   3475491593
+       .long   527251070
+       .long   4290513712
+       .long   1983901999
+       .long   380900570
+       .long   534666787
+       .long   2656015891
+       .long   1054502141
+       .long   4286060128
+       .long   3967803999
+       .long   761801140
+       .long   1069333574
+       .long   1017064486
+       .long   2109004283
+       .long   4277152960
+       .long   3640640703
+       .long   1523602280
+       .long   2138667148
+       .long   2034128973
+       .long   4218008566
+       .long   4259338624
+       .long   2986314111
+       .long   3047204561
+       .long   4277334296
+       .long   4068257947
+       .long   4141049836
+       .long   4223709953
+       .long   1677660927
+       .long   1799441827
+       .long   4259701297
+       .long   3841548598
+       .long   3987132377
+       .long   4152452611
+       .long   3355321855
+       .long   3598883655
+       .long   4224435298
+       .long   3388129901
+       .long   3679297459
+       .long   4009937927
+       .long   2415676415
+       .long   2902800015
+       .long   4153903301
+       .long   2481292507
+       .long   3063627623
+       .long   3724908559
+       .long   536385535
+       .long   1510632735
+       .long   4012839307
+       .long   667617719
+       .long   1832287951
+       .long   3154849823
+       .long   1072771071
+       .long   3021265470
+       .long   3730711318
+       .long   1335235438
+       .long   3664575902
+       .long   2014732351
+       .long   2145542143
+       .long   1747563645
+       .long   3166455341
+       .long   2670470877
+       .long   3034184508
+       .long   4029464703
+       .long   4291084286
+       .long   3495127291
+       .long   2037943386
+       .long   1045974458
+       .long   1773401721
+       .long   3763962110
+       .long   4287201277
+       .long   2695287286
+       .long   4075886773
+       .long   2091948916
+       .long   3546803442
+       .long   3232956925
+       .long   4279435259
+       .long   1095607277
+       .long   3856806251
+       .long   4183897833
+       .long   2798639588
+       .long   2170946555
+       .long   4263903223
+       .long   2191214555
+       .long   3418645206
+       .long   4072828371
+       .long   1302311881
+       .long   46925815
+       .long   4232839151
+       .long   87461814
+       .long   2542323117
+       .long   3850689447
+       .long   2604623763
+       .long   93851631
+       .long   4170711006
+       .long   174923629
+       .long   789678938
+       .long   3406411599
+       .long   914280231
+       .long   187703262
+       .long   4046454716
+       .long   349847258
+       .long   1579357876
+       .long   2517855902
+       .long   1828560463
+       .long   375406524
+       .long   3797942136
+       .long   699694516
+       .long   3158715752
+       .long   740744509
+       .long   3657120927
+       .long   750813049
+       .long   3300916976
+       .long   1399389033
+       .long   2022464208
+       .long   1481489018
+       .long   3019274558
+       .long   1501626098
+       .long   2306866656
+       .long   2798778067
+       .long   4044928416
+       .long   2962978036
+       .long   1743581820
+       .long   3003252197
+       .long   318766016
+       .long   1302588838
+       .long   3794889537
+       .long   1630988776
+       .long   3487163641
+       .long   1711537099
+       .long   637532033
+       .long   2605177677
+       .long   3294811778
+       .long   3261977553
+       .long   2679359986
+       .long   3423074199
+       .long   1275064066
+       .long   915388059
+       .long   2294656261
+       .long   2228987811
+       .long   1063752677
+       .long   2551181103
+       .long   2550128133
+       .long   1830776118
+       .long   294345226
+       .long   163008326
+       .long   2127505355
+       .long   807394910
+       .long   805288971
+       .long   3661552236
+       .long   588690452
+       .long   326016652
+       .long   4255010710
+       .long   1614789820
+       .long   1610577942
+       .long   3028137177
+       .long   1177380905
+       .long   652033304
+       .long   4215054124
+       .long   3229579640
+       .long   3221155884
+       .long   1761307059
+       .long   2354761811
+       .long   1304066609
+       .long   4135140952
+       .long   2164191985
+       .long   2147344473
+       .long   3522614119
+       .long   414556326
+       .long   2608133219
+       .long   3975314608
+       .long   33416674
+       .long   4294688947
+       .long   2750260943
+       .long   829112653
+       .long   921299143
+       .long   3655661921
+       .long   66833348
+       .long   4294410598
+       .long   1205554591
+       .long   1658225307
+       .long   1842598287
+       .long   3016356546
+       .long   133666696
+       .long   4293853900
+       .long   2411109183
+       .long   3316450614
+       .long   3685196575
+       .long   1737745796
+       .long   267333393
+       .long   4292740504
+       .long   527251070
+       .long   2337933933
+       .long   3075425855
+       .long   3475491593
+       .long   534666787
+       .long   4290513712
+       .long   1054502141
+       .long   380900570
+       .long   1855884414
+       .long   2656015891
+       .long   1069333574
+       .long   4286060128
+       .long   2109004283
+       .long   761801140
+       .long   3711768829
+       .long   1017064486
+       .long   2138667148
+       .long   4277152960
+       .long   4218008566
+       .long   1523602280
+       .long   3128570363
+       .long   2034128973
+       .long   4277334296
+       .long   4259338624
+       .long   4141049836
+       .long   3047204561
+       .long   1962173430
+       .long   4068257947
+       .long   4259701297
+       .long   4223709953
+       .long   3987132377
+       .long   1799441827
+       .long   3924346860
+       .long   3841548598
+       .long   4224435298
+       .long   4152452611
+       .long   3679297459
+       .long   3598883655
+       .long   3553726425
+       .long   3388129901
+       .long   4153903301
+       .long   4009937927
+       .long   3063627623
+       .long   2902800015
+       .long   2812485555
+       .long   2481292507
+       .long   4012839307
+       .long   3724908559
+       .long   1832287951
+       .long   1510632735
+       .long   1330003814
+       .long   667617719
+       .long   3730711318
+       .long   3154849823
+       .long   3664575902
+       .long   3021265470
+       .long   2660007629
+       .long   1335235438
+       .long   3166455341
+       .long   2014732351
+       .long   3034184508
+       .long   1747563645
+       .long   1025047962
+       .long   2670470877
+       .long   2037943386
+       .long   4029464703
+       .long   1773401721
+       .long   3495127291
+       .long   2050095924
+       .long   1045974458
+       .long   4075886773
+       .long   3763962110
+       .long   3546803442
+       .long   2695287286
+       .long   4100191849
+       .long   2091948916
+       .long   3856806251
+       .long   3232956925
+       .long   2798639588
+       .long   1095607277
+       .long   3905416403
+       .long   4183897833
+       .long   3418645206
+       .long   2170946555
+       .long   1302311881
+       .long   2191214555
+       .long   3515865511
+       .long   4072828371
+       .long   2542323117
+       .long   46925815
+       .long   2604623763
+       .long   87461814
+       .long   2736763727
+       .long   3850689447
+       .long   789678938
+       .long   93851631
+       .long   914280231
+       .long   174923629
+       .long   1178560158
+       .long   3406411599
+       .long   1579357876
+       .long   187703262
+       .long   1828560463
+       .long   349847258
+       .long   2357120316
+       .long   2517855902
+       .long   3158715752
+       .long   375406524
+       .long   3657120927
+       .long   699694516
+       .long   419273337
+       .long   740744509
+       .long   2022464208
+       .long   750813049
+       .long   3019274558
+       .long   1399389033
+       .long   838546674
+       .long   1481489018
+       .long   4044928416
+       .long   1501626098
+       .long   1743581820
+       .long   2798778067
+       .long   1677093349
+       .long   2962978036
+       .long   3794889537
+       .long   3003252197
+       .long   3487163641
+       .long   1302588838
+       .long   3354186699
+       .long   1630988776
+       .long   3294811778
+       .long   1711537099
+       .long   2679359986
+       .long   2605177677
+       .long   2413406103
+       .long   3261977553
+       .long   2294656261
+       .long   3423074199
+       .long   1063752677
+       .long   915388059
+       .long   531844911
+       .long   2228987811
+       .long   294345226
+       .long   2551181103
+       .long   2127505355
+       .long   1830776118
+       .long   1063689823
+       .long   163008326
+       .long   588690452
+       .long   807394910
+       .long   4255010710
+       .long   3661552236
+       .long   2127379647
+       .long   326016652
+       .long   1177380905
+       .long   1614789820
+       .long   4215054124
+       .long   3028137177
+       .long   4254759295
+       .long   652033304
+       .long   2354761811
+       .long   3229579640
+       .long   4135140952
+       .long   1761307059
+       .long   4214551295
+       .long   1304066609
+       .long   414556326
+       .long   2164191985
+       .long   3975314608
+       .long   3522614119
+       .long   4134135294
+       .long   2608133219
+       .long   829112653
+       .long   33416674
+       .long   3655661921
+       .long   2750260943
+       .long   3973303293
+       .long   921299143
+       .long   1658225307
+       .long   66833348
+       .long   3016356546
+       .long   1205554591
+       .long   3651639290
+       .long   1842598287
+       .long   3316450614
+       .long   133666696
+       .long   1737745796
+       .long   2411109183
+       .long   3008311285
+       .long   3685196575
+       .long   2337933933
+       .long   267333393
+       .long   3475491593
+       .long   527251070
+       .long   1721655274
+       .long   3075425855
+       .long   380900570
+       .long   534666787
+       .long   2656015891
+       .long   1054502141
+       .long   3443310548
+       .long   1855884414
+       .long   761801140
+       .long   1069333574
+       .long   1017064486
+       .long   2109004283
+       .long   2591653800
+       .long   3711768829
+       .long   1523602280
+       .long   2138667148
+       .long   2034128973
+       .long   4218008566
+       .long   888340305
+       .long   3128570363
+       .long   3047204561
+       .long   4277334296
+       .long   4068257947
+       .long   4141049836
+       .long   1776680610
+       .long   1962173430
+       .long   1799441827
+       .long   4259701297
+       .long   3841548598
+       .long   3987132377
+       .long   3553361221
+       .long   3924346860
+       .long   3598883655
+       .long   4224435298
+       .long   3388129901
+       .long   3679297459
+       .long   2811755147
+       .long   3553726425
+       .long   2902800015
+       .long   4153903301
+       .long   2481292507
+       .long   3063627623
+       .long   1328542998
+       .long   2812485555
+       .long   1510632735
+       .long   4012839307
+       .long   667617719
+       .long   1832287951
+       .long   2657085997
+       .long   1330003814
+       .long   3021265470
+       .long   3730711318
+       .long   1335235438
+       .long   3664575902
+       .long   1019204698
+       .long   2660007629
+       .long   1747563645
+       .long   3166455341
+       .long   2670470877
+       .long   3034184508
+       .long   2038409397
+       .long   1025047962
+       .long   3495127291
+       .long   2037943386
+       .long   1045974458
+       .long   1773401721
+       .long   4076818795
+       .long   2050095924
+       .long   2695287286
+       .long   4075886773
+       .long   2091948916
+       .long   3546803442
+       .long   3858670295
+       .long   4100191849
+       .long   1095607277
+       .long   3856806251
+       .long   4183897833
+       .long   2798639588
+       .long   3422373294
+       .long   3905416403
+       .long   2191214555
+       .long   3418645206
+       .long   4072828371
+       .long   1302311881
+       .long   2549779293
+       .long   3515865511
+       .long   87461814
+       .long   2542323117
+       .long   3850689447
+       .long   2604623763
+       .long   804591290
+       .long   2736763727
+       .long   174923629
+       .long   789678938
+       .long   3406411599
+       .long   914280231
+       .long   1609182581
+       .long   1178560158
+       .long   349847258
+       .long   1579357876
+       .long   2517855902
+       .long   1828560463
+       .long   3218365162
+       .long   2357120316
+       .long   699694516
+       .long   3158715752
+       .long   740744509
+       .long   3657120927
+       .long   2141763028
+       .long   419273337
+       .long   1399389033
+       .long   2022464208
+       .long   1481489018
+       .long   3019274558
+       .long   4283526057
+       .long   838546674
+       .long   2798778067
+       .long   4044928416
+       .long   2962978036
+       .long   1743581820
+       .long   4272084818
+       .long   1677093349
+       .long   1302588838
+       .long   3794889537
+       .long   1630988776
+       .long   3487163641
+       .long   4249202340
+       .long   3354186699
+       .long   2605177677
+       .long   3294811778
+       .long   3261977553
+       .long   2679359986
+       .long   4203437385
+       .long   2413406103
+       .long   915388059
+       .long   2294656261
+       .long   2228987811
+       .long   1063752677
+       .long   4111907475
+       .long   531844911
+       .long   1830776118
+       .long   294345226
+       .long   163008326
+       .long   2127505355
+       .long   3928847655
+       .long   1063689823
+       .long   3661552236
+       .long   588690452
+       .long   326016652
+       .long   4255010710
+       .long   3562728015
+       .long   2127379647
+       .long   3028137177
+       .long   1177380905
+       .long   652033304
+       .long   4215054124
+       .long   2830488734
+       .long   4254759295
+       .long   1761307059
+       .long   2354761811
+       .long   1304066609
+       .long   4135140952
+       .long   1366010173
+       .long   4214551295
+       .long   3522614119
+       .long   414556326
+       .long   2608133219
+       .long   3975314608
+       .long   2732020347
+       .long   4134135294
+       .long   2750260943
+       .long   829112653
+       .long   921299143
+       .long   3655661921
+       .long   1169073399
+       .long   3973303293
+       .long   1205554591
+       .long   1658225307
+       .long   1842598287
+       .long   3016356546
+       .long   2338146798
+       .long   3651639290
+       .long   2411109183
+       .long   3316450614
+       .long   3685196575
+       .long   1737745796
+       .long   381326301
+       .long   3008311285
+       .long   527251070
+       .long   2337933933
+       .long   3075425855
+       .long   3475491593
+       .long   762652602
+       .long   1721655274
+       .long   1054502141
+       .long   380900570
+       .long   1855884414
+       .long   2656015891
+       .long   1525305205
+       .long   3443310548
+       .long   2109004283
+       .long   761801140
+       .long   3711768829
+       .long   1017064486
+       .long   3050610411
+       .long   2591653800
+       .long   4218008566
+       .long   1523602280
+       .long   3128570363
+       .long   2034128973
+       .long   1806253526
+       .long   888340305
+       .long   4141049836
+       .long   3047204561
+       .long   1962173430
+       .long   4068257947
+       .long   3612507052
+       .long   1776680610
+       .long   3987132377
+       .long   1799441827
+       .long   3924346860
+       .long   3841548598
+       .long   2930046808
+       .long   3553361221
+       .long   3679297459
+       .long   3598883655
+       .long   3553726425
+       .long   3388129901
+       .long   1565126321
+       .long   2811755147
+       .long   3063627623
+       .long   2902800015
+       .long   2812485555
+       .long   2481292507
+       .long   3130252643
+       .long   1328542998
+       .long   1832287951
+       .long   1510632735
+       .long   1330003814
+       .long   667617719
+       .long   1965537991
+       .long   2657085997
+       .long   3664575902
+       .long   3021265470
+       .long   2660007629
+       .long   1335235438
+       .long   3931075983
+       .long   1019204698
+       .long   3034184508
+       .long   1747563645
+       .long   1025047962
+       .long   2670470877
+       .long   3567184671
+       .long   2038409397
+       .long   1773401721
+       .long   3495127291
+       .long   2050095924
+       .long   1045974458
+       .long   2839402047
+       .long   4076818795
+       .long   3546803442
+       .long   2695287286
+       .long   4100191849
+       .long   2091948916
+       .long   1383836798
+       .long   3858670295
+       .long   2798639588
+       .long   1095607277
+       .long   3905416403
+       .long   4183897833
+       .long   2767673597
+       .long   3422373294
+       .long   1302311881
+       .long   2191214555
+       .long   3515865511
+       .long   4072828371
+       .long   1240379898
+       .long   2549779293
+       .long   2604623763
+       .long   87461814
+       .long   2736763727
+       .long   3850689447
+       .long   2480759797
+       .long   804591290
+       .long   914280231
+       .long   174923629
+       .long   1178560158
+       .long   3406411599
+       .long   666552299
+       .long   1609182581
+       .long   1828560463
+       .long   349847258
+       .long   2357120316
+       .long   2517855902
+       .long   1333104599
+       .long   3218365162
+       .long   3657120927
+       .long   699694516
+       .long   419273337
+       .long   740744509
+       .long   2666209199
+       .long   2141763028
+       .long   3019274558
+       .long   1399389033
+       .long   838546674
+       .long   1481489018
+       .long   1037451103
+       .long   4283526057
+       .long   1743581820
+       .long   2798778067
+       .long   1677093349
+       .long   2962978036
+       .long   2074902206
+       .long   4272084818
+       .long   3487163641
+       .long   1302588838
+       .long   3354186699
+       .long   1630988776
+       .long   4149804412
+       .long   4249202340
+       .long   2679359986
+       .long   2605177677
+       .long   2413406103
+       .long   3261977553
+       .long   4004641529
+       .long   4203437385
+       .long   1063752677
+       .long   915388059
+       .long   531844911
+       .long   2228987811
+       .long   3714315762
+       .long   4111907475
+       .long   2127505355
+       .long   1830776118
+       .long   1063689823
+       .long   163008326
+       .long   3133664229
+       .long   3928847655
+       .long   4255010710
+       .long   3661552236
+       .long   2127379647
+       .long   326016652
+       .long   1972361163
+       .long   3562728015
+       .long   4215054124
+       .long   3028137177
+       .long   4254759295
+       .long   652033304
+       .long   3944722327
+       .long   2830488734
+       .long   4135140952
+       .long   1761307059
+       .long   4214551295
+       .long   1304066609
+       .long   3594477359
+       .long   1366010173
+       .long   3975314608
+       .long   3522614119
+       .long   4134135294
+       .long   2608133219
+       .long   2893987423
+       .long   2732020347
+       .long   3655661921
+       .long   2750260943
+       .long   3973303293
+       .long   921299143
+       .long   1493007550
+       .long   1169073399
+       .long   3016356546
+       .long   1205554591
+       .long   3651639290
+       .long   1842598287
+       .long   2986015100
+       .long   2338146798
+       .long   1737745796
+       .long   2411109183
+       .long   3008311285
+       .long   3685196575
+       .long   1677062904
+       .long   381326301
+       .long   3475491593
+       .long   527251070
+       .long   1721655274
+       .long   3075425855
+       .long   3354125809
+       .long   762652602
+       .long   2656015891
+       .long   1054502141
+       .long   3443310548
+       .long   1855884414
+       .long   2413284322
+       .long   1525305205
+       .long   1017064486
+       .long   2109004283
+       .long   2591653800
+       .long   3711768829
+       .long   531601349
+       .long   3050610411
+       .long   2034128973
+       .long   4218008566
+       .long   888340305
+       .long   3128570363
+       .long   1063202699
+       .long   1806253526
+       .long   4068257947
+       .long   4141049836
+       .long   1776680610
+       .long   1962173430
+       .long   2126405399
+       .long   3612507052
+       .long   3841548598
+       .long   3987132377
+       .long   3553361221
+       .long   3924346860
+       .long   4252810799
+       .long   2930046808
+       .long   3388129901
+       .long   3679297459
+       .long   2811755147
+       .long   3553726425
+       .long   4210654302
+       .long   1565126321
+       .long   2481292507
+       .long   3063627623
+       .long   1328542998
+       .long   2812485555
+       .long   4126341309
+       .long   3130252643
+       .long   667617719
+       .long   1832287951
+       .long   2657085997
+       .long   1330003814
+       .long   3957715323
+       .long   1965537991
+       .long   1335235438
+       .long   3664575902
+       .long   1019204698
+       .long   2660007629
+       .long   3620463350
+       .long   3931075983
+       .long   2670470877
+       .long   3034184508
+       .long   2038409397
+       .long   1025047962
+       .long   2945959404
+       .long   3567184671
+       .long   1045974458
+       .long   1773401721
+       .long   4076818795
+       .long   2050095924
+       .long   1596951513
+       .long   2839402047
+       .long   2091948916
+       .long   3546803442
+       .long   3858670295
+       .long   4100191849
+       .long   3193903027
+       .long   1383836798
+       .long   4183897833
+       .long   2798639588
+       .long   3422373294
+       .long   3905416403
+       .long   2092838759
+       .long   2767673597
+       .long   4072828371
+       .long   1302311881
+       .long   2549779293
+       .long   3515865511
+       .long   4185677519
+       .long   1240379898
+       .long   3850689447
+       .long   2604623763
+       .long   804591290
+       .long   2736763727
+       .long   4076387742
+       .long   2480759797
+       .long   3406411599
+       .long   914280231
+       .long   1609182581
+       .long   1178560158
+       .long   3857808189
+       .long   666552299
+       .long   2517855902
+       .long   1828560463
+       .long   3218365162
+       .long   2357120316
+       .long   3420649082
+       .long   1333104599
+       .long   740744509
+       .long   3657120927
+       .long   2141763028
+       .long   419273337
+       .long   2546330868
+       .long   2666209199
+       .long   1481489018
+       .long   3019274558
+       .long   4283526057
+       .long   838546674
+       .long   797694440
+       .long   1037451103
+       .long   2962978036
+       .long   1743581820
+       .long   4272084818
+       .long   1677093349
+       .long   1595388880
+       .long   2074902206
+       .long   1630988776
+       .long   3487163641
+       .long   4249202340
+       .long   3354186699
+       .long   3190777760
+       .long   4149804412
+       .long   3261977553
+       .long   2679359986
+       .long   4203437385
+       .long   2413406103
+       .long   2086588225
+       .long   4004641529
+       .long   2228987811
+       .long   1063752677
+       .long   4111907475
+       .long   531844911
+       .long   4173176451
+       .long   3714315762
+       .long   163008326
+       .long   2127505355
+       .long   3928847655
+       .long   1063689823
+       .long   4051385607
+       .long   3133664229
+       .long   326016652
+       .long   4255010710
+       .long   3562728015
+       .long   2127379647
+       .long   3807803918
+       .long   1972361163
+       .long   652033304
+       .long   4215054124
+       .long   2830488734
+       .long   4254759295
+       .long   3320640540
+       .long   3944722327
+       .long   1304066609
+       .long   4135140952
+       .long   1366010173
+       .long   4214551295
+       .long   2346313785
+       .long   3594477359
+       .long   2608133219
+       .long   3975314608
+       .long   2732020347
+       .long   4134135294
+       .long   397660275
+       .long   2893987423
+       .long   921299143
+       .long   3655661921
+       .long   1169073399
+       .long   3973303293
+       .long   795320551
+       .long   1493007550
+       .long   1842598287
+       .long   3016356546
+       .long   2338146798
+       .long   3651639290
+       .long   1590641102
+       .long   2986015100
+       .long   3685196575
+       .long   1737745796
+       .long   381326301
+       .long   3008311285
+       .long   3181282204
+       .long   1677062904
+       .long   3075425855
+       .long   3475491593
+       .long   762652602
+       .long   1721655274
+       .long   2067597113
+       .long   3354125809
+       .long   1855884414
+       .long   2656015891
+       .long   1525305205
+       .long   3443310548
+       .long   4135194227
+       .long   2413284322
+       .long   3711768829
+       .long   1017064486
+       .long   3050610411
+       .long   2591653800
+       .long   3975421159
+       .long   531601349
+       .long   3128570363
+       .long   2034128973
+       .long   1806253526
+       .long   888340305
+       .long   3655875023
+       .long   1063202699
+       .long   1962173430
+       .long   4068257947
+       .long   3612507052
+       .long   1776680610
+       .long   3016782751
+       .long   2126405399
+       .long   3924346860
+       .long   3841548598
+       .long   2930046808
+       .long   3553361221
+       .long   1738598206
+       .long   4252810799
+       .long   3553726425
+       .long   3388129901
+       .long   1565126321
+       .long   2811755147
+       .long   3477196413
+       .long   4210654302
+       .long   2812485555
+       .long   2481292507
+       .long   3130252643
+       .long   1328542998
+       .long   2659425531
+       .long   4126341309
+       .long   1330003814
+       .long   667617719
+       .long   1965537991
+       .long   2657085997
+       .long   1023883767
+       .long   3957715323
+       .long   2660007629
+       .long   1335235438
+       .long   3931075983
+       .long   1019204698
+       .long   2047767535
+       .long   3620463350
+       .long   1025047962
+       .long   2670470877
+       .long   3567184671
+       .long   2038409397
+       .long   4095535070
+       .long   2945959404
+       .long   2050095924
+       .long   1045974458
+       .long   2839402047
+       .long   4076818795
+       .long   3896102844
+       .long   1596951513
+       .long   4100191849
+       .long   2091948916
+       .long   1383836798
+       .long   3858670295
+       .long   3497238392
+       .long   3193903027
+       .long   3905416403
+       .long   4183897833
+       .long   2767673597
+       .long   3422373294
+       .long   2699509489
+       .long   2092838759
+       .long   3515865511
+       .long   4072828371
+       .long   1240379898
+       .long   2549779293
+       .long   1104051682
+       .long   4185677519
+       .long   2736763727
+       .long   3850689447
+       .long   2480759797
+       .long   804591290
+       .long   2208103365
+       .long   4076387742
+       .long   1178560158
+       .long   3406411599
+       .long   666552299
+       .long   1609182581
+       .long   121239434
+       .long   3857808189
+       .long   2357120316
+       .long   2517855902
+       .long   1333104599
+       .long   3218365162
+       .long   242478868
+       .long   3420649082
+       .long   419273337
+       .long   740744509
+       .long   2666209199
+       .long   2141763028
+       .long   484957737
+       .long   2546330868
+       .long   838546674
+       .long   1481489018
+       .long   1037451103
+       .long   4283526057
+       .long   969915474
+       .long   797694440
+       .long   1677093349
+       .long   2962978036
+       .long   2074902206
+       .long   4272084818
+       .long   1939830949
+       .long   1595388880
+       .long   3354186699
+       .long   1630988776
+       .long   4149804412
+       .long   4249202340
+       .long   3879661898
+       .long   3190777760
+       .long   2413406103
+       .long   3261977553
+       .long   4004641529
+       .long   4203437385
+       .long   3464356500
+       .long   2086588225
+       .long   531844911
+       .long   2228987811
+       .long   3714315762
+       .long   4111907475
+       .long   2633745705
+       .long   4173176451
+       .long   1063689823
+       .long   163008326
+       .long   3133664229
+       .long   3928847655
+       .long   972524114
+       .long   4051385607
+       .long   2127379647
+       .long   326016652
+       .long   1972361163
+       .long   3562728015
+       .long   1945048229
+       .long   3807803918
+       .long   4254759295
+       .long   652033304
+       .long   3944722327
+       .long   2830488734
+       .long   3890096458
+       .long   3320640540
+       .long   4214551295
+       .long   1304066609
+       .long   3594477359
+       .long   1366010173
+       .long   3485225620
+       .long   2346313785
+       .long   4134135294
+       .long   2608133219
+       .long   2893987423
+       .long   2732020347
+       .long   2675483945
+       .long   397660275
+       .long   3973303293
+       .long   921299143
+       .long   1493007550
+       .long   1169073399
+       .long   1056000594
+       .long   795320551
+       .long   3651639290
+       .long   1842598287
+       .long   2986015100
+       .long   2338146798
+       .long   2112001188
+       .long   1590641102
+       .long   3008311285
+       .long   3685196575
+       .long   1677062904
+       .long   381326301
+       .long   4224002377
+       .long   3181282204
+       .long   1721655274
+       .long   3075425855
+       .long   3354125809
+       .long   762652602
+       .long   4153037458
+       .long   2067597113
+       .long   3443310548
+       .long   1855884414
+       .long   2413284322
+       .long   1525305205
+       .long   4011107621
+       .long   4135194227
+       .long   2591653800
+       .long   3711768829
+       .long   531601349
+       .long   3050610411
+       .long   3727247947
+       .long   3975421159
+       .long   888340305
+       .long   3128570363
+       .long   1063202699
+       .long   1806253526
+       .long   3159528599
+       .long   3655875023
+       .long   1776680610
+       .long   1962173430
+       .long   2126405399
+       .long   3612507052
+       .long   2024089902
+       .long   3016782751
+       .long   3553361221
+       .long   3924346860
+       .long   4252810799
+       .long   2930046808
+       .long   4048179805
+       .long   1738598206
+       .long   2811755147
+       .long   3553726425
+       .long   4210654302
+       .long   1565126321
+       .long   3801392314
+       .long   3477196413
+       .long   1328542998
+       .long   2812485555
+       .long   4126341309
+       .long   3130252643
+       .long   3307817333
+       .long   2659425531
+       .long   2657085997
+       .long   1330003814
+       .long   3957715323
+       .long   1965537991
+       .long   2320667370
+       .long   1023883767
+       .long   1019204698
+       .long   2660007629
+       .long   3620463350
+       .long   3931075983
+       .long   346367444
+       .long   2047767535
+       .long   2038409397
+       .long   1025047962
+       .long   2945959404
+       .long   3567184671
+       .long   692734889
+       .long   4095535070
+       .long   4076818795
+       .long   2050095924
+       .long   1596951513
+       .long   2839402047
+       .long   1385469779
+       .long   3896102844
+       .long   3858670295
+       .long   4100191849
+       .long   3193903027
+       .long   1383836798
+       .long   2770939558
+       .long   3497238392
+       .long   3422373294
+       .long   3905416403
+       .long   2092838759
+       .long   2767673597
+       .long   1246911821
+       .long   2699509489
+       .long   2549779293
+       .long   3515865511
+       .long   4185677519
+       .long   1240379898
+       .long   2493823642
+       .long   1104051682
+       .long   804591290
+       .long   2736763727
+       .long   4076387742
+       .long   2480759797
+       .long   692679989
+       .long   2208103365
+       .long   1609182581
+       .long   1178560158
+       .long   3857808189
+       .long   666552299
+       .long   1385359979
+       .long   121239434
+       .long   3218365162
+       .long   2357120316
+       .long   3420649082
+       .long   1333104599
+       .long   2770719959
+       .long   242478868
+       .long   2141763028
+       .long   419273337
+       .long   2546330868
+       .long   2666209199
+       .long   1246472623
+       .long   484957737
+       .long   4283526057
+       .long   838546674
+       .long   797694440
+       .long   1037451103
+       .long   2492945247
+       .long   969915474
+       .long   4272084818
+       .long   1677093349
+       .long   1595388880
+       .long   2074902206
+       .long   690923199
+       .long   1939830949
+       .long   4249202340
+       .long   3354186699
+       .long   3190777760
+       .long   4149804412
+       .long   1381846399
+       .long   3879661898
+       .long   4203437385
+       .long   2413406103
+       .long   2086588225
+       .long   4004641529
+       .long   2763692798
+       .long   3464356500
+       .long   4111907475
+       .long   531844911
+       .long   4173176451
+       .long   3714315762
+       .long   1232418301
+       .long   2633745705
+       .long   3928847655
+       .long   1063689823
+       .long   4051385607
+       .long   3133664229
+       .long   2464836603
+       .long   972524114
+       .long   3562728015
+       .long   2127379647
+       .long   3807803918
+       .long   1972361163
+       .long   634705910
+       .long   1945048229
+       .long   2830488734
+       .long   4254759295
+       .long   3320640540
+       .long   3944722327
+       .long   1269411821
+       .long   3890096458
+       .long   1366010173
+       .long   4214551295
+       .long   2346313785
+       .long   3594477359
+       .long   2538823642
+       .long   3485225620
+       .long   2732020347
+       .long   4134135294
+       .long   397660275
+       .long   2893987423
+       .long   782679989
+       .long   2675483945
+       .long   1169073399
+       .long   3973303293
+       .long   795320551
+       .long   1493007550
+       .long   1565359979
+       .long   1056000594
+       .long   2338146798
+       .long   3651639290
+       .long   1590641102
+       .long   2986015100
+       .long   3130719959
+       .long   2112001188
+       .long   381326301
+       .long   3008311285
+       .long   3181282204
+       .long   1677062904
+       .long   1966472623
+       .long   4224002377
+       .long   762652602
+       .long   1721655274
+       .long   2067597113
+       .long   3354125809
+       .long   3932945247
+       .long   4153037458
+       .long   1525305205
+       .long   3443310548
+       .long   4135194227
+       .long   2413284322
+       .long   3570923199
+       .long   4011107621
+       .long   3050610411
+       .long   2591653800
+       .long   3975421159
+       .long   531601349
+       .long   2846879102
+       .long   3727247947
+       .long   1806253526
+       .long   888340305
+       .long   3655875023
+       .long   1063202699
+       .long   1398790909
+       .long   3159528599
+       .long   3612507052
+       .long   1776680610
+       .long   3016782751
+       .long   2126405399
+       .long   2797581819
+       .long   2024089902
+       .long   2930046808
+       .long   3553361221
+       .long   1738598206
+       .long   4252810799
+       .long   1300196342
+       .long   4048179805
+       .long   1565126321
+       .long   2811755147
+       .long   3477196413
+       .long   4210654302
+       .long   2600392684
+       .long   3801392314
+       .long   3130252643
+       .long   1328542998
+       .long   2659425531
+       .long   4126341309
+       .long   905818072
+       .long   3307817333
+       .long   1965537991
+       .long   2657085997
+       .long   1023883767
+       .long   3957715323
+       .long   1811636145
+       .long   2320667370
+       .long   3931075983
+       .long   1019204698
+       .long   2047767535
+       .long   3620463350
+       .long   3623272290
+       .long   346367444
+       .long   3567184671
+       .long   2038409397
+       .long   4095535070
+       .long   2945959404
+       .long   2951577284
+       .long   692734889
+       .long   2839402047
+       .long   4076818795
+       .long   3896102844
+       .long   1596951513
+       .long   1608187272
+       .long   1385469779
+       .long   1383836798
+       .long   3858670295
+       .long   3497238392
+       .long   3193903027
+       .long   3216374545
+       .long   2770939558
+       .long   2767673597
+       .long   3422373294
+       .long   2699509489
+       .long   2092838759
+       .long   2137781795
+       .long   1246911821
+       .long   1240379898
+       .long   2549779293
+       .long   1104051682
+       .long   4185677519
+       .long   4275563591
+       .long   2493823642
+       .long   2480759797
+       .long   804591290
+       .long   2208103365
+       .long   4076387742
+       .long   4256159887
+       .long   692679989
+       .long   666552299
+       .long   1609182581
+       .long   121239434
+       .long   3857808189
+       .long   4217352479
+       .long   1385359979
+       .long   1333104599
+       .long   3218365162
+       .long   242478868
+       .long   3420649082
+       .long   4139737663
+       .long   2770719959
+       .long   2666209199
+       .long   2141763028
+       .long   484957737
+       .long   2546330868
+       .long   3984508030
+       .long   1246472623
+       .long   1037451103
+       .long   4283526057
+       .long   969915474
+       .long   797694440
+       .long   3674048764
+       .long   2492945247
+       .long   2074902206
+       .long   4272084818
+       .long   1939830949
+       .long   1595388880
+       .long   3053130232
+       .long   690923199
+       .long   4149804412
+       .long   4249202340
+       .long   3879661898
+       .long   3190777760
+       .long   1811293169
+       .long   1381846399
+       .long   4004641529
+       .long   4203437385
+       .long   3464356500
+       .long   2086588225
+       .long   3622586339
+       .long   2763692798
+       .long   3714315762
+       .long   4111907475
+       .long   2633745705
+       .long   4173176451
+       .long   2950205382
+       .long   1232418301
+       .long   3133664229
+       .long   3928847655
+       .long   972524114
+       .long   4051385607
+       .long   1605443469
+       .long   2464836603
+       .long   1972361163
+       .long   3562728015
+       .long   1945048229
+       .long   3807803918
+       .long   3210886938
+       .long   634705910
+       .long   3944722327
+       .long   2830488734
+       .long   3890096458
+       .long   3320640540
+       .long   2126806581
+       .long   1269411821
+       .long   3594477359
+       .long   1366010173
+       .long   3485225620
+       .long   2346313785
+       .long   4253613162
+       .long   2538823642
+       .long   2893987423
+       .long   2732020347
+       .long   2675483945
+       .long   397660275
+       .long   4212259029
+       .long   782679989
+       .long   1493007550
+       .long   1169073399
+       .long   1056000594
+       .long   795320551
+       .long   4129550763
+       .long   1565359979
+       .long   2986015100
+       .long   2338146798
+       .long   2112001188
+       .long   1590641102
+       .long   3964134231
+       .long   3130719959
+       .long   1677062904
+       .long   381326301
+       .long   4224002377
+       .long   3181282204
+       .long   3633301166
+       .long   1966472623
+       .long   3354125809
+       .long   762652602
+       .long   4153037458
+       .long   2067597113
+       .long   2971635037
+       .long   3932945247
+       .long   2413284322
+       .long   1525305205
+       .long   4011107621
+       .long   4135194227
+       .long   1648302778
+       .long   3570923199
+       .long   531601349
+       .long   3050610411
+       .long   3727247947
+       .long   3975421159
+       .long   3296605556
+       .long   2846879102
+       .long   1063202699
+       .long   1806253526
+       .long   3159528599
+       .long   3655875023
+       .long   2298243816
+       .long   1398790909
+       .long   2126405399
+       .long   3612507052
+       .long   2024089902
+       .long   3016782751
+       .long   301520336
+       .long   2797581819
+       .long   4252810799
+       .long   2930046808
+       .long   4048179805
+       .long   1738598206
+       .long   603040673
+       .long   1300196342
+       .long   4210654302
+       .long   1565126321
+       .long   3801392314
+       .long   3477196413
+       .long   1206081346
+       .long   2600392684
+       .long   4126341309
+       .long   3130252643
+       .long   3307817333
+       .long   2659425531
+       .long   2412162692
+       .long   905818072
+       .long   3957715323
+       .long   1965537991
+       .long   2320667370
+       .long   1023883767
+       .long   529358088
+       .long   1811636145
+       .long   3620463350
+       .long   3931075983
+       .long   346367444
+       .long   2047767535
+       .long   1058716176
+       .long   3623272290
+       .long   2945959404
+       .long   3567184671
+       .long   692734889
+       .long   4095535070
+       .long   2117432353
+       .long   2951577284
+       .long   1596951513
+       .long   2839402047
+       .long   1385469779
+       .long   3896102844
+       .long   4234864706
+       .long   1608187272
+       .long   3193903027
+       .long   1383836798
+       .long   2770939558
+       .long   3497238392
+       .long   4174762117
+       .long   3216374545
+       .long   2092838759
+       .long   2767673597
+       .long   1246911821
+       .long   2699509489
+       .long   4054556938
+       .long   2137781795
+       .long   4185677519
+       .long   1240379898
+       .long   2493823642
+       .long   1104051682
+       .long   3814146581
+       .long   4275563591
+       .long   4076387742
+       .long   2480759797
+       .long   692679989
+       .long   2208103365
+       .long   3333325867
+       .long   4256159887
+       .long   3857808189
+       .long   666552299
+       .long   1385359979
+       .long   121239434
+       .long   2371684438
+       .long   4217352479
+       .long   3420649082
+       .long   1333104599
+       .long   2770719959
+       .long   242478868
+       .long   448401580
+       .long   4139737663
+       .long   2546330868
+       .long   2666209199
+       .long   1246472623
+       .long   484957737
+       .long   896803160
+       .long   3984508030
+       .type   __svml_dcos_reduction_data_internal,@object
+       .size   __svml_dcos_reduction_data_internal,49152
+       .space 512, 0x00        
+       .align 8
+.L_2il0floatpacket.28:
+       .long   0xffffffff,0xffffffff
+       .type   .L_2il0floatpacket.28,@object
+       .size   .L_2il0floatpacket.28,8
+       .align 8
+.L_2il0floatpacket.29:
+       .long   0x00000000,0x7ff00000
+       .type   .L_2il0floatpacket.29,@object
+       .size   .L_2il0floatpacket.29,8
+       .align 8
+.L_2il0floatpacket.30:
+       .long   0xffffffff,0x000fffff
+       .type   .L_2il0floatpacket.30,@object
+       .size   .L_2il0floatpacket.30,8
+       .align 8
+.L_2il0floatpacket.31:
+       .long   0x00000000,0x00100000
+       .type   .L_2il0floatpacket.31,@object
+       .size   .L_2il0floatpacket.31,8
+       .align 8
+.L_2il0floatpacket.32:
+       .long   0xffffffff,0x00000000
+       .type   .L_2il0floatpacket.32,@object
+       .size   .L_2il0floatpacket.32,8
+       .align 8
+.L_2il0floatpacket.33:
+       .long   0x00000000,0x80000000
+       .type   .L_2il0floatpacket.33,@object
+       .size   .L_2il0floatpacket.33,8
+       .align 8
+.L_2il0floatpacket.34:
+       .long   0x00000000,0x3ff00000
+       .type   .L_2il0floatpacket.34,@object
+       .size   .L_2il0floatpacket.34,8
+       .align 8
+.L_2il0floatpacket.35:
+       .long   0x00000000,0x42a80000
+       .type   .L_2il0floatpacket.35,@object
+       .size   .L_2il0floatpacket.35,8
+       .align 8
+.L_2il0floatpacket.36:
+       .long   0x000001ff,0x00000000
+       .type   .L_2il0floatpacket.36,@object
+       .size   .L_2il0floatpacket.36,8
+       .align 8
+.L_2il0floatpacket.37:
+       .long   0x00000000,0x39700000
+       .type   .L_2il0floatpacket.37,@object
+       .size   .L_2il0floatpacket.37,8
+       .align 8
+.L_2il0floatpacket.38:
+       .long   0x00ffffff,0x00000000
+       .type   .L_2il0floatpacket.38,@object
+       .size   .L_2il0floatpacket.38,8
+       .align 8
+.L_2il0floatpacket.39:
+       .long   0x00000000,0x3cb00000
+       .type   .L_2il0floatpacket.39,@object
+       .size   .L_2il0floatpacket.39,8
+       .align 8
+.L_2il0floatpacket.40:
+       .long   0x00000fff,0x00000000
+       .type   .L_2il0floatpacket.40,@object
+       .size   .L_2il0floatpacket.40,8
+       .align 8
+.L_2il0floatpacket.41:
+       .long   0x54442d18,0x401921fb
+       .type   .L_2il0floatpacket.41,@object
+       .size   .L_2il0floatpacket.41,8
+       .align 8
+.L_2il0floatpacket.42:
+       .long   0x33145c07,0x3cb1a626
+       .type   .L_2il0floatpacket.42,@object
+       .size   .L_2il0floatpacket.42,8
+       .align 8
+.L_2il0floatpacket.43:
+       .long   0xffffffff,0x7fffffff
+       .type   .L_2il0floatpacket.43,@object
+       .size   .L_2il0floatpacket.43,8
+       .align 8
+.L_2il0floatpacket.44:
+       .long   0x00000000,0x3eb00000
+       .type   .L_2il0floatpacket.44,@object
+       .size   .L_2il0floatpacket.44,8
+       .align 8
+__dcos_la_CoutTab:
+       .long   0
+       .long   0
+       .long   0
+       .long   2146435072
+       .type   __dcos_la_CoutTab,@object
+       .size   __dcos_la_CoutTab,16
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_cos_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_cos_s_la.s
new file mode 100644 (file)
index 0000000..4581bf6
--- /dev/null
@@ -0,0 +1,2856 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *  1) Range reduction to [-Pi/2; +Pi/2] interval
+ *     a) We remove sign using AND operation
+ *     b) Add Pi/2 value to argument X for Cos to Sin transformation
+ *     c) Getting octant Y by 1/Pi multiplication
+ *     d) Add "Right Shifter" value
+ *     e) Treat obtained value as integer for destination sign setting.
+ *        Shift first bit of this value to the last (sign) position
+ *     f) Subtract "Right Shifter"  value
+ *     g) Subtract 0.5 from result for octant correction
+ *     h) Subtract Y*PI from X argument, where PI divided to 4 parts:
+ *        X = X - Y*PI1 - Y*PI2 - Y*PI3 - Y*PI4;
+ *  2) Polynomial (minimax for sin within [-Pi/2; +Pi/2] interval)
+ *     a) Calculate X^2 = X * X
+ *     b) Calculate polynomial:
+ *        R = X + X * X^2 * (A3 + x^2 * (A5 + .....
+ *  3) Destination sign setting
+ *     a) Set shifted destination sign using XOR operation:
+ *        R = XOR( R, S );
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_cosf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_cosf16
+
+__svml_cosf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        xorl      %edx, %edx
+        vmovaps   %zmm0, %zmm11
+        vmovups   5568+__svml_scos_data_internal(%rip), %zmm0
+        vmovups   5504+__svml_scos_data_internal(%rip), %zmm4
+        vmovups   5440+__svml_scos_data_internal(%rip), %zmm3
+        vmovups   5632+__svml_scos_data_internal(%rip), %zmm6
+        vmovups   4800+__svml_scos_data_internal(%rip), %zmm9
+        vmovups   4864+__svml_scos_data_internal(%rip), %zmm7
+        vmovups   4928+__svml_scos_data_internal(%rip), %zmm8
+        vmovups   5376+__svml_scos_data_internal(%rip), %zmm14
+        vmovups   5248+__svml_scos_data_internal(%rip), %zmm15
+
+/*
+ * Check for large and special arguments
+ * VAND( S, sAX, _VARG1, sAbsMask );
+ */
+        vmovups   4160+__svml_scos_data_internal(%rip), %zmm10
+        vandps    4096+__svml_scos_data_internal(%rip), %zmm11, %zmm2
+
+/* b) Add Pi/2 value to argument X for Cos to Sin transformation */
+        vaddps    {rn-sae}, %zmm0, %zmm2, %zmm1
+        vcmpps    $18, {sae}, %zmm10, %zmm2, %k1
+
+/* _VARG1 near 0 */
+        vcmpps    $0, {sae}, %zmm0, %zmm1, %k2
+
+/*
+ * 1) Range reduction to [-Pi/2; +Pi/2] interval
+ * c) Getting octant Y by 1/Pi multiplication
+ * d) Add "Right Shifter" (0x4B000000) value
+ */
+        vfmadd213ps {rn-sae}, %zmm4, %zmm1, %zmm3
+        vpternlogd $255, %zmm10, %zmm10, %zmm10
+
+/* f) Subtract "Right Shifter" (0x4B000000) value */
+        vsubps    {rn-sae}, %zmm4, %zmm3, %zmm5
+
+/*
+ * e) Treat obtained value as integer for destination sign setting.
+ * Shift first bit of this value to the last (sign) position (S << 31)
+ */
+        vpslld    $31, %zmm3, %zmm13
+
+/* g) Subtract 0.5 from result for octant correction */
+        vsubps    {rn-sae}, %zmm6, %zmm5, %zmm12
+        vmovups   5312+__svml_scos_data_internal(%rip), %zmm5
+
+/*
+ * h) Subtract Y*PI from X argument, where PI divided to 4 parts:
+ * X = X - Y*PI1 - Y*PI2 - Y*PI3
+ */
+        vfnmadd213ps {rn-sae}, %zmm2, %zmm12, %zmm9
+        vfnmadd231ps {rn-sae}, %zmm12, %zmm7, %zmm9
+        vfnmadd213ps {rn-sae}, %zmm9, %zmm8, %zmm12
+
+/* a) Calculate X^2 = X * X */
+        vmulps    {rn-sae}, %zmm12, %zmm12, %zmm3
+
+/*
+ * 3) Destination sign setting
+ * a) Set shifted destination sign using XOR operation:
+ * R = XOR( R, S );
+ */
+        vxorps    %zmm13, %zmm12, %zmm4
+
+/*
+ * b) Calculate polynomial:
+ * R = X + X * X^2 * (A3 + x^2 * (A5 + x^2 * (A7 + x^2 * (A9))));
+ */
+        vfmadd231ps {rn-sae}, %zmm3, %zmm14, %zmm5
+        vmovups   4992+__svml_scos_data_internal(%rip), %zmm14
+        vfmadd213ps {rn-sae}, %zmm15, %zmm3, %zmm5
+        vmulps    {rn-sae}, %zmm4, %zmm3, %zmm15
+        vfmadd213ps {rn-sae}, %zmm14, %zmm3, %zmm5
+        vfmadd213ps {rn-sae}, %zmm4, %zmm15, %zmm5
+
+/* result=1.0 if arg. near 0 */
+        vblendmps 5696+__svml_scos_data_internal(%rip), %zmm5, %zmm0{%k2}
+        vpandnd   %zmm2, %zmm2, %zmm10{%k1}
+        vptestmd  %zmm10, %zmm10, %k0
+        kortestw  %k0, %k0
+        jne       .LBL_1_12
+
+.LBL_1_2:
+
+        testl     %edx, %edx
+        jne       .LBL_1_4
+
+.LBL_1_3:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_4:
+
+        vmovups   %zmm11, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_3
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_8:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_11
+
+.LBL_1_9:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_8
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_3
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_11:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_scos_cout_rare_internal
+        jmp       .LBL_1_9
+       .cfi_restore 4
+       .cfi_restore 5
+       .cfi_restore 12
+       .cfi_restore 13
+       .cfi_restore 122
+       .cfi_restore 123
+       .cfi_restore 124
+       .cfi_restore 125
+
+.LBL_1_12:
+
+        vmovups   4224+__svml_scos_data_internal(%rip), %zmm6
+
+/*
+ * Get the (2^a / 2pi) mod 1 values from the table.
+ * Because VLANG doesn't have I-type gather, we need a trivial cast
+ */
+        lea       __svml_scos_reduction_data_internal(%rip), %rax
+        vmovups   %zmm0, (%rsp)
+        vpternlogd $255, %zmm7, %zmm7, %zmm7
+        vandps    %zmm2, %zmm6, %zmm4
+        vcmpps    $4, {sae}, %zmm6, %zmm4, %k1
+
+/* ..................... Table look-up ........................ */
+        lea       __svml_scos_data_internal(%rip), %rcx
+
+/*
+ * Break the P_xxx and m into 16-bit chunks ready for
+ * the long multiplication via 16x16->32 multiplications
+ */
+        vmovups   .L_2il0floatpacket.27(%rip), %zmm6
+        vpandd    .L_2il0floatpacket.24(%rip), %zmm11, %zmm1
+        vpsrld    $23, %zmm1, %zmm8
+        vpslld    $1, %zmm8, %zmm12
+        vpaddd    %zmm8, %zmm12, %zmm2
+        vpslld    $2, %zmm2, %zmm5
+        vpandnd   %zmm4, %zmm4, %zmm7{%k1}
+        vptestmd  %zmm7, %zmm7, %k0
+        kxnorw    %k0, %k0, %k2
+        kxnorw    %k0, %k0, %k3
+        kxnorw    %k0, %k0, %k1
+        kmovw     %k0, %edx
+        vpxord    %zmm4, %zmm4, %zmm4
+        vpxord    %zmm7, %zmm7, %zmm7
+        vpxord    %zmm14, %zmm14, %zmm14
+        vgatherdps (%rax,%zmm5), %zmm4{%k2}
+        vgatherdps 4(%rax,%zmm5), %zmm7{%k3}
+        vgatherdps 8(%rax,%zmm5), %zmm14{%k1}
+        vpsrld    $16, %zmm4, %zmm9
+        vpsrld    $16, %zmm7, %zmm15
+        vpsrld    $16, %zmm14, %zmm13
+        kxnorw    %k0, %k0, %k1
+
+/*
+ * Also get the significand as an integer
+ * NB: adding in the integer bit is wrong for denorms!
+ * To make this work for denorms we should do something slightly different
+ */
+        vpandd    .L_2il0floatpacket.25(%rip), %zmm11, %zmm3
+        vpaddd    .L_2il0floatpacket.26(%rip), %zmm3, %zmm1
+        vpsrld    $16, %zmm1, %zmm8
+        vpandd    %zmm6, %zmm14, %zmm5
+        vpandd    %zmm6, %zmm1, %zmm14
+        vpandd    %zmm6, %zmm7, %zmm12
+        vpmulld   %zmm15, %zmm8, %zmm3
+        vpmulld   %zmm9, %zmm14, %zmm7
+        vpmulld   %zmm15, %zmm14, %zmm9
+        vpmulld   %zmm13, %zmm14, %zmm15
+        vpmulld   %zmm13, %zmm8, %zmm1
+        vpsrld    $16, %zmm15, %zmm13
+        vpsrld    $16, %zmm9, %zmm15
+        vpaddd    %zmm13, %zmm1, %zmm1
+        vpandd    %zmm6, %zmm4, %zmm0
+
+/* Now do the big multiplication and carry propagation */
+        vpmulld   %zmm0, %zmm8, %zmm4
+        vpmulld   %zmm12, %zmm8, %zmm2
+        vpmulld   %zmm5, %zmm8, %zmm8
+        vpmulld   %zmm0, %zmm14, %zmm5
+        vpmulld   %zmm12, %zmm14, %zmm0
+        vpsrld    $16, %zmm0, %zmm14
+        vpsrld    $16, %zmm5, %zmm12
+        vpsrld    $16, %zmm8, %zmm8
+        vpaddd    %zmm14, %zmm2, %zmm13
+        vpaddd    %zmm15, %zmm3, %zmm14
+        vpaddd    %zmm12, %zmm4, %zmm3
+        vpandd    %zmm6, %zmm0, %zmm0
+        vpandd    %zmm6, %zmm5, %zmm12
+        vpaddd    %zmm1, %zmm0, %zmm5
+        vpaddd    %zmm14, %zmm12, %zmm0
+        vpaddd    %zmm5, %zmm8, %zmm15
+        vpandd    %zmm6, %zmm7, %zmm2
+        vpaddd    %zmm3, %zmm2, %zmm14
+        vpsrld    $16, %zmm15, %zmm3
+        vpandd    %zmm6, %zmm9, %zmm9
+        vpaddd    %zmm13, %zmm9, %zmm9
+        vpaddd    %zmm9, %zmm3, %zmm12
+        vpsrld    $16, %zmm12, %zmm4
+        vpslld    $16, %zmm12, %zmm2
+        vpaddd    %zmm0, %zmm4, %zmm13
+
+/*
+ * Now round at the 2^-8 bit position for reduction mod pi/2^7
+ * instead of the original 2pi (but still with the same 2pi scaling).
+ * Use a shifter of 2^15 + 2^14.
+ * The N we get is our final version; it has an offset of
+ * 2^8 because of the implicit integer bit, and anyway for negative
+ * starting value it's a 2s complement thing. But we need to mask
+ * off the exponent part anyway so it's fine.
+ */
+        vmovups   .L_2il0floatpacket.30(%rip), %zmm4
+        vpsrld    $16, %zmm13, %zmm7
+        vpaddd    %zmm14, %zmm7, %zmm1
+
+/* Assemble reduced argument from the pieces */
+        vpandd    %zmm6, %zmm15, %zmm3
+        vpandd    %zmm6, %zmm13, %zmm8
+        vpslld    $16, %zmm1, %zmm6
+        vpaddd    %zmm8, %zmm6, %zmm5
+        vpaddd    %zmm3, %zmm2, %zmm8
+        vpsrld    $9, %zmm5, %zmm9
+
+/*
+ * We want to incorporate the original sign now too.
+ * Do it here for convenience in getting the right N value,
+ * though we could wait right to the end if we were prepared
+ * to modify the sign of N later too.
+ * So get the appropriate sign mask now (or sooner).
+ */
+        vpandd    .L_2il0floatpacket.28(%rip), %zmm11, %zmm2
+
+/*
+ * Create floating-point high part, implicitly adding integer bit 1
+ * Incorporate overall sign at this stage too.
+ */
+        vpxord    .L_2il0floatpacket.29(%rip), %zmm2, %zmm6
+        vpord     %zmm6, %zmm9, %zmm0
+        vaddps    {rn-sae}, %zmm0, %zmm4, %zmm14
+        vsubps    {rn-sae}, %zmm4, %zmm14, %zmm7
+        vsubps    {rn-sae}, %zmm7, %zmm0, %zmm13
+        vpternlogd $255, %zmm0, %zmm0, %zmm0
+        vpandd    .L_2il0floatpacket.33(%rip), %zmm8, %zmm15
+        vpandd    .L_2il0floatpacket.35(%rip), %zmm5, %zmm5
+
+/*
+ * Create floating-point low and medium parts, respectively
+ * lo_17, ... lo_0, 0, ..., 0
+ * hi_8, ... hi_0, lo_31, ..., lo_18
+ * then subtract off the implicitly added integer bits,
+ * 2^-46 and 2^-23, respectively.
+ * Put the original sign into all of them at this stage.
+ */
+        vpxord    .L_2il0floatpacket.32(%rip), %zmm2, %zmm3
+        vpslld    $5, %zmm15, %zmm1
+        vpsrld    $18, %zmm8, %zmm8
+        vpxord    .L_2il0floatpacket.34(%rip), %zmm2, %zmm9
+        vpslld    $14, %zmm5, %zmm2
+        vpord     %zmm3, %zmm1, %zmm12
+        vpord     %zmm8, %zmm2, %zmm5
+        vsubps    {rn-sae}, %zmm3, %zmm12, %zmm15
+        vmovups   .L_2il0floatpacket.37(%rip), %zmm2
+        vpord     %zmm9, %zmm5, %zmm3
+        vsubps    {rn-sae}, %zmm9, %zmm3, %zmm6
+
+/*
+ * Now multiply those numbers all by 2 pi, reasonably accurately.
+ * (RHi + RLo) * (pi_lead + pi_trail) ~=
+ * RHi * pi_lead + (RHi * pi_trail + RLo * pi_lead)
+ */
+        vmovups   .L_2il0floatpacket.36(%rip), %zmm5
+
+/*
+ * If the magnitude of the input is <= 2^-20, then
+ * just pass through the input, since no reduction will be needed and
+ * the main path will only work accurately if the reduced argument is
+ * about >= 2^-40 (which it is for all large pi multiples)
+ */
+        vmovups   .L_2il0floatpacket.39(%rip), %zmm9
+
+/* Now add them up into 2 reasonably aligned pieces */
+        vaddps    {rn-sae}, %zmm6, %zmm13, %zmm4
+        vsubps    {rn-sae}, %zmm4, %zmm13, %zmm13
+        vmulps    {rn-sae}, %zmm5, %zmm4, %zmm7
+        vaddps    {rn-sae}, %zmm13, %zmm6, %zmm8
+        vandps    .L_2il0floatpacket.38(%rip), %zmm11, %zmm6
+        vaddps    {rn-sae}, %zmm15, %zmm8, %zmm8
+        vpternlogd $255, %zmm15, %zmm15, %zmm15
+        vcmpps    $22, {sae}, %zmm9, %zmm6, %k3
+        vcmpps    $26, {sae}, %zmm9, %zmm6, %k2
+        vmovaps   %zmm5, %zmm3
+        vfmsub213ps {rn-sae}, %zmm7, %zmm4, %zmm3
+        vfmadd213ps {rn-sae}, %zmm3, %zmm2, %zmm4
+        vfmadd213ps {rn-sae}, %zmm4, %zmm5, %zmm8
+
+/* Grab our final N value as an integer, appropriately masked mod 2^8 */
+        vpandd    .L_2il0floatpacket.31(%rip), %zmm14, %zmm14
+        vpslld    $4, %zmm14, %zmm13
+        vpandnd   %zmm6, %zmm6, %zmm0{%k3}
+        vandps    %zmm11, %zmm0, %zmm1
+        kxnorw    %k0, %k0, %k3
+        vpxord    %zmm0, %zmm0, %zmm0
+        vgatherdps (%rcx,%zmm13), %zmm0{%k1}
+        kxnorw    %k0, %k0, %k1
+        vpandnd   %zmm6, %zmm6, %zmm15{%k2}
+        kxnorw    %k0, %k0, %k2
+        vandps    %zmm7, %zmm15, %zmm12
+        vandps    %zmm8, %zmm15, %zmm3
+        vorps     %zmm12, %zmm1, %zmm2
+
+/* ............... Polynomial approximation ................... */
+        vmovups   4352+__svml_scos_data_internal(%rip), %zmm12
+
+/*
+ * The output is _VRES_R (high) + _VRES_E (low), and the integer part is _VRES_IND
+ * Set sRp2 = _VRES_R^2 and then resume the original code.
+ */
+        vmulps    {rn-sae}, %zmm2, %zmm2, %zmm4
+
+/* ................. Reconstruction: res_hi ................... */
+        vmovaps   %zmm2, %zmm14
+        vmovaps   %zmm2, %zmm8
+        vpxord    %zmm9, %zmm9, %zmm9
+        vpxord    %zmm7, %zmm7, %zmm7
+        vgatherdps 4(%rcx,%zmm13), %zmm9{%k2}
+        vgatherdps 12(%rcx,%zmm13), %zmm7{%k1}
+        vfmadd213ps {rn-sae}, %zmm9, %zmm7, %zmm14
+        vaddps    {rn-sae}, %zmm7, %zmm0, %zmm15
+        vfmadd132ps {rn-sae}, %zmm0, %zmm14, %zmm8
+        vsubps    {rn-sae}, %zmm14, %zmm9, %zmm1
+        vsubps    {rn-sae}, %zmm8, %zmm14, %zmm6
+        vfmadd231ps {rn-sae}, %zmm2, %zmm7, %zmm1
+        vmovups   4416+__svml_scos_data_internal(%rip), %zmm7
+        vfmadd231ps {rn-sae}, %zmm0, %zmm2, %zmm6
+        vmovups   4480+__svml_scos_data_internal(%rip), %zmm0
+        vaddps    {rn-sae}, %zmm1, %zmm6, %zmm6
+        vfmadd231ps {rn-sae}, %zmm4, %zmm0, %zmm7
+        vpxord    %zmm5, %zmm5, %zmm5
+        vgatherdps 8(%rcx,%zmm13), %zmm5{%k3}
+        vmovups   4288+__svml_scos_data_internal(%rip), %zmm13
+        vfmadd231ps {rn-sae}, %zmm4, %zmm12, %zmm13
+        vmulps    {rn-sae}, %zmm4, %zmm13, %zmm14
+        vmulps    {rn-sae}, %zmm4, %zmm7, %zmm4
+        vmulps    {rn-sae}, %zmm2, %zmm14, %zmm1
+
+/* .......... Reconstruction: res_lo=corr+polS+polC+res_lo0 ...... */
+        vfnmadd213ps {rn-sae}, %zmm15, %zmm9, %zmm2
+        vfmadd213ps {rn-sae}, %zmm5, %zmm2, %zmm3
+        vfmadd213ps {rn-sae}, %zmm6, %zmm2, %zmm1
+        vfmadd213ps {rn-sae}, %zmm3, %zmm9, %zmm4
+        vaddps    {rn-sae}, %zmm1, %zmm4, %zmm2
+
+/* .................. Final reconstruction ................... */
+        vaddps    {rn-sae}, %zmm2, %zmm8, %zmm3
+
+/*
+ * ----------------------------------------------------------
+ * End of large arguments path
+ * ----------------------------------------------------------
+ * Merge results from main and large paths:
+ */
+        vpandnd   (%rsp), %zmm10, %zmm5
+        vpandd    %zmm10, %zmm3, %zmm10
+        vpord     %zmm10, %zmm5, %zmm0
+        jmp       .LBL_1_2
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_cosf16,@function
+       .size   __svml_cosf16,.-__svml_cosf16
+..LN__svml_cosf16.0:
+
+.L_2__routine_start___svml_scos_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_scos_cout_rare_internal:
+
+
+       .cfi_startproc
+..L63:
+
+        movl      (%rdi), %edx
+        movzwl    2(%rdi), %eax
+        movl      %edx, -8(%rsp)
+        andl      $32640, %eax
+        shrl      $24, %edx
+        andl      $127, %edx
+        cmpl      $32640, %eax
+        jne       .LBL_2_6
+
+
+        movb      %dl, -5(%rsp)
+        cmpl      $2139095040, -8(%rsp)
+        jne       .LBL_2_4
+
+
+        movss     (%rdi), %xmm0
+        movl      $1, %eax
+        mulss     __scos_la__vmlsCosCoutTab(%rip), %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_4:
+
+        movss     (%rdi), %xmm0
+        xorl      %eax, %eax
+        mulss     (%rdi), %xmm0
+        movss     %xmm0, (%rsi)
+
+
+        ret
+
+.LBL_2_6:
+
+        xorl      %eax, %eax
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_scos_cout_rare_internal,@function
+       .size   __svml_scos_cout_rare_internal,.-__svml_scos_cout_rare_internal
+..LN__svml_scos_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+.L_2il0floatpacket.24:
+       .long   0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000
+       .type   .L_2il0floatpacket.24,@object
+       .size   .L_2il0floatpacket.24,64
+       .align 64
+.L_2il0floatpacket.25:
+       .long   0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff
+       .type   .L_2il0floatpacket.25,@object
+       .size   .L_2il0floatpacket.25,64
+       .align 64
+.L_2il0floatpacket.26:
+       .long   0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000
+       .type   .L_2il0floatpacket.26,@object
+       .size   .L_2il0floatpacket.26,64
+       .align 64
+.L_2il0floatpacket.27:
+       .long   0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff
+       .type   .L_2il0floatpacket.27,@object
+       .size   .L_2il0floatpacket.27,64
+       .align 64
+.L_2il0floatpacket.28:
+       .long   0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000
+       .type   .L_2il0floatpacket.28,@object
+       .size   .L_2il0floatpacket.28,64
+       .align 64
+.L_2il0floatpacket.29:
+       .long   0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000
+       .type   .L_2il0floatpacket.29,@object
+       .size   .L_2il0floatpacket.29,64
+       .align 64
+.L_2il0floatpacket.30:
+       .long   0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000
+       .type   .L_2il0floatpacket.30,@object
+       .size   .L_2il0floatpacket.30,64
+       .align 64
+.L_2il0floatpacket.31:
+       .long   0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff
+       .type   .L_2il0floatpacket.31,@object
+       .size   .L_2il0floatpacket.31,64
+       .align 64
+.L_2il0floatpacket.32:
+       .long   0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000
+       .type   .L_2il0floatpacket.32,@object
+       .size   .L_2il0floatpacket.32,64
+       .align 64
+.L_2il0floatpacket.33:
+       .long   0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff
+       .type   .L_2il0floatpacket.33,@object
+       .size   .L_2il0floatpacket.33,64
+       .align 64
+.L_2il0floatpacket.34:
+       .long   0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000
+       .type   .L_2il0floatpacket.34,@object
+       .size   .L_2il0floatpacket.34,64
+       .align 64
+.L_2il0floatpacket.35:
+       .long   0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff
+       .type   .L_2il0floatpacket.35,@object
+       .size   .L_2il0floatpacket.35,64
+       .align 64
+.L_2il0floatpacket.36:
+       .long   0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb
+       .type   .L_2il0floatpacket.36,@object
+       .size   .L_2il0floatpacket.36,64
+       .align 64
+.L_2il0floatpacket.37:
+       .long   0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e
+       .type   .L_2il0floatpacket.37,@object
+       .size   .L_2il0floatpacket.37,64
+       .align 64
+.L_2il0floatpacket.38:
+       .long   0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff
+       .type   .L_2il0floatpacket.38,@object
+       .size   .L_2il0floatpacket.38,64
+       .align 64
+.L_2il0floatpacket.39:
+       .long   0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000
+       .type   .L_2il0floatpacket.39,@object
+       .size   .L_2il0floatpacket.39,64
+       .align 64
+__svml_scos_data_internal:
+       .long   0
+       .long   1065353216
+       .long   0
+       .long   0
+       .long   1004262721
+       .long   1065348163
+       .long   814009613
+       .long   3170893824
+       .long   1012667202
+       .long   1065333007
+       .long   836655967
+       .long   3179282432
+       .long   3157608485
+       .long   1065307757
+       .long   852498564
+       .long   3179282432
+       .long   1021119272
+       .long   1065272429
+       .long   838093129
+       .long   3187671040
+       .long   992588201
+       .long   1065227044
+       .long   3002197507
+       .long   3187671040
+       .long   3165783068
+       .long   1065171628
+       .long   2969000681
+       .long   3187671040
+       .long   3174843017
+       .long   1065106216
+       .long   2989610635
+       .long   3187671040
+       .long   1029761272
+       .long   1065030846
+       .long   855602635
+       .long   3196059648
+       .long   1023221605
+       .long   1064945565
+       .long   851856985
+       .long   3196059648
+       .long   1004930693
+       .long   1064850424
+       .long   2987244005
+       .long   3196059648
+       .long   3163089201
+       .long   1064745479
+       .long   846006572
+       .long   3196059648
+       .long   3173319052
+       .long   1064630795
+       .long   2996018466
+       .long   3196059648
+       .long   3179441043
+       .long   1064506439
+       .long   851742225
+       .long   3196059648
+       .long   3182555983
+       .long   1064372488
+       .long   840880349
+       .long   3196059648
+       .long   1041201069
+       .long   1064229022
+       .long   2995991516
+       .long   3204448256
+       .long   1039156139
+       .long   1064076126
+       .long   854796500
+       .long   3204448256
+       .long   1036128472
+       .long   1063913895
+       .long   3001754476
+       .long   3204448256
+       .long   1033133567
+       .long   1063742424
+       .long   2998678409
+       .long   3204448256
+       .long   1028547674
+       .long   1063561817
+       .long   823789818
+       .long   3204448256
+       .long   1021989220
+       .long   1063372184
+       .long   3001545765
+       .long   3204448256
+       .long   1005106760
+       .long   1063173637
+       .long   851900755
+       .long   3204448256
+       .long   3160870706
+       .long   1062966298
+       .long   841166280
+       .long   3204448256
+       .long   3171899818
+       .long   1062750291
+       .long   2994560960
+       .long   3204448256
+       .long   3177422237
+       .long   1062525745
+       .long   848357914
+       .long   3204448256
+       .long   3181068627
+       .long   1062292797
+       .long   806113028
+       .long   3204448256
+       .long   3183738367
+       .long   1062051586
+       .long   847147240
+       .long   3204448256
+       .long   3186359946
+       .long   1061802258
+       .long   848897600
+       .long   3204448256
+       .long   3188301413
+       .long   1061544963
+       .long   850481524
+       .long   3204448256
+       .long   3189561687
+       .long   1061279856
+       .long   851442039
+       .long   3204448256
+       .long   3190795559
+       .long   1061007097
+       .long   832220140
+       .long   3204448256
+       .long   3192002283
+       .long   1060726850
+       .long   2994798599
+       .long   3204448256
+       .long   1050015258
+       .long   1060439283
+       .long   844097402
+       .long   3212836864
+       .long   1049440125
+       .long   1060144571
+       .long   2997759282
+       .long   3212836864
+       .long   1048879630
+       .long   1059842890
+       .long   2998350134
+       .long   3212836864
+       .long   1048092223
+       .long   1059534422
+       .long   2986574659
+       .long   3212836864
+       .long   1047031795
+       .long   1059219353
+       .long   841032635
+       .long   3212836864
+       .long   1046002615
+       .long   1058897873
+       .long   848430348
+       .long   3212836864
+       .long   1045005303
+       .long   1058570176
+       .long   2982650867
+       .long   3212836864
+       .long   1044040460
+       .long   1058236458
+       .long   852349230
+       .long   3212836864
+       .long   1043108667
+       .long   1057896922
+       .long   2991207143
+       .long   3212836864
+       .long   1042210485
+       .long   1057551771
+       .long   2998815566
+       .long   3212836864
+       .long   1041346455
+       .long   1057201213
+       .long   2992349186
+       .long   3212836864
+       .long   1040517098
+       .long   1056726311
+       .long   2978016425
+       .long   3212836864
+       .long   1039258436
+       .long   1056004842
+       .long   2986287417
+       .long   3212836864
+       .long   1037741368
+       .long   1055273845
+       .long   2983839604
+       .long   3212836864
+       .long   1036296515
+       .long   1054533760
+       .long   840832460
+       .long   3212836864
+       .long   1034924748
+       .long   1053785034
+       .long   829045603
+       .long   3212836864
+       .long   1033626892
+       .long   1053028117
+       .long   836097324
+       .long   3212836864
+       .long   1032403730
+       .long   1052263466
+       .long   2993707942
+       .long   3212836864
+       .long   1030713214
+       .long   1051491540
+       .long   2988789250
+       .long   3212836864
+       .long   1028569994
+       .long   1050712805
+       .long   2990442912
+       .long   3212836864
+       .long   1026580309
+       .long   1049927729
+       .long   846027248
+       .long   3212836864
+       .long   1024745356
+       .long   1049136787
+       .long   824999326
+       .long   3212836864
+       .long   1022722308
+       .long   1048104908
+       .long   2971391005
+       .long   3212836864
+       .long   1019677780
+       .long   1046502419
+       .long   833086710
+       .long   3212836864
+       .long   1016948784
+       .long   1044891074
+       .long   2967836285
+       .long   3212836864
+       .long   1014052363
+       .long   1043271842
+       .long   823224313
+       .long   3212836864
+       .long   1009865986
+       .long   1041645699
+       .long   837346836
+       .long   3212836864
+       .long   1006005820
+       .long   1039839859
+       .long   2970970319
+       .long   3212836864
+       .long   1000196465
+       .long   1036565814
+       .long   2960495349
+       .long   3212836864
+       .long   993104536
+       .long   1033283845
+       .long   2975014497
+       .long   3212836864
+       .long   983425480
+       .long   1028193072
+       .long   2968461951
+       .long   3212836864
+       .long   966649823
+       .long   1019808432
+       .long   2953169304
+       .long   3212836864
+       .long   0
+       .long   0
+       .long   0
+       .long   3212836864
+       .long   966649823
+       .long   3167292080
+       .long   805685656
+       .long   3212836864
+       .long   983425480
+       .long   3175676720
+       .long   820978303
+       .long   3212836864
+       .long   993104536
+       .long   3180767493
+       .long   827530849
+       .long   3212836864
+       .long   1000196465
+       .long   3184049462
+       .long   813011701
+       .long   3212836864
+       .long   1006005820
+       .long   3187323507
+       .long   823486671
+       .long   3212836864
+       .long   1009865986
+       .long   3189129347
+       .long   2984830484
+       .long   3212836864
+       .long   1014052363
+       .long   3190755490
+       .long   2970707961
+       .long   3212836864
+       .long   1016948784
+       .long   3192374722
+       .long   820352637
+       .long   3212836864
+       .long   1019677780
+       .long   3193986067
+       .long   2980570358
+       .long   3212836864
+       .long   1022722308
+       .long   3195588556
+       .long   823907357
+       .long   3212836864
+       .long   1024745356
+       .long   3196620435
+       .long   2972482974
+       .long   3212836864
+       .long   1026580309
+       .long   3197411377
+       .long   2993510896
+       .long   3212836864
+       .long   1028569994
+       .long   3198196453
+       .long   842959264
+       .long   3212836864
+       .long   1030713214
+       .long   3198975188
+       .long   841305602
+       .long   3212836864
+       .long   1032403730
+       .long   3199747114
+       .long   846224294
+       .long   3212836864
+       .long   1033626892
+       .long   3200511765
+       .long   2983580972
+       .long   3212836864
+       .long   1034924748
+       .long   3201268682
+       .long   2976529251
+       .long   3212836864
+       .long   1036296515
+       .long   3202017408
+       .long   2988316108
+       .long   3212836864
+       .long   1037741368
+       .long   3202757493
+       .long   836355956
+       .long   3212836864
+       .long   1039258436
+       .long   3203488490
+       .long   838803769
+       .long   3212836864
+       .long   1040517098
+       .long   3204209959
+       .long   830532777
+       .long   3212836864
+       .long   1041346455
+       .long   3204684861
+       .long   844865538
+       .long   3212836864
+       .long   1042210485
+       .long   3205035419
+       .long   851331918
+       .long   3212836864
+       .long   1043108667
+       .long   3205380570
+       .long   843723495
+       .long   3212836864
+       .long   1044040460
+       .long   3205720106
+       .long   2999832878
+       .long   3212836864
+       .long   1045005303
+       .long   3206053824
+       .long   835167219
+       .long   3212836864
+       .long   1046002615
+       .long   3206381521
+       .long   2995913996
+       .long   3212836864
+       .long   1047031795
+       .long   3206703001
+       .long   2988516283
+       .long   3212836864
+       .long   1048092223
+       .long   3207018070
+       .long   839091011
+       .long   3212836864
+       .long   1048879630
+       .long   3207326538
+       .long   850866486
+       .long   3212836864
+       .long   1049440125
+       .long   3207628219
+       .long   850275634
+       .long   3212836864
+       .long   1050015258
+       .long   3207922931
+       .long   2991581050
+       .long   3212836864
+       .long   3192002283
+       .long   3208210498
+       .long   847314951
+       .long   3204448256
+       .long   3190795559
+       .long   3208490745
+       .long   2979703788
+       .long   3204448256
+       .long   3189561687
+       .long   3208763504
+       .long   2998925687
+       .long   3204448256
+       .long   3188301413
+       .long   3209028611
+       .long   2997965172
+       .long   3204448256
+       .long   3186359946
+       .long   3209285906
+       .long   2996381248
+       .long   3204448256
+       .long   3183738367
+       .long   3209535234
+       .long   2994630888
+       .long   3204448256
+       .long   3181068627
+       .long   3209776445
+       .long   2953596676
+       .long   3204448256
+       .long   3177422237
+       .long   3210009393
+       .long   2995841562
+       .long   3204448256
+       .long   3171899818
+       .long   3210233939
+       .long   847077312
+       .long   3204448256
+       .long   3160870706
+       .long   3210449946
+       .long   2988649928
+       .long   3204448256
+       .long   1005106760
+       .long   3210657285
+       .long   2999384403
+       .long   3204448256
+       .long   1021989220
+       .long   3210855832
+       .long   854062117
+       .long   3204448256
+       .long   1028547674
+       .long   3211045465
+       .long   2971273466
+       .long   3204448256
+       .long   1033133567
+       .long   3211226072
+       .long   851194761
+       .long   3204448256
+       .long   1036128472
+       .long   3211397543
+       .long   854270828
+       .long   3204448256
+       .long   1039156139
+       .long   3211559774
+       .long   3002280148
+       .long   3204448256
+       .long   1041201069
+       .long   3211712670
+       .long   848507868
+       .long   3204448256
+       .long   3182555983
+       .long   3211856136
+       .long   2988363997
+       .long   3196059648
+       .long   3179441043
+       .long   3211990087
+       .long   2999225873
+       .long   3196059648
+       .long   3173319052
+       .long   3212114443
+       .long   848534818
+       .long   3196059648
+       .long   3163089201
+       .long   3212229127
+       .long   2993490220
+       .long   3196059648
+       .long   1004930693
+       .long   3212334072
+       .long   839760357
+       .long   3196059648
+       .long   1023221605
+       .long   3212429213
+       .long   2999340633
+       .long   3196059648
+       .long   1029761272
+       .long   3212514494
+       .long   3003086283
+       .long   3196059648
+       .long   3174843017
+       .long   3212589864
+       .long   842126987
+       .long   3187671040
+       .long   3165783068
+       .long   3212655276
+       .long   821517033
+       .long   3187671040
+       .long   992588201
+       .long   3212710692
+       .long   854713859
+       .long   3187671040
+       .long   1021119272
+       .long   3212756077
+       .long   2985576777
+       .long   3187671040
+       .long   3157608485
+       .long   3212791405
+       .long   2999982212
+       .long   3179282432
+       .long   1012667202
+       .long   3212816655
+       .long   2984139615
+       .long   3179282432
+       .long   1004262721
+       .long   3212831811
+       .long   2961493261
+       .long   3170893824
+       .long   0
+       .long   3212836864
+       .long   0
+       .long   0
+       .long   3151746369
+       .long   3212831811
+       .long   2961493261
+       .long   1023410176
+       .long   3160150850
+       .long   3212816655
+       .long   2984139615
+       .long   1031798784
+       .long   1010124837
+       .long   3212791405
+       .long   2999982212
+       .long   1031798784
+       .long   3168602920
+       .long   3212756077
+       .long   2985576777
+       .long   1040187392
+       .long   3140071849
+       .long   3212710692
+       .long   854713859
+       .long   1040187392
+       .long   1018299420
+       .long   3212655276
+       .long   821517033
+       .long   1040187392
+       .long   1027359369
+       .long   3212589864
+       .long   842126987
+       .long   1040187392
+       .long   3177244920
+       .long   3212514494
+       .long   3003086283
+       .long   1048576000
+       .long   3170705253
+       .long   3212429213
+       .long   2999340633
+       .long   1048576000
+       .long   3152414341
+       .long   3212334072
+       .long   839760357
+       .long   1048576000
+       .long   1015605553
+       .long   3212229127
+       .long   2993490220
+       .long   1048576000
+       .long   1025835404
+       .long   3212114443
+       .long   848534818
+       .long   1048576000
+       .long   1031957395
+       .long   3211990087
+       .long   2999225873
+       .long   1048576000
+       .long   1035072335
+       .long   3211856136
+       .long   2988363997
+       .long   1048576000
+       .long   3188684717
+       .long   3211712670
+       .long   848507868
+       .long   1056964608
+       .long   3186639787
+       .long   3211559774
+       .long   3002280148
+       .long   1056964608
+       .long   3183612120
+       .long   3211397543
+       .long   854270828
+       .long   1056964608
+       .long   3180617215
+       .long   3211226072
+       .long   851194761
+       .long   1056964608
+       .long   3176031322
+       .long   3211045465
+       .long   2971273466
+       .long   1056964608
+       .long   3169472868
+       .long   3210855832
+       .long   854062117
+       .long   1056964608
+       .long   3152590408
+       .long   3210657285
+       .long   2999384403
+       .long   1056964608
+       .long   1013387058
+       .long   3210449946
+       .long   2988649928
+       .long   1056964608
+       .long   1024416170
+       .long   3210233939
+       .long   847077312
+       .long   1056964608
+       .long   1029938589
+       .long   3210009393
+       .long   2995841562
+       .long   1056964608
+       .long   1033584979
+       .long   3209776445
+       .long   2953596676
+       .long   1056964608
+       .long   1036254719
+       .long   3209535234
+       .long   2994630888
+       .long   1056964608
+       .long   1038876298
+       .long   3209285906
+       .long   2996381248
+       .long   1056964608
+       .long   1040817765
+       .long   3209028611
+       .long   2997965172
+       .long   1056964608
+       .long   1042078039
+       .long   3208763504
+       .long   2998925687
+       .long   1056964608
+       .long   1043311911
+       .long   3208490745
+       .long   2979703788
+       .long   1056964608
+       .long   1044518635
+       .long   3208210498
+       .long   847314951
+       .long   1056964608
+       .long   3197498906
+       .long   3207922931
+       .long   2991581050
+       .long   1065353216
+       .long   3196923773
+       .long   3207628219
+       .long   850275634
+       .long   1065353216
+       .long   3196363278
+       .long   3207326538
+       .long   850866486
+       .long   1065353216
+       .long   3195575871
+       .long   3207018070
+       .long   839091011
+       .long   1065353216
+       .long   3194515443
+       .long   3206703001
+       .long   2988516283
+       .long   1065353216
+       .long   3193486263
+       .long   3206381521
+       .long   2995913996
+       .long   1065353216
+       .long   3192488951
+       .long   3206053824
+       .long   835167219
+       .long   1065353216
+       .long   3191524108
+       .long   3205720106
+       .long   2999832878
+       .long   1065353216
+       .long   3190592315
+       .long   3205380570
+       .long   843723495
+       .long   1065353216
+       .long   3189694133
+       .long   3205035419
+       .long   851331918
+       .long   1065353216
+       .long   3188830103
+       .long   3204684861
+       .long   844865538
+       .long   1065353216
+       .long   3188000746
+       .long   3204209959
+       .long   830532777
+       .long   1065353216
+       .long   3186742084
+       .long   3203488490
+       .long   838803769
+       .long   1065353216
+       .long   3185225016
+       .long   3202757493
+       .long   836355956
+       .long   1065353216
+       .long   3183780163
+       .long   3202017408
+       .long   2988316108
+       .long   1065353216
+       .long   3182408396
+       .long   3201268682
+       .long   2976529251
+       .long   1065353216
+       .long   3181110540
+       .long   3200511765
+       .long   2983580972
+       .long   1065353216
+       .long   3179887378
+       .long   3199747114
+       .long   846224294
+       .long   1065353216
+       .long   3178196862
+       .long   3198975188
+       .long   841305602
+       .long   1065353216
+       .long   3176053642
+       .long   3198196453
+       .long   842959264
+       .long   1065353216
+       .long   3174063957
+       .long   3197411377
+       .long   2993510896
+       .long   1065353216
+       .long   3172229004
+       .long   3196620435
+       .long   2972482974
+       .long   1065353216
+       .long   3170205956
+       .long   3195588556
+       .long   823907357
+       .long   1065353216
+       .long   3167161428
+       .long   3193986067
+       .long   2980570358
+       .long   1065353216
+       .long   3164432432
+       .long   3192374722
+       .long   820352637
+       .long   1065353216
+       .long   3161536011
+       .long   3190755490
+       .long   2970707961
+       .long   1065353216
+       .long   3157349634
+       .long   3189129347
+       .long   2984830484
+       .long   1065353216
+       .long   3153489468
+       .long   3187323507
+       .long   823486671
+       .long   1065353216
+       .long   3147680113
+       .long   3184049462
+       .long   813011701
+       .long   1065353216
+       .long   3140588184
+       .long   3180767493
+       .long   827530849
+       .long   1065353216
+       .long   3130909128
+       .long   3175676720
+       .long   820978303
+       .long   1065353216
+       .long   3114133471
+       .long   3167292080
+       .long   805685656
+       .long   1065353216
+       .long   0
+       .long   0
+       .long   0
+       .long   1065353216
+       .long   3114133471
+       .long   1019808432
+       .long   2953169304
+       .long   1065353216
+       .long   3130909128
+       .long   1028193072
+       .long   2968461951
+       .long   1065353216
+       .long   3140588184
+       .long   1033283845
+       .long   2975014497
+       .long   1065353216
+       .long   3147680113
+       .long   1036565814
+       .long   2960495349
+       .long   1065353216
+       .long   3153489468
+       .long   1039839859
+       .long   2970970319
+       .long   1065353216
+       .long   3157349634
+       .long   1041645699
+       .long   837346836
+       .long   1065353216
+       .long   3161536011
+       .long   1043271842
+       .long   823224313
+       .long   1065353216
+       .long   3164432432
+       .long   1044891074
+       .long   2967836285
+       .long   1065353216
+       .long   3167161428
+       .long   1046502419
+       .long   833086710
+       .long   1065353216
+       .long   3170205956
+       .long   1048104908
+       .long   2971391005
+       .long   1065353216
+       .long   3172229004
+       .long   1049136787
+       .long   824999326
+       .long   1065353216
+       .long   3174063957
+       .long   1049927729
+       .long   846027248
+       .long   1065353216
+       .long   3176053642
+       .long   1050712805
+       .long   2990442912
+       .long   1065353216
+       .long   3178196862
+       .long   1051491540
+       .long   2988789250
+       .long   1065353216
+       .long   3179887378
+       .long   1052263466
+       .long   2993707942
+       .long   1065353216
+       .long   3181110540
+       .long   1053028117
+       .long   836097324
+       .long   1065353216
+       .long   3182408396
+       .long   1053785034
+       .long   829045603
+       .long   1065353216
+       .long   3183780163
+       .long   1054533760
+       .long   840832460
+       .long   1065353216
+       .long   3185225016
+       .long   1055273845
+       .long   2983839604
+       .long   1065353216
+       .long   3186742084
+       .long   1056004842
+       .long   2986287417
+       .long   1065353216
+       .long   3188000746
+       .long   1056726311
+       .long   2978016425
+       .long   1065353216
+       .long   3188830103
+       .long   1057201213
+       .long   2992349186
+       .long   1065353216
+       .long   3189694133
+       .long   1057551771
+       .long   2998815566
+       .long   1065353216
+       .long   3190592315
+       .long   1057896922
+       .long   2991207143
+       .long   1065353216
+       .long   3191524108
+       .long   1058236458
+       .long   852349230
+       .long   1065353216
+       .long   3192488951
+       .long   1058570176
+       .long   2982650867
+       .long   1065353216
+       .long   3193486263
+       .long   1058897873
+       .long   848430348
+       .long   1065353216
+       .long   3194515443
+       .long   1059219353
+       .long   841032635
+       .long   1065353216
+       .long   3195575871
+       .long   1059534422
+       .long   2986574659
+       .long   1065353216
+       .long   3196363278
+       .long   1059842890
+       .long   2998350134
+       .long   1065353216
+       .long   3196923773
+       .long   1060144571
+       .long   2997759282
+       .long   1065353216
+       .long   3197498906
+       .long   1060439283
+       .long   844097402
+       .long   1065353216
+       .long   1044518635
+       .long   1060726850
+       .long   2994798599
+       .long   1056964608
+       .long   1043311911
+       .long   1061007097
+       .long   832220140
+       .long   1056964608
+       .long   1042078039
+       .long   1061279856
+       .long   851442039
+       .long   1056964608
+       .long   1040817765
+       .long   1061544963
+       .long   850481524
+       .long   1056964608
+       .long   1038876298
+       .long   1061802258
+       .long   848897600
+       .long   1056964608
+       .long   1036254719
+       .long   1062051586
+       .long   847147240
+       .long   1056964608
+       .long   1033584979
+       .long   1062292797
+       .long   806113028
+       .long   1056964608
+       .long   1029938589
+       .long   1062525745
+       .long   848357914
+       .long   1056964608
+       .long   1024416170
+       .long   1062750291
+       .long   2994560960
+       .long   1056964608
+       .long   1013387058
+       .long   1062966298
+       .long   841166280
+       .long   1056964608
+       .long   3152590408
+       .long   1063173637
+       .long   851900755
+       .long   1056964608
+       .long   3169472868
+       .long   1063372184
+       .long   3001545765
+       .long   1056964608
+       .long   3176031322
+       .long   1063561817
+       .long   823789818
+       .long   1056964608
+       .long   3180617215
+       .long   1063742424
+       .long   2998678409
+       .long   1056964608
+       .long   3183612120
+       .long   1063913895
+       .long   3001754476
+       .long   1056964608
+       .long   3186639787
+       .long   1064076126
+       .long   854796500
+       .long   1056964608
+       .long   3188684717
+       .long   1064229022
+       .long   2995991516
+       .long   1056964608
+       .long   1035072335
+       .long   1064372488
+       .long   840880349
+       .long   1048576000
+       .long   1031957395
+       .long   1064506439
+       .long   851742225
+       .long   1048576000
+       .long   1025835404
+       .long   1064630795
+       .long   2996018466
+       .long   1048576000
+       .long   1015605553
+       .long   1064745479
+       .long   846006572
+       .long   1048576000
+       .long   3152414341
+       .long   1064850424
+       .long   2987244005
+       .long   1048576000
+       .long   3170705253
+       .long   1064945565
+       .long   851856985
+       .long   1048576000
+       .long   3177244920
+       .long   1065030846
+       .long   855602635
+       .long   1048576000
+       .long   1027359369
+       .long   1065106216
+       .long   2989610635
+       .long   1040187392
+       .long   1018299420
+       .long   1065171628
+       .long   2969000681
+       .long   1040187392
+       .long   3140071849
+       .long   1065227044
+       .long   3002197507
+       .long   1040187392
+       .long   3168602920
+       .long   1065272429
+       .long   838093129
+       .long   1040187392
+       .long   1010124837
+       .long   1065307757
+       .long   852498564
+       .long   1031798784
+       .long   3160150850
+       .long   1065333007
+       .long   836655967
+       .long   1031798784
+       .long   3151746369
+       .long   1065348163
+       .long   814009613
+       .long   1023410176
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   1007191908
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   3109009103
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   909034293
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .type   __svml_scos_data_internal,@object
+       .size   __svml_scos_data_internal,5760
+       .align 64
+__svml_scos_reduction_data_internal:
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1
+       .long   0
+       .long   0
+       .long   2
+       .long   0
+       .long   0
+       .long   5
+       .long   0
+       .long   0
+       .long   10
+       .long   0
+       .long   0
+       .long   20
+       .long   0
+       .long   0
+       .long   40
+       .long   0
+       .long   0
+       .long   81
+       .long   0
+       .long   0
+       .long   162
+       .long   0
+       .long   0
+       .long   325
+       .long   0
+       .long   0
+       .long   651
+       .long   0
+       .long   0
+       .long   1303
+       .long   0
+       .long   0
+       .long   2607
+       .long   0
+       .long   0
+       .long   5215
+       .long   0
+       .long   0
+       .long   10430
+       .long   0
+       .long   0
+       .long   20860
+       .long   0
+       .long   0
+       .long   41721
+       .long   0
+       .long   0
+       .long   83443
+       .long   0
+       .long   0
+       .long   166886
+       .long   0
+       .long   0
+       .long   333772
+       .long   0
+       .long   0
+       .long   667544
+       .long   0
+       .long   0
+       .long   1335088
+       .long   0
+       .long   0
+       .long   2670176
+       .long   0
+       .long   0
+       .long   5340353
+       .long   0
+       .long   0
+       .long   10680707
+       .long   0
+       .long   0
+       .long   21361414
+       .long   0
+       .long   0
+       .long   42722829
+       .long   0
+       .long   0
+       .long   85445659
+       .long   0
+       .long   0
+       .long   170891318
+       .long   0
+       .long   0
+       .long   341782637
+       .long   0
+       .long   0
+       .long   683565275
+       .long   0
+       .long   0
+       .long   1367130551
+       .long   0
+       .long   0
+       .long   2734261102
+       .long   0
+       .long   1
+       .long   1173554908
+       .long   0
+       .long   2
+       .long   2347109817
+       .long   0
+       .long   5
+       .long   399252338
+       .long   0
+       .long   10
+       .long   798504676
+       .long   0
+       .long   20
+       .long   1597009353
+       .long   0
+       .long   40
+       .long   3194018707
+       .long   0
+       .long   81
+       .long   2093070119
+       .long   0
+       .long   162
+       .long   4186140238
+       .long   0
+       .long   325
+       .long   4077313180
+       .long   0
+       .long   651
+       .long   3859659065
+       .long   0
+       .long   1303
+       .long   3424350834
+       .long   0
+       .long   2607
+       .long   2553734372
+       .long   0
+       .long   5215
+       .long   812501448
+       .long   0
+       .long   10430
+       .long   1625002897
+       .long   0
+       .long   20860
+       .long   3250005794
+       .long   0
+       .long   41721
+       .long   2205044292
+       .long   0
+       .long   83443
+       .long   115121288
+       .long   0
+       .long   166886
+       .long   230242576
+       .long   0
+       .long   333772
+       .long   460485152
+       .long   0
+       .long   667544
+       .long   920970305
+       .long   0
+       .long   1335088
+       .long   1841940610
+       .long   0
+       .long   2670176
+       .long   3683881221
+       .long   0
+       .long   5340353
+       .long   3072795146
+       .long   0
+       .long   10680707
+       .long   1850622997
+       .long   0
+       .long   21361414
+       .long   3701245994
+       .long   0
+       .long   42722829
+       .long   3107524692
+       .long   0
+       .long   85445659
+       .long   1920082089
+       .long   0
+       .long   170891318
+       .long   3840164178
+       .long   0
+       .long   341782637
+       .long   3385361061
+       .long   0
+       .long   683565275
+       .long   2475754826
+       .long   0
+       .long   1367130551
+       .long   656542356
+       .long   0
+       .long   2734261102
+       .long   1313084713
+       .long   1
+       .long   1173554908
+       .long   2626169427
+       .long   2
+       .long   2347109817
+       .long   957371559
+       .long   5
+       .long   399252338
+       .long   1914743119
+       .long   10
+       .long   798504676
+       .long   3829486239
+       .long   20
+       .long   1597009353
+       .long   3364005183
+       .long   40
+       .long   3194018707
+       .long   2433043071
+       .long   81
+       .long   2093070119
+       .long   571118846
+       .long   162
+       .long   4186140238
+       .long   1142237692
+       .long   325
+       .long   4077313180
+       .long   2284475384
+       .long   651
+       .long   3859659065
+       .long   273983472
+       .long   1303
+       .long   3424350834
+       .long   547966945
+       .long   2607
+       .long   2553734372
+       .long   1095933890
+       .long   5215
+       .long   812501448
+       .long   2191867780
+       .long   10430
+       .long   1625002897
+       .long   88768265
+       .long   20860
+       .long   3250005794
+       .long   177536531
+       .long   41721
+       .long   2205044292
+       .long   355073063
+       .long   83443
+       .long   115121288
+       .long   710146126
+       .long   166886
+       .long   230242576
+       .long   1420292253
+       .long   333772
+       .long   460485152
+       .long   2840584506
+       .long   667544
+       .long   920970305
+       .long   1386201717
+       .long   1335088
+       .long   1841940610
+       .long   2772403434
+       .long   2670176
+       .long   3683881221
+       .long   1249839573
+       .long   5340353
+       .long   3072795146
+       .long   2499679147
+       .long   10680707
+       .long   1850622997
+       .long   704390999
+       .long   21361414
+       .long   3701245994
+       .long   1408781999
+       .long   42722829
+       .long   3107524692
+       .long   2817563999
+       .long   85445659
+       .long   1920082089
+       .long   1340160702
+       .long   170891318
+       .long   3840164178
+       .long   2680321405
+       .long   341782637
+       .long   3385361061
+       .long   1065675514
+       .long   683565275
+       .long   2475754826
+       .long   2131351028
+       .long   1367130551
+       .long   656542356
+       .long   4262702056
+       .long   2734261102
+       .long   1313084713
+       .long   4230436817
+       .long   1173554908
+       .long   2626169427
+       .long   4165906339
+       .long   2347109817
+       .long   957371559
+       .long   4036845383
+       .long   399252338
+       .long   1914743119
+       .long   3778723471
+       .long   798504676
+       .long   3829486239
+       .long   3262479647
+       .long   1597009353
+       .long   3364005183
+       .long   2229991998
+       .long   3194018707
+       .long   2433043071
+       .long   165016701
+       .long   2093070119
+       .long   571118846
+       .long   330033402
+       .long   4186140238
+       .long   1142237692
+       .long   660066805
+       .long   4077313180
+       .long   2284475384
+       .long   1320133610
+       .long   3859659065
+       .long   273983472
+       .long   2640267220
+       .long   3424350834
+       .long   547966945
+       .long   985567145
+       .long   2553734372
+       .long   1095933890
+       .long   1971134291
+       .long   812501448
+       .long   2191867780
+       .long   3942268582
+       .long   1625002897
+       .long   88768265
+       .long   3589569869
+       .long   3250005794
+       .long   177536531
+       .long   2884172442
+       .long   2205044292
+       .long   355073063
+       .long   1473377588
+       .long   115121288
+       .long   710146126
+       .long   2946755177
+       .long   230242576
+       .long   1420292253
+       .long   1598543059
+       .long   460485152
+       .long   2840584506
+       .long   3197086118
+       .long   920970305
+       .long   1386201717
+       .long   2099204941
+       .long   1841940610
+       .long   2772403434
+       .long   4198409883
+       .long   3683881221
+       .long   1249839573
+       .long   4101852471
+       .long   3072795146
+       .long   2499679147
+       .long   3908737646
+       .long   1850622997
+       .long   704390999
+       .long   3522507997
+       .long   3701245994
+       .long   1408781999
+       .long   2750048699
+       .long   3107524692
+       .long   2817563999
+       .long   1205130103
+       .long   1920082089
+       .long   1340160702
+       .long   2410260206
+       .long   3840164178
+       .long   2680321405
+       .long   525553116
+       .long   3385361061
+       .long   1065675514
+       .long   1051106232
+       .long   2475754826
+       .long   2131351028
+       .long   2102212464
+       .long   656542356
+       .long   4262702056
+       .long   4204424928
+       .long   1313084713
+       .long   4230436817
+       .long   4113882560
+       .long   2626169427
+       .long   4165906339
+       .long   3932797825
+       .long   957371559
+       .long   4036845383
+       .long   3570628355
+       .long   1914743119
+       .long   3778723471
+       .long   2846289414
+       .long   3829486239
+       .long   3262479647
+       .long   1397611533
+       .long   3364005183
+       .long   2229991998
+       .long   2795223067
+       .long   2433043071
+       .long   165016701
+       .long   1295478838
+       .long   571118846
+       .long   330033402
+       .long   2590957677
+       .long   1142237692
+       .long   660066805
+       .long   886948059
+       .long   2284475384
+       .long   1320133610
+       .long   1773896118
+       .long   273983472
+       .long   2640267220
+       .long   3547792237
+       .long   547966945
+       .long   985567145
+       .long   2800617179
+       .long   1095933890
+       .long   1971134291
+       .long   1306267062
+       .long   2191867780
+       .long   3942268582
+       .long   2612534124
+       .long   88768265
+       .long   3589569869
+       .long   930100952
+       .long   177536531
+       .long   2884172442
+       .long   1860201905
+       .long   355073063
+       .long   1473377588
+       .long   3720403810
+       .long   710146126
+       .long   2946755177
+       .long   3145840325
+       .long   1420292253
+       .long   1598543059
+       .long   1996713354
+       .long   2840584506
+       .long   3197086118
+       .long   3993426708
+       .long   1386201717
+       .long   2099204941
+       .long   3691886121
+       .long   2772403434
+       .long   4198409883
+       .long   3088804946
+       .long   1249839573
+       .long   4101852471
+       .long   1882642597
+       .long   2499679147
+       .long   3908737646
+       .long   3765285194
+       .long   704390999
+       .long   3522507997
+       .long   3235603093
+       .long   1408781999
+       .long   2750048699
+       .long   2176238891
+       .long   2817563999
+       .long   1205130103
+       .long   57510486
+       .long   1340160702
+       .long   2410260206
+       .long   115020972
+       .long   2680321405
+       .long   525553116
+       .long   230041945
+       .long   1065675514
+       .long   1051106232
+       .long   460083891
+       .long   2131351028
+       .long   2102212464
+       .long   920167782
+       .long   4262702056
+       .long   4204424928
+       .long   1840335564
+       .long   4230436817
+       .long   4113882560
+       .long   3680671129
+       .long   4165906339
+       .long   3932797825
+       .long   3066374962
+       .long   4036845383
+       .long   3570628355
+       .long   1837782628
+       .long   3778723471
+       .long   2846289414
+       .long   3675565257
+       .long   3262479647
+       .long   1397611533
+       .long   3056163219
+       .long   2229991998
+       .long   2795223067
+       .long   1817359143
+       .long   165016701
+       .long   1295478838
+       .long   3634718287
+       .long   330033402
+       .long   2590957677
+       .long   2974469278
+       .long   660066805
+       .long   886948059
+       .long   1653971260
+       .long   1320133610
+       .long   1773896118
+       .long   3307942520
+       .long   2640267220
+       .long   3547792237
+       .long   2320917745
+       .long   985567145
+       .long   2800617179
+       .long   346868194
+       .long   1971134291
+       .long   1306267062
+       .long   693736388
+       .long   3942268582
+       .long   2612534124
+       .long   1387472776
+       .long   3589569869
+       .long   930100952
+       .long   2774945552
+       .long   2884172442
+       .long   1860201905
+       .long   1254923809
+       .long   1473377588
+       .long   3720403810
+       .long   2509847619
+       .long   2946755177
+       .long   3145840325
+       .long   724727943
+       .long   1598543059
+       .long   1996713354
+       .long   1449455886
+       .long   3197086118
+       .long   3993426708
+       .long   2898911772
+       .long   2099204941
+       .long   3691886121
+       .long   1502856249
+       .long   4198409883
+       .long   3088804946
+       .long   3005712498
+       .long   4101852471
+       .long   1882642597
+       .long   1716457700
+       .long   3908737646
+       .long   3765285194
+       .long   3432915400
+       .long   3522507997
+       .long   3235603093
+       .long   2570863504
+       .long   2750048699
+       .long   2176238891
+       .long   846759712
+       .long   1205130103
+       .long   57510486
+       .long   1693519425
+       .long   2410260206
+       .long   115020972
+       .long   3387038850
+       .long   525553116
+       .long   230041945
+       .long   2479110404
+       .long   1051106232
+       .long   460083891
+       .long   663253512
+       .long   2102212464
+       .long   920167782
+       .long   1326507024
+       .long   4204424928
+       .long   1840335564
+       .long   2653014048
+       .long   4113882560
+       .long   3680671129
+       .long   1011060801
+       .long   3932797825
+       .long   3066374962
+       .long   2022121603
+       .long   3570628355
+       .long   1837782628
+       .long   4044243207
+       .long   2846289414
+       .long   3675565257
+       .long   3793519119
+       .long   1397611533
+       .long   3056163219
+       .long   3292070943
+       .long   2795223067
+       .long   1817359143
+       .long   2289174591
+       .long   1295478838
+       .long   3634718287
+       .long   283381887
+       .long   2590957677
+       .long   2974469278
+       .long   566763775
+       .type   __svml_scos_reduction_data_internal,@object
+       .size   __svml_scos_reduction_data_internal,3072
+       .align 4
+__scos_la__vmlsCosCoutTab:
+       .long   0
+       .long   2139095040
+       .type   __scos_la__vmlsCosCoutTab,@object
+       .size   __scos_la__vmlsCosCoutTab,8
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_cosh_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_cosh_d_la.s
new file mode 100644 (file)
index 0000000..5e70a7d
--- /dev/null
@@ -0,0 +1,1717 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+
+       .text
+.L_2__routine_start___svml_cosh8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_cosh8
+
+__svml_cosh8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   3648+__svml_dcosh_data_internal(%rip), %zmm11
+        vmovups   384+__svml_dcosh_data_internal(%rip), %zmm15
+
+/*
+ * ............... Load argument ...........................
+ * dM = x*2^K/log(2) + RShifter
+ */
+        vmovups   3008+__svml_dcosh_data_internal(%rip), %zmm4
+        vmovups   3072+__svml_dcosh_data_internal(%rip), %zmm2
+        vmovups   3136+__svml_dcosh_data_internal(%rip), %zmm3
+        vmovups   832+__svml_dcosh_data_internal(%rip), %zmm8
+        vmovups   768+__svml_dcosh_data_internal(%rip), %zmm9
+        vmovups   512+__svml_dcosh_data_internal(%rip), %zmm7
+        vmovups   576+__svml_dcosh_data_internal(%rip), %zmm6
+        vmovaps   %zmm0, %zmm10
+
+/* ............... Abs argument ............................ */
+        vandnpd   %zmm10, %zmm11, %zmm5
+
+/* .............. Index and lookup ......................... */
+        vmovups   __svml_dcosh_data_internal(%rip), %zmm11
+        vmovups   256+__svml_dcosh_data_internal(%rip), %zmm0
+        vfmadd213pd {rn-sae}, %zmm15, %zmm5, %zmm4
+
+/*
+ * ...............Check for overflow\underflow .............
+ * 
+ */
+        vpsrlq    $32, %zmm5, %zmm12
+
+/* dN = dM - RShifter */
+        vsubpd    {rn-sae}, %zmm15, %zmm4, %zmm1
+        vpmovqd   %zmm12, %ymm13
+        vpermt2pd 320+__svml_dcosh_data_internal(%rip), %zmm4, %zmm0
+        vpermt2pd 64+__svml_dcosh_data_internal(%rip), %zmm4, %zmm11
+
+/* dR = dX - dN*Log2_hi/2^K */
+        vfnmadd231pd {rn-sae}, %zmm2, %zmm1, %zmm5
+
+/*
+ * poly(r) = Gmjp(1 + a2*r^2 + a4*r^4) + Gmjn*(r+ a3*r^3 +a5*r^5)       =
+ * = Gmjp_h +Gmjp_l+ Gmjp*r^2*(a2 + a4*r^2) + Gmjn*(r+ r^3*(a3 +a5*r^2)
+ */
+        vmovups   704+__svml_dcosh_data_internal(%rip), %zmm12
+        vpsllq    $48, %zmm4, %zmm2
+
+/* dR = dX - dN*Log2_hi/2^K */
+        vfnmadd231pd {rn-sae}, %zmm3, %zmm1, %zmm5
+        vmulpd    {rn-sae}, %zmm5, %zmm5, %zmm1
+        vfmadd231pd {rn-sae}, %zmm1, %zmm8, %zmm12
+        vmovups   640+__svml_dcosh_data_internal(%rip), %zmm8
+        vfmadd213pd {rn-sae}, %zmm6, %zmm1, %zmm12
+        vfmadd231pd {rn-sae}, %zmm1, %zmm9, %zmm8
+        vfmadd213pd {rn-sae}, %zmm7, %zmm1, %zmm8
+        vpcmpgtd  3712+__svml_dcosh_data_internal(%rip), %ymm13, %ymm14
+        vmovmskps %ymm14, %edx
+
+/* dOut=r^2*(a2 + a4*r^2) */
+        vmulpd    {rn-sae}, %zmm1, %zmm8, %zmm6
+
+/* lM now is an EXP(2^N) */
+        vpandq    3584+__svml_dcosh_data_internal(%rip), %zmm2, %zmm3
+        vpaddq    %zmm3, %zmm11, %zmm4
+        vpsubq    %zmm3, %zmm0, %zmm0
+        vsubpd    {rn-sae}, %zmm0, %zmm4, %zmm14
+        vaddpd    {rn-sae}, %zmm0, %zmm4, %zmm13
+
+/* dM=r^2*(a3 +a5*r^2) */
+        vmulpd    {rn-sae}, %zmm1, %zmm12, %zmm0
+        vfmadd213pd {rn-sae}, %zmm13, %zmm13, %zmm6
+
+/* dM= r + r^3*(a3 +a5*r^2) */
+        vfmadd213pd {rn-sae}, %zmm5, %zmm5, %zmm0
+        vfmadd213pd {rn-sae}, %zmm6, %zmm14, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm10, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dcosh_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_cosh8,@function
+       .size   __svml_cosh8,.-__svml_cosh8
+..LN__svml_cosh8.0:
+
+.L_2__routine_start___svml_dcosh_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dcosh_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        movq      %rsi, %r8
+        movzwl    6(%rdi), %edx
+        xorl      %eax, %eax
+        andl      $32752, %edx
+        cmpl      $32752, %edx
+        je        .LBL_2_12
+
+
+        movq      (%rdi), %rdx
+        movq      %rdx, -8(%rsp)
+        shrq      $56, %rdx
+        andl      $127, %edx
+        movb      %dl, -1(%rsp)
+        movzwl    -2(%rsp), %ecx
+        andl      $32752, %ecx
+        cmpl      $15504, %ecx
+        jle       .LBL_2_10
+
+
+        movsd     -8(%rsp), %xmm0
+        movsd     1096+__dcosh_la_CoutTab(%rip), %xmm1
+        comisd    %xmm0, %xmm1
+        jbe       .LBL_2_9
+
+
+        movq      1128+__dcosh_la_CoutTab(%rip), %rdx
+        movq      %rdx, -8(%rsp)
+        comisd    1144+__dcosh_la_CoutTab(%rip), %xmm0
+        jb        .LBL_2_8
+
+
+        movsd     1040+__dcosh_la_CoutTab(%rip), %xmm1
+        lea       __dcosh_la_CoutTab(%rip), %r9
+        mulsd     %xmm0, %xmm1
+        addsd     1048+__dcosh_la_CoutTab(%rip), %xmm1
+        movsd     %xmm1, -40(%rsp)
+        movsd     -40(%rsp), %xmm2
+        movsd     1088+__dcosh_la_CoutTab(%rip), %xmm1
+        movl      -40(%rsp), %edx
+        movl      %edx, %esi
+        andl      $63, %esi
+        subsd     1048+__dcosh_la_CoutTab(%rip), %xmm2
+        movsd     %xmm2, -32(%rsp)
+        lea       (%rsi,%rsi), %ecx
+        movsd     -32(%rsp), %xmm3
+        lea       1(%rsi,%rsi), %edi
+        mulsd     1104+__dcosh_la_CoutTab(%rip), %xmm3
+        movsd     -32(%rsp), %xmm4
+        subsd     %xmm3, %xmm0
+        mulsd     1112+__dcosh_la_CoutTab(%rip), %xmm4
+        shrl      $6, %edx
+        subsd     %xmm4, %xmm0
+        mulsd     %xmm0, %xmm1
+        addl      $1022, %edx
+        andl      $2047, %edx
+        addsd     1080+__dcosh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     1072+__dcosh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     1064+__dcosh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     1056+__dcosh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     %xmm0, %xmm1
+        movsd     (%r9,%rcx,8), %xmm0
+        mulsd     %xmm0, %xmm1
+        addsd     (%r9,%rdi,8), %xmm1
+        addsd     %xmm0, %xmm1
+        cmpl      $2046, %edx
+        ja        .LBL_2_7
+
+
+        movq      1128+__dcosh_la_CoutTab(%rip), %rcx
+        shrq      $48, %rcx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -2(%rsp)
+        movsd     -8(%rsp), %xmm0
+        mulsd     %xmm1, %xmm0
+        movsd     %xmm0, (%r8)
+        ret
+
+.LBL_2_7:
+
+        decl      %edx
+        andl      $2047, %edx
+        movzwl    -2(%rsp), %ecx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -2(%rsp)
+        movsd     -8(%rsp), %xmm0
+        mulsd     %xmm0, %xmm1
+        mulsd     1024+__dcosh_la_CoutTab(%rip), %xmm1
+        movsd     %xmm1, (%r8)
+        ret
+
+.LBL_2_8:
+
+        movsd     1040+__dcosh_la_CoutTab(%rip), %xmm1
+        lea       __dcosh_la_CoutTab(%rip), %rcx
+        movzwl    -2(%rsp), %esi
+        andl      $-32753, %esi
+        movsd     1080+__dcosh_la_CoutTab(%rip), %xmm14
+        mulsd     %xmm0, %xmm1
+        addsd     1048+__dcosh_la_CoutTab(%rip), %xmm1
+        movsd     %xmm1, -40(%rsp)
+        movsd     -40(%rsp), %xmm2
+        movl      -40(%rsp), %r10d
+        movl      %r10d, %r9d
+        shrl      $6, %r9d
+        subsd     1048+__dcosh_la_CoutTab(%rip), %xmm2
+        movsd     %xmm2, -32(%rsp)
+        lea       1023(%r9), %edi
+        andl      $63, %r10d
+        addl      $1022, %r9d
+        movsd     -32(%rsp), %xmm3
+        andl      $2047, %r9d
+        negl      %edi
+        shll      $4, %r9d
+        addl      $-4, %edi
+        mulsd     1104+__dcosh_la_CoutTab(%rip), %xmm3
+        lea       (%r10,%r10), %edx
+        movsd     (%rcx,%rdx,8), %xmm15
+        negl      %edx
+        movsd     -32(%rsp), %xmm4
+        orl       %r9d, %esi
+        andl      $2047, %edi
+        lea       1(%r10,%r10), %r11d
+        mulsd     1112+__dcosh_la_CoutTab(%rip), %xmm4
+        subsd     %xmm3, %xmm0
+        movw      %si, -2(%rsp)
+        andl      $-32753, %esi
+        shll      $4, %edi
+        subsd     %xmm4, %xmm0
+        movsd     -8(%rsp), %xmm6
+        orl       %edi, %esi
+        movw      %si, -2(%rsp)
+        lea       128(%rdx), %esi
+        mulsd     %xmm6, %xmm15
+        movaps    %xmm0, %xmm5
+        mulsd     %xmm0, %xmm5
+        movsd     -8(%rsp), %xmm7
+        movaps    %xmm15, %xmm8
+        movsd     (%rcx,%rsi,8), %xmm11
+        addl      $129, %edx
+        mulsd     %xmm7, %xmm11
+        movaps    %xmm15, %xmm10
+        mulsd     %xmm5, %xmm14
+        addsd     %xmm11, %xmm8
+        subsd     %xmm11, %xmm15
+        addsd     1064+__dcosh_la_CoutTab(%rip), %xmm14
+        movsd     %xmm8, -24(%rsp)
+        movsd     (%rcx,%r11,8), %xmm12
+        movsd     (%rcx,%rdx,8), %xmm13
+        movsd     -24(%rsp), %xmm9
+        mulsd     %xmm6, %xmm12
+        subsd     %xmm9, %xmm10
+        mulsd     %xmm7, %xmm13
+        mulsd     %xmm5, %xmm14
+        addsd     %xmm11, %xmm10
+        mulsd     %xmm0, %xmm14
+        movsd     1088+__dcosh_la_CoutTab(%rip), %xmm1
+        movaps    %xmm12, %xmm11
+        mulsd     %xmm5, %xmm1
+        subsd     %xmm13, %xmm12
+        mulsd     %xmm15, %xmm14
+        mulsd     %xmm0, %xmm12
+        addsd     1072+__dcosh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm15, %xmm0
+        mulsd     %xmm5, %xmm1
+        addsd     %xmm12, %xmm11
+        movsd     %xmm10, -16(%rsp)
+        addsd     %xmm13, %xmm11
+        addsd     1056+__dcosh_la_CoutTab(%rip), %xmm1
+        addsd     %xmm14, %xmm11
+        mulsd     %xmm5, %xmm1
+        addsd     %xmm0, %xmm11
+        movsd     -24(%rsp), %xmm3
+        mulsd     %xmm3, %xmm1
+        movsd     -16(%rsp), %xmm2
+        addsd     %xmm1, %xmm11
+        addsd     %xmm2, %xmm11
+        movsd     %xmm11, -24(%rsp)
+        movsd     -24(%rsp), %xmm0
+        addsd     %xmm0, %xmm3
+        movsd     %xmm3, (%r8)
+        ret
+
+.LBL_2_9:
+
+        movsd     1120+__dcosh_la_CoutTab(%rip), %xmm0
+        movl      $3, %eax
+        mulsd     %xmm0, %xmm0
+        movsd     %xmm0, (%r8)
+        ret
+
+.LBL_2_10:
+
+        movsd     1136+__dcosh_la_CoutTab(%rip), %xmm0
+        addsd     -8(%rsp), %xmm0
+        movsd     %xmm0, (%r8)
+
+
+        ret
+
+.LBL_2_12:
+
+        movsd     (%rdi), %xmm0
+        mulsd     %xmm0, %xmm0
+        movsd     %xmm0, (%r8)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dcosh_cout_rare_internal,@function
+       .size   __svml_dcosh_cout_rare_internal,.-__svml_dcosh_cout_rare_internal
+..LN__svml_dcosh_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dcosh_data_internal:
+       .long   0
+       .long   1071644672
+       .long   1828292879
+       .long   1071691096
+       .long   1014845819
+       .long   1071739576
+       .long   1853186616
+       .long   1071790202
+       .long   171030293
+       .long   1071843070
+       .long   1276261410
+       .long   1071898278
+       .long   3577096743
+       .long   1071955930
+       .long   3712504873
+       .long   1072016135
+       .long   1719614413
+       .long   1072079006
+       .long   1944781191
+       .long   1072144660
+       .long   1110089947
+       .long   1072213221
+       .long   2191782032
+       .long   1072284817
+       .long   2572866477
+       .long   1072359583
+       .long   3716502172
+       .long   1072437659
+       .long   3707479175
+       .long   1072519192
+       .long   2728693978
+       .long   1072604335
+       .long   0
+       .long   0
+       .long   1255956747
+       .long   1015588398
+       .long   3117910646
+       .long   3161559105
+       .long   3066496371
+       .long   1015656574
+       .long   3526460132
+       .long   1014428778
+       .long   300981948
+       .long   1014684169
+       .long   2951496418
+       .long   1013793687
+       .long   88491949
+       .long   1015427660
+       .long   330458198
+       .long   3163282740
+       .long   3993278767
+       .long   3161724279
+       .long   1451641639
+       .long   1015474673
+       .long   2960257726
+       .long   1013742662
+       .long   878562433
+       .long   1015521741
+       .long   2303740125
+       .long   1014042725
+       .long   3613079303
+       .long   1014164738
+       .long   396109971
+       .long   3163462691
+       .long   0
+       .long   1071644672
+       .long   2728693978
+       .long   1071555759
+       .long   3707479175
+       .long   1071470616
+       .long   3716502172
+       .long   1071389083
+       .long   2572866477
+       .long   1071311007
+       .long   2191782032
+       .long   1071236241
+       .long   1110089947
+       .long   1071164645
+       .long   1944781191
+       .long   1071096084
+       .long   1719614413
+       .long   1071030430
+       .long   3712504873
+       .long   1070967559
+       .long   3577096743
+       .long   1070907354
+       .long   1276261410
+       .long   1070849702
+       .long   171030293
+       .long   1070794494
+       .long   1853186616
+       .long   1070741626
+       .long   1014845819
+       .long   1070691000
+       .long   1828292879
+       .long   1070642520
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   4
+       .long   1071644672
+       .long   4
+       .long   1071644672
+       .long   4
+       .long   1071644672
+       .long   4
+       .long   1071644672
+       .long   4
+       .long   1071644672
+       .long   4
+       .long   1071644672
+       .long   4
+       .long   1071644672
+       .long   4
+       .long   1071644672
+       .long   1431655747
+       .long   1069897045
+       .long   1431655747
+       .long   1069897045
+       .long   1431655747
+       .long   1069897045
+       .long   1431655747
+       .long   1069897045
+       .long   1431655747
+       .long   1069897045
+       .long   1431655747
+       .long   1069897045
+       .long   1431655747
+       .long   1069897045
+       .long   1431655747
+       .long   1069897045
+       .long   1430802231
+       .long   1067799893
+       .long   1430802231
+       .long   1067799893
+       .long   1430802231
+       .long   1067799893
+       .long   1430802231
+       .long   1067799893
+       .long   1430802231
+       .long   1067799893
+       .long   1430802231
+       .long   1067799893
+       .long   1430802231
+       .long   1067799893
+       .long   1430802231
+       .long   1067799893
+       .long   287861260
+       .long   1065423121
+       .long   287861260
+       .long   1065423121
+       .long   287861260
+       .long   1065423121
+       .long   287861260
+       .long   1065423121
+       .long   287861260
+       .long   1065423121
+       .long   287861260
+       .long   1065423121
+       .long   287861260
+       .long   1065423121
+       .long   287861260
+       .long   1065423121
+       .long   3658019094
+       .long   1062650243
+       .long   3658019094
+       .long   1062650243
+       .long   3658019094
+       .long   1062650243
+       .long   3658019094
+       .long   1062650243
+       .long   3658019094
+       .long   1062650243
+       .long   3658019094
+       .long   1062650243
+       .long   3658019094
+       .long   1062650243
+       .long   3658019094
+       .long   1062650243
+       .long   1993999322
+       .long   1059717517
+       .long   1993999322
+       .long   1059717517
+       .long   1993999322
+       .long   1059717517
+       .long   1993999322
+       .long   1059717517
+       .long   1993999322
+       .long   1059717517
+       .long   1993999322
+       .long   1059717517
+       .long   1993999322
+       .long   1059717517
+       .long   1993999322
+       .long   1059717517
+       .long   0
+       .long   1071644672
+       .long   4200250559
+       .long   1071647514
+       .long   2851812149
+       .long   1071650365
+       .long   339411585
+       .long   1071653224
+       .long   1048019041
+       .long   1071656090
+       .long   772914124
+       .long   1071658964
+       .long   3899555717
+       .long   1071661845
+       .long   1928746161
+       .long   1071664735
+       .long   3541402996
+       .long   1071667632
+       .long   238821257
+       .long   1071670538
+       .long   702412510
+       .long   1071673451
+       .long   728934454
+       .long   1071676372
+       .long   410360776
+       .long   1071679301
+       .long   4133881824
+       .long   1071682237
+       .long   3402036099
+       .long   1071685182
+       .long   2602514713
+       .long   1071688135
+       .long   1828292879
+       .long   1071691096
+       .long   1172597893
+       .long   1071694065
+       .long   728909815
+       .long   1071697042
+       .long   590962156
+       .long   1071700027
+       .long   852742562
+       .long   1071703020
+       .long   1608493509
+       .long   1071706021
+       .long   2952712987
+       .long   1071709030
+       .long   685187902
+       .long   1071712048
+       .long   3490863953
+       .long   1071715073
+       .long   2875075254
+       .long   1071718107
+       .long   3228316108
+       .long   1071721149
+       .long   351405227
+       .long   1071724200
+       .long   2930322912
+       .long   1071727258
+       .long   2471440686
+       .long   1071730325
+       .long   3366293073
+       .long   1071733400
+       .long   1416741826
+       .long   1071736484
+       .long   1014845819
+       .long   1071739576
+       .long   2257959872
+       .long   1071742676
+       .long   948735466
+       .long   1071745785
+       .long   1480023343
+       .long   1071748902
+       .long   3949972341
+       .long   1071752027
+       .long   4162030108
+       .long   1071755161
+       .long   2214878420
+       .long   1071758304
+       .long   2502433899
+       .long   1071761455
+       .long   828946858
+       .long   1071764615
+       .long   1588871207
+       .long   1071767783
+       .long   586995997
+       .long   1071770960
+       .long   2218315341
+       .long   1071774145
+       .long   2288159958
+       .long   1071777339
+       .long   897099801
+       .long   1071780542
+       .long   2440944790
+       .long   1071783753
+       .long   2725843665
+       .long   1071786973
+       .long   1853186616
+       .long   1071790202
+       .long   4219606026
+       .long   1071793439
+       .long   1337108031
+       .long   1071796686
+       .long   1897844341
+       .long   1071799941
+       .long   1709341917
+       .long   1071803205
+       .long   874372905
+       .long   1071806478
+       .long   3790955393
+       .long   1071809759
+       .long   1972484976
+       .long   1071813050
+       .long   4112506593
+       .long   1071816349
+       .long   1724976915
+       .long   1071819658
+       .long   3504003472
+       .long   1071822975
+       .long   964107055
+       .long   1071826302
+       .long   2799960843
+       .long   1071829637
+       .long   526652809
+       .long   1071832982
+       .long   2839424854
+       .long   1071836335
+       .long   1253935211
+       .long   1071839698
+       .long   171030293
+       .long   1071843070
+       .long   3991843581
+       .long   1071846450
+       .long   4232894513
+       .long   1071849840
+       .long   1000925746
+       .long   1071853240
+       .long   2992903935
+       .long   1071856648
+       .long   1726216749
+       .long   1071860066
+       .long   1603444721
+       .long   1071863493
+       .long   2732492859
+       .long   1071866929
+       .long   926591435
+       .long   1071870375
+       .long   589198666
+       .long   1071873830
+       .long   1829099622
+       .long   1071877294
+       .long   460407023
+       .long   1071880768
+       .long   887463927
+       .long   1071884251
+       .long   3219942644
+       .long   1071887743
+       .long   3272845541
+       .long   1071891245
+       .long   1156440435
+       .long   1071894757
+       .long   1276261410
+       .long   1071898278
+       .long   3743175029
+       .long   1071901808
+       .long   78413852
+       .long   1071905349
+       .long   3278348324
+       .long   1071908898
+       .long   569847338
+       .long   1071912458
+       .long   654919306
+       .long   1071916027
+       .long   3645941911
+       .long   1071919605
+       .long   1065662932
+       .long   1071923194
+       .long   1617004845
+       .long   1071926792
+       .long   1118294578
+       .long   1071930400
+       .long   3978100823
+       .long   1071934017
+       .long   1720398391
+       .long   1071937645
+       .long   3049340112
+       .long   1071941282
+       .long   3784486610
+       .long   1071944929
+       .long   4040676318
+       .long   1071948586
+       .long   3933059031
+       .long   1071952253
+       .long   3577096743
+       .long   1071955930
+       .long   3088564500
+       .long   1071959617
+       .long   2583551245
+       .long   1071963314
+       .long   2178460671
+       .long   1071967021
+       .long   1990012071
+       .long   1071970738
+       .long   2135241198
+       .long   1071974465
+       .long   2731501122
+       .long   1071978202
+       .long   3896463087
+       .long   1071981949
+       .long   1453150082
+       .long   1071985707
+       .long   4109806887
+       .long   1071989474
+       .long   3395129871
+       .long   1071993252
+       .long   3723038930
+       .long   1071997040
+       .long   917841882
+       .long   1072000839
+       .long   3689071823
+       .long   1072004647
+       .long   3566716925
+       .long   1072008466
+       .long   671025100
+       .long   1072012296
+       .long   3712504873
+       .long   1072016135
+       .long   4222122499
+       .long   1072019985
+       .long   2321106615
+       .long   1072023846
+       .long   2425981843
+       .long   1072027717
+       .long   363667784
+       .long   1072031599
+       .long   551349105
+       .long   1072035491
+       .long   3111574537
+       .long   1072039393
+       .long   3872257780
+       .long   1072043306
+       .long   2956612997
+       .long   1072047230
+       .long   488188413
+       .long   1072051165
+       .long   885834528
+       .long   1072055110
+       .long   4273770423
+       .long   1072059065
+       .long   2186617381
+       .long   1072063032
+       .long   3339203574
+       .long   1072067009
+       .long   3561793907
+       .long   1072070997
+       .long   2979960120
+       .long   1072074996
+       .long   1719614413
+       .long   1072079006
+       .long   4201977662
+       .long   1072083026
+       .long   1963711167
+       .long   1072087058
+       .long   3721688645
+       .long   1072091100
+       .long   1013258799
+       .long   1072095154
+       .long   2555984613
+       .long   1072099218
+       .long   4182873220
+       .long   1072103293
+       .long   1727278727
+       .long   1072107380
+       .long   3907805044
+       .long   1072111477
+       .long   2263535754
+       .long   1072115586
+       .long   1218806132
+       .long   1072119706
+       .long   903334909
+       .long   1072123837
+       .long   1447192521
+       .long   1072127979
+       .long   2980802057
+       .long   1072132132
+       .long   1339972927
+       .long   1072136297
+       .long   950803702
+       .long   1072140473
+       .long   1944781191
+       .long   1072144660
+       .long   158781403
+       .long   1072148859
+       .long   19972402
+       .long   1072153069
+       .long   1660913392
+       .long   1072157290
+       .long   919555682
+       .long   1072161523
+       .long   2224145553
+       .long   1072165767
+       .long   1413356050
+       .long   1072170023
+       .long   2916157145
+       .long   1072174290
+       .long   2571947539
+       .long   1072178569
+       .long   515457527
+       .long   1072182860
+       .long   1176749997
+       .long   1072187162
+       .long   396319521
+       .long   1072191476
+       .long   2604962541
+       .long   1072195801
+       .long   3643909174
+       .long   1072200138
+       .long   3649726105
+       .long   1072204487
+       .long   2759350287
+       .long   1072208848
+       .long   1110089947
+       .long   1072213221
+       .long   3134592888
+       .long   1072217605
+       .long   380978316
+       .long   1072222002
+       .long   1577608921
+       .long   1072226410
+       .long   2568320822
+       .long   1072230830
+       .long   3492293770
+       .long   1072235262
+       .long   194117574
+       .long   1072239707
+       .long   1403662306
+       .long   1072244163
+       .long   2966275557
+       .long   1072248631
+       .long   727685349
+       .long   1072253112
+       .long   3418903055
+       .long   1072257604
+       .long   2591453363
+       .long   1072262109
+       .long   2682146384
+       .long   1072266626
+       .long   3833209506
+       .long   1072271155
+       .long   1892288442
+       .long   1072275697
+       .long   1297350157
+       .long   1072280251
+       .long   2191782032
+       .long   1072284817
+       .long   424392917
+       .long   1072289396
+       .long   434316067
+       .long   1072293987
+       .long   2366108318
+       .long   1072298590
+       .long   2069751141
+       .long   1072303206
+       .long   3985553595
+       .long   1072307834
+       .long   3964284211
+       .long   1072312475
+       .long   2152073944
+       .long   1072317129
+       .long   2990417245
+       .long   1072321795
+       .long   2331271250
+       .long   1072326474
+       .long   321958744
+       .long   1072331166
+       .long   1405169241
+       .long   1072335870
+       .long   1434058175
+       .long   1072340587
+       .long   557149882
+       .long   1072345317
+       .long   3218338682
+       .long   1072350059
+       .long   977020788
+       .long   1072354815
+       .long   2572866477
+       .long   1072359583
+       .long   3861050111
+       .long   1072364364
+       .long   697153126
+       .long   1072369159
+       .long   1822067026
+       .long   1072373966
+       .long   3092190715
+       .long   1072378786
+       .long   364333489
+       .long   1072383620
+       .long   2380618042
+       .long   1072388466
+       .long   703710506
+       .long   1072393326
+       .long   4076559943
+       .long   1072398198
+       .long   4062661092
+       .long   1072403084
+       .long   815859274
+       .long   1072407984
+       .long   3080351519
+       .long   1072412896
+       .long   2420883922
+       .long   1072417822
+       .long   3287523847
+       .long   1072422761
+       .long   1540824585
+       .long   1072427714
+       .long   1631695677
+       .long   1072432680
+       .long   3716502172
+       .long   1072437659
+       .long   3657065772
+       .long   1072442652
+       .long   1610600570
+       .long   1072447659
+       .long   2029714210
+       .long   1072452679
+       .long   777507147
+       .long   1072457713
+       .long   2307442995
+       .long   1072462760
+       .long   2483480501
+       .long   1072467821
+       .long   1464976603
+       .long   1072472896
+       .long   3706687593
+       .long   1072477984
+       .long   778901109
+       .long   1072483087
+       .long   1432208378
+       .long   1072488203
+       .long   1532734324
+       .long   1072493333
+       .long   1242007932
+       .long   1072498477
+       .long   721996136
+       .long   1072503635
+       .long   135105010
+       .long   1072508807
+       .long   3939148246
+       .long   1072513992
+       .long   3707479175
+       .long   1072519192
+       .long   3898795731
+       .long   1072524406
+       .long   382305176
+       .long   1072529635
+       .long   1912561781
+       .long   1072534877
+       .long   64696965
+       .long   1072540134
+       .long   3594158869
+       .long   1072545404
+       .long   4076975200
+       .long   1072550689
+       .long   1679558232
+       .long   1072555989
+       .long   863738719
+       .long   1072561303
+       .long   1796832535
+       .long   1072566631
+       .long   351641897
+       .long   1072571974
+       .long   991358482
+       .long   1072577331
+       .long   3884662774
+       .long   1072582702
+       .long   610758006
+       .long   1072588089
+       .long   4224142467
+       .long   1072593489
+       .long   2009970496
+       .long   1072598905
+       .long   2728693978
+       .long   1072604335
+       .long   2256325230
+       .long   1072609780
+       .long   764307441
+       .long   1072615240
+       .long   2719515920
+       .long   1072620714
+       .long   3999357479
+       .long   1072626203
+       .long   481706282
+       .long   1072631708
+       .long   929806999
+       .long   1072637227
+       .long   1222472308
+       .long   1072642761
+       .long   1533953344
+       .long   1072648310
+       .long   2038973688
+       .long   1072653874
+       .long   2912730644
+       .long   1072659453
+       .long   35929225
+       .long   1072665048
+       .long   2174652632
+       .long   1072670657
+       .long   915592468
+       .long   1072676282
+       .long   730821105
+       .long   1072681922
+       .long   1797923801
+       .long   1072687577
+       .long   0
+       .long   1072693248
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   4277927936
+       .long   1072049730
+       .long   4277927936
+       .long   1072049730
+       .long   4277927936
+       .long   1072049730
+       .long   4277927936
+       .long   1072049730
+       .long   4277927936
+       .long   1072049730
+       .long   4277927936
+       .long   1072049730
+       .long   4277927936
+       .long   1072049730
+       .long   4277927936
+       .long   1072049730
+       .long   2825664665
+       .long   3182190860
+       .long   2825664665
+       .long   3182190860
+       .long   2825664665
+       .long   3182190860
+       .long   2825664665
+       .long   3182190860
+       .long   2825664665
+       .long   3182190860
+       .long   2825664665
+       .long   3182190860
+       .long   2825664665
+       .long   3182190860
+       .long   2825664665
+       .long   3182190860
+       .long   0
+       .long   1119354880
+       .long   0
+       .long   1119354880
+       .long   0
+       .long   1119354880
+       .long   0
+       .long   1119354880
+       .long   0
+       .long   1119354880
+       .long   0
+       .long   1119354880
+       .long   0
+       .long   1119354880
+       .long   0
+       .long   1119354880
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   255
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   1887518228
+       .long   1069897045
+       .long   1887518228
+       .long   1069897045
+       .long   1887518228
+       .long   1069897045
+       .long   1887518228
+       .long   1069897045
+       .long   1887518228
+       .long   1069897045
+       .long   1887518228
+       .long   1069897045
+       .long   1887518228
+       .long   1069897045
+       .long   1887518228
+       .long   1069897045
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   256
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .type   __svml_dcosh_data_internal,@object
+       .size   __svml_dcosh_data_internal,3776
+       .space 832, 0x00        
+       .align 32
+__dcosh_la_CoutTab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   1048019041
+       .long   1072704666
+       .long   1398474845
+       .long   3161559171
+       .long   3541402996
+       .long   1072716208
+       .long   2759177317
+       .long   1015903202
+       .long   410360776
+       .long   1072727877
+       .long   1269990655
+       .long   1013024446
+       .long   1828292879
+       .long   1072739672
+       .long   1255956747
+       .long   1016636974
+       .long   852742562
+       .long   1072751596
+       .long   667253587
+       .long   1010842135
+       .long   3490863953
+       .long   1072763649
+       .long   960797498
+       .long   3163997456
+       .long   2930322912
+       .long   1072775834
+       .long   2599499422
+       .long   3163762623
+       .long   1014845819
+       .long   1072788152
+       .long   3117910646
+       .long   3162607681
+       .long   3949972341
+       .long   1072800603
+       .long   2068408548
+       .long   1015962444
+       .long   828946858
+       .long   1072813191
+       .long   10642492
+       .long   1016988014
+       .long   2288159958
+       .long   1072825915
+       .long   2169144469
+       .long   1015924597
+       .long   1853186616
+       .long   1072838778
+       .long   3066496371
+       .long   1016705150
+       .long   1709341917
+       .long   1072851781
+       .long   2571168217
+       .long   1015201075
+       .long   4112506593
+       .long   1072864925
+       .long   2947355221
+       .long   1015419624
+       .long   2799960843
+       .long   1072878213
+       .long   1423655381
+       .long   1016070727
+       .long   171030293
+       .long   1072891646
+       .long   3526460132
+       .long   1015477354
+       .long   2992903935
+       .long   1072905224
+       .long   2218154406
+       .long   1016276769
+       .long   926591435
+       .long   1072918951
+       .long   3208833762
+       .long   3163962090
+       .long   887463927
+       .long   1072932827
+       .long   3596744163
+       .long   3161842742
+       .long   1276261410
+       .long   1072946854
+       .long   300981948
+       .long   1015732745
+       .long   569847338
+       .long   1072961034
+       .long   472945272
+       .long   3160339305
+       .long   1617004845
+       .long   1072975368
+       .long   82804944
+       .long   1011391354
+       .long   3049340112
+       .long   1072989858
+       .long   3062915824
+       .long   1014219171
+       .long   3577096743
+       .long   1073004506
+       .long   2951496418
+       .long   1014842263
+       .long   1990012071
+       .long   1073019314
+       .long   3529070563
+       .long   3163861769
+       .long   1453150082
+       .long   1073034283
+       .long   498154669
+       .long   3162536638
+       .long   917841882
+       .long   1073049415
+       .long   18715565
+       .long   1016707884
+       .long   3712504873
+       .long   1073064711
+       .long   88491949
+       .long   1016476236
+       .long   363667784
+       .long   1073080175
+       .long   813753950
+       .long   1016833785
+       .long   2956612997
+       .long   1073095806
+       .long   2118169751
+       .long   3163784129
+       .long   2186617381
+       .long   1073111608
+       .long   2270764084
+       .long   3164321289
+       .long   1719614413
+       .long   1073127582
+       .long   330458198
+       .long   3164331316
+       .long   1013258799
+       .long   1073143730
+       .long   1748797611
+       .long   3161177658
+       .long   3907805044
+       .long   1073160053
+       .long   2257091225
+       .long   3162598983
+       .long   1447192521
+       .long   1073176555
+       .long   1462857171
+       .long   3163563097
+       .long   1944781191
+       .long   1073193236
+       .long   3993278767
+       .long   3162772855
+       .long   919555682
+       .long   1073210099
+       .long   3121969534
+       .long   1013996802
+       .long   2571947539
+       .long   1073227145
+       .long   3558159064
+       .long   3164425245
+       .long   2604962541
+       .long   1073244377
+       .long   2614425274
+       .long   3164587768
+       .long   1110089947
+       .long   1073261797
+       .long   1451641639
+       .long   1016523249
+       .long   2568320822
+       .long   1073279406
+       .long   2732824428
+       .long   1015401491
+       .long   2966275557
+       .long   1073297207
+       .long   2176155324
+       .long   3160891335
+       .long   2682146384
+       .long   1073315202
+       .long   2082178513
+       .long   3164411995
+       .long   2191782032
+       .long   1073333393
+       .long   2960257726
+       .long   1014791238
+       .long   2069751141
+       .long   1073351782
+       .long   1562170675
+       .long   3163773257
+       .long   2990417245
+       .long   1073370371
+       .long   3683467745
+       .long   3164417902
+       .long   1434058175
+       .long   1073389163
+       .long   251133233
+       .long   1016134345
+       .long   2572866477
+       .long   1073408159
+       .long   878562433
+       .long   1016570317
+       .long   3092190715
+       .long   1073427362
+       .long   814012168
+       .long   3160571998
+       .long   4076559943
+       .long   1073446774
+       .long   2119478331
+       .long   3161806927
+       .long   2420883922
+       .long   1073466398
+       .long   2049810052
+       .long   1015168464
+       .long   3716502172
+       .long   1073486235
+       .long   2303740125
+       .long   1015091301
+       .long   777507147
+       .long   1073506289
+       .long   4282924205
+       .long   1016236109
+       .long   3706687593
+       .long   1073526560
+       .long   3521726939
+       .long   1014301643
+       .long   1242007932
+       .long   1073547053
+       .long   1132034716
+       .long   3164388407
+       .long   3707479175
+       .long   1073567768
+       .long   3613079303
+       .long   1015213314
+       .long   64696965
+       .long   1073588710
+       .long   1768797490
+       .long   1016865536
+       .long   863738719
+       .long   1073609879
+       .long   1326992220
+       .long   3163661773
+       .long   3884662774
+       .long   1073631278
+       .long   2158611599
+       .long   1015258761
+       .long   2728693978
+       .long   1073652911
+       .long   396109971
+       .long   3164511267
+       .long   3999357479
+       .long   1073674779
+       .long   2258941616
+       .long   1016973300
+       .long   1533953344
+       .long   1073696886
+       .long   769171851
+       .long   1016714209
+       .long   2174652632
+       .long   1073719233
+       .long   4087714590
+       .long   1015498835
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   0
+       .long   1697350398
+       .long   1079448903
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1071644672
+       .long   1431652600
+       .long   1069897045
+       .long   1431670732
+       .long   1067799893
+       .long   984555731
+       .long   1065423122
+       .long   472530941
+       .long   1062650218
+       .long   2411329662
+       .long   1082536910
+       .long   4277796864
+       .long   1065758274
+       .long   3164486458
+       .long   1025308570
+       .long   4294967295
+       .long   2146435071
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   3875694624
+       .long   1077247184
+       .type   __dcosh_la_CoutTab,@object
+       .size   __dcosh_la_CoutTab,1152
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_cosh_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_cosh_s_la.s
new file mode 100644 (file)
index 0000000..6713ad8
--- /dev/null
@@ -0,0 +1,1213 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+
+       .text
+.L_2__routine_start___svml_coshf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_coshf16
+
+__svml_coshf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   1024+__svml_scosh_data_internal(%rip), %zmm4
+        vmovups   384+__svml_scosh_data_internal(%rip), %zmm6
+
+/*
+ * ............... Load argument ............................
+ * dM = x/log(2) + RShifter
+ */
+        vmovups   768+__svml_scosh_data_internal(%rip), %zmm10
+        vmovups   896+__svml_scosh_data_internal(%rip), %zmm7
+        vmovups   960+__svml_scosh_data_internal(%rip), %zmm9
+
+/* ... */
+        vmovups   704+__svml_scosh_data_internal(%rip), %zmm2
+
+/* x^2 */
+        vmovups   640+__svml_scosh_data_internal(%rip), %zmm3
+
+/* ............... G1,G2 2^N,2^(-N) ........... */
+        vmovups   __svml_scosh_data_internal(%rip), %zmm12
+        vmovups   256+__svml_scosh_data_internal(%rip), %zmm13
+
+/*
+ * -------------------- Implementation  -------------------
+ * ............... Abs argument ............................
+ */
+        vandnps   %zmm0, %zmm4, %zmm1
+
+/* ...............Check for overflow\underflow ............. */
+        vpternlogd $255, %zmm5, %zmm5, %zmm5
+        vfmadd213ps {rn-sae}, %zmm6, %zmm1, %zmm10
+        vpcmpd    $1, 512+__svml_scosh_data_internal(%rip), %zmm1, %k1
+
+/* iM now is an EXP(2^N) */
+        vpslld    $18, %zmm10, %zmm11
+
+/*
+ * ................... R ...................................
+ * sN = sM - RShifter
+ */
+        vsubps    {rn-sae}, %zmm6, %zmm10, %zmm8
+        vpermt2ps 64+__svml_scosh_data_internal(%rip), %zmm10, %zmm12
+        vpermt2ps 320+__svml_scosh_data_internal(%rip), %zmm10, %zmm13
+        vpandnd   %zmm1, %zmm1, %zmm5{%k1}
+
+/* sR = sX - sN*Log2_hi */
+        vfnmadd231ps {rn-sae}, %zmm7, %zmm8, %zmm1
+        vptestmd  %zmm5, %zmm5, %k0
+
+/* sR = (sX - sN*Log2_hi) - sN*Log2_lo */
+        vfnmadd231ps {rn-sae}, %zmm9, %zmm8, %zmm1
+        kmovw     %k0, %edx
+        vmulps    {rn-sae}, %zmm1, %zmm1, %zmm4
+        vmulps    {rn-sae}, %zmm4, %zmm2, %zmm2
+
+/* sSinh_r = r + r*(r^2*(a3)) */
+        vfmadd213ps {rn-sae}, %zmm1, %zmm1, %zmm2
+
+/* sOut = r^2*(a2) */
+        vmulps    {rn-sae}, %zmm4, %zmm3, %zmm1
+        vpandd    1216+__svml_scosh_data_internal(%rip), %zmm11, %zmm14
+        vpaddd    %zmm14, %zmm12, %zmm15
+        vpsubd    %zmm14, %zmm13, %zmm10
+
+/* sG2 = 2^N*Th + 2^(-N)*T_h */
+        vaddps    {rn-sae}, %zmm10, %zmm15, %zmm5
+
+/* sG1 = 2^N*Th - 2^(-N)*T_h */
+        vsubps    {rn-sae}, %zmm10, %zmm15, %zmm6
+
+/* res = sG1*(r + r*(r^2*(a3))) + sG2*(1+r^2*(a2)) */
+        vfmadd213ps {rn-sae}, %zmm5, %zmm5, %zmm1
+        vfmadd213ps {rn-sae}, %zmm1, %zmm2, %zmm6
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm6, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm6, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm6
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_scosh_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_coshf16,@function
+       .size   __svml_coshf16,.-__svml_coshf16
+..LN__svml_coshf16.0:
+
+.L_2__routine_start___svml_scosh_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_scosh_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        movq      %rsi, %r8
+        movzwl    2(%rdi), %edx
+        xorl      %eax, %eax
+        andl      $32640, %edx
+        cmpl      $32640, %edx
+        je        .LBL_2_12
+
+
+        pxor      %xmm0, %xmm0
+        cvtss2sd  (%rdi), %xmm0
+        movsd     %xmm0, -8(%rsp)
+        andb      $127, -1(%rsp)
+        movzwl    -2(%rsp), %edx
+        andl      $32752, %edx
+        cmpl      $15504, %edx
+        jle       .LBL_2_10
+
+
+        movsd     -8(%rsp), %xmm0
+        movsd     1096+__scosh_la_CoutTab(%rip), %xmm1
+        comisd    %xmm0, %xmm1
+        jbe       .LBL_2_9
+
+
+        movq      1128+__scosh_la_CoutTab(%rip), %rdx
+        movq      %rdx, -8(%rsp)
+        comisd    1144+__scosh_la_CoutTab(%rip), %xmm0
+        jb        .LBL_2_8
+
+
+        movsd     1040+__scosh_la_CoutTab(%rip), %xmm1
+        lea       __scosh_la_CoutTab(%rip), %r9
+        mulsd     %xmm0, %xmm1
+        addsd     1048+__scosh_la_CoutTab(%rip), %xmm1
+        movsd     %xmm1, -40(%rsp)
+        movsd     -40(%rsp), %xmm2
+        movsd     1088+__scosh_la_CoutTab(%rip), %xmm1
+        movl      -40(%rsp), %edx
+        movl      %edx, %esi
+        andl      $63, %esi
+        subsd     1048+__scosh_la_CoutTab(%rip), %xmm2
+        movsd     %xmm2, -32(%rsp)
+        lea       (%rsi,%rsi), %ecx
+        movsd     -32(%rsp), %xmm3
+        lea       1(%rsi,%rsi), %edi
+        mulsd     1104+__scosh_la_CoutTab(%rip), %xmm3
+        movsd     -32(%rsp), %xmm4
+        subsd     %xmm3, %xmm0
+        mulsd     1112+__scosh_la_CoutTab(%rip), %xmm4
+        shrl      $6, %edx
+        subsd     %xmm4, %xmm0
+        mulsd     %xmm0, %xmm1
+        addl      $1022, %edx
+        andl      $2047, %edx
+        addsd     1080+__scosh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     1072+__scosh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     1064+__scosh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     1056+__scosh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     %xmm0, %xmm1
+        movsd     (%r9,%rcx,8), %xmm0
+        mulsd     %xmm0, %xmm1
+        addsd     (%r9,%rdi,8), %xmm1
+        addsd     %xmm0, %xmm1
+        cmpl      $2046, %edx
+        ja        .LBL_2_7
+
+
+        movq      1128+__scosh_la_CoutTab(%rip), %rcx
+        shrq      $48, %rcx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -2(%rsp)
+        movsd     -8(%rsp), %xmm0
+        mulsd     %xmm1, %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%r8)
+        ret
+
+.LBL_2_7:
+
+        decl      %edx
+        andl      $2047, %edx
+        movzwl    -2(%rsp), %ecx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -2(%rsp)
+        movsd     -8(%rsp), %xmm0
+        mulsd     %xmm0, %xmm1
+        mulsd     1024+__scosh_la_CoutTab(%rip), %xmm1
+        cvtsd2ss  %xmm1, %xmm1
+        movss     %xmm1, (%r8)
+        ret
+
+.LBL_2_8:
+
+        movsd     1040+__scosh_la_CoutTab(%rip), %xmm1
+        lea       __scosh_la_CoutTab(%rip), %rcx
+        movzwl    -2(%rsp), %esi
+        andl      $-32753, %esi
+        movsd     1080+__scosh_la_CoutTab(%rip), %xmm14
+        mulsd     %xmm0, %xmm1
+        addsd     1048+__scosh_la_CoutTab(%rip), %xmm1
+        movsd     %xmm1, -40(%rsp)
+        movsd     -40(%rsp), %xmm2
+        movl      -40(%rsp), %r10d
+        movl      %r10d, %r9d
+        shrl      $6, %r9d
+        subsd     1048+__scosh_la_CoutTab(%rip), %xmm2
+        movsd     %xmm2, -32(%rsp)
+        lea       1023(%r9), %edi
+        movsd     -32(%rsp), %xmm3
+        addl      $1022, %r9d
+        mulsd     1104+__scosh_la_CoutTab(%rip), %xmm3
+        andl      $63, %r10d
+        movsd     -32(%rsp), %xmm4
+        lea       (%r10,%r10), %edx
+        mulsd     1112+__scosh_la_CoutTab(%rip), %xmm4
+        subsd     %xmm3, %xmm0
+        andl      $2047, %r9d
+        negl      %edi
+        movsd     (%rcx,%rdx,8), %xmm15
+        negl      %edx
+        shll      $4, %r9d
+        addl      $-4, %edi
+        orl       %r9d, %esi
+        andl      $2047, %edi
+        movw      %si, -2(%rsp)
+        andl      $-32753, %esi
+        shll      $4, %edi
+        lea       1(%r10,%r10), %r11d
+        movsd     -8(%rsp), %xmm6
+        orl       %edi, %esi
+        movw      %si, -2(%rsp)
+        lea       128(%rdx), %esi
+        addl      $129, %edx
+        subsd     %xmm4, %xmm0
+        mulsd     %xmm6, %xmm15
+        movaps    %xmm0, %xmm5
+        movaps    %xmm15, %xmm8
+        mulsd     %xmm0, %xmm5
+        movaps    %xmm15, %xmm10
+        movsd     (%rcx,%r11,8), %xmm2
+        mulsd     %xmm6, %xmm2
+        mulsd     %xmm5, %xmm14
+        movsd     -8(%rsp), %xmm7
+        movaps    %xmm2, %xmm12
+        movsd     (%rcx,%rdx,8), %xmm13
+        mulsd     %xmm7, %xmm13
+        addsd     1064+__scosh_la_CoutTab(%rip), %xmm14
+        movsd     1088+__scosh_la_CoutTab(%rip), %xmm1
+        subsd     %xmm13, %xmm12
+        mulsd     %xmm5, %xmm1
+        mulsd     %xmm5, %xmm14
+        mulsd     %xmm0, %xmm12
+        addsd     1072+__scosh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm14
+        addsd     %xmm12, %xmm2
+        mulsd     %xmm5, %xmm1
+        addsd     %xmm13, %xmm2
+        addsd     1056+__scosh_la_CoutTab(%rip), %xmm1
+        movsd     (%rcx,%rsi,8), %xmm11
+        mulsd     %xmm7, %xmm11
+        mulsd     %xmm5, %xmm1
+        addsd     %xmm11, %xmm8
+        subsd     %xmm11, %xmm15
+        movsd     %xmm8, -24(%rsp)
+        movsd     -24(%rsp), %xmm9
+        mulsd     %xmm15, %xmm14
+        subsd     %xmm9, %xmm10
+        mulsd     %xmm15, %xmm0
+        addsd     %xmm11, %xmm10
+        addsd     %xmm14, %xmm2
+        movsd     %xmm10, -16(%rsp)
+        addsd     %xmm0, %xmm2
+        movsd     -24(%rsp), %xmm3
+        mulsd     %xmm3, %xmm1
+        movsd     -16(%rsp), %xmm6
+        addsd     %xmm1, %xmm2
+        addsd     %xmm6, %xmm2
+        movsd     %xmm2, -24(%rsp)
+        movsd     -24(%rsp), %xmm0
+        addsd     %xmm0, %xmm3
+        cvtsd2ss  %xmm3, %xmm3
+        movss     %xmm3, (%r8)
+        ret
+
+.LBL_2_9:
+
+        movsd     1120+__scosh_la_CoutTab(%rip), %xmm0
+        movl      $3, %eax
+        mulsd     %xmm0, %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%r8)
+        ret
+
+.LBL_2_10:
+
+        movsd     1136+__scosh_la_CoutTab(%rip), %xmm0
+        addsd     -8(%rsp), %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%r8)
+
+
+        ret
+
+.LBL_2_12:
+
+        movss     (%rdi), %xmm0
+        mulss     %xmm0, %xmm0
+        movss     %xmm0, (%r8)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_scosh_cout_rare_internal,@function
+       .size   __svml_scosh_cout_rare_internal,.-__svml_scosh_cout_rare_internal
+..LN__svml_scosh_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_scosh_data_internal:
+       .long   1056964608
+       .long   1057148295
+       .long   1057336003
+       .long   1057527823
+       .long   1057723842
+       .long   1057924154
+       .long   1058128851
+       .long   1058338032
+       .long   1058551792
+       .long   1058770234
+       .long   1058993458
+       .long   1059221571
+       .long   1059454679
+       .long   1059692891
+       .long   1059936319
+       .long   1060185078
+       .long   1060439283
+       .long   1060699055
+       .long   1060964516
+       .long   1061235789
+       .long   1061513002
+       .long   1061796286
+       .long   1062085772
+       .long   1062381598
+       .long   1062683901
+       .long   1062992824
+       .long   1063308511
+       .long   1063631111
+       .long   1063960775
+       .long   1064297658
+       .long   1064641917
+       .long   1064993715
+       .long   0
+       .long   2999887785
+       .long   852465809
+       .long   3003046475
+       .long   2984291233
+       .long   3001644133
+       .long   854021668
+       .long   2997748242
+       .long   849550193
+       .long   2995541347
+       .long   851518274
+       .long   809701978
+       .long   2997656926
+       .long   2996185864
+       .long   2980965110
+       .long   3002882728
+       .long   844097402
+       .long   848217591
+       .long   2999013352
+       .long   2992006718
+       .long   831170615
+       .long   3002278818
+       .long   833158180
+       .long   3000769962
+       .long   2991891850
+       .long   2999994908
+       .long   2979965785
+       .long   2982419430
+       .long   2982221534
+       .long   2999469642
+       .long   833168438
+       .long   2987538264
+       .long   1056964608
+       .long   1056605107
+       .long   1056253309
+       .long   1055909050
+       .long   1055572167
+       .long   1055242503
+       .long   1054919903
+       .long   1054604216
+       .long   1054295293
+       .long   1053992990
+       .long   1053697164
+       .long   1053407678
+       .long   1053124394
+       .long   1052847181
+       .long   1052575908
+       .long   1052310447
+       .long   1052050675
+       .long   1051796470
+       .long   1051547711
+       .long   1051304283
+       .long   1051066071
+       .long   1050832963
+       .long   1050604850
+       .long   1050381626
+       .long   1050163184
+       .long   1049949424
+       .long   1049740243
+       .long   1049535546
+       .long   1049335234
+       .long   1049139215
+       .long   1048947395
+       .long   1048759687
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1056964879
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1042983629
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   3212836864
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .type   __svml_scosh_data_internal,@object
+       .size   __svml_scosh_data_internal,1920
+       .align 32
+__scosh_la_CoutTab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   1048019041
+       .long   1072704666
+       .long   1398474845
+       .long   3161559171
+       .long   3541402996
+       .long   1072716208
+       .long   2759177317
+       .long   1015903202
+       .long   410360776
+       .long   1072727877
+       .long   1269990655
+       .long   1013024446
+       .long   1828292879
+       .long   1072739672
+       .long   1255956747
+       .long   1016636974
+       .long   852742562
+       .long   1072751596
+       .long   667253587
+       .long   1010842135
+       .long   3490863953
+       .long   1072763649
+       .long   960797498
+       .long   3163997456
+       .long   2930322912
+       .long   1072775834
+       .long   2599499422
+       .long   3163762623
+       .long   1014845819
+       .long   1072788152
+       .long   3117910646
+       .long   3162607681
+       .long   3949972341
+       .long   1072800603
+       .long   2068408548
+       .long   1015962444
+       .long   828946858
+       .long   1072813191
+       .long   10642492
+       .long   1016988014
+       .long   2288159958
+       .long   1072825915
+       .long   2169144469
+       .long   1015924597
+       .long   1853186616
+       .long   1072838778
+       .long   3066496371
+       .long   1016705150
+       .long   1709341917
+       .long   1072851781
+       .long   2571168217
+       .long   1015201075
+       .long   4112506593
+       .long   1072864925
+       .long   2947355221
+       .long   1015419624
+       .long   2799960843
+       .long   1072878213
+       .long   1423655381
+       .long   1016070727
+       .long   171030293
+       .long   1072891646
+       .long   3526460132
+       .long   1015477354
+       .long   2992903935
+       .long   1072905224
+       .long   2218154406
+       .long   1016276769
+       .long   926591435
+       .long   1072918951
+       .long   3208833762
+       .long   3163962090
+       .long   887463927
+       .long   1072932827
+       .long   3596744163
+       .long   3161842742
+       .long   1276261410
+       .long   1072946854
+       .long   300981948
+       .long   1015732745
+       .long   569847338
+       .long   1072961034
+       .long   472945272
+       .long   3160339305
+       .long   1617004845
+       .long   1072975368
+       .long   82804944
+       .long   1011391354
+       .long   3049340112
+       .long   1072989858
+       .long   3062915824
+       .long   1014219171
+       .long   3577096743
+       .long   1073004506
+       .long   2951496418
+       .long   1014842263
+       .long   1990012071
+       .long   1073019314
+       .long   3529070563
+       .long   3163861769
+       .long   1453150082
+       .long   1073034283
+       .long   498154669
+       .long   3162536638
+       .long   917841882
+       .long   1073049415
+       .long   18715565
+       .long   1016707884
+       .long   3712504873
+       .long   1073064711
+       .long   88491949
+       .long   1016476236
+       .long   363667784
+       .long   1073080175
+       .long   813753950
+       .long   1016833785
+       .long   2956612997
+       .long   1073095806
+       .long   2118169751
+       .long   3163784129
+       .long   2186617381
+       .long   1073111608
+       .long   2270764084
+       .long   3164321289
+       .long   1719614413
+       .long   1073127582
+       .long   330458198
+       .long   3164331316
+       .long   1013258799
+       .long   1073143730
+       .long   1748797611
+       .long   3161177658
+       .long   3907805044
+       .long   1073160053
+       .long   2257091225
+       .long   3162598983
+       .long   1447192521
+       .long   1073176555
+       .long   1462857171
+       .long   3163563097
+       .long   1944781191
+       .long   1073193236
+       .long   3993278767
+       .long   3162772855
+       .long   919555682
+       .long   1073210099
+       .long   3121969534
+       .long   1013996802
+       .long   2571947539
+       .long   1073227145
+       .long   3558159064
+       .long   3164425245
+       .long   2604962541
+       .long   1073244377
+       .long   2614425274
+       .long   3164587768
+       .long   1110089947
+       .long   1073261797
+       .long   1451641639
+       .long   1016523249
+       .long   2568320822
+       .long   1073279406
+       .long   2732824428
+       .long   1015401491
+       .long   2966275557
+       .long   1073297207
+       .long   2176155324
+       .long   3160891335
+       .long   2682146384
+       .long   1073315202
+       .long   2082178513
+       .long   3164411995
+       .long   2191782032
+       .long   1073333393
+       .long   2960257726
+       .long   1014791238
+       .long   2069751141
+       .long   1073351782
+       .long   1562170675
+       .long   3163773257
+       .long   2990417245
+       .long   1073370371
+       .long   3683467745
+       .long   3164417902
+       .long   1434058175
+       .long   1073389163
+       .long   251133233
+       .long   1016134345
+       .long   2572866477
+       .long   1073408159
+       .long   878562433
+       .long   1016570317
+       .long   3092190715
+       .long   1073427362
+       .long   814012168
+       .long   3160571998
+       .long   4076559943
+       .long   1073446774
+       .long   2119478331
+       .long   3161806927
+       .long   2420883922
+       .long   1073466398
+       .long   2049810052
+       .long   1015168464
+       .long   3716502172
+       .long   1073486235
+       .long   2303740125
+       .long   1015091301
+       .long   777507147
+       .long   1073506289
+       .long   4282924205
+       .long   1016236109
+       .long   3706687593
+       .long   1073526560
+       .long   3521726939
+       .long   1014301643
+       .long   1242007932
+       .long   1073547053
+       .long   1132034716
+       .long   3164388407
+       .long   3707479175
+       .long   1073567768
+       .long   3613079303
+       .long   1015213314
+       .long   64696965
+       .long   1073588710
+       .long   1768797490
+       .long   1016865536
+       .long   863738719
+       .long   1073609879
+       .long   1326992220
+       .long   3163661773
+       .long   3884662774
+       .long   1073631278
+       .long   2158611599
+       .long   1015258761
+       .long   2728693978
+       .long   1073652911
+       .long   396109971
+       .long   3164511267
+       .long   3999357479
+       .long   1073674779
+       .long   2258941616
+       .long   1016973300
+       .long   1533953344
+       .long   1073696886
+       .long   769171851
+       .long   1016714209
+       .long   2174652632
+       .long   1073719233
+       .long   4087714590
+       .long   1015498835
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   0
+       .long   1697350398
+       .long   1079448903
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1071644672
+       .long   1431652600
+       .long   1069897045
+       .long   1431670732
+       .long   1067799893
+       .long   984555731
+       .long   1065423122
+       .long   472530941
+       .long   1062650218
+       .long   2684354560
+       .long   1079401119
+       .long   4277796864
+       .long   1065758274
+       .long   3164486458
+       .long   1025308570
+       .long   4294967295
+       .long   2146435071
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   3875694624
+       .long   1077247184
+       .type   __scosh_la_CoutTab,@object
+       .size   __scosh_la_CoutTab,1152
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_exp2_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_exp2_d_la.s
new file mode 100644 (file)
index 0000000..af4f281
--- /dev/null
@@ -0,0 +1,832 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+
+       .text
+.L_2__routine_start___svml_exp28_z0_0:
+
+       .align    16,0x90
+       .globl __svml_exp28
+
+__svml_exp28:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   384+__svml_dexp2_data_internal_avx512(%rip), %zmm14
+        vmovups   448+__svml_dexp2_data_internal_avx512(%rip), %zmm6
+
+/*
+ * Reduced argument
+*/
+        vreducepd $65, {sae}, %zmm0, %zmm10
+        vmovups   320+__svml_dexp2_data_internal_avx512(%rip), %zmm7
+        vmovups   512+__svml_dexp2_data_internal_avx512(%rip), %zmm3
+        vmovups   256+__svml_dexp2_data_internal_avx512(%rip), %zmm8
+        vmovups   __svml_dexp2_data_internal_avx512(%rip), %zmm13
+
+/* c6*r   + c5 */
+        vfmadd231pd {rn-sae}, %zmm10, %zmm6, %zmm14
+        vmovups   192+__svml_dexp2_data_internal_avx512(%rip), %zmm9
+        vmovups   640+__svml_dexp2_data_internal_avx512(%rip), %zmm2
+        vmovups   128+__svml_dexp2_data_internal_avx512(%rip), %zmm11
+
+/* c6*r^2 + c5*r + c4 */
+        vfmadd213pd {rn-sae}, %zmm7, %zmm10, %zmm14
+
+/*
+ * Integer form of K+0.b1b2b3b4 in lower bits - call K_plus_f0
+ * Mantisssa of normalized double precision FP: 1.b1b2...b52
+ */
+        vaddpd    {rd-sae}, %zmm3, %zmm0, %zmm4
+        vandpd    576+__svml_dexp2_data_internal_avx512(%rip), %zmm0, %zmm1
+
+/* c6*r^3 + c5*r^2 + c4*r + c3 */
+        vfmadd213pd {rn-sae}, %zmm8, %zmm10, %zmm14
+        vcmppd    $29, {sae}, %zmm2, %zmm1, %k0
+
+/* c6*r^4 + c5*r^3 + c4*r^2 + c3*r + c2 */
+        vfmadd213pd {rn-sae}, %zmm9, %zmm10, %zmm14
+        kmovw     %k0, %edx
+
+/* c6*r^5 + c5*r^4 + c4*r^3 + c3*r^2 + c2*r + c1 */
+        vfmadd213pd {rn-sae}, %zmm11, %zmm10, %zmm14
+
+/* Table value: 2^(0.b1b2b3b4) */
+        vpandq    704+__svml_dexp2_data_internal_avx512(%rip), %zmm4, %zmm5
+        vpermt2pd 64+__svml_dexp2_data_internal_avx512(%rip), %zmm5, %zmm13
+
+/* T*r */
+        vmulpd    {rn-sae}, %zmm10, %zmm13, %zmm12
+
+/* T + (T*r*(c6*r^5 + c5*r^4 + c4*r^3 + c3*r^2 + c2*r + c1)) */
+        vfmadd213pd {rn-sae}, %zmm13, %zmm12, %zmm14
+
+/* Scaling placed at the end to avoid accuracy loss when T*r*scale underflows */
+        vscalefpd {rn-sae}, %zmm0, %zmm14, %zmm1
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm1, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm1, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm1
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dexp2_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_exp28,@function
+       .size   __svml_exp28,.-__svml_exp28
+..LN__svml_exp28.0:
+
+.L_2__routine_start___svml_dexp2_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dexp2_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    6(%rdi), %edx
+        andl      $32752, %edx
+        movsd     (%rdi), %xmm5
+        movsd     %xmm5, -8(%rsp)
+        cmpl      $32752, %edx
+        je        .LBL_2_12
+
+
+        movsd     1072+__dexp2_la__imldExp2HATab(%rip), %xmm0
+        comisd    %xmm5, %xmm0
+        jbe       .LBL_2_10
+
+
+        comisd    1088+__dexp2_la__imldExp2HATab(%rip), %xmm5
+        jbe       .LBL_2_9
+
+
+        movsd     1024+__dexp2_la__imldExp2HATab(%rip), %xmm0
+        movaps    %xmm5, %xmm3
+        lea       __dexp2_la__imldExp2HATab(%rip), %r10
+        addsd     %xmm5, %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movsd     -24(%rsp), %xmm1
+        movl      -24(%rsp), %r8d
+        movl      %r8d, %ecx
+        andl      $63, %r8d
+        subsd     1024+__dexp2_la__imldExp2HATab(%rip), %xmm1
+        movsd     %xmm1, -16(%rsp)
+        lea       1(%r8,%r8), %r9d
+        movsd     -16(%rsp), %xmm2
+        lea       (%r8,%r8), %edi
+        movsd     1064+__dexp2_la__imldExp2HATab(%rip), %xmm1
+        subsd     %xmm2, %xmm3
+        mulsd     %xmm3, %xmm1
+        movsd     (%r10,%rdi,8), %xmm4
+        shrl      $6, %ecx
+        addsd     1056+__dexp2_la__imldExp2HATab(%rip), %xmm1
+        comisd    1080+__dexp2_la__imldExp2HATab(%rip), %xmm5
+        mulsd     %xmm3, %xmm1
+        movq      1112+__dexp2_la__imldExp2HATab(%rip), %rdx
+        movq      %rdx, -8(%rsp)
+        lea       1023(%rcx), %edx
+        addsd     1048+__dexp2_la__imldExp2HATab(%rip), %xmm1
+        mulsd     %xmm3, %xmm1
+        addsd     1040+__dexp2_la__imldExp2HATab(%rip), %xmm1
+        mulsd     %xmm3, %xmm1
+        addsd     1032+__dexp2_la__imldExp2HATab(%rip), %xmm1
+        mulsd     %xmm3, %xmm1
+        addsd     (%r10,%r9,8), %xmm1
+        mulsd     %xmm4, %xmm1
+        addsd     %xmm4, %xmm1
+        jb        .LBL_2_8
+
+
+        andl      $2047, %edx
+        cmpl      $2046, %edx
+        ja        .LBL_2_7
+
+
+        movq      1112+__dexp2_la__imldExp2HATab(%rip), %rcx
+        shrq      $48, %rcx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -2(%rsp)
+        movsd     -8(%rsp), %xmm0
+        mulsd     %xmm1, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_7:
+
+        decl      %edx
+        andl      $2047, %edx
+        movzwl    -2(%rsp), %ecx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -2(%rsp)
+        movsd     -8(%rsp), %xmm0
+        mulsd     %xmm1, %xmm0
+        mulsd     1128+__dexp2_la__imldExp2HATab(%rip), %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_8:
+
+        addl      $1123, %ecx
+        andl      $2047, %ecx
+        movzwl    -2(%rsp), %eax
+        shll      $4, %ecx
+        andl      $-32753, %eax
+        orl       %ecx, %eax
+        movw      %ax, -2(%rsp)
+        movl      $4, %eax
+        movsd     -8(%rsp), %xmm0
+        mulsd     %xmm1, %xmm0
+        mulsd     1136+__dexp2_la__imldExp2HATab(%rip), %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_9:
+
+        movsd     1096+__dexp2_la__imldExp2HATab(%rip), %xmm0
+        movl      $4, %eax
+        mulsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_10:
+
+        movsd     1104+__dexp2_la__imldExp2HATab(%rip), %xmm0
+        movl      $3, %eax
+        mulsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+
+
+        ret
+
+.LBL_2_12:
+
+        movb      -1(%rsp), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_14
+
+.LBL_2_13:
+
+        mulsd     %xmm5, %xmm5
+        movsd     %xmm5, (%rsi)
+        ret
+
+.LBL_2_14:
+
+        testl     $1048575, -4(%rsp)
+        jne       .LBL_2_13
+
+
+        cmpl      $0, -8(%rsp)
+        jne       .LBL_2_13
+
+
+        movq      1112+__dexp2_la__imldExp2HATab(%rip), %rdx
+        movq      %rdx, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dexp2_cout_rare_internal,@function
+       .size   __svml_dexp2_cout_rare_internal,.-__svml_dexp2_cout_rare_internal
+..LN__svml_dexp2_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dexp2_data_internal_avx512:
+       .long   0
+       .long   1072693248
+       .long   1828292879
+       .long   1072739672
+       .long   1014845819
+       .long   1072788152
+       .long   1853186616
+       .long   1072838778
+       .long   171030293
+       .long   1072891646
+       .long   1276261410
+       .long   1072946854
+       .long   3577096743
+       .long   1073004506
+       .long   3712504873
+       .long   1073064711
+       .long   1719614413
+       .long   1073127582
+       .long   1944781191
+       .long   1073193236
+       .long   1110089947
+       .long   1073261797
+       .long   2191782032
+       .long   1073333393
+       .long   2572866477
+       .long   1073408159
+       .long   3716502172
+       .long   1073486235
+       .long   3707479175
+       .long   1073567768
+       .long   2728693978
+       .long   1073652911
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4286862682
+       .long   1070514109
+       .long   4286862682
+       .long   1070514109
+       .long   4286862682
+       .long   1070514109
+       .long   4286862682
+       .long   1070514109
+       .long   4286862682
+       .long   1070514109
+       .long   4286862682
+       .long   1070514109
+       .long   4286862682
+       .long   1070514109
+       .long   4286862682
+       .long   1070514109
+       .long   3568142009
+       .long   1068264200
+       .long   3568142009
+       .long   1068264200
+       .long   3568142009
+       .long   1068264200
+       .long   3568142009
+       .long   1068264200
+       .long   3568142009
+       .long   1068264200
+       .long   3568142009
+       .long   1068264200
+       .long   3568142009
+       .long   1068264200
+       .long   3568142009
+       .long   1068264200
+       .long   454500946
+       .long   1065595565
+       .long   454500946
+       .long   1065595565
+       .long   454500946
+       .long   1065595565
+       .long   454500946
+       .long   1065595565
+       .long   454500946
+       .long   1065595565
+       .long   454500946
+       .long   1065595565
+       .long   454500946
+       .long   1065595565
+       .long   454500946
+       .long   1065595565
+       .long   655609113
+       .long   1062590279
+       .long   655609113
+       .long   1062590279
+       .long   655609113
+       .long   1062590279
+       .long   655609113
+       .long   1062590279
+       .long   655609113
+       .long   1062590279
+       .long   655609113
+       .long   1062590279
+       .long   655609113
+       .long   1062590279
+       .long   655609113
+       .long   1062590279
+       .long   4112922395
+       .long   1059365335
+       .long   4112922395
+       .long   1059365335
+       .long   4112922395
+       .long   1059365335
+       .long   4112922395
+       .long   1059365335
+       .long   4112922395
+       .long   1059365335
+       .long   4112922395
+       .long   1059365335
+       .long   4112922395
+       .long   1059365335
+       .long   4112922395
+       .long   1059365335
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   0
+       .long   1083174911
+       .long   0
+       .long   1083174911
+       .long   0
+       .long   1083174911
+       .long   0
+       .long   1083174911
+       .long   0
+       .long   1083174911
+       .long   0
+       .long   1083174911
+       .long   0
+       .long   1083174911
+       .long   0
+       .long   1083174911
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .type   __svml_dexp2_data_internal_avx512,@object
+       .size   __svml_dexp2_data_internal_avx512,768
+       .align 32
+__dexp2_la__imldExp2HATab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   1048019041
+       .long   1072704666
+       .long   2631457885
+       .long   3161546771
+       .long   3541402996
+       .long   1072716208
+       .long   896005651
+       .long   1015861842
+       .long   410360776
+       .long   1072727877
+       .long   1642514529
+       .long   1012987726
+       .long   1828292879
+       .long   1072739672
+       .long   1568897901
+       .long   1016568486
+       .long   852742562
+       .long   1072751596
+       .long   1882168529
+       .long   1010744893
+       .long   3490863953
+       .long   1072763649
+       .long   707771662
+       .long   3163903570
+       .long   2930322912
+       .long   1072775834
+       .long   3117806614
+       .long   3163670819
+       .long   1014845819
+       .long   1072788152
+       .long   3936719688
+       .long   3162512149
+       .long   3949972341
+       .long   1072800603
+       .long   1058231231
+       .long   1015777676
+       .long   828946858
+       .long   1072813191
+       .long   1044000608
+       .long   1016786167
+       .long   2288159958
+       .long   1072825915
+       .long   1151779725
+       .long   1015705409
+       .long   1853186616
+       .long   1072838778
+       .long   3819481236
+       .long   1016499965
+       .long   1709341917
+       .long   1072851781
+       .long   2552227826
+       .long   1015039787
+       .long   4112506593
+       .long   1072864925
+       .long   1829350193
+       .long   1015216097
+       .long   2799960843
+       .long   1072878213
+       .long   1913391796
+       .long   1015756674
+       .long   171030293
+       .long   1072891646
+       .long   1303423926
+       .long   1015238005
+       .long   2992903935
+       .long   1072905224
+       .long   1574172746
+       .long   1016061241
+       .long   926591435
+       .long   1072918951
+       .long   3427487848
+       .long   3163704045
+       .long   887463927
+       .long   1072932827
+       .long   1049900754
+       .long   3161575912
+       .long   1276261410
+       .long   1072946854
+       .long   2804567149
+       .long   1015390024
+       .long   569847338
+       .long   1072961034
+       .long   1209502043
+       .long   3159926671
+       .long   1617004845
+       .long   1072975368
+       .long   1623370769
+       .long   1011049453
+       .long   3049340112
+       .long   1072989858
+       .long   3667985273
+       .long   1013894369
+       .long   3577096743
+       .long   1073004506
+       .long   3145379760
+       .long   1014403278
+       .long   1990012071
+       .long   1073019314
+       .long   7447438
+       .long   3163526196
+       .long   1453150082
+       .long   1073034283
+       .long   3171891295
+       .long   3162037958
+       .long   917841882
+       .long   1073049415
+       .long   419288974
+       .long   1016280325
+       .long   3712504873
+       .long   1073064711
+       .long   3793507337
+       .long   1016095713
+       .long   363667784
+       .long   1073080175
+       .long   728023093
+       .long   1016345318
+       .long   2956612997
+       .long   1073095806
+       .long   1005538728
+       .long   3163304901
+       .long   2186617381
+       .long   1073111608
+       .long   2018924632
+       .long   3163803357
+       .long   1719614413
+       .long   1073127582
+       .long   3210617384
+       .long   3163796463
+       .long   1013258799
+       .long   1073143730
+       .long   3094194670
+       .long   3160631279
+       .long   3907805044
+       .long   1073160053
+       .long   2119843535
+       .long   3161988964
+       .long   1447192521
+       .long   1073176555
+       .long   508946058
+       .long   3162904882
+       .long   1944781191
+       .long   1073193236
+       .long   3108873501
+       .long   3162190556
+       .long   919555682
+       .long   1073210099
+       .long   2882956373
+       .long   1013312481
+       .long   2571947539
+       .long   1073227145
+       .long   4047189812
+       .long   3163777462
+       .long   2604962541
+       .long   1073244377
+       .long   3631372142
+       .long   3163870288
+       .long   1110089947
+       .long   1073261797
+       .long   3253791412
+       .long   1015920431
+       .long   2568320822
+       .long   1073279406
+       .long   1509121860
+       .long   1014756995
+       .long   2966275557
+       .long   1073297207
+       .long   2339118633
+       .long   3160254904
+       .long   2682146384
+       .long   1073315202
+       .long   586480042
+       .long   3163702083
+       .long   2191782032
+       .long   1073333393
+       .long   730975783
+       .long   1014083580
+       .long   2069751141
+       .long   1073351782
+       .long   576856675
+       .long   3163014404
+       .long   2990417245
+       .long   1073370371
+       .long   3552361237
+       .long   3163667409
+       .long   1434058175
+       .long   1073389163
+       .long   1853053619
+       .long   1015310724
+       .long   2572866477
+       .long   1073408159
+       .long   2462790535
+       .long   1015814775
+       .long   3092190715
+       .long   1073427362
+       .long   1457303226
+       .long   3159737305
+       .long   4076559943
+       .long   1073446774
+       .long   950899508
+       .long   3160987380
+       .long   2420883922
+       .long   1073466398
+       .long   174054861
+       .long   1014300631
+       .long   3716502172
+       .long   1073486235
+       .long   816778419
+       .long   1014197934
+       .long   777507147
+       .long   1073506289
+       .long   3507050924
+       .long   1015341199
+       .long   3706687593
+       .long   1073526560
+       .long   1821514088
+       .long   1013410604
+       .long   1242007932
+       .long   1073547053
+       .long   1073740399
+       .long   3163532637
+       .long   3707479175
+       .long   1073567768
+       .long   2789017511
+       .long   1014276997
+       .long   64696965
+       .long   1073588710
+       .long   3586233004
+       .long   1015962192
+       .long   863738719
+       .long   1073609879
+       .long   129252895
+       .long   3162690849
+       .long   3884662774
+       .long   1073631278
+       .long   1614448851
+       .long   1014281732
+       .long   2728693978
+       .long   1073652911
+       .long   2413007344
+       .long   3163551506
+       .long   3999357479
+       .long   1073674779
+       .long   1101668360
+       .long   1015989180
+       .long   1533953344
+       .long   1073696886
+       .long   835814894
+       .long   1015702697
+       .long   2174652632
+       .long   1073719233
+       .long   1301400989
+       .long   1014466875
+       .long   0
+       .long   1121452032
+       .long   4277811695
+       .long   1072049730
+       .long   4286751290
+       .long   1070514109
+       .long   3607585384
+       .long   1068264200
+       .long   871937163
+       .long   1065595565
+       .long   3302507530
+       .long   1062590576
+       .long   0
+       .long   1083179008
+       .long   0
+       .long   3230658560
+       .long   0
+       .long   3230714880
+       .long   1
+       .long   1048576
+       .long   4294967295
+       .long   2146435071
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   967835648
+       .long   0
+       .long   0
+       .type   __dexp2_la__imldExp2HATab,@object
+       .size   __dexp2_la__imldExp2HATab,1152
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_exp2_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_exp2_s_la.s
new file mode 100644 (file)
index 0000000..3affa77
--- /dev/null
@@ -0,0 +1,496 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+
+       .text
+.L_2__routine_start___svml_exp2f16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_exp2f16
+
+__svml_exp2f16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   256+__svml_sexp2_data_internal_avx512(%rip), %zmm3
+
+/*
+ * Reduced argument
+*/
+        vreduceps $65, {sae}, %zmm0, %zmm6
+        vmovups   192+__svml_sexp2_data_internal_avx512(%rip), %zmm5
+        vmovups   128+__svml_sexp2_data_internal_avx512(%rip), %zmm10
+        vmovups   384+__svml_sexp2_data_internal_avx512(%rip), %zmm2
+        vmovups   64+__svml_sexp2_data_internal_avx512(%rip), %zmm7
+
+/*
+ * Integer form of K+0.b1b2b3b4 in lower bits - call K_plus_f0
+ * Mantisssa of normalized single precision FP: 1.b1b2...b23
+ */
+        vaddps    {rd-sae}, %zmm3, %zmm0, %zmm4
+        vandps    320+__svml_sexp2_data_internal_avx512(%rip), %zmm0, %zmm1
+
+/* c3*r   + c2 */
+        vfmadd231ps {rn-sae}, %zmm6, %zmm5, %zmm10
+        vcmpps    $30, {sae}, %zmm2, %zmm1, %k0
+
+/* c3*r^2 + c2*r + c1 */
+        vfmadd213ps {rn-sae}, %zmm7, %zmm6, %zmm10
+
+/* Table value: 2^(0.b1b2b3b4) */
+        vpermps   __svml_sexp2_data_internal_avx512(%rip), %zmm4, %zmm9
+        kmovw     %k0, %edx
+
+/* T*r */
+        vmulps    {rn-sae}, %zmm6, %zmm9, %zmm8
+
+/* T + (T*r*(c3*r^2 + c2*r + c1) */
+        vfmadd213ps {rn-sae}, %zmm9, %zmm8, %zmm10
+
+/* Scaling placed at the end to avoid accuracy loss when T*r*scale underflows */
+        vscalefps {rn-sae}, %zmm0, %zmm10, %zmm1
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm1, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm1, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm1
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_sexp2_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_exp2f16,@function
+       .size   __svml_exp2f16,.-__svml_exp2f16
+..LN__svml_exp2f16.0:
+
+.L_2__routine_start___svml_sexp2_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_sexp2_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    2(%rdi), %edx
+        andl      $32640, %edx
+        cmpl      $32640, %edx
+        je        .LBL_2_10
+
+
+        movss     (%rdi), %xmm7
+        movss     .L_2il0floatpacket.43(%rip), %xmm0
+        movl      %eax, -12(%rsp)
+        comiss    %xmm7, %xmm0
+        jb        .LBL_2_8
+
+
+        comiss    .L_2il0floatpacket.44(%rip), %xmm7
+        jb        .LBL_2_7
+
+
+        movaps    %xmm7, %xmm0
+        movaps    %xmm7, %xmm5
+        movss     %xmm0, -24(%rsp)
+        movss     -24(%rsp), %xmm1
+        movss     .L_2il0floatpacket.46(%rip), %xmm2
+        movss     .L_2il0floatpacket.52(%rip), %xmm6
+        addss     %xmm2, %xmm1
+        movss     %xmm1, -20(%rsp)
+        movss     -20(%rsp), %xmm3
+        movswl    -20(%rsp), %edx
+        subss     %xmm2, %xmm3
+        movss     %xmm3, -24(%rsp)
+        movss     -24(%rsp), %xmm4
+        subss     %xmm4, %xmm5
+        mulss     %xmm5, %xmm6
+        addss     .L_2il0floatpacket.51(%rip), %xmm6
+        mulss     %xmm5, %xmm6
+        addss     .L_2il0floatpacket.50(%rip), %xmm6
+        mulss     %xmm5, %xmm6
+        addss     .L_2il0floatpacket.49(%rip), %xmm6
+        mulss     %xmm5, %xmm6
+        addss     .L_2il0floatpacket.48(%rip), %xmm6
+        mulss     %xmm5, %xmm6
+        addss     .L_2il0floatpacket.47(%rip), %xmm6
+        movss     %xmm6, -16(%rsp)
+        cmpl      $104, %edx
+        jl        .LBL_2_6
+
+
+        movzbl    %dl, %edx
+        shll      $7, %edx
+        movw      %dx, -10(%rsp)
+        movss     -16(%rsp), %xmm0
+        mulss     -12(%rsp), %xmm0
+        movss     %xmm0, -16(%rsp)
+        movss     -16(%rsp), %xmm1
+        mulss     .L_2il0floatpacket.54(%rip), %xmm1
+        movss     %xmm1, -16(%rsp)
+        movl      -16(%rsp), %ecx
+        movl      %ecx, (%rsi)
+        ret
+
+.LBL_2_6:
+
+        addl      $-106, %edx
+        cmpltss   .L_2il0floatpacket.56(%rip), %xmm7
+        movzbl    %dl, %edx
+        movzwl    -10(%rsp), %eax
+        shll      $7, %edx
+        andl      $-32641, %eax
+        orl       %edx, %eax
+        movss     -16(%rsp), %xmm0
+        movw      %ax, -10(%rsp)
+        mulss     -12(%rsp), %xmm0
+        movd      %xmm7, %eax
+        movss     %xmm0, -16(%rsp)
+        movss     -16(%rsp), %xmm1
+        andl      $4, %eax
+        mulss     .L_2il0floatpacket.55(%rip), %xmm1
+        movss     %xmm1, -16(%rsp)
+        movl      -16(%rsp), %ecx
+        movl      %ecx, (%rsi)
+        ret
+
+.LBL_2_7:
+
+        movss     .L_2il0floatpacket.53(%rip), %xmm0
+        mulss     %xmm0, %xmm0
+        movss     %xmm0, -16(%rsp)
+        movl      -16(%rsp), %eax
+        movl      %eax, (%rsi)
+        movl      $4, %eax
+        ret
+
+.LBL_2_8:
+
+        movss     .L_2il0floatpacket.45(%rip), %xmm0
+        mulss     %xmm0, %xmm0
+        movss     %xmm0, -16(%rsp)
+        movl      -16(%rsp), %eax
+        movl      %eax, (%rsi)
+        movl      $3, %eax
+
+
+        ret
+
+.LBL_2_10:
+
+        movb      3(%rdi), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_12
+
+.LBL_2_11:
+
+        movss     (%rdi), %xmm0
+        mulss     %xmm0, %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_12:
+
+        testl     $8388607, (%rdi)
+        jne       .LBL_2_11
+
+
+        movl      %eax, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_sexp2_cout_rare_internal,@function
+       .size   __svml_sexp2_cout_rare_internal,.-__svml_sexp2_cout_rare_internal
+..LN__svml_sexp2_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_sexp2_data_internal_avx512:
+       .long   1065353216
+       .long   1065724611
+       .long   1066112450
+       .long   1066517459
+       .long   1066940400
+       .long   1067382066
+       .long   1067843287
+       .long   1068324927
+       .long   1068827891
+       .long   1069353124
+       .long   1069901610
+       .long   1070474380
+       .long   1071072509
+       .long   1071697119
+       .long   1072349383
+       .long   1073030525
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1047916907
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1030247626
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   1228931072
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .long   1123811328
+       .type   __svml_sexp2_data_internal_avx512,@object
+       .size   __svml_sexp2_data_internal_avx512,448
+       .align 4
+.L_2il0floatpacket.43:
+       .long   0x43000000
+       .type   .L_2il0floatpacket.43,@object
+       .size   .L_2il0floatpacket.43,4
+       .align 4
+.L_2il0floatpacket.44:
+       .long   0xc3160000
+       .type   .L_2il0floatpacket.44,@object
+       .size   .L_2il0floatpacket.44,4
+       .align 4
+.L_2il0floatpacket.45:
+       .long   0x7f7fffff
+       .type   .L_2il0floatpacket.45,@object
+       .size   .L_2il0floatpacket.45,4
+       .align 4
+.L_2il0floatpacket.46:
+       .long   0x4b400000
+       .type   .L_2il0floatpacket.46,@object
+       .size   .L_2il0floatpacket.46,4
+       .align 4
+.L_2il0floatpacket.47:
+       .long   0x3f800001
+       .type   .L_2il0floatpacket.47,@object
+       .size   .L_2il0floatpacket.47,4
+       .align 4
+.L_2il0floatpacket.48:
+       .long   0x3f317219
+       .type   .L_2il0floatpacket.48,@object
+       .size   .L_2il0floatpacket.48,4
+       .align 4
+.L_2il0floatpacket.49:
+       .long   0x3e75fc83
+       .type   .L_2il0floatpacket.49,@object
+       .size   .L_2il0floatpacket.49,4
+       .align 4
+.L_2il0floatpacket.50:
+       .long   0x3d635716
+       .type   .L_2il0floatpacket.50,@object
+       .size   .L_2il0floatpacket.50,4
+       .align 4
+.L_2il0floatpacket.51:
+       .long   0x3c1e883d
+       .type   .L_2il0floatpacket.51,@object
+       .size   .L_2il0floatpacket.51,4
+       .align 4
+.L_2il0floatpacket.52:
+       .long   0x3aafc483
+       .type   .L_2il0floatpacket.52,@object
+       .size   .L_2il0floatpacket.52,4
+       .align 4
+.L_2il0floatpacket.53:
+       .long   0x00000001
+       .type   .L_2il0floatpacket.53,@object
+       .size   .L_2il0floatpacket.53,4
+       .align 4
+.L_2il0floatpacket.54:
+       .long   0x7f000000
+       .type   .L_2il0floatpacket.54,@object
+       .size   .L_2il0floatpacket.54,4
+       .align 4
+.L_2il0floatpacket.55:
+       .long   0x34000000
+       .type   .L_2il0floatpacket.55,@object
+       .size   .L_2il0floatpacket.55,4
+       .align 4
+.L_2il0floatpacket.56:
+       .long   0xc2fc0000
+       .type   .L_2il0floatpacket.56,@object
+       .size   .L_2il0floatpacket.56,4
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_exp_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_exp_d_la.s
new file mode 100644 (file)
index 0000000..dd5f03a
--- /dev/null
@@ -0,0 +1,1076 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *   Argument representation:
+ *   N = rint(X*2^k/ln2) = 2^k*M+j
+ *   X = N*ln2/2^k + r = M*ln2 + ln2*(j/2^k) + r
+ *   then -ln2/2^(k+1) < r < ln2/2^(k+1)
+ *   Alternatively:
+ *   N = trunc(X*2^k/ln2)
+ *   then 0 < r < ln2/2^k
+ * 
+ *   Result calculation:
+ *   exp(X) = exp(M*ln2 + ln2*(j/2^k) + r)
+ *   = 2^M * 2^(j/2^k) * exp(r)
+ *   2^M is calculated by bit manipulation
+ *   2^(j/2^k) is stored in table
+ *   exp(r) is approximated by polynomial
+ * 
+ *   The table lookup is skipped if k = 0.
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_exp8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_exp8
+
+__svml_exp8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   256+__svml_dexp_data_internal_avx512(%rip), %zmm3
+        vmovups   320+__svml_dexp_data_internal_avx512(%rip), %zmm1
+        vmovups   384+__svml_dexp_data_internal_avx512(%rip), %zmm4
+        vmovups   448+__svml_dexp_data_internal_avx512(%rip), %zmm2
+        vmovups   576+__svml_dexp_data_internal_avx512(%rip), %zmm5
+        vmovups   640+__svml_dexp_data_internal_avx512(%rip), %zmm15
+
+/* 2^(52-4)*1.5 + x * log2(e) in round-to-zero mode */
+        vfmadd213pd {rz-sae}, %zmm1, %zmm0, %zmm3
+        vmovups   704+__svml_dexp_data_internal_avx512(%rip), %zmm6
+
+/* p34 = c4*r+c3 */
+        vmovups   768+__svml_dexp_data_internal_avx512(%rip), %zmm9
+        vmovups   832+__svml_dexp_data_internal_avx512(%rip), %zmm11
+        vmovups   1024+__svml_dexp_data_internal_avx512(%rip), %zmm13
+
+/* Table lookup: Th = 2^(j/2^k) */
+        vmovups   __svml_dexp_data_internal_avx512(%rip), %zmm14
+
+/* N ~ x*log2(e), round-to-zero to 4 fractional bits */
+        vsubpd    {rn-sae}, %zmm1, %zmm3, %zmm1
+
+/* remove sign of x by "and" operation */
+        vandpd    960+__svml_dexp_data_internal_avx512(%rip), %zmm0, %zmm12
+        vpermt2pd 64+__svml_dexp_data_internal_avx512(%rip), %zmm3, %zmm14
+
+/* R = x - N*ln(2)_high */
+        vfnmadd213pd {rn-sae}, %zmm0, %zmm1, %zmm4
+
+/* compare against threshold */
+        vcmppd    $29, {sae}, %zmm13, %zmm12, %k0
+
+/* R = R - N*ln(2)_high = x - N*ln(2) */
+        vfnmadd231pd {rn-sae}, %zmm1, %zmm2, %zmm4
+
+/* set mask for overflow/underflow */
+        kmovw     %k0, %edx
+
+/* ensure |R|<2 even for special cases */
+        vandpd    512+__svml_dexp_data_internal_avx512(%rip), %zmm4, %zmm7
+
+/* r2 = r*r */
+        vmulpd    {rn-sae}, %zmm7, %zmm7, %zmm8
+
+/* p56 = c6*r+c5 */
+        vfmadd231pd {rn-sae}, %zmm7, %zmm5, %zmm15
+        vfmadd231pd {rn-sae}, %zmm7, %zmm6, %zmm9
+
+/* r3 = r2*r = r^3 */
+        vmulpd    {rn-sae}, %zmm7, %zmm8, %zmm10
+
+/* p12 = c2*r2+r */
+        vfmadd213pd {rn-sae}, %zmm7, %zmm8, %zmm11
+
+/* p36 = (c6*r+c5)*r^2+c4*r+c3 */
+        vfmadd213pd {rn-sae}, %zmm9, %zmm8, %zmm15
+
+/* p16 = ((c6*r+c5)*r^2+c4*r+c3)*r^3+c2*r^2+r = exp(r)-1 */
+        vfmadd213pd {rn-sae}, %zmm11, %zmm10, %zmm15
+
+/* Th*(exp(r)-1)+Th=Th*exp(r) */
+        vfmadd213pd {rn-sae}, %zmm14, %zmm14, %zmm15
+
+/* exp(x) = 2^M*Th*exp(r) */
+        vscalefpd {rn-sae}, %zmm1, %zmm15, %zmm1
+
+
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm1, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm1, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm1
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dexp_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_exp8,@function
+       .size   __svml_exp8,.-__svml_exp8
+..LN__svml_exp8.0:
+
+.L_2__routine_start___svml_dexp_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dexp_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    6(%rdi), %edx
+        andl      $32752, %edx
+        shrl      $4, %edx
+        movsd     (%rdi), %xmm6
+        movsd     %xmm6, -8(%rsp)
+        cmpl      $2047, %edx
+        je        .LBL_2_17
+
+
+        cmpl      $970, %edx
+        jle       .LBL_2_15
+
+
+        movsd     1080+_imldExpHATab(%rip), %xmm0
+        comisd    %xmm6, %xmm0
+        jb        .LBL_2_14
+
+
+        comisd    1096+_imldExpHATab(%rip), %xmm6
+        jb        .LBL_2_13
+
+
+        movsd     1024+_imldExpHATab(%rip), %xmm0
+        movaps    %xmm6, %xmm5
+        mulsd     %xmm6, %xmm0
+        lea       _imldExpHATab(%rip), %r10
+        movsd     %xmm0, -24(%rsp)
+        movsd     -24(%rsp), %xmm1
+        movq      1136+_imldExpHATab(%rip), %rdx
+        movq      %rdx, -8(%rsp)
+        addsd     1032+_imldExpHATab(%rip), %xmm1
+        movsd     %xmm1, -16(%rsp)
+        movsd     -16(%rsp), %xmm2
+        movl      -16(%rsp), %r8d
+        movl      %r8d, %ecx
+        andl      $63, %r8d
+        subsd     1032+_imldExpHATab(%rip), %xmm2
+        movsd     %xmm2, -24(%rsp)
+        lea       1(%r8,%r8), %r9d
+        movsd     -24(%rsp), %xmm3
+        lea       (%r8,%r8), %edi
+        mulsd     1104+_imldExpHATab(%rip), %xmm3
+        movsd     -24(%rsp), %xmm4
+        subsd     %xmm3, %xmm5
+        mulsd     1112+_imldExpHATab(%rip), %xmm4
+        movsd     1072+_imldExpHATab(%rip), %xmm2
+        subsd     %xmm4, %xmm5
+        mulsd     %xmm5, %xmm2
+        shrl      $6, %ecx
+        addsd     1064+_imldExpHATab(%rip), %xmm2
+        comisd    1088+_imldExpHATab(%rip), %xmm6
+        mulsd     %xmm5, %xmm2
+        movsd     (%r10,%rdi,8), %xmm0
+        lea       1023(%rcx), %edx
+        addsd     1056+_imldExpHATab(%rip), %xmm2
+        mulsd     %xmm5, %xmm2
+        addsd     1048+_imldExpHATab(%rip), %xmm2
+        mulsd     %xmm5, %xmm2
+        addsd     1040+_imldExpHATab(%rip), %xmm2
+        mulsd     %xmm5, %xmm2
+        mulsd     %xmm5, %xmm2
+        addsd     %xmm5, %xmm2
+        addsd     (%r10,%r9,8), %xmm2
+        mulsd     %xmm0, %xmm2
+        jb        .LBL_2_9
+
+
+        andl      $2047, %edx
+        addsd     %xmm0, %xmm2
+        cmpl      $2046, %edx
+        ja        .LBL_2_8
+
+
+        movq      1136+_imldExpHATab(%rip), %rcx
+        shrq      $48, %rcx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -2(%rsp)
+        movsd     -8(%rsp), %xmm0
+        mulsd     %xmm0, %xmm2
+        movsd     %xmm2, (%rsi)
+        ret
+
+.LBL_2_8:
+
+        decl      %edx
+        andl      $2047, %edx
+        movzwl    -2(%rsp), %ecx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -2(%rsp)
+        movsd     -8(%rsp), %xmm0
+        mulsd     %xmm0, %xmm2
+        mulsd     1152+_imldExpHATab(%rip), %xmm2
+        movsd     %xmm2, (%rsi)
+        ret
+
+.LBL_2_9:
+
+        addl      $1083, %ecx
+        andl      $2047, %ecx
+        movl      %ecx, %eax
+        movzwl    -2(%rsp), %edx
+        shll      $4, %eax
+        andl      $-32753, %edx
+        orl       %eax, %edx
+        movw      %dx, -2(%rsp)
+        movsd     -8(%rsp), %xmm1
+        mulsd     %xmm1, %xmm2
+        mulsd     %xmm0, %xmm1
+        movaps    %xmm1, %xmm0
+        addsd     %xmm2, %xmm0
+        cmpl      $50, %ecx
+        ja        .LBL_2_11
+
+
+        mulsd     1160+_imldExpHATab(%rip), %xmm0
+        movsd     %xmm0, (%rsi)
+        jmp       .LBL_2_12
+
+.LBL_2_11:
+
+        movsd     %xmm0, -72(%rsp)
+        movsd     -72(%rsp), %xmm0
+        subsd     %xmm0, %xmm1
+        movsd     %xmm1, -64(%rsp)
+        movsd     -64(%rsp), %xmm1
+        addsd     %xmm2, %xmm1
+        movsd     %xmm1, -64(%rsp)
+        movsd     -72(%rsp), %xmm2
+        mulsd     1168+_imldExpHATab(%rip), %xmm2
+        movsd     %xmm2, -56(%rsp)
+        movsd     -72(%rsp), %xmm4
+        movsd     -56(%rsp), %xmm3
+        addsd     %xmm3, %xmm4
+        movsd     %xmm4, -48(%rsp)
+        movsd     -48(%rsp), %xmm6
+        movsd     -56(%rsp), %xmm5
+        subsd     %xmm5, %xmm6
+        movsd     %xmm6, -40(%rsp)
+        movsd     -72(%rsp), %xmm8
+        movsd     -40(%rsp), %xmm7
+        subsd     %xmm7, %xmm8
+        movsd     %xmm8, -32(%rsp)
+        movsd     -64(%rsp), %xmm10
+        movsd     -32(%rsp), %xmm9
+        addsd     %xmm9, %xmm10
+        movsd     %xmm10, -32(%rsp)
+        movsd     -40(%rsp), %xmm11
+        mulsd     1160+_imldExpHATab(%rip), %xmm11
+        movsd     %xmm11, -40(%rsp)
+        movsd     -32(%rsp), %xmm12
+        mulsd     1160+_imldExpHATab(%rip), %xmm12
+        movsd     %xmm12, -32(%rsp)
+        movsd     -40(%rsp), %xmm14
+        movsd     -32(%rsp), %xmm13
+        addsd     %xmm13, %xmm14
+        movsd     %xmm14, (%rsi)
+
+.LBL_2_12:
+
+        movl      $4, %eax
+        ret
+
+.LBL_2_13:
+
+        movsd     1120+_imldExpHATab(%rip), %xmm0
+        movl      $4, %eax
+        mulsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_14:
+
+        movsd     1128+_imldExpHATab(%rip), %xmm0
+        movl      $3, %eax
+        mulsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_15:
+
+        movsd     1144+_imldExpHATab(%rip), %xmm0
+        addsd     %xmm6, %xmm0
+        movsd     %xmm0, (%rsi)
+
+
+        ret
+
+.LBL_2_17:
+
+        movb      -1(%rsp), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_19
+
+.LBL_2_18:
+
+        mulsd     %xmm6, %xmm6
+        movsd     %xmm6, (%rsi)
+        ret
+
+.LBL_2_19:
+
+        testl     $1048575, -4(%rsp)
+        jne       .LBL_2_18
+
+
+        cmpl      $0, -8(%rsp)
+        jne       .LBL_2_18
+
+
+        movq      1136+_imldExpHATab(%rip), %rdx
+        movq      %rdx, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dexp_cout_rare_internal,@function
+       .size   __svml_dexp_cout_rare_internal,.-__svml_dexp_cout_rare_internal
+..LN__svml_dexp_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dexp_data_internal_avx512:
+       .long   0
+       .long   1072693248
+       .long   1828292879
+       .long   1072739672
+       .long   1014845819
+       .long   1072788152
+       .long   1853186616
+       .long   1072838778
+       .long   171030293
+       .long   1072891646
+       .long   1276261410
+       .long   1072946854
+       .long   3577096743
+       .long   1073004506
+       .long   3712504873
+       .long   1073064711
+       .long   1719614413
+       .long   1073127582
+       .long   1944781191
+       .long   1073193236
+       .long   1110089947
+       .long   1073261797
+       .long   2191782032
+       .long   1073333393
+       .long   2572866477
+       .long   1073408159
+       .long   3716502172
+       .long   1073486235
+       .long   3707479175
+       .long   1073567768
+       .long   2728693978
+       .long   1073652911
+       .long   0
+       .long   0
+       .long   1568897901
+       .long   1016568486
+       .long   3936719688
+       .long   3162512149
+       .long   3819481236
+       .long   1016499965
+       .long   1303423926
+       .long   1015238005
+       .long   2804567149
+       .long   1015390024
+       .long   3145379760
+       .long   1014403278
+       .long   3793507337
+       .long   1016095713
+       .long   3210617384
+       .long   3163796463
+       .long   3108873501
+       .long   3162190556
+       .long   3253791412
+       .long   1015920431
+       .long   730975783
+       .long   1014083580
+       .long   2462790535
+       .long   1015814775
+       .long   816778419
+       .long   1014197934
+       .long   2789017511
+       .long   1014276997
+       .long   2413007344
+       .long   3163551506
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4010615101
+       .long   1062678197
+       .long   4010615101
+       .long   1062678197
+       .long   4010615101
+       .long   1062678197
+       .long   4010615101
+       .long   1062678197
+       .long   4010615101
+       .long   1062678197
+       .long   4010615101
+       .long   1062678197
+       .long   4010615101
+       .long   1062678197
+       .long   4010615101
+       .long   1062678197
+       .long   64584704
+       .long   1065422950
+       .long   64584704
+       .long   1065422950
+       .long   64584704
+       .long   1065422950
+       .long   64584704
+       .long   1065422950
+       .long   64584704
+       .long   1065422950
+       .long   64584704
+       .long   1065422950
+       .long   64584704
+       .long   1065422950
+       .long   64584704
+       .long   1065422950
+       .long   1270150640
+       .long   1067799894
+       .long   1270150640
+       .long   1067799894
+       .long   1270150640
+       .long   1067799894
+       .long   1270150640
+       .long   1067799894
+       .long   1270150640
+       .long   1067799894
+       .long   1270150640
+       .long   1067799894
+       .long   1270150640
+       .long   1067799894
+       .long   1270150640
+       .long   1067799894
+       .long   1421150370
+       .long   1069897045
+       .long   1421150370
+       .long   1069897045
+       .long   1421150370
+       .long   1069897045
+       .long   1421150370
+       .long   1069897045
+       .long   1421150370
+       .long   1069897045
+       .long   1421150370
+       .long   1069897045
+       .long   1421150370
+       .long   1069897045
+       .long   1421150370
+       .long   1069897045
+       .long   9762
+       .long   1071644672
+       .long   9762
+       .long   1071644672
+       .long   9762
+       .long   1071644672
+       .long   9762
+       .long   1071644672
+       .long   9762
+       .long   1071644672
+       .long   9762
+       .long   1071644672
+       .long   9762
+       .long   1071644672
+       .long   9762
+       .long   1071644672
+       .long   4294967152
+       .long   1072693247
+       .long   4294967152
+       .long   1072693247
+       .long   4294967152
+       .long   1072693247
+       .long   4294967152
+       .long   1072693247
+       .long   4294967152
+       .long   1072693247
+       .long   4294967152
+       .long   1072693247
+       .long   4294967152
+       .long   1072693247
+       .long   4294967152
+       .long   1072693247
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   0
+       .long   1005584384
+       .long   0
+       .long   1005584384
+       .long   0
+       .long   1005584384
+       .long   0
+       .long   1005584384
+       .long   0
+       .long   1005584384
+       .long   0
+       .long   1005584384
+       .long   0
+       .long   1005584384
+       .long   0
+       .long   1005584384
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   32752
+       .long   0
+       .long   32752
+       .long   0
+       .long   32752
+       .long   0
+       .long   32752
+       .long   0
+       .long   32752
+       .long   0
+       .long   32752
+       .long   0
+       .long   32752
+       .long   0
+       .long   32752
+       .long   0
+       .type   __svml_dexp_data_internal_avx512,@object
+       .size   __svml_dexp_data_internal_avx512,1280
+       .align 32
+_imldExpHATab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   1048019041
+       .long   1072704666
+       .long   2631457885
+       .long   3161546771
+       .long   3541402996
+       .long   1072716208
+       .long   896005651
+       .long   1015861842
+       .long   410360776
+       .long   1072727877
+       .long   1642514529
+       .long   1012987726
+       .long   1828292879
+       .long   1072739672
+       .long   1568897901
+       .long   1016568486
+       .long   852742562
+       .long   1072751596
+       .long   1882168529
+       .long   1010744893
+       .long   3490863953
+       .long   1072763649
+       .long   707771662
+       .long   3163903570
+       .long   2930322912
+       .long   1072775834
+       .long   3117806614
+       .long   3163670819
+       .long   1014845819
+       .long   1072788152
+       .long   3936719688
+       .long   3162512149
+       .long   3949972341
+       .long   1072800603
+       .long   1058231231
+       .long   1015777676
+       .long   828946858
+       .long   1072813191
+       .long   1044000608
+       .long   1016786167
+       .long   2288159958
+       .long   1072825915
+       .long   1151779725
+       .long   1015705409
+       .long   1853186616
+       .long   1072838778
+       .long   3819481236
+       .long   1016499965
+       .long   1709341917
+       .long   1072851781
+       .long   2552227826
+       .long   1015039787
+       .long   4112506593
+       .long   1072864925
+       .long   1829350193
+       .long   1015216097
+       .long   2799960843
+       .long   1072878213
+       .long   1913391796
+       .long   1015756674
+       .long   171030293
+       .long   1072891646
+       .long   1303423926
+       .long   1015238005
+       .long   2992903935
+       .long   1072905224
+       .long   1574172746
+       .long   1016061241
+       .long   926591435
+       .long   1072918951
+       .long   3427487848
+       .long   3163704045
+       .long   887463927
+       .long   1072932827
+       .long   1049900754
+       .long   3161575912
+       .long   1276261410
+       .long   1072946854
+       .long   2804567149
+       .long   1015390024
+       .long   569847338
+       .long   1072961034
+       .long   1209502043
+       .long   3159926671
+       .long   1617004845
+       .long   1072975368
+       .long   1623370769
+       .long   1011049453
+       .long   3049340112
+       .long   1072989858
+       .long   3667985273
+       .long   1013894369
+       .long   3577096743
+       .long   1073004506
+       .long   3145379760
+       .long   1014403278
+       .long   1990012071
+       .long   1073019314
+       .long   7447438
+       .long   3163526196
+       .long   1453150082
+       .long   1073034283
+       .long   3171891295
+       .long   3162037958
+       .long   917841882
+       .long   1073049415
+       .long   419288974
+       .long   1016280325
+       .long   3712504873
+       .long   1073064711
+       .long   3793507337
+       .long   1016095713
+       .long   363667784
+       .long   1073080175
+       .long   728023093
+       .long   1016345318
+       .long   2956612997
+       .long   1073095806
+       .long   1005538728
+       .long   3163304901
+       .long   2186617381
+       .long   1073111608
+       .long   2018924632
+       .long   3163803357
+       .long   1719614413
+       .long   1073127582
+       .long   3210617384
+       .long   3163796463
+       .long   1013258799
+       .long   1073143730
+       .long   3094194670
+       .long   3160631279
+       .long   3907805044
+       .long   1073160053
+       .long   2119843535
+       .long   3161988964
+       .long   1447192521
+       .long   1073176555
+       .long   508946058
+       .long   3162904882
+       .long   1944781191
+       .long   1073193236
+       .long   3108873501
+       .long   3162190556
+       .long   919555682
+       .long   1073210099
+       .long   2882956373
+       .long   1013312481
+       .long   2571947539
+       .long   1073227145
+       .long   4047189812
+       .long   3163777462
+       .long   2604962541
+       .long   1073244377
+       .long   3631372142
+       .long   3163870288
+       .long   1110089947
+       .long   1073261797
+       .long   3253791412
+       .long   1015920431
+       .long   2568320822
+       .long   1073279406
+       .long   1509121860
+       .long   1014756995
+       .long   2966275557
+       .long   1073297207
+       .long   2339118633
+       .long   3160254904
+       .long   2682146384
+       .long   1073315202
+       .long   586480042
+       .long   3163702083
+       .long   2191782032
+       .long   1073333393
+       .long   730975783
+       .long   1014083580
+       .long   2069751141
+       .long   1073351782
+       .long   576856675
+       .long   3163014404
+       .long   2990417245
+       .long   1073370371
+       .long   3552361237
+       .long   3163667409
+       .long   1434058175
+       .long   1073389163
+       .long   1853053619
+       .long   1015310724
+       .long   2572866477
+       .long   1073408159
+       .long   2462790535
+       .long   1015814775
+       .long   3092190715
+       .long   1073427362
+       .long   1457303226
+       .long   3159737305
+       .long   4076559943
+       .long   1073446774
+       .long   950899508
+       .long   3160987380
+       .long   2420883922
+       .long   1073466398
+       .long   174054861
+       .long   1014300631
+       .long   3716502172
+       .long   1073486235
+       .long   816778419
+       .long   1014197934
+       .long   777507147
+       .long   1073506289
+       .long   3507050924
+       .long   1015341199
+       .long   3706687593
+       .long   1073526560
+       .long   1821514088
+       .long   1013410604
+       .long   1242007932
+       .long   1073547053
+       .long   1073740399
+       .long   3163532637
+       .long   3707479175
+       .long   1073567768
+       .long   2789017511
+       .long   1014276997
+       .long   64696965
+       .long   1073588710
+       .long   3586233004
+       .long   1015962192
+       .long   863738719
+       .long   1073609879
+       .long   129252895
+       .long   3162690849
+       .long   3884662774
+       .long   1073631278
+       .long   1614448851
+       .long   1014281732
+       .long   2728693978
+       .long   1073652911
+       .long   2413007344
+       .long   3163551506
+       .long   3999357479
+       .long   1073674779
+       .long   1101668360
+       .long   1015989180
+       .long   1533953344
+       .long   1073696886
+       .long   835814894
+       .long   1015702697
+       .long   2174652632
+       .long   1073719233
+       .long   1301400989
+       .long   1014466875
+       .long   1697350398
+       .long   1079448903
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1071644672
+       .long   1431652600
+       .long   1069897045
+       .long   1431670732
+       .long   1067799893
+       .long   984555731
+       .long   1065423122
+       .long   472530941
+       .long   1062650218
+       .long   4277811695
+       .long   1082535490
+       .long   3715808466
+       .long   3230016299
+       .long   3576508497
+       .long   3230091536
+       .long   4277796864
+       .long   1065758274
+       .long   3164486458
+       .long   1025308570
+       .long   1
+       .long   1048576
+       .long   4294967295
+       .long   2146435071
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1009778688
+       .long   0
+       .long   1106771968
+       .type   _imldExpHATab,@object
+       .size   _imldExpHATab,1176
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_exp_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_exp_s_la.s
new file mode 100644 (file)
index 0000000..7bb40a3
--- /dev/null
@@ -0,0 +1,774 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *   Argument representation:
+ *   M = rint(X*2^k/ln2) = 2^k*N+j
+ *   X = M*ln2/2^k + r = N*ln2 + ln2*(j/2^k) + r
+ *   then -ln2/2^(k+1) < r < ln2/2^(k+1)
+ *   Alternatively:
+ *   M = trunc(X*2^k/ln2)
+ *   then 0 < r < ln2/2^k
+ * 
+ *   Result calculation:
+ *   exp(X) = exp(N*ln2 + ln2*(j/2^k) + r)
+ *   = 2^N * 2^(j/2^k) * exp(r)
+ *   2^N is calculated by bit manipulation
+ *   2^(j/2^k) is computed from table lookup
+ *   exp(r) is approximated by polynomial
+ * 
+ *   The table lookup is skipped if k = 0.
+ *   For low accuracy approximation, exp(r) ~ 1 or 1+r.
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_expf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_expf16
+
+__svml_expf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   256+__svml_sexp_data_internal_avx512(%rip), %zmm2
+        vmovups   320+__svml_sexp_data_internal_avx512(%rip), %zmm1
+
+/* x!=0? */
+        vmovups   896+__svml_sexp_data_internal_avx512(%rip), %zmm7
+        vmovups   384+__svml_sexp_data_internal_avx512(%rip), %zmm5
+
+/* Table lookup: Tl, Tl = 2^(j/2^10), j = 0,...,2^5-1 */
+        vmovups   __svml_sexp_data_internal_avx512(%rip), %zmm8
+
+/* Table lookup: Th, Th = 2^(j/2^5), j = 0,...,2^5-1 */
+        vmovups   128+__svml_sexp_data_internal_avx512(%rip), %zmm12
+
+/* 2^(52-4)*1.5 + x * log2(e) in round-to-zero mode */
+        vfmadd213ps {rz-sae}, %zmm1, %zmm0, %zmm2
+        vmovups   448+__svml_sexp_data_internal_avx512(%rip), %zmm4
+        vmovups   640+__svml_sexp_data_internal_avx512(%rip), %zmm10
+
+/* ensure |R|<2 even for special cases */
+        vmovups   512+__svml_sexp_data_internal_avx512(%rip), %zmm6
+        vcmpps    $4, {sae}, %zmm7, %zmm0, %k1
+
+/* Adjust index by right shift for 5 bits */
+        vpsrld    $5, %zmm2, %zmm3
+
+/* N ~ x*log2(e), round-to-zero to 10 fractional bits */
+        vsubps    {rn-sae}, %zmm1, %zmm2, %zmm13
+        vpermt2ps 64+__svml_sexp_data_internal_avx512(%rip), %zmm2, %zmm8
+        vpermt2ps 192+__svml_sexp_data_internal_avx512(%rip), %zmm3, %zmm12
+
+/* remove sign of x by "and" operation */
+        vandps    576+__svml_sexp_data_internal_avx512(%rip), %zmm0, %zmm9
+
+/* R = x - N*ln(2)_high */
+        vfnmadd213ps {rn-sae}, %zmm0, %zmm13, %zmm5
+
+/* Th*Tl ~ 2^(j/2^k) */
+        vmulps    {rn-sae}, %zmm8, %zmm12, %zmm12{%k1}
+
+/* compare against threshold */
+        vcmpps    $29, {sae}, %zmm10, %zmm9, %k0
+
+/* R = R - N*ln(2)_low = x - N*ln(2) */
+        vfnmadd231ps {rn-sae}, %zmm13, %zmm4, %zmm5
+
+/* set mask for overflow/underflow */
+        kmovw     %k0, %edx
+        vrangeps  $2, {sae}, %zmm6, %zmm5, %zmm11
+
+/* 2^(j/2^k)*(r+1) */
+        vfmadd213ps {rn-sae}, %zmm12, %zmm11, %zmm12
+
+/* exp(x) = 2^N*2^(j/2^k)*(r+1) */
+        vscalefps {rn-sae}, %zmm13, %zmm12, %zmm1
+
+/*
+ * Check general callout condition
+ * Check VML specific mode related condition,
+ * no check in case of other libraries
+ * Above HA/LA/EP sequences produce
+ * correct results even without going to callout.
+ * Callout was only needed to raise flags
+ * and set errno. If caller doesn't need that
+ * then it is safe to proceed without callout
+ */
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm1, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm1, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm1
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_sexp_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_expf16,@function
+       .size   __svml_expf16,.-__svml_expf16
+..LN__svml_expf16.0:
+
+.L_2__routine_start___svml_sexp_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_sexp_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    2(%rdi), %edx
+        andl      $32640, %edx
+        cmpl      $32640, %edx
+        je        .LBL_2_12
+
+
+        movss     (%rdi), %xmm9
+        movss     .L_2il0floatpacket.52(%rip), %xmm0
+        movl      %eax, -12(%rsp)
+        comiss    %xmm9, %xmm0
+        jb        .LBL_2_10
+
+
+        comiss    .L_2il0floatpacket.53(%rip), %xmm9
+        jb        .LBL_2_9
+
+
+        movss     .L_2il0floatpacket.55(%rip), %xmm0
+        movaps    %xmm9, %xmm6
+        mulss     %xmm9, %xmm0
+        comiss    .L_2il0floatpacket.64(%rip), %xmm9
+        movss     %xmm0, -24(%rsp)
+        movss     -24(%rsp), %xmm1
+        movss     .L_2il0floatpacket.56(%rip), %xmm2
+        movss     .L_2il0floatpacket.63(%rip), %xmm7
+        addss     %xmm2, %xmm1
+        movss     %xmm1, -20(%rsp)
+        movss     -20(%rsp), %xmm3
+        movss     .L_2il0floatpacket.59(%rip), %xmm8
+        subss     %xmm2, %xmm3
+        movss     %xmm3, -24(%rsp)
+        movss     -24(%rsp), %xmm4
+        mulss     .L_2il0floatpacket.57(%rip), %xmm4
+        movss     -24(%rsp), %xmm5
+        subss     %xmm4, %xmm6
+        mulss     .L_2il0floatpacket.58(%rip), %xmm5
+        movswl    -20(%rsp), %ecx
+        subss     %xmm5, %xmm6
+        mulss     %xmm6, %xmm7
+        addss     .L_2il0floatpacket.62(%rip), %xmm7
+        mulss     %xmm6, %xmm7
+        addss     .L_2il0floatpacket.61(%rip), %xmm7
+        mulss     %xmm6, %xmm7
+        addss     .L_2il0floatpacket.60(%rip), %xmm7
+        mulss     %xmm6, %xmm7
+        addss     %xmm8, %xmm7
+        mulss     %xmm6, %xmm7
+        addss     %xmm7, %xmm8
+        movss     %xmm8, -16(%rsp)
+        jb        .LBL_2_8
+
+
+        lea       127(%rcx), %edx
+        cmpl      $254, %edx
+        ja        .LBL_2_7
+
+
+        movzbl    %dl, %edx
+        shll      $7, %edx
+        movw      %dx, -10(%rsp)
+        movss     -16(%rsp), %xmm0
+        mulss     -12(%rsp), %xmm0
+        movss     %xmm0, -16(%rsp)
+        movl      -16(%rsp), %ecx
+        movl      %ecx, (%rsi)
+        ret
+
+.LBL_2_7:
+
+        addl      $126, %ecx
+        movzbl    %cl, %ecx
+        movzwl    -10(%rsp), %edx
+        shll      $7, %ecx
+        andl      $-32641, %edx
+        orl       %ecx, %edx
+        movss     -16(%rsp), %xmm0
+        movw      %dx, -10(%rsp)
+        mulss     -12(%rsp), %xmm0
+        movss     %xmm0, -16(%rsp)
+        movss     -16(%rsp), %xmm1
+        mulss     .L_2il0floatpacket.67(%rip), %xmm1
+        movss     %xmm1, -16(%rsp)
+        movl      -16(%rsp), %edi
+        movl      %edi, (%rsi)
+        ret
+
+.LBL_2_8:
+
+        addl      $-69, %ecx
+        movzbl    %cl, %ecx
+        movzwl    -10(%rsp), %eax
+        shll      $7, %ecx
+        andl      $-32641, %eax
+        orl       %ecx, %eax
+        movss     -16(%rsp), %xmm0
+        movw      %ax, -10(%rsp)
+        movl      $4, %eax
+        mulss     -12(%rsp), %xmm0
+        movss     %xmm0, -16(%rsp)
+        movss     -16(%rsp), %xmm1
+        mulss     .L_2il0floatpacket.66(%rip), %xmm1
+        movss     %xmm1, -16(%rsp)
+        movl      -16(%rsp), %edx
+        movl      %edx, (%rsi)
+        ret
+
+.LBL_2_9:
+
+        movss     .L_2il0floatpacket.65(%rip), %xmm0
+        mulss     %xmm0, %xmm0
+        movss     %xmm0, -16(%rsp)
+        movl      -16(%rsp), %eax
+        movl      %eax, (%rsi)
+        movl      $4, %eax
+        ret
+
+.LBL_2_10:
+
+        movss     .L_2il0floatpacket.54(%rip), %xmm0
+        mulss     %xmm0, %xmm0
+        movss     %xmm0, -16(%rsp)
+        movl      -16(%rsp), %eax
+        movl      %eax, (%rsi)
+        movl      $3, %eax
+
+
+        ret
+
+.LBL_2_12:
+
+        movb      3(%rdi), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_14
+
+.LBL_2_13:
+
+        movss     (%rdi), %xmm0
+        mulss     %xmm0, %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_14:
+
+        testl     $8388607, (%rdi)
+        jne       .LBL_2_13
+
+
+        movl      %eax, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_sexp_cout_rare_internal,@function
+       .size   __svml_sexp_cout_rare_internal,.-__svml_sexp_cout_rare_internal
+..LN__svml_sexp_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_sexp_data_internal_avx512:
+       .long   1065353217
+       .long   1065358897
+       .long   1065364581
+       .long   1065370269
+       .long   1065375961
+       .long   1065381656
+       .long   1065387356
+       .long   1065393059
+       .long   1065398766
+       .long   1065404477
+       .long   1065410192
+       .long   1065415911
+       .long   1065421634
+       .long   1065427360
+       .long   1065433091
+       .long   1065438825
+       .long   1065444563
+       .long   1065450305
+       .long   1065456051
+       .long   1065461801
+       .long   1065467554
+       .long   1065473312
+       .long   1065479074
+       .long   1065484839
+       .long   1065490608
+       .long   1065496381
+       .long   1065502159
+       .long   1065507940
+       .long   1065513725
+       .long   1065519513
+       .long   1065525306
+       .long   1065531103
+       .long   1065353216
+       .long   1065536903
+       .long   1065724611
+       .long   1065916431
+       .long   1066112450
+       .long   1066312762
+       .long   1066517459
+       .long   1066726640
+       .long   1066940400
+       .long   1067158842
+       .long   1067382066
+       .long   1067610179
+       .long   1067843287
+       .long   1068081499
+       .long   1068324927
+       .long   1068573686
+       .long   1068827891
+       .long   1069087663
+       .long   1069353124
+       .long   1069624397
+       .long   1069901610
+       .long   1070184894
+       .long   1070474380
+       .long   1070770206
+       .long   1071072509
+       .long   1071381432
+       .long   1071697119
+       .long   1072019719
+       .long   1072349383
+       .long   1072686266
+       .long   1073030525
+       .long   1073382323
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1178599424
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   796917760
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   3968
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   849703008
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .type   __svml_sexp_data_internal_avx512,@object
+       .size   __svml_sexp_data_internal_avx512,1216
+       .align 4
+.L_2il0floatpacket.52:
+       .long   0x42b17217
+       .type   .L_2il0floatpacket.52,@object
+       .size   .L_2il0floatpacket.52,4
+       .align 4
+.L_2il0floatpacket.53:
+       .long   0xc2cff1b4
+       .type   .L_2il0floatpacket.53,@object
+       .size   .L_2il0floatpacket.53,4
+       .align 4
+.L_2il0floatpacket.54:
+       .long   0x7f7fffff
+       .type   .L_2il0floatpacket.54,@object
+       .size   .L_2il0floatpacket.54,4
+       .align 4
+.L_2il0floatpacket.55:
+       .long   0x3fb8aa3b
+       .type   .L_2il0floatpacket.55,@object
+       .size   .L_2il0floatpacket.55,4
+       .align 4
+.L_2il0floatpacket.56:
+       .long   0x4b400000
+       .type   .L_2il0floatpacket.56,@object
+       .size   .L_2il0floatpacket.56,4
+       .align 4
+.L_2il0floatpacket.57:
+       .long   0x3f317200
+       .type   .L_2il0floatpacket.57,@object
+       .size   .L_2il0floatpacket.57,4
+       .align 4
+.L_2il0floatpacket.58:
+       .long   0x35bfbe8e
+       .type   .L_2il0floatpacket.58,@object
+       .size   .L_2il0floatpacket.58,4
+       .align 4
+.L_2il0floatpacket.59:
+       .long   0x3f800001
+       .type   .L_2il0floatpacket.59,@object
+       .size   .L_2il0floatpacket.59,4
+       .align 4
+.L_2il0floatpacket.60:
+       .long   0x3efffe85
+       .type   .L_2il0floatpacket.60,@object
+       .size   .L_2il0floatpacket.60,4
+       .align 4
+.L_2il0floatpacket.61:
+       .long   0x3e2aa9c6
+       .type   .L_2il0floatpacket.61,@object
+       .size   .L_2il0floatpacket.61,4
+       .align 4
+.L_2il0floatpacket.62:
+       .long   0x3d2bb1b6
+       .type   .L_2il0floatpacket.62,@object
+       .size   .L_2il0floatpacket.62,4
+       .align 4
+.L_2il0floatpacket.63:
+       .long   0x3c0950ef
+       .type   .L_2il0floatpacket.63,@object
+       .size   .L_2il0floatpacket.63,4
+       .align 4
+.L_2il0floatpacket.64:
+       .long   0xc2aeac4f
+       .type   .L_2il0floatpacket.64,@object
+       .size   .L_2il0floatpacket.64,4
+       .align 4
+.L_2il0floatpacket.65:
+       .long   0x00000001
+       .type   .L_2il0floatpacket.65,@object
+       .size   .L_2il0floatpacket.65,4
+       .align 4
+.L_2il0floatpacket.66:
+       .long   0x21800000
+       .type   .L_2il0floatpacket.66,@object
+       .size   .L_2il0floatpacket.66,4
+       .align 4
+.L_2il0floatpacket.67:
+       .long   0x40000000
+       .type   .L_2il0floatpacket.67,@object
+       .size   .L_2il0floatpacket.67,4
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_expm1_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_expm1_d_la.s
new file mode 100644 (file)
index 0000000..0e52bb6
--- /dev/null
@@ -0,0 +1,1091 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *  After computing exp(x) in high-low parts, an accurate computation is performed to obtain exp(x)-1
+ *  *  Typical exp() implementation, except that:
+ *  *   - tables are small (16 elements), allowing for fast gathers
+ *  *   - all arguments processed in the main path
+ *  *       - final VSCALEF assists branch-free design (correct overflow/underflow and special case responses)
+ *  *       - a VAND is used to ensure the reduced argument |R|<2, even for large inputs
+ *  *       - RZ mode used to avoid oveflow to +/-Inf for x*log2(e); helps with special case handling
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_expm18_z0_0:
+
+       .align    16,0x90
+       .globl __svml_expm18
+
+__svml_expm18:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   256+__svml_dexpm1_data_internal_avx512(%rip), %zmm6
+        vmovups   320+__svml_dexpm1_data_internal_avx512(%rip), %zmm4
+        vmovups   512+__svml_dexpm1_data_internal_avx512(%rip), %zmm11
+        vmovups   576+__svml_dexpm1_data_internal_avx512(%rip), %zmm5
+        vmovups   384+__svml_dexpm1_data_internal_avx512(%rip), %zmm3
+        vmovups   960+__svml_dexpm1_data_internal_avx512(%rip), %zmm13
+        vmovups   1024+__svml_dexpm1_data_internal_avx512(%rip), %zmm15
+
+/* polynomial */
+        vmovups   832+__svml_dexpm1_data_internal_avx512(%rip), %zmm12
+
+/* set Z0=max(Z0, -128.0) */
+        vmovups   640+__svml_dexpm1_data_internal_avx512(%rip), %zmm8
+        vmovups   1088+__svml_dexpm1_data_internal_avx512(%rip), %zmm14
+        vmovups   __svml_dexpm1_data_internal_avx512(%rip), %zmm9
+        vmovaps   %zmm0, %zmm2
+
+/* 2^(52-4)*1.5 + x * log2(e) */
+        vfmadd213pd {rn-sae}, %zmm4, %zmm2, %zmm6
+        vmovups   128+__svml_dexpm1_data_internal_avx512(%rip), %zmm0
+        vcmppd    $21, {sae}, %zmm3, %zmm2, %k0
+
+/* Z0 ~ x*log2(e), rounded to 4 fractional bits */
+        vsubpd    {rn-sae}, %zmm4, %zmm6, %zmm7
+        vpermt2pd 64+__svml_dexpm1_data_internal_avx512(%rip), %zmm6, %zmm9
+        vpermt2pd 192+__svml_dexpm1_data_internal_avx512(%rip), %zmm6, %zmm0
+        vandpd    448+__svml_dexpm1_data_internal_avx512(%rip), %zmm2, %zmm1
+
+/* R = x - Z0*log(2) */
+        vfnmadd213pd {rn-sae}, %zmm2, %zmm7, %zmm11
+        vmaxpd    {sae}, %zmm8, %zmm7, %zmm10
+        vfnmadd231pd {rn-sae}, %zmm7, %zmm5, %zmm11
+        kmovw     %k0, %edx
+
+/* ensure |R|<2 even for special cases */
+        vandpd    704+__svml_dexpm1_data_internal_avx512(%rip), %zmm11, %zmm3
+        vmovups   896+__svml_dexpm1_data_internal_avx512(%rip), %zmm11
+
+/* scale Th */
+        vscalefpd {rn-sae}, %zmm10, %zmm9, %zmm4
+        vfmadd231pd {rn-sae}, %zmm3, %zmm13, %zmm15
+        vfmadd231pd {rn-sae}, %zmm3, %zmm12, %zmm11
+        vmovups   1152+__svml_dexpm1_data_internal_avx512(%rip), %zmm12
+        vmulpd    {rn-sae}, %zmm3, %zmm3, %zmm13
+        vfmadd231pd {rn-sae}, %zmm3, %zmm14, %zmm12
+        vfmadd213pd {rn-sae}, %zmm15, %zmm13, %zmm11
+        vfmadd213pd {rn-sae}, %zmm12, %zmm13, %zmm11
+
+/* Tlr + R+ R*Poly */
+        vfmadd213pd {rn-sae}, %zmm0, %zmm13, %zmm11
+
+/* Th - 1 */
+        vmovups   1216+__svml_dexpm1_data_internal_avx512(%rip), %zmm0
+        vaddpd    {rn-sae}, %zmm3, %zmm11, %zmm14
+        vsubpd    {rn-sae}, %zmm0, %zmm4, %zmm15
+
+/* (Th-1)+Th*(Tlr + R+ R*Poly) */
+        vfmadd213pd {rn-sae}, %zmm15, %zmm14, %zmm4
+        vorpd     %zmm1, %zmm4, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm2, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dexpm1_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_expm18,@function
+       .size   __svml_expm18,.-__svml_expm18
+..LN__svml_expm18.0:
+
+.L_2__routine_start___svml_dexpm1_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dexpm1_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movsd     (%rdi), %xmm6
+        pxor      %xmm0, %xmm0
+        movzwl    6(%rdi), %edx
+        comisd    %xmm6, %xmm0
+        ja        .LBL_2_18
+
+
+        andl      $32752, %edx
+        shrl      $4, %edx
+        movsd     %xmm6, -8(%rsp)
+        cmpl      $2047, %edx
+        je        .LBL_2_19
+
+
+        cmpl      $970, %edx
+        jle       .LBL_2_16
+
+
+        movsd     1080+_imldExpHATab(%rip), %xmm0
+        comisd    %xmm6, %xmm0
+        jb        .LBL_2_15
+
+
+        comisd    1096+_imldExpHATab(%rip), %xmm6
+        jb        .LBL_2_14
+
+
+        movsd     1024+_imldExpHATab(%rip), %xmm0
+        movaps    %xmm6, %xmm5
+        mulsd     %xmm6, %xmm0
+        lea       _imldExpHATab(%rip), %r10
+        movsd     %xmm0, -24(%rsp)
+        movsd     -24(%rsp), %xmm1
+        movq      1136+_imldExpHATab(%rip), %rdx
+        movq      %rdx, -8(%rsp)
+        addsd     1032+_imldExpHATab(%rip), %xmm1
+        movsd     %xmm1, -16(%rsp)
+        movsd     -16(%rsp), %xmm2
+        movl      -16(%rsp), %r8d
+        movl      %r8d, %ecx
+        andl      $63, %r8d
+        subsd     1032+_imldExpHATab(%rip), %xmm2
+        movsd     %xmm2, -24(%rsp)
+        lea       1(%r8,%r8), %r9d
+        movsd     -24(%rsp), %xmm3
+        lea       (%r8,%r8), %edi
+        mulsd     1104+_imldExpHATab(%rip), %xmm3
+        movsd     -24(%rsp), %xmm4
+        subsd     %xmm3, %xmm5
+        mulsd     1112+_imldExpHATab(%rip), %xmm4
+        movsd     1072+_imldExpHATab(%rip), %xmm2
+        subsd     %xmm4, %xmm5
+        mulsd     %xmm5, %xmm2
+        shrl      $6, %ecx
+        addsd     1064+_imldExpHATab(%rip), %xmm2
+        comisd    1088+_imldExpHATab(%rip), %xmm6
+        mulsd     %xmm5, %xmm2
+        movsd     (%r10,%rdi,8), %xmm0
+        lea       1023(%rcx), %edx
+        addsd     1056+_imldExpHATab(%rip), %xmm2
+        mulsd     %xmm5, %xmm2
+        addsd     1048+_imldExpHATab(%rip), %xmm2
+        mulsd     %xmm5, %xmm2
+        addsd     1040+_imldExpHATab(%rip), %xmm2
+        mulsd     %xmm5, %xmm2
+        mulsd     %xmm5, %xmm2
+        addsd     %xmm5, %xmm2
+        addsd     (%r10,%r9,8), %xmm2
+        mulsd     %xmm0, %xmm2
+        jb        .LBL_2_10
+
+
+        andl      $2047, %edx
+        addsd     %xmm0, %xmm2
+        cmpl      $2046, %edx
+        ja        .LBL_2_9
+
+
+        movq      1136+_imldExpHATab(%rip), %rcx
+        shrq      $48, %rcx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -2(%rsp)
+        movsd     -8(%rsp), %xmm0
+        mulsd     %xmm0, %xmm2
+        movsd     %xmm2, (%rsi)
+        ret
+
+.LBL_2_9:
+
+        decl      %edx
+        andl      $2047, %edx
+        movzwl    -2(%rsp), %ecx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -2(%rsp)
+        movsd     -8(%rsp), %xmm0
+        mulsd     %xmm0, %xmm2
+        mulsd     1152+_imldExpHATab(%rip), %xmm2
+        movsd     %xmm2, (%rsi)
+        ret
+
+.LBL_2_10:
+
+        addl      $1083, %ecx
+        andl      $2047, %ecx
+        movl      %ecx, %eax
+        movzwl    -2(%rsp), %edx
+        shll      $4, %eax
+        andl      $-32753, %edx
+        orl       %eax, %edx
+        movw      %dx, -2(%rsp)
+        movsd     -8(%rsp), %xmm1
+        mulsd     %xmm1, %xmm2
+        mulsd     %xmm0, %xmm1
+        movaps    %xmm1, %xmm0
+        addsd     %xmm2, %xmm0
+        cmpl      $50, %ecx
+        ja        .LBL_2_12
+
+
+        mulsd     1160+_imldExpHATab(%rip), %xmm0
+        movsd     %xmm0, (%rsi)
+        jmp       .LBL_2_13
+
+.LBL_2_12:
+
+        movsd     %xmm0, -72(%rsp)
+        movsd     -72(%rsp), %xmm0
+        subsd     %xmm0, %xmm1
+        movsd     %xmm1, -64(%rsp)
+        movsd     -64(%rsp), %xmm1
+        addsd     %xmm2, %xmm1
+        movsd     %xmm1, -64(%rsp)
+        movsd     -72(%rsp), %xmm2
+        mulsd     1168+_imldExpHATab(%rip), %xmm2
+        movsd     %xmm2, -56(%rsp)
+        movsd     -72(%rsp), %xmm4
+        movsd     -56(%rsp), %xmm3
+        addsd     %xmm3, %xmm4
+        movsd     %xmm4, -48(%rsp)
+        movsd     -48(%rsp), %xmm6
+        movsd     -56(%rsp), %xmm5
+        subsd     %xmm5, %xmm6
+        movsd     %xmm6, -40(%rsp)
+        movsd     -72(%rsp), %xmm8
+        movsd     -40(%rsp), %xmm7
+        subsd     %xmm7, %xmm8
+        movsd     %xmm8, -32(%rsp)
+        movsd     -64(%rsp), %xmm10
+        movsd     -32(%rsp), %xmm9
+        addsd     %xmm9, %xmm10
+        movsd     %xmm10, -32(%rsp)
+        movsd     -40(%rsp), %xmm11
+        mulsd     1160+_imldExpHATab(%rip), %xmm11
+        movsd     %xmm11, -40(%rsp)
+        movsd     -32(%rsp), %xmm12
+        mulsd     1160+_imldExpHATab(%rip), %xmm12
+        movsd     %xmm12, -32(%rsp)
+        movsd     -40(%rsp), %xmm14
+        movsd     -32(%rsp), %xmm13
+        addsd     %xmm13, %xmm14
+        movsd     %xmm14, (%rsi)
+
+.LBL_2_13:
+
+        movl      $4, %eax
+        ret
+
+.LBL_2_14:
+
+        movsd     1120+_imldExpHATab(%rip), %xmm0
+        movl      $4, %eax
+        mulsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_15:
+
+        movsd     1128+_imldExpHATab(%rip), %xmm0
+        movl      $3, %eax
+        mulsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_16:
+
+        movsd     1144+_imldExpHATab(%rip), %xmm0
+        addsd     %xmm6, %xmm0
+        movsd     %xmm0, (%rsi)
+
+
+        ret
+
+.LBL_2_18:
+
+        movq      $0xbff0000000000000, %rax
+        movq      %rax, (%rsi)
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_19:
+
+        movb      -1(%rsp), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_21
+
+.LBL_2_20:
+
+        mulsd     %xmm6, %xmm6
+        movsd     %xmm6, (%rsi)
+        ret
+
+.LBL_2_21:
+
+        testl     $1048575, -4(%rsp)
+        jne       .LBL_2_20
+
+
+        cmpl      $0, -8(%rsp)
+        jne       .LBL_2_20
+
+
+        movq      1136+_imldExpHATab(%rip), %rdx
+        movq      %rdx, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dexpm1_cout_rare_internal,@function
+       .size   __svml_dexpm1_cout_rare_internal,.-__svml_dexpm1_cout_rare_internal
+..LN__svml_dexpm1_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dexpm1_data_internal_avx512:
+       .long   0
+       .long   1072693248
+       .long   1828292879
+       .long   1072739672
+       .long   1014845819
+       .long   1072788152
+       .long   1853186616
+       .long   1072838778
+       .long   171030293
+       .long   1072891646
+       .long   1276261410
+       .long   1072946854
+       .long   3577096743
+       .long   1073004506
+       .long   3712504873
+       .long   1073064711
+       .long   1719614413
+       .long   1073127582
+       .long   1944781191
+       .long   1073193236
+       .long   1110089947
+       .long   1073261797
+       .long   2191782032
+       .long   1073333393
+       .long   2572866477
+       .long   1073408159
+       .long   3716502172
+       .long   1073486235
+       .long   3707479175
+       .long   1073567768
+       .long   2728693978
+       .long   1073652911
+       .long   0
+       .long   0
+       .long   1568897901
+       .long   1016568486
+       .long   3936719688
+       .long   3162512149
+       .long   3819481236
+       .long   1016499965
+       .long   1303423926
+       .long   1015238005
+       .long   2804567149
+       .long   1015390024
+       .long   3145379760
+       .long   1014403278
+       .long   3793507337
+       .long   1016095713
+       .long   3210617384
+       .long   3163796463
+       .long   3108873501
+       .long   3162190556
+       .long   3253791412
+       .long   1015920431
+       .long   730975783
+       .long   1014083580
+       .long   2462790535
+       .long   1015814775
+       .long   816778419
+       .long   1014197934
+       .long   2789017511
+       .long   1014276997
+       .long   2413007344
+       .long   3163551506
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   1287323204
+       .long   1082531232
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   993624127
+       .long   1014676638
+       .long   0
+       .long   3227516928
+       .long   0
+       .long   3227516928
+       .long   0
+       .long   3227516928
+       .long   0
+       .long   3227516928
+       .long   0
+       .long   3227516928
+       .long   0
+       .long   3227516928
+       .long   0
+       .long   3227516928
+       .long   0
+       .long   3227516928
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4106095538
+       .long   1056571896
+       .long   4106095538
+       .long   1056571896
+       .long   4106095538
+       .long   1056571896
+       .long   4106095538
+       .long   1056571896
+       .long   4106095538
+       .long   1056571896
+       .long   4106095538
+       .long   1056571896
+       .long   4106095538
+       .long   1056571896
+       .long   4106095538
+       .long   1056571896
+       .long   271596938
+       .long   1059717636
+       .long   271596938
+       .long   1059717636
+       .long   271596938
+       .long   1059717636
+       .long   271596938
+       .long   1059717636
+       .long   271596938
+       .long   1059717636
+       .long   271596938
+       .long   1059717636
+       .long   271596938
+       .long   1059717636
+       .long   271596938
+       .long   1059717636
+       .long   2383825455
+       .long   1062650307
+       .long   2383825455
+       .long   1062650307
+       .long   2383825455
+       .long   1062650307
+       .long   2383825455
+       .long   1062650307
+       .long   2383825455
+       .long   1062650307
+       .long   2383825455
+       .long   1062650307
+       .long   2383825455
+       .long   1062650307
+       .long   2383825455
+       .long   1062650307
+       .long   277238292
+       .long   1065423121
+       .long   277238292
+       .long   1065423121
+       .long   277238292
+       .long   1065423121
+       .long   277238292
+       .long   1065423121
+       .long   277238292
+       .long   1065423121
+       .long   277238292
+       .long   1065423121
+       .long   277238292
+       .long   1065423121
+       .long   277238292
+       .long   1065423121
+       .long   1420639494
+       .long   1067799893
+       .long   1420639494
+       .long   1067799893
+       .long   1420639494
+       .long   1067799893
+       .long   1420639494
+       .long   1067799893
+       .long   1420639494
+       .long   1067799893
+       .long   1420639494
+       .long   1067799893
+       .long   1420639494
+       .long   1067799893
+       .long   1420639494
+       .long   1067799893
+       .long   1431656022
+       .long   1069897045
+       .long   1431656022
+       .long   1069897045
+       .long   1431656022
+       .long   1069897045
+       .long   1431656022
+       .long   1069897045
+       .long   1431656022
+       .long   1069897045
+       .long   1431656022
+       .long   1069897045
+       .long   1431656022
+       .long   1069897045
+       .long   1431656022
+       .long   1069897045
+       .long   162
+       .long   1071644672
+       .long   162
+       .long   1071644672
+       .long   162
+       .long   1071644672
+       .long   162
+       .long   1071644672
+       .long   162
+       .long   1071644672
+       .long   162
+       .long   1071644672
+       .long   162
+       .long   1071644672
+       .long   162
+       .long   1071644672
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   3220176896
+       .type   __svml_dexpm1_data_internal_avx512,@object
+       .size   __svml_dexpm1_data_internal_avx512,1344
+       .align 32
+_imldExpHATab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   1048019041
+       .long   1072704666
+       .long   2631457885
+       .long   3161546771
+       .long   3541402996
+       .long   1072716208
+       .long   896005651
+       .long   1015861842
+       .long   410360776
+       .long   1072727877
+       .long   1642514529
+       .long   1012987726
+       .long   1828292879
+       .long   1072739672
+       .long   1568897901
+       .long   1016568486
+       .long   852742562
+       .long   1072751596
+       .long   1882168529
+       .long   1010744893
+       .long   3490863953
+       .long   1072763649
+       .long   707771662
+       .long   3163903570
+       .long   2930322912
+       .long   1072775834
+       .long   3117806614
+       .long   3163670819
+       .long   1014845819
+       .long   1072788152
+       .long   3936719688
+       .long   3162512149
+       .long   3949972341
+       .long   1072800603
+       .long   1058231231
+       .long   1015777676
+       .long   828946858
+       .long   1072813191
+       .long   1044000608
+       .long   1016786167
+       .long   2288159958
+       .long   1072825915
+       .long   1151779725
+       .long   1015705409
+       .long   1853186616
+       .long   1072838778
+       .long   3819481236
+       .long   1016499965
+       .long   1709341917
+       .long   1072851781
+       .long   2552227826
+       .long   1015039787
+       .long   4112506593
+       .long   1072864925
+       .long   1829350193
+       .long   1015216097
+       .long   2799960843
+       .long   1072878213
+       .long   1913391796
+       .long   1015756674
+       .long   171030293
+       .long   1072891646
+       .long   1303423926
+       .long   1015238005
+       .long   2992903935
+       .long   1072905224
+       .long   1574172746
+       .long   1016061241
+       .long   926591435
+       .long   1072918951
+       .long   3427487848
+       .long   3163704045
+       .long   887463927
+       .long   1072932827
+       .long   1049900754
+       .long   3161575912
+       .long   1276261410
+       .long   1072946854
+       .long   2804567149
+       .long   1015390024
+       .long   569847338
+       .long   1072961034
+       .long   1209502043
+       .long   3159926671
+       .long   1617004845
+       .long   1072975368
+       .long   1623370769
+       .long   1011049453
+       .long   3049340112
+       .long   1072989858
+       .long   3667985273
+       .long   1013894369
+       .long   3577096743
+       .long   1073004506
+       .long   3145379760
+       .long   1014403278
+       .long   1990012071
+       .long   1073019314
+       .long   7447438
+       .long   3163526196
+       .long   1453150082
+       .long   1073034283
+       .long   3171891295
+       .long   3162037958
+       .long   917841882
+       .long   1073049415
+       .long   419288974
+       .long   1016280325
+       .long   3712504873
+       .long   1073064711
+       .long   3793507337
+       .long   1016095713
+       .long   363667784
+       .long   1073080175
+       .long   728023093
+       .long   1016345318
+       .long   2956612997
+       .long   1073095806
+       .long   1005538728
+       .long   3163304901
+       .long   2186617381
+       .long   1073111608
+       .long   2018924632
+       .long   3163803357
+       .long   1719614413
+       .long   1073127582
+       .long   3210617384
+       .long   3163796463
+       .long   1013258799
+       .long   1073143730
+       .long   3094194670
+       .long   3160631279
+       .long   3907805044
+       .long   1073160053
+       .long   2119843535
+       .long   3161988964
+       .long   1447192521
+       .long   1073176555
+       .long   508946058
+       .long   3162904882
+       .long   1944781191
+       .long   1073193236
+       .long   3108873501
+       .long   3162190556
+       .long   919555682
+       .long   1073210099
+       .long   2882956373
+       .long   1013312481
+       .long   2571947539
+       .long   1073227145
+       .long   4047189812
+       .long   3163777462
+       .long   2604962541
+       .long   1073244377
+       .long   3631372142
+       .long   3163870288
+       .long   1110089947
+       .long   1073261797
+       .long   3253791412
+       .long   1015920431
+       .long   2568320822
+       .long   1073279406
+       .long   1509121860
+       .long   1014756995
+       .long   2966275557
+       .long   1073297207
+       .long   2339118633
+       .long   3160254904
+       .long   2682146384
+       .long   1073315202
+       .long   586480042
+       .long   3163702083
+       .long   2191782032
+       .long   1073333393
+       .long   730975783
+       .long   1014083580
+       .long   2069751141
+       .long   1073351782
+       .long   576856675
+       .long   3163014404
+       .long   2990417245
+       .long   1073370371
+       .long   3552361237
+       .long   3163667409
+       .long   1434058175
+       .long   1073389163
+       .long   1853053619
+       .long   1015310724
+       .long   2572866477
+       .long   1073408159
+       .long   2462790535
+       .long   1015814775
+       .long   3092190715
+       .long   1073427362
+       .long   1457303226
+       .long   3159737305
+       .long   4076559943
+       .long   1073446774
+       .long   950899508
+       .long   3160987380
+       .long   2420883922
+       .long   1073466398
+       .long   174054861
+       .long   1014300631
+       .long   3716502172
+       .long   1073486235
+       .long   816778419
+       .long   1014197934
+       .long   777507147
+       .long   1073506289
+       .long   3507050924
+       .long   1015341199
+       .long   3706687593
+       .long   1073526560
+       .long   1821514088
+       .long   1013410604
+       .long   1242007932
+       .long   1073547053
+       .long   1073740399
+       .long   3163532637
+       .long   3707479175
+       .long   1073567768
+       .long   2789017511
+       .long   1014276997
+       .long   64696965
+       .long   1073588710
+       .long   3586233004
+       .long   1015962192
+       .long   863738719
+       .long   1073609879
+       .long   129252895
+       .long   3162690849
+       .long   3884662774
+       .long   1073631278
+       .long   1614448851
+       .long   1014281732
+       .long   2728693978
+       .long   1073652911
+       .long   2413007344
+       .long   3163551506
+       .long   3999357479
+       .long   1073674779
+       .long   1101668360
+       .long   1015989180
+       .long   1533953344
+       .long   1073696886
+       .long   835814894
+       .long   1015702697
+       .long   2174652632
+       .long   1073719233
+       .long   1301400989
+       .long   1014466875
+       .long   1697350398
+       .long   1079448903
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1071644672
+       .long   1431652600
+       .long   1069897045
+       .long   1431670732
+       .long   1067799893
+       .long   984555731
+       .long   1065423122
+       .long   472530941
+       .long   1062650218
+       .long   4277811695
+       .long   1082535490
+       .long   3715808466
+       .long   3230016299
+       .long   3576508497
+       .long   3230091536
+       .long   4277796864
+       .long   1065758274
+       .long   3164486458
+       .long   1025308570
+       .long   1
+       .long   1048576
+       .long   4294967295
+       .long   2146435071
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   1009778688
+       .long   0
+       .long   1106771968
+       .type   _imldExpHATab,@object
+       .size   _imldExpHATab,1176
+       .align 8
+.L_2il0floatpacket.77:
+       .long   0x00000000,0xbff00000
+       .type   .L_2il0floatpacket.77,@object
+       .size   .L_2il0floatpacket.77,8
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_expm1_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_expm1_s_la.s
new file mode 100644 (file)
index 0000000..9cbefbb
--- /dev/null
@@ -0,0 +1,595 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *  After computing exp(x) in high-low parts, an accurate computation is performed to obtain exp(x)-1
+ *  *  Typical exp() implementation, except that:
+ *  *   - tables are small (32 elements), allowing for fast gathers
+ *  *   - all arguments processed in the main path
+ *  *       - final VSCALEF assists branch-free design (correct overflow/underflow and special case responses)
+ *  *       - a VAND is used to ensure the reduced argument |R|<2, even for large inputs
+ *  *       - RZ mode used to avoid oveflow to +/-Inf for x*log2(e); helps with special case handling
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_expm1f16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_expm1f16
+
+__svml_expm1f16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   256+__svml_sexpm1_data_internal_avx512(%rip), %zmm5
+        vmovups   320+__svml_sexpm1_data_internal_avx512(%rip), %zmm3
+        vmovups   512+__svml_sexpm1_data_internal_avx512(%rip), %zmm8
+        vmovups   576+__svml_sexpm1_data_internal_avx512(%rip), %zmm4
+        vmovups   __svml_sexpm1_data_internal_avx512(%rip), %zmm6
+
+/* polynomial */
+        vmovups   704+__svml_sexpm1_data_internal_avx512(%rip), %zmm9
+        vmovups   768+__svml_sexpm1_data_internal_avx512(%rip), %zmm12
+        vmovups   128+__svml_sexpm1_data_internal_avx512(%rip), %zmm11
+        vmovups   384+__svml_sexpm1_data_internal_avx512(%rip), %zmm2
+
+/* Th - 1 */
+        vmovups   832+__svml_sexpm1_data_internal_avx512(%rip), %zmm14
+        vmovaps   %zmm0, %zmm1
+
+/* 2^(52-5)*1.5 + x * log2(e) */
+        vfmadd213ps {rn-sae}, %zmm3, %zmm1, %zmm5
+        vcmpps    $29, {sae}, %zmm2, %zmm1, %k0
+
+/* Z0 ~ x*log2(e), rounded to 5 fractional bits */
+        vsubps    {rn-sae}, %zmm3, %zmm5, %zmm7
+        vpermt2ps 64+__svml_sexpm1_data_internal_avx512(%rip), %zmm5, %zmm6
+        vpermt2ps 192+__svml_sexpm1_data_internal_avx512(%rip), %zmm5, %zmm11
+        vandps    448+__svml_sexpm1_data_internal_avx512(%rip), %zmm1, %zmm0
+
+/* R = x - Z0*log(2) */
+        vfnmadd213ps {rn-sae}, %zmm1, %zmm7, %zmm8
+
+/* scale Th */
+        vscalefps {rn-sae}, %zmm7, %zmm6, %zmm2
+        vfnmadd231ps {rn-sae}, %zmm7, %zmm4, %zmm8
+        kmovw     %k0, %edx
+
+/* ensure |R|<2 even for special cases */
+        vandps    640+__svml_sexpm1_data_internal_avx512(%rip), %zmm8, %zmm13
+        vsubps    {rn-sae}, %zmm14, %zmm2, %zmm8
+        vmulps    {rn-sae}, %zmm13, %zmm13, %zmm10
+        vfmadd231ps {rn-sae}, %zmm13, %zmm9, %zmm12
+
+/* Tlr + R+ R2*Poly */
+        vfmadd213ps {rn-sae}, %zmm11, %zmm10, %zmm12
+        vaddps    {rn-sae}, %zmm13, %zmm12, %zmm15
+
+/* (Th-1)+Th*(Tlr + R+ R*Poly) */
+        vfmadd213ps {rn-sae}, %zmm8, %zmm15, %zmm2
+        vorps     %zmm0, %zmm2, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm1, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_sexpm1_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_expm1f16,@function
+       .size   __svml_expm1f16,.-__svml_expm1f16
+..LN__svml_expm1f16.0:
+
+.L_2__routine_start___svml_sexpm1_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_sexpm1_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movss     (%rdi), %xmm8
+        pxor      %xmm0, %xmm0
+        comiss    %xmm8, %xmm0
+        ja        .LBL_2_8
+
+
+        movzwl    2(%rdi), %edx
+        andl      $32640, %edx
+        cmpl      $32640, %edx
+        je        .LBL_2_9
+
+
+        movss     .L_2il0floatpacket.45(%rip), %xmm0
+        comiss    %xmm8, %xmm0
+        jb        .LBL_2_6
+
+
+        comiss    .L_2il0floatpacket.46(%rip), %xmm8
+        jb        .LBL_2_7
+
+
+        movss     .L_2il0floatpacket.48(%rip), %xmm0
+        mulss     %xmm8, %xmm0
+        movss     %xmm0, -24(%rsp)
+        movss     -24(%rsp), %xmm1
+        movss     .L_2il0floatpacket.49(%rip), %xmm2
+        movss     .L_2il0floatpacket.56(%rip), %xmm6
+        addss     %xmm2, %xmm1
+        movss     %xmm1, -20(%rsp)
+        movss     -20(%rsp), %xmm3
+        movss     .L_2il0floatpacket.52(%rip), %xmm7
+        subss     %xmm2, %xmm3
+        movss     %xmm3, -24(%rsp)
+        movss     -24(%rsp), %xmm4
+        mulss     .L_2il0floatpacket.50(%rip), %xmm4
+        movss     -24(%rsp), %xmm5
+        subss     %xmm4, %xmm8
+        mulss     .L_2il0floatpacket.51(%rip), %xmm5
+        movl      -20(%rsp), %edx
+        subss     %xmm5, %xmm8
+        mulss     %xmm8, %xmm6
+        shll      $23, %edx
+        addss     .L_2il0floatpacket.55(%rip), %xmm6
+        mulss     %xmm8, %xmm6
+        addss     .L_2il0floatpacket.54(%rip), %xmm6
+        mulss     %xmm8, %xmm6
+        addss     .L_2il0floatpacket.53(%rip), %xmm6
+        mulss     %xmm8, %xmm6
+        addss     %xmm7, %xmm6
+        mulss     %xmm8, %xmm6
+        addss     %xmm6, %xmm7
+        movss     %xmm7, -16(%rsp)
+        addl      -16(%rsp), %edx
+        movl      %edx, (%rsi)
+        ret
+
+.LBL_2_6:
+
+        movss     .L_2il0floatpacket.47(%rip), %xmm0
+        mulss     %xmm0, %xmm0
+        movss     %xmm0, -16(%rsp)
+        movl      -16(%rsp), %eax
+        movl      %eax, (%rsi)
+        movl      $3, %eax
+
+.LBL_2_7:
+
+        ret
+
+.LBL_2_8:
+
+        movl      $-1082130432, (%rsi)
+        ret
+
+.LBL_2_9:
+
+        movb      3(%rdi), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_11
+
+.LBL_2_10:
+
+        mulss     %xmm8, %xmm8
+        movss     %xmm8, (%rsi)
+        ret
+
+.LBL_2_11:
+
+        testl     $8388607, (%rdi)
+        jne       .LBL_2_10
+
+
+        movss     %xmm0, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_sexpm1_cout_rare_internal,@function
+       .size   __svml_sexpm1_cout_rare_internal,.-__svml_sexpm1_cout_rare_internal
+..LN__svml_sexpm1_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_sexpm1_data_internal_avx512:
+       .long   1065353216
+       .long   1065536903
+       .long   1065724611
+       .long   1065916431
+       .long   1066112450
+       .long   1066312762
+       .long   1066517459
+       .long   1066726640
+       .long   1066940400
+       .long   1067158842
+       .long   1067382066
+       .long   1067610179
+       .long   1067843287
+       .long   1068081499
+       .long   1068324927
+       .long   1068573686
+       .long   1068827891
+       .long   1069087663
+       .long   1069353124
+       .long   1069624397
+       .long   1069901610
+       .long   1070184894
+       .long   1070474380
+       .long   1070770206
+       .long   1071072509
+       .long   1071381432
+       .long   1071697119
+       .long   1072019719
+       .long   1072349383
+       .long   1072686266
+       .long   1073030525
+       .long   1073382323
+       .long   0
+       .long   3007986186
+       .long   860277610
+       .long   3010384254
+       .long   2991457809
+       .long   3008462297
+       .long   860562562
+       .long   3004532446
+       .long   856238081
+       .long   3001480295
+       .long   857441778
+       .long   815380209
+       .long   3003456168
+       .long   3001196762
+       .long   2986372182
+       .long   3006683458
+       .long   848495278
+       .long   851809756
+       .long   3003311522
+       .long   2995654817
+       .long   833868005
+       .long   3004843819
+       .long   835836658
+       .long   3003498340
+       .long   2994528642
+       .long   3002229827
+       .long   2981408986
+       .long   2983889551
+       .long   2983366846
+       .long   3000350873
+       .long   833659207
+       .long   2987748092
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   1118652779
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   2969756424
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1042983923
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1056964854
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .type   __svml_sexpm1_data_internal_avx512,@object
+       .size   __svml_sexpm1_data_internal_avx512,896
+       .align 4
+.L_2il0floatpacket.44:
+       .long   0xbf800000
+       .type   .L_2il0floatpacket.44,@object
+       .size   .L_2il0floatpacket.44,4
+       .align 4
+.L_2il0floatpacket.45:
+       .long   0x42b17217
+       .type   .L_2il0floatpacket.45,@object
+       .size   .L_2il0floatpacket.45,4
+       .align 4
+.L_2il0floatpacket.46:
+       .long   0xc2cff1b4
+       .type   .L_2il0floatpacket.46,@object
+       .size   .L_2il0floatpacket.46,4
+       .align 4
+.L_2il0floatpacket.47:
+       .long   0x7f7fffff
+       .type   .L_2il0floatpacket.47,@object
+       .size   .L_2il0floatpacket.47,4
+       .align 4
+.L_2il0floatpacket.48:
+       .long   0x3fb8aa3b
+       .type   .L_2il0floatpacket.48,@object
+       .size   .L_2il0floatpacket.48,4
+       .align 4
+.L_2il0floatpacket.49:
+       .long   0x4b400000
+       .type   .L_2il0floatpacket.49,@object
+       .size   .L_2il0floatpacket.49,4
+       .align 4
+.L_2il0floatpacket.50:
+       .long   0x3f317200
+       .type   .L_2il0floatpacket.50,@object
+       .size   .L_2il0floatpacket.50,4
+       .align 4
+.L_2il0floatpacket.51:
+       .long   0x35bfbe8e
+       .type   .L_2il0floatpacket.51,@object
+       .size   .L_2il0floatpacket.51,4
+       .align 4
+.L_2il0floatpacket.52:
+       .long   0x3f800001
+       .type   .L_2il0floatpacket.52,@object
+       .size   .L_2il0floatpacket.52,4
+       .align 4
+.L_2il0floatpacket.53:
+       .long   0x3efffe85
+       .type   .L_2il0floatpacket.53,@object
+       .size   .L_2il0floatpacket.53,4
+       .align 4
+.L_2il0floatpacket.54:
+       .long   0x3e2aa9c6
+       .type   .L_2il0floatpacket.54,@object
+       .size   .L_2il0floatpacket.54,4
+       .align 4
+.L_2il0floatpacket.55:
+       .long   0x3d2bb1b6
+       .type   .L_2il0floatpacket.55,@object
+       .size   .L_2il0floatpacket.55,4
+       .align 4
+.L_2il0floatpacket.56:
+       .long   0x3c0950ef
+       .type   .L_2il0floatpacket.56,@object
+       .size   .L_2il0floatpacket.56,4
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_log10_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_log10_d_la.s
new file mode 100644 (file)
index 0000000..86a0bc8
--- /dev/null
@@ -0,0 +1,1126 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *  log10(x) = VGETEXP(x)*log10(2) + log10(VGETMANT(x))
+ *  *       VGETEXP, VGETMANT will correctly treat special cases too (including denormals)
+ *  *   mx = VGETMANT(x) is in [1,2) for all x>=0
+ *  *   log10(mx) = -log10(RCP(mx)) + log10(1 +(mx*RCP(mx)-1))
+ *  *      RCP(mx) is rounded to 4 fractional bits,
+ *  *      and the table lookup for log(RCP(mx)) is based on a small permute instruction
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_log108_z0_0:
+
+       .align    16,0x90
+       .globl __svml_log108
+
+__svml_log108:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovaps   %zmm0, %zmm7
+
+/* GetMant(x), normalized to [1,2) for x>=0, NaN for x<0 */
+        vgetmantpd $8, {sae}, %zmm7, %zmm6
+        vmovups   128+__svml_dlog10_data_internal_avx512(%rip), %zmm3
+        vmovups   512+__svml_dlog10_data_internal_avx512(%rip), %zmm12
+        vmovups   640+__svml_dlog10_data_internal_avx512(%rip), %zmm13
+
+/* Start polynomial evaluation */
+        vmovups   256+__svml_dlog10_data_internal_avx512(%rip), %zmm10
+        vmovups   320+__svml_dlog10_data_internal_avx512(%rip), %zmm1
+        vmovups   384+__svml_dlog10_data_internal_avx512(%rip), %zmm11
+        vmovups   448+__svml_dlog10_data_internal_avx512(%rip), %zmm14
+
+/* Prepare exponent correction: DblRcp<0.75? */
+        vmovups   192+__svml_dlog10_data_internal_avx512(%rip), %zmm2
+
+/* Table lookup */
+        vmovups   __svml_dlog10_data_internal_avx512(%rip), %zmm5
+
+/* GetExp(x) */
+        vgetexppd {sae}, %zmm7, %zmm0
+
+/* DblRcp ~ 1/Mantissa */
+        vrcp14pd  %zmm6, %zmm8
+
+/* x<=0? */
+        vfpclasspd $94, %zmm7, %k0
+
+/* round DblRcp to 4 fractional bits (RN mode, no Precision exception) */
+        vrndscalepd $88, {sae}, %zmm8, %zmm4
+        vmovups   576+__svml_dlog10_data_internal_avx512(%rip), %zmm8
+        kmovw     %k0, %edx
+
+/* Reduced argument: R = DblRcp*Mantissa - 1 */
+        vfmsub213pd {rn-sae}, %zmm3, %zmm4, %zmm6
+        vcmppd    $17, {sae}, %zmm2, %zmm4, %k1
+        vfmadd231pd {rn-sae}, %zmm6, %zmm12, %zmm8
+        vmovups   704+__svml_dlog10_data_internal_avx512(%rip), %zmm12
+        vfmadd231pd {rn-sae}, %zmm6, %zmm10, %zmm1
+        vfmadd231pd {rn-sae}, %zmm6, %zmm11, %zmm14
+        vmovups   768+__svml_dlog10_data_internal_avx512(%rip), %zmm2
+
+/* R^2 */
+        vmulpd    {rn-sae}, %zmm6, %zmm6, %zmm15
+        vfmadd231pd {rn-sae}, %zmm6, %zmm13, %zmm12
+
+/* Prepare table index */
+        vpsrlq    $48, %zmm4, %zmm9
+
+/* add 1 to Expon if DblRcp<0.75 */
+        vaddpd    {rn-sae}, %zmm3, %zmm0, %zmm0{%k1}
+        vmulpd    {rn-sae}, %zmm15, %zmm15, %zmm13
+        vfmadd213pd {rn-sae}, %zmm14, %zmm15, %zmm1
+        vfmadd213pd {rn-sae}, %zmm12, %zmm15, %zmm8
+        vpermt2pd 64+__svml_dlog10_data_internal_avx512(%rip), %zmm9, %zmm5
+
+/* polynomial */
+        vfmadd213pd {rn-sae}, %zmm8, %zmm13, %zmm1
+        vfmadd213pd {rn-sae}, %zmm2, %zmm6, %zmm1
+        vfmadd213pd {rn-sae}, %zmm5, %zmm1, %zmm6
+        vmovups   832+__svml_dlog10_data_internal_avx512(%rip), %zmm1
+        vfmadd213pd {rn-sae}, %zmm6, %zmm1, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm7, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dlog10_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_log108,@function
+       .size   __svml_log108,.-__svml_log108
+..LN__svml_log108.0:
+
+.L_2__routine_start___svml_dlog10_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dlog10_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    6(%rdi), %edx
+        andl      $32752, %edx
+        cmpl      $32752, %edx
+        je        .LBL_2_12
+
+
+        movsd     (%rdi), %xmm2
+        xorl      %ecx, %ecx
+        movsd     %xmm2, -8(%rsp)
+        movzwl    -2(%rsp), %edx
+        testl     $32752, %edx
+        jne       .LBL_2_4
+
+
+        movsd     1600+__dlog10_la_CoutTab(%rip), %xmm0
+        movl      $-60, %ecx
+        mulsd     %xmm0, %xmm2
+        movsd     %xmm2, -8(%rsp)
+
+.LBL_2_4:
+
+        movsd     1608+__dlog10_la_CoutTab(%rip), %xmm0
+        comisd    %xmm0, %xmm2
+        jbe       .LBL_2_8
+
+
+        movaps    %xmm2, %xmm1
+        subsd     .L_2il0floatpacket.89(%rip), %xmm1
+        movsd     %xmm1, -16(%rsp)
+        andb      $127, -9(%rsp)
+        movsd     -16(%rsp), %xmm0
+        comisd    1592+__dlog10_la_CoutTab(%rip), %xmm0
+        jbe       .LBL_2_7
+
+
+        movsd     %xmm2, -16(%rsp)
+        pxor      %xmm7, %xmm7
+        movzwl    -10(%rsp), %edi
+        lea       __dlog10_la_CoutTab(%rip), %r10
+        andl      $-32753, %edi
+        addl      $16368, %edi
+        movw      %di, -10(%rsp)
+        movsd     -16(%rsp), %xmm3
+        movaps    %xmm3, %xmm1
+        movaps    %xmm3, %xmm2
+        movsd     1688+__dlog10_la_CoutTab(%rip), %xmm5
+        movzwl    -2(%rsp), %edx
+        andl      $32752, %edx
+        addsd     1576+__dlog10_la_CoutTab(%rip), %xmm1
+        addsd     1584+__dlog10_la_CoutTab(%rip), %xmm2
+        movsd     %xmm1, -24(%rsp)
+        movl      -24(%rsp), %r8d
+        movsd     %xmm2, -24(%rsp)
+        andl      $127, %r8d
+        movsd     -24(%rsp), %xmm8
+        movsd     1560+__dlog10_la_CoutTab(%rip), %xmm9
+        movsd     1568+__dlog10_la_CoutTab(%rip), %xmm0
+        shrl      $4, %edx
+        subsd     1584+__dlog10_la_CoutTab(%rip), %xmm8
+        lea       (%r8,%r8,2), %r9d
+        movsd     (%r10,%r9,8), %xmm6
+        lea       -1023(%rcx,%rdx), %ecx
+        cvtsi2sd  %ecx, %xmm7
+        subsd     %xmm8, %xmm3
+        mulsd     %xmm6, %xmm8
+        mulsd     %xmm7, %xmm9
+        subsd     1624+__dlog10_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm6
+        mulsd     %xmm0, %xmm7
+        addsd     8(%r10,%r9,8), %xmm9
+        addsd     16(%r10,%r9,8), %xmm7
+        addsd     %xmm8, %xmm9
+        movaps    %xmm8, %xmm4
+        addsd     %xmm6, %xmm4
+        mulsd     %xmm4, %xmm5
+        addsd     1680+__dlog10_la_CoutTab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        addsd     1672+__dlog10_la_CoutTab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        addsd     1664+__dlog10_la_CoutTab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        addsd     1656+__dlog10_la_CoutTab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        addsd     1648+__dlog10_la_CoutTab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        addsd     1640+__dlog10_la_CoutTab(%rip), %xmm5
+        mulsd     %xmm4, %xmm5
+        addsd     1632+__dlog10_la_CoutTab(%rip), %xmm5
+        mulsd     %xmm5, %xmm8
+        mulsd     %xmm6, %xmm5
+        addsd     %xmm5, %xmm7
+        addsd     %xmm6, %xmm7
+        addsd     %xmm7, %xmm8
+        addsd     %xmm8, %xmm9
+        movsd     %xmm9, (%rsi)
+        ret
+
+.LBL_2_7:
+
+        movsd     1624+__dlog10_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm0, %xmm1
+        movsd     1688+__dlog10_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1680+__dlog10_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1672+__dlog10_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1664+__dlog10_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1656+__dlog10_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1648+__dlog10_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1640+__dlog10_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1632+__dlog10_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     %xmm1, %xmm2
+        movsd     %xmm2, (%rsi)
+        ret
+
+.LBL_2_8:
+
+        ucomisd   %xmm0, %xmm2
+        jp        .LBL_2_9
+        je        .LBL_2_11
+
+.LBL_2_9:
+
+        divsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        movl      $1, %eax
+
+
+        ret
+
+.LBL_2_11:
+
+        movsd     1616+__dlog10_la_CoutTab(%rip), %xmm1
+        movl      $2, %eax
+        xorps     .L_2il0floatpacket.88(%rip), %xmm1
+        divsd     %xmm0, %xmm1
+        movsd     %xmm1, (%rsi)
+        ret
+
+.LBL_2_12:
+
+        movb      7(%rdi), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_14
+
+.LBL_2_13:
+
+        movsd     (%rdi), %xmm0
+        mulsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_14:
+
+        testl     $1048575, 4(%rdi)
+        jne       .LBL_2_13
+
+
+        cmpl      $0, (%rdi)
+        jne       .LBL_2_13
+
+
+        movsd     1608+__dlog10_la_CoutTab(%rip), %xmm0
+        movl      $1, %eax
+        divsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dlog10_cout_rare_internal,@function
+       .size   __svml_dlog10_cout_rare_internal,.-__svml_dlog10_cout_rare_internal
+..LN__svml_dlog10_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dlog10_data_internal_avx512:
+       .long   0
+       .long   0
+       .long   721479184
+       .long   3214603769
+       .long   3590975466
+       .long   3215601833
+       .long   1438937368
+       .long   3216186160
+       .long   948324365
+       .long   3216559896
+       .long   2869828094
+       .long   3216915393
+       .long   516509563
+       .long   3217142759
+       .long   2145647618
+       .long   3217304702
+       .long   733771779
+       .long   1069546492
+       .long   3513866211
+       .long   1069249052
+       .long   3459676924
+       .long   1068963280
+       .long   1085767695
+       .long   1068688295
+       .long   3613830132
+       .long   1068347678
+       .long   1803457173
+       .long   1067836310
+       .long   3436756955
+       .long   1067234191
+       .long   930630721
+       .long   1066155272
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   675808112
+       .long   1068024536
+       .long   675808112
+       .long   1068024536
+       .long   675808112
+       .long   1068024536
+       .long   675808112
+       .long   1068024536
+       .long   675808112
+       .long   1068024536
+       .long   675808112
+       .long   1068024536
+       .long   675808112
+       .long   1068024536
+       .long   675808112
+       .long   1068024536
+       .long   2516752404
+       .long   3215710221
+       .long   2516752404
+       .long   3215710221
+       .long   2516752404
+       .long   3215710221
+       .long   2516752404
+       .long   3215710221
+       .long   2516752404
+       .long   3215710221
+       .long   2516752404
+       .long   3215710221
+       .long   2516752404
+       .long   3215710221
+       .long   2516752404
+       .long   3215710221
+       .long   4085995682
+       .long   1068483574
+       .long   4085995682
+       .long   1068483574
+       .long   4085995682
+       .long   1068483574
+       .long   4085995682
+       .long   1068483574
+       .long   4085995682
+       .long   1068483574
+       .long   4085995682
+       .long   1068483574
+       .long   4085995682
+       .long   1068483574
+       .long   4085995682
+       .long   1068483574
+       .long   879025280
+       .long   3216148390
+       .long   879025280
+       .long   3216148390
+       .long   879025280
+       .long   3216148390
+       .long   879025280
+       .long   3216148390
+       .long   879025280
+       .long   3216148390
+       .long   879025280
+       .long   3216148390
+       .long   879025280
+       .long   3216148390
+       .long   879025280
+       .long   3216148390
+       .long   2004821977
+       .long   1068907618
+       .long   2004821977
+       .long   1068907618
+       .long   2004821977
+       .long   1068907618
+       .long   2004821977
+       .long   1068907618
+       .long   2004821977
+       .long   1068907618
+       .long   2004821977
+       .long   1068907618
+       .long   2004821977
+       .long   1068907618
+       .long   2004821977
+       .long   1068907618
+       .long   356255395
+       .long   3216755579
+       .long   356255395
+       .long   3216755579
+       .long   356255395
+       .long   3216755579
+       .long   356255395
+       .long   3216755579
+       .long   356255395
+       .long   3216755579
+       .long   356255395
+       .long   3216755579
+       .long   356255395
+       .long   3216755579
+       .long   356255395
+       .long   3216755579
+       .long   1668235916
+       .long   1069713319
+       .long   1668235916
+       .long   1069713319
+       .long   1668235916
+       .long   1069713319
+       .long   1668235916
+       .long   1069713319
+       .long   1668235916
+       .long   1069713319
+       .long   1668235916
+       .long   1069713319
+       .long   1668235916
+       .long   1069713319
+       .long   1668235916
+       .long   1069713319
+       .long   354870491
+       .long   3217804155
+       .long   354870491
+       .long   3217804155
+       .long   354870491
+       .long   3217804155
+       .long   354870491
+       .long   3217804155
+       .long   354870491
+       .long   3217804155
+       .long   354870491
+       .long   3217804155
+       .long   354870491
+       .long   3217804155
+       .long   354870491
+       .long   3217804155
+       .long   354870542
+       .long   1071369083
+       .long   354870542
+       .long   1071369083
+       .long   354870542
+       .long   1071369083
+       .long   354870542
+       .long   1071369083
+       .long   354870542
+       .long   1071369083
+       .long   354870542
+       .long   1071369083
+       .long   354870542
+       .long   1071369083
+       .long   354870542
+       .long   1071369083
+       .long   1352628735
+       .long   1070810131
+       .long   1352628735
+       .long   1070810131
+       .long   1352628735
+       .long   1070810131
+       .long   1352628735
+       .long   1070810131
+       .long   1352628735
+       .long   1070810131
+       .long   1352628735
+       .long   1070810131
+       .long   1352628735
+       .long   1070810131
+       .long   1352628735
+       .long   1070810131
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .type   __svml_dlog10_data_internal_avx512,@object
+       .size   __svml_dlog10_data_internal_avx512,1152
+       .align 32
+__dlog10_la_CoutTab:
+       .long   0
+       .long   1071366144
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1071337728
+       .long   184549376
+       .long   1065092008
+       .long   2099961998
+       .long   3178897324
+       .long   0
+       .long   1071309312
+       .long   931135488
+       .long   1066155272
+       .long   2365712557
+       .long   3178155773
+       .long   0
+       .long   1071280896
+       .long   603979776
+       .long   1066752445
+       .long   709057215
+       .long   1031474920
+       .long   0
+       .long   1071252480
+       .long   3437232128
+       .long   1067234191
+       .long   1515412199
+       .long   3179085970
+       .long   0
+       .long   1071238272
+       .long   1105723392
+       .long   1067464226
+       .long   153915826
+       .long   3178000698
+       .long   0
+       .long   1071209856
+       .long   3328442368
+       .long   1067711223
+       .long   3899912278
+       .long   3177135692
+       .long   0
+       .long   1071181440
+       .long   341835776
+       .long   1067962480
+       .long   2509208190
+       .long   3176531222
+       .long   0
+       .long   1071167232
+       .long   2884632576
+       .long   1068089751
+       .long   1030636902
+       .long   1025224143
+       .long   0
+       .long   1071138816
+       .long   3613917184
+       .long   1068347678
+       .long   3527163461
+       .long   3177529532
+       .long   0
+       .long   1071124608
+       .long   3549954048
+       .long   1068478374
+       .long   3498894081
+       .long   3173000425
+       .long   0
+       .long   1071096192
+       .long   1623785472
+       .long   1068621140
+       .long   2889825554
+       .long   3176375375
+       .long   0
+       .long   1071081984
+       .long   1085800448
+       .long   1068688295
+       .long   4015256301
+       .long   3177184346
+       .long   0
+       .long   1071053568
+       .long   3652976640
+       .long   1068824490
+       .long   3600693529
+       .long   3175753877
+       .long   0
+       .long   1071039360
+       .long   1592393728
+       .long   1068893555
+       .long   231073830
+       .long   3177087939
+       .long   0
+       .long   1071025152
+       .long   3459645440
+       .long   1068963280
+       .long   1740576090
+       .long   1029619435
+       .long   0
+       .long   1070996736
+       .long   3774611456
+       .long   1069104765
+       .long   3858552785
+       .long   1028603845
+       .long   0
+       .long   1070982528
+       .long   845086720
+       .long   1069176552
+       .long   3138879731
+       .long   1029120443
+       .long   0
+       .long   1070968320
+       .long   3513843712
+       .long   1069249052
+       .long   2107125367
+       .long   1029044389
+       .long   0
+       .long   1070954112
+       .long   434503680
+       .long   1069322282
+       .long   3827602229
+       .long   1028932700
+       .long   0
+       .long   1070939904
+       .long   3613851648
+       .long   1069396254
+       .long   1223751955
+       .long   3176465139
+       .long   0
+       .long   1070911488
+       .long   733741056
+       .long   1069546492
+       .long   1625232067
+       .long   1029570781
+       .long   0
+       .long   1070897280
+       .long   1511620608
+       .long   1069585154
+       .long   3044605139
+       .long   1028090775
+       .long   0
+       .long   1070883072
+       .long   1337196544
+       .long   1069623706
+       .long   2602639001
+       .long   3175938675
+       .long   0
+       .long   1070868864
+       .long   2572533760
+       .long   1069662670
+       .long   3067107955
+       .long   1022933137
+       .long   0
+       .long   1070854656
+       .long   559611904
+       .long   1069702056
+       .long   764145786
+       .long   3174041535
+       .long   0
+       .long   1070840448
+       .long   485818368
+       .long   1069741872
+       .long   2037567072
+       .long   3175580956
+       .long   0
+       .long   1070826240
+       .long   259604480
+       .long   1069782128
+       .long   4012068429
+       .long   1027865895
+       .long   0
+       .long   1070812032
+       .long   3454042112
+       .long   1069822833
+       .long   2867680007
+       .long   3174202478
+       .long   0
+       .long   1070797824
+       .long   2188754944
+       .long   1069863999
+       .long   2538655286
+       .long   3175840981
+       .long   0
+       .long   1070783616
+       .long   2965241856
+       .long   1069905635
+       .long   1338936972
+       .long   3176093950
+       .long   0
+       .long   1070769408
+       .long   966279168
+       .long   1069947753
+       .long   1774547674
+       .long   3175051484
+       .long   0
+       .long   1070755200
+       .long   1604042752
+       .long   1069990363
+       .long   2557470738
+       .long   3174667448
+       .long   0
+       .long   1070740992
+       .long   3417833472
+       .long   1070033477
+       .long   2268255117
+       .long   3175678264
+       .long   0
+       .long   1070740992
+       .long   3417833472
+       .long   1070033477
+       .long   2268255117
+       .long   3175678264
+       .long   0
+       .long   1070726784
+       .long   2451292160
+       .long   1070077108
+       .long   3757728941
+       .long   1027943275
+       .long   0
+       .long   1070712576
+       .long   929644544
+       .long   1070121268
+       .long   899045708
+       .long   1027944939
+       .long   0
+       .long   1070698368
+       .long   3057254400
+       .long   1070165969
+       .long   3880649376
+       .long   3172972504
+       .long   0
+       .long   1070684160
+       .long   2231091200
+       .long   1070211226
+       .long   521319256
+       .long   1027600177
+       .long   0
+       .long   1070684160
+       .long   2231091200
+       .long   1070211226
+       .long   521319256
+       .long   1027600177
+       .long   0
+       .long   1070669952
+       .long   2620162048
+       .long   1070257052
+       .long   1385613369
+       .long   3176104036
+       .long   0
+       .long   1070655744
+       .long   2096726016
+       .long   1070303462
+       .long   3138305819
+       .long   3173646777
+       .long   0
+       .long   1070641536
+       .long   944717824
+       .long   1070350471
+       .long   1065120110
+       .long   1027539054
+       .long   0
+       .long   1070641536
+       .long   944717824
+       .long   1070350471
+       .long   1065120110
+       .long   1027539054
+       .long   0
+       .long   1070627328
+       .long   1985789952
+       .long   1070398094
+       .long   3635943864
+       .long   3173136490
+       .long   0
+       .long   1070613120
+       .long   2123825152
+       .long   1070446348
+       .long   1125219725
+       .long   3175615738
+       .long   0
+       .long   1070598912
+       .long   1078378496
+       .long   1070495250
+       .long   603852726
+       .long   3174570526
+       .long   0
+       .long   1070598912
+       .long   1078378496
+       .long   1070495250
+       .long   603852726
+       .long   3174570526
+       .long   0
+       .long   1070573312
+       .long   1537933312
+       .long   1070544817
+       .long   998069198
+       .long   1026662908
+       .long   0
+       .long   1070544896
+       .long   733773824
+       .long   1070595068
+       .long   4061058002
+       .long   3174036009
+       .long   0
+       .long   1070544896
+       .long   733773824
+       .long   1070595068
+       .long   4061058002
+       .long   3174036009
+       .long   0
+       .long   1070516480
+       .long   3897544704
+       .long   1070621058
+       .long   951856294
+       .long   1026731877
+       .long   0
+       .long   1070516480
+       .long   3897544704
+       .long   1070621058
+       .long   951856294
+       .long   1026731877
+       .long   0
+       .long   1070488064
+       .long   493535232
+       .long   1070646897
+       .long   3852369308
+       .long   3173264746
+       .long   0
+       .long   1070459648
+       .long   463249408
+       .long   1070673107
+       .long   2853152111
+       .long   3174564937
+       .long   0
+       .long   1070459648
+       .long   463249408
+       .long   1070673107
+       .long   2853152111
+       .long   3174564937
+       .long   0
+       .long   1070431232
+       .long   3186585600
+       .long   1070699699
+       .long   1874718356
+       .long   3174139933
+       .long   0
+       .long   1070431232
+       .long   3186585600
+       .long   1070699699
+       .long   1874718356
+       .long   3174139933
+       .long   0
+       .long   1070402816
+       .long   1525858304
+       .long   1070726686
+       .long   3039843523
+       .long   1024724665
+       .long   0
+       .long   1070402816
+       .long   1525858304
+       .long   1070726686
+       .long   3039843523
+       .long   1024724665
+       .long   0
+       .long   1070374400
+       .long   3425300480
+       .long   1070754078
+       .long   1303046649
+       .long   1022401701
+       .long   0
+       .long   1070374400
+       .long   3425300480
+       .long   1070754078
+       .long   1303046649
+       .long   1022401701
+       .long   0
+       .long   1070345984
+       .long   1980465152
+       .long   1070781889
+       .long   3188656319
+       .long   1027271390
+       .long   0
+       .long   1070345984
+       .long   1980465152
+       .long   1070781889
+       .long   3188656319
+       .long   1027271390
+       .long   0
+       .long   1070317568
+       .long   1352630272
+       .long   1070810131
+       .long   3090895658
+       .long   3174564915
+       .long   1352630272
+       .long   1070810131
+       .long   3090895658
+       .long   3174564915
+       .long   64
+       .long   1120927744
+       .long   0
+       .long   1096810496
+       .long   0
+       .long   1064828928
+       .long   0
+       .long   1135607808
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1071366144
+       .long   3207479559
+       .long   1062894188
+       .long   3698831637
+       .long   3220339442
+       .long   3700832817
+       .long   1073506818
+       .long   1691624569
+       .long   3221787401
+       .long   2065628764
+       .long   1075227551
+       .long   1770847080
+       .long   3223701774
+       .long   3786517112
+       .long   1077250450
+       .long   1316351650
+       .long   3225793313
+       .type   __dlog10_la_CoutTab,@object
+       .size   __dlog10_la_CoutTab,1696
+       .align 16
+.L_2il0floatpacket.88:
+       .long   0x00000000,0x80000000,0x00000000,0x00000000
+       .type   .L_2il0floatpacket.88,@object
+       .size   .L_2il0floatpacket.88,16
+       .align 8
+.L_2il0floatpacket.89:
+       .long   0x00000000,0x3ff00000
+       .type   .L_2il0floatpacket.89,@object
+       .size   .L_2il0floatpacket.89,8
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_log10_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_log10_s_la.s
new file mode 100644 (file)
index 0000000..1a02ca0
--- /dev/null
@@ -0,0 +1,756 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *  log10(x) = VGETEXP(x)*log10(2) + log10(VGETMANT(x))
+ *  *       VGETEXP, VGETMANT will correctly treat special cases too (including denormals)
+ *  *   mx = VGETMANT(x) is in [1,2) for all x>=0
+ *  *   log10(mx) = -log10(RCP(mx)) + log10(1 +(mx*RCP(mx)-1))
+ *  *      RCP(mx) is rounded to 4 fractional bits,
+ *  *      and the table lookup for log(RCP(mx)) is based on a small permute instruction
+ *  *
+ *  *   LA, EP versions use interval interpolation (16 intervals)
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_log10f16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_log10f16
+
+__svml_log10f16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+
+/* GetMant(x), normalized to [.75,1.5) for x>=0, NaN for x<0 */
+        vgetmantps $11, {sae}, %zmm0, %zmm3
+        vmovups   __svml_slog10_data_internal_avx512(%rip), %zmm1
+        vgetexpps {sae}, %zmm0, %zmm5
+        vmovups   320+__svml_slog10_data_internal_avx512(%rip), %zmm10
+        vpsrld    $19, %zmm3, %zmm7
+        vgetexpps {sae}, %zmm3, %zmm6
+        vsubps    {rn-sae}, %zmm1, %zmm3, %zmm11
+        vpermps   64+__svml_slog10_data_internal_avx512(%rip), %zmm7, %zmm1
+        vpermps   128+__svml_slog10_data_internal_avx512(%rip), %zmm7, %zmm2
+        vsubps    {rn-sae}, %zmm6, %zmm5, %zmm9
+        vpermps   192+__svml_slog10_data_internal_avx512(%rip), %zmm7, %zmm4
+        vpermps   256+__svml_slog10_data_internal_avx512(%rip), %zmm7, %zmm8
+
+/* x<=0? */
+        vfpclassps $94, %zmm0, %k0
+        vfmadd213ps {rn-sae}, %zmm2, %zmm11, %zmm1
+        vmulps    {rn-sae}, %zmm10, %zmm9, %zmm12
+        vfmadd213ps {rn-sae}, %zmm4, %zmm11, %zmm1
+        kmovw     %k0, %edx
+        vfmadd213ps {rn-sae}, %zmm8, %zmm11, %zmm1
+        vfmadd213ps {rn-sae}, %zmm12, %zmm11, %zmm1
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm1, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm1, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm1
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_slog10_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_log10f16,@function
+       .size   __svml_log10f16,.-__svml_log10f16
+..LN__svml_log10f16.0:
+
+.L_2__routine_start___svml_slog10_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_slog10_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    2(%rdi), %edx
+        andl      $32640, %edx
+        cmpl      $32640, %edx
+        je        .LBL_2_12
+
+
+        movss     (%rdi), %xmm2
+        xorl      %ecx, %ecx
+        movss     %xmm2, -16(%rsp)
+        movzwl    -14(%rsp), %edx
+        testl     $32640, %edx
+        jne       .LBL_2_4
+
+
+        mulss     .L_2il0floatpacket.77(%rip), %xmm2
+        movl      $-40, %ecx
+        movss     %xmm2, -16(%rsp)
+
+.LBL_2_4:
+
+        pxor      %xmm0, %xmm0
+        comiss    %xmm0, %xmm2
+        jbe       .LBL_2_8
+
+
+        movaps    %xmm2, %xmm1
+        subss     .L_2il0floatpacket.93(%rip), %xmm1
+        movss     %xmm1, -20(%rsp)
+        andb      $127, -17(%rsp)
+        movss     -20(%rsp), %xmm0
+        comiss    .L_2il0floatpacket.78(%rip), %xmm0
+        jbe       .LBL_2_7
+
+
+        movss     %xmm2, -20(%rsp)
+        pxor      %xmm8, %xmm8
+        movzwl    -18(%rsp), %edi
+        lea       __slog10_la_CoutTab(%rip), %r10
+        andl      $-32641, %edi
+        addl      $16256, %edi
+        movw      %di, -18(%rsp)
+        movss     -20(%rsp), %xmm3
+        movaps    %xmm3, %xmm0
+        movss     .L_2il0floatpacket.80(%rip), %xmm2
+        movaps    %xmm2, %xmm1
+        addss     .L_2il0floatpacket.79(%rip), %xmm0
+        addss     %xmm3, %xmm1
+        movss     %xmm0, -24(%rsp)
+        movl      -24(%rsp), %r8d
+        movss     %xmm1, -24(%rsp)
+        andl      $127, %r8d
+        movss     -24(%rsp), %xmm9
+        movss     .L_2il0floatpacket.89(%rip), %xmm6
+        subss     %xmm2, %xmm9
+        movzwl    -14(%rsp), %edx
+        lea       (%r8,%r8,2), %r9d
+        movss     (%r10,%r9,4), %xmm7
+        andl      $32640, %edx
+        shrl      $7, %edx
+        subss     %xmm9, %xmm3
+        mulss     %xmm7, %xmm9
+        mulss     %xmm3, %xmm7
+        subss     .L_2il0floatpacket.81(%rip), %xmm9
+        movaps    %xmm9, %xmm4
+        lea       -127(%rcx,%rdx), %ecx
+        cvtsi2ss  %ecx, %xmm8
+        addss     %xmm7, %xmm4
+        mulss     %xmm4, %xmm6
+        movss     .L_2il0floatpacket.90(%rip), %xmm10
+        mulss     %xmm8, %xmm10
+        addss     .L_2il0floatpacket.88(%rip), %xmm6
+        addss     4(%r10,%r9,4), %xmm10
+        mulss     %xmm4, %xmm6
+        addss     %xmm9, %xmm10
+        addss     .L_2il0floatpacket.87(%rip), %xmm6
+        mulss     %xmm4, %xmm6
+        movss     .L_2il0floatpacket.91(%rip), %xmm5
+        mulss     %xmm5, %xmm8
+        addss     .L_2il0floatpacket.86(%rip), %xmm6
+        addss     8(%r10,%r9,4), %xmm8
+        mulss     %xmm4, %xmm6
+        addss     .L_2il0floatpacket.85(%rip), %xmm6
+        mulss     %xmm4, %xmm6
+        addss     .L_2il0floatpacket.84(%rip), %xmm6
+        mulss     %xmm4, %xmm6
+        addss     .L_2il0floatpacket.83(%rip), %xmm6
+        mulss     %xmm4, %xmm6
+        addss     .L_2il0floatpacket.82(%rip), %xmm6
+        mulss     %xmm6, %xmm9
+        mulss     %xmm7, %xmm6
+        addss     %xmm6, %xmm8
+        addss     %xmm7, %xmm8
+        addss     %xmm8, %xmm9
+        addss     %xmm9, %xmm10
+        movss     %xmm10, (%rsi)
+        ret
+
+.LBL_2_7:
+
+        movss     .L_2il0floatpacket.81(%rip), %xmm0
+        mulss     %xmm0, %xmm1
+        movss     .L_2il0floatpacket.89(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.88(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.87(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.86(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.85(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.84(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.83(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.82(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     %xmm1, %xmm2
+        movss     %xmm2, (%rsi)
+        ret
+
+.LBL_2_8:
+
+        ucomiss   %xmm0, %xmm2
+        jp        .LBL_2_9
+        je        .LBL_2_11
+
+.LBL_2_9:
+
+        divss     %xmm0, %xmm0
+        movss     %xmm0, (%rsi)
+        movl      $1, %eax
+
+
+        ret
+
+.LBL_2_11:
+
+        movss     .L_2il0floatpacket.92(%rip), %xmm1
+        movl      $2, %eax
+        divss     %xmm0, %xmm1
+        movss     %xmm1, (%rsi)
+        ret
+
+.LBL_2_12:
+
+        movb      3(%rdi), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_14
+
+.LBL_2_13:
+
+        movss     (%rdi), %xmm0
+        mulss     %xmm0, %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_14:
+
+        testl     $8388607, (%rdi)
+        jne       .LBL_2_13
+
+
+        movl      $1, %eax
+        pxor      %xmm1, %xmm1
+        pxor      %xmm0, %xmm0
+        divss     %xmm0, %xmm1
+        movss     %xmm1, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_slog10_cout_rare_internal,@function
+       .size   __svml_slog10_cout_rare_internal,.-__svml_slog10_cout_rare_internal
+..LN__svml_slog10_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_slog10_data_internal_avx512:
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   3184111259
+       .long   3181837556
+       .long   3180047478
+       .long   3177957936
+       .long   3175655835
+       .long   3173780127
+       .long   3172237531
+       .long   3170958066
+       .long   3196205737
+       .long   3194315592
+       .long   3192585145
+       .long   3191105685
+       .long   3189833727
+       .long   3188734475
+       .long   3187779868
+       .long   3186223182
+       .long   1041488008
+       .long   1041279100
+       .long   1040946627
+       .long   1040547595
+       .long   1040048184
+       .long   1039171801
+       .long   1038306334
+       .long   1037468467
+       .long   1034710670
+       .long   1037388369
+       .long   1039339328
+       .long   1040458589
+       .long   1040937011
+       .long   1041247376
+       .long   1041427373
+       .long   1041506296
+       .long   3193854619
+       .long   3193841271
+       .long   3193799669
+       .long   3193724950
+       .long   3193617675
+       .long   3193480957
+       .long   3193318914
+       .long   3193135864
+       .long   3194544764
+       .long   3194251079
+       .long   3194067571
+       .long   3193958490
+       .long   3193898352
+       .long   3193869008
+       .long   3193857579
+       .long   3193854984
+       .long   1054759896
+       .long   1054759749
+       .long   1054758872
+       .long   1054756529
+       .long   1054752055
+       .long   1054744934
+       .long   1054734809
+       .long   1054721467
+       .long   1054738669
+       .long   1054749415
+       .long   1054755175
+       .long   1054758032
+       .long   1054759295
+       .long   1054759760
+       .long   1054759882
+       .long   1054759897
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .long   1050288283
+       .type   __svml_slog10_data_internal_avx512,@object
+       .size   __svml_slog10_data_internal_avx512,384
+       .align 32
+__slog10_la_CoutTab:
+       .long   1121868800
+       .long   0
+       .long   0
+       .long   1121641104
+       .long   1004535808
+       .long   912917177
+       .long   1121413408
+       .long   1013055488
+       .long   3065901602
+       .long   1121185712
+       .long   1017839616
+       .long   3083361151
+       .long   1120958016
+       .long   1021673472
+       .long   929297206
+       .long   1120844168
+       .long   1023524864
+       .long   3077496589
+       .long   1120616472
+       .long   1025499136
+       .long   3070500046
+       .long   1120388776
+       .long   1027506176
+       .long   912271551
+       .long   1120274928
+       .long   1028521984
+       .long   927716856
+       .long   1120047232
+       .long   1030586368
+       .long   923757491
+       .long   1119933384
+       .long   1031634944
+       .long   3056752848
+       .long   1119705688
+       .long   1032775680
+       .long   917029265
+       .long   1119591840
+       .long   1033314304
+       .long   3065085585
+       .long   1119364144
+       .long   1034403840
+       .long   3064614024
+       .long   1119250296
+       .long   1034954752
+       .long   921091539
+       .long   1119136448
+       .long   1035513856
+       .long   3057436454
+       .long   1118908752
+       .long   1036644352
+       .long   922468856
+       .long   1118794904
+       .long   1037219840
+       .long   3049155845
+       .long   1118681056
+       .long   1037799424
+       .long   904301451
+       .long   1118567208
+       .long   1038385152
+       .long   908617625
+       .long   1118453360
+       .long   1038977024
+       .long   905362229
+       .long   1118225664
+       .long   1040179200
+       .long   3027570914
+       .long   1118111816
+       .long   1040488448
+       .long   882280038
+       .long   1117997968
+       .long   1040796672
+       .long   911375775
+       .long   1117884120
+       .long   1041108480
+       .long   904500572
+       .long   1117770272
+       .long   1041423872
+       .long   3057579304
+       .long   1117656424
+       .long   1041742336
+       .long   3053334705
+       .long   1117542576
+       .long   1042064384
+       .long   3053389931
+       .long   1117428728
+       .long   1042390016
+       .long   3051561465
+       .long   1117314880
+       .long   1042719232
+       .long   3011187895
+       .long   1117201032
+       .long   1043052544
+       .long   3059907089
+       .long   1117087184
+       .long   1043389440
+       .long   3057005374
+       .long   1116973336
+       .long   1043729920
+       .long   911932638
+       .long   1116859488
+       .long   1044075008
+       .long   892958461
+       .long   1116859488
+       .long   1044075008
+       .long   892958461
+       .long   1116745640
+       .long   1044424192
+       .long   3048660547
+       .long   1116631792
+       .long   1044777472
+       .long   3049032043
+       .long   1116517944
+       .long   1045134848
+       .long   906867152
+       .long   1116404096
+       .long   1045496832
+       .long   911484894
+       .long   1116404096
+       .long   1045496832
+       .long   911484894
+       .long   1116290248
+       .long   1045863424
+       .long   912580963
+       .long   1116176400
+       .long   1046235136
+       .long   3058440244
+       .long   1116062552
+       .long   1046610944
+       .long   895945194
+       .long   1116062552
+       .long   1046610944
+       .long   895945194
+       .long   1115948704
+       .long   1046991872
+       .long   904357324
+       .long   1115834856
+       .long   1047377920
+       .long   902293870
+       .long   1115721008
+       .long   1047769088
+       .long   907149878
+       .long   1115721008
+       .long   1047769088
+       .long   907149878
+       .long   1115529456
+       .long   1048165888
+       .long   3052029263
+       .long   1115301760
+       .long   1048567808
+       .long   3035959522
+       .long   1115301760
+       .long   1048567808
+       .long   3035959522
+       .long   1115074064
+       .long   1048775680
+       .long   892998645
+       .long   1115074064
+       .long   1048775680
+       .long   892998645
+       .long   1114846368
+       .long   1048982400
+       .long   881767775
+       .long   1114618672
+       .long   1049192064
+       .long   893839142
+       .long   1114618672
+       .long   1049192064
+       .long   893839142
+       .long   1114390976
+       .long   1049404800
+       .long   896498651
+       .long   1114390976
+       .long   1049404800
+       .long   896498651
+       .long   1114163280
+       .long   1049620736
+       .long   3033695903
+       .long   1114163280
+       .long   1049620736
+       .long   3033695903
+       .long   1113935584
+       .long   1049839872
+       .long   3029986056
+       .long   1113935584
+       .long   1049839872
+       .long   3029986056
+       .long   1113707888
+       .long   1050062336
+       .long   884671939
+       .long   1113707888
+       .long   1050062336
+       .long   884671939
+       .long   1113480192
+       .long   1050288256
+       .long   894707678
+       .long   1050279936
+       .long   964848148
+       .long   1207959616
+       .long   1174405120
+       .long   1002438656
+       .long   1400897536
+       .long   0
+       .long   1065353216
+       .long   1121868800
+       .long   3212771328
+       .long   3079888218
+       .long   870463078
+       .long   2957202361
+       .long   749987585
+       .long   2838272395
+       .long   631921661
+       .long   2720751022
+       .type   __slog10_la_CoutTab,@object
+       .size   __slog10_la_CoutTab,848
+       .align 4
+.L_2il0floatpacket.77:
+       .long   0x53800000
+       .type   .L_2il0floatpacket.77,@object
+       .size   .L_2il0floatpacket.77,4
+       .align 4
+.L_2il0floatpacket.78:
+       .long   0x3bc00000
+       .type   .L_2il0floatpacket.78,@object
+       .size   .L_2il0floatpacket.78,4
+       .align 4
+.L_2il0floatpacket.79:
+       .long   0x48000040
+       .type   .L_2il0floatpacket.79,@object
+       .size   .L_2il0floatpacket.79,4
+       .align 4
+.L_2il0floatpacket.80:
+       .long   0x46000000
+       .type   .L_2il0floatpacket.80,@object
+       .size   .L_2il0floatpacket.80,4
+       .align 4
+.L_2il0floatpacket.81:
+       .long   0x42de5c00
+       .type   .L_2il0floatpacket.81,@object
+       .size   .L_2il0floatpacket.81,4
+       .align 4
+.L_2il0floatpacket.82:
+       .long   0xbf7f0000
+       .type   .L_2il0floatpacket.82,@object
+       .size   .L_2il0floatpacket.82,4
+       .align 4
+.L_2il0floatpacket.83:
+       .long   0xb7935d5a
+       .type   .L_2il0floatpacket.83,@object
+       .size   .L_2il0floatpacket.83,4
+       .align 4
+.L_2il0floatpacket.84:
+       .long   0x33e23666
+       .type   .L_2il0floatpacket.84,@object
+       .size   .L_2il0floatpacket.84,4
+       .align 4
+.L_2il0floatpacket.85:
+       .long   0xb04353b9
+       .type   .L_2il0floatpacket.85,@object
+       .size   .L_2il0floatpacket.85,4
+       .align 4
+.L_2il0floatpacket.86:
+       .long   0x2cb3e701
+       .type   .L_2il0floatpacket.86,@object
+       .size   .L_2il0floatpacket.86,4
+       .align 4
+.L_2il0floatpacket.87:
+       .long   0xa92c998b
+       .type   .L_2il0floatpacket.87,@object
+       .size   .L_2il0floatpacket.87,4
+       .align 4
+.L_2il0floatpacket.88:
+       .long   0x25aa5bfd
+       .type   .L_2il0floatpacket.88,@object
+       .size   .L_2il0floatpacket.88,4
+       .align 4
+.L_2il0floatpacket.89:
+       .long   0xa22b5dae
+       .type   .L_2il0floatpacket.89,@object
+       .size   .L_2il0floatpacket.89,4
+       .align 4
+.L_2il0floatpacket.90:
+       .long   0x3e9a0000
+       .type   .L_2il0floatpacket.90,@object
+       .size   .L_2il0floatpacket.90,4
+       .align 4
+.L_2il0floatpacket.91:
+       .long   0x39826a14
+       .type   .L_2il0floatpacket.91,@object
+       .size   .L_2il0floatpacket.91,4
+       .align 4
+.L_2il0floatpacket.92:
+       .long   0xbf800000
+       .type   .L_2il0floatpacket.92,@object
+       .size   .L_2il0floatpacket.92,4
+       .align 4
+.L_2il0floatpacket.93:
+       .long   0x3f800000
+       .type   .L_2il0floatpacket.93,@object
+       .size   .L_2il0floatpacket.93,4
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_log1p_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_log1p_d_la.s
new file mode 100644 (file)
index 0000000..35bd417
--- /dev/null
@@ -0,0 +1,1134 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *  Compute 1+_VARG1 in high-low parts.  The low part will be
+ *  *  incorporated in the reduced argument (with proper scaling).
+ *  *  log(x) = VGETEXP(x)*log(2) + log(VGETMANT(x))
+ *  *       VGETEXP, VGETMANT will correctly treat special cases too (including denormals)
+ *  *   mx = VGETMANT(x) is in [1,2) for all x>=0
+ *  *   log(mx) = -log(RCP(mx)) + log(1 +(mx*RCP(mx)-1))
+ *  *      RCP(mx) is rounded to 4 fractional bits,
+ *  *      and the table lookup for log(RCP(mx)) is based on a small permute instruction
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_log1p8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_log1p8
+
+__svml_log1p8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   128+__svml_dlog1p_data_internal_avx512(%rip), %zmm7
+        vmovups   192+__svml_dlog1p_data_internal_avx512(%rip), %zmm14
+        vmovaps   %zmm0, %zmm9
+        vaddpd    {rn-sae}, %zmm9, %zmm7, %zmm11
+        vandpd    %zmm14, %zmm9, %zmm8
+
+/* compute 1+x as high, low parts */
+        vmaxpd    {sae}, %zmm9, %zmm7, %zmm10
+        vminpd    {sae}, %zmm9, %zmm7, %zmm12
+
+/* GetMant(x), normalized to [1,2) for x>=0, NaN for x<0 */
+        vgetmantpd $8, {sae}, %zmm11, %zmm6
+
+/* GetExp(x) */
+        vgetexppd {sae}, %zmm11, %zmm5
+        vsubpd    {rn-sae}, %zmm10, %zmm11, %zmm13
+
+/* DblRcp ~ 1/Mantissa */
+        vrcp14pd  %zmm6, %zmm15
+
+/* Start polynomial evaluation */
+        vmovups   320+__svml_dlog1p_data_internal_avx512(%rip), %zmm10
+        vmovups   448+__svml_dlog1p_data_internal_avx512(%rip), %zmm11
+
+/* Xl */
+        vsubpd    {rn-sae}, %zmm13, %zmm12, %zmm2
+        vxorpd    %zmm14, %zmm5, %zmm3
+
+/* round DblRcp to 4 fractional bits (RN mode, no Precision exception) */
+        vrndscalepd $88, {sae}, %zmm15, %zmm4
+        vmovups   576+__svml_dlog1p_data_internal_avx512(%rip), %zmm12
+        vmovups   512+__svml_dlog1p_data_internal_avx512(%rip), %zmm14
+        vmovups   704+__svml_dlog1p_data_internal_avx512(%rip), %zmm13
+
+/* Xl*2^(-Expon) */
+        vscalefpd {rn-sae}, %zmm3, %zmm2, %zmm1
+
+/* Reduced argument: R = DblRcp*(Mantissa+Xl) - 1 */
+        vfmsub213pd {rn-sae}, %zmm7, %zmm4, %zmm6
+        vmovups   __svml_dlog1p_data_internal_avx512(%rip), %zmm3
+
+/*
+ * Table lookup
+ * Prepare exponent correction: DblRcp<0.75?
+ */
+        vmovups   256+__svml_dlog1p_data_internal_avx512(%rip), %zmm2
+
+/* Prepare table index */
+        vpsrlq    $48, %zmm4, %zmm0
+        vfmadd231pd {rn-sae}, %zmm4, %zmm1, %zmm6
+        vmovups   384+__svml_dlog1p_data_internal_avx512(%rip), %zmm1
+        vcmppd    $17, {sae}, %zmm2, %zmm4, %k1
+        vcmppd    $4, {sae}, %zmm6, %zmm6, %k0
+        vfmadd231pd {rn-sae}, %zmm6, %zmm10, %zmm1
+        vmovups   640+__svml_dlog1p_data_internal_avx512(%rip), %zmm10
+        vfmadd231pd {rn-sae}, %zmm6, %zmm11, %zmm14
+        vmovups   832+__svml_dlog1p_data_internal_avx512(%rip), %zmm4
+        vpermt2pd 64+__svml_dlog1p_data_internal_avx512(%rip), %zmm0, %zmm3
+
+/* add 1 to Expon if DblRcp<0.75 */
+        vaddpd    {rn-sae}, %zmm7, %zmm5, %zmm5{%k1}
+
+/* R^2 */
+        vmulpd    {rn-sae}, %zmm6, %zmm6, %zmm0
+        vfmadd231pd {rn-sae}, %zmm6, %zmm12, %zmm10
+        vmovups   768+__svml_dlog1p_data_internal_avx512(%rip), %zmm12
+        vmulpd    {rn-sae}, %zmm0, %zmm0, %zmm15
+        vfmadd231pd {rn-sae}, %zmm6, %zmm13, %zmm12
+        vfmadd213pd {rn-sae}, %zmm14, %zmm0, %zmm1
+        kmovw     %k0, %edx
+        vfmadd213pd {rn-sae}, %zmm12, %zmm0, %zmm10
+
+/* polynomial */
+        vfmadd213pd {rn-sae}, %zmm10, %zmm15, %zmm1
+        vfmadd213pd {rn-sae}, %zmm6, %zmm0, %zmm1
+        vaddpd    {rn-sae}, %zmm1, %zmm3, %zmm6
+        vfmadd213pd {rn-sae}, %zmm6, %zmm4, %zmm5
+        vorpd     %zmm8, %zmm5, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm9, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dlog1p_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_log1p8,@function
+       .size   __svml_log1p8,.-__svml_log1p8
+..LN__svml_log1p8.0:
+
+.L_2__routine_start___svml_dlog1p_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dlog1p_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movsd     .L_2il0floatpacket.81(%rip), %xmm3
+        movsd     (%rdi), %xmm2
+        addsd     %xmm3, %xmm2
+        movsd     %xmm2, -16(%rsp)
+        movzwl    -10(%rsp), %edx
+        andl      $32752, %edx
+        cmpl      $32752, %edx
+        je        .LBL_2_12
+
+
+        movsd     %xmm2, -8(%rsp)
+        xorl      %ecx, %ecx
+        movzwl    -2(%rsp), %edx
+        testl     $32752, %edx
+        jne       .LBL_2_4
+
+
+        mulsd     1600+__dlog1p_la_CoutTab(%rip), %xmm2
+        movl      $-60, %ecx
+        movsd     %xmm2, -8(%rsp)
+
+.LBL_2_4:
+
+        movsd     1608+__dlog1p_la_CoutTab(%rip), %xmm0
+        comisd    %xmm0, %xmm2
+        jbe       .LBL_2_8
+
+
+        movaps    %xmm2, %xmm1
+        subsd     %xmm3, %xmm1
+        movsd     %xmm1, -16(%rsp)
+        andb      $127, -9(%rsp)
+        movsd     -16(%rsp), %xmm0
+        comisd    1592+__dlog1p_la_CoutTab(%rip), %xmm0
+        jbe       .LBL_2_7
+
+
+        movsd     %xmm2, -16(%rsp)
+        pxor      %xmm7, %xmm7
+        movzwl    -10(%rsp), %edi
+        lea       __dlog1p_la_CoutTab(%rip), %r10
+        andl      $-32753, %edi
+        addl      $16368, %edi
+        movw      %di, -10(%rsp)
+        movsd     -16(%rsp), %xmm4
+        movaps    %xmm4, %xmm1
+        movaps    %xmm4, %xmm2
+        movsd     1672+__dlog1p_la_CoutTab(%rip), %xmm8
+        movzwl    -2(%rsp), %edx
+        andl      $32752, %edx
+        addsd     1576+__dlog1p_la_CoutTab(%rip), %xmm1
+        addsd     1584+__dlog1p_la_CoutTab(%rip), %xmm2
+        movsd     %xmm1, -24(%rsp)
+        movl      -24(%rsp), %r8d
+        movsd     %xmm2, -24(%rsp)
+        andl      $127, %r8d
+        movsd     -24(%rsp), %xmm5
+        movsd     1560+__dlog1p_la_CoutTab(%rip), %xmm9
+        movsd     1568+__dlog1p_la_CoutTab(%rip), %xmm0
+        shrl      $4, %edx
+        subsd     1584+__dlog1p_la_CoutTab(%rip), %xmm5
+        lea       (%r8,%r8,2), %r9d
+        movsd     (%r10,%r9,8), %xmm6
+        lea       -1023(%rcx,%rdx), %ecx
+        cvtsi2sd  %ecx, %xmm7
+        subsd     %xmm5, %xmm4
+        mulsd     %xmm6, %xmm5
+        mulsd     %xmm7, %xmm9
+        subsd     %xmm3, %xmm5
+        mulsd     %xmm4, %xmm6
+        mulsd     %xmm0, %xmm7
+        addsd     8(%r10,%r9,8), %xmm9
+        addsd     16(%r10,%r9,8), %xmm7
+        addsd     %xmm5, %xmm9
+        addsd     %xmm6, %xmm7
+        movaps    %xmm5, %xmm3
+        addsd     %xmm6, %xmm3
+        mulsd     %xmm3, %xmm8
+        addsd     1664+__dlog1p_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm8
+        addsd     1656+__dlog1p_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm8
+        addsd     1648+__dlog1p_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm8
+        addsd     1640+__dlog1p_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm8
+        addsd     1632+__dlog1p_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm8
+        addsd     1624+__dlog1p_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm8
+        mulsd     %xmm3, %xmm8
+        addsd     %xmm7, %xmm8
+        addsd     %xmm8, %xmm9
+        movsd     %xmm9, (%rsi)
+        ret
+
+.LBL_2_7:
+
+        movsd     1672+__dlog1p_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     1664+__dlog1p_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     1656+__dlog1p_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     1648+__dlog1p_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     1640+__dlog1p_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     1632+__dlog1p_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     1624+__dlog1p_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     %xmm1, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_8:
+
+        ucomisd   %xmm0, %xmm2
+        jp        .LBL_2_9
+        je        .LBL_2_11
+
+.LBL_2_9:
+
+        divsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        movl      $1, %eax
+
+
+        ret
+
+.LBL_2_11:
+
+        movsd     1616+__dlog1p_la_CoutTab(%rip), %xmm1
+        movl      $2, %eax
+        xorps     .L_2il0floatpacket.80(%rip), %xmm1
+        divsd     %xmm0, %xmm1
+        movsd     %xmm1, (%rsi)
+        ret
+
+.LBL_2_12:
+
+        movb      -9(%rsp), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_14
+
+.LBL_2_13:
+
+        mulsd     %xmm2, %xmm2
+        movsd     %xmm2, (%rsi)
+        ret
+
+.LBL_2_14:
+
+        testl     $1048575, -12(%rsp)
+        jne       .LBL_2_13
+
+
+        cmpl      $0, -16(%rsp)
+        jne       .LBL_2_13
+
+
+        movsd     1608+__dlog1p_la_CoutTab(%rip), %xmm0
+        movl      $1, %eax
+        divsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dlog1p_cout_rare_internal,@function
+       .size   __svml_dlog1p_cout_rare_internal,.-__svml_dlog1p_cout_rare_internal
+..LN__svml_dlog1p_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dlog1p_data_internal_avx512:
+       .long   0
+       .long   0
+       .long   3222364838
+       .long   3215919664
+       .long   1848308454
+       .long   3216910087
+       .long   1890030548
+       .long   3217424176
+       .long   3348797986
+       .long   3217854455
+       .long   2880153102
+       .long   3218171740
+       .long   3256639170
+       .long   3218366859
+       .long   4139503623
+       .long   3218553303
+       .long   288676754
+       .long   1070754146
+       .long   1823716217
+       .long   1070569756
+       .long   1015732707
+       .long   1070240749
+       .long   1800682930
+       .long   1069924160
+       .long   2183652476
+       .long   1069619086
+       .long   1566132617
+       .long   1069101918
+       .long   3047045639
+       .long   1068533144
+       .long   2313634884
+       .long   1067467101
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .type   __svml_dlog1p_data_internal_avx512,@object
+       .size   __svml_dlog1p_data_internal_avx512,1152
+       .align 32
+__dlog1p_la_CoutTab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1072660480
+       .long   1486880768
+       .long   1066410070
+       .long   1813744607
+       .long   3179892593
+       .long   0
+       .long   1072629760
+       .long   377487360
+       .long   1067416219
+       .long   919019713
+       .long   3179241129
+       .long   0
+       .long   1072599040
+       .long   1513619456
+       .long   1067944025
+       .long   874573033
+       .long   3178512940
+       .long   0
+       .long   1072570368
+       .long   3221749760
+       .long   1068427825
+       .long   4181665006
+       .long   3177478212
+       .long   0
+       .long   1072541696
+       .long   4162322432
+       .long   1068708823
+       .long   627020255
+       .long   1028629941
+       .long   0
+       .long   1072513024
+       .long   183107584
+       .long   1068957907
+       .long   2376703469
+       .long   1030233118
+       .long   0
+       .long   1072486400
+       .long   1053425664
+       .long   1069192557
+       .long   696277142
+       .long   1030474863
+       .long   0
+       .long   1072459776
+       .long   3996123136
+       .long   1069430535
+       .long   2630798680
+       .long   1028792016
+       .long   0
+       .long   1072435200
+       .long   3452764160
+       .long   1069600382
+       .long   624954044
+       .long   3177101741
+       .long   0
+       .long   1072409600
+       .long   207650816
+       .long   1069717971
+       .long   3272735636
+       .long   3175176575
+       .long   0
+       .long   1072386048
+       .long   2647228416
+       .long   1069827627
+       .long   3594228712
+       .long   1029303785
+       .long   0
+       .long   1072362496
+       .long   2712010752
+       .long   1069938736
+       .long   3653242769
+       .long   3176839013
+       .long   0
+       .long   1072338944
+       .long   374439936
+       .long   1070051337
+       .long   4072775574
+       .long   3176577495
+       .long   0
+       .long   1072316416
+       .long   3707174912
+       .long   1070160474
+       .long   1486946159
+       .long   1023930920
+       .long   0
+       .long   1072294912
+       .long   1443954688
+       .long   1070265993
+       .long   293532967
+       .long   3176278277
+       .long   0
+       .long   1072273408
+       .long   127762432
+       .long   1070372856
+       .long   3404145447
+       .long   3177023955
+       .long   0
+       .long   1072252928
+       .long   2053832704
+       .long   1070475911
+       .long   1575076358
+       .long   1029048544
+       .long   0
+       .long   1072232448
+       .long   3194093568
+       .long   1070580248
+       .long   1864169120
+       .long   1026866084
+       .long   0
+       .long   1072212992
+       .long   3917201408
+       .long   1070638340
+       .long   2362145246
+       .long   3175606197
+       .long   0
+       .long   1072193536
+       .long   3417112576
+       .long   1070689116
+       .long   70087871
+       .long   3174183577
+       .long   0
+       .long   1072175104
+       .long   4226777088
+       .long   1070737793
+       .long   1620410586
+       .long   3174700065
+       .long   0
+       .long   1072156672
+       .long   3168870400
+       .long   1070787042
+       .long   311238082
+       .long   1025781772
+       .long   0
+       .long   1072139264
+       .long   2150580224
+       .long   1070834092
+       .long   1664262457
+       .long   3175299224
+       .long   0
+       .long   1072120832
+       .long   4095672320
+       .long   1070884491
+       .long   1657121015
+       .long   3174674199
+       .long   0
+       .long   1072104448
+       .long   2595577856
+       .long   1070929805
+       .long   2014006823
+       .long   3175423830
+       .long   0
+       .long   1072087040
+       .long   3747176448
+       .long   1070978493
+       .long   144991708
+       .long   3171552042
+       .long   0
+       .long   1072070656
+       .long   1050435584
+       .long   1071024840
+       .long   3386227432
+       .long   1027876916
+       .long   0
+       .long   1072055296
+       .long   255516672
+       .long   1071068760
+       .long   2637594316
+       .long   1028049573
+       .long   0
+       .long   1072038912
+       .long   1640783872
+       .long   1071116120
+       .long   893247007
+       .long   1028452162
+       .long   0
+       .long   1072023552
+       .long   2940411904
+       .long   1071161011
+       .long   813240633
+       .long   1027664048
+       .long   0
+       .long   1072009216
+       .long   882917376
+       .long   1071203348
+       .long   2376597551
+       .long   3175828767
+       .long   0
+       .long   1071993856
+       .long   213966848
+       .long   1071249188
+       .long   2977204125
+       .long   1028350609
+       .long   0
+       .long   1071979520
+       .long   2921504768
+       .long   1071292428
+       .long   523218347
+       .long   1028007004
+       .long   0
+       .long   1071965184
+       .long   3186655232
+       .long   1071336119
+       .long   2352907891
+       .long   1026967097
+       .long   0
+       .long   1071951872
+       .long   2653364224
+       .long   1071377101
+       .long   2453418583
+       .long   3174349512
+       .long   0
+       .long   1071938560
+       .long   3759783936
+       .long   1071418487
+       .long   3685870403
+       .long   3175415611
+       .long   0
+       .long   1071925248
+       .long   2468364288
+       .long   1071460286
+       .long   1578908842
+       .long   3175510517
+       .long   0
+       .long   1071911936
+       .long   81903616
+       .long   1071502506
+       .long   770710269
+       .long   1026742353
+       .long   0
+       .long   1071899648
+       .long   2799321088
+       .long   1071541858
+       .long   3822266185
+       .long   1028434427
+       .long   0
+       .long   1071886336
+       .long   2142265344
+       .long   1071584911
+       .long   175901806
+       .long   3173871540
+       .long   0
+       .long   1071874048
+       .long   2944024576
+       .long   1071625048
+       .long   2747360403
+       .long   1027672159
+       .long   0
+       .long   1071862784
+       .long   3434301440
+       .long   1071653426
+       .long   4194662196
+       .long   3173893003
+       .long   0
+       .long   1071850496
+       .long   1547755520
+       .long   1071673870
+       .long   4248764681
+       .long   3172759087
+       .long   0
+       .long   1071839232
+       .long   4246986752
+       .long   1071692786
+       .long   2840205638
+       .long   3174430911
+       .long   0
+       .long   1071826944
+       .long   3418390528
+       .long   1071713619
+       .long   3041880823
+       .long   1025440860
+       .long   0
+       .long   1071816704
+       .long   4143093760
+       .long   1071731139
+       .long   2727587401
+       .long   3173965207
+       .long   0
+       .long   1071805440
+       .long   3121326080
+       .long   1071750582
+       .long   3173887692
+       .long   3174190163
+       .long   0
+       .long   1071794176
+       .long   1852893184
+       .long   1071770207
+       .long   3951060252
+       .long   1027348295
+       .long   0
+       .long   1071783936
+       .long   3636379648
+       .long   1071788208
+       .long   1684924001
+       .long   3174777086
+       .long   0
+       .long   1071773696
+       .long   516505600
+       .long   1071806366
+       .long   429181199
+       .long   3173211033
+       .long   0
+       .long   1071763456
+       .long   4186185728
+       .long   1071824681
+       .long   2044904577
+       .long   3174967132
+       .long   0
+       .long   1071753216
+       .long   877596672
+       .long   1071843159
+       .long   1396318105
+       .long   3173959727
+       .long   0
+       .long   1071742976
+       .long   2912784384
+       .long   1071861800
+       .long   448136789
+       .long   3174814192
+       .long   0
+       .long   1071733760
+       .long   3722825728
+       .long   1071878720
+       .long   714165913
+       .long   3173439560
+       .long   0
+       .long   1071723520
+       .long   2522374144
+       .long   1071897682
+       .long   3227240353
+       .long   3173394323
+       .long   0
+       .long   1071714304
+       .long   4165410816
+       .long   1071914895
+       .long   1365684961
+       .long   3174365060
+       .long   0
+       .long   1071705088
+       .long   3477135360
+       .long   1071932251
+       .long   368482985
+       .long   3174140821
+       .long   0
+       .long   1071695872
+       .long   2079455232
+       .long   1071949752
+       .long   1320576317
+       .long   1026822714
+       .long   0
+       .long   1071687680
+       .long   851795968
+       .long   1071965432
+       .long   3702467026
+       .long   1025224125
+       .long   0
+       .long   1071678464
+       .long   647743488
+       .long   1071983213
+       .long   772992109
+       .long   3174038459
+       .long   0
+       .long   1071670272
+       .long   26537984
+       .long   1071999146
+       .long   2360214276
+       .long   3174861275
+       .long   0
+       .long   1071661056
+       .long   1547061248
+       .long   1072017216
+       .long   2886781435
+       .long   1026423395
+       .long   0
+       .long   1071652864
+       .long   2854492160
+       .long   1072033410
+       .long   215631550
+       .long   1025638968
+       .long   0
+       .long   1071644672
+       .long   4277811200
+       .long   1072049730
+       .long   2479318832
+       .long   1026487127
+       .long   4277811200
+       .long   1072049730
+       .long   2479318832
+       .long   1026487127
+       .long   64
+       .long   1120927744
+       .long   0
+       .long   1094713344
+       .long   0
+       .long   1065615360
+       .long   0
+       .long   1135607808
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   3219128320
+       .long   1431655955
+       .long   1070945621
+       .long   610
+       .long   3218079744
+       .long   2545118337
+       .long   1070176665
+       .long   1378399119
+       .long   3217380693
+       .long   612435357
+       .long   1069697472
+       .long   94536557
+       .long   3217031348
+       .type   __dlog1p_la_CoutTab,@object
+       .size   __dlog1p_la_CoutTab,1680
+       .align 16
+.L_2il0floatpacket.80:
+       .long   0x00000000,0x80000000,0x00000000,0x00000000
+       .type   .L_2il0floatpacket.80,@object
+       .size   .L_2il0floatpacket.80,16
+       .align 8
+.L_2il0floatpacket.81:
+       .long   0x00000000,0x3ff00000
+       .type   .L_2il0floatpacket.81,@object
+       .size   .L_2il0floatpacket.81,8
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_log1p_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_log1p_s_la.s
new file mode 100644 (file)
index 0000000..5d1d577
--- /dev/null
@@ -0,0 +1,1652 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+
+       .text
+.L_2__routine_start___svml_log1pf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_log1pf16
+
+__svml_log1pf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovups   1984+__svml_slog1p_data_internal(%rip), %zmm2
+
+/* reduction: compute r,n */
+        vmovups   2688+__svml_slog1p_data_internal(%rip), %zmm12
+        vmovups   1088+__svml_slog1p_data_internal(%rip), %zmm4
+        vmovaps   %zmm0, %zmm3
+
+/* compute 1+x as high, low parts */
+        vmaxps    {sae}, %zmm3, %zmm2, %zmm5
+        vminps    {sae}, %zmm3, %zmm2, %zmm7
+        vandnps   %zmm3, %zmm4, %zmm1
+        vpternlogd $255, %zmm4, %zmm4, %zmm4
+        vaddps    {rn-sae}, %zmm7, %zmm5, %zmm9
+        vpsubd    %zmm12, %zmm9, %zmm10
+        vsubps    {rn-sae}, %zmm9, %zmm5, %zmm6
+
+/* check argument value ranges */
+        vpaddd    2560+__svml_slog1p_data_internal(%rip), %zmm9, %zmm8
+        vpsrad    $23, %zmm10, %zmm13
+        vmovups   2304+__svml_slog1p_data_internal(%rip), %zmm9
+        vpcmpd    $5, 2624+__svml_slog1p_data_internal(%rip), %zmm8, %k1
+        vpslld    $23, %zmm13, %zmm14
+        vaddps    {rn-sae}, %zmm7, %zmm6, %zmm15
+        vcvtdq2ps {rn-sae}, %zmm13, %zmm0
+        vpsubd    %zmm14, %zmm2, %zmm13
+        vmovups   2496+__svml_slog1p_data_internal(%rip), %zmm7
+        vmovups   2048+__svml_slog1p_data_internal(%rip), %zmm14
+        vmulps    {rn-sae}, %zmm13, %zmm15, %zmm6
+        vpandd    2752+__svml_slog1p_data_internal(%rip), %zmm10, %zmm11
+        vpaddd    %zmm12, %zmm11, %zmm5
+        vmovups   2240+__svml_slog1p_data_internal(%rip), %zmm10
+        vmovups   2176+__svml_slog1p_data_internal(%rip), %zmm11
+        vmovups   2112+__svml_slog1p_data_internal(%rip), %zmm12
+
+/* polynomial evaluation */
+        vsubps    {rn-sae}, %zmm2, %zmm5, %zmm2
+        vaddps    {rn-sae}, %zmm6, %zmm2, %zmm15
+        vmovups   2432+__svml_slog1p_data_internal(%rip), %zmm2
+        vfmadd231ps {rn-sae}, %zmm15, %zmm7, %zmm2
+        vpandnd   %zmm8, %zmm8, %zmm4{%k1}
+        vmovups   2368+__svml_slog1p_data_internal(%rip), %zmm8
+
+/* combine and get argument value range mask */
+        vptestmd  %zmm4, %zmm4, %k0
+        vfmadd213ps {rn-sae}, %zmm8, %zmm15, %zmm2
+        kmovw     %k0, %edx
+        vfmadd213ps {rn-sae}, %zmm9, %zmm15, %zmm2
+        vfmadd213ps {rn-sae}, %zmm10, %zmm15, %zmm2
+        vfmadd213ps {rn-sae}, %zmm11, %zmm15, %zmm2
+        vfmadd213ps {rn-sae}, %zmm12, %zmm15, %zmm2
+        vfmadd213ps {rn-sae}, %zmm14, %zmm15, %zmm2
+        vmulps    {rn-sae}, %zmm15, %zmm2, %zmm4
+        vfmadd213ps {rn-sae}, %zmm15, %zmm15, %zmm4
+
+/* final reconstruction */
+        vmovups   2816+__svml_slog1p_data_internal(%rip), %zmm15
+        vfmadd213ps {rn-sae}, %zmm4, %zmm15, %zmm0
+        vorps     %zmm1, %zmm0, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm3, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_slog1p_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_log1pf16,@function
+       .size   __svml_log1pf16,.-__svml_log1pf16
+..LN__svml_log1pf16.0:
+
+.L_2__routine_start___svml_slog1p_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_slog1p_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movss     .L_2il0floatpacket.90(%rip), %xmm1
+        xorb      %r8b, %r8b
+        movss     (%rdi), %xmm5
+        addss     %xmm1, %xmm5
+        movss     %xmm5, -20(%rsp)
+        movzwl    -18(%rsp), %edx
+        andl      $32640, %edx
+        cmpl      $32640, %edx
+        je        .LBL_2_15
+
+
+        movss     %xmm5, -16(%rsp)
+        xorl      %ecx, %ecx
+        movzwl    -14(%rsp), %edx
+        testl     $32640, %edx
+        jne       .LBL_2_4
+
+
+        mulss     .L_2il0floatpacket.75(%rip), %xmm5
+        movb      $1, %r8b
+        movss     %xmm5, -16(%rsp)
+        movl      $-40, %ecx
+
+.LBL_2_4:
+
+        pxor      %xmm3, %xmm3
+        comiss    %xmm3, %xmm5
+        jbe       .LBL_2_10
+
+
+        movaps    %xmm5, %xmm2
+        subss     %xmm1, %xmm2
+        movss     %xmm2, -20(%rsp)
+        andb      $127, -17(%rsp)
+        movss     -20(%rsp), %xmm0
+        comiss    .L_2il0floatpacket.76(%rip), %xmm0
+        jbe       .LBL_2_9
+
+
+        movzwl    -14(%rsp), %edx
+        pxor      %xmm6, %xmm6
+        andl      $32640, %edx
+        shrl      $7, %edx
+        lea       -127(%rcx,%rdx), %ecx
+        cvtsi2ss  %ecx, %xmm6
+        cmpb      $1, %r8b
+        je        .LBL_2_13
+
+
+        movss     .L_2il0floatpacket.86(%rip), %xmm4
+        movss     .L_2il0floatpacket.87(%rip), %xmm0
+        mulss     %xmm6, %xmm4
+        mulss     %xmm0, %xmm6
+
+.LBL_2_8:
+
+        movss     %xmm5, -20(%rsp)
+        movaps    %xmm4, %xmm9
+        movzwl    -18(%rsp), %edx
+        lea       __slog1p_la_CoutTab(%rip), %r8
+        andl      $-32641, %edx
+        addl      $16256, %edx
+        movw      %dx, -18(%rsp)
+        movss     -20(%rsp), %xmm8
+        movaps    %xmm8, %xmm2
+        movss     .L_2il0floatpacket.89(%rip), %xmm7
+        addss     .L_2il0floatpacket.88(%rip), %xmm2
+        movss     %xmm2, -24(%rsp)
+        movl      -24(%rsp), %ecx
+        andl      $127, %ecx
+        lea       (%rcx,%rcx,2), %edi
+        movss     4(%r8,%rdi,4), %xmm5
+        movss     (%r8,%rdi,4), %xmm0
+        addss     %xmm5, %xmm9
+        addss     8(%r8,%rdi,4), %xmm6
+        movaps    %xmm9, %xmm3
+        subss     %xmm4, %xmm3
+        movss     %xmm3, -24(%rsp)
+        movss     -24(%rsp), %xmm4
+        subss     %xmm4, %xmm5
+        movss     %xmm5, -24(%rsp)
+        movss     -24(%rsp), %xmm10
+        addss     %xmm6, %xmm10
+        movaps    %xmm7, %xmm6
+        addss     %xmm8, %xmm6
+        movss     %xmm6, -24(%rsp)
+        movss     -24(%rsp), %xmm12
+        subss     %xmm7, %xmm12
+        subss     %xmm12, %xmm8
+        mulss     %xmm0, %xmm12
+        subss     %xmm1, %xmm12
+        mulss     %xmm8, %xmm0
+        movaps    %xmm0, %xmm15
+        movaps    %xmm12, %xmm2
+        addss     %xmm10, %xmm15
+        addss     %xmm9, %xmm12
+        addss     %xmm0, %xmm2
+        movaps    %xmm15, %xmm1
+        movaps    %xmm12, %xmm13
+        subss     %xmm10, %xmm1
+        addss     %xmm15, %xmm13
+        movss     %xmm1, -24(%rsp)
+        movss     -24(%rsp), %xmm11
+        subss     %xmm11, %xmm0
+        movss     %xmm0, -24(%rsp)
+        movss     -24(%rsp), %xmm0
+        movss     %xmm13, (%rsi)
+        subss     %xmm12, %xmm13
+        movss     .L_2il0floatpacket.83(%rip), %xmm12
+        mulss     %xmm2, %xmm12
+        movss     %xmm13, -24(%rsp)
+        movss     -24(%rsp), %xmm14
+        addss     .L_2il0floatpacket.82(%rip), %xmm12
+        subss     %xmm14, %xmm15
+        mulss     %xmm2, %xmm12
+        movss     %xmm15, -24(%rsp)
+        movss     -24(%rsp), %xmm1
+        addss     .L_2il0floatpacket.81(%rip), %xmm12
+        mulss     %xmm2, %xmm12
+        addss     .L_2il0floatpacket.80(%rip), %xmm12
+        mulss     %xmm2, %xmm12
+        addss     .L_2il0floatpacket.79(%rip), %xmm12
+        mulss     %xmm2, %xmm12
+        addss     .L_2il0floatpacket.78(%rip), %xmm12
+        mulss     %xmm2, %xmm12
+        addss     .L_2il0floatpacket.77(%rip), %xmm12
+        mulss     %xmm2, %xmm12
+        mulss     %xmm2, %xmm12
+        addss     %xmm12, %xmm0
+        addss     %xmm0, %xmm1
+        movss     %xmm1, -24(%rsp)
+        movss     -24(%rsp), %xmm3
+        addss     (%rsi), %xmm3
+        movss     %xmm3, (%rsi)
+        ret
+
+.LBL_2_9:
+
+        movss     .L_2il0floatpacket.83(%rip), %xmm0
+        mulss     %xmm2, %xmm0
+        addss     .L_2il0floatpacket.82(%rip), %xmm0
+        mulss     %xmm2, %xmm0
+        addss     .L_2il0floatpacket.81(%rip), %xmm0
+        mulss     %xmm2, %xmm0
+        addss     .L_2il0floatpacket.80(%rip), %xmm0
+        mulss     %xmm2, %xmm0
+        addss     .L_2il0floatpacket.79(%rip), %xmm0
+        mulss     %xmm2, %xmm0
+        addss     .L_2il0floatpacket.78(%rip), %xmm0
+        mulss     %xmm2, %xmm0
+        addss     .L_2il0floatpacket.77(%rip), %xmm0
+        mulss     %xmm2, %xmm0
+        mulss     %xmm2, %xmm0
+        addss     %xmm2, %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_10:
+
+        ucomiss   %xmm3, %xmm5
+        jp        .LBL_2_11
+        je        .LBL_2_14
+
+.LBL_2_11:
+
+        divss     %xmm3, %xmm3
+        movss     %xmm3, (%rsi)
+        movl      $1, %eax
+
+
+        ret
+
+.LBL_2_13:
+
+        movss     .L_2il0floatpacket.85(%rip), %xmm0
+        mulss     %xmm0, %xmm6
+        movaps    %xmm6, %xmm4
+        movaps    %xmm3, %xmm6
+        jmp       .LBL_2_8
+
+.LBL_2_14:
+
+        movss     .L_2il0floatpacket.84(%rip), %xmm0
+        movl      $2, %eax
+        divss     %xmm3, %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_15:
+
+        movb      -17(%rsp), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_17
+
+.LBL_2_16:
+
+        mulss     %xmm5, %xmm5
+        movss     %xmm5, (%rsi)
+        ret
+
+.LBL_2_17:
+
+        testl     $8388607, -20(%rsp)
+        jne       .LBL_2_16
+
+
+        movl      $1, %eax
+        pxor      %xmm1, %xmm1
+        pxor      %xmm0, %xmm0
+        divss     %xmm0, %xmm1
+        movss     %xmm1, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_slog1p_cout_rare_internal,@function
+       .size   __svml_slog1p_cout_rare_internal,.-__svml_slog1p_cout_rare_internal
+..LN__svml_slog1p_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_slog1p_data_internal:
+       .long   3266227256
+       .long   3107766024
+       .long   3266228276
+       .long   3107776882
+       .long   3266229284
+       .long   3109949545
+       .long   3266230292
+       .long   3108055846
+       .long   3266231292
+       .long   3106351937
+       .long   3266232276
+       .long   3109092567
+       .long   3266233260
+       .long   3107948216
+       .long   3266234236
+       .long   3107170960
+       .long   3266235204
+       .long   3106817287
+       .long   3266236164
+       .long   3106942449
+       .long   3266237116
+       .long   3107600489
+       .long   3266238060
+       .long   3108844279
+       .long   3266239004
+       .long   3106531253
+       .long   3266239932
+       .long   3109100650
+       .long   3266240860
+       .long   3108213420
+       .long   3266241780
+       .long   3108112381
+       .long   3266242692
+       .long   3108845034
+       .long   3266243604
+       .long   3106263589
+       .long   3266244500
+       .long   3108802209
+       .long   3266245396
+       .long   3108116909
+       .long   3266246284
+       .long   3108445707
+       .long   3266247164
+       .long   3109831435
+       .long   3266248044
+       .long   3108121760
+       .long   3266248916
+       .long   3107552123
+       .long   3266249780
+       .long   3108162844
+       .long   3266250644
+       .long   3105799146
+       .long   3266251492
+       .long   3108888393
+       .long   3266252340
+       .long   3109079979
+       .long   3266253188
+       .long   3106411173
+       .long   3266254020
+       .long   3109307139
+       .long   3266254852
+       .long   3109415127
+       .long   3266255684
+       .long   3106770317
+       .long   3266256500
+       .long   3109795834
+       .long   3266257324
+       .long   3105942641
+       .long   3266258132
+       .long   3107826892
+       .long   3266258940
+       .long   3107092610
+       .long   3266259740
+       .long   3107966131
+       .long   3266260540
+       .long   3106284596
+       .long   3266261332
+       .long   3106273188
+       .long   3266262116
+       .long   3107962226
+       .long   3266262900
+       .long   3107187186
+       .long   3266263676
+       .long   3108171617
+       .long   3266264452
+       .long   3106749947
+       .long   3266265220
+       .long   3107144703
+       .long   3266265980
+       .long   3109383615
+       .long   3266266740
+       .long   3109299629
+       .long   3266267500
+       .long   3106919521
+       .long   3266268252
+       .long   3106463913
+       .long   3266268996
+       .long   3107958670
+       .long   3266269740
+       .long   3107234917
+       .long   3266270476
+       .long   3108511954
+       .long   3266271212
+       .long   3107620056
+       .long   3266271940
+       .long   3108777693
+       .long   3266272668
+       .long   3107814325
+       .long   3266273388
+       .long   3108947630
+       .long   3266274108
+       .long   3108006290
+       .long   3266274820
+       .long   3109207222
+       .long   3266275532
+       .long   3108378366
+       .long   3266276236
+       .long   3109735912
+       .long   3266276940
+       .long   3109107087
+       .long   3266277644
+       .long   3106513079
+       .long   3266278340
+       .long   3106169044
+       .long   3266279028
+       .long   3108095503
+       .long   3266279716
+       .long   3108118349
+       .long   3266280404
+       .long   3106257463
+       .long   3266281084
+       .long   3106726720
+       .long   3266281756
+       .long   3109545389
+       .long   3266282436
+       .long   3106343833
+       .long   3266283100
+       .long   3109723642
+       .long   3266283772
+       .long   3107120300
+       .long   3266284436
+       .long   3106940529
+       .long   3266285092
+       .long   3109202170
+       .long   3266285748
+       .long   3109728494
+       .long   3266286404
+       .long   3108536808
+       .long   3266287052
+       .long   3109838471
+       .long   3266287700
+       .long   3109455977
+       .long   3266288348
+       .long   3107405879
+       .long   3266288988
+       .long   3107898790
+       .long   3266289628
+       .long   3106756477
+       .long   3266290260
+       .long   3108189081
+       .long   3266290892
+       .long   3108017907
+       .long   3266291524
+       .long   3106258339
+       .long   3266292148
+       .long   3107119845
+       .long   3266292772
+       .long   3106423069
+       .long   3266293388
+       .long   3108377050
+       .long   3266294004
+       .long   3108802011
+       .long   3266294620
+       .long   3107712277
+       .long   3266295228
+       .long   3109316274
+       .long   3266295836
+       .long   3109433625
+       .long   3266296444
+       .long   3108078064
+       .long   3266297044
+       .long   3109457438
+       .long   3266297644
+       .long   3109390801
+       .long   3266298244
+       .long   3107891329
+       .long   3266298836
+       .long   3109166323
+       .long   3266299428
+       .long   3109034299
+       .long   3266300020
+       .long   3107507904
+       .long   3266300604
+       .long   3108793919
+       .long   3266301188
+       .long   3108710352
+       .long   3266301772
+       .long   3107269350
+       .long   3266302348
+       .long   3108677203
+       .long   3266302924
+       .long   3108751436
+       .long   3266303500
+       .long   3107503720
+       .long   3266304068
+       .long   3109139881
+       .long   3266304636
+       .long   3109476985
+       .long   3266305204
+       .long   3108526254
+       .long   3266305772
+       .long   3106298768
+       .long   3266306332
+       .long   3106999765
+       .long   3266306892
+       .long   3106445739
+       .long   3266307444
+       .long   3108841650
+       .long   3266308004
+       .long   3105809415
+       .long   3266308548
+       .long   3109942336
+       .long   3266309100
+       .long   3108667760
+       .long   3266309652
+       .long   3106190122
+       .long   3266310196
+       .long   3106713732
+       .long   3266310740
+       .long   3106054165
+       .long   3266311276
+       .long   3108415484
+       .long   3266311812
+       .long   3109613023
+       .long   3266312348
+       .long   3109656301
+       .long   3266312884
+       .long   3108554723
+       .long   3266313420
+       .long   3106317576
+       .long   3266313948
+       .long   3107148341
+       .long   3266314476
+       .long   3106861780
+       .long   3266314996
+       .long   3109661153
+       .long   3266315524
+       .long   3107166702
+       .long   3266316044
+       .long   3107775778
+       .long   3266316564
+       .long   3107302717
+       .long   3266317076
+       .long   3109950361
+       .long   3266317596
+       .long   3107338539
+       .long   3266318108
+       .long   3107864196
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   964689920
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   2063597568
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   1051372345
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   3204448310
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   998244352
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   3212836863
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   2055208960
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   4294967040
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   1060205056
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   901758464
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   1051372180
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   3196061070
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   1045225872
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   3190336823
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   1041222418
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   3189430755
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   1041073389
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   16777216
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   25165824
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   1059760811
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   8388607
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   2139095040
+       .long   4286578688
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .long   1065353216
+       .long   3212836864
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .long   0
+       .long   2147483648
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .byte   0
+       .type   __svml_slog1p_data_internal,@object
+       .size   __svml_slog1p_data_internal,3072
+       .align 32
+__slog1p_la_CoutTab:
+       .long   1065353216
+       .long   0
+       .long   0
+       .long   1065091072
+       .long   1015087104
+       .long   900509991
+       .long   1064828928
+       .long   1023541248
+       .long   925811956
+       .long   1064566784
+       .long   1027915776
+       .long   3084221144
+       .long   1064304640
+       .long   1032073216
+       .long   3066991812
+       .long   1064173568
+       .long   1033195520
+       .long   882149603
+       .long   1063911424
+       .long   1035468800
+       .long   928189163
+       .long   1063649280
+       .long   1037783040
+       .long   927501741
+       .long   1063518208
+       .long   1038958592
+       .long   3076037756
+       .long   1063256064
+       .long   1040759808
+       .long   904405630
+       .long   1063124992
+       .long   1041361920
+       .long   3052231524
+       .long   1062862848
+       .long   1042581504
+       .long   922094799
+       .long   1062731776
+       .long   1043201024
+       .long   3070120623
+       .long   1062469632
+       .long   1044455424
+       .long   3069864633
+       .long   1062338560
+       .long   1045091328
+       .long   3063188516
+       .long   1062207488
+       .long   1045733376
+       .long   3054902185
+       .long   1061945344
+       .long   1047035904
+       .long   920635797
+       .long   1061814272
+       .long   1047697408
+       .long   904920689
+       .long   1061683200
+       .long   1048365056
+       .long   912483742
+       .long   1061552128
+       .long   1048807936
+       .long   3052664405
+       .long   1061421056
+       .long   1049148416
+       .long   912794238
+       .long   1061158912
+       .long   1049840384
+       .long   889474359
+       .long   1061027840
+       .long   1050191872
+       .long   3059868362
+       .long   1060896768
+       .long   1050546944
+       .long   3059256525
+       .long   1060765696
+       .long   1050905600
+       .long   912008988
+       .long   1060634624
+       .long   1051268352
+       .long   912290698
+       .long   1060503552
+       .long   1051635200
+       .long   3037211048
+       .long   1060372480
+       .long   1052005888
+       .long   906226119
+       .long   1060241408
+       .long   1052380928
+       .long   3052480305
+       .long   1060110336
+       .long   1052760064
+       .long   3048768765
+       .long   1059979264
+       .long   1053143552
+       .long   3049975450
+       .long   1059848192
+       .long   1053531392
+       .long   894485718
+       .long   1059717120
+       .long   1053923840
+       .long   897598623
+       .long   1059586048
+       .long   1054320896
+       .long   907355277
+       .long   1059586048
+       .long   1054320896
+       .long   907355277
+       .long   1059454976
+       .long   1054722816
+       .long   881705073
+       .long   1059323904
+       .long   1055129600
+       .long   3049723733
+       .long   1059192832
+       .long   1055541248
+       .long   890353599
+       .long   1059061760
+       .long   1055958016
+       .long   908173938
+       .long   1059061760
+       .long   1055958016
+       .long   908173938
+       .long   1058930688
+       .long   1056380160
+       .long   883644938
+       .long   1058799616
+       .long   1056807680
+       .long   3052015799
+       .long   1058668544
+       .long   1057102592
+       .long   884897284
+       .long   1058668544
+       .long   1057102592
+       .long   884897284
+       .long   1058537472
+       .long   1057321920
+       .long   3037632470
+       .long   1058406400
+       .long   1057544128
+       .long   865017195
+       .long   1058275328
+       .long   1057769344
+       .long   3042936546
+       .long   1058275328
+       .long   1057769344
+       .long   3042936546
+       .long   1058144256
+       .long   1057997568
+       .long   903344518
+       .long   1058013184
+       .long   1058228992
+       .long   897862967
+       .long   1058013184
+       .long   1058228992
+       .long   897862967
+       .long   1057882112
+       .long   1058463680
+       .long   3047822280
+       .long   1057882112
+       .long   1058463680
+       .long   3047822280
+       .long   1057751040
+       .long   1058701632
+       .long   883793293
+       .long   1057619968
+       .long   1058943040
+       .long   851667963
+       .long   1057619968
+       .long   1058943040
+       .long   851667963
+       .long   1057488896
+       .long   1059187968
+       .long   3000004036
+       .long   1057488896
+       .long   1059187968
+       .long   3000004036
+       .long   1057357824
+       .long   1059436544
+       .long   3047430717
+       .long   1057357824
+       .long   1059436544
+       .long   3047430717
+       .long   1057226752
+       .long   1059688832
+       .long   3043802308
+       .long   1057226752
+       .long   1059688832
+       .long   3043802308
+       .long   1057095680
+       .long   1059944960
+       .long   876113044
+       .long   1057095680
+       .long   1059944960
+       .long   876113044
+       .long   1056964608
+       .long   1060205056
+       .long   901758606
+       .long   1060205056
+       .long   901758606
+       .long   1207959616
+       .long   1174405120
+       .long   1008730112
+       .long   1400897536
+       .long   0
+       .long   1065353216
+       .long   3204448256
+       .long   1051372203
+       .long   3196059648
+       .long   1045220557
+       .long   3190467243
+       .long   1041387009
+       .long   3187672480
+       .type   __slog1p_la_CoutTab,@object
+       .size   __slog1p_la_CoutTab,840
+       .align 4
+.L_2il0floatpacket.75:
+       .long   0x53800000
+       .type   .L_2il0floatpacket.75,@object
+       .size   .L_2il0floatpacket.75,4
+       .align 4
+.L_2il0floatpacket.76:
+       .long   0x3c200000
+       .type   .L_2il0floatpacket.76,@object
+       .size   .L_2il0floatpacket.76,4
+       .align 4
+.L_2il0floatpacket.77:
+       .long   0xbf000000
+       .type   .L_2il0floatpacket.77,@object
+       .size   .L_2il0floatpacket.77,4
+       .align 4
+.L_2il0floatpacket.78:
+       .long   0x3eaaaaab
+       .type   .L_2il0floatpacket.78,@object
+       .size   .L_2il0floatpacket.78,4
+       .align 4
+.L_2il0floatpacket.79:
+       .long   0xbe800000
+       .type   .L_2il0floatpacket.79,@object
+       .size   .L_2il0floatpacket.79,4
+       .align 4
+.L_2il0floatpacket.80:
+       .long   0x3e4ccccd
+       .type   .L_2il0floatpacket.80,@object
+       .size   .L_2il0floatpacket.80,4
+       .align 4
+.L_2il0floatpacket.81:
+       .long   0xbe2aaaab
+       .type   .L_2il0floatpacket.81,@object
+       .size   .L_2il0floatpacket.81,4
+       .align 4
+.L_2il0floatpacket.82:
+       .long   0x3e124e01
+       .type   .L_2il0floatpacket.82,@object
+       .size   .L_2il0floatpacket.82,4
+       .align 4
+.L_2il0floatpacket.83:
+       .long   0xbe0005a0
+       .type   .L_2il0floatpacket.83,@object
+       .size   .L_2il0floatpacket.83,4
+       .align 4
+.L_2il0floatpacket.84:
+       .long   0xbf800000
+       .type   .L_2il0floatpacket.84,@object
+       .size   .L_2il0floatpacket.84,4
+       .align 4
+.L_2il0floatpacket.85:
+       .long   0x3f317218
+       .type   .L_2il0floatpacket.85,@object
+       .size   .L_2il0floatpacket.85,4
+       .align 4
+.L_2il0floatpacket.86:
+       .long   0x3f317200
+       .type   .L_2il0floatpacket.86,@object
+       .size   .L_2il0floatpacket.86,4
+       .align 4
+.L_2il0floatpacket.87:
+       .long   0x35bfbe8e
+       .type   .L_2il0floatpacket.87,@object
+       .size   .L_2il0floatpacket.87,4
+       .align 4
+.L_2il0floatpacket.88:
+       .long   0x48000040
+       .type   .L_2il0floatpacket.88,@object
+       .size   .L_2il0floatpacket.88,4
+       .align 4
+.L_2il0floatpacket.89:
+       .long   0x46000000
+       .type   .L_2il0floatpacket.89,@object
+       .size   .L_2il0floatpacket.89,4
+       .align 4
+.L_2il0floatpacket.90:
+       .long   0x3f800000
+       .type   .L_2il0floatpacket.90,@object
+       .size   .L_2il0floatpacket.90,4
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_log2_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_log2_d_la.s
new file mode 100644 (file)
index 0000000..6ba58fa
--- /dev/null
@@ -0,0 +1,1716 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *  log2(x) = VGETEXP(x) + log2(VGETMANT(x))
+ *  *       VGETEXP, VGETMANT will correctly treat special cases too (including denormals)
+ *  *   mx = VGETMANT(x) is in [1,2) for all x>=0
+ *  *   log2(mx) = -log2(RCP(mx)) + log2(1 +(mx*RCP(mx)-1))
+ *  *      RCP(mx) is rounded to 4 fractional bits,
+ *  *      and the table lookup for log(RCP(mx)) is based on a small permute instruction
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_log28_z0_0:
+
+       .align    16,0x90
+       .globl __svml_log28
+
+__svml_log28:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovaps   %zmm0, %zmm7
+
+/* GetMant(x), normalized to [1,2) for x>=0, NaN for x<0 */
+        vgetmantpd $8, {sae}, %zmm7, %zmm6
+        vmovups   128+__svml_dlog2_data_internal_avx512(%rip), %zmm2
+        vmovups   512+__svml_dlog2_data_internal_avx512(%rip), %zmm12
+        vmovups   640+__svml_dlog2_data_internal_avx512(%rip), %zmm13
+
+/* Start polynomial evaluation */
+        vmovups   256+__svml_dlog2_data_internal_avx512(%rip), %zmm10
+        vmovups   320+__svml_dlog2_data_internal_avx512(%rip), %zmm0
+        vmovups   384+__svml_dlog2_data_internal_avx512(%rip), %zmm11
+        vmovups   448+__svml_dlog2_data_internal_avx512(%rip), %zmm14
+
+/* Prepare exponent correction: DblRcp<0.75? */
+        vmovups   192+__svml_dlog2_data_internal_avx512(%rip), %zmm1
+
+/* Table lookup */
+        vmovups   __svml_dlog2_data_internal_avx512(%rip), %zmm4
+
+/* GetExp(x) */
+        vgetexppd {sae}, %zmm7, %zmm5
+
+/* DblRcp ~ 1/Mantissa */
+        vrcp14pd  %zmm6, %zmm8
+
+/* x<=0? */
+        vfpclasspd $94, %zmm7, %k0
+
+/* round DblRcp to 4 fractional bits (RN mode, no Precision exception) */
+        vrndscalepd $88, {sae}, %zmm8, %zmm3
+        vmovups   576+__svml_dlog2_data_internal_avx512(%rip), %zmm8
+        kmovw     %k0, %edx
+
+/* Reduced argument: R = DblRcp*Mantissa - 1 */
+        vfmsub213pd {rn-sae}, %zmm2, %zmm3, %zmm6
+        vcmppd    $17, {sae}, %zmm1, %zmm3, %k1
+        vfmadd231pd {rn-sae}, %zmm6, %zmm12, %zmm8
+        vmovups   704+__svml_dlog2_data_internal_avx512(%rip), %zmm12
+        vfmadd231pd {rn-sae}, %zmm6, %zmm10, %zmm0
+        vfmadd231pd {rn-sae}, %zmm6, %zmm11, %zmm14
+        vmovups   768+__svml_dlog2_data_internal_avx512(%rip), %zmm1
+
+/* R^2 */
+        vmulpd    {rn-sae}, %zmm6, %zmm6, %zmm15
+        vfmadd231pd {rn-sae}, %zmm6, %zmm13, %zmm12
+
+/* Prepare table index */
+        vpsrlq    $48, %zmm3, %zmm9
+
+/* add 1 to Expon if DblRcp<0.75 */
+        vaddpd    {rn-sae}, %zmm2, %zmm5, %zmm5{%k1}
+        vmulpd    {rn-sae}, %zmm15, %zmm15, %zmm13
+        vfmadd213pd {rn-sae}, %zmm14, %zmm15, %zmm0
+        vfmadd213pd {rn-sae}, %zmm12, %zmm15, %zmm8
+        vpermt2pd 64+__svml_dlog2_data_internal_avx512(%rip), %zmm9, %zmm4
+
+/* polynomial */
+        vfmadd213pd {rn-sae}, %zmm8, %zmm13, %zmm0
+        vfmadd213pd {rn-sae}, %zmm1, %zmm6, %zmm0
+        vfmadd213pd {rn-sae}, %zmm4, %zmm0, %zmm6
+        vaddpd    {rn-sae}, %zmm6, %zmm5, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm7, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dlog2_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_log28,@function
+       .size   __svml_log28,.-__svml_log28
+..LN__svml_log28.0:
+
+.L_2__routine_start___svml_dlog2_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dlog2_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        movq      $0, -64(%rsp)
+        movsd     -64(%rsp), %xmm0
+        movsd     (%rdi), %xmm1
+        movups    _zeros.402.0.0.1(%rip), %xmm2
+        subsd     %xmm0, %xmm1
+        movsd     %xmm1, -8(%rsp)
+        movups    %xmm2, -56(%rsp)
+
+
+        movups    _ones.402.0.0.1(%rip), %xmm0
+        movups    %xmm0, -40(%rsp)
+
+
+        movups    _infs.402.0.0.1(%rip), %xmm0
+        movups    %xmm0, -24(%rsp)
+
+
+        movl      -4(%rsp), %eax
+        cmpl      $2146435072, %eax
+        jae       .LBL_2_19
+
+
+        lea       -1072660480(%rax), %edx
+        cmpl      $53248, %edx
+        jae       .LBL_2_14
+
+
+        lea       -1072693232(%rax), %edx
+        cmpl      $24, %edx
+        jae       .LBL_2_13
+
+
+        movl      -8(%rsp), %edi
+        movl      %eax, %ecx
+        movl      %edi, %edx
+        shll      $11, %ecx
+        shrl      $21, %edx
+        orl       %edx, %ecx
+        addl      $-2147483646, %ecx
+        cmpl      $3, %ecx
+        jae       .LBL_2_12
+
+
+        addl      $-1072693248, %eax
+        orl       %edi, %eax
+        jne       .LBL_2_10
+
+
+        movq      -56(%rsp), %rax
+        movq      %rax, (%rsi)
+        jmp       .LBL_2_11
+
+.LBL_2_10:
+
+        movsd     -8(%rsp), %xmm0
+        movsd     16+__dlog2_la__Q3(%rip), %xmm2
+        movsd     24+__dlog2_la__Q3(%rip), %xmm1
+        addsd     -32(%rsp), %xmm0
+        mulsd     %xmm0, %xmm2
+        mulsd     %xmm0, %xmm1
+        addsd     8+__dlog2_la__Q3(%rip), %xmm2
+        mulsd     %xmm0, %xmm2
+        movsd     %xmm0, -8(%rsp)
+        addsd     __dlog2_la__Q3(%rip), %xmm2
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm1, %xmm2
+        movsd     %xmm2, (%rsi)
+
+.LBL_2_11:
+
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_12:
+
+        movsd     -8(%rsp), %xmm2
+        xorl      %eax, %eax
+        movsd     16+__dlog2_la__Q2(%rip), %xmm1
+        movsd     24+__dlog2_la__Q2(%rip), %xmm3
+        addsd     -32(%rsp), %xmm2
+        movaps    %xmm2, %xmm0
+        mulsd     %xmm2, %xmm0
+        mulsd     %xmm0, %xmm1
+        mulsd     %xmm0, %xmm3
+        addsd     __dlog2_la__Q2(%rip), %xmm1
+        addsd     8+__dlog2_la__Q2(%rip), %xmm3
+        mulsd     %xmm2, %xmm1
+        mulsd     %xmm0, %xmm3
+        movsd     %xmm2, -8(%rsp)
+        addsd     %xmm1, %xmm3
+        movl      $0, -8(%rsp)
+        movsd     -8(%rsp), %xmm4
+        subsd     %xmm4, %xmm2
+        addsd     %xmm2, %xmm4
+        mulsd     32+__dlog2_la__Q2(%rip), %xmm4
+        addsd     %xmm3, %xmm4
+        movsd     %xmm4, (%rsi)
+        ret
+
+.LBL_2_13:
+
+        movsd     -8(%rsp), %xmm2
+        xorl      %eax, %eax
+        movsd     72+__dlog2_la__Q1(%rip), %xmm10
+        movsd     64+__dlog2_la__Q1(%rip), %xmm4
+        movsd     __dlog2_la__TWO_32P(%rip), %xmm5
+        movsd     __dlog2_la__TWO_32P(%rip), %xmm7
+        movsd     88+__dlog2_la__Q1(%rip), %xmm14
+        movsd     __dlog2_la__TWO_32P(%rip), %xmm11
+        movsd     __dlog2_la__TWO_32P(%rip), %xmm15
+        addsd     -32(%rsp), %xmm2
+        movaps    %xmm2, %xmm3
+        movaps    %xmm2, %xmm6
+        mulsd     %xmm2, %xmm3
+        movaps    %xmm2, %xmm0
+        mulsd     %xmm2, %xmm5
+        mulsd     __dlog2_la__TWO_32(%rip), %xmm6
+        mulsd     %xmm3, %xmm10
+        mulsd     %xmm3, %xmm4
+        addsd     56+__dlog2_la__Q1(%rip), %xmm10
+        addsd     48+__dlog2_la__Q1(%rip), %xmm4
+        mulsd     %xmm3, %xmm10
+        mulsd     %xmm3, %xmm4
+        addsd     40+__dlog2_la__Q1(%rip), %xmm10
+        addsd     32+__dlog2_la__Q1(%rip), %xmm4
+        mulsd     %xmm3, %xmm10
+        mulsd     %xmm3, %xmm4
+        addsd     24+__dlog2_la__Q1(%rip), %xmm10
+        addsd     16+__dlog2_la__Q1(%rip), %xmm4
+        mulsd     %xmm3, %xmm10
+        mulsd     %xmm2, %xmm4
+        movsd     __dlog2_la__TWO_32(%rip), %xmm3
+        addsd     %xmm4, %xmm10
+        mulsd     %xmm10, %xmm7
+        movaps    %xmm3, %xmm8
+        mulsd     %xmm10, %xmm8
+        movsd     %xmm5, -72(%rsp)
+        movsd     -72(%rsp), %xmm1
+        movsd     %xmm7, -72(%rsp)
+        subsd     %xmm6, %xmm1
+        movsd     -72(%rsp), %xmm9
+        subsd     %xmm1, %xmm0
+        subsd     %xmm8, %xmm9
+        movsd     %xmm1, -8(%rsp)
+        subsd     %xmm9, %xmm10
+        addsd     %xmm9, %xmm14
+        addsd     8+__dlog2_la__Q1(%rip), %xmm10
+        movaps    %xmm14, %xmm4
+        mulsd     %xmm0, %xmm4
+        mulsd     %xmm2, %xmm10
+        mulsd     %xmm1, %xmm14
+        addsd     %xmm0, %xmm1
+        addsd     %xmm10, %xmm4
+        movaps    %xmm4, %xmm12
+        movsd     80+__dlog2_la__Q1(%rip), %xmm9
+        addsd     %xmm14, %xmm12
+        mulsd     %xmm12, %xmm11
+        mulsd     %xmm3, %xmm12
+        movsd     %xmm11, -72(%rsp)
+        movsd     -72(%rsp), %xmm13
+        subsd     %xmm12, %xmm13
+        subsd     %xmm13, %xmm4
+        addsd     %xmm13, %xmm9
+        addsd     %xmm14, %xmm4
+        movaps    %xmm9, %xmm13
+        addsd     __dlog2_la__Q1(%rip), %xmm4
+        addsd     %xmm4, %xmm13
+        mulsd     %xmm13, %xmm15
+        mulsd     %xmm3, %xmm13
+        movsd     %xmm15, -72(%rsp)
+        movsd     -72(%rsp), %xmm14
+        subsd     %xmm13, %xmm14
+        mulsd     %xmm14, %xmm1
+        subsd     %xmm14, %xmm9
+        addsd     %xmm9, %xmm4
+        mulsd     %xmm2, %xmm4
+        addsd     %xmm4, %xmm1
+        movsd     %xmm1, (%rsi)
+        ret
+
+.LBL_2_14:
+
+        movl      %eax, %ecx
+        movl      %eax, %edx
+        shrl      $20, %ecx
+        andl      $1048575, %edx
+        addl      $-1023, %ecx
+        cmpl      $1048576, %eax
+        jae       .LBL_2_18
+
+
+        movl      %edx, -4(%rsp)
+        movl      -8(%rsp), %edx
+        orl       %edx, %eax
+        jne       .LBL_2_17
+
+
+        movsd     -32(%rsp), %xmm0
+        movl      $2, %eax
+        divsd     -56(%rsp), %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_17:
+
+        movsd     -8(%rsp), %xmm0
+        mulsd     __dlog2_la__TWO_55(%rip), %xmm0
+        movsd     %xmm0, -8(%rsp)
+        movl      -4(%rsp), %edx
+        movl      %edx, %ecx
+        shrl      $20, %ecx
+        movl      %edx, %eax
+        addl      $-1078, %ecx
+
+.LBL_2_18:
+
+        shrl      $12, %eax
+        orl       $1072693248, %edx
+        movzbl    %al, %edi
+        pxor      %xmm7, %xmm7
+        movl      %edx, -4(%rsp)
+        lea       __dlog2_la___libm_rcp_table_256(%rip), %rdx
+        movsd     -8(%rsp), %xmm10
+        pxor      %xmm8, %xmm8
+        movl      $0, -8(%rsp)
+        lea       __dlog2_la___libm_log2_table_256(%rip), %rax
+        movsd     -8(%rsp), %xmm0
+        cvtss2sd  (%rdx,%rdi,4), %xmm7
+        cvtsi2sd  %ecx, %xmm8
+        subsd     %xmm0, %xmm10
+        mulsd     %xmm7, %xmm10
+        mulsd     %xmm0, %xmm7
+        movsd     40+__dlog2_la__P(%rip), %xmm4
+        movsd     32+__dlog2_la__P(%rip), %xmm3
+        movsd     48+__dlog2_la__P(%rip), %xmm5
+        movsd     __dlog2_la__TWO_32(%rip), %xmm6
+        shlq      $4, %rdi
+        addsd     -32(%rsp), %xmm7
+        movaps    %xmm7, %xmm2
+        mulsd     %xmm5, %xmm7
+        addsd     %xmm10, %xmm2
+        mulsd     %xmm5, %xmm10
+        addsd     %xmm7, %xmm6
+        movaps    %xmm2, %xmm1
+        mulsd     %xmm2, %xmm1
+        mulsd     %xmm1, %xmm4
+        mulsd     %xmm1, %xmm3
+        addsd     24+__dlog2_la__P(%rip), %xmm4
+        addsd     16+__dlog2_la__P(%rip), %xmm3
+        mulsd     %xmm1, %xmm4
+        mulsd     %xmm1, %xmm3
+        addsd     8+__dlog2_la__P(%rip), %xmm4
+        addsd     __dlog2_la__P(%rip), %xmm3
+        mulsd     %xmm1, %xmm4
+        mulsd     %xmm2, %xmm3
+        movsd     %xmm6, -72(%rsp)
+        addsd     %xmm3, %xmm4
+        addsd     8(%rax,%rdi), %xmm8
+        addsd     %xmm4, %xmm10
+        movsd     -72(%rsp), %xmm9
+        subsd     __dlog2_la__TWO_32(%rip), %xmm9
+        subsd     %xmm9, %xmm7
+        addsd     %xmm8, %xmm9
+        addsd     (%rax,%rdi), %xmm7
+        movsd     %xmm9, -8(%rsp)
+        xorl      %eax, %eax
+        addsd     %xmm7, %xmm10
+        addsd     %xmm9, %xmm10
+        movsd     %xmm10, (%rsi)
+        ret
+
+.LBL_2_19:
+
+        movl      %eax, %edx
+        andl      $2147483647, %edx
+        cmpl      $2146435072, %edx
+        ja        .LBL_2_28
+
+
+        jne       .LBL_2_22
+
+
+        cmpl      $0, -8(%rsp)
+        jne       .LBL_2_28
+
+.LBL_2_22:
+
+        testl     $-2147483648, %eax
+        je        .LBL_2_27
+
+
+        movl      -8(%rsp), %eax
+        orl       %eax, %edx
+        movsd     -56(%rsp), %xmm1
+        jne       .LBL_2_25
+
+
+        movsd     -32(%rsp), %xmm0
+        movl      $2, %eax
+        divsd     %xmm1, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_25:
+
+        movsd     -24(%rsp), %xmm0
+        movl      $1, %eax
+        mulsd     %xmm1, %xmm0
+        movsd     %xmm0, (%rsi)
+
+
+        ret
+
+.LBL_2_27:
+
+        movq      -8(%rsp), %rax
+        movq      %rax, (%rsi)
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_28:
+
+        movsd     -8(%rsp), %xmm0
+        xorl      %eax, %eax
+        mulsd     -40(%rsp), %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dlog2_cout_rare_internal,@function
+       .size   __svml_dlog2_cout_rare_internal,.-__svml_dlog2_cout_rare_internal
+..LN__svml_dlog2_cout_rare_internal.1:
+       .section .rodata, "a"
+       .align 64
+       .align 16
+_zeros.402.0.0.1:
+       .long   0
+       .long   0
+       .long   0
+       .long   2147483648
+       .align 16
+_ones.402.0.0.1:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   3220176896
+       .align 16
+_infs.402.0.0.1:
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   4293918720
+
+       .section .rodata, "a"
+       .space 16, 0x00         
+       .align 64
+__svml_dlog2_data_internal_avx512:
+       .long   0
+       .long   0
+       .long   4207481622
+       .long   3216401398
+       .long   972805768
+       .long   3217408026
+       .long   3103942666
+       .long   3218062358
+       .long   1271733131
+       .long   3218381432
+       .long   2300516105
+       .long   3218676666
+       .long   3761433103
+       .long   3218958163
+       .long   14039718
+       .long   3219177733
+       .long   1904282206
+       .long   1071288313
+       .long   1751501034
+       .long   1071041295
+       .long   3815829096
+       .long   1070803966
+       .long   2835758645
+       .long   1070555096
+       .long   180337970
+       .long   1070114968
+       .long   3266000023
+       .long   1069690285
+       .long   2530196300
+       .long   1069012484
+       .long   3386464469
+       .long   1067938708
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   3658358034
+       .long   1069846603
+       .long   3658358034
+       .long   1069846603
+       .long   3658358034
+       .long   1069846603
+       .long   3658358034
+       .long   1069846603
+       .long   3658358034
+       .long   1069846603
+       .long   3658358034
+       .long   1069846603
+       .long   3658358034
+       .long   1069846603
+       .long   3658358034
+       .long   1069846603
+       .long   1307270350
+       .long   3217498040
+       .long   1307270350
+       .long   3217498040
+       .long   1307270350
+       .long   3217498040
+       .long   1307270350
+       .long   3217498040
+       .long   1307270350
+       .long   3217498040
+       .long   1307270350
+       .long   3217498040
+       .long   1307270350
+       .long   3217498040
+       .long   1307270350
+       .long   3217498040
+       .long   1367442963
+       .long   1070227827
+       .long   1367442963
+       .long   1070227827
+       .long   1367442963
+       .long   1070227827
+       .long   1367442963
+       .long   1070227827
+       .long   1367442963
+       .long   1070227827
+       .long   1367442963
+       .long   1070227827
+       .long   1367442963
+       .long   1070227827
+       .long   1367442963
+       .long   1070227827
+       .long   3840087116
+       .long   3217999623
+       .long   3840087116
+       .long   3217999623
+       .long   3840087116
+       .long   3217999623
+       .long   3840087116
+       .long   3217999623
+       .long   3840087116
+       .long   3217999623
+       .long   3840087116
+       .long   3217999623
+       .long   3840087116
+       .long   3217999623
+       .long   3840087116
+       .long   3217999623
+       .long   1360320794
+       .long   1070757740
+       .long   1360320794
+       .long   1070757740
+       .long   1360320794
+       .long   1070757740
+       .long   1360320794
+       .long   1070757740
+       .long   1360320794
+       .long   1070757740
+       .long   1360320794
+       .long   1070757740
+       .long   1360320794
+       .long   1070757740
+       .long   1360320794
+       .long   1070757740
+       .long   1698500493
+       .long   3218543943
+       .long   1698500493
+       .long   3218543943
+       .long   1698500493
+       .long   3218543943
+       .long   1698500493
+       .long   3218543943
+       .long   1698500493
+       .long   3218543943
+       .long   1698500493
+       .long   3218543943
+       .long   1698500493
+       .long   3218543943
+       .long   1698500493
+       .long   3218543943
+       .long   3694789279
+       .long   1071564553
+       .long   3694789279
+       .long   1071564553
+       .long   3694789279
+       .long   1071564553
+       .long   3694789279
+       .long   1071564553
+       .long   3694789279
+       .long   1071564553
+       .long   3694789279
+       .long   1071564553
+       .long   3694789279
+       .long   1071564553
+       .long   3694789279
+       .long   1071564553
+       .long   1697350356
+       .long   3219592519
+       .long   1697350356
+       .long   3219592519
+       .long   1697350356
+       .long   3219592519
+       .long   1697350356
+       .long   3219592519
+       .long   1697350356
+       .long   3219592519
+       .long   1697350356
+       .long   3219592519
+       .long   1697350356
+       .long   3219592519
+       .long   1697350356
+       .long   3219592519
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .type   __svml_dlog2_data_internal_avx512,@object
+       .size   __svml_dlog2_data_internal_avx512,1088
+       .align 64
+__dlog2_la__Q3:
+       .long   3213221364
+       .long   1050233568
+       .long   1697350398
+       .long   3219592519
+       .long   3694789629
+       .long   1071564553
+       .long   0
+       .long   1073157447
+       .type   __dlog2_la__Q3,@object
+       .size   __dlog2_la__Q3,32
+       .space 32, 0x00         
+       .align 64
+__dlog2_la__Q2:
+       .long   3213221358
+       .long   1050233568
+       .long   1697350398
+       .long   3219592519
+       .long   3695167823
+       .long   1071564553
+       .long   1697791998
+       .long   3218543943
+       .long   0
+       .long   1073157447
+       .type   __dlog2_la__Q2,@object
+       .size   __dlog2_la__Q2,40
+       .space 24, 0x00         
+       .align 64
+__dlog2_la__Q1:
+       .long   3213221370
+       .long   1050233568
+       .long   3213207734
+       .long   3196668640
+       .long   3694789628
+       .long   1071564553
+       .long   1697350743
+       .long   3218543943
+       .long   1357908666
+       .long   1070757740
+       .long   3685007067
+       .long   3217999625
+       .long   96832070
+       .long   1070227830
+       .long   1140452344
+       .long   3217495379
+       .long   2606274745
+       .long   1069844296
+       .long   1933654871
+       .long   3217172449
+       .long   0
+       .long   1073157447
+       .long   0
+       .long   3219592519
+       .type   __dlog2_la__Q1,@object
+       .size   __dlog2_la__Q1,96
+       .space 32, 0x00         
+       .align 64
+__dlog2_la__TWO_32P:
+       .long   1048576
+       .long   1106247680
+       .type   __dlog2_la__TWO_32P,@object
+       .size   __dlog2_la__TWO_32P,8
+       .space 56, 0x00         
+       .align 64
+__dlog2_la__TWO_32:
+       .long   0
+       .long   1106247680
+       .type   __dlog2_la__TWO_32,@object
+       .size   __dlog2_la__TWO_32,8
+       .space 56, 0x00         
+       .align 64
+__dlog2_la__TWO_55:
+       .long   0
+       .long   1130364928
+       .type   __dlog2_la__TWO_55,@object
+       .size   __dlog2_la__TWO_55,8
+       .space 56, 0x00         
+       .align 64
+__dlog2_la___libm_rcp_table_256:
+       .long   0x3f7f8000
+       .long   0x3f7e8000
+       .long   0x3f7d8000
+       .long   0x3f7c8000
+       .long   0x3f7ba000
+       .long   0x3f7aa000
+       .long   0x3f79a000
+       .long   0x3f78c000
+       .long   0x3f77c000
+       .long   0x3f76e000
+       .long   0x3f75e000
+       .long   0x3f750000
+       .long   0x3f742000
+       .long   0x3f732000
+       .long   0x3f724000
+       .long   0x3f716000
+       .long   0x3f708000
+       .long   0x3f6fa000
+       .long   0x3f6ec000
+       .long   0x3f6de000
+       .long   0x3f6d0000
+       .long   0x3f6c2000
+       .long   0x3f6b6000
+       .long   0x3f6a8000
+       .long   0x3f69a000
+       .long   0x3f68c000
+       .long   0x3f680000
+       .long   0x3f672000
+       .long   0x3f666000
+       .long   0x3f658000
+       .long   0x3f64c000
+       .long   0x3f640000
+       .long   0x3f632000
+       .long   0x3f626000
+       .long   0x3f61a000
+       .long   0x3f60e000
+       .long   0x3f600000
+       .long   0x3f5f4000
+       .long   0x3f5e8000
+       .long   0x3f5dc000
+       .long   0x3f5d0000
+       .long   0x3f5c4000
+       .long   0x3f5b8000
+       .long   0x3f5ae000
+       .long   0x3f5a2000
+       .long   0x3f596000
+       .long   0x3f58a000
+       .long   0x3f57e000
+       .long   0x3f574000
+       .long   0x3f568000
+       .long   0x3f55e000
+       .long   0x3f552000
+       .long   0x3f546000
+       .long   0x3f53c000
+       .long   0x3f532000
+       .long   0x3f526000
+       .long   0x3f51c000
+       .long   0x3f510000
+       .long   0x3f506000
+       .long   0x3f4fc000
+       .long   0x3f4f2000
+       .long   0x3f4e6000
+       .long   0x3f4dc000
+       .long   0x3f4d2000
+       .long   0x3f4c8000
+       .long   0x3f4be000
+       .long   0x3f4b4000
+       .long   0x3f4aa000
+       .long   0x3f4a0000
+       .long   0x3f496000
+       .long   0x3f48c000
+       .long   0x3f482000
+       .long   0x3f478000
+       .long   0x3f46e000
+       .long   0x3f464000
+       .long   0x3f45c000
+       .long   0x3f452000
+       .long   0x3f448000
+       .long   0x3f43e000
+       .long   0x3f436000
+       .long   0x3f42c000
+       .long   0x3f422000
+       .long   0x3f41a000
+       .long   0x3f410000
+       .long   0x3f408000
+       .long   0x3f3fe000
+       .long   0x3f3f6000
+       .long   0x3f3ec000
+       .long   0x3f3e4000
+       .long   0x3f3da000
+       .long   0x3f3d2000
+       .long   0x3f3ca000
+       .long   0x3f3c0000
+       .long   0x3f3b8000
+       .long   0x3f3b0000
+       .long   0x3f3a8000
+       .long   0x3f39e000
+       .long   0x3f396000
+       .long   0x3f38e000
+       .long   0x3f386000
+       .long   0x3f37e000
+       .long   0x3f376000
+       .long   0x3f36c000
+       .long   0x3f364000
+       .long   0x3f35c000
+       .long   0x3f354000
+       .long   0x3f34c000
+       .long   0x3f344000
+       .long   0x3f33c000
+       .long   0x3f334000
+       .long   0x3f32e000
+       .long   0x3f326000
+       .long   0x3f31e000
+       .long   0x3f316000
+       .long   0x3f30e000
+       .long   0x3f306000
+       .long   0x3f2fe000
+       .long   0x3f2f8000
+       .long   0x3f2f0000
+       .long   0x3f2e8000
+       .long   0x3f2e2000
+       .long   0x3f2da000
+       .long   0x3f2d2000
+       .long   0x3f2cc000
+       .long   0x3f2c4000
+       .long   0x3f2bc000
+       .long   0x3f2b6000
+       .long   0x3f2ae000
+       .long   0x3f2a8000
+       .long   0x3f2a0000
+       .long   0x3f29a000
+       .long   0x3f292000
+       .long   0x3f28c000
+       .long   0x3f284000
+       .long   0x3f27e000
+       .long   0x3f276000
+       .long   0x3f270000
+       .long   0x3f268000
+       .long   0x3f262000
+       .long   0x3f25c000
+       .long   0x3f254000
+       .long   0x3f24e000
+       .long   0x3f248000
+       .long   0x3f240000
+       .long   0x3f23a000
+       .long   0x3f234000
+       .long   0x3f22e000
+       .long   0x3f226000
+       .long   0x3f220000
+       .long   0x3f21a000
+       .long   0x3f214000
+       .long   0x3f20e000
+       .long   0x3f206000
+       .long   0x3f200000
+       .long   0x3f1fa000
+       .long   0x3f1f4000
+       .long   0x3f1ee000
+       .long   0x3f1e8000
+       .long   0x3f1e2000
+       .long   0x3f1dc000
+       .long   0x3f1d6000
+       .long   0x3f1d0000
+       .long   0x3f1ca000
+       .long   0x3f1c4000
+       .long   0x3f1be000
+       .long   0x3f1b8000
+       .long   0x3f1b2000
+       .long   0x3f1ac000
+       .long   0x3f1a6000
+       .long   0x3f1a0000
+       .long   0x3f19a000
+       .long   0x3f194000
+       .long   0x3f190000
+       .long   0x3f18a000
+       .long   0x3f184000
+       .long   0x3f17e000
+       .long   0x3f178000
+       .long   0x3f172000
+       .long   0x3f16e000
+       .long   0x3f168000
+       .long   0x3f162000
+       .long   0x3f15c000
+       .long   0x3f158000
+       .long   0x3f152000
+       .long   0x3f14c000
+       .long   0x3f148000
+       .long   0x3f142000
+       .long   0x3f13c000
+       .long   0x3f138000
+       .long   0x3f132000
+       .long   0x3f12c000
+       .long   0x3f128000
+       .long   0x3f122000
+       .long   0x3f11c000
+       .long   0x3f118000
+       .long   0x3f112000
+       .long   0x3f10e000
+       .long   0x3f108000
+       .long   0x3f104000
+       .long   0x3f0fe000
+       .long   0x3f0f8000
+       .long   0x3f0f4000
+       .long   0x3f0ee000
+       .long   0x3f0ea000
+       .long   0x3f0e6000
+       .long   0x3f0e0000
+       .long   0x3f0dc000
+       .long   0x3f0d6000
+       .long   0x3f0d2000
+       .long   0x3f0cc000
+       .long   0x3f0c8000
+       .long   0x3f0c2000
+       .long   0x3f0be000
+       .long   0x3f0ba000
+       .long   0x3f0b4000
+       .long   0x3f0b0000
+       .long   0x3f0ac000
+       .long   0x3f0a6000
+       .long   0x3f0a2000
+       .long   0x3f09e000
+       .long   0x3f098000
+       .long   0x3f094000
+       .long   0x3f090000
+       .long   0x3f08a000
+       .long   0x3f086000
+       .long   0x3f082000
+       .long   0x3f07e000
+       .long   0x3f078000
+       .long   0x3f074000
+       .long   0x3f070000
+       .long   0x3f06c000
+       .long   0x3f066000
+       .long   0x3f062000
+       .long   0x3f05e000
+       .long   0x3f05a000
+       .long   0x3f056000
+       .long   0x3f052000
+       .long   0x3f04c000
+       .long   0x3f048000
+       .long   0x3f044000
+       .long   0x3f040000
+       .long   0x3f03c000
+       .long   0x3f038000
+       .long   0x3f034000
+       .long   0x3f030000
+       .long   0x3f02a000
+       .long   0x3f026000
+       .long   0x3f022000
+       .long   0x3f01e000
+       .long   0x3f01a000
+       .long   0x3f016000
+       .long   0x3f012000
+       .long   0x3f00e000
+       .long   0x3f00a000
+       .long   0x3f006000
+       .long   0x3f002000
+       .type   __dlog2_la___libm_rcp_table_256,@object
+       .size   __dlog2_la___libm_rcp_table_256,1024
+       .align 64
+__dlog2_la___libm_log2_table_256:
+       .long   0xfb44c3b7,0x3e1485cb
+       .long   0x00000000,0x3f671b0e
+       .long   0x06028ac0,0x3e31d5d9
+       .long   0x00000000,0x3f815cfe
+       .long   0xb8d7240b,0x3df8b9cb
+       .long   0x00000000,0x3f8cfee7
+       .long   0x0d179106,0x3e38864a
+       .long   0x00000000,0x3f94564a
+       .long   0xecba1593,0x3e459c6a
+       .long   0x00000000,0x3f997723
+       .long   0x94120c14,0x3e48d36a
+       .long   0x00000000,0x3f9f5923
+       .long   0xd2571490,0x3e5410ba
+       .long   0x00000000,0x3fa2a094
+       .long   0x1dc036a2,0x3e2776b0
+       .long   0x00000000,0x3fa53894
+       .long   0x78efe2b1,0x3e537229
+       .long   0x00000000,0x3fa8324c
+       .long   0xfd29dc75,0x3e59c0fa
+       .long   0x00000000,0x3faacf54
+       .long   0x046734f7,0x3e4636b7
+       .long   0x00000000,0x3fadced9
+       .long   0xd3b410b8,0x3e6f7950
+       .long   0x00000000,0x3fb0387e
+       .long   0x00f2200a,0x3e19d1e7
+       .long   0x00000000,0x3fb18ac6
+       .long   0x8661ba82,0x3e4f09a9
+       .long   0x00000000,0x3fb30edd
+       .long   0x9367107c,0x3e564d91
+       .long   0x00000000,0x3fb463c1
+       .long   0x0e4a4ce8,0x3e4e1fd1
+       .long   0x00000000,0x3fb5b9e1
+       .long   0x3cdb6374,0x3e492cf0
+       .long   0x00000000,0x3fb7113f
+       .long   0x069c4f7f,0x3e61a364
+       .long   0x00000000,0x3fb869dd
+       .long   0x427b631b,0x3e6493a6
+       .long   0x00000000,0x3fb9c3be
+       .long   0xe02b3e8b,0x3e6af2c2
+       .long   0x00000000,0x3fbb1ee4
+       .long   0x389f4365,0x3e616e1e
+       .long   0x00000000,0x3fbc7b52
+       .long   0x6a31fd96,0x3e4633b7
+       .long   0x00000000,0x3fbdd90a
+       .long   0x0508664d,0x3e62ed84
+       .long   0x00000000,0x3fbf05d4
+       .long   0xaca1905c,0x3e775dcd
+       .long   0x00000000,0x3fc032fb
+       .long   0x094fbeeb,0x3e753e65
+       .long   0x00000000,0x3fc0e3b5
+       .long   0x96aa4b17,0x3e671f44
+       .long   0x00000000,0x3fc19519
+       .long   0x92da5a47,0x3e785566
+       .long   0x00000000,0x3fc22dad
+       .long   0xbeb7d722,0x3e518efa
+       .long   0x00000000,0x3fc2e050
+       .long   0xab57551c,0x3e738564
+       .long   0x00000000,0x3fc379f7
+       .long   0x54a914e3,0x3e55d0da
+       .long   0x00000000,0x3fc42ddd
+       .long   0xfe974017,0x3e73cd00
+       .long   0x00000000,0x3fc4c89b
+       .long   0x59064390,0x3e54ffd6
+       .long   0x00000000,0x3fc563dc
+       .long   0x633ab50f,0x3e67d75e
+       .long   0x00000000,0x3fc619a2
+       .long   0xc8877e8a,0x3e77e6ce
+       .long   0x00000000,0x3fc6b5ff
+       .long   0x1ab7837f,0x3e7ecc1f
+       .long   0x00000000,0x3fc752e1
+       .long   0xf9d5827a,0x3e7cea7c
+       .long   0x00000000,0x3fc7f049
+       .long   0x64ccd537,0x3e357f7a
+       .long   0x00000000,0x3fc8a898
+       .long   0xf7c9b05b,0x3e7994ca
+       .long   0x00000000,0x3fc94724
+       .long   0xa2f56536,0x3e524b8f
+       .long   0x00000000,0x3fc9e63a
+       .long   0x5edaab42,0x3e7fd640
+       .long   0x00000000,0x3fca85d8
+       .long   0xd163379a,0x3e625f54
+       .long   0x00000000,0x3fcb2602
+       .long   0x936acd51,0x3e7ebdc3
+       .long   0x00000000,0x3fcbc6b6
+       .long   0xcfbc0aa0,0x3e7eee14
+       .long   0x00000000,0x3fcc67f7
+       .long   0xf73bcdad,0x3e764469
+       .long   0x00000000,0x3fcceec4
+       .long   0x60971b86,0x3e6eb44e
+       .long   0x00000000,0x3fcd9109
+       .long   0xcd2052a5,0x3e65fcf4
+       .long   0x00000000,0x3fce33dd
+       .long   0xc402867b,0x3e61af1e
+       .long   0x00000000,0x3fced741
+       .long   0xa0c956e4,0x3e61bfbd
+       .long   0x00000000,0x3fcf7b36
+       .long   0x831e77ff,0x3e85287b
+       .long   0x00000000,0x3fd00223
+       .long   0xaddfdee2,0x3e7d2fc3
+       .long   0x00000000,0x3fd054a4
+       .long   0x342052c1,0x3e83724b
+       .long   0x00000000,0x3fd0999d
+       .long   0x602bcd34,0x3e7b4ec9
+       .long   0x00000000,0x3fd0eca6
+       .long   0x3aa20ead,0x3e6742da
+       .long   0x00000000,0x3fd13ffa
+       .long   0x9ecdadf4,0x3e713e82
+       .long   0x00000000,0x3fd185a4
+       .long   0xfef3031b,0x3e52f27e
+       .long   0x00000000,0x3fd1cb83
+       .long   0x79e4af8a,0x3e710739
+       .long   0x00000000,0x3fd21fa1
+       .long   0xe59ad84a,0x3e637301
+       .long   0x00000000,0x3fd265f5
+       .long   0x3d7dfd9b,0x3e88697c
+       .long   0x00000000,0x3fd2baa0
+       .long   0x738117b0,0x3e717788
+       .long   0x00000000,0x3fd3016b
+       .long   0xd3c26a97,0x3e6c5514
+       .long   0x00000000,0x3fd3486c
+       .long   0x4c4ff246,0x3e8df550
+       .long   0x00000000,0x3fd38fa3
+       .long   0x40340fa6,0x3e88102d
+       .long   0x00000000,0x3fd3e562
+       .long   0x4592f4c3,0x3e5f53b6
+       .long   0x00000000,0x3fd42d14
+       .long   0x8b149a00,0x3e750fc8
+       .long   0x00000000,0x3fd474fd
+       .long   0xa8f50e5f,0x3e86d01c
+       .long   0x00000000,0x3fd4bd1e
+       .long   0x7a22a88a,0x3e83c469
+       .long   0x00000000,0x3fd50578
+       .long   0xdc18b6d2,0x3e79000e
+       .long   0x00000000,0x3fd54e0b
+       .long   0x7c00250b,0x3e7870f0
+       .long   0x00000000,0x3fd596d7
+       .long   0xc1c885ae,0x3e8e3dd5
+       .long   0x00000000,0x3fd5dfdc
+       .long   0xa6ecc47e,0x3e7bf64c
+       .long   0x00000000,0x3fd6291c
+       .long   0x0bc16c18,0x3e6bdaca
+       .long   0x00000000,0x3fd67296
+       .long   0x1f925729,0x3e84d25c
+       .long   0x00000000,0x3fd6bc4a
+       .long   0xf23978de,0x3e5a5fb4
+       .long   0x00000000,0x3fd7063a
+       .long   0xe2ac7f60,0x3e8e3da0
+       .long   0x00000000,0x3fd75064
+       .long   0x71f51a7b,0x3e819e20
+       .long   0x00000000,0x3fd79acb
+       .long   0x5b924234,0x3e5e43ae
+       .long   0x00000000,0x3fd7d67c
+       .long   0xe9aedf37,0x3e701a2b
+       .long   0x00000000,0x3fd8214f
+       .long   0xeddd33ea,0x3e6b6f51
+       .long   0x00000000,0x3fd86c5f
+       .long   0xe732b3c4,0x3e79375f
+       .long   0x00000000,0x3fd8b7ac
+       .long   0xe47cb9df,0x3e7e831b
+       .long   0x00000000,0x3fd8f416
+       .long   0xe392d3c8,0x3e8abc37
+       .long   0x00000000,0x3fd93fd2
+       .long   0x28b35c77,0x3e80852d
+       .long   0x00000000,0x3fd98bcd
+       .long   0xd29cea36,0x3e69f374
+       .long   0x00000000,0x3fd9c8c3
+       .long   0xb3d7b0e6,0x3e542981
+       .long   0x00000000,0x3fda152f
+       .long   0x1fe6d5ac,0x3e8b2bfb
+       .long   0x00000000,0x3fda527f
+       .long   0xf32e5dda,0x3e6f6f5c
+       .long   0x00000000,0x3fda9f5e
+       .long   0xd34d0d30,0x3e65abaa
+       .long   0x00000000,0x3fdadd0b
+       .long   0xe0ac9602,0x3e7bd47f
+       .long   0x00000000,0x3fdb2a5d
+       .long   0x7c5c784b,0x3e833601
+       .long   0x00000000,0x3fdb6867
+       .long   0xd7b0821f,0x3e5b887c
+       .long   0x00000000,0x3fdbb62f
+       .long   0xcd0a8f6a,0x3e83eccc
+       .long   0x00000000,0x3fdbf497
+       .long   0x7500a4e8,0x3e7ba0e6
+       .long   0x00000000,0x3fdc332a
+       .long   0xfc8712bb,0x3e885a8b
+       .long   0x00000000,0x3fdc819d
+       .long   0xf7a3a78f,0x3e81c336
+       .long   0x00000000,0x3fdcc090
+       .long   0x4ad8a38b,0x3e7846b4
+       .long   0x00000000,0x3fdcffae
+       .long   0xfcfc3a99,0x3e7db50f
+       .long   0x00000000,0x3fdd3ef7
+       .long   0x433cccd2,0x3e238809
+       .long   0x00000000,0x3fdd8e50
+       .long   0x6828fa82,0x3e721b2e
+       .long   0x00000000,0x3fddcdfb
+       .long   0xfc7c49c1,0x3e82848b
+       .long   0x00000000,0x3fde0dd2
+       .long   0x1fce4d49,0x3e615144
+       .long   0x00000000,0x3fde4dd6
+       .long   0x77e2e8fd,0x3e68b88a
+       .long   0x00000000,0x3fde8e06
+       .long   0x22a961b0,0x3e8fd353
+       .long   0x00000000,0x3fdece62
+       .long   0x266f2e1f,0x3e72854e
+       .long   0x00000000,0x3fdf1f16
+       .long   0xc69211fe,0x3e8520c7
+       .long   0x00000000,0x3fdf5fd8
+       .long   0xaba878d5,0x3e826fcf
+       .long   0x00000000,0x3fdfa0c8
+       .long   0xcd5b35b1,0x3e726ed8
+       .long   0x00000000,0x3fdfe1e6
+       .long   0x678a4f1c,0x3e49054d
+       .long   0x00000000,0x3fe01199
+       .long   0x3bc19f18,0x3e5d23cb
+       .long   0x00000000,0x3fe03256
+       .long   0x12772acb,0x3e87af35
+       .long   0x00000000,0x3fe0532a
+       .long   0x2849c88a,0x3e67f5fc
+       .long   0x00000000,0x3fe07416
+       .long   0x0e574fa1,0x3e84fce2
+       .long   0x00000000,0x3fe08cd6
+       .long   0x0ec2b5fa,0x3e857044
+       .long   0x00000000,0x3fe0adeb
+       .long   0xd031f353,0x3e6d5d1d
+       .long   0x00000000,0x3fe0cf18
+       .long   0xdae75c4d,0x3e99a159
+       .long   0x00000000,0x3fe0f05c
+       .long   0x1553afb9,0x3e90eaf1
+       .long   0x00000000,0x3fe111b9
+       .long   0xdcc5c3c7,0x3e8bc6f3
+       .long   0x00000000,0x3fe1332e
+       .long   0x1109e597,0x3e94ef84
+       .long   0x00000000,0x3fe154bb
+       .long   0xd82adea4,0x3e937f40
+       .long   0x00000000,0x3fe16df5
+       .long   0x78336a2f,0x3e96dc5a
+       .long   0x00000000,0x3fe18fad
+       .long   0x84c2c804,0x3e90935b
+       .long   0x00000000,0x3fe1b17e
+       .long   0x04fd30aa,0x3e8a837a
+       .long   0x00000000,0x3fe1caeb
+       .long   0xd924b0ac,0x3e99061d
+       .long   0x00000000,0x3fe1ece7
+       .long   0xef9b9d01,0x3e7ed700
+       .long   0x00000000,0x3fe20efd
+       .long   0x202c81ec,0x3e9c6ebb
+       .long   0x00000000,0x3fe2289d
+       .long   0xfc0d7d76,0x3e936d4d
+       .long   0x00000000,0x3fe24adf
+       .long   0x9f8756ba,0x3e9a35d7
+       .long   0x00000000,0x3fe26d3a
+       .long   0xe7c79d83,0x3e584ee3
+       .long   0x00000000,0x3fe28710
+       .long   0x942065a0,0x3e7d9e0d
+       .long   0x00000000,0x3fe2a998
+       .long   0x2175afbf,0x3e872108
+       .long   0x00000000,0x3fe2c38f
+       .long   0xfaf6283c,0x3e9f5809
+       .long   0x00000000,0x3fe2e644
+       .long   0x411d0507,0x3e871209
+       .long   0x00000000,0x3fe3005e
+       .long   0x370c24bf,0x3e9c3b11
+       .long   0x00000000,0x3fe32341
+       .long   0x8044bb5a,0x3e9bce8e
+       .long   0x00000000,0x3fe33d7d
+       .long   0x698ea854,0x3e98aca0
+       .long   0x00000000,0x3fe3608f
+       .long   0xd4d873bb,0x3e972a8e
+       .long   0x00000000,0x3fe37aee
+       .long   0x615e8182,0x3e8f669b
+       .long   0x00000000,0x3fe39e2f
+       .long   0xdda5b49a,0x3e98d1f4
+       .long   0x00000000,0x3fe3b8b1
+       .long   0xe72383f7,0x3e9cc279
+       .long   0x00000000,0x3fe3dc21
+       .long   0x497497f1,0x3e9c6774
+       .long   0x00000000,0x3fe3f6c7
+       .long   0x801bd0e6,0x3e82c7f6
+       .long   0x00000000,0x3fe4117d
+       .long   0xd0ee28b4,0x3e9dfdd6
+       .long   0x00000000,0x3fe43531
+       .long   0xb70d3761,0x3e92d3a2
+       .long   0x00000000,0x3fe4500b
+       .long   0xe7d6bcb2,0x3e9c8343
+       .long   0x00000000,0x3fe46af4
+       .long   0x90d43957,0x3e693179
+       .long   0x00000000,0x3fe48eef
+       .long   0xf12570df,0x3e799eab
+       .long   0x00000000,0x3fe4a9fd
+       .long   0x1b88755d,0x3e78c5f8
+       .long   0x00000000,0x3fe4c51b
+       .long   0xdf99a22c,0x3e7369be
+       .long   0x00000000,0x3fe4e049
+       .long   0x6ed50f62,0x3e88fd93
+       .long   0x00000000,0x3fe5049f
+       .long   0x978605ff,0x3e9c6042
+       .long   0x00000000,0x3fe51ff2
+       .long   0xe6c85f4c,0x3e930ae6
+       .long   0x00000000,0x3fe53b56
+       .long   0xc3275ba6,0x3e92e7b6
+       .long   0x00000000,0x3fe556ca
+       .long   0x91597938,0x3e9e6401
+       .long   0x00000000,0x3fe5724e
+       .long   0x448ebb62,0x3e3d2dee
+       .long   0x00000000,0x3fe59719
+       .long   0x47501b6d,0x3e9b432e
+       .long   0x00000000,0x3fe5b2c3
+       .long   0x571fa7cd,0x3e83cf9b
+       .long   0x00000000,0x3fe5ce7f
+       .long   0x7359819d,0x3e8dc615
+       .long   0x00000000,0x3fe5ea4b
+       .long   0xc78a85ed,0x3e8973c3
+       .long   0x00000000,0x3fe60628
+       .long   0xc15a9f3d,0x3e77d788
+       .long   0x00000000,0x3fe62216
+       .long   0x51952736,0x3e9d2538
+       .long   0x00000000,0x3fe63e14
+       .long   0xde792c07,0x3e94dab9
+       .long   0x00000000,0x3fe65a24
+       .long   0x5bfa4318,0x3e8f5be1
+       .long   0x00000000,0x3fe67645
+       .long   0x55090ec8,0x3e903b26
+       .long   0x00000000,0x3fe69277
+       .long   0xc78b6175,0x3e99236f
+       .long   0x00000000,0x3fe6aeba
+       .long   0x3a80db6a,0x3e8a1972
+       .long   0x00000000,0x3fe6cb0f
+       .long   0xf558aa96,0x3e8d43a2
+       .long   0x00000000,0x3fe6e775
+       .long   0xd9a82f2e,0x3e424ee3
+       .long   0x00000000,0x3fe703ed
+       .long   0x583878f6,0x3e764d8e
+       .long   0x00000000,0x3fe72076
+       .long   0xc1150a3e,0x3e379604
+       .long   0x00000000,0x3fe73d11
+       .long   0xed85584b,0x3e93b229
+       .long   0x00000000,0x3fe759bd
+       .long   0x451a7b48,0x3e62967a
+       .long   0x00000000,0x3fe7767c
+       .long   0xc044e72d,0x3e8e12d7
+       .long   0x00000000,0x3fe7934c
+       .long   0xfdfb6949,0x3e9ca45d
+       .long   0x00000000,0x3fe7b02e
+       .long   0xff690fce,0x3e9244fc
+       .long   0x00000000,0x3fe7c37a
+       .long   0x81487a2c,0x3e7e9cea
+       .long   0x00000000,0x3fe7e07b
+       .long   0xd0ad2d9a,0x3e760da0
+       .long   0x00000000,0x3fe7fd8e
+       .long   0x096f45d9,0x3e8d7703
+       .long   0x00000000,0x3fe81ab3
+       .long   0x1b17115b,0x3e78dbee
+       .long   0x00000000,0x3fe837eb
+       .long   0x7c252ee0,0x3e8dc5a4
+       .long   0x00000000,0x3fe85535
+       .long   0x42d5123f,0x3e950116
+       .long   0x00000000,0x3fe868c6
+       .long   0xf11e41be,0x3e4c4eb7
+       .long   0x00000000,0x3fe88630
+       .long   0xdb2890b4,0x3e7773b8
+       .long   0x00000000,0x3fe8a3ac
+       .long   0x7ffb4479,0x3e7bc8e7
+       .long   0x00000000,0x3fe8c13b
+       .long   0x237693b3,0x3e8c388f
+       .long   0x00000000,0x3fe8d4fa
+       .long   0x45fcf1a0,0x3e731cd4
+       .long   0x00000000,0x3fe8f2a9
+       .long   0xe4895b91,0x3e9fae07
+       .long   0x00000000,0x3fe9106a
+       .long   0x42d2824e,0x3e7d140d
+       .long   0x00000000,0x3fe9244c
+       .long   0x39900f67,0x3e75c3c8
+       .long   0x00000000,0x3fe9422e
+       .long   0xa314252b,0x3e902422
+       .long   0x00000000,0x3fe96023
+       .long   0xf2a6b8ef,0x3e7b9be8
+       .long   0x00000000,0x3fe97427
+       .long   0x1476f5e9,0x3e66b188
+       .long   0x00000000,0x3fe9923d
+       .long   0xdde10a6f,0x3e93c377
+       .long   0x00000000,0x3fe9b066
+       .long   0x4944a32c,0x3e817cad
+       .long   0x00000000,0x3fe9c48d
+       .long   0xc738e7ef,0x3e9927f2
+       .long   0x00000000,0x3fe9e2d7
+       .long   0xd25cfd94,0x3e7ccc41
+       .long   0x00000000,0x3fea0136
+       .long   0x2210e81b,0x3e8382fa
+       .long   0x00000000,0x3fea1580
+       .long   0x1e690ce2,0x3e7752a7
+       .long   0x00000000,0x3fea3400
+       .long   0x122315d2,0x3e94cfee
+       .long   0x00000000,0x3fea4860
+       .long   0xce98333b,0x3e80536e
+       .long   0x00000000,0x3fea6702
+       .long   0xc30f00e9,0x3e838b7e
+       .long   0x00000000,0x3fea7b79
+       .long   0x05b0c779,0x3e9dc380
+       .long   0x00000000,0x3fea9a3c
+       .long   0xdd6dd3fe,0x3e6be168
+       .long   0x00000000,0x3feab915
+       .long   0x26e0d276,0x3e966757
+       .long   0x00000000,0x3feacdb0
+       .long   0x0aad615c,0x3e880252
+       .long   0x00000000,0x3feaecab
+       .long   0x7927096a,0x3e607c31
+       .long   0x00000000,0x3feb015e
+       .long   0x53b3d90e,0x3e596513
+       .long   0x00000000,0x3feb161a
+       .long   0x8f2f0570,0x3e90ec3a
+       .long   0x00000000,0x3feb3545
+       .long   0x81193954,0x3e9cb640
+       .long   0x00000000,0x3feb4a18
+       .long   0x311e7236,0x3e936479
+       .long   0x00000000,0x3feb6967
+       .long   0x3a42a413,0x3e9210e8
+       .long   0x00000000,0x3feb7e52
+       .long   0x4a0daeb2,0x3e9a1717
+       .long   0x00000000,0x3feb9dc4
+       .long   0xce900653,0x3e925bb7
+       .long   0x00000000,0x3febb2c7
+       .long   0xb5087588,0x3e95dbb8
+       .long   0x00000000,0x3febd25d
+       .long   0x4a41204c,0x3e8d0aa9
+       .long   0x00000000,0x3febe778
+       .long   0x69a0d774,0x3e9c772f
+       .long   0x00000000,0x3febfc9c
+       .long   0x79d0a9a5,0x3e97b6a0
+       .long   0x00000000,0x3fec1c65
+       .long   0xd26f1a12,0x3e8f7402
+       .long   0x00000000,0x3fec31a2
+       .long   0x1243bc84,0x3e4db2f1
+       .long   0x00000000,0x3fec46e9
+       .long   0x477e1755,0x3e80dcc2
+       .long   0x00000000,0x3fec66e5
+       .long   0xc2f904c1,0x3e8b1e31
+       .long   0x00000000,0x3fec7c44
+       .long   0x1785b0c4,0x3e8fb619
+       .long   0x00000000,0x3fec91ad
+       .long   0xedb052ef,0x3e98832d
+       .long   0x00000000,0x3fecb1dd
+       .long   0x9e373618,0x3e98c822
+       .long   0x00000000,0x3fecc75f
+       .long   0x32954637,0x3e9a46e7
+       .long   0x00000000,0x3fecdceb
+       .long   0xf0e6b2a9,0x3e996305
+       .long   0x00000000,0x3fecfd50
+       .long   0x1a6614ee,0x3e68c160
+       .long   0x00000000,0x3fed12f6
+       .long   0x09e33b28,0x3e9229c4
+       .long   0x00000000,0x3fed28a5
+       .long   0xe53b994c,0x3e7f281b
+       .long   0x00000000,0x3fed3e5f
+       .long   0x1124ac35,0x3e9f27f3
+       .long   0x00000000,0x3fed5f08
+       .long   0x3d2fdc03,0x3e84e779
+       .long   0x00000000,0x3fed74dc
+       .long   0x1e93fd97,0x3e416c07
+       .long   0x00000000,0x3fed8aba
+       .long   0x91b415ef,0x3e654669
+       .long   0x00000000,0x3feda0a2
+       .long   0x6495f594,0x3e9712d4
+       .long   0x00000000,0x3fedc191
+       .long   0x40171789,0x3e9ca7b2
+       .long   0x00000000,0x3fedd793
+       .long   0xe8fc4323,0x3e929afa
+       .long   0x00000000,0x3fededa0
+       .long   0xeb03bd09,0x3e9a2e96
+       .long   0x00000000,0x3fee03b7
+       .long   0xca370ea2,0x3e94a63d
+       .long   0x00000000,0x3fee19d9
+       .long   0xe30512ec,0x3e6a3bcb
+       .long   0x00000000,0x3fee3006
+       .long   0x411c95ce,0x3e99d3ed
+       .long   0x00000000,0x3fee515c
+       .long   0x35cfaf8e,0x3e3e5b57
+       .long   0x00000000,0x3fee67a4
+       .long   0x5669df6a,0x3e9fca71
+       .long   0x00000000,0x3fee7df5
+       .long   0x04f19d94,0x3e9914e2
+       .long   0x00000000,0x3fee9452
+       .long   0xcaa19134,0x3e8b511c
+       .long   0x00000000,0x3feeaaba
+       .long   0x4bb3bfb1,0x3e9ed72f
+       .long   0x00000000,0x3feec12c
+       .long   0x3c29d75e,0x3e8be8d6
+       .long   0x00000000,0x3feed7aa
+       .long   0x97da24fd,0x3e9c55d9
+       .long   0x00000000,0x3feeee32
+       .long   0x983c68ea,0x3e7ddfb1
+       .long   0x00000000,0x3fef1014
+       .long   0xf4425883,0x3e83ce66
+       .long   0x00000000,0x3fef26b8
+       .long   0xf7857f23,0x3e9055c3
+       .long   0x00000000,0x3fef3d67
+       .long   0x2805b525,0x3e9c2223
+       .long   0x00000000,0x3fef5421
+       .long   0x0c347fcf,0x3e8d59ba
+       .long   0x00000000,0x3fef6ae7
+       .long   0x7c901c44,0x3e82b110
+       .long   0x00000000,0x3fef81b8
+       .long   0x74d1b482,0x3e8b1394
+       .long   0x00000000,0x3fef9894
+       .long   0x36fb9eb2,0x3e9ca75b
+       .long   0x00000000,0x3fefaf7b
+       .long   0x629b1b7e,0x3e981a0a
+       .long   0x00000000,0x3fefc66e
+       .long   0x7b8c1116,0x3e54cc20
+       .long   0x00000000,0x3fefdd6d
+       .long   0xc0babe05,0x3e99ac8b
+       .long   0x00000000,0x3feff476
+       .type   __dlog2_la___libm_log2_table_256,@object
+       .size   __dlog2_la___libm_log2_table_256,4096
+       .space 512, 0x00        
+       .align 64
+__dlog2_la__P:
+       .long   3213235158
+       .long   1050233568
+       .long   1697350398
+       .long   3219592519
+       .long   3694740707
+       .long   1071564553
+       .long   1697260025
+       .long   3218543943
+       .long   2542794428
+       .long   1070757746
+       .long   2165113687
+       .long   3217999640
+       .long   0
+       .long   1073157447
+       .type   __dlog2_la__P,@object
+       .size   __dlog2_la__P,56
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_log2_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_log2_s_la.s
new file mode 100644 (file)
index 0000000..6ae3389
--- /dev/null
@@ -0,0 +1,730 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *  log2(x) = VGETEXP(x) + log2(VGETMANT(x))
+ *  *       VGETEXP, VGETMANT will correctly treat special cases too (including denormals)
+ *  *   mx = VGETMANT(x) is in [1,2) for all x>=0
+ *  *   log2(mx) = -log2(RCP(mx)) + log2(1 +(mx*RCP(mx)-1))
+ *  *      RCP(mx) is rounded to 4 fractional bits,
+ *  *      and the table lookup for log2(RCP(mx)) is based on a small permute instruction
+ *  *
+ *  *   LA, EP versions use interval interpolation (16 intervals)
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_log2f16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_log2f16
+
+__svml_log2f16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+
+/* GetMant(x), normalized to [.75,1.5) for x>=0, NaN for x<0 */
+        vgetmantps $11, {sae}, %zmm0, %zmm3
+        vmovups   __svml_slog2_data_internal_avx512(%rip), %zmm1
+        vgetexpps {sae}, %zmm0, %zmm5
+
+/* x<=0? */
+        vfpclassps $94, %zmm0, %k0
+        vsubps    {rn-sae}, %zmm1, %zmm3, %zmm9
+        vpsrld    $19, %zmm3, %zmm7
+        vgetexpps {sae}, %zmm3, %zmm6
+        vpermps   64+__svml_slog2_data_internal_avx512(%rip), %zmm7, %zmm1
+        vpermps   128+__svml_slog2_data_internal_avx512(%rip), %zmm7, %zmm2
+        vpermps   192+__svml_slog2_data_internal_avx512(%rip), %zmm7, %zmm4
+        vpermps   256+__svml_slog2_data_internal_avx512(%rip), %zmm7, %zmm8
+        vsubps    {rn-sae}, %zmm6, %zmm5, %zmm10
+        vfmadd213ps {rn-sae}, %zmm2, %zmm9, %zmm1
+        kmovw     %k0, %edx
+        vfmadd213ps {rn-sae}, %zmm4, %zmm9, %zmm1
+        vfmadd213ps {rn-sae}, %zmm8, %zmm9, %zmm1
+        vfmadd213ps {rn-sae}, %zmm10, %zmm9, %zmm1
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm1, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm1, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm1
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_slog2_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_log2f16,@function
+       .size   __svml_log2f16,.-__svml_log2f16
+..LN__svml_log2f16.0:
+
+.L_2__routine_start___svml_slog2_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_slog2_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    2(%rdi), %edx
+        andl      $32640, %edx
+        cmpl      $32640, %edx
+        je        .LBL_2_13
+
+
+        movss     (%rdi), %xmm2
+        xorl      %ecx, %ecx
+        pxor      %xmm1, %xmm1
+        movss     %xmm2, -16(%rsp)
+        ucomiss   %xmm1, %xmm2
+        jp        .LBL_2_3
+        je        .LBL_2_5
+
+.LBL_2_3:
+
+        movzwl    -14(%rsp), %edx
+        testl     $32640, %edx
+        jne       .LBL_2_5
+
+
+        movss     .L_2il0floatpacket.76(%rip), %xmm0
+        movl      $-27, %ecx
+        mulss     %xmm0, %xmm2
+        movss     %xmm2, -16(%rsp)
+
+.LBL_2_5:
+
+        comiss    %xmm1, %xmm2
+        jbe       .LBL_2_9
+
+
+        movaps    %xmm2, %xmm1
+        subss     .L_2il0floatpacket.90(%rip), %xmm1
+        movss     %xmm1, -20(%rsp)
+        andb      $127, -17(%rsp)
+        movss     -20(%rsp), %xmm0
+        comiss    .L_2il0floatpacket.77(%rip), %xmm0
+        jbe       .LBL_2_8
+
+
+        movzwl    -14(%rsp), %edx
+        pxor      %xmm8, %xmm8
+        andl      $32640, %edx
+        lea       __slog2_la_CoutTab(%rip), %r10
+        shrl      $7, %edx
+        movss     %xmm2, -20(%rsp)
+        movss     .L_2il0floatpacket.79(%rip), %xmm2
+        movaps    %xmm2, %xmm1
+        movss     .L_2il0floatpacket.88(%rip), %xmm6
+        lea       -127(%rcx,%rdx), %r9d
+        movzwl    -18(%rsp), %ecx
+        andl      $-32641, %ecx
+        addl      $16256, %ecx
+        movw      %cx, -18(%rsp)
+        movss     -20(%rsp), %xmm3
+        movaps    %xmm3, %xmm0
+        addss     %xmm3, %xmm1
+        addss     .L_2il0floatpacket.78(%rip), %xmm0
+        cvtsi2ss  %r9d, %xmm8
+        movss     %xmm0, -24(%rsp)
+        movl      -24(%rsp), %edi
+        movss     %xmm1, -24(%rsp)
+        andl      $127, %edi
+        movss     -24(%rsp), %xmm7
+        subss     %xmm2, %xmm7
+        lea       (%rdi,%rdi,2), %r8d
+        movss     (%r10,%r8,4), %xmm5
+        subss     %xmm7, %xmm3
+        addss     4(%r10,%r8,4), %xmm8
+        mulss     %xmm5, %xmm7
+        mulss     %xmm3, %xmm5
+        subss     .L_2il0floatpacket.80(%rip), %xmm7
+        movaps    %xmm7, %xmm4
+        addss     %xmm7, %xmm8
+        addss     %xmm5, %xmm4
+        mulss     %xmm4, %xmm6
+        addss     .L_2il0floatpacket.87(%rip), %xmm6
+        mulss     %xmm4, %xmm6
+        addss     .L_2il0floatpacket.86(%rip), %xmm6
+        mulss     %xmm4, %xmm6
+        addss     .L_2il0floatpacket.85(%rip), %xmm6
+        mulss     %xmm4, %xmm6
+        addss     .L_2il0floatpacket.84(%rip), %xmm6
+        mulss     %xmm4, %xmm6
+        addss     .L_2il0floatpacket.83(%rip), %xmm6
+        mulss     %xmm4, %xmm6
+        addss     .L_2il0floatpacket.82(%rip), %xmm6
+        mulss     %xmm4, %xmm6
+        addss     .L_2il0floatpacket.81(%rip), %xmm6
+        mulss     %xmm6, %xmm7
+        mulss     %xmm5, %xmm6
+        addss     8(%r10,%r8,4), %xmm6
+        addss     %xmm5, %xmm6
+        addss     %xmm6, %xmm7
+        addss     %xmm7, %xmm8
+        movss     %xmm8, (%rsi)
+        ret
+
+.LBL_2_8:
+
+        movss     .L_2il0floatpacket.80(%rip), %xmm0
+        mulss     %xmm0, %xmm1
+        movss     .L_2il0floatpacket.88(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.87(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.86(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.85(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.84(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.83(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.82(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     .L_2il0floatpacket.81(%rip), %xmm2
+        mulss     %xmm1, %xmm2
+        addss     %xmm1, %xmm2
+        movss     %xmm2, (%rsi)
+        ret
+
+.LBL_2_9:
+
+        ucomiss   %xmm1, %xmm2
+        jp        .LBL_2_10
+        je        .LBL_2_12
+
+.LBL_2_10:
+
+        divss     %xmm1, %xmm1
+        movss     %xmm1, (%rsi)
+        movl      $1, %eax
+
+
+        ret
+
+.LBL_2_12:
+
+        movss     .L_2il0floatpacket.89(%rip), %xmm0
+        movl      $2, %eax
+        divss     %xmm1, %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_13:
+
+        movb      3(%rdi), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_15
+
+.LBL_2_14:
+
+        movss     (%rdi), %xmm0
+        mulss     %xmm0, %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_15:
+
+        testl     $8388607, (%rdi)
+        jne       .LBL_2_14
+
+
+        movl      $1, %eax
+        pxor      %xmm1, %xmm1
+        pxor      %xmm0, %xmm0
+        divss     %xmm0, %xmm1
+        movss     %xmm1, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_slog2_cout_rare_internal,@function
+       .size   __svml_slog2_cout_rare_internal,.-__svml_slog2_cout_rare_internal
+..LN__svml_slog2_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_slog2_data_internal_avx512:
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   3198647882
+       .long   3196759613
+       .long   3194486322
+       .long   3192115638
+       .long   3190203785
+       .long   3188646043
+       .long   3187058849
+       .long   3184933705
+       .long   3210235473
+       .long   3208544417
+       .long   3207107312
+       .long   3205878647
+       .long   3204822309
+       .long   3203370544
+       .long   3201784975
+       .long   3200401796
+       .long   1056280844
+       .long   1055933857
+       .long   1055381630
+       .long   1054718852
+       .long   1054004959
+       .long   1053277138
+       .long   1052558383
+       .long   1051862550
+       .long   1049572249
+       .long   1051796030
+       .long   1053416266
+       .long   1054571017
+       .long   1055365658
+       .long   1055881163
+       .long   1056180132
+       .long   1056311220
+       .long   3208161588
+       .long   3208150502
+       .long   3208115952
+       .long   3208053899
+       .long   3207964810
+       .long   3207851268
+       .long   3207716694
+       .long   3207564674
+       .long   3208734740
+       .long   3208490840
+       .long   3208338440
+       .long   3208247850
+       .long   3208197907
+       .long   3208173537
+       .long   3208164045
+       .long   3208161890
+       .long   1069066811
+       .long   1069066688
+       .long   1069065960
+       .long   1069064014
+       .long   1069060299
+       .long   1069054385
+       .long   1069045976
+       .long   1069034896
+       .long   1069049182
+       .long   1069058106
+       .long   1069062890
+       .long   1069065263
+       .long   1069066312
+       .long   1069066697
+       .long   1069066799
+       .long   1069066811
+       .type   __svml_slog2_data_internal_avx512,@object
+       .size   __svml_slog2_data_internal_avx512,320
+       .align 32
+__slog2_la_CoutTab:
+       .long   1136175680
+       .long   0
+       .long   0
+       .long   1135986583
+       .long   1018822656
+       .long   930849160
+       .long   1135809305
+       .long   1026916352
+       .long   941737263
+       .long   1135632026
+       .long   1032306688
+       .long   936581683
+       .long   1135466566
+       .long   1035100160
+       .long   929197062
+       .long   1135301106
+       .long   1037934592
+       .long   897678483
+       .long   1135135647
+       .long   1040498688
+       .long   3059980496
+       .long   1134982005
+       .long   1041852416
+       .long   908010313
+       .long   1134828364
+       .long   1043226624
+       .long   3073739761
+       .long   1134686541
+       .long   1044510720
+       .long   918631281
+       .long   1134538809
+       .long   1045868544
+       .long   3062817788
+       .long   1134402896
+       .long   1047134208
+       .long   3064656237
+       .long   1134266982
+       .long   1048416256
+       .long   3029590737
+       .long   1134131069
+       .long   1049145856
+       .long   903671587
+       .long   1134001065
+       .long   1049775616
+       .long   911388989
+       .long   1133876970
+       .long   1050384896
+       .long   3069885983
+       .long   1133752875
+       .long   1051001344
+       .long   3037530952
+       .long   1133634689
+       .long   1051596288
+       .long   3069922038
+       .long   1133516503
+       .long   1052198400
+       .long   3070222063
+       .long   1133404227
+       .long   1052776960
+       .long   919559368
+       .long   1133291951
+       .long   1053363200
+       .long   840060372
+       .long   1133185584
+       .long   1053924864
+       .long   915603033
+       .long   1133079217
+       .long   1054493184
+       .long   921334924
+       .long   1132978759
+       .long   1055036416
+       .long   896601826
+       .long   1132872392
+       .long   1055618048
+       .long   908913293
+       .long   1132777843
+       .long   1056141312
+       .long   3065728751
+       .long   1132677386
+       .long   1056702976
+       .long   909020429
+       .long   1132582837
+       .long   1057101312
+       .long   3048020321
+       .long   1132494198
+       .long   1057354752
+       .long   3038815896
+       .long   1132337219
+       .long   1057628160
+       .long   3068137421
+       .long   1132159940
+       .long   1057887232
+       .long   3069993595
+       .long   1131994480
+       .long   1058131456
+       .long   3054354312
+       .long   1131817202
+       .long   1058395904
+       .long   910223436
+       .long   1131651742
+       .long   1058645504
+       .long   3046952660
+       .long   1131486282
+       .long   1058897664
+       .long   3057670844
+       .long   1131332641
+       .long   1059133952
+       .long   924929721
+       .long   1131178999
+       .long   1059373056
+       .long   3068093797
+       .long   1131025358
+       .long   1059614208
+       .long   3058851683
+       .long   1130871717
+       .long   1059857920
+       .long   3069897752
+       .long   1130729894
+       .long   1060084736
+       .long   924446297
+       .long   1130576253
+       .long   1060333312
+       .long   903058075
+       .long   1130434430
+       .long   1060564992
+       .long   3052757441
+       .long   1130304426
+       .long   1060779264
+       .long   3045479197
+       .long   1130162603
+       .long   1061015040
+       .long   924699798
+       .long   1130032599
+       .long   1061233664
+       .long   3070937808
+       .long   1129890776
+       .long   1061473792
+       .long   925912756
+       .long   1129772591
+       .long   1061676032
+       .long   923952205
+       .long   1129642586
+       .long   1061900544
+       .long   906547304
+       .long   1129512582
+       .long   1062127104
+       .long   3050351427
+       .long   1129394397
+       .long   1062334976
+       .long   3070601694
+       .long   1129276211
+       .long   1062544384
+       .long   900519722
+       .long   1129158025
+       .long   1062755840
+       .long   3055774932
+       .long   1129039840
+       .long   1062969088
+       .long   3053661845
+       .long   1128921654
+       .long   1063184384
+       .long   3073448373
+       .long   1128815287
+       .long   1063379456
+       .long   907090876
+       .long   1128697101
+       .long   1063598336
+       .long   881051555
+       .long   1128590734
+       .long   1063796992
+       .long   898320955
+       .long   1128484367
+       .long   1063997440
+       .long   3068804107
+       .long   1128378000
+       .long   1064199168
+       .long   923531617
+       .long   1128283452
+       .long   1064380416
+       .long   3070994608
+       .long   1128177085
+       .long   1064585472
+       .long   901920533
+       .long   1128082536
+       .long   1064769536
+       .long   3071653428
+       .long   1127976169
+       .long   1064977920
+       .long   903017594
+       .long   1127881621
+       .long   1065164800
+       .long   911713416
+       .long   1127787072
+       .long   1065353216
+       .long   0
+       .long   1065353216
+       .long   0
+       .long   1207959616
+       .long   1174405120
+       .long   1002438656
+       .long   1291845632
+       .long   0
+       .long   1065353216
+       .long   1136175680
+       .long   3212771328
+       .long   3065082383
+       .long   841219731
+       .long   2913632803
+       .long   691870088
+       .long   2765780188
+       .long   545377693
+       .long   2619180638
+       .type   __slog2_la_CoutTab,@object
+       .size   __slog2_la_CoutTab,848
+       .align 4
+.L_2il0floatpacket.76:
+       .long   0x4d000000
+       .type   .L_2il0floatpacket.76,@object
+       .size   .L_2il0floatpacket.76,4
+       .align 4
+.L_2il0floatpacket.77:
+       .long   0x3bc00000
+       .type   .L_2il0floatpacket.77,@object
+       .size   .L_2il0floatpacket.77,4
+       .align 4
+.L_2il0floatpacket.78:
+       .long   0x48000040
+       .type   .L_2il0floatpacket.78,@object
+       .size   .L_2il0floatpacket.78,4
+       .align 4
+.L_2il0floatpacket.79:
+       .long   0x46000000
+       .type   .L_2il0floatpacket.79,@object
+       .size   .L_2il0floatpacket.79,4
+       .align 4
+.L_2il0floatpacket.80:
+       .long   0x43b8aa40
+       .type   .L_2il0floatpacket.80,@object
+       .size   .L_2il0floatpacket.80,4
+       .align 4
+.L_2il0floatpacket.81:
+       .long   0xbf7f0000
+       .type   .L_2il0floatpacket.81,@object
+       .size   .L_2il0floatpacket.81,4
+       .align 4
+.L_2il0floatpacket.82:
+       .long   0xb6b1720f
+       .type   .L_2il0floatpacket.82,@object
+       .size   .L_2il0floatpacket.82,4
+       .align 4
+.L_2il0floatpacket.83:
+       .long   0x3223fe93
+       .type   .L_2il0floatpacket.83,@object
+       .size   .L_2il0floatpacket.83,4
+       .align 4
+.L_2il0floatpacket.84:
+       .long   0xadaa8223
+       .type   .L_2il0floatpacket.84,@object
+       .size   .L_2il0floatpacket.84,4
+       .align 4
+.L_2il0floatpacket.85:
+       .long   0x293d1988
+       .type   .L_2il0floatpacket.85,@object
+       .size   .L_2il0floatpacket.85,4
+       .align 4
+.L_2il0floatpacket.86:
+       .long   0xa4da74dc
+       .type   .L_2il0floatpacket.86,@object
+       .size   .L_2il0floatpacket.86,4
+       .align 4
+.L_2il0floatpacket.87:
+       .long   0x2081cd9d
+       .type   .L_2il0floatpacket.87,@object
+       .size   .L_2il0floatpacket.87,4
+       .align 4
+.L_2il0floatpacket.88:
+       .long   0x9c1d865e
+       .type   .L_2il0floatpacket.88,@object
+       .size   .L_2il0floatpacket.88,4
+       .align 4
+.L_2il0floatpacket.89:
+       .long   0xbf800000
+       .type   .L_2il0floatpacket.89,@object
+       .size   .L_2il0floatpacket.89,4
+       .align 4
+.L_2il0floatpacket.90:
+       .long   0x3f800000
+       .type   .L_2il0floatpacket.90,@object
+       .size   .L_2il0floatpacket.90,4
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_log_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_log_d_la.s
new file mode 100644 (file)
index 0000000..86074e6
--- /dev/null
@@ -0,0 +1,1098 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *
+ *  *  log(x) = -log(Rcp) + log(Rcp*x),
+ *  *    where Rcp ~ 1/x (accuracy ~9 bits, obtained by rounding HW approximation to 1+9 mantissa bits)
+ *  *
+ *  *   Reduced argument R=Rcp*x-1 is used to approximate log(1+R) as polynomial
+ *  *
+ *  *   log(Rcp) = exponent_Rcp*log(2) + log(mantissa_Rcp)
+ *  *     -log(mantissa_Rcp) is obtained from a lookup table, accessed by a 9-bit index
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_log8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_log8
+
+__svml_log8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vgetmantpd $8, {sae}, %zmm0, %zmm6
+        vmovups   128+__svml_dlog_data_internal_avx512(%rip), %zmm4
+        vmovups   384+__svml_dlog_data_internal_avx512(%rip), %zmm11
+        vmovups   448+__svml_dlog_data_internal_avx512(%rip), %zmm14
+        vmovups   512+__svml_dlog_data_internal_avx512(%rip), %zmm12
+        vmovups   256+__svml_dlog_data_internal_avx512(%rip), %zmm10
+
+/* Start polynomial evaluation */
+        vmovups   320+__svml_dlog_data_internal_avx512(%rip), %zmm1
+        vmovups   640+__svml_dlog_data_internal_avx512(%rip), %zmm13
+        vmovups   704+__svml_dlog_data_internal_avx512(%rip), %zmm15
+
+/* Prepare exponent correction: DblRcp<0.75? */
+        vmovups   192+__svml_dlog_data_internal_avx512(%rip), %zmm3
+
+/* Table lookup */
+        vmovups   __svml_dlog_data_internal_avx512(%rip), %zmm5
+
+/* GetExp(x) */
+        vgetexppd {sae}, %zmm0, %zmm7
+
+/* DblRcp ~ 1/Mantissa */
+        vrcp14pd  %zmm6, %zmm8
+
+/* x<=0? */
+        vfpclasspd $94, %zmm0, %k0
+
+/* round DblRcp to 4 fractional bits (RN mode, no Precision exception) */
+        vrndscalepd $88, {sae}, %zmm8, %zmm2
+        kmovw     %k0, %edx
+
+/* Reduced argument: R = DblRcp*Mantissa - 1 */
+        vfmsub213pd {rn-sae}, %zmm4, %zmm2, %zmm6
+        vcmppd    $17, {sae}, %zmm3, %zmm2, %k1
+        vfmadd231pd {rn-sae}, %zmm6, %zmm11, %zmm14
+        vmovups   576+__svml_dlog_data_internal_avx512(%rip), %zmm11
+        vfmadd231pd {rn-sae}, %zmm6, %zmm10, %zmm1
+        vfmadd231pd {rn-sae}, %zmm6, %zmm13, %zmm15
+
+/* R^2 */
+        vmulpd    {rn-sae}, %zmm6, %zmm6, %zmm8
+        vfmadd231pd {rn-sae}, %zmm6, %zmm12, %zmm11
+
+/* Prepare table index */
+        vpsrlq    $48, %zmm2, %zmm9
+
+/* add 1 to Expon if DblRcp<0.75 */
+        vaddpd    {rn-sae}, %zmm4, %zmm7, %zmm7{%k1}
+        vmulpd    {rn-sae}, %zmm8, %zmm8, %zmm12
+        vfmadd213pd {rn-sae}, %zmm14, %zmm8, %zmm1
+        vfmadd213pd {rn-sae}, %zmm15, %zmm8, %zmm11
+        vpermt2pd 64+__svml_dlog_data_internal_avx512(%rip), %zmm9, %zmm5
+
+/* polynomial */
+        vfmadd213pd {rn-sae}, %zmm11, %zmm12, %zmm1
+        vfmadd213pd {rn-sae}, %zmm6, %zmm8, %zmm1
+        vaddpd    {rn-sae}, %zmm1, %zmm5, %zmm2
+        vmovups   768+__svml_dlog_data_internal_avx512(%rip), %zmm1
+        vfmadd213pd {rn-sae}, %zmm2, %zmm1, %zmm7
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm7, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm7, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm7
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dlog_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_log8,@function
+       .size   __svml_log8,.-__svml_log8
+..LN__svml_log8.0:
+
+.L_2__routine_start___svml_dlog_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dlog_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    6(%rdi), %edx
+        andl      $32752, %edx
+        cmpl      $32752, %edx
+        je        .LBL_2_12
+
+
+        movsd     (%rdi), %xmm2
+        xorl      %ecx, %ecx
+        movsd     %xmm2, -8(%rsp)
+        movzwl    -2(%rsp), %edx
+        testl     $32752, %edx
+        jne       .LBL_2_4
+
+
+        mulsd     1600+__dlog_la_CoutTab(%rip), %xmm2
+        movl      $-60, %ecx
+        movsd     %xmm2, -8(%rsp)
+
+.LBL_2_4:
+
+        movsd     1608+__dlog_la_CoutTab(%rip), %xmm0
+        comisd    %xmm0, %xmm2
+        jbe       .LBL_2_8
+
+
+        movsd     .L_2il0floatpacket.80(%rip), %xmm3
+        movaps    %xmm2, %xmm1
+        subsd     %xmm3, %xmm1
+        movsd     %xmm1, -16(%rsp)
+        andb      $127, -9(%rsp)
+        movsd     -16(%rsp), %xmm0
+        comisd    1592+__dlog_la_CoutTab(%rip), %xmm0
+        jbe       .LBL_2_7
+
+
+        movsd     %xmm2, -16(%rsp)
+        pxor      %xmm7, %xmm7
+        movzwl    -10(%rsp), %edi
+        lea       __dlog_la_CoutTab(%rip), %r10
+        andl      $-32753, %edi
+        addl      $16368, %edi
+        movw      %di, -10(%rsp)
+        movsd     -16(%rsp), %xmm4
+        movaps    %xmm4, %xmm1
+        movaps    %xmm4, %xmm2
+        movsd     1672+__dlog_la_CoutTab(%rip), %xmm8
+        movzwl    -2(%rsp), %edx
+        andl      $32752, %edx
+        addsd     1576+__dlog_la_CoutTab(%rip), %xmm1
+        addsd     1584+__dlog_la_CoutTab(%rip), %xmm2
+        movsd     %xmm1, -24(%rsp)
+        movl      -24(%rsp), %r8d
+        movsd     %xmm2, -24(%rsp)
+        andl      $127, %r8d
+        movsd     -24(%rsp), %xmm5
+        movsd     1560+__dlog_la_CoutTab(%rip), %xmm9
+        movsd     1568+__dlog_la_CoutTab(%rip), %xmm0
+        shrl      $4, %edx
+        subsd     1584+__dlog_la_CoutTab(%rip), %xmm5
+        lea       (%r8,%r8,2), %r9d
+        movsd     (%r10,%r9,8), %xmm6
+        lea       -1023(%rcx,%rdx), %ecx
+        cvtsi2sd  %ecx, %xmm7
+        subsd     %xmm5, %xmm4
+        mulsd     %xmm6, %xmm5
+        mulsd     %xmm7, %xmm9
+        subsd     %xmm3, %xmm5
+        mulsd     %xmm4, %xmm6
+        mulsd     %xmm0, %xmm7
+        addsd     8(%r10,%r9,8), %xmm9
+        addsd     16(%r10,%r9,8), %xmm7
+        addsd     %xmm5, %xmm9
+        addsd     %xmm6, %xmm7
+        movaps    %xmm5, %xmm3
+        addsd     %xmm6, %xmm3
+        mulsd     %xmm3, %xmm8
+        addsd     1664+__dlog_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm8
+        addsd     1656+__dlog_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm8
+        addsd     1648+__dlog_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm8
+        addsd     1640+__dlog_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm8
+        addsd     1632+__dlog_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm8
+        addsd     1624+__dlog_la_CoutTab(%rip), %xmm8
+        mulsd     %xmm3, %xmm8
+        mulsd     %xmm3, %xmm8
+        addsd     %xmm7, %xmm8
+        addsd     %xmm8, %xmm9
+        movsd     %xmm9, (%rsi)
+        ret
+
+.LBL_2_7:
+
+        movsd     1672+__dlog_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     1664+__dlog_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     1656+__dlog_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     1648+__dlog_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     1640+__dlog_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     1632+__dlog_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     1624+__dlog_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm1, %xmm0
+        mulsd     %xmm1, %xmm0
+        addsd     %xmm1, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_8:
+
+        ucomisd   %xmm0, %xmm2
+        jp        .LBL_2_9
+        je        .LBL_2_11
+
+.LBL_2_9:
+
+        divsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        movl      $1, %eax
+
+
+        ret
+
+.LBL_2_11:
+
+        movsd     1616+__dlog_la_CoutTab(%rip), %xmm1
+        movl      $2, %eax
+        xorps     .L_2il0floatpacket.79(%rip), %xmm1
+        divsd     %xmm0, %xmm1
+        movsd     %xmm1, (%rsi)
+        ret
+
+.LBL_2_12:
+
+        movb      7(%rdi), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_14
+
+.LBL_2_13:
+
+        movsd     (%rdi), %xmm0
+        mulsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+
+.LBL_2_14:
+
+        testl     $1048575, 4(%rdi)
+        jne       .LBL_2_13
+
+
+        cmpl      $0, (%rdi)
+        jne       .LBL_2_13
+
+
+        movsd     1608+__dlog_la_CoutTab(%rip), %xmm0
+        movl      $1, %eax
+        divsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dlog_cout_rare_internal,@function
+       .size   __svml_dlog_cout_rare_internal,.-__svml_dlog_cout_rare_internal
+..LN__svml_dlog_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dlog_data_internal_avx512:
+       .long   0
+       .long   0
+       .long   3222364838
+       .long   3215919664
+       .long   1848308454
+       .long   3216910087
+       .long   1890030548
+       .long   3217424176
+       .long   3348797986
+       .long   3217854455
+       .long   2880153102
+       .long   3218171740
+       .long   3256639170
+       .long   3218366859
+       .long   4139503623
+       .long   3218553303
+       .long   288676754
+       .long   1070754146
+       .long   1823716217
+       .long   1070569756
+       .long   1015732707
+       .long   1070240749
+       .long   1800682930
+       .long   1069924160
+       .long   2183652476
+       .long   1069619086
+       .long   1566132617
+       .long   1069101918
+       .long   3047045639
+       .long   1068533144
+       .long   2313634884
+       .long   1067467101
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   0
+       .long   1072168960
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   815627376
+       .long   1069318605
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2123607906
+       .long   3217033013
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   2632876527
+       .long   1069697314
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   4213758726
+       .long   3217380691
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   2580324188
+       .long   1070176665
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   787901
+       .long   3218079744
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   1431655526
+       .long   1070945621
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4294967238
+       .long   3219128319
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   4277811695
+       .long   1072049730
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   0
+       .long   1048576
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .long   4294967295
+       .long   2146435071
+       .type   __svml_dlog_data_internal_avx512,@object
+       .size   __svml_dlog_data_internal_avx512,1088
+       .align 32
+__dlog_la_CoutTab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1072660480
+       .long   1486880768
+       .long   1066410070
+       .long   1813744607
+       .long   3179892593
+       .long   0
+       .long   1072629760
+       .long   377487360
+       .long   1067416219
+       .long   919019713
+       .long   3179241129
+       .long   0
+       .long   1072599040
+       .long   1513619456
+       .long   1067944025
+       .long   874573033
+       .long   3178512940
+       .long   0
+       .long   1072570368
+       .long   3221749760
+       .long   1068427825
+       .long   4181665006
+       .long   3177478212
+       .long   0
+       .long   1072541696
+       .long   4162322432
+       .long   1068708823
+       .long   627020255
+       .long   1028629941
+       .long   0
+       .long   1072513024
+       .long   183107584
+       .long   1068957907
+       .long   2376703469
+       .long   1030233118
+       .long   0
+       .long   1072486400
+       .long   1053425664
+       .long   1069192557
+       .long   696277142
+       .long   1030474863
+       .long   0
+       .long   1072459776
+       .long   3996123136
+       .long   1069430535
+       .long   2630798680
+       .long   1028792016
+       .long   0
+       .long   1072435200
+       .long   3452764160
+       .long   1069600382
+       .long   624954044
+       .long   3177101741
+       .long   0
+       .long   1072409600
+       .long   207650816
+       .long   1069717971
+       .long   3272735636
+       .long   3175176575
+       .long   0
+       .long   1072386048
+       .long   2647228416
+       .long   1069827627
+       .long   3594228712
+       .long   1029303785
+       .long   0
+       .long   1072362496
+       .long   2712010752
+       .long   1069938736
+       .long   3653242769
+       .long   3176839013
+       .long   0
+       .long   1072338944
+       .long   374439936
+       .long   1070051337
+       .long   4072775574
+       .long   3176577495
+       .long   0
+       .long   1072316416
+       .long   3707174912
+       .long   1070160474
+       .long   1486946159
+       .long   1023930920
+       .long   0
+       .long   1072294912
+       .long   1443954688
+       .long   1070265993
+       .long   293532967
+       .long   3176278277
+       .long   0
+       .long   1072273408
+       .long   127762432
+       .long   1070372856
+       .long   3404145447
+       .long   3177023955
+       .long   0
+       .long   1072252928
+       .long   2053832704
+       .long   1070475911
+       .long   1575076358
+       .long   1029048544
+       .long   0
+       .long   1072232448
+       .long   3194093568
+       .long   1070580248
+       .long   1864169120
+       .long   1026866084
+       .long   0
+       .long   1072212992
+       .long   3917201408
+       .long   1070638340
+       .long   2362145246
+       .long   3175606197
+       .long   0
+       .long   1072193536
+       .long   3417112576
+       .long   1070689116
+       .long   70087871
+       .long   3174183577
+       .long   0
+       .long   1072175104
+       .long   4226777088
+       .long   1070737793
+       .long   1620410586
+       .long   3174700065
+       .long   0
+       .long   1072156672
+       .long   3168870400
+       .long   1070787042
+       .long   311238082
+       .long   1025781772
+       .long   0
+       .long   1072139264
+       .long   2150580224
+       .long   1070834092
+       .long   1664262457
+       .long   3175299224
+       .long   0
+       .long   1072120832
+       .long   4095672320
+       .long   1070884491
+       .long   1657121015
+       .long   3174674199
+       .long   0
+       .long   1072104448
+       .long   2595577856
+       .long   1070929805
+       .long   2014006823
+       .long   3175423830
+       .long   0
+       .long   1072087040
+       .long   3747176448
+       .long   1070978493
+       .long   144991708
+       .long   3171552042
+       .long   0
+       .long   1072070656
+       .long   1050435584
+       .long   1071024840
+       .long   3386227432
+       .long   1027876916
+       .long   0
+       .long   1072055296
+       .long   255516672
+       .long   1071068760
+       .long   2637594316
+       .long   1028049573
+       .long   0
+       .long   1072038912
+       .long   1640783872
+       .long   1071116120
+       .long   893247007
+       .long   1028452162
+       .long   0
+       .long   1072023552
+       .long   2940411904
+       .long   1071161011
+       .long   813240633
+       .long   1027664048
+       .long   0
+       .long   1072009216
+       .long   882917376
+       .long   1071203348
+       .long   2376597551
+       .long   3175828767
+       .long   0
+       .long   1071993856
+       .long   213966848
+       .long   1071249188
+       .long   2977204125
+       .long   1028350609
+       .long   0
+       .long   1071979520
+       .long   2921504768
+       .long   1071292428
+       .long   523218347
+       .long   1028007004
+       .long   0
+       .long   1071965184
+       .long   3186655232
+       .long   1071336119
+       .long   2352907891
+       .long   1026967097
+       .long   0
+       .long   1071951872
+       .long   2653364224
+       .long   1071377101
+       .long   2453418583
+       .long   3174349512
+       .long   0
+       .long   1071938560
+       .long   3759783936
+       .long   1071418487
+       .long   3685870403
+       .long   3175415611
+       .long   0
+       .long   1071925248
+       .long   2468364288
+       .long   1071460286
+       .long   1578908842
+       .long   3175510517
+       .long   0
+       .long   1071911936
+       .long   81903616
+       .long   1071502506
+       .long   770710269
+       .long   1026742353
+       .long   0
+       .long   1071899648
+       .long   2799321088
+       .long   1071541858
+       .long   3822266185
+       .long   1028434427
+       .long   0
+       .long   1071886336
+       .long   2142265344
+       .long   1071584911
+       .long   175901806
+       .long   3173871540
+       .long   0
+       .long   1071874048
+       .long   2944024576
+       .long   1071625048
+       .long   2747360403
+       .long   1027672159
+       .long   0
+       .long   1071862784
+       .long   3434301440
+       .long   1071653426
+       .long   4194662196
+       .long   3173893003
+       .long   0
+       .long   1071850496
+       .long   1547755520
+       .long   1071673870
+       .long   4248764681
+       .long   3172759087
+       .long   0
+       .long   1071839232
+       .long   4246986752
+       .long   1071692786
+       .long   2840205638
+       .long   3174430911
+       .long   0
+       .long   1071826944
+       .long   3418390528
+       .long   1071713619
+       .long   3041880823
+       .long   1025440860
+       .long   0
+       .long   1071816704
+       .long   4143093760
+       .long   1071731139
+       .long   2727587401
+       .long   3173965207
+       .long   0
+       .long   1071805440
+       .long   3121326080
+       .long   1071750582
+       .long   3173887692
+       .long   3174190163
+       .long   0
+       .long   1071794176
+       .long   1852893184
+       .long   1071770207
+       .long   3951060252
+       .long   1027348295
+       .long   0
+       .long   1071783936
+       .long   3636379648
+       .long   1071788208
+       .long   1684924001
+       .long   3174777086
+       .long   0
+       .long   1071773696
+       .long   516505600
+       .long   1071806366
+       .long   429181199
+       .long   3173211033
+       .long   0
+       .long   1071763456
+       .long   4186185728
+       .long   1071824681
+       .long   2044904577
+       .long   3174967132
+       .long   0
+       .long   1071753216
+       .long   877596672
+       .long   1071843159
+       .long   1396318105
+       .long   3173959727
+       .long   0
+       .long   1071742976
+       .long   2912784384
+       .long   1071861800
+       .long   448136789
+       .long   3174814192
+       .long   0
+       .long   1071733760
+       .long   3722825728
+       .long   1071878720
+       .long   714165913
+       .long   3173439560
+       .long   0
+       .long   1071723520
+       .long   2522374144
+       .long   1071897682
+       .long   3227240353
+       .long   3173394323
+       .long   0
+       .long   1071714304
+       .long   4165410816
+       .long   1071914895
+       .long   1365684961
+       .long   3174365060
+       .long   0
+       .long   1071705088
+       .long   3477135360
+       .long   1071932251
+       .long   368482985
+       .long   3174140821
+       .long   0
+       .long   1071695872
+       .long   2079455232
+       .long   1071949752
+       .long   1320576317
+       .long   1026822714
+       .long   0
+       .long   1071687680
+       .long   851795968
+       .long   1071965432
+       .long   3702467026
+       .long   1025224125
+       .long   0
+       .long   1071678464
+       .long   647743488
+       .long   1071983213
+       .long   772992109
+       .long   3174038459
+       .long   0
+       .long   1071670272
+       .long   26537984
+       .long   1071999146
+       .long   2360214276
+       .long   3174861275
+       .long   0
+       .long   1071661056
+       .long   1547061248
+       .long   1072017216
+       .long   2886781435
+       .long   1026423395
+       .long   0
+       .long   1071652864
+       .long   2854492160
+       .long   1072033410
+       .long   215631550
+       .long   1025638968
+       .long   0
+       .long   1071644672
+       .long   4277811200
+       .long   1072049730
+       .long   2479318832
+       .long   1026487127
+       .long   4277811200
+       .long   1072049730
+       .long   2479318832
+       .long   1026487127
+       .long   64
+       .long   1120927744
+       .long   0
+       .long   1094713344
+       .long   0
+       .long   1065615360
+       .long   0
+       .long   1135607808
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   3219128320
+       .long   1431655955
+       .long   1070945621
+       .long   610
+       .long   3218079744
+       .long   2545118337
+       .long   1070176665
+       .long   1378399119
+       .long   3217380693
+       .long   612435357
+       .long   1069697472
+       .long   94536557
+       .long   3217031348
+       .type   __dlog_la_CoutTab,@object
+       .size   __dlog_la_CoutTab,1680
+       .align 16
+.L_2il0floatpacket.79:
+       .long   0x00000000,0x80000000,0x00000000,0x00000000
+       .type   .L_2il0floatpacket.79,@object
+       .size   .L_2il0floatpacket.79,16
+       .align 8
+.L_2il0floatpacket.80:
+       .long   0x00000000,0x3ff00000
+       .type   .L_2il0floatpacket.80,@object
+       .size   .L_2il0floatpacket.80,8
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_log_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_log_s_la.s
new file mode 100644 (file)
index 0000000..771d7b7
--- /dev/null
@@ -0,0 +1,932 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *
+ *  *   log(x) = exponent_x*log(2) + log(mantissa_x),         if mantissa_x<4/3
+ *  *   log(x) = (exponent_x+1)*log(2) + log(0.5*mantissa_x), if mantissa_x>4/3
+ *  *
+ *  *    R = mantissa_x - 1,     if mantissa_x<4/3
+ *  *    R = 0.5*mantissa_x - 1, if mantissa_x>4/3
+ *  *    |R|< 1/3
+ *  *
+ *  *    log(1+R) is approximated as a polynomial: degree 9 for 1-ulp, degree 7 for 4-ulp,
+ *  *    degree 3 for half-precision
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_logf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_logf16
+
+__svml_logf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vgetmantps $11, {sae}, %zmm0, %zmm3
+        vmovups   __svml_slog_data_internal_avx512(%rip), %zmm1
+        vgetexpps {sae}, %zmm0, %zmm5
+        vmovups   320+__svml_slog_data_internal_avx512(%rip), %zmm10
+        vpsrld    $19, %zmm3, %zmm7
+        vgetexpps {sae}, %zmm3, %zmm6
+
+/* reduced argument */
+        vsubps    {rn-sae}, %zmm1, %zmm3, %zmm11
+
+/*
+ * read coefficients for polynomial interpolation,
+ * and evaluate polynomial
+ */
+        vpermps   64+__svml_slog_data_internal_avx512(%rip), %zmm7, %zmm1
+        vpermps   128+__svml_slog_data_internal_avx512(%rip), %zmm7, %zmm2
+        vsubps    {rn-sae}, %zmm6, %zmm5, %zmm9
+        vpermps   192+__svml_slog_data_internal_avx512(%rip), %zmm7, %zmm4
+        vpermps   256+__svml_slog_data_internal_avx512(%rip), %zmm7, %zmm8
+
+/* x<=0? */
+        vfpclassps $94, %zmm0, %k0
+        vfmadd213ps {rn-sae}, %zmm2, %zmm11, %zmm1
+
+/* exponent*log(2) */
+        vmulps    {rn-sae}, %zmm10, %zmm9, %zmm12
+        vfmadd213ps {rn-sae}, %zmm4, %zmm11, %zmm1
+        kmovw     %k0, %edx
+        vfmadd213ps {rn-sae}, %zmm8, %zmm11, %zmm1
+
+/* result */
+        vfmadd213ps {rn-sae}, %zmm12, %zmm11, %zmm1
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm1, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm1, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm1
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_slog_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_logf16,@function
+       .size   __svml_logf16,.-__svml_logf16
+..LN__svml_logf16.0:
+
+.L_2__routine_start___svml_slog_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_slog_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        xorl      %eax, %eax
+        movzwl    2(%rdi), %edx
+        andl      $32640, %edx
+        cmpl      $32640, %edx
+        je        .LBL_2_12
+
+
+        pxor      %xmm2, %xmm2
+        xorl      %ecx, %ecx
+        cvtss2sd  (%rdi), %xmm2
+        movsd     %xmm2, -8(%rsp)
+        movzwl    -2(%rsp), %edx
+        testl     $32752, %edx
+        jne       .LBL_2_4
+
+
+        mulsd     1600+_imlsLnHATab(%rip), %xmm2
+        movl      $-60, %ecx
+        movsd     %xmm2, -8(%rsp)
+
+.LBL_2_4:
+
+        movsd     1608+_imlsLnHATab(%rip), %xmm0
+        comisd    %xmm0, %xmm2
+        jbe       .LBL_2_8
+
+
+        movsd     .L_2il0floatpacket.73(%rip), %xmm3
+        movaps    %xmm2, %xmm1
+        subsd     %xmm3, %xmm1
+        movsd     %xmm1, -16(%rsp)
+        andb      $127, -9(%rsp)
+        movsd     -16(%rsp), %xmm0
+        comisd    1592+_imlsLnHATab(%rip), %xmm0
+        jbe       .LBL_2_7
+
+
+        movsd     %xmm2, -16(%rsp)
+        pxor      %xmm6, %xmm6
+        movzwl    -10(%rsp), %edi
+        lea       _imlsLnHATab(%rip), %r10
+        andl      $-32753, %edi
+        addl      $16368, %edi
+        movw      %di, -10(%rsp)
+        movsd     -16(%rsp), %xmm4
+        movaps    %xmm4, %xmm1
+        movaps    %xmm4, %xmm2
+        movsd     1672+_imlsLnHATab(%rip), %xmm9
+        movzwl    -2(%rsp), %edx
+        andl      $32752, %edx
+        addsd     1576+_imlsLnHATab(%rip), %xmm1
+        addsd     1584+_imlsLnHATab(%rip), %xmm2
+        movsd     %xmm1, -24(%rsp)
+        movl      -24(%rsp), %r8d
+        movsd     %xmm2, -24(%rsp)
+        andl      $127, %r8d
+        movsd     -24(%rsp), %xmm7
+        movsd     1560+_imlsLnHATab(%rip), %xmm5
+        movsd     1568+_imlsLnHATab(%rip), %xmm0
+        shrl      $4, %edx
+        subsd     1584+_imlsLnHATab(%rip), %xmm7
+        lea       (%r8,%r8,2), %r9d
+        movsd     (%r10,%r9,8), %xmm8
+        lea       -1023(%rcx,%rdx), %ecx
+        cvtsi2sd  %ecx, %xmm6
+        subsd     %xmm7, %xmm4
+        mulsd     %xmm8, %xmm7
+        mulsd     %xmm6, %xmm5
+        subsd     %xmm3, %xmm7
+        mulsd     %xmm4, %xmm8
+        mulsd     %xmm0, %xmm6
+        addsd     8(%r10,%r9,8), %xmm5
+        addsd     16(%r10,%r9,8), %xmm6
+        movaps    %xmm7, %xmm3
+        addsd     %xmm8, %xmm3
+        mulsd     %xmm3, %xmm9
+        addsd     1664+_imlsLnHATab(%rip), %xmm9
+        mulsd     %xmm3, %xmm9
+        addsd     1656+_imlsLnHATab(%rip), %xmm9
+        mulsd     %xmm3, %xmm9
+        addsd     1648+_imlsLnHATab(%rip), %xmm9
+        mulsd     %xmm3, %xmm9
+        addsd     1640+_imlsLnHATab(%rip), %xmm9
+        mulsd     %xmm3, %xmm9
+        addsd     1632+_imlsLnHATab(%rip), %xmm9
+        mulsd     %xmm3, %xmm9
+        mulsd     %xmm3, %xmm3
+        addsd     1624+_imlsLnHATab(%rip), %xmm9
+        mulsd     %xmm3, %xmm9
+        addsd     %xmm5, %xmm9
+        addsd     %xmm6, %xmm9
+        addsd     %xmm7, %xmm9
+        addsd     %xmm8, %xmm9
+        cvtsd2ss  %xmm9, %xmm9
+        movss     %xmm9, (%rsi)
+        ret
+
+.LBL_2_7:
+
+        movsd     1672+_imlsLnHATab(%rip), %xmm2
+        movaps    %xmm1, %xmm0
+        mulsd     %xmm1, %xmm2
+        mulsd     %xmm1, %xmm0
+        addsd     1664+_imlsLnHATab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1656+_imlsLnHATab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1648+_imlsLnHATab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1640+_imlsLnHATab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1632+_imlsLnHATab(%rip), %xmm2
+        mulsd     %xmm1, %xmm2
+        addsd     1624+_imlsLnHATab(%rip), %xmm2
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm1, %xmm2
+        cvtsd2ss  %xmm2, %xmm2
+        movss     %xmm2, (%rsi)
+        ret
+
+.LBL_2_8:
+
+        ucomisd   %xmm0, %xmm2
+        jp        .LBL_2_9
+        je        .LBL_2_11
+
+.LBL_2_9:
+
+        divsd     %xmm0, %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%rsi)
+        movl      $1, %eax
+
+
+        ret
+
+.LBL_2_11:
+
+        movsd     1616+_imlsLnHATab(%rip), %xmm1
+        movl      $2, %eax
+        xorps     .L_2il0floatpacket.72(%rip), %xmm1
+        divsd     %xmm0, %xmm1
+        cvtsd2ss  %xmm1, %xmm1
+        movss     %xmm1, (%rsi)
+        ret
+
+.LBL_2_12:
+
+        movb      3(%rdi), %dl
+        andb      $-128, %dl
+        cmpb      $-128, %dl
+        je        .LBL_2_14
+
+.LBL_2_13:
+
+        movss     (%rdi), %xmm0
+        mulss     %xmm0, %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_14:
+
+        testl     $8388607, (%rdi)
+        jne       .LBL_2_13
+
+
+        movsd     1608+_imlsLnHATab(%rip), %xmm0
+        movl      $1, %eax
+        divsd     %xmm0, %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_slog_cout_rare_internal,@function
+       .size   __svml_slog_cout_rare_internal,.-__svml_slog_cout_rare_internal
+..LN__svml_slog_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_slog_data_internal_avx512:
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   3194499567
+       .long   3191881870
+       .long   3189820965
+       .long   3188177733
+       .long   3186034033
+       .long   3183874545
+       .long   3182098566
+       .long   3180625528
+       .long   3205885581
+       .long   3204713431
+       .long   3202986354
+       .long   3201283063
+       .long   3199818667
+       .long   3198553107
+       .long   3197454075
+       .long   3196495328
+       .long   1051342523
+       .long   1051102009
+       .long   1050719235
+       .long   1050259833
+       .long   1049764999
+       .long   1049260512
+       .long   1048762310
+       .long   1047983990
+       .long   1044808958
+       .long   1047891773
+       .long   1049356949
+       .long   1050157361
+       .long   1050708164
+       .long   1051065485
+       .long   1051272715
+       .long   1051363578
+       .long   3204447891
+       .long   3204432523
+       .long   3204384627
+       .long   3204298603
+       .long   3204175099
+       .long   3204017696
+       .long   3203831137
+       .long   3203620393
+       .long   3204845352
+       .long   3204676294
+       .long   3204570658
+       .long   3204507866
+       .long   3204473248
+       .long   3204456356
+       .long   3204449777
+       .long   3204448283
+       .long   1065353216
+       .long   1065353045
+       .long   1065352036
+       .long   1065349339
+       .long   1065344188
+       .long   1065335989
+       .long   1065324332
+       .long   1065308972
+       .long   1065328777
+       .long   1065341148
+       .long   1065347780
+       .long   1065351069
+       .long   1065352524
+       .long   1065353058
+       .long   1065353199
+       .long   1065353216
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   1060205080
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   8388608
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .long   2139095039
+       .type   __svml_slog_data_internal_avx512,@object
+       .size   __svml_slog_data_internal_avx512,512
+       .align 32
+_imlsLnHATab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1072660480
+       .long   1486880768
+       .long   1066410070
+       .long   1813744607
+       .long   3179892593
+       .long   0
+       .long   1072629760
+       .long   377487360
+       .long   1067416219
+       .long   919019713
+       .long   3179241129
+       .long   0
+       .long   1072599040
+       .long   1513619456
+       .long   1067944025
+       .long   874573033
+       .long   3178512940
+       .long   0
+       .long   1072570368
+       .long   3221749760
+       .long   1068427825
+       .long   4181665006
+       .long   3177478212
+       .long   0
+       .long   1072541696
+       .long   4162322432
+       .long   1068708823
+       .long   627020255
+       .long   1028629941
+       .long   0
+       .long   1072513024
+       .long   183107584
+       .long   1068957907
+       .long   2376703469
+       .long   1030233118
+       .long   0
+       .long   1072486400
+       .long   1053425664
+       .long   1069192557
+       .long   696277142
+       .long   1030474863
+       .long   0
+       .long   1072459776
+       .long   3996123136
+       .long   1069430535
+       .long   2630798680
+       .long   1028792016
+       .long   0
+       .long   1072435200
+       .long   3452764160
+       .long   1069600382
+       .long   624954044
+       .long   3177101741
+       .long   0
+       .long   1072409600
+       .long   207650816
+       .long   1069717971
+       .long   3272735636
+       .long   3175176575
+       .long   0
+       .long   1072386048
+       .long   2647228416
+       .long   1069827627
+       .long   3594228712
+       .long   1029303785
+       .long   0
+       .long   1072362496
+       .long   2712010752
+       .long   1069938736
+       .long   3653242769
+       .long   3176839013
+       .long   0
+       .long   1072338944
+       .long   374439936
+       .long   1070051337
+       .long   4072775574
+       .long   3176577495
+       .long   0
+       .long   1072316416
+       .long   3707174912
+       .long   1070160474
+       .long   1486946159
+       .long   1023930920
+       .long   0
+       .long   1072294912
+       .long   1443954688
+       .long   1070265993
+       .long   293532967
+       .long   3176278277
+       .long   0
+       .long   1072273408
+       .long   127762432
+       .long   1070372856
+       .long   3404145447
+       .long   3177023955
+       .long   0
+       .long   1072252928
+       .long   2053832704
+       .long   1070475911
+       .long   1575076358
+       .long   1029048544
+       .long   0
+       .long   1072232448
+       .long   3194093568
+       .long   1070580248
+       .long   1864169120
+       .long   1026866084
+       .long   0
+       .long   1072212992
+       .long   3917201408
+       .long   1070638340
+       .long   2362145246
+       .long   3175606197
+       .long   0
+       .long   1072193536
+       .long   3417112576
+       .long   1070689116
+       .long   70087871
+       .long   3174183577
+       .long   0
+       .long   1072175104
+       .long   4226777088
+       .long   1070737793
+       .long   1620410586
+       .long   3174700065
+       .long   0
+       .long   1072156672
+       .long   3168870400
+       .long   1070787042
+       .long   311238082
+       .long   1025781772
+       .long   0
+       .long   1072139264
+       .long   2150580224
+       .long   1070834092
+       .long   1664262457
+       .long   3175299224
+       .long   0
+       .long   1072120832
+       .long   4095672320
+       .long   1070884491
+       .long   1657121015
+       .long   3174674199
+       .long   0
+       .long   1072104448
+       .long   2595577856
+       .long   1070929805
+       .long   2014006823
+       .long   3175423830
+       .long   0
+       .long   1072087040
+       .long   3747176448
+       .long   1070978493
+       .long   144991708
+       .long   3171552042
+       .long   0
+       .long   1072070656
+       .long   1050435584
+       .long   1071024840
+       .long   3386227432
+       .long   1027876916
+       .long   0
+       .long   1072055296
+       .long   255516672
+       .long   1071068760
+       .long   2637594316
+       .long   1028049573
+       .long   0
+       .long   1072038912
+       .long   1640783872
+       .long   1071116120
+       .long   893247007
+       .long   1028452162
+       .long   0
+       .long   1072023552
+       .long   2940411904
+       .long   1071161011
+       .long   813240633
+       .long   1027664048
+       .long   0
+       .long   1072009216
+       .long   882917376
+       .long   1071203348
+       .long   2376597551
+       .long   3175828767
+       .long   0
+       .long   1071993856
+       .long   213966848
+       .long   1071249188
+       .long   2977204125
+       .long   1028350609
+       .long   0
+       .long   1071979520
+       .long   2921504768
+       .long   1071292428
+       .long   523218347
+       .long   1028007004
+       .long   0
+       .long   1071965184
+       .long   3186655232
+       .long   1071336119
+       .long   2352907891
+       .long   1026967097
+       .long   0
+       .long   1071951872
+       .long   2653364224
+       .long   1071377101
+       .long   2453418583
+       .long   3174349512
+       .long   0
+       .long   1071938560
+       .long   3759783936
+       .long   1071418487
+       .long   3685870403
+       .long   3175415611
+       .long   0
+       .long   1071925248
+       .long   2468364288
+       .long   1071460286
+       .long   1578908842
+       .long   3175510517
+       .long   0
+       .long   1071911936
+       .long   81903616
+       .long   1071502506
+       .long   770710269
+       .long   1026742353
+       .long   0
+       .long   1071899648
+       .long   2799321088
+       .long   1071541858
+       .long   3822266185
+       .long   1028434427
+       .long   0
+       .long   1071886336
+       .long   2142265344
+       .long   1071584911
+       .long   175901806
+       .long   3173871540
+       .long   0
+       .long   1071874048
+       .long   2944024576
+       .long   1071625048
+       .long   2747360403
+       .long   1027672159
+       .long   0
+       .long   1071862784
+       .long   3434301440
+       .long   1071653426
+       .long   4194662196
+       .long   3173893003
+       .long   0
+       .long   1071850496
+       .long   1547755520
+       .long   1071673870
+       .long   4248764681
+       .long   3172759087
+       .long   0
+       .long   1071839232
+       .long   4246986752
+       .long   1071692786
+       .long   2840205638
+       .long   3174430911
+       .long   0
+       .long   1071826944
+       .long   3418390528
+       .long   1071713619
+       .long   3041880823
+       .long   1025440860
+       .long   0
+       .long   1071816704
+       .long   4143093760
+       .long   1071731139
+       .long   2727587401
+       .long   3173965207
+       .long   0
+       .long   1071805440
+       .long   3121326080
+       .long   1071750582
+       .long   3173887692
+       .long   3174190163
+       .long   0
+       .long   1071794176
+       .long   1852893184
+       .long   1071770207
+       .long   3951060252
+       .long   1027348295
+       .long   0
+       .long   1071783936
+       .long   3636379648
+       .long   1071788208
+       .long   1684924001
+       .long   3174777086
+       .long   0
+       .long   1071773696
+       .long   516505600
+       .long   1071806366
+       .long   429181199
+       .long   3173211033
+       .long   0
+       .long   1071763456
+       .long   4186185728
+       .long   1071824681
+       .long   2044904577
+       .long   3174967132
+       .long   0
+       .long   1071753216
+       .long   877596672
+       .long   1071843159
+       .long   1396318105
+       .long   3173959727
+       .long   0
+       .long   1071742976
+       .long   2912784384
+       .long   1071861800
+       .long   448136789
+       .long   3174814192
+       .long   0
+       .long   1071733760
+       .long   3722825728
+       .long   1071878720
+       .long   714165913
+       .long   3173439560
+       .long   0
+       .long   1071723520
+       .long   2522374144
+       .long   1071897682
+       .long   3227240353
+       .long   3173394323
+       .long   0
+       .long   1071714304
+       .long   4165410816
+       .long   1071914895
+       .long   1365684961
+       .long   3174365060
+       .long   0
+       .long   1071705088
+       .long   3477135360
+       .long   1071932251
+       .long   368482985
+       .long   3174140821
+       .long   0
+       .long   1071695872
+       .long   2079455232
+       .long   1071949752
+       .long   1320576317
+       .long   1026822714
+       .long   0
+       .long   1071687680
+       .long   851795968
+       .long   1071965432
+       .long   3702467026
+       .long   1025224125
+       .long   0
+       .long   1071678464
+       .long   647743488
+       .long   1071983213
+       .long   772992109
+       .long   3174038459
+       .long   0
+       .long   1071670272
+       .long   26537984
+       .long   1071999146
+       .long   2360214276
+       .long   3174861275
+       .long   0
+       .long   1071661056
+       .long   1547061248
+       .long   1072017216
+       .long   2886781435
+       .long   1026423395
+       .long   0
+       .long   1071652864
+       .long   2854492160
+       .long   1072033410
+       .long   215631550
+       .long   1025638968
+       .long   0
+       .long   1071644672
+       .long   4277811200
+       .long   1072049730
+       .long   2479318832
+       .long   1026487127
+       .long   4277811200
+       .long   1072049730
+       .long   2479318832
+       .long   1026487127
+       .long   64
+       .long   1120927744
+       .long   0
+       .long   1094713344
+       .long   0
+       .long   1065615360
+       .long   0
+       .long   1135607808
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   3219128320
+       .long   1431655955
+       .long   1070945621
+       .long   610
+       .long   3218079744
+       .long   2545118337
+       .long   1070176665
+       .long   1378399119
+       .long   3217380693
+       .long   612435357
+       .long   1069697472
+       .long   94536557
+       .long   3217031348
+       .type   _imlsLnHATab,@object
+       .size   _imlsLnHATab,1680
+       .align 16
+.L_2il0floatpacket.72:
+       .long   0x00000000,0x80000000,0x00000000,0x00000000
+       .type   .L_2il0floatpacket.72,@object
+       .size   .L_2il0floatpacket.72,16
+       .align 8
+.L_2il0floatpacket.73:
+       .long   0x00000000,0x3ff00000
+       .type   .L_2il0floatpacket.73,@object
+       .size   .L_2il0floatpacket.73,8
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_pow_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_pow_d_la.s
new file mode 100644 (file)
index 0000000..a0f51e1
--- /dev/null
@@ -0,0 +1,3527 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *       1) Calculating log2|x|
+ * 
+ *           Here we use the following formula.
+ *           Let |x|=2^k1*X1, where k1 is integer, 1<=X1<2.
+ *           Let C ~= 1/ln(2),
+ *           Rcp1 ~= 1/X1,   X2=Rcp1*X1,
+ *           Rcp2 ~= 1/X2,   X3=Rcp2*X2,
+ *           Rcp3 ~= 1/X3,   Rcp3C ~= C/X3.
+ *           Then
+ * 
+ *               log2|x| = k1 + log2(1/Rcp1) + log2(1/Rcp2) + log2(C/Rcp3C) +
+ *                       + log2(X1*Rcp1*Rcp2*Rcp3C/C),
+ * 
+ *           where X1*Rcp1*Rcp2*Rcp3C = C*(1+q), q is very small.
+ * 
+ *           The values of Rcp1, log2(1/Rcp1), Rcp2, log2(1/Rcp2),
+ *           Rcp3C, log2(C/Rcp3C) are taken from tables.
+ *           Values of Rcp1, Rcp2, Rcp3C are such that RcpC=Rcp1*Rcp2*Rcp3C
+ *           is exactly represented in target precision.
+ * 
+ *           log2(X1*Rcp1*Rcp2*Rcp3C/C) = log2(1+q) = ln(1+q)/ln2 =
+ *               = 1/(ln2)*q - 1/(2ln2)*q^2 + 1/(3ln2)*q^3 - ... =
+ *               = 1/(C*ln2)*cq - 1/(2*C^2*ln2)*cq^2 + 1/(3*C^3*ln2)*cq^3 - ... =
+ *               = (1 + a1)*cq + a2*cq^2 + a3*cq^3 + ...,
+ *           where
+ *               cq=X1*Rcp1*Rcp2*Rcp3C-C,
+ *               a1=1/(C*ln(2))-1 is small,
+ *               a2=1/(2*C^2*ln2),
+ *               a3=1/(3*C^3*ln2),
+ *               ...
+ *               We get 3 parts of log2 result: HH+HL+HLL ~= log2|x|.
+ * 
+ *           2)  Calculation of y*(HH+HL+HLL).
+ *               Split y into YHi+YLo.
+ *               Get high PH and medium PL parts of y*log2|x|.
+ *               Get low PLL part of y*log2|x|.
+ *               Now we have PH+PL+PLL ~= y*log2|x|.
+ * 
+ *           3) Calculation of 2^(PH+PL+PLL).
+ * 
+ *               Mathematical idea of computing 2^(PH+PL+PLL) is the following.
+ *               Let's represent PH+PL+PLL in the form N + j/2^expK + Z,
+ *               where expK=7 in this implementation, N and j are integers,
+ *               0<=j<=2^expK-1, |Z|<2^(-expK-1). Hence
+ * 
+ *                   2^(PH+PL+PLL) ~= 2^N * 2^(j/2^expK) * 2^Z,
+ * 
+ *               where 2^(j/2^expK) is stored in a table, and
+ * 
+ *                   2^Z ~= 1 + B1*Z + B2*Z^2 ... + B5*Z^5.
+ * 
+ *               We compute 2^(PH+PL+PLL) as follows.
+ * 
+ *               Break PH into PHH + PHL, where PHH = N + j/2^expK.
+ *               Z = PHL + PL + PLL
+ *               Exp2Poly = B1*Z + B2*Z^2 ... + B5*Z^5
+ *               Get 2^(j/2^expK) from table in the form THI+TLO.
+ *               Now we have 2^(PH+PL+PLL) ~= 2^N * (THI + TLO) * (1 + Exp2Poly).
+ * 
+ *               Get significand of 2^(PH+PL+PLL) in the form ResHi+ResLo:
+ *               ResHi := THI
+ *               ResLo := THI * Exp2Poly + TLO
+ * 
+ *               Get exponent ERes of the result:
+ *               Res := ResHi + ResLo:
+ *               Result := ex(Res) + N
+ * 
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_pow8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_pow8
+
+__svml_pow8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $256, %rsp
+        vgetmantpd $10, {sae}, %zmm0, %zmm10
+
+/* Reduced argument: R = (DblRcp*Mantissa - 1) */
+        vmovups   640+__svml_dpow_data_internal_avx512(%rip), %zmm15
+
+/* Table lookup */
+        vmovups   __svml_dpow_data_internal_avx512(%rip), %zmm2
+        vmovups   128+__svml_dpow_data_internal_avx512(%rip), %zmm3
+        vmovups   256+__svml_dpow_data_internal_avx512(%rip), %zmm5
+        vmovups   384+__svml_dpow_data_internal_avx512(%rip), %zmm4
+
+/* Prepare exponent correction: DblRcp<1.5?  -- was 0.75 in initial AVX3 version, which used Mantissa in [1,2) */
+        vmovups   704+__svml_dpow_data_internal_avx512(%rip), %zmm14
+
+/* GetExp(x) */
+        vgetexppd {sae}, %zmm0, %zmm9
+
+/* P8_9 */
+        vmovups   960+__svml_dpow_data_internal_avx512(%rip), %zmm7
+
+/* DblRcp ~ 1/Mantissa */
+        vrcp14pd  %zmm10, %zmm12
+
+/* x<=0 or Inf/NaN? */
+        vfpclasspd $223, %zmm0, %k0
+
+/* round DblRcp to 5 fractional bits (RN mode, no Precision exception) */
+        vrndscalepd $88, {sae}, %zmm12, %zmm13
+        vmovups   896+__svml_dpow_data_internal_avx512(%rip), %zmm12
+        kmovw     %k0, %edx
+        vfmsub213pd {rn-sae}, %zmm15, %zmm13, %zmm10
+        vcmppd    $17, {sae}, %zmm14, %zmm13, %k1
+        vfmadd231pd {rn-sae}, %zmm10, %zmm12, %zmm7
+
+/* Prepare table index */
+        vpsrlq    $47, %zmm13, %zmm8
+        vmovups   1024+__svml_dpow_data_internal_avx512(%rip), %zmm13
+        vpermt2pd 64+__svml_dpow_data_internal_avx512(%rip), %zmm8, %zmm2
+        vpermt2pd 192+__svml_dpow_data_internal_avx512(%rip), %zmm8, %zmm3
+        vpermt2pd 320+__svml_dpow_data_internal_avx512(%rip), %zmm8, %zmm5
+        vpermt2pd 448+__svml_dpow_data_internal_avx512(%rip), %zmm8, %zmm4
+
+/* add 1 to Expon if DblRcp<1.5 */
+        vaddpd    {rn-sae}, %zmm15, %zmm9, %zmm9{%k1}
+        vmovaps   %zmm1, %zmm11
+        vpsllq    $59, %zmm8, %zmm1
+
+/* R^2 */
+        vmulpd    {rn-sae}, %zmm10, %zmm10, %zmm8
+        vpmovq2m  %zmm1, %k2
+
+/* y Inf/NaN? */
+        vfpclasspd $153, %zmm11, %k3
+
+/* P6_7 */
+        vmovups   1088+__svml_dpow_data_internal_avx512(%rip), %zmm1
+        vblendmpd %zmm3, %zmm2, %zmm14{%k2}
+        vblendmpd %zmm4, %zmm5, %zmm6{%k2}
+
+/* P4_5 */
+        vmovups   1216+__svml_dpow_data_internal_avx512(%rip), %zmm2
+        vfmadd231pd {rn-sae}, %zmm10, %zmm13, %zmm1
+        vmovups   832+__svml_dpow_data_internal_avx512(%rip), %zmm4
+        vmovups   768+__svml_dpow_data_internal_avx512(%rip), %zmm3
+
+/* Expon + Th */
+        vaddpd    {rn-sae}, %zmm9, %zmm14, %zmm15
+        vmovups   1152+__svml_dpow_data_internal_avx512(%rip), %zmm9
+
+/* P6_9 */
+        vfmadd213pd {rn-sae}, %zmm1, %zmm8, %zmm7
+
+/* P2_3 */
+        vmovups   1344+__svml_dpow_data_internal_avx512(%rip), %zmm1
+
+/* P1_2 */
+        vmovups   1920+__svml_dpow_data_internal_avx512(%rip), %zmm14
+        vfmadd231pd {rn-sae}, %zmm10, %zmm9, %zmm2
+        kmovw     %k3, %eax
+
+/* P4_9 */
+        vfmadd213pd {rn-sae}, %zmm2, %zmm8, %zmm7
+
+/* R2l */
+        vmovaps   %zmm10, %zmm5
+        orl       %eax, %edx
+        vfmsub213pd {rn-sae}, %zmm8, %zmm10, %zmm5
+
+/* Tl + R2l*c2h */
+        vfmadd213pd {rn-sae}, %zmm6, %zmm4, %zmm5
+        vmovups   1280+__svml_dpow_data_internal_avx512(%rip), %zmm6
+        vfmadd231pd {rn-sae}, %zmm10, %zmm6, %zmm1
+
+/* Expon + Th+ R*c1h */
+        vmovaps   %zmm15, %zmm12
+        vfmadd231pd {rn-sae}, %zmm10, %zmm3, %zmm12
+
+/* P2_9 */
+        vfmadd213pd {rn-sae}, %zmm1, %zmm8, %zmm7
+
+/* (R*c1h)_h */
+        vsubpd    {rn-sae}, %zmm15, %zmm12, %zmm9
+
+/* Tl + R2l*c2h + R2*P2_9 */
+        vfmadd231pd {rn-sae}, %zmm8, %zmm7, %zmm5
+        vmovups   1408+__svml_dpow_data_internal_avx512(%rip), %zmm7
+
+/* (R*c1h)_l */
+        vfmsub231pd {rn-sae}, %zmm3, %zmm10, %zmm9
+
+/* Expon + Th+ R*c1h + R2*c2h */
+        vmovaps   %zmm12, %zmm13
+        vfmadd231pd {rn-sae}, %zmm8, %zmm4, %zmm13
+
+/* R*c1l + (R*c1h)_l */
+        vfmadd213pd {rn-sae}, %zmm9, %zmm7, %zmm10
+        vmovups   1728+__svml_dpow_data_internal_avx512(%rip), %zmm9
+
+/* High2 + Tlh */
+        vaddpd    {rn-sae}, %zmm5, %zmm13, %zmm6
+
+/* (R2*c2h)_h */
+        vsubpd    {rn-sae}, %zmm12, %zmm13, %zmm2
+
+/* P3_4 */
+        vmovups   1792+__svml_dpow_data_internal_avx512(%rip), %zmm12
+
+/* y*High */
+        vmulpd    {rz-sae}, %zmm11, %zmm6, %zmm3
+
+/* (R2*c2h)_l */
+        vfmsub213pd {rn-sae}, %zmm2, %zmm4, %zmm8
+        vsubpd    {rn-sae}, %zmm13, %zmm6, %zmm1
+
+/* (y*High)_low */
+        vfmsub213pd {rz-sae}, %zmm3, %zmm11, %zmm6
+
+/* Tll */
+        vsubpd    {rn-sae}, %zmm1, %zmm5, %zmm4
+
+/* R*c1l + (R*c1h)_l+(R2*c2h)_l */
+        vaddpd    {rn-sae}, %zmm8, %zmm10, %zmm10
+        vmovups   1472+__svml_dpow_data_internal_avx512(%rip), %zmm1
+        vmovups   1600+__svml_dpow_data_internal_avx512(%rip), %zmm8
+
+/* Tll + R*c1l + (R*c1h)_l */
+        vaddpd    {rn-sae}, %zmm10, %zmm4, %zmm5
+        vaddpd    {rd-sae}, %zmm1, %zmm3, %zmm2
+
+/*
+ * /
+ * exp2 computation starts here
+ */
+        vreducepd $65, {sae}, %zmm3, %zmm4
+
+/* Zl = y*Tll + Zl */
+        vfmadd213pd {rz-sae}, %zmm6, %zmm11, %zmm5
+
+/* P5_6 */
+        vmovups   1664+__svml_dpow_data_internal_avx512(%rip), %zmm1
+        vmovups   1856+__svml_dpow_data_internal_avx512(%rip), %zmm10
+        vaddpd    {rn-sae}, %zmm5, %zmm4, %zmm7
+        vandpd    2176+__svml_dpow_data_internal_avx512(%rip), %zmm3, %zmm3
+
+/* Table lookup: The, Tle/The */
+        vmovups   512+__svml_dpow_data_internal_avx512(%rip), %zmm4
+
+/*
+ * scaled result
+ * Filter very large |y*log2(x)| and scale final result for LRB2
+ */
+        vmovups   2240+__svml_dpow_data_internal_avx512(%rip), %zmm5
+
+/* ensure |R|<2 even for special cases */
+        vandpd    1536+__svml_dpow_data_internal_avx512(%rip), %zmm7, %zmm15
+        vpermt2pd 576+__svml_dpow_data_internal_avx512(%rip), %zmm2, %zmm4
+        vcmppd    $22, {sae}, %zmm5, %zmm3, %k0
+
+/* Re^2 */
+        vmulpd    {rn-sae}, %zmm15, %zmm15, %zmm13
+
+/* R*The */
+        vmulpd    {rn-sae}, %zmm4, %zmm15, %zmm7
+        vfmadd231pd {rn-sae}, %zmm15, %zmm8, %zmm1
+        vfmadd231pd {rn-sae}, %zmm15, %zmm9, %zmm12
+        vfmadd231pd {rn-sae}, %zmm15, %zmm10, %zmm14
+        vpsllq    $48, %zmm2, %zmm2
+        vfmadd213pd {rn-sae}, %zmm12, %zmm13, %zmm1
+        vandpd    2304+__svml_dpow_data_internal_avx512(%rip), %zmm2, %zmm2
+        kmovw     %k0, %ecx
+        vfmadd213pd {rn-sae}, %zmm14, %zmm13, %zmm1
+
+/* The + The*R*poly */
+        vfmadd213pd {rn-sae}, %zmm4, %zmm7, %zmm1
+        orl       %ecx, %edx
+        vmulpd    {rn-sae}, %zmm2, %zmm1, %zmm1
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm1, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm11, 128(%rsp)
+        vmovups   %zmm1, 192(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x28, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x38, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x18, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x08, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   192(%rsp), %zmm1
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x28, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x38, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x18, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x08, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+        lea       192(%rsp,%r12,8), %rdx
+
+        call      __svml_dpow_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_pow8,@function
+       .size   __svml_pow8,.-__svml_pow8
+..LN__svml_pow8.0:
+
+.L_2__routine_start___svml_dpow_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dpow_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        pushq     %r12
+       .cfi_def_cfa_offset 16
+       .cfi_offset 12, -16
+        pushq     %r13
+       .cfi_def_cfa_offset 24
+       .cfi_offset 13, -24
+        pushq     %r15
+       .cfi_def_cfa_offset 32
+       .cfi_offset 15, -32
+        pushq     %rbx
+       .cfi_def_cfa_offset 40
+       .cfi_offset 3, -40
+        movq      %rdx, %r8
+        movsd     6824+__dpow_la_CoutTab(%rip), %xmm1
+        xorl      %eax, %eax
+        movsd     (%rdi), %xmm3
+        movsd     (%rsi), %xmm0
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm1, %xmm0
+        movsd     %xmm3, -72(%rsp)
+        movsd     %xmm0, -16(%rsp)
+        movzwl    -66(%rsp), %r13d
+        movzwl    -10(%rsp), %edx
+        andl      $32752, %r13d
+        movzbl    -65(%rsp), %r12d
+        andl      $32752, %edx
+        movb      -9(%rsp), %bl
+        andl      $128, %r12d
+        andb      $-128, %bl
+        shrl      $4, %r13d
+        shrl      $4, %edx
+        shrl      $7, %r12d
+        shrb      $7, %bl
+        testl     $1048575, -68(%rsp)
+        jne       .LBL_2_4
+
+
+        cmpl      $0, -72(%rsp)
+        jne       .LBL_2_4
+
+
+        movb      $1, %r11b
+        jmp       .LBL_2_5
+
+.LBL_2_4:
+
+        xorb      %r11b, %r11b
+
+.LBL_2_5:
+
+        movl      -12(%rsp), %ecx
+        movl      -16(%rsp), %edi
+        andl      $1048575, %ecx
+        jne       .LBL_2_8
+
+
+        testl     %edi, %edi
+        jne       .LBL_2_8
+
+
+        movl      $1, %r10d
+        jmp       .LBL_2_9
+
+.LBL_2_8:
+
+        xorl      %r10d, %r10d
+
+.LBL_2_9:
+
+        movl      %edx, %r9d
+        xorl      %esi, %esi
+        cmpl      $2047, %edx
+        setne     %sil
+        shll      $20, %r9d
+        orl       %ecx, %r9d
+        movl      %edi, %ecx
+        orl       %r9d, %ecx
+        je        .LBL_2_24
+
+
+        lea       -1023(%rdx), %ecx
+        cmpl      $1023, %edx
+        jl        .LBL_2_23
+
+
+        testl     %esi, %esi
+        je        .LBL_2_23
+
+
+        cmpl      $20, %ecx
+        jg        .LBL_2_16
+
+
+        movl      %r9d, %r15d
+        shll      %cl, %r15d
+        shll      $12, %r15d
+        orl       %edi, %r15d
+        je        .LBL_2_15
+
+.LBL_2_14:
+
+        xorl      %r9d, %r9d
+        jmp       .LBL_2_21
+
+.LBL_2_15:
+
+        lea       -1012(%rdx), %ecx
+        shll      %cl, %r9d
+        notl      %r9d
+        shrl      $31, %r9d
+        incl      %r9d
+        jmp       .LBL_2_21
+
+.LBL_2_16:
+
+        cmpl      $53, %ecx
+        jge       .LBL_2_20
+
+
+        lea       -1012(%rdx), %ecx
+        shll      %cl, %edi
+        testl     $2147483647, %edi
+        jne       .LBL_2_14
+
+
+        notl      %edi
+        shrl      $31, %edi
+        lea       1(%rdi), %r9d
+        jmp       .LBL_2_21
+
+.LBL_2_20:
+
+        movl      $2, %r9d
+
+.LBL_2_21:
+
+        testl     %r12d, %r12d
+        jne       .LBL_2_29
+
+
+        cmpl      $1023, %r13d
+        jne       .LBL_2_29
+        jmp       .LBL_2_57
+
+.LBL_2_23:
+
+        xorl      %r9d, %r9d
+        jmp       .LBL_2_25
+
+.LBL_2_24:
+
+        movl      $2, %r9d
+
+.LBL_2_25:
+
+        testl     %r12d, %r12d
+        jne       .LBL_2_27
+
+
+        cmpl      $1023, %r13d
+        je        .LBL_2_74
+
+.LBL_2_27:
+
+        testl     %edx, %edx
+        jne       .LBL_2_29
+
+
+        testl     %r10d, %r10d
+        jne       .LBL_2_55
+
+.LBL_2_29:
+
+        cmpl      $2047, %r13d
+        je        .LBL_2_31
+
+.LBL_2_30:
+
+        movb      $1, %cl
+        jmp       .LBL_2_32
+
+.LBL_2_31:
+
+        xorb      %cl, %cl
+
+.LBL_2_32:
+
+        orb       %cl, %r11b
+        je        .LBL_2_54
+
+
+        orl       %esi, %r10d
+        je        .LBL_2_54
+
+
+        movsd     6816+__dpow_la_CoutTab(%rip), %xmm2
+        ucomisd   %xmm2, %xmm3
+        jp        .LBL_2_35
+        je        .LBL_2_71
+
+.LBL_2_35:
+
+        ucomisd   6832+__dpow_la_CoutTab(%rip), %xmm3
+        jp        .LBL_2_36
+        je        .LBL_2_68
+
+.LBL_2_36:
+
+        testb     %cl, %cl
+        je        .LBL_2_47
+
+
+        testl     %esi, %esi
+        je        .LBL_2_47
+
+
+        comisd    %xmm2, %xmm3
+        ja        .LBL_2_40
+
+
+        testl     %r9d, %r9d
+        je        .LBL_2_46
+
+.LBL_2_40:
+
+        lea       6824+__dpow_la_CoutTab(%rip), %rcx
+        andl      %r12d, %r9d
+        movsd     %xmm3, -72(%rsp)
+        andb      $127, -65(%rsp)
+        movsd     (%rcx,%r9,8), %xmm0
+        xorl      %ecx, %ecx
+        testl     %r13d, %r13d
+        jne       .LBL_2_42
+
+
+        movsd     -72(%rsp), %xmm2
+        movl      $-200, %ecx
+        mulsd     6864+__dpow_la_CoutTab(%rip), %xmm2
+        movsd     %xmm2, -72(%rsp)
+        jmp       .LBL_2_43
+
+.LBL_2_42:
+
+        movsd     -72(%rsp), %xmm2
+
+.LBL_2_43:
+
+        movzwl    -66(%rsp), %esi
+        pxor      %xmm7, %xmm7
+        andl      $32752, %esi
+        shrl      $4, %esi
+        movl      -68(%rsp), %r9d
+        shll      $20, %esi
+        andl      $1048575, %r9d
+        movsd     %xmm2, -56(%rsp)
+        orl       %r9d, %esi
+        movzwl    -50(%rsp), %edi
+        addl      $-1072152576, %esi
+        andl      $-32753, %edi
+        addl      $16368, %edi
+        movw      %di, -50(%rsp)
+        sarl      $20, %esi
+        movl      -52(%rsp), %r10d
+        addl      %ecx, %esi
+        lea       __dpow_la_CoutTab(%rip), %rcx
+        andl      $1032192, %r10d
+        addl      $16384, %r10d
+        shrl      $15, %r10d
+        movsd     -56(%rsp), %xmm2
+        movsd     (%rcx,%r10,8), %xmm5
+        addl      %r10d, %r10d
+        movaps    %xmm5, %xmm6
+        movsd     6856+__dpow_la_CoutTab(%rip), %xmm14
+        mulsd     %xmm2, %xmm6
+        cvtsi2sd  %esi, %xmm7
+        mulsd     %xmm2, %xmm14
+        addsd     264(%rcx,%r10,8), %xmm7
+        movsd     %xmm6, -48(%rsp)
+        movsd     %xmm14, -32(%rsp)
+        movl      -44(%rsp), %r11d
+        andl      $64512, %r11d
+        movsd     -32(%rsp), %xmm15
+        addl      $1024, %r11d
+        shrl      $11, %r11d
+        subsd     -56(%rsp), %xmm15
+        movsd     792(%rcx,%r11,8), %xmm12
+        addl      %r11d, %r11d
+        mulsd     %xmm12, %xmm6
+        addsd     1056(%rcx,%r11,8), %xmm7
+        mulsd     %xmm12, %xmm5
+        movsd     %xmm15, -24(%rsp)
+        movsd     -32(%rsp), %xmm4
+        movsd     -24(%rsp), %xmm3
+        movsd     %xmm6, -40(%rsp)
+        subsd     %xmm3, %xmm4
+        movl      -36(%rsp), %r12d
+        andl      $4080, %r12d
+        addl      $16, %r12d
+        movsd     %xmm4, -32(%rsp)
+        shrl      $5, %r12d
+        movsd     -32(%rsp), %xmm12
+        movsd     1584(%rcx,%r12,8), %xmm13
+        addl      %r12d, %r12d
+        mulsd     %xmm13, %xmm5
+        subsd     %xmm12, %xmm2
+        addsd     2616(%rcx,%r12,8), %xmm7
+        mulsd     %xmm13, %xmm6
+        movsd     %xmm2, -24(%rsp)
+        movaps    %xmm6, %xmm8
+        movsd     6856+__dpow_la_CoutTab(%rip), %xmm2
+        mulsd     %xmm5, %xmm2
+        subsd     6848+__dpow_la_CoutTab(%rip), %xmm8
+        movsd     -32(%rsp), %xmm3
+        movsd     -24(%rsp), %xmm4
+        movsd     %xmm2, -32(%rsp)
+        movsd     -32(%rsp), %xmm13
+        movsd     272(%rcx,%r10,8), %xmm11
+        subsd     %xmm5, %xmm13
+        movsd     %xmm13, -24(%rsp)
+        movsd     -32(%rsp), %xmm2
+        movsd     -24(%rsp), %xmm14
+        movsd     1064(%rcx,%r11,8), %xmm10
+        subsd     %xmm14, %xmm2
+        movsd     %xmm2, -32(%rsp)
+        movaps    %xmm3, %xmm2
+        movsd     -32(%rsp), %xmm15
+        movsd     2624(%rcx,%r12,8), %xmm9
+        subsd     %xmm15, %xmm5
+        movsd     %xmm5, -24(%rsp)
+        movsd     -32(%rsp), %xmm5
+        mulsd     %xmm5, %xmm2
+        mulsd     %xmm4, %xmm5
+        subsd     %xmm6, %xmm2
+        movaps    %xmm7, %xmm6
+        addsd     %xmm5, %xmm2
+        addsd     %xmm8, %xmm6
+        movsd     -24(%rsp), %xmm12
+        mulsd     %xmm12, %xmm3
+        mulsd     %xmm12, %xmm4
+        addsd     %xmm3, %xmm2
+        movsd     %xmm6, -32(%rsp)
+        addsd     %xmm4, %xmm2
+        movsd     -32(%rsp), %xmm3
+        subsd     %xmm3, %xmm7
+        addsd     %xmm8, %xmm7
+        movsd     %xmm7, -24(%rsp)
+        movsd     -32(%rsp), %xmm4
+        movsd     %xmm4, -64(%rsp)
+        movzwl    -58(%rsp), %ecx
+        andl      $32752, %ecx
+        shrl      $4, %ecx
+        addl      %edx, %ecx
+        movsd     -24(%rsp), %xmm3
+        cmpl      $2057, %ecx
+        jge       .LBL_2_67
+
+
+        cmpl      $1984, %ecx
+        jg        .LBL_2_58
+
+
+        movsd     %xmm1, -32(%rsp)
+        movsd     -32(%rsp), %xmm1
+        addsd     6808+__dpow_la_CoutTab(%rip), %xmm1
+        movsd     %xmm1, -32(%rsp)
+        movsd     -32(%rsp), %xmm2
+        mulsd     %xmm0, %xmm2
+        jmp       .LBL_2_56
+
+.LBL_2_46:
+
+        movsd     %xmm2, -32(%rsp)
+        movl      $1, %eax
+        movsd     -32(%rsp), %xmm1
+        movsd     -32(%rsp), %xmm0
+        divsd     %xmm0, %xmm1
+        movsd     %xmm1, -32(%rsp)
+        movsd     -32(%rsp), %xmm2
+        jmp       .LBL_2_56
+
+.LBL_2_47:
+
+        cmpl      $1023, %r13d
+        jge       .LBL_2_51
+
+
+        testb     %bl, %bl
+        je        .LBL_2_56
+
+
+        movaps    %xmm0, %xmm2
+        mulsd     %xmm0, %xmm2
+        jmp       .LBL_2_56
+
+.LBL_2_51:
+
+        testb     %bl, %bl
+        je        .LBL_2_53
+
+
+        lea       6824+__dpow_la_CoutTab(%rip), %rdx
+        andl      %r12d, %r9d
+        mulsd     (%rdx,%r9,8), %xmm2
+        jmp       .LBL_2_56
+
+.LBL_2_53:
+
+        mulsd     %xmm3, %xmm3
+        lea       6824+__dpow_la_CoutTab(%rip), %rdx
+        mulsd     %xmm0, %xmm3
+        andl      %r12d, %r9d
+        movaps    %xmm3, %xmm2
+        mulsd     (%rdx,%r9,8), %xmm2
+        jmp       .LBL_2_56
+
+.LBL_2_54:
+
+        movaps    %xmm3, %xmm2
+        addsd     %xmm0, %xmm2
+        jmp       .LBL_2_56
+
+.LBL_2_55:
+
+        movq      6824+__dpow_la_CoutTab(%rip), %rdx
+        addsd     %xmm0, %xmm3
+        movsd     %xmm3, -32(%rsp)
+        movq      %rdx, -24(%rsp)
+        movb      -25(%rsp), %cl
+        movb      -17(%rsp), %bl
+        andb      $-128, %cl
+        andb      $127, %bl
+        orb       %cl, %bl
+        movb      %bl, -17(%rsp)
+        movsd     -24(%rsp), %xmm2
+        movsd     -24(%rsp), %xmm0
+        mulsd     %xmm0, %xmm2
+
+.LBL_2_56:
+
+        movsd     %xmm2, (%r8)
+       .cfi_restore 3
+        popq      %rbx
+       .cfi_def_cfa_offset 32
+       .cfi_restore 15
+        popq      %r15
+       .cfi_def_cfa_offset 24
+       .cfi_restore 13
+        popq      %r13
+       .cfi_def_cfa_offset 16
+       .cfi_restore 12
+        popq      %r12
+       .cfi_def_cfa_offset 8
+        ret
+       .cfi_def_cfa_offset 40
+       .cfi_offset 3, -40
+       .cfi_offset 12, -16
+       .cfi_offset 13, -24
+       .cfi_offset 15, -32
+
+.LBL_2_57:
+
+        testb     %r11b, %r11b
+        je        .LBL_2_30
+        jmp       .LBL_2_55
+
+.LBL_2_58:
+
+        lea       6752+__dpow_la_CoutTab(%rip), %rdx
+        movsd     (%rdx), %xmm6
+        lea       4688+__dpow_la_CoutTab(%rip), %rcx
+        movsd     -64(%rsp), %xmm7
+        addsd     %xmm2, %xmm8
+        addsd     %xmm9, %xmm10
+        addsd     %xmm3, %xmm2
+        mulsd     %xmm8, %xmm6
+        addsd     %xmm10, %xmm11
+        addsd     -8(%rdx), %xmm6
+        addsd     %xmm2, %xmm11
+        mulsd     %xmm8, %xmm6
+        movaps    %xmm11, %xmm9
+        addsd     -16(%rdx), %xmm6
+        mulsd     %xmm8, %xmm6
+        addsd     -24(%rdx), %xmm6
+        mulsd     %xmm8, %xmm6
+        addsd     %xmm6, %xmm4
+        lea       -32(%rsp), %rbx
+        movsd     %xmm4, (%rbx)
+        movsd     (%rbx), %xmm8
+        subsd     %xmm8, %xmm7
+        addsd     %xmm6, %xmm7
+        lea       -24(%rsp), %rsi
+        movsd     %xmm7, (%rsi)
+        movsd     (%rbx), %xmm12
+        movsd     (%rsi), %xmm5
+        addsd     %xmm12, %xmm9
+        movsd     %xmm9, (%rbx)
+        movsd     (%rbx), %xmm10
+        subsd     %xmm10, %xmm12
+        addsd     %xmm11, %xmm12
+        movsd     104(%rdx), %xmm11
+        movsd     %xmm12, (%rsi)
+        movsd     (%rbx), %xmm3
+        mulsd     %xmm3, %xmm11
+        movsd     (%rsi), %xmm4
+        movsd     %xmm11, (%rbx)
+        addsd     %xmm5, %xmm4
+        movsd     (%rbx), %xmm13
+        lea       -16(%rsp), %rdi
+        movsd     (%rdi), %xmm11
+        subsd     %xmm3, %xmm13
+        mulsd     (%rdi), %xmm4
+        movsd     %xmm13, (%rsi)
+        movaps    %xmm11, %xmm6
+        movsd     (%rbx), %xmm15
+        movsd     (%rsi), %xmm14
+        mulsd     104(%rdx), %xmm6
+        subsd     %xmm14, %xmm15
+        movsd     %xmm15, (%rbx)
+        movsd     (%rbx), %xmm2
+        movsd     88(%rdx), %xmm5
+        subsd     %xmm2, %xmm3
+        movsd     %xmm3, (%rsi)
+        movsd     (%rbx), %xmm3
+        movsd     (%rsi), %xmm2
+        movsd     %xmm6, (%rbx)
+        movsd     (%rbx), %xmm7
+        subsd     (%rdi), %xmm7
+        movsd     %xmm7, (%rsi)
+        movsd     (%rbx), %xmm9
+        movsd     (%rsi), %xmm8
+        subsd     %xmm8, %xmm9
+        movsd     %xmm9, (%rbx)
+        movsd     (%rbx), %xmm10
+        subsd     %xmm10, %xmm11
+        movsd     %xmm11, (%rsi)
+        movsd     (%rbx), %xmm6
+        movaps    %xmm6, %xmm14
+        mulsd     %xmm3, %xmm14
+        mulsd     %xmm2, %xmm6
+        addsd     %xmm14, %xmm5
+        movsd     (%rsi), %xmm15
+        mulsd     %xmm15, %xmm2
+        mulsd     %xmm15, %xmm3
+        addsd     %xmm2, %xmm6
+        movsd     %xmm5, (%rbx)
+        addsd     %xmm3, %xmm6
+        movsd     (%rbx), %xmm12
+        addsd     %xmm4, %xmm6
+        subsd     88(%rdx), %xmm12
+        movsd     %xmm12, -88(%rsp)
+        movsd     -88(%rsp), %xmm13
+        movsd     40(%rdx), %xmm3
+        subsd     %xmm13, %xmm14
+        movsd     %xmm14, -80(%rsp)
+        movsd     -80(%rsp), %xmm5
+        movl      (%rbx), %edx
+        movl      %edx, %esi
+        andl      $127, %edx
+        addsd     %xmm6, %xmm5
+        mulsd     %xmm5, %xmm3
+        addl      %edx, %edx
+        movsd     -8(%rcx,%rdx,8), %xmm2
+        sarl      $7, %esi
+        lea       6784+__dpow_la_CoutTab(%rip), %r9
+        addsd     (%r9), %xmm3
+        mulsd     %xmm5, %xmm3
+        addsd     -8(%r9), %xmm3
+        mulsd     %xmm5, %xmm3
+        addsd     -16(%r9), %xmm3
+        mulsd     %xmm5, %xmm3
+        addsd     -24(%r9), %xmm3
+        mulsd     %xmm5, %xmm3
+        mulsd     %xmm2, %xmm3
+        addsd     (%rcx,%rdx,8), %xmm3
+        movaps    %xmm3, %xmm4
+        addsd     %xmm2, %xmm4
+        movsd     %xmm4, -72(%rsp)
+        movzwl    -66(%rsp), %ecx
+        movl      %ecx, %ebx
+        andl      $32752, %ebx
+        shrl      $4, %ebx
+        lea       -1023(%rsi,%rbx), %edx
+        cmpl      $1024, %edx
+        jge       .LBL_2_66
+
+
+        cmpl      $-1022, %edx
+        jl        .LBL_2_61
+
+
+        andl      $-32753, %ecx
+        lea       1023(%rdx), %edx
+        andl      $2047, %edx
+        shll      $4, %edx
+        orl       %edx, %ecx
+        movw      %cx, -66(%rsp)
+        movsd     -72(%rsp), %xmm2
+        mulsd     %xmm0, %xmm2
+        movsd     %xmm2, -72(%rsp)
+        jmp       .LBL_2_56
+
+.LBL_2_61:
+
+        cmpl      $-1032, %edx
+        jl        .LBL_2_63
+
+
+        lea       -32(%rsp), %rcx
+        movsd     %xmm4, (%rcx)
+        addl      $1223, %esi
+        movsd     (%rcx), %xmm1
+        andl      $2047, %esi
+        lea       6824+__dpow_la_CoutTab(%rip), %rbx
+        movq      (%rbx), %rdx
+        subsd     %xmm1, %xmm2
+        movq      %rdx, -64(%rsp)
+        addsd     %xmm2, %xmm3
+        lea       -24(%rsp), %rdi
+        movsd     %xmm3, (%rdi)
+        movsd     (%rcx), %xmm7
+        movsd     32(%rbx), %xmm2
+        mulsd     %xmm7, %xmm2
+        movsd     (%rdi), %xmm9
+        movsd     %xmm2, (%rcx)
+        movsd     (%rcx), %xmm3
+        shrq      $48, %rdx
+        subsd     %xmm7, %xmm3
+        movsd     %xmm3, (%rdi)
+        andl      $-32753, %edx
+        movsd     (%rcx), %xmm5
+        movsd     (%rdi), %xmm4
+        shll      $4, %esi
+        subsd     %xmm4, %xmm5
+        movsd     %xmm5, (%rcx)
+        orl       %esi, %edx
+        lea       -32(%rsp), %rsi
+        movsd     (%rsi), %xmm6
+        movw      %dx, -58(%rsp)
+        subsd     %xmm6, %xmm7
+        movsd     %xmm7, (%rdi)
+        movsd     (%rsi), %xmm11
+        movsd     (%rdi), %xmm12
+        movsd     -64(%rsp), %xmm10
+        addsd     %xmm9, %xmm12
+        mulsd     %xmm10, %xmm11
+        mulsd     %xmm10, %xmm12
+        movsd     48(%rbx), %xmm8
+        addsd     %xmm11, %xmm12
+        mulsd     %xmm8, %xmm0
+        movq      -16(%rbx), %rcx
+        movq      %rcx, (%rsi)
+        lea       -32(%rsp), %rcx
+        movsd     (%rcx), %xmm14
+        movsd     (%rcx), %xmm13
+        mulsd     %xmm13, %xmm14
+        mulsd     %xmm12, %xmm0
+        movsd     %xmm14, (%rcx)
+        movsd     (%rcx), %xmm15
+        addsd     %xmm15, %xmm0
+        movaps    %xmm0, %xmm2
+        movsd     %xmm2, -72(%rsp)
+        jmp       .LBL_2_56
+
+.LBL_2_63:
+
+        cmpl      $-1084, %edx
+        jl        .LBL_2_65
+
+
+        addl      $1223, %esi
+        andl      $2047, %esi
+        lea       6830+__dpow_la_CoutTab(%rip), %rcx
+        movzwl    (%rcx), %edx
+        shll      $4, %esi
+        andl      $-32753, %edx
+        movsd     %xmm1, -64(%rsp)
+        orl       %esi, %edx
+        movw      %dx, -58(%rsp)
+        movsd     42(%rcx), %xmm2
+        movsd     -64(%rsp), %xmm1
+        mulsd     %xmm2, %xmm0
+        mulsd     %xmm1, %xmm4
+        movq      -22(%rcx), %rcx
+        movq      %rcx, -32(%rsp)
+        mulsd     %xmm4, %xmm0
+        lea       -32(%rsp), %rcx
+        movsd     (%rcx), %xmm4
+        movsd     (%rcx), %xmm3
+        mulsd     %xmm3, %xmm4
+        movsd     %xmm4, (%rcx)
+        movsd     (%rcx), %xmm5
+        subsd     %xmm5, %xmm0
+        movaps    %xmm0, %xmm2
+        movsd     %xmm2, -72(%rsp)
+        jmp       .LBL_2_56
+
+.LBL_2_65:
+
+        movq      6808+__dpow_la_CoutTab(%rip), %rdx
+        movq      %rdx, -32(%rsp)
+        lea       -32(%rsp), %rdx
+        movsd     (%rdx), %xmm2
+        movsd     (%rdx), %xmm1
+        mulsd     %xmm1, %xmm2
+        movsd     %xmm2, (%rdx)
+        movsd     (%rdx), %xmm3
+        mulsd     %xmm3, %xmm0
+        movaps    %xmm0, %xmm2
+        movsd     %xmm2, -72(%rsp)
+        jmp       .LBL_2_56
+
+.LBL_2_66:
+
+        movq      6800+__dpow_la_CoutTab(%rip), %rdx
+        movq      %rdx, -32(%rsp)
+        lea       -32(%rsp), %rdx
+        movsd     (%rdx), %xmm2
+        movsd     (%rdx), %xmm1
+        mulsd     %xmm1, %xmm2
+        movsd     %xmm2, (%rdx)
+        movsd     (%rdx), %xmm3
+        mulsd     %xmm3, %xmm0
+        movaps    %xmm0, %xmm2
+        movsd     %xmm2, -72(%rsp)
+        jmp       .LBL_2_56
+
+.LBL_2_67:
+
+        movb      -57(%rsp), %dl
+        lea       6800+__dpow_la_CoutTab(%rip), %rcx
+        andb      $-128, %dl
+        shrb      $7, %dl
+        xorb      %dl, %bl
+        movzbl    %bl, %ebx
+        movsd     (%rcx,%rbx,8), %xmm2
+        mulsd     %xmm2, %xmm2
+        mulsd     %xmm0, %xmm2
+        jmp       .LBL_2_56
+
+.LBL_2_68:
+
+        testl     %r9d, %r9d
+        jne       .LBL_2_70
+
+
+        testl     %esi, %esi
+        jne       .LBL_2_36
+
+.LBL_2_70:
+
+        lea       6824+__dpow_la_CoutTab(%rip), %rdx
+        andl      $1, %r9d
+        movsd     (%rdx,%r9,8), %xmm2
+        jmp       .LBL_2_56
+
+.LBL_2_71:
+
+        mulsd     %xmm3, %xmm3
+        testb     %bl, %bl
+        je        .LBL_2_73
+
+
+        lea       6824+__dpow_la_CoutTab(%rip), %rax
+        andl      %r12d, %r9d
+        movsd     (%rax,%r9,8), %xmm2
+        movl      $1, %eax
+        divsd     %xmm3, %xmm2
+        jmp       .LBL_2_56
+
+.LBL_2_73:
+
+        lea       6824+__dpow_la_CoutTab(%rip), %rdx
+        andl      %r12d, %r9d
+        movsd     (%rdx,%r9,8), %xmm2
+        mulsd     %xmm3, %xmm2
+        jmp       .LBL_2_56
+
+.LBL_2_74:
+
+        testb     %r11b, %r11b
+        jne       .LBL_2_55
+
+
+        testl     %edx, %edx
+        jne       .LBL_2_30
+
+
+        testl     %r10d, %r10d
+        je        .LBL_2_30
+        jmp       .LBL_2_55
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dpow_cout_rare_internal,@function
+       .size   __svml_dpow_cout_rare_internal,.-__svml_dpow_cout_rare_internal
+..LN__svml_dpow_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dpow_data_internal_avx512:
+       .long   0
+       .long   0
+       .long   1972240384
+       .long   3215375059
+       .long   4207476736
+       .long   3216401398
+       .long   2363129856
+       .long   3217067096
+       .long   972816384
+       .long   3217408026
+       .long   766836736
+       .long   3217739614
+       .long   3103948800
+       .long   3218062358
+       .long   2869821440
+       .long   3218228231
+       .long   1271726080
+       .long   3218381432
+       .long   3449618432
+       .long   3218530849
+       .long   2300510208
+       .long   3218676666
+       .long   4147675136
+       .long   3218819051
+       .long   3761438720
+       .long   3218958163
+       .long   1758134272
+       .long   3219094149
+       .long   14041088
+       .long   3219177733
+       .long   513138688
+       .long   3219242801
+       .long   1904279552
+       .long   1071288313
+       .long   180338688
+       .long   1071163544
+       .long   1751498752
+       .long   1071041295
+       .long   2999894016
+       .long   1070921467
+       .long   3815833600
+       .long   1070803966
+       .long   1399062528
+       .long   1070688704
+       .long   2835742720
+       .long   1070555096
+       .long   2818572288
+       .long   1070333031
+       .long   180322304
+       .long   1070114968
+       .long   704610304
+       .long   1069900764
+       .long   3265986560
+       .long   1069690285
+       .long   3908239360
+       .long   1069419290
+       .long   2530213888
+       .long   1069012484
+       .long   2785017856
+       .long   1068612402
+       .long   3386507264
+       .long   1067938708
+       .long   2250244096
+       .long   1066877934
+       .long   0
+       .long   0
+       .long   650173971
+       .long   3177165030
+       .long   3428024929
+       .long   3174241916
+       .long   1628324029
+       .long   1026060711
+       .long   804943611
+       .long   1028963376
+       .long   518075456
+       .long   1027828752
+       .long   1462134616
+       .long   1028126172
+       .long   384118417
+       .long   3174884873
+       .long   1227618047
+       .long   3176893182
+       .long   446961290
+       .long   3175726255
+       .long   2998207852
+       .long   3176597684
+       .long   2742536172
+       .long   3173319968
+       .long   3242321520
+       .long   1029042433
+       .long   1690697745
+       .long   3174775608
+       .long   4137858450
+       .long   1027958429
+       .long   2514005062
+       .long   1029694520
+       .long   804943611
+       .long   1027914800
+       .long   2871266960
+       .long   3173412044
+       .long   3679462403
+       .long   1027724294
+       .long   2476829589
+       .long   1026974179
+       .long   1572243234
+       .long   3176241050
+       .long   2514550597
+       .long   3175960347
+       .long   1207415416
+       .long   1029642824
+       .long   531120703
+       .long   3174459378
+       .long   894287639
+       .long   1029609779
+       .long   1133539114
+       .long   1029069062
+       .long   1763539348
+       .long   1029327721
+       .long   1658032750
+       .long   3171241178
+       .long   825146242
+       .long   3176213734
+       .long   831162967
+       .long   1028990787
+       .long   1128763360
+       .long   3176457556
+       .long   896504796
+       .long   3175699769
+       .long   0
+       .long   1072693248
+       .long   1828292879
+       .long   1072739672
+       .long   1014845819
+       .long   1072788152
+       .long   1853186616
+       .long   1072838778
+       .long   171030293
+       .long   1072891646
+       .long   1276261410
+       .long   1072946854
+       .long   3577096743
+       .long   1073004506
+       .long   3712504873
+       .long   1073064711
+       .long   1719614413
+       .long   1073127582
+       .long   1944781191
+       .long   1073193236
+       .long   1110089947
+       .long   1073261797
+       .long   2191782032
+       .long   1073333393
+       .long   2572866477
+       .long   1073408159
+       .long   3716502172
+       .long   1073486235
+       .long   3707479175
+       .long   1073567768
+       .long   2728693978
+       .long   1073652911
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1073217536
+       .long   0
+       .long   1073217536
+       .long   0
+       .long   1073217536
+       .long   0
+       .long   1073217536
+       .long   0
+       .long   1073217536
+       .long   0
+       .long   1073217536
+       .long   0
+       .long   1073217536
+       .long   0
+       .long   1073217536
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   3219592519
+       .long   1697350398
+       .long   3219592519
+       .long   1697350398
+       .long   3219592519
+       .long   1697350398
+       .long   3219592519
+       .long   1697350398
+       .long   3219592519
+       .long   1697350398
+       .long   3219592519
+       .long   1697350398
+       .long   3219592519
+       .long   1697350398
+       .long   3219592519
+       .long   4114041750
+       .long   1069844377
+       .long   4114041750
+       .long   1069844377
+       .long   4114041750
+       .long   1069844377
+       .long   4114041750
+       .long   1069844377
+       .long   4114041750
+       .long   1069844377
+       .long   4114041750
+       .long   1069844377
+       .long   4114041750
+       .long   1069844377
+       .long   4114041750
+       .long   1069844377
+       .long   2589302621
+       .long   3217496037
+       .long   2589302621
+       .long   3217496037
+       .long   2589302621
+       .long   3217496037
+       .long   2589302621
+       .long   3217496037
+       .long   2589302621
+       .long   3217496037
+       .long   2589302621
+       .long   3217496037
+       .long   2589302621
+       .long   3217496037
+       .long   2589302621
+       .long   3217496037
+       .long   4238449923
+       .long   1070227829
+       .long   4238449923
+       .long   1070227829
+       .long   4238449923
+       .long   1070227829
+       .long   4238449923
+       .long   1070227829
+       .long   4238449923
+       .long   1070227829
+       .long   4238449923
+       .long   1070227829
+       .long   4238449923
+       .long   1070227829
+       .long   4238449923
+       .long   1070227829
+       .long   3163535583
+       .long   3217999625
+       .long   3163535583
+       .long   3217999625
+       .long   3163535583
+       .long   3217999625
+       .long   3163535583
+       .long   3217999625
+       .long   3163535583
+       .long   3217999625
+       .long   3163535583
+       .long   3217999625
+       .long   3163535583
+       .long   3217999625
+       .long   3163535583
+       .long   3217999625
+       .long   1357918834
+       .long   1070757740
+       .long   1357918834
+       .long   1070757740
+       .long   1357918834
+       .long   1070757740
+       .long   1357918834
+       .long   1070757740
+       .long   1357918834
+       .long   1070757740
+       .long   1357918834
+       .long   1070757740
+       .long   1357918834
+       .long   1070757740
+       .long   1357918834
+       .long   1070757740
+       .long   1697368554
+       .long   3218543943
+       .long   1697368554
+       .long   3218543943
+       .long   1697368554
+       .long   3218543943
+       .long   1697368554
+       .long   3218543943
+       .long   1697368554
+       .long   3218543943
+       .long   1697368554
+       .long   3218543943
+       .long   1697368554
+       .long   3218543943
+       .long   1697368554
+       .long   3218543943
+       .long   3694789628
+       .long   1071564553
+       .long   3694789628
+       .long   1071564553
+       .long   3694789628
+       .long   1071564553
+       .long   3694789628
+       .long   1071564553
+       .long   3694789628
+       .long   1071564553
+       .long   3694789628
+       .long   1071564553
+       .long   3694789628
+       .long   1071564553
+       .long   3694789628
+       .long   1071564553
+       .long   3757988711
+       .long   1013148509
+       .long   3757988711
+       .long   1013148509
+       .long   3757988711
+       .long   1013148509
+       .long   3757988711
+       .long   1013148509
+       .long   3757988711
+       .long   1013148509
+       .long   3757988711
+       .long   1013148509
+       .long   3757988711
+       .long   1013148509
+       .long   3757988711
+       .long   1013148509
+       .long   3999174959
+       .long   1014462451
+       .long   3999174959
+       .long   1014462451
+       .long   3999174959
+       .long   1014462451
+       .long   3999174959
+       .long   1014462451
+       .long   3999174959
+       .long   1014462451
+       .long   3999174959
+       .long   1014462451
+       .long   3999174959
+       .long   1014462451
+       .long   3999174959
+       .long   1014462451
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   16368
+       .long   1123549184
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4294967295
+       .long   3221225471
+       .long   4119604569
+       .long   1059365335
+       .long   4119604569
+       .long   1059365335
+       .long   4119604569
+       .long   1059365335
+       .long   4119604569
+       .long   1059365335
+       .long   4119604569
+       .long   1059365335
+       .long   4119604569
+       .long   1059365335
+       .long   4119604569
+       .long   1059365335
+       .long   4119604569
+       .long   1059365335
+       .long   662950521
+       .long   1062590279
+       .long   662950521
+       .long   1062590279
+       .long   662950521
+       .long   1062590279
+       .long   662950521
+       .long   1062590279
+       .long   662950521
+       .long   1062590279
+       .long   662950521
+       .long   1062590279
+       .long   662950521
+       .long   1062590279
+       .long   662950521
+       .long   1062590279
+       .long   454355882
+       .long   1065595565
+       .long   454355882
+       .long   1065595565
+       .long   454355882
+       .long   1065595565
+       .long   454355882
+       .long   1065595565
+       .long   454355882
+       .long   1065595565
+       .long   454355882
+       .long   1065595565
+       .long   454355882
+       .long   1065595565
+       .long   454355882
+       .long   1065595565
+       .long   3568144057
+       .long   1068264200
+       .long   3568144057
+       .long   1068264200
+       .long   3568144057
+       .long   1068264200
+       .long   3568144057
+       .long   1068264200
+       .long   3568144057
+       .long   1068264200
+       .long   3568144057
+       .long   1068264200
+       .long   3568144057
+       .long   1068264200
+       .long   3568144057
+       .long   1068264200
+       .long   4286862669
+       .long   1070514109
+       .long   4286862669
+       .long   1070514109
+       .long   4286862669
+       .long   1070514109
+       .long   4286862669
+       .long   1070514109
+       .long   4286862669
+       .long   1070514109
+       .long   4286862669
+       .long   1070514109
+       .long   4286862669
+       .long   1070514109
+       .long   4286862669
+       .long   1070514109
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   4277811595
+       .long   1072049730
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   248
+       .long   0
+       .long   248
+       .long   0
+       .long   248
+       .long   0
+       .long   248
+       .long   0
+       .long   248
+       .long   0
+       .long   248
+       .long   0
+       .long   248
+       .long   0
+       .long   248
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   120
+       .long   0
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   0
+       .long   1083173888
+       .long   0
+       .long   1083173888
+       .long   0
+       .long   1083173888
+       .long   0
+       .long   1083173888
+       .long   0
+       .long   1083173888
+       .long   0
+       .long   1083173888
+       .long   0
+       .long   1083173888
+       .long   0
+       .long   1083173888
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .type   __svml_dpow_data_internal_avx512,@object
+       .size   __svml_dpow_data_internal_avx512,2368
+       .align 32
+__dpow_la_CoutTab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072629696
+       .long   0
+       .long   1072569856
+       .long   0
+       .long   1072513472
+       .long   0
+       .long   1072460224
+       .long   0
+       .long   1072409856
+       .long   0
+       .long   1072362112
+       .long   0
+       .long   1072316864
+       .long   0
+       .long   1072273792
+       .long   0
+       .long   1072232896
+       .long   0
+       .long   1072193920
+       .long   0
+       .long   1072156736
+       .long   0
+       .long   1072121280
+       .long   0
+       .long   1072087424
+       .long   0
+       .long   1072054976
+       .long   0
+       .long   1072023936
+       .long   0
+       .long   1071994176
+       .long   0
+       .long   1071965696
+       .long   0
+       .long   1071938304
+       .long   0
+       .long   1071911936
+       .long   0
+       .long   1071886656
+       .long   0
+       .long   1071862272
+       .long   0
+       .long   1071838848
+       .long   0
+       .long   1071816256
+       .long   0
+       .long   1071794496
+       .long   0
+       .long   1071773440
+       .long   0
+       .long   1071753152
+       .long   0
+       .long   1071733504
+       .long   0
+       .long   1071714560
+       .long   0
+       .long   1071696256
+       .long   0
+       .long   1071678528
+       .long   0
+       .long   1071661312
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2686386176
+       .long   1067891457
+       .long   1949948785
+       .long   1027381598
+       .long   1341652992
+       .long   1068918120
+       .long   2376679344
+       .long   1026589938
+       .long   2182004736
+       .long   1069583575
+       .long   297009671
+       .long   1026900933
+       .long   1687183360
+       .long   1069924424
+       .long   2120169064
+       .long   1026082260
+       .long   53207040
+       .long   1070255920
+       .long   3737096550
+       .long   1026438963
+       .long   3818315776
+       .long   1070578756
+       .long   677794872
+       .long   1028109305
+       .long   2429726720
+       .long   1070744485
+       .long   3907638365
+       .long   1027382133
+       .long   2702757888
+       .long   1070897876
+       .long   1929563302
+       .long   1027984695
+       .long   2465140736
+       .long   1071047207
+       .long   243175481
+       .long   1026641700
+       .long   2657701888
+       .long   1071193041
+       .long   3841377895
+       .long   1028504382
+       .long   658427904
+       .long   1071335525
+       .long   161357665
+       .long   1028306250
+       .long   539168768
+       .long   1071474585
+       .long   2531816708
+       .long   1025043792
+       .long   2658430976
+       .long   1071610420
+       .long   2178519328
+       .long   1028288112
+       .long   1355743232
+       .long   1071694102
+       .long   3943781029
+       .long   1028003666
+       .long   1854838784
+       .long   1071759170
+       .long   1812291414
+       .long   1027042047
+       .long   473251840
+       .long   3218771869
+       .long   1330616404
+       .long   3175482613
+       .long   2315530240
+       .long   3218647330
+       .long   3482179716
+       .long   3175726112
+       .long   3886694400
+       .long   3218525081
+       .long   3584491563
+       .long   3175164762
+       .long   1568866304
+       .long   3218405023
+       .long   3528175174
+       .long   3174626157
+       .long   4172640256
+       .long   3218287637
+       .long   3760034354
+       .long   3171774178
+       .long   3545214976
+       .long   3218172213
+       .long   881689765
+       .long   3173077446
+       .long   2121375744
+       .long   3218038698
+       .long   549802690
+       .long   3174897014
+       .long   492560384
+       .long   3217816668
+       .long   239252792
+       .long   3173483664
+       .long   155754496
+       .long   3217598893
+       .long   1693604438
+       .long   3175909818
+       .long   4285202432
+       .long   3217384365
+       .long   127148739
+       .long   3175942199
+       .long   41181184
+       .long   3217174003
+       .long   3260046653
+       .long   3174058211
+       .long   2465087488
+       .long   3216902292
+       .long   4241850247
+       .long   3175110025
+       .long   1101037568
+       .long   3216495763
+       .long   3170347605
+       .long   3176066808
+       .long   3478798336
+       .long   3216096373
+       .long   329155479
+       .long   3175972274
+       .long   3246555136
+       .long   3215423741
+       .long   4071576371
+       .long   3174315914
+       .long   830078976
+       .long   3214361213
+       .long   1258533012
+       .long   3175547121
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072689152
+       .long   0
+       .long   1072685056
+       .long   0
+       .long   1072681024
+       .long   0
+       .long   1072676992
+       .long   0
+       .long   1072672960
+       .long   0
+       .long   1072668928
+       .long   0
+       .long   1072664960
+       .long   0
+       .long   1072660992
+       .long   0
+       .long   1072657024
+       .long   0
+       .long   1072653056
+       .long   0
+       .long   1072649152
+       .long   0
+       .long   1072645248
+       .long   0
+       .long   1072641344
+       .long   0
+       .long   1072637440
+       .long   0
+       .long   1072710976
+       .long   0
+       .long   1072709888
+       .long   0
+       .long   1072708864
+       .long   0
+       .long   1072707776
+       .long   0
+       .long   1072706752
+       .long   0
+       .long   1072705664
+       .long   0
+       .long   1072704640
+       .long   0
+       .long   1072703616
+       .long   0
+       .long   1072702528
+       .long   0
+       .long   1072701504
+       .long   0
+       .long   1072700480
+       .long   0
+       .long   1072699456
+       .long   0
+       .long   1072698368
+       .long   0
+       .long   1072697344
+       .long   0
+       .long   1072696320
+       .long   0
+       .long   1072695296
+       .long   0
+       .long   1072694272
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2754084864
+       .long   1063721742
+       .long   2557931335
+       .long   1028226920
+       .long   3228041216
+       .long   1064771801
+       .long   930662348
+       .long   1027873525
+       .long   2323251200
+       .long   1065436614
+       .long   2596299912
+       .long   1027915217
+       .long   1641152512
+       .long   1065811444
+       .long   1188689655
+       .long   1027383036
+       .long   895221760
+       .long   1066187001
+       .long   2918954073
+       .long   1026717129
+       .long   3962896384
+       .long   1066482539
+       .long   1338190555
+       .long   1024402868
+       .long   2071330816
+       .long   1066668054
+       .long   2834125591
+       .long   1027573772
+       .long   830078976
+       .long   1066853925
+       .long   1683363035
+       .long   1027948302
+       .long   1828782080
+       .long   1067040153
+       .long   874130859
+       .long   1026348678
+       .long   2395996160
+       .long   1067226740
+       .long   1724975876
+       .long   1028585613
+       .long   3558866944
+       .long   1067410669
+       .long   2189961434
+       .long   1027936707
+       .long   2542927872
+       .long   1067522658
+       .long   3621009110
+       .long   1028493916
+       .long   4208394240
+       .long   1067614973
+       .long   2777386350
+       .long   1028255456
+       .long   3217162240
+       .long   1067707465
+       .long   772669574
+       .long   1028516547
+       .long   824377344
+       .long   3214460051
+       .long   1593617402
+       .long   3175722247
+       .long   830078976
+       .long   3214361213
+       .long   1258533012
+       .long   3175547121
+       .long   4002480128
+       .long   3214268096
+       .long   1397883555
+       .long   3175764245
+       .long   2914385920
+       .long   3214169062
+       .long   3775067953
+       .long   3175176772
+       .long   1460142080
+       .long   3214075761
+       .long   1592372614
+       .long   3175907032
+       .long   219152384
+       .long   3213976530
+       .long   1716511551
+       .long   3175540921
+       .long   3419144192
+       .long   3213880645
+       .long   1128677462
+       .long   3174560569
+       .long   3320446976
+       .long   3213693490
+       .long   2965227743
+       .long   3172454196
+       .long   677904384
+       .long   3213494440
+       .long   4029390031
+       .long   3174409513
+       .long   1290797056
+       .long   3213306911
+       .long   1477436787
+       .long   3173730612
+       .long   2800877568
+       .long   3213119200
+       .long   4281418519
+       .long   3173304523
+       .long   3692822528
+       .long   3212931307
+       .long   751117103
+       .long   3175382448
+       .long   2547253248
+       .long   3212626079
+       .long   2419265147
+       .long   3175328924
+       .long   1836580864
+       .long   3212249540
+       .long   1456335141
+       .long   3175441338
+       .long   3438542848
+       .long   3211872634
+       .long   3721652080
+       .long   3176073447
+       .long   4278714368
+       .long   3211202435
+       .long   836003693
+       .long   3174279974
+       .long   926941184
+       .long   3210154597
+       .long   4249864733
+       .long   3174015648
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1073741824
+       .long   1073157447
+       .long   0
+       .long   1073157401
+       .long   0
+       .long   1073157355
+       .long   3221225472
+       .long   1073157308
+       .long   2147483648
+       .long   1073157262
+       .long   2147483648
+       .long   1073157216
+       .long   1073741824
+       .long   1073157170
+       .long   1073741824
+       .long   1073157124
+       .long   0
+       .long   1073157078
+       .long   3221225472
+       .long   1073157031
+       .long   3221225472
+       .long   1073156985
+       .long   2147483648
+       .long   1073156939
+       .long   2147483648
+       .long   1073156893
+       .long   1073741824
+       .long   1073156847
+       .long   1073741824
+       .long   1073156801
+       .long   0
+       .long   1073156755
+       .long   0
+       .long   1073156709
+       .long   3221225472
+       .long   1073156662
+       .long   3221225472
+       .long   1073156616
+       .long   2147483648
+       .long   1073156570
+       .long   2147483648
+       .long   1073156524
+       .long   2147483648
+       .long   1073156478
+       .long   1073741824
+       .long   1073156432
+       .long   1073741824
+       .long   1073156386
+       .long   0
+       .long   1073156340
+       .long   0
+       .long   1073156294
+       .long   0
+       .long   1073156248
+       .long   3221225472
+       .long   1073156201
+       .long   3221225472
+       .long   1073156155
+       .long   2147483648
+       .long   1073156109
+       .long   2147483648
+       .long   1073156063
+       .long   2147483648
+       .long   1073156017
+       .long   1073741824
+       .long   1073155971
+       .long   1073741824
+       .long   1073155925
+       .long   1073741824
+       .long   1073155879
+       .long   1073741824
+       .long   1073155833
+       .long   0
+       .long   1073155787
+       .long   0
+       .long   1073155741
+       .long   0
+       .long   1073155695
+       .long   0
+       .long   1073155649
+       .long   3221225472
+       .long   1073155602
+       .long   3221225472
+       .long   1073155556
+       .long   3221225472
+       .long   1073155510
+       .long   3221225472
+       .long   1073155464
+       .long   3221225472
+       .long   1073155418
+       .long   2147483648
+       .long   1073155372
+       .long   2147483648
+       .long   1073155326
+       .long   2147483648
+       .long   1073155280
+       .long   2147483648
+       .long   1073155234
+       .long   2147483648
+       .long   1073155188
+       .long   2147483648
+       .long   1073155142
+       .long   2147483648
+       .long   1073155096
+       .long   2147483648
+       .long   1073155050
+       .long   2147483648
+       .long   1073155004
+       .long   1073741824
+       .long   1073154958
+       .long   1073741824
+       .long   1073154912
+       .long   1073741824
+       .long   1073154866
+       .long   1073741824
+       .long   1073154820
+       .long   1073741824
+       .long   1073154774
+       .long   1073741824
+       .long   1073154728
+       .long   1073741824
+       .long   1073154682
+       .long   2147483648
+       .long   1073158995
+       .long   1073741824
+       .long   1073158972
+       .long   1073741824
+       .long   1073158949
+       .long   0
+       .long   1073158926
+       .long   0
+       .long   1073158903
+       .long   3221225472
+       .long   1073158879
+       .long   3221225472
+       .long   1073158856
+       .long   2147483648
+       .long   1073158833
+       .long   2147483648
+       .long   1073158810
+       .long   1073741824
+       .long   1073158787
+       .long   1073741824
+       .long   1073158764
+       .long   0
+       .long   1073158741
+       .long   0
+       .long   1073158718
+       .long   3221225472
+       .long   1073158694
+       .long   3221225472
+       .long   1073158671
+       .long   2147483648
+       .long   1073158648
+       .long   2147483648
+       .long   1073158625
+       .long   1073741824
+       .long   1073158602
+       .long   1073741824
+       .long   1073158579
+       .long   0
+       .long   1073158556
+       .long   0
+       .long   1073158533
+       .long   3221225472
+       .long   1073158509
+       .long   3221225472
+       .long   1073158486
+       .long   2147483648
+       .long   1073158463
+       .long   2147483648
+       .long   1073158440
+       .long   1073741824
+       .long   1073158417
+       .long   1073741824
+       .long   1073158394
+       .long   1073741824
+       .long   1073158371
+       .long   0
+       .long   1073158348
+       .long   0
+       .long   1073158325
+       .long   3221225472
+       .long   1073158301
+       .long   3221225472
+       .long   1073158278
+       .long   2147483648
+       .long   1073158255
+       .long   2147483648
+       .long   1073158232
+       .long   2147483648
+       .long   1073158209
+       .long   1073741824
+       .long   1073158186
+       .long   1073741824
+       .long   1073158163
+       .long   0
+       .long   1073158140
+       .long   0
+       .long   1073158117
+       .long   3221225472
+       .long   1073158093
+       .long   3221225472
+       .long   1073158070
+       .long   3221225472
+       .long   1073158047
+       .long   2147483648
+       .long   1073158024
+       .long   2147483648
+       .long   1073158001
+       .long   1073741824
+       .long   1073157978
+       .long   1073741824
+       .long   1073157955
+       .long   1073741824
+       .long   1073157932
+       .long   0
+       .long   1073157909
+       .long   0
+       .long   1073157886
+       .long   3221225472
+       .long   1073157862
+       .long   3221225472
+       .long   1073157839
+       .long   3221225472
+       .long   1073157816
+       .long   2147483648
+       .long   1073157793
+       .long   2147483648
+       .long   1073157770
+       .long   2147483648
+       .long   1073157747
+       .long   1073741824
+       .long   1073157724
+       .long   1073741824
+       .long   1073157701
+       .long   0
+       .long   1073157678
+       .long   0
+       .long   1073157655
+       .long   0
+       .long   1073157632
+       .long   3221225472
+       .long   1073157608
+       .long   3221225472
+       .long   1073157585
+       .long   3221225472
+       .long   1073157562
+       .long   2147483648
+       .long   1073157539
+       .long   2147483648
+       .long   1073157516
+       .long   2147483648
+       .long   1073157493
+       .long   1073741824
+       .long   1073157470
+       .long   1073741824
+       .long   1073157447
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1342177280
+       .long   1057431575
+       .long   1679773494
+       .long   1024039205
+       .long   989855744
+       .long   1058476078
+       .long   3244478756
+       .long   1024589954
+       .long   209715200
+       .long   1059147828
+       .long   152199156
+       .long   1027874535
+       .long   2449473536
+       .long   1059526748
+       .long   2343302255
+       .long   1022283036
+       .long   1560281088
+       .long   1059903632
+       .long   4038848719
+       .long   1027337824
+       .long   4282384384
+       .long   1060196455
+       .long   2325104861
+       .long   1027595231
+       .long   1665138688
+       .long   1060384909
+       .long   2934027888
+       .long   1026982347
+       .long   3263168512
+       .long   1060574392
+       .long   3208451390
+       .long   1027670758
+       .long   3980394496
+       .long   1060763881
+       .long   863587004
+       .long   1026973426
+       .long   2470445056
+       .long   1060952352
+       .long   1027097864
+       .long   1028644619
+       .long   1296039936
+       .long   1061141853
+       .long   2016162954
+       .long   1025089894
+       .long   3107979264
+       .long   1061244623
+       .long   970842239
+       .long   1028172704
+       .long   3722444800
+       .long   1061339379
+       .long   2640304163
+       .long   1027825546
+       .long   2959081472
+       .long   1061433626
+       .long   306547692
+       .long   1028101690
+       .long   2631925760
+       .long   1061528388
+       .long   747377661
+       .long   1028120913
+       .long   794820608
+       .long   1061622641
+       .long   3406550266
+       .long   1028182206
+       .long   3825205248
+       .long   1061717408
+       .long   3705775220
+       .long   1027201825
+       .long   916455424
+       .long   1061811667
+       .long   1432750358
+       .long   1028165990
+       .long   3011510272
+       .long   1061906440
+       .long   3361908688
+       .long   1027438936
+       .long   3330277376
+       .long   1062000704
+       .long   3560665332
+       .long   1027805882
+       .long   3082813440
+       .long   1062094971
+       .long   2539531329
+       .long   1028011583
+       .long   3747610624
+       .long   1062189753
+       .long   2232403651
+       .long   1025658467
+       .long   1218445312
+       .long   1062245757
+       .long   396499622
+       .long   1025861782
+       .long   1086324736
+       .long   1062293151
+       .long   2757240868
+       .long   1026731615
+       .long   2047868928
+       .long   1062340290
+       .long   2226191703
+       .long   1027982328
+       .long   580911104
+       .long   1062387431
+       .long   1252857417
+       .long   1028280924
+       .long   1887436800
+       .long   1062434829
+       .long   659583454
+       .long   1025370904
+       .long   4186963968
+       .long   1062481972
+       .long   3587661750
+       .long   1028188900
+       .long   738197504
+       .long   1062529374
+       .long   3240696709
+       .long   1027025093
+       .long   2511339520
+       .long   1062576520
+       .long   2884432087
+       .long   1028614554
+       .long   1859125248
+       .long   1062623668
+       .long   2402099113
+       .long   1025699109
+       .long   4148166656
+       .long   1062671073
+       .long   2335237504
+       .long   1026835951
+       .long   2970615808
+       .long   1062718224
+       .long   3698719430
+       .long   1027808594
+       .long   3662675968
+       .long   1062765376
+       .long   2704653673
+       .long   1027603403
+       .long   1929379840
+       .long   1062812530
+       .long   761521627
+       .long   1027109120
+       .long   3273654272
+       .long   1062859941
+       .long   470528098
+       .long   1027977181
+       .long   1019215872
+       .long   1062907098
+       .long   3704635566
+       .long   1027707215
+       .long   635437056
+       .long   1062954256
+       .long   3676592927
+       .long   1027502983
+       .long   2122317824
+       .long   1063001415
+       .long   1497197375
+       .long   1028267547
+       .long   2529165312
+       .long   1063048832
+       .long   3425827878
+       .long   1022000476
+       .long   3498049536
+       .long   1063095994
+       .long   1982476393
+       .long   1026289596
+       .long   2043674624
+       .long   1063143158
+       .long   2502680620
+       .long   1028471295
+       .long   2463105024
+       .long   1063190323
+       .long   991567028
+       .long   1027421239
+       .long   460324864
+       .long   1063237490
+       .long   1461814384
+       .long   1026181618
+       .long   920125440
+       .long   1063270489
+       .long   1613472693
+       .long   1027845558
+       .long   3956277248
+       .long   1063294073
+       .long   93449747
+       .long   1028284502
+       .long   1487405056
+       .long   1063317659
+       .long   1336931403
+       .long   1026834156
+       .long   2102919168
+       .long   1063341245
+       .long   319680825
+       .long   1027392710
+       .long   1508376576
+       .long   1063364832
+       .long   2474643583
+       .long   1027776685
+       .long   3999268864
+       .long   1063388419
+       .long   3104004650
+       .long   1024627034
+       .long   985137152
+       .long   1063412008
+       .long   550153379
+       .long   1026678253
+       .long   1056440320
+       .long   1063435597
+       .long   672168391
+       .long   1027731310
+       .long   4213702656
+       .long   1063459186
+       .long   1805142399
+       .long   1026660459
+       .long   2772434944
+       .long   1063482905
+       .long   2448602160
+       .long   1028404887
+       .long   3528458240
+       .long   1063506496
+       .long   3457943394
+       .long   1027665063
+       .long   3075473408
+       .long   1063530088
+       .long   121314862
+       .long   1027996294
+       .long   1414004736
+       .long   1063553681
+       .long   94774013
+       .long   1028053481
+       .long   2839019520
+       .long   1063577274
+       .long   1263902834
+       .long   1028588748
+       .long   3056074752
+       .long   1063600868
+       .long   369708558
+       .long   1028257136
+       .long   2065170432
+       .long   1063624463
+       .long   1634529849
+       .long   1027810905
+       .long   1769996288
+       .long   3210227157
+       .long   1054279927
+       .long   3174741313
+       .long   2442133504
+       .long   3210203373
+       .long   2067107398
+       .long   3175167430
+       .long   456130560
+       .long   3210179845
+       .long   4142755806
+       .long   3170825152
+       .long   2302672896
+       .long   3210156060
+       .long   1526169727
+       .long   3175523413
+       .long   1524629504
+       .long   3210132531
+       .long   2442955053
+       .long   3175425591
+       .long   251658240
+       .long   3210108746
+       .long   2154729168
+       .long   3175535488
+       .long   681574400
+       .long   3210085216
+       .long   4275862891
+       .long   3176027230
+       .long   584056832
+       .long   3210061430
+       .long   4255852476
+       .long   3173565530
+       .long   2221932544
+       .long   3210037899
+       .long   2498876736
+       .long   3175149504
+       .long   3297771520
+       .long   3210014112
+       .long   1851620949
+       .long   3175688865
+       .long   1849688064
+       .long   3209990581
+       .long   2923055509
+       .long   3171310641
+       .long   4099932160
+       .long   3209966793
+       .long   2427653201
+       .long   3173037457
+       .long   3858759680
+       .long   3209943261
+       .long   1550068012
+       .long   3173027359
+       .long   2987393024
+       .long   3209919473
+       .long   4127650534
+       .long   3175851613
+       .long   3954180096
+       .long   3209895940
+       .long   442055840
+       .long   3174771669
+       .long   4257218560
+       .long   3209872151
+       .long   4113960829
+       .long   3175350854
+       .long   2135949312
+       .long   3209848618
+       .long   2076166727
+       .long   3175229825
+       .long   3613392896
+       .long   3209824828
+       .long   3476091171
+       .long   3171604778
+       .long   2699034624
+       .long   3209801294
+       .long   1765290157
+       .long   3173591669
+       .long   1053818880
+       .long   3209777504
+       .long   3761837094
+       .long   3175683182
+       .long   1346371584
+       .long   3209753969
+       .long   1459626820
+       .long   3176031561
+       .long   875560960
+       .long   3209730178
+       .long   2402361097
+       .long   3174909319
+       .long   2375024640
+       .long   3209706642
+       .long   687754918
+       .long   3174943382
+       .long   1858076672
+       .long   3209674565
+       .long   252333183
+       .long   3175531572
+       .long   2975858688
+       .long   3209627492
+       .long   1334776821
+       .long   3174591557
+       .long   2430599168
+       .long   3209579907
+       .long   1326030186
+       .long   3173486707
+       .long   1665138688
+       .long   3209532833
+       .long   737674412
+       .long   3174401557
+       .long   2122317824
+       .long   3209485758
+       .long   3987168834
+       .long   3175346908
+       .long   815792128
+       .long   3209438171
+       .long   3526910672
+       .long   3176068855
+       .long   3686793216
+       .long   3209391094
+       .long   587265932
+       .long   3174950865
+       .long   429916160
+       .long   3209343506
+       .long   3143915816
+       .long   3175955609
+       .long   1417674752
+       .long   3209296428
+       .long   2918285701
+       .long   3174860756
+       .long   505413632
+       .long   3209248838
+       .long   436607152
+       .long   3175743066
+       .long   3904897024
+       .long   3209201758
+       .long   2867787430
+       .long   3173594277
+       .long   4229955584
+       .long   3209154678
+       .long   3971699810
+       .long   3174682560
+       .long   2556428288
+       .long   3209107086
+       .long   3215049067
+       .long   3174495054
+       .long   998244352
+       .long   3209060005
+       .long   2424883713
+       .long   3173182748
+       .long   1667235840
+       .long   3209012411
+       .long   762177973
+       .long   3175232288
+       .long   2518679552
+       .long   3208965328
+       .long   282609672
+       .long   3175635057
+       .long   1237319680
+       .long   3208917733
+       .long   1502777354
+       .long   3174942228
+       .long   203423744
+       .long   3208870649
+       .long   4128371954
+       .long   3175884977
+       .long   392167424
+       .long   3208823564
+       .long   306802084
+       .long   3175724146
+       .long   2642411520
+       .long   3208775966
+       .long   2960876517
+       .long   3173143647
+       .long   945815552
+       .long   3208728880
+       .long   1800251929
+       .long   3170106484
+       .long   1241513984
+       .long   3208681281
+       .long   2675524524
+       .long   3173521837
+       .long   3904897024
+       .long   3208625826
+       .long   83988225
+       .long   3175795858
+       .long   3477078016
+       .long   3208531649
+       .long   1575792028
+       .long   3175657512
+       .long   2537553920
+       .long   3208436447
+       .long   1662079495
+       .long   3175916253
+       .long   2634022912
+       .long   3208342267
+       .long   2818347875
+       .long   3174383619
+       .long   2080374784
+       .long   3208247062
+       .long   1081767985
+       .long   3175779040
+       .long   2696937472
+       .long   3208152879
+       .long   2443744157
+       .long   3175275915
+       .long   1459617792
+       .long   3208058695
+       .long   790904149
+       .long   3174713637
+       .long   3670016000
+       .long   3207963485
+       .long   581064731
+       .long   3173466591
+       .long   2952790016
+       .long   3207869298
+       .long   1008918738
+       .long   3171724149
+       .long   377487360
+       .long   3207775110
+       .long   1606538461
+       .long   3175837201
+       .long   1052770304
+       .long   3207679896
+       .long   2534546984
+       .long   3175060122
+       .long   2298478592
+       .long   3207577425
+       .long   2154814426
+       .long   3172198942
+       .long   117440512
+       .long   3207386992
+       .long   1374248651
+       .long   3174502065
+       .long   1342177280
+       .long   3207198603
+       .long   4280579335
+       .long   3175188313
+       .long   3154116608
+       .long   3207010211
+       .long   3334926656
+       .long   3174829419
+       .long   2189426688
+       .long   3206819769
+       .long   3100885346
+       .long   3175936751
+       .long   746586112
+       .long   3206631372
+       .long   315615614
+       .long   3173018851
+       .long   4043309056
+       .long   3206340535
+       .long   274116456
+       .long   3175970612
+       .long   268435456
+       .long   3205959634
+       .long   691182319
+       .long   3173304996
+       .long   603979776
+       .long   3205582822
+       .long   112661265
+       .long   3170010307
+       .long   4194304000
+       .long   3204915176
+       .long   3717748378
+       .long   3174284044
+       .long   2885681152
+       .long   3203858420
+       .long   192153543
+       .long   3175961815
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   2851812149
+       .long   1072698941
+       .long   2595802551
+       .long   1016815913
+       .long   1048019041
+       .long   1072704666
+       .long   1398474845
+       .long   3161559171
+       .long   3899555717
+       .long   1072710421
+       .long   427280750
+       .long   3163595548
+       .long   3541402996
+       .long   1072716208
+       .long   2759177317
+       .long   1015903202
+       .long   702412510
+       .long   1072722027
+       .long   3803266086
+       .long   3163328991
+       .long   410360776
+       .long   1072727877
+       .long   1269990655
+       .long   1013024446
+       .long   3402036099
+       .long   1072733758
+       .long   405889333
+       .long   1016154232
+       .long   1828292879
+       .long   1072739672
+       .long   1255956746
+       .long   1016636974
+       .long   728909815
+       .long   1072745618
+       .long   383930225
+       .long   1016078044
+       .long   852742562
+       .long   1072751596
+       .long   667253586
+       .long   1010842135
+       .long   2952712987
+       .long   1072757606
+       .long   3293494651
+       .long   3161168877
+       .long   3490863953
+       .long   1072763649
+       .long   960797497
+       .long   3163997456
+       .long   3228316108
+       .long   1072769725
+       .long   3010241991
+       .long   3159471380
+       .long   2930322912
+       .long   1072775834
+       .long   2599499422
+       .long   3163762623
+       .long   3366293073
+       .long   1072781976
+       .long   3119426313
+       .long   1015169130
+       .long   1014845819
+       .long   1072788152
+       .long   3117910645
+       .long   3162607681
+       .long   948735466
+       .long   1072794361
+       .long   3516338027
+       .long   3163623459
+       .long   3949972341
+       .long   1072800603
+       .long   2068408548
+       .long   1015962444
+       .long   2214878420
+       .long   1072806880
+       .long   892270087
+       .long   3164164998
+       .long   828946858
+       .long   1072813191
+       .long   10642492
+       .long   1016988014
+       .long   586995997
+       .long   1072819536
+       .long   41662347
+       .long   3163676568
+       .long   2288159958
+       .long   1072825915
+       .long   2169144468
+       .long   1015924597
+       .long   2440944790
+       .long   1072832329
+       .long   2492769773
+       .long   1015196030
+       .long   1853186616
+       .long   1072838778
+       .long   3066496370
+       .long   1016705150
+       .long   1337108031
+       .long   1072845262
+       .long   3203724452
+       .long   1015726421
+       .long   1709341917
+       .long   1072851781
+       .long   2571168217
+       .long   1015201075
+       .long   3790955393
+       .long   1072858335
+       .long   2352942461
+       .long   3164228666
+       .long   4112506593
+       .long   1072864925
+       .long   2947355221
+       .long   1015419624
+       .long   3504003472
+       .long   1072871551
+       .long   3594001059
+       .long   3158379228
+       .long   2799960843
+       .long   1072878213
+       .long   1423655380
+       .long   1016070727
+       .long   2839424854
+       .long   1072884911
+       .long   1171596163
+       .long   1014090255
+       .long   171030293
+       .long   1072891646
+       .long   3526460132
+       .long   1015477354
+       .long   4232894513
+       .long   1072898416
+       .long   2383938684
+       .long   1015717095
+       .long   2992903935
+       .long   1072905224
+       .long   2218154405
+       .long   1016276769
+       .long   1603444721
+       .long   1072912069
+       .long   1548633640
+       .long   3163249902
+       .long   926591435
+       .long   1072918951
+       .long   3208833761
+       .long   3163962090
+       .long   1829099622
+       .long   1072925870
+       .long   1016661180
+       .long   3164509581
+       .long   887463927
+       .long   1072932827
+       .long   3596744162
+       .long   3161842742
+       .long   3272845541
+       .long   1072939821
+       .long   928852419
+       .long   3164536824
+       .long   1276261410
+       .long   1072946854
+       .long   300981947
+       .long   1015732745
+       .long   78413852
+       .long   1072953925
+       .long   4183226867
+       .long   3164065827
+       .long   569847338
+       .long   1072961034
+       .long   472945272
+       .long   3160339305
+       .long   3645941911
+       .long   1072968181
+       .long   3814685080
+       .long   3162621917
+       .long   1617004845
+       .long   1072975368
+       .long   82804943
+       .long   1011391354
+       .long   3978100823
+       .long   1072982593
+       .long   3513027190
+       .long   1016894539
+       .long   3049340112
+       .long   1072989858
+       .long   3062915824
+       .long   1014219171
+       .long   4040676318
+       .long   1072997162
+       .long   4090609238
+       .long   1016712034
+       .long   3577096743
+       .long   1073004506
+       .long   2951496418
+       .long   1014842263
+       .long   2583551245
+       .long   1073011890
+       .long   3161094195
+       .long   1016655067
+       .long   1990012071
+       .long   1073019314
+       .long   3529070563
+       .long   3163861769
+       .long   2731501122
+       .long   1073026778
+       .long   1774031854
+       .long   3163518597
+       .long   1453150082
+       .long   1073034283
+       .long   498154668
+       .long   3162536638
+       .long   3395129871
+       .long   1073041828
+       .long   4025345434
+       .long   3163383964
+       .long   917841882
+       .long   1073049415
+       .long   18715564
+       .long   1016707884
+       .long   3566716925
+       .long   1073057042
+       .long   1536826855
+       .long   1015191009
+       .long   3712504873
+       .long   1073064711
+       .long   88491948
+       .long   1016476236
+       .long   2321106615
+       .long   1073072422
+       .long   2171176610
+       .long   1010584347
+       .long   363667784
+       .long   1073080175
+       .long   813753949
+       .long   1016833785
+       .long   3111574537
+       .long   1073087969
+       .long   2606161479
+       .long   3163808322
+       .long   2956612997
+       .long   1073095806
+       .long   2118169750
+       .long   3163784129
+       .long   885834528
+       .long   1073103686
+       .long   1973258546
+       .long   3163310140
+       .long   2186617381
+       .long   1073111608
+       .long   2270764083
+       .long   3164321289
+       .long   3561793907
+       .long   1073119573
+       .long   1157054052
+       .long   1012938926
+       .long   1719614413
+       .long   1073127582
+       .long   330458197
+       .long   3164331316
+       .long   1963711167
+       .long   1073135634
+       .long   1744767756
+       .long   3161622870
+       .long   1013258799
+       .long   1073143730
+       .long   1748797610
+       .long   3161177658
+       .long   4182873220
+       .long   1073151869
+       .long   629542646
+       .long   3163044879
+       .long   3907805044
+       .long   1073160053
+       .long   2257091225
+       .long   3162598983
+       .long   1218806132
+       .long   1073168282
+       .long   1818613051
+       .long   3163597017
+       .long   1447192521
+       .long   1073176555
+       .long   1462857171
+       .long   3163563097
+       .long   1339972927
+       .long   1073184873
+       .long   167908908
+       .long   1016620728
+       .long   1944781191
+       .long   1073193236
+       .long   3993278767
+       .long   3162772855
+       .long   19972402
+       .long   1073201645
+       .long   3507899861
+       .long   1017057868
+       .long   919555682
+       .long   1073210099
+       .long   3121969534
+       .long   1013996802
+       .long   1413356050
+       .long   1073218599
+       .long   1651349290
+       .long   3163716742
+       .long   2571947539
+       .long   1073227145
+       .long   3558159063
+       .long   3164425245
+       .long   1176749997
+       .long   1073235738
+       .long   2738998779
+       .long   3163084420
+       .long   2604962541
+       .long   1073244377
+       .long   2614425274
+       .long   3164587768
+       .long   3649726105
+       .long   1073253063
+       .long   4085036346
+       .long   1016698050
+       .long   1110089947
+       .long   1073261797
+       .long   1451641638
+       .long   1016523249
+       .long   380978316
+       .long   1073270578
+       .long   854188970
+       .long   3161511262
+       .long   2568320822
+       .long   1073279406
+       .long   2732824428
+       .long   1015401491
+       .long   194117574
+       .long   1073288283
+       .long   777528611
+       .long   3164460665
+       .long   2966275557
+       .long   1073297207
+       .long   2176155323
+       .long   3160891335
+       .long   3418903055
+       .long   1073306180
+       .long   2527457337
+       .long   3161869180
+       .long   2682146384
+       .long   1073315202
+       .long   2082178512
+       .long   3164411995
+       .long   1892288442
+       .long   1073324273
+       .long   2446255666
+       .long   3163648957
+       .long   2191782032
+       .long   1073333393
+       .long   2960257726
+       .long   1014791238
+       .long   434316067
+       .long   1073342563
+       .long   2028358766
+       .long   1014506698
+       .long   2069751141
+       .long   1073351782
+       .long   1562170674
+       .long   3163773257
+       .long   3964284211
+       .long   1073361051
+       .long   2111583915
+       .long   1016475740
+       .long   2990417245
+       .long   1073370371
+       .long   3683467745
+       .long   3164417902
+       .long   321958744
+       .long   1073379742
+       .long   3401933766
+       .long   1016843134
+       .long   1434058175
+       .long   1073389163
+       .long   251133233
+       .long   1016134345
+       .long   3218338682
+       .long   1073398635
+       .long   3404164304
+       .long   3163525684
+       .long   2572866477
+       .long   1073408159
+       .long   878562433
+       .long   1016570317
+       .long   697153126
+       .long   1073417735
+       .long   1283515428
+       .long   3164331765
+       .long   3092190715
+       .long   1073427362
+       .long   814012167
+       .long   3160571998
+       .long   2380618042
+       .long   1073437042
+       .long   3149557219
+       .long   3164369375
+       .long   4076559943
+       .long   1073446774
+       .long   2119478330
+       .long   3161806927
+       .long   815859274
+       .long   1073456560
+       .long   240396590
+       .long   3164536019
+       .long   2420883922
+       .long   1073466398
+       .long   2049810052
+       .long   1015168464
+       .long   1540824585
+       .long   1073476290
+       .long   1064017010
+       .long   3164536266
+       .long   3716502172
+       .long   1073486235
+       .long   2303740125
+       .long   1015091301
+       .long   1610600570
+       .long   1073496235
+       .long   3766732298
+       .long   1016808759
+       .long   777507147
+       .long   1073506289
+       .long   4282924204
+       .long   1016236109
+       .long   2483480501
+       .long   1073516397
+       .long   1216371780
+       .long   1014082748
+       .long   3706687593
+       .long   1073526560
+       .long   3521726939
+       .long   1014301643
+       .long   1432208378
+       .long   1073536779
+       .long   1401068914
+       .long   3163412539
+       .long   1242007932
+       .long   1073547053
+       .long   1132034716
+       .long   3164388407
+       .long   135105010
+       .long   1073557383
+       .long   1906148727
+       .long   3164424315
+       .long   3707479175
+       .long   1073567768
+       .long   3613079302
+       .long   1015213314
+       .long   382305176
+       .long   1073578211
+       .long   2347622376
+       .long   3163627201
+       .long   64696965
+       .long   1073588710
+       .long   1768797490
+       .long   1016865536
+       .long   4076975200
+       .long   1073599265
+       .long   2029000898
+       .long   1016257111
+       .long   863738719
+       .long   1073609879
+       .long   1326992219
+       .long   3163661773
+       .long   351641897
+       .long   1073620550
+       .long   2172261526
+       .long   3164059175
+       .long   3884662774
+       .long   1073631278
+       .long   2158611599
+       .long   1015258761
+       .long   4224142467
+       .long   1073642065
+       .long   3389820385
+       .long   1016255778
+       .long   2728693978
+       .long   1073652911
+       .long   396109971
+       .long   3164511267
+       .long   764307441
+       .long   1073663816
+       .long   3021057420
+       .long   3164378099
+       .long   3999357479
+       .long   1073674779
+       .long   2258941616
+       .long   1016973300
+       .long   929806999
+       .long   1073685803
+       .long   3205336643
+       .long   1016308133
+       .long   1533953344
+       .long   1073696886
+       .long   769171850
+       .long   1016714209
+       .long   2912730644
+       .long   1073708029
+       .long   3490067721
+       .long   3164453650
+       .long   2174652632
+       .long   1073719233
+       .long   4087714590
+       .long   1015498835
+       .long   730821105
+       .long   1073730498
+       .long   2523232743
+       .long   1013115764
+       .long   2523158504
+       .long   1048167334
+       .long   1181303047
+       .long   3218484803
+       .long   1656151777
+       .long   1069842388
+       .long   714085080
+       .long   3216330823
+       .long   4277811695
+       .long   1072049730
+       .long   4286760335
+       .long   1070514109
+       .long   3607404736
+       .long   1068264200
+       .long   1874480759
+       .long   1065595563
+       .long   3884607281
+       .long   1062590591
+       .long   0
+       .long   2145386496
+       .long   0
+       .long   1048576
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   1120403456
+       .long   1073741824
+       .long   1073157447
+       .long   33554432
+       .long   1101004800
+       .long   0
+       .long   1282408448
+       .long   0
+       .long   862978048
+       .type   __dpow_la_CoutTab,@object
+       .size   __dpow_la_CoutTab,6880
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_pow_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_pow_s_la.s
new file mode 100644 (file)
index 0000000..cc303bd
--- /dev/null
@@ -0,0 +1,2014 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *  *   Typical computation sequences for log2() and exp2(),
+ *  *     with smaller tables (32- and 16-element tables)
+ *  *    The log2() part uses VGETEXP/VGETMANT (which treat denormals correctly),
+ *  *         similar to DP ln() algorithm
+ *  *    Branches are not needed for overflow/underflow:
+ *  *     - RZ mode used to prevent overflow to +/-Inf in intermediate computations
+ *  *     - final VSCALEF properly handles overflow and underflow cases
+ *  *    Callout is still used for Inf/NaNs or x<=0
+ *  *
+ *  
+ */
+
+
+       .text
+.L_2__routine_start___svml_powf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_powf16
+
+__svml_powf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $256, %rsp
+
+/* GetMant(x), normalized to [0.5,1) for x>=0, NaN for x<0 */
+        vgetmantps $10, {sae}, %zmm0, %zmm4
+        vmovups   384+__svml_spow_data_internal_avx512(%rip), %zmm9
+        vmovups   448+__svml_spow_data_internal_avx512(%rip), %zmm11
+        vmovups   512+__svml_spow_data_internal_avx512(%rip), %zmm12
+        vmovups   320+__svml_spow_data_internal_avx512(%rip), %zmm8
+        vmovups   576+__svml_spow_data_internal_avx512(%rip), %zmm15
+
+/* GetExp(x) */
+        vgetexpps {sae}, %zmm0, %zmm14
+
+/* Table lookup */
+        vmovups   __svml_spow_data_internal_avx512(%rip), %zmm13
+        vmovups   128+__svml_spow_data_internal_avx512(%rip), %zmm3
+
+/* SglRcp ~ 1/Mantissa */
+        vrcp14ps  %zmm4, %zmm6
+
+/* x<=0 or Inf/NaN? */
+        vfpclassps $223, %zmm0, %k0
+
+/* round SglRcp to 5 fractional bits (RN mode, no Precision exception) */
+        vrndscaleps $88, {sae}, %zmm6, %zmm7
+        vmovups   704+__svml_spow_data_internal_avx512(%rip), %zmm6
+        kmovw     %k0, %edx
+
+/* Reduced argument: R = (SglRcp*Mantissa - 1) */
+        vfmsub213ps {rn-sae}, %zmm9, %zmm7, %zmm4
+
+/* Prepare exponent correction: SglRcp<1.5? */
+        vcmpps    $17, {sae}, %zmm8, %zmm7, %k1
+
+/* start polynomial evaluation */
+        vfmadd231ps {rn-sae}, %zmm4, %zmm11, %zmm12
+
+/* Prepare table index */
+        vpsrld    $18, %zmm7, %zmm10
+        vmovups   768+__svml_spow_data_internal_avx512(%rip), %zmm7
+        vfmadd231ps {rn-sae}, %zmm4, %zmm12, %zmm15
+
+/* add 1 to Expon if SglRcp<1.5 */
+        vaddps    {rn-sae}, %zmm9, %zmm14, %zmm14{%k1}
+        vpermt2ps 64+__svml_spow_data_internal_avx512(%rip), %zmm10, %zmm13
+        vpermt2ps 192+__svml_spow_data_internal_avx512(%rip), %zmm10, %zmm3
+
+/* Th+Expon */
+        vaddps    {rn-sae}, %zmm14, %zmm13, %zmm2
+        vmovaps   %zmm1, %zmm5
+        vmovups   640+__svml_spow_data_internal_avx512(%rip), %zmm1
+
+/* y Inf/NaN? */
+        vfpclassps $153, %zmm5, %k2
+        vfmadd231ps {rn-sae}, %zmm4, %zmm15, %zmm1
+        kmovw     %k2, %eax
+
+/* Poly_low */
+        vfmadd231ps {rn-sae}, %zmm4, %zmm1, %zmm6
+
+/* Th+Expon+R*c1h */
+        vmovaps   %zmm2, %zmm9
+        orl       %eax, %edx
+        vfmadd231ps {rn-sae}, %zmm4, %zmm7, %zmm9
+
+/* Tl + R*Poly_low */
+        vfmadd231ps {rn-sae}, %zmm4, %zmm6, %zmm3
+        vmovups   960+__svml_spow_data_internal_avx512(%rip), %zmm6
+
+/* (R*c1h)_high */
+        vsubps    {rn-sae}, %zmm2, %zmm9, %zmm8
+
+/* High1 + Tl */
+        vaddps    {rn-sae}, %zmm3, %zmm9, %zmm11
+
+/* (R*c1h)_low */
+        vfmsub213ps {rn-sae}, %zmm8, %zmm7, %zmm4
+        vmovups   1088+__svml_spow_data_internal_avx512(%rip), %zmm7
+
+/* y*High */
+        vmulps    {rz-sae}, %zmm5, %zmm11, %zmm12
+
+/* Tlh */
+        vsubps    {rn-sae}, %zmm9, %zmm11, %zmm10
+
+/* (y*High)_low */
+        vfmsub213ps {rz-sae}, %zmm12, %zmm5, %zmm11
+
+/* Tll */
+        vsubps    {rn-sae}, %zmm10, %zmm3, %zmm3
+
+/* Tll + (R*c1h)_low */
+        vaddps    {rn-sae}, %zmm4, %zmm3, %zmm13
+        vmovups   832+__svml_spow_data_internal_avx512(%rip), %zmm4
+
+/* Zl = y*Tll + Zl */
+        vfmadd213ps {rz-sae}, %zmm11, %zmm5, %zmm13
+
+/*
+ * scaled result
+ * Filter very large |y*log2(x)| and scale final result for LRB2
+ */
+        vmovups   1408+__svml_spow_data_internal_avx512(%rip), %zmm11
+        vaddps    {rz-sae}, %zmm13, %zmm12, %zmm2
+        vsubps    {rn-sae}, %zmm12, %zmm2, %zmm14
+        vaddps    {rd-sae}, %zmm4, %zmm2, %zmm1
+
+/*
+ * /
+ * exp2 computation starts here
+ */
+        vreduceps $65, {sae}, %zmm2, %zmm15
+        vmovups   1024+__svml_spow_data_internal_avx512(%rip), %zmm12
+        vsubps    {rn-sae}, %zmm14, %zmm13, %zmm3
+
+/* Table lookup: The, Tle/The */
+        vpermps   256+__svml_spow_data_internal_avx512(%rip), %zmm1, %zmm10
+        vandps    1344+__svml_spow_data_internal_avx512(%rip), %zmm2, %zmm2
+        vaddps    {rn-sae}, %zmm3, %zmm15, %zmm4
+        vpslld    $19, %zmm1, %zmm1
+        vcmpps    $22, {sae}, %zmm11, %zmm2, %k3
+
+/* ensure |R|<2 even for special cases */
+        vandps    896+__svml_spow_data_internal_avx512(%rip), %zmm4, %zmm8
+        vandps    1472+__svml_spow_data_internal_avx512(%rip), %zmm1, %zmm13
+        kmovw     %k3, %ecx
+
+/* R*The */
+        vmulps    {rn-sae}, %zmm8, %zmm10, %zmm9
+
+/* polynomial */
+        vfmadd231ps {rn-sae}, %zmm8, %zmm6, %zmm12
+        vfmadd213ps {rn-sae}, %zmm7, %zmm8, %zmm12
+        orl       %ecx, %edx
+
+/* The + The*R*poly */
+        vfmadd213ps {rn-sae}, %zmm10, %zmm9, %zmm12
+        vmulps    {rn-sae}, %zmm13, %zmm12, %zmm1
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        vmovaps   %zmm1, %zmm0
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm0, 64(%rsp)
+        vmovups   %zmm5, 128(%rsp)
+        vmovups   %zmm1, 192(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x28, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x38, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x18, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x08, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   192(%rsp), %zmm1
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x28, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x38, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x18, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x08, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+        lea       192(%rsp,%r12,4), %rdx
+
+        call      __svml_spow_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_powf16,@function
+       .size   __svml_powf16,.-__svml_powf16
+..LN__svml_powf16.0:
+
+.L_2__routine_start___spow_la_TestIntFunc_1:
+
+       .align    16,0x90
+
+__spow_la_TestIntFunc:
+
+
+       .cfi_startproc
+..L53:
+
+        movd      %xmm0, %edx
+        andl      $2147483647, %edx
+        lea       -1065353216(%rdx), %eax
+        cmpl      $1073741824, %eax
+        jae       .LBL_2_5
+
+
+        cmpl      $1266679808, %edx
+        jge       .LBL_2_7
+
+
+        movl      %edx, %ecx
+        andl      $-8388608, %ecx
+        addl      $8388608, %ecx
+        shrl      $23, %ecx
+        shll      %cl, %edx
+        testl     $8388607, %edx
+        jne       .LBL_2_5
+
+
+        andl      $16777215, %edx
+        xorl      %eax, %eax
+        cmpl      $8388608, %edx
+        setne     %al
+        incl      %eax
+        ret
+
+.LBL_2_5:
+
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_7:
+
+        movl      $2, %eax
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __spow_la_TestIntFunc,@function
+       .size   __spow_la_TestIntFunc,.-__spow_la_TestIntFunc
+..LN__spow_la_TestIntFunc.1:
+
+.L_2__routine_start___svml_spow_cout_rare_internal_2:
+
+       .align    16,0x90
+
+__svml_spow_cout_rare_internal:
+
+
+       .cfi_startproc
+..L56:
+
+        pushq     %r12
+       .cfi_def_cfa_offset 16
+       .cfi_offset 12, -16
+        pushq     %r13
+       .cfi_def_cfa_offset 24
+       .cfi_offset 13, -24
+        pushq     %r14
+       .cfi_def_cfa_offset 32
+       .cfi_offset 14, -32
+        pushq     %r15
+       .cfi_def_cfa_offset 40
+       .cfi_offset 15, -40
+        pushq     %rbx
+       .cfi_def_cfa_offset 48
+       .cfi_offset 3, -48
+        pushq     %rbp
+       .cfi_def_cfa_offset 56
+       .cfi_offset 6, -56
+        subq      $88, %rsp
+       .cfi_def_cfa_offset 144
+        movq      %rdx, %r15
+        movss     (%rdi), %xmm4
+        pxor      %xmm1, %xmm1
+        movss     (%rsi), %xmm3
+        movaps    %xmm4, %xmm2
+        movl      $0, 64(%rsp)
+        movaps    %xmm3, %xmm0
+        ucomiss   %xmm1, %xmm4
+        jp        .LBL_3_2
+        je        .LBL_3_3
+
+.LBL_3_2:
+
+        movss     %xmm4, 8(%rsp)
+        jmp       .LBL_3_4
+
+.LBL_3_3:
+
+        movaps    %xmm4, %xmm2
+        addss     %xmm4, %xmm2
+        movss     %xmm2, 8(%rsp)
+
+.LBL_3_4:
+
+        pxor      %xmm1, %xmm1
+        ucomiss   %xmm1, %xmm3
+        jp        .LBL_3_5
+        je        .LBL_3_6
+
+.LBL_3_5:
+
+        movss     %xmm3, 28(%rsp)
+        jmp       .LBL_3_7
+
+.LBL_3_6:
+
+        movaps    %xmm3, %xmm0
+        addss     %xmm3, %xmm0
+        movss     %xmm0, 28(%rsp)
+
+.LBL_3_7:
+
+        movb      31(%rsp), %al
+        xorl      %ebx, %ebx
+        andb      $-128, %al
+        xorl      %ebp, %ebp
+        shrb      $7, %al
+        testl     $8388607, 8(%rsp)
+        movzwl    30(%rsp), %r13d
+        sete      %bl
+        andl      $32640, %r13d
+        testl     $8388607, 28(%rsp)
+        movzwl    10(%rsp), %r14d
+        movzbl    11(%rsp), %r12d
+        sete      %bpl
+        andl      $32640, %r14d
+        andl      $128, %r12d
+        shrl      $7, %r13d
+        shrl      $7, %r14d
+        shrl      $7, %r12d
+        movb      %al, 72(%rsp)
+        cmpl      $255, %r13d
+        je        .LBL_3_59
+
+
+        movl      $1, 8(%rsp)
+        movss     %xmm2, 32(%rsp)
+        movss     %xmm0, 40(%rsp)
+        movss     %xmm3, 48(%rsp)
+        movss     %xmm4, 56(%rsp)
+
+        call      __spow_la_TestIntFunc
+
+
+        movss     56(%rsp), %xmm4
+        movl      %eax, %edx
+        movss     48(%rsp), %xmm3
+        movss     40(%rsp), %xmm0
+        movss     32(%rsp), %xmm2
+        testl     %r12d, %r12d
+        jne       .LBL_3_10
+
+
+        cmpl      $127, %r14d
+        je        .LBL_3_56
+
+.LBL_3_10:
+
+        testl     %r13d, %r13d
+        jne       .LBL_3_12
+
+.LBL_3_11:
+
+        testl     %ebp, %ebp
+        jne       .LBL_3_38
+
+.LBL_3_12:
+
+        cmpl      $255, %r14d
+        je        .LBL_3_14
+
+.LBL_3_13:
+
+        movl      $1, %eax
+        jmp       .LBL_3_15
+
+.LBL_3_14:
+
+        xorl      %eax, %eax
+
+.LBL_3_15:
+
+        orl       %eax, %ebx
+        je        .LBL_3_37
+
+
+        orl       8(%rsp), %ebp
+        je        .LBL_3_37
+
+
+        pxor      %xmm1, %xmm1
+        ucomiss   %xmm1, %xmm2
+        jp        .LBL_3_18
+        je        .LBL_3_53
+
+.LBL_3_18:
+
+        ucomiss   .L_2il0floatpacket.121(%rip), %xmm2
+        jp        .LBL_3_19
+        je        .LBL_3_50
+
+.LBL_3_19:
+
+        testl     %eax, %eax
+        je        .LBL_3_30
+
+
+        cmpl      $0, 8(%rsp)
+        je        .LBL_3_30
+
+
+        pxor      %xmm0, %xmm0
+        comiss    %xmm0, %xmm2
+        ja        .LBL_3_23
+
+
+        testl     %edx, %edx
+        je        .LBL_3_29
+
+.LBL_3_23:
+
+        lea       1484+__spow_la_CoutTab(%rip), %rax
+        andl      %r12d, %edx
+        movss     %xmm2, 12(%rsp)
+        xorl      %ecx, %ecx
+        andb      $127, 15(%rsp)
+        movss     (%rax,%rdx,4), %xmm12
+        testl     %r14d, %r14d
+        jne       .LBL_3_25
+
+
+        movss     12(%rsp), %xmm0
+        movl      $-64, %ecx
+        mulss     .L_2il0floatpacket.122(%rip), %xmm0
+        movss     %xmm0, 12(%rsp)
+        jmp       .LBL_3_26
+
+.LBL_3_25:
+
+        movss     12(%rsp), %xmm0
+
+.LBL_3_26:
+
+        movzwl    14(%rsp), %edi
+        lea       __spow_la_CoutTab(%rip), %rsi
+        andl      $32640, %edi
+        pxor      %xmm1, %xmm1
+        shrl      $7, %edi
+        movl      12(%rsp), %edx
+        shll      $23, %edi
+        andl      $8388607, %edx
+        movss     %xmm0, 16(%rsp)
+        orl       %edx, %edi
+        movzwl    18(%rsp), %eax
+        addl      $-1060634624, %edi
+        andl      $-32641, %eax
+        addl      $16256, %eax
+        movw      %ax, 18(%rsp)
+        sarl      $23, %edi
+        addl      %ecx, %edi
+        movl      16(%rsp), %ecx
+        andl      $7864320, %ecx
+        addl      $524288, %ecx
+        cvtsi2ss  %edi, %xmm1
+        shrl      $20, %ecx
+        movss     (%rsi,%rcx,4), %xmm4
+        addl      %ecx, %ecx
+        movss     36(%rsi,%rcx,4), %xmm13
+        movaps    %xmm13, %xmm7
+        movss     16(%rsp), %xmm0
+        addss     %xmm1, %xmm7
+        movaps    %xmm0, %xmm6
+        mulss     %xmm4, %xmm6
+        movss     %xmm7, 20(%rsp)
+        movss     20(%rsp), %xmm3
+        movd      %xmm6, %ebx
+        subss     %xmm3, %xmm1
+        andl      $1966080, %ebx
+        addss     %xmm1, %xmm13
+        addl      $131072, %ebx
+        shrl      $18, %ebx
+        movss     108(%rsi,%rbx,4), %xmm11
+        addl      %ebx, %ebx
+        movss     144(%rsi,%rbx,4), %xmm5
+        movss     %xmm13, 24(%rsp)
+        movaps    %xmm5, %xmm14
+        movss     20(%rsp), %xmm1
+        addss     %xmm1, %xmm14
+        mulss     %xmm11, %xmm6
+        mulss     %xmm11, %xmm4
+        movd      %xmm6, %ebp
+        movss     24(%rsp), %xmm7
+        movss     %xmm14, 20(%rsp)
+        movss     20(%rsp), %xmm3
+        andl      $507904, %ebp
+        addl      $16384, %ebp
+        subss     %xmm3, %xmm1
+        shrl      $15, %ebp
+        addss     %xmm1, %xmm5
+        movss     216(%rsi,%rbp,4), %xmm15
+        addl      %ebp, %ebp
+        movss     284(%rsi,%rbp,4), %xmm2
+        movss     %xmm5, 24(%rsp)
+        movaps    %xmm2, %xmm13
+        movss     20(%rsp), %xmm1
+        movss     24(%rsp), %xmm5
+        addss     %xmm1, %xmm13
+        mulss     %xmm15, %xmm4
+        movss     %xmm13, 20(%rsp)
+        movss     20(%rsp), %xmm3
+        movss     .L_2il0floatpacket.124(%rip), %xmm11
+        subss     %xmm3, %xmm1
+        addss     %xmm1, %xmm2
+        mulss     %xmm15, %xmm6
+        movaps    %xmm11, %xmm15
+        movaps    %xmm6, %xmm3
+        mulss     %xmm0, %xmm15
+        subss     .L_2il0floatpacket.123(%rip), %xmm3
+        movss     %xmm2, 24(%rsp)
+        movss     20(%rsp), %xmm1
+        movss     24(%rsp), %xmm2
+        movss     %xmm15, 20(%rsp)
+        movss     20(%rsp), %xmm13
+        movss     40(%rsi,%rcx,4), %xmm9
+        movss     148(%rsi,%rbx,4), %xmm8
+        movss     288(%rsi,%rbp,4), %xmm10
+        subss     16(%rsp), %xmm13
+        movss     %xmm13, 24(%rsp)
+        movss     20(%rsp), %xmm13
+        movss     24(%rsp), %xmm14
+        subss     %xmm14, %xmm13
+        movss     %xmm13, 20(%rsp)
+        movss     20(%rsp), %xmm15
+        subss     %xmm15, %xmm0
+        movss     %xmm0, 24(%rsp)
+        movaps    %xmm4, %xmm0
+        mulss     %xmm11, %xmm0
+        movss     20(%rsp), %xmm13
+        movss     24(%rsp), %xmm14
+        movss     %xmm0, 20(%rsp)
+        movss     20(%rsp), %xmm15
+        subss     %xmm4, %xmm15
+        movss     %xmm15, 24(%rsp)
+        movss     20(%rsp), %xmm15
+        movss     24(%rsp), %xmm0
+        subss     %xmm0, %xmm15
+        movss     %xmm15, 20(%rsp)
+        movss     20(%rsp), %xmm0
+        subss     %xmm0, %xmm4
+        movaps    %xmm13, %xmm0
+        movss     %xmm4, 24(%rsp)
+        movss     20(%rsp), %xmm4
+        mulss     %xmm4, %xmm0
+        mulss     %xmm14, %xmm4
+        subss     %xmm6, %xmm0
+        movaps    %xmm3, %xmm6
+        addss     %xmm4, %xmm0
+        addss     %xmm1, %xmm6
+        movss     24(%rsp), %xmm15
+        movss     %xmm6, 20(%rsp)
+        movss     20(%rsp), %xmm4
+        mulss     %xmm15, %xmm13
+        subss     %xmm4, %xmm1
+        mulss     %xmm15, %xmm14
+        addss     %xmm13, %xmm0
+        addss     %xmm3, %xmm1
+        addss     %xmm14, %xmm0
+        movss     %xmm1, 24(%rsp)
+        movss     20(%rsp), %xmm6
+        movss     %xmm6, 8(%rsp)
+        movzwl    10(%rsp), %eax
+        andl      $32640, %eax
+        shrl      $7, %eax
+        addl      %r13d, %eax
+        movss     24(%rsp), %xmm4
+        cmpl      $265, %eax
+        jge       .LBL_3_49
+
+
+        cmpl      $192, %eax
+        jg        .LBL_3_40
+
+
+        movl      $1065353216, 20(%rsp)
+        movss     20(%rsp), %xmm0
+        addss     .L_2il0floatpacket.133(%rip), %xmm0
+        movss     %xmm0, 20(%rsp)
+        movss     20(%rsp), %xmm1
+        mulss     %xmm12, %xmm1
+        movss     %xmm1, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_29:
+
+        movl      $1, 64(%rsp)
+        pxor      %xmm0, %xmm0
+        movss     %xmm0, 20(%rsp)
+        movss     20(%rsp), %xmm2
+        movss     20(%rsp), %xmm1
+        divss     %xmm1, %xmm2
+        movss     %xmm2, 20(%rsp)
+        movl      20(%rsp), %eax
+        movl      %eax, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_30:
+
+        cmpl      $127, %r14d
+        jge       .LBL_3_34
+
+
+        movb      72(%rsp), %al
+        testb     %al, %al
+        je        .LBL_3_33
+
+
+        mulss     %xmm0, %xmm0
+        movss     %xmm0, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_33:
+
+        pxor      %xmm0, %xmm0
+        movss     %xmm0, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_34:
+
+        movb      72(%rsp), %al
+        testb     %al, %al
+        je        .LBL_3_36
+
+
+        lea       1512+__spow_la_CoutTab(%rip), %rax
+        andl      %r12d, %edx
+        movl      (%rax,%rdx,4), %ecx
+        movl      %ecx, 12(%rsp)
+        movl      %ecx, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_36:
+
+        mulss     %xmm2, %xmm2
+        lea       1484+__spow_la_CoutTab(%rip), %rax
+        mulss     %xmm0, %xmm2
+        andl      %r12d, %edx
+        mulss     (%rax,%rdx,4), %xmm2
+        movss     %xmm2, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_37:
+
+        addss     %xmm3, %xmm4
+        movss     %xmm4, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_38:
+
+        addss     %xmm0, %xmm2
+        movss     %xmm2, 20(%rsp)
+        movl      $1065353216, 24(%rsp)
+        movb      23(%rsp), %al
+        movb      27(%rsp), %dl
+        andb      $-128, %al
+        andb      $127, %dl
+        orb       %al, %dl
+        movb      %dl, 27(%rsp)
+        movss     24(%rsp), %xmm1
+        movss     24(%rsp), %xmm0
+        mulss     %xmm0, %xmm1
+        movss     %xmm1, (%r15)
+
+.LBL_3_39:
+
+        movl      64(%rsp), %eax
+        addq      $88, %rsp
+       .cfi_def_cfa_offset 56
+       .cfi_restore 6
+        popq      %rbp
+       .cfi_def_cfa_offset 48
+       .cfi_restore 3
+        popq      %rbx
+       .cfi_def_cfa_offset 40
+       .cfi_restore 15
+        popq      %r15
+       .cfi_def_cfa_offset 32
+       .cfi_restore 14
+        popq      %r14
+       .cfi_def_cfa_offset 24
+       .cfi_restore 13
+        popq      %r13
+       .cfi_def_cfa_offset 16
+       .cfi_restore 12
+        popq      %r12
+       .cfi_def_cfa_offset 8
+        ret
+       .cfi_def_cfa_offset 144
+       .cfi_offset 3, -48
+       .cfi_offset 6, -56
+       .cfi_offset 12, -16
+       .cfi_offset 13, -24
+       .cfi_offset 14, -32
+       .cfi_offset 15, -40
+
+.LBL_3_40:
+
+        movss     .L_2il0floatpacket.128(%rip), %xmm1
+        lea       424+__spow_la_CoutTab(%rip), %rdx
+        addss     %xmm0, %xmm3
+        addss     %xmm5, %xmm7
+        addss     %xmm4, %xmm0
+        mulss     %xmm3, %xmm1
+        addss     %xmm7, %xmm2
+        addss     .L_2il0floatpacket.127(%rip), %xmm1
+        addss     %xmm2, %xmm9
+        mulss     %xmm3, %xmm1
+        addss     %xmm9, %xmm8
+        addss     .L_2il0floatpacket.126(%rip), %xmm1
+        addss     %xmm8, %xmm10
+        mulss     %xmm3, %xmm1
+        addss     %xmm0, %xmm10
+        addss     .L_2il0floatpacket.125(%rip), %xmm1
+        mulss     %xmm3, %xmm1
+        movaps    %xmm10, %xmm5
+        movss     8(%rsp), %xmm4
+        movaps    %xmm11, %xmm8
+        addss     %xmm1, %xmm6
+        lea       20(%rsp), %rax
+        movss     %xmm6, (%rax)
+        movss     (%rax), %xmm0
+        subss     %xmm0, %xmm4
+        movaps    %xmm11, %xmm0
+        addss     %xmm1, %xmm4
+        lea       24(%rsp), %rcx
+        movss     %xmm4, (%rcx)
+        movss     (%rax), %xmm7
+        movss     (%rcx), %xmm3
+        addss     %xmm7, %xmm5
+        movss     %xmm5, (%rax)
+        movss     (%rax), %xmm6
+        subss     %xmm6, %xmm7
+        addss     %xmm10, %xmm7
+        movss     %xmm7, (%rcx)
+        movss     (%rax), %xmm10
+        mulss     %xmm10, %xmm8
+        movss     (%rcx), %xmm2
+        movss     %xmm8, (%rax)
+        addss     %xmm3, %xmm2
+        movss     (%rax), %xmm9
+        lea       28(%rsp), %rbx
+        movss     (%rbx), %xmm7
+        subss     %xmm10, %xmm9
+        mulss     %xmm7, %xmm0
+        mulss     (%rbx), %xmm2
+        movss     %xmm9, (%rcx)
+        movss     (%rax), %xmm14
+        movss     (%rcx), %xmm13
+        movss     .L_2il0floatpacket.129(%rip), %xmm9
+        subss     %xmm13, %xmm14
+        movss     %xmm14, (%rax)
+        movss     (%rax), %xmm15
+        subss     %xmm15, %xmm10
+        movss     %xmm10, (%rcx)
+        movss     (%rax), %xmm8
+        movss     (%rcx), %xmm10
+        movss     %xmm0, (%rax)
+        movss     (%rax), %xmm1
+        subss     (%rbx), %xmm1
+        movss     %xmm1, (%rcx)
+        movss     (%rax), %xmm5
+        movss     (%rcx), %xmm4
+        subss     %xmm4, %xmm5
+        movss     %xmm5, (%rax)
+        movss     (%rax), %xmm6
+        subss     %xmm6, %xmm7
+        movss     %xmm7, (%rcx)
+        movss     (%rax), %xmm1
+        movss     (%rcx), %xmm15
+        movaps    %xmm1, %xmm0
+        mulss     %xmm8, %xmm0
+        mulss     %xmm10, %xmm1
+        mulss     %xmm15, %xmm8
+        mulss     %xmm15, %xmm10
+        addss     %xmm8, %xmm1
+        movaps    %xmm0, %xmm8
+        addss     %xmm1, %xmm8
+        movaps    %xmm8, %xmm3
+        subss     %xmm8, %xmm0
+        addss     %xmm9, %xmm3
+        addss     %xmm0, %xmm1
+        movss     %xmm3, (%rax)
+        movaps    %xmm8, %xmm3
+        movss     (%rax), %xmm13
+        addss     %xmm1, %xmm10
+        subss     %xmm9, %xmm13
+        addss     %xmm2, %xmm10
+        movss     %xmm13, (%rsp)
+        movss     (%rsp), %xmm14
+        movss     .L_2il0floatpacket.132(%rip), %xmm2
+        subss     %xmm14, %xmm3
+        movss     %xmm3, 4(%rsp)
+        movss     4(%rsp), %xmm4
+        movl      (%rax), %eax
+        movl      %eax, %ebx
+        andl      $127, %eax
+        addss     %xmm10, %xmm4
+        mulss     %xmm4, %xmm2
+        addl      %eax, %eax
+        movss     -4(%rdx,%rax,4), %xmm1
+        shll      $10, %ebx
+        addss     .L_2il0floatpacket.131(%rip), %xmm2
+        mulss     %xmm4, %xmm2
+        sarl      $17, %ebx
+        addss     .L_2il0floatpacket.130(%rip), %xmm2
+        mulss     %xmm4, %xmm2
+        mulss     %xmm1, %xmm2
+        addss     (%rdx,%rax,4), %xmm2
+        movaps    %xmm2, %xmm5
+        addss     %xmm1, %xmm5
+        movss     %xmm5, 12(%rsp)
+        movzwl    14(%rsp), %edx
+        movl      %edx, %ecx
+        andl      $32640, %ecx
+        shrl      $7, %ecx
+        lea       -127(%rbx,%rcx), %eax
+        cmpl      $128, %eax
+        jge       .LBL_3_48
+
+
+        cmpl      $-126, %eax
+        jl        .LBL_3_43
+
+
+        andl      $-32641, %edx
+        lea       127(%rax), %eax
+        movzbl    %al, %eax
+        shll      $7, %eax
+        orl       %eax, %edx
+        movw      %dx, 14(%rsp)
+        movss     12(%rsp), %xmm0
+        mulss     %xmm12, %xmm0
+        movss     %xmm0, 12(%rsp)
+        movss     %xmm0, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_43:
+
+        cmpl      $-136, %eax
+        jl        .LBL_3_45
+
+
+        lea       20(%rsp), %rdx
+        movss     %xmm5, (%rdx)
+        movl      $1065353216, %eax
+        movss     (%rdx), %xmm0
+        addl      $191, %ebx
+        movl      %eax, 8(%rsp)
+        subss     %xmm0, %xmm1
+        shrl      $16, %eax
+        addss     %xmm1, %xmm2
+        movss     %xmm2, 24(%rsp)
+        movss     (%rdx), %xmm5
+        mulss     %xmm5, %xmm11
+        movss     24(%rsp), %xmm6
+        movss     %xmm11, (%rdx)
+        movss     (%rdx), %xmm1
+        movzwl    %ax, %edx
+        subss     %xmm5, %xmm1
+        lea       24(%rsp), %rax
+        movss     %xmm1, (%rax)
+        andl      $-32641, %edx
+        lea       20(%rsp), %rcx
+        movss     (%rcx), %xmm3
+        movss     (%rax), %xmm2
+        movzbl    %bl, %ebx
+        subss     %xmm2, %xmm3
+        movss     %xmm3, (%rcx)
+        movss     (%rcx), %xmm4
+        shll      $7, %ebx
+        subss     %xmm4, %xmm5
+        movss     %xmm5, (%rax)
+        orl       %ebx, %edx
+        movss     (%rcx), %xmm8
+        movss     (%rax), %xmm14
+        movw      %dx, 10(%rsp)
+        addss     %xmm6, %xmm14
+        movss     8(%rsp), %xmm7
+        mulss     %xmm7, %xmm14
+        mulss     %xmm7, %xmm8
+        lea       20(%rsp), %rdx
+        movl      $8388608, (%rdx)
+        addss     %xmm8, %xmm14
+        movss     (%rdx), %xmm10
+        movss     (%rdx), %xmm9
+        mulss     %xmm9, %xmm10
+        mulss     .L_2il0floatpacket.135(%rip), %xmm14
+        movss     %xmm10, (%rdx)
+        movss     (%rdx), %xmm13
+        addss     %xmm13, %xmm14
+        mulss     %xmm14, %xmm12
+        movss     %xmm14, 12(%rsp)
+        movss     %xmm12, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_45:
+
+        cmpl      $-159, %eax
+        jl        .LBL_3_47
+
+
+        movl      $1065353216, %eax
+        addl      $191, %ebx
+        movl      %eax, 8(%rsp)
+        shrl      $16, %eax
+        movzwl    %ax, %edx
+        movzbl    %bl, %ebx
+        andl      $-32641, %edx
+        shll      $7, %ebx
+        orl       %ebx, %edx
+        movw      %dx, 10(%rsp)
+        movss     8(%rsp), %xmm0
+        movss     .L_2il0floatpacket.135(%rip), %xmm1
+        mulss     %xmm0, %xmm5
+        mulss     %xmm1, %xmm12
+        lea       20(%rsp), %rdx
+        movl      $8388608, (%rdx)
+        movss     (%rdx), %xmm3
+        movss     (%rdx), %xmm2
+        mulss     %xmm2, %xmm3
+        mulss     %xmm12, %xmm5
+        movss     %xmm3, (%rdx)
+        movss     (%rdx), %xmm4
+        subss     %xmm4, %xmm5
+        movss     %xmm5, 12(%rsp)
+        movss     %xmm5, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_47:
+
+        lea       20(%rsp), %rax
+        movl      $8388608, (%rax)
+        movss     (%rax), %xmm1
+        movss     (%rax), %xmm0
+        mulss     %xmm0, %xmm1
+        movss     %xmm1, (%rax)
+        movss     (%rax), %xmm2
+        mulss     %xmm2, %xmm12
+        movss     %xmm12, 12(%rsp)
+        movss     %xmm12, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_48:
+
+        lea       20(%rsp), %rax
+        movl      $2130706432, (%rax)
+        movss     (%rax), %xmm1
+        movss     (%rax), %xmm0
+        mulss     %xmm0, %xmm1
+        movss     %xmm1, (%rax)
+        movss     (%rax), %xmm2
+        mulss     %xmm2, %xmm12
+        movss     %xmm12, 12(%rsp)
+        movss     %xmm12, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_49:
+
+        movb      11(%rsp), %al
+        lea       1472+__spow_la_CoutTab(%rip), %rcx
+        andb      $-128, %al
+        movb      72(%rsp), %dl
+        shrb      $7, %al
+        xorb      %al, %dl
+        movzbl    %dl, %ebx
+        movss     (%rcx,%rbx,4), %xmm0
+        mulss     %xmm0, %xmm0
+        mulss     %xmm12, %xmm0
+        movss     %xmm0, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_50:
+
+        testl     %edx, %edx
+        jne       .LBL_3_52
+
+
+        cmpl      $0, 8(%rsp)
+        jne       .LBL_3_19
+
+.LBL_3_52:
+
+        lea       1484+__spow_la_CoutTab(%rip), %rax
+        andl      $1, %edx
+        movl      (%rax,%rdx,4), %ecx
+        movl      %ecx, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_53:
+
+        movb      72(%rsp), %al
+        mulss     %xmm2, %xmm2
+        testb     %al, %al
+        je        .LBL_3_55
+
+
+        lea       1484+__spow_la_CoutTab(%rip), %rax
+        andl      %r12d, %edx
+        movl      $1, 64(%rsp)
+        movss     (%rax,%rdx,4), %xmm0
+        divss     %xmm2, %xmm0
+        movss     %xmm0, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_55:
+
+        lea       1484+__spow_la_CoutTab(%rip), %rax
+        andl      %r12d, %edx
+        movss     (%rax,%rdx,4), %xmm0
+        mulss     %xmm2, %xmm0
+        movss     %xmm0, (%r15)
+        jmp       .LBL_3_39
+
+.LBL_3_56:
+
+        testl     %ebx, %ebx
+        jne       .LBL_3_38
+
+
+        testl     %r13d, %r13d
+        jne       .LBL_3_13
+        jmp       .LBL_3_11
+
+.LBL_3_59:
+
+        movl      $0, 8(%rsp)
+        movss     %xmm2, 32(%rsp)
+        movss     %xmm0, 40(%rsp)
+        movss     %xmm3, 48(%rsp)
+        movss     %xmm4, 56(%rsp)
+
+        call      __spow_la_TestIntFunc
+
+
+        movss     56(%rsp), %xmm4
+        movl      %eax, %edx
+        movss     48(%rsp), %xmm3
+        movss     40(%rsp), %xmm0
+        movss     32(%rsp), %xmm2
+        testl     %r12d, %r12d
+        jne       .LBL_3_12
+
+
+        cmpl      $127, %r14d
+        jne       .LBL_3_12
+
+
+        testl     %ebx, %ebx
+        je        .LBL_3_13
+        jmp       .LBL_3_38
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_spow_cout_rare_internal,@function
+       .size   __svml_spow_cout_rare_internal,.-__svml_spow_cout_rare_internal
+..LN__svml_spow_cout_rare_internal.2:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_spow_data_internal_avx512:
+       .long   0
+       .long   3174420480
+       .long   3182632960
+       .long   3187958784
+       .long   3190685696
+       .long   3193338880
+       .long   3195920384
+       .long   3197247488
+       .long   3198473216
+       .long   3199668736
+       .long   3200835072
+       .long   3201974272
+       .long   3203086848
+       .long   3204174848
+       .long   3204843520
+       .long   3205364224
+       .long   1054113792
+       .long   1053115392
+       .long   1052137472
+       .long   1051179008
+       .long   1050238976
+       .long   1049316864
+       .long   1048248320
+       .long   1046471680
+       .long   1044726784
+       .long   1043013632
+       .long   1041329152
+       .long   1039161344
+       .long   1035907072
+       .long   1032706048
+       .long   1027317760
+       .long   1018830848
+       .long   0
+       .long   3067311503
+       .long   890262383
+       .long   916311190
+       .long   3058814943
+       .long   914835756
+       .long   3056977939
+       .long   3052757441
+       .long   905348701
+       .long   921801496
+       .long   900652061
+       .long   916473404
+       .long   3063873943
+       .long   3048020321
+       .long   3055557319
+       .long   921573027
+       .long   3050426335
+       .long   918574590
+       .long   913737309
+       .long   3045697063
+       .long   3029223305
+       .long   866568163
+       .long   3063765991
+       .long   3057827840
+       .long   910185982
+       .long   3062847489
+       .long   917965485
+       .long   903301016
+       .long   882039287
+       .long   910858241
+       .long   3059117133
+       .long   3029061382
+       .long   1065353216
+       .long   1065724611
+       .long   1066112450
+       .long   1066517459
+       .long   1066940400
+       .long   1067382066
+       .long   1067843287
+       .long   1068324927
+       .long   1068827891
+       .long   1069353124
+       .long   1069901610
+       .long   1070474380
+       .long   1071072509
+       .long   1071697119
+       .long   1072349383
+       .long   1073030525
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   1049872133
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   3199775725
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   1056323663
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   3208161851
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   849703116
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   1228933104
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   3221225471
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1030247627
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1047916908
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   1060205090
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   124
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   60
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   1123745792
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .type   __svml_spow_data_internal_avx512,@object
+       .size   __svml_spow_data_internal_avx512,1536
+       .align 32
+__spow_la_CoutTab:
+       .long   1065353216
+       .long   1063518208
+       .long   1061945344
+       .long   1060765696
+       .long   1059717120
+       .long   1058930688
+       .long   1058144256
+       .long   1057488896
+       .long   1056964608
+       .long   0
+       .long   0
+       .long   1043013120
+       .long   912347133
+       .long   1051178752
+       .long   920491638
+       .long   1055650560
+       .long   910207939
+       .long   3201407744
+       .long   3065009147
+       .long   3197864192
+       .long   3046757530
+       .long   3192020992
+       .long   3064938684
+       .long   3182631936
+       .long   3069048210
+       .long   0
+       .long   0
+       .long   1065353216
+       .long   1064828928
+       .long   1064304640
+       .long   1066008576
+       .long   1065877504
+       .long   1065746432
+       .long   1065615360
+       .long   1065484288
+       .long   1065353216
+       .long   0
+       .long   0
+       .long   1027315712
+       .long   915720665
+       .long   1035907072
+       .long   882039287
+       .long   3185459200
+       .long   3062137179
+       .long   3182631936
+       .long   3069048210
+       .long   3179763712
+       .long   3059908234
+       .long   3174420480
+       .long   3067311503
+       .long   3166121984
+       .long   3066774241
+       .long   0
+       .long   0
+       .long   1069056000
+       .long   1069006848
+       .long   1068957696
+       .long   1068908544
+       .long   1068875776
+       .long   1069318144
+       .long   1069301760
+       .long   1069268992
+       .long   1069252608
+       .long   1069219840
+       .long   1069203456
+       .long   1069170688
+       .long   1069154304
+       .long   1069121536
+       .long   1069105152
+       .long   1069072384
+       .long   1069056000
+       .long   0
+       .long   0
+       .long   1002471424
+       .long   906080490
+       .long   1010884608
+       .long   916991201
+       .long   1016135680
+       .long   905081895
+       .long   1018261504
+       .long   918286540
+       .long   3170725888
+       .long   3067774196
+       .long   3169697792
+       .long   3068476631
+       .long   3167637504
+       .long   3069858259
+       .long   3166609408
+       .long   3020376912
+       .long   3164540928
+       .long   3039629966
+       .long   3163504640
+       .long   3043319364
+       .long   3160350720
+       .long   3046704089
+       .long   3158269952
+       .long   3047249178
+       .long   3154083840
+       .long   3046609959
+       .long   3149905920
+       .long   3045301896
+       .long   3137339392
+       .long   3034784887
+       .long   0
+       .long   0
+       .long   1065353216
+       .long   0
+       .long   1065398766
+       .long   3014665830
+       .long   1065444562
+       .long   2982428624
+       .long   1065490608
+       .long   3015478276
+       .long   1065536902
+       .long   865643564
+       .long   1065583450
+       .long   3014725705
+       .long   1065630248
+       .long   868461790
+       .long   1065677302
+       .long   858550072
+       .long   1065724612
+       .long   3013096376
+       .long   1065772178
+       .long   3013897664
+       .long   1065820002
+       .long   3008545510
+       .long   1065868086
+       .long   3011512679
+       .long   1065916430
+       .long   864064219
+       .long   1065965038
+       .long   819487640
+       .long   1066013910
+       .long   3012212369
+       .long   1066063046
+       .long   856316133
+       .long   1066112450
+       .long   2992679841
+       .long   1066162122
+       .long   3001970243
+       .long   1066212064
+       .long   3013902756
+       .long   1066262276
+       .long   847285146
+       .long   1066312762
+       .long   3010032741
+       .long   1066363522
+       .long   3018332471
+       .long   1066414556
+       .long   856041677
+       .long   1066465868
+       .long   864808677
+       .long   1066517460
+       .long   3012318446
+       .long   1066569330
+       .long   863709796
+       .long   1066621484
+       .long   3016813593
+       .long   1066673920
+       .long   3018872036
+       .long   1066726640
+       .long   3006136850
+       .long   1066779646
+       .long   864474828
+       .long   1066832942
+       .long   3016286184
+       .long   1066886526
+       .long   3015052933
+       .long   1066940400
+       .long   857938801
+       .long   1066994568
+       .long   2993474036
+       .long   1067049030
+       .long   3009003152
+       .long   1067103786
+       .long   872191232
+       .long   1067158842
+       .long   3003929955
+       .long   1067214196
+       .long   3013071165
+       .long   1067269850
+       .long   3006375425
+       .long   1067325806
+       .long   843377209
+       .long   1067382066
+       .long   859906882
+       .long   1067438632
+       .long   848662531
+       .long   1067495506
+       .long   3018868367
+       .long   1067552686
+       .long   868910405
+       .long   1067610180
+       .long   3019699127
+       .long   1067667984
+       .long   3013023741
+       .long   1067726102
+       .long   3005475891
+       .long   1067784536
+       .long   3010626242
+       .long   1067843286
+       .long   866758993
+       .long   1067902356
+       .long   869265128
+       .long   1067961748
+       .long   3004575030
+       .long   1068021462
+       .long   3018425550
+       .long   1068081498
+       .long   867494524
+       .long   1068141862
+       .long   858118433
+       .long   1068202554
+       .long   3004476802
+       .long   1068263574
+       .long   866434624
+       .long   1068324926
+       .long   870990497
+       .long   1068386612
+       .long   858100843
+       .long   1068448632
+       .long   867002634
+       .long   1068510990
+       .long   3000050815
+       .long   1068573686
+       .long   3011271336
+       .long   1068636722
+       .long   3006477262
+       .long   1068700100
+       .long   840255625
+       .long   1068763822
+       .long   866280780
+       .long   1068827892
+       .long   3016492578
+       .long   1068892308
+       .long   3006218836
+       .long   1068957074
+       .long   2993076596
+       .long   1069022192
+       .long   3000356208
+       .long   1069087664
+       .long   3015220484
+       .long   1069153490
+       .long   856315927
+       .long   1069219674
+       .long   867308350
+       .long   1069286218
+       .long   863888852
+       .long   1069353124
+       .long   3007401960
+       .long   1069420392
+       .long   832069785
+       .long   1069488026
+       .long   3004369690
+       .long   1069556026
+       .long   866250961
+       .long   1069624396
+       .long   868902513
+       .long   1069693138
+       .long   851736822
+       .long   1069762252
+       .long   869934231
+       .long   1069831742
+       .long   869028661
+       .long   1069901610
+       .long   839559223
+       .long   1069971856
+       .long   867543588
+       .long   1070042484
+       .long   868789178
+       .long   1070113496
+       .long   859381756
+       .long   1070184894
+       .long   3010667426
+       .long   1070256678
+       .long   859604257
+       .long   1070328852
+       .long   872346226
+       .long   1070401420
+       .long   3010682756
+       .long   1070474380
+       .long   841546788
+       .long   1070547736
+       .long   869210393
+       .long   1070621492
+       .long   2996061011
+       .long   1070695648
+       .long   3013455510
+       .long   1070770206
+       .long   3009158570
+       .long   1070845168
+       .long   865699227
+       .long   1070920538
+       .long   866897902
+       .long   1070996318
+       .long   2955948569
+       .long   1071072508
+       .long   868931229
+       .long   1071149114
+       .long   3014890061
+       .long   1071226134
+       .long   3002473793
+       .long   1071303572
+       .long   861820308
+       .long   1071381432
+       .long   3008383516
+       .long   1071459714
+       .long   3010850715
+       .long   1071538420
+       .long   864181775
+       .long   1071617554
+       .long   870234352
+       .long   1071697118
+       .long   871115413
+       .long   1071777114
+       .long   872414852
+       .long   1071857546
+       .long   3012378998
+       .long   1071938412
+       .long   866137918
+       .long   1072019718
+       .long   870808707
+       .long   1072101466
+       .long   866840096
+       .long   1072183658
+       .long   857766040
+       .long   1072266296
+       .long   855693471
+       .long   1072349382
+       .long   870833444
+       .long   1072432920
+       .long   867585053
+       .long   1072516912
+       .long   846646433
+       .long   1072601360
+       .long   3008357562
+       .long   1072686266
+       .long   3007858250
+       .long   1072771632
+       .long   866626825
+       .long   1072857464
+       .long   3015943680
+       .long   1072943760
+       .long   2995197552
+       .long   1073030526
+       .long   3018513273
+       .long   1073117762
+       .long   3012791488
+       .long   1073205472
+       .long   3012359471
+       .long   1073293658
+       .long   3003728983
+       .long   1073382322
+       .long   870019626
+       .long   1073471470
+       .long   3012762127
+       .long   1073561100
+       .long   835668076
+       .long   1073651218
+       .long   3013837936
+       .long   980050793
+       .long   3199320925
+       .long   1042575209
+       .long   3182108321
+       .long   1060205080
+       .long   1047920112
+       .long   1029920839
+       .long   2130706432
+       .long   8388608
+       .long   0
+       .long   1065353216
+       .long   3212836864
+       .long   1203765248
+       .long   1069056000
+       .long   1166018560
+       .long   1602224128
+       .long   528482304
+       .long   0
+       .long   2147483648
+       .type   __spow_la_CoutTab,@object
+       .size   __spow_la_CoutTab,1520
+       .align 4
+.L_2il0floatpacket.121:
+       .long   0xbf800000
+       .type   .L_2il0floatpacket.121,@object
+       .size   .L_2il0floatpacket.121,4
+       .align 4
+.L_2il0floatpacket.122:
+       .long   0x5f800000
+       .type   .L_2il0floatpacket.122,@object
+       .size   .L_2il0floatpacket.122,4
+       .align 4
+.L_2il0floatpacket.123:
+       .long   0x3fb88000
+       .type   .L_2il0floatpacket.123,@object
+       .size   .L_2il0floatpacket.123,4
+       .align 4
+.L_2il0floatpacket.124:
+       .long   0x45800800
+       .type   .L_2il0floatpacket.124,@object
+       .size   .L_2il0floatpacket.124,4
+       .align 4
+.L_2il0floatpacket.125:
+       .long   0x3a6a6369
+       .type   .L_2il0floatpacket.125,@object
+       .size   .L_2il0floatpacket.125,4
+       .align 4
+.L_2il0floatpacket.126:
+       .long   0xbeb1c35d
+       .type   .L_2il0floatpacket.126,@object
+       .size   .L_2il0floatpacket.126,4
+       .align 4
+.L_2il0floatpacket.127:
+       .long   0x3e246f69
+       .type   .L_2il0floatpacket.127,@object
+       .size   .L_2il0floatpacket.127,4
+       .align 4
+.L_2il0floatpacket.128:
+       .long   0xbdab1ea1
+       .type   .L_2il0floatpacket.128,@object
+       .size   .L_2il0floatpacket.128,4
+       .align 4
+.L_2il0floatpacket.129:
+       .long   0x47c00000
+       .type   .L_2il0floatpacket.129,@object
+       .size   .L_2il0floatpacket.129,4
+       .align 4
+.L_2il0floatpacket.130:
+       .long   0x3f317218
+       .type   .L_2il0floatpacket.130,@object
+       .size   .L_2il0floatpacket.130,4
+       .align 4
+.L_2il0floatpacket.131:
+       .long   0x3e75fdf0
+       .type   .L_2il0floatpacket.131,@object
+       .size   .L_2il0floatpacket.131,4
+       .align 4
+.L_2il0floatpacket.132:
+       .long   0x3d635847
+       .type   .L_2il0floatpacket.132,@object
+       .size   .L_2il0floatpacket.132,4
+       .align 4
+.L_2il0floatpacket.133:
+       .long   0x00800000
+       .type   .L_2il0floatpacket.133,@object
+       .size   .L_2il0floatpacket.133,4
+       .align 4
+.L_2il0floatpacket.134:
+       .long   0x7f000000
+       .type   .L_2il0floatpacket.134,@object
+       .size   .L_2il0floatpacket.134,4
+       .align 4
+.L_2il0floatpacket.135:
+       .long   0x1f800000
+       .type   .L_2il0floatpacket.135,@object
+       .size   .L_2il0floatpacket.135,4
+       .align 4
+.L_2il0floatpacket.136:
+       .long   0x3f800000
+       .type   .L_2il0floatpacket.136,@object
+       .size   .L_2il0floatpacket.136,4
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_sin_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_sin_d_la.s
new file mode 100644 (file)
index 0000000..8641c12
--- /dev/null
@@ -0,0 +1,17546 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *     ( low accuracy ( < 4ulp ) or enhanced performance ( half of correct mantissa ) implementation )
+ * 
+ *     Argument representation:
+ *     arg = N*Pi + R
+ * 
+ *     Result calculation:
+ *     sin(arg) = sin(N*Pi + R) = (-1)^N * sin(R)
+ *     sin(R) is approximated by corresponding polynomial
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_sin8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_sin8
+
+__svml_sin8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        xorl      %edx, %edx
+
+/* start arg. reduction */
+        vmovups   128+__svml_dsin_data_internal(%rip), %zmm3
+        vmovups   192+__svml_dsin_data_internal(%rip), %zmm9
+        vmovups   640+__svml_dsin_data_internal(%rip), %zmm7
+        vmovups   704+__svml_dsin_data_internal(%rip), %zmm5
+        vmovups   1216+__svml_dsin_data_internal(%rip), %zmm8
+        vmovups   1088+__svml_dsin_data_internal(%rip), %zmm10
+        vmovups   1024+__svml_dsin_data_internal(%rip), %zmm11
+        vmovups   768+__svml_dsin_data_internal(%rip), %zmm6
+        vmovups   960+__svml_dsin_data_internal(%rip), %zmm12
+        vmovups   320+__svml_dsin_data_internal(%rip), %zmm4
+        vmovups   896+__svml_dsin_data_internal(%rip), %zmm13
+        vmovups   64+__svml_dsin_data_internal(%rip), %zmm14
+        vmovaps   %zmm0, %zmm2
+        vfmadd213pd {rn-sae}, %zmm9, %zmm2, %zmm3
+        vcmppd    $0, {sae}, %zmm4, %zmm2, %k1
+        vpsllq    $63, %zmm3, %zmm0
+
+/* dN */
+        vsubpd    {rn-sae}, %zmm9, %zmm3, %zmm1
+        vandpd    __svml_dsin_data_internal(%rip), %zmm2, %zmm9
+        vxorpd    %zmm2, %zmm0, %zmm0{%k1}
+        vfnmadd213pd {rn-sae}, %zmm2, %zmm1, %zmm7
+        vmovups   1152+__svml_dsin_data_internal(%rip), %zmm3
+        vcmppd    $22, {sae}, %zmm14, %zmm9, %k1
+        vfnmadd231pd {rn-sae}, %zmm1, %zmm5, %zmm7
+
+/* will branch if long arg. reduction needed */
+        kortestw  %k1, %k1
+        vmulpd    {rn-sae}, %zmm7, %zmm7, %zmm15
+        vfnmadd213pd {rn-sae}, %zmm7, %zmm6, %zmm1
+        vfmadd231pd {rn-sae}, %zmm15, %zmm8, %zmm3
+        vmulpd    {rn-sae}, %zmm1, %zmm15, %zmm8
+        vfmadd213pd {rn-sae}, %zmm10, %zmm15, %zmm3
+        vfmadd213pd {rn-sae}, %zmm11, %zmm15, %zmm3
+        vfmadd213pd {rn-sae}, %zmm12, %zmm15, %zmm3
+        vfmadd213pd {rn-sae}, %zmm13, %zmm15, %zmm3
+
+/* mask will be used to decide whether long arg. reduction is needed */
+        vmovups   832+__svml_dsin_data_internal(%rip), %zmm13
+        vfmadd213pd {rn-sae}, %zmm13, %zmm15, %zmm3
+        vfmadd213pd {rn-sae}, %zmm1, %zmm8, %zmm3
+        vxorpd    %zmm0, %zmm3, %zmm0
+        jne       .LBL_1_12
+
+.LBL_1_2:
+
+        testl     %edx, %edx
+        jne       .LBL_1_4
+
+.LBL_1_3:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_4:
+
+        vmovups   %zmm2, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_3
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_8:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_11
+
+.LBL_1_9:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_8
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_3
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_11:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dsin_cout_rare_internal
+        jmp       .LBL_1_9
+       .cfi_restore 4
+       .cfi_restore 5
+       .cfi_restore 12
+       .cfi_restore 13
+       .cfi_restore 122
+       .cfi_restore 123
+       .cfi_restore 124
+       .cfi_restore 125
+
+.LBL_1_12:
+
+
+/* ............Check for Inf and NaNs................. */
+        vmovups   16512+__svml_dsin_data_internal_ha(%rip), %zmm1
+
+/*
+ * Get the (2^a / 2pi) mod 1 values from the table.
+ * Because VLANG doesn't have L-type gather, we need a trivial cast
+ */
+        lea       __svml_dsin_reduction_data_internal(%rip), %rax
+        vmovups   %zmm2, 64(%rsp)
+        vmovups   %zmm0, (%rsp)
+        vandpd    %zmm9, %zmm1, %zmm6
+        vxorpd    %zmm2, %zmm9, %zmm8
+        vpbroadcastq .L_2il0floatpacket.26(%rip), %zmm11
+        vcmppd    $4, {sae}, %zmm1, %zmm6, %k2
+        vmovups   %zmm8, 128(%rsp)
+        vmovaps   %zmm11, %zmm5
+
+/*
+ * The output is _VRES_Z (high) + _VRES_E (low), and the integer part is _VRES_IND
+ * Now resume the original code.
+ * ..................... Table look-up ........................
+ */
+        lea       __svml_dsin_data_internal_ha(%rip), %rcx
+        vpandq    .L_2il0floatpacket.27(%rip){1to8}, %zmm9, %zmm4
+        vpandnq   %zmm6, %zmm6, %zmm5{%k2}
+        vpsrlq    $52, %zmm4, %zmm3
+        vcmppd    $3, {sae}, %zmm5, %zmm5, %k0
+        vpsllq    $1, %zmm3, %zmm15
+
+/*
+ * Break the P_xxx and m into 32-bit chunks ready for
+ * the long multiplication via 32x32->64 multiplications
+ */
+        vpbroadcastq .L_2il0floatpacket.30(%rip), %zmm6
+        kxnorw    %k0, %k0, %k3
+        kxnorw    %k0, %k0, %k2
+        kmovw     %k0, %edx
+        vpaddq    %zmm3, %zmm15, %zmm2
+        vpsllq    $3, %zmm2, %zmm14
+        vpmovqd   %zmm14, %ymm12
+        vpxord    %zmm1, %zmm1, %zmm1
+        vgatherdpd (%rax,%ymm12), %zmm1{%k3}
+        kxnorw    %k0, %k0, %k3
+        vpsrlq    $32, %zmm1, %zmm7
+        vpxord    %zmm5, %zmm5, %zmm5
+        vpxord    %zmm4, %zmm4, %zmm4
+        vgatherdpd 8(%rax,%ymm12), %zmm5{%k2}
+        vgatherdpd 16(%rax,%ymm12), %zmm4{%k3}
+        vpsrlq    $32, %zmm5, %zmm10
+        vpsrlq    $32, %zmm4, %zmm13
+
+/*
+ * Also get the significand as an integer
+ * NB: adding in the integer bit is wrong for denorms!
+ * To make this work for denorms we should do something slightly different
+ */
+        vpandq    .L_2il0floatpacket.28(%rip){1to8}, %zmm9, %zmm8
+        vpaddq    .L_2il0floatpacket.29(%rip){1to8}, %zmm8, %zmm15
+        vpsrlq    $32, %zmm15, %zmm8
+        vpmullq   %zmm10, %zmm8, %zmm3
+        vpandq    %zmm6, %zmm1, %zmm0
+        vpandq    %zmm6, %zmm5, %zmm12
+        vpandq    %zmm6, %zmm4, %zmm5
+        vpandq    %zmm6, %zmm15, %zmm14
+
+/* Now do the big multiplication and carry propagation */
+        vpmullq   %zmm0, %zmm8, %zmm4
+        vpmullq   %zmm12, %zmm8, %zmm2
+        vpmullq   %zmm13, %zmm8, %zmm1
+        vpmullq   %zmm5, %zmm8, %zmm8
+        vpmullq   %zmm0, %zmm14, %zmm5
+        vpmullq   %zmm12, %zmm14, %zmm0
+        vpmullq   %zmm13, %zmm14, %zmm13
+        vpmullq   %zmm7, %zmm14, %zmm7
+        vpmullq   %zmm10, %zmm14, %zmm10
+        vpsrlq    $32, %zmm13, %zmm14
+        vpsrlq    $32, %zmm0, %zmm13
+        vpsrlq    $32, %zmm5, %zmm12
+        vpsrlq    $32, %zmm10, %zmm15
+        vpaddq    %zmm14, %zmm1, %zmm1
+        vpaddq    %zmm13, %zmm2, %zmm14
+        vpaddq    %zmm12, %zmm4, %zmm2
+        vpaddq    %zmm15, %zmm3, %zmm13
+        vpandq    %zmm6, %zmm7, %zmm7
+        vpaddq    %zmm2, %zmm7, %zmm4
+        vpsrlq    $32, %zmm8, %zmm2
+        vpandq    %zmm6, %zmm0, %zmm0
+        vpaddq    %zmm1, %zmm0, %zmm1
+        vpaddq    %zmm1, %zmm2, %zmm15
+        vpsrlq    $32, %zmm15, %zmm8
+        vpandq    %zmm6, %zmm10, %zmm10
+        vpaddq    %zmm14, %zmm10, %zmm0
+        vpaddq    %zmm0, %zmm8, %zmm12
+
+/*
+ * Now round at the 2^-9 bit position for reduction mod pi/2^8
+ * instead of the original 2pi (but still with the same 2pi scaling).
+ * Use a shifter of 2^43 + 2^42.
+ * The N we get is our final version; it has an offset of
+ * 2^9 because of the implicit integer bit, and anyway for negative
+ * starting value it's a 2s complement thing. But we need to mask
+ * off the exponent part anyway so it's fine.
+ */
+        vpbroadcastq .L_2il0floatpacket.33(%rip), %zmm0
+        vpsrlq    $32, %zmm12, %zmm7
+        vpandq    %zmm6, %zmm5, %zmm3
+        vpaddq    %zmm13, %zmm3, %zmm5
+        vpaddq    %zmm5, %zmm7, %zmm3
+        vpsllq    $32, %zmm12, %zmm7
+        vpsrlq    $32, %zmm3, %zmm10
+        vpaddq    %zmm4, %zmm10, %zmm2
+
+/* Assemble reduced argument from the pieces */
+        vpandq    %zmm6, %zmm15, %zmm13
+        vpandq    %zmm6, %zmm3, %zmm8
+        vpsllq    $32, %zmm2, %zmm6
+        vpaddq    %zmm13, %zmm7, %zmm4
+
+/*
+ * If the magnitude of the input is <= 2^-20, then
+ * just pass through the input, since no reduction will be needed and
+ * the main path will only work accurately if the reduced argument is
+ * about >= 2^-70 (which it is for all large pi multiples)
+ */
+        vpbroadcastq .L_2il0floatpacket.42(%rip), %zmm13
+        vpaddq    %zmm8, %zmm6, %zmm15
+        vpsrlq    $12, %zmm15, %zmm1
+
+/*
+ * We want to incorporate the original sign now too.
+ * Do it here for convenience in getting the right N value,
+ * though we could wait right to the end if we were prepared
+ * to modify the sign of N later too.
+ * So get the appropriate sign mask now (or sooner).
+ */
+        vpandq    .L_2il0floatpacket.31(%rip){1to8}, %zmm9, %zmm3
+
+/*
+ * Create floating-point high part, implicitly adding integer bit 1
+ * Incorporate overall sign at this stage too.
+ */
+        vpxorq    .L_2il0floatpacket.32(%rip){1to8}, %zmm3, %zmm6
+        vporq     %zmm6, %zmm1, %zmm5
+        vaddpd    {rn-sae}, %zmm5, %zmm0, %zmm2
+        vsubpd    {rn-sae}, %zmm0, %zmm2, %zmm10
+        vsubpd    {rn-sae}, %zmm10, %zmm5, %zmm10
+        vpandq    .L_2il0floatpacket.36(%rip){1to8}, %zmm4, %zmm12
+        vpsllq    $28, %zmm12, %zmm14
+        vpsrlq    $24, %zmm4, %zmm4
+        vpandq    .L_2il0floatpacket.38(%rip){1to8}, %zmm15, %zmm15
+
+/*
+ * Create floating-point low and medium parts, respectively
+ * lo_23, ... lo_0, 0, ..., 0
+ * hi_11, ... hi_0, lo_63, ..., lo_24
+ * then subtract off the implicitly added integer bits,
+ * 2^-104 and 2^-52, respectively.
+ * Put the original sign into all of them at this stage.
+ */
+        vpxorq    .L_2il0floatpacket.35(%rip){1to8}, %zmm3, %zmm7
+        vpxorq    .L_2il0floatpacket.37(%rip){1to8}, %zmm3, %zmm1
+        vpsllq    $40, %zmm15, %zmm3
+        vporq     %zmm7, %zmm14, %zmm8
+        vsubpd    {rn-sae}, %zmm7, %zmm8, %zmm5
+        vandpd    .L_2il0floatpacket.41(%rip){1to8}, %zmm9, %zmm14
+        vcmppd    $22, {sae}, %zmm13, %zmm14, %k3
+        vcmppd    $26, {sae}, %zmm13, %zmm14, %k2
+        vporq     %zmm4, %zmm3, %zmm8
+        vporq     %zmm1, %zmm8, %zmm7
+        vsubpd    {rn-sae}, %zmm1, %zmm7, %zmm6
+
+/*
+ * Now multiply those numbers all by 2 pi, reasonably accurately.
+ * (RHi + RLo) * (pi_lead + pi_trail) ~=
+ * RHi * pi_lead + (RHi * pi_trail + RLo * pi_lead)
+ */
+        vpbroadcastq .L_2il0floatpacket.39(%rip), %zmm4
+
+/* Now add them up into 2 reasonably aligned pieces */
+        vaddpd    {rn-sae}, %zmm6, %zmm10, %zmm12
+        vmulpd    {rn-sae}, %zmm4, %zmm12, %zmm15
+        vsubpd    {rn-sae}, %zmm12, %zmm10, %zmm10
+        vmovaps   %zmm4, %zmm3
+        vfmsub213pd {rn-sae}, %zmm15, %zmm12, %zmm3
+        vmovaps   %zmm11, %zmm1
+
+/* Grab our final N value as an integer, appropriately masked mod 2^9 */
+        vpandq    .L_2il0floatpacket.34(%rip){1to8}, %zmm2, %zmm0
+        vaddpd    {rn-sae}, %zmm10, %zmm6, %zmm2
+        vaddpd    {rn-sae}, %zmm5, %zmm2, %zmm6
+        vpbroadcastq .L_2il0floatpacket.40(%rip), %zmm5
+        vfmadd213pd {rn-sae}, %zmm3, %zmm5, %zmm12
+        vfmadd213pd {rn-sae}, %zmm12, %zmm4, %zmm6
+        vmovups   16960+__svml_dsin_data_internal_ha(%rip), %zmm4
+        vpandnq   %zmm14, %zmm14, %zmm11{%k3}
+        vandpd    %zmm9, %zmm11, %zmm9
+        vpsllq    $5, %zmm0, %zmm11
+        kxnorw    %k0, %k0, %k3
+        vpandnq   %zmm14, %zmm14, %zmm1{%k2}
+        vandpd    %zmm15, %zmm1, %zmm8
+        vandpd    %zmm6, %zmm1, %zmm1
+        vpmovqd   %zmm11, %ymm6
+        vorpd     %zmm8, %zmm9, %zmm7
+        vmovups   17216+__svml_dsin_data_internal_ha(%rip), %zmm14
+        vmovups   17088+__svml_dsin_data_internal_ha(%rip), %zmm15
+
+/* ............... Polynomial approximation ................... */
+        vmulpd    {rn-sae}, %zmm7, %zmm7, %zmm9
+        kxnorw    %k0, %k0, %k2
+
+/* ................. Reconstruction: res_hi ................... */
+        vmovaps   %zmm7, %zmm0
+        vmovaps   %zmm7, %zmm8
+        vpxord    %zmm10, %zmm10, %zmm10
+        vgatherdpd (%rcx,%ymm6), %zmm10{%k2}
+        kxnorw    %k0, %k0, %k2
+        vpxord    %zmm12, %zmm12, %zmm12
+        vpxord    %zmm11, %zmm11, %zmm11
+        vgatherdpd 8(%rcx,%ymm6), %zmm12{%k3}
+        vgatherdpd 16(%rcx,%ymm6), %zmm11{%k2}
+        kxnorw    %k0, %k0, %k3
+        vfmadd213pd {rn-sae}, %zmm11, %zmm12, %zmm0
+        vfmadd132pd {rn-sae}, %zmm10, %zmm0, %zmm8
+
+/* ................. Reconstruction: res_lo ................... */
+        vsubpd    {rn-sae}, %zmm0, %zmm11, %zmm3
+        vsubpd    {rn-sae}, %zmm8, %zmm0, %zmm2
+        vmovups   17024+__svml_dsin_data_internal_ha(%rip), %zmm0
+        vfmadd231pd {rn-sae}, %zmm7, %zmm12, %zmm3
+        vfmadd231pd {rn-sae}, %zmm10, %zmm7, %zmm2
+        vfmadd231pd {rn-sae}, %zmm9, %zmm0, %zmm4
+        vaddpd    {rn-sae}, %zmm3, %zmm2, %zmm13
+        vaddpd    {rn-sae}, %zmm12, %zmm10, %zmm2
+        vmulpd    {rn-sae}, %zmm9, %zmm4, %zmm5
+        vmulpd    {rn-sae}, %zmm7, %zmm5, %zmm0
+
+/* ................. Reconstruction: res_lo+corr ................... */
+        vfnmadd213pd {rn-sae}, %zmm2, %zmm11, %zmm7
+        vfmadd213pd {rn-sae}, %zmm13, %zmm2, %zmm0
+        vmovups   17152+__svml_dsin_data_internal_ha(%rip), %zmm13
+        vmovups   64(%rsp), %zmm2
+        vfmadd231pd {rn-sae}, %zmm9, %zmm14, %zmm13
+        vfmadd213pd {rn-sae}, %zmm15, %zmm9, %zmm13
+        vmulpd    {rn-sae}, %zmm9, %zmm13, %zmm3
+        vfmadd213pd {rn-sae}, %zmm0, %zmm11, %zmm3
+        vmovups   (%rsp), %zmm0
+        vpxord    %zmm11, %zmm11, %zmm11
+        vgatherdpd 24(%rcx,%ymm6), %zmm11{%k3}
+        vfmadd213pd {rn-sae}, %zmm11, %zmm7, %zmm1
+        vaddpd    {rn-sae}, %zmm1, %zmm3, %zmm7
+
+/* .................. Final reconstruction ................... */
+        vaddpd    {rn-sae}, %zmm7, %zmm8, %zmm9
+        vxorpd    128(%rsp), %zmm9, %zmm0{%k1}
+        jmp       .LBL_1_2
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_sin8,@function
+       .size   __svml_sin8,.-__svml_sin8
+..LN__svml_sin8.0:
+
+.L_2__routine_start___svml_dsin_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dsin_cout_rare_internal:
+
+
+       .cfi_startproc
+..L67:
+
+        movzwl    6(%rdi), %eax
+        andl      $32752, %eax
+        movsd     (%rdi), %xmm1
+        movb      7(%rdi), %dl
+        andb      $127, %dl
+        movsd     %xmm1, -8(%rsp)
+        cmpl      $32752, %eax
+        jne       .LBL_2_6
+
+
+        cmpl      $0, -8(%rsp)
+        jne       .LBL_2_5
+
+
+        movb      %dl, -1(%rsp)
+        cmpl      $2146435072, -4(%rsp)
+        jne       .LBL_2_5
+
+
+        movsd     __dsin_la_CoutTab(%rip), %xmm0
+        movl      $1, %eax
+        mulsd     %xmm0, %xmm1
+        movsd     %xmm1, (%rsi)
+        ret
+
+.LBL_2_5:
+
+        mulsd     %xmm1, %xmm1
+        xorl      %eax, %eax
+        movsd     %xmm1, (%rsi)
+        ret
+
+.LBL_2_6:
+
+        xorl      %eax, %eax
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dsin_cout_rare_internal,@function
+       .size   __svml_dsin_cout_rare_internal,.-__svml_dsin_cout_rare_internal
+..LN__svml_dsin_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dsin_data_internal:
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   0
+       .long   1097859072
+       .long   0
+       .long   1097859072
+       .long   0
+       .long   1097859072
+       .long   0
+       .long   1097859072
+       .long   0
+       .long   1097859072
+       .long   0
+       .long   1097859072
+       .long   0
+       .long   1097859072
+       .long   0
+       .long   1097859072
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   1841940611
+       .long   1070882608
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   1073741824
+       .long   1074340347
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   0
+       .long   1048855597
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   2147483648
+       .long   1023952536
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1880851354
+       .long   998820945
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   1413754136
+       .long   1074340347
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   856972294
+       .long   1017226790
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   688016905
+       .long   962338001
+       .long   1431655592
+       .long   3217380693
+       .long   1431655592
+       .long   3217380693
+       .long   1431655592
+       .long   3217380693
+       .long   1431655592
+       .long   3217380693
+       .long   1431655592
+       .long   3217380693
+       .long   1431655592
+       .long   3217380693
+       .long   1431655592
+       .long   3217380693
+       .long   1431655592
+       .long   3217380693
+       .long   286303603
+       .long   1065423121
+       .long   286303603
+       .long   1065423121
+       .long   286303603
+       .long   1065423121
+       .long   286303603
+       .long   1065423121
+       .long   286303603
+       .long   1065423121
+       .long   286303603
+       .long   1065423121
+       .long   286303603
+       .long   1065423121
+       .long   286303603
+       .long   1065423121
+       .long   430332381
+       .long   3207201184
+       .long   430332381
+       .long   3207201184
+       .long   430332381
+       .long   3207201184
+       .long   430332381
+       .long   3207201184
+       .long   430332381
+       .long   3207201184
+       .long   430332381
+       .long   3207201184
+       .long   430332381
+       .long   3207201184
+       .long   430332381
+       .long   3207201184
+       .long   2154487066
+       .long   1053236707
+       .long   2154487066
+       .long   1053236707
+       .long   2154487066
+       .long   1053236707
+       .long   2154487066
+       .long   1053236707
+       .long   2154487066
+       .long   1053236707
+       .long   2154487066
+       .long   1053236707
+       .long   2154487066
+       .long   1053236707
+       .long   2154487066
+       .long   1053236707
+       .long   1521109587
+       .long   3193628213
+       .long   1521109587
+       .long   3193628213
+       .long   1521109587
+       .long   3193628213
+       .long   1521109587
+       .long   3193628213
+       .long   1521109587
+       .long   3193628213
+       .long   1521109587
+       .long   3193628213
+       .long   1521109587
+       .long   3193628213
+       .long   1521109587
+       .long   3193628213
+       .long   3993098302
+       .long   1038487147
+       .long   3993098302
+       .long   1038487147
+       .long   3993098302
+       .long   1038487147
+       .long   3993098302
+       .long   1038487147
+       .long   3993098302
+       .long   1038487147
+       .long   3993098302
+       .long   1038487147
+       .long   3993098302
+       .long   1038487147
+       .long   3993098302
+       .long   1038487147
+       .long   2124375536
+       .long   3177836881
+       .long   2124375536
+       .long   3177836881
+       .long   2124375536
+       .long   3177836881
+       .long   2124375536
+       .long   3177836881
+       .long   2124375536
+       .long   3177836881
+       .long   2124375536
+       .long   3177836881
+       .long   2124375536
+       .long   3177836881
+       .long   2124375536
+       .long   3177836881
+       .type   __svml_dsin_data_internal,@object
+       .size   __svml_dsin_data_internal,1280
+       .align 64
+__svml_dsin_data_internal_ha:
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2376373521
+       .long   3205741868
+       .long   0
+       .long   1072693248
+       .long   4242458500
+       .long   1065951697
+       .long   2684354560
+       .long   1009354638
+       .long   3650591271
+       .long   3207838971
+       .long   0
+       .long   1072693248
+       .long   4154680958
+       .long   1067000149
+       .long   0
+       .long   3153796451
+       .long   69373323
+       .long   3209049152
+       .long   0
+       .long   1072693248
+       .long   1972655565
+       .long   1067636837
+       .long   1073741824
+       .long   1009157878
+       .long   220529721
+       .long   3209935929
+       .long   0
+       .long   1072693248
+       .long   4044216340
+       .long   1068048229
+       .long   0
+       .long   3156808381
+       .long   3810305407
+       .long   3210663220
+       .long   0
+       .long   1072693248
+       .long   2046304480
+       .long   1068459374
+       .long   3758096384
+       .long   3156402667
+       .long   4269262315
+       .long   3211145810
+       .long   0
+       .long   1072693248
+       .long   2462980598
+       .long   1068684576
+       .long   2684354560
+       .long   3158941832
+       .long   1118107366
+       .long   3211670787
+       .long   0
+       .long   1072693248
+       .long   177906713
+       .long   1068889808
+       .long   3221225472
+       .long   3159310370
+       .long   393047345
+       .long   3212032302
+       .long   0
+       .long   1072693248
+       .long   3156849708
+       .long   1069094822
+       .long   3221225472
+       .long   3158189848
+       .long   1227670166
+       .long   3212375297
+       .long   0
+       .long   1072693248
+       .long   3349070549
+       .long   1069299589
+       .long   3758096384
+       .long   3156538269
+       .long   2402293340
+       .long   3212758471
+       .long   0
+       .long   1072693248
+       .long   1453945614
+       .long   1069504078
+       .long   1610612736
+       .long   1011492612
+       .long   2592747447
+       .long   3213009315
+       .long   0
+       .long   1072693248
+       .long   3470456183
+       .long   1069627888
+       .long   1073741824
+       .long   3160744771
+       .long   1037482584
+       .long   3213240992
+       .long   0
+       .long   1072693248
+       .long   1854824762
+       .long   1069729808
+       .long   2684354560
+       .long   1011953664
+       .long   3451754846
+       .long   3213492662
+       .long   0
+       .long   1072693248
+       .long   2972270170
+       .long   1069831542
+       .long   1073741824
+       .long   3159524770
+       .long   1672287667
+       .long   3213764289
+       .long   0
+       .long   1072693248
+       .long   1149976518
+       .long   1069933076
+       .long   1610612736
+       .long   1013264895
+       .long   2346447124
+       .long   3213970635
+       .long   0
+       .long   1072693248
+       .long   3729833777
+       .long   1070034393
+       .long   3758096384
+       .long   1013044718
+       .long   18115067
+       .long   3214126342
+       .long   0
+       .long   1072693248
+       .long   1013556747
+       .long   1070135480
+       .long   2684354560
+       .long   3160567065
+       .long   2660899430
+       .long   3214291960
+       .long   0
+       .long   1072693248
+       .long   632292433
+       .long   1070236320
+       .long   3758096384
+       .long   3160963333
+       .long   1935888103
+       .long   3214467466
+       .long   0
+       .long   1072693248
+       .long   1786662755
+       .long   1070336898
+       .long   2147483648
+       .long   3155882307
+       .long   288924873
+       .long   3214652833
+       .long   0
+       .long   1072693248
+       .long   3846521617
+       .long   1070437199
+       .long   536870912
+       .long   1013406610
+       .long   2377770267
+       .long   3214848032
+       .long   0
+       .long   1072693248
+       .long   2065784603
+       .long   1070537209
+       .long   3758096384
+       .long   3160681966
+       .long   3250111450
+       .long   3214993525
+       .long   0
+       .long   1072693248
+       .long   238550446
+       .long   1070616504
+       .long   2684354560
+       .long   3154383565
+       .long   2306566604
+       .long   3215100913
+       .long   0
+       .long   1072693248
+       .long   1655830135
+       .long   1070666194
+       .long   0
+       .long   1014506690
+       .long   1913604284
+       .long   3215213171
+       .long   0
+       .long   1072693248
+       .long   1062001470
+       .long   1070715716
+       .long   0
+       .long   3160875220
+       .long   2476548698
+       .long   3215330282
+       .long   0
+       .long   1072693248
+       .long   785751814
+       .long   1070765062
+       .long   2684354560
+       .long   3161838221
+       .long   1261629236
+       .long   3215452229
+       .long   0
+       .long   1072693248
+       .long   3269558610
+       .long   1070814224
+       .long   536870912
+       .long   3161705216
+       .long   997322465
+       .long   3215578993
+       .long   0
+       .long   1072693248
+       .long   2484561409
+       .long   1070863196
+       .long   1073741824
+       .long   1014024572
+       .long   1296295961
+       .long   3215710555
+       .long   0
+       .long   1072693248
+       .long   1115219818
+       .long   1070911970
+       .long   0
+       .long   1013072242
+       .long   2962723252
+       .long   3215846895
+       .long   0
+       .long   1072693248
+       .long   1974149085
+       .long   1070960538
+       .long   3221225472
+       .long   3156147648
+       .long   4002549419
+       .long   3215985292
+       .long   0
+       .long   1072693248
+       .long   3711903686
+       .long   1071008893
+       .long   1073741824
+       .long   1011944747
+       .long   1234824733
+       .long   3216058210
+       .long   0
+       .long   1072693248
+       .long   821708191
+       .long   1071057029
+       .long   3758096384
+       .long   3161738009
+       .long   3996842794
+       .long   3216133484
+       .long   0
+       .long   1072693248
+       .long   824036583
+       .long   1071104937
+       .long   0
+       .long   1008313330
+       .long   2255197647
+       .long   3216211105
+       .long   0
+       .long   1072693248
+       .long   2796464483
+       .long   1071152610
+       .long   3221225472
+       .long   3160878317
+       .long   1638976426
+       .long   3216291060
+       .long   0
+       .long   1072693248
+       .long   1673302999
+       .long   1071200042
+       .long   2147483648
+       .long   1013351473
+       .long   1972483635
+       .long   3216373337
+       .long   0
+       .long   1072693248
+       .long   1135144330
+       .long   1071247225
+       .long   536870912
+       .long   1013373569
+       .long   1577996576
+       .long   3216457924
+       .long   0
+       .long   1072693248
+       .long   728580042
+       .long   1071294152
+       .long   1610612736
+       .long   3162332944
+       .long   1578746984
+       .long   3216544808
+       .long   0
+       .long   1072693248
+       .long   165764288
+       .long   1071340816
+       .long   3221225472
+       .long   1013298018
+       .long   1612193054
+       .long   3216633976
+       .long   0
+       .long   1072693248
+       .long   3623952103
+       .long   1071387209
+       .long   2684354560
+       .long   3161985962
+       .long   4133449816
+       .long   3216725414
+       .long   0
+       .long   1072693248
+       .long   2570175582
+       .long   1071433326
+       .long   1073741824
+       .long   1012303118
+       .long   1539072807
+       .long   3216819110
+       .long   0
+       .long   1072693248
+       .long   1535566729
+       .long   1071479159
+       .long   2147483648
+       .long   1014321388
+       .long   1945768569
+       .long   3216915048
+       .long   0
+       .long   1072693248
+       .long   939980347
+       .long   1071524701
+       .long   0
+       .long   1012796809
+       .long   3429717432
+       .long   3217013214
+       .long   0
+       .long   1072693248
+       .long   1391425750
+       .long   1071569945
+       .long   3221225472
+       .long   3162362103
+       .long   1312926554
+       .long   3217072381
+       .long   0
+       .long   1072693248
+       .long   3690502842
+       .long   1071614884
+       .long   3221225472
+       .long   3157453855
+       .long   1663679671
+       .long   3217123670
+       .long   0
+       .long   1072693248
+       .long   2269920951
+       .long   1071652092
+       .long   3758096384
+       .long   3161672245
+       .long   3952756490
+       .long   3217176050
+       .long   0
+       .long   1072693248
+       .long   2569207790
+       .long   1071674247
+       .long   1073741824
+       .long   3163183617
+       .long   69903290
+       .long   3217229515
+       .long   0
+       .long   1072693248
+       .long   1297975695
+       .long   1071696240
+       .long   3221225472
+       .long   3163083735
+       .long   2678847490
+       .long   3217284054
+       .long   0
+       .long   1072693248
+       .long   1411074851
+       .long   1071718067
+       .long   1610612736
+       .long   3163484731
+       .long   2272832445
+       .long   3217339661
+       .long   0
+       .long   1072693248
+       .long   1675549513
+       .long   1071739725
+       .long   3221225472
+       .long   3163025138
+       .long   1539668340
+       .long   3217396327
+       .long   0
+       .long   1072693248
+       .long   967731400
+       .long   1071761211
+       .long   536870912
+       .long   1015752157
+       .long   2482246777
+       .long   3217454043
+       .long   0
+       .long   1072693248
+       .long   2570316633
+       .long   1071782521
+       .long   1610612736
+       .long   3162744753
+       .long   2129093113
+       .long   3217512801
+       .long   0
+       .long   1072693248
+       .long   1289556703
+       .long   1071803653
+       .long   536870912
+       .long   3162888820
+       .long   1129922991
+       .long   3217572592
+       .long   0
+       .long   1072693248
+       .long   637203434
+       .long   1071824603
+       .long   3221225472
+       .long   3159443841
+       .long   3761365757
+       .long   3217633406
+       .long   0
+       .long   1072693248
+       .long   4242632757
+       .long   1071845367
+       .long   536870912
+       .long   3161390278
+       .long   752919289
+       .long   3217695236
+       .long   0
+       .long   1072693248
+       .long   2969983475
+       .long   1071865944
+       .long   2684354560
+       .long   3162635443
+       .long   3652612115
+       .long   3217758070
+       .long   0
+       .long   1072693248
+       .long   689983673
+       .long   1071886330
+       .long   3758096384
+       .long   1014906405
+       .long   1883353036
+       .long   3217821901
+       .long   0
+       .long   1072693248
+       .long   1397053140
+       .long   1071906521
+       .long   1610612736
+       .long   1015245078
+       .long   1403757309
+       .long   3217886718
+       .long   0
+       .long   1072693248
+       .long   621354454
+       .long   1071926515
+       .long   536870912
+       .long   1013450602
+       .long   3239527685
+       .long   3217952511
+       .long   0
+       .long   1072693248
+       .long   2610628921
+       .long   1071946308
+       .long   1610612736
+       .long   3162668769
+       .long   3489768009
+       .long   3218019271
+       .long   0
+       .long   1072693248
+       .long   3152274921
+       .long   1071965898
+       .long   3758096384
+       .long   1013170835
+       .long   2371640770
+       .long   1070588851
+       .long   0
+       .long   1071644672
+       .long   2460177814
+       .long   1071985282
+       .long   2147483648
+       .long   3162116843
+       .long   2309668539
+       .long   1070520188
+       .long   0
+       .long   1071644672
+       .long   881650848
+       .long   1072004457
+       .long   2147483648
+       .long   3162986272
+       .long   2081278341
+       .long   1070450589
+       .long   0
+       .long   1071644672
+       .long   3194290572
+       .long   1072023419
+       .long   2147483648
+       .long   1015048682
+       .long   3753901657
+       .long   1070380064
+       .long   0
+       .long   1071644672
+       .long   1427975391
+       .long   1072042167
+       .long   1073741824
+       .long   3161608627
+       .long   1403691706
+       .long   1070308625
+       .long   0
+       .long   1071644672
+       .long   636516413
+       .long   1072060697
+       .long   3758096384
+       .long   1015823716
+       .long   2583490354
+       .long   1070236281
+       .long   0
+       .long   1071644672
+       .long   1719614413
+       .long   1072079006
+       .long   0
+       .long   3163282740
+       .long   2546065654
+       .long   1070163044
+       .long   0
+       .long   1071644672
+       .long   1424664751
+       .long   1072097092
+       .long   3221225472
+       .long   3163405315
+       .long   1416934267
+       .long   1070088925
+       .long   0
+       .long   1071644672
+       .long   938475414
+       .long   1072114952
+       .long   0
+       .long   1015076079
+       .long   4187227697
+       .long   1070013934
+       .long   0
+       .long   1071644672
+       .long   1594061409
+       .long   1072132583
+       .long   2147483648
+       .long   1014353870
+       .long   3526603391
+       .long   1069938084
+       .long   0
+       .long   1071644672
+       .long   577417135
+       .long   1072149983
+       .long   2684354560
+       .long   3161519415
+       .long   1250776663
+       .long   1069861386
+       .long   0
+       .long   1071644672
+       .long   3814135665
+       .long   1072167148
+       .long   3221225472
+       .long   3163146456
+       .long   4019165092
+       .long   1069783850
+       .long   0
+       .long   1071644672
+       .long   201299822
+       .long   1072184078
+       .long   3758096384
+       .long   3161912352
+       .long   1852581091
+       .long   1069705490
+       .long   0
+       .long   1071644672
+       .long   263859903
+       .long   1072200768
+       .long   0
+       .long   3162692284
+       .long   2485417816
+       .long   1069626316
+       .long   0
+       .long   1071644672
+       .long   1796544321
+       .long   1072217216
+       .long   536870912
+       .long   3162686945
+       .long   2586490530
+       .long   1069545162
+       .long   0
+       .long   1071644672
+       .long   2750387213
+       .long   1072233420
+       .long   2147483648
+       .long   3160858537
+       .long   1224902090
+       .long   1069383633
+       .long   0
+       .long   1071644672
+       .long   1234330619
+       .long   1072249378
+       .long   2684354560
+       .long   1015272473
+       .long   2285031318
+       .long   1069220549
+       .long   0
+       .long   1071644672
+       .long   4106737474
+       .long   1072265086
+       .long   2684354560
+       .long   3162592377
+       .long   3876290983
+       .long   1069055935
+       .long   0
+       .long   1071644672
+       .long   1207142209
+       .long   1072280544
+       .long   2147483648
+       .long   3162705634
+       .long   802660176
+       .long   1068889817
+       .long   0
+       .long   1071644672
+       .long   4012486548
+       .long   1072295747
+       .long   2684354560
+       .long   1014701564
+       .long   1726519029
+       .long   1068722218
+       .long   0
+       .long   1071644672
+       .long   2688952194
+       .long   1072310695
+       .long   0
+       .long   3161532603
+       .long   3382663878
+       .long   1068553164
+       .long   0
+       .long   1071644672
+       .long   453180130
+       .long   1072325385
+       .long   1073741824
+       .long   3162411281
+       .long   2598800519
+       .long   1068266419
+       .long   0
+       .long   1071644672
+       .long   688824739
+       .long   1072339814
+       .long   3758096384
+       .long   1010431536
+       .long   1038988426
+       .long   1067922646
+       .long   0
+       .long   1071644672
+       .long   2653017361
+       .long   1072353980
+       .long   0
+       .long   3162800062
+       .long   1102361128
+       .long   1067576117
+       .long   0
+       .long   1071644672
+       .long   1477771776
+       .long   1072367882
+       .long   536870912
+       .long   3163104986
+       .long   2880516564
+       .long   1067003401
+       .long   0
+       .long   1071644672
+       .long   1056266002
+       .long   1072381517
+       .long   2684354560
+       .long   3163469496
+       .long   1220541286
+       .long   1066197478
+       .long   0
+       .long   1071644672
+       .long   1159294526
+       .long   1072394883
+       .long   536870912
+       .long   3163276959
+       .long   1279178457
+       .long   1064107143
+       .long   0
+       .long   1071644672
+       .long   1731563730
+       .long   1072407978
+       .long   536870912
+       .long   1015540302
+       .long   31019393
+       .long   3212646089
+       .long   0
+       .long   1071644672
+       .long   2892993834
+       .long   1072420800
+       .long   536870912
+       .long   3163039143
+       .long   3506991783
+       .long   3214032490
+       .long   0
+       .long   1071644672
+       .long   645027145
+       .long   1072433348
+       .long   3221225472
+       .long   1012602239
+       .long   2140183630
+       .long   3214756396
+       .long   0
+       .long   1071644672
+       .long   4051746225
+       .long   1072445618
+       .long   1610612736
+       .long   3161907377
+       .long   600368053
+       .long   3215209541
+       .long   0
+       .long   1071644672
+       .long   881357723
+       .long   1072457611
+       .long   3221225472
+       .long   1013810890
+       .long   913431823
+       .long   3215576203
+       .long   0
+       .long   1071644672
+       .long   557060597
+       .long   1072469323
+       .long   0
+       .long   3159554934
+       .long   1073154251
+       .long   3215945137
+       .long   0
+       .long   1071644672
+       .long   4093443164
+       .long   1072480752
+       .long   536870912
+       .long   1014912865
+       .long   3631910143
+       .long   3216149439
+       .long   0
+       .long   1071644672
+       .long   4097623923
+       .long   1072491898
+       .long   2684354560
+       .long   3160308587
+       .long   1380647130
+       .long   3216336095
+       .long   0
+       .long   1071644672
+       .long   1950234076
+       .long   1072502759
+       .long   536870912
+       .long   3159425498
+       .long   4049357271
+       .long   3216523802
+       .long   0
+       .long   1071644672
+       .long   3511535930
+       .long   1072513332
+       .long   2147483648
+       .long   3162828626
+       .long   1896722595
+       .long   3216712534
+       .long   0
+       .long   1071644672
+       .long   1942611595
+       .long   1072523617
+       .long   3221225472
+       .long   3162410081
+       .long   1699043957
+       .long   3216902261
+       .long   0
+       .long   1071644672
+       .long   3476196678
+       .long   1072533611
+       .long   0
+       .long   1014257638
+       .long   3296146332
+       .long   1069485732
+       .long   0
+       .long   1070596096
+       .long   1647878299
+       .long   1072543314
+       .long   3758096384
+       .long   3162169063
+       .long   3286832763
+       .long   1069294100
+       .long   0
+       .long   1070596096
+       .long   3066872380
+       .long   1072552723
+       .long   3221225472
+       .long   1015561271
+       .long   1962712856
+       .long   1069101559
+       .long   0
+       .long   1070596096
+       .long   1647164971
+       .long   1072561838
+       .long   2147483648
+       .long   3162838250
+       .long   3601629044
+       .long   1068908137
+       .long   0
+       .long   1070596096
+       .long   83265253
+       .long   1072570657
+       .long   1610612736
+       .long   3162510535
+       .long   165911977
+       .long   1068713865
+       .long   0
+       .long   1070596096
+       .long   1261158782
+       .long   1072579178
+       .long   2147483648
+       .long   1015711544
+       .long   1348311045
+       .long   1068518770
+       .long   0
+       .long   1070596096
+       .long   3964199186
+       .long   1072587400
+       .long   3758096384
+       .long   3160501078
+       .long   386665102
+       .long   1068146822
+       .long   0
+       .long   1070596096
+       .long   2873938189
+       .long   1072595323
+       .long   1610612736
+       .long   3162311422
+       .long   1991047213
+       .long   1067753521
+       .long   0
+       .long   1070596096
+       .long   1455828442
+       .long   1072602945
+       .long   3758096384
+       .long   1015505073
+       .long   4107121629
+       .long   1067267139
+       .long   0
+       .long   1070596096
+       .long   3370060660
+       .long   1072610264
+       .long   1610612736
+       .long   1014787212
+       .long   723478390
+       .long   1066474790
+       .long   0
+       .long   1070596096
+       .long   3882371427
+       .long   1072617280
+       .long   2147483648
+       .long   1014923975
+       .long   2382326656
+       .long   1064562179
+       .long   0
+       .long   1070596096
+       .long   2749658050
+       .long   1072623992
+       .long   1610612736
+       .long   1015427338
+       .long   2614369450
+       .long   3212624080
+       .long   0
+       .long   1070596096
+       .long   4220661975
+       .long   1072630398
+       .long   3221225472
+       .long   1014312058
+       .long   3587565429
+       .long   3214108032
+       .long   0
+       .long   1070596096
+       .long   4151720666
+       .long   1072636498
+       .long   0
+       .long   3162639544
+       .long   2886567144
+       .long   3214910444
+       .long   0
+       .long   1070596096
+       .long   2892293513
+       .long   1072642291
+       .long   2684354560
+       .long   3162340271
+       .long   1765797566
+       .long   3215324543
+       .long   0
+       .long   1070596096
+       .long   990588717
+       .long   1072647776
+       .long   3758096384
+       .long   3162041857
+       .long   240740309
+       .long   3215727903
+       .long   0
+       .long   1070596096
+       .long   3489094832
+       .long   1072652951
+       .long   536870912
+       .long   1014325783
+       .long   2034433221
+       .long   1068349287
+       .long   0
+       .long   1069547520
+       .long   2745245815
+       .long   1072657817
+       .long   3221225472
+       .long   1015566129
+       .long   304938777
+       .long   1067944017
+       .long   0
+       .long   1069547520
+       .long   4201728937
+       .long   1072662372
+       .long   1610612736
+       .long   1014674006
+       .long   3299146087
+       .long   1067537882
+       .long   0
+       .long   1069547520
+       .long   617154971
+       .long   1072666617
+       .long   3758096384
+       .long   3163433696
+       .long   1953696209
+       .long   1066811523
+       .long   0
+       .long   1069547520
+       .long   2131272983
+       .long   1072670549
+       .long   3221225472
+       .long   3163005096
+       .long   3987691371
+       .long   1065590540
+       .long   0
+       .long   1069547520
+       .long   1905645377
+       .long   1072674169
+       .long   1610612736
+       .long   1014087596
+       .long   718380601
+       .long   3211081269
+       .long   0
+       .long   1069547520
+       .long   1893834707
+       .long   1072677476
+       .long   1610612736
+       .long   1015147654
+       .long   3272206680
+       .long   3213771729
+       .long   0
+       .long   1069547520
+       .long   4251821691
+       .long   1072680469
+       .long   2147483648
+       .long   3161841007
+       .long   257503056
+       .long   3214647653
+       .long   0
+       .long   1069547520
+       .long   2748392742
+       .long   1072683149
+       .long   536870912
+       .long   3163061750
+       .long   711626851
+       .long   1066916672
+       .long   0
+       .long   1068498944
+       .long   4240268041
+       .long   1072685514
+       .long   536870912
+       .long   1013588963
+       .long   2523975598
+       .long   1065789700
+       .long   0
+       .long   1068498944
+       .long   2902558778
+       .long   1072687565
+       .long   3221225472
+       .long   1013260780
+       .long   3237733378
+       .long   3209908784
+       .long   0
+       .long   1068498944
+       .long   1703834029
+       .long   1072689301
+       .long   3758096384
+       .long   1015028364
+       .long   1003003824
+       .long   3213591144
+       .long   0
+       .long   1068498944
+       .long   3816385918
+       .long   1072690721
+       .long   536870912
+       .long   3161216956
+       .long   2896342633
+       .long   1064747819
+       .long   0
+       .long   1067450368
+       .long   4026464093
+       .long   1072691826
+       .long   3221225472
+       .long   3163075789
+       .long   561145352
+       .long   3212540584
+       .long   0
+       .long   1067450368
+       .long   1619315981
+       .long   1072692616
+       .long   1073741824
+       .long   3162584397
+       .long   210035182
+       .long   3211491512
+       .long   0
+       .long   1066401792
+       .long   379294427
+       .long   1072693090
+       .long   3221225472
+       .long   1015405987
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   210035182
+       .long   1064007864
+       .long   0
+       .long   3213885440
+       .long   379294427
+       .long   1072693090
+       .long   3221225472
+       .long   1015405987
+       .long   561145352
+       .long   1065056936
+       .long   0
+       .long   3214934016
+       .long   1619315981
+       .long   1072692616
+       .long   1073741824
+       .long   3162584397
+       .long   2896342633
+       .long   3212231467
+       .long   0
+       .long   3214934016
+       .long   4026464093
+       .long   1072691826
+       .long   3221225472
+       .long   3163075789
+       .long   1003003824
+       .long   1066107496
+       .long   0
+       .long   3215982592
+       .long   3816385918
+       .long   1072690721
+       .long   536870912
+       .long   3161216956
+       .long   3237733378
+       .long   1062425136
+       .long   0
+       .long   3215982592
+       .long   1703834029
+       .long   1072689301
+       .long   3758096384
+       .long   1015028364
+       .long   2523975598
+       .long   3213273348
+       .long   0
+       .long   3215982592
+       .long   2902558778
+       .long   1072687565
+       .long   3221225472
+       .long   1013260780
+       .long   711626851
+       .long   3214400320
+       .long   0
+       .long   3215982592
+       .long   4240268041
+       .long   1072685514
+       .long   536870912
+       .long   1013588963
+       .long   257503056
+       .long   1067164005
+       .long   0
+       .long   3217031168
+       .long   2748392742
+       .long   1072683149
+       .long   536870912
+       .long   3163061750
+       .long   3272206680
+       .long   1066288081
+       .long   0
+       .long   3217031168
+       .long   4251821691
+       .long   1072680469
+       .long   2147483648
+       .long   3161841007
+       .long   718380601
+       .long   1063597621
+       .long   0
+       .long   3217031168
+       .long   1893834707
+       .long   1072677476
+       .long   1610612736
+       .long   1015147654
+       .long   3987691371
+       .long   3213074188
+       .long   0
+       .long   3217031168
+       .long   1905645377
+       .long   1072674169
+       .long   1610612736
+       .long   1014087596
+       .long   1953696209
+       .long   3214295171
+       .long   0
+       .long   3217031168
+       .long   2131272983
+       .long   1072670549
+       .long   3221225472
+       .long   3163005096
+       .long   3299146087
+       .long   3215021530
+       .long   0
+       .long   3217031168
+       .long   617154971
+       .long   1072666617
+       .long   3758096384
+       .long   3163433696
+       .long   304938777
+       .long   3215427665
+       .long   0
+       .long   3217031168
+       .long   4201728937
+       .long   1072662372
+       .long   1610612736
+       .long   1014674006
+       .long   2034433221
+       .long   3215832935
+       .long   0
+       .long   3217031168
+       .long   2745245815
+       .long   1072657817
+       .long   3221225472
+       .long   1015566129
+       .long   240740309
+       .long   1068244255
+       .long   0
+       .long   3218079744
+       .long   3489094832
+       .long   1072652951
+       .long   536870912
+       .long   1014325783
+       .long   1765797566
+       .long   1067840895
+       .long   0
+       .long   3218079744
+       .long   990588717
+       .long   1072647776
+       .long   3758096384
+       .long   3162041857
+       .long   2886567144
+       .long   1067426796
+       .long   0
+       .long   3218079744
+       .long   2892293513
+       .long   1072642291
+       .long   2684354560
+       .long   3162340271
+       .long   3587565429
+       .long   1066624384
+       .long   0
+       .long   3218079744
+       .long   4151720666
+       .long   1072636498
+       .long   0
+       .long   3162639544
+       .long   2614369450
+       .long   1065140432
+       .long   0
+       .long   3218079744
+       .long   4220661975
+       .long   1072630398
+       .long   3221225472
+       .long   1014312058
+       .long   2382326656
+       .long   3212045827
+       .long   0
+       .long   3218079744
+       .long   2749658050
+       .long   1072623992
+       .long   1610612736
+       .long   1015427338
+       .long   723478390
+       .long   3213958438
+       .long   0
+       .long   3218079744
+       .long   3882371427
+       .long   1072617280
+       .long   2147483648
+       .long   1014923975
+       .long   4107121629
+       .long   3214750787
+       .long   0
+       .long   3218079744
+       .long   3370060660
+       .long   1072610264
+       .long   1610612736
+       .long   1014787212
+       .long   1991047213
+       .long   3215237169
+       .long   0
+       .long   3218079744
+       .long   1455828442
+       .long   1072602945
+       .long   3758096384
+       .long   1015505073
+       .long   386665102
+       .long   3215630470
+       .long   0
+       .long   3218079744
+       .long   2873938189
+       .long   1072595323
+       .long   1610612736
+       .long   3162311422
+       .long   1348311045
+       .long   3216002418
+       .long   0
+       .long   3218079744
+       .long   3964199186
+       .long   1072587400
+       .long   3758096384
+       .long   3160501078
+       .long   165911977
+       .long   3216197513
+       .long   0
+       .long   3218079744
+       .long   1261158782
+       .long   1072579178
+       .long   2147483648
+       .long   1015711544
+       .long   3601629044
+       .long   3216391785
+       .long   0
+       .long   3218079744
+       .long   83265253
+       .long   1072570657
+       .long   1610612736
+       .long   3162510535
+       .long   1962712856
+       .long   3216585207
+       .long   0
+       .long   3218079744
+       .long   1647164971
+       .long   1072561838
+       .long   2147483648
+       .long   3162838250
+       .long   3286832763
+       .long   3216777748
+       .long   0
+       .long   3218079744
+       .long   3066872380
+       .long   1072552723
+       .long   3221225472
+       .long   1015561271
+       .long   3296146332
+       .long   3216969380
+       .long   0
+       .long   3218079744
+       .long   1647878299
+       .long   1072543314
+       .long   3758096384
+       .long   3162169063
+       .long   1699043957
+       .long   1069418613
+       .long   0
+       .long   3219128320
+       .long   3476196678
+       .long   1072533611
+       .long   0
+       .long   1014257638
+       .long   1896722595
+       .long   1069228886
+       .long   0
+       .long   3219128320
+       .long   1942611595
+       .long   1072523617
+       .long   3221225472
+       .long   3162410081
+       .long   4049357271
+       .long   1069040154
+       .long   0
+       .long   3219128320
+       .long   3511535930
+       .long   1072513332
+       .long   2147483648
+       .long   3162828626
+       .long   1380647130
+       .long   1068852447
+       .long   0
+       .long   3219128320
+       .long   1950234076
+       .long   1072502759
+       .long   536870912
+       .long   3159425498
+       .long   3631910143
+       .long   1068665791
+       .long   0
+       .long   3219128320
+       .long   4097623923
+       .long   1072491898
+       .long   2684354560
+       .long   3160308587
+       .long   1073154251
+       .long   1068461489
+       .long   0
+       .long   3219128320
+       .long   4093443164
+       .long   1072480752
+       .long   536870912
+       .long   1014912865
+       .long   913431823
+       .long   1068092555
+       .long   0
+       .long   3219128320
+       .long   557060597
+       .long   1072469323
+       .long   0
+       .long   3159554934
+       .long   600368053
+       .long   1067725893
+       .long   0
+       .long   3219128320
+       .long   881357723
+       .long   1072457611
+       .long   3221225472
+       .long   1013810890
+       .long   2140183630
+       .long   1067272748
+       .long   0
+       .long   3219128320
+       .long   4051746225
+       .long   1072445618
+       .long   1610612736
+       .long   3161907377
+       .long   3506991783
+       .long   1066548842
+       .long   0
+       .long   3219128320
+       .long   645027145
+       .long   1072433348
+       .long   3221225472
+       .long   1012602239
+       .long   31019393
+       .long   1065162441
+       .long   0
+       .long   3219128320
+       .long   2892993834
+       .long   1072420800
+       .long   536870912
+       .long   3163039143
+       .long   1279178457
+       .long   3211590791
+       .long   0
+       .long   3219128320
+       .long   1731563730
+       .long   1072407978
+       .long   536870912
+       .long   1015540302
+       .long   1220541286
+       .long   3213681126
+       .long   0
+       .long   3219128320
+       .long   1159294526
+       .long   1072394883
+       .long   536870912
+       .long   3163276959
+       .long   2880516564
+       .long   3214487049
+       .long   0
+       .long   3219128320
+       .long   1056266002
+       .long   1072381517
+       .long   2684354560
+       .long   3163469496
+       .long   1102361128
+       .long   3215059765
+       .long   0
+       .long   3219128320
+       .long   1477771776
+       .long   1072367882
+       .long   536870912
+       .long   3163104986
+       .long   1038988426
+       .long   3215406294
+       .long   0
+       .long   3219128320
+       .long   2653017361
+       .long   1072353980
+       .long   0
+       .long   3162800062
+       .long   2598800519
+       .long   3215750067
+       .long   0
+       .long   3219128320
+       .long   688824739
+       .long   1072339814
+       .long   3758096384
+       .long   1010431536
+       .long   3382663878
+       .long   3216036812
+       .long   0
+       .long   3219128320
+       .long   453180130
+       .long   1072325385
+       .long   1073741824
+       .long   3162411281
+       .long   1726519029
+       .long   3216205866
+       .long   0
+       .long   3219128320
+       .long   2688952194
+       .long   1072310695
+       .long   0
+       .long   3161532603
+       .long   802660176
+       .long   3216373465
+       .long   0
+       .long   3219128320
+       .long   4012486548
+       .long   1072295747
+       .long   2684354560
+       .long   1014701564
+       .long   3876290983
+       .long   3216539583
+       .long   0
+       .long   3219128320
+       .long   1207142209
+       .long   1072280544
+       .long   2147483648
+       .long   3162705634
+       .long   2285031318
+       .long   3216704197
+       .long   0
+       .long   3219128320
+       .long   4106737474
+       .long   1072265086
+       .long   2684354560
+       .long   3162592377
+       .long   1224902090
+       .long   3216867281
+       .long   0
+       .long   3219128320
+       .long   1234330619
+       .long   1072249378
+       .long   2684354560
+       .long   1015272473
+       .long   2586490530
+       .long   3217028810
+       .long   0
+       .long   3219128320
+       .long   2750387213
+       .long   1072233420
+       .long   2147483648
+       .long   3160858537
+       .long   2485417816
+       .long   3217109964
+       .long   0
+       .long   3219128320
+       .long   1796544321
+       .long   1072217216
+       .long   536870912
+       .long   3162686945
+       .long   1852581091
+       .long   3217189138
+       .long   0
+       .long   3219128320
+       .long   263859903
+       .long   1072200768
+       .long   0
+       .long   3162692284
+       .long   4019165092
+       .long   3217267498
+       .long   0
+       .long   3219128320
+       .long   201299822
+       .long   1072184078
+       .long   3758096384
+       .long   3161912352
+       .long   1250776663
+       .long   3217345034
+       .long   0
+       .long   3219128320
+       .long   3814135665
+       .long   1072167148
+       .long   3221225472
+       .long   3163146456
+       .long   3526603391
+       .long   3217421732
+       .long   0
+       .long   3219128320
+       .long   577417135
+       .long   1072149983
+       .long   2684354560
+       .long   3161519415
+       .long   4187227697
+       .long   3217497582
+       .long   0
+       .long   3219128320
+       .long   1594061409
+       .long   1072132583
+       .long   2147483648
+       .long   1014353870
+       .long   1416934267
+       .long   3217572573
+       .long   0
+       .long   3219128320
+       .long   938475414
+       .long   1072114952
+       .long   0
+       .long   1015076079
+       .long   2546065654
+       .long   3217646692
+       .long   0
+       .long   3219128320
+       .long   1424664751
+       .long   1072097092
+       .long   3221225472
+       .long   3163405315
+       .long   2583490354
+       .long   3217719929
+       .long   0
+       .long   3219128320
+       .long   1719614413
+       .long   1072079006
+       .long   0
+       .long   3163282740
+       .long   1403691706
+       .long   3217792273
+       .long   0
+       .long   3219128320
+       .long   636516413
+       .long   1072060697
+       .long   3758096384
+       .long   1015823716
+       .long   3753901657
+       .long   3217863712
+       .long   0
+       .long   3219128320
+       .long   1427975391
+       .long   1072042167
+       .long   1073741824
+       .long   3161608627
+       .long   2081278341
+       .long   3217934237
+       .long   0
+       .long   3219128320
+       .long   3194290572
+       .long   1072023419
+       .long   2147483648
+       .long   1015048682
+       .long   2309668539
+       .long   3218003836
+       .long   0
+       .long   3219128320
+       .long   881650848
+       .long   1072004457
+       .long   2147483648
+       .long   3162986272
+       .long   2371640770
+       .long   3218072499
+       .long   0
+       .long   3219128320
+       .long   2460177814
+       .long   1071985282
+       .long   2147483648
+       .long   3162116843
+       .long   3489768009
+       .long   1070535623
+       .long   0
+       .long   3220176896
+       .long   3152274921
+       .long   1071965898
+       .long   3758096384
+       .long   1013170835
+       .long   3239527685
+       .long   1070468863
+       .long   0
+       .long   3220176896
+       .long   2610628921
+       .long   1071946308
+       .long   1610612736
+       .long   3162668769
+       .long   1403757309
+       .long   1070403070
+       .long   0
+       .long   3220176896
+       .long   621354454
+       .long   1071926515
+       .long   536870912
+       .long   1013450602
+       .long   1883353036
+       .long   1070338253
+       .long   0
+       .long   3220176896
+       .long   1397053140
+       .long   1071906521
+       .long   1610612736
+       .long   1015245078
+       .long   3652612115
+       .long   1070274422
+       .long   0
+       .long   3220176896
+       .long   689983673
+       .long   1071886330
+       .long   3758096384
+       .long   1014906405
+       .long   752919289
+       .long   1070211588
+       .long   0
+       .long   3220176896
+       .long   2969983475
+       .long   1071865944
+       .long   2684354560
+       .long   3162635443
+       .long   3761365757
+       .long   1070149758
+       .long   0
+       .long   3220176896
+       .long   4242632757
+       .long   1071845367
+       .long   536870912
+       .long   3161390278
+       .long   1129922991
+       .long   1070088944
+       .long   0
+       .long   3220176896
+       .long   637203434
+       .long   1071824603
+       .long   3221225472
+       .long   3159443841
+       .long   2129093113
+       .long   1070029153
+       .long   0
+       .long   3220176896
+       .long   1289556703
+       .long   1071803653
+       .long   536870912
+       .long   3162888820
+       .long   2482246777
+       .long   1069970395
+       .long   0
+       .long   3220176896
+       .long   2570316633
+       .long   1071782521
+       .long   1610612736
+       .long   3162744753
+       .long   1539668340
+       .long   1069912679
+       .long   0
+       .long   3220176896
+       .long   967731400
+       .long   1071761211
+       .long   536870912
+       .long   1015752157
+       .long   2272832445
+       .long   1069856013
+       .long   0
+       .long   3220176896
+       .long   1675549513
+       .long   1071739725
+       .long   3221225472
+       .long   3163025138
+       .long   2678847490
+       .long   1069800406
+       .long   0
+       .long   3220176896
+       .long   1411074851
+       .long   1071718067
+       .long   1610612736
+       .long   3163484731
+       .long   69903290
+       .long   1069745867
+       .long   0
+       .long   3220176896
+       .long   1297975695
+       .long   1071696240
+       .long   3221225472
+       .long   3163083735
+       .long   3952756490
+       .long   1069692402
+       .long   0
+       .long   3220176896
+       .long   2569207790
+       .long   1071674247
+       .long   1073741824
+       .long   3163183617
+       .long   1663679671
+       .long   1069640022
+       .long   0
+       .long   3220176896
+       .long   2269920951
+       .long   1071652092
+       .long   3758096384
+       .long   3161672245
+       .long   1312926554
+       .long   1069588733
+       .long   0
+       .long   3220176896
+       .long   3690502842
+       .long   1071614884
+       .long   3221225472
+       .long   3157453855
+       .long   3429717432
+       .long   1069529566
+       .long   0
+       .long   3220176896
+       .long   1391425750
+       .long   1071569945
+       .long   3221225472
+       .long   3162362103
+       .long   1945768569
+       .long   1069431400
+       .long   0
+       .long   3220176896
+       .long   939980347
+       .long   1071524701
+       .long   0
+       .long   1012796809
+       .long   1539072807
+       .long   1069335462
+       .long   0
+       .long   3220176896
+       .long   1535566729
+       .long   1071479159
+       .long   2147483648
+       .long   1014321388
+       .long   4133449816
+       .long   1069241766
+       .long   0
+       .long   3220176896
+       .long   2570175582
+       .long   1071433326
+       .long   1073741824
+       .long   1012303118
+       .long   1612193054
+       .long   1069150328
+       .long   0
+       .long   3220176896
+       .long   3623952103
+       .long   1071387209
+       .long   2684354560
+       .long   3161985962
+       .long   1578746984
+       .long   1069061160
+       .long   0
+       .long   3220176896
+       .long   165764288
+       .long   1071340816
+       .long   3221225472
+       .long   1013298018
+       .long   1577996576
+       .long   1068974276
+       .long   0
+       .long   3220176896
+       .long   728580042
+       .long   1071294152
+       .long   1610612736
+       .long   3162332944
+       .long   1972483635
+       .long   1068889689
+       .long   0
+       .long   3220176896
+       .long   1135144330
+       .long   1071247225
+       .long   536870912
+       .long   1013373569
+       .long   1638976426
+       .long   1068807412
+       .long   0
+       .long   3220176896
+       .long   1673302999
+       .long   1071200042
+       .long   2147483648
+       .long   1013351473
+       .long   2255197647
+       .long   1068727457
+       .long   0
+       .long   3220176896
+       .long   2796464483
+       .long   1071152610
+       .long   3221225472
+       .long   3160878317
+       .long   3996842794
+       .long   1068649836
+       .long   0
+       .long   3220176896
+       .long   824036583
+       .long   1071104937
+       .long   0
+       .long   1008313330
+       .long   1234824733
+       .long   1068574562
+       .long   0
+       .long   3220176896
+       .long   821708191
+       .long   1071057029
+       .long   3758096384
+       .long   3161738009
+       .long   4002549419
+       .long   1068501644
+       .long   0
+       .long   3220176896
+       .long   3711903686
+       .long   1071008893
+       .long   1073741824
+       .long   1011944747
+       .long   2962723252
+       .long   1068363247
+       .long   0
+       .long   3220176896
+       .long   1974149085
+       .long   1070960538
+       .long   3221225472
+       .long   3156147648
+       .long   1296295961
+       .long   1068226907
+       .long   0
+       .long   3220176896
+       .long   1115219818
+       .long   1070911970
+       .long   0
+       .long   1013072242
+       .long   997322465
+       .long   1068095345
+       .long   0
+       .long   3220176896
+       .long   2484561409
+       .long   1070863196
+       .long   1073741824
+       .long   1014024572
+       .long   1261629236
+       .long   1067968581
+       .long   0
+       .long   3220176896
+       .long   3269558610
+       .long   1070814224
+       .long   536870912
+       .long   3161705216
+       .long   2476548698
+       .long   1067846634
+       .long   0
+       .long   3220176896
+       .long   785751814
+       .long   1070765062
+       .long   2684354560
+       .long   3161838221
+       .long   1913604284
+       .long   1067729523
+       .long   0
+       .long   3220176896
+       .long   1062001470
+       .long   1070715716
+       .long   0
+       .long   3160875220
+       .long   2306566604
+       .long   1067617265
+       .long   0
+       .long   3220176896
+       .long   1655830135
+       .long   1070666194
+       .long   0
+       .long   1014506690
+       .long   3250111450
+       .long   1067509877
+       .long   0
+       .long   3220176896
+       .long   238550446
+       .long   1070616504
+       .long   2684354560
+       .long   3154383565
+       .long   2377770267
+       .long   1067364384
+       .long   0
+       .long   3220176896
+       .long   2065784603
+       .long   1070537209
+       .long   3758096384
+       .long   3160681966
+       .long   288924873
+       .long   1067169185
+       .long   0
+       .long   3220176896
+       .long   3846521617
+       .long   1070437199
+       .long   536870912
+       .long   1013406610
+       .long   1935888103
+       .long   1066983818
+       .long   0
+       .long   3220176896
+       .long   1786662755
+       .long   1070336898
+       .long   2147483648
+       .long   3155882307
+       .long   2660899430
+       .long   1066808312
+       .long   0
+       .long   3220176896
+       .long   632292433
+       .long   1070236320
+       .long   3758096384
+       .long   3160963333
+       .long   18115067
+       .long   1066642694
+       .long   0
+       .long   3220176896
+       .long   1013556747
+       .long   1070135480
+       .long   2684354560
+       .long   3160567065
+       .long   2346447124
+       .long   1066486987
+       .long   0
+       .long   3220176896
+       .long   3729833777
+       .long   1070034393
+       .long   3758096384
+       .long   1013044718
+       .long   1672287667
+       .long   1066280641
+       .long   0
+       .long   3220176896
+       .long   1149976518
+       .long   1069933076
+       .long   1610612736
+       .long   1013264895
+       .long   3451754846
+       .long   1066009014
+       .long   0
+       .long   3220176896
+       .long   2972270170
+       .long   1069831542
+       .long   1073741824
+       .long   3159524770
+       .long   1037482584
+       .long   1065757344
+       .long   0
+       .long   3220176896
+       .long   1854824762
+       .long   1069729808
+       .long   2684354560
+       .long   1011953664
+       .long   2592747447
+       .long   1065525667
+       .long   0
+       .long   3220176896
+       .long   3470456183
+       .long   1069627888
+       .long   1073741824
+       .long   3160744771
+       .long   2402293340
+       .long   1065274823
+       .long   0
+       .long   3220176896
+       .long   1453945614
+       .long   1069504078
+       .long   1610612736
+       .long   1011492612
+       .long   1227670166
+       .long   1064891649
+       .long   0
+       .long   3220176896
+       .long   3349070549
+       .long   1069299589
+       .long   3758096384
+       .long   3156538269
+       .long   393047345
+       .long   1064548654
+       .long   0
+       .long   3220176896
+       .long   3156849708
+       .long   1069094822
+       .long   3221225472
+       .long   3158189848
+       .long   1118107366
+       .long   1064187139
+       .long   0
+       .long   3220176896
+       .long   177906713
+       .long   1068889808
+       .long   3221225472
+       .long   3159310370
+       .long   4269262315
+       .long   1063662162
+       .long   0
+       .long   3220176896
+       .long   2462980598
+       .long   1068684576
+       .long   2684354560
+       .long   3158941832
+       .long   3810305407
+       .long   1063179572
+       .long   0
+       .long   3220176896
+       .long   2046304480
+       .long   1068459374
+       .long   3758096384
+       .long   3156402667
+       .long   220529721
+       .long   1062452281
+       .long   0
+       .long   3220176896
+       .long   4044216340
+       .long   1068048229
+       .long   0
+       .long   3156808381
+       .long   69373323
+       .long   1061565504
+       .long   0
+       .long   3220176896
+       .long   1972655565
+       .long   1067636837
+       .long   1073741824
+       .long   1009157878
+       .long   3650591271
+       .long   1060355323
+       .long   0
+       .long   3220176896
+       .long   4154680958
+       .long   1067000149
+       .long   0
+       .long   3153796451
+       .long   2376373521
+       .long   1058258220
+       .long   0
+       .long   3220176896
+       .long   4242458500
+       .long   1065951697
+       .long   2684354560
+       .long   1009354638
+       .long   0
+       .long   0
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2376373521
+       .long   1058258220
+       .long   0
+       .long   3220176896
+       .long   4242458500
+       .long   3213435345
+       .long   2684354560
+       .long   3156838286
+       .long   3650591271
+       .long   1060355323
+       .long   0
+       .long   3220176896
+       .long   4154680958
+       .long   3214483797
+       .long   0
+       .long   1006312803
+       .long   69373323
+       .long   1061565504
+       .long   0
+       .long   3220176896
+       .long   1972655565
+       .long   3215120485
+       .long   1073741824
+       .long   3156641526
+       .long   220529721
+       .long   1062452281
+       .long   0
+       .long   3220176896
+       .long   4044216340
+       .long   3215531877
+       .long   0
+       .long   1009324733
+       .long   3810305407
+       .long   1063179572
+       .long   0
+       .long   3220176896
+       .long   2046304480
+       .long   3215943022
+       .long   3758096384
+       .long   1008919019
+       .long   4269262315
+       .long   1063662162
+       .long   0
+       .long   3220176896
+       .long   2462980598
+       .long   3216168224
+       .long   2684354560
+       .long   1011458184
+       .long   1118107366
+       .long   1064187139
+       .long   0
+       .long   3220176896
+       .long   177906713
+       .long   3216373456
+       .long   3221225472
+       .long   1011826722
+       .long   393047345
+       .long   1064548654
+       .long   0
+       .long   3220176896
+       .long   3156849708
+       .long   3216578470
+       .long   3221225472
+       .long   1010706200
+       .long   1227670166
+       .long   1064891649
+       .long   0
+       .long   3220176896
+       .long   3349070549
+       .long   3216783237
+       .long   3758096384
+       .long   1009054621
+       .long   2402293340
+       .long   1065274823
+       .long   0
+       .long   3220176896
+       .long   1453945614
+       .long   3216987726
+       .long   1610612736
+       .long   3158976260
+       .long   2592747447
+       .long   1065525667
+       .long   0
+       .long   3220176896
+       .long   3470456183
+       .long   3217111536
+       .long   1073741824
+       .long   1013261123
+       .long   1037482584
+       .long   1065757344
+       .long   0
+       .long   3220176896
+       .long   1854824762
+       .long   3217213456
+       .long   2684354560
+       .long   3159437312
+       .long   3451754846
+       .long   1066009014
+       .long   0
+       .long   3220176896
+       .long   2972270170
+       .long   3217315190
+       .long   1073741824
+       .long   1012041122
+       .long   1672287667
+       .long   1066280641
+       .long   0
+       .long   3220176896
+       .long   1149976518
+       .long   3217416724
+       .long   1610612736
+       .long   3160748543
+       .long   2346447124
+       .long   1066486987
+       .long   0
+       .long   3220176896
+       .long   3729833777
+       .long   3217518041
+       .long   3758096384
+       .long   3160528366
+       .long   18115067
+       .long   1066642694
+       .long   0
+       .long   3220176896
+       .long   1013556747
+       .long   3217619128
+       .long   2684354560
+       .long   1013083417
+       .long   2660899430
+       .long   1066808312
+       .long   0
+       .long   3220176896
+       .long   632292433
+       .long   3217719968
+       .long   3758096384
+       .long   1013479685
+       .long   1935888103
+       .long   1066983818
+       .long   0
+       .long   3220176896
+       .long   1786662755
+       .long   3217820546
+       .long   2147483648
+       .long   1008398659
+       .long   288924873
+       .long   1067169185
+       .long   0
+       .long   3220176896
+       .long   3846521617
+       .long   3217920847
+       .long   536870912
+       .long   3160890258
+       .long   2377770267
+       .long   1067364384
+       .long   0
+       .long   3220176896
+       .long   2065784603
+       .long   3218020857
+       .long   3758096384
+       .long   1013198318
+       .long   3250111450
+       .long   1067509877
+       .long   0
+       .long   3220176896
+       .long   238550446
+       .long   3218100152
+       .long   2684354560
+       .long   1006899917
+       .long   2306566604
+       .long   1067617265
+       .long   0
+       .long   3220176896
+       .long   1655830135
+       .long   3218149842
+       .long   0
+       .long   3161990338
+       .long   1913604284
+       .long   1067729523
+       .long   0
+       .long   3220176896
+       .long   1062001470
+       .long   3218199364
+       .long   0
+       .long   1013391572
+       .long   2476548698
+       .long   1067846634
+       .long   0
+       .long   3220176896
+       .long   785751814
+       .long   3218248710
+       .long   2684354560
+       .long   1014354573
+       .long   1261629236
+       .long   1067968581
+       .long   0
+       .long   3220176896
+       .long   3269558610
+       .long   3218297872
+       .long   536870912
+       .long   1014221568
+       .long   997322465
+       .long   1068095345
+       .long   0
+       .long   3220176896
+       .long   2484561409
+       .long   3218346844
+       .long   1073741824
+       .long   3161508220
+       .long   1296295961
+       .long   1068226907
+       .long   0
+       .long   3220176896
+       .long   1115219818
+       .long   3218395618
+       .long   0
+       .long   3160555890
+       .long   2962723252
+       .long   1068363247
+       .long   0
+       .long   3220176896
+       .long   1974149085
+       .long   3218444186
+       .long   3221225472
+       .long   1008664000
+       .long   4002549419
+       .long   1068501644
+       .long   0
+       .long   3220176896
+       .long   3711903686
+       .long   3218492541
+       .long   1073741824
+       .long   3159428395
+       .long   1234824733
+       .long   1068574562
+       .long   0
+       .long   3220176896
+       .long   821708191
+       .long   3218540677
+       .long   3758096384
+       .long   1014254361
+       .long   3996842794
+       .long   1068649836
+       .long   0
+       .long   3220176896
+       .long   824036583
+       .long   3218588585
+       .long   0
+       .long   3155796978
+       .long   2255197647
+       .long   1068727457
+       .long   0
+       .long   3220176896
+       .long   2796464483
+       .long   3218636258
+       .long   3221225472
+       .long   1013394669
+       .long   1638976426
+       .long   1068807412
+       .long   0
+       .long   3220176896
+       .long   1673302999
+       .long   3218683690
+       .long   2147483648
+       .long   3160835121
+       .long   1972483635
+       .long   1068889689
+       .long   0
+       .long   3220176896
+       .long   1135144330
+       .long   3218730873
+       .long   536870912
+       .long   3160857217
+       .long   1577996576
+       .long   1068974276
+       .long   0
+       .long   3220176896
+       .long   728580042
+       .long   3218777800
+       .long   1610612736
+       .long   1014849296
+       .long   1578746984
+       .long   1069061160
+       .long   0
+       .long   3220176896
+       .long   165764288
+       .long   3218824464
+       .long   3221225472
+       .long   3160781666
+       .long   1612193054
+       .long   1069150328
+       .long   0
+       .long   3220176896
+       .long   3623952103
+       .long   3218870857
+       .long   2684354560
+       .long   1014502314
+       .long   4133449816
+       .long   1069241766
+       .long   0
+       .long   3220176896
+       .long   2570175582
+       .long   3218916974
+       .long   1073741824
+       .long   3159786766
+       .long   1539072807
+       .long   1069335462
+       .long   0
+       .long   3220176896
+       .long   1535566729
+       .long   3218962807
+       .long   2147483648
+       .long   3161805036
+       .long   1945768569
+       .long   1069431400
+       .long   0
+       .long   3220176896
+       .long   939980347
+       .long   3219008349
+       .long   0
+       .long   3160280457
+       .long   3429717432
+       .long   1069529566
+       .long   0
+       .long   3220176896
+       .long   1391425750
+       .long   3219053593
+       .long   3221225472
+       .long   1014878455
+       .long   1312926554
+       .long   1069588733
+       .long   0
+       .long   3220176896
+       .long   3690502842
+       .long   3219098532
+       .long   3221225472
+       .long   1009970207
+       .long   1663679671
+       .long   1069640022
+       .long   0
+       .long   3220176896
+       .long   2269920951
+       .long   3219135740
+       .long   3758096384
+       .long   1014188597
+       .long   3952756490
+       .long   1069692402
+       .long   0
+       .long   3220176896
+       .long   2569207790
+       .long   3219157895
+       .long   1073741824
+       .long   1015699969
+       .long   69903290
+       .long   1069745867
+       .long   0
+       .long   3220176896
+       .long   1297975695
+       .long   3219179888
+       .long   3221225472
+       .long   1015600087
+       .long   2678847490
+       .long   1069800406
+       .long   0
+       .long   3220176896
+       .long   1411074851
+       .long   3219201715
+       .long   1610612736
+       .long   1016001083
+       .long   2272832445
+       .long   1069856013
+       .long   0
+       .long   3220176896
+       .long   1675549513
+       .long   3219223373
+       .long   3221225472
+       .long   1015541490
+       .long   1539668340
+       .long   1069912679
+       .long   0
+       .long   3220176896
+       .long   967731400
+       .long   3219244859
+       .long   536870912
+       .long   3163235805
+       .long   2482246777
+       .long   1069970395
+       .long   0
+       .long   3220176896
+       .long   2570316633
+       .long   3219266169
+       .long   1610612736
+       .long   1015261105
+       .long   2129093113
+       .long   1070029153
+       .long   0
+       .long   3220176896
+       .long   1289556703
+       .long   3219287301
+       .long   536870912
+       .long   1015405172
+       .long   1129922991
+       .long   1070088944
+       .long   0
+       .long   3220176896
+       .long   637203434
+       .long   3219308251
+       .long   3221225472
+       .long   1011960193
+       .long   3761365757
+       .long   1070149758
+       .long   0
+       .long   3220176896
+       .long   4242632757
+       .long   3219329015
+       .long   536870912
+       .long   1013906630
+       .long   752919289
+       .long   1070211588
+       .long   0
+       .long   3220176896
+       .long   2969983475
+       .long   3219349592
+       .long   2684354560
+       .long   1015151795
+       .long   3652612115
+       .long   1070274422
+       .long   0
+       .long   3220176896
+       .long   689983673
+       .long   3219369978
+       .long   3758096384
+       .long   3162390053
+       .long   1883353036
+       .long   1070338253
+       .long   0
+       .long   3220176896
+       .long   1397053140
+       .long   3219390169
+       .long   1610612736
+       .long   3162728726
+       .long   1403757309
+       .long   1070403070
+       .long   0
+       .long   3220176896
+       .long   621354454
+       .long   3219410163
+       .long   536870912
+       .long   3160934250
+       .long   3239527685
+       .long   1070468863
+       .long   0
+       .long   3220176896
+       .long   2610628921
+       .long   3219429956
+       .long   1610612736
+       .long   1015185121
+       .long   3489768009
+       .long   1070535623
+       .long   0
+       .long   3220176896
+       .long   3152274921
+       .long   3219449546
+       .long   3758096384
+       .long   3160654483
+       .long   2371640770
+       .long   3218072499
+       .long   0
+       .long   3219128320
+       .long   2460177814
+       .long   3219468930
+       .long   2147483648
+       .long   1014633195
+       .long   2309668539
+       .long   3218003836
+       .long   0
+       .long   3219128320
+       .long   881650848
+       .long   3219488105
+       .long   2147483648
+       .long   1015502624
+       .long   2081278341
+       .long   3217934237
+       .long   0
+       .long   3219128320
+       .long   3194290572
+       .long   3219507067
+       .long   2147483648
+       .long   3162532330
+       .long   3753901657
+       .long   3217863712
+       .long   0
+       .long   3219128320
+       .long   1427975391
+       .long   3219525815
+       .long   1073741824
+       .long   1014124979
+       .long   1403691706
+       .long   3217792273
+       .long   0
+       .long   3219128320
+       .long   636516413
+       .long   3219544345
+       .long   3758096384
+       .long   3163307364
+       .long   2583490354
+       .long   3217719929
+       .long   0
+       .long   3219128320
+       .long   1719614413
+       .long   3219562654
+       .long   0
+       .long   1015799092
+       .long   2546065654
+       .long   3217646692
+       .long   0
+       .long   3219128320
+       .long   1424664751
+       .long   3219580740
+       .long   3221225472
+       .long   1015921667
+       .long   1416934267
+       .long   3217572573
+       .long   0
+       .long   3219128320
+       .long   938475414
+       .long   3219598600
+       .long   0
+       .long   3162559727
+       .long   4187227697
+       .long   3217497582
+       .long   0
+       .long   3219128320
+       .long   1594061409
+       .long   3219616231
+       .long   2147483648
+       .long   3161837518
+       .long   3526603391
+       .long   3217421732
+       .long   0
+       .long   3219128320
+       .long   577417135
+       .long   3219633631
+       .long   2684354560
+       .long   1014035767
+       .long   1250776663
+       .long   3217345034
+       .long   0
+       .long   3219128320
+       .long   3814135665
+       .long   3219650796
+       .long   3221225472
+       .long   1015662808
+       .long   4019165092
+       .long   3217267498
+       .long   0
+       .long   3219128320
+       .long   201299822
+       .long   3219667726
+       .long   3758096384
+       .long   1014428704
+       .long   1852581091
+       .long   3217189138
+       .long   0
+       .long   3219128320
+       .long   263859903
+       .long   3219684416
+       .long   0
+       .long   1015208636
+       .long   2485417816
+       .long   3217109964
+       .long   0
+       .long   3219128320
+       .long   1796544321
+       .long   3219700864
+       .long   536870912
+       .long   1015203297
+       .long   2586490530
+       .long   3217028810
+       .long   0
+       .long   3219128320
+       .long   2750387213
+       .long   3219717068
+       .long   2147483648
+       .long   1013374889
+       .long   1224902090
+       .long   3216867281
+       .long   0
+       .long   3219128320
+       .long   1234330619
+       .long   3219733026
+       .long   2684354560
+       .long   3162756121
+       .long   2285031318
+       .long   3216704197
+       .long   0
+       .long   3219128320
+       .long   4106737474
+       .long   3219748734
+       .long   2684354560
+       .long   1015108729
+       .long   3876290983
+       .long   3216539583
+       .long   0
+       .long   3219128320
+       .long   1207142209
+       .long   3219764192
+       .long   2147483648
+       .long   1015221986
+       .long   802660176
+       .long   3216373465
+       .long   0
+       .long   3219128320
+       .long   4012486548
+       .long   3219779395
+       .long   2684354560
+       .long   3162185212
+       .long   1726519029
+       .long   3216205866
+       .long   0
+       .long   3219128320
+       .long   2688952194
+       .long   3219794343
+       .long   0
+       .long   1014048955
+       .long   3382663878
+       .long   3216036812
+       .long   0
+       .long   3219128320
+       .long   453180130
+       .long   3219809033
+       .long   1073741824
+       .long   1014927633
+       .long   2598800519
+       .long   3215750067
+       .long   0
+       .long   3219128320
+       .long   688824739
+       .long   3219823462
+       .long   3758096384
+       .long   3157915184
+       .long   1038988426
+       .long   3215406294
+       .long   0
+       .long   3219128320
+       .long   2653017361
+       .long   3219837628
+       .long   0
+       .long   1015316414
+       .long   1102361128
+       .long   3215059765
+       .long   0
+       .long   3219128320
+       .long   1477771776
+       .long   3219851530
+       .long   536870912
+       .long   1015621338
+       .long   2880516564
+       .long   3214487049
+       .long   0
+       .long   3219128320
+       .long   1056266002
+       .long   3219865165
+       .long   2684354560
+       .long   1015985848
+       .long   1220541286
+       .long   3213681126
+       .long   0
+       .long   3219128320
+       .long   1159294526
+       .long   3219878531
+       .long   536870912
+       .long   1015793311
+       .long   1279178457
+       .long   3211590791
+       .long   0
+       .long   3219128320
+       .long   1731563730
+       .long   3219891626
+       .long   536870912
+       .long   3163023950
+       .long   31019393
+       .long   1065162441
+       .long   0
+       .long   3219128320
+       .long   2892993834
+       .long   3219904448
+       .long   536870912
+       .long   1015555495
+       .long   3506991783
+       .long   1066548842
+       .long   0
+       .long   3219128320
+       .long   645027145
+       .long   3219916996
+       .long   3221225472
+       .long   3160085887
+       .long   2140183630
+       .long   1067272748
+       .long   0
+       .long   3219128320
+       .long   4051746225
+       .long   3219929266
+       .long   1610612736
+       .long   1014423729
+       .long   600368053
+       .long   1067725893
+       .long   0
+       .long   3219128320
+       .long   881357723
+       .long   3219941259
+       .long   3221225472
+       .long   3161294538
+       .long   913431823
+       .long   1068092555
+       .long   0
+       .long   3219128320
+       .long   557060597
+       .long   3219952971
+       .long   0
+       .long   1012071286
+       .long   1073154251
+       .long   1068461489
+       .long   0
+       .long   3219128320
+       .long   4093443164
+       .long   3219964400
+       .long   536870912
+       .long   3162396513
+       .long   3631910143
+       .long   1068665791
+       .long   0
+       .long   3219128320
+       .long   4097623923
+       .long   3219975546
+       .long   2684354560
+       .long   1012824939
+       .long   1380647130
+       .long   1068852447
+       .long   0
+       .long   3219128320
+       .long   1950234076
+       .long   3219986407
+       .long   536870912
+       .long   1011941850
+       .long   4049357271
+       .long   1069040154
+       .long   0
+       .long   3219128320
+       .long   3511535930
+       .long   3219996980
+       .long   2147483648
+       .long   1015344978
+       .long   1896722595
+       .long   1069228886
+       .long   0
+       .long   3219128320
+       .long   1942611595
+       .long   3220007265
+       .long   3221225472
+       .long   1014926433
+       .long   1699043957
+       .long   1069418613
+       .long   0
+       .long   3219128320
+       .long   3476196678
+       .long   3220017259
+       .long   0
+       .long   3161741286
+       .long   3296146332
+       .long   3216969380
+       .long   0
+       .long   3218079744
+       .long   1647878299
+       .long   3220026962
+       .long   3758096384
+       .long   1014685415
+       .long   3286832763
+       .long   3216777748
+       .long   0
+       .long   3218079744
+       .long   3066872380
+       .long   3220036371
+       .long   3221225472
+       .long   3163044919
+       .long   1962712856
+       .long   3216585207
+       .long   0
+       .long   3218079744
+       .long   1647164971
+       .long   3220045486
+       .long   2147483648
+       .long   1015354602
+       .long   3601629044
+       .long   3216391785
+       .long   0
+       .long   3218079744
+       .long   83265253
+       .long   3220054305
+       .long   1610612736
+       .long   1015026887
+       .long   165911977
+       .long   3216197513
+       .long   0
+       .long   3218079744
+       .long   1261158782
+       .long   3220062826
+       .long   2147483648
+       .long   3163195192
+       .long   1348311045
+       .long   3216002418
+       .long   0
+       .long   3218079744
+       .long   3964199186
+       .long   3220071048
+       .long   3758096384
+       .long   1013017430
+       .long   386665102
+       .long   3215630470
+       .long   0
+       .long   3218079744
+       .long   2873938189
+       .long   3220078971
+       .long   1610612736
+       .long   1014827774
+       .long   1991047213
+       .long   3215237169
+       .long   0
+       .long   3218079744
+       .long   1455828442
+       .long   3220086593
+       .long   3758096384
+       .long   3162988721
+       .long   4107121629
+       .long   3214750787
+       .long   0
+       .long   3218079744
+       .long   3370060660
+       .long   3220093912
+       .long   1610612736
+       .long   3162270860
+       .long   723478390
+       .long   3213958438
+       .long   0
+       .long   3218079744
+       .long   3882371427
+       .long   3220100928
+       .long   2147483648
+       .long   3162407623
+       .long   2382326656
+       .long   3212045827
+       .long   0
+       .long   3218079744
+       .long   2749658050
+       .long   3220107640
+       .long   1610612736
+       .long   3162910986
+       .long   2614369450
+       .long   1065140432
+       .long   0
+       .long   3218079744
+       .long   4220661975
+       .long   3220114046
+       .long   3221225472
+       .long   3161795706
+       .long   3587565429
+       .long   1066624384
+       .long   0
+       .long   3218079744
+       .long   4151720666
+       .long   3220120146
+       .long   0
+       .long   1015155896
+       .long   2886567144
+       .long   1067426796
+       .long   0
+       .long   3218079744
+       .long   2892293513
+       .long   3220125939
+       .long   2684354560
+       .long   1014856623
+       .long   1765797566
+       .long   1067840895
+       .long   0
+       .long   3218079744
+       .long   990588717
+       .long   3220131424
+       .long   3758096384
+       .long   1014558209
+       .long   240740309
+       .long   1068244255
+       .long   0
+       .long   3218079744
+       .long   3489094832
+       .long   3220136599
+       .long   536870912
+       .long   3161809431
+       .long   2034433221
+       .long   3215832935
+       .long   0
+       .long   3217031168
+       .long   2745245815
+       .long   3220141465
+       .long   3221225472
+       .long   3163049777
+       .long   304938777
+       .long   3215427665
+       .long   0
+       .long   3217031168
+       .long   4201728937
+       .long   3220146020
+       .long   1610612736
+       .long   3162157654
+       .long   3299146087
+       .long   3215021530
+       .long   0
+       .long   3217031168
+       .long   617154971
+       .long   3220150265
+       .long   3758096384
+       .long   1015950048
+       .long   1953696209
+       .long   3214295171
+       .long   0
+       .long   3217031168
+       .long   2131272983
+       .long   3220154197
+       .long   3221225472
+       .long   1015521448
+       .long   3987691371
+       .long   3213074188
+       .long   0
+       .long   3217031168
+       .long   1905645377
+       .long   3220157817
+       .long   1610612736
+       .long   3161571244
+       .long   718380601
+       .long   1063597621
+       .long   0
+       .long   3217031168
+       .long   1893834707
+       .long   3220161124
+       .long   1610612736
+       .long   3162631302
+       .long   3272206680
+       .long   1066288081
+       .long   0
+       .long   3217031168
+       .long   4251821691
+       .long   3220164117
+       .long   2147483648
+       .long   1014357359
+       .long   257503056
+       .long   1067164005
+       .long   0
+       .long   3217031168
+       .long   2748392742
+       .long   3220166797
+       .long   536870912
+       .long   1015578102
+       .long   711626851
+       .long   3214400320
+       .long   0
+       .long   3215982592
+       .long   4240268041
+       .long   3220169162
+       .long   536870912
+       .long   3161072611
+       .long   2523975598
+       .long   3213273348
+       .long   0
+       .long   3215982592
+       .long   2902558778
+       .long   3220171213
+       .long   3221225472
+       .long   3160744428
+       .long   3237733378
+       .long   1062425136
+       .long   0
+       .long   3215982592
+       .long   1703834029
+       .long   3220172949
+       .long   3758096384
+       .long   3162512012
+       .long   1003003824
+       .long   1066107496
+       .long   0
+       .long   3215982592
+       .long   3816385918
+       .long   3220174369
+       .long   536870912
+       .long   1013733308
+       .long   2896342633
+       .long   3212231467
+       .long   0
+       .long   3214934016
+       .long   4026464093
+       .long   3220175474
+       .long   3221225472
+       .long   1015592141
+       .long   561145352
+       .long   1065056936
+       .long   0
+       .long   3214934016
+       .long   1619315981
+       .long   3220176264
+       .long   1073741824
+       .long   1015100749
+       .long   210035182
+       .long   1064007864
+       .long   0
+       .long   3213885440
+       .long   379294427
+       .long   3220176738
+       .long   3221225472
+       .long   3162889635
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3220176896
+       .long   0
+       .long   0
+       .long   210035182
+       .long   3211491512
+       .long   0
+       .long   1066401792
+       .long   379294427
+       .long   3220176738
+       .long   3221225472
+       .long   3162889635
+       .long   561145352
+       .long   3212540584
+       .long   0
+       .long   1067450368
+       .long   1619315981
+       .long   3220176264
+       .long   1073741824
+       .long   1015100749
+       .long   2896342633
+       .long   1064747819
+       .long   0
+       .long   1067450368
+       .long   4026464093
+       .long   3220175474
+       .long   3221225472
+       .long   1015592141
+       .long   1003003824
+       .long   3213591144
+       .long   0
+       .long   1068498944
+       .long   3816385918
+       .long   3220174369
+       .long   536870912
+       .long   1013733308
+       .long   3237733378
+       .long   3209908784
+       .long   0
+       .long   1068498944
+       .long   1703834029
+       .long   3220172949
+       .long   3758096384
+       .long   3162512012
+       .long   2523975598
+       .long   1065789700
+       .long   0
+       .long   1068498944
+       .long   2902558778
+       .long   3220171213
+       .long   3221225472
+       .long   3160744428
+       .long   711626851
+       .long   1066916672
+       .long   0
+       .long   1068498944
+       .long   4240268041
+       .long   3220169162
+       .long   536870912
+       .long   3161072611
+       .long   257503056
+       .long   3214647653
+       .long   0
+       .long   1069547520
+       .long   2748392742
+       .long   3220166797
+       .long   536870912
+       .long   1015578102
+       .long   3272206680
+       .long   3213771729
+       .long   0
+       .long   1069547520
+       .long   4251821691
+       .long   3220164117
+       .long   2147483648
+       .long   1014357359
+       .long   718380601
+       .long   3211081269
+       .long   0
+       .long   1069547520
+       .long   1893834707
+       .long   3220161124
+       .long   1610612736
+       .long   3162631302
+       .long   3987691371
+       .long   1065590540
+       .long   0
+       .long   1069547520
+       .long   1905645377
+       .long   3220157817
+       .long   1610612736
+       .long   3161571244
+       .long   1953696209
+       .long   1066811523
+       .long   0
+       .long   1069547520
+       .long   2131272983
+       .long   3220154197
+       .long   3221225472
+       .long   1015521448
+       .long   3299146087
+       .long   1067537882
+       .long   0
+       .long   1069547520
+       .long   617154971
+       .long   3220150265
+       .long   3758096384
+       .long   1015950048
+       .long   304938777
+       .long   1067944017
+       .long   0
+       .long   1069547520
+       .long   4201728937
+       .long   3220146020
+       .long   1610612736
+       .long   3162157654
+       .long   2034433221
+       .long   1068349287
+       .long   0
+       .long   1069547520
+       .long   2745245815
+       .long   3220141465
+       .long   3221225472
+       .long   3163049777
+       .long   240740309
+       .long   3215727903
+       .long   0
+       .long   1070596096
+       .long   3489094832
+       .long   3220136599
+       .long   536870912
+       .long   3161809431
+       .long   1765797566
+       .long   3215324543
+       .long   0
+       .long   1070596096
+       .long   990588717
+       .long   3220131424
+       .long   3758096384
+       .long   1014558209
+       .long   2886567144
+       .long   3214910444
+       .long   0
+       .long   1070596096
+       .long   2892293513
+       .long   3220125939
+       .long   2684354560
+       .long   1014856623
+       .long   3587565429
+       .long   3214108032
+       .long   0
+       .long   1070596096
+       .long   4151720666
+       .long   3220120146
+       .long   0
+       .long   1015155896
+       .long   2614369450
+       .long   3212624080
+       .long   0
+       .long   1070596096
+       .long   4220661975
+       .long   3220114046
+       .long   3221225472
+       .long   3161795706
+       .long   2382326656
+       .long   1064562179
+       .long   0
+       .long   1070596096
+       .long   2749658050
+       .long   3220107640
+       .long   1610612736
+       .long   3162910986
+       .long   723478390
+       .long   1066474790
+       .long   0
+       .long   1070596096
+       .long   3882371427
+       .long   3220100928
+       .long   2147483648
+       .long   3162407623
+       .long   4107121629
+       .long   1067267139
+       .long   0
+       .long   1070596096
+       .long   3370060660
+       .long   3220093912
+       .long   1610612736
+       .long   3162270860
+       .long   1991047213
+       .long   1067753521
+       .long   0
+       .long   1070596096
+       .long   1455828442
+       .long   3220086593
+       .long   3758096384
+       .long   3162988721
+       .long   386665102
+       .long   1068146822
+       .long   0
+       .long   1070596096
+       .long   2873938189
+       .long   3220078971
+       .long   1610612736
+       .long   1014827774
+       .long   1348311045
+       .long   1068518770
+       .long   0
+       .long   1070596096
+       .long   3964199186
+       .long   3220071048
+       .long   3758096384
+       .long   1013017430
+       .long   165911977
+       .long   1068713865
+       .long   0
+       .long   1070596096
+       .long   1261158782
+       .long   3220062826
+       .long   2147483648
+       .long   3163195192
+       .long   3601629044
+       .long   1068908137
+       .long   0
+       .long   1070596096
+       .long   83265253
+       .long   3220054305
+       .long   1610612736
+       .long   1015026887
+       .long   1962712856
+       .long   1069101559
+       .long   0
+       .long   1070596096
+       .long   1647164971
+       .long   3220045486
+       .long   2147483648
+       .long   1015354602
+       .long   3286832763
+       .long   1069294100
+       .long   0
+       .long   1070596096
+       .long   3066872380
+       .long   3220036371
+       .long   3221225472
+       .long   3163044919
+       .long   3296146332
+       .long   1069485732
+       .long   0
+       .long   1070596096
+       .long   1647878299
+       .long   3220026962
+       .long   3758096384
+       .long   1014685415
+       .long   1699043957
+       .long   3216902261
+       .long   0
+       .long   1071644672
+       .long   3476196678
+       .long   3220017259
+       .long   0
+       .long   3161741286
+       .long   1896722595
+       .long   3216712534
+       .long   0
+       .long   1071644672
+       .long   1942611595
+       .long   3220007265
+       .long   3221225472
+       .long   1014926433
+       .long   4049357271
+       .long   3216523802
+       .long   0
+       .long   1071644672
+       .long   3511535930
+       .long   3219996980
+       .long   2147483648
+       .long   1015344978
+       .long   1380647130
+       .long   3216336095
+       .long   0
+       .long   1071644672
+       .long   1950234076
+       .long   3219986407
+       .long   536870912
+       .long   1011941850
+       .long   3631910143
+       .long   3216149439
+       .long   0
+       .long   1071644672
+       .long   4097623923
+       .long   3219975546
+       .long   2684354560
+       .long   1012824939
+       .long   1073154251
+       .long   3215945137
+       .long   0
+       .long   1071644672
+       .long   4093443164
+       .long   3219964400
+       .long   536870912
+       .long   3162396513
+       .long   913431823
+       .long   3215576203
+       .long   0
+       .long   1071644672
+       .long   557060597
+       .long   3219952971
+       .long   0
+       .long   1012071286
+       .long   600368053
+       .long   3215209541
+       .long   0
+       .long   1071644672
+       .long   881357723
+       .long   3219941259
+       .long   3221225472
+       .long   3161294538
+       .long   2140183630
+       .long   3214756396
+       .long   0
+       .long   1071644672
+       .long   4051746225
+       .long   3219929266
+       .long   1610612736
+       .long   1014423729
+       .long   3506991783
+       .long   3214032490
+       .long   0
+       .long   1071644672
+       .long   645027145
+       .long   3219916996
+       .long   3221225472
+       .long   3160085887
+       .long   31019393
+       .long   3212646089
+       .long   0
+       .long   1071644672
+       .long   2892993834
+       .long   3219904448
+       .long   536870912
+       .long   1015555495
+       .long   1279178457
+       .long   1064107143
+       .long   0
+       .long   1071644672
+       .long   1731563730
+       .long   3219891626
+       .long   536870912
+       .long   3163023950
+       .long   1220541286
+       .long   1066197478
+       .long   0
+       .long   1071644672
+       .long   1159294526
+       .long   3219878531
+       .long   536870912
+       .long   1015793311
+       .long   2880516564
+       .long   1067003401
+       .long   0
+       .long   1071644672
+       .long   1056266002
+       .long   3219865165
+       .long   2684354560
+       .long   1015985848
+       .long   1102361128
+       .long   1067576117
+       .long   0
+       .long   1071644672
+       .long   1477771776
+       .long   3219851530
+       .long   536870912
+       .long   1015621338
+       .long   1038988426
+       .long   1067922646
+       .long   0
+       .long   1071644672
+       .long   2653017361
+       .long   3219837628
+       .long   0
+       .long   1015316414
+       .long   2598800519
+       .long   1068266419
+       .long   0
+       .long   1071644672
+       .long   688824739
+       .long   3219823462
+       .long   3758096384
+       .long   3157915184
+       .long   3382663878
+       .long   1068553164
+       .long   0
+       .long   1071644672
+       .long   453180130
+       .long   3219809033
+       .long   1073741824
+       .long   1014927633
+       .long   1726519029
+       .long   1068722218
+       .long   0
+       .long   1071644672
+       .long   2688952194
+       .long   3219794343
+       .long   0
+       .long   1014048955
+       .long   802660176
+       .long   1068889817
+       .long   0
+       .long   1071644672
+       .long   4012486548
+       .long   3219779395
+       .long   2684354560
+       .long   3162185212
+       .long   3876290983
+       .long   1069055935
+       .long   0
+       .long   1071644672
+       .long   1207142209
+       .long   3219764192
+       .long   2147483648
+       .long   1015221986
+       .long   2285031318
+       .long   1069220549
+       .long   0
+       .long   1071644672
+       .long   4106737474
+       .long   3219748734
+       .long   2684354560
+       .long   1015108729
+       .long   1224902090
+       .long   1069383633
+       .long   0
+       .long   1071644672
+       .long   1234330619
+       .long   3219733026
+       .long   2684354560
+       .long   3162756121
+       .long   2586490530
+       .long   1069545162
+       .long   0
+       .long   1071644672
+       .long   2750387213
+       .long   3219717068
+       .long   2147483648
+       .long   1013374889
+       .long   2485417816
+       .long   1069626316
+       .long   0
+       .long   1071644672
+       .long   1796544321
+       .long   3219700864
+       .long   536870912
+       .long   1015203297
+       .long   1852581091
+       .long   1069705490
+       .long   0
+       .long   1071644672
+       .long   263859903
+       .long   3219684416
+       .long   0
+       .long   1015208636
+       .long   4019165092
+       .long   1069783850
+       .long   0
+       .long   1071644672
+       .long   201299822
+       .long   3219667726
+       .long   3758096384
+       .long   1014428704
+       .long   1250776663
+       .long   1069861386
+       .long   0
+       .long   1071644672
+       .long   3814135665
+       .long   3219650796
+       .long   3221225472
+       .long   1015662808
+       .long   3526603391
+       .long   1069938084
+       .long   0
+       .long   1071644672
+       .long   577417135
+       .long   3219633631
+       .long   2684354560
+       .long   1014035767
+       .long   4187227697
+       .long   1070013934
+       .long   0
+       .long   1071644672
+       .long   1594061409
+       .long   3219616231
+       .long   2147483648
+       .long   3161837518
+       .long   1416934267
+       .long   1070088925
+       .long   0
+       .long   1071644672
+       .long   938475414
+       .long   3219598600
+       .long   0
+       .long   3162559727
+       .long   2546065654
+       .long   1070163044
+       .long   0
+       .long   1071644672
+       .long   1424664751
+       .long   3219580740
+       .long   3221225472
+       .long   1015921667
+       .long   2583490354
+       .long   1070236281
+       .long   0
+       .long   1071644672
+       .long   1719614413
+       .long   3219562654
+       .long   0
+       .long   1015799092
+       .long   1403691706
+       .long   1070308625
+       .long   0
+       .long   1071644672
+       .long   636516413
+       .long   3219544345
+       .long   3758096384
+       .long   3163307364
+       .long   3753901657
+       .long   1070380064
+       .long   0
+       .long   1071644672
+       .long   1427975391
+       .long   3219525815
+       .long   1073741824
+       .long   1014124979
+       .long   2081278341
+       .long   1070450589
+       .long   0
+       .long   1071644672
+       .long   3194290572
+       .long   3219507067
+       .long   2147483648
+       .long   3162532330
+       .long   2309668539
+       .long   1070520188
+       .long   0
+       .long   1071644672
+       .long   881650848
+       .long   3219488105
+       .long   2147483648
+       .long   1015502624
+       .long   2371640770
+       .long   1070588851
+       .long   0
+       .long   1071644672
+       .long   2460177814
+       .long   3219468930
+       .long   2147483648
+       .long   1014633195
+       .long   3489768009
+       .long   3218019271
+       .long   0
+       .long   1072693248
+       .long   3152274921
+       .long   3219449546
+       .long   3758096384
+       .long   3160654483
+       .long   3239527685
+       .long   3217952511
+       .long   0
+       .long   1072693248
+       .long   2610628921
+       .long   3219429956
+       .long   1610612736
+       .long   1015185121
+       .long   1403757309
+       .long   3217886718
+       .long   0
+       .long   1072693248
+       .long   621354454
+       .long   3219410163
+       .long   536870912
+       .long   3160934250
+       .long   1883353036
+       .long   3217821901
+       .long   0
+       .long   1072693248
+       .long   1397053140
+       .long   3219390169
+       .long   1610612736
+       .long   3162728726
+       .long   3652612115
+       .long   3217758070
+       .long   0
+       .long   1072693248
+       .long   689983673
+       .long   3219369978
+       .long   3758096384
+       .long   3162390053
+       .long   752919289
+       .long   3217695236
+       .long   0
+       .long   1072693248
+       .long   2969983475
+       .long   3219349592
+       .long   2684354560
+       .long   1015151795
+       .long   3761365757
+       .long   3217633406
+       .long   0
+       .long   1072693248
+       .long   4242632757
+       .long   3219329015
+       .long   536870912
+       .long   1013906630
+       .long   1129922991
+       .long   3217572592
+       .long   0
+       .long   1072693248
+       .long   637203434
+       .long   3219308251
+       .long   3221225472
+       .long   1011960193
+       .long   2129093113
+       .long   3217512801
+       .long   0
+       .long   1072693248
+       .long   1289556703
+       .long   3219287301
+       .long   536870912
+       .long   1015405172
+       .long   2482246777
+       .long   3217454043
+       .long   0
+       .long   1072693248
+       .long   2570316633
+       .long   3219266169
+       .long   1610612736
+       .long   1015261105
+       .long   1539668340
+       .long   3217396327
+       .long   0
+       .long   1072693248
+       .long   967731400
+       .long   3219244859
+       .long   536870912
+       .long   3163235805
+       .long   2272832445
+       .long   3217339661
+       .long   0
+       .long   1072693248
+       .long   1675549513
+       .long   3219223373
+       .long   3221225472
+       .long   1015541490
+       .long   2678847490
+       .long   3217284054
+       .long   0
+       .long   1072693248
+       .long   1411074851
+       .long   3219201715
+       .long   1610612736
+       .long   1016001083
+       .long   69903290
+       .long   3217229515
+       .long   0
+       .long   1072693248
+       .long   1297975695
+       .long   3219179888
+       .long   3221225472
+       .long   1015600087
+       .long   3952756490
+       .long   3217176050
+       .long   0
+       .long   1072693248
+       .long   2569207790
+       .long   3219157895
+       .long   1073741824
+       .long   1015699969
+       .long   1663679671
+       .long   3217123670
+       .long   0
+       .long   1072693248
+       .long   2269920951
+       .long   3219135740
+       .long   3758096384
+       .long   1014188597
+       .long   1312926554
+       .long   3217072381
+       .long   0
+       .long   1072693248
+       .long   3690502842
+       .long   3219098532
+       .long   3221225472
+       .long   1009970207
+       .long   3429717432
+       .long   3217013214
+       .long   0
+       .long   1072693248
+       .long   1391425750
+       .long   3219053593
+       .long   3221225472
+       .long   1014878455
+       .long   1945768569
+       .long   3216915048
+       .long   0
+       .long   1072693248
+       .long   939980347
+       .long   3219008349
+       .long   0
+       .long   3160280457
+       .long   1539072807
+       .long   3216819110
+       .long   0
+       .long   1072693248
+       .long   1535566729
+       .long   3218962807
+       .long   2147483648
+       .long   3161805036
+       .long   4133449816
+       .long   3216725414
+       .long   0
+       .long   1072693248
+       .long   2570175582
+       .long   3218916974
+       .long   1073741824
+       .long   3159786766
+       .long   1612193054
+       .long   3216633976
+       .long   0
+       .long   1072693248
+       .long   3623952103
+       .long   3218870857
+       .long   2684354560
+       .long   1014502314
+       .long   1578746984
+       .long   3216544808
+       .long   0
+       .long   1072693248
+       .long   165764288
+       .long   3218824464
+       .long   3221225472
+       .long   3160781666
+       .long   1577996576
+       .long   3216457924
+       .long   0
+       .long   1072693248
+       .long   728580042
+       .long   3218777800
+       .long   1610612736
+       .long   1014849296
+       .long   1972483635
+       .long   3216373337
+       .long   0
+       .long   1072693248
+       .long   1135144330
+       .long   3218730873
+       .long   536870912
+       .long   3160857217
+       .long   1638976426
+       .long   3216291060
+       .long   0
+       .long   1072693248
+       .long   1673302999
+       .long   3218683690
+       .long   2147483648
+       .long   3160835121
+       .long   2255197647
+       .long   3216211105
+       .long   0
+       .long   1072693248
+       .long   2796464483
+       .long   3218636258
+       .long   3221225472
+       .long   1013394669
+       .long   3996842794
+       .long   3216133484
+       .long   0
+       .long   1072693248
+       .long   824036583
+       .long   3218588585
+       .long   0
+       .long   3155796978
+       .long   1234824733
+       .long   3216058210
+       .long   0
+       .long   1072693248
+       .long   821708191
+       .long   3218540677
+       .long   3758096384
+       .long   1014254361
+       .long   4002549419
+       .long   3215985292
+       .long   0
+       .long   1072693248
+       .long   3711903686
+       .long   3218492541
+       .long   1073741824
+       .long   3159428395
+       .long   2962723252
+       .long   3215846895
+       .long   0
+       .long   1072693248
+       .long   1974149085
+       .long   3218444186
+       .long   3221225472
+       .long   1008664000
+       .long   1296295961
+       .long   3215710555
+       .long   0
+       .long   1072693248
+       .long   1115219818
+       .long   3218395618
+       .long   0
+       .long   3160555890
+       .long   997322465
+       .long   3215578993
+       .long   0
+       .long   1072693248
+       .long   2484561409
+       .long   3218346844
+       .long   1073741824
+       .long   3161508220
+       .long   1261629236
+       .long   3215452229
+       .long   0
+       .long   1072693248
+       .long   3269558610
+       .long   3218297872
+       .long   536870912
+       .long   1014221568
+       .long   2476548698
+       .long   3215330282
+       .long   0
+       .long   1072693248
+       .long   785751814
+       .long   3218248710
+       .long   2684354560
+       .long   1014354573
+       .long   1913604284
+       .long   3215213171
+       .long   0
+       .long   1072693248
+       .long   1062001470
+       .long   3218199364
+       .long   0
+       .long   1013391572
+       .long   2306566604
+       .long   3215100913
+       .long   0
+       .long   1072693248
+       .long   1655830135
+       .long   3218149842
+       .long   0
+       .long   3161990338
+       .long   3250111450
+       .long   3214993525
+       .long   0
+       .long   1072693248
+       .long   238550446
+       .long   3218100152
+       .long   2684354560
+       .long   1006899917
+       .long   2377770267
+       .long   3214848032
+       .long   0
+       .long   1072693248
+       .long   2065784603
+       .long   3218020857
+       .long   3758096384
+       .long   1013198318
+       .long   288924873
+       .long   3214652833
+       .long   0
+       .long   1072693248
+       .long   3846521617
+       .long   3217920847
+       .long   536870912
+       .long   3160890258
+       .long   1935888103
+       .long   3214467466
+       .long   0
+       .long   1072693248
+       .long   1786662755
+       .long   3217820546
+       .long   2147483648
+       .long   1008398659
+       .long   2660899430
+       .long   3214291960
+       .long   0
+       .long   1072693248
+       .long   632292433
+       .long   3217719968
+       .long   3758096384
+       .long   1013479685
+       .long   18115067
+       .long   3214126342
+       .long   0
+       .long   1072693248
+       .long   1013556747
+       .long   3217619128
+       .long   2684354560
+       .long   1013083417
+       .long   2346447124
+       .long   3213970635
+       .long   0
+       .long   1072693248
+       .long   3729833777
+       .long   3217518041
+       .long   3758096384
+       .long   3160528366
+       .long   1672287667
+       .long   3213764289
+       .long   0
+       .long   1072693248
+       .long   1149976518
+       .long   3217416724
+       .long   1610612736
+       .long   3160748543
+       .long   3451754846
+       .long   3213492662
+       .long   0
+       .long   1072693248
+       .long   2972270170
+       .long   3217315190
+       .long   1073741824
+       .long   1012041122
+       .long   1037482584
+       .long   3213240992
+       .long   0
+       .long   1072693248
+       .long   1854824762
+       .long   3217213456
+       .long   2684354560
+       .long   3159437312
+       .long   2592747447
+       .long   3213009315
+       .long   0
+       .long   1072693248
+       .long   3470456183
+       .long   3217111536
+       .long   1073741824
+       .long   1013261123
+       .long   2402293340
+       .long   3212758471
+       .long   0
+       .long   1072693248
+       .long   1453945614
+       .long   3216987726
+       .long   1610612736
+       .long   3158976260
+       .long   1227670166
+       .long   3212375297
+       .long   0
+       .long   1072693248
+       .long   3349070549
+       .long   3216783237
+       .long   3758096384
+       .long   1009054621
+       .long   393047345
+       .long   3212032302
+       .long   0
+       .long   1072693248
+       .long   3156849708
+       .long   3216578470
+       .long   3221225472
+       .long   1010706200
+       .long   1118107366
+       .long   3211670787
+       .long   0
+       .long   1072693248
+       .long   177906713
+       .long   3216373456
+       .long   3221225472
+       .long   1011826722
+       .long   4269262315
+       .long   3211145810
+       .long   0
+       .long   1072693248
+       .long   2462980598
+       .long   3216168224
+       .long   2684354560
+       .long   1011458184
+       .long   3810305407
+       .long   3210663220
+       .long   0
+       .long   1072693248
+       .long   2046304480
+       .long   3215943022
+       .long   3758096384
+       .long   1008919019
+       .long   220529721
+       .long   3209935929
+       .long   0
+       .long   1072693248
+       .long   4044216340
+       .long   3215531877
+       .long   0
+       .long   1009324733
+       .long   69373323
+       .long   3209049152
+       .long   0
+       .long   1072693248
+       .long   1972655565
+       .long   3215120485
+       .long   1073741824
+       .long   3156641526
+       .long   3650591271
+       .long   3207838971
+       .long   0
+       .long   1072693248
+       .long   4154680958
+       .long   3214483797
+       .long   0
+       .long   1006312803
+       .long   2376373521
+       .long   3205741868
+       .long   0
+       .long   1072693248
+       .long   4242458500
+       .long   3213435345
+       .long   2684354560
+       .long   3156838286
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   239972940
+       .long   1089470464
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   1431651400
+       .long   3217380693
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   2880656668
+       .long   1065423119
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   0
+       .long   3219128320
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   1431653583
+       .long   1067799893
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .long   2976101079
+       .long   3210133866
+       .type   __svml_dsin_data_internal_ha,@object
+       .size   __svml_dsin_data_internal_ha,17280
+       .align 64
+__svml_dsin_reduction_data_internal:
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   5
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   10
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   20
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   40
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   81
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   162
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   325
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   651
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1303
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2607
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   5215
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   10430
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   20860
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   41721
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   83443
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   166886
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   333772
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   667544
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1335088
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2670176
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   5340353
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   10680707
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   21361414
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   42722829
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   85445659
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   170891318
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   341782637
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   683565275
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1367130551
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2734261102
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1173554908
+       .long   1
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2347109817
+       .long   2
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   399252338
+       .long   5
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   798504676
+       .long   10
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1597009353
+       .long   20
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3194018707
+       .long   40
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2093070119
+       .long   81
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4186140238
+       .long   162
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4077313180
+       .long   325
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3859659065
+       .long   651
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3424350834
+       .long   1303
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2553734372
+       .long   2607
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   812501448
+       .long   5215
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1625002897
+       .long   10430
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3250005794
+       .long   20860
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2205044292
+       .long   41721
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   115121288
+       .long   83443
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   230242576
+       .long   166886
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   460485152
+       .long   333772
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   920970305
+       .long   667544
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1841940610
+       .long   1335088
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3683881221
+       .long   2670176
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3072795146
+       .long   5340353
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1850622997
+       .long   10680707
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3701245994
+       .long   21361414
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3107524692
+       .long   42722829
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1920082089
+       .long   85445659
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3840164178
+       .long   170891318
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3385361061
+       .long   341782637
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2475754826
+       .long   683565275
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   656542356
+       .long   1367130551
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1313084713
+       .long   2734261102
+       .long   0
+       .long   0
+       .long   1
+       .long   0
+       .long   2626169427
+       .long   1173554908
+       .long   0
+       .long   0
+       .long   2
+       .long   0
+       .long   957371559
+       .long   2347109817
+       .long   0
+       .long   0
+       .long   5
+       .long   0
+       .long   1914743119
+       .long   399252338
+       .long   0
+       .long   0
+       .long   10
+       .long   0
+       .long   3829486239
+       .long   798504676
+       .long   0
+       .long   0
+       .long   20
+       .long   0
+       .long   3364005183
+       .long   1597009353
+       .long   0
+       .long   0
+       .long   40
+       .long   0
+       .long   2433043071
+       .long   3194018707
+       .long   0
+       .long   0
+       .long   81
+       .long   0
+       .long   571118846
+       .long   2093070119
+       .long   0
+       .long   0
+       .long   162
+       .long   0
+       .long   1142237692
+       .long   4186140238
+       .long   0
+       .long   0
+       .long   325
+       .long   0
+       .long   2284475384
+       .long   4077313180
+       .long   0
+       .long   0
+       .long   651
+       .long   0
+       .long   273983472
+       .long   3859659065
+       .long   0
+       .long   0
+       .long   1303
+       .long   0
+       .long   547966945
+       .long   3424350834
+       .long   0
+       .long   0
+       .long   2607
+       .long   0
+       .long   1095933890
+       .long   2553734372
+       .long   0
+       .long   0
+       .long   5215
+       .long   0
+       .long   2191867780
+       .long   812501448
+       .long   0
+       .long   0
+       .long   10430
+       .long   0
+       .long   88768265
+       .long   1625002897
+       .long   0
+       .long   0
+       .long   20860
+       .long   0
+       .long   177536531
+       .long   3250005794
+       .long   0
+       .long   0
+       .long   41721
+       .long   0
+       .long   355073063
+       .long   2205044292
+       .long   0
+       .long   0
+       .long   83443
+       .long   0
+       .long   710146126
+       .long   115121288
+       .long   0
+       .long   0
+       .long   166886
+       .long   0
+       .long   1420292253
+       .long   230242576
+       .long   0
+       .long   0
+       .long   333772
+       .long   0
+       .long   2840584506
+       .long   460485152
+       .long   0
+       .long   0
+       .long   667544
+       .long   0
+       .long   1386201717
+       .long   920970305
+       .long   0
+       .long   0
+       .long   1335088
+       .long   0
+       .long   2772403434
+       .long   1841940610
+       .long   0
+       .long   0
+       .long   2670176
+       .long   0
+       .long   1249839573
+       .long   3683881221
+       .long   0
+       .long   0
+       .long   5340353
+       .long   0
+       .long   2499679147
+       .long   3072795146
+       .long   0
+       .long   0
+       .long   10680707
+       .long   0
+       .long   704390999
+       .long   1850622997
+       .long   0
+       .long   0
+       .long   21361414
+       .long   0
+       .long   1408781999
+       .long   3701245994
+       .long   0
+       .long   0
+       .long   42722829
+       .long   0
+       .long   2817563999
+       .long   3107524692
+       .long   0
+       .long   0
+       .long   85445659
+       .long   0
+       .long   1340160702
+       .long   1920082089
+       .long   0
+       .long   0
+       .long   170891318
+       .long   0
+       .long   2680321405
+       .long   3840164178
+       .long   0
+       .long   0
+       .long   341782637
+       .long   0
+       .long   1065675514
+       .long   3385361061
+       .long   0
+       .long   0
+       .long   683565275
+       .long   0
+       .long   2131351028
+       .long   2475754826
+       .long   0
+       .long   0
+       .long   1367130551
+       .long   0
+       .long   4262702056
+       .long   656542356
+       .long   0
+       .long   0
+       .long   2734261102
+       .long   0
+       .long   4230436817
+       .long   1313084713
+       .long   0
+       .long   0
+       .long   1173554908
+       .long   1
+       .long   4165906339
+       .long   2626169427
+       .long   0
+       .long   0
+       .long   2347109817
+       .long   2
+       .long   4036845383
+       .long   957371559
+       .long   0
+       .long   0
+       .long   399252338
+       .long   5
+       .long   3778723471
+       .long   1914743119
+       .long   0
+       .long   0
+       .long   798504676
+       .long   10
+       .long   3262479647
+       .long   3829486239
+       .long   0
+       .long   0
+       .long   1597009353
+       .long   20
+       .long   2229991998
+       .long   3364005183
+       .long   0
+       .long   0
+       .long   3194018707
+       .long   40
+       .long   165016701
+       .long   2433043071
+       .long   0
+       .long   0
+       .long   2093070119
+       .long   81
+       .long   330033402
+       .long   571118846
+       .long   0
+       .long   0
+       .long   4186140238
+       .long   162
+       .long   660066805
+       .long   1142237692
+       .long   0
+       .long   0
+       .long   4077313180
+       .long   325
+       .long   1320133610
+       .long   2284475384
+       .long   0
+       .long   0
+       .long   3859659065
+       .long   651
+       .long   2640267220
+       .long   273983472
+       .long   0
+       .long   0
+       .long   3424350834
+       .long   1303
+       .long   985567145
+       .long   547966945
+       .long   0
+       .long   0
+       .long   2553734372
+       .long   2607
+       .long   1971134291
+       .long   1095933890
+       .long   0
+       .long   0
+       .long   812501448
+       .long   5215
+       .long   3942268582
+       .long   2191867780
+       .long   0
+       .long   0
+       .long   1625002897
+       .long   10430
+       .long   3589569869
+       .long   88768265
+       .long   0
+       .long   0
+       .long   3250005794
+       .long   20860
+       .long   2884172442
+       .long   177536531
+       .long   0
+       .long   0
+       .long   2205044292
+       .long   41721
+       .long   1473377588
+       .long   355073063
+       .long   0
+       .long   0
+       .long   115121288
+       .long   83443
+       .long   2946755177
+       .long   710146126
+       .long   0
+       .long   0
+       .long   230242576
+       .long   166886
+       .long   1598543059
+       .long   1420292253
+       .long   0
+       .long   0
+       .long   460485152
+       .long   333772
+       .long   3197086118
+       .long   2840584506
+       .long   0
+       .long   0
+       .long   920970305
+       .long   667544
+       .long   2099204941
+       .long   1386201717
+       .long   0
+       .long   0
+       .long   1841940610
+       .long   1335088
+       .long   4198409883
+       .long   2772403434
+       .long   0
+       .long   0
+       .long   3683881221
+       .long   2670176
+       .long   4101852471
+       .long   1249839573
+       .long   0
+       .long   0
+       .long   3072795146
+       .long   5340353
+       .long   3908737646
+       .long   2499679147
+       .long   0
+       .long   0
+       .long   1850622997
+       .long   10680707
+       .long   3522507997
+       .long   704390999
+       .long   0
+       .long   0
+       .long   3701245994
+       .long   21361414
+       .long   2750048699
+       .long   1408781999
+       .long   0
+       .long   0
+       .long   3107524692
+       .long   42722829
+       .long   1205130103
+       .long   2817563999
+       .long   0
+       .long   0
+       .long   1920082089
+       .long   85445659
+       .long   2410260206
+       .long   1340160702
+       .long   0
+       .long   0
+       .long   3840164178
+       .long   170891318
+       .long   525553116
+       .long   2680321405
+       .long   0
+       .long   0
+       .long   3385361061
+       .long   341782637
+       .long   1051106232
+       .long   1065675514
+       .long   0
+       .long   0
+       .long   2475754826
+       .long   683565275
+       .long   2102212464
+       .long   2131351028
+       .long   0
+       .long   0
+       .long   656542356
+       .long   1367130551
+       .long   4204424928
+       .long   4262702056
+       .long   0
+       .long   0
+       .long   1313084713
+       .long   2734261102
+       .long   4113882560
+       .long   4230436817
+       .long   1
+       .long   0
+       .long   2626169427
+       .long   1173554908
+       .long   3932797825
+       .long   4165906339
+       .long   2
+       .long   0
+       .long   957371559
+       .long   2347109817
+       .long   3570628355
+       .long   4036845383
+       .long   5
+       .long   0
+       .long   1914743119
+       .long   399252338
+       .long   2846289414
+       .long   3778723471
+       .long   10
+       .long   0
+       .long   3829486239
+       .long   798504676
+       .long   1397611533
+       .long   3262479647
+       .long   20
+       .long   0
+       .long   3364005183
+       .long   1597009353
+       .long   2795223067
+       .long   2229991998
+       .long   40
+       .long   0
+       .long   2433043071
+       .long   3194018707
+       .long   1295478838
+       .long   165016701
+       .long   81
+       .long   0
+       .long   571118846
+       .long   2093070119
+       .long   2590957677
+       .long   330033402
+       .long   162
+       .long   0
+       .long   1142237692
+       .long   4186140238
+       .long   886948059
+       .long   660066805
+       .long   325
+       .long   0
+       .long   2284475384
+       .long   4077313180
+       .long   1773896118
+       .long   1320133610
+       .long   651
+       .long   0
+       .long   273983472
+       .long   3859659065
+       .long   3547792237
+       .long   2640267220
+       .long   1303
+       .long   0
+       .long   547966945
+       .long   3424350834
+       .long   2800617179
+       .long   985567145
+       .long   2607
+       .long   0
+       .long   1095933890
+       .long   2553734372
+       .long   1306267062
+       .long   1971134291
+       .long   5215
+       .long   0
+       .long   2191867780
+       .long   812501448
+       .long   2612534124
+       .long   3942268582
+       .long   10430
+       .long   0
+       .long   88768265
+       .long   1625002897
+       .long   930100952
+       .long   3589569869
+       .long   20860
+       .long   0
+       .long   177536531
+       .long   3250005794
+       .long   1860201905
+       .long   2884172442
+       .long   41721
+       .long   0
+       .long   355073063
+       .long   2205044292
+       .long   3720403810
+       .long   1473377588
+       .long   83443
+       .long   0
+       .long   710146126
+       .long   115121288
+       .long   3145840325
+       .long   2946755177
+       .long   166886
+       .long   0
+       .long   1420292253
+       .long   230242576
+       .long   1996713354
+       .long   1598543059
+       .long   333772
+       .long   0
+       .long   2840584506
+       .long   460485152
+       .long   3993426708
+       .long   3197086118
+       .long   667544
+       .long   0
+       .long   1386201717
+       .long   920970305
+       .long   3691886121
+       .long   2099204941
+       .long   1335088
+       .long   0
+       .long   2772403434
+       .long   1841940610
+       .long   3088804946
+       .long   4198409883
+       .long   2670176
+       .long   0
+       .long   1249839573
+       .long   3683881221
+       .long   1882642597
+       .long   4101852471
+       .long   5340353
+       .long   0
+       .long   2499679147
+       .long   3072795146
+       .long   3765285194
+       .long   3908737646
+       .long   10680707
+       .long   0
+       .long   704390999
+       .long   1850622997
+       .long   3235603093
+       .long   3522507997
+       .long   21361414
+       .long   0
+       .long   1408781999
+       .long   3701245994
+       .long   2176238891
+       .long   2750048699
+       .long   42722829
+       .long   0
+       .long   2817563999
+       .long   3107524692
+       .long   57510486
+       .long   1205130103
+       .long   85445659
+       .long   0
+       .long   1340160702
+       .long   1920082089
+       .long   115020972
+       .long   2410260206
+       .long   170891318
+       .long   0
+       .long   2680321405
+       .long   3840164178
+       .long   230041945
+       .long   525553116
+       .long   341782637
+       .long   0
+       .long   1065675514
+       .long   3385361061
+       .long   460083891
+       .long   1051106232
+       .long   683565275
+       .long   0
+       .long   2131351028
+       .long   2475754826
+       .long   920167782
+       .long   2102212464
+       .long   1367130551
+       .long   0
+       .long   4262702056
+       .long   656542356
+       .long   1840335564
+       .long   4204424928
+       .long   2734261102
+       .long   0
+       .long   4230436817
+       .long   1313084713
+       .long   3680671129
+       .long   4113882560
+       .long   1173554908
+       .long   1
+       .long   4165906339
+       .long   2626169427
+       .long   3066374962
+       .long   3932797825
+       .long   2347109817
+       .long   2
+       .long   4036845383
+       .long   957371559
+       .long   1837782628
+       .long   3570628355
+       .long   399252338
+       .long   5
+       .long   3778723471
+       .long   1914743119
+       .long   3675565257
+       .long   2846289414
+       .long   798504676
+       .long   10
+       .long   3262479647
+       .long   3829486239
+       .long   3056163219
+       .long   1397611533
+       .long   1597009353
+       .long   20
+       .long   2229991998
+       .long   3364005183
+       .long   1817359143
+       .long   2795223067
+       .long   3194018707
+       .long   40
+       .long   165016701
+       .long   2433043071
+       .long   3634718287
+       .long   1295478838
+       .long   2093070119
+       .long   81
+       .long   330033402
+       .long   571118846
+       .long   2974469278
+       .long   2590957677
+       .long   4186140238
+       .long   162
+       .long   660066805
+       .long   1142237692
+       .long   1653971260
+       .long   886948059
+       .long   4077313180
+       .long   325
+       .long   1320133610
+       .long   2284475384
+       .long   3307942520
+       .long   1773896118
+       .long   3859659065
+       .long   651
+       .long   2640267220
+       .long   273983472
+       .long   2320917745
+       .long   3547792237
+       .long   3424350834
+       .long   1303
+       .long   985567145
+       .long   547966945
+       .long   346868194
+       .long   2800617179
+       .long   2553734372
+       .long   2607
+       .long   1971134291
+       .long   1095933890
+       .long   693736388
+       .long   1306267062
+       .long   812501448
+       .long   5215
+       .long   3942268582
+       .long   2191867780
+       .long   1387472776
+       .long   2612534124
+       .long   1625002897
+       .long   10430
+       .long   3589569869
+       .long   88768265
+       .long   2774945552
+       .long   930100952
+       .long   3250005794
+       .long   20860
+       .long   2884172442
+       .long   177536531
+       .long   1254923809
+       .long   1860201905
+       .long   2205044292
+       .long   41721
+       .long   1473377588
+       .long   355073063
+       .long   2509847619
+       .long   3720403810
+       .long   115121288
+       .long   83443
+       .long   2946755177
+       .long   710146126
+       .long   724727943
+       .long   3145840325
+       .long   230242576
+       .long   166886
+       .long   1598543059
+       .long   1420292253
+       .long   1449455886
+       .long   1996713354
+       .long   460485152
+       .long   333772
+       .long   3197086118
+       .long   2840584506
+       .long   2898911772
+       .long   3993426708
+       .long   920970305
+       .long   667544
+       .long   2099204941
+       .long   1386201717
+       .long   1502856249
+       .long   3691886121
+       .long   1841940610
+       .long   1335088
+       .long   4198409883
+       .long   2772403434
+       .long   3005712498
+       .long   3088804946
+       .long   3683881221
+       .long   2670176
+       .long   4101852471
+       .long   1249839573
+       .long   1716457700
+       .long   1882642597
+       .long   3072795146
+       .long   5340353
+       .long   3908737646
+       .long   2499679147
+       .long   3432915400
+       .long   3765285194
+       .long   1850622997
+       .long   10680707
+       .long   3522507997
+       .long   704390999
+       .long   2570863504
+       .long   3235603093
+       .long   3701245994
+       .long   21361414
+       .long   2750048699
+       .long   1408781999
+       .long   846759712
+       .long   2176238891
+       .long   3107524692
+       .long   42722829
+       .long   1205130103
+       .long   2817563999
+       .long   1693519425
+       .long   57510486
+       .long   1920082089
+       .long   85445659
+       .long   2410260206
+       .long   1340160702
+       .long   3387038850
+       .long   115020972
+       .long   3840164178
+       .long   170891318
+       .long   525553116
+       .long   2680321405
+       .long   2479110404
+       .long   230041945
+       .long   3385361061
+       .long   341782637
+       .long   1051106232
+       .long   1065675514
+       .long   663253512
+       .long   460083891
+       .long   2475754826
+       .long   683565275
+       .long   2102212464
+       .long   2131351028
+       .long   1326507024
+       .long   920167782
+       .long   656542356
+       .long   1367130551
+       .long   4204424928
+       .long   4262702056
+       .long   2653014048
+       .long   1840335564
+       .long   1313084713
+       .long   2734261102
+       .long   4113882560
+       .long   4230436817
+       .long   1011060801
+       .long   3680671129
+       .long   2626169427
+       .long   1173554908
+       .long   3932797825
+       .long   4165906339
+       .long   2022121603
+       .long   3066374962
+       .long   957371559
+       .long   2347109817
+       .long   3570628355
+       .long   4036845383
+       .long   4044243207
+       .long   1837782628
+       .long   1914743119
+       .long   399252338
+       .long   2846289414
+       .long   3778723471
+       .long   3793519119
+       .long   3675565257
+       .long   3829486239
+       .long   798504676
+       .long   1397611533
+       .long   3262479647
+       .long   3292070943
+       .long   3056163219
+       .long   3364005183
+       .long   1597009353
+       .long   2795223067
+       .long   2229991998
+       .long   2289174591
+       .long   1817359143
+       .long   2433043071
+       .long   3194018707
+       .long   1295478838
+       .long   165016701
+       .long   283381887
+       .long   3634718287
+       .long   571118846
+       .long   2093070119
+       .long   2590957677
+       .long   330033402
+       .long   566763775
+       .long   2974469278
+       .long   1142237692
+       .long   4186140238
+       .long   886948059
+       .long   660066805
+       .long   1133527550
+       .long   1653971260
+       .long   2284475384
+       .long   4077313180
+       .long   1773896118
+       .long   1320133610
+       .long   2267055100
+       .long   3307942520
+       .long   273983472
+       .long   3859659065
+       .long   3547792237
+       .long   2640267220
+       .long   239142905
+       .long   2320917745
+       .long   547966945
+       .long   3424350834
+       .long   2800617179
+       .long   985567145
+       .long   478285810
+       .long   346868194
+       .long   1095933890
+       .long   2553734372
+       .long   1306267062
+       .long   1971134291
+       .long   956571621
+       .long   693736388
+       .long   2191867780
+       .long   812501448
+       .long   2612534124
+       .long   3942268582
+       .long   1913143242
+       .long   1387472776
+       .long   88768265
+       .long   1625002897
+       .long   930100952
+       .long   3589569869
+       .long   3826286484
+       .long   2774945552
+       .long   177536531
+       .long   3250005794
+       .long   1860201905
+       .long   2884172442
+       .long   3357605672
+       .long   1254923809
+       .long   355073063
+       .long   2205044292
+       .long   3720403810
+       .long   1473377588
+       .long   2420244049
+       .long   2509847619
+       .long   710146126
+       .long   115121288
+       .long   3145840325
+       .long   2946755177
+       .long   545520802
+       .long   724727943
+       .long   1420292253
+       .long   230242576
+       .long   1996713354
+       .long   1598543059
+       .long   1091041605
+       .long   1449455886
+       .long   2840584506
+       .long   460485152
+       .long   3993426708
+       .long   3197086118
+       .long   2182083211
+       .long   2898911772
+       .long   1386201717
+       .long   920970305
+       .long   3691886121
+       .long   2099204941
+       .long   69199126
+       .long   1502856249
+       .long   2772403434
+       .long   1841940610
+       .long   3088804946
+       .long   4198409883
+       .long   138398252
+       .long   3005712498
+       .long   1249839573
+       .long   3683881221
+       .long   1882642597
+       .long   4101852471
+       .long   276796504
+       .long   1716457700
+       .long   2499679147
+       .long   3072795146
+       .long   3765285194
+       .long   3908737646
+       .long   553593009
+       .long   3432915400
+       .long   704390999
+       .long   1850622997
+       .long   3235603093
+       .long   3522507997
+       .long   1107186019
+       .long   2570863504
+       .long   1408781999
+       .long   3701245994
+       .long   2176238891
+       .long   2750048699
+       .long   2214372039
+       .long   846759712
+       .long   2817563999
+       .long   3107524692
+       .long   57510486
+       .long   1205130103
+       .long   133776782
+       .long   1693519425
+       .long   1340160702
+       .long   1920082089
+       .long   115020972
+       .long   2410260206
+       .long   267553565
+       .long   3387038850
+       .long   2680321405
+       .long   3840164178
+       .long   230041945
+       .long   525553116
+       .long   535107130
+       .long   2479110404
+       .long   1065675514
+       .long   3385361061
+       .long   460083891
+       .long   1051106232
+       .long   1070214261
+       .long   663253512
+       .long   2131351028
+       .long   2475754826
+       .long   920167782
+       .long   2102212464
+       .long   2140428522
+       .long   1326507024
+       .long   4262702056
+       .long   656542356
+       .long   1840335564
+       .long   4204424928
+       .long   4280857045
+       .long   2653014048
+       .long   4230436817
+       .long   1313084713
+       .long   3680671129
+       .long   4113882560
+       .long   4266746795
+       .long   1011060801
+       .long   4165906339
+       .long   2626169427
+       .long   3066374962
+       .long   3932797825
+       .long   4238526295
+       .long   2022121603
+       .long   4036845383
+       .long   957371559
+       .long   1837782628
+       .long   3570628355
+       .long   4182085295
+       .long   4044243207
+       .long   3778723471
+       .long   1914743119
+       .long   3675565257
+       .long   2846289414
+       .long   4069203294
+       .long   3793519119
+       .long   3262479647
+       .long   3829486239
+       .long   3056163219
+       .long   1397611533
+       .long   3843439293
+       .long   3292070943
+       .long   2229991998
+       .long   3364005183
+       .long   1817359143
+       .long   2795223067
+       .long   3391911291
+       .long   2289174591
+       .long   165016701
+       .long   2433043071
+       .long   3634718287
+       .long   1295478838
+       .long   2488855287
+       .long   283381887
+       .long   330033402
+       .long   571118846
+       .long   2974469278
+       .long   2590957677
+       .long   682743279
+       .long   566763775
+       .long   660066805
+       .long   1142237692
+       .long   1653971260
+       .long   886948059
+       .long   1365486558
+       .long   1133527550
+       .long   1320133610
+       .long   2284475384
+       .long   3307942520
+       .long   1773896118
+       .long   2730973117
+       .long   2267055100
+       .long   2640267220
+       .long   273983472
+       .long   2320917745
+       .long   3547792237
+       .long   1166978938
+       .long   239142905
+       .long   985567145
+       .long   547966945
+       .long   346868194
+       .long   2800617179
+       .long   2333957877
+       .long   478285810
+       .long   1971134291
+       .long   1095933890
+       .long   693736388
+       .long   1306267062
+       .long   372948459
+       .long   956571621
+       .long   3942268582
+       .long   2191867780
+       .long   1387472776
+       .long   2612534124
+       .long   745896919
+       .long   1913143242
+       .long   3589569869
+       .long   88768265
+       .long   2774945552
+       .long   930100952
+       .long   1491793838
+       .long   3826286484
+       .long   2884172442
+       .long   177536531
+       .long   1254923809
+       .long   1860201905
+       .long   2983587677
+       .long   3357605672
+       .long   1473377588
+       .long   355073063
+       .long   2509847619
+       .long   3720403810
+       .long   1672208059
+       .long   2420244049
+       .long   2946755177
+       .long   710146126
+       .long   724727943
+       .long   3145840325
+       .long   3344416119
+       .long   545520802
+       .long   1598543059
+       .long   1420292253
+       .long   1449455886
+       .long   1996713354
+       .long   2393864943
+       .long   1091041605
+       .long   3197086118
+       .long   2840584506
+       .long   2898911772
+       .long   3993426708
+       .long   492762590
+       .long   2182083211
+       .long   2099204941
+       .long   1386201717
+       .long   1502856249
+       .long   3691886121
+       .long   985525180
+       .long   69199126
+       .long   4198409883
+       .long   2772403434
+       .long   3005712498
+       .long   3088804946
+       .long   1971050360
+       .long   138398252
+       .long   4101852471
+       .long   1249839573
+       .long   1716457700
+       .long   1882642597
+       .long   3942100721
+       .long   276796504
+       .long   3908737646
+       .long   2499679147
+       .long   3432915400
+       .long   3765285194
+       .long   3589234146
+       .long   553593009
+       .long   3522507997
+       .long   704390999
+       .long   2570863504
+       .long   3235603093
+       .long   2883500997
+       .long   1107186019
+       .long   2750048699
+       .long   1408781999
+       .long   846759712
+       .long   2176238891
+       .long   1472034698
+       .long   2214372039
+       .long   1205130103
+       .long   2817563999
+       .long   1693519425
+       .long   57510486
+       .long   2944069397
+       .long   133776782
+       .long   2410260206
+       .long   1340160702
+       .long   3387038850
+       .long   115020972
+       .long   1593171499
+       .long   267553565
+       .long   525553116
+       .long   2680321405
+       .long   2479110404
+       .long   230041945
+       .long   3186342998
+       .long   535107130
+       .long   1051106232
+       .long   1065675514
+       .long   663253512
+       .long   460083891
+       .long   2077718700
+       .long   1070214261
+       .long   2102212464
+       .long   2131351028
+       .long   1326507024
+       .long   920167782
+       .long   4155437400
+       .long   2140428522
+       .long   4204424928
+       .long   4262702056
+       .long   2653014048
+       .long   1840335564
+       .long   4015907504
+       .long   4280857045
+       .long   4113882560
+       .long   4230436817
+       .long   1011060801
+       .long   3680671129
+       .long   3736847713
+       .long   4266746795
+       .long   3932797825
+       .long   4165906339
+       .long   2022121603
+       .long   3066374962
+       .long   3178728131
+       .long   4238526295
+       .long   3570628355
+       .long   4036845383
+       .long   4044243207
+       .long   1837782628
+       .long   2062488966
+       .long   4182085295
+       .long   2846289414
+       .long   3778723471
+       .long   3793519119
+       .long   3675565257
+       .long   4124977933
+       .long   4069203294
+       .long   1397611533
+       .long   3262479647
+       .long   3292070943
+       .long   3056163219
+       .long   3954988571
+       .long   3843439293
+       .long   2795223067
+       .long   2229991998
+       .long   2289174591
+       .long   1817359143
+       .long   3615009846
+       .long   3391911291
+       .long   1295478838
+       .long   165016701
+       .long   283381887
+       .long   3634718287
+       .long   2935052397
+       .long   2488855287
+       .long   2590957677
+       .long   330033402
+       .long   566763775
+       .long   2974469278
+       .long   1575137499
+       .long   682743279
+       .long   886948059
+       .long   660066805
+       .long   1133527550
+       .long   1653971260
+       .long   3150274999
+       .long   1365486558
+       .long   1773896118
+       .long   1320133610
+       .long   2267055100
+       .long   3307942520
+       .long   2005582702
+       .long   2730973117
+       .long   3547792237
+       .long   2640267220
+       .long   239142905
+       .long   2320917745
+       .long   4011165404
+       .long   1166978938
+       .long   2800617179
+       .long   985567145
+       .long   478285810
+       .long   346868194
+       .long   3727363513
+       .long   2333957877
+       .long   1306267062
+       .long   1971134291
+       .long   956571621
+       .long   693736388
+       .long   3159759730
+       .long   372948459
+       .long   2612534124
+       .long   3942268582
+       .long   1913143242
+       .long   1387472776
+       .long   2024552164
+       .long   745896919
+       .long   930100952
+       .long   3589569869
+       .long   3826286484
+       .long   2774945552
+       .long   4049104329
+       .long   1491793838
+       .long   1860201905
+       .long   2884172442
+       .long   3357605672
+       .long   1254923809
+       .long   3803241362
+       .long   2983587677
+       .long   3720403810
+       .long   1473377588
+       .long   2420244049
+       .long   2509847619
+       .long   3311515428
+       .long   1672208059
+       .long   3145840325
+       .long   2946755177
+       .long   545520802
+       .long   724727943
+       .long   2328063560
+       .long   3344416119
+       .long   1996713354
+       .long   1598543059
+       .long   1091041605
+       .long   1449455886
+       .long   361159825
+       .long   2393864943
+       .long   3993426708
+       .long   3197086118
+       .long   2182083211
+       .long   2898911772
+       .long   722319651
+       .long   492762590
+       .long   3691886121
+       .long   2099204941
+       .long   69199126
+       .long   1502856249
+       .long   1444639302
+       .long   985525180
+       .long   3088804946
+       .long   4198409883
+       .long   138398252
+       .long   3005712498
+       .long   2889278605
+       .long   1971050360
+       .long   1882642597
+       .long   4101852471
+       .long   276796504
+       .long   1716457700
+       .long   1483589915
+       .long   3942100721
+       .long   3765285194
+       .long   3908737646
+       .long   553593009
+       .long   3432915400
+       .long   2967179831
+       .long   3589234146
+       .long   3235603093
+       .long   3522507997
+       .long   1107186019
+       .long   2570863504
+       .long   1639392366
+       .long   2883500997
+       .long   2176238891
+       .long   2750048699
+       .long   2214372039
+       .long   846759712
+       .long   3278784732
+       .long   1472034698
+       .long   57510486
+       .long   1205130103
+       .long   133776782
+       .long   1693519425
+       .long   2262602168
+       .long   2944069397
+       .long   115020972
+       .long   2410260206
+       .long   267553565
+       .long   3387038850
+       .long   230237041
+       .long   1593171499
+       .long   230041945
+       .long   525553116
+       .long   535107130
+       .long   2479110404
+       .long   460474083
+       .long   3186342998
+       .long   460083891
+       .long   1051106232
+       .long   1070214261
+       .long   663253512
+       .long   920948167
+       .long   2077718700
+       .long   920167782
+       .long   2102212464
+       .long   2140428522
+       .long   1326507024
+       .long   1841896334
+       .long   4155437400
+       .long   1840335564
+       .long   4204424928
+       .long   4280857045
+       .long   2653014048
+       .long   3683792669
+       .long   4015907504
+       .long   3680671129
+       .long   4113882560
+       .long   4266746795
+       .long   1011060801
+       .long   3072618042
+       .long   3736847713
+       .long   3066374962
+       .long   3932797825
+       .long   4238526295
+       .long   2022121603
+       .long   1850268788
+       .long   3178728131
+       .long   1837782628
+       .long   3570628355
+       .long   4182085295
+       .long   4044243207
+       .long   3700537577
+       .long   2062488966
+       .long   3675565257
+       .long   2846289414
+       .long   4069203294
+       .long   3793519119
+       .long   3106107858
+       .long   4124977933
+       .long   3056163219
+       .long   1397611533
+       .long   3843439293
+       .long   3292070943
+       .long   1917248420
+       .long   3954988571
+       .long   1817359143
+       .long   2795223067
+       .long   3391911291
+       .long   2289174591
+       .long   3834496840
+       .long   3615009846
+       .long   3634718287
+       .long   1295478838
+       .long   2488855287
+       .long   283381887
+       .long   3374026384
+       .long   2935052397
+       .long   2974469278
+       .long   2590957677
+       .long   682743279
+       .long   566763775
+       .long   2453085473
+       .long   1575137499
+       .long   1653971260
+       .long   886948059
+       .long   1365486558
+       .long   1133527550
+       .long   611203650
+       .long   3150274999
+       .long   3307942520
+       .long   1773896118
+       .long   2730973117
+       .long   2267055100
+       .long   1222407300
+       .long   2005582702
+       .long   2320917745
+       .long   3547792237
+       .long   1166978938
+       .long   239142905
+       .long   2444814601
+       .long   4011165404
+       .long   346868194
+       .long   2800617179
+       .long   2333957877
+       .long   478285810
+       .long   594661906
+       .long   3727363513
+       .long   693736388
+       .long   1306267062
+       .long   372948459
+       .long   956571621
+       .long   1189323812
+       .long   3159759730
+       .long   1387472776
+       .long   2612534124
+       .long   745896919
+       .long   1913143242
+       .long   2378647625
+       .long   2024552164
+       .long   2774945552
+       .long   930100952
+       .long   1491793838
+       .long   3826286484
+       .long   462327955
+       .long   4049104329
+       .long   1254923809
+       .long   1860201905
+       .long   2983587677
+       .long   3357605672
+       .long   924655910
+       .long   3803241362
+       .long   2509847619
+       .long   3720403810
+       .long   1672208059
+       .long   2420244049
+       .long   1849311821
+       .long   3311515428
+       .long   724727943
+       .long   3145840325
+       .long   3344416119
+       .long   545520802
+       .long   3698623643
+       .long   2328063560
+       .long   1449455886
+       .long   1996713354
+       .long   2393864943
+       .long   1091041605
+       .long   3102279991
+       .long   361159825
+       .long   2898911772
+       .long   3993426708
+       .long   492762590
+       .long   2182083211
+       .long   1909592686
+       .long   722319651
+       .long   1502856249
+       .long   3691886121
+       .long   985525180
+       .long   69199126
+       .long   3819185373
+       .long   1444639302
+       .long   3005712498
+       .long   3088804946
+       .long   1971050360
+       .long   138398252
+       .long   3343403450
+       .long   2889278605
+       .long   1716457700
+       .long   1882642597
+       .long   3942100721
+       .long   276796504
+       .long   2391839604
+       .long   1483589915
+       .long   3432915400
+       .long   3765285194
+       .long   3589234146
+       .long   553593009
+       .long   488711913
+       .long   2967179831
+       .long   2570863504
+       .long   3235603093
+       .long   2883500997
+       .long   1107186019
+       .long   977423826
+       .long   1639392366
+       .long   846759712
+       .long   2176238891
+       .long   1472034698
+       .long   2214372039
+       .long   1954847653
+       .long   3278784732
+       .long   1693519425
+       .long   57510486
+       .long   2944069397
+       .long   133776782
+       .long   3909695307
+       .long   2262602168
+       .long   3387038850
+       .long   115020972
+       .long   1593171499
+       .long   267553565
+       .long   3524423319
+       .long   230237041
+       .long   2479110404
+       .long   230041945
+       .long   3186342998
+       .long   535107130
+       .long   2753879342
+       .long   460474083
+       .long   663253512
+       .long   460083891
+       .long   2077718700
+       .long   1070214261
+       .long   1212791388
+       .long   920948167
+       .long   1326507024
+       .long   920167782
+       .long   4155437400
+       .long   2140428522
+       .long   2425582776
+       .long   1841896334
+       .long   2653014048
+       .long   1840335564
+       .long   4015907504
+       .long   4280857045
+       .long   556198256
+       .long   3683792669
+       .long   1011060801
+       .long   3680671129
+       .long   3736847713
+       .long   4266746795
+       .long   1112396512
+       .long   3072618042
+       .long   2022121603
+       .long   3066374962
+       .long   3178728131
+       .long   4238526295
+       .long   2224793024
+       .long   1850268788
+       .long   4044243207
+       .long   1837782628
+       .long   2062488966
+       .long   4182085295
+       .long   154618752
+       .long   3700537577
+       .long   3793519119
+       .long   3675565257
+       .long   4124977933
+       .long   4069203294
+       .long   309237504
+       .long   3106107858
+       .long   3292070943
+       .long   3056163219
+       .long   3954988571
+       .long   3843439293
+       .long   618475008
+       .long   1917248420
+       .long   2289174591
+       .long   1817359143
+       .long   3615009846
+       .long   3391911291
+       .long   1236950016
+       .long   3834496840
+       .long   283381887
+       .long   3634718287
+       .long   2935052397
+       .long   2488855287
+       .long   2473900033
+       .long   3374026384
+       .long   566763775
+       .long   2974469278
+       .long   1575137499
+       .long   682743279
+       .long   652832771
+       .long   2453085473
+       .long   1133527550
+       .long   1653971260
+       .long   3150274999
+       .long   1365486558
+       .long   1305665542
+       .long   611203650
+       .long   2267055100
+       .long   3307942520
+       .long   2005582702
+       .long   2730973117
+       .long   2611331084
+       .long   1222407300
+       .long   239142905
+       .long   2320917745
+       .long   4011165404
+       .long   1166978938
+       .long   927694873
+       .long   2444814601
+       .long   478285810
+       .long   346868194
+       .long   3727363513
+       .long   2333957877
+       .long   1855389746
+       .long   594661906
+       .long   956571621
+       .long   693736388
+       .long   3159759730
+       .long   372948459
+       .long   3710779492
+       .long   1189323812
+       .long   1913143242
+       .long   1387472776
+       .long   2024552164
+       .long   745896919
+       .long   3126591689
+       .long   2378647625
+       .long   3826286484
+       .long   2774945552
+       .long   4049104329
+       .long   1491793838
+       .long   1958216082
+       .long   462327955
+       .long   3357605672
+       .long   1254923809
+       .long   3803241362
+       .long   2983587677
+       .long   3916432164
+       .long   924655910
+       .long   2420244049
+       .long   2509847619
+       .long   3311515428
+       .long   1672208059
+       .long   3537897033
+       .long   1849311821
+       .long   545520802
+       .long   724727943
+       .long   2328063560
+       .long   3344416119
+       .long   2780826770
+       .long   3698623643
+       .long   1091041605
+       .long   1449455886
+       .long   361159825
+       .long   2393864943
+       .long   1266686244
+       .long   3102279991
+       .long   2182083211
+       .long   2898911772
+       .long   722319651
+       .long   492762590
+       .long   2533372489
+       .long   1909592686
+       .long   69199126
+       .long   1502856249
+       .long   1444639302
+       .long   985525180
+       .long   771777682
+       .long   3819185373
+       .long   138398252
+       .long   3005712498
+       .long   2889278605
+       .long   1971050360
+       .long   1543555365
+       .long   3343403450
+       .long   276796504
+       .long   1716457700
+       .long   1483589915
+       .long   3942100721
+       .long   3087110731
+       .long   2391839604
+       .long   553593009
+       .long   3432915400
+       .long   2967179831
+       .long   3589234146
+       .long   1879254167
+       .long   488711913
+       .long   1107186019
+       .long   2570863504
+       .long   1639392366
+       .long   2883500997
+       .long   3758508334
+       .long   977423826
+       .long   2214372039
+       .long   846759712
+       .long   3278784732
+       .long   1472034698
+       .long   3222049373
+       .long   1954847653
+       .long   133776782
+       .long   1693519425
+       .long   2262602168
+       .long   2944069397
+       .long   2149131451
+       .long   3909695307
+       .long   267553565
+       .long   3387038850
+       .long   230237041
+       .long   1593171499
+       .long   3295607
+       .long   3524423319
+       .long   535107130
+       .long   2479110404
+       .long   460474083
+       .long   3186342998
+       .long   6591214
+       .long   2753879342
+       .long   1070214261
+       .long   663253512
+       .long   920948167
+       .long   2077718700
+       .long   13182429
+       .long   1212791388
+       .long   2140428522
+       .long   1326507024
+       .long   1841896334
+       .long   4155437400
+       .long   26364858
+       .long   2425582776
+       .long   4280857045
+       .long   2653014048
+       .long   3683792669
+       .long   4015907504
+       .long   52729717
+       .long   556198256
+       .long   4266746795
+       .long   1011060801
+       .long   3072618042
+       .long   3736847713
+       .long   105459434
+       .long   1112396512
+       .long   4238526295
+       .long   2022121603
+       .long   1850268788
+       .long   3178728131
+       .long   210918868
+       .long   2224793024
+       .long   4182085295
+       .long   4044243207
+       .long   3700537577
+       .long   2062488966
+       .long   421837736
+       .long   154618752
+       .long   4069203294
+       .long   3793519119
+       .long   3106107858
+       .long   4124977933
+       .long   843675472
+       .long   309237504
+       .long   3843439293
+       .long   3292070943
+       .long   1917248420
+       .long   3954988571
+       .long   1687350944
+       .long   618475008
+       .long   3391911291
+       .long   2289174591
+       .long   3834496840
+       .long   3615009846
+       .long   3374701889
+       .long   1236950016
+       .long   2488855287
+       .long   283381887
+       .long   3374026384
+       .long   2935052397
+       .long   2454436482
+       .long   2473900033
+       .long   682743279
+       .long   566763775
+       .long   2453085473
+       .long   1575137499
+       .long   613905668
+       .long   652832771
+       .long   1365486558
+       .long   1133527550
+       .long   611203650
+       .long   3150274999
+       .long   1227811337
+       .long   1305665542
+       .long   2730973117
+       .long   2267055100
+       .long   1222407300
+       .long   2005582702
+       .long   2455622675
+       .long   2611331084
+       .long   1166978938
+       .long   239142905
+       .long   2444814601
+       .long   4011165404
+       .long   616278055
+       .long   927694873
+       .long   2333957877
+       .long   478285810
+       .long   594661906
+       .long   3727363513
+       .long   1232556110
+       .long   1855389746
+       .long   372948459
+       .long   956571621
+       .long   1189323812
+       .long   3159759730
+       .long   2465112221
+       .long   3710779492
+       .long   745896919
+       .long   1913143242
+       .long   2378647625
+       .long   2024552164
+       .long   635257146
+       .long   3126591689
+       .long   1491793838
+       .long   3826286484
+       .long   462327955
+       .long   4049104329
+       .long   1270514292
+       .long   1958216082
+       .long   2983587677
+       .long   3357605672
+       .long   924655910
+       .long   3803241362
+       .long   2541028584
+       .long   3916432164
+       .long   1672208059
+       .long   2420244049
+       .long   1849311821
+       .long   3311515428
+       .long   787089873
+       .long   3537897033
+       .long   3344416119
+       .long   545520802
+       .long   3698623643
+       .long   2328063560
+       .long   1574179747
+       .long   2780826770
+       .long   2393864943
+       .long   1091041605
+       .long   3102279991
+       .long   361159825
+       .long   3148359494
+       .long   1266686244
+       .long   492762590
+       .long   2182083211
+       .long   1909592686
+       .long   722319651
+       .long   2001751692
+       .long   2533372489
+       .long   985525180
+       .long   69199126
+       .long   3819185373
+       .long   1444639302
+       .long   4003503385
+       .long   771777682
+       .long   1971050360
+       .long   138398252
+       .long   3343403450
+       .long   2889278605
+       .long   3712039474
+       .long   1543555365
+       .long   3942100721
+       .long   276796504
+       .long   2391839604
+       .long   1483589915
+       .long   3129111652
+       .long   3087110731
+       .long   3589234146
+       .long   553593009
+       .long   488711913
+       .long   2967179831
+       .long   1963256009
+       .long   1879254167
+       .long   2883500997
+       .long   1107186019
+       .long   977423826
+       .long   1639392366
+       .long   3926512018
+       .long   3758508334
+       .long   1472034698
+       .long   2214372039
+       .long   1954847653
+       .long   3278784732
+       .long   3558056740
+       .long   3222049373
+       .long   2944069397
+       .long   133776782
+       .long   3909695307
+       .long   2262602168
+       .long   2821146184
+       .long   2149131451
+       .long   1593171499
+       .long   267553565
+       .long   3524423319
+       .long   230237041
+       .long   1347325072
+       .long   3295607
+       .long   3186342998
+       .long   535107130
+       .long   2753879342
+       .long   460474083
+       .long   2694650145
+       .long   6591214
+       .long   2077718700
+       .long   1070214261
+       .long   1212791388
+       .long   920948167
+       .long   1094332995
+       .long   13182429
+       .long   4155437400
+       .long   2140428522
+       .long   2425582776
+       .long   1841896334
+       .long   2188665991
+       .long   26364858
+       .long   4015907504
+       .long   4280857045
+       .long   556198256
+       .long   3683792669
+       .long   82364686
+       .long   52729717
+       .long   3736847713
+       .long   4266746795
+       .long   1112396512
+       .long   3072618042
+       .long   164729372
+       .long   105459434
+       .long   3178728131
+       .long   4238526295
+       .long   2224793024
+       .long   1850268788
+       .long   329458745
+       .long   210918868
+       .long   2062488966
+       .long   4182085295
+       .long   154618752
+       .long   3700537577
+       .long   658917491
+       .long   421837736
+       .long   4124977933
+       .long   4069203294
+       .long   309237504
+       .long   3106107858
+       .long   1317834983
+       .long   843675472
+       .long   3954988571
+       .long   3843439293
+       .long   618475008
+       .long   1917248420
+       .long   2635669967
+       .long   1687350944
+       .long   3615009846
+       .long   3391911291
+       .long   1236950016
+       .long   3834496840
+       .long   976372639
+       .long   3374701889
+       .long   2935052397
+       .long   2488855287
+       .long   2473900033
+       .long   3374026384
+       .long   1952745279
+       .long   2454436482
+       .long   1575137499
+       .long   682743279
+       .long   652832771
+       .long   2453085473
+       .long   3905490559
+       .long   613905668
+       .long   3150274999
+       .long   1365486558
+       .long   1305665542
+       .long   611203650
+       .long   3516013822
+       .long   1227811337
+       .long   2005582702
+       .long   2730973117
+       .long   2611331084
+       .long   1222407300
+       .long   2737060348
+       .long   2455622675
+       .long   4011165404
+       .long   1166978938
+       .long   927694873
+       .long   2444814601
+       .long   1179153400
+       .long   616278055
+       .long   3727363513
+       .long   2333957877
+       .long   1855389746
+       .long   594661906
+       .long   2358306800
+       .long   1232556110
+       .long   3159759730
+       .long   372948459
+       .long   3710779492
+       .long   1189323812
+       .long   421646305
+       .long   2465112221
+       .long   2024552164
+       .long   745896919
+       .long   3126591689
+       .long   2378647625
+       .long   843292611
+       .long   635257146
+       .long   4049104329
+       .long   1491793838
+       .long   1958216082
+       .long   462327955
+       .long   1686585223
+       .long   1270514292
+       .long   3803241362
+       .long   2983587677
+       .long   3916432164
+       .long   924655910
+       .long   3373170446
+       .long   2541028584
+       .long   3311515428
+       .long   1672208059
+       .long   3537897033
+       .long   1849311821
+       .long   2451373597
+       .long   787089873
+       .long   2328063560
+       .long   3344416119
+       .long   2780826770
+       .long   3698623643
+       .long   607779899
+       .long   1574179747
+       .long   361159825
+       .long   2393864943
+       .long   1266686244
+       .long   3102279991
+       .long   1215559799
+       .long   3148359494
+       .long   722319651
+       .long   492762590
+       .long   2533372489
+       .long   1909592686
+       .long   2431119599
+       .long   2001751692
+       .long   1444639302
+       .long   985525180
+       .long   771777682
+       .long   3819185373
+       .long   567271902
+       .long   4003503385
+       .long   2889278605
+       .long   1971050360
+       .long   1543555365
+       .long   3343403450
+       .long   1134543805
+       .long   3712039474
+       .long   1483589915
+       .long   3942100721
+       .long   3087110731
+       .long   2391839604
+       .long   2269087610
+       .long   3129111652
+       .long   2967179831
+       .long   3589234146
+       .long   1879254167
+       .long   488711913
+       .long   243207925
+       .long   1963256009
+       .long   1639392366
+       .long   2883500997
+       .long   3758508334
+       .long   977423826
+       .long   486415851
+       .long   3926512018
+       .long   3278784732
+       .long   1472034698
+       .long   3222049373
+       .long   1954847653
+       .long   972831702
+       .long   3558056740
+       .long   2262602168
+       .long   2944069397
+       .long   2149131451
+       .long   3909695307
+       .long   1945663404
+       .long   2821146184
+       .long   230237041
+       .long   1593171499
+       .long   3295607
+       .long   3524423319
+       .long   3891326808
+       .long   1347325072
+       .long   460474083
+       .long   3186342998
+       .long   6591214
+       .long   2753879342
+       .long   3487686321
+       .long   2694650145
+       .long   920948167
+       .long   2077718700
+       .long   13182429
+       .long   1212791388
+       .long   2680405347
+       .long   1094332995
+       .long   1841896334
+       .long   4155437400
+       .long   26364858
+       .long   2425582776
+       .long   1065843399
+       .long   2188665991
+       .long   3683792669
+       .long   4015907504
+       .long   52729717
+       .long   556198256
+       .long   2131686798
+       .long   82364686
+       .long   3072618042
+       .long   3736847713
+       .long   105459434
+       .long   1112396512
+       .long   4263373596
+       .long   164729372
+       .long   1850268788
+       .long   3178728131
+       .long   210918868
+       .long   2224793024
+       .long   4231779897
+       .long   329458745
+       .long   3700537577
+       .long   2062488966
+       .long   421837736
+       .long   154618752
+       .long   4168592498
+       .long   658917491
+       .long   3106107858
+       .long   4124977933
+       .long   843675472
+       .long   309237504
+       .long   4042217701
+       .long   1317834983
+       .long   1917248420
+       .long   3954988571
+       .long   1687350944
+       .long   618475008
+       .long   3789468107
+       .long   2635669967
+       .long   3834496840
+       .long   3615009846
+       .long   3374701889
+       .long   1236950016
+       .long   3283968918
+       .long   976372639
+       .long   3374026384
+       .long   2935052397
+       .long   2454436482
+       .long   2473900033
+       .long   2272970540
+       .long   1952745279
+       .long   2453085473
+       .long   1575137499
+       .long   613905668
+       .long   652832771
+       .long   250973784
+       .long   3905490559
+       .long   611203650
+       .long   3150274999
+       .long   1227811337
+       .long   1305665542
+       .long   501947569
+       .long   3516013822
+       .long   1222407300
+       .long   2005582702
+       .long   2455622675
+       .long   2611331084
+       .long   1003895138
+       .long   2737060348
+       .long   2444814601
+       .long   4011165404
+       .long   616278055
+       .long   927694873
+       .long   2007790276
+       .long   1179153400
+       .long   594661906
+       .long   3727363513
+       .long   1232556110
+       .long   1855389746
+       .long   4015580553
+       .long   2358306800
+       .long   1189323812
+       .long   3159759730
+       .long   2465112221
+       .long   3710779492
+       .long   3736193810
+       .long   421646305
+       .long   2378647625
+       .long   2024552164
+       .long   635257146
+       .long   3126591689
+       .long   3177420325
+       .long   843292611
+       .long   462327955
+       .long   4049104329
+       .long   1270514292
+       .long   1958216082
+       .long   2059873354
+       .long   1686585223
+       .long   924655910
+       .long   3803241362
+       .long   2541028584
+       .long   3916432164
+       .long   4119746708
+       .long   3373170446
+       .long   1849311821
+       .long   3311515428
+       .long   787089873
+       .long   3537897033
+       .long   3944526121
+       .long   2451373597
+       .long   3698623643
+       .long   2328063560
+       .long   1574179747
+       .long   2780826770
+       .long   3594084947
+       .long   607779899
+       .long   3102279991
+       .long   361159825
+       .long   3148359494
+       .long   1266686244
+       .long   2893202598
+       .long   1215559799
+       .long   1909592686
+       .long   722319651
+       .long   2001751692
+       .long   2533372489
+       .long   1491437901
+       .long   2431119599
+       .long   3819185373
+       .long   1444639302
+       .long   4003503385
+       .long   771777682
+       .long   2982875802
+       .long   567271902
+       .long   3343403450
+       .long   2889278605
+       .long   3712039474
+       .long   1543555365
+       .long   1670784308
+       .long   1134543805
+       .long   2391839604
+       .long   1483589915
+       .long   3129111652
+       .long   3087110731
+       .long   3341568617
+       .long   2269087610
+       .long   488711913
+       .long   2967179831
+       .long   1963256009
+       .long   1879254167
+       .long   2388169939
+       .long   243207925
+       .long   977423826
+       .long   1639392366
+       .long   3926512018
+       .long   3758508334
+       .long   481372583
+       .long   486415851
+       .long   1954847653
+       .long   3278784732
+       .long   3558056740
+       .long   3222049373
+       .long   962745166
+       .long   972831702
+       .long   3909695307
+       .long   2262602168
+       .long   2821146184
+       .long   2149131451
+       .long   1925490332
+       .long   1945663404
+       .long   3524423319
+       .long   230237041
+       .long   1347325072
+       .long   3295607
+       .long   3850980665
+       .long   3891326808
+       .long   2753879342
+       .long   460474083
+       .long   2694650145
+       .long   6591214
+       .long   3406994035
+       .long   3487686321
+       .long   1212791388
+       .long   920948167
+       .long   1094332995
+       .long   13182429
+       .long   2519020775
+       .long   2680405347
+       .long   2425582776
+       .long   1841896334
+       .long   2188665991
+       .long   26364858
+       .long   743074255
+       .long   1065843399
+       .long   556198256
+       .long   3683792669
+       .long   82364686
+       .long   52729717
+       .long   1486148511
+       .long   2131686798
+       .long   1112396512
+       .long   3072618042
+       .long   164729372
+       .long   105459434
+       .long   2972297022
+       .long   4263373596
+       .long   2224793024
+       .long   1850268788
+       .long   329458745
+       .long   210918868
+       .long   1649626749
+       .long   4231779897
+       .long   154618752
+       .long   3700537577
+       .long   658917491
+       .long   421837736
+       .long   3299253499
+       .long   4168592498
+       .long   309237504
+       .long   3106107858
+       .long   1317834983
+       .long   843675472
+       .long   2303539703
+       .long   4042217701
+       .long   618475008
+       .long   1917248420
+       .long   2635669967
+       .long   1687350944
+       .long   312112110
+       .long   3789468107
+       .long   1236950016
+       .long   3834496840
+       .long   976372639
+       .long   3374701889
+       .long   624224221
+       .long   3283968918
+       .long   2473900033
+       .long   3374026384
+       .long   1952745279
+       .long   2454436482
+       .long   1248448442
+       .long   2272970540
+       .long   652832771
+       .long   2453085473
+       .long   3905490559
+       .long   613905668
+       .long   2496896884
+       .long   250973784
+       .long   1305665542
+       .long   611203650
+       .long   3516013822
+       .long   1227811337
+       .long   698826472
+       .long   501947569
+       .long   2611331084
+       .long   1222407300
+       .long   2737060348
+       .long   2455622675
+       .long   1397652945
+       .long   1003895138
+       .long   927694873
+       .long   2444814601
+       .long   1179153400
+       .long   616278055
+       .long   2795305890
+       .long   2007790276
+       .long   1855389746
+       .long   594661906
+       .long   2358306800
+       .long   1232556110
+       .long   1295644484
+       .long   4015580553
+       .long   3710779492
+       .long   1189323812
+       .long   421646305
+       .long   2465112221
+       .long   2591288968
+       .long   3736193810
+       .long   3126591689
+       .long   2378647625
+       .long   843292611
+       .long   635257146
+       .long   887610640
+       .long   3177420325
+       .long   1958216082
+       .long   462327955
+       .long   1686585223
+       .long   1270514292
+       .long   1775221280
+       .long   2059873354
+       .long   3916432164
+       .long   924655910
+       .long   3373170446
+       .long   2541028584
+       .long   3550442561
+       .long   4119746708
+       .long   3537897033
+       .long   1849311821
+       .long   2451373597
+       .long   787089873
+       .long   2805917826
+       .long   3944526121
+       .long   2780826770
+       .long   3698623643
+       .long   607779899
+       .long   1574179747
+       .long   1316868356
+       .long   3594084947
+       .long   1266686244
+       .long   3102279991
+       .long   1215559799
+       .long   3148359494
+       .long   2633736712
+       .long   2893202598
+       .long   2533372489
+       .long   1909592686
+       .long   2431119599
+       .long   2001751692
+       .long   972506129
+       .long   1491437901
+       .long   771777682
+       .long   3819185373
+       .long   567271902
+       .long   4003503385
+       .long   1945012259
+       .long   2982875802
+       .long   1543555365
+       .long   3343403450
+       .long   1134543805
+       .long   3712039474
+       .long   3890024518
+       .long   1670784308
+       .long   3087110731
+       .long   2391839604
+       .long   2269087610
+       .long   3129111652
+       .long   3485081741
+       .long   3341568617
+       .long   1879254167
+       .long   488711913
+       .long   243207925
+       .long   1963256009
+       .long   2675196186
+       .long   2388169939
+       .long   3758508334
+       .long   977423826
+       .long   486415851
+       .long   3926512018
+       .long   1055425077
+       .long   481372583
+       .long   3222049373
+       .long   1954847653
+       .long   972831702
+       .long   3558056740
+       .long   2110850155
+       .long   962745166
+       .long   2149131451
+       .long   3909695307
+       .long   1945663404
+       .long   2821146184
+       .long   4221700311
+       .long   1925490332
+       .long   3295607
+       .long   3524423319
+       .long   3891326808
+       .long   1347325072
+       .long   4148433327
+       .long   3850980665
+       .long   6591214
+       .long   2753879342
+       .long   3487686321
+       .long   2694650145
+       .long   4001899359
+       .long   3406994035
+       .long   13182429
+       .long   1212791388
+       .long   2680405347
+       .long   1094332995
+       .long   3708831422
+       .long   2519020775
+       .long   26364858
+       .long   2425582776
+       .long   1065843399
+       .long   2188665991
+       .long   3122695549
+       .long   743074255
+       .long   52729717
+       .long   556198256
+       .long   2131686798
+       .long   82364686
+       .long   1950423802
+       .long   1486148511
+       .long   105459434
+       .long   1112396512
+       .long   4263373596
+       .long   164729372
+       .long   3900847605
+       .long   2972297022
+       .long   210918868
+       .long   2224793024
+       .long   4231779897
+       .long   329458745
+       .long   3506727914
+       .long   1649626749
+       .long   421837736
+       .long   154618752
+       .long   4168592498
+       .long   658917491
+       .long   2718488532
+       .long   3299253499
+       .long   843675472
+       .long   309237504
+       .long   4042217701
+       .long   1317834983
+       .long   1142009769
+       .long   2303539703
+       .long   1687350944
+       .long   618475008
+       .long   3789468107
+       .long   2635669967
+       .long   2284019538
+       .long   312112110
+       .long   3374701889
+       .long   1236950016
+       .long   3283968918
+       .long   976372639
+       .long   273071781
+       .long   624224221
+       .long   2454436482
+       .long   2473900033
+       .long   2272970540
+       .long   1952745279
+       .long   546143563
+       .long   1248448442
+       .long   613905668
+       .long   652832771
+       .long   250973784
+       .long   3905490559
+       .long   1092287127
+       .long   2496896884
+       .long   1227811337
+       .long   1305665542
+       .long   501947569
+       .long   3516013822
+       .long   2184574254
+       .long   698826472
+       .long   2455622675
+       .long   2611331084
+       .long   1003895138
+       .long   2737060348
+       .long   74181213
+       .long   1397652945
+       .long   616278055
+       .long   927694873
+       .long   2007790276
+       .long   1179153400
+       .long   148362426
+       .long   2795305890
+       .long   1232556110
+       .long   1855389746
+       .long   4015580553
+       .long   2358306800
+       .long   296724853
+       .long   1295644484
+       .long   2465112221
+       .long   3710779492
+       .long   3736193810
+       .long   421646305
+       .long   593449707
+       .long   2591288968
+       .long   635257146
+       .long   3126591689
+       .long   3177420325
+       .long   843292611
+       .long   1186899415
+       .long   887610640
+       .long   1270514292
+       .long   1958216082
+       .long   2059873354
+       .long   1686585223
+       .long   2373798830
+       .long   1775221280
+       .long   2541028584
+       .long   3916432164
+       .long   4119746708
+       .long   3373170446
+       .long   452630365
+       .long   3550442561
+       .long   787089873
+       .long   3537897033
+       .long   3944526121
+       .long   2451373597
+       .long   905260731
+       .long   2805917826
+       .long   1574179747
+       .long   2780826770
+       .long   3594084947
+       .long   607779899
+       .long   1810521462
+       .long   1316868356
+       .long   3148359494
+       .long   1266686244
+       .long   2893202598
+       .long   1215559799
+       .long   3621042925
+       .long   2633736712
+       .long   2001751692
+       .long   2533372489
+       .long   1491437901
+       .long   2431119599
+       .long   2947118554
+       .long   972506129
+       .long   4003503385
+       .long   771777682
+       .long   2982875802
+       .long   567271902
+       .long   1599269812
+       .long   1945012259
+       .long   3712039474
+       .long   1543555365
+       .long   1670784308
+       .long   1134543805
+       .long   3198539624
+       .long   3890024518
+       .long   3129111652
+       .long   3087110731
+       .long   3341568617
+       .long   2269087610
+       .long   2102111953
+       .long   3485081741
+       .long   1963256009
+       .long   1879254167
+       .long   2388169939
+       .long   243207925
+       .long   4204223906
+       .long   2675196186
+       .long   3926512018
+       .long   3758508334
+       .long   481372583
+       .long   486415851
+       .long   4113480516
+       .long   1055425077
+       .long   3558056740
+       .long   3222049373
+       .long   962745166
+       .long   972831702
+       .long   3931993737
+       .long   2110850155
+       .long   2821146184
+       .long   2149131451
+       .long   1925490332
+       .long   1945663404
+       .long   3569020178
+       .long   4221700311
+       .long   1347325072
+       .long   3295607
+       .long   3850980665
+       .long   3891326808
+       .long   2843073060
+       .long   4148433327
+       .long   2694650145
+       .long   6591214
+       .long   3406994035
+       .long   3487686321
+       .long   1391178824
+       .long   4001899359
+       .long   1094332995
+       .long   13182429
+       .long   2519020775
+       .long   2680405347
+       .long   2782357648
+       .long   3708831422
+       .long   2188665991
+       .long   26364858
+       .long   743074255
+       .long   1065843399
+       .long   1269748001
+       .long   3122695549
+       .long   82364686
+       .long   52729717
+       .long   1486148511
+       .long   2131686798
+       .long   2539496002
+       .long   1950423802
+       .long   164729372
+       .long   105459434
+       .long   2972297022
+       .long   4263373596
+       .long   784024708
+       .long   3900847605
+       .long   329458745
+       .long   210918868
+       .long   1649626749
+       .long   4231779897
+       .long   1568049417
+       .long   3506727914
+       .long   658917491
+       .long   421837736
+       .long   3299253499
+       .long   4168592498
+       .long   3136098835
+       .long   2718488532
+       .long   1317834983
+       .long   843675472
+       .long   2303539703
+       .long   4042217701
+       .long   1977230375
+       .long   1142009769
+       .long   2635669967
+       .long   1687350944
+       .long   312112110
+       .long   3789468107
+       .long   3954460750
+       .long   2284019538
+       .long   976372639
+       .long   3374701889
+       .long   624224221
+       .long   3283968918
+       .long   3613954205
+       .long   273071781
+       .long   1952745279
+       .long   2454436482
+       .long   1248448442
+       .long   2272970540
+       .long   2932941114
+       .long   546143563
+       .long   3905490559
+       .long   613905668
+       .long   2496896884
+       .long   250973784
+       .long   1570914932
+       .long   1092287127
+       .long   3516013822
+       .long   1227811337
+       .long   698826472
+       .long   501947569
+       .long   3141829865
+       .long   2184574254
+       .long   2737060348
+       .long   2455622675
+       .long   1397652945
+       .long   1003895138
+       .long   1988692435
+       .long   74181213
+       .long   1179153400
+       .long   616278055
+       .long   2795305890
+       .long   2007790276
+       .long   3977384870
+       .long   148362426
+       .long   2358306800
+       .long   1232556110
+       .long   1295644484
+       .long   4015580553
+       .long   3659802444
+       .long   296724853
+       .long   421646305
+       .long   2465112221
+       .long   2591288968
+       .long   3736193810
+       .long   3024637593
+       .long   593449707
+       .long   843292611
+       .long   635257146
+       .long   887610640
+       .long   3177420325
+       .long   1754307891
+       .long   1186899415
+       .long   1686585223
+       .long   1270514292
+       .long   1775221280
+       .long   2059873354
+       .long   3508615783
+       .long   2373798830
+       .long   3373170446
+       .long   2541028584
+       .long   3550442561
+       .long   4119746708
+       .long   2722264270
+       .long   452630365
+       .long   2451373597
+       .long   787089873
+       .long   2805917826
+       .long   3944526121
+       .long   1149561244
+       .long   905260731
+       .long   607779899
+       .long   1574179747
+       .long   1316868356
+       .long   3594084947
+       .long   2299122488
+       .long   1810521462
+       .long   1215559799
+       .long   3148359494
+       .long   2633736712
+       .long   2893202598
+       .long   303277681
+       .long   3621042925
+       .long   2431119599
+       .long   2001751692
+       .long   972506129
+       .long   1491437901
+       .long   606555363
+       .long   2947118554
+       .long   567271902
+       .long   4003503385
+       .long   1945012259
+       .long   2982875802
+       .long   1213110727
+       .long   1599269812
+       .long   1134543805
+       .long   3712039474
+       .long   3890024518
+       .long   1670784308
+       .long   2426221454
+       .long   3198539624
+       .long   2269087610
+       .long   3129111652
+       .long   3485081741
+       .long   3341568617
+       .long   557475612
+       .long   2102111953
+       .long   243207925
+       .long   1963256009
+       .long   2675196186
+       .long   2388169939
+       .long   1114951224
+       .long   4204223906
+       .long   486415851
+       .long   3926512018
+       .long   1055425077
+       .long   481372583
+       .long   2229902448
+       .long   4113480516
+       .long   972831702
+       .long   3558056740
+       .long   2110850155
+       .long   962745166
+       .long   164837600
+       .long   3931993737
+       .long   1945663404
+       .long   2821146184
+       .long   4221700311
+       .long   1925490332
+       .long   329675200
+       .long   3569020178
+       .long   3891326808
+       .long   1347325072
+       .long   4148433327
+       .long   3850980665
+       .long   659350401
+       .long   2843073060
+       .long   3487686321
+       .long   2694650145
+       .long   4001899359
+       .long   3406994035
+       .long   1318700802
+       .long   1391178824
+       .long   2680405347
+       .long   1094332995
+       .long   3708831422
+       .long   2519020775
+       .long   2637401604
+       .long   2782357648
+       .long   1065843399
+       .long   2188665991
+       .long   3122695549
+       .long   743074255
+       .long   979835913
+       .long   1269748001
+       .long   2131686798
+       .long   82364686
+       .long   1950423802
+       .long   1486148511
+       .long   1959671827
+       .long   2539496002
+       .long   4263373596
+       .long   164729372
+       .long   3900847605
+       .long   2972297022
+       .long   3919343654
+       .long   784024708
+       .long   4231779897
+       .long   329458745
+       .long   3506727914
+       .long   1649626749
+       .long   3543720013
+       .long   1568049417
+       .long   4168592498
+       .long   658917491
+       .long   2718488532
+       .long   3299253499
+       .long   2792472730
+       .long   3136098835
+       .long   4042217701
+       .long   1317834983
+       .long   1142009769
+       .long   2303539703
+       .long   1289978165
+       .long   1977230375
+       .long   3789468107
+       .long   2635669967
+       .long   2284019538
+       .long   312112110
+       .long   2579956331
+       .long   3954460750
+       .long   3283968918
+       .long   976372639
+       .long   273071781
+       .long   624224221
+       .long   864945366
+       .long   3613954205
+       .long   2272970540
+       .long   1952745279
+       .long   546143563
+       .long   1248448442
+       .long   1729890733
+       .long   2932941114
+       .long   250973784
+       .long   3905490559
+       .long   1092287127
+       .long   2496896884
+       .long   3459781466
+       .long   1570914932
+       .long   501947569
+       .long   3516013822
+       .long   2184574254
+       .long   698826472
+       .long   2624595636
+       .long   3141829865
+       .long   1003895138
+       .long   2737060348
+       .long   74181213
+       .long   1397652945
+       .long   954223976
+       .long   1988692435
+       .long   2007790276
+       .long   1179153400
+       .long   148362426
+       .long   2795305890
+       .long   1908447953
+       .long   3977384870
+       .long   4015580553
+       .long   2358306800
+       .long   296724853
+       .long   1295644484
+       .long   3816895906
+       .long   3659802444
+       .long   3736193810
+       .long   421646305
+       .long   593449707
+       .long   2591288968
+       .long   3338824517
+       .long   3024637593
+       .long   3177420325
+       .long   843292611
+       .long   1186899415
+       .long   887610640
+       .long   2382681739
+       .long   1754307891
+       .long   2059873354
+       .long   1686585223
+       .long   2373798830
+       .long   1775221280
+       .long   470396183
+       .long   3508615783
+       .long   4119746708
+       .long   3373170446
+       .long   452630365
+       .long   3550442561
+       .long   940792367
+       .long   2722264270
+       .long   3944526121
+       .long   2451373597
+       .long   905260731
+       .long   2805917826
+       .long   1881584735
+       .long   1149561244
+       .long   3594084947
+       .long   607779899
+       .long   1810521462
+       .long   1316868356
+       .long   3763169470
+       .long   2299122488
+       .long   2893202598
+       .long   1215559799
+       .long   3621042925
+       .long   2633736712
+       .long   3231371645
+       .long   303277681
+       .long   1491437901
+       .long   2431119599
+       .long   2947118554
+       .long   972506129
+       .long   2167775995
+       .long   606555363
+       .long   2982875802
+       .long   567271902
+       .long   1599269812
+       .long   1945012259
+       .long   40584695
+       .long   1213110727
+       .long   1670784308
+       .long   1134543805
+       .long   3198539624
+       .long   3890024518
+       .long   81169391
+       .long   2426221454
+       .long   3341568617
+       .long   2269087610
+       .long   2102111953
+       .long   3485081741
+       .long   162338783
+       .long   557475612
+       .long   2388169939
+       .long   243207925
+       .long   4204223906
+       .long   2675196186
+       .long   324677567
+       .long   1114951224
+       .long   481372583
+       .long   486415851
+       .long   4113480516
+       .long   1055425077
+       .long   649355134
+       .long   2229902448
+       .long   962745166
+       .long   972831702
+       .long   3931993737
+       .long   2110850155
+       .long   1298710268
+       .long   164837600
+       .long   1925490332
+       .long   1945663404
+       .long   3569020178
+       .long   4221700311
+       .long   2597420537
+       .long   329675200
+       .long   3850980665
+       .long   3891326808
+       .long   2843073060
+       .long   4148433327
+       .long   899873778
+       .long   659350401
+       .long   3406994035
+       .long   3487686321
+       .long   1391178824
+       .long   4001899359
+       .long   1799747556
+       .long   1318700802
+       .long   2519020775
+       .long   2680405347
+       .long   2782357648
+       .long   3708831422
+       .long   3599495112
+       .long   2637401604
+       .long   743074255
+       .long   1065843399
+       .long   1269748001
+       .long   3122695549
+       .long   2904022928
+       .long   979835913
+       .long   1486148511
+       .long   2131686798
+       .long   2539496002
+       .long   1950423802
+       .long   1513078560
+       .long   1959671827
+       .long   2972297022
+       .long   4263373596
+       .long   784024708
+       .long   3900847605
+       .long   3026157121
+       .long   3919343654
+       .long   1649626749
+       .long   4231779897
+       .long   1568049417
+       .long   3506727914
+       .long   1757346946
+       .long   3543720013
+       .long   3299253499
+       .long   4168592498
+       .long   3136098835
+       .long   2718488532
+       .long   3514693892
+       .long   2792472730
+       .long   2303539703
+       .long   4042217701
+       .long   1977230375
+       .long   1142009769
+       .long   2734420489
+       .long   1289978165
+       .long   312112110
+       .long   3789468107
+       .long   3954460750
+       .long   2284019538
+       .long   1173873683
+       .long   2579956331
+       .long   624224221
+       .long   3283968918
+       .long   3613954205
+       .long   273071781
+       .long   2347747367
+       .long   864945366
+       .long   1248448442
+       .long   2272970540
+       .long   2932941114
+       .long   546143563
+       .long   400527438
+       .long   1729890733
+       .long   2496896884
+       .long   250973784
+       .long   1570914932
+       .long   1092287127
+       .long   801054876
+       .long   3459781466
+       .long   698826472
+       .long   501947569
+       .long   3141829865
+       .long   2184574254
+       .long   1602109753
+       .long   2624595636
+       .long   1397652945
+       .long   1003895138
+       .long   1988692435
+       .long   74181213
+       .long   3204219507
+       .long   954223976
+       .long   2795305890
+       .long   2007790276
+       .long   3977384870
+       .long   148362426
+       .long   2113471718
+       .long   1908447953
+       .long   1295644484
+       .long   4015580553
+       .long   3659802444
+       .long   296724853
+       .long   4226943436
+       .long   3816895906
+       .long   2591288968
+       .long   3736193810
+       .long   3024637593
+       .long   593449707
+       .long   4158919577
+       .long   3338824517
+       .long   887610640
+       .long   3177420325
+       .long   1754307891
+       .long   1186899415
+       .long   4022871858
+       .long   2382681739
+       .long   1775221280
+       .long   2059873354
+       .long   3508615783
+       .long   2373798830
+       .long   3750776420
+       .long   470396183
+       .long   3550442561
+       .long   4119746708
+       .long   2722264270
+       .long   452630365
+       .long   3206585544
+       .long   940792367
+       .long   2805917826
+       .long   3944526121
+       .long   1149561244
+       .long   905260731
+       .long   2118203793
+       .long   1881584735
+       .long   1316868356
+       .long   3594084947
+       .long   2299122488
+       .long   1810521462
+       .long   4236407587
+       .long   3763169470
+       .long   2633736712
+       .long   2893202598
+       .long   303277681
+       .long   3621042925
+       .long   4177847879
+       .long   3231371645
+       .long   972506129
+       .long   1491437901
+       .long   606555363
+       .long   2947118554
+       .long   4060728462
+       .long   2167775995
+       .long   1945012259
+       .long   2982875802
+       .long   1213110727
+       .long   1599269812
+       .long   3826489629
+       .long   40584695
+       .long   3890024518
+       .long   1670784308
+       .long   2426221454
+       .long   3198539624
+       .long   3358011962
+       .long   81169391
+       .long   3485081741
+       .long   3341568617
+       .long   557475612
+       .long   2102111953
+       .long   2421056629
+       .long   162338783
+       .long   2675196186
+       .long   2388169939
+       .long   1114951224
+       .long   4204223906
+       .long   547145963
+       .long   324677567
+       .long   1055425077
+       .long   481372583
+       .long   2229902448
+       .long   4113480516
+       .long   1094291926
+       .long   649355134
+       .long   2110850155
+       .long   962745166
+       .long   164837600
+       .long   3931993737
+       .long   2188583852
+       .long   1298710268
+       .long   4221700311
+       .long   1925490332
+       .long   329675200
+       .long   3569020178
+       .long   82200408
+       .long   2597420537
+       .long   4148433327
+       .long   3850980665
+       .long   659350401
+       .long   2843073060
+       .long   164400817
+       .long   899873778
+       .long   4001899359
+       .long   3406994035
+       .long   1318700802
+       .long   1391178824
+       .long   328801635
+       .long   1799747556
+       .long   3708831422
+       .long   2519020775
+       .long   2637401604
+       .long   2782357648
+       .long   657603271
+       .long   3599495112
+       .long   3122695549
+       .long   743074255
+       .long   979835913
+       .long   1269748001
+       .long   1315206542
+       .long   2904022928
+       .long   1950423802
+       .long   1486148511
+       .long   1959671827
+       .long   2539496002
+       .long   2630413084
+       .long   1513078560
+       .long   3900847605
+       .long   2972297022
+       .long   3919343654
+       .long   784024708
+       .long   965858873
+       .long   3026157121
+       .long   3506727914
+       .long   1649626749
+       .long   3543720013
+       .long   1568049417
+       .long   1931717747
+       .long   1757346946
+       .long   2718488532
+       .long   3299253499
+       .long   2792472730
+       .long   3136098835
+       .long   3863435494
+       .long   3514693892
+       .long   1142009769
+       .long   2303539703
+       .long   1289978165
+       .long   1977230375
+       .long   3431903692
+       .long   2734420489
+       .long   2284019538
+       .long   312112110
+       .long   2579956331
+       .long   3954460750
+       .long   2568840088
+       .long   1173873683
+       .long   273071781
+       .long   624224221
+       .long   864945366
+       .long   3613954205
+       .long   842712880
+       .long   2347747367
+       .long   546143563
+       .long   1248448442
+       .long   1729890733
+       .long   2932941114
+       .long   1685425760
+       .long   400527438
+       .long   1092287127
+       .long   2496896884
+       .long   3459781466
+       .long   1570914932
+       .long   3370851521
+       .long   801054876
+       .long   2184574254
+       .long   698826472
+       .long   2624595636
+       .long   3141829865
+       .long   2446735747
+       .long   1602109753
+       .long   74181213
+       .long   1397652945
+       .long   954223976
+       .long   1988692435
+       .long   598504198
+       .long   3204219507
+       .long   148362426
+       .long   2795305890
+       .long   1908447953
+       .long   3977384870
+       .long   1197008397
+       .long   2113471718
+       .long   296724853
+       .long   1295644484
+       .long   3816895906
+       .long   3659802444
+       .long   2394016794
+       .long   4226943436
+       .long   593449707
+       .long   2591288968
+       .long   3338824517
+       .long   3024637593
+       .long   493066293
+       .long   4158919577
+       .long   1186899415
+       .long   887610640
+       .long   2382681739
+       .long   1754307891
+       .long   986132586
+       .long   4022871858
+       .long   2373798830
+       .long   1775221280
+       .long   470396183
+       .long   3508615783
+       .long   1972265172
+       .long   3750776420
+       .long   452630365
+       .long   3550442561
+       .long   940792367
+       .long   2722264270
+       .long   3944530345
+       .long   3206585544
+       .long   905260731
+       .long   2805917826
+       .long   1881584735
+       .long   1149561244
+       .long   3594093395
+       .long   2118203793
+       .long   1810521462
+       .long   1316868356
+       .long   3763169470
+       .long   2299122488
+       .long   2893219494
+       .long   4236407587
+       .long   3621042925
+       .long   2633736712
+       .long   3231371645
+       .long   303277681
+       .long   1491471692
+       .long   4177847879
+       .long   2947118554
+       .long   972506129
+       .long   2167775995
+       .long   606555363
+       .long   2982943385
+       .long   4060728462
+       .long   1599269812
+       .long   1945012259
+       .long   40584695
+       .long   1213110727
+       .long   1670919475
+       .long   3826489629
+       .long   3198539624
+       .long   3890024518
+       .long   81169391
+       .long   2426221454
+       .long   3341838951
+       .long   3358011962
+       .long   2102111953
+       .long   3485081741
+       .long   162338783
+       .long   557475612
+       .long   2388710606
+       .long   2421056629
+       .long   4204223906
+       .long   2675196186
+       .long   324677567
+       .long   1114951224
+       .long   482453916
+       .long   547145963
+       .long   4113480516
+       .long   1055425077
+       .long   649355134
+       .long   2229902448
+       .long   964907833
+       .long   1094291926
+       .long   3931993737
+       .long   2110850155
+       .long   1298710268
+       .long   164837600
+       .long   1929815667
+       .long   2188583852
+       .long   3569020178
+       .long   4221700311
+       .long   2597420537
+       .long   329675200
+       .long   3859631335
+       .long   82200408
+       .long   2843073060
+       .long   4148433327
+       .long   899873778
+       .long   659350401
+       .long   3424295375
+       .long   164400817
+       .long   1391178824
+       .long   4001899359
+       .long   1799747556
+       .long   1318700802
+       .long   2553623455
+       .long   328801635
+       .long   2782357648
+       .long   3708831422
+       .long   3599495112
+       .long   2637401604
+       .long   812279614
+       .long   657603271
+       .long   1269748001
+       .long   3122695549
+       .long   2904022928
+       .long   979835913
+       .long   1624559229
+       .long   1315206542
+       .long   2539496002
+       .long   1950423802
+       .long   1513078560
+       .long   1959671827
+       .long   3249118458
+       .long   2630413084
+       .long   784024708
+       .long   3900847605
+       .long   3026157121
+       .long   3919343654
+       .long   2203269620
+       .long   965858873
+       .long   1568049417
+       .long   3506727914
+       .long   1757346946
+       .long   3543720013
+       .long   111571945
+       .long   1931717747
+       .long   3136098835
+       .long   2718488532
+       .long   3514693892
+       .long   2792472730
+       .long   223143890
+       .long   3863435494
+       .long   1977230375
+       .long   1142009769
+       .long   2734420489
+       .long   1289978165
+       .long   446287780
+       .long   3431903692
+       .long   3954460750
+       .long   2284019538
+       .long   1173873683
+       .long   2579956331
+       .long   892575561
+       .long   2568840088
+       .long   3613954205
+       .long   273071781
+       .long   2347747367
+       .long   864945366
+       .long   1785151123
+       .long   842712880
+       .long   2932941114
+       .long   546143563
+       .long   400527438
+       .long   1729890733
+       .long   3570302247
+       .long   1685425760
+       .long   1570914932
+       .long   1092287127
+       .long   801054876
+       .long   3459781466
+       .long   2845637198
+       .long   3370851521
+       .long   3141829865
+       .long   2184574254
+       .long   1602109753
+       .long   2624595636
+       .long   1396307100
+       .long   2446735747
+       .long   1988692435
+       .long   74181213
+       .long   3204219507
+       .long   954223976
+       .long   2792614201
+       .long   598504198
+       .long   3977384870
+       .long   148362426
+       .long   2113471718
+       .long   1908447953
+       .long   1290261106
+       .long   1197008397
+       .long   3659802444
+       .long   296724853
+       .long   4226943436
+       .long   3816895906
+       .long   2580522212
+       .long   2394016794
+       .long   3024637593
+       .long   593449707
+       .long   4158919577
+       .long   3338824517
+       .long   866077128
+       .long   493066293
+       .long   1754307891
+       .long   1186899415
+       .long   4022871858
+       .long   2382681739
+       .long   1732154256
+       .long   986132586
+       .long   3508615783
+       .long   2373798830
+       .long   3750776420
+       .long   470396183
+       .long   3464308513
+       .long   1972265172
+       .long   2722264270
+       .long   452630365
+       .long   3206585544
+       .long   940792367
+       .long   2633649730
+       .long   3944530345
+       .long   1149561244
+       .long   905260731
+       .long   2118203793
+       .long   1881584735
+       .long   972332164
+       .long   3594093395
+       .long   2299122488
+       .long   1810521462
+       .long   4236407587
+       .long   3763169470
+       .long   1944664328
+       .long   2893219494
+       .long   303277681
+       .long   3621042925
+       .long   4177847879
+       .long   3231371645
+       .long   3889328657
+       .long   1491471692
+       .long   606555363
+       .long   2947118554
+       .long   4060728462
+       .long   2167775995
+       .long   3483690018
+       .long   2982943385
+       .long   1213110727
+       .long   1599269812
+       .long   3826489629
+       .long   40584695
+       .long   2672412741
+       .long   1670919475
+       .long   2426221454
+       .long   3198539624
+       .long   3358011962
+       .long   81169391
+       .long   1049858187
+       .long   3341838951
+       .long   557475612
+       .long   2102111953
+       .long   2421056629
+       .long   162338783
+       .long   2099716375
+       .long   2388710606
+       .long   1114951224
+       .long   4204223906
+       .long   547145963
+       .long   324677567
+       .long   4199432751
+       .long   482453916
+       .long   2229902448
+       .long   4113480516
+       .long   1094291926
+       .long   649355134
+       .long   4103898207
+       .long   964907833
+       .long   164837600
+       .long   3931993737
+       .long   2188583852
+       .long   1298710268
+       .long   3912829119
+       .long   1929815667
+       .long   329675200
+       .long   3569020178
+       .long   82200408
+       .long   2597420537
+       .long   3530690942
+       .long   3859631335
+       .long   659350401
+       .long   2843073060
+       .long   164400817
+       .long   899873778
+       .long   2766414588
+       .long   3424295375
+       .long   1318700802
+       .long   1391178824
+       .long   328801635
+       .long   1799747556
+       .long   1237861880
+       .long   2553623455
+       .long   2637401604
+       .long   2782357648
+       .long   657603271
+       .long   3599495112
+       .long   2475723761
+       .long   812279614
+       .long   979835913
+       .long   1269748001
+       .long   1315206542
+       .long   2904022928
+       .long   656480226
+       .long   1624559229
+       .long   1959671827
+       .long   2539496002
+       .long   2630413084
+       .long   1513078560
+       .long   1312960453
+       .long   3249118458
+       .long   3919343654
+       .long   784024708
+       .long   965858873
+       .long   3026157121
+       .long   2625920907
+       .long   2203269620
+       .long   3543720013
+       .long   1568049417
+       .long   1931717747
+       .long   1757346946
+       .long   956874519
+       .long   111571945
+       .long   2792472730
+       .long   3136098835
+       .long   3863435494
+       .long   3514693892
+       .long   1913749038
+       .long   223143890
+       .long   1289978165
+       .long   1977230375
+       .long   3431903692
+       .long   2734420489
+       .long   3827498077
+       .long   446287780
+       .long   2579956331
+       .long   3954460750
+       .long   2568840088
+       .long   1173873683
+       .long   3360028859
+       .long   892575561
+       .long   864945366
+       .long   3613954205
+       .long   842712880
+       .long   2347747367
+       .long   2425090423
+       .long   1785151123
+       .long   1729890733
+       .long   2932941114
+       .long   1685425760
+       .long   400527438
+       .long   555213551
+       .long   3570302247
+       .long   3459781466
+       .long   1570914932
+       .long   3370851521
+       .long   801054876
+       .long   1110427102
+       .long   2845637198
+       .long   2624595636
+       .long   3141829865
+       .long   2446735747
+       .long   1602109753
+       .long   2220854205
+       .long   1396307100
+       .long   954223976
+       .long   1988692435
+       .long   598504198
+       .long   3204219507
+       .long   146741115
+       .long   2792614201
+       .long   1908447953
+       .long   3977384870
+       .long   1197008397
+       .long   2113471718
+       .long   293482231
+       .long   1290261106
+       .long   3816895906
+       .long   3659802444
+       .long   2394016794
+       .long   4226943436
+       .long   586964463
+       .long   2580522212
+       .long   3338824517
+       .long   3024637593
+       .long   493066293
+       .long   4158919577
+       .long   1173928927
+       .long   866077128
+       .long   2382681739
+       .long   1754307891
+       .long   986132586
+       .long   4022871858
+       .long   2347857855
+       .long   1732154256
+       .long   470396183
+       .long   3508615783
+       .long   1972265172
+       .long   3750776420
+       .long   400748414
+       .long   3464308513
+       .long   940792367
+       .long   2722264270
+       .long   3944530345
+       .long   3206585544
+       .long   801496828
+       .long   2633649730
+       .long   1881584735
+       .long   1149561244
+       .long   3594093395
+       .long   2118203793
+       .long   1602993657
+       .long   972332164
+       .long   3763169470
+       .long   2299122488
+       .long   2893219494
+       .long   4236407587
+       .long   3205987314
+       .long   1944664328
+       .long   3231371645
+       .long   303277681
+       .long   1491471692
+       .long   4177847879
+       .long   2117007332
+       .long   3889328657
+       .long   2167775995
+       .long   606555363
+       .long   2982943385
+       .long   4060728462
+       .long   4234014665
+       .long   3483690018
+       .long   40584695
+       .long   1213110727
+       .long   1670919475
+       .long   3826489629
+       .long   4173062034
+       .long   2672412741
+       .long   81169391
+       .long   2426221454
+       .long   3341838951
+       .long   3358011962
+       .long   4051156773
+       .long   1049858187
+       .long   162338783
+       .long   557475612
+       .long   2388710606
+       .long   2421056629
+       .long   3807346250
+       .long   2099716375
+       .long   324677567
+       .long   1114951224
+       .long   482453916
+       .long   547145963
+       .long   3319725204
+       .long   4199432751
+       .long   649355134
+       .long   2229902448
+       .long   964907833
+       .long   1094291926
+       .long   2344483112
+       .long   4103898207
+       .long   1298710268
+       .long   164837600
+       .long   1929815667
+       .long   2188583852
+       .long   393998928
+       .long   3912829119
+       .long   2597420537
+       .long   329675200
+       .long   3859631335
+       .long   82200408
+       .long   787997856
+       .long   3530690942
+       .long   899873778
+       .long   659350401
+       .long   3424295375
+       .long   164400817
+       .long   1575995713
+       .long   2766414588
+       .long   1799747556
+       .long   1318700802
+       .long   2553623455
+       .long   328801635
+       .long   3151991427
+       .long   1237861880
+       .long   3599495112
+       .long   2637401604
+       .long   812279614
+       .long   657603271
+       .long   2009015559
+       .long   2475723761
+       .long   2904022928
+       .long   979835913
+       .long   1624559229
+       .long   1315206542
+       .long   4018031118
+       .long   656480226
+       .long   1513078560
+       .long   1959671827
+       .long   3249118458
+       .long   2630413084
+       .long   3741094941
+       .long   1312960453
+       .long   3026157121
+       .long   3919343654
+       .long   2203269620
+       .long   965858873
+       .long   3187222587
+       .long   2625920907
+       .long   1757346946
+       .long   3543720013
+       .long   111571945
+       .long   1931717747
+       .long   2079477878
+       .long   956874519
+       .long   3514693892
+       .long   2792472730
+       .long   223143890
+       .long   3863435494
+       .long   4158955756
+       .long   1913749038
+       .long   2734420489
+       .long   1289978165
+       .long   446287780
+       .long   3431903692
+       .long   4022944216
+       .long   3827498077
+       .long   1173873683
+       .long   2579956331
+       .long   892575561
+       .long   2568840088
+       .long   3750921137
+       .long   3360028859
+       .long   2347747367
+       .long   864945366
+       .long   1785151123
+       .long   842712880
+       .long   3206874979
+       .long   2425090423
+       .long   400527438
+       .long   1729890733
+       .long   3570302247
+       .long   1685425760
+       .long   2118782663
+       .long   555213551
+       .long   801054876
+       .long   3459781466
+       .long   2845637198
+       .long   3370851521
+       .long   4237565327
+       .long   1110427102
+       .long   1602109753
+       .long   2624595636
+       .long   1396307100
+       .long   2446735747
+       .long   4180163359
+       .long   2220854205
+       .long   3204219507
+       .long   954223976
+       .long   2792614201
+       .long   598504198
+       .long   4065359423
+       .long   146741115
+       .long   2113471718
+       .long   1908447953
+       .long   1290261106
+       .long   1197008397
+       .long   3835751551
+       .long   293482231
+       .long   4226943436
+       .long   3816895906
+       .long   2580522212
+       .long   2394016794
+       .long   3376535807
+       .long   586964463
+       .long   4158919577
+       .long   3338824517
+       .long   866077128
+       .long   493066293
+       .long   2458104319
+       .long   1173928927
+       .long   4022871858
+       .long   2382681739
+       .long   1732154256
+       .long   986132586
+       .long   621241343
+       .long   2347857855
+       .long   3750776420
+       .long   470396183
+       .long   3464308513
+       .long   1972265172
+       .long   1242482686
+       .long   400748414
+       .long   3206585544
+       .long   940792367
+       .long   2633649730
+       .long   3944530345
+       .long   2484965372
+       .long   801496828
+       .long   2118203793
+       .long   1881584735
+       .long   972332164
+       .long   3594093395
+       .long   674963448
+       .long   1602993657
+       .long   4236407587
+       .long   3763169470
+       .long   1944664328
+       .long   2893219494
+       .long   1349926897
+       .long   3205987314
+       .long   4177847879
+       .long   3231371645
+       .long   3889328657
+       .long   1491471692
+       .long   2699853794
+       .long   2117007332
+       .long   4060728462
+       .long   2167775995
+       .long   3483690018
+       .long   2982943385
+       .long   1104740292
+       .long   4234014665
+       .long   3826489629
+       .long   40584695
+       .long   2672412741
+       .long   1670919475
+       .long   2209480585
+       .long   4173062034
+       .long   3358011962
+       .long   81169391
+       .long   1049858187
+       .long   3341838951
+       .long   123993874
+       .long   4051156773
+       .long   2421056629
+       .long   162338783
+       .long   2099716375
+       .long   2388710606
+       .long   247987749
+       .long   3807346250
+       .long   547145963
+       .long   324677567
+       .long   4199432751
+       .long   482453916
+       .long   495975499
+       .long   3319725204
+       .long   1094291926
+       .long   649355134
+       .long   4103898207
+       .long   964907833
+       .long   991950999
+       .long   2344483112
+       .long   2188583852
+       .long   1298710268
+       .long   3912829119
+       .long   1929815667
+       .long   1983901999
+       .long   393998928
+       .long   82200408
+       .long   2597420537
+       .long   3530690942
+       .long   3859631335
+       .long   3967803999
+       .long   787997856
+       .long   164400817
+       .long   899873778
+       .long   2766414588
+       .long   3424295375
+       .long   3640640703
+       .long   1575995713
+       .long   328801635
+       .long   1799747556
+       .long   1237861880
+       .long   2553623455
+       .long   2986314111
+       .long   3151991427
+       .long   657603271
+       .long   3599495112
+       .long   2475723761
+       .long   812279614
+       .long   1677660927
+       .long   2009015559
+       .long   1315206542
+       .long   2904022928
+       .long   656480226
+       .long   1624559229
+       .long   3355321855
+       .long   4018031118
+       .long   2630413084
+       .long   1513078560
+       .long   1312960453
+       .long   3249118458
+       .long   2415676415
+       .long   3741094941
+       .long   965858873
+       .long   3026157121
+       .long   2625920907
+       .long   2203269620
+       .long   536385535
+       .long   3187222587
+       .long   1931717747
+       .long   1757346946
+       .long   956874519
+       .long   111571945
+       .long   1072771071
+       .long   2079477878
+       .long   3863435494
+       .long   3514693892
+       .long   1913749038
+       .long   223143890
+       .long   2145542143
+       .long   4158955756
+       .long   3431903692
+       .long   2734420489
+       .long   3827498077
+       .long   446287780
+       .long   4291084286
+       .long   4022944216
+       .long   2568840088
+       .long   1173873683
+       .long   3360028859
+       .long   892575561
+       .long   4287201277
+       .long   3750921137
+       .long   842712880
+       .long   2347747367
+       .long   2425090423
+       .long   1785151123
+       .long   4279435259
+       .long   3206874979
+       .long   1685425760
+       .long   400527438
+       .long   555213551
+       .long   3570302247
+       .long   4263903223
+       .long   2118782663
+       .long   3370851521
+       .long   801054876
+       .long   1110427102
+       .long   2845637198
+       .long   4232839151
+       .long   4237565327
+       .long   2446735747
+       .long   1602109753
+       .long   2220854205
+       .long   1396307100
+       .long   4170711006
+       .long   4180163359
+       .long   598504198
+       .long   3204219507
+       .long   146741115
+       .long   2792614201
+       .long   4046454716
+       .long   4065359423
+       .long   1197008397
+       .long   2113471718
+       .long   293482231
+       .long   1290261106
+       .long   3797942136
+       .long   3835751551
+       .long   2394016794
+       .long   4226943436
+       .long   586964463
+       .long   2580522212
+       .long   3300916976
+       .long   3376535807
+       .long   493066293
+       .long   4158919577
+       .long   1173928927
+       .long   866077128
+       .long   2306866656
+       .long   2458104319
+       .long   986132586
+       .long   4022871858
+       .long   2347857855
+       .long   1732154256
+       .long   318766016
+       .long   621241343
+       .long   1972265172
+       .long   3750776420
+       .long   400748414
+       .long   3464308513
+       .long   637532033
+       .long   1242482686
+       .long   3944530345
+       .long   3206585544
+       .long   801496828
+       .long   2633649730
+       .long   1275064066
+       .long   2484965372
+       .long   3594093395
+       .long   2118203793
+       .long   1602993657
+       .long   972332164
+       .long   2550128133
+       .long   674963448
+       .long   2893219494
+       .long   4236407587
+       .long   3205987314
+       .long   1944664328
+       .long   805288971
+       .long   1349926897
+       .long   1491471692
+       .long   4177847879
+       .long   2117007332
+       .long   3889328657
+       .long   1610577942
+       .long   2699853794
+       .long   2982943385
+       .long   4060728462
+       .long   4234014665
+       .long   3483690018
+       .long   3221155884
+       .long   1104740292
+       .long   1670919475
+       .long   3826489629
+       .long   4173062034
+       .long   2672412741
+       .long   2147344473
+       .long   2209480585
+       .long   3341838951
+       .long   3358011962
+       .long   4051156773
+       .long   1049858187
+       .long   4294688947
+       .long   123993874
+       .long   2388710606
+       .long   2421056629
+       .long   3807346250
+       .long   2099716375
+       .long   4294410598
+       .long   247987749
+       .long   482453916
+       .long   547145963
+       .long   3319725204
+       .long   4199432751
+       .long   4293853900
+       .long   495975499
+       .long   964907833
+       .long   1094291926
+       .long   2344483112
+       .long   4103898207
+       .long   4292740504
+       .long   991950999
+       .long   1929815667
+       .long   2188583852
+       .long   393998928
+       .long   3912829119
+       .long   4290513712
+       .long   1983901999
+       .long   3859631335
+       .long   82200408
+       .long   787997856
+       .long   3530690942
+       .long   4286060128
+       .long   3967803999
+       .long   3424295375
+       .long   164400817
+       .long   1575995713
+       .long   2766414588
+       .long   4277152960
+       .long   3640640703
+       .long   2553623455
+       .long   328801635
+       .long   3151991427
+       .long   1237861880
+       .long   4259338624
+       .long   2986314111
+       .long   812279614
+       .long   657603271
+       .long   2009015559
+       .long   2475723761
+       .long   4223709953
+       .long   1677660927
+       .long   1624559229
+       .long   1315206542
+       .long   4018031118
+       .long   656480226
+       .long   4152452611
+       .long   3355321855
+       .long   3249118458
+       .long   2630413084
+       .long   3741094941
+       .long   1312960453
+       .long   4009937927
+       .long   2415676415
+       .long   2203269620
+       .long   965858873
+       .long   3187222587
+       .long   2625920907
+       .long   3724908559
+       .long   536385535
+       .long   111571945
+       .long   1931717747
+       .long   2079477878
+       .long   956874519
+       .long   3154849823
+       .long   1072771071
+       .long   223143890
+       .long   3863435494
+       .long   4158955756
+       .long   1913749038
+       .long   2014732351
+       .long   2145542143
+       .long   446287780
+       .long   3431903692
+       .long   4022944216
+       .long   3827498077
+       .long   4029464703
+       .long   4291084286
+       .long   892575561
+       .long   2568840088
+       .long   3750921137
+       .long   3360028859
+       .long   3763962110
+       .long   4287201277
+       .long   1785151123
+       .long   842712880
+       .long   3206874979
+       .long   2425090423
+       .long   3232956925
+       .long   4279435259
+       .long   3570302247
+       .long   1685425760
+       .long   2118782663
+       .long   555213551
+       .long   2170946555
+       .long   4263903223
+       .long   2845637198
+       .long   3370851521
+       .long   4237565327
+       .long   1110427102
+       .long   46925815
+       .long   4232839151
+       .long   1396307100
+       .long   2446735747
+       .long   4180163359
+       .long   2220854205
+       .long   93851631
+       .long   4170711006
+       .long   2792614201
+       .long   598504198
+       .long   4065359423
+       .long   146741115
+       .long   187703262
+       .long   4046454716
+       .long   1290261106
+       .long   1197008397
+       .long   3835751551
+       .long   293482231
+       .long   375406524
+       .long   3797942136
+       .long   2580522212
+       .long   2394016794
+       .long   3376535807
+       .long   586964463
+       .long   750813049
+       .long   3300916976
+       .long   866077128
+       .long   493066293
+       .long   2458104319
+       .long   1173928927
+       .long   1501626098
+       .long   2306866656
+       .long   1732154256
+       .long   986132586
+       .long   621241343
+       .long   2347857855
+       .long   3003252197
+       .long   318766016
+       .long   3464308513
+       .long   1972265172
+       .long   1242482686
+       .long   400748414
+       .long   1711537099
+       .long   637532033
+       .long   2633649730
+       .long   3944530345
+       .long   2484965372
+       .long   801496828
+       .long   3423074199
+       .long   1275064066
+       .long   972332164
+       .long   3594093395
+       .long   674963448
+       .long   1602993657
+       .long   2551181103
+       .long   2550128133
+       .long   1944664328
+       .long   2893219494
+       .long   1349926897
+       .long   3205987314
+       .long   807394910
+       .long   805288971
+       .long   3889328657
+       .long   1491471692
+       .long   2699853794
+       .long   2117007332
+       .long   1614789820
+       .long   1610577942
+       .long   3483690018
+       .long   2982943385
+       .long   1104740292
+       .long   4234014665
+       .long   3229579640
+       .long   3221155884
+       .long   2672412741
+       .long   1670919475
+       .long   2209480585
+       .long   4173062034
+       .long   2164191985
+       .long   2147344473
+       .long   1049858187
+       .long   3341838951
+       .long   123993874
+       .long   4051156773
+       .long   33416674
+       .long   4294688947
+       .long   2099716375
+       .long   2388710606
+       .long   247987749
+       .long   3807346250
+       .long   66833348
+       .long   4294410598
+       .long   4199432751
+       .long   482453916
+       .long   495975499
+       .long   3319725204
+       .long   133666696
+       .long   4293853900
+       .long   4103898207
+       .long   964907833
+       .long   991950999
+       .long   2344483112
+       .long   267333393
+       .long   4292740504
+       .long   3912829119
+       .long   1929815667
+       .long   1983901999
+       .long   393998928
+       .long   534666787
+       .long   4290513712
+       .long   3530690942
+       .long   3859631335
+       .long   3967803999
+       .long   787997856
+       .long   1069333574
+       .long   4286060128
+       .long   2766414588
+       .long   3424295375
+       .long   3640640703
+       .long   1575995713
+       .long   2138667148
+       .long   4277152960
+       .long   1237861880
+       .long   2553623455
+       .long   2986314111
+       .long   3151991427
+       .long   4277334296
+       .long   4259338624
+       .long   2475723761
+       .long   812279614
+       .long   1677660927
+       .long   2009015559
+       .long   4259701297
+       .long   4223709953
+       .long   656480226
+       .long   1624559229
+       .long   3355321855
+       .long   4018031118
+       .long   4224435298
+       .long   4152452611
+       .long   1312960453
+       .long   3249118458
+       .long   2415676415
+       .long   3741094941
+       .long   4153903301
+       .long   4009937927
+       .long   2625920907
+       .long   2203269620
+       .long   536385535
+       .long   3187222587
+       .long   4012839307
+       .long   3724908559
+       .long   956874519
+       .long   111571945
+       .long   1072771071
+       .long   2079477878
+       .long   3730711318
+       .long   3154849823
+       .long   1913749038
+       .long   223143890
+       .long   2145542143
+       .long   4158955756
+       .long   3166455341
+       .long   2014732351
+       .long   3827498077
+       .long   446287780
+       .long   4291084286
+       .long   4022944216
+       .long   2037943386
+       .long   4029464703
+       .long   3360028859
+       .long   892575561
+       .long   4287201277
+       .long   3750921137
+       .long   4075886773
+       .long   3763962110
+       .long   2425090423
+       .long   1785151123
+       .long   4279435259
+       .long   3206874979
+       .long   3856806251
+       .long   3232956925
+       .long   555213551
+       .long   3570302247
+       .long   4263903223
+       .long   2118782663
+       .long   3418645206
+       .long   2170946555
+       .long   1110427102
+       .long   2845637198
+       .long   4232839151
+       .long   4237565327
+       .long   2542323117
+       .long   46925815
+       .long   2220854205
+       .long   1396307100
+       .long   4170711006
+       .long   4180163359
+       .long   789678938
+       .long   93851631
+       .long   146741115
+       .long   2792614201
+       .long   4046454716
+       .long   4065359423
+       .long   1579357876
+       .long   187703262
+       .long   293482231
+       .long   1290261106
+       .long   3797942136
+       .long   3835751551
+       .long   3158715752
+       .long   375406524
+       .long   586964463
+       .long   2580522212
+       .long   3300916976
+       .long   3376535807
+       .long   2022464208
+       .long   750813049
+       .long   1173928927
+       .long   866077128
+       .long   2306866656
+       .long   2458104319
+       .long   4044928416
+       .long   1501626098
+       .long   2347857855
+       .long   1732154256
+       .long   318766016
+       .long   621241343
+       .long   3794889537
+       .long   3003252197
+       .long   400748414
+       .long   3464308513
+       .long   637532033
+       .long   1242482686
+       .long   3294811778
+       .long   1711537099
+       .long   801496828
+       .long   2633649730
+       .long   1275064066
+       .long   2484965372
+       .long   2294656261
+       .long   3423074199
+       .long   1602993657
+       .long   972332164
+       .long   2550128133
+       .long   674963448
+       .long   294345226
+       .long   2551181103
+       .long   3205987314
+       .long   1944664328
+       .long   805288971
+       .long   1349926897
+       .long   588690452
+       .long   807394910
+       .long   2117007332
+       .long   3889328657
+       .long   1610577942
+       .long   2699853794
+       .long   1177380905
+       .long   1614789820
+       .long   4234014665
+       .long   3483690018
+       .long   3221155884
+       .long   1104740292
+       .long   2354761811
+       .long   3229579640
+       .long   4173062034
+       .long   2672412741
+       .long   2147344473
+       .long   2209480585
+       .long   414556326
+       .long   2164191985
+       .long   4051156773
+       .long   1049858187
+       .long   4294688947
+       .long   123993874
+       .long   829112653
+       .long   33416674
+       .long   3807346250
+       .long   2099716375
+       .long   4294410598
+       .long   247987749
+       .long   1658225307
+       .long   66833348
+       .long   3319725204
+       .long   4199432751
+       .long   4293853900
+       .long   495975499
+       .long   3316450614
+       .long   133666696
+       .long   2344483112
+       .long   4103898207
+       .long   4292740504
+       .long   991950999
+       .long   2337933933
+       .long   267333393
+       .long   393998928
+       .long   3912829119
+       .long   4290513712
+       .long   1983901999
+       .long   380900570
+       .long   534666787
+       .long   787997856
+       .long   3530690942
+       .long   4286060128
+       .long   3967803999
+       .long   761801140
+       .long   1069333574
+       .long   1575995713
+       .long   2766414588
+       .long   4277152960
+       .long   3640640703
+       .long   1523602280
+       .long   2138667148
+       .long   3151991427
+       .long   1237861880
+       .long   4259338624
+       .long   2986314111
+       .long   3047204561
+       .long   4277334296
+       .long   2009015559
+       .long   2475723761
+       .long   4223709953
+       .long   1677660927
+       .long   1799441827
+       .long   4259701297
+       .long   4018031118
+       .long   656480226
+       .long   4152452611
+       .long   3355321855
+       .long   3598883655
+       .long   4224435298
+       .long   3741094941
+       .long   1312960453
+       .long   4009937927
+       .long   2415676415
+       .long   2902800015
+       .long   4153903301
+       .long   3187222587
+       .long   2625920907
+       .long   3724908559
+       .long   536385535
+       .long   1510632735
+       .long   4012839307
+       .long   2079477878
+       .long   956874519
+       .long   3154849823
+       .long   1072771071
+       .long   3021265470
+       .long   3730711318
+       .long   4158955756
+       .long   1913749038
+       .long   2014732351
+       .long   2145542143
+       .long   1747563645
+       .long   3166455341
+       .long   4022944216
+       .long   3827498077
+       .long   4029464703
+       .long   4291084286
+       .long   3495127291
+       .long   2037943386
+       .long   3750921137
+       .long   3360028859
+       .long   3763962110
+       .long   4287201277
+       .long   2695287286
+       .long   4075886773
+       .long   3206874979
+       .long   2425090423
+       .long   3232956925
+       .long   4279435259
+       .long   1095607277
+       .long   3856806251
+       .long   2118782663
+       .long   555213551
+       .long   2170946555
+       .long   4263903223
+       .long   2191214555
+       .long   3418645206
+       .long   4237565327
+       .long   1110427102
+       .long   46925815
+       .long   4232839151
+       .long   87461814
+       .long   2542323117
+       .long   4180163359
+       .long   2220854205
+       .long   93851631
+       .long   4170711006
+       .long   174923629
+       .long   789678938
+       .long   4065359423
+       .long   146741115
+       .long   187703262
+       .long   4046454716
+       .long   349847258
+       .long   1579357876
+       .long   3835751551
+       .long   293482231
+       .long   375406524
+       .long   3797942136
+       .long   699694516
+       .long   3158715752
+       .long   3376535807
+       .long   586964463
+       .long   750813049
+       .long   3300916976
+       .long   1399389033
+       .long   2022464208
+       .long   2458104319
+       .long   1173928927
+       .long   1501626098
+       .long   2306866656
+       .long   2798778067
+       .long   4044928416
+       .long   621241343
+       .long   2347857855
+       .long   3003252197
+       .long   318766016
+       .long   1302588838
+       .long   3794889537
+       .long   1242482686
+       .long   400748414
+       .long   1711537099
+       .long   637532033
+       .long   2605177677
+       .long   3294811778
+       .long   2484965372
+       .long   801496828
+       .long   3423074199
+       .long   1275064066
+       .long   915388059
+       .long   2294656261
+       .long   674963448
+       .long   1602993657
+       .long   2551181103
+       .long   2550128133
+       .long   1830776118
+       .long   294345226
+       .long   1349926897
+       .long   3205987314
+       .long   807394910
+       .long   805288971
+       .long   3661552236
+       .long   588690452
+       .long   2699853794
+       .long   2117007332
+       .long   1614789820
+       .long   1610577942
+       .long   3028137177
+       .long   1177380905
+       .long   1104740292
+       .long   4234014665
+       .long   3229579640
+       .long   3221155884
+       .long   1761307059
+       .long   2354761811
+       .long   2209480585
+       .long   4173062034
+       .long   2164191985
+       .long   2147344473
+       .long   3522614119
+       .long   414556326
+       .long   123993874
+       .long   4051156773
+       .long   33416674
+       .long   4294688947
+       .long   2750260943
+       .long   829112653
+       .long   247987749
+       .long   3807346250
+       .long   66833348
+       .long   4294410598
+       .long   1205554591
+       .long   1658225307
+       .long   495975499
+       .long   3319725204
+       .long   133666696
+       .long   4293853900
+       .long   2411109183
+       .long   3316450614
+       .long   991950999
+       .long   2344483112
+       .long   267333393
+       .long   4292740504
+       .long   527251070
+       .long   2337933933
+       .long   1983901999
+       .long   393998928
+       .long   534666787
+       .long   4290513712
+       .long   1054502141
+       .long   380900570
+       .long   3967803999
+       .long   787997856
+       .long   1069333574
+       .long   4286060128
+       .long   2109004283
+       .long   761801140
+       .long   3640640703
+       .long   1575995713
+       .long   2138667148
+       .long   4277152960
+       .long   4218008566
+       .long   1523602280
+       .long   2986314111
+       .long   3151991427
+       .long   4277334296
+       .long   4259338624
+       .long   4141049836
+       .long   3047204561
+       .long   1677660927
+       .long   2009015559
+       .long   4259701297
+       .long   4223709953
+       .long   3987132377
+       .long   1799441827
+       .long   3355321855
+       .long   4018031118
+       .long   4224435298
+       .long   4152452611
+       .long   3679297459
+       .long   3598883655
+       .long   2415676415
+       .long   3741094941
+       .long   4153903301
+       .long   4009937927
+       .long   3063627623
+       .long   2902800015
+       .long   536385535
+       .long   3187222587
+       .long   4012839307
+       .long   3724908559
+       .long   1832287951
+       .long   1510632735
+       .long   1072771071
+       .long   2079477878
+       .long   3730711318
+       .long   3154849823
+       .long   3664575902
+       .long   3021265470
+       .long   2145542143
+       .long   4158955756
+       .long   3166455341
+       .long   2014732351
+       .long   3034184508
+       .long   1747563645
+       .long   4291084286
+       .long   4022944216
+       .long   2037943386
+       .long   4029464703
+       .long   1773401721
+       .long   3495127291
+       .long   4287201277
+       .long   3750921137
+       .long   4075886773
+       .long   3763962110
+       .long   3546803442
+       .long   2695287286
+       .long   4279435259
+       .long   3206874979
+       .long   3856806251
+       .long   3232956925
+       .long   2798639588
+       .long   1095607277
+       .long   4263903223
+       .long   2118782663
+       .long   3418645206
+       .long   2170946555
+       .long   1302311881
+       .long   2191214555
+       .long   4232839151
+       .long   4237565327
+       .long   2542323117
+       .long   46925815
+       .long   2604623763
+       .long   87461814
+       .long   4170711006
+       .long   4180163359
+       .long   789678938
+       .long   93851631
+       .long   914280231
+       .long   174923629
+       .long   4046454716
+       .long   4065359423
+       .long   1579357876
+       .long   187703262
+       .long   1828560463
+       .long   349847258
+       .long   3797942136
+       .long   3835751551
+       .long   3158715752
+       .long   375406524
+       .long   3657120927
+       .long   699694516
+       .long   3300916976
+       .long   3376535807
+       .long   2022464208
+       .long   750813049
+       .long   3019274558
+       .long   1399389033
+       .long   2306866656
+       .long   2458104319
+       .long   4044928416
+       .long   1501626098
+       .long   1743581820
+       .long   2798778067
+       .long   318766016
+       .long   621241343
+       .long   3794889537
+       .long   3003252197
+       .long   3487163641
+       .long   1302588838
+       .long   637532033
+       .long   1242482686
+       .long   3294811778
+       .long   1711537099
+       .long   2679359986
+       .long   2605177677
+       .long   1275064066
+       .long   2484965372
+       .long   2294656261
+       .long   3423074199
+       .long   1063752677
+       .long   915388059
+       .long   2550128133
+       .long   674963448
+       .long   294345226
+       .long   2551181103
+       .long   2127505355
+       .long   1830776118
+       .long   805288971
+       .long   1349926897
+       .long   588690452
+       .long   807394910
+       .long   4255010710
+       .long   3661552236
+       .long   1610577942
+       .long   2699853794
+       .long   1177380905
+       .long   1614789820
+       .long   4215054124
+       .long   3028137177
+       .long   3221155884
+       .long   1104740292
+       .long   2354761811
+       .long   3229579640
+       .long   4135140952
+       .long   1761307059
+       .long   2147344473
+       .long   2209480585
+       .long   414556326
+       .long   2164191985
+       .long   3975314608
+       .long   3522614119
+       .long   4294688947
+       .long   123993874
+       .long   829112653
+       .long   33416674
+       .long   3655661921
+       .long   2750260943
+       .long   4294410598
+       .long   247987749
+       .long   1658225307
+       .long   66833348
+       .long   3016356546
+       .long   1205554591
+       .long   4293853900
+       .long   495975499
+       .long   3316450614
+       .long   133666696
+       .long   1737745796
+       .long   2411109183
+       .long   4292740504
+       .long   991950999
+       .long   2337933933
+       .long   267333393
+       .long   3475491593
+       .long   527251070
+       .long   4290513712
+       .long   1983901999
+       .long   380900570
+       .long   534666787
+       .long   2656015891
+       .long   1054502141
+       .long   4286060128
+       .long   3967803999
+       .long   761801140
+       .long   1069333574
+       .long   1017064486
+       .long   2109004283
+       .long   4277152960
+       .long   3640640703
+       .long   1523602280
+       .long   2138667148
+       .long   2034128973
+       .long   4218008566
+       .long   4259338624
+       .long   2986314111
+       .long   3047204561
+       .long   4277334296
+       .long   4068257947
+       .long   4141049836
+       .long   4223709953
+       .long   1677660927
+       .long   1799441827
+       .long   4259701297
+       .long   3841548598
+       .long   3987132377
+       .long   4152452611
+       .long   3355321855
+       .long   3598883655
+       .long   4224435298
+       .long   3388129901
+       .long   3679297459
+       .long   4009937927
+       .long   2415676415
+       .long   2902800015
+       .long   4153903301
+       .long   2481292507
+       .long   3063627623
+       .long   3724908559
+       .long   536385535
+       .long   1510632735
+       .long   4012839307
+       .long   667617719
+       .long   1832287951
+       .long   3154849823
+       .long   1072771071
+       .long   3021265470
+       .long   3730711318
+       .long   1335235438
+       .long   3664575902
+       .long   2014732351
+       .long   2145542143
+       .long   1747563645
+       .long   3166455341
+       .long   2670470877
+       .long   3034184508
+       .long   4029464703
+       .long   4291084286
+       .long   3495127291
+       .long   2037943386
+       .long   1045974458
+       .long   1773401721
+       .long   3763962110
+       .long   4287201277
+       .long   2695287286
+       .long   4075886773
+       .long   2091948916
+       .long   3546803442
+       .long   3232956925
+       .long   4279435259
+       .long   1095607277
+       .long   3856806251
+       .long   4183897833
+       .long   2798639588
+       .long   2170946555
+       .long   4263903223
+       .long   2191214555
+       .long   3418645206
+       .long   4072828371
+       .long   1302311881
+       .long   46925815
+       .long   4232839151
+       .long   87461814
+       .long   2542323117
+       .long   3850689447
+       .long   2604623763
+       .long   93851631
+       .long   4170711006
+       .long   174923629
+       .long   789678938
+       .long   3406411599
+       .long   914280231
+       .long   187703262
+       .long   4046454716
+       .long   349847258
+       .long   1579357876
+       .long   2517855902
+       .long   1828560463
+       .long   375406524
+       .long   3797942136
+       .long   699694516
+       .long   3158715752
+       .long   740744509
+       .long   3657120927
+       .long   750813049
+       .long   3300916976
+       .long   1399389033
+       .long   2022464208
+       .long   1481489018
+       .long   3019274558
+       .long   1501626098
+       .long   2306866656
+       .long   2798778067
+       .long   4044928416
+       .long   2962978036
+       .long   1743581820
+       .long   3003252197
+       .long   318766016
+       .long   1302588838
+       .long   3794889537
+       .long   1630988776
+       .long   3487163641
+       .long   1711537099
+       .long   637532033
+       .long   2605177677
+       .long   3294811778
+       .long   3261977553
+       .long   2679359986
+       .long   3423074199
+       .long   1275064066
+       .long   915388059
+       .long   2294656261
+       .long   2228987811
+       .long   1063752677
+       .long   2551181103
+       .long   2550128133
+       .long   1830776118
+       .long   294345226
+       .long   163008326
+       .long   2127505355
+       .long   807394910
+       .long   805288971
+       .long   3661552236
+       .long   588690452
+       .long   326016652
+       .long   4255010710
+       .long   1614789820
+       .long   1610577942
+       .long   3028137177
+       .long   1177380905
+       .long   652033304
+       .long   4215054124
+       .long   3229579640
+       .long   3221155884
+       .long   1761307059
+       .long   2354761811
+       .long   1304066609
+       .long   4135140952
+       .long   2164191985
+       .long   2147344473
+       .long   3522614119
+       .long   414556326
+       .long   2608133219
+       .long   3975314608
+       .long   33416674
+       .long   4294688947
+       .long   2750260943
+       .long   829112653
+       .long   921299143
+       .long   3655661921
+       .long   66833348
+       .long   4294410598
+       .long   1205554591
+       .long   1658225307
+       .long   1842598287
+       .long   3016356546
+       .long   133666696
+       .long   4293853900
+       .long   2411109183
+       .long   3316450614
+       .long   3685196575
+       .long   1737745796
+       .long   267333393
+       .long   4292740504
+       .long   527251070
+       .long   2337933933
+       .long   3075425855
+       .long   3475491593
+       .long   534666787
+       .long   4290513712
+       .long   1054502141
+       .long   380900570
+       .long   1855884414
+       .long   2656015891
+       .long   1069333574
+       .long   4286060128
+       .long   2109004283
+       .long   761801140
+       .long   3711768829
+       .long   1017064486
+       .long   2138667148
+       .long   4277152960
+       .long   4218008566
+       .long   1523602280
+       .long   3128570363
+       .long   2034128973
+       .long   4277334296
+       .long   4259338624
+       .long   4141049836
+       .long   3047204561
+       .long   1962173430
+       .long   4068257947
+       .long   4259701297
+       .long   4223709953
+       .long   3987132377
+       .long   1799441827
+       .long   3924346860
+       .long   3841548598
+       .long   4224435298
+       .long   4152452611
+       .long   3679297459
+       .long   3598883655
+       .long   3553726425
+       .long   3388129901
+       .long   4153903301
+       .long   4009937927
+       .long   3063627623
+       .long   2902800015
+       .long   2812485555
+       .long   2481292507
+       .long   4012839307
+       .long   3724908559
+       .long   1832287951
+       .long   1510632735
+       .long   1330003814
+       .long   667617719
+       .long   3730711318
+       .long   3154849823
+       .long   3664575902
+       .long   3021265470
+       .long   2660007629
+       .long   1335235438
+       .long   3166455341
+       .long   2014732351
+       .long   3034184508
+       .long   1747563645
+       .long   1025047962
+       .long   2670470877
+       .long   2037943386
+       .long   4029464703
+       .long   1773401721
+       .long   3495127291
+       .long   2050095924
+       .long   1045974458
+       .long   4075886773
+       .long   3763962110
+       .long   3546803442
+       .long   2695287286
+       .long   4100191849
+       .long   2091948916
+       .long   3856806251
+       .long   3232956925
+       .long   2798639588
+       .long   1095607277
+       .long   3905416403
+       .long   4183897833
+       .long   3418645206
+       .long   2170946555
+       .long   1302311881
+       .long   2191214555
+       .long   3515865511
+       .long   4072828371
+       .long   2542323117
+       .long   46925815
+       .long   2604623763
+       .long   87461814
+       .long   2736763727
+       .long   3850689447
+       .long   789678938
+       .long   93851631
+       .long   914280231
+       .long   174923629
+       .long   1178560158
+       .long   3406411599
+       .long   1579357876
+       .long   187703262
+       .long   1828560463
+       .long   349847258
+       .long   2357120316
+       .long   2517855902
+       .long   3158715752
+       .long   375406524
+       .long   3657120927
+       .long   699694516
+       .long   419273337
+       .long   740744509
+       .long   2022464208
+       .long   750813049
+       .long   3019274558
+       .long   1399389033
+       .long   838546674
+       .long   1481489018
+       .long   4044928416
+       .long   1501626098
+       .long   1743581820
+       .long   2798778067
+       .long   1677093349
+       .long   2962978036
+       .long   3794889537
+       .long   3003252197
+       .long   3487163641
+       .long   1302588838
+       .long   3354186699
+       .long   1630988776
+       .long   3294811778
+       .long   1711537099
+       .long   2679359986
+       .long   2605177677
+       .long   2413406103
+       .long   3261977553
+       .long   2294656261
+       .long   3423074199
+       .long   1063752677
+       .long   915388059
+       .long   531844911
+       .long   2228987811
+       .long   294345226
+       .long   2551181103
+       .long   2127505355
+       .long   1830776118
+       .long   1063689823
+       .long   163008326
+       .long   588690452
+       .long   807394910
+       .long   4255010710
+       .long   3661552236
+       .long   2127379647
+       .long   326016652
+       .long   1177380905
+       .long   1614789820
+       .long   4215054124
+       .long   3028137177
+       .long   4254759295
+       .long   652033304
+       .long   2354761811
+       .long   3229579640
+       .long   4135140952
+       .long   1761307059
+       .long   4214551295
+       .long   1304066609
+       .long   414556326
+       .long   2164191985
+       .long   3975314608
+       .long   3522614119
+       .long   4134135294
+       .long   2608133219
+       .long   829112653
+       .long   33416674
+       .long   3655661921
+       .long   2750260943
+       .long   3973303293
+       .long   921299143
+       .long   1658225307
+       .long   66833348
+       .long   3016356546
+       .long   1205554591
+       .long   3651639290
+       .long   1842598287
+       .long   3316450614
+       .long   133666696
+       .long   1737745796
+       .long   2411109183
+       .long   3008311285
+       .long   3685196575
+       .long   2337933933
+       .long   267333393
+       .long   3475491593
+       .long   527251070
+       .long   1721655274
+       .long   3075425855
+       .long   380900570
+       .long   534666787
+       .long   2656015891
+       .long   1054502141
+       .long   3443310548
+       .long   1855884414
+       .long   761801140
+       .long   1069333574
+       .long   1017064486
+       .long   2109004283
+       .long   2591653800
+       .long   3711768829
+       .long   1523602280
+       .long   2138667148
+       .long   2034128973
+       .long   4218008566
+       .long   888340305
+       .long   3128570363
+       .long   3047204561
+       .long   4277334296
+       .long   4068257947
+       .long   4141049836
+       .long   1776680610
+       .long   1962173430
+       .long   1799441827
+       .long   4259701297
+       .long   3841548598
+       .long   3987132377
+       .long   3553361221
+       .long   3924346860
+       .long   3598883655
+       .long   4224435298
+       .long   3388129901
+       .long   3679297459
+       .long   2811755147
+       .long   3553726425
+       .long   2902800015
+       .long   4153903301
+       .long   2481292507
+       .long   3063627623
+       .long   1328542998
+       .long   2812485555
+       .long   1510632735
+       .long   4012839307
+       .long   667617719
+       .long   1832287951
+       .long   2657085997
+       .long   1330003814
+       .long   3021265470
+       .long   3730711318
+       .long   1335235438
+       .long   3664575902
+       .long   1019204698
+       .long   2660007629
+       .long   1747563645
+       .long   3166455341
+       .long   2670470877
+       .long   3034184508
+       .long   2038409397
+       .long   1025047962
+       .long   3495127291
+       .long   2037943386
+       .long   1045974458
+       .long   1773401721
+       .long   4076818795
+       .long   2050095924
+       .long   2695287286
+       .long   4075886773
+       .long   2091948916
+       .long   3546803442
+       .long   3858670295
+       .long   4100191849
+       .long   1095607277
+       .long   3856806251
+       .long   4183897833
+       .long   2798639588
+       .long   3422373294
+       .long   3905416403
+       .long   2191214555
+       .long   3418645206
+       .long   4072828371
+       .long   1302311881
+       .long   2549779293
+       .long   3515865511
+       .long   87461814
+       .long   2542323117
+       .long   3850689447
+       .long   2604623763
+       .long   804591290
+       .long   2736763727
+       .long   174923629
+       .long   789678938
+       .long   3406411599
+       .long   914280231
+       .long   1609182581
+       .long   1178560158
+       .long   349847258
+       .long   1579357876
+       .long   2517855902
+       .long   1828560463
+       .long   3218365162
+       .long   2357120316
+       .long   699694516
+       .long   3158715752
+       .long   740744509
+       .long   3657120927
+       .long   2141763028
+       .long   419273337
+       .long   1399389033
+       .long   2022464208
+       .long   1481489018
+       .long   3019274558
+       .long   4283526057
+       .long   838546674
+       .long   2798778067
+       .long   4044928416
+       .long   2962978036
+       .long   1743581820
+       .long   4272084818
+       .long   1677093349
+       .long   1302588838
+       .long   3794889537
+       .long   1630988776
+       .long   3487163641
+       .long   4249202340
+       .long   3354186699
+       .long   2605177677
+       .long   3294811778
+       .long   3261977553
+       .long   2679359986
+       .long   4203437385
+       .long   2413406103
+       .long   915388059
+       .long   2294656261
+       .long   2228987811
+       .long   1063752677
+       .long   4111907475
+       .long   531844911
+       .long   1830776118
+       .long   294345226
+       .long   163008326
+       .long   2127505355
+       .long   3928847655
+       .long   1063689823
+       .long   3661552236
+       .long   588690452
+       .long   326016652
+       .long   4255010710
+       .long   3562728015
+       .long   2127379647
+       .long   3028137177
+       .long   1177380905
+       .long   652033304
+       .long   4215054124
+       .long   2830488734
+       .long   4254759295
+       .long   1761307059
+       .long   2354761811
+       .long   1304066609
+       .long   4135140952
+       .long   1366010173
+       .long   4214551295
+       .long   3522614119
+       .long   414556326
+       .long   2608133219
+       .long   3975314608
+       .long   2732020347
+       .long   4134135294
+       .long   2750260943
+       .long   829112653
+       .long   921299143
+       .long   3655661921
+       .long   1169073399
+       .long   3973303293
+       .long   1205554591
+       .long   1658225307
+       .long   1842598287
+       .long   3016356546
+       .long   2338146798
+       .long   3651639290
+       .long   2411109183
+       .long   3316450614
+       .long   3685196575
+       .long   1737745796
+       .long   381326301
+       .long   3008311285
+       .long   527251070
+       .long   2337933933
+       .long   3075425855
+       .long   3475491593
+       .long   762652602
+       .long   1721655274
+       .long   1054502141
+       .long   380900570
+       .long   1855884414
+       .long   2656015891
+       .long   1525305205
+       .long   3443310548
+       .long   2109004283
+       .long   761801140
+       .long   3711768829
+       .long   1017064486
+       .long   3050610411
+       .long   2591653800
+       .long   4218008566
+       .long   1523602280
+       .long   3128570363
+       .long   2034128973
+       .long   1806253526
+       .long   888340305
+       .long   4141049836
+       .long   3047204561
+       .long   1962173430
+       .long   4068257947
+       .long   3612507052
+       .long   1776680610
+       .long   3987132377
+       .long   1799441827
+       .long   3924346860
+       .long   3841548598
+       .long   2930046808
+       .long   3553361221
+       .long   3679297459
+       .long   3598883655
+       .long   3553726425
+       .long   3388129901
+       .long   1565126321
+       .long   2811755147
+       .long   3063627623
+       .long   2902800015
+       .long   2812485555
+       .long   2481292507
+       .long   3130252643
+       .long   1328542998
+       .long   1832287951
+       .long   1510632735
+       .long   1330003814
+       .long   667617719
+       .long   1965537991
+       .long   2657085997
+       .long   3664575902
+       .long   3021265470
+       .long   2660007629
+       .long   1335235438
+       .long   3931075983
+       .long   1019204698
+       .long   3034184508
+       .long   1747563645
+       .long   1025047962
+       .long   2670470877
+       .long   3567184671
+       .long   2038409397
+       .long   1773401721
+       .long   3495127291
+       .long   2050095924
+       .long   1045974458
+       .long   2839402047
+       .long   4076818795
+       .long   3546803442
+       .long   2695287286
+       .long   4100191849
+       .long   2091948916
+       .long   1383836798
+       .long   3858670295
+       .long   2798639588
+       .long   1095607277
+       .long   3905416403
+       .long   4183897833
+       .long   2767673597
+       .long   3422373294
+       .long   1302311881
+       .long   2191214555
+       .long   3515865511
+       .long   4072828371
+       .long   1240379898
+       .long   2549779293
+       .long   2604623763
+       .long   87461814
+       .long   2736763727
+       .long   3850689447
+       .long   2480759797
+       .long   804591290
+       .long   914280231
+       .long   174923629
+       .long   1178560158
+       .long   3406411599
+       .long   666552299
+       .long   1609182581
+       .long   1828560463
+       .long   349847258
+       .long   2357120316
+       .long   2517855902
+       .long   1333104599
+       .long   3218365162
+       .long   3657120927
+       .long   699694516
+       .long   419273337
+       .long   740744509
+       .long   2666209199
+       .long   2141763028
+       .long   3019274558
+       .long   1399389033
+       .long   838546674
+       .long   1481489018
+       .long   1037451103
+       .long   4283526057
+       .long   1743581820
+       .long   2798778067
+       .long   1677093349
+       .long   2962978036
+       .long   2074902206
+       .long   4272084818
+       .long   3487163641
+       .long   1302588838
+       .long   3354186699
+       .long   1630988776
+       .long   4149804412
+       .long   4249202340
+       .long   2679359986
+       .long   2605177677
+       .long   2413406103
+       .long   3261977553
+       .long   4004641529
+       .long   4203437385
+       .long   1063752677
+       .long   915388059
+       .long   531844911
+       .long   2228987811
+       .long   3714315762
+       .long   4111907475
+       .long   2127505355
+       .long   1830776118
+       .long   1063689823
+       .long   163008326
+       .long   3133664229
+       .long   3928847655
+       .long   4255010710
+       .long   3661552236
+       .long   2127379647
+       .long   326016652
+       .long   1972361163
+       .long   3562728015
+       .long   4215054124
+       .long   3028137177
+       .long   4254759295
+       .long   652033304
+       .long   3944722327
+       .long   2830488734
+       .long   4135140952
+       .long   1761307059
+       .long   4214551295
+       .long   1304066609
+       .long   3594477359
+       .long   1366010173
+       .long   3975314608
+       .long   3522614119
+       .long   4134135294
+       .long   2608133219
+       .long   2893987423
+       .long   2732020347
+       .long   3655661921
+       .long   2750260943
+       .long   3973303293
+       .long   921299143
+       .long   1493007550
+       .long   1169073399
+       .long   3016356546
+       .long   1205554591
+       .long   3651639290
+       .long   1842598287
+       .long   2986015100
+       .long   2338146798
+       .long   1737745796
+       .long   2411109183
+       .long   3008311285
+       .long   3685196575
+       .long   1677062904
+       .long   381326301
+       .long   3475491593
+       .long   527251070
+       .long   1721655274
+       .long   3075425855
+       .long   3354125809
+       .long   762652602
+       .long   2656015891
+       .long   1054502141
+       .long   3443310548
+       .long   1855884414
+       .long   2413284322
+       .long   1525305205
+       .long   1017064486
+       .long   2109004283
+       .long   2591653800
+       .long   3711768829
+       .long   531601349
+       .long   3050610411
+       .long   2034128973
+       .long   4218008566
+       .long   888340305
+       .long   3128570363
+       .long   1063202699
+       .long   1806253526
+       .long   4068257947
+       .long   4141049836
+       .long   1776680610
+       .long   1962173430
+       .long   2126405399
+       .long   3612507052
+       .long   3841548598
+       .long   3987132377
+       .long   3553361221
+       .long   3924346860
+       .long   4252810799
+       .long   2930046808
+       .long   3388129901
+       .long   3679297459
+       .long   2811755147
+       .long   3553726425
+       .long   4210654302
+       .long   1565126321
+       .long   2481292507
+       .long   3063627623
+       .long   1328542998
+       .long   2812485555
+       .long   4126341309
+       .long   3130252643
+       .long   667617719
+       .long   1832287951
+       .long   2657085997
+       .long   1330003814
+       .long   3957715323
+       .long   1965537991
+       .long   1335235438
+       .long   3664575902
+       .long   1019204698
+       .long   2660007629
+       .long   3620463350
+       .long   3931075983
+       .long   2670470877
+       .long   3034184508
+       .long   2038409397
+       .long   1025047962
+       .long   2945959404
+       .long   3567184671
+       .long   1045974458
+       .long   1773401721
+       .long   4076818795
+       .long   2050095924
+       .long   1596951513
+       .long   2839402047
+       .long   2091948916
+       .long   3546803442
+       .long   3858670295
+       .long   4100191849
+       .long   3193903027
+       .long   1383836798
+       .long   4183897833
+       .long   2798639588
+       .long   3422373294
+       .long   3905416403
+       .long   2092838759
+       .long   2767673597
+       .long   4072828371
+       .long   1302311881
+       .long   2549779293
+       .long   3515865511
+       .long   4185677519
+       .long   1240379898
+       .long   3850689447
+       .long   2604623763
+       .long   804591290
+       .long   2736763727
+       .long   4076387742
+       .long   2480759797
+       .long   3406411599
+       .long   914280231
+       .long   1609182581
+       .long   1178560158
+       .long   3857808189
+       .long   666552299
+       .long   2517855902
+       .long   1828560463
+       .long   3218365162
+       .long   2357120316
+       .long   3420649082
+       .long   1333104599
+       .long   740744509
+       .long   3657120927
+       .long   2141763028
+       .long   419273337
+       .long   2546330868
+       .long   2666209199
+       .long   1481489018
+       .long   3019274558
+       .long   4283526057
+       .long   838546674
+       .long   797694440
+       .long   1037451103
+       .long   2962978036
+       .long   1743581820
+       .long   4272084818
+       .long   1677093349
+       .long   1595388880
+       .long   2074902206
+       .long   1630988776
+       .long   3487163641
+       .long   4249202340
+       .long   3354186699
+       .long   3190777760
+       .long   4149804412
+       .long   3261977553
+       .long   2679359986
+       .long   4203437385
+       .long   2413406103
+       .long   2086588225
+       .long   4004641529
+       .long   2228987811
+       .long   1063752677
+       .long   4111907475
+       .long   531844911
+       .long   4173176451
+       .long   3714315762
+       .long   163008326
+       .long   2127505355
+       .long   3928847655
+       .long   1063689823
+       .long   4051385607
+       .long   3133664229
+       .long   326016652
+       .long   4255010710
+       .long   3562728015
+       .long   2127379647
+       .long   3807803918
+       .long   1972361163
+       .long   652033304
+       .long   4215054124
+       .long   2830488734
+       .long   4254759295
+       .long   3320640540
+       .long   3944722327
+       .long   1304066609
+       .long   4135140952
+       .long   1366010173
+       .long   4214551295
+       .long   2346313785
+       .long   3594477359
+       .long   2608133219
+       .long   3975314608
+       .long   2732020347
+       .long   4134135294
+       .long   397660275
+       .long   2893987423
+       .long   921299143
+       .long   3655661921
+       .long   1169073399
+       .long   3973303293
+       .long   795320551
+       .long   1493007550
+       .long   1842598287
+       .long   3016356546
+       .long   2338146798
+       .long   3651639290
+       .long   1590641102
+       .long   2986015100
+       .long   3685196575
+       .long   1737745796
+       .long   381326301
+       .long   3008311285
+       .long   3181282204
+       .long   1677062904
+       .long   3075425855
+       .long   3475491593
+       .long   762652602
+       .long   1721655274
+       .long   2067597113
+       .long   3354125809
+       .long   1855884414
+       .long   2656015891
+       .long   1525305205
+       .long   3443310548
+       .long   4135194227
+       .long   2413284322
+       .long   3711768829
+       .long   1017064486
+       .long   3050610411
+       .long   2591653800
+       .long   3975421159
+       .long   531601349
+       .long   3128570363
+       .long   2034128973
+       .long   1806253526
+       .long   888340305
+       .long   3655875023
+       .long   1063202699
+       .long   1962173430
+       .long   4068257947
+       .long   3612507052
+       .long   1776680610
+       .long   3016782751
+       .long   2126405399
+       .long   3924346860
+       .long   3841548598
+       .long   2930046808
+       .long   3553361221
+       .long   1738598206
+       .long   4252810799
+       .long   3553726425
+       .long   3388129901
+       .long   1565126321
+       .long   2811755147
+       .long   3477196413
+       .long   4210654302
+       .long   2812485555
+       .long   2481292507
+       .long   3130252643
+       .long   1328542998
+       .long   2659425531
+       .long   4126341309
+       .long   1330003814
+       .long   667617719
+       .long   1965537991
+       .long   2657085997
+       .long   1023883767
+       .long   3957715323
+       .long   2660007629
+       .long   1335235438
+       .long   3931075983
+       .long   1019204698
+       .long   2047767535
+       .long   3620463350
+       .long   1025047962
+       .long   2670470877
+       .long   3567184671
+       .long   2038409397
+       .long   4095535070
+       .long   2945959404
+       .long   2050095924
+       .long   1045974458
+       .long   2839402047
+       .long   4076818795
+       .long   3896102844
+       .long   1596951513
+       .long   4100191849
+       .long   2091948916
+       .long   1383836798
+       .long   3858670295
+       .long   3497238392
+       .long   3193903027
+       .long   3905416403
+       .long   4183897833
+       .long   2767673597
+       .long   3422373294
+       .long   2699509489
+       .long   2092838759
+       .long   3515865511
+       .long   4072828371
+       .long   1240379898
+       .long   2549779293
+       .long   1104051682
+       .long   4185677519
+       .long   2736763727
+       .long   3850689447
+       .long   2480759797
+       .long   804591290
+       .long   2208103365
+       .long   4076387742
+       .long   1178560158
+       .long   3406411599
+       .long   666552299
+       .long   1609182581
+       .long   121239434
+       .long   3857808189
+       .long   2357120316
+       .long   2517855902
+       .long   1333104599
+       .long   3218365162
+       .long   242478868
+       .long   3420649082
+       .long   419273337
+       .long   740744509
+       .long   2666209199
+       .long   2141763028
+       .long   484957737
+       .long   2546330868
+       .long   838546674
+       .long   1481489018
+       .long   1037451103
+       .long   4283526057
+       .long   969915474
+       .long   797694440
+       .long   1677093349
+       .long   2962978036
+       .long   2074902206
+       .long   4272084818
+       .long   1939830949
+       .long   1595388880
+       .long   3354186699
+       .long   1630988776
+       .long   4149804412
+       .long   4249202340
+       .long   3879661898
+       .long   3190777760
+       .long   2413406103
+       .long   3261977553
+       .long   4004641529
+       .long   4203437385
+       .long   3464356500
+       .long   2086588225
+       .long   531844911
+       .long   2228987811
+       .long   3714315762
+       .long   4111907475
+       .long   2633745705
+       .long   4173176451
+       .long   1063689823
+       .long   163008326
+       .long   3133664229
+       .long   3928847655
+       .long   972524114
+       .long   4051385607
+       .long   2127379647
+       .long   326016652
+       .long   1972361163
+       .long   3562728015
+       .long   1945048229
+       .long   3807803918
+       .long   4254759295
+       .long   652033304
+       .long   3944722327
+       .long   2830488734
+       .long   3890096458
+       .long   3320640540
+       .long   4214551295
+       .long   1304066609
+       .long   3594477359
+       .long   1366010173
+       .long   3485225620
+       .long   2346313785
+       .long   4134135294
+       .long   2608133219
+       .long   2893987423
+       .long   2732020347
+       .long   2675483945
+       .long   397660275
+       .long   3973303293
+       .long   921299143
+       .long   1493007550
+       .long   1169073399
+       .long   1056000594
+       .long   795320551
+       .long   3651639290
+       .long   1842598287
+       .long   2986015100
+       .long   2338146798
+       .long   2112001188
+       .long   1590641102
+       .long   3008311285
+       .long   3685196575
+       .long   1677062904
+       .long   381326301
+       .long   4224002377
+       .long   3181282204
+       .long   1721655274
+       .long   3075425855
+       .long   3354125809
+       .long   762652602
+       .long   4153037458
+       .long   2067597113
+       .long   3443310548
+       .long   1855884414
+       .long   2413284322
+       .long   1525305205
+       .long   4011107621
+       .long   4135194227
+       .long   2591653800
+       .long   3711768829
+       .long   531601349
+       .long   3050610411
+       .long   3727247947
+       .long   3975421159
+       .long   888340305
+       .long   3128570363
+       .long   1063202699
+       .long   1806253526
+       .long   3159528599
+       .long   3655875023
+       .long   1776680610
+       .long   1962173430
+       .long   2126405399
+       .long   3612507052
+       .long   2024089902
+       .long   3016782751
+       .long   3553361221
+       .long   3924346860
+       .long   4252810799
+       .long   2930046808
+       .long   4048179805
+       .long   1738598206
+       .long   2811755147
+       .long   3553726425
+       .long   4210654302
+       .long   1565126321
+       .long   3801392314
+       .long   3477196413
+       .long   1328542998
+       .long   2812485555
+       .long   4126341309
+       .long   3130252643
+       .long   3307817333
+       .long   2659425531
+       .long   2657085997
+       .long   1330003814
+       .long   3957715323
+       .long   1965537991
+       .long   2320667370
+       .long   1023883767
+       .long   1019204698
+       .long   2660007629
+       .long   3620463350
+       .long   3931075983
+       .long   346367444
+       .long   2047767535
+       .long   2038409397
+       .long   1025047962
+       .long   2945959404
+       .long   3567184671
+       .long   692734889
+       .long   4095535070
+       .long   4076818795
+       .long   2050095924
+       .long   1596951513
+       .long   2839402047
+       .long   1385469779
+       .long   3896102844
+       .long   3858670295
+       .long   4100191849
+       .long   3193903027
+       .long   1383836798
+       .long   2770939558
+       .long   3497238392
+       .long   3422373294
+       .long   3905416403
+       .long   2092838759
+       .long   2767673597
+       .long   1246911821
+       .long   2699509489
+       .long   2549779293
+       .long   3515865511
+       .long   4185677519
+       .long   1240379898
+       .long   2493823642
+       .long   1104051682
+       .long   804591290
+       .long   2736763727
+       .long   4076387742
+       .long   2480759797
+       .long   692679989
+       .long   2208103365
+       .long   1609182581
+       .long   1178560158
+       .long   3857808189
+       .long   666552299
+       .long   1385359979
+       .long   121239434
+       .long   3218365162
+       .long   2357120316
+       .long   3420649082
+       .long   1333104599
+       .long   2770719959
+       .long   242478868
+       .long   2141763028
+       .long   419273337
+       .long   2546330868
+       .long   2666209199
+       .long   1246472623
+       .long   484957737
+       .long   4283526057
+       .long   838546674
+       .long   797694440
+       .long   1037451103
+       .long   2492945247
+       .long   969915474
+       .long   4272084818
+       .long   1677093349
+       .long   1595388880
+       .long   2074902206
+       .long   690923199
+       .long   1939830949
+       .long   4249202340
+       .long   3354186699
+       .long   3190777760
+       .long   4149804412
+       .long   1381846399
+       .long   3879661898
+       .long   4203437385
+       .long   2413406103
+       .long   2086588225
+       .long   4004641529
+       .long   2763692798
+       .long   3464356500
+       .long   4111907475
+       .long   531844911
+       .long   4173176451
+       .long   3714315762
+       .long   1232418301
+       .long   2633745705
+       .long   3928847655
+       .long   1063689823
+       .long   4051385607
+       .long   3133664229
+       .long   2464836603
+       .long   972524114
+       .long   3562728015
+       .long   2127379647
+       .long   3807803918
+       .long   1972361163
+       .long   634705910
+       .long   1945048229
+       .long   2830488734
+       .long   4254759295
+       .long   3320640540
+       .long   3944722327
+       .long   1269411821
+       .long   3890096458
+       .long   1366010173
+       .long   4214551295
+       .long   2346313785
+       .long   3594477359
+       .long   2538823642
+       .long   3485225620
+       .long   2732020347
+       .long   4134135294
+       .long   397660275
+       .long   2893987423
+       .long   782679989
+       .long   2675483945
+       .long   1169073399
+       .long   3973303293
+       .long   795320551
+       .long   1493007550
+       .long   1565359979
+       .long   1056000594
+       .long   2338146798
+       .long   3651639290
+       .long   1590641102
+       .long   2986015100
+       .long   3130719959
+       .long   2112001188
+       .long   381326301
+       .long   3008311285
+       .long   3181282204
+       .long   1677062904
+       .long   1966472623
+       .long   4224002377
+       .long   762652602
+       .long   1721655274
+       .long   2067597113
+       .long   3354125809
+       .long   3932945247
+       .long   4153037458
+       .long   1525305205
+       .long   3443310548
+       .long   4135194227
+       .long   2413284322
+       .long   3570923199
+       .long   4011107621
+       .long   3050610411
+       .long   2591653800
+       .long   3975421159
+       .long   531601349
+       .long   2846879102
+       .long   3727247947
+       .long   1806253526
+       .long   888340305
+       .long   3655875023
+       .long   1063202699
+       .long   1398790909
+       .long   3159528599
+       .long   3612507052
+       .long   1776680610
+       .long   3016782751
+       .long   2126405399
+       .long   2797581819
+       .long   2024089902
+       .long   2930046808
+       .long   3553361221
+       .long   1738598206
+       .long   4252810799
+       .long   1300196342
+       .long   4048179805
+       .long   1565126321
+       .long   2811755147
+       .long   3477196413
+       .long   4210654302
+       .long   2600392684
+       .long   3801392314
+       .long   3130252643
+       .long   1328542998
+       .long   2659425531
+       .long   4126341309
+       .long   905818072
+       .long   3307817333
+       .long   1965537991
+       .long   2657085997
+       .long   1023883767
+       .long   3957715323
+       .long   1811636145
+       .long   2320667370
+       .long   3931075983
+       .long   1019204698
+       .long   2047767535
+       .long   3620463350
+       .long   3623272290
+       .long   346367444
+       .long   3567184671
+       .long   2038409397
+       .long   4095535070
+       .long   2945959404
+       .long   2951577284
+       .long   692734889
+       .long   2839402047
+       .long   4076818795
+       .long   3896102844
+       .long   1596951513
+       .long   1608187272
+       .long   1385469779
+       .long   1383836798
+       .long   3858670295
+       .long   3497238392
+       .long   3193903027
+       .long   3216374545
+       .long   2770939558
+       .long   2767673597
+       .long   3422373294
+       .long   2699509489
+       .long   2092838759
+       .long   2137781795
+       .long   1246911821
+       .long   1240379898
+       .long   2549779293
+       .long   1104051682
+       .long   4185677519
+       .long   4275563591
+       .long   2493823642
+       .long   2480759797
+       .long   804591290
+       .long   2208103365
+       .long   4076387742
+       .long   4256159887
+       .long   692679989
+       .long   666552299
+       .long   1609182581
+       .long   121239434
+       .long   3857808189
+       .long   4217352479
+       .long   1385359979
+       .long   1333104599
+       .long   3218365162
+       .long   242478868
+       .long   3420649082
+       .long   4139737663
+       .long   2770719959
+       .long   2666209199
+       .long   2141763028
+       .long   484957737
+       .long   2546330868
+       .long   3984508030
+       .long   1246472623
+       .long   1037451103
+       .long   4283526057
+       .long   969915474
+       .long   797694440
+       .long   3674048764
+       .long   2492945247
+       .long   2074902206
+       .long   4272084818
+       .long   1939830949
+       .long   1595388880
+       .long   3053130232
+       .long   690923199
+       .long   4149804412
+       .long   4249202340
+       .long   3879661898
+       .long   3190777760
+       .long   1811293169
+       .long   1381846399
+       .long   4004641529
+       .long   4203437385
+       .long   3464356500
+       .long   2086588225
+       .long   3622586339
+       .long   2763692798
+       .long   3714315762
+       .long   4111907475
+       .long   2633745705
+       .long   4173176451
+       .long   2950205382
+       .long   1232418301
+       .long   3133664229
+       .long   3928847655
+       .long   972524114
+       .long   4051385607
+       .long   1605443469
+       .long   2464836603
+       .long   1972361163
+       .long   3562728015
+       .long   1945048229
+       .long   3807803918
+       .long   3210886938
+       .long   634705910
+       .long   3944722327
+       .long   2830488734
+       .long   3890096458
+       .long   3320640540
+       .long   2126806581
+       .long   1269411821
+       .long   3594477359
+       .long   1366010173
+       .long   3485225620
+       .long   2346313785
+       .long   4253613162
+       .long   2538823642
+       .long   2893987423
+       .long   2732020347
+       .long   2675483945
+       .long   397660275
+       .long   4212259029
+       .long   782679989
+       .long   1493007550
+       .long   1169073399
+       .long   1056000594
+       .long   795320551
+       .long   4129550763
+       .long   1565359979
+       .long   2986015100
+       .long   2338146798
+       .long   2112001188
+       .long   1590641102
+       .long   3964134231
+       .long   3130719959
+       .long   1677062904
+       .long   381326301
+       .long   4224002377
+       .long   3181282204
+       .long   3633301166
+       .long   1966472623
+       .long   3354125809
+       .long   762652602
+       .long   4153037458
+       .long   2067597113
+       .long   2971635037
+       .long   3932945247
+       .long   2413284322
+       .long   1525305205
+       .long   4011107621
+       .long   4135194227
+       .long   1648302778
+       .long   3570923199
+       .long   531601349
+       .long   3050610411
+       .long   3727247947
+       .long   3975421159
+       .long   3296605556
+       .long   2846879102
+       .long   1063202699
+       .long   1806253526
+       .long   3159528599
+       .long   3655875023
+       .long   2298243816
+       .long   1398790909
+       .long   2126405399
+       .long   3612507052
+       .long   2024089902
+       .long   3016782751
+       .long   301520336
+       .long   2797581819
+       .long   4252810799
+       .long   2930046808
+       .long   4048179805
+       .long   1738598206
+       .long   603040673
+       .long   1300196342
+       .long   4210654302
+       .long   1565126321
+       .long   3801392314
+       .long   3477196413
+       .long   1206081346
+       .long   2600392684
+       .long   4126341309
+       .long   3130252643
+       .long   3307817333
+       .long   2659425531
+       .long   2412162692
+       .long   905818072
+       .long   3957715323
+       .long   1965537991
+       .long   2320667370
+       .long   1023883767
+       .long   529358088
+       .long   1811636145
+       .long   3620463350
+       .long   3931075983
+       .long   346367444
+       .long   2047767535
+       .long   1058716176
+       .long   3623272290
+       .long   2945959404
+       .long   3567184671
+       .long   692734889
+       .long   4095535070
+       .long   2117432353
+       .long   2951577284
+       .long   1596951513
+       .long   2839402047
+       .long   1385469779
+       .long   3896102844
+       .long   4234864706
+       .long   1608187272
+       .long   3193903027
+       .long   1383836798
+       .long   2770939558
+       .long   3497238392
+       .long   4174762117
+       .long   3216374545
+       .long   2092838759
+       .long   2767673597
+       .long   1246911821
+       .long   2699509489
+       .long   4054556938
+       .long   2137781795
+       .long   4185677519
+       .long   1240379898
+       .long   2493823642
+       .long   1104051682
+       .long   3814146581
+       .long   4275563591
+       .long   4076387742
+       .long   2480759797
+       .long   692679989
+       .long   2208103365
+       .long   3333325867
+       .long   4256159887
+       .long   3857808189
+       .long   666552299
+       .long   1385359979
+       .long   121239434
+       .long   2371684438
+       .long   4217352479
+       .long   3420649082
+       .long   1333104599
+       .long   2770719959
+       .long   242478868
+       .long   448401580
+       .long   4139737663
+       .long   2546330868
+       .long   2666209199
+       .long   1246472623
+       .long   484957737
+       .long   896803160
+       .long   3984508030
+       .type   __svml_dsin_reduction_data_internal,@object
+       .size   __svml_dsin_reduction_data_internal,49152
+       .space 512, 0x00        
+       .align 8
+.L_2il0floatpacket.26:
+       .long   0xffffffff,0xffffffff
+       .type   .L_2il0floatpacket.26,@object
+       .size   .L_2il0floatpacket.26,8
+       .align 8
+.L_2il0floatpacket.27:
+       .long   0x00000000,0x7ff00000
+       .type   .L_2il0floatpacket.27,@object
+       .size   .L_2il0floatpacket.27,8
+       .align 8
+.L_2il0floatpacket.28:
+       .long   0xffffffff,0x000fffff
+       .type   .L_2il0floatpacket.28,@object
+       .size   .L_2il0floatpacket.28,8
+       .align 8
+.L_2il0floatpacket.29:
+       .long   0x00000000,0x00100000
+       .type   .L_2il0floatpacket.29,@object
+       .size   .L_2il0floatpacket.29,8
+       .align 8
+.L_2il0floatpacket.30:
+       .long   0xffffffff,0x00000000
+       .type   .L_2il0floatpacket.30,@object
+       .size   .L_2il0floatpacket.30,8
+       .align 8
+.L_2il0floatpacket.31:
+       .long   0x00000000,0x80000000
+       .type   .L_2il0floatpacket.31,@object
+       .size   .L_2il0floatpacket.31,8
+       .align 8
+.L_2il0floatpacket.32:
+       .long   0x00000000,0x3ff00000
+       .type   .L_2il0floatpacket.32,@object
+       .size   .L_2il0floatpacket.32,8
+       .align 8
+.L_2il0floatpacket.33:
+       .long   0x00000000,0x42a80000
+       .type   .L_2il0floatpacket.33,@object
+       .size   .L_2il0floatpacket.33,8
+       .align 8
+.L_2il0floatpacket.34:
+       .long   0x000001ff,0x00000000
+       .type   .L_2il0floatpacket.34,@object
+       .size   .L_2il0floatpacket.34,8
+       .align 8
+.L_2il0floatpacket.35:
+       .long   0x00000000,0x39700000
+       .type   .L_2il0floatpacket.35,@object
+       .size   .L_2il0floatpacket.35,8
+       .align 8
+.L_2il0floatpacket.36:
+       .long   0x00ffffff,0x00000000
+       .type   .L_2il0floatpacket.36,@object
+       .size   .L_2il0floatpacket.36,8
+       .align 8
+.L_2il0floatpacket.37:
+       .long   0x00000000,0x3cb00000
+       .type   .L_2il0floatpacket.37,@object
+       .size   .L_2il0floatpacket.37,8
+       .align 8
+.L_2il0floatpacket.38:
+       .long   0x00000fff,0x00000000
+       .type   .L_2il0floatpacket.38,@object
+       .size   .L_2il0floatpacket.38,8
+       .align 8
+.L_2il0floatpacket.39:
+       .long   0x54442d18,0x401921fb
+       .type   .L_2il0floatpacket.39,@object
+       .size   .L_2il0floatpacket.39,8
+       .align 8
+.L_2il0floatpacket.40:
+       .long   0x33145c07,0x3cb1a626
+       .type   .L_2il0floatpacket.40,@object
+       .size   .L_2il0floatpacket.40,8
+       .align 8
+.L_2il0floatpacket.41:
+       .long   0xffffffff,0x7fffffff
+       .type   .L_2il0floatpacket.41,@object
+       .size   .L_2il0floatpacket.41,8
+       .align 8
+.L_2il0floatpacket.42:
+       .long   0x00000000,0x3eb00000
+       .type   .L_2il0floatpacket.42,@object
+       .size   .L_2il0floatpacket.42,8
+       .align 8
+__dsin_la_CoutTab:
+       .long   0
+       .long   0
+       .long   0
+       .long   2146435072
+       .type   __dsin_la_CoutTab,@object
+       .size   __dsin_la_CoutTab,16
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_sin_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_sin_s_la.s
new file mode 100644 (file)
index 0000000..cad6a22
--- /dev/null
@@ -0,0 +1,2753 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *  1) Range reduction to [-Pi/2; +Pi/2] interval
+ *     a) Grab sign from source argument and save it.
+ *     b) Remove sign using AND operation
+ *     c) Getting octant Y by 1/Pi multiplication
+ *     d) Add "Right Shifter" value
+ *     e) Treat obtained value as integer for destination sign setting.
+ *        Shift first bit of this value to the last (sign) position
+ *     f) Change destination sign if source sign is negative
+ *        using XOR operation.
+ *     g) Subtract "Right Shifter" value
+ *     h) Subtract Y*PI from X argument, where PI divided to 4 parts:
+ *        X = X - Y*PI1 - Y*PI2 - Y*PI3 - Y*PI4;
+ *  2) Polynomial (minimax for sin within [-Pi/2; +Pi/2] interval)
+ *     a) Calculate X^2 = X * X
+ *     b) Calculate polynomial:
+ *        R = X + X * X^2 * (A3 + x^2 * (A5 + ......
+ *  3) Destination sign setting
+ *     a) Set shifted destination sign using XOR operation:
+ *        R = XOR( R, S );
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_sinf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_sinf16
+
+__svml_sinf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        xorl      %edx, %edx
+        vmovups   4096+__svml_ssin_data_internal(%rip), %zmm7
+        vmovups   5248+__svml_ssin_data_internal(%rip), %zmm2
+        vmovups   5312+__svml_ssin_data_internal(%rip), %zmm3
+        vmovups   4800+__svml_ssin_data_internal(%rip), %zmm6
+        vmovups   4864+__svml_ssin_data_internal(%rip), %zmm4
+        vmovups   4928+__svml_ssin_data_internal(%rip), %zmm5
+        vmovups   5184+__svml_ssin_data_internal(%rip), %zmm10
+        vmovups   5120+__svml_ssin_data_internal(%rip), %zmm14
+        vmovups   5056+__svml_ssin_data_internal(%rip), %zmm12
+        vmovups   4992+__svml_ssin_data_internal(%rip), %zmm13
+        vmovaps   %zmm0, %zmm11
+
+/* b) Remove sign using AND operation */
+        vandps    %zmm7, %zmm11, %zmm1
+
+/*
+ * f) Change destination sign if source sign is negative
+ * using XOR operation.
+ */
+        vandnps   %zmm11, %zmm7, %zmm0
+
+/*
+ * c) Getting octant Y by 1/Pi multiplication
+ * d) Add "Right Shifter" value
+ */
+        vfmadd213ps {rn-sae}, %zmm3, %zmm1, %zmm2
+
+/* g) Subtract "Right Shifter" value */
+        vsubps    {rn-sae}, %zmm3, %zmm2, %zmm8
+
+/*
+ * e) Treat obtained value as integer for destination sign setting.
+ * Shift first bit of this value to the last (sign) position
+ */
+        vpslld    $31, %zmm2, %zmm9
+
+/* Check for large and special values */
+        vmovups   4160+__svml_ssin_data_internal(%rip), %zmm2
+
+/*
+ * h) Subtract Y*PI from X argument, where PI divided to 4 parts:
+ * X = X - Y*PI1 - Y*PI2 - Y*PI3;
+ */
+        vfnmadd213ps {rn-sae}, %zmm1, %zmm8, %zmm6
+        vcmpps    $18, {sae}, %zmm2, %zmm1, %k1
+        vfnmadd231ps {rn-sae}, %zmm8, %zmm4, %zmm6
+        vfnmadd213ps {rn-sae}, %zmm6, %zmm5, %zmm8
+
+/*
+ * 2) Polynomial (minimax for sin within [-Pi/2; +Pi/2] interval)
+ * a) Calculate X^2 = X * X
+ * b) Calculate polynomial:
+ * R = X + X * X^2 * (A3 + x^2 * (A5 + ......
+ */
+        vmulps    {rn-sae}, %zmm8, %zmm8, %zmm15
+        vxorps    %zmm9, %zmm8, %zmm8
+        vfmadd231ps {rn-sae}, %zmm15, %zmm10, %zmm14
+        vpternlogd $255, %zmm10, %zmm10, %zmm10
+        vfmadd213ps {rn-sae}, %zmm12, %zmm15, %zmm14
+        vfmadd213ps {rn-sae}, %zmm13, %zmm15, %zmm14
+        vmulps    {rn-sae}, %zmm15, %zmm14, %zmm9
+        vfmadd213ps {rn-sae}, %zmm8, %zmm8, %zmm9
+
+/*
+ * 3) Destination sign setting
+ * a) Set shifted destination sign using XOR operation:
+ * R = XOR( R, S );
+ */
+        vxorps    %zmm0, %zmm9, %zmm0
+        vpandnd   %zmm1, %zmm1, %zmm10{%k1}
+        vptestmd  %zmm10, %zmm10, %k0
+        kortestw  %k0, %k0
+        jne       .LBL_1_12
+
+.LBL_1_2:
+
+        testl     %edx, %edx
+        jne       .LBL_1_4
+
+.LBL_1_3:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_4:
+
+        vmovups   %zmm11, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_3
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_8:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_11
+
+.LBL_1_9:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_8
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_3
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_11:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_ssin_cout_rare_internal
+        jmp       .LBL_1_9
+       .cfi_restore 4
+       .cfi_restore 5
+       .cfi_restore 12
+       .cfi_restore 13
+       .cfi_restore 122
+       .cfi_restore 123
+       .cfi_restore 124
+       .cfi_restore 125
+
+.LBL_1_12:
+
+        vmovups   4224+__svml_ssin_data_internal(%rip), %zmm8
+
+/*
+ * Get the (2^a / 2pi) mod 1 values from the table.
+ * Because VLANG doesn't have I-type gather, we need a trivial cast
+ */
+        lea       __svml_ssin_reduction_data_internal(%rip), %rax
+        vmovups   %zmm0, (%rsp)
+        vandps    %zmm1, %zmm8, %zmm6
+        vpternlogd $255, %zmm1, %zmm1, %zmm1
+        vcmpps    $4, {sae}, %zmm8, %zmm6, %k1
+
+/* ..................... Table look-up ........................ */
+        lea       __svml_ssin_data_internal(%rip), %rcx
+        vpandd    .L_2il0floatpacket.21(%rip), %zmm11, %zmm12
+        vpandnd   %zmm6, %zmm6, %zmm1{%k1}
+        vpsrld    $23, %zmm12, %zmm13
+        vptestmd  %zmm1, %zmm1, %k0
+
+/*
+ * Break the P_xxx and m into 16-bit chunks ready for
+ * the long multiplication via 16x16->32 multiplications
+ */
+        vmovups   .L_2il0floatpacket.24(%rip), %zmm6
+        vpslld    $1, %zmm13, %zmm4
+        kxnorw    %k0, %k0, %k3
+        kxnorw    %k0, %k0, %k1
+        kxnorw    %k0, %k0, %k2
+        kmovw     %k0, %edx
+        vpaddd    %zmm13, %zmm4, %zmm9
+        vpslld    $2, %zmm9, %zmm5
+        vpxord    %zmm3, %zmm3, %zmm3
+        vpxord    %zmm14, %zmm14, %zmm14
+        vpxord    %zmm8, %zmm8, %zmm8
+        vgatherdps 4(%rax,%zmm5), %zmm3{%k3}
+        vgatherdps 8(%rax,%zmm5), %zmm14{%k1}
+        vgatherdps (%rax,%zmm5), %zmm8{%k2}
+        vpsrld    $16, %zmm3, %zmm15
+        vpsrld    $16, %zmm14, %zmm13
+        vpsrld    $16, %zmm8, %zmm7
+        kxnorw    %k0, %k0, %k1
+
+/*
+ * Also get the significand as an integer
+ * NB: adding in the integer bit is wrong for denorms!
+ * To make this work for denorms we should do something slightly different
+ */
+        vpandd    .L_2il0floatpacket.22(%rip), %zmm11, %zmm2
+        vpaddd    .L_2il0floatpacket.23(%rip), %zmm2, %zmm1
+        vpsrld    $16, %zmm1, %zmm9
+        vpandd    %zmm6, %zmm8, %zmm0
+        vpandd    %zmm6, %zmm3, %zmm12
+        vpandd    %zmm6, %zmm14, %zmm5
+        vpandd    %zmm6, %zmm1, %zmm14
+
+/* Now do the big multiplication and carry propagation */
+        vpmulld   %zmm0, %zmm9, %zmm4
+        vpmulld   %zmm15, %zmm9, %zmm3
+        vpmulld   %zmm12, %zmm9, %zmm2
+        vpmulld   %zmm13, %zmm9, %zmm1
+        vpmulld   %zmm5, %zmm9, %zmm8
+        vpmulld   %zmm15, %zmm14, %zmm9
+        vpmulld   %zmm13, %zmm14, %zmm15
+        vpmulld   %zmm7, %zmm14, %zmm7
+        vpmulld   %zmm0, %zmm14, %zmm5
+        vpmulld   %zmm12, %zmm14, %zmm0
+        vpsrld    $16, %zmm15, %zmm14
+        vpsrld    $16, %zmm9, %zmm15
+        vpsrld    $16, %zmm0, %zmm13
+        vpsrld    $16, %zmm5, %zmm12
+        vpaddd    %zmm15, %zmm3, %zmm3
+        vpaddd    %zmm14, %zmm1, %zmm1
+        vpaddd    %zmm13, %zmm2, %zmm14
+        vpaddd    %zmm12, %zmm4, %zmm2
+        vpandd    %zmm6, %zmm5, %zmm4
+        vpaddd    %zmm3, %zmm4, %zmm3
+        vpsrld    $16, %zmm8, %zmm4
+        vpandd    %zmm6, %zmm0, %zmm0
+        vpaddd    %zmm1, %zmm0, %zmm13
+        vpandd    %zmm6, %zmm7, %zmm7
+        vpaddd    %zmm2, %zmm7, %zmm0
+        vpaddd    %zmm13, %zmm4, %zmm7
+        vpandd    %zmm6, %zmm9, %zmm12
+        vpsrld    $16, %zmm7, %zmm9
+        vpaddd    %zmm14, %zmm12, %zmm5
+        vpaddd    %zmm5, %zmm9, %zmm1
+        vpsrld    $16, %zmm1, %zmm2
+        vpslld    $16, %zmm1, %zmm13
+        vpaddd    %zmm3, %zmm2, %zmm15
+        vpsrld    $16, %zmm15, %zmm8
+        vpaddd    %zmm0, %zmm8, %zmm14
+
+/* Assemble reduced argument from the pieces */
+        vpandd    %zmm6, %zmm7, %zmm12
+        vpandd    %zmm6, %zmm15, %zmm4
+        vpslld    $16, %zmm14, %zmm6
+        vpaddd    %zmm12, %zmm13, %zmm13
+        vpaddd    %zmm4, %zmm6, %zmm9
+
+/*
+ * Now round at the 2^-8 bit position for reduction mod pi/2^7
+ * instead of the original 2pi (but still with the same 2pi scaling).
+ * Use a shifter of 2^15 + 2^14.
+ * The N we get is our final version; it has an offset of
+ * 2^8 because of the implicit integer bit, and anyway for negative
+ * starting value it's a 2s complement thing. But we need to mask
+ * off the exponent part anyway so it's fine.
+ */
+        vmovups   .L_2il0floatpacket.27(%rip), %zmm6
+        vpsrld    $9, %zmm9, %zmm2
+        vpandd    .L_2il0floatpacket.30(%rip), %zmm13, %zmm15
+        vpslld    $5, %zmm15, %zmm1
+        vpsrld    $18, %zmm13, %zmm13
+
+/*
+ * We want to incorporate the original sign now too.
+ * Do it here for convenience in getting the right N value,
+ * though we could wait right to the end if we were prepared
+ * to modify the sign of N later too.
+ * So get the appropriate sign mask now (or sooner).
+ */
+        vpandd    .L_2il0floatpacket.25(%rip), %zmm11, %zmm5
+
+/*
+ * Create floating-point high part, implicitly adding integer bit 1
+ * Incorporate overall sign at this stage too.
+ */
+        vpxord    .L_2il0floatpacket.26(%rip), %zmm5, %zmm8
+        vpord     %zmm8, %zmm2, %zmm3
+        vaddps    {rn-sae}, %zmm3, %zmm6, %zmm7
+        vsubps    {rn-sae}, %zmm6, %zmm7, %zmm0
+        vsubps    {rn-sae}, %zmm0, %zmm3, %zmm14
+        vandps    .L_2il0floatpacket.35(%rip), %zmm11, %zmm3
+        vpternlogd $255, %zmm0, %zmm0, %zmm0
+
+/*
+ * Create floating-point low and medium parts, respectively
+ * lo_17, ... lo_0, 0, ..., 0
+ * hi_8, ... hi_0, lo_31, ..., lo_18
+ * then subtract off the implicitly added integer bits,
+ * 2^-46 and 2^-23, respectively.
+ * Put the original sign into all of them at this stage.
+ */
+        vpxord    .L_2il0floatpacket.29(%rip), %zmm5, %zmm8
+        vpord     %zmm8, %zmm1, %zmm2
+        vpandd    .L_2il0floatpacket.32(%rip), %zmm9, %zmm9
+        vsubps    {rn-sae}, %zmm8, %zmm2, %zmm15
+        vpxord    .L_2il0floatpacket.31(%rip), %zmm5, %zmm2
+        vpslld    $14, %zmm9, %zmm5
+        vpord     %zmm13, %zmm5, %zmm5
+        vpord     %zmm2, %zmm5, %zmm9
+        vsubps    {rn-sae}, %zmm2, %zmm9, %zmm8
+
+/*
+ * Now multiply those numbers all by 2 pi, reasonably accurately.
+ * (RHi + RLo) * (pi_lead + pi_trail) ~=
+ * RHi * pi_lead + (RHi * pi_trail + RLo * pi_lead)
+ */
+        vmovups   .L_2il0floatpacket.33(%rip), %zmm9
+        vmovups   .L_2il0floatpacket.34(%rip), %zmm2
+
+/* Now add them up into 2 reasonably aligned pieces */
+        vaddps    {rn-sae}, %zmm8, %zmm14, %zmm6
+        vsubps    {rn-sae}, %zmm6, %zmm14, %zmm14
+        vmovaps   %zmm9, %zmm5
+        vaddps    {rn-sae}, %zmm14, %zmm8, %zmm13
+
+/*
+ * If the magnitude of the input is <= 2^-20, then
+ * just pass through the input, since no reduction will be needed and
+ * the main path will only work accurately if the reduced argument is
+ * about >= 2^-40 (which it is for all large pi multiples)
+ */
+        vmovups   .L_2il0floatpacket.36(%rip), %zmm8
+        vaddps    {rn-sae}, %zmm15, %zmm13, %zmm14
+        vpternlogd $255, %zmm15, %zmm15, %zmm15
+        vcmpps    $26, {sae}, %zmm8, %zmm3, %k2
+        vcmpps    $22, {sae}, %zmm8, %zmm3, %k3
+
+/* Grab our final N value as an integer, appropriately masked mod 2^8 */
+        vpandd    .L_2il0floatpacket.28(%rip), %zmm7, %zmm4
+        vmulps    {rn-sae}, %zmm9, %zmm6, %zmm7
+        vfmsub213ps {rn-sae}, %zmm7, %zmm6, %zmm5
+        vfmadd213ps {rn-sae}, %zmm5, %zmm2, %zmm6
+        vfmadd213ps {rn-sae}, %zmm6, %zmm9, %zmm14
+        vpslld    $4, %zmm4, %zmm9
+        vpandnd   %zmm3, %zmm3, %zmm15{%k2}
+        vpandnd   %zmm3, %zmm3, %zmm0{%k3}
+        kxnorw    %k0, %k0, %k2
+        kxnorw    %k0, %k0, %k3
+        vandps    %zmm7, %zmm15, %zmm12
+        vandps    %zmm11, %zmm0, %zmm1
+        vandps    %zmm14, %zmm15, %zmm2
+        vorps     %zmm12, %zmm1, %zmm13
+
+/* ............... Polynomial approximation ................... */
+        vmovups   4352+__svml_ssin_data_internal(%rip), %zmm12
+
+/*
+ * The output is _VRES_R (high) + _VRES_E (low), and the integer part is _VRES_IND
+ * Set sRp2 = _VRES_R^2 and then resume the original code.
+ */
+        vmulps    {rn-sae}, %zmm13, %zmm13, %zmm3
+
+/* ................. Reconstruction: res_hi ................... */
+        vmovaps   %zmm13, %zmm8
+        vmovaps   %zmm13, %zmm4
+        vpxord    %zmm5, %zmm5, %zmm5
+        vpxord    %zmm7, %zmm7, %zmm7
+        vgatherdps 4(%rcx,%zmm9), %zmm5{%k2}
+        vgatherdps 12(%rcx,%zmm9), %zmm7{%k3}
+        vfmadd213ps {rn-sae}, %zmm5, %zmm7, %zmm8
+        vsubps    {rn-sae}, %zmm8, %zmm5, %zmm1
+        vfmadd231ps {rn-sae}, %zmm13, %zmm7, %zmm1
+        vpxord    %zmm0, %zmm0, %zmm0
+        vgatherdps (%rcx,%zmm9), %zmm0{%k1}
+
+/* ................. Reconstruction: res_lo=corr+polS+polC+res_lo0 ................... */
+        kxnorw    %k0, %k0, %k1
+        vfmadd132ps {rn-sae}, %zmm0, %zmm8, %zmm4
+        vsubps    {rn-sae}, %zmm4, %zmm8, %zmm6
+        vfmadd231ps {rn-sae}, %zmm0, %zmm13, %zmm6
+        vaddps    {rn-sae}, %zmm1, %zmm6, %zmm8
+        vaddps    {rn-sae}, %zmm7, %zmm0, %zmm1
+        vmovups   4288+__svml_ssin_data_internal(%rip), %zmm6
+        vmovups   4480+__svml_ssin_data_internal(%rip), %zmm0
+        vmovups   4416+__svml_ssin_data_internal(%rip), %zmm7
+        vfmadd231ps {rn-sae}, %zmm3, %zmm12, %zmm6
+        vfmadd231ps {rn-sae}, %zmm3, %zmm0, %zmm7
+        vmulps    {rn-sae}, %zmm3, %zmm6, %zmm14
+        vmulps    {rn-sae}, %zmm3, %zmm7, %zmm0
+        vmulps    {rn-sae}, %zmm13, %zmm14, %zmm6
+        vfnmadd213ps {rn-sae}, %zmm1, %zmm5, %zmm13
+        vfmadd213ps {rn-sae}, %zmm8, %zmm13, %zmm6
+        vpxord    %zmm3, %zmm3, %zmm3
+        vgatherdps 8(%rcx,%zmm9), %zmm3{%k1}
+        vfmadd213ps {rn-sae}, %zmm3, %zmm13, %zmm2
+        vfmadd213ps {rn-sae}, %zmm2, %zmm5, %zmm0
+        vaddps    {rn-sae}, %zmm6, %zmm0, %zmm2
+
+/* .................. Final reconstruction ................... */
+        vaddps    {rn-sae}, %zmm2, %zmm4, %zmm4
+
+/*
+ * ----------------------------------------------------------
+ * End of large arguments path
+ * ----------------------------------------------------------
+ * Merge results from main and large paths:
+ */
+        vpandnd   (%rsp), %zmm10, %zmm0
+        vpandd    %zmm10, %zmm4, %zmm10
+        vpord     %zmm10, %zmm0, %zmm0
+        jmp       .LBL_1_2
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_sinf16,@function
+       .size   __svml_sinf16,.-__svml_sinf16
+..LN__svml_sinf16.0:
+
+.L_2__routine_start___svml_ssin_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_ssin_cout_rare_internal:
+
+
+       .cfi_startproc
+..L63:
+
+        movl      (%rdi), %edx
+        movzwl    2(%rdi), %eax
+        movl      %edx, -8(%rsp)
+        andl      $32640, %eax
+        shrl      $24, %edx
+        andl      $127, %edx
+        movss     (%rdi), %xmm1
+        cmpl      $32640, %eax
+        jne       .LBL_2_6
+
+
+        movb      %dl, -5(%rsp)
+        cmpl      $2139095040, -8(%rsp)
+        jne       .LBL_2_4
+
+
+        movss     __ssin_la__vmlsSinHATab(%rip), %xmm0
+        movl      $1, %eax
+        mulss     %xmm0, %xmm1
+        movss     %xmm1, (%rsi)
+        ret
+
+.LBL_2_4:
+
+        mulss     (%rdi), %xmm1
+        xorl      %eax, %eax
+        movss     %xmm1, (%rsi)
+
+
+        ret
+
+.LBL_2_6:
+
+        xorl      %eax, %eax
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_ssin_cout_rare_internal,@function
+       .size   __svml_ssin_cout_rare_internal,.-__svml_ssin_cout_rare_internal
+..LN__svml_ssin_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+.L_2il0floatpacket.21:
+       .long   0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000
+       .type   .L_2il0floatpacket.21,@object
+       .size   .L_2il0floatpacket.21,64
+       .align 64
+.L_2il0floatpacket.22:
+       .long   0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff
+       .type   .L_2il0floatpacket.22,@object
+       .size   .L_2il0floatpacket.22,64
+       .align 64
+.L_2il0floatpacket.23:
+       .long   0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000
+       .type   .L_2il0floatpacket.23,@object
+       .size   .L_2il0floatpacket.23,64
+       .align 64
+.L_2il0floatpacket.24:
+       .long   0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff
+       .type   .L_2il0floatpacket.24,@object
+       .size   .L_2il0floatpacket.24,64
+       .align 64
+.L_2il0floatpacket.25:
+       .long   0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000
+       .type   .L_2il0floatpacket.25,@object
+       .size   .L_2il0floatpacket.25,64
+       .align 64
+.L_2il0floatpacket.26:
+       .long   0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000
+       .type   .L_2il0floatpacket.26,@object
+       .size   .L_2il0floatpacket.26,64
+       .align 64
+.L_2il0floatpacket.27:
+       .long   0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000
+       .type   .L_2il0floatpacket.27,@object
+       .size   .L_2il0floatpacket.27,64
+       .align 64
+.L_2il0floatpacket.28:
+       .long   0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff
+       .type   .L_2il0floatpacket.28,@object
+       .size   .L_2il0floatpacket.28,64
+       .align 64
+.L_2il0floatpacket.29:
+       .long   0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000
+       .type   .L_2il0floatpacket.29,@object
+       .size   .L_2il0floatpacket.29,64
+       .align 64
+.L_2il0floatpacket.30:
+       .long   0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff
+       .type   .L_2il0floatpacket.30,@object
+       .size   .L_2il0floatpacket.30,64
+       .align 64
+.L_2il0floatpacket.31:
+       .long   0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000
+       .type   .L_2il0floatpacket.31,@object
+       .size   .L_2il0floatpacket.31,64
+       .align 64
+.L_2il0floatpacket.32:
+       .long   0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff
+       .type   .L_2il0floatpacket.32,@object
+       .size   .L_2il0floatpacket.32,64
+       .align 64
+.L_2il0floatpacket.33:
+       .long   0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb
+       .type   .L_2il0floatpacket.33,@object
+       .size   .L_2il0floatpacket.33,64
+       .align 64
+.L_2il0floatpacket.34:
+       .long   0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e
+       .type   .L_2il0floatpacket.34,@object
+       .size   .L_2il0floatpacket.34,64
+       .align 64
+.L_2il0floatpacket.35:
+       .long   0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff
+       .type   .L_2il0floatpacket.35,@object
+       .size   .L_2il0floatpacket.35,64
+       .align 64
+.L_2il0floatpacket.36:
+       .long   0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000
+       .type   .L_2il0floatpacket.36,@object
+       .size   .L_2il0floatpacket.36,64
+       .align 64
+__svml_ssin_data_internal:
+       .long   0
+       .long   0
+       .long   0
+       .long   1065353216
+       .long   3114133471
+       .long   1019808432
+       .long   2953169304
+       .long   1065353216
+       .long   3130909128
+       .long   1028193072
+       .long   2968461951
+       .long   1065353216
+       .long   3140588184
+       .long   1033283845
+       .long   2975014497
+       .long   1065353216
+       .long   3147680113
+       .long   1036565814
+       .long   2960495349
+       .long   1065353216
+       .long   3153489468
+       .long   1039839859
+       .long   2970970319
+       .long   1065353216
+       .long   3157349634
+       .long   1041645699
+       .long   837346836
+       .long   1065353216
+       .long   3161536011
+       .long   1043271842
+       .long   823224313
+       .long   1065353216
+       .long   3164432432
+       .long   1044891074
+       .long   2967836285
+       .long   1065353216
+       .long   3167161428
+       .long   1046502419
+       .long   833086710
+       .long   1065353216
+       .long   3170205956
+       .long   1048104908
+       .long   2971391005
+       .long   1065353216
+       .long   3172229004
+       .long   1049136787
+       .long   824999326
+       .long   1065353216
+       .long   3174063957
+       .long   1049927729
+       .long   846027248
+       .long   1065353216
+       .long   3176053642
+       .long   1050712805
+       .long   2990442912
+       .long   1065353216
+       .long   3178196862
+       .long   1051491540
+       .long   2988789250
+       .long   1065353216
+       .long   3179887378
+       .long   1052263466
+       .long   2993707942
+       .long   1065353216
+       .long   3181110540
+       .long   1053028117
+       .long   836097324
+       .long   1065353216
+       .long   3182408396
+       .long   1053785034
+       .long   829045603
+       .long   1065353216
+       .long   3183780163
+       .long   1054533760
+       .long   840832460
+       .long   1065353216
+       .long   3185225016
+       .long   1055273845
+       .long   2983839604
+       .long   1065353216
+       .long   3186742084
+       .long   1056004842
+       .long   2986287417
+       .long   1065353216
+       .long   3188000746
+       .long   1056726311
+       .long   2978016425
+       .long   1065353216
+       .long   3188830103
+       .long   1057201213
+       .long   2992349186
+       .long   1065353216
+       .long   3189694133
+       .long   1057551771
+       .long   2998815566
+       .long   1065353216
+       .long   3190592315
+       .long   1057896922
+       .long   2991207143
+       .long   1065353216
+       .long   3191524108
+       .long   1058236458
+       .long   852349230
+       .long   1065353216
+       .long   3192488951
+       .long   1058570176
+       .long   2982650867
+       .long   1065353216
+       .long   3193486263
+       .long   1058897873
+       .long   848430348
+       .long   1065353216
+       .long   3194515443
+       .long   1059219353
+       .long   841032635
+       .long   1065353216
+       .long   3195575871
+       .long   1059534422
+       .long   2986574659
+       .long   1065353216
+       .long   3196363278
+       .long   1059842890
+       .long   2998350134
+       .long   1065353216
+       .long   3196923773
+       .long   1060144571
+       .long   2997759282
+       .long   1065353216
+       .long   3197498906
+       .long   1060439283
+       .long   844097402
+       .long   1065353216
+       .long   1044518635
+       .long   1060726850
+       .long   2994798599
+       .long   1056964608
+       .long   1043311911
+       .long   1061007097
+       .long   832220140
+       .long   1056964608
+       .long   1042078039
+       .long   1061279856
+       .long   851442039
+       .long   1056964608
+       .long   1040817765
+       .long   1061544963
+       .long   850481524
+       .long   1056964608
+       .long   1038876298
+       .long   1061802258
+       .long   848897600
+       .long   1056964608
+       .long   1036254719
+       .long   1062051586
+       .long   847147240
+       .long   1056964608
+       .long   1033584979
+       .long   1062292797
+       .long   806113028
+       .long   1056964608
+       .long   1029938589
+       .long   1062525745
+       .long   848357914
+       .long   1056964608
+       .long   1024416170
+       .long   1062750291
+       .long   2994560960
+       .long   1056964608
+       .long   1013387058
+       .long   1062966298
+       .long   841166280
+       .long   1056964608
+       .long   3152590408
+       .long   1063173637
+       .long   851900755
+       .long   1056964608
+       .long   3169472868
+       .long   1063372184
+       .long   3001545765
+       .long   1056964608
+       .long   3176031322
+       .long   1063561817
+       .long   823789818
+       .long   1056964608
+       .long   3180617215
+       .long   1063742424
+       .long   2998678409
+       .long   1056964608
+       .long   3183612120
+       .long   1063913895
+       .long   3001754476
+       .long   1056964608
+       .long   3186639787
+       .long   1064076126
+       .long   854796500
+       .long   1056964608
+       .long   3188684717
+       .long   1064229022
+       .long   2995991516
+       .long   1056964608
+       .long   1035072335
+       .long   1064372488
+       .long   840880349
+       .long   1048576000
+       .long   1031957395
+       .long   1064506439
+       .long   851742225
+       .long   1048576000
+       .long   1025835404
+       .long   1064630795
+       .long   2996018466
+       .long   1048576000
+       .long   1015605553
+       .long   1064745479
+       .long   846006572
+       .long   1048576000
+       .long   3152414341
+       .long   1064850424
+       .long   2987244005
+       .long   1048576000
+       .long   3170705253
+       .long   1064945565
+       .long   851856985
+       .long   1048576000
+       .long   3177244920
+       .long   1065030846
+       .long   855602635
+       .long   1048576000
+       .long   1027359369
+       .long   1065106216
+       .long   2989610635
+       .long   1040187392
+       .long   1018299420
+       .long   1065171628
+       .long   2969000681
+       .long   1040187392
+       .long   3140071849
+       .long   1065227044
+       .long   3002197507
+       .long   1040187392
+       .long   3168602920
+       .long   1065272429
+       .long   838093129
+       .long   1040187392
+       .long   1010124837
+       .long   1065307757
+       .long   852498564
+       .long   1031798784
+       .long   3160150850
+       .long   1065333007
+       .long   836655967
+       .long   1031798784
+       .long   3151746369
+       .long   1065348163
+       .long   814009613
+       .long   1023410176
+       .long   0
+       .long   1065353216
+       .long   0
+       .long   0
+       .long   1004262721
+       .long   1065348163
+       .long   814009613
+       .long   3170893824
+       .long   1012667202
+       .long   1065333007
+       .long   836655967
+       .long   3179282432
+       .long   3157608485
+       .long   1065307757
+       .long   852498564
+       .long   3179282432
+       .long   1021119272
+       .long   1065272429
+       .long   838093129
+       .long   3187671040
+       .long   992588201
+       .long   1065227044
+       .long   3002197507
+       .long   3187671040
+       .long   3165783068
+       .long   1065171628
+       .long   2969000681
+       .long   3187671040
+       .long   3174843017
+       .long   1065106216
+       .long   2989610635
+       .long   3187671040
+       .long   1029761272
+       .long   1065030846
+       .long   855602635
+       .long   3196059648
+       .long   1023221605
+       .long   1064945565
+       .long   851856985
+       .long   3196059648
+       .long   1004930693
+       .long   1064850424
+       .long   2987244005
+       .long   3196059648
+       .long   3163089201
+       .long   1064745479
+       .long   846006572
+       .long   3196059648
+       .long   3173319052
+       .long   1064630795
+       .long   2996018466
+       .long   3196059648
+       .long   3179441043
+       .long   1064506439
+       .long   851742225
+       .long   3196059648
+       .long   3182555983
+       .long   1064372488
+       .long   840880349
+       .long   3196059648
+       .long   1041201069
+       .long   1064229022
+       .long   2995991516
+       .long   3204448256
+       .long   1039156139
+       .long   1064076126
+       .long   854796500
+       .long   3204448256
+       .long   1036128472
+       .long   1063913895
+       .long   3001754476
+       .long   3204448256
+       .long   1033133567
+       .long   1063742424
+       .long   2998678409
+       .long   3204448256
+       .long   1028547674
+       .long   1063561817
+       .long   823789818
+       .long   3204448256
+       .long   1021989220
+       .long   1063372184
+       .long   3001545765
+       .long   3204448256
+       .long   1005106760
+       .long   1063173637
+       .long   851900755
+       .long   3204448256
+       .long   3160870706
+       .long   1062966298
+       .long   841166280
+       .long   3204448256
+       .long   3171899818
+       .long   1062750291
+       .long   2994560960
+       .long   3204448256
+       .long   3177422237
+       .long   1062525745
+       .long   848357914
+       .long   3204448256
+       .long   3181068627
+       .long   1062292797
+       .long   806113028
+       .long   3204448256
+       .long   3183738367
+       .long   1062051586
+       .long   847147240
+       .long   3204448256
+       .long   3186359946
+       .long   1061802258
+       .long   848897600
+       .long   3204448256
+       .long   3188301413
+       .long   1061544963
+       .long   850481524
+       .long   3204448256
+       .long   3189561687
+       .long   1061279856
+       .long   851442039
+       .long   3204448256
+       .long   3190795559
+       .long   1061007097
+       .long   832220140
+       .long   3204448256
+       .long   3192002283
+       .long   1060726850
+       .long   2994798599
+       .long   3204448256
+       .long   1050015258
+       .long   1060439283
+       .long   844097402
+       .long   3212836864
+       .long   1049440125
+       .long   1060144571
+       .long   2997759282
+       .long   3212836864
+       .long   1048879630
+       .long   1059842890
+       .long   2998350134
+       .long   3212836864
+       .long   1048092223
+       .long   1059534422
+       .long   2986574659
+       .long   3212836864
+       .long   1047031795
+       .long   1059219353
+       .long   841032635
+       .long   3212836864
+       .long   1046002615
+       .long   1058897873
+       .long   848430348
+       .long   3212836864
+       .long   1045005303
+       .long   1058570176
+       .long   2982650867
+       .long   3212836864
+       .long   1044040460
+       .long   1058236458
+       .long   852349230
+       .long   3212836864
+       .long   1043108667
+       .long   1057896922
+       .long   2991207143
+       .long   3212836864
+       .long   1042210485
+       .long   1057551771
+       .long   2998815566
+       .long   3212836864
+       .long   1041346455
+       .long   1057201213
+       .long   2992349186
+       .long   3212836864
+       .long   1040517098
+       .long   1056726311
+       .long   2978016425
+       .long   3212836864
+       .long   1039258436
+       .long   1056004842
+       .long   2986287417
+       .long   3212836864
+       .long   1037741368
+       .long   1055273845
+       .long   2983839604
+       .long   3212836864
+       .long   1036296515
+       .long   1054533760
+       .long   840832460
+       .long   3212836864
+       .long   1034924748
+       .long   1053785034
+       .long   829045603
+       .long   3212836864
+       .long   1033626892
+       .long   1053028117
+       .long   836097324
+       .long   3212836864
+       .long   1032403730
+       .long   1052263466
+       .long   2993707942
+       .long   3212836864
+       .long   1030713214
+       .long   1051491540
+       .long   2988789250
+       .long   3212836864
+       .long   1028569994
+       .long   1050712805
+       .long   2990442912
+       .long   3212836864
+       .long   1026580309
+       .long   1049927729
+       .long   846027248
+       .long   3212836864
+       .long   1024745356
+       .long   1049136787
+       .long   824999326
+       .long   3212836864
+       .long   1022722308
+       .long   1048104908
+       .long   2971391005
+       .long   3212836864
+       .long   1019677780
+       .long   1046502419
+       .long   833086710
+       .long   3212836864
+       .long   1016948784
+       .long   1044891074
+       .long   2967836285
+       .long   3212836864
+       .long   1014052363
+       .long   1043271842
+       .long   823224313
+       .long   3212836864
+       .long   1009865986
+       .long   1041645699
+       .long   837346836
+       .long   3212836864
+       .long   1006005820
+       .long   1039839859
+       .long   2970970319
+       .long   3212836864
+       .long   1000196465
+       .long   1036565814
+       .long   2960495349
+       .long   3212836864
+       .long   993104536
+       .long   1033283845
+       .long   2975014497
+       .long   3212836864
+       .long   983425480
+       .long   1028193072
+       .long   2968461951
+       .long   3212836864
+       .long   966649823
+       .long   1019808432
+       .long   2953169304
+       .long   3212836864
+       .long   0
+       .long   0
+       .long   0
+       .long   3212836864
+       .long   966649823
+       .long   3167292080
+       .long   805685656
+       .long   3212836864
+       .long   983425480
+       .long   3175676720
+       .long   820978303
+       .long   3212836864
+       .long   993104536
+       .long   3180767493
+       .long   827530849
+       .long   3212836864
+       .long   1000196465
+       .long   3184049462
+       .long   813011701
+       .long   3212836864
+       .long   1006005820
+       .long   3187323507
+       .long   823486671
+       .long   3212836864
+       .long   1009865986
+       .long   3189129347
+       .long   2984830484
+       .long   3212836864
+       .long   1014052363
+       .long   3190755490
+       .long   2970707961
+       .long   3212836864
+       .long   1016948784
+       .long   3192374722
+       .long   820352637
+       .long   3212836864
+       .long   1019677780
+       .long   3193986067
+       .long   2980570358
+       .long   3212836864
+       .long   1022722308
+       .long   3195588556
+       .long   823907357
+       .long   3212836864
+       .long   1024745356
+       .long   3196620435
+       .long   2972482974
+       .long   3212836864
+       .long   1026580309
+       .long   3197411377
+       .long   2993510896
+       .long   3212836864
+       .long   1028569994
+       .long   3198196453
+       .long   842959264
+       .long   3212836864
+       .long   1030713214
+       .long   3198975188
+       .long   841305602
+       .long   3212836864
+       .long   1032403730
+       .long   3199747114
+       .long   846224294
+       .long   3212836864
+       .long   1033626892
+       .long   3200511765
+       .long   2983580972
+       .long   3212836864
+       .long   1034924748
+       .long   3201268682
+       .long   2976529251
+       .long   3212836864
+       .long   1036296515
+       .long   3202017408
+       .long   2988316108
+       .long   3212836864
+       .long   1037741368
+       .long   3202757493
+       .long   836355956
+       .long   3212836864
+       .long   1039258436
+       .long   3203488490
+       .long   838803769
+       .long   3212836864
+       .long   1040517098
+       .long   3204209959
+       .long   830532777
+       .long   3212836864
+       .long   1041346455
+       .long   3204684861
+       .long   844865538
+       .long   3212836864
+       .long   1042210485
+       .long   3205035419
+       .long   851331918
+       .long   3212836864
+       .long   1043108667
+       .long   3205380570
+       .long   843723495
+       .long   3212836864
+       .long   1044040460
+       .long   3205720106
+       .long   2999832878
+       .long   3212836864
+       .long   1045005303
+       .long   3206053824
+       .long   835167219
+       .long   3212836864
+       .long   1046002615
+       .long   3206381521
+       .long   2995913996
+       .long   3212836864
+       .long   1047031795
+       .long   3206703001
+       .long   2988516283
+       .long   3212836864
+       .long   1048092223
+       .long   3207018070
+       .long   839091011
+       .long   3212836864
+       .long   1048879630
+       .long   3207326538
+       .long   850866486
+       .long   3212836864
+       .long   1049440125
+       .long   3207628219
+       .long   850275634
+       .long   3212836864
+       .long   1050015258
+       .long   3207922931
+       .long   2991581050
+       .long   3212836864
+       .long   3192002283
+       .long   3208210498
+       .long   847314951
+       .long   3204448256
+       .long   3190795559
+       .long   3208490745
+       .long   2979703788
+       .long   3204448256
+       .long   3189561687
+       .long   3208763504
+       .long   2998925687
+       .long   3204448256
+       .long   3188301413
+       .long   3209028611
+       .long   2997965172
+       .long   3204448256
+       .long   3186359946
+       .long   3209285906
+       .long   2996381248
+       .long   3204448256
+       .long   3183738367
+       .long   3209535234
+       .long   2994630888
+       .long   3204448256
+       .long   3181068627
+       .long   3209776445
+       .long   2953596676
+       .long   3204448256
+       .long   3177422237
+       .long   3210009393
+       .long   2995841562
+       .long   3204448256
+       .long   3171899818
+       .long   3210233939
+       .long   847077312
+       .long   3204448256
+       .long   3160870706
+       .long   3210449946
+       .long   2988649928
+       .long   3204448256
+       .long   1005106760
+       .long   3210657285
+       .long   2999384403
+       .long   3204448256
+       .long   1021989220
+       .long   3210855832
+       .long   854062117
+       .long   3204448256
+       .long   1028547674
+       .long   3211045465
+       .long   2971273466
+       .long   3204448256
+       .long   1033133567
+       .long   3211226072
+       .long   851194761
+       .long   3204448256
+       .long   1036128472
+       .long   3211397543
+       .long   854270828
+       .long   3204448256
+       .long   1039156139
+       .long   3211559774
+       .long   3002280148
+       .long   3204448256
+       .long   1041201069
+       .long   3211712670
+       .long   848507868
+       .long   3204448256
+       .long   3182555983
+       .long   3211856136
+       .long   2988363997
+       .long   3196059648
+       .long   3179441043
+       .long   3211990087
+       .long   2999225873
+       .long   3196059648
+       .long   3173319052
+       .long   3212114443
+       .long   848534818
+       .long   3196059648
+       .long   3163089201
+       .long   3212229127
+       .long   2993490220
+       .long   3196059648
+       .long   1004930693
+       .long   3212334072
+       .long   839760357
+       .long   3196059648
+       .long   1023221605
+       .long   3212429213
+       .long   2999340633
+       .long   3196059648
+       .long   1029761272
+       .long   3212514494
+       .long   3003086283
+       .long   3196059648
+       .long   3174843017
+       .long   3212589864
+       .long   842126987
+       .long   3187671040
+       .long   3165783068
+       .long   3212655276
+       .long   821517033
+       .long   3187671040
+       .long   992588201
+       .long   3212710692
+       .long   854713859
+       .long   3187671040
+       .long   1021119272
+       .long   3212756077
+       .long   2985576777
+       .long   3187671040
+       .long   3157608485
+       .long   3212791405
+       .long   2999982212
+       .long   3179282432
+       .long   1012667202
+       .long   3212816655
+       .long   2984139615
+       .long   3179282432
+       .long   1004262721
+       .long   3212831811
+       .long   2961493261
+       .long   3170893824
+       .long   0
+       .long   3212836864
+       .long   0
+       .long   0
+       .long   3151746369
+       .long   3212831811
+       .long   2961493261
+       .long   1023410176
+       .long   3160150850
+       .long   3212816655
+       .long   2984139615
+       .long   1031798784
+       .long   1010124837
+       .long   3212791405
+       .long   2999982212
+       .long   1031798784
+       .long   3168602920
+       .long   3212756077
+       .long   2985576777
+       .long   1040187392
+       .long   3140071849
+       .long   3212710692
+       .long   854713859
+       .long   1040187392
+       .long   1018299420
+       .long   3212655276
+       .long   821517033
+       .long   1040187392
+       .long   1027359369
+       .long   3212589864
+       .long   842126987
+       .long   1040187392
+       .long   3177244920
+       .long   3212514494
+       .long   3003086283
+       .long   1048576000
+       .long   3170705253
+       .long   3212429213
+       .long   2999340633
+       .long   1048576000
+       .long   3152414341
+       .long   3212334072
+       .long   839760357
+       .long   1048576000
+       .long   1015605553
+       .long   3212229127
+       .long   2993490220
+       .long   1048576000
+       .long   1025835404
+       .long   3212114443
+       .long   848534818
+       .long   1048576000
+       .long   1031957395
+       .long   3211990087
+       .long   2999225873
+       .long   1048576000
+       .long   1035072335
+       .long   3211856136
+       .long   2988363997
+       .long   1048576000
+       .long   3188684717
+       .long   3211712670
+       .long   848507868
+       .long   1056964608
+       .long   3186639787
+       .long   3211559774
+       .long   3002280148
+       .long   1056964608
+       .long   3183612120
+       .long   3211397543
+       .long   854270828
+       .long   1056964608
+       .long   3180617215
+       .long   3211226072
+       .long   851194761
+       .long   1056964608
+       .long   3176031322
+       .long   3211045465
+       .long   2971273466
+       .long   1056964608
+       .long   3169472868
+       .long   3210855832
+       .long   854062117
+       .long   1056964608
+       .long   3152590408
+       .long   3210657285
+       .long   2999384403
+       .long   1056964608
+       .long   1013387058
+       .long   3210449946
+       .long   2988649928
+       .long   1056964608
+       .long   1024416170
+       .long   3210233939
+       .long   847077312
+       .long   1056964608
+       .long   1029938589
+       .long   3210009393
+       .long   2995841562
+       .long   1056964608
+       .long   1033584979
+       .long   3209776445
+       .long   2953596676
+       .long   1056964608
+       .long   1036254719
+       .long   3209535234
+       .long   2994630888
+       .long   1056964608
+       .long   1038876298
+       .long   3209285906
+       .long   2996381248
+       .long   1056964608
+       .long   1040817765
+       .long   3209028611
+       .long   2997965172
+       .long   1056964608
+       .long   1042078039
+       .long   3208763504
+       .long   2998925687
+       .long   1056964608
+       .long   1043311911
+       .long   3208490745
+       .long   2979703788
+       .long   1056964608
+       .long   1044518635
+       .long   3208210498
+       .long   847314951
+       .long   1056964608
+       .long   3197498906
+       .long   3207922931
+       .long   2991581050
+       .long   1065353216
+       .long   3196923773
+       .long   3207628219
+       .long   850275634
+       .long   1065353216
+       .long   3196363278
+       .long   3207326538
+       .long   850866486
+       .long   1065353216
+       .long   3195575871
+       .long   3207018070
+       .long   839091011
+       .long   1065353216
+       .long   3194515443
+       .long   3206703001
+       .long   2988516283
+       .long   1065353216
+       .long   3193486263
+       .long   3206381521
+       .long   2995913996
+       .long   1065353216
+       .long   3192488951
+       .long   3206053824
+       .long   835167219
+       .long   1065353216
+       .long   3191524108
+       .long   3205720106
+       .long   2999832878
+       .long   1065353216
+       .long   3190592315
+       .long   3205380570
+       .long   843723495
+       .long   1065353216
+       .long   3189694133
+       .long   3205035419
+       .long   851331918
+       .long   1065353216
+       .long   3188830103
+       .long   3204684861
+       .long   844865538
+       .long   1065353216
+       .long   3188000746
+       .long   3204209959
+       .long   830532777
+       .long   1065353216
+       .long   3186742084
+       .long   3203488490
+       .long   838803769
+       .long   1065353216
+       .long   3185225016
+       .long   3202757493
+       .long   836355956
+       .long   1065353216
+       .long   3183780163
+       .long   3202017408
+       .long   2988316108
+       .long   1065353216
+       .long   3182408396
+       .long   3201268682
+       .long   2976529251
+       .long   1065353216
+       .long   3181110540
+       .long   3200511765
+       .long   2983580972
+       .long   1065353216
+       .long   3179887378
+       .long   3199747114
+       .long   846224294
+       .long   1065353216
+       .long   3178196862
+       .long   3198975188
+       .long   841305602
+       .long   1065353216
+       .long   3176053642
+       .long   3198196453
+       .long   842959264
+       .long   1065353216
+       .long   3174063957
+       .long   3197411377
+       .long   2993510896
+       .long   1065353216
+       .long   3172229004
+       .long   3196620435
+       .long   2972482974
+       .long   1065353216
+       .long   3170205956
+       .long   3195588556
+       .long   823907357
+       .long   1065353216
+       .long   3167161428
+       .long   3193986067
+       .long   2980570358
+       .long   1065353216
+       .long   3164432432
+       .long   3192374722
+       .long   820352637
+       .long   1065353216
+       .long   3161536011
+       .long   3190755490
+       .long   2970707961
+       .long   1065353216
+       .long   3157349634
+       .long   3189129347
+       .long   2984830484
+       .long   1065353216
+       .long   3153489468
+       .long   3187323507
+       .long   823486671
+       .long   1065353216
+       .long   3147680113
+       .long   3184049462
+       .long   813011701
+       .long   1065353216
+       .long   3140588184
+       .long   3180767493
+       .long   827530849
+       .long   1065353216
+       .long   3130909128
+       .long   3175676720
+       .long   820978303
+       .long   1065353216
+       .long   3114133471
+       .long   3167292080
+       .long   805685656
+       .long   1065353216
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   1176256512
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   3190467243
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   1007192156
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   3204448256
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1026206332
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   1078525952
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   981311488
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   874651648
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   750018842
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   1078530011
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   3015425326
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   2809605357
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   3190467238
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   1007191910
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   3109009407
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   909041400
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1050868099
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .type   __svml_ssin_data_internal,@object
+       .size   __svml_ssin_data_internal,5376
+       .align 64
+__svml_ssin_reduction_data_internal:
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1
+       .long   0
+       .long   0
+       .long   2
+       .long   0
+       .long   0
+       .long   5
+       .long   0
+       .long   0
+       .long   10
+       .long   0
+       .long   0
+       .long   20
+       .long   0
+       .long   0
+       .long   40
+       .long   0
+       .long   0
+       .long   81
+       .long   0
+       .long   0
+       .long   162
+       .long   0
+       .long   0
+       .long   325
+       .long   0
+       .long   0
+       .long   651
+       .long   0
+       .long   0
+       .long   1303
+       .long   0
+       .long   0
+       .long   2607
+       .long   0
+       .long   0
+       .long   5215
+       .long   0
+       .long   0
+       .long   10430
+       .long   0
+       .long   0
+       .long   20860
+       .long   0
+       .long   0
+       .long   41721
+       .long   0
+       .long   0
+       .long   83443
+       .long   0
+       .long   0
+       .long   166886
+       .long   0
+       .long   0
+       .long   333772
+       .long   0
+       .long   0
+       .long   667544
+       .long   0
+       .long   0
+       .long   1335088
+       .long   0
+       .long   0
+       .long   2670176
+       .long   0
+       .long   0
+       .long   5340353
+       .long   0
+       .long   0
+       .long   10680707
+       .long   0
+       .long   0
+       .long   21361414
+       .long   0
+       .long   0
+       .long   42722829
+       .long   0
+       .long   0
+       .long   85445659
+       .long   0
+       .long   0
+       .long   170891318
+       .long   0
+       .long   0
+       .long   341782637
+       .long   0
+       .long   0
+       .long   683565275
+       .long   0
+       .long   0
+       .long   1367130551
+       .long   0
+       .long   0
+       .long   2734261102
+       .long   0
+       .long   1
+       .long   1173554908
+       .long   0
+       .long   2
+       .long   2347109817
+       .long   0
+       .long   5
+       .long   399252338
+       .long   0
+       .long   10
+       .long   798504676
+       .long   0
+       .long   20
+       .long   1597009353
+       .long   0
+       .long   40
+       .long   3194018707
+       .long   0
+       .long   81
+       .long   2093070119
+       .long   0
+       .long   162
+       .long   4186140238
+       .long   0
+       .long   325
+       .long   4077313180
+       .long   0
+       .long   651
+       .long   3859659065
+       .long   0
+       .long   1303
+       .long   3424350834
+       .long   0
+       .long   2607
+       .long   2553734372
+       .long   0
+       .long   5215
+       .long   812501448
+       .long   0
+       .long   10430
+       .long   1625002897
+       .long   0
+       .long   20860
+       .long   3250005794
+       .long   0
+       .long   41721
+       .long   2205044292
+       .long   0
+       .long   83443
+       .long   115121288
+       .long   0
+       .long   166886
+       .long   230242576
+       .long   0
+       .long   333772
+       .long   460485152
+       .long   0
+       .long   667544
+       .long   920970305
+       .long   0
+       .long   1335088
+       .long   1841940610
+       .long   0
+       .long   2670176
+       .long   3683881221
+       .long   0
+       .long   5340353
+       .long   3072795146
+       .long   0
+       .long   10680707
+       .long   1850622997
+       .long   0
+       .long   21361414
+       .long   3701245994
+       .long   0
+       .long   42722829
+       .long   3107524692
+       .long   0
+       .long   85445659
+       .long   1920082089
+       .long   0
+       .long   170891318
+       .long   3840164178
+       .long   0
+       .long   341782637
+       .long   3385361061
+       .long   0
+       .long   683565275
+       .long   2475754826
+       .long   0
+       .long   1367130551
+       .long   656542356
+       .long   0
+       .long   2734261102
+       .long   1313084713
+       .long   1
+       .long   1173554908
+       .long   2626169427
+       .long   2
+       .long   2347109817
+       .long   957371559
+       .long   5
+       .long   399252338
+       .long   1914743119
+       .long   10
+       .long   798504676
+       .long   3829486239
+       .long   20
+       .long   1597009353
+       .long   3364005183
+       .long   40
+       .long   3194018707
+       .long   2433043071
+       .long   81
+       .long   2093070119
+       .long   571118846
+       .long   162
+       .long   4186140238
+       .long   1142237692
+       .long   325
+       .long   4077313180
+       .long   2284475384
+       .long   651
+       .long   3859659065
+       .long   273983472
+       .long   1303
+       .long   3424350834
+       .long   547966945
+       .long   2607
+       .long   2553734372
+       .long   1095933890
+       .long   5215
+       .long   812501448
+       .long   2191867780
+       .long   10430
+       .long   1625002897
+       .long   88768265
+       .long   20860
+       .long   3250005794
+       .long   177536531
+       .long   41721
+       .long   2205044292
+       .long   355073063
+       .long   83443
+       .long   115121288
+       .long   710146126
+       .long   166886
+       .long   230242576
+       .long   1420292253
+       .long   333772
+       .long   460485152
+       .long   2840584506
+       .long   667544
+       .long   920970305
+       .long   1386201717
+       .long   1335088
+       .long   1841940610
+       .long   2772403434
+       .long   2670176
+       .long   3683881221
+       .long   1249839573
+       .long   5340353
+       .long   3072795146
+       .long   2499679147
+       .long   10680707
+       .long   1850622997
+       .long   704390999
+       .long   21361414
+       .long   3701245994
+       .long   1408781999
+       .long   42722829
+       .long   3107524692
+       .long   2817563999
+       .long   85445659
+       .long   1920082089
+       .long   1340160702
+       .long   170891318
+       .long   3840164178
+       .long   2680321405
+       .long   341782637
+       .long   3385361061
+       .long   1065675514
+       .long   683565275
+       .long   2475754826
+       .long   2131351028
+       .long   1367130551
+       .long   656542356
+       .long   4262702056
+       .long   2734261102
+       .long   1313084713
+       .long   4230436817
+       .long   1173554908
+       .long   2626169427
+       .long   4165906339
+       .long   2347109817
+       .long   957371559
+       .long   4036845383
+       .long   399252338
+       .long   1914743119
+       .long   3778723471
+       .long   798504676
+       .long   3829486239
+       .long   3262479647
+       .long   1597009353
+       .long   3364005183
+       .long   2229991998
+       .long   3194018707
+       .long   2433043071
+       .long   165016701
+       .long   2093070119
+       .long   571118846
+       .long   330033402
+       .long   4186140238
+       .long   1142237692
+       .long   660066805
+       .long   4077313180
+       .long   2284475384
+       .long   1320133610
+       .long   3859659065
+       .long   273983472
+       .long   2640267220
+       .long   3424350834
+       .long   547966945
+       .long   985567145
+       .long   2553734372
+       .long   1095933890
+       .long   1971134291
+       .long   812501448
+       .long   2191867780
+       .long   3942268582
+       .long   1625002897
+       .long   88768265
+       .long   3589569869
+       .long   3250005794
+       .long   177536531
+       .long   2884172442
+       .long   2205044292
+       .long   355073063
+       .long   1473377588
+       .long   115121288
+       .long   710146126
+       .long   2946755177
+       .long   230242576
+       .long   1420292253
+       .long   1598543059
+       .long   460485152
+       .long   2840584506
+       .long   3197086118
+       .long   920970305
+       .long   1386201717
+       .long   2099204941
+       .long   1841940610
+       .long   2772403434
+       .long   4198409883
+       .long   3683881221
+       .long   1249839573
+       .long   4101852471
+       .long   3072795146
+       .long   2499679147
+       .long   3908737646
+       .long   1850622997
+       .long   704390999
+       .long   3522507997
+       .long   3701245994
+       .long   1408781999
+       .long   2750048699
+       .long   3107524692
+       .long   2817563999
+       .long   1205130103
+       .long   1920082089
+       .long   1340160702
+       .long   2410260206
+       .long   3840164178
+       .long   2680321405
+       .long   525553116
+       .long   3385361061
+       .long   1065675514
+       .long   1051106232
+       .long   2475754826
+       .long   2131351028
+       .long   2102212464
+       .long   656542356
+       .long   4262702056
+       .long   4204424928
+       .long   1313084713
+       .long   4230436817
+       .long   4113882560
+       .long   2626169427
+       .long   4165906339
+       .long   3932797825
+       .long   957371559
+       .long   4036845383
+       .long   3570628355
+       .long   1914743119
+       .long   3778723471
+       .long   2846289414
+       .long   3829486239
+       .long   3262479647
+       .long   1397611533
+       .long   3364005183
+       .long   2229991998
+       .long   2795223067
+       .long   2433043071
+       .long   165016701
+       .long   1295478838
+       .long   571118846
+       .long   330033402
+       .long   2590957677
+       .long   1142237692
+       .long   660066805
+       .long   886948059
+       .long   2284475384
+       .long   1320133610
+       .long   1773896118
+       .long   273983472
+       .long   2640267220
+       .long   3547792237
+       .long   547966945
+       .long   985567145
+       .long   2800617179
+       .long   1095933890
+       .long   1971134291
+       .long   1306267062
+       .long   2191867780
+       .long   3942268582
+       .long   2612534124
+       .long   88768265
+       .long   3589569869
+       .long   930100952
+       .long   177536531
+       .long   2884172442
+       .long   1860201905
+       .long   355073063
+       .long   1473377588
+       .long   3720403810
+       .long   710146126
+       .long   2946755177
+       .long   3145840325
+       .long   1420292253
+       .long   1598543059
+       .long   1996713354
+       .long   2840584506
+       .long   3197086118
+       .long   3993426708
+       .long   1386201717
+       .long   2099204941
+       .long   3691886121
+       .long   2772403434
+       .long   4198409883
+       .long   3088804946
+       .long   1249839573
+       .long   4101852471
+       .long   1882642597
+       .long   2499679147
+       .long   3908737646
+       .long   3765285194
+       .long   704390999
+       .long   3522507997
+       .long   3235603093
+       .long   1408781999
+       .long   2750048699
+       .long   2176238891
+       .long   2817563999
+       .long   1205130103
+       .long   57510486
+       .long   1340160702
+       .long   2410260206
+       .long   115020972
+       .long   2680321405
+       .long   525553116
+       .long   230041945
+       .long   1065675514
+       .long   1051106232
+       .long   460083891
+       .long   2131351028
+       .long   2102212464
+       .long   920167782
+       .long   4262702056
+       .long   4204424928
+       .long   1840335564
+       .long   4230436817
+       .long   4113882560
+       .long   3680671129
+       .long   4165906339
+       .long   3932797825
+       .long   3066374962
+       .long   4036845383
+       .long   3570628355
+       .long   1837782628
+       .long   3778723471
+       .long   2846289414
+       .long   3675565257
+       .long   3262479647
+       .long   1397611533
+       .long   3056163219
+       .long   2229991998
+       .long   2795223067
+       .long   1817359143
+       .long   165016701
+       .long   1295478838
+       .long   3634718287
+       .long   330033402
+       .long   2590957677
+       .long   2974469278
+       .long   660066805
+       .long   886948059
+       .long   1653971260
+       .long   1320133610
+       .long   1773896118
+       .long   3307942520
+       .long   2640267220
+       .long   3547792237
+       .long   2320917745
+       .long   985567145
+       .long   2800617179
+       .long   346868194
+       .long   1971134291
+       .long   1306267062
+       .long   693736388
+       .long   3942268582
+       .long   2612534124
+       .long   1387472776
+       .long   3589569869
+       .long   930100952
+       .long   2774945552
+       .long   2884172442
+       .long   1860201905
+       .long   1254923809
+       .long   1473377588
+       .long   3720403810
+       .long   2509847619
+       .long   2946755177
+       .long   3145840325
+       .long   724727943
+       .long   1598543059
+       .long   1996713354
+       .long   1449455886
+       .long   3197086118
+       .long   3993426708
+       .long   2898911772
+       .long   2099204941
+       .long   3691886121
+       .long   1502856249
+       .long   4198409883
+       .long   3088804946
+       .long   3005712498
+       .long   4101852471
+       .long   1882642597
+       .long   1716457700
+       .long   3908737646
+       .long   3765285194
+       .long   3432915400
+       .long   3522507997
+       .long   3235603093
+       .long   2570863504
+       .long   2750048699
+       .long   2176238891
+       .long   846759712
+       .long   1205130103
+       .long   57510486
+       .long   1693519425
+       .long   2410260206
+       .long   115020972
+       .long   3387038850
+       .long   525553116
+       .long   230041945
+       .long   2479110404
+       .long   1051106232
+       .long   460083891
+       .long   663253512
+       .long   2102212464
+       .long   920167782
+       .long   1326507024
+       .long   4204424928
+       .long   1840335564
+       .long   2653014048
+       .long   4113882560
+       .long   3680671129
+       .long   1011060801
+       .long   3932797825
+       .long   3066374962
+       .long   2022121603
+       .long   3570628355
+       .long   1837782628
+       .long   4044243207
+       .long   2846289414
+       .long   3675565257
+       .long   3793519119
+       .long   1397611533
+       .long   3056163219
+       .long   3292070943
+       .long   2795223067
+       .long   1817359143
+       .long   2289174591
+       .long   1295478838
+       .long   3634718287
+       .long   283381887
+       .long   2590957677
+       .long   2974469278
+       .long   566763775
+       .type   __svml_ssin_reduction_data_internal,@object
+       .size   __svml_ssin_reduction_data_internal,3072
+       .align 4
+__ssin_la__vmlsSinHATab:
+       .long   0
+       .long   2139095040
+       .type   __ssin_la__vmlsSinHATab,@object
+       .size   __ssin_la__vmlsSinHATab,8
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_sinh_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_sinh_d_la.s
new file mode 100644 (file)
index 0000000..ff0557c
--- /dev/null
@@ -0,0 +1,2054 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+
+       .text
+.L_2__routine_start___svml_sinh8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_sinh8
+
+__svml_sinh8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        lea       1608+__svml_dsinh_data_internal(%rip), %rax
+        vmovaps   %zmm0, %zmm8
+
+/* ............... Abs argument ............................ */
+        vandpd    1408+__svml_dsinh_data_internal(%rip), %zmm8, %zmm7
+        vmovups   3648+__svml_dsinh_data_internal(%rip), %zmm13
+
+/*
+ * ............... Load argument ............................
+ * dM = x*2^K/log(2) + RShifter
+ */
+        vmovups   1216+__svml_dsinh_data_internal(%rip), %zmm12
+        vmovups   1280+__svml_dsinh_data_internal(%rip), %zmm14
+        vmovups   4032+__svml_dsinh_data_internal(%rip), %zmm6
+
+/* VLOAD_CONST( D, dPC[0],         TAB._dPC1 ); */
+        vmovups   3968+__svml_dsinh_data_internal(%rip), %zmm4
+        vxorpd    %zmm8, %zmm7, %zmm5
+        kxnorw    %k0, %k0, %k1
+        kxnorw    %k0, %k0, %k2
+        vfmadd213pd {rn-sae}, %zmm13, %zmm5, %zmm12
+
+/*
+ * ...............Check for overflow\underflow .............
+ * 
+ */
+        vpsrlq    $32, %zmm5, %zmm9
+
+/*
+ * ................... R ...................................
+ * dN = dM - RShifter
+ */
+        vsubpd    {rn-sae}, %zmm13, %zmm12, %zmm2
+        vpmovqd   %zmm9, %ymm10
+        vmovups   1344+__svml_dsinh_data_internal(%rip), %zmm9
+
+/* dR = dX - dN*Log2_hi/2^K */
+        vfnmadd231pd {rn-sae}, %zmm14, %zmm2, %zmm5
+
+/*
+ * ....sinh(r) = r*((a1=1)+r^2*(a3+r^2*a5)) = r + r*(r^2*(a3+r^2*a5)) ....
+ * dSinh_r = (a3+r^2*a5)
+ */
+        vmovups   3904+__svml_dsinh_data_internal(%rip), %zmm14
+
+/* dR = (dX - dN*Log2_hi/2^K) - dN*Log2_lo/2^K */
+        vfnmadd231pd {rn-sae}, %zmm9, %zmm2, %zmm5
+        vpcmpgtd  3712+__svml_dsinh_data_internal(%rip), %ymm10, %ymm11
+        vmovmskps %ymm11, %edx
+
+/* dR2 = dR^2 */
+        vmulpd    {rn-sae}, %zmm5, %zmm5, %zmm2
+        vfmadd231pd {rn-sae}, %zmm2, %zmm6, %zmm14
+
+/*
+ * .............. Index and lookup .........................
+ * j
+ */
+        vpandq    4224+__svml_dsinh_data_internal(%rip), %zmm12, %zmm15
+        vpsllq    $4, %zmm15, %zmm1
+        vpmovqd   %zmm1, %ymm0
+        vpxord    %zmm11, %zmm11, %zmm11
+        vpxord    %zmm10, %zmm10, %zmm10
+        vgatherdpd (%rax,%ymm0), %zmm11{%k1}
+        vgatherdpd -8(%rax,%ymm0), %zmm10{%k2}
+
+/* split j and N */
+        vpxorq    %zmm15, %zmm12, %zmm3
+
+/*
+ * ............... G1,G2,G3: dTdif,dTn * 2^N,2^(-N) ...........
+ * lM now is an EXP(2^N)
+ */
+        vpsllq    $45, %zmm3, %zmm3
+        vpaddq    %zmm3, %zmm10, %zmm1
+
+/*  */
+        vpaddq    %zmm3, %zmm11, %zmm12
+
+/*  */
+        vpsubq    %zmm3, %zmm11, %zmm13
+
+/* dSinh_r = r^2*(a3+r^2*a5) */
+        vmulpd    {rn-sae}, %zmm2, %zmm14, %zmm3
+
+/* dG2 = dTn*2^N - dTn*2^-N */
+        vsubpd    {rn-sae}, %zmm13, %zmm12, %zmm15
+
+/* dG3 = dTn*2^N + dTn*2^-N */
+        vaddpd    {rn-sae}, %zmm13, %zmm12, %zmm0
+
+/* dSinh_r = r + r*(r^2*(a3+r^2*a5)) */
+        vfmadd213pd {rn-sae}, %zmm5, %zmm5, %zmm3
+
+/*
+ * poly(r) = (dG2+dG1)+dG3*sinh(dR)+dG1*sinh(dR)+(dG1+dG2)*dR2*(a2 +a4*dR2)
+ * dOut = (a2 +a4*dR2)
+ */
+        vmovups   3840+__svml_dsinh_data_internal(%rip), %zmm5
+
+/* dG1 += dG3 */
+        vaddpd    {rn-sae}, %zmm0, %zmm1, %zmm6
+        vfmadd231pd {rn-sae}, %zmm2, %zmm4, %zmm5
+
+/* dOut = dR2*(a2 +a4*dR2) */
+        vmulpd    {rn-sae}, %zmm2, %zmm5, %zmm4
+
+/* dG2 += dG1 */
+        vaddpd    {rn-sae}, %zmm15, %zmm1, %zmm2
+
+/* dOut = dG2*dR2*(a2 +a4*dR2) */
+        vmulpd    {rn-sae}, %zmm2, %zmm4, %zmm4
+
+/* dOut = dG1*sinh(dR)+dG2*dR2*(a2 +a4*dR2) */
+        vfmadd213pd {rn-sae}, %zmm4, %zmm6, %zmm3
+
+/* dOut = dG2 + dG1*sinh(dR)+dG2*dR2*(a2 +a4*dR2) */
+        vaddpd    {rn-sae}, %zmm2, %zmm3, %zmm0
+
+/* ................... Ret H ...................... */
+        vorpd     %zmm0, %zmm7, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm8, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dsinh_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_sinh8,@function
+       .size   __svml_sinh8,.-__svml_sinh8
+..LN__svml_sinh8.0:
+
+.L_2__routine_start___svml_dsinh_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dsinh_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        movq      %rsi, %r9
+        movzwl    6(%rdi), %ecx
+        xorl      %eax, %eax
+        andl      $32752, %ecx
+        shrl      $4, %ecx
+        movsd     (%rdi), %xmm2
+        movb      7(%rdi), %dl
+        movsd     %xmm2, -8(%rsp)
+        cmpl      $2047, %ecx
+        je        .LBL_2_17
+
+
+        testl     %ecx, %ecx
+        jle       .LBL_2_16
+
+
+        andb      $127, %dl
+        movsd     %xmm2, -32(%rsp)
+        movb      %dl, -25(%rsp)
+        cmpl      $969, %ecx
+        jle       .LBL_2_14
+
+
+        movsd     -32(%rsp), %xmm0
+        movsd     1136+__dsinh_la_CoutTab(%rip), %xmm1
+        comisd    %xmm0, %xmm1
+        jbe       .LBL_2_13
+
+
+        movsd     1184+__dsinh_la_CoutTab(%rip), %xmm1
+        comisd    %xmm0, %xmm1
+        jbe       .LBL_2_9
+
+
+        comisd    1176+__dsinh_la_CoutTab(%rip), %xmm0
+        jb        .LBL_2_8
+
+
+        movsd     1112+__dsinh_la_CoutTab(%rip), %xmm1
+        lea       __dsinh_la_CoutTab(%rip), %rcx
+        mulsd     %xmm0, %xmm1
+        movsd     1144+__dsinh_la_CoutTab(%rip), %xmm4
+        movq      8+__dsinh_la_CoutTab(%rip), %r10
+        movq      %r10, %rsi
+        shrq      $48, %rsi
+        addsd     1120+__dsinh_la_CoutTab(%rip), %xmm1
+        movsd     %xmm1, -40(%rsp)
+        andl      $-32753, %esi
+        movsd     -40(%rsp), %xmm10
+        movl      -40(%rsp), %r8d
+        movl      %r8d, %r11d
+        shrl      $6, %r11d
+        andl      $63, %r8d
+        movq      %r10, -16(%rsp)
+        subsd     1120+__dsinh_la_CoutTab(%rip), %xmm10
+        mulsd     %xmm10, %xmm4
+        lea       1023(%r11), %edi
+        xorps     .L_2il0floatpacket.97(%rip), %xmm10
+        addl      $1022, %r11d
+        mulsd     1152+__dsinh_la_CoutTab(%rip), %xmm10
+        subsd     %xmm4, %xmm0
+        movaps    %xmm10, %xmm2
+        movaps    %xmm0, %xmm8
+        andl      $2047, %r11d
+        lea       (%r8,%r8), %edx
+        negl      %edi
+        lea       1(%r8,%r8), %r8d
+        movsd     (%rcx,%rdx,8), %xmm9
+        negl      %edx
+        shll      $4, %r11d
+        addl      $-4, %edi
+        orl       %r11d, %esi
+        andl      $2047, %edi
+        movw      %si, -10(%rsp)
+        andl      $-32753, %esi
+        shll      $4, %edi
+        addsd     %xmm0, %xmm2
+        movsd     %xmm2, -24(%rsp)
+        orl       %edi, %esi
+        movsd     -24(%rsp), %xmm6
+        movsd     1128+__dsinh_la_CoutTab(%rip), %xmm2
+        subsd     %xmm6, %xmm8
+        movsd     %xmm8, -56(%rsp)
+        movsd     -24(%rsp), %xmm12
+        movsd     -56(%rsp), %xmm11
+        movsd     (%rcx,%r8,8), %xmm7
+        addsd     %xmm11, %xmm12
+        movsd     %xmm12, -48(%rsp)
+        movsd     -56(%rsp), %xmm5
+        addsd     %xmm5, %xmm10
+        movsd     -16(%rsp), %xmm5
+        mulsd     %xmm5, %xmm9
+        mulsd     %xmm5, %xmm7
+        movsd     %xmm10, -56(%rsp)
+        movaps    %xmm9, %xmm10
+        movsd     -48(%rsp), %xmm13
+        movw      %si, -10(%rsp)
+        lea       128(%rdx), %esi
+        movsd     -16(%rsp), %xmm14
+        addl      $129, %edx
+        subsd     %xmm13, %xmm0
+        movsd     %xmm0, -48(%rsp)
+        movsd     -56(%rsp), %xmm1
+        movsd     -48(%rsp), %xmm15
+        addsd     %xmm15, %xmm1
+        movsd     %xmm1, -48(%rsp)
+        movsd     -24(%rsp), %xmm4
+        mulsd     %xmm4, %xmm2
+        movaps    %xmm4, %xmm3
+        mulsd     %xmm4, %xmm3
+        movsd     -48(%rsp), %xmm1
+        movaps    %xmm4, %xmm0
+        movsd     %xmm2, -24(%rsp)
+        movsd     -24(%rsp), %xmm6
+        movsd     1064+__dsinh_la_CoutTab(%rip), %xmm2
+        subsd     %xmm4, %xmm6
+        mulsd     %xmm3, %xmm2
+        movsd     %xmm6, -56(%rsp)
+        movsd     -24(%rsp), %xmm11
+        movsd     -56(%rsp), %xmm8
+        subsd     %xmm8, %xmm11
+        addsd     1048+__dsinh_la_CoutTab(%rip), %xmm2
+        movsd     %xmm11, -24(%rsp)
+        movsd     1072+__dsinh_la_CoutTab(%rip), %xmm11
+        mulsd     %xmm3, %xmm11
+        mulsd     %xmm3, %xmm2
+        addsd     1056+__dsinh_la_CoutTab(%rip), %xmm11
+        mulsd     %xmm4, %xmm2
+        mulsd     %xmm3, %xmm11
+        movsd     -24(%rsp), %xmm12
+        addsd     1040+__dsinh_la_CoutTab(%rip), %xmm11
+        subsd     %xmm12, %xmm0
+        mulsd     %xmm3, %xmm11
+        movsd     (%rcx,%rsi,8), %xmm3
+        movaps    %xmm9, %xmm12
+        mulsd     %xmm14, %xmm3
+        movsd     %xmm0, -56(%rsp)
+        subsd     %xmm3, %xmm10
+        movsd     -24(%rsp), %xmm8
+        movsd     -56(%rsp), %xmm6
+        movsd     %xmm10, -24(%rsp)
+        movsd     -24(%rsp), %xmm13
+        movsd     (%rcx,%rdx,8), %xmm0
+        subsd     %xmm13, %xmm12
+        mulsd     %xmm14, %xmm0
+        subsd     %xmm3, %xmm12
+        movsd     %xmm12, -56(%rsp)
+        movsd     -24(%rsp), %xmm14
+        movsd     -56(%rsp), %xmm12
+        movaps    %xmm14, %xmm5
+        movb      -1(%rsp), %cl
+        addsd     %xmm7, %xmm12
+        addsd     %xmm0, %xmm7
+        subsd     %xmm0, %xmm12
+        andb      $-128, %cl
+        addsd     %xmm12, %xmm5
+        movsd     %xmm5, -24(%rsp)
+        movaps    %xmm9, %xmm5
+        movsd     -24(%rsp), %xmm15
+        addsd     %xmm3, %xmm5
+        subsd     %xmm15, %xmm14
+        addsd     %xmm14, %xmm12
+        movsd     %xmm12, -56(%rsp)
+        movsd     -24(%rsp), %xmm10
+        movsd     -56(%rsp), %xmm12
+        movsd     %xmm5, -24(%rsp)
+        movsd     -24(%rsp), %xmm13
+        subsd     %xmm13, %xmm9
+        addsd     %xmm9, %xmm3
+        movsd     %xmm3, -56(%rsp)
+        movsd     -24(%rsp), %xmm3
+        movsd     -56(%rsp), %xmm5
+        addsd     %xmm7, %xmm5
+        movaps    %xmm3, %xmm7
+        addsd     %xmm5, %xmm7
+        movsd     %xmm7, -24(%rsp)
+        movsd     -24(%rsp), %xmm9
+        movsd     1128+__dsinh_la_CoutTab(%rip), %xmm7
+        subsd     %xmm9, %xmm3
+        addsd     %xmm3, %xmm5
+        movsd     %xmm5, -56(%rsp)
+        movsd     -24(%rsp), %xmm0
+        mulsd     %xmm0, %xmm7
+        movsd     -56(%rsp), %xmm3
+        movsd     %xmm7, -24(%rsp)
+        movaps    %xmm0, %xmm7
+        movsd     -24(%rsp), %xmm14
+        mulsd     %xmm3, %xmm4
+        subsd     %xmm0, %xmm14
+        movsd     %xmm14, -56(%rsp)
+        movsd     -24(%rsp), %xmm13
+        movsd     -56(%rsp), %xmm9
+        subsd     %xmm9, %xmm13
+        movsd     %xmm13, -24(%rsp)
+        movaps    %xmm0, %xmm13
+        movsd     -24(%rsp), %xmm15
+        mulsd     %xmm2, %xmm13
+        subsd     %xmm15, %xmm7
+        mulsd     %xmm1, %xmm0
+        mulsd     %xmm3, %xmm1
+        mulsd     %xmm3, %xmm2
+        movaps    %xmm10, %xmm15
+        movaps    %xmm13, %xmm5
+        mulsd     %xmm11, %xmm15
+        mulsd     %xmm12, %xmm11
+        addsd     %xmm15, %xmm5
+        addsd     %xmm12, %xmm11
+        movsd     %xmm7, -56(%rsp)
+        addsd     %xmm0, %xmm11
+        movsd     -24(%rsp), %xmm9
+        addsd     %xmm1, %xmm11
+        movsd     -56(%rsp), %xmm7
+        addsd     %xmm2, %xmm11
+        movsd     %xmm5, -24(%rsp)
+        addsd     %xmm4, %xmm11
+        movsd     -24(%rsp), %xmm14
+        subsd     %xmm14, %xmm13
+        addsd     %xmm13, %xmm15
+        movsd     %xmm15, -56(%rsp)
+        movaps    %xmm8, %xmm15
+        mulsd     %xmm9, %xmm15
+        mulsd     %xmm6, %xmm9
+        mulsd     %xmm7, %xmm6
+        mulsd     %xmm7, %xmm8
+        movsd     -24(%rsp), %xmm14
+        movaps    %xmm15, %xmm13
+        movsd     -56(%rsp), %xmm5
+        addsd     %xmm14, %xmm13
+        addsd     %xmm9, %xmm5
+        movsd     %xmm13, -24(%rsp)
+        addsd     %xmm6, %xmm5
+        movsd     -24(%rsp), %xmm13
+        addsd     %xmm8, %xmm5
+        subsd     %xmm13, %xmm15
+        addsd     %xmm5, %xmm11
+        addsd     %xmm15, %xmm14
+        movsd     %xmm14, -56(%rsp)
+        movaps    %xmm10, %xmm15
+        movsd     -24(%rsp), %xmm13
+        movsd     -56(%rsp), %xmm14
+        addsd     %xmm13, %xmm15
+        addsd     %xmm14, %xmm11
+        movsd     %xmm15, -24(%rsp)
+        movsd     -24(%rsp), %xmm15
+        subsd     %xmm15, %xmm10
+        addsd     %xmm10, %xmm13
+        movsd     %xmm13, -56(%rsp)
+        movsd     -24(%rsp), %xmm13
+        movsd     -56(%rsp), %xmm10
+        addsd     %xmm10, %xmm11
+        addsd     %xmm11, %xmm13
+        movsd     %xmm13, -32(%rsp)
+        movb      -25(%rsp), %dil
+        andb      $127, %dil
+        orb       %cl, %dil
+        movb      %dil, -25(%rsp)
+        movq      -32(%rsp), %r10
+        movq      %r10, (%r9)
+        ret
+
+.LBL_2_8:
+
+        movaps    %xmm0, %xmm2
+        mulsd     %xmm0, %xmm2
+        movsd     1104+__dsinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm2, %xmm1
+        movb      -1(%rsp), %dl
+        andb      $-128, %dl
+        addsd     1096+__dsinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm2, %xmm1
+        addsd     1088+__dsinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm2, %xmm1
+        addsd     1080+__dsinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm1, %xmm2
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm2, %xmm0
+        movsd     %xmm0, -32(%rsp)
+        movb      -25(%rsp), %cl
+        andb      $127, %cl
+        orb       %dl, %cl
+        movb      %cl, -25(%rsp)
+        movq      -32(%rsp), %rsi
+        movq      %rsi, (%r9)
+        ret
+
+.LBL_2_9:
+
+        movsd     1112+__dsinh_la_CoutTab(%rip), %xmm1
+        lea       __dsinh_la_CoutTab(%rip), %r8
+        mulsd     %xmm0, %xmm1
+        movsd     1144+__dsinh_la_CoutTab(%rip), %xmm2
+        movsd     1152+__dsinh_la_CoutTab(%rip), %xmm3
+        movq      8+__dsinh_la_CoutTab(%rip), %rdx
+        movq      %rdx, -16(%rsp)
+        addsd     1120+__dsinh_la_CoutTab(%rip), %xmm1
+        movsd     %xmm1, -40(%rsp)
+        movsd     -40(%rsp), %xmm4
+        movsd     1072+__dsinh_la_CoutTab(%rip), %xmm1
+        movl      -40(%rsp), %edx
+        movl      %edx, %esi
+        andl      $63, %esi
+        subsd     1120+__dsinh_la_CoutTab(%rip), %xmm4
+        mulsd     %xmm4, %xmm2
+        lea       (%rsi,%rsi), %ecx
+        mulsd     %xmm3, %xmm4
+        subsd     %xmm2, %xmm0
+        movsd     (%r8,%rcx,8), %xmm5
+        lea       1(%rsi,%rsi), %edi
+        shrl      $6, %edx
+        subsd     %xmm4, %xmm0
+        mulsd     %xmm0, %xmm1
+        addl      $1022, %edx
+        andl      $2047, %edx
+        addsd     1064+__dsinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     1056+__dsinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     1048+__dsinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     1040+__dsinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     %xmm0, %xmm1
+        mulsd     %xmm5, %xmm1
+        addsd     (%r8,%rdi,8), %xmm1
+        addsd     %xmm5, %xmm1
+        cmpl      $2046, %edx
+        ja        .LBL_2_11
+
+
+        movq      8+__dsinh_la_CoutTab(%rip), %rcx
+        shrq      $48, %rcx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -10(%rsp)
+        movsd     -16(%rsp), %xmm0
+        mulsd     %xmm0, %xmm1
+        movsd     %xmm1, -32(%rsp)
+        jmp       .LBL_2_12
+
+.LBL_2_11:
+
+        decl      %edx
+        andl      $2047, %edx
+        movzwl    -10(%rsp), %ecx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -10(%rsp)
+        movsd     -16(%rsp), %xmm0
+        mulsd     %xmm0, %xmm1
+        mulsd     1024+__dsinh_la_CoutTab(%rip), %xmm1
+        movsd     %xmm1, -32(%rsp)
+
+.LBL_2_12:
+
+        movb      -25(%rsp), %cl
+        movb      -1(%rsp), %dl
+        andb      $127, %cl
+        andb      $-128, %dl
+        orb       %dl, %cl
+        movb      %cl, -25(%rsp)
+        movq      -32(%rsp), %rsi
+        movq      %rsi, (%r9)
+        ret
+
+.LBL_2_13:
+
+        movsd     1168+__dsinh_la_CoutTab(%rip), %xmm0
+        movl      $3, %eax
+        mulsd     %xmm2, %xmm0
+        movsd     %xmm0, (%r9)
+        ret
+
+.LBL_2_14:
+
+        movsd     __dsinh_la_CoutTab(%rip), %xmm0
+        addsd     1160+__dsinh_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm2, %xmm0
+        movsd     %xmm0, (%r9)
+
+
+        ret
+
+.LBL_2_16:
+
+        movsd     1160+__dsinh_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm0, %xmm2
+        movsd     %xmm2, -24(%rsp)
+        movsd     -24(%rsp), %xmm1
+        movq      8+__dsinh_la_CoutTab(%rip), %rdx
+        movq      %rdx, -16(%rsp)
+        addsd     -8(%rsp), %xmm1
+        movsd     %xmm1, (%r9)
+        ret
+
+.LBL_2_17:
+
+        addsd     %xmm2, %xmm2
+        movsd     %xmm2, (%r9)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dsinh_cout_rare_internal,@function
+       .size   __svml_dsinh_cout_rare_internal,.-__svml_dsinh_cout_rare_internal
+..LN__svml_dsinh_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dsinh_data_internal:
+       .long   0
+       .long   1071644672
+       .long   1828292879
+       .long   1071691096
+       .long   1014845819
+       .long   1071739576
+       .long   1853186616
+       .long   1071790202
+       .long   171030293
+       .long   1071843070
+       .long   1276261410
+       .long   1071898278
+       .long   3577096743
+       .long   1071955930
+       .long   3712504873
+       .long   1072016135
+       .long   1719614413
+       .long   1072079006
+       .long   1944781191
+       .long   1072144660
+       .long   1110089947
+       .long   1072213221
+       .long   2191782032
+       .long   1072284817
+       .long   2572866477
+       .long   1072359583
+       .long   3716502172
+       .long   1072437659
+       .long   3707479175
+       .long   1072519192
+       .long   2728693978
+       .long   1072604335
+       .long   0
+       .long   0
+       .long   1255956747
+       .long   1015588398
+       .long   3117910646
+       .long   3161559105
+       .long   3066496371
+       .long   1015656574
+       .long   3526460132
+       .long   1014428778
+       .long   300981948
+       .long   1014684169
+       .long   2951496418
+       .long   1013793687
+       .long   88491949
+       .long   1015427660
+       .long   330458198
+       .long   3163282740
+       .long   3993278767
+       .long   3161724279
+       .long   1451641639
+       .long   1015474673
+       .long   2960257726
+       .long   1013742662
+       .long   878562433
+       .long   1015521741
+       .long   2303740125
+       .long   1014042725
+       .long   3613079303
+       .long   1014164738
+       .long   396109971
+       .long   3163462691
+       .long   0
+       .long   1071644672
+       .long   2728693978
+       .long   1071555759
+       .long   3707479175
+       .long   1071470616
+       .long   3716502172
+       .long   1071389083
+       .long   2572866477
+       .long   1071311007
+       .long   2191782032
+       .long   1071236241
+       .long   1110089947
+       .long   1071164645
+       .long   1944781191
+       .long   1071096084
+       .long   1719614413
+       .long   1071030430
+       .long   3712504873
+       .long   1070967559
+       .long   3577096743
+       .long   1070907354
+       .long   1276261410
+       .long   1070849702
+       .long   171030293
+       .long   1070794494
+       .long   1853186616
+       .long   1070741626
+       .long   1014845819
+       .long   1070691000
+       .long   1828292879
+       .long   1070642520
+       .long   0
+       .long   0
+       .long   396109971
+       .long   3162414115
+       .long   3613079303
+       .long   1013116162
+       .long   2303740125
+       .long   1012994149
+       .long   878562433
+       .long   1014473165
+       .long   2960257726
+       .long   1012694086
+       .long   1451641639
+       .long   1014426097
+       .long   3993278767
+       .long   3160675703
+       .long   330458198
+       .long   3162234164
+       .long   88491949
+       .long   1014379084
+       .long   2951496418
+       .long   1012745111
+       .long   300981948
+       .long   1013635593
+       .long   3526460132
+       .long   1013380202
+       .long   3066496371
+       .long   1014607998
+       .long   3117910646
+       .long   3160510529
+       .long   1255956747
+       .long   1014539822
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   0
+       .long   1123549184
+       .long   1
+       .long   1123549184
+       .long   1
+       .long   1123549184
+       .long   1
+       .long   1123549184
+       .long   1
+       .long   1123549184
+       .long   1
+       .long   1123549184
+       .long   1
+       .long   1123549184
+       .long   1
+       .long   1123549184
+       .long   1
+       .long   1123549184
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   1082453555
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   15
+       .long   0
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   1431657638
+       .long   1069897045
+       .long   1431657638
+       .long   1069897045
+       .long   1431657638
+       .long   1069897045
+       .long   1431657638
+       .long   1069897045
+       .long   1431657638
+       .long   1069897045
+       .long   1431657638
+       .long   1069897045
+       .long   1431657638
+       .long   1069897045
+       .long   1431657638
+       .long   1069897045
+       .long   1431653196
+       .long   1067799893
+       .long   1431653196
+       .long   1067799893
+       .long   1431653196
+       .long   1067799893
+       .long   1431653196
+       .long   1067799893
+       .long   1431653196
+       .long   1067799893
+       .long   1431653196
+       .long   1067799893
+       .long   1431653196
+       .long   1067799893
+       .long   1431653196
+       .long   1067799893
+       .long   249327322
+       .long   1065423121
+       .long   249327322
+       .long   1065423121
+       .long   249327322
+       .long   1065423121
+       .long   249327322
+       .long   1065423121
+       .long   249327322
+       .long   1065423121
+       .long   249327322
+       .long   1065423121
+       .long   249327322
+       .long   1065423121
+       .long   249327322
+       .long   1065423121
+       .long   419584011
+       .long   1062650220
+       .long   419584011
+       .long   1062650220
+       .long   419584011
+       .long   1062650220
+       .long   419584011
+       .long   1062650220
+       .long   419584011
+       .long   1062650220
+       .long   419584011
+       .long   1062650220
+       .long   419584011
+       .long   1062650220
+       .long   419584011
+       .long   1062650220
+       .long   100753094
+       .long   1059717741
+       .long   100753094
+       .long   1059717741
+       .long   100753094
+       .long   1059717741
+       .long   100753094
+       .long   1059717741
+       .long   100753094
+       .long   1059717741
+       .long   100753094
+       .long   1059717741
+       .long   100753094
+       .long   1059717741
+       .long   100753094
+       .long   1059717741
+       .long   461398617
+       .long   1056571820
+       .long   461398617
+       .long   1056571820
+       .long   461398617
+       .long   1056571820
+       .long   461398617
+       .long   1056571820
+       .long   461398617
+       .long   1056571820
+       .long   461398617
+       .long   1056571820
+       .long   461398617
+       .long   1056571820
+       .long   461398617
+       .long   1056571820
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   1697350398
+       .long   1073157447
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   4277796864
+       .long   1072049730
+       .long   3164486458
+       .long   1031600026
+       .long   3164486458
+       .long   1031600026
+       .long   3164486458
+       .long   1031600026
+       .long   3164486458
+       .long   1031600026
+       .long   3164486458
+       .long   1031600026
+       .long   3164486458
+       .long   1031600026
+       .long   3164486458
+       .long   1031600026
+       .long   3164486458
+       .long   1031600026
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   1071644672
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1071644672
+       .long   431824500
+       .long   1064709706
+       .long   730821105
+       .long   1071633346
+       .long   1779301686
+       .long   1065758303
+       .long   2174652632
+       .long   1071622081
+       .long   872681311
+       .long   1066443490
+       .long   2912730644
+       .long   1071610877
+       .long   2882296449
+       .long   1066806964
+       .long   1533953344
+       .long   1071599734
+       .long   3305321028
+       .long   1067170481
+       .long   929806999
+       .long   1071588651
+       .long   340716357
+       .long   1067492210
+       .long   3999357479
+       .long   1071577627
+       .long   1073477808
+       .long   1067674027
+       .long   764307441
+       .long   1071566664
+       .long   3128166954
+       .long   1067855881
+       .long   2728693978
+       .long   1071555759
+       .long   3639221082
+       .long   1068037778
+       .long   4224142467
+       .long   1071544913
+       .long   4041415279
+       .long   1068219723
+       .long   3884662774
+       .long   1071534126
+       .long   1480599658
+       .long   1068401722
+       .long   351641897
+       .long   1071523398
+       .long   2997120266
+       .long   1068541361
+       .long   863738719
+       .long   1071512727
+       .long   928693471
+       .long   1068632422
+       .long   4076975200
+       .long   1071502113
+       .long   1708958952
+       .long   1068723517
+       .long   64696965
+       .long   1071491558
+       .long   3926287402
+       .long   1068814649
+       .long   382305176
+       .long   1071481059
+       .long   1878784442
+       .long   1068905822
+       .long   3707479175
+       .long   1071470616
+       .long   2754496392
+       .long   1068997037
+       .long   135105010
+       .long   1071460231
+       .long   861943228
+       .long   1069088298
+       .long   1242007932
+       .long   1071449901
+       .long   3400259254
+       .long   1069179606
+       .long   1432208378
+       .long   1071439627
+       .long   394759087
+       .long   1069270966
+       .long   3706687593
+       .long   1071429408
+       .long   3351980561
+       .long   1069362378
+       .long   2483480501
+       .long   1071419245
+       .long   2310349189
+       .long   1069453847
+       .long   777507147
+       .long   1071409137
+       .long   200254151
+       .long   1069545375
+       .long   1610600570
+       .long   1071399083
+       .long   4274709417
+       .long   1069592241
+       .long   3716502172
+       .long   1071389083
+       .long   2266782956
+       .long   1069638068
+       .long   1540824585
+       .long   1071379138
+       .long   1995599824
+       .long   1069683928
+       .long   2420883922
+       .long   1071369246
+       .long   647201135
+       .long   1069729823
+       .long   815859274
+       .long   1071359408
+       .long   4001939191
+       .long   1069775753
+       .long   4076559943
+       .long   1071349622
+       .long   664843213
+       .long   1069821722
+       .long   2380618042
+       .long   1071339890
+       .long   720494647
+       .long   1069867729
+       .long   3092190715
+       .long   1071330210
+       .long   1373458573
+       .long   1069913776
+       .long   697153126
+       .long   1071320583
+       .long   4128322810
+       .long   1069959864
+       .long   2572866477
+       .long   1071311007
+       .long   1904966097
+       .long   1070005996
+       .long   3218338682
+       .long   1071301483
+       .long   513564799
+       .long   1070052172
+       .long   1434058175
+       .long   1071292011
+       .long   1474894098
+       .long   1070098393
+       .long   321958744
+       .long   1071282590
+       .long   2020498546
+       .long   1070144661
+       .long   2990417245
+       .long   1071273219
+       .long   3682797359
+       .long   1070190977
+       .long   3964284211
+       .long   1071263899
+       .long   3705320722
+       .long   1070237343
+       .long   2069751141
+       .long   1071254630
+       .long   3632815436
+       .long   1070283760
+       .long   434316067
+       .long   1071245411
+       .long   721481577
+       .long   1070330230
+       .long   2191782032
+       .long   1071236241
+       .long   824045819
+       .long   1070376753
+       .long   1892288442
+       .long   1071227121
+       .long   1210063881
+       .long   1070423331
+       .long   2682146384
+       .long   1071218050
+       .long   3450994238
+       .long   1070469965
+       .long   3418903055
+       .long   1071209028
+       .long   535468266
+       .long   1070516658
+       .long   2966275557
+       .long   1071200055
+       .long   2639266259
+       .long   1070563409
+       .long   194117574
+       .long   1071191131
+       .long   3530359402
+       .long   1070603158
+       .long   2568320822
+       .long   1071182254
+       .long   3405407025
+       .long   1070626595
+       .long   380978316
+       .long   1071173426
+       .long   1749136243
+       .long   1070650064
+       .long   1110089947
+       .long   1071164645
+       .long   1517376385
+       .long   1070673565
+       .long   3649726105
+       .long   1071155911
+       .long   1375061601
+       .long   1070697099
+       .long   2604962541
+       .long   1071147225
+       .long   4286252247
+       .long   1070720666
+       .long   1176749997
+       .long   1071138586
+       .long   334352625
+       .long   1070744269
+       .long   2571947539
+       .long   1071129993
+       .long   1081936396
+       .long   1070767906
+       .long   1413356050
+       .long   1071121447
+       .long   916128083
+       .long   1070791579
+       .long   919555682
+       .long   1071112947
+       .long   2818494152
+       .long   1070815288
+       .long   19972402
+       .long   1071104493
+       .long   1185261260
+       .long   1070839035
+       .long   1944781191
+       .long   1071096084
+       .long   3302240303
+       .long   1070862819
+       .long   1339972927
+       .long   1071087721
+       .long   3575110344
+       .long   1070886642
+       .long   1447192521
+       .long   1071079403
+       .long   709375646
+       .long   1070910505
+       .long   1218806132
+       .long   1071071130
+       .long   2005420950
+       .long   1070934407
+       .long   3907805044
+       .long   1071062901
+       .long   1883763132
+       .long   1070958350
+       .long   4182873220
+       .long   1071054717
+       .long   3359975962
+       .long   1070982334
+       .long   1013258799
+       .long   1071046578
+       .long   864909351
+       .long   1071006361
+       .long   1963711167
+       .long   1071038482
+       .long   1719614413
+       .long   1071030430
+       .long   1719614413
+       .long   1071030430
+       .long   365628427
+       .long   1071054543
+       .long   3561793907
+       .long   1071022421
+       .long   4134867513
+       .long   1071078699
+       .long   2186617381
+       .long   1071014456
+       .long   3184944616
+       .long   1071102901
+       .long   885834528
+       .long   1071006534
+       .long   564029795
+       .long   1071127149
+       .long   2956612997
+       .long   1070998654
+       .long   3621005023
+       .long   1071151442
+       .long   3111574537
+       .long   1070990817
+       .long   2530717257
+       .long   1071175783
+       .long   363667784
+       .long   1070983023
+       .long   358839240
+       .long   1071200172
+       .long   2321106615
+       .long   1070975270
+       .long   177057508
+       .long   1071224609
+       .long   3712504873
+       .long   1070967559
+       .long   768195176
+       .long   1071249095
+       .long   3566716925
+       .long   1070959890
+       .long   921269482
+       .long   1071273631
+       .long   917841882
+       .long   1070952263
+       .long   3726549525
+       .long   1071298217
+       .long   3395129871
+       .long   1070944676
+       .long   3690744995
+       .long   1071322855
+       .long   1453150082
+       .long   1070937131
+       .long   3916966168
+       .long   1071347545
+       .long   2731501122
+       .long   1070929626
+       .long   3219913010
+       .long   1071372288
+       .long   1990012071
+       .long   1070922162
+       .long   420933669
+       .long   1071397085
+       .long   2583551245
+       .long   1070914738
+       .long   2938050448
+       .long   1071421935
+       .long   3577096743
+       .long   1070907354
+       .long   1016247609
+       .long   1071446841
+       .long   4040676318
+       .long   1070900010
+       .long   2087301532
+       .long   1071471802
+       .long   3049340112
+       .long   1070892706
+       .long   705101620
+       .long   1071496820
+       .long   3978100823
+       .long   1070885441
+       .long   20578973
+       .long   1071521895
+       .long   1617004845
+       .long   1070878216
+       .long   3191864199
+       .long   1071547027
+       .long   3645941911
+       .long   1070871029
+       .long   499478133
+       .long   1071572219
+       .long   569847338
+       .long   1070863882
+       .long   3706163032
+       .long   1071597469
+       .long   78413852
+       .long   1070856773
+       .long   3107302654
+       .long   1071622780
+       .long   1276261410
+       .long   1070849702
+       .long   945376945
+       .long   1071646412
+       .long   3272845541
+       .long   1070842669
+       .long   3773502825
+       .long   1071659128
+       .long   887463927
+       .long   1070835675
+       .long   3049734401
+       .long   1071671876
+       .long   1829099622
+       .long   1070828718
+       .long   379637879
+       .long   1071684656
+       .long   926591435
+       .long   1070821799
+       .long   1667720032
+       .long   1071697467
+       .long   1603444721
+       .long   1070814917
+       .long   4232573504
+       .long   1071710310
+       .long   2992903935
+       .long   1070808072
+       .long   1101891425
+       .long   1071723187
+       .long   4232894513
+       .long   1070801264
+       .long   2487351331
+       .long   1071736096
+       .long   171030293
+       .long   1070794494
+       .long   1424924347
+       .long   1071749039
+       .long   2839424854
+       .long   1070787759
+       .long   3839693941
+       .long   1071762015
+       .long   2799960843
+       .long   1070781061
+       .long   2776099954
+       .long   1071775026
+       .long   3504003472
+       .long   1070774399
+       .long   4167790294
+       .long   1071788071
+       .long   4112506593
+       .long   1070767773
+       .long   1067865225
+       .long   1071801152
+       .long   3790955393
+       .long   1070761183
+       .long   3713696612
+       .long   1071814267
+       .long   1709341917
+       .long   1070754629
+       .long   872270569
+       .long   1071827419
+       .long   1337108031
+       .long   1070748110
+       .long   2789908864
+       .long   1071840606
+       .long   1853186616
+       .long   1070741626
+       .long   2537611823
+       .long   1071853830
+       .long   2440944790
+       .long   1070735177
+       .long   1780910816
+       .long   1071867091
+       .long   2288159958
+       .long   1070728763
+       .long   2189982503
+       .long   1071880389
+       .long   586995997
+       .long   1070722384
+       .long   1144730516
+       .long   1071893725
+       .long   828946858
+       .long   1070716039
+       .long   324769168
+       .long   1071907099
+       .long   2214878420
+       .long   1070709728
+       .long   1414505409
+       .long   1071920511
+       .long   3949972341
+       .long   1070703451
+       .long   1808220925
+       .long   1071933962
+       .long   948735466
+       .long   1070697209
+       .long   3200056266
+       .long   1071947452
+       .long   1014845819
+       .long   1070691000
+       .long   2994125935
+       .long   1071960982
+       .long   3366293073
+       .long   1070684824
+       .long   2894502806
+       .long   1071974552
+       .long   2930322912
+       .long   1070678682
+       .long   315333498
+       .long   1071988163
+       .long   3228316108
+       .long   1070672573
+       .long   1265790390
+       .long   1072001814
+       .long   3490863953
+       .long   1070666497
+       .long   3170252699
+       .long   1072015506
+       .long   2952712987
+       .long   1070660454
+       .long   3458291493
+       .long   1072029240
+       .long   852742562
+       .long   1070654444
+       .long   3859687560
+       .long   1072043016
+       .long   728909815
+       .long   1070648466
+       .long   1814547538
+       .long   1072056835
+       .long   1828292879
+       .long   1070642520
+       .long   3358256687
+       .long   1072070696
+       .long   3402036099
+       .long   1070636606
+       .long   1646693443
+       .long   1072084601
+       .long   410360776
+       .long   1070630725
+       .long   2726084392
+       .long   1072098549
+       .long   702412510
+       .long   1070624875
+       .long   4058219142
+       .long   1072112541
+       .long   3541402996
+       .long   1070619056
+       .long   3110436433
+       .long   1072126578
+       .long   3899555717
+       .long   1070613269
+       .long   1650643112
+       .long   1072140660
+       .long   1048019041
+       .long   1070607514
+       .long   1452398678
+       .long   1072154787
+       .long   2851812149
+       .long   1070601789
+       .long   0
+       .long   1120403456
+       .long   0
+       .long   1120403456
+       .long   0
+       .long   1120403456
+       .long   0
+       .long   1120403456
+       .long   0
+       .long   1120403456
+       .long   0
+       .long   1120403456
+       .long   0
+       .long   1120403456
+       .long   0
+       .long   1120403456
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   1082531225
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   4294966717
+       .long   1071644671
+       .long   1431655597
+       .long   1069897045
+       .long   1431655597
+       .long   1069897045
+       .long   1431655597
+       .long   1069897045
+       .long   1431655597
+       .long   1069897045
+       .long   1431655597
+       .long   1069897045
+       .long   1431655597
+       .long   1069897045
+       .long   1431655597
+       .long   1069897045
+       .long   1431655597
+       .long   1069897045
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   3474379417
+       .long   1067799893
+       .long   1460859941
+       .long   1065423121
+       .long   1460859941
+       .long   1065423121
+       .long   1460859941
+       .long   1065423121
+       .long   1460859941
+       .long   1065423121
+       .long   1460859941
+       .long   1065423121
+       .long   1460859941
+       .long   1065423121
+       .long   1460859941
+       .long   1065423121
+       .long   1460859941
+       .long   1065423121
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   65472
+       .long   0
+       .long   65472
+       .long   0
+       .long   65472
+       .long   0
+       .long   65472
+       .long   0
+       .long   65472
+       .long   0
+       .long   65472
+       .long   0
+       .long   65472
+       .long   0
+       .long   65472
+       .long   0
+       .long   127
+       .long   0
+       .long   127
+       .long   0
+       .long   127
+       .long   0
+       .long   127
+       .long   0
+       .long   127
+       .long   0
+       .long   127
+       .long   0
+       .long   127
+       .long   0
+       .long   127
+       .long   0
+       .type   __svml_dsinh_data_internal,@object
+       .size   __svml_dsinh_data_internal,4288
+       .space 320, 0x00        
+       .align 32
+__dsinh_la_CoutTab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   1048019041
+       .long   1072704666
+       .long   1398474845
+       .long   3161559171
+       .long   3541402996
+       .long   1072716208
+       .long   2759177317
+       .long   1015903202
+       .long   410360776
+       .long   1072727877
+       .long   1269990655
+       .long   1013024446
+       .long   1828292879
+       .long   1072739672
+       .long   1255956747
+       .long   1016636974
+       .long   852742562
+       .long   1072751596
+       .long   667253587
+       .long   1010842135
+       .long   3490863953
+       .long   1072763649
+       .long   960797498
+       .long   3163997456
+       .long   2930322912
+       .long   1072775834
+       .long   2599499422
+       .long   3163762623
+       .long   1014845819
+       .long   1072788152
+       .long   3117910646
+       .long   3162607681
+       .long   3949972341
+       .long   1072800603
+       .long   2068408548
+       .long   1015962444
+       .long   828946858
+       .long   1072813191
+       .long   10642492
+       .long   1016988014
+       .long   2288159958
+       .long   1072825915
+       .long   2169144469
+       .long   1015924597
+       .long   1853186616
+       .long   1072838778
+       .long   3066496371
+       .long   1016705150
+       .long   1709341917
+       .long   1072851781
+       .long   2571168217
+       .long   1015201075
+       .long   4112506593
+       .long   1072864925
+       .long   2947355221
+       .long   1015419624
+       .long   2799960843
+       .long   1072878213
+       .long   1423655381
+       .long   1016070727
+       .long   171030293
+       .long   1072891646
+       .long   3526460132
+       .long   1015477354
+       .long   2992903935
+       .long   1072905224
+       .long   2218154406
+       .long   1016276769
+       .long   926591435
+       .long   1072918951
+       .long   3208833762
+       .long   3163962090
+       .long   887463927
+       .long   1072932827
+       .long   3596744163
+       .long   3161842742
+       .long   1276261410
+       .long   1072946854
+       .long   300981948
+       .long   1015732745
+       .long   569847338
+       .long   1072961034
+       .long   472945272
+       .long   3160339305
+       .long   1617004845
+       .long   1072975368
+       .long   82804944
+       .long   1011391354
+       .long   3049340112
+       .long   1072989858
+       .long   3062915824
+       .long   1014219171
+       .long   3577096743
+       .long   1073004506
+       .long   2951496418
+       .long   1014842263
+       .long   1990012071
+       .long   1073019314
+       .long   3529070563
+       .long   3163861769
+       .long   1453150082
+       .long   1073034283
+       .long   498154669
+       .long   3162536638
+       .long   917841882
+       .long   1073049415
+       .long   18715565
+       .long   1016707884
+       .long   3712504873
+       .long   1073064711
+       .long   88491949
+       .long   1016476236
+       .long   363667784
+       .long   1073080175
+       .long   813753950
+       .long   1016833785
+       .long   2956612997
+       .long   1073095806
+       .long   2118169751
+       .long   3163784129
+       .long   2186617381
+       .long   1073111608
+       .long   2270764084
+       .long   3164321289
+       .long   1719614413
+       .long   1073127582
+       .long   330458198
+       .long   3164331316
+       .long   1013258799
+       .long   1073143730
+       .long   1748797611
+       .long   3161177658
+       .long   3907805044
+       .long   1073160053
+       .long   2257091225
+       .long   3162598983
+       .long   1447192521
+       .long   1073176555
+       .long   1462857171
+       .long   3163563097
+       .long   1944781191
+       .long   1073193236
+       .long   3993278767
+       .long   3162772855
+       .long   919555682
+       .long   1073210099
+       .long   3121969534
+       .long   1013996802
+       .long   2571947539
+       .long   1073227145
+       .long   3558159064
+       .long   3164425245
+       .long   2604962541
+       .long   1073244377
+       .long   2614425274
+       .long   3164587768
+       .long   1110089947
+       .long   1073261797
+       .long   1451641639
+       .long   1016523249
+       .long   2568320822
+       .long   1073279406
+       .long   2732824428
+       .long   1015401491
+       .long   2966275557
+       .long   1073297207
+       .long   2176155324
+       .long   3160891335
+       .long   2682146384
+       .long   1073315202
+       .long   2082178513
+       .long   3164411995
+       .long   2191782032
+       .long   1073333393
+       .long   2960257726
+       .long   1014791238
+       .long   2069751141
+       .long   1073351782
+       .long   1562170675
+       .long   3163773257
+       .long   2990417245
+       .long   1073370371
+       .long   3683467745
+       .long   3164417902
+       .long   1434058175
+       .long   1073389163
+       .long   251133233
+       .long   1016134345
+       .long   2572866477
+       .long   1073408159
+       .long   878562433
+       .long   1016570317
+       .long   3092190715
+       .long   1073427362
+       .long   814012168
+       .long   3160571998
+       .long   4076559943
+       .long   1073446774
+       .long   2119478331
+       .long   3161806927
+       .long   2420883922
+       .long   1073466398
+       .long   2049810052
+       .long   1015168464
+       .long   3716502172
+       .long   1073486235
+       .long   2303740125
+       .long   1015091301
+       .long   777507147
+       .long   1073506289
+       .long   4282924205
+       .long   1016236109
+       .long   3706687593
+       .long   1073526560
+       .long   3521726939
+       .long   1014301643
+       .long   1242007932
+       .long   1073547053
+       .long   1132034716
+       .long   3164388407
+       .long   3707479175
+       .long   1073567768
+       .long   3613079303
+       .long   1015213314
+       .long   64696965
+       .long   1073588710
+       .long   1768797490
+       .long   1016865536
+       .long   863738719
+       .long   1073609879
+       .long   1326992220
+       .long   3163661773
+       .long   3884662774
+       .long   1073631278
+       .long   2158611599
+       .long   1015258761
+       .long   2728693978
+       .long   1073652911
+       .long   396109971
+       .long   3164511267
+       .long   3999357479
+       .long   1073674779
+       .long   2258941616
+       .long   1016973300
+       .long   1533953344
+       .long   1073696886
+       .long   769171851
+       .long   1016714209
+       .long   2174652632
+       .long   1073719233
+       .long   4087714590
+       .long   1015498835
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   0
+       .long   0
+       .long   1071644672
+       .long   1431652600
+       .long   1069897045
+       .long   1431670732
+       .long   1067799893
+       .long   984555731
+       .long   1065423122
+       .long   472530941
+       .long   1062650218
+       .long   1431655765
+       .long   1069897045
+       .long   286331153
+       .long   1065423121
+       .long   436314138
+       .long   1059717536
+       .long   2773927732
+       .long   1053236707
+       .long   1697350398
+       .long   1079448903
+       .long   0
+       .long   1127743488
+       .long   33554432
+       .long   1101004800
+       .long   2411329662
+       .long   1082536910
+       .long   4277796864
+       .long   1065758274
+       .long   3164486458
+       .long   1025308570
+       .long   1
+       .long   1048576
+       .long   4294967295
+       .long   2146435071
+       .long   3671843104
+       .long   1067178892
+       .long   3875694624
+       .long   1077247184
+       .type   __dsinh_la_CoutTab,@object
+       .size   __dsinh_la_CoutTab,1192
+       .space 8, 0x00  
+       .align 16
+.L_2il0floatpacket.97:
+       .long   0x00000000,0x80000000,0x00000000,0x00000000
+       .type   .L_2il0floatpacket.97,@object
+       .size   .L_2il0floatpacket.97,16
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_sinh_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_sinh_s_la.s
new file mode 100644 (file)
index 0000000..a5dace2
--- /dev/null
@@ -0,0 +1,1448 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+
+       .text
+.L_2__routine_start___svml_sinhf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_sinhf16
+
+__svml_sinhf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovaps   %zmm0, %zmm5
+
+/*
+ * ----------------------------------- Implementation  ---------------------
+ * ............... Abs argument ............................
+ */
+        vandps    1152+__svml_ssinh_data_internal(%rip), %zmm5, %zmm4
+
+/*
+ * ...............Check for overflow\underflow .............
+ */
+        vpternlogd $255, %zmm6, %zmm6, %zmm6
+        vmovups   1280+__svml_ssinh_data_internal(%rip), %zmm7
+
+/*
+ * ............... Load argument ............................
+ * dM = x/log(2) + RShifter
+ */
+        vmovups   960+__svml_ssinh_data_internal(%rip), %zmm11
+        vmovups   1024+__svml_ssinh_data_internal(%rip), %zmm8
+        vmovups   1088+__svml_ssinh_data_internal(%rip), %zmm10
+        vmovups   1856+__svml_ssinh_data_internal(%rip), %zmm12
+        vmovups   1728+__svml_ssinh_data_internal(%rip), %zmm0
+        vmovups   1792+__svml_ssinh_data_internal(%rip), %zmm3
+
+/* x^2 */
+        vmovups   1536+__svml_ssinh_data_internal(%rip), %zmm2
+        vxorps    %zmm5, %zmm4, %zmm1
+        vfmadd213ps {rn-sae}, %zmm7, %zmm1, %zmm11
+        vpcmpd    $2, 1408+__svml_ssinh_data_internal(%rip), %zmm1, %k1
+
+/*
+ * ............... G1,G2 2^N,2^(-N) ...........
+ * iM now is an EXP(2^N)
+ */
+        vpslld    $23, %zmm11, %zmm13
+
+/*
+ * ................... R ...................................
+ * sN = sM - RShifter
+ */
+        vsubps    {rn-sae}, %zmm7, %zmm11, %zmm9
+        vpaddd    %zmm13, %zmm12, %zmm14
+        vpsubd    %zmm13, %zmm12, %zmm15
+
+/* sG1 = 2^(N-1)+2^(-N-1) */
+        vaddps    {rn-sae}, %zmm15, %zmm14, %zmm7
+        vpandnd   %zmm1, %zmm1, %zmm6{%k1}
+
+/* sR = sX - sN*Log2_hi */
+        vfnmadd231ps {rn-sae}, %zmm8, %zmm9, %zmm1
+        vptestmd  %zmm6, %zmm6, %k0
+
+/* sG2 = 2^(N-1)-2^(-N-1) */
+        vsubps    {rn-sae}, %zmm15, %zmm14, %zmm8
+
+/* sR = (sX - sN*Log2_hi) - sN*Log2_lo */
+        vfnmadd231ps {rn-sae}, %zmm10, %zmm9, %zmm1
+
+/*
+ * ....sinh(r) = r*((a1=1)+r^2*(a3+r^2*(a5+{v1 r^2*a7})))) = r + r*(r^2*(a3+r^2*(a5+r^2*a7))) ....
+ * sSinh_r = (a3+r^2*a5)
+ */
+        vmovups   1600+__svml_ssinh_data_internal(%rip), %zmm14
+        kmovw     %k0, %edx
+
+/* sR2 = sR^2 */
+        vmulps    {rn-sae}, %zmm1, %zmm1, %zmm6
+        vfmadd231ps {rn-sae}, %zmm6, %zmm0, %zmm14
+
+/* sSinh_r = r^2*(a3+r^2*a5) */
+        vmulps    {rn-sae}, %zmm6, %zmm14, %zmm0
+
+/* sSinh_r = r + r*(r^2*(a3+r^2*a5)) */
+        vfmadd213ps {rn-sae}, %zmm1, %zmm1, %zmm0
+
+/*
+ * sinh(X) = sG2 + sG1*sinh(dR) + sG2*sR2*(a2+sR2*(a4+a6*sR2)
+ * sOut = (a4 +a6*sR2)
+ */
+        vmovups   1664+__svml_ssinh_data_internal(%rip), %zmm1
+        vfmadd231ps {rn-sae}, %zmm6, %zmm3, %zmm1
+
+/* sOut = a2+sR2*(a4+a6*sR2) */
+        vfmadd213ps {rn-sae}, %zmm2, %zmm6, %zmm1
+
+/* sOut = sR2*(a2+sR2*(a4+a6*sR2) */
+        vmulps    {rn-sae}, %zmm6, %zmm1, %zmm2
+
+/* sOut = sG2*sR2*(a2+sR2*(a4+a6*sR2) */
+        vmulps    {rn-sae}, %zmm8, %zmm2, %zmm3
+
+/* sOut = sG1*sinh(dR)+sG2*sR2*(a2+sR2*(a4+a6*sR2) */
+        vfmadd213ps {rn-sae}, %zmm3, %zmm0, %zmm7
+
+/* sOut = sG2 + sG1*sinh(dR) + sG2*sR2*(a2+sR2*(a4+a6*sR2) */
+        vaddps    {rn-sae}, %zmm8, %zmm7, %zmm9
+
+/* ................... Ret H ...................... */
+        vorps     %zmm9, %zmm4, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm5, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_ssinh_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_sinhf16,@function
+       .size   __svml_sinhf16,.-__svml_sinhf16
+..LN__svml_sinhf16.0:
+
+.L_2__routine_start___svml_ssinh_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_ssinh_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        movq      %rsi, %r9
+        movzwl    2(%rdi), %edx
+        xorl      %eax, %eax
+        andl      $32640, %edx
+        movss     (%rdi), %xmm2
+        cmpl      $32640, %edx
+        je        .LBL_2_17
+
+
+        cvtss2sd  %xmm2, %xmm2
+        movsd     %xmm2, -8(%rsp)
+        movzwl    -2(%rsp), %edx
+        andl      $32752, %edx
+        movsd     %xmm2, -32(%rsp)
+        shrl      $4, %edx
+        andb      $127, -25(%rsp)
+        testl     %edx, %edx
+        jle       .LBL_2_16
+
+
+        cmpl      $969, %edx
+        jle       .LBL_2_14
+
+
+        movsd     -32(%rsp), %xmm0
+        movsd     1136+__ssinh_la_CoutTab(%rip), %xmm1
+        comisd    %xmm0, %xmm1
+        jbe       .LBL_2_13
+
+
+        movsd     1184+__ssinh_la_CoutTab(%rip), %xmm1
+        comisd    %xmm0, %xmm1
+        jbe       .LBL_2_9
+
+
+        comisd    1176+__ssinh_la_CoutTab(%rip), %xmm0
+        jb        .LBL_2_8
+
+
+        movsd     1112+__ssinh_la_CoutTab(%rip), %xmm3
+        lea       __ssinh_la_CoutTab(%rip), %rcx
+        mulsd     %xmm0, %xmm3
+        movsd     1144+__ssinh_la_CoutTab(%rip), %xmm10
+        movq      8+__ssinh_la_CoutTab(%rip), %r10
+        movq      %r10, %rsi
+        shrq      $48, %rsi
+        addsd     1120+__ssinh_la_CoutTab(%rip), %xmm3
+        movsd     %xmm3, -40(%rsp)
+        andl      $-32753, %esi
+        movsd     -40(%rsp), %xmm13
+        movl      -40(%rsp), %r8d
+        movl      %r8d, %r11d
+        shrl      $6, %r11d
+        andl      $63, %r8d
+        movq      %r10, -16(%rsp)
+        subsd     1120+__ssinh_la_CoutTab(%rip), %xmm13
+        mulsd     %xmm13, %xmm10
+        lea       1023(%r11), %edi
+        xorps     .L_2il0floatpacket.98(%rip), %xmm13
+        addl      $1022, %r11d
+        mulsd     1152+__ssinh_la_CoutTab(%rip), %xmm13
+        subsd     %xmm10, %xmm0
+        movaps    %xmm0, %xmm5
+        movaps    %xmm0, %xmm11
+        andl      $2047, %r11d
+        lea       (%r8,%r8), %edx
+        negl      %edi
+        lea       1(%r8,%r8), %r8d
+        movsd     (%rcx,%rdx,8), %xmm8
+        negl      %edx
+        shll      $4, %r11d
+        addl      $-4, %edi
+        orl       %r11d, %esi
+        andl      $2047, %edi
+        movw      %si, -10(%rsp)
+        andl      $-32753, %esi
+        shll      $4, %edi
+        addsd     %xmm13, %xmm5
+        movsd     %xmm5, -24(%rsp)
+        orl       %edi, %esi
+        movsd     -24(%rsp), %xmm7
+        movsd     1128+__ssinh_la_CoutTab(%rip), %xmm5
+        subsd     %xmm7, %xmm11
+        movsd     %xmm11, -56(%rsp)
+        movsd     -24(%rsp), %xmm4
+        movsd     -56(%rsp), %xmm12
+        movsd     (%rcx,%r8,8), %xmm6
+        addsd     %xmm12, %xmm4
+        movsd     %xmm4, -48(%rsp)
+        movsd     -56(%rsp), %xmm9
+        movsd     -16(%rsp), %xmm4
+        addsd     %xmm9, %xmm13
+        mulsd     %xmm4, %xmm8
+        mulsd     %xmm4, %xmm6
+        movsd     %xmm13, -56(%rsp)
+        movaps    %xmm8, %xmm9
+        movsd     -48(%rsp), %xmm15
+        movw      %si, -10(%rsp)
+        lea       128(%rdx), %esi
+        movsd     -16(%rsp), %xmm14
+        addl      $129, %edx
+        subsd     %xmm15, %xmm0
+        movaps    %xmm8, %xmm15
+        movsd     %xmm0, -48(%rsp)
+        movsd     -56(%rsp), %xmm3
+        movsd     -48(%rsp), %xmm0
+        addsd     %xmm0, %xmm3
+        movsd     %xmm3, -48(%rsp)
+        movsd     -24(%rsp), %xmm10
+        mulsd     %xmm10, %xmm5
+        movaps    %xmm10, %xmm2
+        mulsd     %xmm10, %xmm2
+        movsd     -48(%rsp), %xmm3
+        movaps    %xmm10, %xmm1
+        movsd     %xmm5, -24(%rsp)
+        movsd     -24(%rsp), %xmm7
+        subsd     %xmm10, %xmm7
+        movsd     %xmm7, -56(%rsp)
+        movsd     -24(%rsp), %xmm12
+        movsd     -56(%rsp), %xmm11
+        subsd     %xmm11, %xmm12
+        movsd     1064+__ssinh_la_CoutTab(%rip), %xmm11
+        mulsd     %xmm2, %xmm11
+        movsd     %xmm12, -24(%rsp)
+        movsd     1072+__ssinh_la_CoutTab(%rip), %xmm12
+        mulsd     %xmm2, %xmm12
+        addsd     1048+__ssinh_la_CoutTab(%rip), %xmm11
+        mulsd     %xmm2, %xmm11
+        addsd     1056+__ssinh_la_CoutTab(%rip), %xmm12
+        mulsd     %xmm2, %xmm12
+        mulsd     %xmm10, %xmm11
+        addsd     1040+__ssinh_la_CoutTab(%rip), %xmm12
+        addsd     %xmm11, %xmm10
+        mulsd     %xmm2, %xmm12
+        movsd     (%rcx,%rsi,8), %xmm2
+        mulsd     %xmm14, %xmm2
+        movsd     -24(%rsp), %xmm0
+        subsd     %xmm2, %xmm9
+        subsd     %xmm0, %xmm1
+        movsd     %xmm1, -56(%rsp)
+        movsd     -24(%rsp), %xmm7
+        movsd     -56(%rsp), %xmm5
+        movsd     %xmm9, -24(%rsp)
+        movsd     -24(%rsp), %xmm13
+        movsd     (%rcx,%rdx,8), %xmm1
+        subsd     %xmm13, %xmm15
+        mulsd     %xmm14, %xmm1
+        subsd     %xmm2, %xmm15
+        movsd     %xmm15, -56(%rsp)
+        movaps    %xmm8, %xmm13
+        movsd     -24(%rsp), %xmm14
+        addsd     %xmm2, %xmm13
+        movsd     -56(%rsp), %xmm9
+        movaps    %xmm14, %xmm0
+        movb      -1(%rsp), %cl
+        addsd     %xmm6, %xmm9
+        addsd     %xmm1, %xmm6
+        subsd     %xmm1, %xmm9
+        andb      $-128, %cl
+        addsd     %xmm9, %xmm0
+        movsd     %xmm0, -24(%rsp)
+        movsd     -24(%rsp), %xmm4
+        subsd     %xmm4, %xmm14
+        addsd     %xmm14, %xmm9
+        movsd     %xmm9, -56(%rsp)
+        movsd     -24(%rsp), %xmm9
+        movsd     -56(%rsp), %xmm0
+        movsd     %xmm13, -24(%rsp)
+        movsd     -24(%rsp), %xmm15
+        subsd     %xmm15, %xmm8
+        addsd     %xmm8, %xmm2
+        movsd     %xmm2, -56(%rsp)
+        movsd     -24(%rsp), %xmm2
+        movsd     -56(%rsp), %xmm4
+        addsd     %xmm6, %xmm4
+        movaps    %xmm2, %xmm6
+        addsd     %xmm4, %xmm6
+        movsd     %xmm6, -24(%rsp)
+        movsd     -24(%rsp), %xmm8
+        movsd     1128+__ssinh_la_CoutTab(%rip), %xmm6
+        subsd     %xmm8, %xmm2
+        addsd     %xmm2, %xmm4
+        movsd     %xmm4, -56(%rsp)
+        movsd     -24(%rsp), %xmm1
+        mulsd     %xmm1, %xmm6
+        movsd     -56(%rsp), %xmm2
+        movsd     %xmm6, -24(%rsp)
+        movaps    %xmm1, %xmm6
+        movsd     -24(%rsp), %xmm14
+        mulsd     %xmm2, %xmm10
+        subsd     %xmm1, %xmm14
+        movsd     %xmm14, -56(%rsp)
+        movsd     -24(%rsp), %xmm13
+        movsd     -56(%rsp), %xmm8
+        subsd     %xmm8, %xmm13
+        movsd     %xmm13, -24(%rsp)
+        movaps    %xmm11, %xmm13
+        movsd     -24(%rsp), %xmm15
+        mulsd     %xmm1, %xmm13
+        subsd     %xmm15, %xmm6
+        mulsd     %xmm3, %xmm1
+        mulsd     %xmm2, %xmm3
+        movaps    %xmm12, %xmm15
+        movaps    %xmm13, %xmm4
+        mulsd     %xmm9, %xmm15
+        mulsd     %xmm0, %xmm12
+        addsd     %xmm15, %xmm4
+        addsd     %xmm0, %xmm12
+        movsd     %xmm6, -56(%rsp)
+        addsd     %xmm1, %xmm12
+        movsd     -24(%rsp), %xmm8
+        addsd     %xmm3, %xmm12
+        movsd     -56(%rsp), %xmm6
+        movsd     %xmm4, -24(%rsp)
+        movsd     -24(%rsp), %xmm14
+        subsd     %xmm14, %xmm13
+        addsd     %xmm13, %xmm15
+        movsd     %xmm15, -56(%rsp)
+        movaps    %xmm7, %xmm15
+        mulsd     %xmm8, %xmm15
+        mulsd     %xmm5, %xmm8
+        mulsd     %xmm6, %xmm5
+        mulsd     %xmm6, %xmm7
+        movsd     -24(%rsp), %xmm14
+        movaps    %xmm14, %xmm13
+        movsd     -56(%rsp), %xmm4
+        addsd     %xmm15, %xmm13
+        addsd     %xmm8, %xmm4
+        movsd     %xmm13, -24(%rsp)
+        addsd     %xmm5, %xmm4
+        movsd     -24(%rsp), %xmm13
+        addsd     %xmm7, %xmm4
+        subsd     %xmm13, %xmm15
+        addsd     %xmm4, %xmm12
+        addsd     %xmm15, %xmm14
+        movsd     %xmm14, -56(%rsp)
+        movaps    %xmm9, %xmm15
+        movsd     -24(%rsp), %xmm13
+        movsd     -56(%rsp), %xmm14
+        addsd     %xmm13, %xmm15
+        addsd     %xmm14, %xmm12
+        movsd     %xmm15, -24(%rsp)
+        movsd     -24(%rsp), %xmm15
+        subsd     %xmm15, %xmm9
+        addsd     %xmm9, %xmm13
+        movsd     %xmm13, -56(%rsp)
+        movsd     -24(%rsp), %xmm13
+        movsd     -56(%rsp), %xmm9
+        addsd     %xmm9, %xmm12
+        addsd     %xmm12, %xmm13
+        addsd     %xmm13, %xmm10
+        movsd     %xmm10, -32(%rsp)
+        movb      -25(%rsp), %dil
+        andb      $127, %dil
+        orb       %cl, %dil
+        movb      %dil, -25(%rsp)
+        movsd     -32(%rsp), %xmm10
+        cvtsd2ss  %xmm10, %xmm10
+        movss     %xmm10, (%r9)
+        ret
+
+.LBL_2_8:
+
+        movaps    %xmm0, %xmm2
+        mulsd     %xmm0, %xmm2
+        movsd     1104+__ssinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm2, %xmm1
+        movb      -1(%rsp), %dl
+        andb      $-128, %dl
+        addsd     1096+__ssinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm2, %xmm1
+        addsd     1088+__ssinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm2, %xmm1
+        addsd     1080+__ssinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm1, %xmm2
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm2, %xmm0
+        movsd     %xmm0, -32(%rsp)
+        movb      -25(%rsp), %cl
+        andb      $127, %cl
+        orb       %dl, %cl
+        movb      %cl, -25(%rsp)
+        movsd     -32(%rsp), %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%r9)
+        ret
+
+.LBL_2_9:
+
+        movsd     1112+__ssinh_la_CoutTab(%rip), %xmm1
+        lea       __ssinh_la_CoutTab(%rip), %r8
+        mulsd     %xmm0, %xmm1
+        movsd     1144+__ssinh_la_CoutTab(%rip), %xmm2
+        movsd     1152+__ssinh_la_CoutTab(%rip), %xmm3
+        movq      8+__ssinh_la_CoutTab(%rip), %rdx
+        movq      %rdx, -16(%rsp)
+        addsd     1120+__ssinh_la_CoutTab(%rip), %xmm1
+        movsd     %xmm1, -40(%rsp)
+        movsd     -40(%rsp), %xmm4
+        movsd     1072+__ssinh_la_CoutTab(%rip), %xmm1
+        movl      -40(%rsp), %edx
+        movl      %edx, %esi
+        andl      $63, %esi
+        subsd     1120+__ssinh_la_CoutTab(%rip), %xmm4
+        mulsd     %xmm4, %xmm2
+        lea       (%rsi,%rsi), %ecx
+        mulsd     %xmm3, %xmm4
+        subsd     %xmm2, %xmm0
+        movsd     (%r8,%rcx,8), %xmm5
+        lea       1(%rsi,%rsi), %edi
+        shrl      $6, %edx
+        subsd     %xmm4, %xmm0
+        mulsd     %xmm0, %xmm1
+        addl      $1022, %edx
+        andl      $2047, %edx
+        addsd     1064+__ssinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     1056+__ssinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     1048+__ssinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     1040+__ssinh_la_CoutTab(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     %xmm0, %xmm1
+        mulsd     %xmm5, %xmm1
+        addsd     (%r8,%rdi,8), %xmm1
+        addsd     %xmm5, %xmm1
+        cmpl      $2046, %edx
+        ja        .LBL_2_11
+
+
+        movq      8+__ssinh_la_CoutTab(%rip), %rcx
+        shrq      $48, %rcx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -10(%rsp)
+        movsd     -16(%rsp), %xmm0
+        mulsd     %xmm1, %xmm0
+        movsd     %xmm0, -32(%rsp)
+        jmp       .LBL_2_12
+
+.LBL_2_11:
+
+        decl      %edx
+        andl      $2047, %edx
+        movzwl    -10(%rsp), %ecx
+        shll      $4, %edx
+        andl      $-32753, %ecx
+        orl       %edx, %ecx
+        movw      %cx, -10(%rsp)
+        movsd     -16(%rsp), %xmm0
+        mulsd     %xmm1, %xmm0
+        mulsd     1024+__ssinh_la_CoutTab(%rip), %xmm0
+        movsd     %xmm0, -32(%rsp)
+
+.LBL_2_12:
+
+        movb      -25(%rsp), %cl
+        movb      -1(%rsp), %dl
+        andb      $127, %cl
+        andb      $-128, %dl
+        orb       %dl, %cl
+        movb      %cl, -25(%rsp)
+        movsd     -32(%rsp), %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%r9)
+        ret
+
+.LBL_2_13:
+
+        movsd     1168+__ssinh_la_CoutTab(%rip), %xmm0
+        movl      $3, %eax
+        mulsd     %xmm2, %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%r9)
+        ret
+
+.LBL_2_14:
+
+        movsd     __ssinh_la_CoutTab(%rip), %xmm0
+        addsd     1160+__ssinh_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm2, %xmm0
+        cvtsd2ss  %xmm0, %xmm0
+        movss     %xmm0, (%r9)
+
+
+        ret
+
+.LBL_2_16:
+
+        movsd     1160+__ssinh_la_CoutTab(%rip), %xmm0
+        mulsd     %xmm0, %xmm2
+        movsd     %xmm2, -24(%rsp)
+        pxor      %xmm2, %xmm2
+        cvtss2sd  (%rdi), %xmm2
+        movsd     -24(%rsp), %xmm1
+        movq      8+__ssinh_la_CoutTab(%rip), %rdx
+        addsd     %xmm1, %xmm2
+        cvtsd2ss  %xmm2, %xmm2
+        movq      %rdx, -16(%rsp)
+        movss     %xmm2, (%r9)
+        ret
+
+.LBL_2_17:
+
+        addss     %xmm2, %xmm2
+        movss     %xmm2, (%r9)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_ssinh_cout_rare_internal,@function
+       .size   __svml_ssinh_cout_rare_internal,.-__svml_ssinh_cout_rare_internal
+..LN__svml_ssinh_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_ssinh_data_internal:
+       .long   1056964608
+       .long   1057148295
+       .long   1057336003
+       .long   1057527823
+       .long   1057723842
+       .long   1057924154
+       .long   1058128851
+       .long   1058338032
+       .long   1058551792
+       .long   1058770234
+       .long   1058993458
+       .long   1059221571
+       .long   1059454679
+       .long   1059692891
+       .long   1059936319
+       .long   1060185078
+       .long   1060439283
+       .long   1060699055
+       .long   1060964516
+       .long   1061235789
+       .long   1061513002
+       .long   1061796286
+       .long   1062085772
+       .long   1062381598
+       .long   1062683901
+       .long   1062992824
+       .long   1063308511
+       .long   1063631111
+       .long   1063960775
+       .long   1064297658
+       .long   1064641917
+       .long   1064993715
+       .long   0
+       .long   2999887785
+       .long   852465809
+       .long   3003046475
+       .long   2984291233
+       .long   3001644133
+       .long   854021668
+       .long   2997748242
+       .long   849550193
+       .long   2995541347
+       .long   851518274
+       .long   809701978
+       .long   2997656926
+       .long   2996185864
+       .long   2980965110
+       .long   3002882728
+       .long   844097402
+       .long   848217591
+       .long   2999013352
+       .long   2992006718
+       .long   831170615
+       .long   3002278818
+       .long   833158180
+       .long   3000769962
+       .long   2991891850
+       .long   2999994908
+       .long   2979965785
+       .long   2982419430
+       .long   2982221534
+       .long   2999469642
+       .long   833168438
+       .long   2987538264
+       .long   1056964608
+       .long   1056605107
+       .long   1056253309
+       .long   1055909050
+       .long   1055572167
+       .long   1055242503
+       .long   1054919903
+       .long   1054604216
+       .long   1054295293
+       .long   1053992990
+       .long   1053697164
+       .long   1053407678
+       .long   1053124394
+       .long   1052847181
+       .long   1052575908
+       .long   1052310447
+       .long   1052050675
+       .long   1051796470
+       .long   1051547711
+       .long   1051304283
+       .long   1051066071
+       .long   1050832963
+       .long   1050604850
+       .long   1050381626
+       .long   1050163184
+       .long   1049949424
+       .long   1049740243
+       .long   1049535546
+       .long   1049335234
+       .long   1049139215
+       .long   1048947395
+       .long   1048759687
+       .long   0
+       .long   2979149656
+       .long   824779830
+       .long   2991081034
+       .long   2973832926
+       .long   2974030822
+       .long   2971577177
+       .long   2991606300
+       .long   2983503242
+       .long   2992381354
+       .long   824769572
+       .long   2993890210
+       .long   822782007
+       .long   2983618110
+       .long   2990624744
+       .long   839828983
+       .long   835708794
+       .long   2994494120
+       .long   2972576502
+       .long   2987797256
+       .long   2989268318
+       .long   801313370
+       .long   843129666
+       .long   2987152739
+       .long   841161585
+       .long   2989359634
+       .long   845633060
+       .long   2993255525
+       .long   2975902625
+       .long   2994657867
+       .long   844077201
+       .long   2991499177
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542464
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   1220542465
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1118743631
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1056964676
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1042983605
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1069066811
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   1060204544
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   939916788
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   31
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1118743630
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1042983511
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1026206322
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   1007228001
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   985049251
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .long   1056964608
+       .type   __svml_ssinh_data_internal,@object
+       .size   __svml_ssinh_data_internal,1920
+       .align 32
+__ssinh_la_CoutTab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   1048019041
+       .long   1072704666
+       .long   1398474845
+       .long   3161559171
+       .long   3541402996
+       .long   1072716208
+       .long   2759177317
+       .long   1015903202
+       .long   410360776
+       .long   1072727877
+       .long   1269990655
+       .long   1013024446
+       .long   1828292879
+       .long   1072739672
+       .long   1255956747
+       .long   1016636974
+       .long   852742562
+       .long   1072751596
+       .long   667253587
+       .long   1010842135
+       .long   3490863953
+       .long   1072763649
+       .long   960797498
+       .long   3163997456
+       .long   2930322912
+       .long   1072775834
+       .long   2599499422
+       .long   3163762623
+       .long   1014845819
+       .long   1072788152
+       .long   3117910646
+       .long   3162607681
+       .long   3949972341
+       .long   1072800603
+       .long   2068408548
+       .long   1015962444
+       .long   828946858
+       .long   1072813191
+       .long   10642492
+       .long   1016988014
+       .long   2288159958
+       .long   1072825915
+       .long   2169144469
+       .long   1015924597
+       .long   1853186616
+       .long   1072838778
+       .long   3066496371
+       .long   1016705150
+       .long   1709341917
+       .long   1072851781
+       .long   2571168217
+       .long   1015201075
+       .long   4112506593
+       .long   1072864925
+       .long   2947355221
+       .long   1015419624
+       .long   2799960843
+       .long   1072878213
+       .long   1423655381
+       .long   1016070727
+       .long   171030293
+       .long   1072891646
+       .long   3526460132
+       .long   1015477354
+       .long   2992903935
+       .long   1072905224
+       .long   2218154406
+       .long   1016276769
+       .long   926591435
+       .long   1072918951
+       .long   3208833762
+       .long   3163962090
+       .long   887463927
+       .long   1072932827
+       .long   3596744163
+       .long   3161842742
+       .long   1276261410
+       .long   1072946854
+       .long   300981948
+       .long   1015732745
+       .long   569847338
+       .long   1072961034
+       .long   472945272
+       .long   3160339305
+       .long   1617004845
+       .long   1072975368
+       .long   82804944
+       .long   1011391354
+       .long   3049340112
+       .long   1072989858
+       .long   3062915824
+       .long   1014219171
+       .long   3577096743
+       .long   1073004506
+       .long   2951496418
+       .long   1014842263
+       .long   1990012071
+       .long   1073019314
+       .long   3529070563
+       .long   3163861769
+       .long   1453150082
+       .long   1073034283
+       .long   498154669
+       .long   3162536638
+       .long   917841882
+       .long   1073049415
+       .long   18715565
+       .long   1016707884
+       .long   3712504873
+       .long   1073064711
+       .long   88491949
+       .long   1016476236
+       .long   363667784
+       .long   1073080175
+       .long   813753950
+       .long   1016833785
+       .long   2956612997
+       .long   1073095806
+       .long   2118169751
+       .long   3163784129
+       .long   2186617381
+       .long   1073111608
+       .long   2270764084
+       .long   3164321289
+       .long   1719614413
+       .long   1073127582
+       .long   330458198
+       .long   3164331316
+       .long   1013258799
+       .long   1073143730
+       .long   1748797611
+       .long   3161177658
+       .long   3907805044
+       .long   1073160053
+       .long   2257091225
+       .long   3162598983
+       .long   1447192521
+       .long   1073176555
+       .long   1462857171
+       .long   3163563097
+       .long   1944781191
+       .long   1073193236
+       .long   3993278767
+       .long   3162772855
+       .long   919555682
+       .long   1073210099
+       .long   3121969534
+       .long   1013996802
+       .long   2571947539
+       .long   1073227145
+       .long   3558159064
+       .long   3164425245
+       .long   2604962541
+       .long   1073244377
+       .long   2614425274
+       .long   3164587768
+       .long   1110089947
+       .long   1073261797
+       .long   1451641639
+       .long   1016523249
+       .long   2568320822
+       .long   1073279406
+       .long   2732824428
+       .long   1015401491
+       .long   2966275557
+       .long   1073297207
+       .long   2176155324
+       .long   3160891335
+       .long   2682146384
+       .long   1073315202
+       .long   2082178513
+       .long   3164411995
+       .long   2191782032
+       .long   1073333393
+       .long   2960257726
+       .long   1014791238
+       .long   2069751141
+       .long   1073351782
+       .long   1562170675
+       .long   3163773257
+       .long   2990417245
+       .long   1073370371
+       .long   3683467745
+       .long   3164417902
+       .long   1434058175
+       .long   1073389163
+       .long   251133233
+       .long   1016134345
+       .long   2572866477
+       .long   1073408159
+       .long   878562433
+       .long   1016570317
+       .long   3092190715
+       .long   1073427362
+       .long   814012168
+       .long   3160571998
+       .long   4076559943
+       .long   1073446774
+       .long   2119478331
+       .long   3161806927
+       .long   2420883922
+       .long   1073466398
+       .long   2049810052
+       .long   1015168464
+       .long   3716502172
+       .long   1073486235
+       .long   2303740125
+       .long   1015091301
+       .long   777507147
+       .long   1073506289
+       .long   4282924205
+       .long   1016236109
+       .long   3706687593
+       .long   1073526560
+       .long   3521726939
+       .long   1014301643
+       .long   1242007932
+       .long   1073547053
+       .long   1132034716
+       .long   3164388407
+       .long   3707479175
+       .long   1073567768
+       .long   3613079303
+       .long   1015213314
+       .long   64696965
+       .long   1073588710
+       .long   1768797490
+       .long   1016865536
+       .long   863738719
+       .long   1073609879
+       .long   1326992220
+       .long   3163661773
+       .long   3884662774
+       .long   1073631278
+       .long   2158611599
+       .long   1015258761
+       .long   2728693978
+       .long   1073652911
+       .long   396109971
+       .long   3164511267
+       .long   3999357479
+       .long   1073674779
+       .long   2258941616
+       .long   1016973300
+       .long   1533953344
+       .long   1073696886
+       .long   769171851
+       .long   1016714209
+       .long   2174652632
+       .long   1073719233
+       .long   4087714590
+       .long   1015498835
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   0
+       .long   0
+       .long   1071644672
+       .long   1431652600
+       .long   1069897045
+       .long   1431670732
+       .long   1067799893
+       .long   984555731
+       .long   1065423122
+       .long   472530941
+       .long   1062650218
+       .long   1431655765
+       .long   1069897045
+       .long   286331153
+       .long   1065423121
+       .long   436314138
+       .long   1059717536
+       .long   2773927732
+       .long   1053236707
+       .long   1697350398
+       .long   1079448903
+       .long   0
+       .long   1127743488
+       .long   33554432
+       .long   1101004800
+       .long   2684354560
+       .long   1079401119
+       .long   4277796864
+       .long   1065758274
+       .long   3164486458
+       .long   1025308570
+       .long   1
+       .long   1048576
+       .long   4294967295
+       .long   2146435071
+       .long   3671843104
+       .long   1067178892
+       .long   3875694624
+       .long   1077247184
+       .type   __ssinh_la_CoutTab,@object
+       .size   __ssinh_la_CoutTab,1192
+       .space 8, 0x00  
+       .align 16
+.L_2il0floatpacket.98:
+       .long   0x00000000,0x80000000,0x00000000,0x00000000
+       .type   .L_2il0floatpacket.98,@object
+       .size   .L_2il0floatpacket.98,16
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_tan_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_tan_d_la.s
new file mode 100644 (file)
index 0000000..377f144
--- /dev/null
@@ -0,0 +1,20221 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *     
+ *      ( optimized for throughput, with small table lookup, works when HW FMA is available )
+ *     
+ *      Implementation reduces argument x to |R|<pi/32
+ *      16-entry tables used to store high and low parts of tan(x0)
+ *      Argument x = N*pi + x0 + (R);   x0 = k*pi/16, with k in {0, 1, ..., 15}
+ *      (very large arguments reduction resolved in _vdreduction_core.i)
+ *      Compute result as (tan(x0) + tan(R))/(1-tan(x0)*tan(R))
+ *      High accuracy ( < 1 ulp ) version keeps extra precision for numerator, denominator, and during
+ *      final NR-iteration computing quotient.
+ *     
+ *     
+ */
+
+
+       .text
+.L_2__routine_start___svml_tan8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_tan8
+
+__svml_tan8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        xorl      %edx, %edx
+
+/* Large values check */
+        vmovups   28160+__svml_dtan_data_internal(%rip), %zmm1
+
+/*
+ * ----------------------------------------------------------
+ * Main path
+ * ----------------------------------------------------------
+ * start arg. reduction
+ */
+        vmovups   1152+__svml_dtan_data_internal(%rip), %zmm2
+        vmovups   64+__svml_dtan_data_internal(%rip), %zmm5
+        vmovups   128+__svml_dtan_data_internal(%rip), %zmm3
+        vmovups   192+__svml_dtan_data_internal(%rip), %zmm4
+        vmovaps   %zmm0, %zmm11
+        vandpd    1024+__svml_dtan_data_internal(%rip), %zmm11, %zmm0
+        vcmppd    $22, {sae}, %zmm1, %zmm0, %k1
+        vmovups   __svml_dtan_data_internal(%rip), %zmm1
+
+/*
+ * ----------------------------------------------------------
+ * End of main path
+ * ----------------------------------------------------------
+ */
+        kortestw  %k1, %k1
+        vfmadd213pd {rn-sae}, %zmm2, %zmm11, %zmm1
+        vsubpd    {rn-sae}, %zmm2, %zmm1, %zmm8
+        vfnmadd213pd {rn-sae}, %zmm11, %zmm8, %zmm5
+        vfnmadd231pd {rn-sae}, %zmm8, %zmm3, %zmm5
+        vfnmadd213pd {rn-sae}, %zmm5, %zmm4, %zmm8
+        jne       .LBL_1_12
+
+.LBL_1_2:
+
+        vmovups   384+__svml_dtan_data_internal(%rip), %zmm0
+        vmovups   832+__svml_dtan_data_internal(%rip), %zmm5
+        vmovups   768+__svml_dtan_data_internal(%rip), %zmm2
+        vmovups   704+__svml_dtan_data_internal(%rip), %zmm3
+        vmovups   640+__svml_dtan_data_internal(%rip), %zmm4
+        vmulpd    {rn-sae}, %zmm8, %zmm8, %zmm6
+        vpermt2pd 448+__svml_dtan_data_internal(%rip), %zmm1, %zmm0
+        vmovups   896+__svml_dtan_data_internal(%rip), %zmm1
+        vfmadd231pd {rn-sae}, %zmm6, %zmm1, %zmm5
+        vfmadd213pd {rn-sae}, %zmm2, %zmm6, %zmm5
+        vfmadd213pd {rn-sae}, %zmm3, %zmm6, %zmm5
+        vfmadd213pd {rn-sae}, %zmm4, %zmm6, %zmm5
+        vmulpd    {rn-sae}, %zmm8, %zmm5, %zmm7
+        vfmadd213pd {rn-sae}, %zmm8, %zmm6, %zmm7
+
+/*
+ * Computer Denominator:
+ * dDenominator - dDlow ~= 1-(dTh+dTl)*(dP+dPlow)
+ */
+        vmovups   960+__svml_dtan_data_internal(%rip), %zmm8
+
+/*
+ * Compute Numerator:
+ * dNumerator + dNlow ~= dTh+dTl+dP+dPlow
+ */
+        vaddpd    {rn-sae}, %zmm0, %zmm7, %zmm9
+        vfnmadd213pd {rn-sae}, %zmm8, %zmm7, %zmm0
+
+/*
+ * Now computes (dNumerator + dNlow)/(dDenominator - dDlow)
+ * Choose NR iteration instead of hardware division
+ */
+        vrcp14pd  %zmm0, %zmm10
+
+/* One NR iteration to refine dRcp */
+        vfnmadd231pd {rn-sae}, %zmm10, %zmm0, %zmm8
+        vfmadd213pd {rn-sae}, %zmm10, %zmm8, %zmm10
+        vmulpd    {rn-sae}, %zmm9, %zmm10, %zmm12
+
+/* One NR iteration to refine dQuotient */
+        vfmsub213pd {rn-sae}, %zmm9, %zmm12, %zmm0
+        vfnmadd213pd {rn-sae}, %zmm12, %zmm10, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_4
+
+.LBL_1_3:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_4:
+
+        vmovups   %zmm11, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_3
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_8:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_11
+
+.LBL_1_9:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_8
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_3
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_11:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dtan_cout_rare_internal
+        jmp       .LBL_1_9
+       .cfi_restore 4
+       .cfi_restore 5
+       .cfi_restore 12
+       .cfi_restore 13
+       .cfi_restore 122
+       .cfi_restore 123
+       .cfi_restore 124
+       .cfi_restore 125
+
+.LBL_1_12:
+
+        vmovups   1088+__svml_dtan_data_internal(%rip), %zmm14
+
+/*
+ * Get the (2^a / 2pi) mod 1 values from the table.
+ * Because VLANG doesn't have L-type gather, we need a trivial cast
+ */
+        lea       __svml_dtan_reduction_data_internal(%rip), %rax
+        vmovups   %zmm1, (%rsp)
+        vpbroadcastq .L_2il0floatpacket.18(%rip), %zmm9
+        vandpd    %zmm0, %zmm14, %zmm6
+        vmovups   %zmm8, 64(%rsp)
+        vcmppd    $4, {sae}, %zmm14, %zmm6, %k2
+        vmovaps   %zmm9, %zmm5
+        vpandq    .L_2il0floatpacket.19(%rip){1to8}, %zmm11, %zmm8
+        vpsrlq    $52, %zmm8, %zmm10
+        vpsllq    $1, %zmm10, %zmm7
+        vpaddq    %zmm10, %zmm7, %zmm4
+        vpsllq    $3, %zmm4, %zmm0
+        vpmovqd   %zmm0, %ymm3
+        vpandnq   %zmm6, %zmm6, %zmm5{%k2}
+        vcmppd    $3, {sae}, %zmm5, %zmm5, %k0
+
+/*
+ * Break the P_xxx and m into 32-bit chunks ready for
+ * the long multiplication via 32x32->64 multiplications
+ */
+        vpbroadcastq .L_2il0floatpacket.22(%rip), %zmm6
+        kxnorw    %k0, %k0, %k3
+        kxnorw    %k0, %k0, %k2
+        kmovw     %k0, %edx
+        vpxord    %zmm2, %zmm2, %zmm2
+        vgatherdpd (%rax,%ymm3), %zmm2{%k3}
+        kxnorw    %k0, %k0, %k3
+        vpsrlq    $32, %zmm2, %zmm5
+        vpxord    %zmm1, %zmm1, %zmm1
+        vpxord    %zmm8, %zmm8, %zmm8
+        vgatherdpd 8(%rax,%ymm3), %zmm1{%k2}
+        vgatherdpd 16(%rax,%ymm3), %zmm8{%k3}
+        vpsrlq    $32, %zmm1, %zmm0
+        vpsrlq    $32, %zmm8, %zmm13
+
+/*
+ * Also get the significand as an integer
+ * NB: adding in the integer bit is wrong for denorms!
+ * To make this work for denorms we should do something slightly different
+ */
+        vpandq    .L_2il0floatpacket.20(%rip){1to8}, %zmm11, %zmm15
+        vpaddq    .L_2il0floatpacket.21(%rip){1to8}, %zmm15, %zmm14
+        vpsrlq    $32, %zmm14, %zmm7
+        vpmullq   %zmm0, %zmm7, %zmm3
+        vpandq    %zmm6, %zmm2, %zmm10
+        vpandq    %zmm6, %zmm1, %zmm12
+        vpandq    %zmm6, %zmm8, %zmm15
+        vpandq    %zmm6, %zmm14, %zmm14
+
+/* Now do the big multiplication and carry propagation */
+        vpmullq   %zmm10, %zmm7, %zmm4
+        vpmullq   %zmm12, %zmm7, %zmm2
+        vpmullq   %zmm13, %zmm7, %zmm1
+        vpmullq   %zmm15, %zmm7, %zmm8
+        vpmullq   %zmm5, %zmm14, %zmm7
+        vpmullq   %zmm10, %zmm14, %zmm5
+        vpmullq   %zmm0, %zmm14, %zmm10
+        vpmullq   %zmm12, %zmm14, %zmm0
+        vpmullq   %zmm13, %zmm14, %zmm12
+        vpsrlq    $32, %zmm10, %zmm15
+        vpsrlq    $32, %zmm0, %zmm13
+        vpsrlq    $32, %zmm12, %zmm14
+        vpsrlq    $32, %zmm5, %zmm12
+        vpsrlq    $32, %zmm8, %zmm8
+        vpaddq    %zmm14, %zmm1, %zmm1
+        vpaddq    %zmm13, %zmm2, %zmm2
+        vpaddq    %zmm15, %zmm3, %zmm15
+        vpaddq    %zmm12, %zmm4, %zmm3
+        vpandq    %zmm6, %zmm0, %zmm13
+        vpaddq    %zmm1, %zmm13, %zmm4
+        vpaddq    %zmm4, %zmm8, %zmm14
+        vpsrlq    $32, %zmm14, %zmm0
+        vpandq    %zmm6, %zmm10, %zmm10
+        vpaddq    %zmm2, %zmm10, %zmm1
+        vpaddq    %zmm1, %zmm0, %zmm8
+
+/*
+ * Now round at the 2^-9 bit position for reduction mod pi/2^8
+ * instead of the original 2pi (but still with the same 2pi scaling).
+ * Use a shifter of 2^43 + 2^42.
+ * The N we get is our final version; it has an offset of
+ * 2^9 because of the implicit integer bit, and anyway for negative
+ * starting value it's a 2s complement thing. But we need to mask
+ * off the exponent part anyway so it's fine.
+ */
+        vpbroadcastq .L_2il0floatpacket.25(%rip), %zmm1
+        vpandq    %zmm6, %zmm7, %zmm7
+        vpaddq    %zmm3, %zmm7, %zmm13
+        vpsrlq    $32, %zmm8, %zmm3
+        vpandq    %zmm6, %zmm5, %zmm5
+        vpaddq    %zmm15, %zmm5, %zmm2
+        vpaddq    %zmm2, %zmm3, %zmm15
+        vpsrlq    $32, %zmm15, %zmm12
+        vpaddq    %zmm13, %zmm12, %zmm5
+
+/* Assemble reduced argument from the pieces */
+        vpandq    %zmm6, %zmm14, %zmm10
+        vpandq    %zmm6, %zmm15, %zmm7
+        vpsllq    $32, %zmm5, %zmm6
+        vpsllq    $32, %zmm8, %zmm5
+        vpaddq    %zmm7, %zmm6, %zmm4
+        vpaddq    %zmm10, %zmm5, %zmm10
+        vpsrlq    $12, %zmm4, %zmm6
+
+/*
+ * We want to incorporate the original sign now too.
+ * Do it here for convenience in getting the right N value,
+ * though we could wait right to the end if we were prepared
+ * to modify the sign of N later too.
+ * So get the appropriate sign mask now (or sooner).
+ */
+        vpandq    .L_2il0floatpacket.23(%rip){1to8}, %zmm11, %zmm0
+        vpandq    .L_2il0floatpacket.28(%rip){1to8}, %zmm10, %zmm13
+        vpsllq    $28, %zmm13, %zmm14
+
+/*
+ * Create floating-point high part, implicitly adding integer bit 1
+ * Incorporate overall sign at this stage too.
+ */
+        vpxorq    .L_2il0floatpacket.24(%rip){1to8}, %zmm0, %zmm8
+        vporq     %zmm8, %zmm6, %zmm2
+        vaddpd    {rn-sae}, %zmm2, %zmm1, %zmm12
+        vsubpd    {rn-sae}, %zmm1, %zmm12, %zmm3
+        vsubpd    {rn-sae}, %zmm3, %zmm2, %zmm7
+
+/*
+ * Create floating-point low and medium parts, respectively
+ * lo_23, ... lo_0, 0, ..., 0
+ * hi_11, ... hi_0, lo_63, ..., lo_24
+ * then subtract off the implicitly added integer bits,
+ * 2^-104 and 2^-52, respectively.
+ * Put the original sign into all of them at this stage.
+ */
+        vpxorq    .L_2il0floatpacket.27(%rip){1to8}, %zmm0, %zmm6
+        vporq     %zmm6, %zmm14, %zmm15
+        vpandq    .L_2il0floatpacket.30(%rip){1to8}, %zmm4, %zmm4
+        vsubpd    {rn-sae}, %zmm6, %zmm15, %zmm8
+
+/*
+ * If the magnitude of the input is <= 2^-20, then
+ * just pass through the input, since no reduction will be needed and
+ * the main path will only work accurately if the reduced argument is
+ * about >= 2^-70 (which it is for all large pi multiples)
+ */
+        vpbroadcastq .L_2il0floatpacket.34(%rip), %zmm14
+        vandpd    .L_2il0floatpacket.33(%rip){1to8}, %zmm11, %zmm15
+        vpsrlq    $24, %zmm10, %zmm6
+        vcmppd    $26, {sae}, %zmm14, %zmm15, %k2
+        vcmppd    $22, {sae}, %zmm14, %zmm15, %k3
+        vpxorq    .L_2il0floatpacket.29(%rip){1to8}, %zmm0, %zmm1
+        vpsllq    $40, %zmm4, %zmm0
+        vporq     %zmm6, %zmm0, %zmm0
+        vporq     %zmm1, %zmm0, %zmm4
+        vsubpd    {rn-sae}, %zmm1, %zmm4, %zmm2
+
+/* Now add them up into 2 reasonably aligned pieces */
+        vaddpd    {rn-sae}, %zmm2, %zmm7, %zmm13
+        vsubpd    {rn-sae}, %zmm13, %zmm7, %zmm7
+        vaddpd    {rn-sae}, %zmm7, %zmm2, %zmm3
+        vaddpd    {rn-sae}, %zmm8, %zmm3, %zmm0
+        vpbroadcastq .L_2il0floatpacket.32(%rip), %zmm8
+
+/* Grab our final N value as an integer, appropriately masked mod 2^9 */
+        vpandq    .L_2il0floatpacket.26(%rip){1to8}, %zmm12, %zmm5
+
+/*
+ * Now multiply those numbers all by 2 pi, reasonably accurately.
+ * (RHi + RLo) * (pi_lead + pi_trail) ~=
+ * RHi * pi_lead + (RHi * pi_trail + RLo * pi_lead)
+ */
+        vpbroadcastq .L_2il0floatpacket.31(%rip), %zmm12
+
+/* The output is _VRES_Z (high) + _VRES_E (low), and the integer part is _VRES_IND */
+        vpmovqd   %zmm5, %ymm4
+        vmulpd    {rn-sae}, %zmm12, %zmm13, %zmm6
+        vmovaps   %zmm12, %zmm10
+        vfmsub213pd {rn-sae}, %zmm6, %zmm13, %zmm10
+        vfmadd213pd {rn-sae}, %zmm10, %zmm8, %zmm13
+        vpbroadcastq .L_2il0floatpacket.37(%rip), %zmm10
+        vfmadd213pd {rn-sae}, %zmm13, %zmm12, %zmm0
+        vpbroadcastq .L_2il0floatpacket.36(%rip), %zmm12
+        vmovaps   %zmm9, %zmm8
+        vpandnq   %zmm15, %zmm15, %zmm8{%k2}
+        vpandnq   %zmm15, %zmm15, %zmm9{%k3}
+        vandpd    %zmm11, %zmm9, %zmm9
+        vandpd    %zmm6, %zmm8, %zmm14
+        vorpd     %zmm14, %zmm9, %zmm6
+        vandpd    %zmm0, %zmm8, %zmm9
+        vmovdqu   .L_2il0floatpacket.35(%rip), %ymm0
+        vpsrlq    $32, %zmm6, %zmm5
+        vpmovqd   %zmm5, %ymm5
+        vpsrld    $31, %ymm5, %ymm1
+        vpsubd    %ymm1, %ymm0, %ymm2
+
+/*
+ * ----------------------------------------------------------
+ * End of large arguments path
+ * ----------------------------------------------------------
+ * Merge results from main and large paths:
+ */
+        vmovups   (%rsp), %zmm1
+        vpaddd    %ymm2, %ymm4, %ymm3
+        vpsrld    $4, %ymm3, %ymm14
+        vpslld    $4, %ymm14, %ymm7
+        vpmovzxdq %ymm14, %zmm1{%k1}
+        vpsubd    %ymm7, %ymm4, %ymm8
+        vcvtdq2pd %ymm8, %zmm15
+        vmovups   64(%rsp), %zmm8
+        vfmadd231pd {rn-sae}, %zmm15, %zmm10, %zmm9
+        vaddpd    {rn-sae}, %zmm6, %zmm9, %zmm13
+        vfmadd213pd {rn-sae}, %zmm13, %zmm12, %zmm15
+        vblendmpd %zmm15, %zmm8, %zmm8{%k1}
+        jmp       .LBL_1_2
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_tan8,@function
+       .size   __svml_tan8,.-__svml_tan8
+..LN__svml_tan8.0:
+
+.L_2__routine_start___svml_dtan_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dtan_cout_rare_internal:
+
+
+       .cfi_startproc
+..L65:
+
+        xorl      %eax, %eax
+        movzwl    6(%rdi), %ecx
+        movsd     (%rdi), %xmm1
+        andl      $32752, %ecx
+        movb      7(%rdi), %dl
+        andb      $127, %dl
+        movsd     %xmm1, -8(%rsp)
+        movb      %dl, -1(%rsp)
+        cmpl      $32752, %ecx
+        je        .LBL_2_3
+
+
+        ret
+
+.LBL_2_3:
+
+        cmpl      $0, -8(%rsp)
+        jne       .LBL_2_6
+
+
+        cmpl      $2146435072, -4(%rsp)
+        jne       .LBL_2_6
+
+
+        movsd     __dtan_la_Tab(%rip), %xmm0
+        movl      $1, %eax
+        mulsd     %xmm0, %xmm1
+        movsd     %xmm1, (%rsi)
+        ret
+
+.LBL_2_6:
+
+        mulsd     %xmm1, %xmm1
+        movsd     %xmm1, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dtan_cout_rare_internal,@function
+       .size   __svml_dtan_cout_rare_internal,.-__svml_dtan_cout_rare_internal
+..LN__svml_dtan_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dtan_data_internal:
+       .long   1841940611
+       .long   1075076912
+       .long   1841940611
+       .long   1075076912
+       .long   1841940611
+       .long   1075076912
+       .long   1841940611
+       .long   1075076912
+       .long   1841940611
+       .long   1075076912
+       .long   1841940611
+       .long   1075076912
+       .long   1841940611
+       .long   1075076912
+       .long   1841940611
+       .long   1075076912
+       .long   1413754136
+       .long   1070146043
+       .long   1413754136
+       .long   1070146043
+       .long   1413754136
+       .long   1070146043
+       .long   1413754136
+       .long   1070146043
+       .long   1413754136
+       .long   1070146043
+       .long   1413754136
+       .long   1070146043
+       .long   1413754136
+       .long   1070146043
+       .long   1413754136
+       .long   1070146043
+       .long   856972294
+       .long   1013032486
+       .long   856972294
+       .long   1013032486
+       .long   856972294
+       .long   1013032486
+       .long   856972294
+       .long   1013032486
+       .long   856972294
+       .long   1013032486
+       .long   856972294
+       .long   1013032486
+       .long   856972294
+       .long   1013032486
+       .long   856972294
+       .long   1013032486
+       .long   688016905
+       .long   958143697
+       .long   688016905
+       .long   958143697
+       .long   688016905
+       .long   958143697
+       .long   688016905
+       .long   958143697
+       .long   688016905
+       .long   958143697
+       .long   688016905
+       .long   958143697
+       .long   688016905
+       .long   958143697
+       .long   688016905
+       .long   958143697
+       .long   855638016
+       .long   1013032486
+       .long   855638016
+       .long   1013032486
+       .long   855638016
+       .long   1013032486
+       .long   855638016
+       .long   1013032486
+       .long   855638016
+       .long   1013032486
+       .long   855638016
+       .long   1013032486
+       .long   855638016
+       .long   1013032486
+       .long   855638016
+       .long   1013032486
+       .long   3773204808
+       .long   979655686
+       .long   3773204808
+       .long   979655686
+       .long   3773204808
+       .long   979655686
+       .long   3773204808
+       .long   979655686
+       .long   3773204808
+       .long   979655686
+       .long   3773204808
+       .long   979655686
+       .long   3773204808
+       .long   979655686
+       .long   3773204808
+       .long   979655686
+       .long   0
+       .long   2147483648
+       .long   3763679576
+       .long   1070167541
+       .long   2583490354
+       .long   1071284857
+       .long   716700048
+       .long   1071997368
+       .long   0
+       .long   1072693248
+       .long   3797578849
+       .long   1073213976
+       .long   859807206
+       .long   1073958991
+       .long   3795994481
+       .long   1075059710
+       .long   4294967295
+       .long   4293918719
+       .long   3795994481
+       .long   3222543358
+       .long   859807206
+       .long   3221442639
+       .long   3797578849
+       .long   3220697624
+       .long   0
+       .long   3220176896
+       .long   716700048
+       .long   3219481016
+       .long   2583490354
+       .long   3218768505
+       .long   3763679576
+       .long   3217651189
+       .long   0
+       .long   2147483648
+       .long   1732516166
+       .long   1009710547
+       .long   2973134505
+       .long   1014008623
+       .long   561165941
+       .long   1015523525
+       .long   0
+       .long   0
+       .long   1767150223
+       .long   1016338938
+       .long   4129738197
+       .long   1017254245
+       .long   4275273486
+       .long   1015088902
+       .long   0
+       .long   4238344192
+       .long   4275273486
+       .long   3162572550
+       .long   4129738197
+       .long   3164737893
+       .long   1767150223
+       .long   3163822586
+       .long   0
+       .long   0
+       .long   561165941
+       .long   3163007173
+       .long   2973134505
+       .long   3161492271
+       .long   1732516166
+       .long   3157194195
+       .long   1431655900
+       .long   1070945621
+       .long   1431655900
+       .long   1070945621
+       .long   1431655900
+       .long   1070945621
+       .long   1431655900
+       .long   1070945621
+       .long   1431655900
+       .long   1070945621
+       .long   1431655900
+       .long   1070945621
+       .long   1431655900
+       .long   1070945621
+       .long   1431655900
+       .long   1070945621
+       .long   285935618
+       .long   1069617425
+       .long   285935618
+       .long   1069617425
+       .long   285935618
+       .long   1069617425
+       .long   285935618
+       .long   1069617425
+       .long   285935618
+       .long   1069617425
+       .long   285935618
+       .long   1069617425
+       .long   285935618
+       .long   1069617425
+       .long   285935618
+       .long   1069617425
+       .long   1218258378
+       .long   1068212666
+       .long   1218258378
+       .long   1068212666
+       .long   1218258378
+       .long   1068212666
+       .long   1218258378
+       .long   1068212666
+       .long   1218258378
+       .long   1068212666
+       .long   1218258378
+       .long   1068212666
+       .long   1218258378
+       .long   1068212666
+       .long   1218258378
+       .long   1068212666
+       .long   1716452265
+       .long   1066820779
+       .long   1716452265
+       .long   1066820779
+       .long   1716452265
+       .long   1066820779
+       .long   1716452265
+       .long   1066820779
+       .long   1716452265
+       .long   1066820779
+       .long   1716452265
+       .long   1066820779
+       .long   1716452265
+       .long   1066820779
+       .long   1716452265
+       .long   1066820779
+       .long   3351902813
+       .long   1065508044
+       .long   3351902813
+       .long   1065508044
+       .long   3351902813
+       .long   1065508044
+       .long   3351902813
+       .long   1065508044
+       .long   3351902813
+       .long   1065508044
+       .long   3351902813
+       .long   1065508044
+       .long   3351902813
+       .long   1065508044
+       .long   3351902813
+       .long   1065508044
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   2146435072
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   0
+       .long   1127743488
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   1413480448
+       .long   1065951739
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   442499072
+       .long   1029747809
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   771977331
+       .long   993204618
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   511
+       .long   0
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1841940611
+       .long   1079271216
+       .long   1413754136
+       .long   1073291771
+       .long   856972295
+       .long   1016178214
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1431655769
+       .long   1070945621
+       .long   0
+       .long   0
+       .long   285114973
+       .long   1069617425
+       .long   0
+       .long   0
+       .long   3223786787
+       .long   1068212718
+       .long   1570481342
+       .long   1073278903
+       .long   2595802427
+       .long   1014369127
+       .long   0
+       .long   0
+       .long   75380366
+       .long   1065951822
+       .long   2999349512
+       .long   3155830414
+       .long   0
+       .long   1072693248
+       .long   2911696896
+       .long   1059306942
+       .long   451505506
+       .long   1065952070
+       .long   3089290734
+       .long   1070946463
+       .long   3705470160
+       .long   1065403174
+       .long   2568117119
+       .long   1069618857
+       .long   643394266
+       .long   1064501452
+       .long   501385640
+       .long   1068202863
+       .long   1727208548
+       .long   1073266035
+       .long   2531251621
+       .long   3162145225
+       .long   0
+       .long   0
+       .long   612012528
+       .long   1067000646
+       .long   549540416
+       .long   3153143513
+       .long   0
+       .long   1072693248
+       .long   2064191488
+       .long   1061404484
+       .long   4042886527
+       .long   1067001638
+       .long   149923164
+       .long   1070948993
+       .long   104448276
+       .long   1066453158
+       .long   2663431480
+       .long   1069623160
+       .long   4100741303
+       .long   1065552806
+       .long   3253087105
+       .long   1068220130
+       .long   1883935754
+       .long   1073253167
+       .long   2988318241
+       .long   3163734974
+       .long   0
+       .long   0
+       .long   3919601072
+       .long   1067637674
+       .long   2391050108
+       .long   3158536696
+       .long   0
+       .long   1072693248
+       .long   1803946752
+       .long   1062615560
+       .long   2247013512
+       .long   1067639351
+       .long   3277043521
+       .long   1070953215
+       .long   578207594
+       .long   1067006653
+       .long   1619551617
+       .long   1069630354
+       .long   2647612950
+       .long   1066183733
+       .long   2691224773
+       .long   1068193529
+       .long   2040662960
+       .long   1073240299
+       .long   4270081753
+       .long   3164530442
+       .long   0
+       .long   0
+       .long   2319126882
+       .long   1068050215
+       .long   2052183488
+       .long   1006305725
+       .long   0
+       .long   1072693248
+       .long   2962101888
+       .long   1063503197
+       .long   3966050657
+       .long   1068054193
+       .long   3178024141
+       .long   1070959142
+       .long   1146831000
+       .long   1067507381
+       .long   1630003540
+       .long   1069640468
+       .long   2204487828
+       .long   1066612393
+       .long   783402153
+       .long   1068243248
+       .long   2197390165
+       .long   1073227431
+       .long   3038089327
+       .long   1016395176
+       .long   0
+       .long   0
+       .long   3930011523
+       .long   1068463253
+       .long   3574549514
+       .long   3158343440
+       .long   0
+       .long   1072693248
+       .long   930814464
+       .long   1064233867
+       .long   3218126771
+       .long   1068471034
+       .long   873740287
+       .long   1070966789
+       .long   1580060562
+       .long   1067789097
+       .long   1505280051
+       .long   1069653548
+       .long   2221338604
+       .long   1066937592
+       .long   2641117162
+       .long   1068312400
+       .long   2354117371
+       .long   1073214563
+       .long   3512651629
+       .long   1015129272
+       .long   0
+       .long   0
+       .long   3439278129
+       .long   1068687929
+       .long   1073016494
+       .long   1012431341
+       .long   0
+       .long   1072693248
+       .long   2934847296
+       .long   1064716672
+       .long   2625704508
+       .long   1068694663
+       .long   3692939630
+       .long   1070976174
+       .long   3072165553
+       .long   1068074393
+       .long   223733198
+       .long   1069669653
+       .long   1158528257
+       .long   1067269817
+       .long   3197805108
+       .long   1068357327
+       .long   2510844577
+       .long   1073201695
+       .long   498468876
+       .long   3161098111
+       .long   0
+       .long   0
+       .long   1972895212
+       .long   1068895135
+       .long   3208334872
+       .long   1010638399
+       .long   0
+       .long   1072693248
+       .long   4107853760
+       .long   1065246718
+       .long   2229347510
+       .long   1068905849
+       .long   4172638464
+       .long   1070987323
+       .long   212469442
+       .long   1068364021
+       .long   1989165656
+       .long   1069688852
+       .long   4131454312
+       .long   1067530480
+       .long   3453538591
+       .long   1068469531
+       .long   2667571783
+       .long   1073188827
+       .long   1614402419
+       .long   3163482232
+       .long   0
+       .long   0
+       .long   2354785698
+       .long   1069102779
+       .long   959196066
+       .long   1012432163
+       .long   0
+       .long   1072693248
+       .long   2828230112
+       .long   1065606626
+       .long   3693284264
+       .long   1069118808
+       .long   1996210616
+       .long   1071000265
+       .long   3053541878
+       .long   1068578846
+       .long   1133334569
+       .long   1069711236
+       .long   977677893
+       .long   1067705915
+       .long   347264115
+       .long   1068436198
+       .long   2824298989
+       .long   1073175959
+       .long   2088964722
+       .long   3164313480
+       .long   0
+       .long   0
+       .long   931121154
+       .long   1069310926
+       .long   1121692745
+       .long   3159637885
+       .long   0
+       .long   1072693248
+       .long   709357472
+       .long   1065955296
+       .long   29972165
+       .long   1069333808
+       .long   254360647
+       .long   1071015033
+       .long   3732687627
+       .long   1068729157
+       .long   3224370683
+       .long   1069736900
+       .long   202592779
+       .long   1067887231
+       .long   1420423314
+       .long   1068491719
+       .long   2981026194
+       .long   1073163091
+       .long   924239062
+       .long   1016612139
+       .long   0
+       .long   0
+       .long   982366697
+       .long   1069519640
+       .long   1160213218
+       .long   3158385836
+       .long   0
+       .long   1072693248
+       .long   404678272
+       .long   1066346403
+       .long   1419607756
+       .long   1069549319
+       .long   1800406832
+       .long   1071031665
+       .long   3144361055
+       .long   1068882825
+       .long   1744148040
+       .long   1069765960
+       .long   3211597674
+       .long   1068075289
+       .long   404952187
+       .long   1068609434
+       .long   3137753400
+       .long   1073150223
+       .long   3579918397
+       .long   1015563197
+       .long   0
+       .long   0
+       .long   2242453104
+       .long   1069638253
+       .long   1143545012
+       .long   3159361608
+       .long   0
+       .long   1072693248
+       .long   1016752608
+       .long   1066591110
+       .long   1270001991
+       .long   1069659269
+       .long   1410785275
+       .long   1071050206
+       .long   1103929722
+       .long   1069040275
+       .long   3268015215
+       .long   1069798554
+       .long   957665168
+       .long   1068270980
+       .long   1067662813
+       .long   1068610012
+       .long   3294480606
+       .long   1073137355
+       .long   1489607747
+       .long   3151418907
+       .long   0
+       .long   0
+       .long   1940260416
+       .long   1069743276
+       .long   4144715194
+       .long   1012060053
+       .long   0
+       .long   1072693248
+       .long   1135818128
+       .long   1066829850
+       .long   867512158
+       .long   1069770656
+       .long   3821819258
+       .long   1071070704
+       .long   2890864845
+       .long   1069201948
+       .long   918459419
+       .long   1069834828
+       .long   797472495
+       .long   1068475275
+       .long   4093958433
+       .long   1068635569
+       .long   3451207812
+       .long   1073124487
+       .long   1547135652
+       .long   3163048307
+       .long   0
+       .long   0
+       .long   1959743063
+       .long   1069848682
+       .long   607727474
+       .long   1013558026
+       .long   0
+       .long   1072693248
+       .long   225834432
+       .long   1067090614
+       .long   732340398
+       .long   1069883626
+       .long   3221152670
+       .long   1071093215
+       .long   2810588359
+       .long   1069368307
+       .long   612200458
+       .long   1069874948
+       .long   645427023
+       .long   1068594071
+       .long   1966294363
+       .long   1068694214
+       .long   3607935018
+       .long   1073111619
+       .long   4202814986
+       .long   3164096517
+       .long   0
+       .long   0
+       .long   2429422902
+       .long   1069954505
+       .long   3297515896
+       .long   3160006592
+       .long   0
+       .long   1072693248
+       .long   528565440
+       .long   1067373727
+       .long   2395999282
+       .long   1069998329
+       .long   1512953454
+       .long   1071117799
+       .long   2702142222
+       .long   1069539835
+       .long   3515899576
+       .long   1069919100
+       .long   2767905785
+       .long   1068706391
+       .long   3127207959
+       .long   1068808800
+       .long   3764662223
+       .long   1073098751
+       .long   3105356094
+       .long   1016829101
+       .long   0
+       .long   0
+       .long   1425758568
+       .long   1070060780
+       .long   1224256500
+       .long   1011856982
+       .long   0
+       .long   1072693248
+       .long   2086713664
+       .long   1067564956
+       .long   1688303979
+       .long   1070114921
+       .long   938619730
+       .long   1071144522
+       .long   526120622
+       .long   1069632280
+       .long   3819295667
+       .long   1069967496
+       .long   2059466202
+       .long   1068824653
+       .long   4035080204
+       .long   1068903334
+       .long   3921389429
+       .long   1073085883
+       .long   3647185164
+       .long   1015997122
+       .long   0
+       .long   0
+       .long   3763679576
+       .long   1070167541
+       .long   448465424
+       .long   1009708707
+       .long   0
+       .long   1072693248
+       .long   64931152
+       .long   1067729411
+       .long   3593250320
+       .long   1070233561
+       .long   1127364104
+       .long   1071173457
+       .long   21320967
+       .long   1069723988
+       .long   4036384112
+       .long   1070020367
+       .long   3394693835
+       .long   1068949482
+       .long   4171096556
+       .long   1068939101
+       .long   4078116635
+       .long   1073073015
+       .long   39665264
+       .long   1013608617
+       .long   0
+       .long   0
+       .long   4023957346
+       .long   1070274825
+       .long   2652053984
+       .long   1012417284
+       .long   0
+       .long   1072693248
+       .long   1548193280
+       .long   1067905620
+       .long   2849460080
+       .long   1070354416
+       .long   586099284
+       .long   1071204684
+       .long   2426038050
+       .long   1069819083
+       .long   1209882932
+       .long   1070077962
+       .long   204929667
+       .long   1069081561
+       .long   2951798640
+       .long   1069077118
+       .long   4234843841
+       .long   1073060147
+       .long   1479868884
+       .long   3162614382
+       .long   0
+       .long   0
+       .long   3947580658
+       .long   1070382668
+       .long   4153467944
+       .long   1013228820
+       .long   0
+       .long   1072693248
+       .long   1306970432
+       .long   1068093810
+       .long   3320658510
+       .long   1070477657
+       .long   2638377394
+       .long   1071238289
+       .long   1218095092
+       .long   1069917865
+       .long   506153462
+       .long   1070140566
+       .long   2096772755
+       .long   1069221614
+       .long   2058474785
+       .long   1069148484
+       .long   96603751
+       .long   1073047280
+       .long   2021697954
+       .long   3163879555
+       .long   0
+       .long   0
+       .long   4068253482
+       .long   1070491107
+       .long   3098804354
+       .long   1013932712
+       .long   0
+       .long   1072693248
+       .long   3555466384
+       .long   1068294223
+       .long   3714292293
+       .long   1070599779
+       .long   58004546
+       .long   1071274368
+       .long   2889916307
+       .long   1070020649
+       .long   2725223781
+       .long   1070208483
+       .long   1960889140
+       .long   1069370437
+       .long   2173066945
+       .long   1069259864
+       .long   253330956
+       .long   1073034412
+       .long   991505830
+       .long   1017046064
+       .long   0
+       .long   0
+       .long   1971725998
+       .long   1070598138
+       .long   2628060598
+       .long   1013294571
+       .long   0
+       .long   1072693248
+       .long   3850616508
+       .long   1068503032
+       .long   715485429
+       .long   1070664058
+       .long   2831870887
+       .long   1071313021
+       .long   276112813
+       .long   1070127773
+       .long   4071473622
+       .long   1070282053
+       .long   3678820497
+       .long   1069528889
+       .long   928174949
+       .long   1069392578
+       .long   410058162
+       .long   1073021544
+       .long   4004709614
+       .long   1016250595
+       .long   0
+       .long   0
+       .long   1197423420
+       .long   1070653011
+       .long   176404688
+       .long   1013428940
+       .long   0
+       .long   1072693248
+       .long   3614211808
+       .long   1068615863
+       .long   2638984897
+       .long   1070729808
+       .long   1695604536
+       .long   1071354361
+       .long   2372043566
+       .long   1070239593
+       .long   136909610
+       .long   1070361652
+       .long   3640039434
+       .long   1069622710
+       .long   4088329288
+       .long   1069449448
+       .long   566785368
+       .long   1073008676
+       .long   2301849815
+       .long   1014658654
+       .long   0
+       .long   0
+       .long   1026922473
+       .long   1070708240
+       .long   4275552176
+       .long   1013759157
+       .long   0
+       .long   1072693248
+       .long   865263972
+       .long   1068735226
+       .long   1189261043
+       .long   1070797132
+       .long   602895285
+       .long   1071398507
+       .long   457371263
+       .long   1070356493
+       .long   1846858239
+       .long   1070447677
+       .long   3060498109
+       .long   1069713009
+       .long   4267979072
+       .long   1069596604
+       .long   723512574
+       .long   1072995808
+       .long   2825204233
+       .long   3161855698
+       .long   0
+       .long   0
+       .long   2664093517
+       .long   1070763845
+       .long   3574550848
+       .long   1009790086
+       .long   0
+       .long   1072693248
+       .long   2465054196
+       .long   1068861279
+       .long   3495559184
+       .long   1070866134
+       .long   2180799467
+       .long   1071445588
+       .long   3760731789
+       .long   1070478879
+       .long   3108073741
+       .long   1070540584
+       .long   1955989611
+       .long   1069809654
+       .long   166740423
+       .long   1069654305
+       .long   880239780
+       .long   1072982940
+       .long   4135548218
+       .long   3163662592
+       .long   0
+       .long   0
+       .long   895247324
+       .long   1070819848
+       .long   3063999364
+       .long   3161289029
+       .long   0
+       .long   1072693248
+       .long   729983844
+       .long   1068994194
+       .long   3631919317
+       .long   1070936926
+       .long   2031343772
+       .long   1071495745
+       .long   1505593195
+       .long   1070601643
+       .long   519428998
+       .long   1070618477
+       .long   3710689648
+       .long   1069913254
+       .long   3156018952
+       .long   1069741343
+       .long   1036966986
+       .long   1072970072
+       .long   1122344434
+       .long   3164458061
+       .long   0
+       .long   0
+       .long   1412148370
+       .long   1070876269
+       .long   2689479793
+       .long   3161477235
+       .long   0
+       .long   1072693248
+       .long   1375255072
+       .long   1069134151
+       .long   1493266594
+       .long   1071009624
+       .long   487968719
+       .long   1071549129
+       .long   4010395236
+       .long   1070668994
+       .long   2875570533
+       .long   1070672565
+       .long   2596803931
+       .long   1070024476
+       .long   2843491938
+       .long   1069843051
+       .long   1193694191
+       .long   1072957204
+       .long   1890859349
+       .long   1016467558
+       .long   0
+       .long   0
+       .long   3782220567
+       .long   1070933130
+       .long   2488122455
+       .long   1014753484
+       .long   0
+       .long   1072693248
+       .long   91372748
+       .long   1069281344
+       .long   318776714
+       .long   1071084349
+       .long   1791786485
+       .long   1071605902
+       .long   245863368
+       .long   1070739794
+       .long   3306699314
+       .long   1070730899
+       .long   492155886
+       .long   1070144051
+       .long   504705110
+       .long   1069961586
+       .long   1350421397
+       .long   1072944336
+       .long   1218191675
+       .long   1015274036
+       .long   0
+       .long   0
+       .long   1606100959
+       .long   1070990455
+       .long   3385800912
+       .long   1013630535
+       .long   0
+       .long   1072693248
+       .long   2255302008
+       .long   1069435977
+       .long   54085333
+       .long   1071161229
+       .long   2504974906
+       .long   1071655456
+       .long   4169947836
+       .long   1070814310
+       .long   2891827400
+       .long   1070793803
+       .long   1030744926
+       .long   1070272780
+       .long   2378131433
+       .long   1070036506
+       .long   1507148603
+       .long   1072931468
+       .long   1086374101
+       .long   3160519057
+       .long   0
+       .long   0
+       .long   4158096969
+       .long   1071048265
+       .long   3224523546
+       .long   1013419306
+       .long   0
+       .long   1072693248
+       .long   4240313622
+       .long   1069572894
+       .long   3745046477
+       .long   1071240398
+       .long   1955120038
+       .long   1071687503
+       .long   2661530988
+       .long   1070892836
+       .long   2615081511
+       .long   1070861626
+       .long   3172686013
+       .long   1070411548
+       .long   3468537064
+       .long   1070173373
+       .long   1663875809
+       .long   1072918600
+       .long   3908862373
+       .long   3163337468
+       .long   0
+       .long   0
+       .long   2200768388
+       .long   1071106586
+       .long   302579070
+       .long   3162432935
+       .long   0
+       .long   1072693248
+       .long   2338248308
+       .long   1069657986
+       .long   2617403810
+       .long   1071322000
+       .long   60078074
+       .long   1071721530
+       .long   2753634668
+       .long   1070975684
+       .long   626020947
+       .long   1070934758
+       .long   25846105
+       .long   1070561329
+       .long   1123371528
+       .long   1070307499
+       .long   1820603015
+       .long   1072905732
+       .long   3236194699
+       .long   3164241098
+       .long   0
+       .long   0
+       .long   2528366626
+       .long   1071165441
+       .long   3808697588
+       .long   3160880158
+       .long   0
+       .long   1072693248
+       .long   1938261590
+       .long   1069747146
+       .long   4282399603
+       .long   1071406183
+       .long   1922568281
+       .long   1071757646
+       .long   2428166646
+       .long   1071063193
+       .long   717464826
+       .long   1071013623
+       .long   2205664064
+       .long   1070659645
+       .long   1525962144
+       .long   1070438229
+       .long   1977330220
+       .long   1072892864
+       .long   4071976381
+       .long   1016684520
+       .long   0
+       .long   0
+       .long   2390846448
+       .long   1071224856
+       .long   3510510824
+       .long   1014225707
+       .long   0
+       .long   1072693248
+       .long   1208409702
+       .long   1069840505
+       .long   1006199412
+       .long   1071493107
+       .long   2504246873
+       .long   1071795971
+       .long   1040653613
+       .long   1071155729
+       .long   1713268218
+       .long   1071098686
+       .long   462276291
+       .long   1070747214
+       .long   4239134769
+       .long   1070603989
+       .long   2134057426
+       .long   1072879996
+       .long   1285458442
+       .long   1015707961
+       .long   0
+       .long   0
+       .long   2583490354
+       .long   1071284857
+       .long   27154665
+       .long   1014008337
+       .long   0
+       .long   1072693248
+       .long   2550940470
+       .long   1069938201
+       .long   2616040293
+       .long   1071582937
+       .long   2529278955
+       .long   1071836633
+       .long   2244405849
+       .long   1071253687
+       .long   2064814125
+       .long   1071190460
+       .long   1527853242
+       .long   1070842074
+       .long   354304617
+       .long   1070708112
+       .long   2290784632
+       .long   1072867128
+       .long   2660353234
+       .long   1011979525
+       .long   0
+       .long   0
+       .long   3368427099
+       .long   1071345471
+       .long   2187847358
+       .long   3161070788
+       .long   0
+       .long   1072693248
+       .long   1708021028
+       .long   1070040382
+       .long   459972195
+       .long   1071660262
+       .long   3210514347
+       .long   1071879770
+       .long   955408873
+       .long   1071357497
+       .long   1911386086
+       .long   1071289511
+       .long   3563284025
+       .long   1070944951
+       .long   547392146
+       .long   1070790031
+       .long   2447511838
+       .long   1072854260
+       .long   3841595606
+       .long   3162903543
+       .long   0
+       .long   0
+       .long   408840118
+       .long   1071406727
+       .long   4048150272
+       .long   1011870625
+       .long   0
+       .long   1072693248
+       .long   2794370512
+       .long   1070147203
+       .long   1550993351
+       .long   1071708355
+       .long   1305093678
+       .long   1071925532
+       .long   1748211158
+       .long   1071467623
+       .long   3244212116
+       .long   1071396455
+       .long   2145665988
+       .long   1071056651
+       .long   1098394636
+       .long   1070891096
+       .long   2604239044
+       .long   1072841392
+       .long   1055077667
+       .long   3164024136
+       .long   0
+       .long   0
+       .long   2191706112
+       .long   1071468652
+       .long   333457838
+       .long   1013847700
+       .long   0
+       .long   1072693248
+       .long   3435408456
+       .long   1070258830
+       .long   487319719
+       .long   1071758184
+       .long   1713711059
+       .long   1071974079
+       .long   130753286
+       .long   1071584571
+       .long   909725129
+       .long   1071511974
+       .long   2762442355
+       .long   1071178067
+       .long   932699057
+       .long   1071027067
+       .long   2760966249
+       .long   1072828524
+       .long   1958126117
+       .long   1016901483
+       .long   0
+       .long   0
+       .long   220675706
+       .long   1071531278
+       .long   3158460941
+       .long   1014240139
+       .long   0
+       .long   1072693248
+       .long   1565030890
+       .long   1070375439
+       .long   335263687
+       .long   1071809854
+       .long   419816567
+       .long   1072025586
+       .long   2098048102
+       .long   1071676780
+       .long   257229334
+       .long   1071636821
+       .long   3464457175
+       .long   1071310192
+       .long   2745951745
+       .long   1071158056
+       .long   2917693455
+       .long   1072815656
+       .long   676362605
+       .long   1016106015
+       .long   0
+       .long   0
+       .long   3649427950
+       .long   1071594634
+       .long   4113913432
+       .long   1011178545
+       .long   0
+       .long   1072693248
+       .long   2424145432
+       .long   1070497215
+       .long   2715404890
+       .long   1071863477
+       .long   2238283673
+       .long   1072080240
+       .long   1186867211
+       .long   1071742923
+       .long   660318792
+       .long   1071708248
+       .long   2091427899
+       .long   1071454132
+       .long   2591062578
+       .long   1071291190
+       .long   3074420661
+       .long   1072802788
+       .long   1873363667
+       .long   1014080331
+       .long   0
+       .long   0
+       .long   2606398711
+       .long   1071651713
+       .long   2533078623
+       .long   1015070425
+       .long   0
+       .long   1072693248
+       .long   2151361100
+       .long   1070610226
+       .long   1532348096
+       .long   1071919174
+       .long   408604530
+       .long   1072138246
+       .long   1039538740
+       .long   1071813375
+       .long   1234598850
+       .long   1071781284
+       .long   692507560
+       .long   1071611119
+       .long   4090315823
+       .long   1071451983
+       .long   3231147867
+       .long   1072789920
+       .long   3253690381
+       .long   3162434021
+       .long   0
+       .long   0
+       .long   1505561933
+       .long   1071684172
+       .long   2813788960
+       .long   3158646164
+       .long   0
+       .long   1072693248
+       .long   2997217365
+       .long   1070676584
+       .long   2681788575
+       .long   1071977071
+       .long   3989126937
+       .long   1072199822
+       .long   1049115510
+       .long   1071888491
+       .long   511642057
+       .long   1071860360
+       .long   4034728042
+       .long   1071713598
+       .long   1788921063
+       .long   1071639550
+       .long   3387875073
+       .long   1072777052
+       .long   3168927931
+       .long   3163807173
+       .long   0
+       .long   0
+       .long   419968236
+       .long   1071717047
+       .long   131821922
+       .long   3163445114
+       .long   0
+       .long   1072693248
+       .long   2960267235
+       .long   1070745841
+       .long   1037049094
+       .long   1072037305
+       .long   1447436626
+       .long   1072265209
+       .long   3197232138
+       .long   1071968658
+       .long   4004685083
+       .long   1071946034
+       .long   1412816411
+       .long   1071807280
+       .long   3184767140
+       .long   1071740610
+       .long   3544602278
+       .long   1072764184
+       .long   4139243149
+       .long   1017118445
+       .long   0
+       .long   0
+       .long   4270735453
+       .long   1071750355
+       .long   3565353881
+       .long   3162826177
+       .long   0
+       .long   1072693248
+       .long   2915760230
+       .long   1070818115
+       .long   638580392
+       .long   1072100020
+       .long   2252948193
+       .long   1072334663
+       .long   1194731830
+       .long   1072054301
+       .long   1353002943
+       .long   1072038927
+       .long   422364777
+       .long   1071909798
+       .long   3669605864
+       .long   1071842023
+       .long   3701329484
+       .long   1072751316
+       .long   2857479637
+       .long   1016322977
+       .long   0
+       .long   0
+       .long   4010047525
+       .long   1071784117
+       .long   3339961616
+       .long   1012589046
+       .long   0
+       .long   1072693248
+       .long   966450668
+       .long   1070893532
+       .long   803989702
+       .long   1072165371
+       .long   1934453966
+       .long   1072408465
+       .long   1455077850
+       .long   1072145882
+       .long   2709264343
+       .long   1072139721
+       .long   1918064545
+       .long   1072022114
+       .long   1476733491
+       .long   1071960574
+       .long   3858056690
+       .long   1072738448
+       .long   2007897202
+       .long   1014948181
+       .long   0
+       .long   0
+       .long   2591355529
+       .long   1071818352
+       .long   2351346752
+       .long   1014424505
+       .long   0
+       .long   1072693248
+       .long   3206845590
+       .long   1070972224
+       .long   4023349050
+       .long   1072233523
+       .long   3838822434
+       .long   1072486918
+       .long   3122427157
+       .long   1072243909
+       .long   2261703628
+       .long   1072249178
+       .long   1764870085
+       .long   1072145307
+       .long   3201774398
+       .long   1072093301
+       .long   4014783896
+       .long   1072725580
+       .long   3119156846
+       .long   3161566171
+       .long   0
+       .long   0
+       .long   2298773501
+       .long   1071853080
+       .long   4027796943
+       .long   3162574088
+       .long   0
+       .long   1072693248
+       .long   312748411
+       .long   1071054335
+       .long   2723913091
+       .long   1072304655
+       .long   3207063211
+       .long   1072570353
+       .long   1845780128
+       .long   1072348940
+       .long   752659336
+       .long   1072368142
+       .long   1097207438
+       .long   1072280589
+       .long   407427378
+       .long   1072246732
+       .long   4171511102
+       .long   1072712712
+       .long   987810900
+       .long   3163590211
+       .long   0
+       .long   0
+       .long   681498355
+       .long   1071888323
+       .long   3542613740
+       .long   3163311347
+       .long   0
+       .long   1072693248
+       .long   168222332
+       .long   1071140014
+       .long   776736583
+       .long   1072378956
+       .long   2405401100
+       .long   1072659128
+       .long   430546584
+       .long   1072461586
+       .long   2974083787
+       .long   1072497552
+       .long   849442051
+       .long   1072429322
+       .long   2727422945
+       .long   1072409680
+       .long   33271012
+       .long   1072699845
+       .long   2269574412
+       .long   3164385679
+       .long   0
+       .long   0
+       .long   3684492763
+       .long   1071924102
+       .long   2905877726
+       .long   3163193209
+       .long   0
+       .long   1072693248
+       .long   585640690
+       .long   1071229422
+       .long   1068301595
+       .long   1072456629
+       .long   2953900489
+       .long   1072723440
+       .long   950237889
+       .long   1072582519
+       .long   109735426
+       .long   1072638455
+       .long   792610960
+       .long   1072593041
+       .long   2904161704
+       .long   1072594405
+       .long   379996435
+       .long   1072680706
+       .long   2807708551
+       .long   3162614199
+       .long   0
+       .long   0
+       .long   142288477
+       .long   1071960443
+       .long   1256321232
+       .long   3162016428
+       .long   0
+       .long   1072693248
+       .long   925074332
+       .long   1071322730
+       .long   2134728327
+       .long   1072537893
+       .long   1886408555
+       .long   1072773770
+       .long   101893267
+       .long   1072702864
+       .long   2020085224
+       .long   1072742631
+       .long   2955803851
+       .long   1072733362
+       .long   343310803
+       .long   1072748161
+       .long   693450846
+       .long   1072654970
+       .long   3218699017
+       .long   1015418799
+       .long   0
+       .long   0
+       .long   716700048
+       .long   1071997368
+       .long   1043856658
+       .long   1015522810
+       .long   0
+       .long   1072693248
+       .long   1097907398
+       .long   1071420120
+       .long   3912524876
+       .long   1072622983
+       .long   4107784306
+       .long   1072827408
+       .long   937056065
+       .long   1072772766
+       .long   4128945134
+       .long   1072826390
+       .long   1032262383
+       .long   1072832917
+       .long   1825923576
+       .long   1072864423
+       .long   1006905258
+       .long   1072629234
+       .long   3348558652
+       .long   3159471942
+       .long   0
+       .long   0
+       .long   3841229102
+       .long   1072034903
+       .long   1782837269
+       .long   1016032992
+       .long   0
+       .long   1072693248
+       .long   866896685
+       .long   1071521786
+       .long   2743435231
+       .long   1072702700
+       .long   3017984361
+       .long   1072884608
+       .long   1491919678
+       .long   1072848040
+       .long   1507535811
+       .long   1072917857
+       .long   1966124961
+       .long   1072942914
+       .long   381628626
+       .long   1072992589
+       .long   1320359670
+       .long   1072603498
+       .long   1908355032
+       .long   3163192705
+       .long   0
+       .long   0
+       .long   343219638
+       .long   1072073077
+       .long   2238302242
+       .long   1014248160
+       .long   0
+       .long   1072693248
+       .long   3768132253
+       .long   1071627934
+       .long   3895546569
+       .long   1072749460
+       .long   1613056473
+       .long   1072945645
+       .long   3409294908
+       .long   1072929183
+       .long   3138966349
+       .long   1073017844
+       .long   3799067273
+       .long   1073064607
+       .long   359470462
+       .long   1073133087
+       .long   1633814081
+       .long   1072577762
+       .long   3941137777
+       .long   1014659019
+       .long   0
+       .long   0
+       .long   3860971117
+       .long   1072111915
+       .long   2891637204
+       .long   1015730508
+       .long   0
+       .long   1073741824
+       .long   80822128
+       .long   3219034205
+       .long   2077635078
+       .long   1072798543
+       .long   1552870456
+       .long   1073010820
+       .long   3607700650
+       .long   1073016746
+       .long   249538440
+       .long   1073127265
+       .long   2233833066
+       .long   1073199420
+       .long   2436428201
+       .long   1073293556
+       .long   1947268493
+       .long   1072552026
+       .long   1185916272
+       .long   3161855333
+       .long   0
+       .long   0
+       .long   3978924239
+       .long   1072151449
+       .long   680748782
+       .long   3163204529
+       .long   0
+       .long   1073741824
+       .long   3528982175
+       .long   3218918413
+       .long   3018376188
+       .long   1072850106
+       .long   2093086652
+       .long   1073080463
+       .long   451029217
+       .long   1073111339
+       .long   1097121536
+       .long   1073247142
+       .long   2277789226
+       .long   1073348969
+       .long   149166906
+       .long   1073478822
+       .long   2260722904
+       .long   1072526290
+       .long   3285965784
+       .long   1015852724
+       .long   0
+       .long   0
+       .long   997287281
+       .long   1072191710
+       .long   3612277486
+       .long   1015833408
+       .long   0
+       .long   1073741824
+       .long   3037674984
+       .long   3218797431
+       .long   2624215131
+       .long   1072904321
+       .long   464779768
+       .long   1073154936
+       .long   3700763630
+       .long   1073213636
+       .long   1200926910
+       .long   1073378628
+       .long   2934576429
+       .long   1073515096
+       .long   3287041855
+       .long   1073681673
+       .long   2574177316
+       .long   1072500554
+       .long   2889755040
+       .long   1013031024
+       .long   0
+       .long   0
+       .long   2079874795
+       .long   1072232729
+       .long   1885505696
+       .long   3161954077
+       .long   0
+       .long   1073741824
+       .long   1656469901
+       .long   3218670989
+       .long   823761676
+       .long   1072961373
+       .long   2491445454
+       .long   1073234634
+       .long   1584341555
+       .long   1073324391
+       .long   1976688438
+       .long   1073523018
+       .long   3918313340
+       .long   1073699902
+       .long   3178717687
+       .long   1073829019
+       .long   2887631728
+       .long   1072474818
+       .long   1841088264
+       .long   3162758780
+       .long   0
+       .long   0
+       .long   258163604
+       .long   1072274542
+       .long   3299923807
+       .long   1015128357
+       .long   0
+       .long   1073741824
+       .long   2865277319
+       .long   3218538798
+       .long   3110066496
+       .long   1073021461
+       .long   723074889
+       .long   1073319994
+       .long   1618819009
+       .long   1073444438
+       .long   1176243936
+       .long   1073681775
+       .long   1223848987
+       .long   1073823806
+       .long   2369274010
+       .long   1073957581
+       .long   3201086139
+       .long   1072449082
+       .long   4185319304
+       .long   1015274218
+       .long   0
+       .long   0
+       .long   719595600
+       .long   1072317184
+       .long   114895218
+       .long   3162143748
+       .long   0
+       .long   1073741824
+       .long   3811788216
+       .long   3218400550
+       .long   1264738948
+       .long   1073084804
+       .long   1958933439
+       .long   1073411493
+       .long   4246310163
+       .long   1073574708
+       .long   1367842247
+       .long   1073799186
+       .long   4112596162
+       .long   1073938662
+       .long   2100954442
+       .long   1074105254
+       .long   3514540551
+       .long   1072423346
+       .long   2102765473
+       .long   3160518326
+       .long   0
+       .long   0
+       .long   4189730214
+       .long   1072360693
+       .long   873070368
+       .long   1011168520
+       .long   0
+       .long   1073741824
+       .long   760634709
+       .long   3218255915
+       .long   2067827628
+       .long   1073151636
+       .long   1386756408
+       .long   1073509659
+       .long   404552634
+       .long   1073716242
+       .long   1143062645
+       .long   1073895515
+       .long   555342321
+       .long   1074067009
+       .long   3470170865
+       .long   1074271418
+       .long   3827994963
+       .long   1072397610
+       .long   941734744
+       .long   3163337286
+       .long   0
+       .long   0
+       .long   3247184626
+       .long   1072405111
+       .long   1245412628
+       .long   1014426137
+       .long   0
+       .long   1073741824
+       .long   2381906911
+       .long   3218104536
+       .long   1010924947
+       .long   1073222214
+       .long   2481381005
+       .long   1073615072
+       .long   1356661294
+       .long   1073806011
+       .long   1527070582
+       .long   1074001844
+       .long   3061693388
+       .long   1074210655
+       .long   1993183195
+       .long   1074463435
+       .long   4141449374
+       .long   1072371874
+       .long   1579411055
+       .long   1014369858
+       .long   0
+       .long   0
+       .long   166164867
+       .long   1072450480
+       .long   2304058808
+       .long   3159574198
+       .long   0
+       .long   1073741824
+       .long   2798667120
+       .long   3217812323
+       .long   4203596829
+       .long   1073296815
+       .long   1473339147
+       .long   1073728374
+       .long   4243021652
+       .long   1073889850
+       .long   1638747017
+       .long   1074119375
+       .long   1512673096
+       .long   1074371687
+       .long   2338684787
+       .long   1074678259
+       .long   159936490
+       .long   1072346139
+       .long   3547642993
+       .long   3162144494
+       .long   0
+       .long   0
+       .long   3342355758
+       .long   1072496843
+       .long   1667048854
+       .long   1014547708
+       .long   0
+       .long   1073741824
+       .long   2271288998
+       .long   3217480250
+       .long   4111284847
+       .long   1073375744
+       .long   2796272966
+       .long   1073796048
+       .long   1730314448
+       .long   1073981280
+       .long   1813001552
+       .long   1074249474
+       .long   603251414
+       .long   1074552509
+       .long   3079042420
+       .long   1074856525
+       .long   473390901
+       .long   1072320403
+       .long   4252586071
+       .long   1015708143
+       .long   0
+       .long   0
+       .long   2308259791
+       .long   1072544250
+       .long   4116261952
+       .long   1009282152
+       .long   0
+       .long   1073741824
+       .long   411343470
+       .long   3217132228
+       .long   3760686807
+       .long   1073459331
+       .long   4171367426
+       .long   1073861688
+       .long   1878500541
+       .long   1074081117
+       .long   108767834
+       .long   1074393698
+       .long   2824899539
+       .long   1074755901
+       .long   3321235986
+       .long   1074997439
+       .long   786845313
+       .long   1072294667
+       .long   627570489
+       .long   1011980987
+       .long   0
+       .long   0
+       .long   2949191430
+       .long   1072592750
+       .long   3989207545
+       .long   1015613028
+       .long   0
+       .long   1073741824
+       .long   2909112164
+       .long   3216503445
+       .long   3682557528
+       .long   1073547937
+       .long   4184421718
+       .long   1073932454
+       .long   380803270
+       .long   1074190282
+       .long   3399744364
+       .long   1074553823
+       .long   3842864947
+       .long   1074887742
+       .long   748075417
+       .long   1075157395
+       .long   1100299725
+       .long   1072268931
+       .long   874467977
+       .long   3162903361
+       .long   0
+       .long   0
+       .long   2668510354
+       .long   1072642397
+       .long   1701265160
+       .long   3159690220
+       .long   0
+       .long   1073741824
+       .long   1404962112
+       .long   3215492924
+       .long   3327263454
+       .long   1073641957
+       .long   1987673213
+       .long   1074008829
+       .long   231222583
+       .long   1074309811
+       .long   1756671652
+       .long   1074731884
+       .long   3921518313
+       .long   1075017100
+       .long   2691193077
+       .long   1075341426
+       .long   1413754136
+       .long   1072243195
+       .long   856972295
+       .long   1015129638
+       .long   0
+       .long   1072693248
+       .long   3072795147
+       .long   3218177217
+       .long   2531204756
+       .long   1014677625
+       .long   0
+       .long   1071644672
+       .long   573338107
+       .long   3216966390
+       .long   1757081539
+       .long   3216009405
+       .long   1043378852
+       .long   1067696161
+       .long   2698850995
+       .long   3213513876
+       .long   495882814
+       .long   1064911053
+       .long   3842541443
+       .long   3210988571
+       .long   2725665262
+       .long   1061135526
+       .long   1727208548
+       .long   1072217459
+       .long   2531251621
+       .long   3161096649
+       .long   0
+       .long   1072693248
+       .long   963359913
+       .long   3218157757
+       .long   2464811394
+       .long   1013284229
+       .long   0
+       .long   1071644672
+       .long   1498613974
+       .long   3216992493
+       .long   4138103782
+       .long   3215985771
+       .long   2840947366
+       .long   1067675293
+       .long   209537977
+       .long   3213463826
+       .long   3590357530
+       .long   1064864171
+       .long   73959547
+       .long   3210940132
+       .long   1511606549
+       .long   1062390487
+       .long   2040662960
+       .long   1072191723
+       .long   4270081753
+       .long   3163481866
+       .long   0
+       .long   1072693248
+       .long   4002124759
+       .long   3218138375
+       .long   3453342566
+       .long   3160907529
+       .long   0
+       .long   1071644672
+       .long   774562305
+       .long   3217018021
+       .long   377617675
+       .long   3215942442
+       .long   2495478050
+       .long   1067655031
+       .long   1508050213
+       .long   3213415186
+       .long   1921336534
+       .long   1064819067
+       .long   975923672
+       .long   3210893594
+       .long   2289965811
+       .long   1060505011
+       .long   2354117371
+       .long   1072165987
+       .long   3512651629
+       .long   1014080696
+       .long   0
+       .long   1072693248
+       .long   373017919
+       .long   3218119072
+       .long   3647199073
+       .long   3162144529
+       .long   0
+       .long   1070596096
+       .long   933359764
+       .long   1069535705
+       .long   1391441088
+       .long   3215896667
+       .long   53106651
+       .long   1067635358
+       .long   4157835043
+       .long   3213367904
+       .long   4055868050
+       .long   1064775611
+       .long   1529330423
+       .long   3210848884
+       .long   325278885
+       .long   1062325273
+       .long   2667571783
+       .long   1072140251
+       .long   1614402419
+       .long   3162433656
+       .long   0
+       .long   1072693248
+       .long   4148643959
+       .long   3218099843
+       .long   2887822595
+       .long   3161698583
+       .long   0
+       .long   1070596096
+       .long   4101770849
+       .long   1069511300
+       .long   1167052501
+       .long   3215851606
+       .long   2569727718
+       .long   1067616256
+       .long   1681502493
+       .long   3213321931
+       .long   3685967947
+       .long   1064733780
+       .long   2973319847
+       .long   3210805911
+       .long   472683240
+       .long   1062549181
+       .long   2981026194
+       .long   1072114515
+       .long   924239062
+       .long   1015563563
+       .long   0
+       .long   1072693248
+       .long   3747221382
+       .long   3218080689
+       .long   1912303920
+       .long   3161550059
+       .long   0
+       .long   1070596096
+       .long   1727686788
+       .long   1069487445
+       .long   681802874
+       .long   3215807238
+       .long   2531789465
+       .long   1067597711
+       .long   331202638
+       .long   3213277217
+       .long   2627596737
+       .long   1064693515
+       .long   566979211
+       .long   3210764596
+       .long   2424396143
+       .long   1061741710
+       .long   3294480606
+       .long   1072088779
+       .long   1489607747
+       .long   3150370331
+       .long   0
+       .long   1072693248
+       .long   1167858038
+       .long   3218043472
+       .long   2180016084
+       .long   3158357424
+       .long   0
+       .long   1070596096
+       .long   772792549
+       .long   1069464130
+       .long   3356872770
+       .long   3215763542
+       .long   3524844777
+       .long   1067579707
+       .long   1521756467
+       .long   3213233715
+       .long   3931969740
+       .long   1064654734
+       .long   2908114613
+       .long   3210710011
+       .long   3523476919
+       .long   1061374592
+       .long   3607935018
+       .long   1072063043
+       .long   4202814986
+       .long   3163047941
+       .long   0
+       .long   1072693248
+       .long   955408364
+       .long   3218005450
+       .long   2659929740
+       .long   1013295819
+       .long   0
+       .long   1070596096
+       .long   659174847
+       .long   1069441347
+       .long   2081794994
+       .long   3215720500
+       .long   2956616392
+       .long   1067562230
+       .long   1461867065
+       .long   3213191381
+       .long   879427918
+       .long   1064617384
+       .long   209598599
+       .long   3210633576
+       .long   60948554
+       .long   1061529630
+       .long   3921389429
+       .long   1072037307
+       .long   3647185164
+       .long   1014948546
+       .long   0
+       .long   1072693248
+       .long   1526324265
+       .long   3217967566
+       .long   4056331296
+       .long   1010311990
+       .long   0
+       .long   1070596096
+       .long   1830915900
+       .long   1069419088
+       .long   602185706
+       .long   3215678092
+       .long   555210277
+       .long   1067545266
+       .long   3690136761
+       .long   3213150171
+       .long   4115917121
+       .long   1064581405
+       .long   589230607
+       .long   3210560017
+       .long   3446641745
+       .long   1062382364
+       .long   4234843841
+       .long   1072011571
+       .long   1479868884
+       .long   3161565806
+       .long   0
+       .long   1072693248
+       .long   2049842017
+       .long   3217929817
+       .long   2491067243
+       .long   1013757722
+       .long   0
+       .long   1070596096
+       .long   1431833764
+       .long   1069397346
+       .long   551048935
+       .long   3215636299
+       .long   2575917112
+       .long   1067528800
+       .long   1559777140
+       .long   3213110045
+       .long   743322344
+       .long   1064546764
+       .long   1974991822
+       .long   3210489213
+       .long   3456487690
+       .long   1062460308
+       .long   253330956
+       .long   1071985836
+       .long   991505830
+       .long   1015997488
+       .long   0
+       .long   1072693248
+       .long   1894214069
+       .long   3217892200
+       .long   2182661104
+       .long   3159506151
+       .long   0
+       .long   1070596096
+       .long   1869133310
+       .long   1069376113
+       .long   1368144043
+       .long   3215595103
+       .long   242783364
+       .long   1067512821
+       .long   3692616565
+       .long   3213070961
+       .long   2890683542
+       .long   1064513419
+       .long   2407947192
+       .long   3210421028
+       .long   3811448635
+       .long   1060561671
+       .long   566785368
+       .long   1071960100
+       .long   2301849815
+       .long   1013610078
+       .long   0
+       .long   1072693248
+       .long   620845047
+       .long   3217854712
+       .long   314567190
+       .long   3160767875
+       .long   0
+       .long   1070596096
+       .long   2198158867
+       .long   1069355382
+       .long   222370857
+       .long   3215554487
+       .long   4028822361
+       .long   1067497314
+       .long   3610397327
+       .long   3213032882
+       .long   171354848
+       .long   1064481283
+       .long   693369877
+       .long   3210355362
+       .long   164303632
+       .long   1061632559
+       .long   880239780
+       .long   1071934364
+       .long   4135548218
+       .long   3162614016
+       .long   0
+       .long   1072693248
+       .long   2273547475
+       .long   3217817349
+       .long   4162051772
+       .long   3158862098
+       .long   0
+       .long   1070596096
+       .long   2392983423
+       .long   1069335146
+       .long   526970473
+       .long   3215514433
+       .long   628322840
+       .long   1067482270
+       .long   924033682
+       .long   3212995771
+       .long   854746898
+       .long   1064450346
+       .long   4004963123
+       .long   3210292086
+       .long   1474471147
+       .long   1060747995
+       .long   1193694191
+       .long   1071908628
+       .long   1890859349
+       .long   1015418982
+       .long   0
+       .long   1072693248
+       .long   2488075121
+       .long   3217780109
+       .long   1856288899
+       .long   1013767581
+       .long   0
+       .long   1070596096
+       .long   3322930631
+       .long   1069315398
+       .long   3277607933
+       .long   3215474924
+       .long   130253043
+       .long   1067467675
+       .long   1057196725
+       .long   3212959591
+       .long   3278604843
+       .long   1064420531
+       .long   4197429676
+       .long   3210231108
+       .long   1627850508
+       .long   1062399550
+       .long   1507148603
+       .long   1071882892
+       .long   1086374101
+       .long   3159470481
+       .long   0
+       .long   1072693248
+       .long   1371601499
+       .long   3217742989
+       .long   3050542164
+       .long   3159667536
+       .long   0
+       .long   1070596096
+       .long   2434996648
+       .long   1069296132
+       .long   2688049294
+       .long   3215435945
+       .long   1586964757
+       .long   1067453518
+       .long   2102156419
+       .long   3212924308
+       .long   2974407249
+       .long   1064391847
+       .long   249545848
+       .long   3210172310
+       .long   118754132
+       .long   1061128535
+       .long   1820603015
+       .long   1071857156
+       .long   3236194699
+       .long   3163192522
+       .long   0
+       .long   1072693248
+       .long   3497432648
+       .long   3217705985
+       .long   3403982176
+       .long   3159219350
+       .long   0
+       .long   1070596096
+       .long   2322009458
+       .long   1069277341
+       .long   3303184211
+       .long   3215397479
+       .long   3079386980
+       .long   1067429210
+       .long   3158396776
+       .long   3212889889
+       .long   500122468
+       .long   1064364204
+       .long   3226667041
+       .long   3210115604
+       .long   1839377740
+       .long   1062167069
+       .long   2134057426
+       .long   1071831420
+       .long   1285458442
+       .long   1014659385
+       .long   0
+       .long   1072693248
+       .long   719981842
+       .long   3217669096
+       .long   3396799415
+       .long   1013109014
+       .long   0
+       .long   1070596096
+       .long   2111724540
+       .long   1069259019
+       .long   2754706540
+       .long   3215359511
+       .long   790037588
+       .long   1067402587
+       .long   4097286835
+       .long   3212856302
+       .long   2918356813
+       .long   1064337614
+       .long   980543884
+       .long   3210060878
+       .long   1759882364
+       .long   3204685716
+       .long   2447511838
+       .long   1071805684
+       .long   3841595606
+       .long   3161854967
+       .long   0
+       .long   1072693248
+       .long   2234510834
+       .long   3217632317
+       .long   1077830624
+       .long   3156276711
+       .long   0
+       .long   1070596096
+       .long   1741599179
+       .long   1069241160
+       .long   288887764
+       .long   3215322026
+       .long   438316229
+       .long   1067376778
+       .long   2074161178
+       .long   3212810170
+       .long   2132352512
+       .long   1064311981
+       .long   321000190
+       .long   3210008077
+       .long   2574541397
+       .long   1061549566
+       .long   2760966249
+       .long   1071779948
+       .long   1958126117
+       .long   1015852907
+       .long   0
+       .long   1072693248
+       .long   212483252
+       .long   3217595647
+       .long   3496985358
+       .long   1013615952
+       .long   0
+       .long   1070596096
+       .long   1939348811
+       .long   1069223758
+       .long   1001569645
+       .long   3215285008
+       .long   764537997
+       .long   1067351764
+       .long   2326690580
+       .long   3212746141
+       .long   60750538
+       .long   1064270005
+       .long   2745665118
+       .long   3209957083
+       .long   1586280401
+       .long   1060807371
+       .long   3074420661
+       .long   1071754212
+       .long   1873363667
+       .long   1013031755
+       .long   0
+       .long   1072693248
+       .long   4156511795
+       .long   3217559081
+       .long   1791782369
+       .long   3160930544
+       .long   0
+       .long   1070596096
+       .long   4204226438
+       .long   1069206807
+       .long   2895376501
+       .long   3215248443
+       .long   3600185398
+       .long   1067327526
+       .long   2087275384
+       .long   3212683597
+       .long   347703885
+       .long   1064222543
+       .long   301495371
+       .long   3209907826
+       .long   876688468
+       .long   3206713553
+       .long   3387875073
+       .long   1071728476
+       .long   3168927931
+       .long   3162758597
+       .long   0
+       .long   1072693248
+       .long   2240974125
+       .long   3217522619
+       .long   3786179077
+       .long   1012998644
+       .long   0
+       .long   1070596096
+       .long   2199065489
+       .long   1069190303
+       .long   1118792048
+       .long   3215212318
+       .long   875809397
+       .long   1067304048
+       .long   2927616918
+       .long   3212622482
+       .long   3494337727
+       .long   1064176822
+       .long   4219965681
+       .long   3209860241
+       .long   4249954841
+       .long   1060574506
+       .long   3701329484
+       .long   1071702740
+       .long   2857479637
+       .long   1015274401
+       .long   0
+       .long   1072693248
+       .long   4257115870
+       .long   3217486256
+       .long   39728399
+       .long   3160493923
+       .long   0
+       .long   1070596096
+       .long   3207767847
+       .long   1069174239
+       .long   797077063
+       .long   3215176618
+       .long   287980713
+       .long   1067281311
+       .long   1596666478
+       .long   3212562743
+       .long   2775364
+       .long   1064132847
+       .long   3823518214
+       .long   3209814240
+       .long   3101392498
+       .long   1060290467
+       .long   4014783896
+       .long   1071677004
+       .long   3119156846
+       .long   3160517595
+       .long   0
+       .long   1072693248
+       .long   2953879462
+       .long   3217449991
+       .long   651182982
+       .long   3159737324
+       .long   0
+       .long   1070596096
+       .long   2348802841
+       .long   1069158611
+       .long   4095204310
+       .long   3215141329
+       .long   3730066556
+       .long   1067259298
+       .long   2541564470
+       .long   3212504327
+       .long   1012137407
+       .long   1064090541
+       .long   3007493349
+       .long   3209769752
+       .long   304719606
+       .long   1058732349
+       .long   33271012
+       .long   1071651269
+       .long   2269574412
+       .long   3163337103
+       .long   0
+       .long   1072693248
+       .long   4098310206
+       .long   3217413820
+       .long   678867490
+       .long   1013738598
+       .long   0
+       .long   1070596096
+       .long   4033975882
+       .long   1069143413
+       .long   1577500332
+       .long   3215106440
+       .long   2904242360
+       .long   1067237995
+       .long   383406633
+       .long   3212447185
+       .long   511745182
+       .long   1064049810
+       .long   3472404602
+       .long   3209726723
+       .long   3493824410
+       .long   1061932631
+       .long   693450846
+       .long   1071606394
+       .long   3218699017
+       .long   1014370223
+       .long   0
+       .long   1072693248
+       .long   701484222
+       .long   3217377742
+       .long   1189134796
+       .long   1013549080
+       .long   0
+       .long   1070596096
+       .long   478132658
+       .long   1069128642
+       .long   2223654597
+       .long   3215071936
+       .long   706118045
+       .long   1067217386
+       .long   1066336370
+       .long   3212391267
+       .long   3310393795
+       .long   1064010705
+       .long   1920669086
+       .long   3209678984
+       .long   1209448644
+       .long   3206743753
+       .long   1320359670
+       .long   1071554922
+       .long   1908355032
+       .long   3162144129
+       .long   0
+       .long   1072693248
+       .long   3079104278
+       .long   3217341752
+       .long   2593237472
+       .long   3159688198
+       .long   0
+       .long   1070596096
+       .long   1749059456
+       .long   1069114291
+       .long   3316773722
+       .long   3215037805
+       .long   2555119580
+       .long   1067197455
+       .long   59306268
+       .long   3212336527
+       .long   1944001738
+       .long   1063973040
+       .long   3607966944
+       .long   3209598336
+       .long   1548002341
+       .long   1061515569
+       .long   1947268493
+       .long   1071503450
+       .long   1185916272
+       .long   3160806757
+       .long   0
+       .long   1072693248
+       .long   192708373
+       .long   3217305850
+       .long   1013564964
+       .long   3160609117
+       .long   0
+       .long   1070596096
+       .long   1393443609
+       .long   1069100357
+       .long   3282624502
+       .long   3215004035
+       .long   3423023493
+       .long   1067178189
+       .long   3539283610
+       .long   3212282918
+       .long   1358653293
+       .long   1063936902
+       .long   1383848795
+       .long   3209520160
+       .long   1170879540
+       .long   3207439782
+       .long   2574177316
+       .long   1071451978
+       .long   2889755040
+       .long   1011982448
+       .long   0
+       .long   1072693248
+       .long   2595342993
+       .long   3217270031
+       .long   1222182906
+       .long   3159411259
+       .long   0
+       .long   1070596096
+       .long   2192927435
+       .long   1069086835
+       .long   1645422722
+       .long   3214970614
+       .long   648269084
+       .long   1067159575
+       .long   2319737250
+       .long   3212230398
+       .long   1121494038
+       .long   1063902126
+       .long   897314833
+       .long   3209444434
+       .long   2659165416
+       .long   1060259181
+       .long   3201086139
+       .long   1071400506
+       .long   4185319304
+       .long   1014225642
+       .long   0
+       .long   1072693248
+       .long   3772940467
+       .long   3217234294
+       .long   3998164722
+       .long   1013347606
+       .long   0
+       .long   1070596096
+       .long   3265990537
+       .long   1069073721
+       .long   3279971426
+       .long   3214937529
+       .long   2447085124
+       .long   1067141598
+       .long   1649985592
+       .long   3212178923
+       .long   3334399491
+       .long   1063868754
+       .long   454991634
+       .long   3209370985
+       .long   1938913543
+       .long   3204215126
+       .long   3827994963
+       .long   1071349034
+       .long   941734744
+       .long   3162288710
+       .long   0
+       .long   1072693248
+       .long   1615317960
+       .long   3217198637
+       .long   1400808192
+       .long   1007479474
+       .long   0
+       .long   1070596096
+       .long   55251407
+       .long   1069061012
+       .long   2380564598
+       .long   3214875524
+       .long   2078095393
+       .long   1067124247
+       .long   3759475360
+       .long   3212128451
+       .long   800747756
+       .long   1063836662
+       .long   3361780736
+       .long   3209299766
+       .long   3643416391
+       .long   1062249457
+       .long   159936490
+       .long   1071297563
+       .long   3547642993
+       .long   3161095918
+       .long   0
+       .long   1072693248
+       .long   2707383656
+       .long   3217163056
+       .long   554608178
+       .long   3160521551
+       .long   0
+       .long   1070596096
+       .long   1495139838
+       .long   1069048702
+       .long   183291521
+       .long   3214810633
+       .long   3540584774
+       .long   1067107509
+       .long   3317896890
+       .long   3212078943
+       .long   3844035447
+       .long   1063805952
+       .long   3695033041
+       .long   3209230570
+       .long   3731872264
+       .long   3207727795
+       .long   786845313
+       .long   1071246091
+       .long   627570489
+       .long   1010932411
+       .long   0
+       .long   1072693248
+       .long   850612498
+       .long   3217127550
+       .long   3957837480
+       .long   1012739461
+       .long   0
+       .long   1070596096
+       .long   4230382869
+       .long   1069036788
+       .long   2678394493
+       .long   3214746346
+       .long   42048419
+       .long   1067091374
+       .long   61549345
+       .long   3212030360
+       .long   3326100968
+       .long   1063776440
+       .long   377176410
+       .long   3209163411
+       .long   1539171840
+       .long   3206122484
+       .long   1413754136
+       .long   1071194619
+       .long   856972295
+       .long   1014081062
+       .long   0
+       .long   1072693248
+       .long   2829232582
+       .long   3217092115
+       .long   1037840994
+       .long   1012412582
+       .long   0
+       .long   1070596096
+       .long   1194701220
+       .long   1069025268
+       .long   1485063562
+       .long   3214682643
+       .long   3996610205
+       .long   1067075828
+       .long   2865183303
+       .long   3211982662
+       .long   2185691626
+       .long   1063748117
+       .long   435906073
+       .long   3209098183
+       .long   1583986254
+       .long   1061922957
+       .long   2040662960
+       .long   1071143147
+       .long   4270081753
+       .long   3162433290
+       .long   0
+       .long   1072693248
+       .long   2636871548
+       .long   3217056750
+       .long   3635907996
+       .long   3159234439
+       .long   0
+       .long   1070596096
+       .long   3074865967
+       .long   1069014136
+       .long   2827594877
+       .long   3214619501
+       .long   4018616278
+       .long   1067060863
+       .long   3744630852
+       .long   3211935814
+       .long   967547233
+       .long   1063721046
+       .long   1523268333
+       .long   3209034706
+       .long   370739821
+       .long   1057912410
+       .long   2667571783
+       .long   1071091675
+       .long   1614402419
+       .long   3161385080
+       .long   0
+       .long   1072693248
+       .long   1600848691
+       .long   3217011737
+       .long   3799011534
+       .long   3158825865
+       .long   0
+       .long   1070596096
+       .long   3940625627
+       .long   1069003390
+       .long   1694054617
+       .long   3214556900
+       .long   3525212904
+       .long   1067046468
+       .long   3400170401
+       .long   3211889780
+       .long   2025409789
+       .long   1063695095
+       .long   1861695371
+       .long   3208972985
+       .long   2099431114
+       .long   1058280175
+       .long   3294480606
+       .long   1071040203
+       .long   1489607747
+       .long   3149321755
+       .long   0
+       .long   1072693248
+       .long   163325898
+       .long   3216941271
+       .long   272531312
+       .long   3158872717
+       .long   0
+       .long   1070596096
+       .long   2709640876
+       .long   1068993027
+       .long   3241569416
+       .long   3214494818
+       .long   3499770285
+       .long   1067032633
+       .long   2428916378
+       .long   3211844525
+       .long   796870242
+       .long   1063670282
+       .long   2401385551
+       .long   3208912885
+       .long   417337253
+       .long   3207953615
+       .long   3921389429
+       .long   1070988731
+       .long   3647185164
+       .long   1013899970
+       .long   0
+       .long   1072693248
+       .long   2357811071
+       .long   3216870929
+       .long   1815527340
+       .long   3157476592
+       .long   0
+       .long   1070596096
+       .long   3138003653
+       .long   1068983043
+       .long   1253835798
+       .long   3214433236
+       .long   2444914170
+       .long   1067019349
+       .long   1113961907
+       .long   3211800015
+       .long   1725681990
+       .long   1063646503
+       .long   2521427548
+       .long   3208854407
+       .long   2469316955
+       .long   1061668474
+       .long   253330956
+       .long   1070937260
+       .long   991505830
+       .long   1014948912
+       .long   0
+       .long   1072693248
+       .long   1152452440
+       .long   3216800708
+       .long   2988871182
+       .long   1011946816
+       .long   0
+       .long   1070596096
+       .long   926263936
+       .long   1068973436
+       .long   3845070713
+       .long   3214372132
+       .long   626397172
+       .long   1067006607
+       .long   2777085683
+       .long   3211724145
+       .long   2172777456
+       .long   1063623822
+       .long   3188732906
+       .long   3208797386
+       .long   250185439
+       .long   1062033866
+       .long   880239780
+       .long   1070885788
+       .long   4135548218
+       .long   3161565440
+       .long   0
+       .long   1072693248
+       .long   2555242223
+       .long   3216730602
+       .long   1132402578
+       .long   1012350135
+       .long   0
+       .long   1070596096
+       .long   890626350
+       .long   1068964202
+       .long   3331100648
+       .long   3214311488
+       .long   30508518
+       .long   1066994398
+       .long   397665884
+       .long   3211637908
+       .long   1048931291
+       .long   1063602233
+       .long   4152525626
+       .long   3208741715
+       .long   51864355
+       .long   3208005790
+       .long   1507148603
+       .long   1070834316
+       .long   1086374101
+       .long   3158421905
+       .long   0
+       .long   1072693248
+       .long   4132779814
+       .long   3216660607
+       .long   3895880616
+       .long   1012226511
+       .long   0
+       .long   1070596096
+       .long   4069764223
+       .long   1068955338
+       .long   1936654463
+       .long   3214251284
+       .long   27137259
+       .long   1066982714
+       .long   112447739
+       .long   3211552967
+       .long   3681308921
+       .long   1063581561
+       .long   3611917249
+       .long   3208687484
+       .long   2182292750
+       .long   1061868473
+       .long   2134057426
+       .long   1070782844
+       .long   1285458442
+       .long   1013610809
+       .long   0
+       .long   1072693248
+       .long   3593905368
+       .long   3216590719
+       .long   2989246530
+       .long   1011901384
+       .long   0
+       .long   1070596096
+       .long   3421947019
+       .long   1068946843
+       .long   3144465174
+       .long   3214191500
+       .long   1618007405
+       .long   1066971547
+       .long   584787122
+       .long   3211469261
+       .long   1465845707
+       .long   1063561956
+       .long   939979903
+       .long   3208626315
+       .long   1695262346
+       .long   3204506663
+       .long   2760966249
+       .long   1070731372
+       .long   1958126117
+       .long   1014804331
+       .long   0
+       .long   1072693248
+       .long   3078460826
+       .long   3216520933
+       .long   4285081068
+       .long   3159473614
+       .long   0
+       .long   1070596096
+       .long   997373752
+       .long   1068938714
+       .long   3045840714
+       .long   3214132118
+       .long   3110377520
+       .long   1066960890
+       .long   2323415564
+       .long   3211386730
+       .long   18309569
+       .long   1063543250
+       .long   551124926
+       .long   3208522770
+       .long   249182975
+       .long   1061811122
+       .long   3387875073
+       .long   1070679900
+       .long   3168927931
+       .long   3161710021
+       .long   0
+       .long   1072693248
+       .long   561239310
+       .long   3216451245
+       .long   210497392
+       .long   3156201161
+       .long   0
+       .long   1070596096
+       .long   3636030687
+       .long   1068930947
+       .long   3167463735
+       .long   3214073119
+       .long   73152643
+       .long   1066950737
+       .long   3108019154
+       .long   3211305316
+       .long   2100498319
+       .long   1063525559
+       .long   282708930
+       .long   3208421353
+       .long   2551775895
+       .long   3207605450
+       .long   4014783896
+       .long   1070628428
+       .long   3119156846
+       .long   3159469019
+       .long   0
+       .long   1072693248
+       .long   2730856872
+       .long   3216381649
+       .long   4254293712
+       .long   1009711154
+       .long   0
+       .long   1070596096
+       .long   1486032260
+       .long   1068923542
+       .long   1824674436
+       .long   3214014485
+       .long   2488677748
+       .long   1066941079
+       .long   1925770461
+       .long   3211224962
+       .long   2531500940
+       .long   1063508710
+       .long   3007508061
+       .long   3208322267
+       .long   994458799
+       .long   1061806090
+       .long   693450846
+       .long   1070557818
+       .long   3218699017
+       .long   1013321647
+       .long   0
+       .long   1072693248
+       .long   3508967486
+       .long   3216312142
+       .long   3021155724
+       .long   1011969550
+       .long   0
+       .long   1070596096
+       .long   2356881417
+       .long   1068916495
+       .long   2655870529
+       .long   3213956197
+       .long   352865498
+       .long   1066931912
+       .long   3008575053
+       .long   3211145611
+       .long   2622088932
+       .long   1063492845
+       .long   3834913422
+       .long   3208225014
+       .long   1497815285
+       .long   3207511002
+       .long   1947268493
+       .long   1070454874
+       .long   1185916272
+       .long   3159758181
+       .long   0
+       .long   1072693248
+       .long   1224261120
+       .long   3216242720
+       .long   3122470664
+       .long   3159031070
+       .long   0
+       .long   1070596096
+       .long   1648557593
+       .long   1068909805
+       .long   1683250226
+       .long   3213898238
+       .long   2306165388
+       .long   1066923228
+       .long   2600821843
+       .long   3211067209
+       .long   3406795398
+       .long   1063477798
+       .long   3582359304
+       .long   3208129845
+       .long   3199024961
+       .long   1061038571
+       .long   3201086139
+       .long   1070351930
+       .long   4185319304
+       .long   1013177066
+       .long   0
+       .long   1072693248
+       .long   2901633254
+       .long   3216173377
+       .long   2788221280
+       .long   1009319756
+       .long   0
+       .long   1070596096
+       .long   3820542338
+       .long   1068903469
+       .long   288942435
+       .long   3213795740
+       .long   1237884341
+       .long   1066915023
+       .long   1606294444
+       .long   3210989702
+       .long   223992189
+       .long   1063463656
+       .long   1499707213
+       .long   3208036378
+       .long   3416758850
+       .long   1060053511
+       .long   159936490
+       .long   1070248987
+       .long   3547642993
+       .long   3160047342
+       .long   0
+       .long   1072693248
+       .long   2781619933
+       .long   3216104110
+       .long   3145354644
+       .long   1011963772
+       .long   0
+       .long   1070596096
+       .long   911495412
+       .long   1068897487
+       .long   290976546
+       .long   3213681030
+       .long   33241894
+       .long   1066907291
+       .long   977031819
+       .long   3210913037
+       .long   119357659
+       .long   1063450345
+       .long   1846248446
+       .long   3207944648
+       .long   4276662282
+       .long   1061269448
+       .long   1413754136
+       .long   1070146043
+       .long   856972295
+       .long   1013032486
+       .long   0
+       .long   1072693248
+       .long   3789571175
+       .long   3216034914
+       .long   2061677164
+       .long   3158802525
+       .long   0
+       .long   1070596096
+       .long   2598855658
+       .long   1068891855
+       .long   628750565
+       .long   3213566872
+       .long   2954249465
+       .long   1066900026
+       .long   1468236324
+       .long   3210837162
+       .long   3701994667
+       .long   1063437912
+       .long   310421843
+       .long   3207854373
+       .long   393637210
+       .long   3207421006
+       .long   2667571783
+       .long   1070043099
+       .long   1614402419
+       .long   3160336504
+       .long   0
+       .long   1072693248
+       .long   700360492
+       .long   3215948980
+       .long   4067889956
+       .long   3158309941
+       .long   0
+       .long   1070596096
+       .long   1834243786
+       .long   1068886573
+       .long   92010622
+       .long   3213453232
+       .long   2733460853
+       .long   1066893225
+       .long   3349627764
+       .long   3210762026
+       .long   2326014508
+       .long   1063426279
+       .long   2491557920
+       .long   3207765637
+       .long   2159546056
+       .long   3208108974
+       .long   3921389429
+       .long   1069940155
+       .long   3647185164
+       .long   1012851394
+       .long   0
+       .long   1072693248
+       .long   4008519973
+       .long   3215810847
+       .long   1156806192
+       .long   3157002565
+       .long   0
+       .long   1070596096
+       .long   608713188
+       .long   1068881639
+       .long   3200221055
+       .long   3213340075
+       .long   2024185290
+       .long   1066886883
+       .long   3737414605
+       .long   3210635448
+       .long   4102026093
+       .long   1063415403
+       .long   3274310324
+       .long   3207678452
+       .long   4280744879
+       .long   1061910091
+       .long   880239780
+       .long   1069837212
+       .long   4135548218
+       .long   3160516864
+       .long   0
+       .long   1072693248
+       .long   2381996637
+       .long   3215672832
+       .long   639270832
+       .long   1008532593
+       .long   0
+       .long   1070596096
+       .long   1358563144
+       .long   1068877051
+       .long   2925458633
+       .long   3213227369
+       .long   492833071
+       .long   1066880996
+       .long   4104628456
+       .long   3210487835
+       .long   3054991409
+       .long   1063405423
+       .long   2594255061
+       .long   3207590366
+       .long   2100320188
+       .long   3208479772
+       .long   2134057426
+       .long   1069734268
+       .long   1285458442
+       .long   1012562233
+       .long   0
+       .long   1072693248
+       .long   2319612510
+       .long   3215534925
+       .long   1111071278
+       .long   3158888695
+       .long   0
+       .long   1070596096
+       .long   2666415304
+       .long   1068872808
+       .long   2071510147
+       .long   3213115080
+       .long   3395467108
+       .long   1066875559
+       .long   2423946868
+       .long   3210341405
+       .long   80612299
+       .long   1063396131
+       .long   2656867111
+       .long   3207420929
+       .long   3004001956
+       .long   1061836610
+       .long   3387875073
+       .long   1069631324
+       .long   3168927931
+       .long   3160661445
+       .long   0
+       .long   1072693248
+       .long   1865079417
+       .long   3215397118
+       .long   2937833612
+       .long   1011350737
+       .long   0
+       .long   1070596096
+       .long   3552516355
+       .long   1068868909
+       .long   294617109
+       .long   3213003175
+       .long   76221622
+       .long   1066870571
+       .long   3376425735
+       .long   3210196061
+       .long   2723275475
+       .long   1063387705
+       .long   3315521969
+       .long   3207252871
+       .long   3590370444
+       .long   3207679867
+       .long   693450846
+       .long   1069509242
+       .long   3218699017
+       .long   1012273071
+       .long   0
+       .long   1072693248
+       .long   3481201957
+       .long   3215259402
+       .long   1636311970
+       .long   3157709699
+       .long   0
+       .long   1070596096
+       .long   3471360849
+       .long   1068865353
+       .long   2600335524
+       .long   3212891620
+       .long   2613792462
+       .long   1066866026
+       .long   3847698423
+       .long   3210051709
+       .long   663967578
+       .long   1063380003
+       .long   493409710
+       .long   3207087119
+       .long   1127477260
+       .long   3207199264
+       .long   3201086139
+       .long   1069303354
+       .long   4185319304
+       .long   1012128490
+       .long   0
+       .long   1072693248
+       .long   1154356116
+       .long   3215121770
+       .long   1840040117
+       .long   3159097207
+       .long   0
+       .long   1070596096
+       .long   2308597781
+       .long   1068862139
+       .long   4143524575
+       .long   3212723904
+       .long   2850915343
+       .long   1066861923
+       .long   1191668407
+       .long   3209908256
+       .long   2952843839
+       .long   1063373033
+       .long   3172237721
+       .long   3206923432
+       .long   2684115468
+       .long   1061237060
+       .long   1413754136
+       .long   1069097467
+       .long   856972295
+       .long   1011983910
+       .long   0
+       .long   1072693248
+       .long   1858778712
+       .long   3214984212
+       .long   552307712
+       .long   1007653492
+       .long   0
+       .long   1070596096
+       .long   378217452
+       .long   1068859266
+       .long   2507068679
+       .long   3212502004
+       .long   2446302718
+       .long   1066858259
+       .long   1361087111
+       .long   3209765608
+       .long   761263112
+       .long   1063366881
+       .long   2488333367
+       .long   3206760542
+       .long   3134826447
+       .long   3208438003
+       .long   3921389429
+       .long   1068891579
+       .long   3647185164
+       .long   1011802818
+       .long   0
+       .long   1072693248
+       .long   3847531748
+       .long   3214759425
+       .long   2484055616
+       .long   1005679197
+       .long   0
+       .long   1070596096
+       .long   2714982805
+       .long   1068856732
+       .long   2649074978
+       .long   3212280611
+       .long   4275478210
+       .long   1066855031
+       .long   2325700054
+       .long   3209556212
+       .long   3568629394
+       .long   1063361434
+       .long   1419097007
+       .long   3206599479
+       .long   3667282369
+       .long   3208404843
+       .long   2134057426
+       .long   1068685692
+       .long   1285458442
+       .long   1011513657
+       .long   0
+       .long   1072693248
+       .long   4111272116
+       .long   3214484558
+       .long   3215369808
+       .long   3153450047
+       .long   0
+       .long   1070596096
+       .long   1892298670
+       .long   1068854538
+       .long   4017792039
+       .long   3212059661
+       .long   3825916209
+       .long   1066852238
+       .long   1674419437
+       .long   3209273590
+       .long   2761556401
+       .long   1063356717
+       .long   4123887123
+       .long   3206334117
+       .long   39803485
+       .long   3207166447
+       .long   693450846
+       .long   1068460666
+       .long   3218699017
+       .long   1011224495
+       .long   0
+       .long   1072693248
+       .long   1769817487
+       .long   3214209791
+       .long   226900428
+       .long   3157084142
+       .long   0
+       .long   1070596096
+       .long   3790025843
+       .long   1068852682
+       .long   2975452701
+       .long   3211839091
+       .long   2074002222
+       .long   1066849878
+       .long   2835406423
+       .long   3208992033
+       .long   2160688582
+       .long   1063352737
+       .long   438342636
+       .long   3206016666
+       .long   598064701
+       .long   3205441692
+       .long   1413754136
+       .long   1068048891
+       .long   856972295
+       .long   1010935334
+       .long   0
+       .long   1072693248
+       .long   2796861084
+       .long   3213935106
+       .long   4160910146
+       .long   1008936729
+       .long   0
+       .long   1070596096
+       .long   1822957307
+       .long   1068851165
+       .long   2426092900
+       .long   3211449386
+       .long   1181651297
+       .long   1066847949
+       .long   11113416
+       .long   3208711363
+       .long   2350522541
+       .long   1063349490
+       .long   1110749705
+       .long   3205700769
+       .long   1529834450
+       .long   3204806002
+       .long   2134057426
+       .long   1067637116
+       .long   1285458442
+       .long   1010465081
+       .long   0
+       .long   1072693248
+       .long   766684177
+       .long   3213435536
+       .long   4183922317
+       .long   3156428395
+       .long   0
+       .long   1070596096
+       .long   2709169804
+       .long   1068849985
+       .long   2562652885
+       .long   3211009382
+       .long   194304310
+       .long   1066846450
+       .long   285423324
+       .long   3208220240
+       .long   4164698302
+       .long   1063346958
+       .long   490316583
+       .long   3205276877
+       .long   1161999017
+       .long   1059948714
+       .long   1413754136
+       .long   1067000315
+       .long   856972295
+       .long   1009886758
+       .long   0
+       .long   1072693248
+       .long   1373484687
+       .long   3212886398
+       .long   3463806808
+       .long   3156987378
+       .long   0
+       .long   1070596096
+       .long   699034059
+       .long   1068849143
+       .long   4196075177
+       .long   3210399801
+       .long   3624794075
+       .long   1066845379
+       .long   1212360239
+       .long   3207661374
+       .long   4225594870
+       .long   1063345136
+       .long   4142831282
+       .long   3204654696
+       .long   3419780486
+       .long   1061860029
+       .long   1413754136
+       .long   1065951739
+       .long   856972295
+       .long   1008838182
+       .long   0
+       .long   1072693248
+       .long   1048210722
+       .long   3211837789
+       .long   322286546
+       .long   3154320084
+       .long   0
+       .long   1070596096
+       .long   3344097458
+       .long   1068848637
+       .long   4078525744
+       .long   3209350973
+       .long   4268457311
+       .long   1066844737
+       .long   1752199129
+       .long   3206612445
+       .long   2933973771
+       .long   1063344076
+       .long   1552329397
+       .long   3203604713
+       .long   4286470131
+       .long   1060555865
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1070596096
+       .long   1431655765
+       .long   1068848469
+       .long   0
+       .long   0
+       .long   381986942
+       .long   1066844524
+       .long   0
+       .long   0
+       .long   3364860459
+       .long   1063343704
+       .long   0
+       .long   0
+       .long   3669941704
+       .long   1061551801
+       .long   1413754136
+       .long   3213435387
+       .long   856972295
+       .long   3156321830
+       .long   0
+       .long   1072693248
+       .long   1048210722
+       .long   1064354141
+       .long   310222654
+       .long   1006836436
+       .long   0
+       .long   1070596096
+       .long   3344097458
+       .long   1068848637
+       .long   4078525744
+       .long   1061867325
+       .long   4268457311
+       .long   1066844737
+       .long   1752199185
+       .long   1059128797
+       .long   2933974085
+       .long   1063344076
+       .long   1541627965
+       .long   1056121065
+       .long   4213857106
+       .long   1060555865
+       .long   1413754136
+       .long   3214483963
+       .long   856972295
+       .long   3157370406
+       .long   0
+       .long   1072693248
+       .long   1373484687
+       .long   1065402750
+       .long   3463778643
+       .long   1009503730
+       .long   0
+       .long   1070596096
+       .long   699034059
+       .long   1068849143
+       .long   4196075177
+       .long   1062916153
+       .long   3624794075
+       .long   1066845379
+       .long   1212360238
+       .long   1060177726
+       .long   4225594899
+       .long   1063345136
+       .long   4143059094
+       .long   1057171048
+       .long   3416473992
+       .long   1061860029
+       .long   2134057426
+       .long   3215120764
+       .long   1285458442
+       .long   3157948729
+       .long   0
+       .long   1072693248
+       .long   766684177
+       .long   1065951888
+       .long   4184103028
+       .long   1008944747
+       .long   0
+       .long   1070596096
+       .long   2709169804
+       .long   1068849985
+       .long   2562652885
+       .long   1063525734
+       .long   194304310
+       .long   1066846450
+       .long   285423316
+       .long   1060736592
+       .long   4164698149
+       .long   1063346958
+       .long   492080240
+       .long   1057793229
+       .long   1233082996
+       .long   1059948714
+       .long   1413754136
+       .long   3215532539
+       .long   856972295
+       .long   3158418982
+       .long   0
+       .long   1072693248
+       .long   2796861084
+       .long   1066451458
+       .long   4163800696
+       .long   3156420377
+       .long   0
+       .long   1070596096
+       .long   1822957307
+       .long   1068851165
+       .long   2426092900
+       .long   1063965738
+       .long   1181651297
+       .long   1066847949
+       .long   11113467
+       .long   1061227715
+       .long   2350524377
+       .long   1063349490
+       .long   1099629520
+       .long   1058217121
+       .long   647421766
+       .long   3204806003
+       .long   693450846
+       .long   3215944314
+       .long   3218699017
+       .long   3158708143
+       .long   0
+       .long   1072693248
+       .long   1769817487
+       .long   1066726143
+       .long   226750770
+       .long   1009600494
+       .long   0
+       .long   1070596096
+       .long   3790025843
+       .long   1068852682
+       .long   2975452701
+       .long   1064355443
+       .long   2074002222
+       .long   1066849878
+       .long   2835406424
+       .long   1061508385
+       .long   2160688720
+       .long   1063352737
+       .long   438143169
+       .long   1058533018
+       .long   848462310
+       .long   3205441692
+       .long   2134057426
+       .long   3216169340
+       .long   1285458442
+       .long   3158997305
+       .long   0
+       .long   1072693248
+       .long   4111272116
+       .long   1067000910
+       .long   3213429568
+       .long   1005966399
+       .long   0
+       .long   1070596096
+       .long   1892298670
+       .long   1068854538
+       .long   4017792039
+       .long   1064576013
+       .long   3825916209
+       .long   1066852238
+       .long   1674419438
+       .long   1061789942
+       .long   2761556545
+       .long   1063356717
+       .long   4123711083
+       .long   1058850469
+       .long   104595699
+       .long   3207166447
+       .long   3921389429
+       .long   3216375227
+       .long   3647185164
+       .long   3159286466
+       .long   0
+       .long   1072693248
+       .long   3847531748
+       .long   1067275777
+       .long   2487971824
+       .long   3153162845
+       .long   0
+       .long   1070596096
+       .long   2714982805
+       .long   1068856732
+       .long   2649074978
+       .long   1064796963
+       .long   4275478210
+       .long   1066855031
+       .long   2325700056
+       .long   1062072564
+       .long   3568629551
+       .long   1063361434
+       .long   1418922081
+       .long   1059115831
+       .long   3702148884
+       .long   3208404843
+       .long   1413754136
+       .long   3216581115
+       .long   856972295
+       .long   3159467558
+       .long   0
+       .long   1072693248
+       .long   1858778712
+       .long   1067500564
+       .long   554450480
+       .long   3155137140
+       .long   0
+       .long   1070596096
+       .long   378217452
+       .long   1068859266
+       .long   2507068679
+       .long   1065018356
+       .long   2446302718
+       .long   1066858259
+       .long   1361087112
+       .long   1062281960
+       .long   761263211
+       .long   1063366881
+       .long   2488165471
+       .long   1059276894
+       .long   3156241770
+       .long   3208438003
+       .long   3201086139
+       .long   3216787002
+       .long   4185319304
+       .long   3159612138
+       .long   0
+       .long   1072693248
+       .long   1154356116
+       .long   1067638122
+       .long   1840130764
+       .long   1011613559
+       .long   0
+       .long   1070596096
+       .long   2308597781
+       .long   1068862139
+       .long   4143524575
+       .long   1065240256
+       .long   2850915343
+       .long   1066861923
+       .long   1191668406
+       .long   1062424608
+       .long   2952843813
+       .long   1063373033
+       .long   3172428186
+       .long   1059439784
+       .long   2686776959
+       .long   1061237060
+       .long   693450846
+       .long   3216992890
+       .long   3218699017
+       .long   3159756719
+       .long   0
+       .long   1072693248
+       .long   3481201957
+       .long   1067775754
+       .long   1635996196
+       .long   1010226051
+       .long   0
+       .long   1070596096
+       .long   3471360849
+       .long   1068865353
+       .long   2600335524
+       .long   1065407972
+       .long   2613792462
+       .long   1066866026
+       .long   3847698425
+       .long   1062568061
+       .long   663967590
+       .long   1063380003
+       .long   493016801
+       .long   1059603471
+       .long   1131084659
+       .long   3207199264
+       .long   3387875073
+       .long   3217114972
+       .long   3168927931
+       .long   1013177797
+       .long   0
+       .long   1072693248
+       .long   1865079417
+       .long   1067913470
+       .long   2938003329
+       .long   3158834385
+       .long   0
+       .long   1070596096
+       .long   3552516355
+       .long   1068868909
+       .long   294617109
+       .long   1065519527
+       .long   76221622
+       .long   1066870571
+       .long   3376425737
+       .long   1062712413
+       .long   2723275461
+       .long   1063387705
+       .long   3315136619
+       .long   1059769223
+       .long   3585984604
+       .long   3207679867
+       .long   2134057426
+       .long   3217217916
+       .long   1285458442
+       .long   3160045881
+       .long   0
+       .long   1072693248
+       .long   2319612510
+       .long   1068051277
+       .long   1111303258
+       .long   1011405047
+       .long   0
+       .long   1070596096
+       .long   2666415304
+       .long   1068872808
+       .long   2071510147
+       .long   1065631432
+       .long   3395467108
+       .long   1066875559
+       .long   2423946865
+       .long   1062857757
+       .long   80612341
+       .long   1063396131
+       .long   2657457026
+       .long   1059937281
+       .long   2998464421
+       .long   1061836610
+       .long   880239780
+       .long   3217320860
+       .long   4135548218
+       .long   1013033216
+       .long   0
+       .long   1072693248
+       .long   2381996637
+       .long   1068189184
+       .long   639224640
+       .long   3156016241
+       .long   0
+       .long   1070596096
+       .long   1358563144
+       .long   1068877051
+       .long   2925458633
+       .long   1065743721
+       .long   492833071
+       .long   1066880996
+       .long   4104628456
+       .long   1063004187
+       .long   3054991518
+       .long   1063405423
+       .long   2594252722
+       .long   1060106718
+       .long   2125241622
+       .long   3208479772
+       .long   3921389429
+       .long   3217423803
+       .long   3647185164
+       .long   3160335042
+       .long   0
+       .long   1072693248
+       .long   4008519973
+       .long   1068327199
+       .long   1156786808
+       .long   1009518917
+       .long   0
+       .long   1070596096
+       .long   608713188
+       .long   1068881639
+       .long   3200221055
+       .long   1065856427
+       .long   2024185290
+       .long   1066886883
+       .long   3737414605
+       .long   1063151800
+       .long   4102026005
+       .long   1063415403
+       .long   3274311301
+       .long   1060194804
+       .long   4290805031
+       .long   1061910091
+       .long   2667571783
+       .long   3217526747
+       .long   1614402419
+       .long   1012852856
+       .long   0
+       .long   1072693248
+       .long   700360492
+       .long   1068465332
+       .long   4067897658
+       .long   1010826293
+       .long   0
+       .long   1070596096
+       .long   1834243786
+       .long   1068886573
+       .long   92010622
+       .long   1065969584
+       .long   2733460853
+       .long   1066893225
+       .long   3349627764
+       .long   1063278378
+       .long   2326014613
+       .long   1063426279
+       .long   2491557128
+       .long   1060281989
+       .long   2183550903
+       .long   3208108974
+       .long   1413754136
+       .long   3217629691
+       .long   856972295
+       .long   3160516134
+       .long   0
+       .long   1072693248
+       .long   3789571175
+       .long   1068551266
+       .long   2061680020
+       .long   1011318877
+       .long   0
+       .long   1070596096
+       .long   2598855658
+       .long   1068891855
+       .long   628750565
+       .long   1066083224
+       .long   2954249465
+       .long   1066900026
+       .long   1468236324
+       .long   1063353514
+       .long   3701994745
+       .long   1063437912
+       .long   310421258
+       .long   1060370725
+       .long   429301190
+       .long   3207421006
+       .long   159936490
+       .long   3217732635
+       .long   3547642993
+       .long   1012563694
+       .long   0
+       .long   1072693248
+       .long   2781619933
+       .long   1068620462
+       .long   3145355490
+       .long   3159447420
+       .long   0
+       .long   1070596096
+       .long   911495412
+       .long   1068897487
+       .long   290976546
+       .long   1066197382
+       .long   33241894
+       .long   1066907291
+       .long   977031819
+       .long   1063429389
+       .long   119357612
+       .long   1063450345
+       .long   1846248792
+       .long   1060461000
+       .long   4282034711
+       .long   1061269448
+       .long   3201086139
+       .long   3217835578
+       .long   4185319304
+       .long   3160660714
+       .long   0
+       .long   1072693248
+       .long   2901633254
+       .long   1068689729
+       .long   2788220944
+       .long   3156803404
+       .long   0
+       .long   1070596096
+       .long   3820542338
+       .long   1068903469
+       .long   288942435
+       .long   1066312092
+       .long   1237884341
+       .long   1066915023
+       .long   1606294444
+       .long   1063506054
+       .long   223992191
+       .long   1063463656
+       .long   1499707196
+       .long   1060552730
+       .long   3415844307
+       .long   1060053511
+       .long   1947268493
+       .long   3217938522
+       .long   1185916272
+       .long   1012274533
+       .long   0
+       .long   1072693248
+       .long   1224261120
+       .long   1068759072
+       .long   3122469562
+       .long   1011547422
+       .long   0
+       .long   1070596096
+       .long   1648557593
+       .long   1068909805
+       .long   1683250226
+       .long   1066414590
+       .long   2306165388
+       .long   1066923228
+       .long   2600821843
+       .long   1063583561
+       .long   3406795366
+       .long   1063477798
+       .long   3582359528
+       .long   1060646197
+       .long   3206340638
+       .long   1061038571
+       .long   693450846
+       .long   3218041466
+       .long   3218699017
+       .long   3160805295
+       .long   0
+       .long   1072693248
+       .long   3508967486
+       .long   1068828494
+       .long   3021154406
+       .long   3159453198
+       .long   0
+       .long   1070596096
+       .long   2356881417
+       .long   1068916495
+       .long   2655870529
+       .long   1066472549
+       .long   352865498
+       .long   1066931912
+       .long   3008575053
+       .long   1063661963
+       .long   2622089007
+       .long   1063492845
+       .long   3834912888
+       .long   1060741366
+       .long   1532107502
+       .long   3207511002
+       .long   4014783896
+       .long   3218112076
+       .long   3119156846
+       .long   1011985371
+       .long   0
+       .long   1072693248
+       .long   2730856872
+       .long   1068898001
+       .long   4254304408
+       .long   3157194802
+       .long   0
+       .long   1070596096
+       .long   1486032260
+       .long   1068923542
+       .long   1824674436
+       .long   1066530837
+       .long   2488677748
+       .long   1066941079
+       .long   1925770461
+       .long   1063741314
+       .long   2531500863
+       .long   1063508710
+       .long   3007508602
+       .long   1060838619
+       .long   1003260451
+       .long   1061806090
+       .long   3387875073
+       .long   3218163548
+       .long   3168927931
+       .long   1014226373
+       .long   0
+       .long   1072693248
+       .long   561239310
+       .long   1068967597
+       .long   210518352
+       .long   1008717513
+       .long   0
+       .long   1070596096
+       .long   3636030687
+       .long   1068930947
+       .long   3167463735
+       .long   1066589471
+       .long   73152643
+       .long   1066950737
+       .long   3108019154
+       .long   1063821668
+       .long   2100498394
+       .long   1063525559
+       .long   282708402
+       .long   1060937705
+       .long   2568921764
+       .long   3207605450
+       .long   2760966249
+       .long   3218215020
+       .long   1958126117
+       .long   3162287979
+       .long   0
+       .long   1072693248
+       .long   3078460826
+       .long   1069037285
+       .long   4285079825
+       .long   1011989966
+       .long   0
+       .long   1070596096
+       .long   997373752
+       .long   1068938714
+       .long   3045840714
+       .long   1066648470
+       .long   3110377520
+       .long   1066960890
+       .long   2323415564
+       .long   1063903082
+       .long   18309497
+       .long   1063543250
+       .long   551125427
+       .long   1061039122
+       .long   257413032
+       .long   1061811122
+       .long   2134057426
+       .long   3218266492
+       .long   1285458442
+       .long   3161094457
+       .long   0
+       .long   1072693248
+       .long   3593905368
+       .long   1069107071
+       .long   2989245764
+       .long   3159385032
+       .long   0
+       .long   1070596096
+       .long   3421947019
+       .long   1068946843
+       .long   3144465174
+       .long   1066707852
+       .long   1618007405
+       .long   1066971547
+       .long   584787122
+       .long   1063985613
+       .long   1465845750
+       .long   1063561956
+       .long   939979596
+       .long   1061142667
+       .long   1773905530
+       .long   3204506663
+       .long   1507148603
+       .long   3218317964
+       .long   1086374101
+       .long   1010938257
+       .long   0
+       .long   1072693248
+       .long   4132779814
+       .long   1069176959
+       .long   3895881848
+       .long   3159710159
+       .long   0
+       .long   1070596096
+       .long   4069764223
+       .long   1068955338
+       .long   1936654463
+       .long   1066767636
+       .long   27137259
+       .long   1066982714
+       .long   112447739
+       .long   1064069319
+       .long   3681308850
+       .long   1063581561
+       .long   3611917496
+       .long   1061203836
+       .long   2190408434
+       .long   1061868473
+       .long   880239780
+       .long   3218369436
+       .long   4135548218
+       .long   1014081792
+       .long   0
+       .long   1072693248
+       .long   2555242223
+       .long   1069246954
+       .long   1132401098
+       .long   3159833783
+       .long   0
+       .long   1070596096
+       .long   890626350
+       .long   1068964202
+       .long   3331100648
+       .long   1066827840
+       .long   30508518
+       .long   1066994398
+       .long   397665884
+       .long   1064154260
+       .long   1048931375
+       .long   1063602233
+       .long   4152525330
+       .long   1061258067
+       .long   71067649
+       .long   3208005790
+       .long   253330956
+       .long   3218420908
+       .long   991505830
+       .long   3162432560
+       .long   0
+       .long   1072693248
+       .long   1152452440
+       .long   1069317060
+       .long   2988872515
+       .long   3159430464
+       .long   0
+       .long   1070596096
+       .long   926263936
+       .long   1068973436
+       .long   3845070713
+       .long   1066888484
+       .long   626397172
+       .long   1067006607
+       .long   2777085683
+       .long   1064240497
+       .long   2172777379
+       .long   1063623822
+       .long   3188733172
+       .long   1061313738
+       .long   258986845
+       .long   1062033866
+       .long   3921389429
+       .long   3218472379
+       .long   3647185164
+       .long   3161383618
+       .long   0
+       .long   1072693248
+       .long   2357811071
+       .long   1069387281
+       .long   1815523692
+       .long   1009992944
+       .long   0
+       .long   1070596096
+       .long   3138003653
+       .long   1068983043
+       .long   1253835798
+       .long   1066949588
+       .long   2444914170
+       .long   1067019349
+       .long   1113961907
+       .long   1064316367
+       .long   1725681937
+       .long   1063646503
+       .long   2521427730
+       .long   1061370759
+       .long   2475375033
+       .long   1061668474
+       .long   3294480606
+       .long   3218523851
+       .long   1489607747
+       .long   1001838107
+       .long   0
+       .long   1072693248
+       .long   163325898
+       .long   1069457623
+       .long   272534188
+       .long   1011389069
+       .long   0
+       .long   1070596096
+       .long   2709640876
+       .long   1068993027
+       .long   3241569416
+       .long   1067011170
+       .long   3499770285
+       .long   1067032633
+       .long   2428916378
+       .long   1064360877
+       .long   796870323
+       .long   1063670282
+       .long   2401385265
+       .long   1061429237
+       .long   435854613
+       .long   3207953615
+       .long   2667571783
+       .long   3218575323
+       .long   1614402419
+       .long   1013901432
+       .long   0
+       .long   1072693248
+       .long   1600848691
+       .long   1069528089
+       .long   3799012648
+       .long   1011342217
+       .long   0
+       .long   1070596096
+       .long   3940625627
+       .long   1069003390
+       .long   1694054617
+       .long   1067073252
+       .long   3525212904
+       .long   1067046468
+       .long   3400170401
+       .long   1064406132
+       .long   2025409820
+       .long   1063695095
+       .long   1861695260
+       .long   1061489337
+       .long   2071083481
+       .long   1058280175
+       .long   2040662960
+       .long   3218626795
+       .long   4270081753
+       .long   1014949642
+       .long   0
+       .long   1072693248
+       .long   2636871548
+       .long   1069573102
+       .long   3635909220
+       .long   1011750791
+       .long   0
+       .long   1070596096
+       .long   3074865967
+       .long   1069014136
+       .long   2827594877
+       .long   1067135853
+       .long   4018616278
+       .long   1067060863
+       .long   3744630852
+       .long   1064452166
+       .long   967547267
+       .long   1063721046
+       .long   1523268212
+       .long   1061551058
+       .long   308558327
+       .long   1057912410
+       .long   1413754136
+       .long   3218678267
+       .long   856972295
+       .long   3161564710
+       .long   0
+       .long   1072693248
+       .long   2829232582
+       .long   1069608467
+       .long   1037842028
+       .long   3159896230
+       .long   0
+       .long   1070596096
+       .long   1194701220
+       .long   1069025268
+       .long   1485063562
+       .long   1067198995
+       .long   3996610205
+       .long   1067075828
+       .long   2865183303
+       .long   1064499014
+       .long   2185691567
+       .long   1063748117
+       .long   435906278
+       .long   1061614535
+       .long   1590730193
+       .long   1061922957
+       .long   786845313
+       .long   3218729739
+       .long   627570489
+       .long   3158416059
+       .long   0
+       .long   1072693248
+       .long   850612498
+       .long   1069643902
+       .long   3957836518
+       .long   3160223109
+       .long   0
+       .long   1070596096
+       .long   4230382869
+       .long   1069036788
+       .long   2678394493
+       .long   1067262698
+       .long   42048419
+       .long   1067091374
+       .long   61549345
+       .long   1064546712
+       .long   3326101021
+       .long   1063776440
+       .long   377176219
+       .long   1061679763
+       .long   1587637306
+       .long   3206122484
+       .long   159936490
+       .long   3218781211
+       .long   3547642993
+       .long   1013612270
+       .long   0
+       .long   1072693248
+       .long   2707383656
+       .long   1069679408
+       .long   554608849
+       .long   1013037903
+       .long   0
+       .long   1070596096
+       .long   1495139838
+       .long   1069048702
+       .long   183291521
+       .long   1067326985
+       .long   3540584774
+       .long   1067107509
+       .long   3317896890
+       .long   1064595295
+       .long   3844035522
+       .long   1063805952
+       .long   3695032775
+       .long   1061746922
+       .long   3749017783
+       .long   3207727795
+       .long   3827994963
+       .long   3218832682
+       .long   941734744
+       .long   1014805062
+       .long   0
+       .long   1072693248
+       .long   1615317960
+       .long   1069714989
+       .long   1400849280
+       .long   3154963122
+       .long   0
+       .long   1070596096
+       .long   55251407
+       .long   1069061012
+       .long   2380564598
+       .long   1067391876
+       .long   2078095393
+       .long   1067124247
+       .long   3759475360
+       .long   1064644803
+       .long   800747683
+       .long   1063836662
+       .long   3361780990
+       .long   1061816118
+       .long   3647588455
+       .long   1062249457
+       .long   3201086139
+       .long   3218884154
+       .long   4185319304
+       .long   3161709290
+       .long   0
+       .long   1072693248
+       .long   3772940467
+       .long   1069750646
+       .long   3998164292
+       .long   3160831254
+       .long   0
+       .long   1070596096
+       .long   3265990537
+       .long   1069073721
+       .long   3279971426
+       .long   1067453881
+       .long   2447085124
+       .long   1067141598
+       .long   1649985592
+       .long   1064695275
+       .long   3334399538
+       .long   1063868754
+       .long   454991464
+       .long   1061887337
+       .long   2110827584
+       .long   3204215126
+       .long   2574177316
+       .long   3218935626
+       .long   2889755040
+       .long   3159466096
+       .long   0
+       .long   1072693248
+       .long   2595342993
+       .long   1069786383
+       .long   1222183174
+       .long   1011927611
+       .long   0
+       .long   1070596096
+       .long   2192927435
+       .long   1069086835
+       .long   1645422722
+       .long   1067486966
+       .long   648269084
+       .long   1067159575
+       .long   2319737250
+       .long   1064746750
+       .long   1121494052
+       .long   1063902126
+       .long   897314780
+       .long   1061960786
+       .long   2655964904
+       .long   1060259181
+       .long   1947268493
+       .long   3218987098
+       .long   1185916272
+       .long   1013323109
+       .long   0
+       .long   1072693248
+       .long   192708373
+       .long   1069822202
+       .long   1013565611
+       .long   1013125469
+       .long   0
+       .long   1070596096
+       .long   1393443609
+       .long   1069100357
+       .long   3282624502
+       .long   1067520387
+       .long   3423023493
+       .long   1067178189
+       .long   3539283610
+       .long   1064799270
+       .long   1358653364
+       .long   1063936902
+       .long   1383848540
+       .long   1062036512
+       .long   1203341716
+       .long   3207439782
+       .long   1320359670
+       .long   3219038570
+       .long   1908355032
+       .long   1014660481
+       .long   0
+       .long   1072693248
+       .long   3079104278
+       .long   1069858104
+       .long   2593237048
+       .long   1012204550
+       .long   0
+       .long   1070596096
+       .long   1749059456
+       .long   1069114291
+       .long   3316773722
+       .long   1067554157
+       .long   2555119580
+       .long   1067197455
+       .long   59306268
+       .long   1064852879
+       .long   1944001714
+       .long   1063973040
+       .long   3607967027
+       .long   1062114688
+       .long   1550745665
+       .long   1061515569
+       .long   693450846
+       .long   3219090042
+       .long   3218699017
+       .long   3161853871
+       .long   0
+       .long   1072693248
+       .long   701484222
+       .long   1069894094
+       .long   1189134214
+       .long   3161032728
+       .long   0
+       .long   1070596096
+       .long   478132658
+       .long   1069128642
+       .long   2223654597
+       .long   1067588288
+       .long   706118045
+       .long   1067217386
+       .long   1066336370
+       .long   1064907619
+       .long   3310393859
+       .long   1064010705
+       .long   1920668857
+       .long   1062195336
+       .long   1238710124
+       .long   3206743753
+       .long   33271012
+       .long   3219134917
+       .long   2269574412
+       .long   1015853455
+       .long   0
+       .long   1072693248
+       .long   4098310206
+       .long   1069930172
+       .long   678867859
+       .long   3161222246
+       .long   0
+       .long   1070596096
+       .long   4033975882
+       .long   1069143413
+       .long   1577500332
+       .long   1067622792
+       .long   2904242360
+       .long   1067237995
+       .long   383406633
+       .long   1064963537
+       .long   511745140
+       .long   1064049810
+       .long   3472404675
+       .long   1062243075
+       .long   3498625096
+       .long   1061932631
+       .long   4014783896
+       .long   3219160652
+       .long   3119156846
+       .long   1013033947
+       .long   0
+       .long   1072693248
+       .long   2953879462
+       .long   1069966343
+       .long   651183718
+       .long   1012253676
+       .long   0
+       .long   1070596096
+       .long   2348802841
+       .long   1069158611
+       .long   4095204310
+       .long   1067657681
+       .long   3730066556
+       .long   1067259298
+       .long   2541564470
+       .long   1065020679
+       .long   1012137447
+       .long   1064090541
+       .long   3007493277
+       .long   1062286104
+       .long   268143184
+       .long   1058732349
+       .long   3701329484
+       .long   3219186388
+       .long   2857479637
+       .long   3162758049
+       .long   0
+       .long   1072693248
+       .long   4257115870
+       .long   1070002608
+       .long   39728604
+       .long   1013010275
+       .long   0
+       .long   1070596096
+       .long   3207767847
+       .long   1069174239
+       .long   797077063
+       .long   1067692970
+       .long   287980713
+       .long   1067281311
+       .long   1596666478
+       .long   1065079095
+       .long   2775385
+       .long   1064132847
+       .long   3823518174
+       .long   1062330592
+       .long   3096591665
+       .long   1060290467
+       .long   3387875073
+       .long   3219212124
+       .long   3168927931
+       .long   1015274949
+       .long   0
+       .long   1072693248
+       .long   2240974125
+       .long   1070038971
+       .long   3786178918
+       .long   3160482292
+       .long   0
+       .long   1070596096
+       .long   2199065489
+       .long   1069190303
+       .long   1118792048
+       .long   1067728670
+       .long   875809397
+       .long   1067304048
+       .long   2927616918
+       .long   1065138834
+       .long   3494337743
+       .long   1064176822
+       .long   4219965650
+       .long   1062376593
+       .long   4246297104
+       .long   1060574506
+       .long   3074420661
+       .long   3219237860
+       .long   1873363667
+       .long   3160515403
+       .long   0
+       .long   1072693248
+       .long   4156511795
+       .long   1070075433
+       .long   1791783009
+       .long   1013446896
+       .long   0
+       .long   1070596096
+       .long   4204226438
+       .long   1069206807
+       .long   2895376501
+       .long   1067764795
+       .long   3600185398
+       .long   1067327526
+       .long   2087275384
+       .long   1065199949
+       .long   347703954
+       .long   1064222543
+       .long   301495246
+       .long   1062424178
+       .long   908235914
+       .long   3206713553
+       .long   2760966249
+       .long   3219263596
+       .long   1958126117
+       .long   3163336555
+       .long   0
+       .long   1072693248
+       .long   212483252
+       .long   1070111999
+       .long   3496985219
+       .long   3161099600
+       .long   0
+       .long   1070596096
+       .long   1939348811
+       .long   1069223758
+       .long   1001569645
+       .long   1067801360
+       .long   764537997
+       .long   1067351764
+       .long   2326690580
+       .long   1065262493
+       .long   60750552
+       .long   1064270005
+       .long   2745665091
+       .long   1062473435
+       .long   1583079917
+       .long   1060807371
+       .long   2447511838
+       .long   3219289332
+       .long   3841595606
+       .long   1014371319
+       .long   0
+       .long   1072693248
+       .long   2234510834
+       .long   1070148669
+       .long   1077829152
+       .long   1008793063
+       .long   0
+       .long   1070596096
+       .long   1741599179
+       .long   1069241160
+       .long   288887764
+       .long   1067838378
+       .long   438316229
+       .long   1067376778
+       .long   2074161178
+       .long   1065326522
+       .long   2132352506
+       .long   1064311981
+       .long   321000208
+       .long   1062524429
+       .long   2575912902
+       .long   1061549566
+       .long   2134057426
+       .long   3219315068
+       .long   1285458442
+       .long   3162143033
+       .long   0
+       .long   1072693248
+       .long   719981842
+       .long   1070185448
+       .long   3396798827
+       .long   3160592662
+       .long   0
+       .long   1070596096
+       .long   2111724540
+       .long   1069259019
+       .long   2754706540
+       .long   1067875863
+       .long   790037588
+       .long   1067402587
+       .long   4097286835
+       .long   1065372654
+       .long   2918356845
+       .long   1064337614
+       .long   980543769
+       .long   1062577230
+       .long   1876925371
+       .long   3204685716
+       .long   1820603015
+       .long   3219340804
+       .long   3236194699
+       .long   1015708874
+       .long   0
+       .long   1072693248
+       .long   3497432648
+       .long   1070222337
+       .long   3403980908
+       .long   1011735702
+       .long   0
+       .long   1070596096
+       .long   2322009458
+       .long   1069277341
+       .long   3303184211
+       .long   1067913831
+       .long   3079386980
+       .long   1067429210
+       .long   3158396776
+       .long   1065406241
+       .long   500122450
+       .long   1064364204
+       .long   3226667103
+       .long   1062631956
+       .long   1843492548
+       .long   1062167069
+       .long   1507148603
+       .long   3219366540
+       .long   1086374101
+       .long   1011986833
+       .long   0
+       .long   1072693248
+       .long   1371601499
+       .long   1070259341
+       .long   3050542448
+       .long   1012183888
+       .long   0
+       .long   1070596096
+       .long   2434996648
+       .long   1069296132
+       .long   2688049294
+       .long   1067952297
+       .long   1586964757
+       .long   1067453518
+       .long   2102156419
+       .long   1065440660
+       .long   2974407256
+       .long   1064391847
+       .long   249545820
+       .long   1062688662
+       .long   115553579
+       .long   1061128535
+       .long   1193694191
+       .long   3219392276
+       .long   1890859349
+       .long   3162902630
+       .long   0
+       .long   1072693248
+       .long   2488075121
+       .long   1070296461
+       .long   1856289345
+       .long   3161251229
+       .long   0
+       .long   1070596096
+       .long   3322930631
+       .long   1069315398
+       .long   3277607933
+       .long   1067991276
+       .long   130253043
+       .long   1067467675
+       .long   1057196725
+       .long   1065475943
+       .long   3278604818
+       .long   1064420531
+       .long   4197429763
+       .long   1062747460
+       .long   1630708049
+       .long   1062399550
+       .long   880239780
+       .long   3219418012
+       .long   4135548218
+       .long   1015130368
+       .long   0
+       .long   1072693248
+       .long   2273547475
+       .long   1070333701
+       .long   4162052844
+       .long   1011378450
+       .long   0
+       .long   1070596096
+       .long   2392983423
+       .long   1069335146
+       .long   526970473
+       .long   1068030785
+       .long   628322840
+       .long   1067482270
+       .long   924033682
+       .long   1065512123
+       .long   854746912
+       .long   1064450346
+       .long   4004963071
+       .long   1062808438
+       .long   1468070334
+       .long   1060747995
+       .long   566785368
+       .long   3219443748
+       .long   2301849815
+       .long   3161093726
+       .long   0
+       .long   1072693248
+       .long   620845047
+       .long   1070371064
+       .long   314567191
+       .long   1013284227
+       .long   0
+       .long   1070596096
+       .long   2198158867
+       .long   1069355382
+       .long   222370857
+       .long   1068070839
+       .long   4028822361
+       .long   1067497314
+       .long   3610397327
+       .long   1065549234
+       .long   171354847
+       .long   1064481283
+       .long   693369877
+       .long   1062871714
+       .long   164532117
+       .long   1061632559
+       .long   253330956
+       .long   3219469484
+       .long   991505830
+       .long   3163481136
+       .long   0
+       .long   1072693248
+       .long   1894214069
+       .long   1070408552
+       .long   2182661802
+       .long   1012022503
+       .long   0
+       .long   1070596096
+       .long   1869133310
+       .long   1069376113
+       .long   1368144043
+       .long   1068111455
+       .long   242783364
+       .long   1067512821
+       .long   3692616565
+       .long   1065587313
+       .long   2890683560
+       .long   1064513419
+       .long   2407947124
+       .long   1062937380
+       .long   3803218812
+       .long   1060561671
+       .long   4234843841
+       .long   3219495219
+       .long   1479868884
+       .long   1014082158
+       .long   0
+       .long   1072693248
+       .long   2049842017
+       .long   1070446169
+       .long   2491067638
+       .long   3161241370
+       .long   0
+       .long   1070596096
+       .long   1431833764
+       .long   1069397346
+       .long   551048935
+       .long   1068152651
+       .long   2575917112
+       .long   1067528800
+       .long   1559777140
+       .long   1065626397
+       .long   743322322
+       .long   1064546764
+       .long   1974991899
+       .long   1063005565
+       .long   3459002328
+       .long   1062460308
+       .long   3921389429
+       .long   3219520955
+       .long   3647185164
+       .long   3162432194
+       .long   0
+       .long   1072693248
+       .long   1526324265
+       .long   1070483918
+       .long   4056333712
+       .long   3157795638
+       .long   0
+       .long   1070596096
+       .long   1830915900
+       .long   1069419088
+       .long   602185706
+       .long   1068194444
+       .long   555210277
+       .long   1067545266
+       .long   3690136761
+       .long   1065666523
+       .long   4115917104
+       .long   1064581405
+       .long   589230666
+       .long   1063076369
+       .long   3448584873
+       .long   1062382364
+       .long   3607935018
+       .long   3219546691
+       .long   4202814986
+       .long   1015564293
+       .long   0
+       .long   1072693248
+       .long   955408364
+       .long   1070521802
+       .long   2659929592
+       .long   3160779467
+       .long   0
+       .long   1070596096
+       .long   659174847
+       .long   1069441347
+       .long   2081794994
+       .long   1068236852
+       .long   2956616392
+       .long   1067562230
+       .long   1461867065
+       .long   1065707733
+       .long   879427925
+       .long   1064617384
+       .long   209598570
+       .long   1063149928
+       .long   59348277
+       .long   1061529630
+       .long   3294480606
+       .long   3219572427
+       .long   1489607747
+       .long   1002886683
+       .long   0
+       .long   1072693248
+       .long   1167858038
+       .long   1070559824
+       .long   2180017056
+       .long   1010873776
+       .long   0
+       .long   1070596096
+       .long   772792549
+       .long   1069464130
+       .long   3356872770
+       .long   1068279894
+       .long   3524844777
+       .long   1067579707
+       .long   1521756467
+       .long   1065750067
+       .long   3931969752
+       .long   1064654734
+       .long   2908114566
+       .long   1063226363
+       .long   3520733649
+       .long   1061374592
+       .long   2981026194
+       .long   3219598163
+       .long   924239062
+       .long   3163047211
+       .long   0
+       .long   1072693248
+       .long   3747221382
+       .long   1070597041
+       .long   1912303979
+       .long   1014066411
+       .long   0
+       .long   1070596096
+       .long   1727686788
+       .long   1069487445
+       .long   681802874
+       .long   1068323590
+       .long   2531789465
+       .long   1067597711
+       .long   331202638
+       .long   1065793569
+       .long   2627596742
+       .long   1064693515
+       .long   566979200
+       .long   1063280948
+       .long   2423252998
+       .long   1061741710
+       .long   2667571783
+       .long   3219623899
+       .long   1614402419
+       .long   1014950008
+       .long   0
+       .long   1072693248
+       .long   4148643959
+       .long   1070616195
+       .long   2887822437
+       .long   1014214935
+       .long   0
+       .long   1070596096
+       .long   4101770849
+       .long   1069511300
+       .long   1167052501
+       .long   1068367958
+       .long   2569727718
+       .long   1067616256
+       .long   1681502493
+       .long   1065838283
+       .long   3685967929
+       .long   1064733780
+       .long   2973319878
+       .long   1063322263
+       .long   474740638
+       .long   1062549181
+       .long   2354117371
+       .long   3219649635
+       .long   3512651629
+       .long   3161564344
+       .long   0
+       .long   1072693248
+       .long   373017919
+       .long   1070635424
+       .long   3647199022
+       .long   1014660881
+       .long   0
+       .long   1070596096
+       .long   933359764
+       .long   1069535705
+       .long   1391441088
+       .long   1068413019
+       .long   53106651
+       .long   1067635358
+       .long   4157835043
+       .long   1065884256
+       .long   4055868043
+       .long   1064775611
+       .long   1529330433
+       .long   1063365236
+       .long   326078913
+       .long   1062325273
+       .long   2040662960
+       .long   3219675371
+       .long   4270081753
+       .long   1015998218
+       .long   0
+       .long   1072693248
+       .long   4002124759
+       .long   1070654727
+       .long   3453343154
+       .long   1013423881
+       .long   0
+       .long   1071644672
+       .long   774562305
+       .long   3217018021
+       .long   377617675
+       .long   1068458794
+       .long   2495478050
+       .long   1067655031
+       .long   1508050213
+       .long   1065931538
+       .long   1921336565
+       .long   1064819067
+       .long   975923615
+       .long   1063409946
+       .long   2275792800
+       .long   1060505011
+       .long   1727208548
+       .long   3219701107
+       .long   2531251621
+       .long   1013613001
+       .long   0
+       .long   1072693248
+       .long   963359913
+       .long   1070674109
+       .long   2464811476
+       .long   3160767877
+       .long   0
+       .long   1071644672
+       .long   1498613974
+       .long   3216992493
+       .long   4138103782
+       .long   1068502123
+       .long   2840947366
+       .long   1067675293
+       .long   209537977
+       .long   1065980178
+       .long   3590357525
+       .long   1064864171
+       .long   73959555
+       .long   1063456484
+       .long   1512178095
+       .long   1062390487
+       .long   1413754136
+       .long   3219726843
+       .long   856972295
+       .long   3162613286
+       .long   0
+       .long   0
+       .long   0
+       .long   3220176896
+       .long   1994327296
+       .long   1006932657
+       .long   0
+       .long   1073741824
+       .long   0
+       .long   0
+       .long   266
+       .long   3221225472
+       .long   1431655956
+       .long   1074091349
+       .long   2828070733
+       .long   3221924522
+       .long   268536947
+       .long   1074860305
+       .long   4220652043
+       .long   3222647048
+       .long   3597047153
+       .long   1075552901
+       .long   1100299725
+       .long   3219752579
+       .long   874467977
+       .long   1015419713
+       .long   0
+       .long   0
+       .long   2668510354
+       .long   3220126045
+       .long   1701998120
+       .long   1012206572
+       .long   0
+       .long   1073741824
+       .long   1404962112
+       .long   3215492924
+       .long   3327263454
+       .long   3221125605
+       .long   1987673213
+       .long   1074008829
+       .long   231222583
+       .long   3221793459
+       .long   1756671652
+       .long   1074731884
+       .long   3921518330
+       .long   3222500748
+       .long   2691193109
+       .long   1075341426
+       .long   786845313
+       .long   3219778315
+       .long   627570489
+       .long   3159464635
+       .long   0
+       .long   0
+       .long   2949191430
+       .long   3220076398
+       .long   3989126963
+       .long   3163096676
+       .long   0
+       .long   1073741824
+       .long   2909112164
+       .long   3216503445
+       .long   3682557528
+       .long   3221031585
+       .long   4184421718
+       .long   1073932454
+       .long   380803270
+       .long   3221673930
+       .long   3399744364
+       .long   1074553823
+       .long   3842864962
+       .long   3222371390
+       .long   748075446
+       .long   1075157395
+       .long   473390901
+       .long   3219804051
+       .long   4252586071
+       .long   3163191791
+       .long   0
+       .long   0
+       .long   2308259791
+       .long   3220027898
+       .long   4111771200
+       .long   3156765800
+       .long   0
+       .long   1073741824
+       .long   411343470
+       .long   3217132228
+       .long   3760686807
+       .long   3220942979
+       .long   4171367426
+       .long   1073861688
+       .long   1878500541
+       .long   3221564765
+       .long   108767834
+       .long   1074393698
+       .long   2824899565
+       .long   3222239549
+       .long   3321236009
+       .long   1074997439
+       .long   159936490
+       .long   3219829787
+       .long   3547642993
+       .long   1014660846
+       .long   0
+       .long   0
+       .long   3342355758
+       .long   3219980491
+       .long   1666924640
+       .long   3162031356
+       .long   0
+       .long   1073741824
+       .long   2271288998
+       .long   3217480250
+       .long   4111284847
+       .long   3220859392
+       .long   2796272966
+       .long   1073796048
+       .long   1730314448
+       .long   3221464928
+       .long   1813001552
+       .long   1074249474
+       .long   603251437
+       .long   3222036157
+       .long   3079042443
+       .long   1074856525
+       .long   4141449374
+       .long   3219855522
+       .long   1579411055
+       .long   3161853506
+       .long   0
+       .long   0
+       .long   166164867
+       .long   3219934128
+       .long   2304492376
+       .long   1012090550
+       .long   0
+       .long   1073741824
+       .long   2798667120
+       .long   3217812323
+       .long   4203596829
+       .long   3220780463
+       .long   1473339147
+       .long   1073728374
+       .long   4243021652
+       .long   3221373498
+       .long   1638747017
+       .long   1074119375
+       .long   1512673116
+       .long   3221855335
+       .long   2338684822
+       .long   1074678259
+       .long   3827994963
+       .long   3219881258
+       .long   941734744
+       .long   1015853638
+       .long   0
+       .long   0
+       .long   3247184626
+       .long   3219888759
+       .long   1245319390
+       .long   3161909785
+       .long   0
+       .long   1073741824
+       .long   2381906911
+       .long   3218104536
+       .long   1010924947
+       .long   3220705862
+       .long   2481381005
+       .long   1073615072
+       .long   1356661294
+       .long   3221289659
+       .long   1527070583
+       .long   1074001844
+       .long   3061693405
+       .long   3221694303
+       .long   1993154673
+       .long   1074463435
+       .long   3514540551
+       .long   3219906994
+       .long   2102765473
+       .long   1013034678
+       .long   0
+       .long   0
+       .long   4189730214
+       .long   3219844341
+       .long   872357632
+       .long   3158652168
+       .long   0
+       .long   1073741824
+       .long   760634709
+       .long   3218255915
+       .long   2067827628
+       .long   3220635284
+       .long   1386756408
+       .long   1073509659
+       .long   404552634
+       .long   3221199890
+       .long   1143062644
+       .long   1073895515
+       .long   555342338
+       .long   3221550657
+       .long   3470199450
+       .long   1074271418
+       .long   3201086139
+       .long   3219932730
+       .long   4185319304
+       .long   3162757866
+       .long   0
+       .long   0
+       .long   719595600
+       .long   3219800832
+       .long   114970824
+       .long   1014660100
+       .long   0
+       .long   1073741824
+       .long   3811788216
+       .long   3218400550
+       .long   1264738948
+       .long   3220568452
+       .long   1958933439
+       .long   1073411493
+       .long   4246310163
+       .long   3221058356
+       .long   1367842247
+       .long   1073799186
+       .long   4112596176
+       .long   3221422310
+       .long   2100954469
+       .long   1074105254
+       .long   2887631728
+       .long   3219958466
+       .long   1841088264
+       .long   1015275132
+       .long   0
+       .long   0
+       .long   258163604
+       .long   3219758190
+       .long   3299889334
+       .long   3162612005
+       .long   0
+       .long   1073741824
+       .long   2865277319
+       .long   3218538798
+       .long   3110066496
+       .long   3220505109
+       .long   723074889
+       .long   1073319994
+       .long   1618819009
+       .long   3220928086
+       .long   1176243935
+       .long   1073681775
+       .long   1223849000
+       .long   3221307454
+       .long   2369288310
+       .long   1073957581
+       .long   2574177316
+       .long   3219984202
+       .long   2889755040
+       .long   3160514672
+       .long   0
+       .long   0
+       .long   2079874795
+       .long   3219716377
+       .long   1885564844
+       .long   1014470429
+       .long   0
+       .long   1073741824
+       .long   1656469901
+       .long   3218670989
+       .long   823761676
+       .long   3220445021
+       .long   2491445454
+       .long   1073234634
+       .long   1584341555
+       .long   3220808039
+       .long   1976688438
+       .long   1073523018
+       .long   3918313362
+       .long   3221183550
+       .long   3178717701
+       .long   1073829019
+       .long   2260722904
+       .long   3220009938
+       .long   3285965784
+       .long   3163336372
+       .long   0
+       .long   0
+       .long   997287281
+       .long   3219675358
+       .long   3612251184
+       .long   3163317056
+       .long   0
+       .long   1073741824
+       .long   3037674984
+       .long   3218797431
+       .long   2624215131
+       .long   3220387969
+       .long   464779768
+       .long   1073154936
+       .long   3700763630
+       .long   3220697284
+       .long   1200926910
+       .long   1073378628
+       .long   2934576448
+       .long   3220998744
+       .long   3287041894
+       .long   1073681673
+       .long   1947268493
+       .long   3220035674
+       .long   1185916272
+       .long   1014371685
+       .long   0
+       .long   0
+       .long   3978924239
+       .long   3219635097
+       .long   680771999
+       .long   1015720881
+       .long   0
+       .long   1073741824
+       .long   3528982175
+       .long   3218918413
+       .long   3018376188
+       .long   3220333754
+       .long   2093086652
+       .long   1073080463
+       .long   451029217
+       .long   3220594987
+       .long   1097121537
+       .long   1073247142
+       .long   2277789243
+       .long   3220832617
+       .long   149138386
+       .long   1073478822
+       .long   1633814081
+       .long   3220061410
+       .long   3941137777
+       .long   3162142667
+       .long   0
+       .long   0
+       .long   3860971117
+       .long   3219595563
+       .long   2891614774
+       .long   3163214156
+       .long   0
+       .long   1073741824
+       .long   80822128
+       .long   3219034205
+       .long   2077635078
+       .long   3220282191
+       .long   1552870456
+       .long   1073010820
+       .long   3607700650
+       .long   3220500394
+       .long   249538439
+       .long   1073127265
+       .long   2233833083
+       .long   3220683068
+       .long   2436456793
+       .long   1073293556
+       .long   1320359670
+       .long   3220087146
+       .long   1908355032
+       .long   1015709057
+       .long   0
+       .long   0
+       .long   343219638
+       .long   3219556725
+       .long   2238262736
+       .long   3161731808
+       .long   0
+       .long   1072693248
+       .long   3768132253
+       .long   1071627934
+       .long   3895546569
+       .long   3220233108
+       .long   1613056473
+       .long   1072945645
+       .long   3409294908
+       .long   3220412831
+       .long   3138966349
+       .long   1073017844
+       .long   3799067288
+       .long   3220548255
+       .long   359470498
+       .long   1073133087
+       .long   1006905258
+       .long   3220112882
+       .long   3348558652
+       .long   1011988294
+       .long   0
+       .long   0
+       .long   3841229102
+       .long   3219518551
+       .long   1782820117
+       .long   3163516640
+       .long   0
+       .long   1072693248
+       .long   866896685
+       .long   1071521786
+       .long   2743435231
+       .long   3220186348
+       .long   3017984361
+       .long   1072884608
+       .long   1491919678
+       .long   3220331688
+       .long   1507535811
+       .long   1072917857
+       .long   1966124974
+       .long   3220426562
+       .long   381628641
+       .long   1072992589
+       .long   693450846
+       .long   3220138618
+       .long   3218699017
+       .long   3162902447
+       .long   0
+       .long   0
+       .long   716700048
+       .long   3219481016
+       .long   1043841701
+       .long   3163006458
+       .long   0
+       .long   1072693248
+       .long   1097907398
+       .long   1071420120
+       .long   3912524876
+       .long   3220106631
+       .long   4107784306
+       .long   1072827408
+       .long   937056065
+       .long   3220256414
+       .long   4128945134
+       .long   1072826390
+       .long   1032262394
+       .long   3220316565
+       .long   1825923585
+       .long   1072864423
+       .long   379996435
+       .long   3220164354
+       .long   2807708551
+       .long   1015130551
+       .long   0
+       .long   0
+       .long   142288477
+       .long   3219444091
+       .long   1256348500
+       .long   1014532780
+       .long   0
+       .long   1072693248
+       .long   925074332
+       .long   1071322730
+       .long   2134728327
+       .long   3220021541
+       .long   1886408555
+       .long   1072773770
+       .long   101893267
+       .long   3220186512
+       .long   2020085224
+       .long   1072742631
+       .long   2955803861
+       .long   3220217010
+       .long   343310816
+       .long   1072748161
+       .long   33271012
+       .long   3220183493
+       .long   2269574412
+       .long   1016902031
+       .long   0
+       .long   0
+       .long   3684492763
+       .long   3219407750
+       .long   2905890526
+       .long   1015709561
+       .long   0
+       .long   1072693248
+       .long   585640690
+       .long   1071229422
+       .long   1068301595
+       .long   3219940277
+       .long   2953900489
+       .long   1072723440
+       .long   950237889
+       .long   3220066167
+       .long   109735425
+       .long   1072638455
+       .long   792610979
+       .long   3220076689
+       .long   2904190292
+       .long   1072594405
+       .long   4171511102
+       .long   3220196360
+       .long   987810900
+       .long   1016106563
+       .long   0
+       .long   0
+       .long   681498355
+       .long   3219371971
+       .long   3542625299
+       .long   1015827699
+       .long   0
+       .long   1072693248
+       .long   168222332
+       .long   1071140014
+       .long   776736583
+       .long   3219862604
+       .long   2405401100
+       .long   1072659128
+       .long   430546584
+       .long   3219945234
+       .long   2974083786
+       .long   1072497552
+       .long   849442068
+       .long   3219912970
+       .long   2727451532
+       .long   1072409680
+       .long   4014783896
+       .long   3220209228
+       .long   3119156846
+       .long   1014082523
+       .long   0
+       .long   0
+       .long   2298773501
+       .long   3219336728
+       .long   4027807132
+       .long   1015090440
+       .long   0
+       .long   1072693248
+       .long   312748411
+       .long   1071054335
+       .long   2723913091
+       .long   3219788303
+       .long   3207063211
+       .long   1072570353
+       .long   1845780128
+       .long   3219832588
+       .long   752659336
+       .long   1072368142
+       .long   1097207453
+       .long   3219764237
+       .long   407427403
+       .long   1072246732
+       .long   3858056690
+       .long   3220222096
+       .long   2007897202
+       .long   3162431829
+       .long   0
+       .long   0
+       .long   2591355529
+       .long   3219302000
+       .long   2351326818
+       .long   3161908153
+       .long   0
+       .long   1072693248
+       .long   3206845590
+       .long   1070972224
+       .long   4023349050
+       .long   3219717171
+       .long   3838822434
+       .long   1072486918
+       .long   3122427157
+       .long   3219727557
+       .long   2261703627
+       .long   1072249178
+       .long   1764870100
+       .long   3219628955
+       .long   3201802997
+       .long   1072093301
+       .long   3701329484
+       .long   3220234964
+       .long   2857479637
+       .long   3163806625
+       .long   0
+       .long   0
+       .long   4010047525
+       .long   3219267765
+       .long   3339891512
+       .long   3160072694
+       .long   0
+       .long   1072693248
+       .long   966450668
+       .long   1070893532
+       .long   803989702
+       .long   3219649019
+       .long   1934453966
+       .long   1072408465
+       .long   1455077850
+       .long   3219629530
+       .long   2709264343
+       .long   1072139721
+       .long   1918064558
+       .long   3219505762
+       .long   1476733535
+       .long   1071960574
+       .long   3544602278
+       .long   3220247832
+       .long   4139243149
+       .long   3164602093
+       .long   0
+       .long   0
+       .long   4270735453
+       .long   3219234003
+       .long   3565361953
+       .long   1015342529
+       .long   0
+       .long   1072693248
+       .long   2915760230
+       .long   1070818115
+       .long   638580392
+       .long   3219583668
+       .long   2252948193
+       .long   1072334663
+       .long   1194731830
+       .long   3219537949
+       .long   1353002942
+       .long   1072038927
+       .long   422364789
+       .long   3219393446
+       .long   3669634446
+       .long   1071842023
+       .long   3387875073
+       .long   3220260700
+       .long   3168927931
+       .long   1016323525
+       .long   0
+       .long   0
+       .long   419968236
+       .long   3219200695
+       .long   131828542
+       .long   1015961466
+       .long   0
+       .long   1072693248
+       .long   2960267235
+       .long   1070745841
+       .long   1037049094
+       .long   3219520953
+       .long   1447436626
+       .long   1072265209
+       .long   3197232138
+       .long   3219452306
+       .long   4004685084
+       .long   1071946034
+       .long   1412816421
+       .long   3219290928
+       .long   3184738590
+       .long   1071740610
+       .long   3231147867
+       .long   3220273568
+       .long   3253690381
+       .long   1014950373
+       .long   0
+       .long   0
+       .long   1505561933
+       .long   3219167820
+       .long   2813885200
+       .long   1011162516
+       .long   0
+       .long   1072693248
+       .long   2997217365
+       .long   1070676584
+       .long   2681788575
+       .long   3219460719
+       .long   3989126937
+       .long   1072199822
+       .long   1049115510
+       .long   3219372139
+       .long   511642058
+       .long   1071860360
+       .long   4034728051
+       .long   3219197246
+       .long   1788863965
+       .long   1071639550
+       .long   3074420661
+       .long   3220286436
+       .long   1873363667
+       .long   3161563979
+       .long   0
+       .long   0
+       .long   2606398711
+       .long   3219135361
+       .long   2533072598
+       .long   3162554073
+       .long   0
+       .long   1072693248
+       .long   2151361100
+       .long   1070610226
+       .long   1532348096
+       .long   3219402822
+       .long   408604530
+       .long   1072138246
+       .long   1039538740
+       .long   3219297023
+       .long   1234598850
+       .long   1071781284
+       .long   692507578
+       .long   3219094767
+       .long   4090315877
+       .long   1071451983
+       .long   2917693455
+       .long   3220299304
+       .long   676362605
+       .long   3163589663
+       .long   0
+       .long   0
+       .long   3649427950
+       .long   3219078282
+       .long   4113825640
+       .long   3158662193
+       .long   0
+       .long   1072693248
+       .long   2424145432
+       .long   1070497215
+       .long   2715404890
+       .long   3219347125
+       .long   2238283673
+       .long   1072080240
+       .long   1186867211
+       .long   3219226571
+       .long   660318792
+       .long   1071708248
+       .long   2091427915
+       .long   3218937780
+       .long   2591062635
+       .long   1071291190
+       .long   2760966249
+       .long   3220312172
+       .long   1958126117
+       .long   3164385131
+       .long   0
+       .long   0
+       .long   220675706
+       .long   3219014926
+       .long   3158451653
+       .long   3161723787
+       .long   0
+       .long   1072693248
+       .long   1565030890
+       .long   1070375439
+       .long   335263687
+       .long   3219293502
+       .long   419816567
+       .long   1072025586
+       .long   2098048102
+       .long   3219160428
+       .long   257229335
+       .long   1071636821
+       .long   3464457189
+       .long   3218793840
+       .long   2745923191
+       .long   1071158056
+       .long   2604239044
+       .long   3220325040
+       .long   1055077667
+       .long   1016540488
+       .long   0
+       .long   0
+       .long   2191706112
+       .long   3218952300
+       .long   333441366
+       .long   3161331348
+       .long   0
+       .long   1072693248
+       .long   3435408456
+       .long   1070258830
+       .long   487319719
+       .long   3219241832
+       .long   1713711059
+       .long   1071974079
+       .long   130753286
+       .long   3219068219
+       .long   909725130
+       .long   1071511974
+       .long   2762442367
+       .long   3218661715
+       .long   932670499
+       .long   1071027067
+       .long   2447511838
+       .long   3220337908
+       .long   3841595606
+       .long   1015419895
+       .long   0
+       .long   0
+       .long   408840118
+       .long   3218890375
+       .long   4048072104
+       .long   3159354273
+       .long   0
+       .long   1072693248
+       .long   2794370512
+       .long   1070147203
+       .long   1550993351
+       .long   3219192003
+       .long   1305093678
+       .long   1071925532
+       .long   1748211158
+       .long   3218951271
+       .long   3244212114
+       .long   1071396455
+       .long   2145666003
+       .long   3218540299
+       .long   1098451822
+       .long   1070891096
+       .long   2290784632
+       .long   3220350776
+       .long   2660353234
+       .long   3159463173
+       .long   0
+       .long   0
+       .long   3368427099
+       .long   3218829119
+       .long   2187864186
+       .long   1013587140
+       .long   0
+       .long   1072693248
+       .long   1708021028
+       .long   1070040382
+       .long   459972195
+       .long   3219143910
+       .long   3210514347
+       .long   1071879770
+       .long   955408873
+       .long   3218841145
+       .long   1911386085
+       .long   1071289511
+       .long   3563284038
+       .long   3218428599
+       .long   547420745
+       .long   1070790031
+       .long   2134057426
+       .long   3220363644
+       .long   1285458442
+       .long   3163191609
+       .long   0
+       .long   0
+       .long   2583490354
+       .long   3218768505
+       .long   27148750
+       .long   3161491985
+       .long   0
+       .long   1072693248
+       .long   2550940470
+       .long   1069938201
+       .long   2616040293
+       .long   3219066585
+       .long   2529278955
+       .long   1071836633
+       .long   2244405849
+       .long   3218737335
+       .long   2064814127
+       .long   1071190460
+       .long   1527853251
+       .long   3218325722
+       .long   354247476
+       .long   1070708112
+       .long   1977330220
+       .long   3220376512
+       .long   4071976381
+       .long   3164168168
+       .long   0
+       .long   0
+       .long   2390846448
+       .long   3218708504
+       .long   3510503948
+       .long   3161709355
+       .long   0
+       .long   1072693248
+       .long   1208409702
+       .long   1069840505
+       .long   1006199412
+       .long   3218976755
+       .long   2504246873
+       .long   1071795971
+       .long   1040653613
+       .long   3218639377
+       .long   1713268217
+       .long   1071098686
+       .long   462276301
+       .long   3218230862
+       .long   4239163357
+       .long   1070603989
+       .long   1820603015
+       .long   3220389380
+       .long   3236194699
+       .long   1016757450
+       .long   0
+       .long   0
+       .long   2528366626
+       .long   3218649089
+       .long   3808712102
+       .long   1013396510
+       .long   0
+       .long   1072693248
+       .long   1938261590
+       .long   1069747146
+       .long   4282399603
+       .long   3218889831
+       .long   1922568281
+       .long   1071757646
+       .long   2428166646
+       .long   3218546841
+       .long   717464824
+       .long   1071013623
+       .long   2205664075
+       .long   3218143293
+       .long   1526076492
+       .long   1070438229
+       .long   1663875809
+       .long   3220402248
+       .long   3908862373
+       .long   1015853820
+       .long   0
+       .long   0
+       .long   2200768388
+       .long   3218590234
+       .long   302584884
+       .long   1014949287
+       .long   0
+       .long   1072693248
+       .long   2338248308
+       .long   1069657986
+       .long   2617403810
+       .long   3218805648
+       .long   60078074
+       .long   1071721530
+       .long   2753634668
+       .long   3218459332
+       .long   626020946
+       .long   1070934758
+       .long   25846122
+       .long   3218044977
+       .long   1123428672
+       .long   1070307499
+       .long   1507148603
+       .long   3220415116
+       .long   1086374101
+       .long   1013035409
+       .long   0
+       .long   0
+       .long   4158096969
+       .long   3218531913
+       .long   3224512900
+       .long   3160902954
+       .long   0
+       .long   1072693248
+       .long   4240313622
+       .long   1069572894
+       .long   3745046477
+       .long   3218724046
+       .long   1955120038
+       .long   1071687503
+       .long   2661530988
+       .long   3218376484
+       .long   2615081511
+       .long   1070861626
+       .long   3172686029
+       .long   3217895196
+       .long   3468537113
+       .long   1070173373
+       .long   1350421397
+       .long   3220427984
+       .long   1218191675
+       .long   3162757684
+       .long   0
+       .long   0
+       .long   1606100959
+       .long   3218474103
+       .long   3385789004
+       .long   3161114183
+       .long   0
+       .long   1072693248
+       .long   2255302008
+       .long   1069435977
+       .long   54085333
+       .long   3218644877
+       .long   2504974906
+       .long   1071655456
+       .long   4169947836
+       .long   3218297958
+       .long   2891827398
+       .long   1070793803
+       .long   1030744944
+       .long   3217756428
+       .long   2378245768
+       .long   1070036506
+       .long   1193694191
+       .long   3220440852
+       .long   1890859349
+       .long   3163951206
+       .long   0
+       .long   0
+       .long   3782220567
+       .long   3218416778
+       .long   2488119274
+       .long   3162237132
+       .long   0
+       .long   1072693248
+       .long   91372748
+       .long   1069281344
+       .long   318776714
+       .long   3218567997
+       .long   1791786485
+       .long   1071605902
+       .long   245863368
+       .long   3218223442
+       .long   3306699316
+       .long   1070730899
+       .long   492155895
+       .long   3217627699
+       .long   504590813
+       .long   1069961586
+       .long   1036966986
+       .long   3220453720
+       .long   1122344434
+       .long   1016974413
+       .long   0
+       .long   0
+       .long   1412148370
+       .long   3218359917
+       .long   2689483850
+       .long   1013993587
+       .long   0
+       .long   1072693248
+       .long   1375255072
+       .long   1069134151
+       .long   1493266594
+       .long   3218493272
+       .long   487968719
+       .long   1071549129
+       .long   4010395236
+       .long   3218152642
+       .long   2875570533
+       .long   1070672565
+       .long   2596803943
+       .long   3217508124
+       .long   2843491945
+       .long   1069843051
+       .long   880239780
+       .long   3220466588
+       .long   4135548218
+       .long   1016178944
+       .long   0
+       .long   0
+       .long   895247324
+       .long   3218303496
+       .long   3064008070
+       .long   1013805381
+       .long   0
+       .long   1072693248
+       .long   729983844
+       .long   1068994194
+       .long   3631919317
+       .long   3218420574
+       .long   2031343772
+       .long   1071495745
+       .long   1505593195
+       .long   3218085291
+       .long   519428997
+       .long   1070618477
+       .long   3710689661
+       .long   3217396902
+       .long   3156076115
+       .long   1069741343
+       .long   723512574
+       .long   3220479456
+       .long   2825204233
+       .long   1014372050
+       .long   0
+       .long   0
+       .long   2664093517
+       .long   3218247493
+       .long   3574482624
+       .long   3157273734
+       .long   0
+       .long   1072693248
+       .long   2465054196
+       .long   1068861279
+       .long   3495559184
+       .long   3218349782
+       .long   2180799467
+       .long   1071445588
+       .long   3760731789
+       .long   3217962527
+       .long   3108073739
+       .long   1070540584
+       .long   1955989624
+       .long   3217293302
+       .long   166797605
+       .long   1069654305
+       .long   566785368
+       .long   3220492324
+       .long   2301849815
+       .long   3162142302
+       .long   0
+       .long   0
+       .long   1026922473
+       .long   3218191888
+       .long   4275547180
+       .long   3161242805
+       .long   0
+       .long   1072693248
+       .long   865263972
+       .long   1068735226
+       .long   1189261043
+       .long   3218280780
+       .long   602895285
+       .long   1071398507
+       .long   457371263
+       .long   3217840141
+       .long   1846858242
+       .long   1070447677
+       .long   3060498116
+       .long   3217196657
+       .long   4267893365
+       .long   1069596604
+       .long   410058162
+       .long   3220505192
+       .long   4004709614
+       .long   3163734243
+       .long   0
+       .long   0
+       .long   1197423420
+       .long   3218136659
+       .long   176395860
+       .long   3160912588
+       .long   0
+       .long   1072693248
+       .long   3614211808
+       .long   1068615863
+       .long   2638984897
+       .long   3218213456
+       .long   1695604536
+       .long   1071354361
+       .long   2372043566
+       .long   3217723241
+       .long   136909605
+       .long   1070361652
+       .long   3640039447
+       .long   3217106358
+       .long   4088615056
+       .long   1069449448
+       .long   253330956
+       .long   3220518060
+       .long   991505830
+       .long   3164529712
+       .long   0
+       .long   0
+       .long   1971725998
+       .long   3218081786
+       .long   2628057466
+       .long   3160778219
+       .long   0
+       .long   1072693248
+       .long   3850616508
+       .long   1068503032
+       .long   715485429
+       .long   3218147706
+       .long   2831870887
+       .long   1071313021
+       .long   276112813
+       .long   3217611421
+       .long   4071473627
+       .long   1070282053
+       .long   3678820506
+       .long   3217012537
+       .long   927889203
+       .long   1069392578
+       .long   96603751
+       .long   3220530928
+       .long   2021697954
+       .long   1016395907
+       .long   0
+       .long   0
+       .long   4068253482
+       .long   3217974755
+       .long   3098800802
+       .long   3161416360
+       .long   0
+       .long   1072693248
+       .long   3555466384
+       .long   1068294223
+       .long   3714292293
+       .long   3218083427
+       .long   58004546
+       .long   1071274368
+       .long   2889916307
+       .long   3217504297
+       .long   2725223785
+       .long   1070208483
+       .long   1960889150
+       .long   3216854085
+       .long   2172838405
+       .long   1069259864
+       .long   4234843841
+       .long   3220543795
+       .long   1479868884
+       .long   1015130734
+       .long   0
+       .long   0
+       .long   3947580658
+       .long   3217866316
+       .long   4153464200
+       .long   3160712468
+       .long   0
+       .long   1072693248
+       .long   1306970432
+       .long   1068093810
+       .long   3320658510
+       .long   3217961305
+       .long   2638377394
+       .long   1071238289
+       .long   1218095092
+       .long   3217401513
+       .long   506153465
+       .long   1070140566
+       .long   2096772766
+       .long   3216705262
+       .long   2058303373
+       .long   1069148484
+       .long   4078116635
+       .long   3220556663
+       .long   39665264
+       .long   3161092265
+       .long   0
+       .long   0
+       .long   4023957346
+       .long   3217758473
+       .long   2652051644
+       .long   3159900932
+       .long   0
+       .long   1072693248
+       .long   1548193280
+       .long   1067905620
+       .long   2849460080
+       .long   3217838064
+       .long   586099284
+       .long   1071204684
+       .long   2426038050
+       .long   3217302731
+       .long   1209882939
+       .long   1070077962
+       .long   204929670
+       .long   3216565209
+       .long   2951398611
+       .long   1069077118
+       .long   3921389429
+       .long   3220569531
+       .long   3647185164
+       .long   3163480770
+       .long   0
+       .long   0
+       .long   3763679576
+       .long   3217651189
+       .long   448385104
+       .long   3157192355
+       .long   0
+       .long   1072693248
+       .long   64931152
+       .long   1067729411
+       .long   3593250320
+       .long   3217717209
+       .long   1127364104
+       .long   1071173457
+       .long   21320967
+       .long   3217207636
+       .long   4036384111
+       .long   1070020367
+       .long   3394693850
+       .long   3216433130
+       .long   4171153724
+       .long   1068939101
+       .long   3764662223
+       .long   3220582399
+       .long   3105356094
+       .long   3164312749
+       .long   0
+       .long   0
+       .long   1425758568
+       .long   3217544428
+       .long   1224254624
+       .long   3159340630
+       .long   0
+       .long   1072693248
+       .long   2086713664
+       .long   1067564956
+       .long   1688303979
+       .long   3217598569
+       .long   938619730
+       .long   1071144522
+       .long   526120622
+       .long   3217115928
+       .long   3819295674
+       .long   1069967496
+       .long   2059466203
+       .long   3216308301
+       .long   4034680199
+       .long   1068903334
+       .long   3607935018
+       .long   3220595267
+       .long   4202814986
+       .long   1016612869
+       .long   0
+       .long   0
+       .long   2429422902
+       .long   3217438153
+       .long   3297520416
+       .long   1012522944
+       .long   0
+       .long   1072693248
+       .long   528565440
+       .long   1067373727
+       .long   2395999282
+       .long   3217481977
+       .long   1512953454
+       .long   1071117799
+       .long   2702142222
+       .long   3217023483
+       .long   3515899579
+       .long   1069919100
+       .long   2767905791
+       .long   3216190039
+       .long   3127036520
+       .long   1068808800
+       .long   3451207812
+       .long   3220608135
+       .long   1547135652
+       .long   1015564659
+       .long   0
+       .long   0
+       .long   1959743063
+       .long   3217332330
+       .long   607720656
+       .long   3161041674
+       .long   0
+       .long   1072693248
+       .long   225834432
+       .long   1067090614
+       .long   732340398
+       .long   3217367274
+       .long   3221152670
+       .long   1071093215
+       .long   2810588359
+       .long   3216851955
+       .long   612200454
+       .long   1069874948
+       .long   645427044
+       .long   3216077719
+       .long   1966523063
+       .long   1068694214
+       .long   3294480606
+       .long   3220621003
+       .long   1489607747
+       .long   1003935259
+       .long   0
+       .long   0
+       .long   1940260416
+       .long   3217226924
+       .long   4144841612
+       .long   3159543701
+       .long   0
+       .long   1072693248
+       .long   1135818128
+       .long   1066829850
+       .long   867512158
+       .long   3217254304
+       .long   3821819258
+       .long   1071070704
+       .long   2890864845
+       .long   3216685596
+       .long   918459421
+       .long   1069834828
+       .long   797471869
+       .long   3215958923
+       .long   4093823457
+       .long   1068635569
+       .long   3137753400
+       .long   3220633871
+       .long   3579918397
+       .long   3163046845
+       .long   0
+       .long   0
+       .long   2242453104
+       .long   3217121901
+       .long   1143544320
+       .long   1011877960
+       .long   0
+       .long   1072693248
+       .long   1016752608
+       .long   1066591110
+       .long   1270001991
+       .long   3217142917
+       .long   1410785275
+       .long   1071050206
+       .long   1103929722
+       .long   3216523923
+       .long   3268015214
+       .long   1069798554
+       .long   957665123
+       .long   3215754628
+       .long   1067716675
+       .long   1068610012
+       .long   2981026194
+       .long   3220646739
+       .long   924239062
+       .long   3164095787
+       .long   0
+       .long   0
+       .long   982366697
+       .long   3217003288
+       .long   1160619554
+       .long   1010902188
+       .long   0
+       .long   1072693248
+       .long   404678272
+       .long   1066346403
+       .long   1419607756
+       .long   3217032967
+       .long   1800406832
+       .long   1071031665
+       .long   3144361055
+       .long   3216366473
+       .long   1744148039
+       .long   1069765960
+       .long   3211598528
+       .long   3215558937
+       .long   405031618
+       .long   1068609434
+       .long   2824298989
+       .long   3220659607
+       .long   2088964722
+       .long   1016829832
+       .long   0
+       .long   0
+       .long   931121154
+       .long   3216794574
+       .long   1121583044
+       .long   1012154237
+       .long   0
+       .long   1072693248
+       .long   709357472
+       .long   1065955296
+       .long   29972165
+       .long   3216817456
+       .long   254360647
+       .long   1071015033
+       .long   3732687627
+       .long   3216212805
+       .long   3224370681
+       .long   1069736900
+       .long   202592280
+       .long   3215370879
+       .long   1420621447
+       .long   1068491719
+       .long   2667571783
+       .long   3220672475
+       .long   1614402419
+       .long   1015998584
+       .long   0
+       .long   0
+       .long   2354785698
+       .long   3216586427
+       .long   959264268
+       .long   3159915811
+       .long   0
+       .long   1072693248
+       .long   2828230112
+       .long   1065606626
+       .long   3693284264
+       .long   3216602456
+       .long   1996210616
+       .long   1071000265
+       .long   3053541878
+       .long   3216062494
+       .long   1133334567
+       .long   1069711236
+       .long   977677585
+       .long   3215189563
+       .long   347473669
+       .long   1068436198
+       .long   2510844577
+       .long   3220685343
+       .long   498468876
+       .long   1013614463
+       .long   0
+       .long   0
+       .long   1972895212
+       .long   3216378783
+       .long   3207896256
+       .long   3158122047
+       .long   0
+       .long   1072693248
+       .long   4107853760
+       .long   1065246718
+       .long   2229347510
+       .long   3216389497
+       .long   4172638464
+       .long   1070987323
+       .long   212469442
+       .long   3215847669
+       .long   1989165661
+       .long   1069688852
+       .long   4131454738
+       .long   3215014128
+       .long   3452987325
+       .long   1068469531
+       .long   2354117371
+       .long   3220698211
+       .long   3512651629
+       .long   3162612920
+       .long   0
+       .long   0
+       .long   3439278129
+       .long   3216171577
+       .long   1073008748
+       .long   3159914989
+       .long   0
+       .long   1072693248
+       .long   2934847296
+       .long   1064716672
+       .long   2625704508
+       .long   3216178311
+       .long   3692939630
+       .long   1070976174
+       .long   3072165553
+       .long   3215558041
+       .long   223733198
+       .long   1069669653
+       .long   1158528288
+       .long   3214753465
+       .long   3197803998
+       .long   1068357327
+       .long   2197390165
+       .long   3220711079
+       .long   3038089327
+       .long   3163878824
+       .long   0
+       .long   0
+       .long   3930011523
+       .long   3215946901
+       .long   3574565577
+       .long   1010859792
+       .long   0
+       .long   1072693248
+       .long   930814464
+       .long   1064233867
+       .long   3218126771
+       .long   3215954682
+       .long   873740287
+       .long   1070966789
+       .long   1580060562
+       .long   3215272745
+       .long   1505280051
+       .long   1069653548
+       .long   2221338643
+       .long   3214421240
+       .long   2641116540
+       .long   1068312400
+       .long   2040662960
+       .long   3220723947
+       .long   4270081753
+       .long   1017046794
+       .long   0
+       .long   0
+       .long   2319126882
+       .long   3215533863
+       .long   2132624928
+       .long   3153789373
+       .long   0
+       .long   1072693248
+       .long   2962101888
+       .long   1063503197
+       .long   3966050657
+       .long   3215537841
+       .long   3178024141
+       .long   1070959142
+       .long   1146830997
+       .long   3214991029
+       .long   1630003424
+       .long   1069640468
+       .long   2204651989
+       .long   3214096041
+       .long   796867276
+       .long   1068243248
+       .long   1883935754
+       .long   3220736815
+       .long   2988318241
+       .long   1016251326
+       .long   0
+       .long   0
+       .long   3919601072
+       .long   3215121322
+       .long   2384023593
+       .long   1011053048
+       .long   0
+       .long   1072693248
+       .long   1803946752
+       .long   1062615560
+       .long   2247013512
+       .long   3215122999
+       .long   3277043521
+       .long   1070953215
+       .long   578207576
+       .long   3214490301
+       .long   1619551293
+       .long   1069630354
+       .long   2648603598
+       .long   3213667381
+       .long   2728840488
+       .long   1068193529
+       .long   1727208548
+       .long   3220749683
+       .long   2531251621
+       .long   1014661577
+       .long   0
+       .long   0
+       .long   612012528
+       .long   3214484294
+       .long   549859680
+       .long   1005659865
+       .long   0
+       .long   1072693248
+       .long   2064191488
+       .long   1061404484
+       .long   4042886527
+       .long   3214485286
+       .long   149923164
+       .long   1070948993
+       .long   104448276
+       .long   3213936806
+       .long   2663431480
+       .long   1069623160
+       .long   4100741337
+       .long   3213036454
+       .long   3253086979
+       .long   1068220130
+       .long   1570481342
+       .long   3220762551
+       .long   2595802427
+       .long   3161852775
+       .long   0
+       .long   0
+       .long   75380366
+       .long   3213435470
+       .long   3015416698
+       .long   1008346766
+       .long   0
+       .long   1072693248
+       .long   2911696896
+       .long   1059306942
+       .long   451505506
+       .long   3213435718
+       .long   3089290734
+       .long   1070946463
+       .long   3705470162
+       .long   3212886822
+       .long   2568117130
+       .long   1069618857
+       .long   643302148
+       .long   3211985100
+       .long   500114129
+       .long   1068202863
+       .long   0
+       .long   1090469888
+       .long   0
+       .long   1090469888
+       .long   0
+       .long   1090469888
+       .long   0
+       .long   1090469888
+       .long   0
+       .long   1090469888
+       .long   0
+       .long   1090469888
+       .long   0
+       .long   1090469888
+       .long   0
+       .long   1090469888
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   1841940611
+       .long   1071931184
+       .long   1841940611
+       .long   1071931184
+       .long   1841940611
+       .long   1071931184
+       .long   1841940611
+       .long   1071931184
+       .long   1841940611
+       .long   1071931184
+       .long   1841940611
+       .long   1071931184
+       .long   1841940611
+       .long   1071931184
+       .long   1841940611
+       .long   1071931184
+       .long   1413742592
+       .long   1073291771
+       .long   1413742592
+       .long   1073291771
+       .long   1413742592
+       .long   1073291771
+       .long   1413742592
+       .long   1073291771
+       .long   1413742592
+       .long   1073291771
+       .long   1413742592
+       .long   1073291771
+       .long   1413742592
+       .long   1073291771
+       .long   1413742592
+       .long   1073291771
+       .long   1280049152
+       .long   1032227875
+       .long   1280049152
+       .long   1032227875
+       .long   1280049152
+       .long   1032227875
+       .long   1280049152
+       .long   1032227875
+       .long   1280049152
+       .long   1032227875
+       .long   1280049152
+       .long   1032227875
+       .long   1280049152
+       .long   1032227875
+       .long   1280049152
+       .long   1032227875
+       .long   57701189
+       .long   992578094
+       .long   57701189
+       .long   992578094
+       .long   57701189
+       .long   992578094
+       .long   57701189
+       .long   992578094
+       .long   57701189
+       .long   992578094
+       .long   57701189
+       .long   992578094
+       .long   57701189
+       .long   992578094
+       .long   57701189
+       .long   992578094
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   1413754136
+       .long   1073291771
+       .long   856972294
+       .long   1016178214
+       .long   856972294
+       .long   1016178214
+       .long   856972294
+       .long   1016178214
+       .long   856972294
+       .long   1016178214
+       .long   856972294
+       .long   1016178214
+       .long   856972294
+       .long   1016178214
+       .long   856972294
+       .long   1016178214
+       .long   856972294
+       .long   1016178214
+       .long   688016905
+       .long   961289425
+       .long   688016905
+       .long   961289425
+       .long   688016905
+       .long   961289425
+       .long   688016905
+       .long   961289425
+       .long   688016905
+       .long   961289425
+       .long   688016905
+       .long   961289425
+       .long   688016905
+       .long   961289425
+       .long   688016905
+       .long   961289425
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   3191264137
+       .long   3217058711
+       .long   3191264137
+       .long   3217058711
+       .long   3191264137
+       .long   3217058711
+       .long   3191264137
+       .long   3217058711
+       .long   3191264137
+       .long   3217058711
+       .long   3191264137
+       .long   3217058711
+       .long   3191264137
+       .long   3217058711
+       .long   3191264137
+       .long   3217058711
+       .long   3706049281
+       .long   1063713903
+       .long   3706049281
+       .long   1063713903
+       .long   3706049281
+       .long   1063713903
+       .long   3706049281
+       .long   1063713903
+       .long   3706049281
+       .long   1063713903
+       .long   3706049281
+       .long   1063713903
+       .long   3706049281
+       .long   1063713903
+       .long   3706049281
+       .long   1063713903
+       .long   3458873344
+       .long   3202311037
+       .long   3458873344
+       .long   3202311037
+       .long   3458873344
+       .long   3202311037
+       .long   3458873344
+       .long   3202311037
+       .long   3458873344
+       .long   3202311037
+       .long   3458873344
+       .long   3202311037
+       .long   3458873344
+       .long   3202311037
+       .long   3458873344
+       .long   3202311037
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   879804142
+       .long   3218967329
+       .long   879804142
+       .long   3218967329
+       .long   879804142
+       .long   3218967329
+       .long   879804142
+       .long   3218967329
+       .long   879804142
+       .long   3218967329
+       .long   879804142
+       .long   3218967329
+       .long   879804142
+       .long   3218967329
+       .long   879804142
+       .long   3218967329
+       .long   2328005206
+       .long   1066919862
+       .long   2328005206
+       .long   1066919862
+       .long   2328005206
+       .long   1066919862
+       .long   2328005206
+       .long   1066919862
+       .long   2328005206
+       .long   1066919862
+       .long   2328005206
+       .long   1066919862
+       .long   2328005206
+       .long   1066919862
+       .long   2328005206
+       .long   1066919862
+       .long   62689958
+       .long   3207287387
+       .long   62689958
+       .long   3207287387
+       .long   62689958
+       .long   3207287387
+       .long   62689958
+       .long   3207287387
+       .long   62689958
+       .long   3207287387
+       .long   62689958
+       .long   3207287387
+       .long   62689958
+       .long   3207287387
+       .long   62689958
+       .long   3207287387
+       .type   __svml_dtan_data_internal,@object
+       .size   __svml_dtan_data_internal,29248
+       .align 64
+__svml_dtan_reduction_data_internal:
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   5
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   10
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   20
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   40
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   81
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   162
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   325
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   651
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1303
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2607
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   5215
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   10430
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   20860
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   41721
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   83443
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   166886
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   333772
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   667544
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1335088
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2670176
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   5340353
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   10680707
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   21361414
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   42722829
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   85445659
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   170891318
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   341782637
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   683565275
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1367130551
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2734261102
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1173554908
+       .long   1
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2347109817
+       .long   2
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   399252338
+       .long   5
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   798504676
+       .long   10
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1597009353
+       .long   20
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3194018707
+       .long   40
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2093070119
+       .long   81
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4186140238
+       .long   162
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4077313180
+       .long   325
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3859659065
+       .long   651
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3424350834
+       .long   1303
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2553734372
+       .long   2607
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   812501448
+       .long   5215
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1625002897
+       .long   10430
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3250005794
+       .long   20860
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2205044292
+       .long   41721
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   115121288
+       .long   83443
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   230242576
+       .long   166886
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   460485152
+       .long   333772
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   920970305
+       .long   667544
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1841940610
+       .long   1335088
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3683881221
+       .long   2670176
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3072795146
+       .long   5340353
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1850622997
+       .long   10680707
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3701245994
+       .long   21361414
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3107524692
+       .long   42722829
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1920082089
+       .long   85445659
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3840164178
+       .long   170891318
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3385361061
+       .long   341782637
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2475754826
+       .long   683565275
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   656542356
+       .long   1367130551
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1313084713
+       .long   2734261102
+       .long   0
+       .long   0
+       .long   1
+       .long   0
+       .long   2626169427
+       .long   1173554908
+       .long   0
+       .long   0
+       .long   2
+       .long   0
+       .long   957371559
+       .long   2347109817
+       .long   0
+       .long   0
+       .long   5
+       .long   0
+       .long   1914743119
+       .long   399252338
+       .long   0
+       .long   0
+       .long   10
+       .long   0
+       .long   3829486239
+       .long   798504676
+       .long   0
+       .long   0
+       .long   20
+       .long   0
+       .long   3364005183
+       .long   1597009353
+       .long   0
+       .long   0
+       .long   40
+       .long   0
+       .long   2433043071
+       .long   3194018707
+       .long   0
+       .long   0
+       .long   81
+       .long   0
+       .long   571118846
+       .long   2093070119
+       .long   0
+       .long   0
+       .long   162
+       .long   0
+       .long   1142237692
+       .long   4186140238
+       .long   0
+       .long   0
+       .long   325
+       .long   0
+       .long   2284475384
+       .long   4077313180
+       .long   0
+       .long   0
+       .long   651
+       .long   0
+       .long   273983472
+       .long   3859659065
+       .long   0
+       .long   0
+       .long   1303
+       .long   0
+       .long   547966945
+       .long   3424350834
+       .long   0
+       .long   0
+       .long   2607
+       .long   0
+       .long   1095933890
+       .long   2553734372
+       .long   0
+       .long   0
+       .long   5215
+       .long   0
+       .long   2191867780
+       .long   812501448
+       .long   0
+       .long   0
+       .long   10430
+       .long   0
+       .long   88768265
+       .long   1625002897
+       .long   0
+       .long   0
+       .long   20860
+       .long   0
+       .long   177536531
+       .long   3250005794
+       .long   0
+       .long   0
+       .long   41721
+       .long   0
+       .long   355073063
+       .long   2205044292
+       .long   0
+       .long   0
+       .long   83443
+       .long   0
+       .long   710146126
+       .long   115121288
+       .long   0
+       .long   0
+       .long   166886
+       .long   0
+       .long   1420292253
+       .long   230242576
+       .long   0
+       .long   0
+       .long   333772
+       .long   0
+       .long   2840584506
+       .long   460485152
+       .long   0
+       .long   0
+       .long   667544
+       .long   0
+       .long   1386201717
+       .long   920970305
+       .long   0
+       .long   0
+       .long   1335088
+       .long   0
+       .long   2772403434
+       .long   1841940610
+       .long   0
+       .long   0
+       .long   2670176
+       .long   0
+       .long   1249839573
+       .long   3683881221
+       .long   0
+       .long   0
+       .long   5340353
+       .long   0
+       .long   2499679147
+       .long   3072795146
+       .long   0
+       .long   0
+       .long   10680707
+       .long   0
+       .long   704390999
+       .long   1850622997
+       .long   0
+       .long   0
+       .long   21361414
+       .long   0
+       .long   1408781999
+       .long   3701245994
+       .long   0
+       .long   0
+       .long   42722829
+       .long   0
+       .long   2817563999
+       .long   3107524692
+       .long   0
+       .long   0
+       .long   85445659
+       .long   0
+       .long   1340160702
+       .long   1920082089
+       .long   0
+       .long   0
+       .long   170891318
+       .long   0
+       .long   2680321405
+       .long   3840164178
+       .long   0
+       .long   0
+       .long   341782637
+       .long   0
+       .long   1065675514
+       .long   3385361061
+       .long   0
+       .long   0
+       .long   683565275
+       .long   0
+       .long   2131351028
+       .long   2475754826
+       .long   0
+       .long   0
+       .long   1367130551
+       .long   0
+       .long   4262702056
+       .long   656542356
+       .long   0
+       .long   0
+       .long   2734261102
+       .long   0
+       .long   4230436817
+       .long   1313084713
+       .long   0
+       .long   0
+       .long   1173554908
+       .long   1
+       .long   4165906339
+       .long   2626169427
+       .long   0
+       .long   0
+       .long   2347109817
+       .long   2
+       .long   4036845383
+       .long   957371559
+       .long   0
+       .long   0
+       .long   399252338
+       .long   5
+       .long   3778723471
+       .long   1914743119
+       .long   0
+       .long   0
+       .long   798504676
+       .long   10
+       .long   3262479647
+       .long   3829486239
+       .long   0
+       .long   0
+       .long   1597009353
+       .long   20
+       .long   2229991998
+       .long   3364005183
+       .long   0
+       .long   0
+       .long   3194018707
+       .long   40
+       .long   165016701
+       .long   2433043071
+       .long   0
+       .long   0
+       .long   2093070119
+       .long   81
+       .long   330033402
+       .long   571118846
+       .long   0
+       .long   0
+       .long   4186140238
+       .long   162
+       .long   660066805
+       .long   1142237692
+       .long   0
+       .long   0
+       .long   4077313180
+       .long   325
+       .long   1320133610
+       .long   2284475384
+       .long   0
+       .long   0
+       .long   3859659065
+       .long   651
+       .long   2640267220
+       .long   273983472
+       .long   0
+       .long   0
+       .long   3424350834
+       .long   1303
+       .long   985567145
+       .long   547966945
+       .long   0
+       .long   0
+       .long   2553734372
+       .long   2607
+       .long   1971134291
+       .long   1095933890
+       .long   0
+       .long   0
+       .long   812501448
+       .long   5215
+       .long   3942268582
+       .long   2191867780
+       .long   0
+       .long   0
+       .long   1625002897
+       .long   10430
+       .long   3589569869
+       .long   88768265
+       .long   0
+       .long   0
+       .long   3250005794
+       .long   20860
+       .long   2884172442
+       .long   177536531
+       .long   0
+       .long   0
+       .long   2205044292
+       .long   41721
+       .long   1473377588
+       .long   355073063
+       .long   0
+       .long   0
+       .long   115121288
+       .long   83443
+       .long   2946755177
+       .long   710146126
+       .long   0
+       .long   0
+       .long   230242576
+       .long   166886
+       .long   1598543059
+       .long   1420292253
+       .long   0
+       .long   0
+       .long   460485152
+       .long   333772
+       .long   3197086118
+       .long   2840584506
+       .long   0
+       .long   0
+       .long   920970305
+       .long   667544
+       .long   2099204941
+       .long   1386201717
+       .long   0
+       .long   0
+       .long   1841940610
+       .long   1335088
+       .long   4198409883
+       .long   2772403434
+       .long   0
+       .long   0
+       .long   3683881221
+       .long   2670176
+       .long   4101852471
+       .long   1249839573
+       .long   0
+       .long   0
+       .long   3072795146
+       .long   5340353
+       .long   3908737646
+       .long   2499679147
+       .long   0
+       .long   0
+       .long   1850622997
+       .long   10680707
+       .long   3522507997
+       .long   704390999
+       .long   0
+       .long   0
+       .long   3701245994
+       .long   21361414
+       .long   2750048699
+       .long   1408781999
+       .long   0
+       .long   0
+       .long   3107524692
+       .long   42722829
+       .long   1205130103
+       .long   2817563999
+       .long   0
+       .long   0
+       .long   1920082089
+       .long   85445659
+       .long   2410260206
+       .long   1340160702
+       .long   0
+       .long   0
+       .long   3840164178
+       .long   170891318
+       .long   525553116
+       .long   2680321405
+       .long   0
+       .long   0
+       .long   3385361061
+       .long   341782637
+       .long   1051106232
+       .long   1065675514
+       .long   0
+       .long   0
+       .long   2475754826
+       .long   683565275
+       .long   2102212464
+       .long   2131351028
+       .long   0
+       .long   0
+       .long   656542356
+       .long   1367130551
+       .long   4204424928
+       .long   4262702056
+       .long   0
+       .long   0
+       .long   1313084713
+       .long   2734261102
+       .long   4113882560
+       .long   4230436817
+       .long   1
+       .long   0
+       .long   2626169427
+       .long   1173554908
+       .long   3932797825
+       .long   4165906339
+       .long   2
+       .long   0
+       .long   957371559
+       .long   2347109817
+       .long   3570628355
+       .long   4036845383
+       .long   5
+       .long   0
+       .long   1914743119
+       .long   399252338
+       .long   2846289414
+       .long   3778723471
+       .long   10
+       .long   0
+       .long   3829486239
+       .long   798504676
+       .long   1397611533
+       .long   3262479647
+       .long   20
+       .long   0
+       .long   3364005183
+       .long   1597009353
+       .long   2795223067
+       .long   2229991998
+       .long   40
+       .long   0
+       .long   2433043071
+       .long   3194018707
+       .long   1295478838
+       .long   165016701
+       .long   81
+       .long   0
+       .long   571118846
+       .long   2093070119
+       .long   2590957677
+       .long   330033402
+       .long   162
+       .long   0
+       .long   1142237692
+       .long   4186140238
+       .long   886948059
+       .long   660066805
+       .long   325
+       .long   0
+       .long   2284475384
+       .long   4077313180
+       .long   1773896118
+       .long   1320133610
+       .long   651
+       .long   0
+       .long   273983472
+       .long   3859659065
+       .long   3547792237
+       .long   2640267220
+       .long   1303
+       .long   0
+       .long   547966945
+       .long   3424350834
+       .long   2800617179
+       .long   985567145
+       .long   2607
+       .long   0
+       .long   1095933890
+       .long   2553734372
+       .long   1306267062
+       .long   1971134291
+       .long   5215
+       .long   0
+       .long   2191867780
+       .long   812501448
+       .long   2612534124
+       .long   3942268582
+       .long   10430
+       .long   0
+       .long   88768265
+       .long   1625002897
+       .long   930100952
+       .long   3589569869
+       .long   20860
+       .long   0
+       .long   177536531
+       .long   3250005794
+       .long   1860201905
+       .long   2884172442
+       .long   41721
+       .long   0
+       .long   355073063
+       .long   2205044292
+       .long   3720403810
+       .long   1473377588
+       .long   83443
+       .long   0
+       .long   710146126
+       .long   115121288
+       .long   3145840325
+       .long   2946755177
+       .long   166886
+       .long   0
+       .long   1420292253
+       .long   230242576
+       .long   1996713354
+       .long   1598543059
+       .long   333772
+       .long   0
+       .long   2840584506
+       .long   460485152
+       .long   3993426708
+       .long   3197086118
+       .long   667544
+       .long   0
+       .long   1386201717
+       .long   920970305
+       .long   3691886121
+       .long   2099204941
+       .long   1335088
+       .long   0
+       .long   2772403434
+       .long   1841940610
+       .long   3088804946
+       .long   4198409883
+       .long   2670176
+       .long   0
+       .long   1249839573
+       .long   3683881221
+       .long   1882642597
+       .long   4101852471
+       .long   5340353
+       .long   0
+       .long   2499679147
+       .long   3072795146
+       .long   3765285194
+       .long   3908737646
+       .long   10680707
+       .long   0
+       .long   704390999
+       .long   1850622997
+       .long   3235603093
+       .long   3522507997
+       .long   21361414
+       .long   0
+       .long   1408781999
+       .long   3701245994
+       .long   2176238891
+       .long   2750048699
+       .long   42722829
+       .long   0
+       .long   2817563999
+       .long   3107524692
+       .long   57510486
+       .long   1205130103
+       .long   85445659
+       .long   0
+       .long   1340160702
+       .long   1920082089
+       .long   115020972
+       .long   2410260206
+       .long   170891318
+       .long   0
+       .long   2680321405
+       .long   3840164178
+       .long   230041945
+       .long   525553116
+       .long   341782637
+       .long   0
+       .long   1065675514
+       .long   3385361061
+       .long   460083891
+       .long   1051106232
+       .long   683565275
+       .long   0
+       .long   2131351028
+       .long   2475754826
+       .long   920167782
+       .long   2102212464
+       .long   1367130551
+       .long   0
+       .long   4262702056
+       .long   656542356
+       .long   1840335564
+       .long   4204424928
+       .long   2734261102
+       .long   0
+       .long   4230436817
+       .long   1313084713
+       .long   3680671129
+       .long   4113882560
+       .long   1173554908
+       .long   1
+       .long   4165906339
+       .long   2626169427
+       .long   3066374962
+       .long   3932797825
+       .long   2347109817
+       .long   2
+       .long   4036845383
+       .long   957371559
+       .long   1837782628
+       .long   3570628355
+       .long   399252338
+       .long   5
+       .long   3778723471
+       .long   1914743119
+       .long   3675565257
+       .long   2846289414
+       .long   798504676
+       .long   10
+       .long   3262479647
+       .long   3829486239
+       .long   3056163219
+       .long   1397611533
+       .long   1597009353
+       .long   20
+       .long   2229991998
+       .long   3364005183
+       .long   1817359143
+       .long   2795223067
+       .long   3194018707
+       .long   40
+       .long   165016701
+       .long   2433043071
+       .long   3634718287
+       .long   1295478838
+       .long   2093070119
+       .long   81
+       .long   330033402
+       .long   571118846
+       .long   2974469278
+       .long   2590957677
+       .long   4186140238
+       .long   162
+       .long   660066805
+       .long   1142237692
+       .long   1653971260
+       .long   886948059
+       .long   4077313180
+       .long   325
+       .long   1320133610
+       .long   2284475384
+       .long   3307942520
+       .long   1773896118
+       .long   3859659065
+       .long   651
+       .long   2640267220
+       .long   273983472
+       .long   2320917745
+       .long   3547792237
+       .long   3424350834
+       .long   1303
+       .long   985567145
+       .long   547966945
+       .long   346868194
+       .long   2800617179
+       .long   2553734372
+       .long   2607
+       .long   1971134291
+       .long   1095933890
+       .long   693736388
+       .long   1306267062
+       .long   812501448
+       .long   5215
+       .long   3942268582
+       .long   2191867780
+       .long   1387472776
+       .long   2612534124
+       .long   1625002897
+       .long   10430
+       .long   3589569869
+       .long   88768265
+       .long   2774945552
+       .long   930100952
+       .long   3250005794
+       .long   20860
+       .long   2884172442
+       .long   177536531
+       .long   1254923809
+       .long   1860201905
+       .long   2205044292
+       .long   41721
+       .long   1473377588
+       .long   355073063
+       .long   2509847619
+       .long   3720403810
+       .long   115121288
+       .long   83443
+       .long   2946755177
+       .long   710146126
+       .long   724727943
+       .long   3145840325
+       .long   230242576
+       .long   166886
+       .long   1598543059
+       .long   1420292253
+       .long   1449455886
+       .long   1996713354
+       .long   460485152
+       .long   333772
+       .long   3197086118
+       .long   2840584506
+       .long   2898911772
+       .long   3993426708
+       .long   920970305
+       .long   667544
+       .long   2099204941
+       .long   1386201717
+       .long   1502856249
+       .long   3691886121
+       .long   1841940610
+       .long   1335088
+       .long   4198409883
+       .long   2772403434
+       .long   3005712498
+       .long   3088804946
+       .long   3683881221
+       .long   2670176
+       .long   4101852471
+       .long   1249839573
+       .long   1716457700
+       .long   1882642597
+       .long   3072795146
+       .long   5340353
+       .long   3908737646
+       .long   2499679147
+       .long   3432915400
+       .long   3765285194
+       .long   1850622997
+       .long   10680707
+       .long   3522507997
+       .long   704390999
+       .long   2570863504
+       .long   3235603093
+       .long   3701245994
+       .long   21361414
+       .long   2750048699
+       .long   1408781999
+       .long   846759712
+       .long   2176238891
+       .long   3107524692
+       .long   42722829
+       .long   1205130103
+       .long   2817563999
+       .long   1693519425
+       .long   57510486
+       .long   1920082089
+       .long   85445659
+       .long   2410260206
+       .long   1340160702
+       .long   3387038850
+       .long   115020972
+       .long   3840164178
+       .long   170891318
+       .long   525553116
+       .long   2680321405
+       .long   2479110404
+       .long   230041945
+       .long   3385361061
+       .long   341782637
+       .long   1051106232
+       .long   1065675514
+       .long   663253512
+       .long   460083891
+       .long   2475754826
+       .long   683565275
+       .long   2102212464
+       .long   2131351028
+       .long   1326507024
+       .long   920167782
+       .long   656542356
+       .long   1367130551
+       .long   4204424928
+       .long   4262702056
+       .long   2653014048
+       .long   1840335564
+       .long   1313084713
+       .long   2734261102
+       .long   4113882560
+       .long   4230436817
+       .long   1011060801
+       .long   3680671129
+       .long   2626169427
+       .long   1173554908
+       .long   3932797825
+       .long   4165906339
+       .long   2022121603
+       .long   3066374962
+       .long   957371559
+       .long   2347109817
+       .long   3570628355
+       .long   4036845383
+       .long   4044243207
+       .long   1837782628
+       .long   1914743119
+       .long   399252338
+       .long   2846289414
+       .long   3778723471
+       .long   3793519119
+       .long   3675565257
+       .long   3829486239
+       .long   798504676
+       .long   1397611533
+       .long   3262479647
+       .long   3292070943
+       .long   3056163219
+       .long   3364005183
+       .long   1597009353
+       .long   2795223067
+       .long   2229991998
+       .long   2289174591
+       .long   1817359143
+       .long   2433043071
+       .long   3194018707
+       .long   1295478838
+       .long   165016701
+       .long   283381887
+       .long   3634718287
+       .long   571118846
+       .long   2093070119
+       .long   2590957677
+       .long   330033402
+       .long   566763775
+       .long   2974469278
+       .long   1142237692
+       .long   4186140238
+       .long   886948059
+       .long   660066805
+       .long   1133527550
+       .long   1653971260
+       .long   2284475384
+       .long   4077313180
+       .long   1773896118
+       .long   1320133610
+       .long   2267055100
+       .long   3307942520
+       .long   273983472
+       .long   3859659065
+       .long   3547792237
+       .long   2640267220
+       .long   239142905
+       .long   2320917745
+       .long   547966945
+       .long   3424350834
+       .long   2800617179
+       .long   985567145
+       .long   478285810
+       .long   346868194
+       .long   1095933890
+       .long   2553734372
+       .long   1306267062
+       .long   1971134291
+       .long   956571621
+       .long   693736388
+       .long   2191867780
+       .long   812501448
+       .long   2612534124
+       .long   3942268582
+       .long   1913143242
+       .long   1387472776
+       .long   88768265
+       .long   1625002897
+       .long   930100952
+       .long   3589569869
+       .long   3826286484
+       .long   2774945552
+       .long   177536531
+       .long   3250005794
+       .long   1860201905
+       .long   2884172442
+       .long   3357605672
+       .long   1254923809
+       .long   355073063
+       .long   2205044292
+       .long   3720403810
+       .long   1473377588
+       .long   2420244049
+       .long   2509847619
+       .long   710146126
+       .long   115121288
+       .long   3145840325
+       .long   2946755177
+       .long   545520802
+       .long   724727943
+       .long   1420292253
+       .long   230242576
+       .long   1996713354
+       .long   1598543059
+       .long   1091041605
+       .long   1449455886
+       .long   2840584506
+       .long   460485152
+       .long   3993426708
+       .long   3197086118
+       .long   2182083211
+       .long   2898911772
+       .long   1386201717
+       .long   920970305
+       .long   3691886121
+       .long   2099204941
+       .long   69199126
+       .long   1502856249
+       .long   2772403434
+       .long   1841940610
+       .long   3088804946
+       .long   4198409883
+       .long   138398252
+       .long   3005712498
+       .long   1249839573
+       .long   3683881221
+       .long   1882642597
+       .long   4101852471
+       .long   276796504
+       .long   1716457700
+       .long   2499679147
+       .long   3072795146
+       .long   3765285194
+       .long   3908737646
+       .long   553593009
+       .long   3432915400
+       .long   704390999
+       .long   1850622997
+       .long   3235603093
+       .long   3522507997
+       .long   1107186019
+       .long   2570863504
+       .long   1408781999
+       .long   3701245994
+       .long   2176238891
+       .long   2750048699
+       .long   2214372039
+       .long   846759712
+       .long   2817563999
+       .long   3107524692
+       .long   57510486
+       .long   1205130103
+       .long   133776782
+       .long   1693519425
+       .long   1340160702
+       .long   1920082089
+       .long   115020972
+       .long   2410260206
+       .long   267553565
+       .long   3387038850
+       .long   2680321405
+       .long   3840164178
+       .long   230041945
+       .long   525553116
+       .long   535107130
+       .long   2479110404
+       .long   1065675514
+       .long   3385361061
+       .long   460083891
+       .long   1051106232
+       .long   1070214261
+       .long   663253512
+       .long   2131351028
+       .long   2475754826
+       .long   920167782
+       .long   2102212464
+       .long   2140428522
+       .long   1326507024
+       .long   4262702056
+       .long   656542356
+       .long   1840335564
+       .long   4204424928
+       .long   4280857045
+       .long   2653014048
+       .long   4230436817
+       .long   1313084713
+       .long   3680671129
+       .long   4113882560
+       .long   4266746795
+       .long   1011060801
+       .long   4165906339
+       .long   2626169427
+       .long   3066374962
+       .long   3932797825
+       .long   4238526295
+       .long   2022121603
+       .long   4036845383
+       .long   957371559
+       .long   1837782628
+       .long   3570628355
+       .long   4182085295
+       .long   4044243207
+       .long   3778723471
+       .long   1914743119
+       .long   3675565257
+       .long   2846289414
+       .long   4069203294
+       .long   3793519119
+       .long   3262479647
+       .long   3829486239
+       .long   3056163219
+       .long   1397611533
+       .long   3843439293
+       .long   3292070943
+       .long   2229991998
+       .long   3364005183
+       .long   1817359143
+       .long   2795223067
+       .long   3391911291
+       .long   2289174591
+       .long   165016701
+       .long   2433043071
+       .long   3634718287
+       .long   1295478838
+       .long   2488855287
+       .long   283381887
+       .long   330033402
+       .long   571118846
+       .long   2974469278
+       .long   2590957677
+       .long   682743279
+       .long   566763775
+       .long   660066805
+       .long   1142237692
+       .long   1653971260
+       .long   886948059
+       .long   1365486558
+       .long   1133527550
+       .long   1320133610
+       .long   2284475384
+       .long   3307942520
+       .long   1773896118
+       .long   2730973117
+       .long   2267055100
+       .long   2640267220
+       .long   273983472
+       .long   2320917745
+       .long   3547792237
+       .long   1166978938
+       .long   239142905
+       .long   985567145
+       .long   547966945
+       .long   346868194
+       .long   2800617179
+       .long   2333957877
+       .long   478285810
+       .long   1971134291
+       .long   1095933890
+       .long   693736388
+       .long   1306267062
+       .long   372948459
+       .long   956571621
+       .long   3942268582
+       .long   2191867780
+       .long   1387472776
+       .long   2612534124
+       .long   745896919
+       .long   1913143242
+       .long   3589569869
+       .long   88768265
+       .long   2774945552
+       .long   930100952
+       .long   1491793838
+       .long   3826286484
+       .long   2884172442
+       .long   177536531
+       .long   1254923809
+       .long   1860201905
+       .long   2983587677
+       .long   3357605672
+       .long   1473377588
+       .long   355073063
+       .long   2509847619
+       .long   3720403810
+       .long   1672208059
+       .long   2420244049
+       .long   2946755177
+       .long   710146126
+       .long   724727943
+       .long   3145840325
+       .long   3344416119
+       .long   545520802
+       .long   1598543059
+       .long   1420292253
+       .long   1449455886
+       .long   1996713354
+       .long   2393864943
+       .long   1091041605
+       .long   3197086118
+       .long   2840584506
+       .long   2898911772
+       .long   3993426708
+       .long   492762590
+       .long   2182083211
+       .long   2099204941
+       .long   1386201717
+       .long   1502856249
+       .long   3691886121
+       .long   985525180
+       .long   69199126
+       .long   4198409883
+       .long   2772403434
+       .long   3005712498
+       .long   3088804946
+       .long   1971050360
+       .long   138398252
+       .long   4101852471
+       .long   1249839573
+       .long   1716457700
+       .long   1882642597
+       .long   3942100721
+       .long   276796504
+       .long   3908737646
+       .long   2499679147
+       .long   3432915400
+       .long   3765285194
+       .long   3589234146
+       .long   553593009
+       .long   3522507997
+       .long   704390999
+       .long   2570863504
+       .long   3235603093
+       .long   2883500997
+       .long   1107186019
+       .long   2750048699
+       .long   1408781999
+       .long   846759712
+       .long   2176238891
+       .long   1472034698
+       .long   2214372039
+       .long   1205130103
+       .long   2817563999
+       .long   1693519425
+       .long   57510486
+       .long   2944069397
+       .long   133776782
+       .long   2410260206
+       .long   1340160702
+       .long   3387038850
+       .long   115020972
+       .long   1593171499
+       .long   267553565
+       .long   525553116
+       .long   2680321405
+       .long   2479110404
+       .long   230041945
+       .long   3186342998
+       .long   535107130
+       .long   1051106232
+       .long   1065675514
+       .long   663253512
+       .long   460083891
+       .long   2077718700
+       .long   1070214261
+       .long   2102212464
+       .long   2131351028
+       .long   1326507024
+       .long   920167782
+       .long   4155437400
+       .long   2140428522
+       .long   4204424928
+       .long   4262702056
+       .long   2653014048
+       .long   1840335564
+       .long   4015907504
+       .long   4280857045
+       .long   4113882560
+       .long   4230436817
+       .long   1011060801
+       .long   3680671129
+       .long   3736847713
+       .long   4266746795
+       .long   3932797825
+       .long   4165906339
+       .long   2022121603
+       .long   3066374962
+       .long   3178728131
+       .long   4238526295
+       .long   3570628355
+       .long   4036845383
+       .long   4044243207
+       .long   1837782628
+       .long   2062488966
+       .long   4182085295
+       .long   2846289414
+       .long   3778723471
+       .long   3793519119
+       .long   3675565257
+       .long   4124977933
+       .long   4069203294
+       .long   1397611533
+       .long   3262479647
+       .long   3292070943
+       .long   3056163219
+       .long   3954988571
+       .long   3843439293
+       .long   2795223067
+       .long   2229991998
+       .long   2289174591
+       .long   1817359143
+       .long   3615009846
+       .long   3391911291
+       .long   1295478838
+       .long   165016701
+       .long   283381887
+       .long   3634718287
+       .long   2935052397
+       .long   2488855287
+       .long   2590957677
+       .long   330033402
+       .long   566763775
+       .long   2974469278
+       .long   1575137499
+       .long   682743279
+       .long   886948059
+       .long   660066805
+       .long   1133527550
+       .long   1653971260
+       .long   3150274999
+       .long   1365486558
+       .long   1773896118
+       .long   1320133610
+       .long   2267055100
+       .long   3307942520
+       .long   2005582702
+       .long   2730973117
+       .long   3547792237
+       .long   2640267220
+       .long   239142905
+       .long   2320917745
+       .long   4011165404
+       .long   1166978938
+       .long   2800617179
+       .long   985567145
+       .long   478285810
+       .long   346868194
+       .long   3727363513
+       .long   2333957877
+       .long   1306267062
+       .long   1971134291
+       .long   956571621
+       .long   693736388
+       .long   3159759730
+       .long   372948459
+       .long   2612534124
+       .long   3942268582
+       .long   1913143242
+       .long   1387472776
+       .long   2024552164
+       .long   745896919
+       .long   930100952
+       .long   3589569869
+       .long   3826286484
+       .long   2774945552
+       .long   4049104329
+       .long   1491793838
+       .long   1860201905
+       .long   2884172442
+       .long   3357605672
+       .long   1254923809
+       .long   3803241362
+       .long   2983587677
+       .long   3720403810
+       .long   1473377588
+       .long   2420244049
+       .long   2509847619
+       .long   3311515428
+       .long   1672208059
+       .long   3145840325
+       .long   2946755177
+       .long   545520802
+       .long   724727943
+       .long   2328063560
+       .long   3344416119
+       .long   1996713354
+       .long   1598543059
+       .long   1091041605
+       .long   1449455886
+       .long   361159825
+       .long   2393864943
+       .long   3993426708
+       .long   3197086118
+       .long   2182083211
+       .long   2898911772
+       .long   722319651
+       .long   492762590
+       .long   3691886121
+       .long   2099204941
+       .long   69199126
+       .long   1502856249
+       .long   1444639302
+       .long   985525180
+       .long   3088804946
+       .long   4198409883
+       .long   138398252
+       .long   3005712498
+       .long   2889278605
+       .long   1971050360
+       .long   1882642597
+       .long   4101852471
+       .long   276796504
+       .long   1716457700
+       .long   1483589915
+       .long   3942100721
+       .long   3765285194
+       .long   3908737646
+       .long   553593009
+       .long   3432915400
+       .long   2967179831
+       .long   3589234146
+       .long   3235603093
+       .long   3522507997
+       .long   1107186019
+       .long   2570863504
+       .long   1639392366
+       .long   2883500997
+       .long   2176238891
+       .long   2750048699
+       .long   2214372039
+       .long   846759712
+       .long   3278784732
+       .long   1472034698
+       .long   57510486
+       .long   1205130103
+       .long   133776782
+       .long   1693519425
+       .long   2262602168
+       .long   2944069397
+       .long   115020972
+       .long   2410260206
+       .long   267553565
+       .long   3387038850
+       .long   230237041
+       .long   1593171499
+       .long   230041945
+       .long   525553116
+       .long   535107130
+       .long   2479110404
+       .long   460474083
+       .long   3186342998
+       .long   460083891
+       .long   1051106232
+       .long   1070214261
+       .long   663253512
+       .long   920948167
+       .long   2077718700
+       .long   920167782
+       .long   2102212464
+       .long   2140428522
+       .long   1326507024
+       .long   1841896334
+       .long   4155437400
+       .long   1840335564
+       .long   4204424928
+       .long   4280857045
+       .long   2653014048
+       .long   3683792669
+       .long   4015907504
+       .long   3680671129
+       .long   4113882560
+       .long   4266746795
+       .long   1011060801
+       .long   3072618042
+       .long   3736847713
+       .long   3066374962
+       .long   3932797825
+       .long   4238526295
+       .long   2022121603
+       .long   1850268788
+       .long   3178728131
+       .long   1837782628
+       .long   3570628355
+       .long   4182085295
+       .long   4044243207
+       .long   3700537577
+       .long   2062488966
+       .long   3675565257
+       .long   2846289414
+       .long   4069203294
+       .long   3793519119
+       .long   3106107858
+       .long   4124977933
+       .long   3056163219
+       .long   1397611533
+       .long   3843439293
+       .long   3292070943
+       .long   1917248420
+       .long   3954988571
+       .long   1817359143
+       .long   2795223067
+       .long   3391911291
+       .long   2289174591
+       .long   3834496840
+       .long   3615009846
+       .long   3634718287
+       .long   1295478838
+       .long   2488855287
+       .long   283381887
+       .long   3374026384
+       .long   2935052397
+       .long   2974469278
+       .long   2590957677
+       .long   682743279
+       .long   566763775
+       .long   2453085473
+       .long   1575137499
+       .long   1653971260
+       .long   886948059
+       .long   1365486558
+       .long   1133527550
+       .long   611203650
+       .long   3150274999
+       .long   3307942520
+       .long   1773896118
+       .long   2730973117
+       .long   2267055100
+       .long   1222407300
+       .long   2005582702
+       .long   2320917745
+       .long   3547792237
+       .long   1166978938
+       .long   239142905
+       .long   2444814601
+       .long   4011165404
+       .long   346868194
+       .long   2800617179
+       .long   2333957877
+       .long   478285810
+       .long   594661906
+       .long   3727363513
+       .long   693736388
+       .long   1306267062
+       .long   372948459
+       .long   956571621
+       .long   1189323812
+       .long   3159759730
+       .long   1387472776
+       .long   2612534124
+       .long   745896919
+       .long   1913143242
+       .long   2378647625
+       .long   2024552164
+       .long   2774945552
+       .long   930100952
+       .long   1491793838
+       .long   3826286484
+       .long   462327955
+       .long   4049104329
+       .long   1254923809
+       .long   1860201905
+       .long   2983587677
+       .long   3357605672
+       .long   924655910
+       .long   3803241362
+       .long   2509847619
+       .long   3720403810
+       .long   1672208059
+       .long   2420244049
+       .long   1849311821
+       .long   3311515428
+       .long   724727943
+       .long   3145840325
+       .long   3344416119
+       .long   545520802
+       .long   3698623643
+       .long   2328063560
+       .long   1449455886
+       .long   1996713354
+       .long   2393864943
+       .long   1091041605
+       .long   3102279991
+       .long   361159825
+       .long   2898911772
+       .long   3993426708
+       .long   492762590
+       .long   2182083211
+       .long   1909592686
+       .long   722319651
+       .long   1502856249
+       .long   3691886121
+       .long   985525180
+       .long   69199126
+       .long   3819185373
+       .long   1444639302
+       .long   3005712498
+       .long   3088804946
+       .long   1971050360
+       .long   138398252
+       .long   3343403450
+       .long   2889278605
+       .long   1716457700
+       .long   1882642597
+       .long   3942100721
+       .long   276796504
+       .long   2391839604
+       .long   1483589915
+       .long   3432915400
+       .long   3765285194
+       .long   3589234146
+       .long   553593009
+       .long   488711913
+       .long   2967179831
+       .long   2570863504
+       .long   3235603093
+       .long   2883500997
+       .long   1107186019
+       .long   977423826
+       .long   1639392366
+       .long   846759712
+       .long   2176238891
+       .long   1472034698
+       .long   2214372039
+       .long   1954847653
+       .long   3278784732
+       .long   1693519425
+       .long   57510486
+       .long   2944069397
+       .long   133776782
+       .long   3909695307
+       .long   2262602168
+       .long   3387038850
+       .long   115020972
+       .long   1593171499
+       .long   267553565
+       .long   3524423319
+       .long   230237041
+       .long   2479110404
+       .long   230041945
+       .long   3186342998
+       .long   535107130
+       .long   2753879342
+       .long   460474083
+       .long   663253512
+       .long   460083891
+       .long   2077718700
+       .long   1070214261
+       .long   1212791388
+       .long   920948167
+       .long   1326507024
+       .long   920167782
+       .long   4155437400
+       .long   2140428522
+       .long   2425582776
+       .long   1841896334
+       .long   2653014048
+       .long   1840335564
+       .long   4015907504
+       .long   4280857045
+       .long   556198256
+       .long   3683792669
+       .long   1011060801
+       .long   3680671129
+       .long   3736847713
+       .long   4266746795
+       .long   1112396512
+       .long   3072618042
+       .long   2022121603
+       .long   3066374962
+       .long   3178728131
+       .long   4238526295
+       .long   2224793024
+       .long   1850268788
+       .long   4044243207
+       .long   1837782628
+       .long   2062488966
+       .long   4182085295
+       .long   154618752
+       .long   3700537577
+       .long   3793519119
+       .long   3675565257
+       .long   4124977933
+       .long   4069203294
+       .long   309237504
+       .long   3106107858
+       .long   3292070943
+       .long   3056163219
+       .long   3954988571
+       .long   3843439293
+       .long   618475008
+       .long   1917248420
+       .long   2289174591
+       .long   1817359143
+       .long   3615009846
+       .long   3391911291
+       .long   1236950016
+       .long   3834496840
+       .long   283381887
+       .long   3634718287
+       .long   2935052397
+       .long   2488855287
+       .long   2473900033
+       .long   3374026384
+       .long   566763775
+       .long   2974469278
+       .long   1575137499
+       .long   682743279
+       .long   652832771
+       .long   2453085473
+       .long   1133527550
+       .long   1653971260
+       .long   3150274999
+       .long   1365486558
+       .long   1305665542
+       .long   611203650
+       .long   2267055100
+       .long   3307942520
+       .long   2005582702
+       .long   2730973117
+       .long   2611331084
+       .long   1222407300
+       .long   239142905
+       .long   2320917745
+       .long   4011165404
+       .long   1166978938
+       .long   927694873
+       .long   2444814601
+       .long   478285810
+       .long   346868194
+       .long   3727363513
+       .long   2333957877
+       .long   1855389746
+       .long   594661906
+       .long   956571621
+       .long   693736388
+       .long   3159759730
+       .long   372948459
+       .long   3710779492
+       .long   1189323812
+       .long   1913143242
+       .long   1387472776
+       .long   2024552164
+       .long   745896919
+       .long   3126591689
+       .long   2378647625
+       .long   3826286484
+       .long   2774945552
+       .long   4049104329
+       .long   1491793838
+       .long   1958216082
+       .long   462327955
+       .long   3357605672
+       .long   1254923809
+       .long   3803241362
+       .long   2983587677
+       .long   3916432164
+       .long   924655910
+       .long   2420244049
+       .long   2509847619
+       .long   3311515428
+       .long   1672208059
+       .long   3537897033
+       .long   1849311821
+       .long   545520802
+       .long   724727943
+       .long   2328063560
+       .long   3344416119
+       .long   2780826770
+       .long   3698623643
+       .long   1091041605
+       .long   1449455886
+       .long   361159825
+       .long   2393864943
+       .long   1266686244
+       .long   3102279991
+       .long   2182083211
+       .long   2898911772
+       .long   722319651
+       .long   492762590
+       .long   2533372489
+       .long   1909592686
+       .long   69199126
+       .long   1502856249
+       .long   1444639302
+       .long   985525180
+       .long   771777682
+       .long   3819185373
+       .long   138398252
+       .long   3005712498
+       .long   2889278605
+       .long   1971050360
+       .long   1543555365
+       .long   3343403450
+       .long   276796504
+       .long   1716457700
+       .long   1483589915
+       .long   3942100721
+       .long   3087110731
+       .long   2391839604
+       .long   553593009
+       .long   3432915400
+       .long   2967179831
+       .long   3589234146
+       .long   1879254167
+       .long   488711913
+       .long   1107186019
+       .long   2570863504
+       .long   1639392366
+       .long   2883500997
+       .long   3758508334
+       .long   977423826
+       .long   2214372039
+       .long   846759712
+       .long   3278784732
+       .long   1472034698
+       .long   3222049373
+       .long   1954847653
+       .long   133776782
+       .long   1693519425
+       .long   2262602168
+       .long   2944069397
+       .long   2149131451
+       .long   3909695307
+       .long   267553565
+       .long   3387038850
+       .long   230237041
+       .long   1593171499
+       .long   3295607
+       .long   3524423319
+       .long   535107130
+       .long   2479110404
+       .long   460474083
+       .long   3186342998
+       .long   6591214
+       .long   2753879342
+       .long   1070214261
+       .long   663253512
+       .long   920948167
+       .long   2077718700
+       .long   13182429
+       .long   1212791388
+       .long   2140428522
+       .long   1326507024
+       .long   1841896334
+       .long   4155437400
+       .long   26364858
+       .long   2425582776
+       .long   4280857045
+       .long   2653014048
+       .long   3683792669
+       .long   4015907504
+       .long   52729717
+       .long   556198256
+       .long   4266746795
+       .long   1011060801
+       .long   3072618042
+       .long   3736847713
+       .long   105459434
+       .long   1112396512
+       .long   4238526295
+       .long   2022121603
+       .long   1850268788
+       .long   3178728131
+       .long   210918868
+       .long   2224793024
+       .long   4182085295
+       .long   4044243207
+       .long   3700537577
+       .long   2062488966
+       .long   421837736
+       .long   154618752
+       .long   4069203294
+       .long   3793519119
+       .long   3106107858
+       .long   4124977933
+       .long   843675472
+       .long   309237504
+       .long   3843439293
+       .long   3292070943
+       .long   1917248420
+       .long   3954988571
+       .long   1687350944
+       .long   618475008
+       .long   3391911291
+       .long   2289174591
+       .long   3834496840
+       .long   3615009846
+       .long   3374701889
+       .long   1236950016
+       .long   2488855287
+       .long   283381887
+       .long   3374026384
+       .long   2935052397
+       .long   2454436482
+       .long   2473900033
+       .long   682743279
+       .long   566763775
+       .long   2453085473
+       .long   1575137499
+       .long   613905668
+       .long   652832771
+       .long   1365486558
+       .long   1133527550
+       .long   611203650
+       .long   3150274999
+       .long   1227811337
+       .long   1305665542
+       .long   2730973117
+       .long   2267055100
+       .long   1222407300
+       .long   2005582702
+       .long   2455622675
+       .long   2611331084
+       .long   1166978938
+       .long   239142905
+       .long   2444814601
+       .long   4011165404
+       .long   616278055
+       .long   927694873
+       .long   2333957877
+       .long   478285810
+       .long   594661906
+       .long   3727363513
+       .long   1232556110
+       .long   1855389746
+       .long   372948459
+       .long   956571621
+       .long   1189323812
+       .long   3159759730
+       .long   2465112221
+       .long   3710779492
+       .long   745896919
+       .long   1913143242
+       .long   2378647625
+       .long   2024552164
+       .long   635257146
+       .long   3126591689
+       .long   1491793838
+       .long   3826286484
+       .long   462327955
+       .long   4049104329
+       .long   1270514292
+       .long   1958216082
+       .long   2983587677
+       .long   3357605672
+       .long   924655910
+       .long   3803241362
+       .long   2541028584
+       .long   3916432164
+       .long   1672208059
+       .long   2420244049
+       .long   1849311821
+       .long   3311515428
+       .long   787089873
+       .long   3537897033
+       .long   3344416119
+       .long   545520802
+       .long   3698623643
+       .long   2328063560
+       .long   1574179747
+       .long   2780826770
+       .long   2393864943
+       .long   1091041605
+       .long   3102279991
+       .long   361159825
+       .long   3148359494
+       .long   1266686244
+       .long   492762590
+       .long   2182083211
+       .long   1909592686
+       .long   722319651
+       .long   2001751692
+       .long   2533372489
+       .long   985525180
+       .long   69199126
+       .long   3819185373
+       .long   1444639302
+       .long   4003503385
+       .long   771777682
+       .long   1971050360
+       .long   138398252
+       .long   3343403450
+       .long   2889278605
+       .long   3712039474
+       .long   1543555365
+       .long   3942100721
+       .long   276796504
+       .long   2391839604
+       .long   1483589915
+       .long   3129111652
+       .long   3087110731
+       .long   3589234146
+       .long   553593009
+       .long   488711913
+       .long   2967179831
+       .long   1963256009
+       .long   1879254167
+       .long   2883500997
+       .long   1107186019
+       .long   977423826
+       .long   1639392366
+       .long   3926512018
+       .long   3758508334
+       .long   1472034698
+       .long   2214372039
+       .long   1954847653
+       .long   3278784732
+       .long   3558056740
+       .long   3222049373
+       .long   2944069397
+       .long   133776782
+       .long   3909695307
+       .long   2262602168
+       .long   2821146184
+       .long   2149131451
+       .long   1593171499
+       .long   267553565
+       .long   3524423319
+       .long   230237041
+       .long   1347325072
+       .long   3295607
+       .long   3186342998
+       .long   535107130
+       .long   2753879342
+       .long   460474083
+       .long   2694650145
+       .long   6591214
+       .long   2077718700
+       .long   1070214261
+       .long   1212791388
+       .long   920948167
+       .long   1094332995
+       .long   13182429
+       .long   4155437400
+       .long   2140428522
+       .long   2425582776
+       .long   1841896334
+       .long   2188665991
+       .long   26364858
+       .long   4015907504
+       .long   4280857045
+       .long   556198256
+       .long   3683792669
+       .long   82364686
+       .long   52729717
+       .long   3736847713
+       .long   4266746795
+       .long   1112396512
+       .long   3072618042
+       .long   164729372
+       .long   105459434
+       .long   3178728131
+       .long   4238526295
+       .long   2224793024
+       .long   1850268788
+       .long   329458745
+       .long   210918868
+       .long   2062488966
+       .long   4182085295
+       .long   154618752
+       .long   3700537577
+       .long   658917491
+       .long   421837736
+       .long   4124977933
+       .long   4069203294
+       .long   309237504
+       .long   3106107858
+       .long   1317834983
+       .long   843675472
+       .long   3954988571
+       .long   3843439293
+       .long   618475008
+       .long   1917248420
+       .long   2635669967
+       .long   1687350944
+       .long   3615009846
+       .long   3391911291
+       .long   1236950016
+       .long   3834496840
+       .long   976372639
+       .long   3374701889
+       .long   2935052397
+       .long   2488855287
+       .long   2473900033
+       .long   3374026384
+       .long   1952745279
+       .long   2454436482
+       .long   1575137499
+       .long   682743279
+       .long   652832771
+       .long   2453085473
+       .long   3905490559
+       .long   613905668
+       .long   3150274999
+       .long   1365486558
+       .long   1305665542
+       .long   611203650
+       .long   3516013822
+       .long   1227811337
+       .long   2005582702
+       .long   2730973117
+       .long   2611331084
+       .long   1222407300
+       .long   2737060348
+       .long   2455622675
+       .long   4011165404
+       .long   1166978938
+       .long   927694873
+       .long   2444814601
+       .long   1179153400
+       .long   616278055
+       .long   3727363513
+       .long   2333957877
+       .long   1855389746
+       .long   594661906
+       .long   2358306800
+       .long   1232556110
+       .long   3159759730
+       .long   372948459
+       .long   3710779492
+       .long   1189323812
+       .long   421646305
+       .long   2465112221
+       .long   2024552164
+       .long   745896919
+       .long   3126591689
+       .long   2378647625
+       .long   843292611
+       .long   635257146
+       .long   4049104329
+       .long   1491793838
+       .long   1958216082
+       .long   462327955
+       .long   1686585223
+       .long   1270514292
+       .long   3803241362
+       .long   2983587677
+       .long   3916432164
+       .long   924655910
+       .long   3373170446
+       .long   2541028584
+       .long   3311515428
+       .long   1672208059
+       .long   3537897033
+       .long   1849311821
+       .long   2451373597
+       .long   787089873
+       .long   2328063560
+       .long   3344416119
+       .long   2780826770
+       .long   3698623643
+       .long   607779899
+       .long   1574179747
+       .long   361159825
+       .long   2393864943
+       .long   1266686244
+       .long   3102279991
+       .long   1215559799
+       .long   3148359494
+       .long   722319651
+       .long   492762590
+       .long   2533372489
+       .long   1909592686
+       .long   2431119599
+       .long   2001751692
+       .long   1444639302
+       .long   985525180
+       .long   771777682
+       .long   3819185373
+       .long   567271902
+       .long   4003503385
+       .long   2889278605
+       .long   1971050360
+       .long   1543555365
+       .long   3343403450
+       .long   1134543805
+       .long   3712039474
+       .long   1483589915
+       .long   3942100721
+       .long   3087110731
+       .long   2391839604
+       .long   2269087610
+       .long   3129111652
+       .long   2967179831
+       .long   3589234146
+       .long   1879254167
+       .long   488711913
+       .long   243207925
+       .long   1963256009
+       .long   1639392366
+       .long   2883500997
+       .long   3758508334
+       .long   977423826
+       .long   486415851
+       .long   3926512018
+       .long   3278784732
+       .long   1472034698
+       .long   3222049373
+       .long   1954847653
+       .long   972831702
+       .long   3558056740
+       .long   2262602168
+       .long   2944069397
+       .long   2149131451
+       .long   3909695307
+       .long   1945663404
+       .long   2821146184
+       .long   230237041
+       .long   1593171499
+       .long   3295607
+       .long   3524423319
+       .long   3891326808
+       .long   1347325072
+       .long   460474083
+       .long   3186342998
+       .long   6591214
+       .long   2753879342
+       .long   3487686321
+       .long   2694650145
+       .long   920948167
+       .long   2077718700
+       .long   13182429
+       .long   1212791388
+       .long   2680405347
+       .long   1094332995
+       .long   1841896334
+       .long   4155437400
+       .long   26364858
+       .long   2425582776
+       .long   1065843399
+       .long   2188665991
+       .long   3683792669
+       .long   4015907504
+       .long   52729717
+       .long   556198256
+       .long   2131686798
+       .long   82364686
+       .long   3072618042
+       .long   3736847713
+       .long   105459434
+       .long   1112396512
+       .long   4263373596
+       .long   164729372
+       .long   1850268788
+       .long   3178728131
+       .long   210918868
+       .long   2224793024
+       .long   4231779897
+       .long   329458745
+       .long   3700537577
+       .long   2062488966
+       .long   421837736
+       .long   154618752
+       .long   4168592498
+       .long   658917491
+       .long   3106107858
+       .long   4124977933
+       .long   843675472
+       .long   309237504
+       .long   4042217701
+       .long   1317834983
+       .long   1917248420
+       .long   3954988571
+       .long   1687350944
+       .long   618475008
+       .long   3789468107
+       .long   2635669967
+       .long   3834496840
+       .long   3615009846
+       .long   3374701889
+       .long   1236950016
+       .long   3283968918
+       .long   976372639
+       .long   3374026384
+       .long   2935052397
+       .long   2454436482
+       .long   2473900033
+       .long   2272970540
+       .long   1952745279
+       .long   2453085473
+       .long   1575137499
+       .long   613905668
+       .long   652832771
+       .long   250973784
+       .long   3905490559
+       .long   611203650
+       .long   3150274999
+       .long   1227811337
+       .long   1305665542
+       .long   501947569
+       .long   3516013822
+       .long   1222407300
+       .long   2005582702
+       .long   2455622675
+       .long   2611331084
+       .long   1003895138
+       .long   2737060348
+       .long   2444814601
+       .long   4011165404
+       .long   616278055
+       .long   927694873
+       .long   2007790276
+       .long   1179153400
+       .long   594661906
+       .long   3727363513
+       .long   1232556110
+       .long   1855389746
+       .long   4015580553
+       .long   2358306800
+       .long   1189323812
+       .long   3159759730
+       .long   2465112221
+       .long   3710779492
+       .long   3736193810
+       .long   421646305
+       .long   2378647625
+       .long   2024552164
+       .long   635257146
+       .long   3126591689
+       .long   3177420325
+       .long   843292611
+       .long   462327955
+       .long   4049104329
+       .long   1270514292
+       .long   1958216082
+       .long   2059873354
+       .long   1686585223
+       .long   924655910
+       .long   3803241362
+       .long   2541028584
+       .long   3916432164
+       .long   4119746708
+       .long   3373170446
+       .long   1849311821
+       .long   3311515428
+       .long   787089873
+       .long   3537897033
+       .long   3944526121
+       .long   2451373597
+       .long   3698623643
+       .long   2328063560
+       .long   1574179747
+       .long   2780826770
+       .long   3594084947
+       .long   607779899
+       .long   3102279991
+       .long   361159825
+       .long   3148359494
+       .long   1266686244
+       .long   2893202598
+       .long   1215559799
+       .long   1909592686
+       .long   722319651
+       .long   2001751692
+       .long   2533372489
+       .long   1491437901
+       .long   2431119599
+       .long   3819185373
+       .long   1444639302
+       .long   4003503385
+       .long   771777682
+       .long   2982875802
+       .long   567271902
+       .long   3343403450
+       .long   2889278605
+       .long   3712039474
+       .long   1543555365
+       .long   1670784308
+       .long   1134543805
+       .long   2391839604
+       .long   1483589915
+       .long   3129111652
+       .long   3087110731
+       .long   3341568617
+       .long   2269087610
+       .long   488711913
+       .long   2967179831
+       .long   1963256009
+       .long   1879254167
+       .long   2388169939
+       .long   243207925
+       .long   977423826
+       .long   1639392366
+       .long   3926512018
+       .long   3758508334
+       .long   481372583
+       .long   486415851
+       .long   1954847653
+       .long   3278784732
+       .long   3558056740
+       .long   3222049373
+       .long   962745166
+       .long   972831702
+       .long   3909695307
+       .long   2262602168
+       .long   2821146184
+       .long   2149131451
+       .long   1925490332
+       .long   1945663404
+       .long   3524423319
+       .long   230237041
+       .long   1347325072
+       .long   3295607
+       .long   3850980665
+       .long   3891326808
+       .long   2753879342
+       .long   460474083
+       .long   2694650145
+       .long   6591214
+       .long   3406994035
+       .long   3487686321
+       .long   1212791388
+       .long   920948167
+       .long   1094332995
+       .long   13182429
+       .long   2519020775
+       .long   2680405347
+       .long   2425582776
+       .long   1841896334
+       .long   2188665991
+       .long   26364858
+       .long   743074255
+       .long   1065843399
+       .long   556198256
+       .long   3683792669
+       .long   82364686
+       .long   52729717
+       .long   1486148511
+       .long   2131686798
+       .long   1112396512
+       .long   3072618042
+       .long   164729372
+       .long   105459434
+       .long   2972297022
+       .long   4263373596
+       .long   2224793024
+       .long   1850268788
+       .long   329458745
+       .long   210918868
+       .long   1649626749
+       .long   4231779897
+       .long   154618752
+       .long   3700537577
+       .long   658917491
+       .long   421837736
+       .long   3299253499
+       .long   4168592498
+       .long   309237504
+       .long   3106107858
+       .long   1317834983
+       .long   843675472
+       .long   2303539703
+       .long   4042217701
+       .long   618475008
+       .long   1917248420
+       .long   2635669967
+       .long   1687350944
+       .long   312112110
+       .long   3789468107
+       .long   1236950016
+       .long   3834496840
+       .long   976372639
+       .long   3374701889
+       .long   624224221
+       .long   3283968918
+       .long   2473900033
+       .long   3374026384
+       .long   1952745279
+       .long   2454436482
+       .long   1248448442
+       .long   2272970540
+       .long   652832771
+       .long   2453085473
+       .long   3905490559
+       .long   613905668
+       .long   2496896884
+       .long   250973784
+       .long   1305665542
+       .long   611203650
+       .long   3516013822
+       .long   1227811337
+       .long   698826472
+       .long   501947569
+       .long   2611331084
+       .long   1222407300
+       .long   2737060348
+       .long   2455622675
+       .long   1397652945
+       .long   1003895138
+       .long   927694873
+       .long   2444814601
+       .long   1179153400
+       .long   616278055
+       .long   2795305890
+       .long   2007790276
+       .long   1855389746
+       .long   594661906
+       .long   2358306800
+       .long   1232556110
+       .long   1295644484
+       .long   4015580553
+       .long   3710779492
+       .long   1189323812
+       .long   421646305
+       .long   2465112221
+       .long   2591288968
+       .long   3736193810
+       .long   3126591689
+       .long   2378647625
+       .long   843292611
+       .long   635257146
+       .long   887610640
+       .long   3177420325
+       .long   1958216082
+       .long   462327955
+       .long   1686585223
+       .long   1270514292
+       .long   1775221280
+       .long   2059873354
+       .long   3916432164
+       .long   924655910
+       .long   3373170446
+       .long   2541028584
+       .long   3550442561
+       .long   4119746708
+       .long   3537897033
+       .long   1849311821
+       .long   2451373597
+       .long   787089873
+       .long   2805917826
+       .long   3944526121
+       .long   2780826770
+       .long   3698623643
+       .long   607779899
+       .long   1574179747
+       .long   1316868356
+       .long   3594084947
+       .long   1266686244
+       .long   3102279991
+       .long   1215559799
+       .long   3148359494
+       .long   2633736712
+       .long   2893202598
+       .long   2533372489
+       .long   1909592686
+       .long   2431119599
+       .long   2001751692
+       .long   972506129
+       .long   1491437901
+       .long   771777682
+       .long   3819185373
+       .long   567271902
+       .long   4003503385
+       .long   1945012259
+       .long   2982875802
+       .long   1543555365
+       .long   3343403450
+       .long   1134543805
+       .long   3712039474
+       .long   3890024518
+       .long   1670784308
+       .long   3087110731
+       .long   2391839604
+       .long   2269087610
+       .long   3129111652
+       .long   3485081741
+       .long   3341568617
+       .long   1879254167
+       .long   488711913
+       .long   243207925
+       .long   1963256009
+       .long   2675196186
+       .long   2388169939
+       .long   3758508334
+       .long   977423826
+       .long   486415851
+       .long   3926512018
+       .long   1055425077
+       .long   481372583
+       .long   3222049373
+       .long   1954847653
+       .long   972831702
+       .long   3558056740
+       .long   2110850155
+       .long   962745166
+       .long   2149131451
+       .long   3909695307
+       .long   1945663404
+       .long   2821146184
+       .long   4221700311
+       .long   1925490332
+       .long   3295607
+       .long   3524423319
+       .long   3891326808
+       .long   1347325072
+       .long   4148433327
+       .long   3850980665
+       .long   6591214
+       .long   2753879342
+       .long   3487686321
+       .long   2694650145
+       .long   4001899359
+       .long   3406994035
+       .long   13182429
+       .long   1212791388
+       .long   2680405347
+       .long   1094332995
+       .long   3708831422
+       .long   2519020775
+       .long   26364858
+       .long   2425582776
+       .long   1065843399
+       .long   2188665991
+       .long   3122695549
+       .long   743074255
+       .long   52729717
+       .long   556198256
+       .long   2131686798
+       .long   82364686
+       .long   1950423802
+       .long   1486148511
+       .long   105459434
+       .long   1112396512
+       .long   4263373596
+       .long   164729372
+       .long   3900847605
+       .long   2972297022
+       .long   210918868
+       .long   2224793024
+       .long   4231779897
+       .long   329458745
+       .long   3506727914
+       .long   1649626749
+       .long   421837736
+       .long   154618752
+       .long   4168592498
+       .long   658917491
+       .long   2718488532
+       .long   3299253499
+       .long   843675472
+       .long   309237504
+       .long   4042217701
+       .long   1317834983
+       .long   1142009769
+       .long   2303539703
+       .long   1687350944
+       .long   618475008
+       .long   3789468107
+       .long   2635669967
+       .long   2284019538
+       .long   312112110
+       .long   3374701889
+       .long   1236950016
+       .long   3283968918
+       .long   976372639
+       .long   273071781
+       .long   624224221
+       .long   2454436482
+       .long   2473900033
+       .long   2272970540
+       .long   1952745279
+       .long   546143563
+       .long   1248448442
+       .long   613905668
+       .long   652832771
+       .long   250973784
+       .long   3905490559
+       .long   1092287127
+       .long   2496896884
+       .long   1227811337
+       .long   1305665542
+       .long   501947569
+       .long   3516013822
+       .long   2184574254
+       .long   698826472
+       .long   2455622675
+       .long   2611331084
+       .long   1003895138
+       .long   2737060348
+       .long   74181213
+       .long   1397652945
+       .long   616278055
+       .long   927694873
+       .long   2007790276
+       .long   1179153400
+       .long   148362426
+       .long   2795305890
+       .long   1232556110
+       .long   1855389746
+       .long   4015580553
+       .long   2358306800
+       .long   296724853
+       .long   1295644484
+       .long   2465112221
+       .long   3710779492
+       .long   3736193810
+       .long   421646305
+       .long   593449707
+       .long   2591288968
+       .long   635257146
+       .long   3126591689
+       .long   3177420325
+       .long   843292611
+       .long   1186899415
+       .long   887610640
+       .long   1270514292
+       .long   1958216082
+       .long   2059873354
+       .long   1686585223
+       .long   2373798830
+       .long   1775221280
+       .long   2541028584
+       .long   3916432164
+       .long   4119746708
+       .long   3373170446
+       .long   452630365
+       .long   3550442561
+       .long   787089873
+       .long   3537897033
+       .long   3944526121
+       .long   2451373597
+       .long   905260731
+       .long   2805917826
+       .long   1574179747
+       .long   2780826770
+       .long   3594084947
+       .long   607779899
+       .long   1810521462
+       .long   1316868356
+       .long   3148359494
+       .long   1266686244
+       .long   2893202598
+       .long   1215559799
+       .long   3621042925
+       .long   2633736712
+       .long   2001751692
+       .long   2533372489
+       .long   1491437901
+       .long   2431119599
+       .long   2947118554
+       .long   972506129
+       .long   4003503385
+       .long   771777682
+       .long   2982875802
+       .long   567271902
+       .long   1599269812
+       .long   1945012259
+       .long   3712039474
+       .long   1543555365
+       .long   1670784308
+       .long   1134543805
+       .long   3198539624
+       .long   3890024518
+       .long   3129111652
+       .long   3087110731
+       .long   3341568617
+       .long   2269087610
+       .long   2102111953
+       .long   3485081741
+       .long   1963256009
+       .long   1879254167
+       .long   2388169939
+       .long   243207925
+       .long   4204223906
+       .long   2675196186
+       .long   3926512018
+       .long   3758508334
+       .long   481372583
+       .long   486415851
+       .long   4113480516
+       .long   1055425077
+       .long   3558056740
+       .long   3222049373
+       .long   962745166
+       .long   972831702
+       .long   3931993737
+       .long   2110850155
+       .long   2821146184
+       .long   2149131451
+       .long   1925490332
+       .long   1945663404
+       .long   3569020178
+       .long   4221700311
+       .long   1347325072
+       .long   3295607
+       .long   3850980665
+       .long   3891326808
+       .long   2843073060
+       .long   4148433327
+       .long   2694650145
+       .long   6591214
+       .long   3406994035
+       .long   3487686321
+       .long   1391178824
+       .long   4001899359
+       .long   1094332995
+       .long   13182429
+       .long   2519020775
+       .long   2680405347
+       .long   2782357648
+       .long   3708831422
+       .long   2188665991
+       .long   26364858
+       .long   743074255
+       .long   1065843399
+       .long   1269748001
+       .long   3122695549
+       .long   82364686
+       .long   52729717
+       .long   1486148511
+       .long   2131686798
+       .long   2539496002
+       .long   1950423802
+       .long   164729372
+       .long   105459434
+       .long   2972297022
+       .long   4263373596
+       .long   784024708
+       .long   3900847605
+       .long   329458745
+       .long   210918868
+       .long   1649626749
+       .long   4231779897
+       .long   1568049417
+       .long   3506727914
+       .long   658917491
+       .long   421837736
+       .long   3299253499
+       .long   4168592498
+       .long   3136098835
+       .long   2718488532
+       .long   1317834983
+       .long   843675472
+       .long   2303539703
+       .long   4042217701
+       .long   1977230375
+       .long   1142009769
+       .long   2635669967
+       .long   1687350944
+       .long   312112110
+       .long   3789468107
+       .long   3954460750
+       .long   2284019538
+       .long   976372639
+       .long   3374701889
+       .long   624224221
+       .long   3283968918
+       .long   3613954205
+       .long   273071781
+       .long   1952745279
+       .long   2454436482
+       .long   1248448442
+       .long   2272970540
+       .long   2932941114
+       .long   546143563
+       .long   3905490559
+       .long   613905668
+       .long   2496896884
+       .long   250973784
+       .long   1570914932
+       .long   1092287127
+       .long   3516013822
+       .long   1227811337
+       .long   698826472
+       .long   501947569
+       .long   3141829865
+       .long   2184574254
+       .long   2737060348
+       .long   2455622675
+       .long   1397652945
+       .long   1003895138
+       .long   1988692435
+       .long   74181213
+       .long   1179153400
+       .long   616278055
+       .long   2795305890
+       .long   2007790276
+       .long   3977384870
+       .long   148362426
+       .long   2358306800
+       .long   1232556110
+       .long   1295644484
+       .long   4015580553
+       .long   3659802444
+       .long   296724853
+       .long   421646305
+       .long   2465112221
+       .long   2591288968
+       .long   3736193810
+       .long   3024637593
+       .long   593449707
+       .long   843292611
+       .long   635257146
+       .long   887610640
+       .long   3177420325
+       .long   1754307891
+       .long   1186899415
+       .long   1686585223
+       .long   1270514292
+       .long   1775221280
+       .long   2059873354
+       .long   3508615783
+       .long   2373798830
+       .long   3373170446
+       .long   2541028584
+       .long   3550442561
+       .long   4119746708
+       .long   2722264270
+       .long   452630365
+       .long   2451373597
+       .long   787089873
+       .long   2805917826
+       .long   3944526121
+       .long   1149561244
+       .long   905260731
+       .long   607779899
+       .long   1574179747
+       .long   1316868356
+       .long   3594084947
+       .long   2299122488
+       .long   1810521462
+       .long   1215559799
+       .long   3148359494
+       .long   2633736712
+       .long   2893202598
+       .long   303277681
+       .long   3621042925
+       .long   2431119599
+       .long   2001751692
+       .long   972506129
+       .long   1491437901
+       .long   606555363
+       .long   2947118554
+       .long   567271902
+       .long   4003503385
+       .long   1945012259
+       .long   2982875802
+       .long   1213110727
+       .long   1599269812
+       .long   1134543805
+       .long   3712039474
+       .long   3890024518
+       .long   1670784308
+       .long   2426221454
+       .long   3198539624
+       .long   2269087610
+       .long   3129111652
+       .long   3485081741
+       .long   3341568617
+       .long   557475612
+       .long   2102111953
+       .long   243207925
+       .long   1963256009
+       .long   2675196186
+       .long   2388169939
+       .long   1114951224
+       .long   4204223906
+       .long   486415851
+       .long   3926512018
+       .long   1055425077
+       .long   481372583
+       .long   2229902448
+       .long   4113480516
+       .long   972831702
+       .long   3558056740
+       .long   2110850155
+       .long   962745166
+       .long   164837600
+       .long   3931993737
+       .long   1945663404
+       .long   2821146184
+       .long   4221700311
+       .long   1925490332
+       .long   329675200
+       .long   3569020178
+       .long   3891326808
+       .long   1347325072
+       .long   4148433327
+       .long   3850980665
+       .long   659350401
+       .long   2843073060
+       .long   3487686321
+       .long   2694650145
+       .long   4001899359
+       .long   3406994035
+       .long   1318700802
+       .long   1391178824
+       .long   2680405347
+       .long   1094332995
+       .long   3708831422
+       .long   2519020775
+       .long   2637401604
+       .long   2782357648
+       .long   1065843399
+       .long   2188665991
+       .long   3122695549
+       .long   743074255
+       .long   979835913
+       .long   1269748001
+       .long   2131686798
+       .long   82364686
+       .long   1950423802
+       .long   1486148511
+       .long   1959671827
+       .long   2539496002
+       .long   4263373596
+       .long   164729372
+       .long   3900847605
+       .long   2972297022
+       .long   3919343654
+       .long   784024708
+       .long   4231779897
+       .long   329458745
+       .long   3506727914
+       .long   1649626749
+       .long   3543720013
+       .long   1568049417
+       .long   4168592498
+       .long   658917491
+       .long   2718488532
+       .long   3299253499
+       .long   2792472730
+       .long   3136098835
+       .long   4042217701
+       .long   1317834983
+       .long   1142009769
+       .long   2303539703
+       .long   1289978165
+       .long   1977230375
+       .long   3789468107
+       .long   2635669967
+       .long   2284019538
+       .long   312112110
+       .long   2579956331
+       .long   3954460750
+       .long   3283968918
+       .long   976372639
+       .long   273071781
+       .long   624224221
+       .long   864945366
+       .long   3613954205
+       .long   2272970540
+       .long   1952745279
+       .long   546143563
+       .long   1248448442
+       .long   1729890733
+       .long   2932941114
+       .long   250973784
+       .long   3905490559
+       .long   1092287127
+       .long   2496896884
+       .long   3459781466
+       .long   1570914932
+       .long   501947569
+       .long   3516013822
+       .long   2184574254
+       .long   698826472
+       .long   2624595636
+       .long   3141829865
+       .long   1003895138
+       .long   2737060348
+       .long   74181213
+       .long   1397652945
+       .long   954223976
+       .long   1988692435
+       .long   2007790276
+       .long   1179153400
+       .long   148362426
+       .long   2795305890
+       .long   1908447953
+       .long   3977384870
+       .long   4015580553
+       .long   2358306800
+       .long   296724853
+       .long   1295644484
+       .long   3816895906
+       .long   3659802444
+       .long   3736193810
+       .long   421646305
+       .long   593449707
+       .long   2591288968
+       .long   3338824517
+       .long   3024637593
+       .long   3177420325
+       .long   843292611
+       .long   1186899415
+       .long   887610640
+       .long   2382681739
+       .long   1754307891
+       .long   2059873354
+       .long   1686585223
+       .long   2373798830
+       .long   1775221280
+       .long   470396183
+       .long   3508615783
+       .long   4119746708
+       .long   3373170446
+       .long   452630365
+       .long   3550442561
+       .long   940792367
+       .long   2722264270
+       .long   3944526121
+       .long   2451373597
+       .long   905260731
+       .long   2805917826
+       .long   1881584735
+       .long   1149561244
+       .long   3594084947
+       .long   607779899
+       .long   1810521462
+       .long   1316868356
+       .long   3763169470
+       .long   2299122488
+       .long   2893202598
+       .long   1215559799
+       .long   3621042925
+       .long   2633736712
+       .long   3231371645
+       .long   303277681
+       .long   1491437901
+       .long   2431119599
+       .long   2947118554
+       .long   972506129
+       .long   2167775995
+       .long   606555363
+       .long   2982875802
+       .long   567271902
+       .long   1599269812
+       .long   1945012259
+       .long   40584695
+       .long   1213110727
+       .long   1670784308
+       .long   1134543805
+       .long   3198539624
+       .long   3890024518
+       .long   81169391
+       .long   2426221454
+       .long   3341568617
+       .long   2269087610
+       .long   2102111953
+       .long   3485081741
+       .long   162338783
+       .long   557475612
+       .long   2388169939
+       .long   243207925
+       .long   4204223906
+       .long   2675196186
+       .long   324677567
+       .long   1114951224
+       .long   481372583
+       .long   486415851
+       .long   4113480516
+       .long   1055425077
+       .long   649355134
+       .long   2229902448
+       .long   962745166
+       .long   972831702
+       .long   3931993737
+       .long   2110850155
+       .long   1298710268
+       .long   164837600
+       .long   1925490332
+       .long   1945663404
+       .long   3569020178
+       .long   4221700311
+       .long   2597420537
+       .long   329675200
+       .long   3850980665
+       .long   3891326808
+       .long   2843073060
+       .long   4148433327
+       .long   899873778
+       .long   659350401
+       .long   3406994035
+       .long   3487686321
+       .long   1391178824
+       .long   4001899359
+       .long   1799747556
+       .long   1318700802
+       .long   2519020775
+       .long   2680405347
+       .long   2782357648
+       .long   3708831422
+       .long   3599495112
+       .long   2637401604
+       .long   743074255
+       .long   1065843399
+       .long   1269748001
+       .long   3122695549
+       .long   2904022928
+       .long   979835913
+       .long   1486148511
+       .long   2131686798
+       .long   2539496002
+       .long   1950423802
+       .long   1513078560
+       .long   1959671827
+       .long   2972297022
+       .long   4263373596
+       .long   784024708
+       .long   3900847605
+       .long   3026157121
+       .long   3919343654
+       .long   1649626749
+       .long   4231779897
+       .long   1568049417
+       .long   3506727914
+       .long   1757346946
+       .long   3543720013
+       .long   3299253499
+       .long   4168592498
+       .long   3136098835
+       .long   2718488532
+       .long   3514693892
+       .long   2792472730
+       .long   2303539703
+       .long   4042217701
+       .long   1977230375
+       .long   1142009769
+       .long   2734420489
+       .long   1289978165
+       .long   312112110
+       .long   3789468107
+       .long   3954460750
+       .long   2284019538
+       .long   1173873683
+       .long   2579956331
+       .long   624224221
+       .long   3283968918
+       .long   3613954205
+       .long   273071781
+       .long   2347747367
+       .long   864945366
+       .long   1248448442
+       .long   2272970540
+       .long   2932941114
+       .long   546143563
+       .long   400527438
+       .long   1729890733
+       .long   2496896884
+       .long   250973784
+       .long   1570914932
+       .long   1092287127
+       .long   801054876
+       .long   3459781466
+       .long   698826472
+       .long   501947569
+       .long   3141829865
+       .long   2184574254
+       .long   1602109753
+       .long   2624595636
+       .long   1397652945
+       .long   1003895138
+       .long   1988692435
+       .long   74181213
+       .long   3204219507
+       .long   954223976
+       .long   2795305890
+       .long   2007790276
+       .long   3977384870
+       .long   148362426
+       .long   2113471718
+       .long   1908447953
+       .long   1295644484
+       .long   4015580553
+       .long   3659802444
+       .long   296724853
+       .long   4226943436
+       .long   3816895906
+       .long   2591288968
+       .long   3736193810
+       .long   3024637593
+       .long   593449707
+       .long   4158919577
+       .long   3338824517
+       .long   887610640
+       .long   3177420325
+       .long   1754307891
+       .long   1186899415
+       .long   4022871858
+       .long   2382681739
+       .long   1775221280
+       .long   2059873354
+       .long   3508615783
+       .long   2373798830
+       .long   3750776420
+       .long   470396183
+       .long   3550442561
+       .long   4119746708
+       .long   2722264270
+       .long   452630365
+       .long   3206585544
+       .long   940792367
+       .long   2805917826
+       .long   3944526121
+       .long   1149561244
+       .long   905260731
+       .long   2118203793
+       .long   1881584735
+       .long   1316868356
+       .long   3594084947
+       .long   2299122488
+       .long   1810521462
+       .long   4236407587
+       .long   3763169470
+       .long   2633736712
+       .long   2893202598
+       .long   303277681
+       .long   3621042925
+       .long   4177847879
+       .long   3231371645
+       .long   972506129
+       .long   1491437901
+       .long   606555363
+       .long   2947118554
+       .long   4060728462
+       .long   2167775995
+       .long   1945012259
+       .long   2982875802
+       .long   1213110727
+       .long   1599269812
+       .long   3826489629
+       .long   40584695
+       .long   3890024518
+       .long   1670784308
+       .long   2426221454
+       .long   3198539624
+       .long   3358011962
+       .long   81169391
+       .long   3485081741
+       .long   3341568617
+       .long   557475612
+       .long   2102111953
+       .long   2421056629
+       .long   162338783
+       .long   2675196186
+       .long   2388169939
+       .long   1114951224
+       .long   4204223906
+       .long   547145963
+       .long   324677567
+       .long   1055425077
+       .long   481372583
+       .long   2229902448
+       .long   4113480516
+       .long   1094291926
+       .long   649355134
+       .long   2110850155
+       .long   962745166
+       .long   164837600
+       .long   3931993737
+       .long   2188583852
+       .long   1298710268
+       .long   4221700311
+       .long   1925490332
+       .long   329675200
+       .long   3569020178
+       .long   82200408
+       .long   2597420537
+       .long   4148433327
+       .long   3850980665
+       .long   659350401
+       .long   2843073060
+       .long   164400817
+       .long   899873778
+       .long   4001899359
+       .long   3406994035
+       .long   1318700802
+       .long   1391178824
+       .long   328801635
+       .long   1799747556
+       .long   3708831422
+       .long   2519020775
+       .long   2637401604
+       .long   2782357648
+       .long   657603271
+       .long   3599495112
+       .long   3122695549
+       .long   743074255
+       .long   979835913
+       .long   1269748001
+       .long   1315206542
+       .long   2904022928
+       .long   1950423802
+       .long   1486148511
+       .long   1959671827
+       .long   2539496002
+       .long   2630413084
+       .long   1513078560
+       .long   3900847605
+       .long   2972297022
+       .long   3919343654
+       .long   784024708
+       .long   965858873
+       .long   3026157121
+       .long   3506727914
+       .long   1649626749
+       .long   3543720013
+       .long   1568049417
+       .long   1931717747
+       .long   1757346946
+       .long   2718488532
+       .long   3299253499
+       .long   2792472730
+       .long   3136098835
+       .long   3863435494
+       .long   3514693892
+       .long   1142009769
+       .long   2303539703
+       .long   1289978165
+       .long   1977230375
+       .long   3431903692
+       .long   2734420489
+       .long   2284019538
+       .long   312112110
+       .long   2579956331
+       .long   3954460750
+       .long   2568840088
+       .long   1173873683
+       .long   273071781
+       .long   624224221
+       .long   864945366
+       .long   3613954205
+       .long   842712880
+       .long   2347747367
+       .long   546143563
+       .long   1248448442
+       .long   1729890733
+       .long   2932941114
+       .long   1685425760
+       .long   400527438
+       .long   1092287127
+       .long   2496896884
+       .long   3459781466
+       .long   1570914932
+       .long   3370851521
+       .long   801054876
+       .long   2184574254
+       .long   698826472
+       .long   2624595636
+       .long   3141829865
+       .long   2446735747
+       .long   1602109753
+       .long   74181213
+       .long   1397652945
+       .long   954223976
+       .long   1988692435
+       .long   598504198
+       .long   3204219507
+       .long   148362426
+       .long   2795305890
+       .long   1908447953
+       .long   3977384870
+       .long   1197008397
+       .long   2113471718
+       .long   296724853
+       .long   1295644484
+       .long   3816895906
+       .long   3659802444
+       .long   2394016794
+       .long   4226943436
+       .long   593449707
+       .long   2591288968
+       .long   3338824517
+       .long   3024637593
+       .long   493066293
+       .long   4158919577
+       .long   1186899415
+       .long   887610640
+       .long   2382681739
+       .long   1754307891
+       .long   986132586
+       .long   4022871858
+       .long   2373798830
+       .long   1775221280
+       .long   470396183
+       .long   3508615783
+       .long   1972265172
+       .long   3750776420
+       .long   452630365
+       .long   3550442561
+       .long   940792367
+       .long   2722264270
+       .long   3944530345
+       .long   3206585544
+       .long   905260731
+       .long   2805917826
+       .long   1881584735
+       .long   1149561244
+       .long   3594093395
+       .long   2118203793
+       .long   1810521462
+       .long   1316868356
+       .long   3763169470
+       .long   2299122488
+       .long   2893219494
+       .long   4236407587
+       .long   3621042925
+       .long   2633736712
+       .long   3231371645
+       .long   303277681
+       .long   1491471692
+       .long   4177847879
+       .long   2947118554
+       .long   972506129
+       .long   2167775995
+       .long   606555363
+       .long   2982943385
+       .long   4060728462
+       .long   1599269812
+       .long   1945012259
+       .long   40584695
+       .long   1213110727
+       .long   1670919475
+       .long   3826489629
+       .long   3198539624
+       .long   3890024518
+       .long   81169391
+       .long   2426221454
+       .long   3341838951
+       .long   3358011962
+       .long   2102111953
+       .long   3485081741
+       .long   162338783
+       .long   557475612
+       .long   2388710606
+       .long   2421056629
+       .long   4204223906
+       .long   2675196186
+       .long   324677567
+       .long   1114951224
+       .long   482453916
+       .long   547145963
+       .long   4113480516
+       .long   1055425077
+       .long   649355134
+       .long   2229902448
+       .long   964907833
+       .long   1094291926
+       .long   3931993737
+       .long   2110850155
+       .long   1298710268
+       .long   164837600
+       .long   1929815667
+       .long   2188583852
+       .long   3569020178
+       .long   4221700311
+       .long   2597420537
+       .long   329675200
+       .long   3859631335
+       .long   82200408
+       .long   2843073060
+       .long   4148433327
+       .long   899873778
+       .long   659350401
+       .long   3424295375
+       .long   164400817
+       .long   1391178824
+       .long   4001899359
+       .long   1799747556
+       .long   1318700802
+       .long   2553623455
+       .long   328801635
+       .long   2782357648
+       .long   3708831422
+       .long   3599495112
+       .long   2637401604
+       .long   812279614
+       .long   657603271
+       .long   1269748001
+       .long   3122695549
+       .long   2904022928
+       .long   979835913
+       .long   1624559229
+       .long   1315206542
+       .long   2539496002
+       .long   1950423802
+       .long   1513078560
+       .long   1959671827
+       .long   3249118458
+       .long   2630413084
+       .long   784024708
+       .long   3900847605
+       .long   3026157121
+       .long   3919343654
+       .long   2203269620
+       .long   965858873
+       .long   1568049417
+       .long   3506727914
+       .long   1757346946
+       .long   3543720013
+       .long   111571945
+       .long   1931717747
+       .long   3136098835
+       .long   2718488532
+       .long   3514693892
+       .long   2792472730
+       .long   223143890
+       .long   3863435494
+       .long   1977230375
+       .long   1142009769
+       .long   2734420489
+       .long   1289978165
+       .long   446287780
+       .long   3431903692
+       .long   3954460750
+       .long   2284019538
+       .long   1173873683
+       .long   2579956331
+       .long   892575561
+       .long   2568840088
+       .long   3613954205
+       .long   273071781
+       .long   2347747367
+       .long   864945366
+       .long   1785151123
+       .long   842712880
+       .long   2932941114
+       .long   546143563
+       .long   400527438
+       .long   1729890733
+       .long   3570302247
+       .long   1685425760
+       .long   1570914932
+       .long   1092287127
+       .long   801054876
+       .long   3459781466
+       .long   2845637198
+       .long   3370851521
+       .long   3141829865
+       .long   2184574254
+       .long   1602109753
+       .long   2624595636
+       .long   1396307100
+       .long   2446735747
+       .long   1988692435
+       .long   74181213
+       .long   3204219507
+       .long   954223976
+       .long   2792614201
+       .long   598504198
+       .long   3977384870
+       .long   148362426
+       .long   2113471718
+       .long   1908447953
+       .long   1290261106
+       .long   1197008397
+       .long   3659802444
+       .long   296724853
+       .long   4226943436
+       .long   3816895906
+       .long   2580522212
+       .long   2394016794
+       .long   3024637593
+       .long   593449707
+       .long   4158919577
+       .long   3338824517
+       .long   866077128
+       .long   493066293
+       .long   1754307891
+       .long   1186899415
+       .long   4022871858
+       .long   2382681739
+       .long   1732154256
+       .long   986132586
+       .long   3508615783
+       .long   2373798830
+       .long   3750776420
+       .long   470396183
+       .long   3464308513
+       .long   1972265172
+       .long   2722264270
+       .long   452630365
+       .long   3206585544
+       .long   940792367
+       .long   2633649730
+       .long   3944530345
+       .long   1149561244
+       .long   905260731
+       .long   2118203793
+       .long   1881584735
+       .long   972332164
+       .long   3594093395
+       .long   2299122488
+       .long   1810521462
+       .long   4236407587
+       .long   3763169470
+       .long   1944664328
+       .long   2893219494
+       .long   303277681
+       .long   3621042925
+       .long   4177847879
+       .long   3231371645
+       .long   3889328657
+       .long   1491471692
+       .long   606555363
+       .long   2947118554
+       .long   4060728462
+       .long   2167775995
+       .long   3483690018
+       .long   2982943385
+       .long   1213110727
+       .long   1599269812
+       .long   3826489629
+       .long   40584695
+       .long   2672412741
+       .long   1670919475
+       .long   2426221454
+       .long   3198539624
+       .long   3358011962
+       .long   81169391
+       .long   1049858187
+       .long   3341838951
+       .long   557475612
+       .long   2102111953
+       .long   2421056629
+       .long   162338783
+       .long   2099716375
+       .long   2388710606
+       .long   1114951224
+       .long   4204223906
+       .long   547145963
+       .long   324677567
+       .long   4199432751
+       .long   482453916
+       .long   2229902448
+       .long   4113480516
+       .long   1094291926
+       .long   649355134
+       .long   4103898207
+       .long   964907833
+       .long   164837600
+       .long   3931993737
+       .long   2188583852
+       .long   1298710268
+       .long   3912829119
+       .long   1929815667
+       .long   329675200
+       .long   3569020178
+       .long   82200408
+       .long   2597420537
+       .long   3530690942
+       .long   3859631335
+       .long   659350401
+       .long   2843073060
+       .long   164400817
+       .long   899873778
+       .long   2766414588
+       .long   3424295375
+       .long   1318700802
+       .long   1391178824
+       .long   328801635
+       .long   1799747556
+       .long   1237861880
+       .long   2553623455
+       .long   2637401604
+       .long   2782357648
+       .long   657603271
+       .long   3599495112
+       .long   2475723761
+       .long   812279614
+       .long   979835913
+       .long   1269748001
+       .long   1315206542
+       .long   2904022928
+       .long   656480226
+       .long   1624559229
+       .long   1959671827
+       .long   2539496002
+       .long   2630413084
+       .long   1513078560
+       .long   1312960453
+       .long   3249118458
+       .long   3919343654
+       .long   784024708
+       .long   965858873
+       .long   3026157121
+       .long   2625920907
+       .long   2203269620
+       .long   3543720013
+       .long   1568049417
+       .long   1931717747
+       .long   1757346946
+       .long   956874519
+       .long   111571945
+       .long   2792472730
+       .long   3136098835
+       .long   3863435494
+       .long   3514693892
+       .long   1913749038
+       .long   223143890
+       .long   1289978165
+       .long   1977230375
+       .long   3431903692
+       .long   2734420489
+       .long   3827498077
+       .long   446287780
+       .long   2579956331
+       .long   3954460750
+       .long   2568840088
+       .long   1173873683
+       .long   3360028859
+       .long   892575561
+       .long   864945366
+       .long   3613954205
+       .long   842712880
+       .long   2347747367
+       .long   2425090423
+       .long   1785151123
+       .long   1729890733
+       .long   2932941114
+       .long   1685425760
+       .long   400527438
+       .long   555213551
+       .long   3570302247
+       .long   3459781466
+       .long   1570914932
+       .long   3370851521
+       .long   801054876
+       .long   1110427102
+       .long   2845637198
+       .long   2624595636
+       .long   3141829865
+       .long   2446735747
+       .long   1602109753
+       .long   2220854205
+       .long   1396307100
+       .long   954223976
+       .long   1988692435
+       .long   598504198
+       .long   3204219507
+       .long   146741115
+       .long   2792614201
+       .long   1908447953
+       .long   3977384870
+       .long   1197008397
+       .long   2113471718
+       .long   293482231
+       .long   1290261106
+       .long   3816895906
+       .long   3659802444
+       .long   2394016794
+       .long   4226943436
+       .long   586964463
+       .long   2580522212
+       .long   3338824517
+       .long   3024637593
+       .long   493066293
+       .long   4158919577
+       .long   1173928927
+       .long   866077128
+       .long   2382681739
+       .long   1754307891
+       .long   986132586
+       .long   4022871858
+       .long   2347857855
+       .long   1732154256
+       .long   470396183
+       .long   3508615783
+       .long   1972265172
+       .long   3750776420
+       .long   400748414
+       .long   3464308513
+       .long   940792367
+       .long   2722264270
+       .long   3944530345
+       .long   3206585544
+       .long   801496828
+       .long   2633649730
+       .long   1881584735
+       .long   1149561244
+       .long   3594093395
+       .long   2118203793
+       .long   1602993657
+       .long   972332164
+       .long   3763169470
+       .long   2299122488
+       .long   2893219494
+       .long   4236407587
+       .long   3205987314
+       .long   1944664328
+       .long   3231371645
+       .long   303277681
+       .long   1491471692
+       .long   4177847879
+       .long   2117007332
+       .long   3889328657
+       .long   2167775995
+       .long   606555363
+       .long   2982943385
+       .long   4060728462
+       .long   4234014665
+       .long   3483690018
+       .long   40584695
+       .long   1213110727
+       .long   1670919475
+       .long   3826489629
+       .long   4173062034
+       .long   2672412741
+       .long   81169391
+       .long   2426221454
+       .long   3341838951
+       .long   3358011962
+       .long   4051156773
+       .long   1049858187
+       .long   162338783
+       .long   557475612
+       .long   2388710606
+       .long   2421056629
+       .long   3807346250
+       .long   2099716375
+       .long   324677567
+       .long   1114951224
+       .long   482453916
+       .long   547145963
+       .long   3319725204
+       .long   4199432751
+       .long   649355134
+       .long   2229902448
+       .long   964907833
+       .long   1094291926
+       .long   2344483112
+       .long   4103898207
+       .long   1298710268
+       .long   164837600
+       .long   1929815667
+       .long   2188583852
+       .long   393998928
+       .long   3912829119
+       .long   2597420537
+       .long   329675200
+       .long   3859631335
+       .long   82200408
+       .long   787997856
+       .long   3530690942
+       .long   899873778
+       .long   659350401
+       .long   3424295375
+       .long   164400817
+       .long   1575995713
+       .long   2766414588
+       .long   1799747556
+       .long   1318700802
+       .long   2553623455
+       .long   328801635
+       .long   3151991427
+       .long   1237861880
+       .long   3599495112
+       .long   2637401604
+       .long   812279614
+       .long   657603271
+       .long   2009015559
+       .long   2475723761
+       .long   2904022928
+       .long   979835913
+       .long   1624559229
+       .long   1315206542
+       .long   4018031118
+       .long   656480226
+       .long   1513078560
+       .long   1959671827
+       .long   3249118458
+       .long   2630413084
+       .long   3741094941
+       .long   1312960453
+       .long   3026157121
+       .long   3919343654
+       .long   2203269620
+       .long   965858873
+       .long   3187222587
+       .long   2625920907
+       .long   1757346946
+       .long   3543720013
+       .long   111571945
+       .long   1931717747
+       .long   2079477878
+       .long   956874519
+       .long   3514693892
+       .long   2792472730
+       .long   223143890
+       .long   3863435494
+       .long   4158955756
+       .long   1913749038
+       .long   2734420489
+       .long   1289978165
+       .long   446287780
+       .long   3431903692
+       .long   4022944216
+       .long   3827498077
+       .long   1173873683
+       .long   2579956331
+       .long   892575561
+       .long   2568840088
+       .long   3750921137
+       .long   3360028859
+       .long   2347747367
+       .long   864945366
+       .long   1785151123
+       .long   842712880
+       .long   3206874979
+       .long   2425090423
+       .long   400527438
+       .long   1729890733
+       .long   3570302247
+       .long   1685425760
+       .long   2118782663
+       .long   555213551
+       .long   801054876
+       .long   3459781466
+       .long   2845637198
+       .long   3370851521
+       .long   4237565327
+       .long   1110427102
+       .long   1602109753
+       .long   2624595636
+       .long   1396307100
+       .long   2446735747
+       .long   4180163359
+       .long   2220854205
+       .long   3204219507
+       .long   954223976
+       .long   2792614201
+       .long   598504198
+       .long   4065359423
+       .long   146741115
+       .long   2113471718
+       .long   1908447953
+       .long   1290261106
+       .long   1197008397
+       .long   3835751551
+       .long   293482231
+       .long   4226943436
+       .long   3816895906
+       .long   2580522212
+       .long   2394016794
+       .long   3376535807
+       .long   586964463
+       .long   4158919577
+       .long   3338824517
+       .long   866077128
+       .long   493066293
+       .long   2458104319
+       .long   1173928927
+       .long   4022871858
+       .long   2382681739
+       .long   1732154256
+       .long   986132586
+       .long   621241343
+       .long   2347857855
+       .long   3750776420
+       .long   470396183
+       .long   3464308513
+       .long   1972265172
+       .long   1242482686
+       .long   400748414
+       .long   3206585544
+       .long   940792367
+       .long   2633649730
+       .long   3944530345
+       .long   2484965372
+       .long   801496828
+       .long   2118203793
+       .long   1881584735
+       .long   972332164
+       .long   3594093395
+       .long   674963448
+       .long   1602993657
+       .long   4236407587
+       .long   3763169470
+       .long   1944664328
+       .long   2893219494
+       .long   1349926897
+       .long   3205987314
+       .long   4177847879
+       .long   3231371645
+       .long   3889328657
+       .long   1491471692
+       .long   2699853794
+       .long   2117007332
+       .long   4060728462
+       .long   2167775995
+       .long   3483690018
+       .long   2982943385
+       .long   1104740292
+       .long   4234014665
+       .long   3826489629
+       .long   40584695
+       .long   2672412741
+       .long   1670919475
+       .long   2209480585
+       .long   4173062034
+       .long   3358011962
+       .long   81169391
+       .long   1049858187
+       .long   3341838951
+       .long   123993874
+       .long   4051156773
+       .long   2421056629
+       .long   162338783
+       .long   2099716375
+       .long   2388710606
+       .long   247987749
+       .long   3807346250
+       .long   547145963
+       .long   324677567
+       .long   4199432751
+       .long   482453916
+       .long   495975499
+       .long   3319725204
+       .long   1094291926
+       .long   649355134
+       .long   4103898207
+       .long   964907833
+       .long   991950999
+       .long   2344483112
+       .long   2188583852
+       .long   1298710268
+       .long   3912829119
+       .long   1929815667
+       .long   1983901999
+       .long   393998928
+       .long   82200408
+       .long   2597420537
+       .long   3530690942
+       .long   3859631335
+       .long   3967803999
+       .long   787997856
+       .long   164400817
+       .long   899873778
+       .long   2766414588
+       .long   3424295375
+       .long   3640640703
+       .long   1575995713
+       .long   328801635
+       .long   1799747556
+       .long   1237861880
+       .long   2553623455
+       .long   2986314111
+       .long   3151991427
+       .long   657603271
+       .long   3599495112
+       .long   2475723761
+       .long   812279614
+       .long   1677660927
+       .long   2009015559
+       .long   1315206542
+       .long   2904022928
+       .long   656480226
+       .long   1624559229
+       .long   3355321855
+       .long   4018031118
+       .long   2630413084
+       .long   1513078560
+       .long   1312960453
+       .long   3249118458
+       .long   2415676415
+       .long   3741094941
+       .long   965858873
+       .long   3026157121
+       .long   2625920907
+       .long   2203269620
+       .long   536385535
+       .long   3187222587
+       .long   1931717747
+       .long   1757346946
+       .long   956874519
+       .long   111571945
+       .long   1072771071
+       .long   2079477878
+       .long   3863435494
+       .long   3514693892
+       .long   1913749038
+       .long   223143890
+       .long   2145542143
+       .long   4158955756
+       .long   3431903692
+       .long   2734420489
+       .long   3827498077
+       .long   446287780
+       .long   4291084286
+       .long   4022944216
+       .long   2568840088
+       .long   1173873683
+       .long   3360028859
+       .long   892575561
+       .long   4287201277
+       .long   3750921137
+       .long   842712880
+       .long   2347747367
+       .long   2425090423
+       .long   1785151123
+       .long   4279435259
+       .long   3206874979
+       .long   1685425760
+       .long   400527438
+       .long   555213551
+       .long   3570302247
+       .long   4263903223
+       .long   2118782663
+       .long   3370851521
+       .long   801054876
+       .long   1110427102
+       .long   2845637198
+       .long   4232839151
+       .long   4237565327
+       .long   2446735747
+       .long   1602109753
+       .long   2220854205
+       .long   1396307100
+       .long   4170711006
+       .long   4180163359
+       .long   598504198
+       .long   3204219507
+       .long   146741115
+       .long   2792614201
+       .long   4046454716
+       .long   4065359423
+       .long   1197008397
+       .long   2113471718
+       .long   293482231
+       .long   1290261106
+       .long   3797942136
+       .long   3835751551
+       .long   2394016794
+       .long   4226943436
+       .long   586964463
+       .long   2580522212
+       .long   3300916976
+       .long   3376535807
+       .long   493066293
+       .long   4158919577
+       .long   1173928927
+       .long   866077128
+       .long   2306866656
+       .long   2458104319
+       .long   986132586
+       .long   4022871858
+       .long   2347857855
+       .long   1732154256
+       .long   318766016
+       .long   621241343
+       .long   1972265172
+       .long   3750776420
+       .long   400748414
+       .long   3464308513
+       .long   637532033
+       .long   1242482686
+       .long   3944530345
+       .long   3206585544
+       .long   801496828
+       .long   2633649730
+       .long   1275064066
+       .long   2484965372
+       .long   3594093395
+       .long   2118203793
+       .long   1602993657
+       .long   972332164
+       .long   2550128133
+       .long   674963448
+       .long   2893219494
+       .long   4236407587
+       .long   3205987314
+       .long   1944664328
+       .long   805288971
+       .long   1349926897
+       .long   1491471692
+       .long   4177847879
+       .long   2117007332
+       .long   3889328657
+       .long   1610577942
+       .long   2699853794
+       .long   2982943385
+       .long   4060728462
+       .long   4234014665
+       .long   3483690018
+       .long   3221155884
+       .long   1104740292
+       .long   1670919475
+       .long   3826489629
+       .long   4173062034
+       .long   2672412741
+       .long   2147344473
+       .long   2209480585
+       .long   3341838951
+       .long   3358011962
+       .long   4051156773
+       .long   1049858187
+       .long   4294688947
+       .long   123993874
+       .long   2388710606
+       .long   2421056629
+       .long   3807346250
+       .long   2099716375
+       .long   4294410598
+       .long   247987749
+       .long   482453916
+       .long   547145963
+       .long   3319725204
+       .long   4199432751
+       .long   4293853900
+       .long   495975499
+       .long   964907833
+       .long   1094291926
+       .long   2344483112
+       .long   4103898207
+       .long   4292740504
+       .long   991950999
+       .long   1929815667
+       .long   2188583852
+       .long   393998928
+       .long   3912829119
+       .long   4290513712
+       .long   1983901999
+       .long   3859631335
+       .long   82200408
+       .long   787997856
+       .long   3530690942
+       .long   4286060128
+       .long   3967803999
+       .long   3424295375
+       .long   164400817
+       .long   1575995713
+       .long   2766414588
+       .long   4277152960
+       .long   3640640703
+       .long   2553623455
+       .long   328801635
+       .long   3151991427
+       .long   1237861880
+       .long   4259338624
+       .long   2986314111
+       .long   812279614
+       .long   657603271
+       .long   2009015559
+       .long   2475723761
+       .long   4223709953
+       .long   1677660927
+       .long   1624559229
+       .long   1315206542
+       .long   4018031118
+       .long   656480226
+       .long   4152452611
+       .long   3355321855
+       .long   3249118458
+       .long   2630413084
+       .long   3741094941
+       .long   1312960453
+       .long   4009937927
+       .long   2415676415
+       .long   2203269620
+       .long   965858873
+       .long   3187222587
+       .long   2625920907
+       .long   3724908559
+       .long   536385535
+       .long   111571945
+       .long   1931717747
+       .long   2079477878
+       .long   956874519
+       .long   3154849823
+       .long   1072771071
+       .long   223143890
+       .long   3863435494
+       .long   4158955756
+       .long   1913749038
+       .long   2014732351
+       .long   2145542143
+       .long   446287780
+       .long   3431903692
+       .long   4022944216
+       .long   3827498077
+       .long   4029464703
+       .long   4291084286
+       .long   892575561
+       .long   2568840088
+       .long   3750921137
+       .long   3360028859
+       .long   3763962110
+       .long   4287201277
+       .long   1785151123
+       .long   842712880
+       .long   3206874979
+       .long   2425090423
+       .long   3232956925
+       .long   4279435259
+       .long   3570302247
+       .long   1685425760
+       .long   2118782663
+       .long   555213551
+       .long   2170946555
+       .long   4263903223
+       .long   2845637198
+       .long   3370851521
+       .long   4237565327
+       .long   1110427102
+       .long   46925815
+       .long   4232839151
+       .long   1396307100
+       .long   2446735747
+       .long   4180163359
+       .long   2220854205
+       .long   93851631
+       .long   4170711006
+       .long   2792614201
+       .long   598504198
+       .long   4065359423
+       .long   146741115
+       .long   187703262
+       .long   4046454716
+       .long   1290261106
+       .long   1197008397
+       .long   3835751551
+       .long   293482231
+       .long   375406524
+       .long   3797942136
+       .long   2580522212
+       .long   2394016794
+       .long   3376535807
+       .long   586964463
+       .long   750813049
+       .long   3300916976
+       .long   866077128
+       .long   493066293
+       .long   2458104319
+       .long   1173928927
+       .long   1501626098
+       .long   2306866656
+       .long   1732154256
+       .long   986132586
+       .long   621241343
+       .long   2347857855
+       .long   3003252197
+       .long   318766016
+       .long   3464308513
+       .long   1972265172
+       .long   1242482686
+       .long   400748414
+       .long   1711537099
+       .long   637532033
+       .long   2633649730
+       .long   3944530345
+       .long   2484965372
+       .long   801496828
+       .long   3423074199
+       .long   1275064066
+       .long   972332164
+       .long   3594093395
+       .long   674963448
+       .long   1602993657
+       .long   2551181103
+       .long   2550128133
+       .long   1944664328
+       .long   2893219494
+       .long   1349926897
+       .long   3205987314
+       .long   807394910
+       .long   805288971
+       .long   3889328657
+       .long   1491471692
+       .long   2699853794
+       .long   2117007332
+       .long   1614789820
+       .long   1610577942
+       .long   3483690018
+       .long   2982943385
+       .long   1104740292
+       .long   4234014665
+       .long   3229579640
+       .long   3221155884
+       .long   2672412741
+       .long   1670919475
+       .long   2209480585
+       .long   4173062034
+       .long   2164191985
+       .long   2147344473
+       .long   1049858187
+       .long   3341838951
+       .long   123993874
+       .long   4051156773
+       .long   33416674
+       .long   4294688947
+       .long   2099716375
+       .long   2388710606
+       .long   247987749
+       .long   3807346250
+       .long   66833348
+       .long   4294410598
+       .long   4199432751
+       .long   482453916
+       .long   495975499
+       .long   3319725204
+       .long   133666696
+       .long   4293853900
+       .long   4103898207
+       .long   964907833
+       .long   991950999
+       .long   2344483112
+       .long   267333393
+       .long   4292740504
+       .long   3912829119
+       .long   1929815667
+       .long   1983901999
+       .long   393998928
+       .long   534666787
+       .long   4290513712
+       .long   3530690942
+       .long   3859631335
+       .long   3967803999
+       .long   787997856
+       .long   1069333574
+       .long   4286060128
+       .long   2766414588
+       .long   3424295375
+       .long   3640640703
+       .long   1575995713
+       .long   2138667148
+       .long   4277152960
+       .long   1237861880
+       .long   2553623455
+       .long   2986314111
+       .long   3151991427
+       .long   4277334296
+       .long   4259338624
+       .long   2475723761
+       .long   812279614
+       .long   1677660927
+       .long   2009015559
+       .long   4259701297
+       .long   4223709953
+       .long   656480226
+       .long   1624559229
+       .long   3355321855
+       .long   4018031118
+       .long   4224435298
+       .long   4152452611
+       .long   1312960453
+       .long   3249118458
+       .long   2415676415
+       .long   3741094941
+       .long   4153903301
+       .long   4009937927
+       .long   2625920907
+       .long   2203269620
+       .long   536385535
+       .long   3187222587
+       .long   4012839307
+       .long   3724908559
+       .long   956874519
+       .long   111571945
+       .long   1072771071
+       .long   2079477878
+       .long   3730711318
+       .long   3154849823
+       .long   1913749038
+       .long   223143890
+       .long   2145542143
+       .long   4158955756
+       .long   3166455341
+       .long   2014732351
+       .long   3827498077
+       .long   446287780
+       .long   4291084286
+       .long   4022944216
+       .long   2037943386
+       .long   4029464703
+       .long   3360028859
+       .long   892575561
+       .long   4287201277
+       .long   3750921137
+       .long   4075886773
+       .long   3763962110
+       .long   2425090423
+       .long   1785151123
+       .long   4279435259
+       .long   3206874979
+       .long   3856806251
+       .long   3232956925
+       .long   555213551
+       .long   3570302247
+       .long   4263903223
+       .long   2118782663
+       .long   3418645206
+       .long   2170946555
+       .long   1110427102
+       .long   2845637198
+       .long   4232839151
+       .long   4237565327
+       .long   2542323117
+       .long   46925815
+       .long   2220854205
+       .long   1396307100
+       .long   4170711006
+       .long   4180163359
+       .long   789678938
+       .long   93851631
+       .long   146741115
+       .long   2792614201
+       .long   4046454716
+       .long   4065359423
+       .long   1579357876
+       .long   187703262
+       .long   293482231
+       .long   1290261106
+       .long   3797942136
+       .long   3835751551
+       .long   3158715752
+       .long   375406524
+       .long   586964463
+       .long   2580522212
+       .long   3300916976
+       .long   3376535807
+       .long   2022464208
+       .long   750813049
+       .long   1173928927
+       .long   866077128
+       .long   2306866656
+       .long   2458104319
+       .long   4044928416
+       .long   1501626098
+       .long   2347857855
+       .long   1732154256
+       .long   318766016
+       .long   621241343
+       .long   3794889537
+       .long   3003252197
+       .long   400748414
+       .long   3464308513
+       .long   637532033
+       .long   1242482686
+       .long   3294811778
+       .long   1711537099
+       .long   801496828
+       .long   2633649730
+       .long   1275064066
+       .long   2484965372
+       .long   2294656261
+       .long   3423074199
+       .long   1602993657
+       .long   972332164
+       .long   2550128133
+       .long   674963448
+       .long   294345226
+       .long   2551181103
+       .long   3205987314
+       .long   1944664328
+       .long   805288971
+       .long   1349926897
+       .long   588690452
+       .long   807394910
+       .long   2117007332
+       .long   3889328657
+       .long   1610577942
+       .long   2699853794
+       .long   1177380905
+       .long   1614789820
+       .long   4234014665
+       .long   3483690018
+       .long   3221155884
+       .long   1104740292
+       .long   2354761811
+       .long   3229579640
+       .long   4173062034
+       .long   2672412741
+       .long   2147344473
+       .long   2209480585
+       .long   414556326
+       .long   2164191985
+       .long   4051156773
+       .long   1049858187
+       .long   4294688947
+       .long   123993874
+       .long   829112653
+       .long   33416674
+       .long   3807346250
+       .long   2099716375
+       .long   4294410598
+       .long   247987749
+       .long   1658225307
+       .long   66833348
+       .long   3319725204
+       .long   4199432751
+       .long   4293853900
+       .long   495975499
+       .long   3316450614
+       .long   133666696
+       .long   2344483112
+       .long   4103898207
+       .long   4292740504
+       .long   991950999
+       .long   2337933933
+       .long   267333393
+       .long   393998928
+       .long   3912829119
+       .long   4290513712
+       .long   1983901999
+       .long   380900570
+       .long   534666787
+       .long   787997856
+       .long   3530690942
+       .long   4286060128
+       .long   3967803999
+       .long   761801140
+       .long   1069333574
+       .long   1575995713
+       .long   2766414588
+       .long   4277152960
+       .long   3640640703
+       .long   1523602280
+       .long   2138667148
+       .long   3151991427
+       .long   1237861880
+       .long   4259338624
+       .long   2986314111
+       .long   3047204561
+       .long   4277334296
+       .long   2009015559
+       .long   2475723761
+       .long   4223709953
+       .long   1677660927
+       .long   1799441827
+       .long   4259701297
+       .long   4018031118
+       .long   656480226
+       .long   4152452611
+       .long   3355321855
+       .long   3598883655
+       .long   4224435298
+       .long   3741094941
+       .long   1312960453
+       .long   4009937927
+       .long   2415676415
+       .long   2902800015
+       .long   4153903301
+       .long   3187222587
+       .long   2625920907
+       .long   3724908559
+       .long   536385535
+       .long   1510632735
+       .long   4012839307
+       .long   2079477878
+       .long   956874519
+       .long   3154849823
+       .long   1072771071
+       .long   3021265470
+       .long   3730711318
+       .long   4158955756
+       .long   1913749038
+       .long   2014732351
+       .long   2145542143
+       .long   1747563645
+       .long   3166455341
+       .long   4022944216
+       .long   3827498077
+       .long   4029464703
+       .long   4291084286
+       .long   3495127291
+       .long   2037943386
+       .long   3750921137
+       .long   3360028859
+       .long   3763962110
+       .long   4287201277
+       .long   2695287286
+       .long   4075886773
+       .long   3206874979
+       .long   2425090423
+       .long   3232956925
+       .long   4279435259
+       .long   1095607277
+       .long   3856806251
+       .long   2118782663
+       .long   555213551
+       .long   2170946555
+       .long   4263903223
+       .long   2191214555
+       .long   3418645206
+       .long   4237565327
+       .long   1110427102
+       .long   46925815
+       .long   4232839151
+       .long   87461814
+       .long   2542323117
+       .long   4180163359
+       .long   2220854205
+       .long   93851631
+       .long   4170711006
+       .long   174923629
+       .long   789678938
+       .long   4065359423
+       .long   146741115
+       .long   187703262
+       .long   4046454716
+       .long   349847258
+       .long   1579357876
+       .long   3835751551
+       .long   293482231
+       .long   375406524
+       .long   3797942136
+       .long   699694516
+       .long   3158715752
+       .long   3376535807
+       .long   586964463
+       .long   750813049
+       .long   3300916976
+       .long   1399389033
+       .long   2022464208
+       .long   2458104319
+       .long   1173928927
+       .long   1501626098
+       .long   2306866656
+       .long   2798778067
+       .long   4044928416
+       .long   621241343
+       .long   2347857855
+       .long   3003252197
+       .long   318766016
+       .long   1302588838
+       .long   3794889537
+       .long   1242482686
+       .long   400748414
+       .long   1711537099
+       .long   637532033
+       .long   2605177677
+       .long   3294811778
+       .long   2484965372
+       .long   801496828
+       .long   3423074199
+       .long   1275064066
+       .long   915388059
+       .long   2294656261
+       .long   674963448
+       .long   1602993657
+       .long   2551181103
+       .long   2550128133
+       .long   1830776118
+       .long   294345226
+       .long   1349926897
+       .long   3205987314
+       .long   807394910
+       .long   805288971
+       .long   3661552236
+       .long   588690452
+       .long   2699853794
+       .long   2117007332
+       .long   1614789820
+       .long   1610577942
+       .long   3028137177
+       .long   1177380905
+       .long   1104740292
+       .long   4234014665
+       .long   3229579640
+       .long   3221155884
+       .long   1761307059
+       .long   2354761811
+       .long   2209480585
+       .long   4173062034
+       .long   2164191985
+       .long   2147344473
+       .long   3522614119
+       .long   414556326
+       .long   123993874
+       .long   4051156773
+       .long   33416674
+       .long   4294688947
+       .long   2750260943
+       .long   829112653
+       .long   247987749
+       .long   3807346250
+       .long   66833348
+       .long   4294410598
+       .long   1205554591
+       .long   1658225307
+       .long   495975499
+       .long   3319725204
+       .long   133666696
+       .long   4293853900
+       .long   2411109183
+       .long   3316450614
+       .long   991950999
+       .long   2344483112
+       .long   267333393
+       .long   4292740504
+       .long   527251070
+       .long   2337933933
+       .long   1983901999
+       .long   393998928
+       .long   534666787
+       .long   4290513712
+       .long   1054502141
+       .long   380900570
+       .long   3967803999
+       .long   787997856
+       .long   1069333574
+       .long   4286060128
+       .long   2109004283
+       .long   761801140
+       .long   3640640703
+       .long   1575995713
+       .long   2138667148
+       .long   4277152960
+       .long   4218008566
+       .long   1523602280
+       .long   2986314111
+       .long   3151991427
+       .long   4277334296
+       .long   4259338624
+       .long   4141049836
+       .long   3047204561
+       .long   1677660927
+       .long   2009015559
+       .long   4259701297
+       .long   4223709953
+       .long   3987132377
+       .long   1799441827
+       .long   3355321855
+       .long   4018031118
+       .long   4224435298
+       .long   4152452611
+       .long   3679297459
+       .long   3598883655
+       .long   2415676415
+       .long   3741094941
+       .long   4153903301
+       .long   4009937927
+       .long   3063627623
+       .long   2902800015
+       .long   536385535
+       .long   3187222587
+       .long   4012839307
+       .long   3724908559
+       .long   1832287951
+       .long   1510632735
+       .long   1072771071
+       .long   2079477878
+       .long   3730711318
+       .long   3154849823
+       .long   3664575902
+       .long   3021265470
+       .long   2145542143
+       .long   4158955756
+       .long   3166455341
+       .long   2014732351
+       .long   3034184508
+       .long   1747563645
+       .long   4291084286
+       .long   4022944216
+       .long   2037943386
+       .long   4029464703
+       .long   1773401721
+       .long   3495127291
+       .long   4287201277
+       .long   3750921137
+       .long   4075886773
+       .long   3763962110
+       .long   3546803442
+       .long   2695287286
+       .long   4279435259
+       .long   3206874979
+       .long   3856806251
+       .long   3232956925
+       .long   2798639588
+       .long   1095607277
+       .long   4263903223
+       .long   2118782663
+       .long   3418645206
+       .long   2170946555
+       .long   1302311881
+       .long   2191214555
+       .long   4232839151
+       .long   4237565327
+       .long   2542323117
+       .long   46925815
+       .long   2604623763
+       .long   87461814
+       .long   4170711006
+       .long   4180163359
+       .long   789678938
+       .long   93851631
+       .long   914280231
+       .long   174923629
+       .long   4046454716
+       .long   4065359423
+       .long   1579357876
+       .long   187703262
+       .long   1828560463
+       .long   349847258
+       .long   3797942136
+       .long   3835751551
+       .long   3158715752
+       .long   375406524
+       .long   3657120927
+       .long   699694516
+       .long   3300916976
+       .long   3376535807
+       .long   2022464208
+       .long   750813049
+       .long   3019274558
+       .long   1399389033
+       .long   2306866656
+       .long   2458104319
+       .long   4044928416
+       .long   1501626098
+       .long   1743581820
+       .long   2798778067
+       .long   318766016
+       .long   621241343
+       .long   3794889537
+       .long   3003252197
+       .long   3487163641
+       .long   1302588838
+       .long   637532033
+       .long   1242482686
+       .long   3294811778
+       .long   1711537099
+       .long   2679359986
+       .long   2605177677
+       .long   1275064066
+       .long   2484965372
+       .long   2294656261
+       .long   3423074199
+       .long   1063752677
+       .long   915388059
+       .long   2550128133
+       .long   674963448
+       .long   294345226
+       .long   2551181103
+       .long   2127505355
+       .long   1830776118
+       .long   805288971
+       .long   1349926897
+       .long   588690452
+       .long   807394910
+       .long   4255010710
+       .long   3661552236
+       .long   1610577942
+       .long   2699853794
+       .long   1177380905
+       .long   1614789820
+       .long   4215054124
+       .long   3028137177
+       .long   3221155884
+       .long   1104740292
+       .long   2354761811
+       .long   3229579640
+       .long   4135140952
+       .long   1761307059
+       .long   2147344473
+       .long   2209480585
+       .long   414556326
+       .long   2164191985
+       .long   3975314608
+       .long   3522614119
+       .long   4294688947
+       .long   123993874
+       .long   829112653
+       .long   33416674
+       .long   3655661921
+       .long   2750260943
+       .long   4294410598
+       .long   247987749
+       .long   1658225307
+       .long   66833348
+       .long   3016356546
+       .long   1205554591
+       .long   4293853900
+       .long   495975499
+       .long   3316450614
+       .long   133666696
+       .long   1737745796
+       .long   2411109183
+       .long   4292740504
+       .long   991950999
+       .long   2337933933
+       .long   267333393
+       .long   3475491593
+       .long   527251070
+       .long   4290513712
+       .long   1983901999
+       .long   380900570
+       .long   534666787
+       .long   2656015891
+       .long   1054502141
+       .long   4286060128
+       .long   3967803999
+       .long   761801140
+       .long   1069333574
+       .long   1017064486
+       .long   2109004283
+       .long   4277152960
+       .long   3640640703
+       .long   1523602280
+       .long   2138667148
+       .long   2034128973
+       .long   4218008566
+       .long   4259338624
+       .long   2986314111
+       .long   3047204561
+       .long   4277334296
+       .long   4068257947
+       .long   4141049836
+       .long   4223709953
+       .long   1677660927
+       .long   1799441827
+       .long   4259701297
+       .long   3841548598
+       .long   3987132377
+       .long   4152452611
+       .long   3355321855
+       .long   3598883655
+       .long   4224435298
+       .long   3388129901
+       .long   3679297459
+       .long   4009937927
+       .long   2415676415
+       .long   2902800015
+       .long   4153903301
+       .long   2481292507
+       .long   3063627623
+       .long   3724908559
+       .long   536385535
+       .long   1510632735
+       .long   4012839307
+       .long   667617719
+       .long   1832287951
+       .long   3154849823
+       .long   1072771071
+       .long   3021265470
+       .long   3730711318
+       .long   1335235438
+       .long   3664575902
+       .long   2014732351
+       .long   2145542143
+       .long   1747563645
+       .long   3166455341
+       .long   2670470877
+       .long   3034184508
+       .long   4029464703
+       .long   4291084286
+       .long   3495127291
+       .long   2037943386
+       .long   1045974458
+       .long   1773401721
+       .long   3763962110
+       .long   4287201277
+       .long   2695287286
+       .long   4075886773
+       .long   2091948916
+       .long   3546803442
+       .long   3232956925
+       .long   4279435259
+       .long   1095607277
+       .long   3856806251
+       .long   4183897833
+       .long   2798639588
+       .long   2170946555
+       .long   4263903223
+       .long   2191214555
+       .long   3418645206
+       .long   4072828371
+       .long   1302311881
+       .long   46925815
+       .long   4232839151
+       .long   87461814
+       .long   2542323117
+       .long   3850689447
+       .long   2604623763
+       .long   93851631
+       .long   4170711006
+       .long   174923629
+       .long   789678938
+       .long   3406411599
+       .long   914280231
+       .long   187703262
+       .long   4046454716
+       .long   349847258
+       .long   1579357876
+       .long   2517855902
+       .long   1828560463
+       .long   375406524
+       .long   3797942136
+       .long   699694516
+       .long   3158715752
+       .long   740744509
+       .long   3657120927
+       .long   750813049
+       .long   3300916976
+       .long   1399389033
+       .long   2022464208
+       .long   1481489018
+       .long   3019274558
+       .long   1501626098
+       .long   2306866656
+       .long   2798778067
+       .long   4044928416
+       .long   2962978036
+       .long   1743581820
+       .long   3003252197
+       .long   318766016
+       .long   1302588838
+       .long   3794889537
+       .long   1630988776
+       .long   3487163641
+       .long   1711537099
+       .long   637532033
+       .long   2605177677
+       .long   3294811778
+       .long   3261977553
+       .long   2679359986
+       .long   3423074199
+       .long   1275064066
+       .long   915388059
+       .long   2294656261
+       .long   2228987811
+       .long   1063752677
+       .long   2551181103
+       .long   2550128133
+       .long   1830776118
+       .long   294345226
+       .long   163008326
+       .long   2127505355
+       .long   807394910
+       .long   805288971
+       .long   3661552236
+       .long   588690452
+       .long   326016652
+       .long   4255010710
+       .long   1614789820
+       .long   1610577942
+       .long   3028137177
+       .long   1177380905
+       .long   652033304
+       .long   4215054124
+       .long   3229579640
+       .long   3221155884
+       .long   1761307059
+       .long   2354761811
+       .long   1304066609
+       .long   4135140952
+       .long   2164191985
+       .long   2147344473
+       .long   3522614119
+       .long   414556326
+       .long   2608133219
+       .long   3975314608
+       .long   33416674
+       .long   4294688947
+       .long   2750260943
+       .long   829112653
+       .long   921299143
+       .long   3655661921
+       .long   66833348
+       .long   4294410598
+       .long   1205554591
+       .long   1658225307
+       .long   1842598287
+       .long   3016356546
+       .long   133666696
+       .long   4293853900
+       .long   2411109183
+       .long   3316450614
+       .long   3685196575
+       .long   1737745796
+       .long   267333393
+       .long   4292740504
+       .long   527251070
+       .long   2337933933
+       .long   3075425855
+       .long   3475491593
+       .long   534666787
+       .long   4290513712
+       .long   1054502141
+       .long   380900570
+       .long   1855884414
+       .long   2656015891
+       .long   1069333574
+       .long   4286060128
+       .long   2109004283
+       .long   761801140
+       .long   3711768829
+       .long   1017064486
+       .long   2138667148
+       .long   4277152960
+       .long   4218008566
+       .long   1523602280
+       .long   3128570363
+       .long   2034128973
+       .long   4277334296
+       .long   4259338624
+       .long   4141049836
+       .long   3047204561
+       .long   1962173430
+       .long   4068257947
+       .long   4259701297
+       .long   4223709953
+       .long   3987132377
+       .long   1799441827
+       .long   3924346860
+       .long   3841548598
+       .long   4224435298
+       .long   4152452611
+       .long   3679297459
+       .long   3598883655
+       .long   3553726425
+       .long   3388129901
+       .long   4153903301
+       .long   4009937927
+       .long   3063627623
+       .long   2902800015
+       .long   2812485555
+       .long   2481292507
+       .long   4012839307
+       .long   3724908559
+       .long   1832287951
+       .long   1510632735
+       .long   1330003814
+       .long   667617719
+       .long   3730711318
+       .long   3154849823
+       .long   3664575902
+       .long   3021265470
+       .long   2660007629
+       .long   1335235438
+       .long   3166455341
+       .long   2014732351
+       .long   3034184508
+       .long   1747563645
+       .long   1025047962
+       .long   2670470877
+       .long   2037943386
+       .long   4029464703
+       .long   1773401721
+       .long   3495127291
+       .long   2050095924
+       .long   1045974458
+       .long   4075886773
+       .long   3763962110
+       .long   3546803442
+       .long   2695287286
+       .long   4100191849
+       .long   2091948916
+       .long   3856806251
+       .long   3232956925
+       .long   2798639588
+       .long   1095607277
+       .long   3905416403
+       .long   4183897833
+       .long   3418645206
+       .long   2170946555
+       .long   1302311881
+       .long   2191214555
+       .long   3515865511
+       .long   4072828371
+       .long   2542323117
+       .long   46925815
+       .long   2604623763
+       .long   87461814
+       .long   2736763727
+       .long   3850689447
+       .long   789678938
+       .long   93851631
+       .long   914280231
+       .long   174923629
+       .long   1178560158
+       .long   3406411599
+       .long   1579357876
+       .long   187703262
+       .long   1828560463
+       .long   349847258
+       .long   2357120316
+       .long   2517855902
+       .long   3158715752
+       .long   375406524
+       .long   3657120927
+       .long   699694516
+       .long   419273337
+       .long   740744509
+       .long   2022464208
+       .long   750813049
+       .long   3019274558
+       .long   1399389033
+       .long   838546674
+       .long   1481489018
+       .long   4044928416
+       .long   1501626098
+       .long   1743581820
+       .long   2798778067
+       .long   1677093349
+       .long   2962978036
+       .long   3794889537
+       .long   3003252197
+       .long   3487163641
+       .long   1302588838
+       .long   3354186699
+       .long   1630988776
+       .long   3294811778
+       .long   1711537099
+       .long   2679359986
+       .long   2605177677
+       .long   2413406103
+       .long   3261977553
+       .long   2294656261
+       .long   3423074199
+       .long   1063752677
+       .long   915388059
+       .long   531844911
+       .long   2228987811
+       .long   294345226
+       .long   2551181103
+       .long   2127505355
+       .long   1830776118
+       .long   1063689823
+       .long   163008326
+       .long   588690452
+       .long   807394910
+       .long   4255010710
+       .long   3661552236
+       .long   2127379647
+       .long   326016652
+       .long   1177380905
+       .long   1614789820
+       .long   4215054124
+       .long   3028137177
+       .long   4254759295
+       .long   652033304
+       .long   2354761811
+       .long   3229579640
+       .long   4135140952
+       .long   1761307059
+       .long   4214551295
+       .long   1304066609
+       .long   414556326
+       .long   2164191985
+       .long   3975314608
+       .long   3522614119
+       .long   4134135294
+       .long   2608133219
+       .long   829112653
+       .long   33416674
+       .long   3655661921
+       .long   2750260943
+       .long   3973303293
+       .long   921299143
+       .long   1658225307
+       .long   66833348
+       .long   3016356546
+       .long   1205554591
+       .long   3651639290
+       .long   1842598287
+       .long   3316450614
+       .long   133666696
+       .long   1737745796
+       .long   2411109183
+       .long   3008311285
+       .long   3685196575
+       .long   2337933933
+       .long   267333393
+       .long   3475491593
+       .long   527251070
+       .long   1721655274
+       .long   3075425855
+       .long   380900570
+       .long   534666787
+       .long   2656015891
+       .long   1054502141
+       .long   3443310548
+       .long   1855884414
+       .long   761801140
+       .long   1069333574
+       .long   1017064486
+       .long   2109004283
+       .long   2591653800
+       .long   3711768829
+       .long   1523602280
+       .long   2138667148
+       .long   2034128973
+       .long   4218008566
+       .long   888340305
+       .long   3128570363
+       .long   3047204561
+       .long   4277334296
+       .long   4068257947
+       .long   4141049836
+       .long   1776680610
+       .long   1962173430
+       .long   1799441827
+       .long   4259701297
+       .long   3841548598
+       .long   3987132377
+       .long   3553361221
+       .long   3924346860
+       .long   3598883655
+       .long   4224435298
+       .long   3388129901
+       .long   3679297459
+       .long   2811755147
+       .long   3553726425
+       .long   2902800015
+       .long   4153903301
+       .long   2481292507
+       .long   3063627623
+       .long   1328542998
+       .long   2812485555
+       .long   1510632735
+       .long   4012839307
+       .long   667617719
+       .long   1832287951
+       .long   2657085997
+       .long   1330003814
+       .long   3021265470
+       .long   3730711318
+       .long   1335235438
+       .long   3664575902
+       .long   1019204698
+       .long   2660007629
+       .long   1747563645
+       .long   3166455341
+       .long   2670470877
+       .long   3034184508
+       .long   2038409397
+       .long   1025047962
+       .long   3495127291
+       .long   2037943386
+       .long   1045974458
+       .long   1773401721
+       .long   4076818795
+       .long   2050095924
+       .long   2695287286
+       .long   4075886773
+       .long   2091948916
+       .long   3546803442
+       .long   3858670295
+       .long   4100191849
+       .long   1095607277
+       .long   3856806251
+       .long   4183897833
+       .long   2798639588
+       .long   3422373294
+       .long   3905416403
+       .long   2191214555
+       .long   3418645206
+       .long   4072828371
+       .long   1302311881
+       .long   2549779293
+       .long   3515865511
+       .long   87461814
+       .long   2542323117
+       .long   3850689447
+       .long   2604623763
+       .long   804591290
+       .long   2736763727
+       .long   174923629
+       .long   789678938
+       .long   3406411599
+       .long   914280231
+       .long   1609182581
+       .long   1178560158
+       .long   349847258
+       .long   1579357876
+       .long   2517855902
+       .long   1828560463
+       .long   3218365162
+       .long   2357120316
+       .long   699694516
+       .long   3158715752
+       .long   740744509
+       .long   3657120927
+       .long   2141763028
+       .long   419273337
+       .long   1399389033
+       .long   2022464208
+       .long   1481489018
+       .long   3019274558
+       .long   4283526057
+       .long   838546674
+       .long   2798778067
+       .long   4044928416
+       .long   2962978036
+       .long   1743581820
+       .long   4272084818
+       .long   1677093349
+       .long   1302588838
+       .long   3794889537
+       .long   1630988776
+       .long   3487163641
+       .long   4249202340
+       .long   3354186699
+       .long   2605177677
+       .long   3294811778
+       .long   3261977553
+       .long   2679359986
+       .long   4203437385
+       .long   2413406103
+       .long   915388059
+       .long   2294656261
+       .long   2228987811
+       .long   1063752677
+       .long   4111907475
+       .long   531844911
+       .long   1830776118
+       .long   294345226
+       .long   163008326
+       .long   2127505355
+       .long   3928847655
+       .long   1063689823
+       .long   3661552236
+       .long   588690452
+       .long   326016652
+       .long   4255010710
+       .long   3562728015
+       .long   2127379647
+       .long   3028137177
+       .long   1177380905
+       .long   652033304
+       .long   4215054124
+       .long   2830488734
+       .long   4254759295
+       .long   1761307059
+       .long   2354761811
+       .long   1304066609
+       .long   4135140952
+       .long   1366010173
+       .long   4214551295
+       .long   3522614119
+       .long   414556326
+       .long   2608133219
+       .long   3975314608
+       .long   2732020347
+       .long   4134135294
+       .long   2750260943
+       .long   829112653
+       .long   921299143
+       .long   3655661921
+       .long   1169073399
+       .long   3973303293
+       .long   1205554591
+       .long   1658225307
+       .long   1842598287
+       .long   3016356546
+       .long   2338146798
+       .long   3651639290
+       .long   2411109183
+       .long   3316450614
+       .long   3685196575
+       .long   1737745796
+       .long   381326301
+       .long   3008311285
+       .long   527251070
+       .long   2337933933
+       .long   3075425855
+       .long   3475491593
+       .long   762652602
+       .long   1721655274
+       .long   1054502141
+       .long   380900570
+       .long   1855884414
+       .long   2656015891
+       .long   1525305205
+       .long   3443310548
+       .long   2109004283
+       .long   761801140
+       .long   3711768829
+       .long   1017064486
+       .long   3050610411
+       .long   2591653800
+       .long   4218008566
+       .long   1523602280
+       .long   3128570363
+       .long   2034128973
+       .long   1806253526
+       .long   888340305
+       .long   4141049836
+       .long   3047204561
+       .long   1962173430
+       .long   4068257947
+       .long   3612507052
+       .long   1776680610
+       .long   3987132377
+       .long   1799441827
+       .long   3924346860
+       .long   3841548598
+       .long   2930046808
+       .long   3553361221
+       .long   3679297459
+       .long   3598883655
+       .long   3553726425
+       .long   3388129901
+       .long   1565126321
+       .long   2811755147
+       .long   3063627623
+       .long   2902800015
+       .long   2812485555
+       .long   2481292507
+       .long   3130252643
+       .long   1328542998
+       .long   1832287951
+       .long   1510632735
+       .long   1330003814
+       .long   667617719
+       .long   1965537991
+       .long   2657085997
+       .long   3664575902
+       .long   3021265470
+       .long   2660007629
+       .long   1335235438
+       .long   3931075983
+       .long   1019204698
+       .long   3034184508
+       .long   1747563645
+       .long   1025047962
+       .long   2670470877
+       .long   3567184671
+       .long   2038409397
+       .long   1773401721
+       .long   3495127291
+       .long   2050095924
+       .long   1045974458
+       .long   2839402047
+       .long   4076818795
+       .long   3546803442
+       .long   2695287286
+       .long   4100191849
+       .long   2091948916
+       .long   1383836798
+       .long   3858670295
+       .long   2798639588
+       .long   1095607277
+       .long   3905416403
+       .long   4183897833
+       .long   2767673597
+       .long   3422373294
+       .long   1302311881
+       .long   2191214555
+       .long   3515865511
+       .long   4072828371
+       .long   1240379898
+       .long   2549779293
+       .long   2604623763
+       .long   87461814
+       .long   2736763727
+       .long   3850689447
+       .long   2480759797
+       .long   804591290
+       .long   914280231
+       .long   174923629
+       .long   1178560158
+       .long   3406411599
+       .long   666552299
+       .long   1609182581
+       .long   1828560463
+       .long   349847258
+       .long   2357120316
+       .long   2517855902
+       .long   1333104599
+       .long   3218365162
+       .long   3657120927
+       .long   699694516
+       .long   419273337
+       .long   740744509
+       .long   2666209199
+       .long   2141763028
+       .long   3019274558
+       .long   1399389033
+       .long   838546674
+       .long   1481489018
+       .long   1037451103
+       .long   4283526057
+       .long   1743581820
+       .long   2798778067
+       .long   1677093349
+       .long   2962978036
+       .long   2074902206
+       .long   4272084818
+       .long   3487163641
+       .long   1302588838
+       .long   3354186699
+       .long   1630988776
+       .long   4149804412
+       .long   4249202340
+       .long   2679359986
+       .long   2605177677
+       .long   2413406103
+       .long   3261977553
+       .long   4004641529
+       .long   4203437385
+       .long   1063752677
+       .long   915388059
+       .long   531844911
+       .long   2228987811
+       .long   3714315762
+       .long   4111907475
+       .long   2127505355
+       .long   1830776118
+       .long   1063689823
+       .long   163008326
+       .long   3133664229
+       .long   3928847655
+       .long   4255010710
+       .long   3661552236
+       .long   2127379647
+       .long   326016652
+       .long   1972361163
+       .long   3562728015
+       .long   4215054124
+       .long   3028137177
+       .long   4254759295
+       .long   652033304
+       .long   3944722327
+       .long   2830488734
+       .long   4135140952
+       .long   1761307059
+       .long   4214551295
+       .long   1304066609
+       .long   3594477359
+       .long   1366010173
+       .long   3975314608
+       .long   3522614119
+       .long   4134135294
+       .long   2608133219
+       .long   2893987423
+       .long   2732020347
+       .long   3655661921
+       .long   2750260943
+       .long   3973303293
+       .long   921299143
+       .long   1493007550
+       .long   1169073399
+       .long   3016356546
+       .long   1205554591
+       .long   3651639290
+       .long   1842598287
+       .long   2986015100
+       .long   2338146798
+       .long   1737745796
+       .long   2411109183
+       .long   3008311285
+       .long   3685196575
+       .long   1677062904
+       .long   381326301
+       .long   3475491593
+       .long   527251070
+       .long   1721655274
+       .long   3075425855
+       .long   3354125809
+       .long   762652602
+       .long   2656015891
+       .long   1054502141
+       .long   3443310548
+       .long   1855884414
+       .long   2413284322
+       .long   1525305205
+       .long   1017064486
+       .long   2109004283
+       .long   2591653800
+       .long   3711768829
+       .long   531601349
+       .long   3050610411
+       .long   2034128973
+       .long   4218008566
+       .long   888340305
+       .long   3128570363
+       .long   1063202699
+       .long   1806253526
+       .long   4068257947
+       .long   4141049836
+       .long   1776680610
+       .long   1962173430
+       .long   2126405399
+       .long   3612507052
+       .long   3841548598
+       .long   3987132377
+       .long   3553361221
+       .long   3924346860
+       .long   4252810799
+       .long   2930046808
+       .long   3388129901
+       .long   3679297459
+       .long   2811755147
+       .long   3553726425
+       .long   4210654302
+       .long   1565126321
+       .long   2481292507
+       .long   3063627623
+       .long   1328542998
+       .long   2812485555
+       .long   4126341309
+       .long   3130252643
+       .long   667617719
+       .long   1832287951
+       .long   2657085997
+       .long   1330003814
+       .long   3957715323
+       .long   1965537991
+       .long   1335235438
+       .long   3664575902
+       .long   1019204698
+       .long   2660007629
+       .long   3620463350
+       .long   3931075983
+       .long   2670470877
+       .long   3034184508
+       .long   2038409397
+       .long   1025047962
+       .long   2945959404
+       .long   3567184671
+       .long   1045974458
+       .long   1773401721
+       .long   4076818795
+       .long   2050095924
+       .long   1596951513
+       .long   2839402047
+       .long   2091948916
+       .long   3546803442
+       .long   3858670295
+       .long   4100191849
+       .long   3193903027
+       .long   1383836798
+       .long   4183897833
+       .long   2798639588
+       .long   3422373294
+       .long   3905416403
+       .long   2092838759
+       .long   2767673597
+       .long   4072828371
+       .long   1302311881
+       .long   2549779293
+       .long   3515865511
+       .long   4185677519
+       .long   1240379898
+       .long   3850689447
+       .long   2604623763
+       .long   804591290
+       .long   2736763727
+       .long   4076387742
+       .long   2480759797
+       .long   3406411599
+       .long   914280231
+       .long   1609182581
+       .long   1178560158
+       .long   3857808189
+       .long   666552299
+       .long   2517855902
+       .long   1828560463
+       .long   3218365162
+       .long   2357120316
+       .long   3420649082
+       .long   1333104599
+       .long   740744509
+       .long   3657120927
+       .long   2141763028
+       .long   419273337
+       .long   2546330868
+       .long   2666209199
+       .long   1481489018
+       .long   3019274558
+       .long   4283526057
+       .long   838546674
+       .long   797694440
+       .long   1037451103
+       .long   2962978036
+       .long   1743581820
+       .long   4272084818
+       .long   1677093349
+       .long   1595388880
+       .long   2074902206
+       .long   1630988776
+       .long   3487163641
+       .long   4249202340
+       .long   3354186699
+       .long   3190777760
+       .long   4149804412
+       .long   3261977553
+       .long   2679359986
+       .long   4203437385
+       .long   2413406103
+       .long   2086588225
+       .long   4004641529
+       .long   2228987811
+       .long   1063752677
+       .long   4111907475
+       .long   531844911
+       .long   4173176451
+       .long   3714315762
+       .long   163008326
+       .long   2127505355
+       .long   3928847655
+       .long   1063689823
+       .long   4051385607
+       .long   3133664229
+       .long   326016652
+       .long   4255010710
+       .long   3562728015
+       .long   2127379647
+       .long   3807803918
+       .long   1972361163
+       .long   652033304
+       .long   4215054124
+       .long   2830488734
+       .long   4254759295
+       .long   3320640540
+       .long   3944722327
+       .long   1304066609
+       .long   4135140952
+       .long   1366010173
+       .long   4214551295
+       .long   2346313785
+       .long   3594477359
+       .long   2608133219
+       .long   3975314608
+       .long   2732020347
+       .long   4134135294
+       .long   397660275
+       .long   2893987423
+       .long   921299143
+       .long   3655661921
+       .long   1169073399
+       .long   3973303293
+       .long   795320551
+       .long   1493007550
+       .long   1842598287
+       .long   3016356546
+       .long   2338146798
+       .long   3651639290
+       .long   1590641102
+       .long   2986015100
+       .long   3685196575
+       .long   1737745796
+       .long   381326301
+       .long   3008311285
+       .long   3181282204
+       .long   1677062904
+       .long   3075425855
+       .long   3475491593
+       .long   762652602
+       .long   1721655274
+       .long   2067597113
+       .long   3354125809
+       .long   1855884414
+       .long   2656015891
+       .long   1525305205
+       .long   3443310548
+       .long   4135194227
+       .long   2413284322
+       .long   3711768829
+       .long   1017064486
+       .long   3050610411
+       .long   2591653800
+       .long   3975421159
+       .long   531601349
+       .long   3128570363
+       .long   2034128973
+       .long   1806253526
+       .long   888340305
+       .long   3655875023
+       .long   1063202699
+       .long   1962173430
+       .long   4068257947
+       .long   3612507052
+       .long   1776680610
+       .long   3016782751
+       .long   2126405399
+       .long   3924346860
+       .long   3841548598
+       .long   2930046808
+       .long   3553361221
+       .long   1738598206
+       .long   4252810799
+       .long   3553726425
+       .long   3388129901
+       .long   1565126321
+       .long   2811755147
+       .long   3477196413
+       .long   4210654302
+       .long   2812485555
+       .long   2481292507
+       .long   3130252643
+       .long   1328542998
+       .long   2659425531
+       .long   4126341309
+       .long   1330003814
+       .long   667617719
+       .long   1965537991
+       .long   2657085997
+       .long   1023883767
+       .long   3957715323
+       .long   2660007629
+       .long   1335235438
+       .long   3931075983
+       .long   1019204698
+       .long   2047767535
+       .long   3620463350
+       .long   1025047962
+       .long   2670470877
+       .long   3567184671
+       .long   2038409397
+       .long   4095535070
+       .long   2945959404
+       .long   2050095924
+       .long   1045974458
+       .long   2839402047
+       .long   4076818795
+       .long   3896102844
+       .long   1596951513
+       .long   4100191849
+       .long   2091948916
+       .long   1383836798
+       .long   3858670295
+       .long   3497238392
+       .long   3193903027
+       .long   3905416403
+       .long   4183897833
+       .long   2767673597
+       .long   3422373294
+       .long   2699509489
+       .long   2092838759
+       .long   3515865511
+       .long   4072828371
+       .long   1240379898
+       .long   2549779293
+       .long   1104051682
+       .long   4185677519
+       .long   2736763727
+       .long   3850689447
+       .long   2480759797
+       .long   804591290
+       .long   2208103365
+       .long   4076387742
+       .long   1178560158
+       .long   3406411599
+       .long   666552299
+       .long   1609182581
+       .long   121239434
+       .long   3857808189
+       .long   2357120316
+       .long   2517855902
+       .long   1333104599
+       .long   3218365162
+       .long   242478868
+       .long   3420649082
+       .long   419273337
+       .long   740744509
+       .long   2666209199
+       .long   2141763028
+       .long   484957737
+       .long   2546330868
+       .long   838546674
+       .long   1481489018
+       .long   1037451103
+       .long   4283526057
+       .long   969915474
+       .long   797694440
+       .long   1677093349
+       .long   2962978036
+       .long   2074902206
+       .long   4272084818
+       .long   1939830949
+       .long   1595388880
+       .long   3354186699
+       .long   1630988776
+       .long   4149804412
+       .long   4249202340
+       .long   3879661898
+       .long   3190777760
+       .long   2413406103
+       .long   3261977553
+       .long   4004641529
+       .long   4203437385
+       .long   3464356500
+       .long   2086588225
+       .long   531844911
+       .long   2228987811
+       .long   3714315762
+       .long   4111907475
+       .long   2633745705
+       .long   4173176451
+       .long   1063689823
+       .long   163008326
+       .long   3133664229
+       .long   3928847655
+       .long   972524114
+       .long   4051385607
+       .long   2127379647
+       .long   326016652
+       .long   1972361163
+       .long   3562728015
+       .long   1945048229
+       .long   3807803918
+       .long   4254759295
+       .long   652033304
+       .long   3944722327
+       .long   2830488734
+       .long   3890096458
+       .long   3320640540
+       .long   4214551295
+       .long   1304066609
+       .long   3594477359
+       .long   1366010173
+       .long   3485225620
+       .long   2346313785
+       .long   4134135294
+       .long   2608133219
+       .long   2893987423
+       .long   2732020347
+       .long   2675483945
+       .long   397660275
+       .long   3973303293
+       .long   921299143
+       .long   1493007550
+       .long   1169073399
+       .long   1056000594
+       .long   795320551
+       .long   3651639290
+       .long   1842598287
+       .long   2986015100
+       .long   2338146798
+       .long   2112001188
+       .long   1590641102
+       .long   3008311285
+       .long   3685196575
+       .long   1677062904
+       .long   381326301
+       .long   4224002377
+       .long   3181282204
+       .long   1721655274
+       .long   3075425855
+       .long   3354125809
+       .long   762652602
+       .long   4153037458
+       .long   2067597113
+       .long   3443310548
+       .long   1855884414
+       .long   2413284322
+       .long   1525305205
+       .long   4011107621
+       .long   4135194227
+       .long   2591653800
+       .long   3711768829
+       .long   531601349
+       .long   3050610411
+       .long   3727247947
+       .long   3975421159
+       .long   888340305
+       .long   3128570363
+       .long   1063202699
+       .long   1806253526
+       .long   3159528599
+       .long   3655875023
+       .long   1776680610
+       .long   1962173430
+       .long   2126405399
+       .long   3612507052
+       .long   2024089902
+       .long   3016782751
+       .long   3553361221
+       .long   3924346860
+       .long   4252810799
+       .long   2930046808
+       .long   4048179805
+       .long   1738598206
+       .long   2811755147
+       .long   3553726425
+       .long   4210654302
+       .long   1565126321
+       .long   3801392314
+       .long   3477196413
+       .long   1328542998
+       .long   2812485555
+       .long   4126341309
+       .long   3130252643
+       .long   3307817333
+       .long   2659425531
+       .long   2657085997
+       .long   1330003814
+       .long   3957715323
+       .long   1965537991
+       .long   2320667370
+       .long   1023883767
+       .long   1019204698
+       .long   2660007629
+       .long   3620463350
+       .long   3931075983
+       .long   346367444
+       .long   2047767535
+       .long   2038409397
+       .long   1025047962
+       .long   2945959404
+       .long   3567184671
+       .long   692734889
+       .long   4095535070
+       .long   4076818795
+       .long   2050095924
+       .long   1596951513
+       .long   2839402047
+       .long   1385469779
+       .long   3896102844
+       .long   3858670295
+       .long   4100191849
+       .long   3193903027
+       .long   1383836798
+       .long   2770939558
+       .long   3497238392
+       .long   3422373294
+       .long   3905416403
+       .long   2092838759
+       .long   2767673597
+       .long   1246911821
+       .long   2699509489
+       .long   2549779293
+       .long   3515865511
+       .long   4185677519
+       .long   1240379898
+       .long   2493823642
+       .long   1104051682
+       .long   804591290
+       .long   2736763727
+       .long   4076387742
+       .long   2480759797
+       .long   692679989
+       .long   2208103365
+       .long   1609182581
+       .long   1178560158
+       .long   3857808189
+       .long   666552299
+       .long   1385359979
+       .long   121239434
+       .long   3218365162
+       .long   2357120316
+       .long   3420649082
+       .long   1333104599
+       .long   2770719959
+       .long   242478868
+       .long   2141763028
+       .long   419273337
+       .long   2546330868
+       .long   2666209199
+       .long   1246472623
+       .long   484957737
+       .long   4283526057
+       .long   838546674
+       .long   797694440
+       .long   1037451103
+       .long   2492945247
+       .long   969915474
+       .long   4272084818
+       .long   1677093349
+       .long   1595388880
+       .long   2074902206
+       .long   690923199
+       .long   1939830949
+       .long   4249202340
+       .long   3354186699
+       .long   3190777760
+       .long   4149804412
+       .long   1381846399
+       .long   3879661898
+       .long   4203437385
+       .long   2413406103
+       .long   2086588225
+       .long   4004641529
+       .long   2763692798
+       .long   3464356500
+       .long   4111907475
+       .long   531844911
+       .long   4173176451
+       .long   3714315762
+       .long   1232418301
+       .long   2633745705
+       .long   3928847655
+       .long   1063689823
+       .long   4051385607
+       .long   3133664229
+       .long   2464836603
+       .long   972524114
+       .long   3562728015
+       .long   2127379647
+       .long   3807803918
+       .long   1972361163
+       .long   634705910
+       .long   1945048229
+       .long   2830488734
+       .long   4254759295
+       .long   3320640540
+       .long   3944722327
+       .long   1269411821
+       .long   3890096458
+       .long   1366010173
+       .long   4214551295
+       .long   2346313785
+       .long   3594477359
+       .long   2538823642
+       .long   3485225620
+       .long   2732020347
+       .long   4134135294
+       .long   397660275
+       .long   2893987423
+       .long   782679989
+       .long   2675483945
+       .long   1169073399
+       .long   3973303293
+       .long   795320551
+       .long   1493007550
+       .long   1565359979
+       .long   1056000594
+       .long   2338146798
+       .long   3651639290
+       .long   1590641102
+       .long   2986015100
+       .long   3130719959
+       .long   2112001188
+       .long   381326301
+       .long   3008311285
+       .long   3181282204
+       .long   1677062904
+       .long   1966472623
+       .long   4224002377
+       .long   762652602
+       .long   1721655274
+       .long   2067597113
+       .long   3354125809
+       .long   3932945247
+       .long   4153037458
+       .long   1525305205
+       .long   3443310548
+       .long   4135194227
+       .long   2413284322
+       .long   3570923199
+       .long   4011107621
+       .long   3050610411
+       .long   2591653800
+       .long   3975421159
+       .long   531601349
+       .long   2846879102
+       .long   3727247947
+       .long   1806253526
+       .long   888340305
+       .long   3655875023
+       .long   1063202699
+       .long   1398790909
+       .long   3159528599
+       .long   3612507052
+       .long   1776680610
+       .long   3016782751
+       .long   2126405399
+       .long   2797581819
+       .long   2024089902
+       .long   2930046808
+       .long   3553361221
+       .long   1738598206
+       .long   4252810799
+       .long   1300196342
+       .long   4048179805
+       .long   1565126321
+       .long   2811755147
+       .long   3477196413
+       .long   4210654302
+       .long   2600392684
+       .long   3801392314
+       .long   3130252643
+       .long   1328542998
+       .long   2659425531
+       .long   4126341309
+       .long   905818072
+       .long   3307817333
+       .long   1965537991
+       .long   2657085997
+       .long   1023883767
+       .long   3957715323
+       .long   1811636145
+       .long   2320667370
+       .long   3931075983
+       .long   1019204698
+       .long   2047767535
+       .long   3620463350
+       .long   3623272290
+       .long   346367444
+       .long   3567184671
+       .long   2038409397
+       .long   4095535070
+       .long   2945959404
+       .long   2951577284
+       .long   692734889
+       .long   2839402047
+       .long   4076818795
+       .long   3896102844
+       .long   1596951513
+       .long   1608187272
+       .long   1385469779
+       .long   1383836798
+       .long   3858670295
+       .long   3497238392
+       .long   3193903027
+       .long   3216374545
+       .long   2770939558
+       .long   2767673597
+       .long   3422373294
+       .long   2699509489
+       .long   2092838759
+       .long   2137781795
+       .long   1246911821
+       .long   1240379898
+       .long   2549779293
+       .long   1104051682
+       .long   4185677519
+       .long   4275563591
+       .long   2493823642
+       .long   2480759797
+       .long   804591290
+       .long   2208103365
+       .long   4076387742
+       .long   4256159887
+       .long   692679989
+       .long   666552299
+       .long   1609182581
+       .long   121239434
+       .long   3857808189
+       .long   4217352479
+       .long   1385359979
+       .long   1333104599
+       .long   3218365162
+       .long   242478868
+       .long   3420649082
+       .long   4139737663
+       .long   2770719959
+       .long   2666209199
+       .long   2141763028
+       .long   484957737
+       .long   2546330868
+       .long   3984508030
+       .long   1246472623
+       .long   1037451103
+       .long   4283526057
+       .long   969915474
+       .long   797694440
+       .long   3674048764
+       .long   2492945247
+       .long   2074902206
+       .long   4272084818
+       .long   1939830949
+       .long   1595388880
+       .long   3053130232
+       .long   690923199
+       .long   4149804412
+       .long   4249202340
+       .long   3879661898
+       .long   3190777760
+       .long   1811293169
+       .long   1381846399
+       .long   4004641529
+       .long   4203437385
+       .long   3464356500
+       .long   2086588225
+       .long   3622586339
+       .long   2763692798
+       .long   3714315762
+       .long   4111907475
+       .long   2633745705
+       .long   4173176451
+       .long   2950205382
+       .long   1232418301
+       .long   3133664229
+       .long   3928847655
+       .long   972524114
+       .long   4051385607
+       .long   1605443469
+       .long   2464836603
+       .long   1972361163
+       .long   3562728015
+       .long   1945048229
+       .long   3807803918
+       .long   3210886938
+       .long   634705910
+       .long   3944722327
+       .long   2830488734
+       .long   3890096458
+       .long   3320640540
+       .long   2126806581
+       .long   1269411821
+       .long   3594477359
+       .long   1366010173
+       .long   3485225620
+       .long   2346313785
+       .long   4253613162
+       .long   2538823642
+       .long   2893987423
+       .long   2732020347
+       .long   2675483945
+       .long   397660275
+       .long   4212259029
+       .long   782679989
+       .long   1493007550
+       .long   1169073399
+       .long   1056000594
+       .long   795320551
+       .long   4129550763
+       .long   1565359979
+       .long   2986015100
+       .long   2338146798
+       .long   2112001188
+       .long   1590641102
+       .long   3964134231
+       .long   3130719959
+       .long   1677062904
+       .long   381326301
+       .long   4224002377
+       .long   3181282204
+       .long   3633301166
+       .long   1966472623
+       .long   3354125809
+       .long   762652602
+       .long   4153037458
+       .long   2067597113
+       .long   2971635037
+       .long   3932945247
+       .long   2413284322
+       .long   1525305205
+       .long   4011107621
+       .long   4135194227
+       .long   1648302778
+       .long   3570923199
+       .long   531601349
+       .long   3050610411
+       .long   3727247947
+       .long   3975421159
+       .long   3296605556
+       .long   2846879102
+       .long   1063202699
+       .long   1806253526
+       .long   3159528599
+       .long   3655875023
+       .long   2298243816
+       .long   1398790909
+       .long   2126405399
+       .long   3612507052
+       .long   2024089902
+       .long   3016782751
+       .long   301520336
+       .long   2797581819
+       .long   4252810799
+       .long   2930046808
+       .long   4048179805
+       .long   1738598206
+       .long   603040673
+       .long   1300196342
+       .long   4210654302
+       .long   1565126321
+       .long   3801392314
+       .long   3477196413
+       .long   1206081346
+       .long   2600392684
+       .long   4126341309
+       .long   3130252643
+       .long   3307817333
+       .long   2659425531
+       .long   2412162692
+       .long   905818072
+       .long   3957715323
+       .long   1965537991
+       .long   2320667370
+       .long   1023883767
+       .long   529358088
+       .long   1811636145
+       .long   3620463350
+       .long   3931075983
+       .long   346367444
+       .long   2047767535
+       .long   1058716176
+       .long   3623272290
+       .long   2945959404
+       .long   3567184671
+       .long   692734889
+       .long   4095535070
+       .long   2117432353
+       .long   2951577284
+       .long   1596951513
+       .long   2839402047
+       .long   1385469779
+       .long   3896102844
+       .long   4234864706
+       .long   1608187272
+       .long   3193903027
+       .long   1383836798
+       .long   2770939558
+       .long   3497238392
+       .long   4174762117
+       .long   3216374545
+       .long   2092838759
+       .long   2767673597
+       .long   1246911821
+       .long   2699509489
+       .long   4054556938
+       .long   2137781795
+       .long   4185677519
+       .long   1240379898
+       .long   2493823642
+       .long   1104051682
+       .long   3814146581
+       .long   4275563591
+       .long   4076387742
+       .long   2480759797
+       .long   692679989
+       .long   2208103365
+       .long   3333325867
+       .long   4256159887
+       .long   3857808189
+       .long   666552299
+       .long   1385359979
+       .long   121239434
+       .long   2371684438
+       .long   4217352479
+       .long   3420649082
+       .long   1333104599
+       .long   2770719959
+       .long   242478868
+       .long   448401580
+       .long   4139737663
+       .long   2546330868
+       .long   2666209199
+       .long   1246472623
+       .long   484957737
+       .long   896803160
+       .long   3984508030
+       .type   __svml_dtan_reduction_data_internal,@object
+       .size   __svml_dtan_reduction_data_internal,49152
+       .space 512, 0x00        
+       .align 32
+.L_2il0floatpacket.35:
+       .long   0x00000008,0x00000008,0x00000008,0x00000008,0x00000008,0x00000008,0x00000008,0x00000008
+       .type   .L_2il0floatpacket.35,@object
+       .size   .L_2il0floatpacket.35,32
+       .align 8
+.L_2il0floatpacket.18:
+       .long   0xffffffff,0xffffffff
+       .type   .L_2il0floatpacket.18,@object
+       .size   .L_2il0floatpacket.18,8
+       .align 8
+.L_2il0floatpacket.19:
+       .long   0x00000000,0x7ff00000
+       .type   .L_2il0floatpacket.19,@object
+       .size   .L_2il0floatpacket.19,8
+       .align 8
+.L_2il0floatpacket.20:
+       .long   0xffffffff,0x000fffff
+       .type   .L_2il0floatpacket.20,@object
+       .size   .L_2il0floatpacket.20,8
+       .align 8
+.L_2il0floatpacket.21:
+       .long   0x00000000,0x00100000
+       .type   .L_2il0floatpacket.21,@object
+       .size   .L_2il0floatpacket.21,8
+       .align 8
+.L_2il0floatpacket.22:
+       .long   0xffffffff,0x00000000
+       .type   .L_2il0floatpacket.22,@object
+       .size   .L_2il0floatpacket.22,8
+       .align 8
+.L_2il0floatpacket.23:
+       .long   0x00000000,0x80000000
+       .type   .L_2il0floatpacket.23,@object
+       .size   .L_2il0floatpacket.23,8
+       .align 8
+.L_2il0floatpacket.24:
+       .long   0x00000000,0x3ff00000
+       .type   .L_2il0floatpacket.24,@object
+       .size   .L_2il0floatpacket.24,8
+       .align 8
+.L_2il0floatpacket.25:
+       .long   0x00000000,0x42a80000
+       .type   .L_2il0floatpacket.25,@object
+       .size   .L_2il0floatpacket.25,8
+       .align 8
+.L_2il0floatpacket.26:
+       .long   0x000001ff,0x00000000
+       .type   .L_2il0floatpacket.26,@object
+       .size   .L_2il0floatpacket.26,8
+       .align 8
+.L_2il0floatpacket.27:
+       .long   0x00000000,0x39700000
+       .type   .L_2il0floatpacket.27,@object
+       .size   .L_2il0floatpacket.27,8
+       .align 8
+.L_2il0floatpacket.28:
+       .long   0x00ffffff,0x00000000
+       .type   .L_2il0floatpacket.28,@object
+       .size   .L_2il0floatpacket.28,8
+       .align 8
+.L_2il0floatpacket.29:
+       .long   0x00000000,0x3cb00000
+       .type   .L_2il0floatpacket.29,@object
+       .size   .L_2il0floatpacket.29,8
+       .align 8
+.L_2il0floatpacket.30:
+       .long   0x00000fff,0x00000000
+       .type   .L_2il0floatpacket.30,@object
+       .size   .L_2il0floatpacket.30,8
+       .align 8
+.L_2il0floatpacket.31:
+       .long   0x54442d18,0x401921fb
+       .type   .L_2il0floatpacket.31,@object
+       .size   .L_2il0floatpacket.31,8
+       .align 8
+.L_2il0floatpacket.32:
+       .long   0x33145c07,0x3cb1a626
+       .type   .L_2il0floatpacket.32,@object
+       .size   .L_2il0floatpacket.32,8
+       .align 8
+.L_2il0floatpacket.33:
+       .long   0xffffffff,0x7fffffff
+       .type   .L_2il0floatpacket.33,@object
+       .size   .L_2il0floatpacket.33,8
+       .align 8
+.L_2il0floatpacket.34:
+       .long   0x00000000,0x3eb00000
+       .type   .L_2il0floatpacket.34,@object
+       .size   .L_2il0floatpacket.34,8
+       .align 8
+.L_2il0floatpacket.36:
+       .long   0x54442d18,0x3f8921fb
+       .type   .L_2il0floatpacket.36,@object
+       .size   .L_2il0floatpacket.36,8
+       .align 8
+.L_2il0floatpacket.37:
+       .long   0x33145c07,0x3c21a626
+       .type   .L_2il0floatpacket.37,@object
+       .size   .L_2il0floatpacket.37,8
+       .align 8
+__dtan_la_Tab:
+       .long   0
+       .long   0
+       .long   0
+       .long   2146435072
+       .type   __dtan_la_Tab,@object
+       .size   __dtan_la_Tab,16
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_tan_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_tan_s_la.s
new file mode 100644 (file)
index 0000000..478a52a
--- /dev/null
@@ -0,0 +1,3179 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ *     
+ *      ( optimized for throughput, with small table lookup, works when HW FMA is available )
+ *     
+ *       Implementation reduces argument x to |R|<pi/64
+ *       32-entry tables used to store high and low parts of tan(x0)
+ *       Argument x = N*pi + x0 + (R);   x0 = k*pi/32, with k in {0, 1, ..., 31}
+ *       (very large arguments reduction resolved in _vsreduction_core.i)
+ *       Compute result as (tan(x0) + tan(R))/(1-tan(x0)*tan(R))
+ *       _HA_ version keeps extra precision for numerator, denominator, and during
+ *       final NR-iteration computing quotient.
+ *     
+ *     
+ */
+
+
+       .text
+.L_2__routine_start___svml_tanf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_tanf16
+
+__svml_tanf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        xorl      %edx, %edx
+
+/* Large values check */
+        vmovups   768+__svml_stan_data_internal(%rip), %zmm10
+
+/*
+ * ----------------------------------------------------------
+ * Main path
+ * ----------------------------------------------------------
+ * start arg. reduction
+ */
+        vmovups   1088+__svml_stan_data_internal(%rip), %zmm1
+        vmovups   64+__svml_stan_data_internal(%rip), %zmm4
+        vmovups   128+__svml_stan_data_internal(%rip), %zmm2
+        vmovups   192+__svml_stan_data_internal(%rip), %zmm3
+        vmovaps   %zmm0, %zmm11
+        vandps    960+__svml_stan_data_internal(%rip), %zmm11, %zmm0
+        vcmpps    $22, {sae}, %zmm10, %zmm0, %k1
+        vmovups   __svml_stan_data_internal(%rip), %zmm10
+
+/*
+ * ----------------------------------------------------------
+ * End of main path
+ * ----------------------------------------------------------
+ */
+        kortestw  %k1, %k1
+        vfmadd213ps {rn-sae}, %zmm1, %zmm11, %zmm10
+        vsubps    {rn-sae}, %zmm1, %zmm10, %zmm5
+        vfnmadd213ps {rn-sae}, %zmm11, %zmm5, %zmm4
+        vfnmadd231ps {rn-sae}, %zmm5, %zmm2, %zmm4
+        vfnmadd213ps {rn-sae}, %zmm4, %zmm3, %zmm5
+        jne       .LBL_1_12
+
+.LBL_1_2:
+
+
+/* Table lookup */
+        vmovups   384+__svml_stan_data_internal(%rip), %zmm3
+        vmovups   640+__svml_stan_data_internal(%rip), %zmm0
+        vmulps    {rn-sae}, %zmm5, %zmm5, %zmm1
+        vpermt2ps 448+__svml_stan_data_internal(%rip), %zmm10, %zmm3
+        vmovups   704+__svml_stan_data_internal(%rip), %zmm10
+        vfmadd231ps {rn-sae}, %zmm1, %zmm10, %zmm0
+        vmulps    {rn-sae}, %zmm5, %zmm0, %zmm4
+        vfmadd213ps {rn-sae}, %zmm5, %zmm1, %zmm4
+
+/*
+ * Computer Denominator:
+ * sDenominator - sDlow ~= 1-(sTh+sTl)*(sP+sPlow)
+ */
+        vmovups   1152+__svml_stan_data_internal(%rip), %zmm5
+        vmulps    {rn-sae}, %zmm4, %zmm3, %zmm7
+
+/*
+ * Compute Numerator:
+ * sNumerator + sNlow ~= sTh+sTl+sP+sPlow
+ */
+        vaddps    {rn-sae}, %zmm3, %zmm4, %zmm8
+        vsubps    {rn-sae}, %zmm7, %zmm5, %zmm9
+        vsubps    {rn-sae}, %zmm3, %zmm8, %zmm2
+
+/*
+ * Now computes (sNumerator + sNlow)/(sDenominator - sDlow)
+ * Choose NR iteration instead of hardware division
+ */
+        vrcp14ps  %zmm9, %zmm14
+        vsubps    {rn-sae}, %zmm5, %zmm9, %zmm6
+        vsubps    {rn-sae}, %zmm2, %zmm4, %zmm13
+        vmulps    {rn-sae}, %zmm8, %zmm14, %zmm15
+        vaddps    {rn-sae}, %zmm7, %zmm6, %zmm12
+
+/* One NR iteration to refine sQuotient */
+        vfmsub213ps {rn-sae}, %zmm8, %zmm15, %zmm9
+        vfnmadd213ps {rn-sae}, %zmm9, %zmm15, %zmm12
+        vsubps    {rn-sae}, %zmm13, %zmm12, %zmm0
+        vfnmadd213ps {rn-sae}, %zmm15, %zmm14, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_4
+
+.LBL_1_3:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_4:
+
+        vmovups   %zmm11, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_3
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_8:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_11
+
+.LBL_1_9:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_8
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_3
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_11:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_stan_cout_rare_internal
+        jmp       .LBL_1_9
+       .cfi_restore 4
+       .cfi_restore 5
+       .cfi_restore 12
+       .cfi_restore 13
+       .cfi_restore 122
+       .cfi_restore 123
+       .cfi_restore 124
+       .cfi_restore 125
+
+.LBL_1_12:
+
+        vmovups   1024+__svml_stan_data_internal(%rip), %zmm6
+
+/*
+ * Get the (2^a / 2pi) mod 1 values from the table.
+ * Because VLANG doesn't have I-type gather, we need a trivial cast
+ */
+        lea       __svml_stan_reduction_data_internal(%rip), %rax
+        vmovups   %zmm5, (%rsp)
+        vandps    %zmm0, %zmm6, %zmm14
+        vcmpps    $0, {sae}, %zmm6, %zmm14, %k0
+
+/*
+ * Break the P_xxx and m into 16-bit chunks ready for
+ * the long multiplication via 16x16->32 multiplications
+ */
+        vmovups   .L_2il0floatpacket.18(%rip), %zmm6
+        kxnorw    %k0, %k0, %k2
+        kxnorw    %k0, %k0, %k3
+        kmovw     %k0, %edx
+        vpandd    .L_2il0floatpacket.15(%rip), %zmm11, %zmm5
+        vpsrld    $23, %zmm5, %zmm7
+        vpslld    $1, %zmm7, %zmm8
+        vpaddd    %zmm7, %zmm8, %zmm9
+        vpslld    $2, %zmm9, %zmm4
+        vpxord    %zmm3, %zmm3, %zmm3
+        vgatherdps (%rax,%zmm4), %zmm3{%k2}
+        kxnorw    %k0, %k0, %k2
+        vpsrld    $16, %zmm3, %zmm5
+        vpxord    %zmm15, %zmm15, %zmm15
+        vpxord    %zmm2, %zmm2, %zmm2
+        vgatherdps 4(%rax,%zmm4), %zmm15{%k3}
+        vgatherdps 8(%rax,%zmm4), %zmm2{%k2}
+        vpsrld    $16, %zmm2, %zmm13
+
+/*
+ * Also get the significand as an integer
+ * NB: adding in the integer bit is wrong for denorms!
+ * To make this work for denorms we should do something slightly different
+ */
+        vpandd    .L_2il0floatpacket.16(%rip), %zmm11, %zmm0
+        vpaddd    .L_2il0floatpacket.17(%rip), %zmm0, %zmm1
+        vpsrld    $16, %zmm15, %zmm0
+        vpsrld    $16, %zmm1, %zmm8
+        vpandd    %zmm6, %zmm3, %zmm9
+        vpandd    %zmm6, %zmm15, %zmm12
+        vpandd    %zmm6, %zmm2, %zmm7
+        vpandd    %zmm6, %zmm1, %zmm14
+
+/* Now do the big multiplication and carry propagation */
+        vpmulld   %zmm9, %zmm8, %zmm4
+        vpmulld   %zmm0, %zmm8, %zmm3
+        vpmulld   %zmm12, %zmm8, %zmm2
+        vpmulld   %zmm13, %zmm8, %zmm1
+        vpmulld   %zmm7, %zmm8, %zmm8
+        vpmulld   %zmm5, %zmm14, %zmm7
+        vpmulld   %zmm9, %zmm14, %zmm5
+        vpmulld   %zmm0, %zmm14, %zmm9
+        vpmulld   %zmm12, %zmm14, %zmm0
+        vpmulld   %zmm13, %zmm14, %zmm12
+        vpsrld    $16, %zmm12, %zmm14
+        vpsrld    $16, %zmm0, %zmm13
+        vpsrld    $16, %zmm9, %zmm15
+        vpsrld    $16, %zmm5, %zmm12
+        vpsrld    $16, %zmm8, %zmm8
+        vpaddd    %zmm14, %zmm1, %zmm1
+        vpaddd    %zmm13, %zmm2, %zmm2
+        vpaddd    %zmm15, %zmm3, %zmm15
+        vpaddd    %zmm12, %zmm4, %zmm3
+        vpandd    %zmm6, %zmm0, %zmm13
+        vpaddd    %zmm1, %zmm13, %zmm4
+        vpaddd    %zmm4, %zmm8, %zmm14
+        vpsrld    $16, %zmm14, %zmm0
+        vpandd    %zmm6, %zmm9, %zmm9
+        vpaddd    %zmm2, %zmm9, %zmm1
+        vpaddd    %zmm1, %zmm0, %zmm8
+
+/*
+ * Now round at the 2^-8 bit position for reduction mod pi/2^7
+ * instead of the original 2pi (but still with the same 2pi scaling).
+ * Use a shifter of 2^15 + 2^14.
+ * The N we get is our final version; it has an offset of
+ * 2^8 because of the implicit integer bit, and anyway for negative
+ * starting value it's a 2s complement thing. But we need to mask
+ * off the exponent part anyway so it's fine.
+ */
+        vmovups   .L_2il0floatpacket.21(%rip), %zmm1
+        vpandd    %zmm6, %zmm7, %zmm7
+        vpaddd    %zmm3, %zmm7, %zmm13
+        vpsrld    $16, %zmm8, %zmm3
+        vpandd    %zmm6, %zmm5, %zmm5
+        vpaddd    %zmm15, %zmm5, %zmm2
+        vpaddd    %zmm2, %zmm3, %zmm15
+        vpsrld    $16, %zmm15, %zmm12
+        vpaddd    %zmm13, %zmm12, %zmm5
+
+/* Assemble reduced argument from the pieces */
+        vpandd    %zmm6, %zmm14, %zmm9
+        vpandd    %zmm6, %zmm15, %zmm7
+        vpslld    $16, %zmm5, %zmm6
+        vpslld    $16, %zmm8, %zmm5
+        vpaddd    %zmm7, %zmm6, %zmm4
+        vpaddd    %zmm9, %zmm5, %zmm9
+        vpsrld    $9, %zmm4, %zmm6
+
+/*
+ * We want to incorporate the original sign now too.
+ * Do it here for convenience in getting the right N value,
+ * though we could wait right to the end if we were prepared
+ * to modify the sign of N later too.
+ * So get the appropriate sign mask now (or sooner).
+ */
+        vpandd    .L_2il0floatpacket.19(%rip), %zmm11, %zmm0
+        vpandd    .L_2il0floatpacket.24(%rip), %zmm9, %zmm13
+        vpslld    $5, %zmm13, %zmm14
+
+/*
+ * Create floating-point high part, implicitly adding integer bit 1
+ * Incorporate overall sign at this stage too.
+ */
+        vpxord    .L_2il0floatpacket.20(%rip), %zmm0, %zmm8
+        vpord     %zmm8, %zmm6, %zmm2
+        vaddps    {rn-sae}, %zmm2, %zmm1, %zmm12
+        vsubps    {rn-sae}, %zmm1, %zmm12, %zmm3
+        vsubps    {rn-sae}, %zmm3, %zmm2, %zmm7
+
+/*
+ * Create floating-point low and medium parts, respectively
+ * lo_17, ... lo_0, 0, ..., 0
+ * hi_8, ... hi_0, lo_31, ..., lo_18
+ * then subtract off the implicitly added integer bits,
+ * 2^-46 and 2^-23, respectively.
+ * Put the original sign into all of them at this stage.
+ */
+        vpxord    .L_2il0floatpacket.23(%rip), %zmm0, %zmm6
+        vpord     %zmm6, %zmm14, %zmm15
+        vpandd    .L_2il0floatpacket.26(%rip), %zmm4, %zmm4
+        vsubps    {rn-sae}, %zmm6, %zmm15, %zmm8
+        vandps    .L_2il0floatpacket.29(%rip), %zmm11, %zmm15
+        vpsrld    $18, %zmm9, %zmm6
+
+/*
+ * If the magnitude of the input is <= 2^-20, then
+ * just pass through the input, since no reduction will be needed and
+ * the main path will only work accurately if the reduced argument is
+ * about >= 2^-40 (which it is for all large pi multiples)
+ */
+        vmovups   .L_2il0floatpacket.30(%rip), %zmm14
+        vcmpps    $26, {sae}, %zmm14, %zmm15, %k3
+        vcmpps    $22, {sae}, %zmm14, %zmm15, %k2
+        vpxord    .L_2il0floatpacket.25(%rip), %zmm0, %zmm1
+        vpslld    $14, %zmm4, %zmm0
+        vpord     %zmm6, %zmm0, %zmm0
+        vpord     %zmm1, %zmm0, %zmm4
+        vsubps    {rn-sae}, %zmm1, %zmm4, %zmm2
+        vpternlogd $255, %zmm6, %zmm6, %zmm6
+
+/* Now add them up into 2 reasonably aligned pieces */
+        vaddps    {rn-sae}, %zmm2, %zmm7, %zmm13
+        vsubps    {rn-sae}, %zmm13, %zmm7, %zmm7
+        vaddps    {rn-sae}, %zmm7, %zmm2, %zmm3
+
+/*
+ * The output is _VRES_R (high) + _VRES_E (low), and the integer part is _VRES_IND
+ * Set sRp2 = _VRES_R^2 and then resume the original code.
+ */
+        vmovups   .L_2il0floatpacket.31(%rip), %zmm2
+        vaddps    {rn-sae}, %zmm8, %zmm3, %zmm1
+        vmovups   .L_2il0floatpacket.28(%rip), %zmm8
+
+/* Grab our final N value as an integer, appropriately masked mod 2^8 */
+        vpandd    .L_2il0floatpacket.22(%rip), %zmm12, %zmm5
+
+/*
+ * Now multiply those numbers all by 2 pi, reasonably accurately.
+ * (RHi + RLo) * (pi_lead + pi_trail) ~=
+ * RHi * pi_lead + (RHi * pi_trail + RLo * pi_lead)
+ */
+        vmovups   .L_2il0floatpacket.27(%rip), %zmm12
+        vmulps    {rn-sae}, %zmm12, %zmm13, %zmm0
+        vmovaps   %zmm12, %zmm9
+        vfmsub213ps {rn-sae}, %zmm0, %zmm13, %zmm9
+        vfmadd213ps {rn-sae}, %zmm9, %zmm8, %zmm13
+        vmovaps   %zmm6, %zmm8
+        vfmadd213ps {rn-sae}, %zmm13, %zmm12, %zmm1
+        vpandnd   %zmm15, %zmm15, %zmm8{%k3}
+        vpandnd   %zmm15, %zmm15, %zmm6{%k2}
+        vandps    %zmm11, %zmm6, %zmm14
+        vandps    %zmm0, %zmm8, %zmm15
+        vandps    %zmm1, %zmm8, %zmm12
+        vorps     %zmm15, %zmm14, %zmm6
+        vpsrld    $31, %zmm6, %zmm3
+        vpsubd    %zmm3, %zmm2, %zmm4
+        vpaddd    %zmm4, %zmm5, %zmm7
+        vpsrld    $2, %zmm7, %zmm13
+        vpslld    $2, %zmm13, %zmm9
+
+/*
+ * ----------------------------------------------------------
+ * End of large arguments path
+ * ----------------------------------------------------------
+ * Merge results from main and large paths:
+ */
+        vblendmps %zmm13, %zmm10, %zmm10{%k1}
+        vpsubd    %zmm9, %zmm5, %zmm5
+        vmovups   .L_2il0floatpacket.32(%rip), %zmm9
+        vcvtdq2ps {rn-sae}, %zmm5, %zmm0
+        vmovups   .L_2il0floatpacket.33(%rip), %zmm5
+        vfmadd231ps {rn-sae}, %zmm0, %zmm5, %zmm12
+        vmovups   (%rsp), %zmm5
+        vaddps    {rn-sae}, %zmm6, %zmm12, %zmm6
+        vfmadd213ps {rn-sae}, %zmm6, %zmm9, %zmm0
+        vblendmps %zmm0, %zmm5, %zmm5{%k1}
+        jmp       .LBL_1_2
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_tanf16,@function
+       .size   __svml_tanf16,.-__svml_tanf16
+..LN__svml_tanf16.0:
+
+.L_2__routine_start___svml_stan_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_stan_cout_rare_internal:
+
+
+       .cfi_startproc
+..L63:
+
+        xorl      %eax, %eax
+        movl      (%rdi), %edx
+        movzwl    2(%rdi), %ecx
+        movl      %edx, -8(%rsp)
+        andl      $32640, %ecx
+        shrl      $24, %edx
+        andl      $127, %edx
+        movb      %dl, -5(%rsp)
+        cmpl      $32640, %ecx
+        je        .LBL_2_3
+
+
+        ret
+
+.LBL_2_3:
+
+        cmpl      $2139095040, -8(%rsp)
+        jne       .LBL_2_5
+
+
+        movss     (%rdi), %xmm0
+        movl      $1, %eax
+        mulss     __stan_la__vmlsTanTab(%rip), %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+
+.LBL_2_5:
+
+        movss     (%rdi), %xmm0
+        mulss     (%rdi), %xmm0
+        movss     %xmm0, (%rsi)
+        ret
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_stan_cout_rare_internal,@function
+       .size   __svml_stan_cout_rare_internal,.-__svml_stan_cout_rare_internal
+..LN__svml_stan_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+.L_2il0floatpacket.15:
+       .long   0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000,0x7f800000
+       .type   .L_2il0floatpacket.15,@object
+       .size   .L_2il0floatpacket.15,64
+       .align 64
+.L_2il0floatpacket.16:
+       .long   0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff,0x007fffff
+       .type   .L_2il0floatpacket.16,@object
+       .size   .L_2il0floatpacket.16,64
+       .align 64
+.L_2il0floatpacket.17:
+       .long   0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000,0x00800000
+       .type   .L_2il0floatpacket.17,@object
+       .size   .L_2il0floatpacket.17,64
+       .align 64
+.L_2il0floatpacket.18:
+       .long   0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff,0x0000ffff
+       .type   .L_2il0floatpacket.18,@object
+       .size   .L_2il0floatpacket.18,64
+       .align 64
+.L_2il0floatpacket.19:
+       .long   0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000
+       .type   .L_2il0floatpacket.19,@object
+       .size   .L_2il0floatpacket.19,64
+       .align 64
+.L_2il0floatpacket.20:
+       .long   0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000,0x3f800000
+       .type   .L_2il0floatpacket.20,@object
+       .size   .L_2il0floatpacket.20,64
+       .align 64
+.L_2il0floatpacket.21:
+       .long   0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000,0x47400000
+       .type   .L_2il0floatpacket.21,@object
+       .size   .L_2il0floatpacket.21,64
+       .align 64
+.L_2il0floatpacket.22:
+       .long   0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff,0x000000ff
+       .type   .L_2il0floatpacket.22,@object
+       .size   .L_2il0floatpacket.22,64
+       .align 64
+.L_2il0floatpacket.23:
+       .long   0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000,0x28800000
+       .type   .L_2il0floatpacket.23,@object
+       .size   .L_2il0floatpacket.23,64
+       .align 64
+.L_2il0floatpacket.24:
+       .long   0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff,0x0003ffff
+       .type   .L_2il0floatpacket.24,@object
+       .size   .L_2il0floatpacket.24,64
+       .align 64
+.L_2il0floatpacket.25:
+       .long   0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000,0x34000000
+       .type   .L_2il0floatpacket.25,@object
+       .size   .L_2il0floatpacket.25,64
+       .align 64
+.L_2il0floatpacket.26:
+       .long   0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff,0x000001ff
+       .type   .L_2il0floatpacket.26,@object
+       .size   .L_2il0floatpacket.26,64
+       .align 64
+.L_2il0floatpacket.27:
+       .long   0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb,0x40c90fdb
+       .type   .L_2il0floatpacket.27,@object
+       .size   .L_2il0floatpacket.27,64
+       .align 64
+.L_2il0floatpacket.28:
+       .long   0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e,0xb43bbd2e
+       .type   .L_2il0floatpacket.28,@object
+       .size   .L_2il0floatpacket.28,64
+       .align 64
+.L_2il0floatpacket.29:
+       .long   0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff,0x7fffffff
+       .type   .L_2il0floatpacket.29,@object
+       .size   .L_2il0floatpacket.29,64
+       .align 64
+.L_2il0floatpacket.30:
+       .long   0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000,0x35800000
+       .type   .L_2il0floatpacket.30,@object
+       .size   .L_2il0floatpacket.30,64
+       .align 64
+.L_2il0floatpacket.31:
+       .long   0x00000002,0x00000002,0x00000002,0x00000002,0x00000002,0x00000002,0x00000002,0x00000002,0x00000002,0x00000002,0x00000002,0x00000002,0x00000002,0x00000002,0x00000002,0x00000002
+       .type   .L_2il0floatpacket.31,@object
+       .size   .L_2il0floatpacket.31,64
+       .align 64
+.L_2il0floatpacket.32:
+       .long   0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb,0x3cc90fdb
+       .type   .L_2il0floatpacket.32,@object
+       .size   .L_2il0floatpacket.32,64
+       .align 64
+.L_2il0floatpacket.33:
+       .long   0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e,0xb03bbd2e
+       .type   .L_2il0floatpacket.33,@object
+       .size   .L_2il0floatpacket.33,64
+       .align 64
+__svml_stan_data_internal:
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1092811139
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   1036586970
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   832708968
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   633484485
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   832708608
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   708075802
+       .long   2147483648
+       .long   1036629468
+       .long   1045147567
+       .long   1050366018
+       .long   1054086093
+       .long   1057543609
+       .long   1059786177
+       .long   1062344705
+       .long   1065353216
+       .long   1067186156
+       .long   1069519047
+       .long   1072658590
+       .long   1075479162
+       .long   1079179983
+       .long   1084284919
+       .long   1092776803
+       .long   4286578687
+       .long   3240260451
+       .long   3231768567
+       .long   3226663631
+       .long   3222962810
+       .long   3220142238
+       .long   3217002695
+       .long   3214669804
+       .long   3212836864
+       .long   3209828353
+       .long   3207269825
+       .long   3205027257
+       .long   3201569741
+       .long   3197849666
+       .long   3192631215
+       .long   3184113116
+       .long   2147483648
+       .long   826651354
+       .long   791306928
+       .long   2989111746
+       .long   2982175258
+       .long   2992568675
+       .long   850100121
+       .long   850281093
+       .long   0
+       .long   861435400
+       .long   840342808
+       .long   3003924160
+       .long   3016492578
+       .long   865099790
+       .long   856723932
+       .long   3025444934
+       .long   4085252096
+       .long   877961286
+       .long   3004207580
+       .long   3012583438
+       .long   869008930
+       .long   856440512
+       .long   2987826456
+       .long   3008919048
+       .long   0
+       .long   2997764741
+       .long   2997583769
+       .long   845085027
+       .long   834691610
+       .long   841628098
+       .long   2938790576
+       .long   2974135002
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1051372198
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1040758920
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   1059256707
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   2139095040
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1262485504
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1065353216
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1174470656
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   1070137344
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   972922880
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   866263040
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   741630234
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   1070141403
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   3007036718
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   2801216749
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   3183752116
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   1065353212
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   3202070443
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1008677739
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1073741824
+       .long   1070141403
+       .long   3007036718
+       .long   0
+       .long   0
+       .long   0
+       .long   1065353216
+       .long   0
+       .long   0
+       .long   1051372765
+       .long   0
+       .long   1069935515
+       .long   853435276
+       .long   0
+       .long   1019812401
+       .long   797871386
+       .long   1065353216
+       .long   975043072
+       .long   1019820333
+       .long   1051400329
+       .long   1015569723
+       .long   1069729628
+       .long   2999697034
+       .long   0
+       .long   1028208956
+       .long   816029531
+       .long   1065353216
+       .long   991832832
+       .long   1028240852
+       .long   1051479824
+       .long   1023251493
+       .long   1069523740
+       .long   860164016
+       .long   0
+       .long   1033310670
+       .long   827321128
+       .long   1065353216
+       .long   1001540608
+       .long   1033364538
+       .long   1051617929
+       .long   1028458464
+       .long   1069317853
+       .long   2977958621
+       .long   0
+       .long   1036629468
+       .long   826649990
+       .long   1065353216
+       .long   1008660256
+       .long   1036757738
+       .long   1051807326
+       .long   1032162226
+       .long   1069111966
+       .long   3009745511
+       .long   0
+       .long   1039964354
+       .long   2964214364
+       .long   1065353216
+       .long   1014578464
+       .long   1040201797
+       .long   1052059423
+       .long   1034708638
+       .long   1068906078
+       .long   848017692
+       .long   0
+       .long   1041753444
+       .long   2982519524
+       .long   1065353216
+       .long   1018446032
+       .long   1041972480
+       .long   1052374628
+       .long   1037453248
+       .long   1068700191
+       .long   3004118141
+       .long   0
+       .long   1043443277
+       .long   2985501265
+       .long   1065353216
+       .long   1022797056
+       .long   1043793882
+       .long   1052746889
+       .long   1039915463
+       .long   1068494303
+       .long   857455223
+       .long   0
+       .long   1045147567
+       .long   791292384
+       .long   1065353216
+       .long   1025642520
+       .long   1045675728
+       .long   1053195814
+       .long   1041590498
+       .long   1068288416
+       .long   2992986704
+       .long   0
+       .long   1046868583
+       .long   833925599
+       .long   1065353216
+       .long   1028557712
+       .long   1047628490
+       .long   1053716836
+       .long   1043186017
+       .long   1068082528
+       .long   863082593
+       .long   0
+       .long   1048592340
+       .long   2988940902
+       .long   1065353216
+       .long   1031831496
+       .long   1049119700
+       .long   1054310701
+       .long   1044788971
+       .long   1067876641
+       .long   837040812
+       .long   0
+       .long   1049473154
+       .long   2972885556
+       .long   1065353216
+       .long   1033689040
+       .long   1050184288
+       .long   1054999523
+       .long   1046698028
+       .long   1067670754
+       .long   3006826934
+       .long   0
+       .long   1050366018
+       .long   2989112046
+       .long   1065353216
+       .long   1035760784
+       .long   1051302645
+       .long   1055777031
+       .long   1048635818
+       .long   1067464866
+       .long   853854846
+       .long   0
+       .long   1051272279
+       .long   817367088
+       .long   1065353216
+       .long   1038057984
+       .long   1052482025
+       .long   1056656040
+       .long   1049723582
+       .long   1067258979
+       .long   2999277465
+       .long   0
+       .long   1052193360
+       .long   2986510371
+       .long   1065353216
+       .long   1040390392
+       .long   1053730424
+       .long   1057307751
+       .long   1050943059
+       .long   1067053091
+       .long   860373800
+       .long   0
+       .long   1053130765
+       .long   2987705281
+       .long   1065353216
+       .long   1041784404
+       .long   1055056706
+       .long   1057868403
+       .long   1052298273
+       .long   1066847204
+       .long   2974604846
+       .long   0
+       .long   1054086093
+       .long   2982175058
+       .long   1065353216
+       .long   1043312844
+       .long   1056470731
+       .long   1058502663
+       .long   1053852727
+       .long   1066641317
+       .long   3009535726
+       .long   0
+       .long   1055061049
+       .long   2985572766
+       .long   1065353216
+       .long   1044984860
+       .long   1057474074
+       .long   1059214863
+       .long   1055565854
+       .long   1066435429
+       .long   848437261
+       .long   0
+       .long   1056057456
+       .long   844263924
+       .long   1065353216
+       .long   1046810746
+       .long   1058286064
+       .long   1060014844
+       .long   1057227928
+       .long   1066229542
+       .long   3003908357
+       .long   0
+       .long   1057020941
+       .long   2987700082
+       .long   1065353216
+       .long   1048689044
+       .long   1059160627
+       .long   1060914481
+       .long   1058313864
+       .long   1066023654
+       .long   857665008
+       .long   0
+       .long   1057543609
+       .long   2992568718
+       .long   1065353216
+       .long   1049773965
+       .long   1060105673
+       .long   1061932376
+       .long   1059565214
+       .long   1065817767
+       .long   2992147565
+       .long   0
+       .long   1058080175
+       .long   854607280
+       .long   1065353216
+       .long   1050955490
+       .long   1061130203
+       .long   1063075792
+       .long   1060964899
+       .long   1065611879
+       .long   863292377
+       .long   0
+       .long   1058631876
+       .long   848316488
+       .long   1065353216
+       .long   1052241912
+       .long   1062244476
+       .long   1064374250
+       .long   1062608877
+       .long   1065405992
+       .long   838719090
+       .long   0
+       .long   1059200055
+       .long   2987155932
+       .long   1065353216
+       .long   1053642609
+       .long   1063460266
+       .long   1065596017
+       .long   1064468970
+       .long   1065046993
+       .long   848647046
+       .long   0
+       .long   1059786177
+       .long   850099898
+       .long   1065353216
+       .long   1055168194
+       .long   1064791104
+       .long   1066427841
+       .long   1065988022
+       .long   1064635218
+       .long   854274415
+       .long   0
+       .long   1060391849
+       .long   2998448362
+       .long   1065353216
+       .long   1056830711
+       .long   1065802920
+       .long   1067373883
+       .long   1067237086
+       .long   1064223444
+       .long   2998857895
+       .long   0
+       .long   1061018831
+       .long   852661766
+       .long   1073741824
+       .long   3202769007
+       .long   1066608086
+       .long   1068453481
+       .long   1068697612
+       .long   1063811669
+       .long   2991727995
+       .long   0
+       .long   1061669068
+       .long   2986407194
+       .long   1073741824
+       .long   3200789612
+       .long   1067498217
+       .long   1069688111
+       .long   1070408903
+       .long   1063399894
+       .long   2971248290
+       .long   0
+       .long   1062344705
+       .long   850280824
+       .long   1073741824
+       .long   3198626104
+       .long   1068485666
+       .long   1071103306
+       .long   1072410651
+       .long   1062988119
+       .long   839209514
+       .long   0
+       .long   1063048126
+       .long   826671880
+       .long   1073741824
+       .long   3196257989
+       .long   1069584946
+       .long   1072731698
+       .long   1074256640
+       .long   1062576344
+       .long   848856831
+       .long   0
+       .long   1063781982
+       .long   845614362
+       .long   1073741824
+       .long   3191263702
+       .long   1070813191
+       .long   1074178145
+       .long   1075661786
+       .long   1062164569
+       .long   854484200
+       .long   0
+       .long   1064549237
+       .long   855412877
+       .long   1073741824
+       .long   3183449264
+       .long   1072190735
+       .long   1075269479
+       .long   1077331464
+       .long   1061752795
+       .long   2998648110
+       .long   1065353216
+       .long   3196839438
+       .long   839748996
+       .long   1056964608
+       .long   3187152817
+       .long   3179496939
+       .long   1025375660
+       .long   3159543663
+       .long   1061341020
+       .long   2991308426
+       .long   1065353216
+       .long   3196528703
+       .long   2993207654
+       .long   1056964608
+       .long   3187565865
+       .long   3178961235
+       .long   1025040649
+       .long   3158667440
+       .long   1060929245
+       .long   2969570013
+       .long   1065353216
+       .long   3196220448
+       .long   839617357
+       .long   1048576000
+       .long   1039897640
+       .long   3178234548
+       .long   1024731756
+       .long   3157936127
+       .long   1060517470
+       .long   839629084
+       .long   1065353216
+       .long   3195769474
+       .long   2972943314
+       .long   1048576000
+       .long   1039520273
+       .long   3177530035
+       .long   1024452069
+       .long   3157392148
+       .long   1060105695
+       .long   849066615
+       .long   1065353216
+       .long   3195162227
+       .long   824230882
+       .long   1048576000
+       .long   1039159939
+       .long   3176846430
+       .long   1024176063
+       .long   3156719803
+       .long   1059693920
+       .long   854693985
+       .long   1065353216
+       .long   3194559300
+       .long   837912886
+       .long   1048576000
+       .long   1038816139
+       .long   3176182519
+       .long   1023917626
+       .long   3156100775
+       .long   1059282146
+       .long   2998438326
+       .long   1065353216
+       .long   3193960492
+       .long   2976936506
+       .long   1048576000
+       .long   1038488404
+       .long   3175537158
+       .long   1023672824
+       .long   3155484691
+       .long   1058870371
+       .long   2990888857
+       .long   1065353216
+       .long   3193365611
+       .long   837021697
+       .long   1048576000
+       .long   1038176293
+       .long   3174909264
+       .long   1023428141
+       .long   3154717848
+       .long   1058458596
+       .long   2966216238
+       .long   1065353216
+       .long   3192774465
+       .long   2981011604
+       .long   1048576000
+       .long   1037879388
+       .long   3174297790
+       .long   1023026096
+       .long   3154246903
+       .long   1058046821
+       .long   840048653
+       .long   1065353216
+       .long   3192186872
+       .long   2982847435
+       .long   1048576000
+       .long   1037597300
+       .long   3173701765
+       .long   1022609285
+       .long   3153191752
+       .long   1057635046
+       .long   849276400
+       .long   1065353216
+       .long   3191602652
+       .long   2972865050
+       .long   1048576000
+       .long   1037329660
+       .long   3173120241
+       .long   1022242934
+       .long   3152466531
+       .long   1057223271
+       .long   854903769
+       .long   1065353216
+       .long   3191021630
+       .long   838792638
+       .long   1048576000
+       .long   1037076124
+       .long   3172552332
+       .long   1021893801
+       .long   3151682133
+       .long   1056658385
+       .long   840258438
+       .long   1065353216
+       .long   3190443633
+       .long   2979855596
+       .long   1048576000
+       .long   1036836369
+       .long   3171997189
+       .long   1021543079
+       .long   3150495127
+       .long   1055834836
+       .long   2990469287
+       .long   1065353216
+       .long   3189868496
+       .long   2981611511
+       .long   1048576000
+       .long   1036610091
+       .long   3171453986
+       .long   1021220110
+       .long   3149437649
+       .long   1055011286
+       .long   2962859682
+       .long   1065353216
+       .long   3189296055
+       .long   2950857776
+       .long   1048576000
+       .long   1036397006
+       .long   3170921933
+       .long   1020942892
+       .long   3148919762
+       .long   1054187736
+       .long   840468223
+       .long   1065353216
+       .long   3188726149
+       .long   2955915960
+       .long   1048576000
+       .long   1036196851
+       .long   3169906765
+       .long   1020660679
+       .long   3147905210
+       .long   1053364187
+       .long   2990259502
+       .long   1065353216
+       .long   3188158621
+       .long   2978622083
+       .long   1048576000
+       .long   1036009378
+       .long   3168882838
+       .long   1020421234
+       .long   3147436656
+       .long   1052540637
+       .long   2961181405
+       .long   1065353216
+       .long   3187515595
+       .long   789904544
+       .long   1048576000
+       .long   1035834359
+       .long   3167876891
+       .long   1020189995
+       .long   3146799430
+       .long   1051717087
+       .long   840678007
+       .long   1065353216
+       .long   3186389132
+       .long   2974324164
+       .long   1048576000
+       .long   1035671582
+       .long   3166887590
+       .long   1019957287
+       .long   3145677161
+       .long   1050893538
+       .long   2990049718
+       .long   1065353216
+       .long   3185266517
+       .long   821445502
+       .long   1048576000
+       .long   1035520850
+       .long   3165913616
+       .long   1019751749
+       .long   3143905397
+       .long   1050069988
+       .long   2957827630
+       .long   1065353216
+       .long   3184147455
+       .long   823956970
+       .long   1048576000
+       .long   1035381982
+       .long   3164953691
+       .long   1019591684
+       .long   3143870825
+       .long   1049246438
+       .long   840887792
+       .long   1065353216
+       .long   3183031657
+       .long   2948197632
+       .long   1048576000
+       .long   1035254815
+       .long   3164006661
+       .long   1019406069
+       .long   3141406886
+       .long   1048269777
+       .long   831869830
+       .long   1065353216
+       .long   3181918839
+       .long   829265530
+       .long   1048576000
+       .long   1035139196
+       .long   3163071263
+       .long   1019275107
+       .long   3141473894
+       .long   1046622678
+       .long   2954471074
+       .long   1065353216
+       .long   3180808717
+       .long   2974758491
+       .long   1048576000
+       .long   1035034991
+       .long   3161787608
+       .long   1019131285
+       .long   3139614851
+       .long   1044975579
+       .long   2981870894
+       .long   1065353216
+       .long   3179701015
+       .long   2951749952
+       .long   1048576000
+       .long   1034942077
+       .long   3159956688
+       .long   1019002541
+       .long   3137649644
+       .long   1043328479
+       .long   832289399
+       .long   1065353216
+       .long   3177908479
+       .long   2968441398
+       .long   1048576000
+       .long   1034860345
+       .long   3158142289
+       .long   1018906717
+       .long   3137336762
+       .long   1041681380
+       .long   2949439022
+       .long   1065353216
+       .long   3175701100
+       .long   2963548093
+       .long   1048576000
+       .long   1034789701
+       .long   3156342344
+       .long   1018810804
+       .long   3133887847
+       .long   1039881169
+       .long   823481222
+       .long   1065353216
+       .long   3173496918
+       .long   2969038481
+       .long   1048576000
+       .long   1034730062
+       .long   3154554595
+       .long   1018750428
+       .long   3136028910
+       .long   1036586971
+       .long   2973482286
+       .long   1065353216
+       .long   3171295395
+       .long   2968300352
+       .long   1048576000
+       .long   1034681361
+       .long   3151437839
+       .long   1018664053
+       .long   3123383004
+       .long   1033292772
+       .long   2941050414
+       .long   1065353216
+       .long   3167298168
+       .long   808398440
+       .long   1048576000
+       .long   1034643540
+       .long   3147899215
+       .long   1018610153
+       .long   943964915
+       .long   1028198363
+       .long   2965093678
+       .long   1065353216
+       .long   3162902549
+       .long   2950073902
+       .long   1048576000
+       .long   1034616555
+       .long   3143016255
+       .long   1018603598
+       .long   3133555092
+       .long   1019809755
+       .long   2956705070
+       .long   1065353216
+       .long   3154512883
+       .long   803361198
+       .long   1048576000
+       .long   1034600377
+       .long   3134618720
+       .long   1018580133
+       .long   3134056577
+       .long   0
+       .long   0
+       .long   1065353216
+       .long   0
+       .long   0
+       .long   1048576000
+       .long   1034594987
+       .long   0
+       .long   1018552971
+       .long   0
+       .long   3167293403
+       .long   809221422
+       .long   1065353216
+       .long   1007029235
+       .long   2950844846
+       .long   1048576000
+       .long   1034600377
+       .long   987135072
+       .long   1018580133
+       .long   986572929
+       .long   3175682011
+       .long   817610030
+       .long   1065353216
+       .long   1015418901
+       .long   802590254
+       .long   1048576000
+       .long   1034616555
+       .long   995532607
+       .long   1018603598
+       .long   986071444
+       .long   3180776420
+       .long   793566766
+       .long   1065353216
+       .long   1019814520
+       .long   2955882088
+       .long   1048576000
+       .long   1034643540
+       .long   1000415567
+       .long   1018610153
+       .long   3091448562
+       .long   3184070619
+       .long   825998638
+       .long   1065353216
+       .long   1023811747
+       .long   820816704
+       .long   1048576000
+       .long   1034681361
+       .long   1003954191
+       .long   1018664053
+       .long   975899356
+       .long   3187364817
+       .long   2970964870
+       .long   1065353216
+       .long   1026013270
+       .long   821554833
+       .long   1048576000
+       .long   1034730062
+       .long   1007070947
+       .long   1018750428
+       .long   988545262
+       .long   3189165028
+       .long   801955374
+       .long   1065353216
+       .long   1028217452
+       .long   816064445
+       .long   1048576000
+       .long   1034789701
+       .long   1008858696
+       .long   1018810804
+       .long   986404199
+       .long   3190812127
+       .long   2979773047
+       .long   1065353216
+       .long   1030424831
+       .long   820957750
+       .long   1048576000
+       .long   1034860345
+       .long   1010658641
+       .long   1018906717
+       .long   989853114
+       .long   3192459227
+       .long   834387246
+       .long   1065353216
+       .long   1032217367
+       .long   804266304
+       .long   1048576000
+       .long   1034942077
+       .long   1012473040
+       .long   1019002541
+       .long   990165996
+       .long   3194106326
+       .long   806987426
+       .long   1065353216
+       .long   1033325069
+       .long   827274843
+       .long   1048576000
+       .long   1035034991
+       .long   1014303960
+       .long   1019131285
+       .long   992131203
+       .long   3195753425
+       .long   2979353478
+       .long   1065353216
+       .long   1034435191
+       .long   2976749178
+       .long   1048576000
+       .long   1035139196
+       .long   1015587615
+       .long   1019275107
+       .long   993990246
+       .long   3196730086
+       .long   2988371440
+       .long   1065353216
+       .long   1035548009
+       .long   800713984
+       .long   1048576000
+       .long   1035254815
+       .long   1016523013
+       .long   1019406069
+       .long   993923238
+       .long   3197553636
+       .long   810343982
+       .long   1065353216
+       .long   1036663807
+       .long   2971440618
+       .long   1048576000
+       .long   1035381982
+       .long   1017470043
+       .long   1019591684
+       .long   996387177
+       .long   3198377186
+       .long   842566070
+       .long   1065353216
+       .long   1037782869
+       .long   2968929150
+       .long   1048576000
+       .long   1035520850
+       .long   1018429968
+       .long   1019751749
+       .long   996421749
+       .long   3199200735
+       .long   2988161655
+       .long   1065353216
+       .long   1038905484
+       .long   826840516
+       .long   1048576000
+       .long   1035671582
+       .long   1019403942
+       .long   1019957287
+       .long   998193513
+       .long   3200024285
+       .long   813697757
+       .long   1065353216
+       .long   1040031947
+       .long   2937388192
+       .long   1048576000
+       .long   1035834359
+       .long   1020393243
+       .long   1020189995
+       .long   999315782
+       .long   3200847835
+       .long   842775854
+       .long   1065353216
+       .long   1040674973
+       .long   831138435
+       .long   1048576000
+       .long   1036009378
+       .long   1021399190
+       .long   1020421234
+       .long   999953008
+       .long   3201671384
+       .long   2987951871
+       .long   1065353216
+       .long   1041242501
+       .long   808432312
+       .long   1048576000
+       .long   1036196851
+       .long   1022423117
+       .long   1020660679
+       .long   1000421562
+       .long   3202494934
+       .long   815376034
+       .long   1065353216
+       .long   1041812407
+       .long   803374128
+       .long   1048576000
+       .long   1036397006
+       .long   1023438285
+       .long   1020942892
+       .long   1001436114
+       .long   3203318484
+       .long   842985639
+       .long   1065353216
+       .long   1042384848
+       .long   834127863
+       .long   1048576000
+       .long   1036610091
+       .long   1023970338
+       .long   1021220110
+       .long   1001954001
+       .long   3204142033
+       .long   2987742086
+       .long   1065353216
+       .long   1042959985
+       .long   832371948
+       .long   1048576000
+       .long   1036836369
+       .long   1024513541
+       .long   1021543079
+       .long   1003011479
+       .long   3204706919
+       .long   3002387417
+       .long   1065353216
+       .long   1043537982
+       .long   2986276286
+       .long   1048576000
+       .long   1037076124
+       .long   1025068684
+       .long   1021893801
+       .long   1004198485
+       .long   3205118694
+       .long   2996760048
+       .long   1065353216
+       .long   1044119004
+       .long   825381402
+       .long   1048576000
+       .long   1037329660
+       .long   1025636593
+       .long   1022242934
+       .long   1004982883
+       .long   3205530469
+       .long   2987532301
+       .long   1065353216
+       .long   1044703224
+       .long   835363787
+       .long   1048576000
+       .long   1037597300
+       .long   1026218117
+       .long   1022609285
+       .long   1005708104
+       .long   3205942244
+       .long   818732590
+       .long   1065353216
+       .long   1045290817
+       .long   833527956
+       .long   1048576000
+       .long   1037879388
+       .long   1026814142
+       .long   1023026096
+       .long   1006763255
+       .long   3206354019
+       .long   843405209
+       .long   1065353216
+       .long   1045881963
+       .long   2984505345
+       .long   1048576000
+       .long   1038176293
+       .long   1027425616
+       .long   1023428141
+       .long   1007234200
+       .long   3206765794
+       .long   850954678
+       .long   1065353216
+       .long   1046476844
+       .long   829452858
+       .long   1048576000
+       .long   1038488404
+       .long   1028053510
+       .long   1023672824
+       .long   1008001043
+       .long   3207177568
+       .long   3002177633
+       .long   1065353216
+       .long   1047075652
+       .long   2985396534
+       .long   1048576000
+       .long   1038816139
+       .long   1028698871
+       .long   1023917626
+       .long   1008617127
+       .long   3207589343
+       .long   2996550263
+       .long   1065353216
+       .long   1047678579
+       .long   2971714530
+       .long   1048576000
+       .long   1039159939
+       .long   1029362782
+       .long   1024176063
+       .long   1009236155
+       .long   3208001118
+       .long   2987112732
+       .long   1065353216
+       .long   1048285826
+       .long   825459666
+       .long   1048576000
+       .long   1039520273
+       .long   1030046387
+       .long   1024452069
+       .long   1009908500
+       .long   3208412893
+       .long   822086365
+       .long   1065353216
+       .long   1048736800
+       .long   2987101005
+       .long   1048576000
+       .long   1039897640
+       .long   1030750900
+       .long   1024731756
+       .long   1010452479
+       .long   3208824668
+       .long   843824778
+       .long   1065353216
+       .long   1049045055
+       .long   845724006
+       .long   1056964608
+       .long   3187565865
+       .long   1031477587
+       .long   1025040649
+       .long   1011183792
+       .long   3209236443
+       .long   851164462
+       .long   0
+       .long   3212836864
+       .long   725680128
+       .long   1073741824
+       .long   3003121664
+       .long   3221225472
+       .long   1076541384
+       .long   3226821083
+       .long   3209648217
+       .long   3001967848
+       .long   0
+       .long   3212032885
+       .long   3002896525
+       .long   1073741824
+       .long   3183449264
+       .long   3219674383
+       .long   1075269479
+       .long   3224815112
+       .long   3210059992
+       .long   2996340479
+       .long   0
+       .long   3211265630
+       .long   2993098010
+       .long   1073741824
+       .long   3191263702
+       .long   3218296839
+       .long   1074178145
+       .long   3223145434
+       .long   3210471767
+       .long   2986693162
+       .long   0
+       .long   3210531774
+       .long   2974155528
+       .long   1073741824
+       .long   3196257989
+       .long   3217068594
+       .long   1072731698
+       .long   3221740288
+       .long   3210883542
+       .long   823764642
+       .long   0
+       .long   3209828353
+       .long   2997764472
+       .long   1073741824
+       .long   3198626104
+       .long   3215969314
+       .long   1071103306
+       .long   3219894299
+       .long   3211295317
+       .long   844244347
+       .long   0
+       .long   3209152716
+       .long   838923546
+       .long   1073741824
+       .long   3200789612
+       .long   3214981865
+       .long   1069688111
+       .long   3217892551
+       .long   3211707092
+       .long   851374247
+       .long   0
+       .long   3208502479
+       .long   3000145414
+       .long   1073741824
+       .long   3202769007
+       .long   3214091734
+       .long   1068453481
+       .long   3216181260
+       .long   3212118866
+       .long   3001758063
+       .long   0
+       .long   3207875497
+       .long   850964714
+       .long   1065353216
+       .long   1056830711
+       .long   3213286568
+       .long   1067373883
+       .long   3214720734
+       .long   3212530641
+       .long   2996130694
+       .long   0
+       .long   3207269825
+       .long   2997583546
+       .long   1065353216
+       .long   1055168194
+       .long   3212274752
+       .long   1066427841
+       .long   3213471670
+       .long   3212889640
+       .long   2986202738
+       .long   0
+       .long   3206683703
+       .long   839672284
+       .long   1065353216
+       .long   1053642609
+       .long   3210943914
+       .long   1065596017
+       .long   3211952618
+       .long   3213095527
+       .long   3010776025
+       .long   0
+       .long   3206115524
+       .long   2995800136
+       .long   1065353216
+       .long   1052241912
+       .long   3209728124
+       .long   1064374250
+       .long   3210092525
+       .long   3213301415
+       .long   844663917
+       .long   0
+       .long   3205563823
+       .long   3002090928
+       .long   1065353216
+       .long   1050955490
+       .long   3208613851
+       .long   1063075792
+       .long   3208448547
+       .long   3213507302
+       .long   3005148656
+       .long   0
+       .long   3205027257
+       .long   845085070
+       .long   1065353216
+       .long   1049773965
+       .long   3207589321
+       .long   1061932376
+       .long   3207048862
+       .long   3213713190
+       .long   856424709
+       .long   0
+       .long   3204504589
+       .long   840216434
+       .long   1065353216
+       .long   1048689044
+       .long   3206644275
+       .long   1060914481
+       .long   3205797512
+       .long   3213919077
+       .long   2995920909
+       .long   0
+       .long   3203541104
+       .long   2991747572
+       .long   1065353216
+       .long   1046810746
+       .long   3205769712
+       .long   1060014844
+       .long   3204711576
+       .long   3214124965
+       .long   862052078
+       .long   0
+       .long   3202544697
+       .long   838089118
+       .long   1065353216
+       .long   1044984860
+       .long   3204957722
+       .long   1059214863
+       .long   3203049502
+       .long   3214330852
+       .long   827121198
+       .long   0
+       .long   3201569741
+       .long   834691410
+       .long   1065353216
+       .long   1043312844
+       .long   3203954379
+       .long   1058502663
+       .long   3201336375
+       .long   3214536739
+       .long   3007857448
+       .long   0
+       .long   3200614413
+       .long   840221633
+       .long   1065353216
+       .long   1041784404
+       .long   3202540354
+       .long   1057868403
+       .long   3199781921
+       .long   3214742627
+       .long   851793817
+       .long   0
+       .long   3199677008
+       .long   839026723
+       .long   1065353216
+       .long   1040390392
+       .long   3201214072
+       .long   1057307751
+       .long   3198426707
+       .long   3214948514
+       .long   3001338494
+       .long   0
+       .long   3198755927
+       .long   2964850736
+       .long   1065353216
+       .long   1038057984
+       .long   3199965673
+       .long   1056656040
+       .long   3197207230
+       .long   3215154402
+       .long   859343286
+       .long   0
+       .long   3197849666
+       .long   841628398
+       .long   1065353216
+       .long   1035760784
+       .long   3198786293
+       .long   1055777031
+       .long   3196119466
+       .long   3215360289
+       .long   2984524460
+       .long   0
+       .long   3196956802
+       .long   825401908
+       .long   1065353216
+       .long   1033689040
+       .long   3197667936
+       .long   1054999523
+       .long   3194181676
+       .long   3215566176
+       .long   3010566241
+       .long   0
+       .long   3196075988
+       .long   841457254
+       .long   1065353216
+       .long   1031831496
+       .long   3196603348
+       .long   1054310701
+       .long   3192272619
+       .long   3215772064
+       .long   845503056
+       .long   0
+       .long   3194352231
+       .long   2981409247
+       .long   1065353216
+       .long   1028557712
+       .long   3195112138
+       .long   1053716836
+       .long   3190669665
+       .long   3215977951
+       .long   3004938871
+       .long   0
+       .long   3192631215
+       .long   2938776032
+       .long   1065353216
+       .long   1025642520
+       .long   3193159376
+       .long   1053195814
+       .long   3189074146
+       .long   3216183839
+       .long   856634493
+       .long   0
+       .long   3190926925
+       .long   838017617
+       .long   1065353216
+       .long   1022797056
+       .long   3191277530
+       .long   1052746889
+       .long   3187399111
+       .long   3216389726
+       .long   2995501340
+       .long   0
+       .long   3189237092
+       .long   835035876
+       .long   1065353216
+       .long   1018446032
+       .long   3189456128
+       .long   1052374628
+       .long   3184936896
+       .long   3216595614
+       .long   862261863
+       .long   0
+       .long   3187448002
+       .long   816730716
+       .long   1065353216
+       .long   1014578464
+       .long   3187685445
+       .long   1052059423
+       .long   3182192286
+       .long   3216801501
+       .long   830474973
+       .long   0
+       .long   3184113116
+       .long   2974133638
+       .long   1065353216
+       .long   1008660256
+       .long   3184241386
+       .long   1051807326
+       .long   3179645874
+       .long   3217007388
+       .long   3007647664
+       .long   0
+       .long   3180794318
+       .long   2974804776
+       .long   1065353216
+       .long   1001540608
+       .long   3180848186
+       .long   1051617929
+       .long   3175942112
+       .long   3217213276
+       .long   852213386
+       .long   0
+       .long   3175692604
+       .long   2963513179
+       .long   1065353216
+       .long   991832832
+       .long   3175724500
+       .long   1051479824
+       .long   3170735141
+       .long   3217419163
+       .long   3000918924
+       .long   0
+       .long   3167296049
+       .long   2945355034
+       .long   1065353216
+       .long   975043072
+       .long   3167303981
+       .long   1051400329
+       .long   3163053371
+       .type   __svml_stan_data_internal,@object
+       .size   __svml_stan_data_internal,7232
+       .align 64
+__svml_stan_reduction_data_internal:
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1
+       .long   0
+       .long   0
+       .long   2
+       .long   0
+       .long   0
+       .long   5
+       .long   0
+       .long   0
+       .long   10
+       .long   0
+       .long   0
+       .long   20
+       .long   0
+       .long   0
+       .long   40
+       .long   0
+       .long   0
+       .long   81
+       .long   0
+       .long   0
+       .long   162
+       .long   0
+       .long   0
+       .long   325
+       .long   0
+       .long   0
+       .long   651
+       .long   0
+       .long   0
+       .long   1303
+       .long   0
+       .long   0
+       .long   2607
+       .long   0
+       .long   0
+       .long   5215
+       .long   0
+       .long   0
+       .long   10430
+       .long   0
+       .long   0
+       .long   20860
+       .long   0
+       .long   0
+       .long   41721
+       .long   0
+       .long   0
+       .long   83443
+       .long   0
+       .long   0
+       .long   166886
+       .long   0
+       .long   0
+       .long   333772
+       .long   0
+       .long   0
+       .long   667544
+       .long   0
+       .long   0
+       .long   1335088
+       .long   0
+       .long   0
+       .long   2670176
+       .long   0
+       .long   0
+       .long   5340353
+       .long   0
+       .long   0
+       .long   10680707
+       .long   0
+       .long   0
+       .long   21361414
+       .long   0
+       .long   0
+       .long   42722829
+       .long   0
+       .long   0
+       .long   85445659
+       .long   0
+       .long   0
+       .long   170891318
+       .long   0
+       .long   0
+       .long   341782637
+       .long   0
+       .long   0
+       .long   683565275
+       .long   0
+       .long   0
+       .long   1367130551
+       .long   0
+       .long   0
+       .long   2734261102
+       .long   0
+       .long   1
+       .long   1173554908
+       .long   0
+       .long   2
+       .long   2347109817
+       .long   0
+       .long   5
+       .long   399252338
+       .long   0
+       .long   10
+       .long   798504676
+       .long   0
+       .long   20
+       .long   1597009353
+       .long   0
+       .long   40
+       .long   3194018707
+       .long   0
+       .long   81
+       .long   2093070119
+       .long   0
+       .long   162
+       .long   4186140238
+       .long   0
+       .long   325
+       .long   4077313180
+       .long   0
+       .long   651
+       .long   3859659065
+       .long   0
+       .long   1303
+       .long   3424350834
+       .long   0
+       .long   2607
+       .long   2553734372
+       .long   0
+       .long   5215
+       .long   812501448
+       .long   0
+       .long   10430
+       .long   1625002897
+       .long   0
+       .long   20860
+       .long   3250005794
+       .long   0
+       .long   41721
+       .long   2205044292
+       .long   0
+       .long   83443
+       .long   115121288
+       .long   0
+       .long   166886
+       .long   230242576
+       .long   0
+       .long   333772
+       .long   460485152
+       .long   0
+       .long   667544
+       .long   920970305
+       .long   0
+       .long   1335088
+       .long   1841940610
+       .long   0
+       .long   2670176
+       .long   3683881221
+       .long   0
+       .long   5340353
+       .long   3072795146
+       .long   0
+       .long   10680707
+       .long   1850622997
+       .long   0
+       .long   21361414
+       .long   3701245994
+       .long   0
+       .long   42722829
+       .long   3107524692
+       .long   0
+       .long   85445659
+       .long   1920082089
+       .long   0
+       .long   170891318
+       .long   3840164178
+       .long   0
+       .long   341782637
+       .long   3385361061
+       .long   0
+       .long   683565275
+       .long   2475754826
+       .long   0
+       .long   1367130551
+       .long   656542356
+       .long   0
+       .long   2734261102
+       .long   1313084713
+       .long   1
+       .long   1173554908
+       .long   2626169427
+       .long   2
+       .long   2347109817
+       .long   957371559
+       .long   5
+       .long   399252338
+       .long   1914743119
+       .long   10
+       .long   798504676
+       .long   3829486239
+       .long   20
+       .long   1597009353
+       .long   3364005183
+       .long   40
+       .long   3194018707
+       .long   2433043071
+       .long   81
+       .long   2093070119
+       .long   571118846
+       .long   162
+       .long   4186140238
+       .long   1142237692
+       .long   325
+       .long   4077313180
+       .long   2284475384
+       .long   651
+       .long   3859659065
+       .long   273983472
+       .long   1303
+       .long   3424350834
+       .long   547966945
+       .long   2607
+       .long   2553734372
+       .long   1095933890
+       .long   5215
+       .long   812501448
+       .long   2191867780
+       .long   10430
+       .long   1625002897
+       .long   88768265
+       .long   20860
+       .long   3250005794
+       .long   177536531
+       .long   41721
+       .long   2205044292
+       .long   355073063
+       .long   83443
+       .long   115121288
+       .long   710146126
+       .long   166886
+       .long   230242576
+       .long   1420292253
+       .long   333772
+       .long   460485152
+       .long   2840584506
+       .long   667544
+       .long   920970305
+       .long   1386201717
+       .long   1335088
+       .long   1841940610
+       .long   2772403434
+       .long   2670176
+       .long   3683881221
+       .long   1249839573
+       .long   5340353
+       .long   3072795146
+       .long   2499679147
+       .long   10680707
+       .long   1850622997
+       .long   704390999
+       .long   21361414
+       .long   3701245994
+       .long   1408781999
+       .long   42722829
+       .long   3107524692
+       .long   2817563999
+       .long   85445659
+       .long   1920082089
+       .long   1340160702
+       .long   170891318
+       .long   3840164178
+       .long   2680321405
+       .long   341782637
+       .long   3385361061
+       .long   1065675514
+       .long   683565275
+       .long   2475754826
+       .long   2131351028
+       .long   1367130551
+       .long   656542356
+       .long   4262702056
+       .long   2734261102
+       .long   1313084713
+       .long   4230436817
+       .long   1173554908
+       .long   2626169427
+       .long   4165906339
+       .long   2347109817
+       .long   957371559
+       .long   4036845383
+       .long   399252338
+       .long   1914743119
+       .long   3778723471
+       .long   798504676
+       .long   3829486239
+       .long   3262479647
+       .long   1597009353
+       .long   3364005183
+       .long   2229991998
+       .long   3194018707
+       .long   2433043071
+       .long   165016701
+       .long   2093070119
+       .long   571118846
+       .long   330033402
+       .long   4186140238
+       .long   1142237692
+       .long   660066805
+       .long   4077313180
+       .long   2284475384
+       .long   1320133610
+       .long   3859659065
+       .long   273983472
+       .long   2640267220
+       .long   3424350834
+       .long   547966945
+       .long   985567145
+       .long   2553734372
+       .long   1095933890
+       .long   1971134291
+       .long   812501448
+       .long   2191867780
+       .long   3942268582
+       .long   1625002897
+       .long   88768265
+       .long   3589569869
+       .long   3250005794
+       .long   177536531
+       .long   2884172442
+       .long   2205044292
+       .long   355073063
+       .long   1473377588
+       .long   115121288
+       .long   710146126
+       .long   2946755177
+       .long   230242576
+       .long   1420292253
+       .long   1598543059
+       .long   460485152
+       .long   2840584506
+       .long   3197086118
+       .long   920970305
+       .long   1386201717
+       .long   2099204941
+       .long   1841940610
+       .long   2772403434
+       .long   4198409883
+       .long   3683881221
+       .long   1249839573
+       .long   4101852471
+       .long   3072795146
+       .long   2499679147
+       .long   3908737646
+       .long   1850622997
+       .long   704390999
+       .long   3522507997
+       .long   3701245994
+       .long   1408781999
+       .long   2750048699
+       .long   3107524692
+       .long   2817563999
+       .long   1205130103
+       .long   1920082089
+       .long   1340160702
+       .long   2410260206
+       .long   3840164178
+       .long   2680321405
+       .long   525553116
+       .long   3385361061
+       .long   1065675514
+       .long   1051106232
+       .long   2475754826
+       .long   2131351028
+       .long   2102212464
+       .long   656542356
+       .long   4262702056
+       .long   4204424928
+       .long   1313084713
+       .long   4230436817
+       .long   4113882560
+       .long   2626169427
+       .long   4165906339
+       .long   3932797825
+       .long   957371559
+       .long   4036845383
+       .long   3570628355
+       .long   1914743119
+       .long   3778723471
+       .long   2846289414
+       .long   3829486239
+       .long   3262479647
+       .long   1397611533
+       .long   3364005183
+       .long   2229991998
+       .long   2795223067
+       .long   2433043071
+       .long   165016701
+       .long   1295478838
+       .long   571118846
+       .long   330033402
+       .long   2590957677
+       .long   1142237692
+       .long   660066805
+       .long   886948059
+       .long   2284475384
+       .long   1320133610
+       .long   1773896118
+       .long   273983472
+       .long   2640267220
+       .long   3547792237
+       .long   547966945
+       .long   985567145
+       .long   2800617179
+       .long   1095933890
+       .long   1971134291
+       .long   1306267062
+       .long   2191867780
+       .long   3942268582
+       .long   2612534124
+       .long   88768265
+       .long   3589569869
+       .long   930100952
+       .long   177536531
+       .long   2884172442
+       .long   1860201905
+       .long   355073063
+       .long   1473377588
+       .long   3720403810
+       .long   710146126
+       .long   2946755177
+       .long   3145840325
+       .long   1420292253
+       .long   1598543059
+       .long   1996713354
+       .long   2840584506
+       .long   3197086118
+       .long   3993426708
+       .long   1386201717
+       .long   2099204941
+       .long   3691886121
+       .long   2772403434
+       .long   4198409883
+       .long   3088804946
+       .long   1249839573
+       .long   4101852471
+       .long   1882642597
+       .long   2499679147
+       .long   3908737646
+       .long   3765285194
+       .long   704390999
+       .long   3522507997
+       .long   3235603093
+       .long   1408781999
+       .long   2750048699
+       .long   2176238891
+       .long   2817563999
+       .long   1205130103
+       .long   57510486
+       .long   1340160702
+       .long   2410260206
+       .long   115020972
+       .long   2680321405
+       .long   525553116
+       .long   230041945
+       .long   1065675514
+       .long   1051106232
+       .long   460083891
+       .long   2131351028
+       .long   2102212464
+       .long   920167782
+       .long   4262702056
+       .long   4204424928
+       .long   1840335564
+       .long   4230436817
+       .long   4113882560
+       .long   3680671129
+       .long   4165906339
+       .long   3932797825
+       .long   3066374962
+       .long   4036845383
+       .long   3570628355
+       .long   1837782628
+       .long   3778723471
+       .long   2846289414
+       .long   3675565257
+       .long   3262479647
+       .long   1397611533
+       .long   3056163219
+       .long   2229991998
+       .long   2795223067
+       .long   1817359143
+       .long   165016701
+       .long   1295478838
+       .long   3634718287
+       .long   330033402
+       .long   2590957677
+       .long   2974469278
+       .long   660066805
+       .long   886948059
+       .long   1653971260
+       .long   1320133610
+       .long   1773896118
+       .long   3307942520
+       .long   2640267220
+       .long   3547792237
+       .long   2320917745
+       .long   985567145
+       .long   2800617179
+       .long   346868194
+       .long   1971134291
+       .long   1306267062
+       .long   693736388
+       .long   3942268582
+       .long   2612534124
+       .long   1387472776
+       .long   3589569869
+       .long   930100952
+       .long   2774945552
+       .long   2884172442
+       .long   1860201905
+       .long   1254923809
+       .long   1473377588
+       .long   3720403810
+       .long   2509847619
+       .long   2946755177
+       .long   3145840325
+       .long   724727943
+       .long   1598543059
+       .long   1996713354
+       .long   1449455886
+       .long   3197086118
+       .long   3993426708
+       .long   2898911772
+       .long   2099204941
+       .long   3691886121
+       .long   1502856249
+       .long   4198409883
+       .long   3088804946
+       .long   3005712498
+       .long   4101852471
+       .long   1882642597
+       .long   1716457700
+       .long   3908737646
+       .long   3765285194
+       .long   3432915400
+       .long   3522507997
+       .long   3235603093
+       .long   2570863504
+       .long   2750048699
+       .long   2176238891
+       .long   846759712
+       .long   1205130103
+       .long   57510486
+       .long   1693519425
+       .long   2410260206
+       .long   115020972
+       .long   3387038850
+       .long   525553116
+       .long   230041945
+       .long   2479110404
+       .long   1051106232
+       .long   460083891
+       .long   663253512
+       .long   2102212464
+       .long   920167782
+       .long   1326507024
+       .long   4204424928
+       .long   1840335564
+       .long   2653014048
+       .long   4113882560
+       .long   3680671129
+       .long   1011060801
+       .long   3932797825
+       .long   3066374962
+       .long   2022121603
+       .long   3570628355
+       .long   1837782628
+       .long   4044243207
+       .long   2846289414
+       .long   3675565257
+       .long   3793519119
+       .long   1397611533
+       .long   3056163219
+       .long   3292070943
+       .long   2795223067
+       .long   1817359143
+       .long   2289174591
+       .long   1295478838
+       .long   3634718287
+       .long   283381887
+       .long   2590957677
+       .long   2974469278
+       .long   566763775
+       .type   __svml_stan_reduction_data_internal,@object
+       .size   __svml_stan_reduction_data_internal,3072
+       .align 4
+__stan_la__vmlsTanTab:
+       .long   0
+       .long   2139095040
+       .type   __stan_la__vmlsTanTab,@object
+       .size   __stan_la__vmlsTanTab,8
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_tanh_d_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_tanh_d_la.s
new file mode 100644 (file)
index 0000000..34970c6
--- /dev/null
@@ -0,0 +1,3048 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *   NOTE: Since the hyperbolic tangent function is odd
+ *         (tanh(x) = -tanh(-x)), below algorithm deals with the absolute
+ *         value of the argument |x|: tanh(x) = sign(x) * tanh(|x|)
+ * 
+ *   We use a table lookup method to compute tanh(|x|).
+ *   The basic idea is to split the input range into a number of subintervals
+ *   and to approximate tanh(.) with a polynomial on each of them.
+ * 
+ *   IEEE SPECIAL CONDITIONS:
+ *   x = [+,-]0, r = [+,-]0
+ *   x = +Inf,   r = +1
+ *   x = -Inf,   r = -1
+ *   x = QNaN,   r = QNaN
+ *   x = SNaN,   r = QNaN
+ * 
+ * 
+ *   ALGORITHM DETAILS
+ *   We handle special values in a callout function, aside from main path
+ *   computations. "Special" for this algorithm are:
+ *   INF, NAN, |x| > HUGE_THRESHOLD
+ * 
+ * 
+ *   Main path computations are organized as follows:
+ *   Actually we split the interval [0, SATURATION_THRESHOLD)
+ *   into a number of subintervals.  On each subinterval we approximate tanh(.)
+ *   with a minimax polynomial of pre-defined degree. Polynomial coefficients
+ *   are computed beforehand and stored in table. We also use
+ * 
+ *       y := |x| + B,
+ * 
+ *   here B depends on subinterval and is used to make argument
+ *   closer to zero.
+ *   We also add large fake interval [SATURATION_THRESHOLD, HUGE_THRESHOLD],
+ *   where 1.0 + 0.0*y + 0.0*y^2 ... coefficients are stored - just to
+ *   preserve main path computation logic but return 1.0 for all arguments.
+ * 
+ *   Hence reconstruction looks as follows:
+ *   we extract proper polynomial and range reduction coefficients
+ *        (Pj and B), corresponding to subinterval, to which |x| belongs,
+ *        and return
+ * 
+ *       r := sign(x) * (P0 + P1 * y + ... + Pn * y^n)
+ * 
+ *   NOTE: we use multiprecision technique to multiply and sum the first
+ *         K terms of the polynomial. So Pj, j = 0..K are stored in
+ *         table each as a pair of target precision numbers (Pj and PLj) to
+ *         achieve wider than target precision.
+ * 
+ * --
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_tanh8_z0_0:
+
+       .align    16,0x90
+       .globl __svml_tanh8
+
+__svml_tanh8:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $320, %rsp
+        vpsrlq    $32, %zmm0, %zmm4
+        vmovups   %zmm0, (%rsp)
+        vmovups   __svml_dtanh_data_internal(%rip), %zmm14
+        vmovups   128+__svml_dtanh_data_internal(%rip), %zmm15
+        vpmovqd   %zmm4, %ymm5
+
+/* -------------------- Constant loading ------------------- */
+        vandpd    10432+__svml_dtanh_data_internal(%rip), %zmm0, %zmm13
+        vandpd    10368+__svml_dtanh_data_internal(%rip), %zmm0, %zmm3
+
+/* Here huge arguments, INF and NaNs are filtered out to callout. */
+        vpand     2432+__svml_dtanh_data_internal(%rip), %ymm5, %ymm7
+        vmovups   384+__svml_dtanh_data_internal(%rip), %zmm0
+        vmovups   2176+__svml_dtanh_data_internal(%rip), %zmm4
+        vmovups   2048+__svml_dtanh_data_internal(%rip), %zmm5
+        vmovups   %zmm3, 64(%rsp)
+        vmovups   512+__svml_dtanh_data_internal(%rip), %zmm3
+        vpsubd    2496+__svml_dtanh_data_internal(%rip), %ymm7, %ymm8
+
+/* if VMIN, VMAX is defined for I type */
+        vxorps    %ymm9, %ymm9, %ymm9
+        vpmaxsd   %ymm9, %ymm8, %ymm10
+        vpminsd   2560+__svml_dtanh_data_internal(%rip), %ymm10, %ymm11
+        vpsrld    $19, %ymm11, %ymm12
+        vmovups   1664+__svml_dtanh_data_internal(%rip), %zmm8
+        vmovups   1536+__svml_dtanh_data_internal(%rip), %zmm9
+        vmovups   1408+__svml_dtanh_data_internal(%rip), %zmm10
+        vmovups   1280+__svml_dtanh_data_internal(%rip), %zmm11
+        vpmovzxdq %ymm12, %zmm2
+        vmovups   1152+__svml_dtanh_data_internal(%rip), %zmm12
+        vpermt2pd 448+__svml_dtanh_data_internal(%rip), %zmm2, %zmm0
+        vpermt2pd 64+__svml_dtanh_data_internal(%rip), %zmm2, %zmm14
+        vpermt2pd 2240+__svml_dtanh_data_internal(%rip), %zmm2, %zmm4
+        vpermt2pd 2112+__svml_dtanh_data_internal(%rip), %zmm2, %zmm5
+        vsubpd    {rn-sae}, %zmm14, %zmm13, %zmm1
+        vpermt2pd 1728+__svml_dtanh_data_internal(%rip), %zmm2, %zmm8
+        vpermt2pd 1600+__svml_dtanh_data_internal(%rip), %zmm2, %zmm9
+        vpermt2pd 1472+__svml_dtanh_data_internal(%rip), %zmm2, %zmm10
+        vpermt2pd 1344+__svml_dtanh_data_internal(%rip), %zmm2, %zmm11
+        vpermt2pd 1216+__svml_dtanh_data_internal(%rip), %zmm2, %zmm12
+        vpermt2pd 576+__svml_dtanh_data_internal(%rip), %zmm2, %zmm3
+        vpermt2pd 192+__svml_dtanh_data_internal(%rip), %zmm2, %zmm15
+        vmovups   %zmm0, 192(%rsp)
+        vmovups   2304+__svml_dtanh_data_internal(%rip), %zmm0
+        vmovups   1024+__svml_dtanh_data_internal(%rip), %zmm13
+        vmovups   896+__svml_dtanh_data_internal(%rip), %zmm14
+        vmovups   %zmm3, 256(%rsp)
+        vmovups   768+__svml_dtanh_data_internal(%rip), %zmm3
+        vmovups   %zmm15, 128(%rsp)
+        vmovups   640+__svml_dtanh_data_internal(%rip), %zmm15
+        vpermt2pd 2368+__svml_dtanh_data_internal(%rip), %zmm2, %zmm0
+        vpermt2pd 1088+__svml_dtanh_data_internal(%rip), %zmm2, %zmm13
+        vpermt2pd 960+__svml_dtanh_data_internal(%rip), %zmm2, %zmm14
+        vpermt2pd 832+__svml_dtanh_data_internal(%rip), %zmm2, %zmm3
+        vpermt2pd 704+__svml_dtanh_data_internal(%rip), %zmm2, %zmm15
+        vfmadd213pd {rn-sae}, %zmm4, %zmm1, %zmm0
+        vpcmpgtd  10560+__svml_dtanh_data_internal(%rip), %ymm7, %ymm6
+        vmovmskps %ymm6, %edx
+        vmovups   1920+__svml_dtanh_data_internal(%rip), %zmm6
+        vfmadd213pd {rn-sae}, %zmm5, %zmm1, %zmm0
+        vmovups   1792+__svml_dtanh_data_internal(%rip), %zmm7
+        vpermt2pd 1984+__svml_dtanh_data_internal(%rip), %zmm2, %zmm6
+        vpermt2pd 1856+__svml_dtanh_data_internal(%rip), %zmm2, %zmm7
+        vfmadd213pd {rn-sae}, %zmm6, %zmm1, %zmm0
+        vmovups   256(%rsp), %zmm2
+        vfmadd213pd {rn-sae}, %zmm7, %zmm1, %zmm0
+        vfmadd213pd {rn-sae}, %zmm8, %zmm1, %zmm0
+        vfmadd213pd {rn-sae}, %zmm9, %zmm1, %zmm0
+        vfmadd213pd {rn-sae}, %zmm10, %zmm1, %zmm0
+        vfmadd213pd {rn-sae}, %zmm11, %zmm1, %zmm0
+        vfmadd213pd {rn-sae}, %zmm12, %zmm1, %zmm0
+        vfmadd213pd {rn-sae}, %zmm13, %zmm1, %zmm0
+        vfmadd213pd {rn-sae}, %zmm14, %zmm1, %zmm0
+        vfmadd213pd {rn-sae}, %zmm3, %zmm1, %zmm0
+        vmovups   128(%rsp), %zmm3
+        vfmadd213pd {rn-sae}, %zmm15, %zmm1, %zmm0
+        vfmadd213pd {rn-sae}, %zmm2, %zmm1, %zmm0
+        vmovups   192(%rsp), %zmm2
+        vfmadd213pd {rn-sae}, %zmm2, %zmm1, %zmm0
+        vfmadd213pd {rn-sae}, %zmm3, %zmm1, %zmm0
+        vorpd     64(%rsp), %zmm0, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   (%rsp), %zmm1
+        vmovups   %zmm0, 128(%rsp)
+        vmovups   %zmm1, 64(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe8, 0xfe, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe0, 0xfe, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf8, 0xfe, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf0, 0xfe, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xd8, 0xfe, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xd0, 0xfe, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xc8, 0xfe, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xc0, 0xfe, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $8, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe8, 0xfe, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe0, 0xfe, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf8, 0xfe, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf0, 0xfe, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xd8, 0xfe, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xd0, 0xfe, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xc8, 0xfe, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xc0, 0xfe, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,8), %rdi
+        lea       128(%rsp,%r12,8), %rsi
+
+        call      __svml_dtanh_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_tanh8,@function
+       .size   __svml_tanh8,.-__svml_tanh8
+..LN__svml_tanh8.0:
+
+.L_2__routine_start___svml_dtanh_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_dtanh_cout_rare_internal:
+
+
+       .cfi_startproc
+..L63:
+
+        lea       __dtanh_la__imldTanhTab(%rip), %rdx
+        movb      7(%rdi), %al
+        andb      $-128, %al
+        shrb      $7, %al
+        movzbl    %al, %ecx
+        movzwl    6(%rdi), %eax
+        andl      $32752, %eax
+        shrl      $4, %eax
+        movq      (%rdx,%rcx,8), %rdx
+        cmpl      $2047, %eax
+        je        .LBL_2_6
+
+
+        cmpl      $2046, %eax
+        jne       .LBL_2_4
+
+.LBL_2_3:
+
+        movq      %rdx, (%rsi)
+        jmp       .LBL_2_5
+
+.LBL_2_4:
+
+        movsd     (%rdi), %xmm1
+        movsd     __dtanh_la__imldTanhTab(%rip), %xmm0
+        addsd     %xmm1, %xmm0
+        mulsd     %xmm0, %xmm1
+        movsd     %xmm1, (%rsi)
+
+.LBL_2_5:
+
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_6:
+
+        testl     $1048575, 4(%rdi)
+        jne       .LBL_2_9
+
+
+        cmpl      $0, (%rdi)
+        je        .LBL_2_3
+
+.LBL_2_9:
+
+        movsd     (%rdi), %xmm0
+        addsd     %xmm0, %xmm0
+        movsd     %xmm0, (%rsi)
+        jmp       .LBL_2_5
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_dtanh_cout_rare_internal,@function
+       .size   __svml_dtanh_cout_rare_internal,.-__svml_dtanh_cout_rare_internal
+..LN__svml_dtanh_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_dtanh_data_internal:
+       .long   0
+       .long   0
+       .long   0
+       .long   1070333952
+       .long   0
+       .long   1070858240
+       .long   0
+       .long   1071382528
+       .long   0
+       .long   1071906816
+       .long   0
+       .long   1072431104
+       .long   0
+       .long   1072955392
+       .long   0
+       .long   1073479680
+       .long   0
+       .long   1074003968
+       .long   0
+       .long   1074528256
+       .long   0
+       .long   1075052544
+       .long   0
+       .long   1075576832
+       .long   0
+       .long   1076101120
+       .long   0
+       .long   1076625408
+       .long   0
+       .long   1077149696
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1097497746
+       .long   1070305232
+       .long   2699715854
+       .long   1070817176
+       .long   3997728823
+       .long   1071273769
+       .long   3938160533
+       .long   1071759175
+       .long   193732629
+       .long   1072072293
+       .long   3144363502
+       .long   1072375075
+       .long   2548249895
+       .long   1072570303
+       .long   638218690
+       .long   1072665176
+       .long   3325726839
+       .long   1072689426
+       .long   2523455249
+       .long   1072693057
+       .long   2200391922
+       .long   1072693244
+       .long   4257836853
+       .long   1072693247
+       .long   4294954840
+       .long   1072693247
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   3167993022
+       .long   1013310014
+       .long   2889539328
+       .long   3159121931
+       .long   394645568
+       .long   1013728265
+       .long   2799920971
+       .long   1015161303
+       .long   754366556
+       .long   1013577885
+       .long   3960180508
+       .long   1014215657
+       .long   69774042
+       .long   3162475851
+       .long   2161066944
+       .long   3162264280
+       .long   923362432
+       .long   1014879086
+       .long   2160345802
+       .long   1014714211
+       .long   3729195158
+       .long   3161626453
+       .long   675671997
+       .long   1015336837
+       .long   1141527416
+       .long   1013957883
+       .long   2209699952
+       .long   3160643600
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   2750448946
+       .long   1072596012
+       .long   1257606939
+       .long   1072501079
+       .long   2619663609
+       .long   1072338011
+       .long   863303701
+       .long   1072048204
+       .long   2694810990
+       .long   1071654144
+       .long   837003456
+       .long   1070723665
+       .long   472162617
+       .long   1069359818
+       .long   532307062
+       .long   1067137790
+       .long   431106849
+       .long   1064162173
+       .long   329904022
+       .long   1059572972
+       .long   4080160942
+       .long   1053550275
+       .long   1402271583
+       .long   1044493446
+       .long   467296040
+       .long   1032344560
+       .long   26734424
+       .long   1014207804
+       .long   0
+       .long   0
+       .long   1071622681
+       .long   3153114090
+       .long   3948133409
+       .long   3217705130
+       .long   4096956694
+       .long   3218184481
+       .long   2616164369
+       .long   3218465008
+       .long   2620770434
+       .long   3218641845
+       .long   3075958072
+       .long   3218520700
+       .long   1950184789
+       .long   3217978001
+       .long   2686385024
+       .long   3216731525
+       .long   1489441818
+       .long   3214597550
+       .long   1992796697
+       .long   3211642259
+       .long   1952936976
+       .long   3207056478
+       .long   3904162951
+       .long   3201033920
+       .long   1382745445
+       .long   3191977094
+       .long   468673444
+       .long   3179828208
+       .long   3843669553
+       .long   3161691483
+       .long   0
+       .long   0
+       .long   1431655765
+       .long   3218429269
+       .long   3264395793
+       .long   3218178991
+       .long   60595194
+       .long   3217824331
+       .long   1837960166
+       .long   3217124894
+       .long   1964918946
+       .long   3214033516
+       .long   2998587684
+       .long   1068822866
+       .long   3421467326
+       .long   1069267520
+       .long   952003133
+       .long   1068506016
+       .long   1215426504
+       .long   1066495476
+       .long   2650572912
+       .long   1063503494
+       .long   4178958376
+       .long   1059043758
+       .long   3799805457
+       .long   1052940753
+       .long   3704238924
+       .long   1043831645
+       .long   2076585114
+       .long   1031813109
+       .long   1352847351
+       .long   1013591371
+       .long   0
+       .long   0
+       .long   3830371894
+       .long   3169224254
+       .long   74893150
+       .long   1069567437
+       .long   1235750664
+       .long   1069825332
+       .long   916043751
+       .long   1069924975
+       .long   4138411315
+       .long   1069655686
+       .long   829220656
+       .long   1068441660
+       .long   663246204
+       .long   3213477792
+       .long   652268865
+       .long   3214415230
+       .long   3251098232
+       .long   3212868437
+       .long   1480792335
+       .long   3209929101
+       .long   3365608027
+       .long   3205478075
+       .long   3330582883
+       .long   3199375817
+       .long   3573234945
+       .long   3190266717
+       .long   2061970086
+       .long   3178248181
+       .long   3148320390
+       .long   3160026274
+       .long   0
+       .long   0
+       .long   286337717
+       .long   1069617425
+       .long   4261152941
+       .long   1068876190
+       .long   3694459820
+       .long   1067928728
+       .long   2399079031
+       .long   3212381546
+       .long   394897286
+       .long   3215735810
+       .long   3073534041
+       .long   3215860118
+       .long   301960234
+       .long   3214124960
+       .long   3353887502
+       .long   1064191753
+       .long   4200665425
+       .long   1063741482
+       .long   2003926207
+       .long   1061090030
+       .long   2196865207
+       .long   1056528964
+       .long   2107880963
+       .long   1050526402
+       .long   3656860478
+       .long   1041425071
+       .long   881228218
+       .long   1029305120
+       .long   2612840768
+       .long   1011136029
+       .long   0
+       .long   0
+       .long   3722294196
+       .long   3181505049
+       .long   2573001951
+       .long   3216029919
+       .long   4095639908
+       .long   3216151900
+       .long   3272210374
+       .long   3215957253
+       .long   3439280785
+       .long   3214441767
+       .long   628273304
+       .long   1066085542
+       .long   3354767370
+       .long   1066343670
+       .long   300170709
+       .long   1063270296
+       .long   1870156670
+       .long   3209139074
+       .long   1580606479
+       .long   3206808937
+       .long   3818710870
+       .long   3202408589
+       .long   3126817102
+       .long   3196311305
+       .long   3320734688
+       .long   3187224127
+       .long   821170446
+       .long   3175173312
+       .long   3906480775
+       .long   3156975650
+       .long   0
+       .long   0
+       .long   428888587
+       .long   3215696314
+       .long   3125999356
+       .long   3214336891
+       .long   407196569
+       .long   1053816799
+       .long   886258254
+       .long   1066874408
+       .long   2149075781
+       .long   1067351939
+       .long   3888390356
+       .long   1065784643
+       .long   1226056234
+       .long   3211994813
+       .long   178100474
+       .long   3210723675
+       .long   4201249718
+       .long   1058328572
+       .long   3854015760
+       .long   1057324616
+       .long   3621220964
+       .long   1052982118
+       .long   1468766992
+       .long   1046916174
+       .long   2369608770
+       .long   1037879115
+       .long   327127732
+       .long   1025754505
+       .long   747046817
+       .long   1007714190
+       .long   0
+       .long   0
+       .long   4036362527
+       .long   3191151783
+       .long   839661649
+       .long   1067363059
+       .long   4269154241
+       .long   1067251747
+       .long   391446303
+       .long   1066410535
+       .long   2090623151
+       .long   3211993063
+       .long   1751510141
+       .long   3213141508
+       .long   4072216875
+       .long   3209470961
+       .long   3769618983
+       .long   1061976030
+       .long   3462945146
+       .long   1057228123
+       .long   3030849095
+       .long   3202531084
+       .long   4269010901
+       .long   3198361258
+       .long   742615277
+       .long   3192302512
+       .long   3397417437
+       .long   3183265609
+       .long   943110610
+       .long   3171141000
+       .long   371608300
+       .long   3153099348
+       .long   0
+       .long   0
+       .long   1315619150
+       .long   1066820857
+       .long   1001273821
+       .long   3214201652
+       .long   3859675203
+       .long   3212560200
+       .long   725858949
+       .long   3213658423
+       .long   2464052346
+       .long   3212913056
+       .long   1297319750
+       .long   1063307355
+       .long   563735576
+       .long   1062988089
+       .long   2756222736
+       .long   3207203944
+       .long   31207338
+       .long   3204466214
+       .long   434022900
+       .long   1052227234
+       .long   2370591882
+       .long   1048628172
+       .long   588930601
+       .long   1042556347
+       .long   3198977634
+       .long   1033474724
+       .long   1590950759
+       .long   1021415866
+       .long   195904708
+       .long   1003000389
+       .long   0
+       .long   0
+       .long   4252521214
+       .long   3198731457
+       .long   2969857811
+       .long   3217870358
+       .long   575387574
+       .long   3212943727
+       .long   67550217
+       .long   3210922992
+       .long   2955736731
+       .long   1064678043
+       .long   4193848343
+       .long   1063288304
+       .long   1845975253
+       .long   3209397546
+       .long   1025213509
+       .long   3204479174
+       .long   3713384058
+       .long   1055658730
+       .long   4120057883
+       .long   3194988032
+       .long   1573797757
+       .long   3193584787
+       .long   2514726550
+       .long   3187678317
+       .long   15343571
+       .long   3178526042
+       .long   104576940
+       .long   3166444652
+       .long   1147207168
+       .long   3148070554
+       .long   0
+       .long   0
+       .long   1467656669
+       .long   3212977156
+       .long   4154993315
+       .long   1077775111
+       .long   2465966858
+       .long   3214886059
+       .long   71777642
+       .long   1068690118
+       .long   2419763912
+       .long   1061550205
+       .long   1896047360
+       .long   3210612806
+       .long   3723555648
+       .long   1058651288
+       .long   3163703016
+       .long   1057833732
+       .long   1601936705
+       .long   3201383489
+       .long   2535509424
+       .long   3195153293
+       .long   3610885824
+       .long   1043474022
+       .long   1031698712
+       .long   1037527637
+       .long   1497459257
+       .long   1028514042
+       .long   3476455860
+       .long   1016366870
+       .long   758110873
+       .long   998719391
+       .long   0
+       .long   0
+       .long   572446067
+       .long   3204307354
+       .long   926268084
+       .long   1081104698
+       .long   1313112926
+       .long   3217861477
+       .long   3660716
+       .long   1070677720
+       .long   124568711
+       .long   3210757561
+       .long   2123022704
+       .long   1059096046
+       .long   576783408
+       .long   1059279430
+       .long   1651052980
+       .long   3204387494
+       .long   3164866735
+       .long   1051430920
+       .long   409335328
+       .long   1046695415
+       .long   3481520755
+       .long   3188046619
+       .long   1140549474
+       .long   3182373569
+       .long   708689751
+       .long   3173247717
+       .long   2627769694
+       .long   3161153086
+       .long   3804346926
+       .long   3143551592
+       .long   0
+       .long   0
+       .long   2302818369
+       .long   1064188902
+       .long   526101185
+       .long   3235013457
+       .long   2975776348
+       .long   1075224435
+       .long   1103981749
+       .long   3223699933
+       .long   4261798097
+       .long   3210280329
+       .long   30781306
+       .long   1064564655
+       .long   3939597931
+       .long   3206430909
+       .long   1816466405
+       .long   1055007949
+       .long   3868125859
+       .long   3190076997
+       .long   4218600579
+       .long   3192569835
+       .long   4167655123
+       .long   1037376568
+       .long   952533803
+       .long   1032000428
+       .long   895641221
+       .long   1022851193
+       .long   1237761065
+       .long   1010835452
+       .long   2902086315
+       .long   3133082401
+       .long   0
+       .long   0
+       .long   1899646778
+       .long   3207205638
+       .long   2434183270
+       .long   3238288976
+       .long   621380814
+       .long   1078065849
+       .long   247717525
+       .long   3225783561
+       .long   1611742563
+       .long   3212088477
+       .long   537725662
+       .long   1065131990
+       .long   3769436831
+       .long   1057148224
+       .long   3759797009
+       .long   3196422840
+       .long   842759416
+       .long   3195613094
+       .long   1736926210
+       .long   1043198029
+       .long   3915271468
+       .long   3180709675
+       .long   807416070
+       .long   3176507548
+       .long   3147759461
+       .long   3167409843
+       .long   3443382404
+       .long   3155325020
+       .long   1202615797
+       .long   3129870924
+       .long   0
+       .long   0
+       .long   1841653873
+       .long   3210074087
+       .long   2157744327
+       .long   1095928888
+       .long   3038317314
+       .long   3229013375
+       .long   2291108570
+       .long   1082519711
+       .long   707775397
+       .long   1067599411
+       .long   445214669
+       .long   3216153989
+       .long   3815354898
+       .long   1054410330
+       .long   1285070896
+       .long   3199787450
+       .long   1722630166
+       .long   1047526663
+       .long   2672844635
+       .long   3188483010
+       .long   1805520457
+       .long   3179260705
+       .long   542550567
+       .long   1026041526
+       .long   392361251
+       .long   1017320419
+       .long   562647833
+       .long   1005205418
+       .long   4253488278
+       .long   988137457
+       .long   0
+       .long   0
+       .long   3077187303
+       .long   1060497018
+       .long   1652392454
+       .long   1099206368
+       .long   414484972
+       .long   3231848150
+       .long   130592591
+       .long   1084602513
+       .long   1951534810
+       .long   1068932483
+       .long   2677544726
+       .long   3216895313
+       .long   2338009969
+       .long   3203411240
+       .long   302629286
+       .long   1051889816
+       .long   1274412910
+       .long   3193339538
+       .long   3731558070
+       .long   1038350327
+       .long   3135499196
+       .long   1030352152
+       .long   1329461873
+       .long   3170325324
+       .long   4058709792
+       .long   3161656179
+       .long   2167788642
+       .long   3149540607
+       .long   1602064437
+       .long   3132466971
+       .long   0
+       .long   0
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   1069547520
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   7864320
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   3616958675
+       .long   3172564458
+       .long   1431547708
+       .long   3218429269
+       .long   3390261318
+       .long   3188010876
+       .long   1446529494
+       .long   1069617425
+       .long   913571762
+       .long   3199219810
+       .long   1583612462
+       .long   3215695720
+       .long   2995724807
+       .long   3207222498
+       .long   847913742
+       .long   1066913721
+       .long   1634876930
+       .long   3212167789
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1694159514
+       .long   1010239653
+       .long   966318664
+       .long   1069606551
+       .long   2992375944
+       .long   1072656686
+       .long   1870405289
+       .long   3217070889
+       .long   1411308967
+       .long   3218333047
+       .long   4096824853
+       .long   1068863484
+       .long   2220740425
+       .long   1069365950
+       .long   1401698298
+       .long   3215430111
+       .long   4137473768
+       .long   3215259762
+       .long   2666938667
+       .long   1066889956
+       .long   121190665
+       .long   1066187784
+       .long   821637913
+       .long   3213226090
+       .long   0
+       .long   3217096704
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1463410348
+       .long   1012925678
+       .long   2389577058
+       .long   1069735062
+       .long   1617794783
+       .long   1072647710
+       .long   1889094329
+       .long   3217191869
+       .long   1210518828
+       .long   3218309813
+       .long   1479174953
+       .long   1069010221
+       .long   3435917531
+       .long   1069290104
+       .long   291210913
+       .long   3215575029
+       .long   464478606
+       .long   3215159746
+       .long   1063797118
+       .long   1067014292
+       .long   3489481042
+       .long   1065955541
+       .long   2916293494
+       .long   3213319415
+       .long   0
+       .long   3217227776
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1308961311
+       .long   1014934498
+       .long   2204208241
+       .long   1069862983
+       .long   2945950899
+       .long   1072637797
+       .long   1107689125
+       .long   3217310565
+       .long   545938327
+       .long   3218284334
+       .long   3174275192
+       .long   1069150773
+       .long   3754729793
+       .long   1069207728
+       .long   1611554958
+       .long   3215708601
+       .long   2936527704
+       .long   3215052478
+       .long   2983784402
+       .long   1067121823
+       .long   1327150338
+       .long   1065710404
+       .long   3371320326
+       .long   3213391099
+       .long   0
+       .long   3217358848
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3546392464
+       .long   1015001497
+       .long   631120375
+       .long   1069990256
+       .long   1201634405
+       .long   1072626967
+       .long   266657677
+       .long   3217426771
+       .long   1567732958
+       .long   3218256710
+       .long   883708059
+       .long   1069284653
+       .long   1008115966
+       .long   1069119372
+       .long   2657338981
+       .long   3215830093
+       .long   3402640736
+       .long   3214939036
+       .long   1000796573
+       .long   1067211764
+       .long   53805889
+       .long   1065455799
+       .long   1736607114
+       .long   3213440608
+       .long   0
+       .long   3217489920
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2741128528
+       .long   1013617020
+       .long   3111451323
+       .long   1070116823
+       .long   1649040643
+       .long   1072615239
+       .long   3411009101
+       .long   3217540290
+       .long   3408666525
+       .long   3218227049
+       .long   60831764
+       .long   1069411415
+       .long   64016149
+       .long   1069025616
+       .long   1202785467
+       .long   3215938891
+       .long   1072151579
+       .long   3214707060
+       .long   1534357116
+       .long   1067283570
+       .long   4218468492
+       .long   1065037194
+       .long   2285827787
+       .long   3213467810
+       .long   0
+       .long   3217620992
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2659584459
+       .long   1014368295
+       .long   3537749475
+       .long   1070242630
+       .long   3072983457
+       .long   1072602635
+       .long   3507245872
+       .long   3217650938
+       .long   3434758212
+       .long   3218195466
+       .long   3801643091
+       .long   1069530660
+       .long   1128653951
+       .long   1068927067
+       .long   3580298628
+       .long   3216008547
+       .long   1645082338
+       .long   3214462237
+       .long   1048857889
+       .long   1067336943
+       .long   21547694
+       .long   1064510970
+       .long   1433152914
+       .long   3213472968
+       .long   0
+       .long   3217752064
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2718912981
+       .long   1013914074
+       .long   1823051285
+       .long   1070367623
+       .long   1714227149
+       .long   1072589179
+       .long   2128046799
+       .long   3217758540
+       .long   2655098722
+       .long   3218162081
+       .long   1690074008
+       .long   1069594780
+       .long   353091525
+       .long   1068824353
+       .long   4206393496
+       .long   3216049578
+       .long   824478721
+       .long   3214211899
+       .long   3850924188
+       .long   1067371825
+       .long   2738209029
+       .long   1063668369
+       .long   853664366
+       .long   3213456718
+       .long   0
+       .long   3217883136
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2312638749
+       .long   1013630664
+       .long   4267025360
+       .long   1070491748
+       .long   3776362539
+       .long   1072574894
+       .long   3063840907
+       .long   3217862932
+       .long   2436606365
+       .long   3218127019
+       .long   582931594
+       .long   1069646387
+       .long   3079837843
+       .long   1068718114
+       .long   3430470362
+       .long   3216083715
+       .long   1015897693
+       .long   3213958348
+       .long   765047087
+       .long   1067388396
+       .long   2337193368
+       .long   1061824569
+       .long   3002775972
+       .long   3213420044
+       .long   0
+       .long   3218014208
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2001712669
+       .long   1015665334
+       .long   1330879460
+       .long   1070636148
+       .long   2956987714
+       .long   1072551971
+       .long   4281360332
+       .long   3218013175
+       .long   3304213057
+       .long   3218063389
+       .long   3261945160
+       .long   1069715874
+       .long   3866284424
+       .long   1068553570
+       .long   3423706630
+       .long   3216121886
+       .long   259493169
+       .long   3213268437
+       .long   4223676832
+       .long   1067379852
+       .long   2765317642
+       .long   3210752240
+       .long   2292494069
+       .long   3213329490
+       .long   0
+       .long   3218145280
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1632443533
+       .long   1015769771
+       .long   3788472163
+       .long   1070757367
+       .long   2406795724
+       .long   1072518757
+       .long   1173083542
+       .long   3218140352
+       .long   3726086528
+       .long   3217906251
+       .long   1205028711
+       .long   1069793280
+       .long   2231197855
+       .long   1068156878
+       .long   2368637763
+       .long   3216148628
+       .long   2866127296
+       .long   3211617797
+       .long   2424606359
+       .long   1067309831
+       .long   2444940724
+       .long   3212180962
+       .long   3308128888
+       .long   3213151909
+       .long   0
+       .long   3218276352
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   478834383
+       .long   1014053288
+       .long   1342399495
+       .long   1070876422
+       .long   2650660168
+       .long   1072482726
+       .long   976724127
+       .long   3218226669
+       .long   962417089
+       .long   3217740546
+       .long   1060150306
+       .long   1069852926
+       .long   411739190
+       .long   1067700577
+       .long   3846786712
+       .long   3216148687
+       .long   4007187252
+       .long   1064073475
+       .long   3455779574
+       .long   1067180067
+       .long   1865169557
+       .long   3212900393
+       .long   1200620699
+       .long   3212923615
+       .long   0
+       .long   3218407424
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   267289397
+       .long   1014452734
+       .long   302318249
+       .long   1070993143
+       .long   1373990511
+       .long   1072444121
+       .long   1606419704
+       .long   3218305061
+       .long   3955669825
+       .long   3217568496
+       .long   2701083439
+       .long   1069894809
+       .long   3425188888
+       .long   1067047616
+       .long   2305426029
+       .long   3216123827
+       .long   1692531481
+       .long   1065641523
+       .long   232815703
+       .long   1067000535
+       .long   3949954748
+       .long   3213214884
+       .long   558890519
+       .long   3212487521
+       .long   0
+       .long   3218538496
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1719941932
+       .long   1006528498
+       .long   368840470
+       .long   1071107377
+       .long   1825320027
+       .long   1072403193
+       .long   538136722
+       .long   3218375283
+       .long   1431312010
+       .long   3217392305
+       .long   2586725425
+       .long   1069919291
+       .long   2680871675
+       .long   1065941593
+       .long   4123661982
+       .long   3216076488
+       .long   4235496382
+       .long   1066406926
+       .long   2618960092
+       .long   1066782660
+       .long   2333865044
+       .long   3213444845
+       .long   1545458959
+       .long   3211934181
+       .long   0
+       .long   3218669568
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   26286236
+       .long   1013191219
+       .long   990113957
+       .long   1071218987
+       .long   3284199501
+       .long   1072360200
+       .long   2981906127
+       .long   3218437190
+       .long   3154396333
+       .long   3217214106
+       .long   4182117656
+       .long   1069927061
+       .long   903677379
+       .long   3207343530
+       .long   384743261
+       .long   3216009637
+       .long   1679228359
+       .long   1066734193
+       .long   3407026595
+       .long   1066538544
+       .long   784962854
+       .long   3213588186
+       .long   1956733412
+       .long   3210979700
+       .long   0
+       .long   3218800640
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1468217372
+       .long   1015658399
+       .long   2570814109
+       .long   1071327852
+       .long   532296332
+       .long   1072315404
+       .long   318213600
+       .long   3218490738
+       .long   3661105766
+       .long   3217035931
+       .long   4085840862
+       .long   1069919095
+       .long   2798312316
+       .long   3213370099
+       .long   1668326589
+       .long   3215870599
+       .long   3158013712
+       .long   1066998409
+       .long   673205579
+       .long   1066158659
+       .long   486665227
+       .long   3213647762
+       .long   3317145528
+       .long   3208570948
+       .long   0
+       .long   3218931712
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2060955015
+       .long   1014233667
+       .long   2567098181
+       .long   1071433868
+       .long   1159081245
+       .long   1072269064
+       .long   1492598184
+       .long   3218535971
+       .long   1567055841
+       .long   3216688180
+       .long   2821222425
+       .long   1069896605
+       .long   3691290783
+       .long   3214336992
+       .long   343679101
+       .long   3215679175
+       .long   1878686296
+       .long   1067197462
+       .long   125933636
+       .long   1065636281
+       .long   421076939
+       .long   3213630573
+       .long   3748848474
+       .long   1062499186
+       .long   0
+       .long   3219062784
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1860475216
+       .long   1015320544
+       .long   439764829
+       .long   1071587361
+       .long   3870821058
+       .long   1072197223
+       .long   1430736283
+       .long   3218588540
+       .long   1597812790
+       .long   3216174065
+       .long   2398544810
+       .long   1069838732
+       .long   961452807
+       .long   3215095800
+       .long   716310499
+       .long   3215360049
+       .long   2337792646
+       .long   1067375770
+       .long   3863538422
+       .long   1064417477
+       .long   2203480844
+       .long   3213482785
+       .long   2389621902
+       .long   1063978354
+       .long   0
+       .long   3219193856
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   517838046
+       .long   1015294339
+       .long   2114713104
+       .long   1071713012
+       .long   2046328558
+       .long   1072098392
+       .long   29352448
+       .long   3218631376
+       .long   1533416325
+       .long   3215079684
+       .long   765247815
+       .long   1069724759
+       .long   24381189
+       .long   3215564623
+       .long   1213155449
+       .long   3214886044
+       .long   379420126
+       .long   1067409218
+       .long   3127061143
+       .long   3210809777
+       .long   3193663073
+       .long   3213128287
+       .long   2557278876
+       .long   1064581282
+       .long   0
+       .long   3219324928
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   201012485
+       .long   1013704982
+       .long   4147262407
+       .long   1071803766
+       .long   3048814903
+       .long   1071997795
+       .long   1260857726
+       .long   3218645540
+       .long   270462819
+       .long   3209873967
+       .long   874660781
+       .long   1069580732
+       .long   1251156804
+       .long   3215866075
+       .long   3568210118
+       .long   3214014484
+       .long   3784557811
+       .long   1067255146
+       .long   47772576
+       .long   3212562613
+       .long   2075700783
+       .long   3212539455
+       .long   1121561449
+       .long   1064698735
+       .long   0
+       .long   3219456000
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   72370286
+       .long   1015768239
+       .long   2345366573
+       .long   1071888223
+       .long   3155310239
+       .long   1071897123
+       .long   4105462806
+       .long   3218634383
+       .long   2329529114
+       .long   1067280331
+       .long   3078782452
+       .long   1069291148
+       .long   2210998062
+       .long   3215997483
+       .long   1498585052
+       .long   3212353515
+       .long   3032692199
+       .long   1066974465
+       .long   809329973
+       .long   3213081308
+       .long   2713838579
+       .long   3211547879
+       .long   1266611175
+       .long   1064568889
+       .long   0
+       .long   3219587072
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2137918782
+       .long   1013598293
+       .long   2511343836
+       .long   1071966424
+       .long   4205808243
+       .long   1071797842
+       .long   2776384587
+       .long   3218601667
+       .long   3824787134
+       .long   1068202086
+       .long   4101819712
+       .long   1068956189
+       .long   3547601806
+       .long   3216004360
+       .long   4156237724
+       .long   1064058621
+       .long   3714924071
+       .long   1066627770
+       .long   2925917146
+       .long   3213234133
+       .long   4211598888
+       .long   3209111151
+       .long   2569808389
+       .long   1064277859
+       .long   0
+       .long   3219718144
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2979324843
+       .long   1013692066
+       .long   2595126306
+       .long   1072038496
+       .long   4263058559
+       .long   1071701178
+       .long   2217257467
+       .long   3218551298
+       .long   2310932059
+       .long   1068685603
+       .long   3368327571
+       .long   1068627625
+       .long   3037419246
+       .long   3215935424
+       .long   3509936675
+       .long   1065724141
+       .long   1557247226
+       .long   1066131548
+       .long   3830787958
+       .long   3213205743
+       .long   1781883284
+       .long   1062575914
+       .long   3918078093
+       .long   1063614197
+       .long   0
+       .long   3219849216
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3630992244
+       .long   1015034507
+       .long   461360001
+       .long   1072104635
+       .long   2866201612
+       .long   1071571556
+       .long   1021729265
+       .long   3218487113
+       .long   1039036234
+       .long   1068940858
+       .long   1685105679
+       .long   1068140011
+       .long   1856275853
+       .long   3215769620
+       .long   2211306181
+       .long   1066373046
+       .long   3739405201
+       .long   1065456917
+       .long   3870269089
+       .long   3213053509
+       .long   427599213
+       .long   1063593231
+       .long   40698732
+       .long   1062709094
+       .long   0
+       .long   3219980288
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4017840557
+       .long   1014067070
+       .long   2764932206
+       .long   1072165089
+       .long   3362970633
+       .long   1071394124
+       .long   2677206355
+       .long   3218412713
+       .long   1827861303
+       .long   1069122666
+       .long   2476388705
+       .long   1067583638
+       .long   523365901
+       .long   3215556224
+       .long   1203249285
+       .long   1066574111
+       .long   4264074292
+       .long   1064402288
+       .long   3556167213
+       .long   3212827889
+       .long   3894081206
+       .long   1063908871
+       .long   2161178761
+       .long   1061130844
+       .long   0
+       .long   3220111360
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3622330478
+       .long   1016273425
+       .long   923638641
+       .long   1072245755
+       .long   239419665
+       .long   1071146518
+       .long   4085259706
+       .long   3218288969
+       .long   1284806809
+       .long   1069276013
+       .long   2806747971
+       .long   1066232498
+       .long   75259250
+       .long   3215197393
+       .long   2597116185
+       .long   1066648701
+       .long   1680670491
+       .long   3208755029
+       .long   446818184
+       .long   3212096816
+       .long   1529495144
+       .long   1063888972
+       .long   808619025
+       .long   3208443000
+       .long   0
+       .long   3220242432
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   462410646
+       .long   1015565639
+       .long   3157363066
+       .long   1072336316
+       .long   87541994
+       .long   1070853747
+       .long   2905067058
+       .long   3218115077
+       .long   1081050294
+       .long   1069306453
+       .long   4130581086
+       .long   3212259234
+       .long   1279737796
+       .long   3214531982
+       .long   901138781
+       .long   1066501065
+       .long   978916480
+       .long   3211806490
+       .long   1307294116
+       .long   3210755549
+       .long   1154728319
+       .long   1063409950
+       .long   983243444
+       .long   3209435485
+       .long   0
+       .long   3220373504
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2617212772
+       .long   1016126748
+       .long   2762378177
+       .long   1072409936
+       .long   1926160805
+       .long   1070604218
+       .long   4131898582
+       .long   3217810482
+       .long   3068505203
+       .long   1069203346
+       .long   2854543895
+       .long   3214027139
+       .long   1276437050
+       .long   3213652513
+       .long   523800203
+       .long   1066060621
+       .long   3030576699
+       .long   3212054264
+       .long   210618624
+       .long   3205409267
+       .long   3515290542
+       .long   1062456384
+       .long   1613351841
+       .long   3209185464
+       .long   0
+       .long   3220504576
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2178033281
+       .long   1016051223
+       .long   859883711
+       .long   1072469258
+       .long   4248327203
+       .long   1070195167
+       .long   4170103331
+       .long   3217497647
+       .long   3497702842
+       .long   1069026027
+       .long   669705965
+       .long   3214426190
+       .long   548733038
+       .long   3212258725
+       .long   1756337187
+       .long   1065503890
+       .long   1830841059
+       .long   3211930343
+       .long   1445563742
+       .long   1061912703
+       .long   2113494314
+       .long   1060991234
+       .long   1734825467
+       .long   3208559895
+       .long   0
+       .long   3220635648
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1674478116
+       .long   1016412476
+       .long   1178764976
+       .long   1072516719
+       .long   1119346206
+       .long   1069851736
+       .long   1526584272
+       .long   3217221512
+       .long   3575463915
+       .long   1068817773
+       .long   2913683612
+       .long   3214542291
+       .long   1135909212
+       .long   3207879094
+       .long   1952394810
+       .long   1064725296
+       .long   508910559
+       .long   3211537545
+       .long   225204077
+       .long   1062311155
+       .long   1009857186
+       .long   1056234420
+       .long   2872841632
+       .long   3207480811
+       .long   0
+       .long   3220766720
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1768234410
+       .long   1014305046
+       .long   1496797583
+       .long   1072554475
+       .long   3351833521
+       .long   1069572393
+       .long   68183265
+       .long   3216938851
+       .long   4178655528
+       .long   1068606905
+       .long   60791550
+       .long   3214483781
+       .long   1856281737
+       .long   1063701265
+       .long   4260560897
+       .long   1063778674
+       .long   2539586291
+       .long   3210979253
+       .long   2272785608
+       .long   1062198907
+       .long   1986161572
+       .long   3206910344
+       .long   1016667904
+       .long   3205797138
+       .long   0
+       .long   3220897792
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3074583847
+       .long   1017063845
+       .long   4092570620
+       .long   1072584374
+       .long   3645618684
+       .long   1069147119
+       .long   1980755111
+       .long   3216542681
+       .long   889928399
+       .long   1068320928
+       .long   1360064809
+       .long   3214330986
+       .long   2266432388
+       .long   1064407878
+       .long   4147854841
+       .long   1062471610
+       .long   1812350685
+       .long   3210287970
+       .long   3710399832
+       .long   1061728481
+       .long   2458127659
+       .long   3207279138
+       .long   287360833
+       .long   3197756422
+       .long   0
+       .long   3221028864
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   68970445
+       .long   1013643458
+       .long   3990219923
+       .long   1072607967
+       .long   97498680
+       .long   1068787106
+       .long   4136450559
+       .long   3216216395
+       .long   147179316
+       .long   1067971098
+       .long   1625987424
+       .long   3214138005
+       .long   3965878798
+       .long   1064539455
+       .long   3777445436
+       .long   1059539413
+       .long   3029913178
+       .long   3209512624
+       .long   2162291908
+       .long   1061245910
+       .long   351053474
+       .long   3207087984
+       .long   3766283083
+       .long   1056943188
+       .long   0
+       .long   3221159936
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3139580402
+       .long   1014663922
+       .long   3748810696
+       .long   1072634260
+       .long   3154943320
+       .long   1068262833
+       .long   3181856712
+       .long   3215694135
+       .long   3656356636
+       .long   1067539266
+       .long   3897588284
+       .long   3213798616
+       .long   1461831298
+       .long   1064461217
+       .long   2900114226
+       .long   3208814642
+       .long   2606420357
+       .long   3207868903
+       .long   1741152094
+       .long   1060222230
+       .long   1469206701
+       .long   3206514441
+       .long   3518993813
+       .long   1057090958
+       .long   0
+       .long   3221291008
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3285908565
+       .long   1015477239
+       .long   1797956315
+       .long   1072657271
+       .long   3302471936
+       .long   1067543167
+       .long   2151339553
+       .long   3215007235
+       .long   362228095
+       .long   1066797401
+       .long   3986406156
+       .long   3213131380
+       .long   388353381
+       .long   1064042359
+       .long   4147910906
+       .long   3209239839
+       .long   1739922885
+       .long   1056259812
+       .long   3188561056
+       .long   1058406709
+       .long   489122368
+       .long   3205182155
+       .long   202560853
+       .long   1056234231
+       .long   0
+       .long   3221422080
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3806705628
+       .long   1008327668
+       .long   884432573
+       .long   1072671353
+       .long   137405484
+       .long   1066747168
+       .long   3531994812
+       .long   3214216262
+       .long   3217445183
+       .long   1066105333
+       .long   2910288024
+       .long   3212464301
+       .long   3196212707
+       .long   1063467545
+       .long   3156563895
+       .long   3208963593
+       .long   3591285453
+       .long   1058733242
+       .long   2889132271
+       .long   1055392886
+       .long   1038377961
+       .long   3203561698
+       .long   4084672077
+       .long   1055001082
+       .long   0
+       .long   3221553152
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1881957148
+       .long   1016569186
+       .long   3451706443
+       .long   1072679940
+       .long   143468186
+       .long   1066002557
+       .long   553724800
+       .long   3213475431
+       .long   1049442771
+       .long   1065415105
+       .long   3378521943
+       .long   3211821787
+       .long   3176008209
+       .long   1062800361
+       .long   4016898691
+       .long   3208498219
+       .long   1548390021
+       .long   1058670598
+       .long   2097418483
+       .long   3202689041
+       .long   2756703589
+       .long   3201351283
+       .long   506736184
+       .long   1053405377
+       .long   0
+       .long   3221684224
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   450339788
+       .long   1015040915
+       .long   2959639058
+       .long   1072685166
+       .long   2289443405
+       .long   1065320893
+       .long   3331959139
+       .long   3212796584
+       .long   724199976
+       .long   1064616734
+       .long   938566183
+       .long   3211030741
+       .long   1640535667
+       .long   1062186735
+       .long   187996035
+       .long   3207841256
+       .long   822311531
+       .long   1058246461
+       .long   160890851
+       .long   3203087480
+       .long   3163291388
+       .long   1050479733
+       .long   578249940
+       .long   1051474021
+       .long   0
+       .long   3221815296
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   539445753
+       .long   1012635531
+       .long   3085578536
+       .long   1072688342
+       .long   2019637246
+       .long   1064510347
+       .long   2901018414
+       .long   3211991061
+       .long   2171427566
+       .long   1063868144
+       .long   678185093
+       .long   3210287638
+       .long   2685165718
+       .long   1061401571
+       .long   710336199
+       .long   3207152667
+       .long   2733135798
+       .long   1057659331
+       .long   886948177
+       .long   3202751664
+       .long   3345834247
+       .long   1052218043
+       .long   908728048
+       .long   1047925874
+       .long   0
+       .long   3221946368
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4240302093
+       .long   1016867082
+       .long   1832260410
+       .long   1072690271
+       .long   154153694
+       .long   1063730412
+       .long   2094548181
+       .long   3211211898
+       .long   1392727515
+       .long   1063180837
+       .long   3132890025
+       .long   3209604411
+       .long   483611698
+       .long   1060651750
+       .long   4246355421
+       .long   3206519479
+       .long   1424637421
+       .long   1057044161
+       .long   2138185318
+       .long   3202290304
+       .long   2276282642
+       .long   1052095798
+       .long   4227780935
+       .long   3196067472
+       .long   0
+       .long   3222077440
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2485733495
+       .long   1017000498
+       .long   484092514
+       .long   1072691442
+       .long   1653085170
+       .long   1063007344
+       .long   2893019346
+       .long   3210489400
+       .long   878866243
+       .long   1062388018
+       .long   2113174452
+       .long   3208818852
+       .long   2654141437
+       .long   1059959432
+       .long   3578550869
+       .long   3205727739
+       .long   315005006
+       .long   1056288680
+       .long   3246956604
+       .long   3201593495
+       .long   2197286540
+       .long   1051718329
+       .long   3044885069
+       .long   3196227269
+       .long   0
+       .long   3222208512
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2794994668
+       .long   1016833037
+       .long   3287420517
+       .long   1072692394
+       .long   4133778764
+       .long   1061857404
+       .long   689562148
+       .long   3209340342
+       .long   1404089106
+       .long   1061273627
+       .long   1292441425
+       .long   3207706805
+       .long   93671116
+       .long   1058816787
+       .long   2903327974
+       .long   3204626398
+       .long   4279279273
+       .long   1055202414
+       .long   134688023
+       .long   3200552187
+       .long   3315379764
+       .long   1050761310
+       .long   2945780649
+       .long   3195568939
+       .long   0
+       .long   3222339584
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2135621136
+       .long   1016053539
+       .long   309961636
+       .long   1072692934
+       .long   672792810
+       .long   1060347512
+       .long   2960305506
+       .long   3207830967
+       .long   1703867620
+       .long   1059726750
+       .long   824905914
+       .long   3206160796
+       .long   3036017847
+       .long   1057284422
+       .long   923304464
+       .long   3203122673
+       .long   1848642304
+       .long   1053791859
+       .long   2215350763
+       .long   3199158388
+       .long   3049848127
+       .long   1049324210
+       .long   3861893815
+       .long   3194293196
+       .long   0
+       .long   3222470656
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2236028675
+       .long   1016891036
+       .long   2177293363
+       .long   1072693132
+       .long   776830057
+       .long   1058856794
+       .long   4190004158
+       .long   3206340337
+       .long   209955488
+       .long   1058225857
+       .long   845130443
+       .long   3204660651
+       .long   4204313304
+       .long   1055835544
+       .long   364525198
+       .long   3201597210
+       .long   3889299905
+       .long   1052205563
+       .long   1514389355
+       .long   3197586647
+       .long   1706817756
+       .long   1047834665
+       .long   3817417318
+       .long   3192934132
+       .long   0
+       .long   3222601728
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1074033072
+       .long   1013200912
+       .long   2197899301
+       .long   1072693205
+       .long   1097614282
+       .long   1057308273
+       .long   209489097
+       .long   3204791893
+       .long   3641526339
+       .long   1056723664
+       .long   1792794946
+       .long   3203158586
+       .long   584598707
+       .long   1054254910
+       .long   253996240
+       .long   3200135633
+       .long   642640562
+       .long   1050754580
+       .long   3147361740
+       .long   3196139610
+       .long   1167319222
+       .long   1046395158
+       .long   3488053038
+       .long   3191370264
+       .long   0
+       .long   3222732800
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   871679747
+       .long   1016222468
+       .long   1586311569
+       .long   1072693232
+       .long   4199724405
+       .long   1055867613
+       .long   3041006250
+       .long   3203351246
+       .long   482130003
+       .long   1055184672
+       .long   1689676855
+       .long   3201619703
+       .long   116121201
+       .long   1052814264
+       .long   4166318198
+       .long   3198564764
+       .long   388552649
+       .long   1049191609
+       .long   1384400086
+       .long   3194577312
+       .long   135589376
+       .long   1044819515
+       .long   2497367318
+       .long   3189906305
+       .long   0
+       .long   3222863872
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   752986014
+       .long   1014740322
+       .long   1072834312
+       .long   1072693242
+       .long   1389704451
+       .long   1054277685
+       .long   817998738
+       .long   3201761329
+       .long   996777029
+       .long   1053731553
+       .long   811547911
+       .long   3200166603
+       .long   1604093935
+       .long   1051232383
+       .long   2381858127
+       .long   3197131472
+       .long   806055999
+       .long   1047703656
+       .long   443662424
+       .long   3193089938
+       .long   2855612429
+       .long   1043379518
+       .long   3671581230
+       .long   3188373004
+       .long   0
+       .long   3222994944
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4161630806
+       .long   1015796140
+       .long   3799386689
+       .long   1072693245
+       .long   516062805
+       .long   1052830799
+       .long   6188716
+       .long   3200314446
+       .long   79447568
+       .long   1052151909
+       .long   223529141
+       .long   3198586975
+       .long   1557009707
+       .long   1049758991
+       .long   1527834451
+       .long   3195539792
+       .long   3841571054
+       .long   1046184222
+       .long   3228035136
+       .long   3191570603
+       .long   2497745717
+       .long   1041799395
+       .long   3127975351
+       .long   3186863029
+       .long   0
+       .long   3223126016
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3013228433
+       .long   1015734301
+       .long   952591976
+       .long   1072693247
+       .long   3849195912
+       .long   1051256594
+       .long   1248135057
+       .long   3198740242
+       .long   1658384276
+       .long   1050712587
+       .long   3312197895
+       .long   3197147657
+       .long   2426751598
+       .long   1048219658
+       .long   2075412918
+       .long   3194074453
+       .long   1194511818
+       .long   1044659399
+       .long   2861395540
+       .long   3190045864
+       .long   1105252788
+       .long   1040325059
+       .long   278204179
+       .long   3185374362
+       .long   0
+       .long   3223257088
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4084683796
+       .long   1014352664
+       .long   3549182448
+       .long   1072693247
+       .long   4170486715
+       .long   1048984034
+       .long   3652359522
+       .long   3196467682
+       .long   1780445294
+       .long   1048420995
+       .long   3329441198
+       .long   3194856066
+       .long   663245309
+       .long   1045935418
+       .long   1918070306
+       .long   3191839818
+       .long   4225866973
+       .long   1042419329
+       .long   1974315224
+       .long   3187805832
+       .long   847480060
+       .long   1038120500
+       .long   2386310431
+       .long   3183105031
+       .long   0
+       .long   3223388160
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   951119343
+       .long   1016641415
+       .long   4194036288
+       .long   1072693247
+       .long   4207053894
+       .long   1045958742
+       .long   4131013457
+       .long   3193442390
+       .long   2503178506
+       .long   1045433060
+       .long   2309798544
+       .long   3191868132
+       .long   1503762043
+       .long   1042918157
+       .long   762244907
+       .long   3188792499
+       .long   3745081608
+       .long   1039371450
+       .long   3106729171
+       .long   3184757959
+       .long   3799011378
+       .long   1035063995
+       .long   693003136
+       .long   3180102041
+       .long   0
+       .long   3223519232
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1712896388
+       .long   1016000193
+       .long   4281307769
+       .long   1072693247
+       .long   3495080264
+       .long   1042943408
+       .long   3483806577
+       .long   3190427056
+       .long   3577360645
+       .long   1042374261
+       .long   3557467263
+       .long   3188809333
+       .long   3692227868
+       .long   1039911516
+       .long   1459944482
+       .long   3185739496
+       .long   624248087
+       .long   1036331657
+       .long   3930021706
+       .long   3181718167
+       .long   439009527
+       .long   1032014849
+       .long   3184212578
+       .long   3177110789
+       .long   0
+       .long   3223650304
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1958475666
+       .long   1013700788
+       .long   4293118680
+       .long   1072693247
+       .long   3829159519
+       .long   1039938855
+       .long   3827364885
+       .long   3187422503
+       .long   2374004141
+       .long   1039322650
+       .long   2380228874
+       .long   3185757722
+       .long   853065064
+       .long   1036916376
+       .long   3897809499
+       .long   3182694159
+       .long   2467115425
+       .long   1033300621
+       .long   2966460473
+       .long   3178687133
+       .long   4249027489
+       .long   1028973684
+       .long   3391824522
+       .long   3174085926
+       .long   0
+       .long   3223781376
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1028808661
+       .long   1012328597
+       .long   4294717113
+       .long   1072693247
+       .long   2759857858
+       .long   1036945975
+       .long   2759440340
+       .long   3184429623
+       .long   217750550
+       .long   1036278821
+       .long   228557927
+       .long   3182713893
+       .long   868996329
+       .long   1033914811
+       .long   130294465
+       .long   3179657124
+       .long   3979034581
+       .long   1030279068
+       .long   1690522291
+       .long   3175665582
+       .long   141102418
+       .long   1025941166
+       .long   3942643114
+       .long   3171030731
+       .long   0
+       .long   3223912448
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2461075155
+       .long   1015729939
+       .long   4294933437
+       .long   1072693247
+       .long   2559161110
+       .long   1033930834
+       .long   2559046852
+       .long   3181414482
+       .long   3206412049
+       .long   1033243416
+       .long   3218709064
+       .long   3179678488
+       .long   2091270467
+       .long   1030857342
+       .long   245853585
+       .long   3176629075
+       .long   1555900931
+       .long   1027267783
+       .long   1186881303
+       .long   3172654298
+       .long   1695278520
+       .long   1022918007
+       .long   1853146834
+       .long   3167983022
+       .long   0
+       .long   3224043520
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2502502488
+       .long   1016572066
+       .long   4294962713
+       .long   1072693247
+       .long   3137376149
+       .long   1030874690
+       .long   3137268820
+       .long   3178358338
+       .long   1097103169
+       .long   1030217134
+       .long   1110504267
+       .long   3176652206
+       .long   1068377398
+       .long   1027807171
+       .long   222176953
+       .long   3173610756
+       .long   3440315131
+       .long   1024267613
+       .long   1199778592
+       .long   3169654130
+       .long   257981480
+       .long   1019904983
+       .long   1388437918
+       .long   3164943417
+       .long   0
+       .long   3224174592
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3418697838
+       .long   1016821878
+       .long   4294966675
+       .long   1072693247
+       .long   3798207862
+       .long   1027825953
+       .long   3798094058
+       .long   3175309601
+       .long   3391459718
+       .long   1027200727
+       .long   3405981646
+       .long   3173635799
+       .long   3694208074
+       .long   1024764900
+       .long   2192272311
+       .long   3170602971
+       .long   1464408928
+       .long   1021279479
+       .long   2201370875
+       .long   3166665997
+       .long   4139632468
+       .long   1016902930
+       .long   2981161402
+       .long   3161912586
+       .long   0
+       .long   3224305664
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   3589768515
+       .long   1013972501
+       .long   4294967265
+       .long   1072693247
+       .long   2293865510
+       .long   1023336450
+       .long   2097549026
+       .long   3170820098
+       .long   2721138850
+       .long   1022661962
+       .long   1571631120
+       .long   3169097035
+       .long   3716649917
+       .long   1020295299
+       .long   3146231247
+       .long   3166041588
+       .long   84506245
+       .long   1016656297
+       .long   2231398946
+       .long   3162043093
+       .long   3305646943
+       .long   1012441980
+       .long   402214167
+       .long   3157503609
+       .long   0
+       .long   3224436736
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2152156943
+       .long   1016184605
+       .long   4294967294
+       .long   1072693247
+       .long   1074684533
+       .long   1018634353
+       .long   1074437943
+       .long   3166118001
+       .long   967276073
+       .long   1018090988
+       .long   995296768
+       .long   3164526060
+       .long   4275132894
+       .long   1015589675
+       .long   304133116
+       .long   3161485853
+       .long   1232215992
+       .long   1012058464
+       .long   559363548
+       .long   3157444977
+       .long   1487618473
+       .long   1007759094
+       .long   2355811294
+       .long   3152771929
+       .long   3381626085
+       .long   3224537056
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   4294967295
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   0
+       .long   2147483648
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   4294967295
+       .long   2147483647
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2147352576
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   1069416448
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   7733248
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .long   535822336
+       .type   __svml_dtanh_data_internal,@object
+       .size   __svml_dtanh_data_internal,10816
+       .align 8
+__dtanh_la__imldTanhTab:
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   3220176896
+       .type   __dtanh_la__imldTanhTab,@object
+       .size   __dtanh_la__imldTanhTab,16
+
+      .section        .note.GNU-stack,"",@progbits
diff --git a/numpy/core/src/umath/svml/linux/avx512/svml_z0_tanh_s_la.s b/numpy/core/src/umath/svml/linux/avx512/svml_z0_tanh_s_la.s
new file mode 100644 (file)
index 0000000..60c76d9
--- /dev/null
@@ -0,0 +1,1793 @@
+/*******************************************
+* Copyright (C) 2021 Intel Corporation
+* SPDX-License-Identifier: BSD-3-Clause
+*******************************************/
+
+/*
+ * ALGORITHM DESCRIPTION:
+ * 
+ *   NOTE: Since the hyperbolic tangent function is odd
+ *         (tanh(x) = -tanh(-x)), below algorithm deals with the absolute
+ *         value of the argument |x|: tanh(x) = sign(x) * tanh(|x|)
+ * 
+ *   We use a table lookup method to compute tanh(|x|).
+ *   The basic idea is to split the input range into a number of subintervals
+ *   and to approximate tanh(.) with a polynomial on each of them.
+ * 
+ *   IEEE SPECIAL CONDITIONS:
+ *   x = [+,-]0, r = [+,-]0
+ *   x = +Inf,   r = +1
+ *   x = -Inf,   r = -1
+ *   x = QNaN,   r = QNaN
+ *   x = SNaN,   r = QNaN
+ * 
+ * 
+ *   ALGORITHM DETAILS
+ *   We handle special values in a callout function, aside from main path
+ *   computations. "Special" for this algorithm are:
+ *   INF, NAN, |x| > HUGE_THRESHOLD
+ * 
+ * 
+ *   Main path computations are organized as follows:
+ *   Actually we split the interval [0, SATURATION_THRESHOLD)
+ *   into a number of subintervals.  On each subinterval we approximate tanh(.)
+ *   with a minimax polynomial of pre-defined degree. Polynomial coefficients
+ *   are computed beforehand and stored in table. We also use
+ * 
+ *       y := |x| + B,
+ * 
+ *   here B depends on subinterval and is used to make argument
+ *   closer to zero.
+ *   We also add large fake interval [SATURATION_THRESHOLD, HUGE_THRESHOLD],
+ *   where 1.0 + 0.0*y + 0.0*y^2 ... coefficients are stored - just to
+ *   preserve main path computation logic but return 1.0 for all arguments.
+ * 
+ *   Hence reconstruction looks as follows:
+ *   we extract proper polynomial and range reduction coefficients
+ *        (Pj and B), corresponding to subinterval, to which |x| belongs,
+ *        and return
+ * 
+ *       r := sign(x) * (P0 + P1 * y + ... + Pn * y^n)
+ * 
+ *   NOTE: we use multiprecision technique to multiply and sum the first
+ *         K terms of the polynomial. So Pj, j = 0..K are stored in
+ *         table each as a pair of target precision numbers (Pj and PLj) to
+ *         achieve wider than target precision.
+ * 
+ * --
+ * 
+ */
+
+
+       .text
+.L_2__routine_start___svml_tanhf16_z0_0:
+
+       .align    16,0x90
+       .globl __svml_tanhf16
+
+__svml_tanhf16:
+
+
+       .cfi_startproc
+..L2:
+
+        pushq     %rbp
+       .cfi_def_cfa_offset 16
+        movq      %rsp, %rbp
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+        andq      $-64, %rsp
+        subq      $192, %rsp
+        vmovaps   %zmm0, %zmm1
+        vmovups   __svml_stanh_data_internal(%rip), %zmm9
+        vmovups   896+__svml_stanh_data_internal(%rip), %zmm11
+        vmovups   768+__svml_stanh_data_internal(%rip), %zmm12
+        vmovups   640+__svml_stanh_data_internal(%rip), %zmm13
+        vmovups   512+__svml_stanh_data_internal(%rip), %zmm14
+        vmovups   384+__svml_stanh_data_internal(%rip), %zmm15
+        vpternlogd $255, %zmm2, %zmm2, %zmm2
+        vandps    5696+__svml_stanh_data_internal(%rip), %zmm1, %zmm8
+        vandps    5632+__svml_stanh_data_internal(%rip), %zmm1, %zmm0
+
+/* Here huge arguments, INF and NaNs are filtered out to callout. */
+        vpandd    1152+__svml_stanh_data_internal(%rip), %zmm1, %zmm3
+        vpsubd    1216+__svml_stanh_data_internal(%rip), %zmm3, %zmm4
+        vpcmpd    $2, 5824+__svml_stanh_data_internal(%rip), %zmm3, %k1
+
+/*
+ * * small table specific variables *
+ * **********************************
+ * -------------------- Constant loading -------------------
+ */
+        vpxord    %zmm5, %zmm5, %zmm5
+
+/* if VMIN, VMAX is defined for I type */
+        vpmaxsd   %zmm5, %zmm4, %zmm6
+        vpminsd   1280+__svml_stanh_data_internal(%rip), %zmm6, %zmm7
+        vpsrld    $21, %zmm7, %zmm10
+        vmovups   1024+__svml_stanh_data_internal(%rip), %zmm4
+        vpermt2ps 64+__svml_stanh_data_internal(%rip), %zmm10, %zmm9
+        vpermt2ps 960+__svml_stanh_data_internal(%rip), %zmm10, %zmm11
+        vpermt2ps 1088+__svml_stanh_data_internal(%rip), %zmm10, %zmm4
+        vpermt2ps 832+__svml_stanh_data_internal(%rip), %zmm10, %zmm12
+        vpermt2ps 704+__svml_stanh_data_internal(%rip), %zmm10, %zmm13
+        vpermt2ps 576+__svml_stanh_data_internal(%rip), %zmm10, %zmm14
+        vpermt2ps 448+__svml_stanh_data_internal(%rip), %zmm10, %zmm15
+        vpandnd   %zmm3, %zmm3, %zmm2{%k1}
+        vptestmd  %zmm2, %zmm2, %k0
+        vmovups   128+__svml_stanh_data_internal(%rip), %zmm3
+        vsubps    {rn-sae}, %zmm9, %zmm8, %zmm2
+        kmovw     %k0, %edx
+        vfmadd213ps {rn-sae}, %zmm11, %zmm2, %zmm4
+        vpermt2ps 192+__svml_stanh_data_internal(%rip), %zmm10, %zmm3
+        vfmadd213ps {rn-sae}, %zmm12, %zmm2, %zmm4
+        vfmadd213ps {rn-sae}, %zmm13, %zmm2, %zmm4
+        vfmadd213ps {rn-sae}, %zmm14, %zmm2, %zmm4
+        vfmadd213ps {rn-sae}, %zmm15, %zmm2, %zmm4
+        vfmadd213ps {rn-sae}, %zmm3, %zmm2, %zmm4
+        vorps     %zmm0, %zmm4, %zmm0
+        testl     %edx, %edx
+        jne       .LBL_1_3
+
+.LBL_1_2:
+
+
+/* no invcbrt in libm, so taking it out here */
+        movq      %rbp, %rsp
+        popq      %rbp
+       .cfi_def_cfa 7, 8
+       .cfi_restore 6
+        ret
+       .cfi_def_cfa 6, 16
+       .cfi_offset 6, -16
+
+.LBL_1_3:
+
+        vmovups   %zmm1, 64(%rsp)
+        vmovups   %zmm0, 128(%rsp)
+        je        .LBL_1_2
+
+
+        xorl      %eax, %eax
+
+
+        vzeroupper
+        kmovw     %k4, 24(%rsp)
+        kmovw     %k5, 16(%rsp)
+        kmovw     %k6, 8(%rsp)
+        kmovw     %k7, (%rsp)
+        movq      %rsi, 40(%rsp)
+        movq      %rdi, 32(%rsp)
+        movq      %r12, 56(%rsp)
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+        movl      %eax, %r12d
+        movq      %r13, 48(%rsp)
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+        movl      %edx, %r13d
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_7:
+
+        btl       %r12d, %r13d
+        jc        .LBL_1_10
+
+.LBL_1_8:
+
+        incl      %r12d
+        cmpl      $16, %r12d
+        jl        .LBL_1_7
+
+
+        kmovw     24(%rsp), %k4
+       .cfi_restore 122
+        kmovw     16(%rsp), %k5
+       .cfi_restore 123
+        kmovw     8(%rsp), %k6
+       .cfi_restore 124
+        kmovw     (%rsp), %k7
+       .cfi_restore 125
+        vmovups   128(%rsp), %zmm0
+        movq      40(%rsp), %rsi
+       .cfi_restore 4
+        movq      32(%rsp), %rdi
+       .cfi_restore 5
+        movq      56(%rsp), %r12
+       .cfi_restore 12
+        movq      48(%rsp), %r13
+       .cfi_restore 13
+        jmp       .LBL_1_2
+       .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22
+       .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22
+
+.LBL_1_10:
+
+        lea       64(%rsp,%r12,4), %rdi
+        lea       128(%rsp,%r12,4), %rsi
+
+        call      __svml_stanh_cout_rare_internal
+        jmp       .LBL_1_8
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_tanhf16,@function
+       .size   __svml_tanhf16,.-__svml_tanhf16
+..LN__svml_tanhf16.0:
+
+.L_2__routine_start___svml_stanh_cout_rare_internal_1:
+
+       .align    16,0x90
+
+__svml_stanh_cout_rare_internal:
+
+
+       .cfi_startproc
+..L53:
+
+        lea       __stanh_la__imlsTanhTab(%rip), %rdx
+        movb      3(%rdi), %al
+        andb      $-128, %al
+        shrb      $7, %al
+        movzbl    %al, %ecx
+        movzwl    2(%rdi), %r8d
+        andl      $32640, %r8d
+        movl      (%rdx,%rcx,4), %eax
+        cmpl      $32640, %r8d
+        je        .LBL_2_4
+
+.LBL_2_2:
+
+        movl      %eax, (%rsi)
+
+.LBL_2_3:
+
+        xorl      %eax, %eax
+        ret
+
+.LBL_2_4:
+
+        testl     $8388607, (%rdi)
+        je        .LBL_2_2
+
+
+        movss     (%rdi), %xmm0
+        addss     %xmm0, %xmm0
+        movss     %xmm0, (%rsi)
+        jmp       .LBL_2_3
+       .align    16,0x90
+
+       .cfi_endproc
+
+       .type   __svml_stanh_cout_rare_internal,@function
+       .size   __svml_stanh_cout_rare_internal,.-__svml_stanh_cout_rare_internal
+..LN__svml_stanh_cout_rare_internal.1:
+
+       .section .rodata, "a"
+       .align 64
+       .align 64
+__svml_stanh_data_internal:
+       .long   0
+       .long   1030750208
+       .long   1032847360
+       .long   1034944512
+       .long   1037041664
+       .long   1039138816
+       .long   1041235968
+       .long   1043333120
+       .long   1045430272
+       .long   1047527424
+       .long   1049624576
+       .long   1051721728
+       .long   1053818880
+       .long   1055916032
+       .long   1058013184
+       .long   1060110336
+       .long   1062207488
+       .long   1064304640
+       .long   1066401792
+       .long   1068498944
+       .long   1070596096
+       .long   1072693248
+       .long   1074790400
+       .long   1076887552
+       .long   1078984704
+       .long   1081081856
+       .long   1083179008
+       .long   1085276160
+       .long   1087373312
+       .long   1089470464
+       .long   1091567616
+       .long   0
+       .long   0
+       .long   1030732233
+       .long   1032831839
+       .long   1034916201
+       .long   1036994987
+       .long   1039067209
+       .long   1041174248
+       .long   1043220868
+       .long   1045245838
+       .long   1047245614
+       .long   1049383373
+       .long   1051287907
+       .long   1053115377
+       .long   1054857013
+       .long   1057129528
+       .long   1058581488
+       .long   1059832960
+       .long   1060891676
+       .long   1062153819
+       .long   1063337043
+       .long   1064100733
+       .long   1064582223
+       .long   1064984555
+       .long   1065216645
+       .long   1065302845
+       .long   1065334668
+       .long   1065349076
+       .long   1065352656
+       .long   1065353140
+       .long   1065353206
+       .long   1065353215
+       .long   1065353216
+       .long   0
+       .long   2963361822
+       .long   2971470750
+       .long   2945658640
+       .long   821708412
+       .long   824483568
+       .long   824941280
+       .long   2984085072
+       .long   2957298688
+       .long   838449816
+       .long   2966046080
+       .long   2988320324
+       .long   2989804564
+       .long   842626356
+       .long   3000013710
+       .long   2972725824
+       .long   3002017674
+       .long   853753500
+       .long   2987104448
+       .long   3000350914
+       .long   855535800
+       .long   852410906
+       .long   851608946
+       .long   2988641656
+       .long   2997011000
+       .long   2989576736
+       .long   3000884068
+       .long   2999984336
+       .long   840950056
+       .long   2995215280
+       .long   855269702
+       .long   0
+       .long   1065353216
+       .long   1065295748
+       .long   1065270545
+       .long   1065229919
+       .long   1065181343
+       .long   1065124909
+       .long   1065025765
+       .long   1064867200
+       .long   1064679597
+       .long   1064464345
+       .long   1064093083
+       .long   1063517074
+       .long   1062862743
+       .long   1062146519
+       .long   1060992371
+       .long   1059386208
+       .long   1057800167
+       .long   1055660649
+       .long   1051764737
+       .long   1046959010
+       .long   1041444634
+       .long   1035462611
+       .long   1026689093
+       .long   1015337940
+       .long   1002731447
+       .long   990958554
+       .long   973168670
+       .long   948705851
+       .long   924299482
+       .long   899955662
+       .long   864224966
+       .long   0
+       .long   2956213371
+       .long   3178161821
+       .long   3180268967
+       .long   3182315389
+       .long   3184339487
+       .long   3186337805
+       .long   3188474939
+       .long   3190373619
+       .long   3192189570
+       .long   3193910865
+       .long   3196176320
+       .long   3197556682
+       .long   3198679950
+       .long   3199536798
+       .long   3200331518
+       .long   3200564882
+       .long   3200049264
+       .long   3199029518
+       .long   3197040598
+       .long   3192620804
+       .long   3188208183
+       .long   3182392393
+       .long   3173916356
+       .long   3162750726
+       .long   3150176437
+       .long   3138431708
+       .long   3120650203
+       .long   3096189170
+       .long   3071783062
+       .long   3047439278
+       .long   3011707180
+       .long   0
+       .long   3198855845
+       .long   3198879250
+       .long   3198677023
+       .long   3198476576
+       .long   3198388151
+       .long   3198245218
+       .long   3197982711
+       .long   3197594458
+       .long   3197117197
+       .long   3196587519
+       .long   3195304371
+       .long   3192667528
+       .long   3189843074
+       .long   3186330810
+       .long   3177085101
+       .long   1013669486
+       .long   1032032579
+       .long   1036132065
+       .long   1038305199
+       .long   1036774550
+       .long   1033498413
+       .long   1028927137
+       .long   1021175553
+       .long   1009568359
+       .long   998361895
+       .long   985691041
+       .long   967585842
+       .long   943363289
+       .long   919210013
+       .long   895139148
+       .long   858471606
+       .long   0
+       .long   3077428921
+       .long   3189516141
+       .long   1008586543
+       .long   1036101517
+       .long   1033304453
+       .long   1034073627
+       .long   1036071831
+       .long   1037235824
+       .long   1039436298
+       .long   1040631208
+       .long   1041906362
+       .long   1042793477
+       .long   1043232976
+       .long   1043086916
+       .long   1042100375
+       .long   1039444212
+       .long   1034126600
+       .long   1026638186
+       .long   995501655
+       .long   3165579977
+       .long   3167654937
+       .long   3165317828
+       .long   3158960080
+       .long   3148291549
+       .long   3137354510
+       .long   3124730373
+       .long   3106670759
+       .long   3082457650
+       .long   3058305807
+       .long   3034235241
+       .long   2997581996
+       .long   0
+       .long   1040781545
+       .long   1131811139
+       .long   1097198812
+       .long   3247503190
+       .long   3230402941
+       .long   3224086547
+       .long   3212798938
+       .long   1059790272
+       .long   1053691997
+       .long   1061317268
+       .long   3134918084
+       .long   1034173207
+       .long   3176246152
+       .long   3165561405
+       .long   3174788493
+       .long   3178015405
+       .long   3178847213
+       .long   3177176538
+       .long   3171127099
+       .long   3155996003
+       .long   985352038
+       .long   999682315
+       .long   998398067
+       .long   989522534
+       .long   977926264
+       .long   966355955
+       .long   948911724
+       .long   924561635
+       .long   900244966
+       .long   875993879
+       .long   841254832
+       .long   0
+       .long   3155046246
+       .long   1175181842
+       .long   1138112751
+       .long   3286309950
+       .long   3267011817
+       .long   3259619885
+       .long   3246758786
+       .long   1088248663
+       .long   1078543936
+       .long   1086795944
+       .long   3205436942
+       .long   1043392367
+       .long   3198686087
+       .long   3182586396
+       .long   3174374999
+       .long   3142320544
+       .long   1008565243
+       .long   1014115537
+       .long   1016545052
+       .long   1010017051
+       .long   998649588
+       .long   975680464
+       .long   3124451591
+       .long   3121544226
+       .long   3112148751
+       .long   3100159824
+       .long   3082673659
+       .long   3058641232
+       .long   3034613169
+       .long   3010665978
+       .long   2975473412
+       .long   0
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   2145386496
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   1027604480
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   65011712
+       .long   0
+       .long   0
+       .long   36466923
+       .long   1072693248
+       .long   2365563284
+       .long   3201306247
+       .long   1829111721
+       .long   3218428278
+       .long   3823420055
+       .long   3193165324
+       .long   1098370908
+       .long   1072693250
+       .long   2493848101
+       .long   3205978300
+       .long   1742787824
+       .long   3218423470
+       .long   4013086462
+       .long   3193609799
+       .long   3667406935
+       .long   1072693250
+       .long   1352570026
+       .long   3206273363
+       .long   1445916117
+       .long   3218422747
+       .long   3835089556
+       .long   3194065339
+       .long   2420711447
+       .long   1072693251
+       .long   2169133006
+       .long   3206574718
+       .long   101347106
+       .long   3218421982
+       .long   713636389
+       .long   3194411770
+       .long   1709214929
+       .long   1072693252
+       .long   1710199222
+       .long   3206758855
+       .long   2216669086
+       .long   3218421174
+       .long   3814844772
+       .long   3194836884
+       .long   1591910603
+       .long   1072693253
+       .long   2011589771
+       .long   3206962796
+       .long   3721194918
+       .long   3218420324
+       .long   1295469166
+       .long   3195182212
+       .long   2130808979
+       .long   1072693254
+       .long   1222040805
+       .long   3207187539
+       .long   555871541
+       .long   3218419433
+       .long   401254514
+       .long   3195493098
+       .long   3390924472
+       .long   1072693255
+       .long   3112838711
+       .long   3207434078
+       .long   1558155560
+       .long   3218418499
+       .long   683885552
+       .long   3195864282
+       .long   1145294069
+       .long   1072693257
+       .long   1821670117
+       .long   3207648695
+       .long   2692181933
+       .long   3218417523
+       .long   2704036295
+       .long   3196181879
+       .long   4054831834
+       .long   1072693258
+       .long   1649153664
+       .long   3207795248
+       .long   4228604383
+       .long   3218416505
+       .long   4004758581
+       .long   3196440654
+       .long   3603542514
+       .long   1072693260
+       .long   1123737044
+       .long   3207954183
+       .long   2154630785
+       .long   3218415446
+       .long   2606327835
+       .long   3196743208
+       .long   4163276658
+       .long   1072693262
+       .long   2048619642
+       .long   3208125991
+       .long   1058893780
+       .long   3218414345
+       .long   250194901
+       .long   3197094852
+       .long   1518877548
+       .long   1072693265
+       .long   3379868633
+       .long   3208311162
+       .long   1246516380
+       .long   3218413202
+       .long   1621358934
+       .long   3197304764
+       .long   48033162
+       .long   1072693268
+       .long   957106177
+       .long   3208510185
+       .long   3034045498
+       .long   3218412017
+       .long   798414253
+       .long   3197538466
+       .long   4131323741
+       .long   1072693270
+       .long   2207647163
+       .long   3208683052
+       .long   2454449664
+       .long   3218410791
+       .long   1709648499
+       .long   3197805932
+       .long   972334142
+       .long   1072693274
+       .long   1279092327
+       .long   3208797143
+       .long   4141984674
+       .long   3218409523
+       .long   4279927728
+       .long   3198110676
+       .long   3547307714
+       .long   1072693277
+       .long   873763845
+       .long   3208918886
+       .long   4152286949
+       .long   3218408214
+       .long   947630201
+       .long   3198400037
+       .long   3779918761
+       .long   1072693283
+       .long   2452756690
+       .long   3209115951
+       .long   2900277560
+       .long   3218406175
+       .long   4114829322
+       .long   3198840356
+       .long   1550746642
+       .long   1072693293
+       .long   3179273584
+       .long   3209408258
+       .long   1697097694
+       .long   3218403310
+       .long   3189856208
+       .long   3199299134
+       .long   2567958063
+       .long   1072693304
+       .long   2177201355
+       .long   3209713300
+       .long   663593652
+       .long   3218400281
+       .long   1915839956
+       .long   3199641526
+       .long   3400799630
+       .long   1072693317
+       .long   2625933576
+       .long   3209895292
+       .long   3140727122
+       .long   3218397088
+       .long   2825210621
+       .long   3200061154
+       .long   661592278
+       .long   1072693333
+       .long   2751163500
+       .long   3210096603
+       .long   4055449010
+       .long   3218393733
+       .long   57286782
+       .long   3200412116
+       .long   3889851982
+       .long   1072693350
+       .long   2680384314
+       .long   3210318153
+       .long   2804057046
+       .long   3218390217
+       .long   1812582369
+       .long   3200718155
+       .long   1191734144
+       .long   1072693371
+       .long   867498228
+       .long   3210560852
+       .long   3250577733
+       .long   3218386540
+       .long   3326742410
+       .long   3201083020
+       .long   2188854007
+       .long   1072693394
+       .long   363145135
+       .long   3210782655
+       .long   840173644
+       .long   3218382704
+       .long   1735074843
+       .long   3201408616
+       .long   3657661222
+       .long   1072693420
+       .long   2204762872
+       .long   3210926495
+       .long   4072217384
+       .long   3218378708
+       .long   2965875284
+       .long   3201662196
+       .long   2413420961
+       .long   1072693450
+       .long   1162405510
+       .long   3211082241
+       .long   138720143
+       .long   3218374556
+       .long   454705634
+       .long   3201958187
+       .long   3899194868
+       .long   1072693483
+       .long   669033796
+       .long   3211250324
+       .long   2167069495
+       .long   3218370246
+       .long   1542529428
+       .long   3202301612
+       .long   710018948
+       .long   1072693521
+       .long   2883210692
+       .long   3211431169
+       .long   1973418570
+       .long   3218365781
+       .long   3156689511
+       .long   3202524481
+       .long   2656657906
+       .long   1072693562
+       .long   3498100032
+       .long   3211625196
+       .long   125419693
+       .long   3218361162
+       .long   1620715508
+       .long   3202751895
+       .long   2404819887
+       .long   1072693608
+       .long   4021715948
+       .long   3211810552
+       .long   1645154164
+       .long   3218356389
+       .long   703452016
+       .long   3203011668
+       .long   1243884135
+       .long   1072693659
+       .long   480742811
+       .long   3211921363
+       .long   3122063309
+       .long   3218351464
+       .long   223504399
+       .long   3203307063
+       .long   495862037
+       .long   1072693715
+       .long   300794004
+       .long   3212039372
+       .long   1300653287
+       .long   3218346389
+       .long   1176592120
+       .long   3203610816
+       .long   3274452673
+       .long   1072693808
+       .long   2613861807
+       .long   3212229889
+       .long   359514654
+       .long   3218338503
+       .long   2923503278
+       .long   3204034910
+       .long   3741678157
+       .long   1072693954
+       .long   3651935792
+       .long   3212511436
+       .long   2702507736
+       .long   3218327463
+       .long   2210624435
+       .long   3204506468
+       .long   1100251351
+       .long   1072694127
+       .long   3514265607
+       .long   3212825173
+       .long   957470414
+       .long   3218315845
+       .long   1305550937
+       .long   3204833184
+       .long   2996845965
+       .long   1072694328
+       .long   3142229264
+       .long   3213004685
+       .long   1883674585
+       .long   3218303659
+       .long   3326598907
+       .long   3205231584
+       .long   274977645
+       .long   1072694562
+       .long   3016319234
+       .long   3213195820
+       .long   1539002348
+       .long   3218290918
+       .long   3984366897
+       .long   3205604614
+       .long   1292806442
+       .long   1072694830
+       .long   3262520051
+       .long   3213405058
+       .long   2372653574
+       .long   3218277634
+       .long   2452462577
+       .long   3205892032
+       .long   1815353697
+       .long   1072695136
+       .long   3662183375
+       .long   3213632998
+       .long   250148789
+       .long   3218263821
+       .long   2158010733
+       .long   3206232708
+       .long   2150433494
+       .long   1072695483
+       .long   3919565056
+       .long   3213880202
+       .long   1540395291
+       .long   3218249491
+       .long   3182910565
+       .long   3206589369
+       .long   2808974545
+       .long   1072695874
+       .long   1965799910
+       .long   3214016317
+       .long   1545570484
+       .long   3218234659
+       .long   1413633121
+       .long   3206823218
+       .long   164723038
+       .long   1072696313
+       .long   81021250
+       .long   3214159950
+       .long   1583468454
+       .long   3218219339
+       .long   18571726
+       .long   3207094384
+       .long   3588317822
+       .long   1072696801
+       .long   4095098713
+       .long   3214313941
+       .long   298038316
+       .long   3218203546
+       .long   912947688
+       .long   3207406859
+       .long   1041448961
+       .long   1072697344
+       .long   4179586945
+       .long   3214478495
+       .long   2148027612
+       .long   3218187294
+       .long   3720520462
+       .long   3207679413
+       .long   1980273179
+       .long   1072697943
+       .long   1752543433
+       .long   3214653794
+       .long   124299728
+       .long   3218170600
+       .long   864061540
+       .long   3207883361
+       .long   2949417123
+       .long   1072698602
+       .long   4190073881
+       .long   3214839998
+       .long   1415544749
+       .long   3218153478
+       .long   3694676202
+       .long   3208114560
+       .long   420771937
+       .long   1072699325
+       .long   1282420231
+       .long   3214985633
+       .long   1533345938
+       .long   3218135945
+       .long   2892854837
+       .long   3208375402
+       .long   3632588569
+       .long   1072700113
+       .long   2712748874
+       .long   3215089842
+       .long   1386124246
+       .long   3218118017
+       .long   1634175019
+       .long   3208733922
+       .long   347483009
+       .long   1072701423
+       .long   1161341506
+       .long   3215256321
+       .long   1877668895
+       .long   3218090451
+       .long   4108664264
+       .long   3209099007
+       .long   3038559136
+       .long   1072703435
+       .long   2683048238
+       .long   3215498732
+       .long   1179454900
+       .long   3218025113
+       .long   1332126937
+       .long   3209546908
+       .long   3486307715
+       .long   1072705767
+       .long   2508275841
+       .long   3215764027
+       .long   359393231
+       .long   3217946511
+       .long   1961215910
+       .long   3209890029
+       .long   2252418763
+       .long   1072708441
+       .long   2827865151
+       .long   3216017387
+       .long   3509880367
+       .long   3217865627
+       .long   3222140085
+       .long   3210213923
+       .long   1486994624
+       .long   1072711477
+       .long   3160629487
+       .long   3216172802
+       .long   1178047112
+       .long   3217782741
+       .long   1901428593
+       .long   3210596649
+       .long   3746562216
+       .long   1072714893
+       .long   1033996001
+       .long   3216339382
+       .long   39866696
+       .long   3217698130
+       .long   2908573463
+       .long   3210891953
+       .long   2324761591
+       .long   1072718707
+       .long   2389401627
+       .long   3216516876
+       .long   3645939838
+       .long   3217612071
+       .long   2440236284
+       .long   3211151116
+       .long   1761407793
+       .long   1072722932
+       .long   2502005220
+       .long   3216704962
+       .long   1997398717
+       .long   3217524842
+       .long   2895026412
+       .long   3211448596
+       .long   4114502182
+       .long   1072727579
+       .long   2605061383
+       .long   3216903247
+       .long   58515002
+       .long   3217436714
+       .long   711731960
+       .long   3211787230
+       .long   3951984035
+       .long   1072732658
+       .long   3516063216
+       .long   3217071220
+       .long   3638757279
+       .long   3217347953
+       .long   3233370794
+       .long   3211979005
+       .long   658281779
+       .long   1072738175
+       .long   309554960
+       .long   3217179845
+       .long   1331214594
+       .long   3217258823
+       .long   2937534811
+       .long   3212193451
+       .long   2289001467
+       .long   1072744131
+       .long   2442043690
+       .long   3217292793
+       .long   2664085653
+       .long   3217169576
+       .long   3462081454
+       .long   3212432263
+       .long   3795084150
+       .long   1072750527
+       .long   1130374688
+       .long   3217409754
+       .long   3638257201
+       .long   3217080459
+       .long   3906637920
+       .long   3212696488
+       .long   4040275044
+       .long   1072757360
+       .long   3643517564
+       .long   3217530392
+       .long   4148962921
+       .long   3216952251
+       .long   1995056602
+       .long   3212911950
+       .long   1479928784
+       .long   1072764624
+       .long   2653868580
+       .long   3217654355
+       .long   1010106713
+       .long   3216775940
+       .long   3129357315
+       .long   3213070764
+       .long   2856812514
+       .long   1072772308
+       .long   1621093115
+       .long   3217781272
+       .long   1824031529
+       .long   3216601249
+       .long   2296680075
+       .long   3213333328
+       .long   2460843475
+       .long   1072784536
+       .long   3722925065
+       .long   3217975665
+       .long   3901534801
+       .long   3216343697
+       .long   741495589
+       .long   3213734822
+       .long   13033194
+       .long   1072802249
+       .long   1706090638
+       .long   3218161084
+       .long   4129724113
+       .long   3216008854
+       .long   2582831738
+       .long   3214039094
+       .long   3092949488
+       .long   1072821329
+       .long   4163404160
+       .long   3218296789
+       .long   673560195
+       .long   3215391593
+       .long   1852259695
+       .long   3214295490
+       .long   3663604487
+       .long   1072841572
+       .long   2783926416
+       .long   3218433189
+       .long   538028418
+       .long   3214623601
+       .long   955002681
+       .long   3214577680
+       .long   1457520314
+       .long   1072862739
+       .long   2977011911
+       .long   3218568683
+       .long   2456605794
+       .long   3213048602
+       .long   1782979473
+       .long   3214883178
+       .long   3136246603
+       .long   1072884563
+       .long   4172123069
+       .long   3218701739
+       .long   1041205303
+       .long   1065062250
+       .long   1494191018
+       .long   3215071352
+       .long   2030188257
+       .long   1072906761
+       .long   242335435
+       .long   3218830924
+       .long   3225388224
+       .long   1066807264
+       .long   2597486284
+       .long   3215242091
+       .long   1527970838
+       .long   1072929036
+       .long   2966426512
+       .long   3218954923
+       .long   1554080475
+       .long   1067589039
+       .long   1299968651
+       .long   3215418462
+       .long   3575385503
+       .long   1072951087
+       .long   2115725422
+       .long   3219072567
+       .long   1970202642
+       .long   1068007486
+       .long   633750547
+       .long   3215597833
+       .long   4170701031
+       .long   1072972617
+       .long   46586082
+       .long   3219155579
+       .long   1194653136
+       .long   1068384025
+       .long   4171340731
+       .long   3215777352
+       .long   3578160514
+       .long   1072993337
+       .long   3238411740
+       .long   3219206599
+       .long   3278559237
+       .long   1068609006
+       .long   2404931200
+       .long   3215954013
+       .long   533888921
+       .long   1073012973
+       .long   1507597629
+       .long   3219253160
+       .long   2386969249
+       .long   1068756225
+       .long   272720058
+       .long   3216053653
+       .long   54544651
+       .long   1073031269
+       .long   3020671348
+       .long   3219294996
+       .long   4122670807
+       .long   1068883785
+       .long   2536786852
+       .long   3216134458
+       .long   230026772
+       .long   1073047994
+       .long   2830531360
+       .long   3219331923
+       .long   2545616196
+       .long   1068992498
+       .long   3897096954
+       .long   3216209170
+       .long   867435464
+       .long   1073062943
+       .long   3935983781
+       .long   3219363830
+       .long   4280666630
+       .long   1069083305
+       .long   1614478429
+       .long   3216276286
+       .long   3991143559
+       .long   1073075939
+       .long   3165050417
+       .long   3219390677
+       .long   248866814
+       .long   1069157251
+       .long   2328429718
+       .long   3216358398
+       .long   1880129173
+       .long   1073091258
+       .long   4059723411
+       .long   3219421162
+       .long   3082848917
+       .long   1069238148
+       .long   1081358649
+       .long   3216430553
+       .long   1955557582
+       .long   1073104040
+       .long   2869422647
+       .long   3219445318
+       .long   1310544530
+       .long   1069299023
+       .long   434435025
+       .long   3216450109
+       .long   3947018234
+       .long   1073107343
+       .long   3414641036
+       .long   3219451270
+       .long   4069313179
+       .long   1069313321
+       .long   1392468754
+       .long   3216410502
+       .long   3271741504
+       .long   1073101128
+       .long   3884994071
+       .long   3219440866
+       .long   1456085694
+       .long   1069290099
+       .long   2332856790
+       .long   3216307665
+       .long   3950891192
+       .long   1073085735
+       .long   439037894
+       .long   3219416288
+       .long   1197951536
+       .long   1069237765
+       .long   4195788421
+       .long   3216139842
+       .long   3990997338
+       .long   1073061787
+       .long   550042602
+       .long   3219379833
+       .long   2832452545
+       .long   1069163766
+       .long   1200943255
+       .long   3215832361
+       .long   2073883731
+       .long   1073030122
+       .long   3042850267
+       .long   3219333800
+       .long   991641143
+       .long   1069074535
+       .long   1637244010
+       .long   3215243222
+       .long   3805163810
+       .long   1072991715
+       .long   3517445189
+       .long   3219280382
+       .long   2680864185
+       .long   1068975465
+       .long   1457843741
+       .long   3214140932
+       .long   1315080793
+       .long   1072947617
+       .long   3059804278
+       .long   3219221594
+       .long   2861308047
+       .long   1068870963
+       .long   3296491873
+       .long   1064537111
+       .long   3728462150
+       .long   1072898893
+       .long   3615137083
+       .long   3219159232
+       .long   3017963192
+       .long   1068764532
+       .long   3972434375
+       .long   1067468619
+       .long   1336398218
+       .long   1072846587
+       .long   1068664290
+       .long   3219061390
+       .long   122240345
+       .long   1068658880
+       .long   508009436
+       .long   1068456917
+       .long   3501538245
+       .long   1072791681
+       .long   968690691
+       .long   3218931236
+       .long   1514516445
+       .long   1068556030
+       .long   671541798
+       .long   1069006173
+       .long   3814409280
+       .long   1072735081
+       .long   1553551847
+       .long   3218801852
+       .long   2849431279
+       .long   1068415930
+       .long   285838780
+       .long   1069554660
+       .long   2881499585
+       .long   1072661949
+       .long   928028610
+       .long   3218674977
+       .long   8837506
+       .long   1068229231
+       .long   4283922105
+       .long   1069842903
+       .long   1813934616
+       .long   1072546640
+       .long   2296020303
+       .long   3218551962
+       .long   3757630126
+       .long   1068054242
+       .long   4184842874
+       .long   1070138481
+       .long   1612285858
+       .long   1072432209
+       .long   3568867548
+       .long   3218433820
+       .long   2489334631
+       .long   1067891605
+       .long   3119354956
+       .long   1070586029
+       .long   1945534618
+       .long   1072265408
+       .long   12375465
+       .long   3218268030
+       .long   869568690
+       .long   1067671872
+       .long   313517472
+       .long   1070892138
+       .long   1205077106
+       .long   1072052753
+       .long   2329101392
+       .long   3218055718
+       .long   31064032
+       .long   1067390210
+       .long   1106783211
+       .long   1071186310
+       .long   571472860
+       .long   1071856508
+       .long   2279775366
+       .long   3217706561
+       .long   3977902324
+       .long   1066976012
+       .long   1438560376
+       .long   1071467394
+       .long   433300635
+       .long   1071678859
+       .long   2662131044
+       .long   3217407122
+       .long   3461865003
+       .long   1066639491
+       .long   3761842524
+       .long   1071687909
+       .long   591758334
+       .long   1071396321
+       .long   1311878841
+       .long   3217153539
+       .long   3007781852
+       .long   1066335723
+       .long   1614590629
+       .long   1071809819
+       .long   1253814918
+       .long   1071117476
+       .long   1728609767
+       .long   3216850667
+       .long   2200561853
+       .long   1065903347
+       .long   3821226689
+       .long   1071921115
+       .long   2022982069
+       .long   1070874479
+       .long   2030156196
+       .long   3216496942
+       .long   874711265
+       .long   1065560045
+       .long   2003227996
+       .long   1072021655
+       .long   2808404217
+       .long   1070664514
+       .long   1372837647
+       .long   3216204595
+       .long   822053276
+       .long   1065224094
+       .long   3767175364
+       .long   1072111660
+       .long   3043371777
+       .long   1070372670
+       .long   1442419211
+       .long   3215945892
+       .long   298752438
+       .long   1064796452
+       .long   1111528881
+       .long   1072191609
+       .long   3513208196
+       .long   1070065467
+       .long   3837735739
+       .long   3215552388
+       .long   3701924119
+       .long   1064460397
+       .long   1230501085
+       .long   1072262142
+       .long   2161267832
+       .long   1069804871
+       .long   4188367704
+       .long   3215231429
+       .long   401190186
+       .long   1064089052
+       .long   3002339892
+       .long   1072323996
+       .long   1480019407
+       .long   1069584807
+       .long   1833655520
+       .long   3214970435
+       .long   2907956919
+       .long   1063676311
+       .long   875346000
+       .long   1072377952
+       .long   3150437403
+       .long   1069251888
+       .long   876861923
+       .long   3214583482
+       .long   1689748747
+       .long   1063353511
+       .long   2795554744
+       .long   1072424793
+       .long   3869705215
+       .long   1068941581
+       .long   1837883894
+       .long   3214240854
+       .long   2762317048
+       .long   1062946513
+       .long   2491972100
+       .long   1072465284
+       .long   4114823501
+       .long   1068682289
+       .long   2146865463
+       .long   3213964103
+       .long   800804261
+       .long   1062552648
+       .long   2634953449
+       .long   1072500149
+       .long   2952556276
+       .long   1068433515
+       .long   1872935290
+       .long   3213596436
+       .long   525130857
+       .long   1062245296
+       .long   3287041404
+       .long   1072542855
+       .long   164674845
+       .long   1067923724
+       .long   3273134342
+       .long   3213089271
+       .long   171708004
+       .long   1061610314
+       .long   3035032320
+       .long   1072586748
+       .long   3976243935
+       .long   1067403539
+       .long   3504708444
+       .long   3212404491
+       .long   3955947885
+       .long   1060882840
+       .long   513098494
+       .long   1072618404
+       .long   416924237
+       .long   1066726877
+       .long   1788945081
+       .long   3211801737
+       .long   1199639353
+       .long   1060166859
+       .long   2284134637
+       .long   1072641010
+       .long   754275327
+       .long   1066136447
+       .long   94803481
+       .long   3211042671
+       .long   3377507017
+       .long   1059354147
+       .long   1467291457
+       .long   1072657015
+       .long   2435597312
+       .long   1065520743
+       .long   2819017772
+       .long   3210358609
+       .long   1988617747
+       .long   1058591581
+       .long   633705514
+       .long   1072668259
+       .long   392269686
+       .long   1064864433
+       .long   2964449929
+       .long   3209729770
+       .long   3963893163
+       .long   1057889872
+       .long   2214892393
+       .long   1072676103
+       .long   2190738271
+       .long   1064315837
+       .long   3773826451
+       .long   3208969045
+       .long   3609404170
+       .long   1057113308
+       .long   3795216963
+       .long   1072681541
+       .long   3959981107
+       .long   1063599490
+       .long   1577139384
+       .long   3208281591
+       .long   1777963469
+       .long   1056319886
+       .long   2768813161
+       .long   1072685290
+       .long   452197850
+       .long   1062981751
+       .long   625862001
+       .long   3207639777
+       .long   1894515286
+       .long   1055580811
+       .long   809336726
+       .long   1072687861
+       .long   325412222
+       .long   1062349073
+       .long   3494772326
+       .long   3206874482
+       .long   3143092609
+       .long   1054887561
+       .long   1391578948
+       .long   1072689615
+       .long   370441451
+       .long   1061660435
+       .long   67458841
+       .long   3206180214
+       .long   1971759196
+       .long   1054066692
+       .long   57274217
+       .long   1072690807
+       .long   293665776
+       .long   1061075750
+       .long   1340185983
+       .long   3205535605
+       .long   2210177191
+       .long   1053294335
+       .long   1110907588
+       .long   1072691613
+       .long   3961986905
+       .long   1060367146
+       .long   3774614905
+       .long   3204763416
+       .long   3590429673
+       .long   1052580827
+       .long   2737507729
+       .long   1072692156
+       .long   370479370
+       .long   1059701790
+       .long   1033751386
+       .long   3204059641
+       .long   1162278823
+       .long   1051830218
+       .long   2341375458
+       .long   1072692521
+       .long   760364123
+       .long   1059103172
+       .long   910883556
+       .long   3203420282
+       .long   401067508
+       .long   1051028170
+       .long   3358303651
+       .long   1072692765
+       .long   3104773993
+       .long   1058369139
+       .long   2043715743
+       .long   3202639413
+       .long   4274377921
+       .long   1050278646
+       .long   3501940353
+       .long   1072692984
+       .long   2710387139
+       .long   1057384557
+       .long   2550611600
+       .long   3201592258
+       .long   2260324605
+       .long   1049158690
+       .long   3160989127
+       .long   1072693133
+       .long   1403521776
+       .long   1056074537
+       .long   760745859
+       .long   3200238663
+       .long   1163121055
+       .long   1047679067
+       .long   3509020169
+       .long   1072693198
+       .long   3352058101
+       .long   1054743188
+       .long   2289323607
+       .long   3198722761
+       .long   918272756
+       .long   1046147840
+       .long   4268817660
+       .long   1072693226
+       .long   1580550645
+       .long   1053325591
+       .long   1736251411
+       .long   3197308470
+       .long   1531106447
+       .long   1044632576
+       .long   0
+       .long   1072693248
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   0
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483648
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2147483647
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2146959360
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   2130706432
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   1022885888
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .long   69730304
+       .type   __svml_stanh_data_internal,@object
+       .size   __svml_stanh_data_internal,6016
+       .align 4
+__stanh_la__imlsTanhTab:
+       .long   1065353216
+       .long   3212836864
+       .type   __stanh_la__imlsTanhTab,@object
+       .size   __stanh_la__imlsTanhTab,8
+
+      .section        .note.GNU-stack,"",@progbits
index 068ff2d7eeaccbbaa1606d24c6976303408a9fad..78f6f4b5a88d2e0717324c1a3c48e0542f9d65d1 100644 (file)
  * Rick White
  *
  */
-#define _UMATHMODULE
-#define _MULTIARRAYMODULE
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+#define _UMATHMODULE
 
-#include "Python.h"
-#include "stddef.h"
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
+#include <stddef.h>
 
 #include "npy_config.h"
 #include "npy_pycompat.h"
@@ -41,6 +43,7 @@
 #include "ufunc_type_resolution.h"
 #include "reduction.h"
 #include "mem_overlap.h"
+#include "npy_hashtable.h"
 
 #include "ufunc_object.h"
 #include "override.h"
 #include "common.h"
 #include "dtypemeta.h"
 #include "numpyos.h"
+#include "dispatching.h"
+#include "convert_datatype.h"
+#include "legacy_array_method.h"
+#include "abstractdtypes.h"
 
 /********** PRINTF DEBUG TRACING **************/
 #define NPY_UF_DBG_TRACING 0
@@ -100,6 +107,12 @@ _get_wrap_prepare_args(ufunc_full_args full_args) {
 static PyObject *
 prepare_input_arguments_for_outer(PyObject *args, PyUFuncObject *ufunc);
 
+static int
+resolve_descriptors(int nop,
+        PyUFuncObject *ufunc, PyArrayMethodObject *ufuncimpl,
+        PyArrayObject *operands[], PyArray_Descr *dtypes[],
+        PyArray_DTypeMeta *signature[], NPY_CASTING casting);
+
 
 /*UFUNC_API*/
 NPY_NO_EXPORT int
@@ -603,9 +616,24 @@ _is_same_name(const char* s1, const char* s2)
 }
 
 /*
- * Sets core_num_dim_ix, core_num_dims, core_dim_ixs, core_offsets,
- * and core_signature in PyUFuncObject "ufunc".  Returns 0 unless an
- * error occurred.
+ * Sets the following fields in the PyUFuncObject 'ufunc':
+ *
+ * Field             Type                     Array Length
+ * core_enabled      int (effectively bool)   N/A
+ * core_num_dim_ix   int                      N/A
+ * core_dim_flags    npy_uint32 *             core_num_dim_ix
+ * core_dim_sizes    npy_intp *               core_num_dim_ix
+ * core_num_dims     int *                    nargs (i.e. nin+nout)
+ * core_offsets      int *                    nargs
+ * core_dim_ixs      int *                    sum(core_num_dims)
+ * core_signature    char *                   strlen(signature) + 1
+ *
+ * The function assumes that the values that are arrays have not
+ * been set already, and sets these pointers to memory allocated
+ * with PyArray_malloc.  These are freed when the ufunc dealloc
+ * method is called.
+ *
+ * Returns 0 unless an error occurred.
  */
 static int
 _parse_signature(PyUFuncObject *ufunc, const char *signature)
@@ -910,7 +938,9 @@ _wheremask_converter(PyObject *obj, PyArrayObject **wheremask)
  */
 static int
 convert_ufunc_arguments(PyUFuncObject *ufunc,
-        ufunc_full_args full_args, PyArrayObject **out_op,
+        ufunc_full_args full_args, PyArrayObject *out_op[],
+        PyArray_DTypeMeta *out_op_DTypes[],
+        npy_bool *force_legacy_promotion, npy_bool *allow_legacy_promotion,
         PyObject *order_obj, NPY_ORDER *out_order,
         PyObject *casting_obj, NPY_CASTING *out_casting,
         PyObject *subok_obj, npy_bool *out_subok,
@@ -923,30 +953,65 @@ convert_ufunc_arguments(PyUFuncObject *ufunc,
     PyObject *obj;
 
     /* Convert and fill in input arguments */
+    npy_bool all_scalar = NPY_TRUE;
+    npy_bool any_scalar = NPY_FALSE;
+    *allow_legacy_promotion = NPY_TRUE;
+    *force_legacy_promotion = NPY_FALSE;
     for (int i = 0; i < nin; i++) {
         obj = PyTuple_GET_ITEM(full_args.in, i);
 
         if (PyArray_Check(obj)) {
-            PyArrayObject *obj_a = (PyArrayObject *)obj;
-            out_op[i] = (PyArrayObject *)PyArray_FromArray(obj_a, NULL, 0);
+            out_op[i] = (PyArrayObject *)obj;
+            Py_INCREF(out_op[i]);
         }
         else {
-            out_op[i] = (PyArrayObject *)PyArray_FromAny(obj,
-                                    NULL, 0, 0, 0, NULL);
+            /* Convert the input to an array and check for special cases */
+            out_op[i] = (PyArrayObject *)PyArray_FromAny(obj, NULL, 0, 0, 0, NULL);
+            if (out_op[i] == NULL) {
+                goto fail;
+            }
         }
+        out_op_DTypes[i] = NPY_DTYPE(PyArray_DESCR(out_op[i]));
+        Py_INCREF(out_op_DTypes[i]);
 
-        if (out_op[i] == NULL) {
-            goto fail;
+        if (!NPY_DT_is_legacy(out_op_DTypes[i])) {
+            *allow_legacy_promotion = NPY_FALSE;
+        }
+        if (PyArray_NDIM(out_op[i]) == 0) {
+            any_scalar = NPY_TRUE;
+        }
+        else {
+            all_scalar = NPY_FALSE;
+            continue;
         }
+        /*
+         * TODO: we need to special case scalars here, if the input is a
+         *       Python int, float, or complex, we have to use the "weak"
+         *       DTypes: `PyArray_PyIntAbstractDType`, etc.
+         *       This is to allow e.g. `float32(1.) + 1` to return `float32`.
+         *       The correct array dtype can only be found after promotion for
+         *       such a "weak scalar".  We could avoid conversion here, but
+         *       must convert it for use in the legacy promotion.
+         *       There is still a small chance that this logic can instead
+         *       happen inside the Python operators.
+         */
+    }
+    if (*allow_legacy_promotion && (!all_scalar && any_scalar)) {
+        *force_legacy_promotion = should_use_min_scalar(nin, out_op, 0, NULL);
     }
 
     /* Convert and fill in output arguments */
+    memset(out_op_DTypes + nin, 0, nout * sizeof(*out_op_DTypes));
     if (full_args.out != NULL) {
         for (int i = 0; i < nout; i++) {
             obj = PyTuple_GET_ITEM(full_args.out, i);
             if (_set_out_array(obj, out_op + i + nin) < 0) {
                 goto fail;
             }
+            if (out_op[i] != NULL) {
+                out_op_DTypes[i + nin] = NPY_DTYPE(PyArray_DESCR(out_op[i]));
+                Py_INCREF(out_op_DTypes[i + nin]);
+            }
         }
     }
 
@@ -990,34 +1055,56 @@ fail:
  * -1 if there is an error.
  */
 static int
-check_for_trivial_loop(PyUFuncObject *ufunc,
-                        PyArrayObject **op,
-                        PyArray_Descr **dtype,
-                        npy_intp buffersize)
+check_for_trivial_loop(PyArrayMethodObject *ufuncimpl,
+        PyArrayObject **op, PyArray_Descr **dtypes,
+        NPY_CASTING casting, npy_intp buffersize)
 {
-    npy_intp i, nin = ufunc->nin, nop = nin + ufunc->nout;
+    int force_cast_input = ufuncimpl->flags & _NPY_METH_FORCE_CAST_INPUTS;
+    int i, nin = ufuncimpl->nin, nop = nin + ufuncimpl->nout;
 
     for (i = 0; i < nop; ++i) {
         /*
          * If the dtype doesn't match, or the array isn't aligned,
          * indicate that the trivial loop can't be done.
          */
-        if (op[i] != NULL &&
-                (!PyArray_ISALIGNED(op[i]) ||
-                !PyArray_EquivTypes(dtype[i], PyArray_DESCR(op[i]))
-                                        )) {
+        if (op[i] == NULL) {
+            continue;
+        }
+        int must_copy = !PyArray_ISALIGNED(op[i]);
+
+        if (dtypes[i] != PyArray_DESCR(op[i])) {
+            NPY_CASTING safety = PyArray_GetCastSafety(
+                    PyArray_DESCR(op[i]), dtypes[i], NULL);
+            if (safety < 0 && PyErr_Occurred()) {
+                /* A proper error during a cast check, should be rare */
+                return -1;
+            }
+            if (!(safety & _NPY_CAST_IS_VIEW)) {
+                must_copy = 1;
+            }
+
+            if (force_cast_input && i < nin) {
+                /*
+                 * ArrayMethod flagged to ignore casting (logical funcs
+                 * can  force cast to bool)
+                 */
+            }
+            else if (PyArray_MinCastSafety(safety, casting) != casting) {
+                return 0;  /* the cast is not safe enough */
+            }
+        }
+        if (must_copy) {
             /*
              * If op[j] is a scalar or small one dimensional
              * array input, make a copy to keep the opportunity
-             * for a trivial loop.
+             * for a trivial loop.  Outputs are not copied here.
              */
-            if (i < nin && (PyArray_NDIM(op[i]) == 0 ||
-                    (PyArray_NDIM(op[i]) == 1 &&
-                     PyArray_DIM(op[i],0) <= buffersize))) {
+            if (i < nin && (PyArray_NDIM(op[i]) == 0
+                            || (PyArray_NDIM(op[i]) == 1
+                                && PyArray_DIM(op[i], 0) <= buffersize))) {
                 PyArrayObject *tmp;
-                Py_INCREF(dtype[i]);
-                tmp = (PyArrayObject *)
-                            PyArray_CastToType(op[i], dtype[i], 0);
+                Py_INCREF(dtypes[i]);
+                tmp = (PyArrayObject *)PyArray_CastToType(op[i], dtypes[i], 0);
                 if (tmp == NULL) {
                     return -1;
                 }
@@ -1120,15 +1207,15 @@ prepare_ufunc_output(PyUFuncObject *ufunc,
  *
  * Returns -2 if a trivial loop is not possible, 0 on success and -1 on error.
  */
-static NPY_INLINE int
-try_trivial_single_output_loop(PyUFuncObject *ufunc,
-        PyArrayObject *op[], PyArray_Descr *dtypes[],
-        NPY_ORDER order, PyObject *arr_prep[], ufunc_full_args full_args,
-        PyUFuncGenericFunction innerloop, void *innerloopdata)
+static int
+try_trivial_single_output_loop(PyArrayMethod_Context *context,
+        PyArrayObject *op[], NPY_ORDER order,
+        PyObject *arr_prep[], ufunc_full_args full_args,
+        int errormask, PyObject *extobj)
 {
-    int nin = ufunc->nin;
+    int nin = context->method->nin;
     int nop = nin + 1;
-    assert(ufunc->nout == 1);
+    assert(context->method->nout == 1);
 
     /* The order of all N-D contiguous operands, can be fixed by `order` */
     int operation_order = 0;
@@ -1193,14 +1280,14 @@ try_trivial_single_output_loop(PyUFuncObject *ufunc,
     }
 
     if (op[nin] == NULL) {
-        Py_INCREF(dtypes[nin]);
+        Py_INCREF(context->descriptors[nin]);
         op[nin] = (PyArrayObject *) PyArray_NewFromDescr(&PyArray_Type,
-                dtypes[nin], operation_ndim, operation_shape,
+                context->descriptors[nin], operation_ndim, operation_shape,
                 NULL, NULL, operation_order==NPY_ARRAY_F_CONTIGUOUS, NULL);
         if (op[nin] == NULL) {
             return -1;
         }
-        fixed_strides[nin] = dtypes[nin]->elsize;
+        fixed_strides[nin] = context->descriptors[nin]->elsize;
     }
     else {
         /* If any input overlaps with the output, we use the full path. */
@@ -1221,7 +1308,7 @@ try_trivial_single_output_loop(PyUFuncObject *ufunc,
     }
 
     /* Call the __prepare_array__ if necessary */
-    if (prepare_ufunc_output(ufunc, &op[nin],
+    if (prepare_ufunc_output((PyUFuncObject *)context->caller, &op[nin],
             arr_prep[0], full_args, 0) < 0) {
         return -1;
     }
@@ -1232,54 +1319,134 @@ try_trivial_single_output_loop(PyUFuncObject *ufunc,
      */
     char *data[NPY_MAXARGS];
     npy_intp count = PyArray_MultiplyList(operation_shape, operation_ndim);
-    int needs_api = 0;
     NPY_BEGIN_THREADS_DEF;
 
-    for (int iop = 0; iop < nop; iop++) {
+    PyArrayMethod_StridedLoop *strided_loop;
+    NpyAuxData *auxdata = NULL;
+    NPY_ARRAYMETHOD_FLAGS flags = 0;
+    if (context->method->get_strided_loop(context,
+            1, 0, fixed_strides,
+            &strided_loop, &auxdata, &flags) < 0) {
+        return -1;
+    }
+    for (int iop=0; iop < nop; iop++) {
         data[iop] = PyArray_BYTES(op[iop]);
-        needs_api |= PyDataType_REFCHK(dtypes[iop]);
     }
 
-    if (!needs_api) {
+    if (!(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        npy_clear_floatstatus_barrier((char *)context);
+    }
+    if (!(flags & NPY_METH_REQUIRES_PYAPI)) {
         NPY_BEGIN_THREADS_THRESHOLDED(count);
     }
 
-    innerloop(data, &count, fixed_strides, innerloopdata);
+    int res = strided_loop(context, data, &count, fixed_strides, auxdata);
 
     NPY_END_THREADS;
+    NPY_AUXDATA_FREE(auxdata);
+    /*
+     * An error should only be possible if `res != 0` is already set.
+     * But this is not strictly correct for old-style ufuncs (e.g. `power`
+     * released the GIL but manually set an Exception).
+     */
+    if (PyErr_Occurred()) {
+        res = -1;
+    }
+
+    if (res == 0 && !(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        /* NOTE: We could check float errors even when `res < 0` */
+        const char *name = ufunc_get_name_cstr((PyUFuncObject *)context->caller);
+        res = _check_ufunc_fperr(errormask, extobj, name);
+    }
+    return res;
+}
+
+
+/*
+ * Check casting: It would be nice to just move this into the iterator
+ * or pass in the full cast information.  But this can special case
+ * the logical functions and prints a better error message.
+ */
+static NPY_INLINE int
+validate_casting(PyArrayMethodObject *method, PyUFuncObject *ufunc,
+        PyArrayObject *ops[], PyArray_Descr *descriptors[],
+        NPY_CASTING casting)
+{
+    if (method->resolve_descriptors == &wrapped_legacy_resolve_descriptors) {
+        /*
+         * In this case the legacy type resolution was definitely called
+         * and we do not need to check (astropy/pyerfa relied on this).
+         */
+        return 0;
+    }
+    if (method->flags & _NPY_METH_FORCE_CAST_INPUTS) {
+        if (PyUFunc_ValidateOutCasting(ufunc, casting, ops, descriptors) < 0) {
+            return -1;
+        }
+    }
+    else {
+        if (PyUFunc_ValidateCasting(ufunc, casting, ops, descriptors) < 0) {
+            return -1;
+        }
+    }
     return 0;
 }
 
 
+/*
+ * The ufunc loop implementation for both normal ufunc calls and masked calls
+ * when the iterator has to be used.
+ *
+ * See `PyUFunc_GenericFunctionInternal` for more information (where this is
+ * called from).
+ */
 static int
-iterator_loop(PyUFuncObject *ufunc,
-                    PyArrayObject **op,
-                    PyArray_Descr **dtype,
-                    NPY_ORDER order,
-                    npy_intp buffersize,
-                    PyObject **arr_prep,
-                    ufunc_full_args full_args,
-                    PyUFuncGenericFunction innerloop,
-                    void *innerloopdata,
-                    npy_uint32 *op_flags)
+execute_ufunc_loop(PyArrayMethod_Context *context, int masked,
+        PyArrayObject **op, NPY_ORDER order, npy_intp buffersize,
+        NPY_CASTING casting,
+        PyObject **arr_prep, ufunc_full_args full_args,
+        npy_uint32 *op_flags, int errormask, PyObject *extobj)
 {
-    npy_intp i, nin = ufunc->nin, nout = ufunc->nout;
-    npy_intp nop = nin + nout;
-    NpyIter *iter;
-    char *baseptrs[NPY_MAXARGS];
+    PyUFuncObject *ufunc = (PyUFuncObject *)context->caller;
+    int nin = context->method->nin, nout = context->method->nout;
+    int nop = nin + nout;
 
-    NpyIter_IterNextFunc *iternext;
-    char **dataptr;
-    npy_intp *stride;
-    npy_intp *count_ptr;
-    int needs_api;
+    if (validate_casting(context->method,
+            ufunc, op, context->descriptors, casting) < 0) {
+        return -1;
+    }
 
-    PyArrayObject **op_it;
-    npy_uint32 iter_flags;
+    if (masked) {
+        assert(PyArray_TYPE(op[nop]) == NPY_BOOL);
+        if (ufunc->_always_null_previously_masked_innerloop_selector != NULL) {
+            if (PyErr_WarnFormat(PyExc_UserWarning, 1,
+                    "The ufunc %s has a custom masked-inner-loop-selector."
+                    "NumPy assumes that this is NEVER used. If you do make "
+                    "use of this please notify the NumPy developers to discuss "
+                    "future solutions. (See NEP 41 and 43)\n"
+                    "NumPy will continue, but ignore the custom loop selector. "
+                    "This should only affect performance.",
+                    ufunc_get_name_cstr(ufunc)) < 0) {
+                return -1;
+            }
+        }
 
-    NPY_BEGIN_THREADS_DEF;
+        /*
+         * NOTE: In the masked version, we consider the output read-write,
+         *       this gives a best-effort of preserving the input, but does
+         *       not always work.  It could allow the operand to be copied
+         *       due to copy-if-overlap, but only if it was passed in.
+         *       In that case `__array_prepare__` is called before it happens.
+         */
+        for (int i = nin; i < nop; ++i) {
+            op_flags[i] |= (op[i] != NULL ? NPY_ITER_READWRITE : NPY_ITER_WRITEONLY);
+        }
+        op_flags[nop] = NPY_ITER_READONLY | NPY_ITER_ARRAYMASK;  /* mask */
+    }
 
-    iter_flags = ufunc->iter_flags |
+    NPY_UF_DBG_PRINT("Making iterator\n");
+
+    npy_uint32 iter_flags = ufunc->iter_flags |
                  NPY_ITER_EXTERNAL_LOOP |
                  NPY_ITER_REFS_OK |
                  NPY_ITER_ZEROSIZE_OK |
@@ -1288,16 +1455,17 @@ iterator_loop(PyUFuncObject *ufunc,
                  NPY_ITER_DELAY_BUFALLOC |
                  NPY_ITER_COPY_IF_OVERLAP;
 
-    /* Call the __array_prepare__ functions for already existing output arrays.
+    /*
+     * Call the __array_prepare__ functions for already existing output arrays.
      * Do this before creating the iterator, as the iterator may UPDATEIFCOPY
      * some of them.
      */
-    for (i = 0; i < nout; ++i) {
+    for (int i = 0; i < nout; i++) {
         if (op[nin+i] == NULL) {
             continue;
         }
         if (prepare_ufunc_output(ufunc, &op[nin+i],
-                            arr_prep[i], full_args, i) < 0) {
+                arr_prep[i], full_args, i) < 0) {
             return -1;
         }
     }
@@ -1307,25 +1475,29 @@ iterator_loop(PyUFuncObject *ufunc,
      * were already checked, we use the casting rule 'unsafe' which
      * is faster to calculate.
      */
-    iter = NpyIter_AdvancedNew(nop, op,
+    NpyIter *iter = NpyIter_AdvancedNew(nop + masked, op,
                         iter_flags,
                         order, NPY_UNSAFE_CASTING,
-                        op_flags, dtype,
+                        op_flags, context->descriptors,
                         -1, NULL, NULL, buffersize);
     if (iter == NULL) {
         return -1;
     }
 
-    /* Copy any allocated outputs */
-    op_it = NpyIter_GetOperandArray(iter);
-    for (i = 0; i < nout; ++i) {
-        if (op[nin+i] == NULL) {
-            op[nin+i] = op_it[nin+i];
-            Py_INCREF(op[nin+i]);
+    NPY_UF_DBG_PRINT("Made iterator\n");
+
+    /* Call the __array_prepare__ functions for newly allocated arrays */
+    PyArrayObject **op_it = NpyIter_GetOperandArray(iter);
+    char *baseptrs[NPY_MAXARGS];
+
+    for (int i = 0; i < nout; ++i) {
+        if (op[nin + i] == NULL) {
+            op[nin + i] = op_it[nin + i];
+            Py_INCREF(op[nin + i]);
 
             /* Call the __array_prepare__ functions for the new array */
-            if (prepare_ufunc_output(ufunc, &op[nin+i],
-                                     arr_prep[i], full_args, i) < 0) {
+            if (prepare_ufunc_output(ufunc,
+                    &op[nin + i], arr_prep[i], full_args, i) < 0) {
                 NpyIter_Deallocate(iter);
                 return -1;
             }
@@ -1340,280 +1512,103 @@ iterator_loop(PyUFuncObject *ufunc,
              * with other operands --- the op[nin+i] array passed to it is newly
              * allocated and doesn't have any overlap.
              */
-            baseptrs[nin+i] = PyArray_BYTES(op[nin+i]);
+            baseptrs[nin + i] = PyArray_BYTES(op[nin + i]);
         }
         else {
-            baseptrs[nin+i] = PyArray_BYTES(op_it[nin+i]);
+            baseptrs[nin + i] = PyArray_BYTES(op_it[nin + i]);
         }
     }
-
     /* Only do the loop if the iteration size is non-zero */
-    if (NpyIter_GetIterSize(iter) != 0) {
-        /* Reset the iterator with the base pointers from possible __array_prepare__ */
-        for (i = 0; i < nin; ++i) {
-            baseptrs[i] = PyArray_BYTES(op_it[i]);
-        }
-        if (NpyIter_ResetBasePointers(iter, baseptrs, NULL) != NPY_SUCCEED) {
-            NpyIter_Deallocate(iter);
-            return -1;
-        }
-
-        /* Get the variables needed for the loop */
-        iternext = NpyIter_GetIterNext(iter, NULL);
-        if (iternext == NULL) {
-            NpyIter_Deallocate(iter);
+    npy_intp full_size = NpyIter_GetIterSize(iter);
+    if (full_size == 0) {
+        if (!NpyIter_Deallocate(iter)) {
             return -1;
         }
-        dataptr = NpyIter_GetDataPtrArray(iter);
-        stride = NpyIter_GetInnerStrideArray(iter);
-        count_ptr = NpyIter_GetInnerLoopSizePtr(iter);
-        needs_api = NpyIter_IterationNeedsAPI(iter);
-
-        NPY_BEGIN_THREADS_NDITER(iter);
-
-        /* Execute the loop */
-        do {
-            NPY_UF_DBG_PRINT1("iterator loop count %d\n", (int)*count_ptr);
-            innerloop(dataptr, count_ptr, stride, innerloopdata);
-        } while (!(needs_api && PyErr_Occurred()) && iternext(iter));
-
-        NPY_END_THREADS;
-    }
-    /*
-     * Currently `innerloop` may leave an error set, in this case
-     * NpyIter_Deallocate will always return an error as well.
-     */
-    if (NpyIter_Deallocate(iter) == NPY_FAIL) {
-        return -1;
-    }
-    return 0;
-}
-
-/*
- * ufunc           - the ufunc to call
- * trivial_loop_ok - 1 if no alignment, data conversion, etc required
- * op              - the operands (ufunc->nin + ufunc->nout of them)
- * dtypes          - the dtype of each operand
- * order           - the loop execution order/output memory order
- * buffersize      - how big of a buffer to use
- * arr_prep        - the __array_prepare__ functions for the outputs
- * full_args       - the original input, output PyObject *
- * op_flags        - per-operand flags, a combination of NPY_ITER_* constants
- */
-static int
-execute_legacy_ufunc_loop(PyUFuncObject *ufunc,
-                    int trivial_loop_ok,
-                    PyArrayObject **op,
-                    PyArray_Descr **dtypes,
-                    NPY_ORDER order,
-                    npy_intp buffersize,
-                    PyObject **arr_prep,
-                    ufunc_full_args full_args,
-                    npy_uint32 *op_flags)
-{
-    PyUFuncGenericFunction innerloop;
-    void *innerloopdata;
-    int needs_api = 0;
-
-    if (ufunc->legacy_inner_loop_selector(ufunc, dtypes,
-                    &innerloop, &innerloopdata, &needs_api) < 0) {
-        return -1;
-    }
-
-    /* First check for the trivial cases that don't need an iterator */
-    if (trivial_loop_ok && ufunc->nout == 1) {
-        int fast_path_result = try_trivial_single_output_loop(ufunc,
-                op, dtypes, order, arr_prep, full_args,
-                innerloop, innerloopdata);
-        if (fast_path_result != -2) {
-            return fast_path_result;
-        }
+        return 0;
     }
 
     /*
-     * If no trivial loop matched, an iterator is required to
-     * resolve broadcasting, etc
+     * Reset the iterator with the base pointers possibly modified by
+     * `__array_prepare__`.
      */
-    NPY_UF_DBG_PRINT("iterator loop\n");
-    if (iterator_loop(ufunc, op, dtypes, order,
-                    buffersize, arr_prep, full_args,
-                    innerloop, innerloopdata, op_flags) < 0) {
-        return -1;
+    for (int i = 0; i < nin; i++) {
+        baseptrs[i] = PyArray_BYTES(op_it[i]);
     }
-
-    return 0;
-}
-
-/*
- * nin             - number of inputs
- * nout            - number of outputs
- * wheremask       - if not NULL, the 'where=' parameter to the ufunc.
- * op              - the operands (nin + nout of them)
- * order           - the loop execution order/output memory order
- * buffersize      - how big of a buffer to use
- * arr_prep        - the __array_prepare__ functions for the outputs
- * innerloop       - the inner loop function
- * innerloopdata   - data to pass to the inner loop
- */
-static int
-execute_fancy_ufunc_loop(PyUFuncObject *ufunc,
-                    PyArrayObject *wheremask,
-                    PyArrayObject **op,
-                    PyArray_Descr **dtypes,
-                    NPY_ORDER order,
-                    npy_intp buffersize,
-                    PyObject **arr_prep,
-                    ufunc_full_args full_args,
-                    npy_uint32 *op_flags)
-{
-    int i, nin = ufunc->nin, nout = ufunc->nout;
-    int nop = nin + nout;
-    NpyIter *iter;
-    int needs_api;
-
-    NpyIter_IterNextFunc *iternext;
-    char **dataptr;
-    npy_intp *strides;
-    npy_intp *countptr;
-
-    PyArrayObject **op_it;
-    npy_uint32 iter_flags;
-
-    for (i = nin; i < nop; ++i) {
-        op_flags[i] |= (op[i] != NULL ? NPY_ITER_READWRITE : NPY_ITER_WRITEONLY);
+    if (masked) {
+        baseptrs[nop] = PyArray_BYTES(op_it[nop]);
     }
-
-    if (wheremask != NULL) {
-        op_flags[nop] = NPY_ITER_READONLY | NPY_ITER_ARRAYMASK;
+    if (NpyIter_ResetBasePointers(iter, baseptrs, NULL) != NPY_SUCCEED) {
+        NpyIter_Deallocate(iter);
+        return -1;
     }
 
-    NPY_UF_DBG_PRINT("Making iterator\n");
-
-    iter_flags = ufunc->iter_flags |
-                 NPY_ITER_EXTERNAL_LOOP |
-                 NPY_ITER_REFS_OK |
-                 NPY_ITER_ZEROSIZE_OK |
-                 NPY_ITER_BUFFERED |
-                 NPY_ITER_GROWINNER |
-                 NPY_ITER_COPY_IF_OVERLAP;
-
     /*
-     * Allocate the iterator.  Because the types of the inputs
-     * were already checked, we use the casting rule 'unsafe' which
-     * is faster to calculate.
+     * Get the inner loop, with the possibility of specialization
+     * based on the fixed strides.
      */
-    iter = NpyIter_AdvancedNew(nop + ((wheremask != NULL) ? 1 : 0), op,
-                        iter_flags,
-                        order, NPY_UNSAFE_CASTING,
-                        op_flags, dtypes,
-                        -1, NULL, NULL, buffersize);
-    if (iter == NULL) {
-        return -1;
-    }
-
-    NPY_UF_DBG_PRINT("Made iterator\n");
-
-    needs_api = NpyIter_IterationNeedsAPI(iter);
-
-    /* Call the __array_prepare__ functions where necessary */
-    op_it = NpyIter_GetOperandArray(iter);
-    for (i = nin; i < nop; ++i) {
-        PyArrayObject *op_tmp, *orig_op_tmp;
-
-        /*
-         * The array can be allocated by the iterator -- it is placed in op[i]
-         * and returned to the caller, and this needs an extra incref.
-         */
-        if (op[i] == NULL) {
-            op_tmp = op_it[i];
-            Py_INCREF(op_tmp);
-        }
-        else {
-            op_tmp = op[i];
-        }
-
-        /* prepare_ufunc_output may decref & replace the pointer */
-        orig_op_tmp = op_tmp;
-        Py_INCREF(op_tmp);
+    PyArrayMethod_StridedLoop *strided_loop;
+    NpyAuxData *auxdata;
+    npy_intp fixed_strides[NPY_MAXARGS];
 
-        if (prepare_ufunc_output(ufunc, &op_tmp,
-                                 arr_prep[i], full_args, i) < 0) {
+    NpyIter_GetInnerFixedStrideArray(iter, fixed_strides);
+    NPY_ARRAYMETHOD_FLAGS flags = 0;
+    if (masked) {
+        if (PyArrayMethod_GetMaskedStridedLoop(context,
+                1, fixed_strides, &strided_loop, &auxdata, &flags) < 0) {
             NpyIter_Deallocate(iter);
             return -1;
         }
-
-        /* Validate that the prepare_ufunc_output didn't mess with pointers */
-        if (PyArray_BYTES(op_tmp) != PyArray_BYTES(orig_op_tmp)) {
-            PyErr_SetString(PyExc_ValueError,
-                        "The __array_prepare__ functions modified the data "
-                        "pointer addresses in an invalid fashion");
-            Py_DECREF(op_tmp);
+    }
+    else {
+        if (context->method->get_strided_loop(context,
+                1, 0, fixed_strides, &strided_loop, &auxdata, &flags) < 0) {
             NpyIter_Deallocate(iter);
             return -1;
         }
-
-        /*
-         * Put the updated operand back and undo the DECREF above. If
-         * COPY_IF_OVERLAP made a temporary copy, the output will be copied
-         * by UPDATEIFCOPY even if op[i] was changed by prepare_ufunc_output.
-         */
-        op[i] = op_tmp;
-        Py_DECREF(op_tmp);
     }
 
-    /* Only do the loop if the iteration size is non-zero */
-    if (NpyIter_GetIterSize(iter) != 0) {
-        PyUFunc_MaskedStridedInnerLoopFunc *innerloop;
-        NpyAuxData *innerloopdata;
-        npy_intp fixed_strides[2*NPY_MAXARGS];
-        PyArray_Descr **iter_dtypes;
-        NPY_BEGIN_THREADS_DEF;
-
-        /*
-         * Get the inner loop, with the possibility of specialization
-         * based on the fixed strides.
-         */
-        NpyIter_GetInnerFixedStrideArray(iter, fixed_strides);
-        iter_dtypes = NpyIter_GetDescrArray(iter);
-        if (ufunc->masked_inner_loop_selector(ufunc, dtypes,
-                        wheremask != NULL ? iter_dtypes[nop]
-                                          : iter_dtypes[nop + nin],
-                        fixed_strides,
-                        wheremask != NULL ? fixed_strides[nop]
-                                          : fixed_strides[nop + nin],
-                        &innerloop, &innerloopdata, &needs_api) < 0) {
-            NpyIter_Deallocate(iter);
-            return -1;
-        }
+    /* Get the variables needed for the loop */
+    NpyIter_IterNextFunc *iternext = NpyIter_GetIterNext(iter, NULL);
+    if (iternext == NULL) {
+        NPY_AUXDATA_FREE(auxdata);
+        NpyIter_Deallocate(iter);
+        return -1;
+    }
+    char **dataptr = NpyIter_GetDataPtrArray(iter);
+    npy_intp *strides = NpyIter_GetInnerStrideArray(iter);
+    npy_intp *countptr = NpyIter_GetInnerLoopSizePtr(iter);
+    int needs_api = NpyIter_IterationNeedsAPI(iter);
 
-        /* Get the variables needed for the loop */
-        iternext = NpyIter_GetIterNext(iter, NULL);
-        if (iternext == NULL) {
-            NpyIter_Deallocate(iter);
-            return -1;
-        }
-        dataptr = NpyIter_GetDataPtrArray(iter);
-        strides = NpyIter_GetInnerStrideArray(iter);
-        countptr = NpyIter_GetInnerLoopSizePtr(iter);
-        needs_api = NpyIter_IterationNeedsAPI(iter);
+    NPY_BEGIN_THREADS_DEF;
 
-        NPY_BEGIN_THREADS_NDITER(iter);
+    if (!(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        npy_clear_floatstatus_barrier((char *)context);
+    }
+    if (!needs_api && !(flags & NPY_METH_REQUIRES_PYAPI)) {
+        NPY_BEGIN_THREADS_THRESHOLDED(full_size);
+    }
 
-        NPY_UF_DBG_PRINT("Actual inner loop:\n");
-        /* Execute the loop */
-        do {
-            NPY_UF_DBG_PRINT1("iterator loop count %d\n", (int)*countptr);
-            innerloop(dataptr, strides,
-                        dataptr[nop], strides[nop],
-                        *countptr, innerloopdata);
-        } while (!(needs_api && PyErr_Occurred()) && iternext(iter));
+    NPY_UF_DBG_PRINT("Actual inner loop:\n");
+    /* Execute the loop */
+    int res;
+    do {
+        NPY_UF_DBG_PRINT1("iterator loop count %d\n", (int)*countptr);
+        res = strided_loop(context, dataptr, countptr, strides, auxdata);
+    } while (res == 0 && iternext(iter));
 
-        NPY_END_THREADS;
+    NPY_END_THREADS;
+    NPY_AUXDATA_FREE(auxdata);
 
-        NPY_AUXDATA_FREE(innerloopdata);
+    if (res == 0 && !(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        /* NOTE: We could check float errors even when `res < 0` */
+        const char *name = ufunc_get_name_cstr((PyUFuncObject *)context->caller);
+        res = _check_ufunc_fperr(errormask, extobj, name);
     }
 
-    return NpyIter_Deallocate(iter);
+    if (!NpyIter_Deallocate(iter)) {
+        return -1;
+    }
+    return res;
 }
 
 
@@ -2105,9 +2100,10 @@ _initialize_variable_parts(PyUFuncObject *ufunc,
 }
 
 static int
-PyUFunc_GeneralizedFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
-        ufunc_full_args full_args, PyObject *type_tup, PyObject *extobj,
-        NPY_CASTING casting, NPY_ORDER order, npy_bool subok,
+PyUFunc_GeneralizedFunctionInternal(PyUFuncObject *ufunc,
+        PyArrayMethodObject *ufuncimpl, PyArray_Descr *operation_descrs[],
+        PyArrayObject *op[], PyObject *extobj,
+        NPY_CASTING casting, NPY_ORDER order,
         PyObject *axis, PyObject *axes, int keepdims)
 {
     int nin, nout;
@@ -2116,8 +2112,6 @@ PyUFunc_GeneralizedFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
     int retval;
     int needs_api = 0;
 
-    PyArray_Descr *dtypes[NPY_MAXARGS];
-
     /* Use remapped axes for generalized ufunc */
     int broadcast_ndim, iter_ndim;
     int op_core_num_dims[NPY_MAXARGS];
@@ -2134,13 +2128,12 @@ PyUFunc_GeneralizedFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
     /* These parameters come from extobj= or from a TLS global */
     int buffersize = 0, errormask = 0;
 
-    /* The selected inner loop */
-    PyUFuncGenericFunction innerloop = NULL;
-    void *innerloopdata = NULL;
     /* The dimensions which get passed to the inner loop */
     npy_intp inner_dimensions[NPY_MAXDIMS+1];
     /* The strides which get passed to the inner loop */
     npy_intp *inner_strides = NULL;
+    /* Auxiliary data allocated by the ufuncimpl (ArrayMethod) */
+    NpyAuxData *auxdata = NULL;
 
     /* The sizes of the core dimensions (# entries is ufunc->core_num_dim_ix) */
     npy_intp *core_dim_sizes = inner_dimensions + 1;
@@ -2148,8 +2141,6 @@ PyUFunc_GeneralizedFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
     /* swapping around of axes */
     int *remap_axis_memory = NULL;
     int **remap_axis = NULL;
-    /* The __array_prepare__ function to call for each output */
-    PyObject *arr_prep[NPY_MAXARGS];
 
     nin = ufunc->nin;
     nout = ufunc->nout;
@@ -2159,11 +2150,11 @@ PyUFunc_GeneralizedFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
 
     NPY_UF_DBG_PRINT1("\nEvaluating ufunc %s\n", ufunc_name);
 
-    /* Initialize all dtypes and __array_prepare__ call-backs to NULL */
-    for (i = 0; i < nop; ++i) {
-        dtypes[i] = NULL;
-        arr_prep[i] = NULL;
+    if (validate_casting(ufuncimpl,
+            ufunc, op, operation_descrs, casting) < 0) {
+        return -1;
     }
+
     /* Initialize possibly variable parts to the values from the ufunc */
     retval = _initialize_variable_parts(ufunc, op_core_num_dims,
                                         core_dim_sizes, core_dim_flags);
@@ -2369,12 +2360,6 @@ PyUFunc_GeneralizedFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
 
     NPY_UF_DBG_PRINT("Finding inner loop\n");
 
-
-    retval = ufunc->type_resolver(ufunc, casting,
-                            op, type_tup, dtypes);
-    if (retval < 0) {
-        goto fail;
-    }
     /*
      * We don't write to all elements, and the iterator may make
      * UPDATEIFCOPY temporary copies. The output arrays (unless they are
@@ -2387,40 +2372,11 @@ PyUFunc_GeneralizedFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
                        NPY_ITER_WRITEONLY |
                        NPY_UFUNC_DEFAULT_OUTPUT_FLAGS,
                        op_flags);
-    /* For the generalized ufunc, we get the loop right away too */
-    retval = ufunc->legacy_inner_loop_selector(ufunc, dtypes,
-                                    &innerloop, &innerloopdata, &needs_api);
-    if (retval < 0) {
-        goto fail;
-    }
-
-#if NPY_UF_DBG_TRACING
-    printf("input types:\n");
-    for (i = 0; i < nin; ++i) {
-        PyObject_Print((PyObject *)dtypes[i], stdout, 0);
-        printf(" ");
-    }
-    printf("\noutput types:\n");
-    for (i = nin; i < nop; ++i) {
-        PyObject_Print((PyObject *)dtypes[i], stdout, 0);
-        printf(" ");
-    }
-    printf("\n");
-#endif
-
-    if (subok) {
-        /*
-         * Get the appropriate __array_prepare__ function to call
-         * for each output
-         */
-        _find_array_prepare(full_args, arr_prep, nout);
-    }
 
     /*
      * Set up the iterator per-op flags.  For generalized ufuncs, we
      * can't do buffering, so must COPY or UPDATEIFCOPY.
      */
-
     iter_flags = ufunc->iter_flags |
                  NPY_ITER_MULTI_INDEX |
                  NPY_ITER_REFS_OK |
@@ -2430,7 +2386,7 @@ PyUFunc_GeneralizedFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
     /* Create the iterator */
     iter = NpyIter_AdvancedNew(nop, op, iter_flags,
                            order, NPY_UNSAFE_CASTING, op_flags,
-                           dtypes, iter_ndim,
+                           operation_descrs, iter_ndim,
                            op_axes, iter_shape, 0);
     if (iter == NULL) {
         retval = -1;
@@ -2529,21 +2485,34 @@ PyUFunc_GeneralizedFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
 
     /*
      * The first nop strides are for the inner loop (but only can
-     * copy them after removing the core axes)
+     * copy them after removing the core axes).  The strides will not change
+     * if the iterator is not buffered (they are effectively fixed).
+     * Supporting buffering would make sense, but probably would have to be
+     * done in the inner-loop itself (not the iterator).
      */
+    assert(!NpyIter_IsBuffered(iter));
     memcpy(inner_strides, NpyIter_GetInnerStrideArray(iter),
                                     NPY_SIZEOF_INTP * nop);
 
-#if 0
-    printf("strides: ");
-    for (i = 0; i < nop+core_dim_ixs_size; ++i) {
-        printf("%d ", (int)inner_strides[i]);
+    /* Final preparation of the arraymethod call */
+    PyArrayMethod_Context context = {
+        .caller = (PyObject *)ufunc,
+        .method = ufuncimpl,
+        .descriptors = operation_descrs,
+    };
+    PyArrayMethod_StridedLoop *strided_loop;
+    NPY_ARRAYMETHOD_FLAGS flags = 0;
+
+    if (ufuncimpl->get_strided_loop(&context, 1, 0, inner_strides,
+            &strided_loop, &auxdata, &flags) < 0) {
+        goto fail;
+    }
+    needs_api = (flags & NPY_METH_REQUIRES_PYAPI) != 0;
+    needs_api |= NpyIter_IterationNeedsAPI(iter);
+    if (!(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        /* Start with the floating-point exception flags cleared */
+        npy_clear_floatstatus_barrier((char*)&iter);
     }
-    printf("\n");
-#endif
-
-    /* Start with the floating-point exception flags cleared */
-    npy_clear_floatstatus_barrier((char*)&iter);
 
     NPY_UF_DBG_PRINT("Executing inner loop\n");
 
@@ -2562,38 +2531,32 @@ PyUFunc_GeneralizedFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
         }
         dataptr = NpyIter_GetDataPtrArray(iter);
         count_ptr = NpyIter_GetInnerLoopSizePtr(iter);
-        needs_api = NpyIter_IterationNeedsAPI(iter);
 
-        if (!needs_api && !NpyIter_IterationNeedsAPI(iter)) {
+        if (!needs_api) {
             NPY_BEGIN_THREADS_THRESHOLDED(total_problem_size);
         }
         do {
             inner_dimensions[0] = *count_ptr;
-            innerloop(dataptr, inner_dimensions, inner_strides, innerloopdata);
-        } while (!(needs_api && PyErr_Occurred()) && iternext(iter));
+            retval = strided_loop(&context,
+                    dataptr, inner_dimensions, inner_strides, auxdata);
+        } while (retval == 0 && iternext(iter));
 
         if (!needs_api && !NpyIter_IterationNeedsAPI(iter)) {
             NPY_END_THREADS;
         }
     }
 
-    /* Check whether any errors occurred during the loop */
-    if (PyErr_Occurred() ||
-        _check_ufunc_fperr(errormask, extobj, ufunc_name) < 0) {
-        retval = -1;
-        goto fail;
+    if (retval == 0 && !(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        /* NOTE: We could check float errors even when `res < 0` */
+        retval = _check_ufunc_fperr(errormask, extobj, ufunc_name);
     }
 
     PyArray_free(inner_strides);
-    if (NpyIter_Deallocate(iter) < 0) {
+    NPY_AUXDATA_FREE(auxdata);
+    if (!NpyIter_Deallocate(iter)) {
         retval = -1;
     }
 
-    /* The caller takes ownership of all the references in op */
-    for (i = 0; i < nop; ++i) {
-        Py_XDECREF(dtypes[i]);
-        Py_XDECREF(arr_prep[i]);
-    }
     PyArray_free(remap_axis_memory);
     PyArray_free(remap_axis);
 
@@ -2604,11 +2567,8 @@ PyUFunc_GeneralizedFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
 fail:
     NPY_UF_DBG_PRINT1("Returning failure code %d\n", retval);
     PyArray_free(inner_strides);
+    NPY_AUXDATA_FREE(auxdata);
     NpyIter_Deallocate(iter);
-    for (i = 0; i < nop; ++i) {
-        Py_XDECREF(dtypes[i]);
-        Py_XDECREF(arr_prep[i]);
-    }
     PyArray_free(remap_axis_memory);
     PyArray_free(remap_axis);
     return retval;
@@ -2616,54 +2576,28 @@ fail:
 
 
 static int
-PyUFunc_GenericFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
-        ufunc_full_args full_args, PyObject *type_tup, PyObject *extobj,
-        NPY_CASTING casting, NPY_ORDER order, npy_bool subok,
+PyUFunc_GenericFunctionInternal(PyUFuncObject *ufunc,
+        PyArrayMethodObject *ufuncimpl, PyArray_Descr *operation_descrs[],
+        PyArrayObject *op[], PyObject *extobj,
+        NPY_CASTING casting, NPY_ORDER order,
+        PyObject *output_array_prepare[], ufunc_full_args full_args,
         PyArrayObject *wheremask)
 {
-    int nin, nout;
-    int i, nop;
-    const char *ufunc_name;
-    int retval = -1;
-    npy_uint32 op_flags[NPY_MAXARGS];
-    npy_intp default_op_out_flags;
+    int nin = ufunc->nin, nout = ufunc->nout, nop = nin + nout;
+
+    const char *ufunc_name = ufunc_get_name_cstr(ufunc);
 
-    PyArray_Descr *dtypes[NPY_MAXARGS];
+    npy_intp default_op_out_flags;
+    npy_uint32 op_flags[NPY_MAXARGS];
 
     /* These parameters come from extobj= or from a TLS global */
     int buffersize = 0, errormask = 0;
 
-    /* The __array_prepare__ function to call for each output */
-    PyObject *arr_prep[NPY_MAXARGS];
-
-    int trivial_loop_ok = 0;
-
-    nin = ufunc->nin;
-    nout = ufunc->nout;
-    nop = nin + nout;
-
-    ufunc_name = ufunc_get_name_cstr(ufunc);
-
     NPY_UF_DBG_PRINT1("\nEvaluating ufunc %s\n", ufunc_name);
 
-    /* Initialize all the dtypes and __array_prepare__ callbacks to NULL */
-    for (i = 0; i < nop; ++i) {
-        dtypes[i] = NULL;
-        arr_prep[i] = NULL;
-    }
-
     /* Get the buffersize and errormask */
     if (_get_bufsize_errmask(extobj, ufunc_name, &buffersize, &errormask) < 0) {
-        retval = -1;
-        goto fail;
-    }
-
-    NPY_UF_DBG_PRINT("Finding inner loop\n");
-
-    retval = ufunc->type_resolver(ufunc, casting,
-                            op, type_tup, dtypes);
-    if (retval < 0) {
-        goto fail;
+        return -1;
     }
 
     if (wheremask != NULL) {
@@ -2682,31 +2616,16 @@ PyUFunc_GenericFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
                            default_op_out_flags, op_flags);
     }
 
-#if NPY_UF_DBG_TRACING
-    printf("input types:\n");
-    for (i = 0; i < nin; ++i) {
-        PyObject_Print((PyObject *)dtypes[i], stdout, 0);
-        printf(" ");
-    }
-    printf("\noutput types:\n");
-    for (i = nin; i < nop; ++i) {
-        PyObject_Print((PyObject *)dtypes[i], stdout, 0);
-        printf(" ");
-    }
-    printf("\n");
-#endif
-
-    if (subok) {
-        /*
-         * Get the appropriate __array_prepare__ function to call
-         * for each output
-         */
-        _find_array_prepare(full_args, arr_prep, nout);
-    }
+    /* Final preparation of the arraymethod call */
+    PyArrayMethod_Context context = {
+        .caller = (PyObject *)ufunc,
+        .method = ufuncimpl,
+        .descriptors = operation_descrs,
+    };
 
     /* Do the ufunc loop */
     if (wheremask != NULL) {
-        NPY_UF_DBG_PRINT("Executing fancy inner loop\n");
+        NPY_UF_DBG_PRINT("Executing masked inner loop\n");
 
         if (nop + 1 > NPY_MAXARGS) {
             PyErr_SetString(PyExc_ValueError,
@@ -2714,70 +2633,40 @@ PyUFunc_GenericFunctionInternal(PyUFuncObject *ufunc, PyArrayObject **op,
             return -1;
         }
         op[nop] = wheremask;
-        dtypes[nop] = NULL;
-
-        /* Set up the flags */
+        operation_descrs[nop] = NULL;
 
-        npy_clear_floatstatus_barrier((char*)&ufunc);
-        retval = execute_fancy_ufunc_loop(ufunc, wheremask,
-                            op, dtypes, order,
-                            buffersize, arr_prep, full_args, op_flags);
+        return execute_ufunc_loop(&context, 1,
+                op, order, buffersize, casting,
+                output_array_prepare, full_args, op_flags,
+                errormask, extobj);
     }
     else {
-        NPY_UF_DBG_PRINT("Executing legacy inner loop\n");
+        NPY_UF_DBG_PRINT("Executing normal inner loop\n");
 
         /*
          * This checks whether a trivial loop is ok, making copies of
-         * scalar and one dimensional operands if that will help.
-         * Since it requires dtypes, it can only be called after
-         * ufunc->type_resolver
+         * scalar and one dimensional operands if that should help.
          */
-        trivial_loop_ok = check_for_trivial_loop(ufunc, op, dtypes, buffersize);
-        if (trivial_loop_ok < 0) {
-            goto fail;
+        int trivial_ok = check_for_trivial_loop(ufuncimpl,
+                op, operation_descrs, casting, buffersize);
+        if (trivial_ok < 0) {
+            return -1;
+        }
+        if (trivial_ok && context.method->nout == 1) {
+            /* Try to handle everything without using the (heavy) iterator */
+            int retval = try_trivial_single_output_loop(&context,
+                    op, order, output_array_prepare, full_args,
+                    errormask, extobj);
+            if (retval != -2) {
+                return retval;
+            }
         }
 
-        /* check_for_trivial_loop on half-floats can overflow */
-        npy_clear_floatstatus_barrier((char*)&ufunc);
-
-        retval = execute_legacy_ufunc_loop(ufunc, trivial_loop_ok,
-                            op, dtypes, order,
-                            buffersize, arr_prep, full_args, op_flags);
-    }
-    if (retval < 0) {
-        goto fail;
-    }
-
-    /*
-     * Check whether any errors occurred during the loop. The loops should
-     * indicate this in retval, but since the inner-loop currently does not
-     * report errors, this does not happen in all branches (at this time).
-     */
-    if (PyErr_Occurred() ||
-            _check_ufunc_fperr(errormask, extobj, ufunc_name) < 0) {
-        retval = -1;
-        goto fail;
-    }
-
-
-    /* The caller takes ownership of all the references in op */
-    for (i = 0; i < nop; ++i) {
-        Py_XDECREF(dtypes[i]);
-        Py_XDECREF(arr_prep[i]);
-    }
-
-    NPY_UF_DBG_PRINT("Returning success code 0\n");
-
-    return 0;
-
-fail:
-    NPY_UF_DBG_PRINT1("Returning failure code %d\n", retval);
-    for (i = 0; i < nop; ++i) {
-        Py_XDECREF(dtypes[i]);
-        Py_XDECREF(arr_prep[i]);
+        return execute_ufunc_loop(&context, 0,
+                op, order, buffersize, casting,
+                output_array_prepare, full_args, op_flags,
+                errormask, extobj);
     }
-
-    return retval;
 }
 
 
@@ -2798,195 +2687,130 @@ PyUFunc_GenericFunction(PyUFuncObject *NPY_UNUSED(ufunc),
 
 
 /*
- * Given the output type, finds the specified binary op.  The
- * ufunc must have nin==2 and nout==1.  The function may modify
- * otype if the given type isn't found.
+ * Promote and resolve a reduction like operation.
  *
- * Returns 0 on success, -1 on failure.
+ * @param ufunc
+ * @param arr The operation array
+ * @param out The output array or NULL if not provided.  Note that NumPy always
+ *        used out to mean the same as `dtype=out.dtype` and never passed
+ *        the array itself to the type-resolution.
+ * @param signature The DType signature, which may already be set due to the
+ *        dtype passed in by the user, or the special cases (add, multiply).
+ *        (Contains strong references and may be modified.)
+ * @param enforce_uniform_args If `NPY_TRUE` fully uniform dtypes/descriptors
+ *        are enforced as required for accumulate and (currently) reduceat.
+ * @param out_descrs New references to the resolved descriptors (on success).
+ * @param method The ufunc method, "reduce", "reduceat", or "accumulate".
+
+ * @returns ufuncimpl The `ArrayMethod` implemention to use. Or NULL if an
+ *          error occurred.
  */
-static int
-get_binary_op_function(PyUFuncObject *ufunc, int *otype,
-                        PyUFuncGenericFunction *out_innerloop,
-                        void **out_innerloopdata)
-{
-    int i;
-
-    NPY_UF_DBG_PRINT1("Getting binary op function for type number %d\n",
-                                *otype);
-
-    /* If the type is custom and there are userloops, search for it here */
-    if (ufunc->userloops != NULL && PyTypeNum_ISUSERDEF(*otype)) {
-        PyObject *key, *obj;
-        key = PyLong_FromLong(*otype);
-        if (key == NULL) {
-            return -1;
-        }
-        obj = PyDict_GetItemWithError(ufunc->userloops, key);
-        Py_DECREF(key);
-        if (obj == NULL && PyErr_Occurred()) {
-            return -1;
-        }
-        else if (obj != NULL) {
-            PyUFunc_Loop1d *funcdata = PyCapsule_GetPointer(obj, NULL);
-            if (funcdata == NULL) {
-                return -1;
-            }
-            while (funcdata != NULL) {
-                int *types = funcdata->arg_types;
-
-                if (types[0] == *otype && types[1] == *otype &&
-                                                types[2] == *otype) {
-                    *out_innerloop = funcdata->func;
-                    *out_innerloopdata = funcdata->data;
-                    return 0;
-                }
-
-                funcdata = funcdata->next;
-            }
-        }
-    }
-
-    /* Search for a function with compatible inputs */
-    for (i = 0; i < ufunc->ntypes; ++i) {
-        char *types = ufunc->types + i*ufunc->nargs;
-
-        NPY_UF_DBG_PRINT3("Trying loop with signature %d %d -> %d\n",
-                                types[0], types[1], types[2]);
-
-        if (PyArray_CanCastSafely(*otype, types[0]) &&
-                    types[0] == types[1] &&
-                    (*otype == NPY_OBJECT || types[0] != NPY_OBJECT)) {
-            /* If the signature is "xx->x", we found the loop */
-            if (types[2] == types[0]) {
-                *out_innerloop = ufunc->functions[i];
-                *out_innerloopdata = ufunc->data[i];
-                *otype = types[0];
-                return 0;
-            }
-            /*
-             * Otherwise, we found the natural type of the reduction,
-             * replace otype and search again
-             */
-            else {
-                *otype = types[2];
-                break;
-            }
-        }
-    }
-
-    /* Search for the exact function */
-    for (i = 0; i < ufunc->ntypes; ++i) {
-        char *types = ufunc->types + i*ufunc->nargs;
-
-        if (PyArray_CanCastSafely(*otype, types[0]) &&
-                    types[0] == types[1] &&
-                    types[1] == types[2] &&
-                    (*otype == NPY_OBJECT || types[0] != NPY_OBJECT)) {
-            /* Since the signature is "xx->x", we found the loop */
-            *out_innerloop = ufunc->functions[i];
-            *out_innerloopdata = ufunc->data[i];
-            *otype = types[0];
-            return 0;
-        }
-    }
-
-    return -1;
-}
-
-static int
-reduce_type_resolver(PyUFuncObject *ufunc, PyArrayObject *arr,
-                        PyArray_Descr *odtype, PyArray_Descr **out_dtype)
+static PyArrayMethodObject *
+reducelike_promote_and_resolve(PyUFuncObject *ufunc,
+        PyArrayObject *arr, PyArrayObject *out,
+        PyArray_DTypeMeta *signature[3],
+        npy_bool enforce_uniform_args, PyArray_Descr *out_descrs[3],
+        char *method)
 {
-    int i, retcode;
-    PyArrayObject *op[3] = {arr, arr, NULL};
-    PyArray_Descr *dtypes[3] = {NULL, NULL, NULL};
-    const char *ufunc_name = ufunc_get_name_cstr(ufunc);
-    PyObject *type_tup = NULL;
-
-    *out_dtype = NULL;
-
     /*
-     * If odtype is specified, make a type tuple for the type
-     * resolution.
+     * Note that the `ops` is not really correct.  But legacy resolution
+     * cannot quite handle the correct ops (e.g. a NULL first item if `out`
+     * is NULL) so we pass `arr` instead in that case.
      */
-    if (odtype != NULL) {
-        type_tup = PyTuple_Pack(3, odtype, odtype, Py_None);
-        if (type_tup == NULL) {
-            return -1;
-        }
+    PyArrayObject *ops[3] = {out ? out : arr, arr, out};
+    /*
+     * TODO: If `out` is not provided, arguably `initial` could define
+     *       the first DType (and maybe also the out one), that way
+     *       `np.add.reduce([1, 2, 3], initial=3.4)` would return a float
+     *       value.  As of 1.20, it returned an integer, so that should
+     *       probably go to an error/warning first.
+     */
+    PyArray_DTypeMeta *operation_DTypes[3] = {
+            NULL, NPY_DTYPE(PyArray_DESCR(arr)), NULL};
+    Py_INCREF(operation_DTypes[1]);
+
+    if (out != NULL) {
+        operation_DTypes[0] = NPY_DTYPE(PyArray_DESCR(out));
+        Py_INCREF(operation_DTypes[0]);
+        operation_DTypes[2] = operation_DTypes[0];
+        Py_INCREF(operation_DTypes[2]);
+    }
+
+    PyArrayMethodObject *ufuncimpl = promote_and_get_ufuncimpl(ufunc,
+            ops, signature, operation_DTypes, NPY_FALSE, NPY_TRUE, NPY_TRUE);
+    /* DTypes may currently get filled in fallbacks and XDECREF for error: */
+    Py_XDECREF(operation_DTypes[0]);
+    Py_XDECREF(operation_DTypes[1]);
+    Py_XDECREF(operation_DTypes[2]);
+    if (ufuncimpl == NULL) {
+        return NULL;
     }
 
-    /* Use the type resolution function to find our loop */
-    retcode = ufunc->type_resolver(
-                        ufunc, NPY_UNSAFE_CASTING,
-                        op, type_tup, dtypes);
-    Py_DECREF(type_tup);
-    if (retcode == -1) {
-        return -1;
-    }
-    else if (retcode == -2) {
-        PyErr_Format(PyExc_RuntimeError,
-                "type resolution returned NotImplemented to "
-                "reduce ufunc %s", ufunc_name);
-        return -1;
+    /*
+     * Find the correct descriptors for the operation.  We use unsafe casting
+     * for historic reasons: The logic ufuncs required it to cast everything to
+     * boolean.  However, we now special case the logical ufuncs, so that the
+     * casting safety could in principle be set to the default same-kind.
+     * (although this should possibly happen through a deprecation)
+     */
+    if (resolve_descriptors(3, ufunc, ufuncimpl,
+            ops, out_descrs, signature, NPY_UNSAFE_CASTING) < 0) {
+        return NULL;
     }
 
     /*
-     * The first two type should be equivalent. Because of how
-     * reduce has historically behaved in NumPy, the return type
-     * could be different, and it is the return type on which the
-     * reduction occurs.
+     * The first operand and output should be the same array, so they should
+     * be identical.  The second argument can be different for reductions,
+     * but is checked to be identical for accumulate and reduceat.
      */
-    if (!PyArray_EquivTypes(dtypes[0], dtypes[1])) {
-        for (i = 0; i < 3; ++i) {
-            Py_DECREF(dtypes[i]);
-        }
-        PyErr_Format(PyExc_RuntimeError,
-                "could not find a type resolution appropriate for "
-                "reduce ufunc %s", ufunc_name);
-        return -1;
+    if (out_descrs[0] != out_descrs[2] || (
+            enforce_uniform_args && out_descrs[0] != out_descrs[1])) {
+        PyErr_Format(PyExc_TypeError,
+                "the resolved dtypes are not compatible with %s.%s. "
+                "Resolved (%R, %R, %R)",
+                ufunc_get_name_cstr(ufunc), method,
+                out_descrs[0], out_descrs[1], out_descrs[2]);
+        goto fail;
+    }
+    /* TODO: This really should _not_ be unsafe casting (same above)! */
+    if (validate_casting(ufuncimpl,
+            ufunc, ops, out_descrs, NPY_UNSAFE_CASTING) < 0) {
+        goto fail;
     }
 
-    Py_DECREF(dtypes[0]);
-    Py_DECREF(dtypes[1]);
-    *out_dtype = dtypes[2];
+    return ufuncimpl;
 
-    return 0;
+  fail:
+    for (int i = 0; i < 3; ++i) {
+        Py_DECREF(out_descrs[i]);
+    }
+    return NULL;
 }
 
+
 static int
-reduce_loop(NpyIter *iter, char **dataptrs, npy_intp const *strides,
-            npy_intp const *countptr, NpyIter_IterNextFunc *iternext,
-            int needs_api, npy_intp skip_first_count, void *data)
+reduce_loop(PyArrayMethod_Context *context,
+        PyArrayMethod_StridedLoop *strided_loop, NpyAuxData *auxdata,
+        NpyIter *iter, char **dataptrs, npy_intp const *strides,
+        npy_intp const *countptr, NpyIter_IterNextFunc *iternext,
+        int needs_api, npy_intp skip_first_count)
 {
-    PyArray_Descr *dtypes[3], **iter_dtypes;
-    PyUFuncObject *ufunc = (PyUFuncObject *)data;
-    char *dataptrs_copy[3];
-    npy_intp strides_copy[3];
+    int retval;
+    char *dataptrs_copy[4];
+    npy_intp strides_copy[4];
     npy_bool masked;
 
-    /* The normal selected inner loop */
-    PyUFuncGenericFunction innerloop = NULL;
-    void *innerloopdata = NULL;
-
     NPY_BEGIN_THREADS_DEF;
     /* Get the number of operands, to determine whether "where" is used */
     masked = (NpyIter_GetNOp(iter) == 3);
 
-    /* Get the inner loop */
-    iter_dtypes = NpyIter_GetDescrArray(iter);
-    dtypes[0] = iter_dtypes[0];
-    dtypes[1] = iter_dtypes[1];
-    dtypes[2] = iter_dtypes[0];
-    if (ufunc->legacy_inner_loop_selector(ufunc, dtypes,
-                            &innerloop, &innerloopdata, &needs_api) < 0) {
-        return -1;
+    if (!needs_api) {
+        NPY_BEGIN_THREADS_THRESHOLDED(NpyIter_GetIterSize(iter));
     }
 
-    NPY_BEGIN_THREADS_NDITER(iter);
-
     if (skip_first_count > 0) {
-        do {
+        assert(!masked);  /* Path currently not available for masked */
+        while (1) {
             npy_intp count = *countptr;
 
             /* Skip any first-visit elements */
@@ -3009,27 +2833,23 @@ reduce_loop(NpyIter *iter, char **dataptrs, npy_intp const *strides,
             strides_copy[0] = strides[0];
             strides_copy[1] = strides[1];
             strides_copy[2] = strides[0];
-            innerloop(dataptrs_copy, &count,
-                        strides_copy, innerloopdata);
 
-            if (needs_api && PyErr_Occurred()) {
+            retval = strided_loop(context,
+                    dataptrs_copy, &count, strides_copy, auxdata);
+            if (retval < 0) {
                 goto finish_loop;
             }
 
-            /* Jump to the faster loop when skipping is done */
-            if (skip_first_count == 0) {
-                if (iternext(iter)) {
-                    break;
-                }
-                else {
-                    goto finish_loop;
-                }
+            /* Advance loop, and abort on error (or finish) */
+            if (!iternext(iter)) {
+                goto finish_loop;
             }
-        } while (iternext(iter));
-    }
 
-    if (needs_api && PyErr_Occurred()) {
-        goto finish_loop;
+            /* When skipping is done break and continue with faster loop */
+            if (skip_first_count == 0) {
+                break;
+            }
+        }
     }
 
     do {
@@ -3040,42 +2860,23 @@ reduce_loop(NpyIter *iter, char **dataptrs, npy_intp const *strides,
         strides_copy[0] = strides[0];
         strides_copy[1] = strides[1];
         strides_copy[2] = strides[0];
-
-        if (!masked) {
-            innerloop(dataptrs_copy, countptr,
-                      strides_copy, innerloopdata);
+        if (masked) {
+            dataptrs_copy[3] = dataptrs[2];
+            strides_copy[3] = strides[2];
         }
-        else {
-            npy_intp count = *countptr;
-            char *maskptr = dataptrs[2];
-            npy_intp mask_stride = strides[2];
-            /* Optimization for when the mask is broadcast */
-            npy_intp n = mask_stride == 0 ? count : 1;
-            while (count) {
-                char mask = *maskptr;
-                maskptr += mask_stride;
-                while (n < count && mask == *maskptr) {
-                    n++;
-                    maskptr += mask_stride;
-                }
-                /* If mask set, apply inner loop on this contiguous region */
-                if (mask) {
-                    innerloop(dataptrs_copy, &n,
-                              strides_copy, innerloopdata);
-                }
-                dataptrs_copy[0] += n * strides[0];
-                dataptrs_copy[1] += n * strides[1];
-                dataptrs_copy[2] = dataptrs_copy[0];
-                count -= n;
-                n = 1;
-            }
+
+        retval = strided_loop(context,
+                dataptrs_copy, countptr, strides_copy, auxdata);
+        if (retval < 0) {
+            goto finish_loop;
         }
-    } while (!(needs_api && PyErr_Occurred()) && iternext(iter));
+
+    } while (iternext(iter));
 
 finish_loop:
     NPY_END_THREADS;
 
-    return (needs_api && PyErr_Occurred()) ? -1 : 0;
+    return retval;
 }
 
 /*
@@ -3096,15 +2897,14 @@ finish_loop:
  * this function does not validate them.
  */
 static PyArrayObject *
-PyUFunc_Reduce(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
-        int naxes, int *axes, PyArray_Descr *odtype, int keepdims,
+PyUFunc_Reduce(PyUFuncObject *ufunc,
+        PyArrayObject *arr, PyArrayObject *out,
+        int naxes, int *axes, PyArray_DTypeMeta *signature[3], int keepdims,
         PyObject *initial, PyArrayObject *wheremask)
 {
     int iaxes, ndim;
     npy_bool reorderable;
     npy_bool axis_flags[NPY_MAXDIMS];
-    PyArray_Descr *dtype;
-    PyArrayObject *result;
     PyObject *identity;
     const char *ufunc_name = ufunc_get_name_cstr(ufunc);
     /* These parameters come from a TLS global */
@@ -3131,6 +2931,7 @@ PyUFunc_Reduce(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
     }
 
     /* Get the identity */
+    /* TODO: Both of these should be provided by the ArrayMethod! */
     identity = _get_identity(ufunc, &reorderable);
     if (identity == NULL) {
         return NULL;
@@ -3154,21 +2955,27 @@ PyUFunc_Reduce(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
         Py_INCREF(initial);  /* match the reference count in the if above */
     }
 
-    /* Get the reduction dtype */
-    if (reduce_type_resolver(ufunc, arr, odtype, &dtype) < 0) {
+    PyArray_Descr *descrs[3];
+    PyArrayMethodObject *ufuncimpl = reducelike_promote_and_resolve(ufunc,
+            arr, out, signature, NPY_FALSE, descrs, "reduce");
+    if (ufuncimpl == NULL) {
         Py_DECREF(initial);
         return NULL;
     }
 
-    result = PyUFunc_ReduceWrapper(arr, out, wheremask, dtype, dtype,
-                                   NPY_UNSAFE_CASTING,
-                                   axis_flags, reorderable,
-                                   keepdims,
-                                   initial,
-                                   reduce_loop,
-                                   ufunc, buffersize, ufunc_name, errormask);
+    PyArrayMethod_Context context = {
+        .caller = (PyObject *)ufunc,
+        .method = ufuncimpl,
+        .descriptors = descrs,
+    };
 
-    Py_DECREF(dtype);
+    PyArrayObject *result = PyUFunc_ReduceWrapper(&context,
+            arr, out, wheremask, axis_flags, reorderable, keepdims,
+            initial, reduce_loop, ufunc, buffersize, ufunc_name, errormask);
+
+    for (int i = 0; i < 3; i++) {
+        Py_DECREF(descrs[i]);
+    }
     Py_DECREF(initial);
     return result;
 }
@@ -3176,23 +2983,21 @@ PyUFunc_Reduce(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
 
 static PyObject *
 PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
-                   int axis, int otype)
+                   int axis, PyArray_DTypeMeta *signature[3])
 {
     PyArrayObject *op[2];
-    PyArray_Descr *op_dtypes[2] = {NULL, NULL};
     int op_axes_arrays[2][NPY_MAXDIMS];
     int *op_axes[2] = {op_axes_arrays[0], op_axes_arrays[1]};
     npy_uint32 op_flags[2];
-    int idim, ndim, otype_final;
+    int idim, ndim;
     int needs_api, need_outer_iterator;
 
-    NpyIter *iter = NULL, *iter_inner = NULL;
+    int res = 0;
 
-    /* The selected inner loop */
-    PyUFuncGenericFunction innerloop = NULL;
-    void *innerloopdata = NULL;
+    PyArrayMethod_StridedLoop *strided_loop;
+    NpyAuxData *auxdata = NULL;
 
-    const char *ufunc_name = ufunc_get_name_cstr(ufunc);
+    NpyIter *iter = NULL;
 
     /* These parameters come from extobj= or from a TLS global */
     int buffersize = 0, errormask = 0;
@@ -3214,42 +3019,32 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
     /* Take a reference to out for later returning */
     Py_XINCREF(out);
 
-    otype_final = otype;
-    if (get_binary_op_function(ufunc, &otype_final,
-                                &innerloop, &innerloopdata) < 0) {
-        PyArray_Descr *dtype = PyArray_DescrFromType(otype);
-        PyErr_Format(PyExc_ValueError,
-                     "could not find a matching type for %s.accumulate, "
-                     "requested type has type code '%c'",
-                            ufunc_name, dtype ? dtype->type : '-');
-        Py_XDECREF(dtype);
-        goto fail;
+    PyArray_Descr *descrs[3];
+    PyArrayMethodObject *ufuncimpl = reducelike_promote_and_resolve(ufunc,
+            arr, out, signature, NPY_TRUE, descrs, "accumulate");
+    if (ufuncimpl == NULL) {
+        return NULL;
     }
 
-    ndim = PyArray_NDIM(arr);
+    /* The below code assumes that all descriptors are identical: */
+    assert(descrs[0] == descrs[1] && descrs[0] == descrs[2]);
 
-    /*
-     * Set up the output data type, using the input's exact
-     * data type if the type number didn't change to preserve
-     * metadata
-     */
-    if (PyArray_DESCR(arr)->type_num == otype_final) {
-        if (PyArray_ISNBO(PyArray_DESCR(arr)->byteorder)) {
-            op_dtypes[0] = PyArray_DESCR(arr);
-            Py_INCREF(op_dtypes[0]);
-        }
-        else {
-            op_dtypes[0] = PyArray_DescrNewByteorder(PyArray_DESCR(arr),
-                                                    NPY_NATIVE);
-        }
-    }
-    else {
-        op_dtypes[0] = PyArray_DescrFromType(otype_final);
-    }
-    if (op_dtypes[0] == NULL) {
+    if (PyDataType_REFCHK(descrs[2]) && descrs[2]->type_num != NPY_OBJECT) {
+        /* This can be removed, but the initial element copy needs fixing */
+        PyErr_SetString(PyExc_TypeError,
+                "accumulation currently only supports `object` dtype with "
+                "references");
         goto fail;
     }
 
+    PyArrayMethod_Context context = {
+        .caller = (PyObject *)ufunc,
+        .method = ufuncimpl,
+        .descriptors = descrs,
+    };
+
+    ndim = PyArray_NDIM(arr);
+
 #if NPY_UF_DBG_TRACING
     printf("Found %s.accumulate inner loop with dtype :  ", ufunc_name);
     PyObject_Print((PyObject *)op_dtypes[0], stdout, 0);
@@ -3275,9 +3070,9 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
     need_outer_iterator = (ndim > 1);
     /* We can't buffer, so must do UPDATEIFCOPY */
     if (!PyArray_ISALIGNED(arr) || (out && !PyArray_ISALIGNED(out)) ||
-            !PyArray_EquivTypes(op_dtypes[0], PyArray_DESCR(arr)) ||
+            !PyArray_EquivTypes(descrs[1], PyArray_DESCR(arr)) ||
             (out &&
-             !PyArray_EquivTypes(op_dtypes[0], PyArray_DESCR(out)))) {
+             !PyArray_EquivTypes(descrs[0], PyArray_DESCR(out)))) {
         need_outer_iterator = 1;
     }
     /* If input and output overlap in memory, use iterator to figure it out */
@@ -3290,7 +3085,6 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
         npy_uint32 flags = NPY_ITER_ZEROSIZE_OK|
                            NPY_ITER_REFS_OK|
                            NPY_ITER_COPY_IF_OVERLAP;
-        PyArray_Descr **op_dtypes_param = NULL;
 
         /*
          * The way accumulate is set up, we can't do buffering,
@@ -3307,13 +3101,11 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
          */
         op_flags[0] |= NPY_ITER_UPDATEIFCOPY|NPY_ITER_ALIGNED|NPY_ITER_OVERLAP_ASSUME_ELEMENTWISE;
         op_flags[1] |= NPY_ITER_COPY|NPY_ITER_ALIGNED|NPY_ITER_OVERLAP_ASSUME_ELEMENTWISE;
-        op_dtypes_param = op_dtypes;
-        op_dtypes[1] = op_dtypes[0];
+
         NPY_UF_DBG_PRINT("Allocating outer iterator\n");
         iter = NpyIter_AdvancedNew(2, op, flags,
                                    NPY_KEEPORDER, NPY_UNSAFE_CASTING,
-                                   op_flags,
-                                   op_dtypes_param,
+                                   op_flags, descrs,
                                    ndim_iter, op_axes, NULL, 0);
         if (iter == NULL) {
             goto fail;
@@ -3331,14 +3123,14 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
         }
     }
 
-    /* Get the output */
+    /* Get the output from the iterator if it was allocated */
     if (out == NULL) {
         if (iter) {
             op[0] = out = NpyIter_GetOperandArray(iter)[0];
             Py_INCREF(out);
         }
         else {
-            PyArray_Descr *dtype = op_dtypes[0];
+            PyArray_Descr *dtype = descrs[0];
             Py_INCREF(dtype);
             op[0] = out = (PyArrayObject *)PyArray_NewFromDescr(
                                     &PyArray_Type, dtype,
@@ -3347,10 +3139,31 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
             if (out == NULL) {
                 goto fail;
             }
-
         }
     }
 
+    npy_intp fixed_strides[3];
+    if (need_outer_iterator) {
+        NpyIter_GetInnerFixedStrideArray(iter, fixed_strides);
+    }
+    else {
+        fixed_strides[0] = PyArray_STRIDES(op[0])[axis];
+        fixed_strides[1] = PyArray_STRIDES(op[1])[axis];
+        fixed_strides[2] = fixed_strides[0];
+    }
+
+
+    NPY_ARRAYMETHOD_FLAGS flags = 0;
+    if (ufuncimpl->get_strided_loop(&context,
+            1, 0, fixed_strides, &strided_loop, &auxdata, &flags) < 0) {
+        goto fail;
+    }
+    needs_api = (flags & NPY_METH_REQUIRES_PYAPI) != 0;
+    if (!(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        /* Start with the floating-point exception flags cleared */
+        npy_clear_floatstatus_barrier((char*)&iter);
+    }
+
     /*
      * If the reduction axis has size zero, either return the reduction
      * unit for UFUNC_REDUCE, or return the zero-sized output array
@@ -3371,7 +3184,7 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
         NpyIter_IterNextFunc *iternext;
         char **dataptr;
 
-        int itemsize = op_dtypes[0]->elsize;
+        int itemsize = descrs[0]->elsize;
 
         /* Get the variables needed for the loop */
         iternext = NpyIter_GetIterNext(iter, NULL);
@@ -3379,8 +3192,7 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
             goto fail;
         }
         dataptr = NpyIter_GetDataPtrArray(iter);
-        needs_api = NpyIter_IterationNeedsAPI(iter);
-
+        needs_api |= NpyIter_IterationNeedsAPI(iter);
 
         /* Execute the loop with just the outer iterator */
         count_m1 = PyArray_DIM(op[1], axis)-1;
@@ -3394,7 +3206,9 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
         stride_copy[1] = stride1;
         stride_copy[2] = stride0;
 
-        NPY_BEGIN_THREADS_NDITER(iter);
+        if (!needs_api) {
+            NPY_BEGIN_THREADS_THRESHOLDED(NpyIter_GetIterSize(iter));
+        }
 
         do {
             dataptr_copy[0] = dataptr[0];
@@ -3407,7 +3221,7 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
              * Output (dataptr[0]) and input (dataptr[1]) may point to
              * the same memory, e.g. np.add.accumulate(a, out=a).
              */
-            if (otype == NPY_OBJECT) {
+            if (descrs[2]->type_num == NPY_OBJECT) {
                 /*
                  * Incref before decref to avoid the possibility of the
                  * reference count being zero temporarily.
@@ -3427,18 +3241,17 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
                 dataptr_copy[2] += stride0;
                 NPY_UF_DBG_PRINT1("iterator loop count %d\n",
                                                 (int)count_m1);
-                innerloop(dataptr_copy, &count_m1,
-                            stride_copy, innerloopdata);
+                res = strided_loop(&context,
+                        dataptr_copy, &count_m1, stride_copy, auxdata);
             }
-        } while (!(needs_api && PyErr_Occurred()) && iternext(iter));
+        } while (res == 0 && iternext(iter));
 
         NPY_END_THREADS;
     }
     else if (iter == NULL) {
         char *dataptr_copy[3];
-        npy_intp stride_copy[3];
 
-        int itemsize = op_dtypes[0]->elsize;
+        int itemsize = descrs[0]->elsize;
 
         /* Execute the loop with no iterators */
         npy_intp count = PyArray_DIM(op[1], axis);
@@ -3452,15 +3265,11 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
                                       PyArray_NDIM(op[0]))) {
             PyErr_SetString(PyExc_ValueError,
                     "provided out is the wrong size "
-                    "for the reduction");
+                    "for the accumulation.");
             goto fail;
         }
         stride0 = PyArray_STRIDE(op[0], axis);
 
-        stride_copy[0] = stride0;
-        stride_copy[1] = stride1;
-        stride_copy[2] = stride0;
-
         /* Turn the two items into three for the inner loop */
         dataptr_copy[0] = PyArray_BYTES(op[0]);
         dataptr_copy[1] = PyArray_BYTES(op[1]);
@@ -3472,7 +3281,7 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
          * Output (dataptr[0]) and input (dataptr[1]) may point to the
          * same memory, e.g. np.add.accumulate(a, out=a).
          */
-        if (otype == NPY_OBJECT) {
+        if (descrs[2]->type_num == NPY_OBJECT) {
             /*
              * Incref before decref to avoid the possibility of the
              * reference count being zero temporarily.
@@ -3493,28 +3302,34 @@ PyUFunc_Accumulate(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *out,
 
             NPY_UF_DBG_PRINT1("iterator loop count %d\n", (int)count);
 
-            needs_api = PyDataType_REFCHK(op_dtypes[0]);
+            needs_api = PyDataType_REFCHK(descrs[0]);
 
             if (!needs_api) {
                 NPY_BEGIN_THREADS_THRESHOLDED(count);
             }
 
-            innerloop(dataptr_copy, &count,
-                        stride_copy, innerloopdata);
+            res = strided_loop(&context,
+                    dataptr_copy, &count, fixed_strides, auxdata);
 
             NPY_END_THREADS;
         }
     }
 
 finish:
-    Py_XDECREF(op_dtypes[0]);
-    int res = 0;
+    NPY_AUXDATA_FREE(auxdata);
+    Py_DECREF(descrs[0]);
+    Py_DECREF(descrs[1]);
+    Py_DECREF(descrs[2]);
+
     if (!NpyIter_Deallocate(iter)) {
         res = -1;
     }
-    if (!NpyIter_Deallocate(iter_inner)) {
-        res = -1;
+
+    if (res == 0 && !(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        /* NOTE: We could check float errors even when `res < 0` */
+        res = _check_ufunc_fperr(errormask, NULL, "accumulate");
     }
+
     if (res < 0) {
         Py_DECREF(out);
         return NULL;
@@ -3524,10 +3339,13 @@ finish:
 
 fail:
     Py_XDECREF(out);
-    Py_XDECREF(op_dtypes[0]);
+
+    NPY_AUXDATA_FREE(auxdata);
+    Py_XDECREF(descrs[0]);
+    Py_XDECREF(descrs[1]);
+    Py_XDECREF(descrs[2]);
 
     NpyIter_Deallocate(iter);
-    NpyIter_Deallocate(iter_inner);
 
     return NULL;
 }
@@ -3550,28 +3368,31 @@ fail:
  * indices[1::2] = range(1,len(array))
  *
  * output shape is based on the size of indices
+ *
+ * TODO: Reduceat duplicates too much code from accumulate!
  */
 static PyObject *
 PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
-                 PyArrayObject *out, int axis, int otype)
+                 PyArrayObject *out, int axis, PyArray_DTypeMeta *signature[3])
 {
     PyArrayObject *op[3];
-    PyArray_Descr *op_dtypes[3] = {NULL, NULL, NULL};
     int op_axes_arrays[3][NPY_MAXDIMS];
     int *op_axes[3] = {op_axes_arrays[0], op_axes_arrays[1],
                             op_axes_arrays[2]};
     npy_uint32 op_flags[3];
-    int idim, ndim, otype_final;
-    int need_outer_iterator = 0;
+    int idim, ndim;
+    int needs_api, need_outer_iterator = 0;
+
+    int res = 0;
 
     NpyIter *iter = NULL;
 
+    PyArrayMethod_StridedLoop *strided_loop;
+    NpyAuxData *auxdata = NULL;
+
     /* The reduceat indices - ind must be validated outside this call */
     npy_intp *reduceat_ind;
     npy_intp i, ind_size, red_axis_size;
-    /* The selected inner loop */
-    PyUFuncGenericFunction innerloop = NULL;
-    void *innerloopdata = NULL;
 
     const char *ufunc_name = ufunc_get_name_cstr(ufunc);
     char *opname = "reduceat";
@@ -3611,42 +3432,32 @@ PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
     /* Take a reference to out for later returning */
     Py_XINCREF(out);
 
-    otype_final = otype;
-    if (get_binary_op_function(ufunc, &otype_final,
-                                &innerloop, &innerloopdata) < 0) {
-        PyArray_Descr *dtype = PyArray_DescrFromType(otype);
-        PyErr_Format(PyExc_ValueError,
-                     "could not find a matching type for %s.%s, "
-                     "requested type has type code '%c'",
-                            ufunc_name, opname, dtype ? dtype->type : '-');
-        Py_XDECREF(dtype);
-        goto fail;
+    PyArray_Descr *descrs[3];
+    PyArrayMethodObject *ufuncimpl = reducelike_promote_and_resolve(ufunc,
+            arr, out, signature, NPY_TRUE, descrs, "reduceat");
+    if (ufuncimpl == NULL) {
+        return NULL;
     }
 
-    ndim = PyArray_NDIM(arr);
+    /* The below code assumes that all descriptors are identical: */
+    assert(descrs[0] == descrs[1] && descrs[0] == descrs[2]);
 
-    /*
-     * Set up the output data type, using the input's exact
-     * data type if the type number didn't change to preserve
-     * metadata
-     */
-    if (PyArray_DESCR(arr)->type_num == otype_final) {
-        if (PyArray_ISNBO(PyArray_DESCR(arr)->byteorder)) {
-            op_dtypes[0] = PyArray_DESCR(arr);
-            Py_INCREF(op_dtypes[0]);
-        }
-        else {
-            op_dtypes[0] = PyArray_DescrNewByteorder(PyArray_DESCR(arr),
-                                                    NPY_NATIVE);
-        }
-    }
-    else {
-        op_dtypes[0] = PyArray_DescrFromType(otype_final);
-    }
-    if (op_dtypes[0] == NULL) {
+    if (PyDataType_REFCHK(descrs[2]) && descrs[2]->type_num != NPY_OBJECT) {
+        /* This can be removed, but the initial element copy needs fixing */
+        PyErr_SetString(PyExc_TypeError,
+                "reduceat currently only supports `object` dtype with "
+                "references");
         goto fail;
     }
 
+    PyArrayMethod_Context context = {
+        .caller = (PyObject *)ufunc,
+        .method = ufuncimpl,
+        .descriptors = descrs,
+    };
+
+    ndim = PyArray_NDIM(arr);
+
 #if NPY_UF_DBG_TRACING
     printf("Found %s.%s inner loop with dtype :  ", ufunc_name, opname);
     PyObject_Print((PyObject *)op_dtypes[0], stdout, 0);
@@ -3673,11 +3484,13 @@ PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
     op[2] = ind;
 
     if (out != NULL || ndim > 1 || !PyArray_ISALIGNED(arr) ||
-            !PyArray_EquivTypes(op_dtypes[0], PyArray_DESCR(arr))) {
+            !PyArray_EquivTypes(descrs[0], PyArray_DESCR(arr))) {
         need_outer_iterator = 1;
     }
 
     if (need_outer_iterator) {
+        PyArray_Descr *op_dtypes[3] = {descrs[0], descrs[1], NULL};
+
         npy_uint32 flags = NPY_ITER_ZEROSIZE_OK|
                            NPY_ITER_REFS_OK|
                            NPY_ITER_MULTI_INDEX|
@@ -3706,8 +3519,7 @@ PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
         NPY_UF_DBG_PRINT("Allocating outer iterator\n");
         iter = NpyIter_AdvancedNew(3, op, flags,
                                    NPY_KEEPORDER, NPY_UNSAFE_CASTING,
-                                   op_flags,
-                                   op_dtypes,
+                                   op_flags, op_dtypes,
                                    ndim, op_axes, NULL, 0);
         if (iter == NULL) {
             goto fail;
@@ -3731,11 +3543,15 @@ PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
             Py_INCREF(out);
         }
     }
-    /* Allocate the output for when there's no outer iterator */
-    else if (out == NULL) {
-        Py_INCREF(op_dtypes[0]);
+    else {
+        /*
+         * Allocate the output for when there's no outer iterator, we always
+         * use the outer_iteration path when `out` is passed.
+         */
+        assert(out == NULL);
+        Py_INCREF(descrs[0]);
         op[0] = out = (PyArrayObject *)PyArray_NewFromDescr(
-                                    &PyArray_Type, op_dtypes[0],
+                                    &PyArray_Type, descrs[0],
                                     1, &ind_size, NULL, NULL,
                                     0, NULL);
         if (out == NULL) {
@@ -3743,6 +3559,28 @@ PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
         }
     }
 
+    npy_intp fixed_strides[3];
+    if (need_outer_iterator) {
+        NpyIter_GetInnerFixedStrideArray(iter, fixed_strides);
+    }
+    else {
+        fixed_strides[1] = PyArray_STRIDES(op[1])[axis];
+    }
+    /* The reduce axis does not advance here in the strided-loop */
+    fixed_strides[0] = 0;
+    fixed_strides[2] = 0;
+
+    NPY_ARRAYMETHOD_FLAGS flags = 0;
+    if (ufuncimpl->get_strided_loop(&context,
+            1, 0, fixed_strides, &strided_loop, &auxdata, &flags) < 0) {
+        goto fail;
+    }
+    needs_api = (flags & NPY_METH_REQUIRES_PYAPI) != 0;
+    if (!(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        /* Start with the floating-point exception flags cleared */
+        npy_clear_floatstatus_barrier((char*)&iter);
+    }
+
     /*
      * If the output has zero elements, return now.
      */
@@ -3760,8 +3598,8 @@ PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
         npy_intp stride0, stride1;
         npy_intp stride0_ind = PyArray_STRIDE(op[0], axis);
 
-        int itemsize = op_dtypes[0]->elsize;
-        int needs_api = NpyIter_IterationNeedsAPI(iter);
+        int itemsize = descrs[0]->elsize;
+        needs_api |= NpyIter_IterationNeedsAPI(iter);
 
         /* Get the variables needed for the loop */
         iternext = NpyIter_GetIterNext(iter, NULL);
@@ -3781,10 +3619,11 @@ PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
         stride_copy[1] = stride1;
         stride_copy[2] = stride0;
 
-        NPY_BEGIN_THREADS_NDITER(iter);
+        if (!needs_api) {
+            NPY_BEGIN_THREADS_THRESHOLDED(NpyIter_GetIterSize(iter));
+        }
 
         do {
-
             for (i = 0; i < ind_size; ++i) {
                 npy_intp start = reduceat_ind[i],
                         end = (i == ind_size-1) ? count_m1+1 :
@@ -3802,7 +3641,7 @@ PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
                  * to the same memory, e.g.
                  * np.add.reduceat(a, np.arange(len(a)), out=a).
                  */
-                if (otype == NPY_OBJECT) {
+                if (descrs[2]->type_num == NPY_OBJECT) {
                     /*
                      * Incref before decref to avoid the possibility of
                      * the reference count being zero temporarily.
@@ -3822,33 +3661,24 @@ PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
                     dataptr_copy[1] += stride1;
                     NPY_UF_DBG_PRINT1("iterator loop count %d\n",
                                                     (int)count);
-                    innerloop(dataptr_copy, &count,
-                                stride_copy, innerloopdata);
+                    res = strided_loop(&context,
+                            dataptr_copy, &count, stride_copy, auxdata);
                 }
             }
-        } while (!(needs_api && PyErr_Occurred()) && iternext(iter));
+        } while (res == 0 && iternext(iter));
 
         NPY_END_THREADS;
     }
     else if (iter == NULL) {
         char *dataptr_copy[3];
-        npy_intp stride_copy[3];
 
-        int itemsize = op_dtypes[0]->elsize;
+        int itemsize = descrs[0]->elsize;
 
         npy_intp stride0_ind = PyArray_STRIDE(op[0], axis);
-
-        /* Execute the loop with no iterators */
-        npy_intp stride0 = 0, stride1 = PyArray_STRIDE(op[1], axis);
-
-        int needs_api = PyDataType_REFCHK(op_dtypes[0]);
+        npy_intp stride1 = PyArray_STRIDE(op[1], axis);
 
         NPY_UF_DBG_PRINT("UFunc: Reduce loop with no iterators\n");
 
-        stride_copy[0] = stride0;
-        stride_copy[1] = stride1;
-        stride_copy[2] = stride0;
-
         if (!needs_api) {
             NPY_BEGIN_THREADS;
         }
@@ -3870,7 +3700,7 @@ PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
              * the same memory, e.g.
              * np.add.reduceat(a, np.arange(len(a)), out=a).
              */
-            if (otype == NPY_OBJECT) {
+            if (descrs[2]->type_num == NPY_OBJECT) {
                 /*
                  * Incref before decref to avoid the possibility of the
                  * reference count being zero temporarily.
@@ -3890,8 +3720,11 @@ PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
                 dataptr_copy[1] += stride1;
                 NPY_UF_DBG_PRINT1("iterator loop count %d\n",
                                                 (int)count);
-                innerloop(dataptr_copy, &count,
-                            stride_copy, innerloopdata);
+                res = strided_loop(&context,
+                        dataptr_copy, &count, fixed_strides, auxdata);
+                if (res != 0) {
+                    break;
+                }
             }
         }
 
@@ -3899,8 +3732,21 @@ PyUFunc_Reduceat(PyUFuncObject *ufunc, PyArrayObject *arr, PyArrayObject *ind,
     }
 
 finish:
-    Py_XDECREF(op_dtypes[0]);
+    NPY_AUXDATA_FREE(auxdata);
+    Py_DECREF(descrs[0]);
+    Py_DECREF(descrs[1]);
+    Py_DECREF(descrs[2]);
+
     if (!NpyIter_Deallocate(iter)) {
+        res = -1;
+    }
+
+    if (res == 0 && !(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        /* NOTE: We could check float errors even when `res < 0` */
+        res = _check_ufunc_fperr(errormask, NULL, "reduceat");
+    }
+
+    if (res < 0) {
         Py_DECREF(out);
         return NULL;
     }
@@ -3909,9 +3755,14 @@ finish:
 
 fail:
     Py_XDECREF(out);
-    Py_XDECREF(op_dtypes[0]);
+
+    NPY_AUXDATA_FREE(auxdata);
+    Py_XDECREF(descrs[0]);
+    Py_XDECREF(descrs[1]);
+    Py_XDECREF(descrs[2]);
 
     NpyIter_Deallocate(iter);
+
     return NULL;
 }
 
@@ -4009,7 +3860,7 @@ PyUFunc_GenericReduction(PyUFuncObject *ufunc,
     PyArrayObject *mp = NULL, *wheremask = NULL, *ret = NULL;
     PyObject *op = NULL;
     PyArrayObject *indices = NULL;
-    PyArray_Descr *otype = NULL;
+    PyArray_DTypeMeta *signature[3] = {NULL, NULL, NULL};
     PyArrayObject *out = NULL;
     int keepdims = 0;
     PyObject *initial = NULL;
@@ -4153,13 +4004,10 @@ PyUFunc_GenericReduction(PyUFuncObject *ufunc,
     }
     if (otype_obj && otype_obj != Py_None) {
         /* Use `_get_dtype` because `dtype` is a DType and not the instance */
-        PyArray_DTypeMeta *dtype = _get_dtype(otype_obj);
-        if (dtype == NULL) {
+        signature[0] = _get_dtype(otype_obj);
+        if (signature[0] == NULL) {
             goto fail;
         }
-        otype = dtype->singleton;
-        Py_INCREF(otype);
-        Py_DECREF(dtype);
     }
     if (out_obj && !PyArray_OutputConverter(out_obj, &out)) {
         goto fail;
@@ -4179,15 +4027,6 @@ PyUFunc_GenericReduction(PyUFuncObject *ufunc,
 
     ndim = PyArray_NDIM(mp);
 
-    /* Check to see that type (and otype) is not FLEXIBLE */
-    if (PyArray_ISFLEXIBLE(mp) ||
-        (otype && PyTypeNum_ISFLEXIBLE(otype->type_num))) {
-        PyErr_Format(PyExc_TypeError,
-                     "cannot perform %s with flexible type",
-                     _reduce_type[operation]);
-        goto fail;
-    }
-
     /* Convert the 'axis' parameter into a list of axes */
     if (axes_obj == NULL) {
         /* apply defaults */
@@ -4250,22 +4089,20 @@ PyUFunc_GenericReduction(PyUFuncObject *ufunc,
     }
 
      /*
-      * If out is specified it determines otype
-      * unless otype already specified.
+      * If no dtype is specified and out is not specified, we override the
+      * integer and bool dtype used for add and multiply.
+      *
+      * TODO: The following should be handled by a promoter!
       */
-    if (otype == NULL && out != NULL) {
-        otype = PyArray_DESCR(out);
-        Py_INCREF(otype);
-    }
-    if (otype == NULL) {
+    if (signature[0] == NULL && out == NULL) {
         /*
          * For integer types --- make sure at least a long
          * is used for add and multiply reduction to avoid overflow
          */
         int typenum = PyArray_TYPE(mp);
         if ((PyTypeNum_ISBOOL(typenum) || PyTypeNum_ISINTEGER(typenum))
-            && ((strcmp(ufunc->name,"add") == 0)
-                || (strcmp(ufunc->name,"multiply") == 0))) {
+                && ((strcmp(ufunc->name, "add") == 0)
+                    || (strcmp(ufunc->name, "multiply") == 0))) {
             if (PyTypeNum_ISBOOL(typenum)) {
                 typenum = NPY_LONG;
             }
@@ -4277,16 +4114,17 @@ PyUFunc_GenericReduction(PyUFuncObject *ufunc,
                     typenum = NPY_LONG;
                 }
             }
+            signature[0] = PyArray_DTypeFromTypeNum(typenum);
         }
-        otype = PyArray_DescrFromType(typenum);
     }
-
+    Py_XINCREF(signature[0]);
+    signature[2] = signature[0];
 
     switch(operation) {
     case UFUNC_REDUCE:
-        ret = PyUFunc_Reduce(ufunc, mp, out, naxes, axes,
-                             otype, keepdims, initial, wheremask);
-        Py_XDECREF(wheremask);
+        ret = PyUFunc_Reduce(ufunc,
+                mp, out, naxes, axes, signature, keepdims, initial, wheremask);
+        Py_XSETREF(wheremask, NULL);
         break;
     case UFUNC_ACCUMULATE:
         if (ndim == 0) {
@@ -4298,8 +4136,8 @@ PyUFunc_GenericReduction(PyUFuncObject *ufunc,
                         "accumulate does not allow multiple axes");
             goto fail;
         }
-        ret = (PyArrayObject *)PyUFunc_Accumulate(ufunc, mp, out, axes[0],
-                                                  otype->type_num);
+        ret = (PyArrayObject *)PyUFunc_Accumulate(ufunc,
+                mp, out, axes[0], signature);
         break;
     case UFUNC_REDUCEAT:
         if (ndim == 0) {
@@ -4311,20 +4149,23 @@ PyUFunc_GenericReduction(PyUFuncObject *ufunc,
                         "reduceat does not allow multiple axes");
             goto fail;
         }
-        ret = (PyArrayObject *)PyUFunc_Reduceat(ufunc, mp, indices, out,
-                                            axes[0], otype->type_num);
-        Py_DECREF(indices);
+        ret = (PyArrayObject *)PyUFunc_Reduceat(ufunc,
+                mp, indices, out, axes[0], signature);
+        Py_SETREF(indices, NULL);
         break;
     }
+    if (ret == NULL) {
+        goto fail;
+    }
+
+    Py_DECREF(signature[0]);
+    Py_DECREF(signature[1]);
+    Py_DECREF(signature[2]);
+
     Py_DECREF(mp);
-    Py_DECREF(otype);
     Py_XDECREF(full_args.in);
     Py_XDECREF(full_args.out);
 
-    if (ret == NULL) {
-        return NULL;
-    }
-
     /* Wrap and return the output */
     {
         /* Find __array_wrap__ - note that these rules are different to the
@@ -4352,9 +4193,13 @@ PyUFunc_GenericReduction(PyUFuncObject *ufunc,
     }
 
 fail:
-    Py_XDECREF(otype);
+    Py_XDECREF(signature[0]);
+    Py_XDECREF(signature[1]);
+    Py_XDECREF(signature[2]);
+
     Py_XDECREF(mp);
     Py_XDECREF(wheremask);
+    Py_XDECREF(indices);
     Py_XDECREF(full_args.in);
     Py_XDECREF(full_args.out);
     return NULL;
@@ -4424,7 +4269,7 @@ _get_dtype(PyObject *dtype_obj) {
             return NULL;
         }
         PyArray_DTypeMeta *out = NPY_DTYPE(descr);
-        if (NPY_UNLIKELY(!out->legacy)) {
+        if (NPY_UNLIKELY(!NPY_DT_is_legacy(out))) {
             /* TODO: this path was unreachable when added. */
             PyErr_SetString(PyExc_TypeError,
                     "Cannot pass a new user DType instance to the `dtype` or "
@@ -4461,83 +4306,30 @@ _get_dtype(PyObject *dtype_obj) {
 }
 
 
-static int
-_make_new_typetup(
-        int nop, PyArray_DTypeMeta *signature[], PyObject **out_typetup) {
-    *out_typetup = PyTuple_New(nop);
-    if (*out_typetup == NULL) {
-        return -1;
-    }
-
-    int noncount = 0;
-    for (int i = 0; i < nop; i++) {
-        PyObject *item;
-        if (signature[i] == NULL) {
-            item = Py_None;
-            noncount++;
-        }
-        else {
-            if (!signature[i]->legacy || signature[i]->abstract) {
-                /*
-                 * The legacy type resolution can't deal with these.
-                 * This path will return `None` or so in the future to
-                 * set an error later if the legacy type resolution is used.
-                 */
-                PyErr_SetString(PyExc_RuntimeError,
-                        "Internal NumPy error: new DType in signature not yet "
-                        "supported. (This should be unreachable code!)");
-                Py_SETREF(*out_typetup, NULL);
-                return -1;
-            }
-            item = (PyObject *)signature[i]->singleton;
-        }
-        Py_INCREF(item);
-        PyTuple_SET_ITEM(*out_typetup, i, item);
-    }
-    if (noncount == nop) {
-        /* The whole signature was None, simply ignore type tuple */
-        Py_DECREF(*out_typetup);
-        *out_typetup = NULL;
-    }
-    return 0;
-}
-
-
 /*
- * Finish conversion parsing of the type tuple.  NumPy always only honored
- * the type number for passed in descriptors/dtypes.
+ * Finish conversion parsing of the DType signature.  NumPy always only
+ * honored the type number for passed in descriptors/dtypes.
  * The `dtype` argument is interpreted as the first output DType (not
  * descriptor).
  * Unlike the dtype of an `out` array, it influences loop selection!
  *
- * NOTE: This function replaces the type tuple if passed in (it steals
- *       the original reference and returns a new object and reference)!
- *       The caller must XDECREF the type tuple both on error or success.
- *
- * The function returns a new, normalized type-tuple.
+ * It is the callers responsibility to clean `signature` and NULL it before
+ * calling.
  */
 static int
-_get_normalized_typetup(PyUFuncObject *ufunc,
-        PyObject *dtype_obj, PyObject *signature_obj, PyObject **out_typetup)
+_get_fixed_signature(PyUFuncObject *ufunc,
+        PyObject *dtype_obj, PyObject *signature_obj,
+        PyArray_DTypeMeta **signature)
 {
     if (dtype_obj == NULL && signature_obj == NULL) {
         return 0;
     }
 
-    int res = -1;
     int nin = ufunc->nin, nout = ufunc->nout, nop = nin + nout;
-    /*
-     * TODO: `signature` will be the main result in the future and
-     *       not the typetup. (Type tuple construction can be deffered to when
-     *       the legacy fallback is used).
-     */
-    PyArray_DTypeMeta *signature[NPY_MAXARGS];
-    memset(signature, '\0', sizeof(*signature) * nop);
 
     if (dtype_obj != NULL) {
         if (dtype_obj == Py_None) {
             /* If `dtype=None` is passed, no need to do anything */
-            assert(*out_typetup == NULL);
             return 0;
         }
         if (nout == 0) {
@@ -4555,8 +4347,7 @@ _get_normalized_typetup(PyUFuncObject *ufunc,
             signature[i] = dtype;
         }
         Py_DECREF(dtype);
-        res = _make_new_typetup(nop, signature, out_typetup);
-        goto finish;
+        return 0;
     }
 
     assert(signature_obj != NULL);
@@ -4572,32 +4363,46 @@ _get_normalized_typetup(PyUFuncObject *ufunc,
             if (PyTuple_GET_ITEM(signature_obj, 0) == Py_None) {
                 PyErr_SetString(PyExc_TypeError,
                         "a single item type tuple cannot contain None.");
-                goto finish;
+                return -1;
             }
             if (DEPRECATE("The use of a length 1 tuple for the ufunc "
                           "`signature` is deprecated. Use `dtype` or  fill the"
                           "tuple with `None`s.") < 0) {
-                goto finish;
+                return -1;
             }
             /* Use the same logic as for `dtype=` */
-            res = _get_normalized_typetup(ufunc,
-                    PyTuple_GET_ITEM(signature_obj, 0), NULL, out_typetup);
-            goto finish;
+            return _get_fixed_signature(ufunc,
+                    PyTuple_GET_ITEM(signature_obj, 0), NULL, signature);
         }
         if (n != nop) {
             PyErr_Format(PyExc_ValueError,
                     "a type-tuple must be specified of length %d for ufunc '%s'",
                     nop, ufunc_get_name_cstr(ufunc));
-            goto finish;
+            return -1;
         }
         for (int i = 0; i < nop; ++i) {
             PyObject *item = PyTuple_GET_ITEM(signature_obj, i);
             if (item == Py_None) {
                 continue;
             }
-            signature[i] = _get_dtype(item);
-            if (signature[i] == NULL) {
-                goto finish;
+            else {
+                signature[i] = _get_dtype(item);
+                if (signature[i] == NULL) {
+                    return -1;
+                }
+                else if (i < nin && NPY_DT_is_abstract(signature[i])) {
+                    /*
+                     * We reject abstract input signatures for now.  These
+                     * can probably be defined by finding the common DType with
+                     * the actual input and using the result of this for the
+                     * promotion.
+                     */
+                    PyErr_SetString(PyExc_TypeError,
+                            "Input DTypes to the signature must not be "
+                            "abstract.  The behaviour may be defined in the "
+                            "future.");
+                    return -1;
+                }
             }
         }
     }
@@ -4607,7 +4412,7 @@ _get_normalized_typetup(PyUFuncObject *ufunc,
         if (PyBytes_Check(signature_obj)) {
             str_object = PyUnicode_FromEncodedObject(signature_obj, NULL, NULL);
             if (str_object == NULL) {
-                goto finish;
+                return -1;
             }
         }
         else {
@@ -4619,7 +4424,7 @@ _get_normalized_typetup(PyUFuncObject *ufunc,
         const char *str = PyUnicode_AsUTF8AndSize(str_object, &length);
         if (str == NULL) {
             Py_DECREF(str_object);
-            goto finish;
+            return -1;
         }
 
         if (length != 1 && (length != nin+nout + 2 ||
@@ -4628,18 +4433,17 @@ _get_normalized_typetup(PyUFuncObject *ufunc,
                     "a type-string for %s, %d typecode(s) before and %d after "
                     "the -> sign", ufunc_get_name_cstr(ufunc), nin, nout);
             Py_DECREF(str_object);
-            goto finish;
+            return -1;
         }
         if (length == 1 && nin+nout != 1) {
             Py_DECREF(str_object);
             if (DEPRECATE("The use of a length 1 string for the ufunc "
                           "`signature` is deprecated. Use `dtype` attribute or "
                           "pass a tuple with `None`s.") < 0) {
-                goto finish;
+                return -1;
             }
             /* `signature="l"` is the same as `dtype="l"` */
-            res = _get_normalized_typetup(ufunc, str_object, NULL, out_typetup);
-            goto finish;
+            return _get_fixed_signature(ufunc, str_object, NULL, signature);
         }
         else {
             for (int i = 0; i < nin+nout; ++i) {
@@ -4647,7 +4451,7 @@ _get_normalized_typetup(PyUFuncObject *ufunc,
                 PyArray_Descr *descr = PyArray_DescrFromType(str[istr]);
                 if (descr == NULL) {
                     Py_DECREF(str_object);
-                    goto finish;
+                    return -1;
                 }
                 signature[i] = NPY_DTYPE(descr);
                 Py_INCREF(signature[i]);
@@ -4659,15 +4463,154 @@ _get_normalized_typetup(PyUFuncObject *ufunc,
     else {
         PyErr_SetString(PyExc_TypeError,
                 "the signature object to ufunc must be a string or a tuple.");
-        goto finish;
+        return -1;
+    }
+    return 0;
+}
+
+
+/*
+ * Fill in the actual descriptors used for the operation.  This function
+ * supports falling back to the legacy `ufunc->type_resolver`.
+ *
+ * We guarantee the array-method that all passed in descriptors are of the
+ * correct DType instance (i.e. a string can just fetch the length, it doesn't
+ * need to "cast" to string first).
+ */
+static int
+resolve_descriptors(int nop,
+        PyUFuncObject *ufunc, PyArrayMethodObject *ufuncimpl,
+        PyArrayObject *operands[], PyArray_Descr *dtypes[],
+        PyArray_DTypeMeta *signature[], NPY_CASTING casting)
+{
+    int retval = -1;
+    PyArray_Descr *original_dtypes[NPY_MAXARGS];
+
+    for (int i = 0; i < nop; ++i) {
+        if (operands[i] == NULL) {
+            original_dtypes[i] = NULL;
+        }
+        else {
+            /*
+             * The dtype may mismatch the signature, in which case we need
+             * to make it fit before calling the resolution.
+             */
+            PyArray_Descr *descr = PyArray_DTYPE(operands[i]);
+            original_dtypes[i] = PyArray_CastDescrToDType(descr, signature[i]);
+            if (original_dtypes[i] == NULL) {
+                nop = i;  /* only this much is initialized */
+                goto finish;
+            }
+        }
+    }
+
+    NPY_UF_DBG_PRINT("Resolving the descriptors\n");
+
+    if (ufuncimpl->resolve_descriptors != &wrapped_legacy_resolve_descriptors) {
+        /* The default: use the `ufuncimpl` as nature intended it */
+        NPY_CASTING safety = ufuncimpl->resolve_descriptors(ufuncimpl,
+                signature, original_dtypes, dtypes);
+        if (safety < 0) {
+            goto finish;
+        }
+        if (NPY_UNLIKELY(PyArray_MinCastSafety(safety, casting) != casting)) {
+            /* TODO: Currently impossible to reach (specialized unsafe loop) */
+            PyErr_Format(PyExc_TypeError,
+                    "The ufunc implementation for %s with the given dtype "
+                    "signature is not possible under the casting rule %s",
+                    ufunc_get_name_cstr(ufunc), npy_casting_to_string(casting));
+            goto finish;
+        }
+        retval = 0;
+    }
+    else {
+        /*
+         * Fall-back to legacy resolver using `operands`, used exclusively
+         * for datetime64/timedelta64 and custom ufuncs (in pyerfa/astropy).
+         */
+        retval = ufunc->type_resolver(ufunc, casting, operands, NULL, dtypes);
     }
-    res = _make_new_typetup(nop, signature, out_typetup);
 
   finish:
-    for (int i =0; i < nop; i++) {
-        Py_XDECREF(signature[i]);
+    for (int i = 0; i < nop; i++) {
+        Py_XDECREF(original_dtypes[i]);
     }
-    return res;
+    return retval;
+}
+
+
+/**
+ * Wraps all outputs and returns the result (which may be NULL on error).
+ *
+ * Use __array_wrap__ on all outputs
+ * if present on one of the input arguments.
+ * If present for multiple inputs:
+ * use __array_wrap__ of input object with largest
+ * __array_priority__ (default = 0.0)
+ *
+ * Exception:  we should not wrap outputs for items already
+ * passed in as output-arguments.  These items should either
+ * be left unwrapped or wrapped by calling their own __array_wrap__
+ * routine.
+ *
+ * For each output argument, wrap will be either
+ * NULL --- call PyArray_Return() -- default if no output arguments given
+ * None --- array-object passed in don't call PyArray_Return
+ * method --- the __array_wrap__ method to call.
+ *
+ * @param ufunc
+ * @param full_args Original inputs and outputs
+ * @param subok Whether subclasses are allowed
+ * @param result_arrays The ufunc result(s).  REFERENCES ARE STOLEN!
+ */
+static PyObject *
+replace_with_wrapped_result_and_return(PyUFuncObject *ufunc,
+        ufunc_full_args full_args, npy_bool subok,
+        PyArrayObject *result_arrays[])
+{
+    PyObject *retobj[NPY_MAXARGS];
+    PyObject *wraparr[NPY_MAXARGS];
+    _find_array_wrap(full_args, subok, wraparr, ufunc->nin, ufunc->nout);
+
+    /* wrap outputs */
+    for (int i = 0; i < ufunc->nout; i++) {
+        _ufunc_context context;
+
+        context.ufunc = ufunc;
+        context.args = full_args;
+        context.out_i = i;
+
+        retobj[i] = _apply_array_wrap(wraparr[i], result_arrays[i], &context);
+        result_arrays[i] = NULL;  /* Was DECREF'ed and (probably) wrapped */
+        if (retobj[i] == NULL) {
+            goto fail;
+        }
+    }
+
+    if (ufunc->nout == 1) {
+        return retobj[0];
+    }
+    else {
+        PyObject *result = PyTuple_New(ufunc->nout);
+        if (result == NULL) {
+            return NULL;
+        }
+        for (int i = 0; i < ufunc->nout; i++) {
+            PyTuple_SET_ITEM(result, i, retobj[i]);
+        }
+        return result;
+    }
+
+  fail:
+    for (int i = 0; i < ufunc->nout; i++) {
+        if (result_arrays[i] != NULL) {
+            Py_DECREF(result_arrays[i]);
+        }
+        else {
+            Py_XDECREF(retobj[i]);
+        }
+    }
+    return NULL;
 }
 
 
@@ -4685,16 +4628,25 @@ ufunc_generic_fastcall(PyUFuncObject *ufunc,
         PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames,
         npy_bool outer)
 {
-    PyArrayObject *operands[NPY_MAXARGS] = {NULL};
-    PyObject *retobj[NPY_MAXARGS];
-    PyObject *wraparr[NPY_MAXARGS];
-    PyObject *override = NULL;
-    ufunc_full_args full_args = {NULL, NULL};
-    PyObject *typetup = NULL;
-
     int errval;
     int nin = ufunc->nin, nout = ufunc->nout, nop = ufunc->nargs;
 
+    /* All following variables are cleared in the `fail` error path */
+    ufunc_full_args full_args;
+    PyArrayObject *wheremask = NULL;
+
+    PyArray_DTypeMeta *signature[NPY_MAXARGS];
+    PyArrayObject *operands[NPY_MAXARGS];
+    PyArray_DTypeMeta *operand_DTypes[NPY_MAXARGS];
+    PyArray_Descr *operation_descrs[NPY_MAXARGS];
+    PyObject *output_array_prepare[NPY_MAXARGS];
+    /* Initialize all arrays (we usually only need a small part) */
+    memset(signature, 0, nop * sizeof(*signature));
+    memset(operands, 0, nop * sizeof(*operands));
+    memset(operand_DTypes, 0, nop * sizeof(*operation_descrs));
+    memset(operation_descrs, 0, nop * sizeof(*operation_descrs));
+    memset(output_array_prepare, 0, nout * sizeof(*output_array_prepare));
+
     /*
      * Note that the input (and possibly output) arguments are passed in as
      * positional arguments. We extract these first and check for `out`
@@ -4704,7 +4656,7 @@ ufunc_generic_fastcall(PyUFuncObject *ufunc,
      */
 
     /* Check number of arguments */
-    if ((len_args < nin) || (len_args > nop)) {
+    if (NPY_UNLIKELY((len_args < nin) || (len_args > nop))) {
         PyErr_Format(PyExc_TypeError,
                 "%s() takes from %d to %d positional arguments but "
                 "%zd were given",
@@ -4713,15 +4665,10 @@ ufunc_generic_fastcall(PyUFuncObject *ufunc,
     }
 
     /* Fetch input arguments. */
-    full_args.in = PyTuple_New(ufunc->nin);
+    full_args.in = PyArray_TupleFromItems(ufunc->nin, args, 0);
     if (full_args.in == NULL) {
         return NULL;
     }
-    for (int i = 0; i < ufunc->nin; i++) {
-        PyObject *tmp = args[i];
-        Py_INCREF(tmp);
-        PyTuple_SET_ITEM(full_args.in, i, tmp);
-    }
 
     /*
      * If there are more arguments, they define the out args. Otherwise
@@ -4842,6 +4789,7 @@ ufunc_generic_fastcall(PyUFuncObject *ufunc,
         method = "outer";
     }
     /* We now have all the information required to check for Overrides */
+    PyObject *override = NULL;
     errval = PyUFunc_CheckOverride(ufunc, method,
             full_args.in, full_args.out,
             args, len_args, kwnames, &override);
@@ -4867,7 +4815,8 @@ ufunc_generic_fastcall(PyUFuncObject *ufunc,
      * Parse the passed `dtype` or `signature` into an array containing
      * PyArray_DTypeMeta and/or None.
      */
-    if (_get_normalized_typetup(ufunc, dtype_obj, signature_obj, &typetup) < 0) {
+    if (_get_fixed_signature(ufunc,
+            dtype_obj, signature_obj, signature) < 0) {
         goto fail;
     }
 
@@ -4875,8 +4824,13 @@ ufunc_generic_fastcall(PyUFuncObject *ufunc,
     NPY_CASTING casting = NPY_DEFAULT_ASSIGN_CASTING;
     npy_bool subok = NPY_TRUE;
     int keepdims = -1;  /* We need to know if it was passed */
-    PyArrayObject *wheremask = NULL;
-    if (convert_ufunc_arguments(ufunc, full_args, operands,
+    npy_bool force_legacy_promotion;
+    npy_bool allow_legacy_promotion;
+    if (convert_ufunc_arguments(ufunc,
+            /* extract operand related information: */
+            full_args, operands,
+            operand_DTypes, &force_legacy_promotion, &allow_legacy_promotion,
+            /* extract general information: */
             order_obj, &order,
             casting_obj, &casting,
             subok_obj, &subok,
@@ -4885,154 +4839,92 @@ ufunc_generic_fastcall(PyUFuncObject *ufunc,
         goto fail;
     }
 
+    /*
+     * Note that part of the promotion is to the complete the signature
+     * (until here it only represents the fixed part and is usually NULLs).
+     *
+     * After promotion, we could push the following logic into the ArrayMethod
+     * in the future.  For now, we do it here.  The type resolution step can
+     * be shared between the ufunc and gufunc code.
+     */
+    PyArrayMethodObject *ufuncimpl = promote_and_get_ufuncimpl(ufunc,
+            operands, signature,
+            operand_DTypes, force_legacy_promotion, allow_legacy_promotion,
+            NPY_FALSE);
+    if (ufuncimpl == NULL) {
+        goto fail;
+    }
+
+    /* Find the correct descriptors for the operation */
+    if (resolve_descriptors(nop, ufunc, ufuncimpl,
+            operands, operation_descrs, signature, casting) < 0) {
+        goto fail;
+    }
+
+    if (subok) {
+        _find_array_prepare(full_args, output_array_prepare, nout);
+    }
+
+    /*
+     * Do the final preparations and call the inner-loop.
+     */
     if (!ufunc->core_enabled) {
-        errval = PyUFunc_GenericFunctionInternal(ufunc, operands,
-                full_args, typetup, extobj, casting, order, subok,
+        errval = PyUFunc_GenericFunctionInternal(ufunc, ufuncimpl,
+                operation_descrs, operands, extobj, casting, order,
+                output_array_prepare, full_args,  /* for __array_prepare__ */
                 wheremask);
-        Py_XDECREF(wheremask);
     }
     else {
-        errval = PyUFunc_GeneralizedFunctionInternal(ufunc, operands,
-                full_args, typetup, extobj, casting, order, subok,
+        errval = PyUFunc_GeneralizedFunctionInternal(ufunc, ufuncimpl,
+                operation_descrs, operands, extobj, casting, order,
+                /* GUFuncs never (ever) called __array_prepare__! */
                 axis_obj, axes_obj, keepdims);
     }
-
     if (errval < 0) {
         goto fail;
     }
 
-    /* Free the input references */
-    for (int i = 0; i < ufunc->nin; i++) {
-        Py_XSETREF(operands[i], NULL);
-    }
-
     /*
-     * Use __array_wrap__ on all outputs
-     * if present on one of the input arguments.
-     * If present for multiple inputs:
-     * use __array_wrap__ of input object with largest
-     * __array_priority__ (default = 0.0)
-     *
-     * Exception:  we should not wrap outputs for items already
-     * passed in as output-arguments.  These items should either
-     * be left unwrapped or wrapped by calling their own __array_wrap__
-     * routine.
-     *
-     * For each output argument, wrap will be either
-     * NULL --- call PyArray_Return() -- default if no output arguments given
-     * None --- array-object passed in don't call PyArray_Return
-     * method --- the __array_wrap__ method to call.
+     * Clear all variables which are not needed any further.
+     * (From here on, we cannot `goto fail` any more.)
      */
-    _find_array_wrap(full_args, subok, wraparr, ufunc->nin, ufunc->nout);
-
-    /* wrap outputs */
-    for (int i = 0; i < ufunc->nout; i++) {
-        int j = ufunc->nin+i;
-        _ufunc_context context;
-        PyObject *wrapped;
-
-        context.ufunc = ufunc;
-        context.args = full_args;
-        context.out_i = i;
-
-        wrapped = _apply_array_wrap(wraparr[i], operands[j], &context);
-        operands[j] = NULL;  /* Prevent fail double-freeing this */
-        if (wrapped == NULL) {
-            for (int j = 0; j < i; j++) {
-                Py_DECREF(retobj[j]);
-            }
-            goto fail;
+    Py_XDECREF(wheremask);
+    for (int i = 0; i < nop; i++) {
+        Py_DECREF(signature[i]);
+        Py_XDECREF(operand_DTypes[i]);
+        Py_DECREF(operation_descrs[i]);
+        if (i < nin) {
+            Py_DECREF(operands[i]);
+        }
+        else {
+            Py_XDECREF(output_array_prepare[i-nin]);
         }
-
-        retobj[i] = wrapped;
     }
-
-    Py_XDECREF(typetup);
+    /* The following steals the references to the outputs: */
+    PyObject *result = replace_with_wrapped_result_and_return(ufunc,
+            full_args, subok, operands+nin);
     Py_XDECREF(full_args.in);
     Py_XDECREF(full_args.out);
-    if (ufunc->nout == 1) {
-        return retobj[0];
-    }
-    else {
-        PyTupleObject *ret;
 
-        ret = (PyTupleObject *)PyTuple_New(ufunc->nout);
-        for (int i = 0; i < ufunc->nout; i++) {
-            PyTuple_SET_ITEM(ret, i, retobj[i]);
-        }
-        return (PyObject *)ret;
-    }
+    return result;
 
 fail:
-    Py_XDECREF(typetup);
     Py_XDECREF(full_args.in);
     Py_XDECREF(full_args.out);
+    Py_XDECREF(wheremask);
     for (int i = 0; i < ufunc->nargs; i++) {
         Py_XDECREF(operands[i]);
+        Py_XDECREF(signature[i]);
+        Py_XDECREF(operand_DTypes[i]);
+        Py_XDECREF(operation_descrs[i]);
+        if (i < nout) {
+            Py_XDECREF(output_array_prepare[i]);
+        }
     }
     return NULL;
 }
 
 
-/*
- * TODO: The implementation below can be replaced with PyVectorcall_Call
- *       when available (should be Python 3.8+).
- */
-static PyObject *
-ufunc_generic_call(
-        PyUFuncObject *ufunc, PyObject *args, PyObject *kwds)
-{
-    Py_ssize_t len_args = PyTuple_GET_SIZE(args);
-    /*
-     * Wrapper for tp_call to tp_fastcall, to support both on older versions
-     * of Python. (and generally simplifying support of both versions in the
-     * same codebase.
-     */
-    if (kwds == NULL) {
-        return ufunc_generic_fastcall(ufunc,
-                PySequence_Fast_ITEMS(args), len_args, NULL, NPY_FALSE);
-    }
-
-    PyObject *new_args[NPY_MAXARGS];
-    Py_ssize_t len_kwds = PyDict_Size(kwds);
-
-    if (NPY_UNLIKELY(len_args + len_kwds > NPY_MAXARGS)) {
-        /*
-         * We do not have enough scratch-space, so we have to abort;
-         * In practice this error should not be seen by users.
-         */
-        PyErr_Format(PyExc_ValueError,
-                "%s() takes from %d to %d positional arguments but "
-                "%zd were given",
-                ufunc_get_name_cstr(ufunc) , ufunc->nin, ufunc->nargs, len_args);
-        return NULL;
-    }
-
-    /* Copy args into the scratch space */
-    for (Py_ssize_t i = 0; i < len_args; i++) {
-        new_args[i] = PyTuple_GET_ITEM(args, i);
-    }
-
-    PyObject *kwnames = PyTuple_New(len_kwds);
-
-    PyObject *key, *value;
-    Py_ssize_t pos = 0;
-    Py_ssize_t i = 0;
-    while (PyDict_Next(kwds, &pos, &key, &value)) {
-        Py_INCREF(key);
-        PyTuple_SET_ITEM(kwnames, i, key);
-        new_args[i + len_args] = value;
-        i++;
-    }
-
-    PyObject *res = ufunc_generic_fastcall(ufunc,
-            new_args, len_args, kwnames, NPY_FALSE);
-    Py_DECREF(kwnames);
-    return res;
-}
-
-
-#if PY_VERSION_HEX >= 0x03080000
 /*
  * Implement vectorcallfunc which should be defined with Python 3.8+.
  * In principle this could be backported, but the speed gain seems moderate
@@ -5050,7 +4942,6 @@ ufunc_generic_vectorcall(PyObject *ufunc,
     return ufunc_generic_fastcall((PyUFuncObject *)ufunc,
             args, PyVectorcall_NARGS(len_args), kwnames, NPY_FALSE);
 }
-#endif  /* PY_VERSION_HEX >= 0x03080000 */
 
 
 NPY_NO_EXPORT PyObject *
@@ -5227,18 +5118,36 @@ PyUFunc_FromFuncAndDataAndSignatureAndIdentity(PyUFuncGenericFunction *func, voi
     ufunc->core_dim_flags = NULL;
     ufunc->userloops = NULL;
     ufunc->ptr = NULL;
-#if PY_VERSION_HEX >= 0x03080000
     ufunc->vectorcall = &ufunc_generic_vectorcall;
-#else
-    ufunc->reserved2 = NULL;
-#endif
     ufunc->reserved1 = 0;
     ufunc->iter_flags = 0;
 
     /* Type resolution and inner loop selection functions */
     ufunc->type_resolver = &PyUFunc_DefaultTypeResolver;
     ufunc->legacy_inner_loop_selector = &PyUFunc_DefaultLegacyInnerLoopSelector;
-    ufunc->masked_inner_loop_selector = &PyUFunc_DefaultMaskedInnerLoopSelector;
+    ufunc->_always_null_previously_masked_innerloop_selector = NULL;
+
+    ufunc->op_flags = NULL;
+    ufunc->_loops = NULL;
+    if (nin + nout != 0) {
+        ufunc->_dispatch_cache = PyArrayIdentityHash_New(nin + nout);
+        if (ufunc->_dispatch_cache == NULL) {
+            Py_DECREF(ufunc);
+            return NULL;
+        }
+    }
+    else {
+        /*
+         * Work around a test that seems to do this right now, it should not
+         * be a valid ufunc at all though, so. TODO: Remove...
+         */
+        ufunc->_dispatch_cache = NULL;
+    }
+    ufunc->_loops = PyList_New(0);
+    if (ufunc->_loops == NULL) {
+        Py_DECREF(ufunc);
+        return NULL;
+    }
 
     if (name == NULL) {
         ufunc->name = "?";
@@ -5261,6 +5170,42 @@ PyUFunc_FromFuncAndDataAndSignatureAndIdentity(PyUFuncGenericFunction *func, voi
             return NULL;
         }
     }
+
+    char *curr_types = ufunc->types;
+    for (int i = 0; i < ntypes * (nin + nout); i += nin + nout) {
+        /*
+         * Add all legacy wrapping loops here. This is normally not necessary,
+         * but makes sense.  It could also help/be needed to avoid issues with
+         * ambiguous loops such as: `OO->?` and `OO->O` where in theory the
+         * wrong loop could be picked if only the second one is added.
+         */
+        PyObject *info;
+        PyArray_DTypeMeta *op_dtypes[NPY_MAXARGS];
+        for (int arg = 0; arg < nin + nout; arg++) {
+            op_dtypes[arg] = PyArray_DTypeFromTypeNum(curr_types[arg]);
+            /* These DTypes are immortal and adding INCREFs: so borrow it */
+            Py_DECREF(op_dtypes[arg]);
+        }
+        curr_types += nin + nout;
+
+        info = add_and_return_legacy_wrapping_ufunc_loop(ufunc, op_dtypes, 1);
+        if (info == NULL) {
+            Py_DECREF(ufunc);
+            return NULL;
+        }
+    }
+    /*
+     * TODO: I tried adding a default promoter here (either all object for
+     *       some special cases, or all homogeneous).  Those are reasonable
+     *       defaults, but short-cut a deprecated SciPy loop, where the
+     *       homogeneous loop `ddd->d` was deprecated, but an inhomogeneous
+     *       one `dld->d` should be picked.
+     *       The default promoter *is* a reasonable default, but switched that
+     *       behaviour.
+     *       Another problem appeared due to buggy type-resolution for
+     *       datetimes, this meant that `timedelta.sum(dtype="f8")` returned
+     *       datetimes (and not floats or error), arguably wrong, but...
+     */
     return (PyObject *)ufunc;
 }
 
@@ -5384,6 +5329,7 @@ PyUFunc_RegisterLoopForDescr(PyUFuncObject *ufunc,
 
     arg_typenums = PyArray_malloc(ufunc->nargs * sizeof(int));
     if (arg_typenums == NULL) {
+        Py_DECREF(key);
         PyErr_NoMemory();
         return -1;
     }
@@ -5475,6 +5421,8 @@ PyUFunc_RegisterLoopForType(PyUFuncObject *ufunc,
     PyArray_Descr *descr;
     PyUFunc_Loop1d *funcdata;
     PyObject *key, *cobj;
+    PyArray_DTypeMeta *signature[NPY_MAXARGS];
+    PyObject *signature_tuple = NULL;
     int i;
     int *newtypes=NULL;
 
@@ -5503,13 +5451,67 @@ PyUFunc_RegisterLoopForType(PyUFuncObject *ufunc,
     if (arg_types != NULL) {
         for (i = 0; i < ufunc->nargs; i++) {
             newtypes[i] = arg_types[i];
+            signature[i] = PyArray_DTypeFromTypeNum(arg_types[i]);
+            Py_DECREF(signature[i]);  /* DType can't be deleted... */
         }
     }
     else {
         for (i = 0; i < ufunc->nargs; i++) {
             newtypes[i] = usertype;
+            signature[i] = PyArray_DTypeFromTypeNum(usertype);
+            Py_DECREF(signature[i]);  /* DType can't be deleted... */
+        }
+    }
+
+    signature_tuple = PyArray_TupleFromItems(
+            ufunc->nargs, (PyObject **)signature, 0);
+    if (signature_tuple == NULL) {
+        goto fail;
+    }
+    /*
+     * We add the loop to the list of all loops and promoters.  If the
+     * equivalent loop was already added, skip this.
+     * Note that even then the ufunc is still modified: The legacy ArrayMethod
+     * already looks up the inner-loop from the ufunc (and this is replaced
+     * below!).
+     * If the existing one is not a legacy ArrayMethod, we raise currently:
+     * A new-style loop should not be replaced by an old-style one.
+     */
+    int add_new_loop = 1;
+    for (Py_ssize_t j = 0; j < PyList_GET_SIZE(ufunc->_loops); j++) {
+        PyObject *item = PyList_GET_ITEM(ufunc->_loops, j);
+        PyObject *existing_tuple = PyTuple_GET_ITEM(item, 0);
+
+        int cmp = PyObject_RichCompareBool(existing_tuple, signature_tuple, Py_EQ);
+        if (cmp < 0) {
+            goto fail;
+        }
+        if (!cmp) {
+            continue;
+        }
+        PyObject *registered = PyTuple_GET_ITEM(item, 1);
+        if (!PyObject_TypeCheck(registered, &PyArrayMethod_Type) || (
+                (PyArrayMethodObject *)registered)->get_strided_loop !=
+                        &get_wrapped_legacy_ufunc_loop) {
+            PyErr_Format(PyExc_TypeError,
+                    "A non-compatible loop was already registered for "
+                    "ufunc %s and DTypes %S.",
+                    ufunc_get_name_cstr(ufunc), signature_tuple);
+            goto fail;
+        }
+        /* The loop was already added */
+        add_new_loop = 0;
+        break;
+    }
+    if (add_new_loop) {
+        PyObject *info = add_and_return_legacy_wrapping_ufunc_loop(
+                ufunc, signature, 0);
+        if (info == NULL) {
+            goto fail;
         }
     }
+    /* Clearing sets it to NULL for the error paths */
+    Py_CLEAR(signature_tuple);
 
     funcdata->func = function;
     funcdata->arg_types = newtypes;
@@ -5521,7 +5523,7 @@ PyUFunc_RegisterLoopForType(PyUFuncObject *ufunc,
     /* Get entry for this user-defined type*/
     cobj = PyDict_GetItemWithError(ufunc->userloops, key);
     if (cobj == NULL && PyErr_Occurred()) {
-        return 0;
+        goto fail;
     }
     /* If it's not there, then make one and return. */
     else if (cobj == NULL) {
@@ -5583,6 +5585,7 @@ PyUFunc_RegisterLoopForType(PyUFuncObject *ufunc,
 
  fail:
     Py_DECREF(key);
+    Py_XDECREF(signature_tuple);
     PyArray_free(funcdata);
     PyArray_free(newtypes);
     if (!PyErr_Occurred()) PyErr_NoMemory();
@@ -5608,8 +5611,10 @@ ufunc_dealloc(PyUFuncObject *ufunc)
     if (ufunc->identity == PyUFunc_IdentityValue) {
         Py_DECREF(ufunc->identity_value);
     }
-    if (ufunc->obj != NULL) {
-        Py_DECREF(ufunc->obj);
+    Py_XDECREF(ufunc->obj);
+    Py_XDECREF(ufunc->_loops);
+    if (ufunc->_dispatch_cache != NULL) {
+        PyArrayIdentityHash_Dealloc(ufunc->_dispatch_cache);
     }
     PyObject_GC_Del(ufunc);
 }
@@ -5824,15 +5829,13 @@ ufunc_at(PyUFuncObject *ufunc, PyObject *args)
     PyArrayObject *op2_array = NULL;
     PyArrayMapIterObject *iter = NULL;
     PyArrayIterObject *iter2 = NULL;
-    PyArray_Descr *dtypes[3] = {NULL, NULL, NULL};
     PyArrayObject *operands[3] = {NULL, NULL, NULL};
     PyArrayObject *array_operands[3] = {NULL, NULL, NULL};
 
-    int needs_api = 0;
+    PyArray_DTypeMeta *signature[3] = {NULL, NULL, NULL};
+    PyArray_DTypeMeta *operand_DTypes[3] = {NULL, NULL, NULL};
+    PyArray_Descr *operation_descrs[3] = {NULL, NULL, NULL};
 
-    PyUFuncGenericFunction innerloop;
-    void *innerloopdata;
-    npy_intp i;
     int nop;
 
     /* override vars */
@@ -5845,6 +5848,10 @@ ufunc_at(PyUFuncObject *ufunc, PyObject *args)
     int buffersize;
     int errormask = 0;
     char * err_msg = NULL;
+
+    PyArrayMethod_StridedLoop *strided_loop;
+    NpyAuxData *auxdata = NULL;
+
     NPY_BEGIN_THREADS_DEF;
 
     if (ufunc->nin > 2) {
@@ -5932,26 +5939,51 @@ ufunc_at(PyUFuncObject *ufunc, PyObject *args)
 
     /*
      * Create dtypes array for either one or two input operands.
-     * The output operand is set to the first input operand
+     * Compare to the logic in `convert_ufunc_arguments`.
+     * TODO: It may be good to review some of this behaviour, since the
+     *       operand array is special (it is written to) similar to reductions.
+     *       Using unsafe-casting as done here, is likely not desirable.
      */
     operands[0] = op1_array;
+    operand_DTypes[0] = NPY_DTYPE(PyArray_DESCR(op1_array));
+    Py_INCREF(operand_DTypes[0]);
+    int force_legacy_promotion = 0;
+    int allow_legacy_promotion = NPY_DT_is_legacy(operand_DTypes[0]);
+
     if (op2_array != NULL) {
         operands[1] = op2_array;
-        operands[2] = op1_array;
+        operand_DTypes[1] = NPY_DTYPE(PyArray_DESCR(op2_array));
+        Py_INCREF(operand_DTypes[1]);
+        allow_legacy_promotion &= NPY_DT_is_legacy(operand_DTypes[1]);
+        operands[2] = operands[0];
+        operand_DTypes[2] = operand_DTypes[0];
+        Py_INCREF(operand_DTypes[2]);
+
         nop = 3;
+        if (allow_legacy_promotion && ((PyArray_NDIM(op1_array) == 0)
+                                       != (PyArray_NDIM(op2_array) == 0))) {
+                /* both are legacy and only one is 0-D: force legacy */
+                force_legacy_promotion = should_use_min_scalar(2, operands, 0, NULL);
+            }
     }
     else {
-        operands[1] = op1_array;
+        operands[1] = operands[0];
+        operand_DTypes[1] = operand_DTypes[0];
+        Py_INCREF(operand_DTypes[1]);
         operands[2] = NULL;
         nop = 2;
     }
 
-    if (ufunc->type_resolver(ufunc, NPY_UNSAFE_CASTING,
-                            operands, NULL, dtypes) < 0) {
+    PyArrayMethodObject *ufuncimpl = promote_and_get_ufuncimpl(ufunc,
+            operands, signature, operand_DTypes,
+            force_legacy_promotion, allow_legacy_promotion, NPY_FALSE);
+    if (ufuncimpl == NULL) {
         goto fail;
     }
-    if (ufunc->legacy_inner_loop_selector(ufunc, dtypes,
-        &innerloop, &innerloopdata, &needs_api) < 0) {
+
+    /* Find the correct descriptors for the operation */
+    if (resolve_descriptors(nop, ufunc, ufuncimpl,
+            operands, operation_descrs, signature, NPY_UNSAFE_CASTING) < 0) {
         goto fail;
     }
 
@@ -6012,21 +6044,44 @@ ufunc_at(PyUFuncObject *ufunc, PyObject *args)
                         NPY_ITER_GROWINNER|
                         NPY_ITER_DELAY_BUFALLOC,
                         NPY_KEEPORDER, NPY_UNSAFE_CASTING,
-                        op_flags, dtypes,
+                        op_flags, operation_descrs,
                         -1, NULL, NULL, buffersize);
 
     if (iter_buffer == NULL) {
         goto fail;
     }
 
-    needs_api = needs_api | NpyIter_IterationNeedsAPI(iter_buffer);
-
     iternext = NpyIter_GetIterNext(iter_buffer, NULL);
     if (iternext == NULL) {
         NpyIter_Deallocate(iter_buffer);
         goto fail;
     }
 
+    PyArrayMethod_Context context = {
+            .caller = (PyObject *)ufunc,
+            .method = ufuncimpl,
+            .descriptors = operation_descrs,
+    };
+
+    NPY_ARRAYMETHOD_FLAGS flags;
+    /* Use contiguous strides; if there is such a loop it may be faster */
+    npy_intp strides[3] = {
+            operation_descrs[0]->elsize, operation_descrs[1]->elsize, 0};
+    if (nop == 3) {
+        strides[2] = operation_descrs[2]->elsize;
+    }
+
+    if (ufuncimpl->get_strided_loop(&context, 1, 0, strides,
+            &strided_loop, &auxdata, &flags) < 0) {
+        goto fail;
+    }
+    int needs_api = (flags & NPY_METH_REQUIRES_PYAPI) != 0;
+    needs_api |= NpyIter_IterationNeedsAPI(iter_buffer);
+    if (!(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        /* Start with the floating-point exception flags cleared */
+        npy_clear_floatstatus_barrier((char*)&iter);
+    }
+
     if (!needs_api) {
         NPY_BEGIN_THREADS;
     }
@@ -6035,14 +6090,13 @@ ufunc_at(PyUFuncObject *ufunc, PyObject *args)
      * Iterate over first and second operands and call ufunc
      * for each pair of inputs
      */
-    i = iter->size;
-    while (i > 0)
+    int res = 0;
+    for (npy_intp i = iter->size; i > 0; i--)
     {
         char *dataptr[3];
         char **buffer_dataptr;
         /* one element at a time, no stride required but read by innerloop */
-        npy_intp count[3] = {1, 0xDEADBEEF, 0xDEADBEEF};
-        npy_intp stride[3] = {0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF};
+        npy_intp count = 1;
 
         /*
          * Set up data pointers for either one or two input operands.
@@ -6061,14 +6115,14 @@ ufunc_at(PyUFuncObject *ufunc, PyObject *args)
         /* Reset NpyIter data pointers which will trigger a buffer copy */
         NpyIter_ResetBasePointers(iter_buffer, dataptr, &err_msg);
         if (err_msg) {
+            res = -1;
             break;
         }
 
         buffer_dataptr = NpyIter_GetDataPtrArray(iter_buffer);
 
-        innerloop(buffer_dataptr, count, stride, innerloopdata);
-
-        if (needs_api && PyErr_Occurred()) {
+        res = strided_loop(&context, buffer_dataptr, &count, strides, auxdata);
+        if (res != 0) {
             break;
         }
 
@@ -6082,27 +6136,37 @@ ufunc_at(PyUFuncObject *ufunc, PyObject *args)
         if (iter2 != NULL) {
             PyArray_ITER_NEXT(iter2);
         }
-
-        i--;
     }
 
     NPY_END_THREADS;
 
-    if (err_msg) {
+    if (res != 0 && err_msg) {
         PyErr_SetString(PyExc_ValueError, err_msg);
     }
+    if (res == 0 && !(flags & NPY_METH_NO_FLOATINGPOINT_ERRORS)) {
+        /* NOTE: We could check float errors even when `res < 0` */
+        res = _check_ufunc_fperr(errormask, NULL, "at");
+    }
 
+    NPY_AUXDATA_FREE(auxdata);
     NpyIter_Deallocate(iter_buffer);
 
     Py_XDECREF(op2_array);
     Py_XDECREF(iter);
     Py_XDECREF(iter2);
-    for (i = 0; i < 3; i++) {
-        Py_XDECREF(dtypes[i]);
+    for (int i = 0; i < nop; i++) {
+        Py_DECREF(signature[i]);
+        Py_XDECREF(operand_DTypes[i]);
+        Py_XDECREF(operation_descrs[i]);
         Py_XDECREF(array_operands[i]);
     }
 
-    if (needs_api && PyErr_Occurred()) {
+    /*
+     * An error should only be possible if needs_api is true or `res != 0`,
+     * but this is not strictly correct for old-style ufuncs
+     * (e.g. `power` released the GIL but manually set an Exception).
+     */
+    if (res != 0 || PyErr_Occurred()) {
         return NULL;
     }
     else {
@@ -6117,10 +6181,13 @@ fail:
     Py_XDECREF(op2_array);
     Py_XDECREF(iter);
     Py_XDECREF(iter2);
-    for (i = 0; i < 3; i++) {
-        Py_XDECREF(dtypes[i]);
+    for (int i = 0; i < 3; i++) {
+        Py_XDECREF(signature[i]);
+        Py_XDECREF(operand_DTypes[i]);
+        Py_XDECREF(operation_descrs[i]);
         Py_XDECREF(array_operands[i]);
     }
+    NPY_AUXDATA_FREE(auxdata);
 
     return NULL;
 }
@@ -6164,7 +6231,7 @@ _typecharfromnum(int num) {
 
 
 static PyObject *
-ufunc_get_doc(PyUFuncObject *ufunc)
+ufunc_get_doc(PyUFuncObject *ufunc, void *NPY_UNUSED(ignored))
 {
     static PyObject *_sig_formatter;
     PyObject *doc;
@@ -6196,31 +6263,31 @@ ufunc_get_doc(PyUFuncObject *ufunc)
 
 
 static PyObject *
-ufunc_get_nin(PyUFuncObject *ufunc)
+ufunc_get_nin(PyUFuncObject *ufunc, void *NPY_UNUSED(ignored))
 {
     return PyLong_FromLong(ufunc->nin);
 }
 
 static PyObject *
-ufunc_get_nout(PyUFuncObject *ufunc)
+ufunc_get_nout(PyUFuncObject *ufunc, void *NPY_UNUSED(ignored))
 {
     return PyLong_FromLong(ufunc->nout);
 }
 
 static PyObject *
-ufunc_get_nargs(PyUFuncObject *ufunc)
+ufunc_get_nargs(PyUFuncObject *ufunc, void *NPY_UNUSED(ignored))
 {
     return PyLong_FromLong(ufunc->nargs);
 }
 
 static PyObject *
-ufunc_get_ntypes(PyUFuncObject *ufunc)
+ufunc_get_ntypes(PyUFuncObject *ufunc, void *NPY_UNUSED(ignored))
 {
     return PyLong_FromLong(ufunc->ntypes);
 }
 
 static PyObject *
-ufunc_get_types(PyUFuncObject *ufunc)
+ufunc_get_types(PyUFuncObject *ufunc, void *NPY_UNUSED(ignored))
 {
     /* return a list with types grouped input->output */
     PyObject *list;
@@ -6254,20 +6321,20 @@ ufunc_get_types(PyUFuncObject *ufunc)
 }
 
 static PyObject *
-ufunc_get_name(PyUFuncObject *ufunc)
+ufunc_get_name(PyUFuncObject *ufunc, void *NPY_UNUSED(ignored))
 {
     return PyUnicode_FromString(ufunc->name);
 }
 
 static PyObject *
-ufunc_get_identity(PyUFuncObject *ufunc)
+ufunc_get_identity(PyUFuncObject *ufunc, void *NPY_UNUSED(ignored))
 {
     npy_bool reorderable;
     return _get_identity(ufunc, &reorderable);
 }
 
 static PyObject *
-ufunc_get_signature(PyUFuncObject *ufunc)
+ufunc_get_signature(PyUFuncObject *ufunc, void *NPY_UNUSED(ignored))
 {
     if (!ufunc->core_enabled) {
         Py_RETURN_NONE;
@@ -6323,19 +6390,15 @@ NPY_NO_EXPORT PyTypeObject PyUFunc_Type = {
     .tp_basicsize = sizeof(PyUFuncObject),
     .tp_dealloc = (destructor)ufunc_dealloc,
     .tp_repr = (reprfunc)ufunc_repr,
-    .tp_call = (ternaryfunc)ufunc_generic_call,
+    .tp_call = &PyVectorcall_Call,
     .tp_str = (reprfunc)ufunc_repr,
     .tp_flags = Py_TPFLAGS_DEFAULT |
-#if PY_VERSION_HEX >= 0x03080000
         _Py_TPFLAGS_HAVE_VECTORCALL |
-#endif
         Py_TPFLAGS_HAVE_GC,
     .tp_traverse = (traverseproc)ufunc_traverse,
     .tp_methods = ufunc_methods,
     .tp_getset = ufunc_getset,
-#if PY_VERSION_HEX >= 0x03080000
     .tp_vectorcall_offset = offsetof(PyUFuncObject, vectorcall),
-#endif
 };
 
 /* End of code for ufunc objects */
index 88aa9ed6c112b6ff3f0177f4ba8371f946711cca..9ed923cf56e776ac4d27d3687131dd6521fe6b57 100644 (file)
@@ -1,4 +1,16 @@
 /*
+ * NOTE: The type resolution defined in this file is considered legacy.
+ *
+ * The new mechanism separates type resolution and promotion into two
+ * distinct steps, as per NEP 43.
+ * Further, the functions in this file rely on the operands rather than
+ * only the DTypes/descriptors.  They are still called and at this point
+ * vital (NumPy ~1.21), but should hopefully become largely irrelevant very
+ * quickly.
+ *
+ * At that point, this file should be deletable in its entirety.
+ *
+ *
  * This file implements type resolution for NumPy element-wise ufuncs.
  * This mechanism is still backwards-compatible with the pre-existing
  * legacy mechanism, so performs much slower than is necessary.
  *
  * See LICENSE.txt for the license.
  */
-#define _UMATHMODULE
-#define _MULTIARRAYMODULE
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+#define _UMATHMODULE
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
 
 // printif debug tracing
 #ifndef NPY_UF_DBG_TRACING
     #define NPY_UF_DBG_TRACING 0
 #endif
 
-#include <stdbool.h>
-
-#include "Python.h"
-
 #include "npy_config.h"
 #include "npy_pycompat.h"
 #include "npy_import.h"
@@ -36,6 +47,8 @@
 #include "cblasfuncs.h"
 #endif
 
+#include <stdbool.h>
+
 static PyObject *
 npy_casting_to_py_object(NPY_CASTING casting)
 {
@@ -89,14 +102,11 @@ raise_binary_type_reso_error(PyUFuncObject *ufunc, PyArrayObject **operands) {
 /** Helper function to raise UFuncNoLoopError
  * Always returns -1 to indicate the exception was raised, for convenience
  */
-static int
+NPY_NO_EXPORT int
 raise_no_loop_found_error(
-        PyUFuncObject *ufunc, PyArray_Descr **dtypes)
+        PyUFuncObject *ufunc, PyObject **dtypes)
 {
     static PyObject *exc_type = NULL;
-    PyObject *exc_value;
-    PyObject *dtypes_tup;
-    npy_intp i;
 
     npy_cache_import(
         "numpy.core._exceptions", "_UFuncNoLoopError",
@@ -105,22 +115,12 @@ raise_no_loop_found_error(
         return -1;
     }
 
-    /* convert dtypes to a tuple */
-    dtypes_tup = PyTuple_New(ufunc->nargs);
+    PyObject *dtypes_tup = PyArray_TupleFromItems(ufunc->nargs, dtypes, 1);
     if (dtypes_tup == NULL) {
         return -1;
     }
-    for (i = 0; i < ufunc->nargs; ++i) {
-        PyObject *tmp = Py_None;
-        if (dtypes[i] != NULL) {
-            tmp = (PyObject *)dtypes[i];
-        }
-        Py_INCREF(tmp);
-        PyTuple_SET_ITEM(dtypes_tup, i, tmp);
-    }
-
     /* produce an error object */
-    exc_value = PyTuple_Pack(2, ufunc, dtypes_tup);
+    PyObject *exc_value = PyTuple_Pack(2, ufunc, dtypes_tup);
     Py_DECREF(dtypes_tup);
     if (exc_value == NULL) {
         return -1;
@@ -131,6 +131,7 @@ raise_no_loop_found_error(
     return -1;
 }
 
+
 static int
 raise_casting_error(
         PyObject *exc_type,
@@ -246,6 +247,28 @@ PyUFunc_ValidateCasting(PyUFuncObject *ufunc,
 }
 
 
+/*
+ * Same as `PyUFunc_ValidateCasting` but only checks output casting.
+ */
+NPY_NO_EXPORT int
+PyUFunc_ValidateOutCasting(PyUFuncObject *ufunc,
+        NPY_CASTING casting, PyArrayObject **operands, PyArray_Descr **dtypes)
+{
+    int i, nin = ufunc->nin, nop = nin + ufunc->nout;
+
+    for (i = nin; i < nop; ++i) {
+        if (operands[i] == NULL) {
+            continue;
+        }
+        if (!PyArray_CanCastTypeTo(dtypes[i],
+                PyArray_DESCR(operands[i]), casting)) {
+            return raise_output_casting_error(
+                    ufunc, casting, dtypes[i], PyArray_DESCR(operands[i]), i);
+        }
+    }
+    return 0;
+}
+
 /*UFUNC_API
  *
  * This function applies the default type resolution rules
@@ -345,22 +368,30 @@ PyUFunc_SimpleBinaryComparisonTypeResolver(PyUFuncObject *ufunc,
             if (out_dtypes[0] == NULL) {
                 return -1;
             }
+            out_dtypes[1] = out_dtypes[0];
+            Py_INCREF(out_dtypes[1]);
         }
         else {
             /* Not doing anything will lead to a loop no found error. */
             out_dtypes[0] = PyArray_DESCR(operands[0]);
             Py_INCREF(out_dtypes[0]);
+            out_dtypes[1] = PyArray_DESCR(operands[1]);
+            Py_INCREF(out_dtypes[1]);
         }
-        out_dtypes[1] = out_dtypes[0];
-        Py_INCREF(out_dtypes[1]);
     }
     else {
         PyArray_Descr *descr;
         /*
+         * DEPRECATED 2021-03, NumPy 1.20
+         *
          * If the type tuple was originally a single element (probably),
          * issue a deprecation warning, but otherwise accept it.  Since the
          * result dtype is always boolean, this is not actually valid unless it
          * is `object` (but if there is an object input we already deferred).
+         *
+         * TODO: Once this deprecation is gone, the special case for
+         *       `PyUFunc_SimpleBinaryComparisonTypeResolver` in dispatching.c
+         *       can be removed.
          */
         if (PyTuple_Check(type_tup) && PyTuple_GET_SIZE(type_tup) == 3 &&
                 PyTuple_GET_ITEM(type_tup, 0) == Py_None &&
@@ -539,7 +570,7 @@ PyUFunc_SimpleUniformOperationTypeResolver(
                     out_dtypes[iop] = PyArray_DESCR(operands[iop]);
                     Py_INCREF(out_dtypes[iop]);
                 }
-                raise_no_loop_found_error(ufunc, out_dtypes);
+                raise_no_loop_found_error(ufunc, (PyObject **)out_dtypes);
                 for (iop = 0; iop < ufunc->nin; iop++) {
                     Py_DECREF(out_dtypes[iop]);
                     out_dtypes[iop] = NULL;
@@ -1504,138 +1535,9 @@ PyUFunc_DefaultLegacyInnerLoopSelector(PyUFuncObject *ufunc,
         types += nargs;
     }
 
-    return raise_no_loop_found_error(ufunc, dtypes);
+    return raise_no_loop_found_error(ufunc, (PyObject **)dtypes);
 }
 
-typedef struct {
-    NpyAuxData base;
-    PyUFuncGenericFunction unmasked_innerloop;
-    void *unmasked_innerloopdata;
-    int nargs;
-} _ufunc_masker_data;
-
-static NpyAuxData *
-ufunc_masker_data_clone(NpyAuxData *data)
-{
-    _ufunc_masker_data *n;
-
-    /* Allocate a new one */
-    n = (_ufunc_masker_data *)PyArray_malloc(sizeof(_ufunc_masker_data));
-    if (n == NULL) {
-        return NULL;
-    }
-
-    /* Copy the data (unmasked data doesn't have object semantics) */
-    memcpy(n, data, sizeof(_ufunc_masker_data));
-
-    return (NpyAuxData *)n;
-}
-
-/*
- * This function wraps a regular unmasked ufunc inner loop as a
- * masked ufunc inner loop, only calling the function for
- * elements where the mask is True.
- */
-static void
-unmasked_ufunc_loop_as_masked(
-             char **dataptrs, npy_intp *strides,
-             char *mask, npy_intp mask_stride,
-             npy_intp loopsize,
-             NpyAuxData *innerloopdata)
-{
-    _ufunc_masker_data *data;
-    int iargs, nargs;
-    PyUFuncGenericFunction unmasked_innerloop;
-    void *unmasked_innerloopdata;
-    npy_intp subloopsize;
-
-    /* Put the aux data into local variables */
-    data = (_ufunc_masker_data *)innerloopdata;
-    unmasked_innerloop = data->unmasked_innerloop;
-    unmasked_innerloopdata = data->unmasked_innerloopdata;
-    nargs = data->nargs;
-
-    /* Process the data as runs of unmasked values */
-    do {
-        /* Skip masked values */
-        mask = npy_memchr(mask, 0, mask_stride, loopsize, &subloopsize, 1);
-        for (iargs = 0; iargs < nargs; ++iargs) {
-            dataptrs[iargs] += subloopsize * strides[iargs];
-        }
-        loopsize -= subloopsize;
-        /*
-         * Process unmasked values (assumes unmasked loop doesn't
-         * mess with the 'args' pointer values)
-         */
-        mask = npy_memchr(mask, 0, mask_stride, loopsize, &subloopsize, 0);
-        unmasked_innerloop(dataptrs, &subloopsize, strides,
-                                        unmasked_innerloopdata);
-        for (iargs = 0; iargs < nargs; ++iargs) {
-            dataptrs[iargs] += subloopsize * strides[iargs];
-        }
-        loopsize -= subloopsize;
-    } while (loopsize > 0);
-}
-
-
-/*
- * This function wraps a legacy inner loop so it becomes masked.
- *
- * Returns 0 on success, -1 on error.
- */
-NPY_NO_EXPORT int
-PyUFunc_DefaultMaskedInnerLoopSelector(PyUFuncObject *ufunc,
-                            PyArray_Descr **dtypes,
-                            PyArray_Descr *mask_dtype,
-                            npy_intp *NPY_UNUSED(fixed_strides),
-                            npy_intp NPY_UNUSED(fixed_mask_stride),
-                            PyUFunc_MaskedStridedInnerLoopFunc **out_innerloop,
-                            NpyAuxData **out_innerloopdata,
-                            int *out_needs_api)
-{
-    int retcode;
-    _ufunc_masker_data *data;
-
-    if (ufunc->legacy_inner_loop_selector == NULL) {
-        PyErr_SetString(PyExc_RuntimeError,
-                "the ufunc default masked inner loop selector doesn't "
-                "yet support wrapping the new inner loop selector, it "
-                "still only wraps the legacy inner loop selector");
-        return -1;
-    }
-
-    if (mask_dtype->type_num != NPY_BOOL) {
-        PyErr_SetString(PyExc_ValueError,
-                "only boolean masks are supported in ufunc inner loops "
-                "presently");
-        return -1;
-    }
-
-    /* Create a new NpyAuxData object for the masker data */
-    data = (_ufunc_masker_data *)PyArray_malloc(sizeof(_ufunc_masker_data));
-    if (data == NULL) {
-        PyErr_NoMemory();
-        return -1;
-    }
-    memset(data, 0, sizeof(_ufunc_masker_data));
-    data->base.free = (NpyAuxData_FreeFunc *)&PyArray_free;
-    data->base.clone = &ufunc_masker_data_clone;
-    data->nargs = ufunc->nin + ufunc->nout;
-
-    /* Get the unmasked ufunc inner loop */
-    retcode = ufunc->legacy_inner_loop_selector(ufunc, dtypes,
-                    &data->unmasked_innerloop, &data->unmasked_innerloopdata,
-                    out_needs_api);
-    if (retcode < 0) {
-        PyArray_free(data);
-        return retcode;
-    }
-
-    /* Return the loop function + aux data */
-    *out_innerloop = &unmasked_ufunc_loop_as_masked;
-    *out_innerloopdata = (NpyAuxData *)data;
-    return 0;
-}
 
 static int
 ufunc_loop_matches(PyUFuncObject *self,
@@ -2262,6 +2164,10 @@ type_tuple_type_resolver(PyUFuncObject *self,
      * `signature=(None,)*nin + (dtype,)*nout`.  If the signature matches that
      * exactly (could be relaxed but that is not necessary for backcompat),
      * we also try `signature=(dtype,)*(nin+nout)`.
+     * Since reduction pass in `(dtype, None, dtype)` we broaden this to
+     * replacing all unspecified dtypes with the homogeneous output one.
+     * Note that this can (and often will) lead to unsafe casting.  This is
+     * normally rejected (but not currently for reductions!).
      * This used to be the main meaning for `dtype=dtype`, but some calls broke
      * the expectation, and changing it allows for `dtype=dtype` to be useful
      * for ufuncs like `np.ldexp` in the future while also normalizing it to
@@ -2280,13 +2186,12 @@ type_tuple_type_resolver(PyUFuncObject *self,
     if (homogeneous_type != NPY_NOTYPE) {
         for (int i = 0; i < nin; i++) {
             if (specified_types[i] != NPY_NOTYPE) {
-                homogeneous_type = NPY_NOTYPE;
-                break;
+                /* Never replace a specified type! */
+                continue;
             }
             specified_types[i] = homogeneous_type;
         }
-    }
-    if (homogeneous_type != NPY_NOTYPE) {
+
         /* Try again with the homogeneous specified types. */
         res = type_tuple_type_resolver_core(self,
                 op, input_casting, casting, specified_types, any_object,
index b11c69852889f3ff0a23c159f39610b27312360c..84a2593f44c40256dcdca3a4aa64fb8a54bc0f26 100644 (file)
@@ -99,6 +99,10 @@ PyUFunc_DivmodTypeResolver(PyUFuncObject *ufunc,
                               PyObject *type_tup,
                               PyArray_Descr **out_dtypes);
 
+NPY_NO_EXPORT int
+PyUFunc_ValidateOutCasting(PyUFuncObject *ufunc,
+        NPY_CASTING casting, PyArrayObject **operands, PyArray_Descr **dtypes);
+
 /*
  * Does a linear search for the best inner loop of the ufunc.
  *
@@ -136,14 +140,6 @@ PyUFunc_DefaultLegacyInnerLoopSelector(PyUFuncObject *ufunc,
                                        int *out_needs_api);
 
 NPY_NO_EXPORT int
-PyUFunc_DefaultMaskedInnerLoopSelector(PyUFuncObject *ufunc,
-                                      PyArray_Descr **dtypes,
-                                      PyArray_Descr *mask_dtypes,
-                                      npy_intp *NPY_UNUSED(fixed_strides),
-                                      npy_intp NPY_UNUSED(fixed_mask_stride),
-                                      PyUFunc_MaskedStridedInnerLoopFunc 
-                                      **out_innerloop,
-                                      NpyAuxData **out_innerloopdata,
-                                      int *out_needs_api);
+raise_no_loop_found_error(PyUFuncObject *ufunc, PyObject **dtypes);
 
 #endif
index b4b7db760c649151e7c14e2d04df60d5f2837bb9..272555704cf5362bebbd7debf43c649a021e50f6 100644 (file)
@@ -1,25 +1,17 @@
 /* -*- c -*- */
-
-/*
- * vim:syntax=c
- */
-
-/*
- *****************************************************************************
- **                            INCLUDES                                     **
- *****************************************************************************
- */
+/* vim:syntax=c */
 
 /*
  * _UMATHMODULE IS needed in __ufunc_api.h, included from numpy/ufuncobject.h.
  * This is a mess and it would be nice to fix it. It has nothing to do with
  * __ufunc_api.c
  */
-#define _UMATHMODULE
-#define _MULTIARRAYMODULE
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define _MULTIARRAYMODULE
+#define _UMATHMODULE
 
-#include "Python.h"
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
 
 #include "npy_config.h"
 
@@ -30,6 +22,7 @@
 
 #include "numpy/npy_math.h"
 #include "number.h"
+#include "dispatching.h"
 
 static PyUFuncGenericFunction pyfunc_functions[] = {PyUFunc_On_Om};
 
@@ -224,9 +217,18 @@ NPY_VISIBILITY_HIDDEN PyObject *npy_um_str_pyvals_name = NULL;
 static int
 intern_strings(void)
 {
-    if (!(npy_um_str_array_prepare = PyUnicode_InternFromString("__array_prepare__"))) return -1;
-    if (!(npy_um_str_array_wrap = PyUnicode_InternFromString("__array_wrap__"))) return -1;
-    if (!(npy_um_str_pyvals_name = PyUnicode_InternFromString(UFUNC_PYVALS_NAME))) return -1;
+    npy_um_str_array_prepare = PyUnicode_InternFromString("__array_prepare__");
+    if (npy_um_str_array_prepare == NULL) {
+        return -1;
+    }
+    npy_um_str_array_wrap = PyUnicode_InternFromString("__array_wrap__");
+    if (npy_um_str_array_wrap == NULL) {
+        return -1;
+    }
+    npy_um_str_pyvals_name = PyUnicode_InternFromString(UFUNC_PYVALS_NAME);
+    if (npy_um_str_pyvals_name == NULL) {
+        return -1;
+    }
     return 0;
 }
 
@@ -304,5 +306,33 @@ int initumath(PyObject *m)
         return -1;
     }
 
+    /*
+     * Set up promoters for logical functions
+     * TODO: This should probably be done at a better place, or even in the
+     *       code generator directly.
+     */
+    s = _PyDict_GetItemStringWithError(d, "logical_and");
+    if (s == NULL) {
+        return -1;
+    }
+    if (install_logical_ufunc_promoter(s) < 0) {
+        return -1;
+    }
+
+    s = _PyDict_GetItemStringWithError(d, "logical_or");
+    if (s == NULL) {
+        return -1;
+    }
+    if (install_logical_ufunc_promoter(s) < 0) {
+        return -1;
+    }
+
+    s = _PyDict_GetItemStringWithError(d, "logical_xor");
+    if (s == NULL) {
+        return -1;
+    }
+    if (install_logical_ufunc_promoter(s) < 0) {
+        return -1;
+    }
     return 0;
 }
diff --git a/numpy/core/tests/data/generate_umath_validation_data.cpp b/numpy/core/tests/data/generate_umath_validation_data.cpp
new file mode 100644 (file)
index 0000000..418eae6
--- /dev/null
@@ -0,0 +1,170 @@
+#include <algorithm>
+#include <fstream>
+#include <iostream>
+#include <math.h>
+#include <random>
+#include <stdio.h>
+#include <time.h>
+#include <vector>
+
+struct ufunc {
+    std::string name;
+    double (*f32func)(double);
+    long double (*f64func)(long double);
+    float f32ulp;
+    float f64ulp;
+};
+
+template <typename T>
+T
+RandomFloat(T a, T b)
+{
+    T random = ((T)rand()) / (T)RAND_MAX;
+    T diff = b - a;
+    T r = random * diff;
+    return a + r;
+}
+
+template <typename T>
+void
+append_random_array(std::vector<T> &arr, T min, T max, size_t N)
+{
+    for (size_t ii = 0; ii < N; ++ii)
+        arr.emplace_back(RandomFloat<T>(min, max));
+}
+
+template <typename T1, typename T2>
+std::vector<T1>
+computeTrueVal(const std::vector<T1> &in, T2 (*mathfunc)(T2))
+{
+    std::vector<T1> out;
+    for (T1 elem : in) {
+        T2 elem_d = (T2)elem;
+        T1 out_elem = (T1)mathfunc(elem_d);
+        out.emplace_back(out_elem);
+    }
+    return out;
+}
+
+/*
+ * FP range:
+ * [-inf, -maxflt, -1., -minflt, -minden, 0., minden, minflt, 1., maxflt, inf]
+ */
+
+#define MINDEN std::numeric_limits<T>::denorm_min()
+#define MINFLT std::numeric_limits<T>::min()
+#define MAXFLT std::numeric_limits<T>::max()
+#define INF std::numeric_limits<T>::infinity()
+#define qNAN std::numeric_limits<T>::quiet_NaN()
+#define sNAN std::numeric_limits<T>::signaling_NaN()
+
+template <typename T>
+std::vector<T>
+generate_input_vector(std::string func)
+{
+    std::vector<T> input = {MINDEN,  -MINDEN, MINFLT, -MINFLT, MAXFLT,
+                            -MAXFLT, INF,     -INF,   qNAN,    sNAN,
+                            -1.0,    1.0,     0.0,    -0.0};
+
+    // [-1.0, 1.0]
+    if ((func == "arcsin") || (func == "arccos") || (func == "arctanh")) {
+        append_random_array<T>(input, -1.0, 1.0, 700);
+    }
+    // (0.0, INF]
+    else if ((func == "log2") || (func == "log10")) {
+        append_random_array<T>(input, 0.0, 1.0, 200);
+        append_random_array<T>(input, MINDEN, MINFLT, 200);
+        append_random_array<T>(input, MINFLT, 1.0, 200);
+        append_random_array<T>(input, 1.0, MAXFLT, 200);
+    }
+    // (-1.0, INF]
+    else if (func == "log1p") {
+        append_random_array<T>(input, -1.0, 1.0, 200);
+        append_random_array<T>(input, -MINFLT, -MINDEN, 100);
+        append_random_array<T>(input, -1.0, -MINFLT, 100);
+        append_random_array<T>(input, MINDEN, MINFLT, 100);
+        append_random_array<T>(input, MINFLT, 1.0, 100);
+        append_random_array<T>(input, 1.0, MAXFLT, 100);
+    }
+    // [1.0, INF]
+    else if (func == "arccosh") {
+        append_random_array<T>(input, 1.0, 2.0, 400);
+        append_random_array<T>(input, 2.0, MAXFLT, 300);
+    }
+    // [-INF, INF]
+    else {
+        append_random_array<T>(input, -1.0, 1.0, 100);
+        append_random_array<T>(input, MINDEN, MINFLT, 100);
+        append_random_array<T>(input, -MINFLT, -MINDEN, 100);
+        append_random_array<T>(input, MINFLT, 1.0, 100);
+        append_random_array<T>(input, -1.0, -MINFLT, 100);
+        append_random_array<T>(input, 1.0, MAXFLT, 100);
+        append_random_array<T>(input, -MAXFLT, -100.0, 100);
+    }
+
+    std::random_shuffle(input.begin(), input.end());
+    return input;
+}
+
+int
+main()
+{
+    srand(42);
+    std::vector<struct ufunc> umathfunc = {
+            {"sin", sin, sin, 2.37, 3.3},
+            {"cos", cos, cos, 2.36, 3.38},
+            {"tan", tan, tan, 3.91, 3.93},
+            {"arcsin", asin, asin, 3.12, 2.55},
+            {"arccos", acos, acos, 2.1, 1.67},
+            {"arctan", atan, atan, 2.3, 2.52},
+            {"sinh", sinh, sinh, 1.55, 1.89},
+            {"cosh", cosh, cosh, 2.48, 1.97},
+            {"tanh", tanh, tanh, 1.38, 1.19},
+            {"arcsinh", asinh, asinh, 1.01, 1.48},
+            {"arccosh", acosh, acosh, 1.16, 1.05},
+            {"arctanh", atanh, atanh, 1.45, 1.46},
+            {"cbrt", cbrt, cbrt, 1.94, 1.82},
+            //{"exp",exp,exp,3.76,1.53},
+            {"exp2", exp2, exp2, 1.01, 1.04},
+            {"expm1", expm1, expm1, 2.62, 2.1},
+            //{"log",log,log,1.84,1.67},
+            {"log10", log10, log10, 3.5, 1.92},
+            {"log1p", log1p, log1p, 1.96, 1.93},
+            {"log2", log2, log2, 2.12, 1.84},
+    };
+
+    for (int ii = 0; ii < umathfunc.size(); ++ii) {
+        // ignore sin/cos
+        if ((umathfunc[ii].name != "sin") && (umathfunc[ii].name != "cos")) {
+            std::string fileName =
+                    "umath-validation-set-" + umathfunc[ii].name + ".csv";
+            std::ofstream txtOut;
+            txtOut.open(fileName, std::ofstream::trunc);
+            txtOut << "dtype,input,output,ulperrortol" << std::endl;
+
+            // Single Precision
+            auto f32in = generate_input_vector<float>(umathfunc[ii].name);
+            auto f32out = computeTrueVal<float, double>(f32in,
+                                                        umathfunc[ii].f32func);
+            for (int jj = 0; jj < f32in.size(); ++jj) {
+                txtOut << "np.float32" << std::hex << ",0x"
+                       << *reinterpret_cast<uint32_t *>(&f32in[jj]) << ",0x"
+                       << *reinterpret_cast<uint32_t *>(&f32out[jj]) << ","
+                       << ceil(umathfunc[ii].f32ulp) << std::endl;
+            }
+
+            // Double Precision
+            auto f64in = generate_input_vector<double>(umathfunc[ii].name);
+            auto f64out = computeTrueVal<double, long double>(
+                    f64in, umathfunc[ii].f64func);
+            for (int jj = 0; jj < f64in.size(); ++jj) {
+                txtOut << "np.float64" << std::hex << ",0x"
+                       << *reinterpret_cast<uint64_t *>(&f64in[jj]) << ",0x"
+                       << *reinterpret_cast<uint64_t *>(&f64out[jj]) << ","
+                       << ceil(umathfunc[ii].f64ulp) << std::endl;
+            }
+            txtOut.close();
+        }
+    }
+    return 0;
+}
diff --git a/numpy/core/tests/data/umath-validation-set-arccos.csv b/numpy/core/tests/data/umath-validation-set-arccos.csv
new file mode 100644 (file)
index 0000000..6697ae9
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0xbddd7f50,0x3fd6eec2,3
+np.float32,0xbe32a20c,0x3fdf8182,3
+np.float32,0xbf607c09,0x4028f84f,3
+np.float32,0x3f25d906,0x3f5db544,3
+np.float32,0x3f01cec8,0x3f84febf,3
+np.float32,0x3f1d5c6e,0x3f68a735,3
+np.float32,0xbf0cab89,0x4009c36d,3
+np.float32,0xbf176b40,0x400d0941,3
+np.float32,0x3f3248b2,0x3f4ce6d4,3
+np.float32,0x3f390b48,0x3f434e0d,3
+np.float32,0xbe261698,0x3fddea43,3
+np.float32,0x3f0e1154,0x3f7b848b,3
+np.float32,0xbf379a3c,0x4017b764,3
+np.float32,0xbeda6f2c,0x4000bd62,3
+np.float32,0xbf6a0c3f,0x402e5d5a,3
+np.float32,0x3ef1d700,0x3f8a17b7,3
+np.float32,0xbf6f4f65,0x4031d30d,3
+np.float32,0x3f2c9eee,0x3f54adfd,3
+np.float32,0x3f3cfb18,0x3f3d8a1e,3
+np.float32,0x3ba80800,0x3fc867d2,3
+np.float32,0x3e723b08,0x3faa7e4d,3
+np.float32,0xbf65820f,0x402bb054,3
+np.float32,0xbee64e7a,0x40026410,3
+np.float32,0x3cb15140,0x3fc64a87,3
+np.float32,0x3f193660,0x3f6ddf2a,3
+np.float32,0xbf0e5b52,0x400a44f7,3
+np.float32,0x3ed55f14,0x3f920a4b,3
+np.float32,0x3dd11a80,0x3fbbf85c,3
+np.float32,0xbf4f5c4b,0x4020f4f9,3
+np.float32,0x3f787532,0x3e792e87,3
+np.float32,0x3f40e6ac,0x3f37a74f,3
+np.float32,0x3f1c1318,0x3f6a47b6,3
+np.float32,0xbe3c48d8,0x3fe0bb70,3
+np.float32,0xbe94d4bc,0x3feed08e,3
+np.float32,0xbe5c3688,0x3fe4ce26,3
+np.float32,0xbf6fe026,0x403239cb,3
+np.float32,0x3ea5983c,0x3f9ee7bf,3
+np.float32,0x3f1471e6,0x3f73c5bb,3
+np.float32,0x3f0e2622,0x3f7b6b87,3
+np.float32,0xbf597180,0x40257ad1,3
+np.float32,0xbeb5321c,0x3ff75d34,3
+np.float32,0x3f5afcd2,0x3f0b6012,3
+np.float32,0xbef2ff88,0x40042e14,3
+np.float32,0xbedc747e,0x400104f5,3
+np.float32,0xbee0c2f4,0x40019dfc,3
+np.float32,0xbf152cd8,0x400c57dc,3
+np.float32,0xbf6cf9e2,0x40303bbe,3
+np.float32,0x3ed9cd74,0x3f90d1a1,3
+np.float32,0xbf754406,0x4036767f,3
+np.float32,0x3f59c5c2,0x3f0db42f,3
+np.float32,0x3f2eefd8,0x3f518684,3
+np.float32,0xbf156bf9,0x400c6b49,3
+np.float32,0xbd550790,0x3fcfb8dc,3
+np.float32,0x3ede58fc,0x3f8f8f77,3
+np.float32,0xbf00ac19,0x40063c4b,3
+np.float32,0x3f4d25ba,0x3f24280e,3
+np.float32,0xbe9568be,0x3feef73c,3
+np.float32,0x3f67d154,0x3ee05547,3
+np.float32,0x3f617226,0x3efcb4f4,3
+np.float32,0xbf3ab41a,0x4018d6cc,3
+np.float32,0xbf3186fe,0x401592cd,3
+np.float32,0x3de3ba50,0x3fbacca9,3
+np.float32,0x3e789f98,0x3fa9ab97,3
+np.float32,0x3f016e08,0x3f8536d8,3
+np.float32,0x3e8b618c,0x3fa5c571,3
+np.float32,0x3eff97bc,0x3f8628a9,3
+np.float32,0xbf6729f0,0x402ca32f,3
+np.float32,0xbebec146,0x3ff9eddc,3
+np.float32,0x3ddb2e60,0x3fbb563a,3
+np.float32,0x3caa8e40,0x3fc66595,3
+np.float32,0xbf5973f2,0x40257bfa,3
+np.float32,0xbdd82c70,0x3fd69916,3
+np.float32,0xbedf4c82,0x400169ef,3
+np.float32,0x3ef8f22c,0x3f881184,3
+np.float32,0xbf1d74d4,0x400eedc9,3
+np.float32,0x3f2e10a6,0x3f52b790,3
+np.float32,0xbf08ecc0,0x4008a628,3
+np.float32,0x3ecb7db4,0x3f94be9f,3
+np.float32,0xbf052ded,0x40078bfc,3
+np.float32,0x3f2ee78a,0x3f5191e4,3
+np.float32,0xbf56f4e1,0x40245194,3
+np.float32,0x3f600a3e,0x3f014a25,3
+np.float32,0x3f3836f8,0x3f44808b,3
+np.float32,0x3ecabfbc,0x3f94f25c,3
+np.float32,0x3c70f500,0x3fc72dec,3
+np.float32,0x3f17c444,0x3f6fabf0,3
+np.float32,0xbf4c22a5,0x401f9a09,3
+np.float32,0xbe4205dc,0x3fe1765a,3
+np.float32,0x3ea49138,0x3f9f2d36,3
+np.float32,0xbece0082,0x3ffe106b,3
+np.float32,0xbe387578,0x3fe03eef,3
+np.float32,0xbf2b6466,0x40137a30,3
+np.float32,0xbe9dadb2,0x3ff12204,3
+np.float32,0xbf56b3f2,0x402433bb,3
+np.float32,0xbdf9b4d8,0x3fd8b51f,3
+np.float32,0x3f58a596,0x3f0fd4b4,3
+np.float32,0xbedf5748,0x40016b6e,3
+np.float32,0x3f446442,0x3f32476f,3
+np.float32,0x3f5be886,0x3f099658,3
+np.float32,0x3ea1e44c,0x3f9fe1de,3
+np.float32,0xbf11e9b8,0x400b585f,3
+np.float32,0xbf231f8f,0x4010befb,3
+np.float32,0xbf4395ea,0x401c2dd0,3
+np.float32,0x3e9e7784,0x3fa0c8a6,3
+np.float32,0xbe255184,0x3fddd14c,3
+np.float32,0x3f70d25e,0x3eb13148,3
+np.float32,0x3f220cdc,0x3f62a722,3
+np.float32,0xbd027bf0,0x3fcd23e7,3
+np.float32,0x3e4ef8b8,0x3faf02d2,3
+np.float32,0xbf76fc6b,0x40380728,3
+np.float32,0xbf57e761,0x4024c1cd,3
+np.float32,0x3ed4fc20,0x3f922580,3
+np.float32,0xbf09b64a,0x4008e1db,3
+np.float32,0x3f21ca62,0x3f62fcf5,3
+np.float32,0xbe55f610,0x3fe40170,3
+np.float32,0xbc0def80,0x3fca2bbb,3
+np.float32,0xbebc8764,0x3ff9547b,3
+np.float32,0x3ec1b200,0x3f9766d1,3
+np.float32,0xbf4ee44e,0x4020c1ee,3
+np.float32,0xbea85852,0x3ff3f22a,3
+np.float32,0xbf195c0c,0x400da3d3,3
+np.float32,0xbf754b5d,0x40367ce8,3
+np.float32,0xbdcbfe50,0x3fd5d52b,3
+np.float32,0xbf1adb87,0x400e1be3,3
+np.float32,0xbf6f8491,0x4031f898,3
+np.float32,0xbf6f9ae7,0x4032086e,3
+np.float32,0xbf52b3f0,0x40226790,3
+np.float32,0xbf698452,0x402e09f4,3
+np.float32,0xbf43dc9a,0x401c493a,3
+np.float32,0xbf165f7f,0x400cb664,3
+np.float32,0x3e635468,0x3fac682f,3
+np.float32,0xbe8cf2b6,0x3fecc28a,3
+np.float32,0x7f7fffff,0x7fc00000,3
+np.float32,0xbf4c6513,0x401fb597,3
+np.float32,0xbf02b8f8,0x4006d47e,3
+np.float32,0x3ed3759c,0x3f9290c8,3
+np.float32,0xbf2a7a5f,0x40132b98,3
+np.float32,0xbae65000,0x3fc9496f,3
+np.float32,0x3f65f5ea,0x3ee8ef07,3
+np.float32,0xbe7712fc,0x3fe84106,3
+np.float32,0xbb9ff700,0x3fc9afd2,3
+np.float32,0x3d8d87a0,0x3fc03592,3
+np.float32,0xbefc921c,0x40058c23,3
+np.float32,0xbf286566,0x401279d8,3
+np.float32,0x3f53857e,0x3f192eaf,3
+np.float32,0xbee9b0f4,0x4002dd90,3
+np.float32,0x3f4041f8,0x3f38a14a,3
+np.float32,0x3f54ea96,0x3f16b02d,3
+np.float32,0x3ea50ef8,0x3f9f0c01,3
+np.float32,0xbeaad2dc,0x3ff49a4a,3
+np.float32,0xbec428c8,0x3ffb636f,3
+np.float32,0xbda46178,0x3fd358c7,3
+np.float32,0xbefacfc4,0x40054b7f,3
+np.float32,0xbf7068f9,0x40329c85,3
+np.float32,0x3f70b850,0x3eb1caa7,3
+np.float32,0x7fa00000,0x7fe00000,3
+np.float32,0x80000000,0x3fc90fdb,3
+np.float32,0x3f68d5c8,0x3edb7cf3,3
+np.float32,0x3d9443d0,0x3fbfc98a,3
+np.float32,0xff7fffff,0x7fc00000,3
+np.float32,0xbeee7ba8,0x40038a5e,3
+np.float32,0xbf0aaaba,0x40092a73,3
+np.float32,0x3f36a4e8,0x3f46c0ee,3
+np.float32,0x3ed268e4,0x3f92da82,3
+np.float32,0xbee6002c,0x4002591b,3
+np.float32,0xbe8f2752,0x3fed5576,3
+np.float32,0x3f525912,0x3f1b40e0,3
+np.float32,0xbe8e151e,0x3fed0e16,3
+np.float32,0x1,0x3fc90fdb,3
+np.float32,0x3ee23b84,0x3f8e7ae1,3
+np.float32,0xbf5961ca,0x40257361,3
+np.float32,0x3f6bbca0,0x3ecd14cd,3
+np.float32,0x3e27b230,0x3fb4014d,3
+np.float32,0xbf183bb8,0x400d49fc,3
+np.float32,0x3f57759c,0x3f120b68,3
+np.float32,0xbd6994c0,0x3fd05d84,3
+np.float32,0xbf1dd684,0x400f0cc8,3
+np.float32,0xbececc1c,0x3ffe480a,3
+np.float32,0xbf48855f,0x401e206d,3
+np.float32,0x3f28c922,0x3f59d382,3
+np.float32,0xbf65c094,0x402bd3b0,3
+np.float32,0x3f657d42,0x3eeb11dd,3
+np.float32,0xbed32d4e,0x3fff7b15,3
+np.float32,0xbf31af02,0x4015a0b1,3
+np.float32,0x3d89eb00,0x3fc06f7f,3
+np.float32,0x3dac2830,0x3fbe4a17,3
+np.float32,0x3f7f7cb6,0x3d81a7df,3
+np.float32,0xbedbb570,0x4000ea82,3
+np.float32,0x3db37830,0x3fbdd4a8,3
+np.float32,0xbf376f48,0x4017a7fd,3
+np.float32,0x3f319f12,0x3f4dd2c9,3
+np.float32,0x7fc00000,0x7fc00000,3
+np.float32,0x3f1b4f70,0x3f6b3e31,3
+np.float32,0x3e33c880,0x3fb278d1,3
+np.float32,0x3f2796e0,0x3f5b69bd,3
+np.float32,0x3f4915d6,0x3f2ad4d0,3
+np.float32,0x3e4db120,0x3faf2ca0,3
+np.float32,0x3ef03dd4,0x3f8a8ba9,3
+np.float32,0x3e96ca88,0x3fa2cbf7,3
+np.float32,0xbeb136ce,0x3ff64d2b,3
+np.float32,0xbf2f3938,0x4014c75e,3
+np.float32,0x3f769dde,0x3e8b0d76,3
+np.float32,0x3f67cec8,0x3ee06148,3
+np.float32,0x3f0a1ade,0x3f80204e,3
+np.float32,0x3e4b9718,0x3faf7144,3
+np.float32,0x3cccb480,0x3fc5dcf3,3
+np.float32,0x3caeb740,0x3fc654f0,3
+np.float32,0x3f684e0e,0x3ede0678,3
+np.float32,0x3f0ba93c,0x3f7e6663,3
+np.float32,0xbf12bbc4,0x400b985e,3
+np.float32,0xbf2a8e1a,0x40133235,3
+np.float32,0x3f42029c,0x3f35f5c5,3
+np.float32,0x3eed1728,0x3f8b6f9c,3
+np.float32,0xbe5779ac,0x3fe432fd,3
+np.float32,0x3f6ed8b8,0x3ebc7e4b,3
+np.float32,0x3eea25b0,0x3f8c43c7,3
+np.float32,0x3f1988a4,0x3f6d786b,3
+np.float32,0xbe751674,0x3fe7ff8a,3
+np.float32,0xbe9f7418,0x3ff1997d,3
+np.float32,0x3dca11d0,0x3fbc6979,3
+np.float32,0x3f795226,0x3e6a6cab,3
+np.float32,0xbea780e0,0x3ff3b926,3
+np.float32,0xbed92770,0x4000901e,3
+np.float32,0xbf3e9f8c,0x401a49f8,3
+np.float32,0x3f0f7054,0x3f79ddb2,3
+np.float32,0x3a99d400,0x3fc8e966,3
+np.float32,0xbef082b0,0x4003d3c6,3
+np.float32,0xbf0d0790,0x4009defb,3
+np.float32,0xbf1649da,0x400cafb4,3
+np.float32,0xbea5aca8,0x3ff33d5c,3
+np.float32,0xbf4e1843,0x40206ba1,3
+np.float32,0xbe3d7d5c,0x3fe0e2ad,3
+np.float32,0xbf0e802d,0x400a500e,3
+np.float32,0xbf0de8f0,0x400a2295,3
+np.float32,0xbf3016ba,0x4015137e,3
+np.float32,0x3f36b1ea,0x3f46ae5d,3
+np.float32,0xbd27f170,0x3fce4fc7,3
+np.float32,0x3e96ec54,0x3fa2c31f,3
+np.float32,0x3eb4dfdc,0x3f9ad87d,3
+np.float32,0x3f5cac6c,0x3f0815cc,3
+np.float32,0xbf0489aa,0x40075bf1,3
+np.float32,0x3df010c0,0x3fba05f5,3
+np.float32,0xbf229f4a,0x4010956a,3
+np.float32,0x3f75e474,0x3e905a99,3
+np.float32,0xbcece6a0,0x3fccc397,3
+np.float32,0xbdb41528,0x3fd454e7,3
+np.float32,0x3ec8b2f8,0x3f958118,3
+np.float32,0x3f5eaa70,0x3f041a1d,3
+np.float32,0xbf32e1cc,0x40160b91,3
+np.float32,0xbe8e6026,0x3fed219c,3
+np.float32,0x3e6b3160,0x3fab65e3,3
+np.float32,0x3e6d7460,0x3fab1b81,3
+np.float32,0xbf13fbde,0x400bfa3b,3
+np.float32,0xbe8235ec,0x3fe9f9e3,3
+np.float32,0x3d71c4a0,0x3fc18096,3
+np.float32,0x3eb769d0,0x3f9a2aa0,3
+np.float32,0xbf68cb3b,0x402d99e4,3
+np.float32,0xbd917610,0x3fd22932,3
+np.float32,0x3d3cba60,0x3fc3297f,3
+np.float32,0xbf383cbe,0x4017f1cc,3
+np.float32,0xbeee96d0,0x40038e34,3
+np.float32,0x3ec89cb4,0x3f958725,3
+np.float32,0x3ebf92d8,0x3f97f95f,3
+np.float32,0x3f30f3da,0x3f4ec021,3
+np.float32,0xbd26b560,0x3fce45e4,3
+np.float32,0xbec0eb12,0x3ffa8330,3
+np.float32,0x3f6d592a,0x3ec4a6c1,3
+np.float32,0x3ea6d39c,0x3f9e9463,3
+np.float32,0x3e884184,0x3fa6951e,3
+np.float32,0x3ea566c4,0x3f9ef4d1,3
+np.float32,0x3f0c8f4c,0x3f7d5380,3
+np.float32,0x3f28e1ba,0x3f59b2cb,3
+np.float32,0x3f798538,0x3e66e1c3,3
+np.float32,0xbe2889b8,0x3fde39b8,3
+np.float32,0x3f3da05e,0x3f3c949c,3
+np.float32,0x3f24d700,0x3f5f073e,3
+np.float32,0xbe5b5768,0x3fe4b198,3
+np.float32,0xbed3b03a,0x3fff9f05,3
+np.float32,0x3e8a1c4c,0x3fa619eb,3
+np.float32,0xbf075d24,0x40083030,3
+np.float32,0x3f765648,0x3e8d1f52,3
+np.float32,0xbf70fc5e,0x403308bb,3
+np.float32,0x3f557ae8,0x3f15ab76,3
+np.float32,0x3f02f7ea,0x3f84521c,3
+np.float32,0x3f7ebbde,0x3dcbc5c5,3
+np.float32,0xbefbdfc6,0x40057285,3
+np.float32,0x3ec687ac,0x3f9617d9,3
+np.float32,0x3e4831c8,0x3fafe01b,3
+np.float32,0x3e25cde0,0x3fb43ea8,3
+np.float32,0x3e4f2ab8,0x3faefc70,3
+np.float32,0x3ea60ae4,0x3f9ec973,3
+np.float32,0xbf1ed55f,0x400f5dde,3
+np.float32,0xbf5ad4aa,0x40262479,3
+np.float32,0x3e8b3594,0x3fa5d0de,3
+np.float32,0x3f3a77aa,0x3f413c80,3
+np.float32,0xbf07512b,0x40082ca9,3
+np.float32,0x3f33d990,0x3f4ab5e5,3
+np.float32,0x3f521556,0x3f1bb78f,3
+np.float32,0xbecf6036,0x3ffe7086,3
+np.float32,0x3db91bd0,0x3fbd7a11,3
+np.float32,0x3ef63a74,0x3f88d839,3
+np.float32,0xbf2f1116,0x4014b99c,3
+np.float32,0xbf17fdc0,0x400d36b9,3
+np.float32,0xbe87df2c,0x3feb7117,3
+np.float32,0x80800000,0x3fc90fdb,3
+np.float32,0x3ee24c1c,0x3f8e7641,3
+np.float32,0x3f688dce,0x3edcd644,3
+np.float32,0xbf0f4e1c,0x400a8e1b,3
+np.float32,0x0,0x3fc90fdb,3
+np.float32,0x3f786eba,0x3e7999d4,3
+np.float32,0xbf404f80,0x401aeca8,3
+np.float32,0xbe9ffb6a,0x3ff1bd18,3
+np.float32,0x3f146bfc,0x3f73ccfd,3
+np.float32,0xbe47d630,0x3fe233ee,3
+np.float32,0xbe95847c,0x3feefe7c,3
+np.float32,0xbf135df0,0x400bc9e5,3
+np.float32,0x3ea19f3c,0x3f9ff411,3
+np.float32,0x3f235e20,0x3f60f247,3
+np.float32,0xbec789ec,0x3ffc4def,3
+np.float32,0x3f04b656,0x3f834db6,3
+np.float32,0x3dfaf440,0x3fb95679,3
+np.float32,0xbe4a7f28,0x3fe28abe,3
+np.float32,0x3ed4850c,0x3f92463b,3
+np.float32,0x3ec4ba5c,0x3f9694dd,3
+np.float32,0xbce24ca0,0x3fcc992b,3
+np.float32,0xbf5b7c6e,0x402675a0,3
+np.float32,0xbea3ce2a,0x3ff2bf04,3
+np.float32,0x3db02c60,0x3fbe0998,3
+np.float32,0x3c47b780,0x3fc78069,3
+np.float32,0x3ed33b20,0x3f92a0d5,3
+np.float32,0xbf4556d7,0x401cdcde,3
+np.float32,0xbe1b6e28,0x3fdc90ec,3
+np.float32,0xbf3289b7,0x4015ecd0,3
+np.float32,0x3df3f240,0x3fb9c76d,3
+np.float32,0x3eefa7d0,0x3f8ab61d,3
+np.float32,0xbe945838,0x3feeb006,3
+np.float32,0xbf0b1386,0x400949a3,3
+np.float32,0x3f77e546,0x3e812cc1,3
+np.float32,0x3e804ba0,0x3fa8a480,3
+np.float32,0x3f43dcea,0x3f331a06,3
+np.float32,0x3eb87450,0x3f99e33c,3
+np.float32,0x3e5f4898,0x3facecea,3
+np.float32,0x3f646640,0x3eeff10e,3
+np.float32,0x3f1aa832,0x3f6c1051,3
+np.float32,0xbebf6bfa,0x3ffa1bdc,3
+np.float32,0xbb77f300,0x3fc98bd4,3
+np.float32,0x3f3587fe,0x3f485645,3
+np.float32,0x3ef85f34,0x3f883b8c,3
+np.float32,0x3f50e584,0x3f1dc82c,3
+np.float32,0x3f1d30a8,0x3f68deb0,3
+np.float32,0x3ee75a78,0x3f8d0c86,3
+np.float32,0x3f2c023a,0x3f5581e1,3
+np.float32,0xbf074e34,0x40082bca,3
+np.float32,0xbead71f0,0x3ff54c6d,3
+np.float32,0xbf39ed88,0x40188e69,3
+np.float32,0x3f5d2fe6,0x3f07118b,3
+np.float32,0xbf1f79f8,0x400f9267,3
+np.float32,0x3e900c58,0x3fa48e99,3
+np.float32,0xbf759cb2,0x4036c47b,3
+np.float32,0x3f63329c,0x3ef5359c,3
+np.float32,0xbf5d6755,0x40276709,3
+np.float32,0x3f2ce31c,0x3f54519a,3
+np.float32,0x7f800000,0x7fc00000,3
+np.float32,0x3f1bf50e,0x3f6a6d9a,3
+np.float32,0x3f258334,0x3f5e25d8,3
+np.float32,0xbf661a3f,0x402c06ac,3
+np.float32,0x3d1654c0,0x3fc45cef,3
+np.float32,0xbef14a36,0x4003f009,3
+np.float32,0xbf356051,0x4016ec3a,3
+np.float32,0x3f6ccc42,0x3ec79193,3
+np.float32,0xbf2fe3d6,0x401501f9,3
+np.float32,0x3deedc80,0x3fba195b,3
+np.float32,0x3f2e5a28,0x3f52533e,3
+np.float32,0x3e6b68b8,0x3fab5ec8,3
+np.float32,0x3e458240,0x3fb037b7,3
+np.float32,0xbf24bab0,0x401144cb,3
+np.float32,0x3f600f4c,0x3f013fb2,3
+np.float32,0x3f021a04,0x3f84d316,3
+np.float32,0x3f741732,0x3e9cc948,3
+np.float32,0x3f0788aa,0x3f81a5b0,3
+np.float32,0x3f28802c,0x3f5a347c,3
+np.float32,0x3c9eb400,0x3fc69500,3
+np.float32,0x3e5d11e8,0x3fad357a,3
+np.float32,0x3d921250,0x3fbfecb9,3
+np.float32,0x3f354866,0x3f48b066,3
+np.float32,0xbf72cf43,0x40346d84,3
+np.float32,0x3eecdbb8,0x3f8b805f,3
+np.float32,0xbee585d0,0x400247fd,3
+np.float32,0x3e3607a8,0x3fb22fc6,3
+np.float32,0xbf0cb7d6,0x4009c71c,3
+np.float32,0xbf56b230,0x402432ec,3
+np.float32,0xbf4ced02,0x401fee29,3
+np.float32,0xbf3a325c,0x4018a776,3
+np.float32,0x3ecae8bc,0x3f94e732,3
+np.float32,0xbe48c7e8,0x3fe252bd,3
+np.float32,0xbe175d7c,0x3fdc0d5b,3
+np.float32,0x3ea78dac,0x3f9e632d,3
+np.float32,0xbe7434a8,0x3fe7e279,3
+np.float32,0x3f1f9e02,0x3f65c7b9,3
+np.float32,0xbe150f2c,0x3fdbc2c2,3
+np.float32,0x3ee13480,0x3f8ec423,3
+np.float32,0x3ecb7d54,0x3f94beb9,3
+np.float32,0x3f1cef42,0x3f693181,3
+np.float32,0xbf1ec06a,0x400f5730,3
+np.float32,0xbe112acc,0x3fdb44e8,3
+np.float32,0xbe77b024,0x3fe85545,3
+np.float32,0x3ec86fe0,0x3f959353,3
+np.float32,0x3f36b326,0x3f46ac9a,3
+np.float32,0x3e581a70,0x3fadd829,3
+np.float32,0xbf032c0c,0x4006f5f9,3
+np.float32,0xbf43b1fd,0x401c38b1,3
+np.float32,0x3f3701b4,0x3f463c5c,3
+np.float32,0x3f1a995a,0x3f6c22f1,3
+np.float32,0xbf05de0b,0x4007bf97,3
+np.float32,0x3d4bd960,0x3fc2b063,3
+np.float32,0x3f0e1618,0x3f7b7ed0,3
+np.float32,0x3edfd420,0x3f8f2628,3
+np.float32,0xbf6662fe,0x402c3047,3
+np.float32,0x3ec0690c,0x3f97bf9b,3
+np.float32,0xbeaf4146,0x3ff5c7a0,3
+np.float32,0x3f5e7764,0x3f04816d,3
+np.float32,0xbedd192c,0x40011bc5,3
+np.float32,0x3eb76350,0x3f9a2c5e,3
+np.float32,0xbed8108c,0x400069a5,3
+np.float32,0xbe59f31c,0x3fe48401,3
+np.float32,0xbea3e1e6,0x3ff2c439,3
+np.float32,0x3e26d1f8,0x3fb41db5,3
+np.float32,0x3f3a0a7c,0x3f41dba5,3
+np.float32,0x3ebae068,0x3f993ce4,3
+np.float32,0x3f2d8e30,0x3f536942,3
+np.float32,0xbe838bbe,0x3fea5247,3
+np.float32,0x3ebe4420,0x3f98538f,3
+np.float32,0xbcc59b80,0x3fcc265c,3
+np.float32,0x3eebb5c8,0x3f8bd334,3
+np.float32,0xbafc3400,0x3fc94ee8,3
+np.float32,0xbf63ddc1,0x402ac683,3
+np.float32,0xbeabdf80,0x3ff4e18f,3
+np.float32,0x3ea863f0,0x3f9e2a78,3
+np.float32,0x3f45b292,0x3f303bc1,3
+np.float32,0xbe68aa60,0x3fe666bf,3
+np.float32,0x3eb9de18,0x3f998239,3
+np.float32,0xbf719d85,0x4033815e,3
+np.float32,0x3edef9a8,0x3f8f62db,3
+np.float32,0xbd7781c0,0x3fd0cd1e,3
+np.float32,0x3f0b3b90,0x3f7ee92a,3
+np.float32,0xbe3eb3b4,0x3fe10a27,3
+np.float32,0xbf31a4c4,0x40159d23,3
+np.float32,0x3e929434,0x3fa3e5b0,3
+np.float32,0xbeb1a90e,0x3ff66b9e,3
+np.float32,0xbeba9b5e,0x3ff8d048,3
+np.float32,0xbf272a84,0x4012119e,3
+np.float32,0x3f1ebbd0,0x3f66e889,3
+np.float32,0x3ed3cdc8,0x3f927893,3
+np.float32,0xbf50dfce,0x40219b58,3
+np.float32,0x3f0c02de,0x3f7dfb62,3
+np.float32,0xbf694de3,0x402de8d2,3
+np.float32,0xbeaeb13e,0x3ff5a14f,3
+np.float32,0xbf61aa7a,0x40299702,3
+np.float32,0xbf13d159,0x400bed35,3
+np.float32,0xbeecd034,0x40034e0b,3
+np.float32,0xbe50c2e8,0x3fe35761,3
+np.float32,0x3f714406,0x3eae8e57,3
+np.float32,0xbf1ca486,0x400eabd8,3
+np.float32,0x3f5858cc,0x3f106497,3
+np.float32,0x3f670288,0x3ee41c84,3
+np.float32,0xbf20bd2c,0x400ff9f5,3
+np.float32,0xbe29afd8,0x3fde5eff,3
+np.float32,0xbf635e6a,0x402a80f3,3
+np.float32,0x3e82b7b0,0x3fa80446,3
+np.float32,0x3e982e7c,0x3fa26ece,3
+np.float32,0x3d9f0e00,0x3fbf1c6a,3
+np.float32,0x3e8299b4,0x3fa80c07,3
+np.float32,0xbf0529c1,0x40078ac3,3
+np.float32,0xbf403b8a,0x401ae519,3
+np.float32,0xbe57e09c,0x3fe44027,3
+np.float32,0x3ea1c8f4,0x3f9fe913,3
+np.float32,0xbe216a94,0x3fdd52d0,3
+np.float32,0x3f59c442,0x3f0db709,3
+np.float32,0xbd636260,0x3fd02bdd,3
+np.float32,0xbdbbc788,0x3fd4d08d,3
+np.float32,0x3dd19560,0x3fbbf0a3,3
+np.float32,0x3f060ad4,0x3f828641,3
+np.float32,0x3b102e00,0x3fc8c7c4,3
+np.float32,0x3f42b3b8,0x3f34e5a6,3
+np.float32,0x3f0255ac,0x3f84b071,3
+np.float32,0xbf014898,0x40066996,3
+np.float32,0x3e004dc0,0x3fb8fb51,3
+np.float32,0xbf594ff8,0x40256af2,3
+np.float32,0x3efafddc,0x3f877b80,3
+np.float32,0xbf5f0780,0x40283899,3
+np.float32,0x3ee95e54,0x3f8c7bcc,3
+np.float32,0x3eba2f0c,0x3f996c80,3
+np.float32,0x3f37721c,0x3f459b68,3
+np.float32,0x3e2be780,0x3fb378bf,3
+np.float32,0x3e550270,0x3fae3d69,3
+np.float32,0x3e0f9500,0x3fb70e0a,3
+np.float32,0xbf51974a,0x4021eaf4,3
+np.float32,0x3f393832,0x3f430d05,3
+np.float32,0x3f3df16a,0x3f3c1bd8,3
+np.float32,0xbd662340,0x3fd041ed,3
+np.float32,0x3f7e8418,0x3ddc9fce,3
+np.float32,0xbf392734,0x40184672,3
+np.float32,0x3ee3b278,0x3f8e124e,3
+np.float32,0x3eed4808,0x3f8b61d2,3
+np.float32,0xbf6fccbd,0x40322beb,3
+np.float32,0x3e3ecdd0,0x3fb1123b,3
+np.float32,0x3f4419e0,0x3f32bb45,3
+np.float32,0x3f595e00,0x3f0e7914,3
+np.float32,0xbe8c1486,0x3fec88c6,3
+np.float32,0xbf800000,0x40490fdb,3
+np.float32,0xbdaf5020,0x3fd4084d,3
+np.float32,0xbf407660,0x401afb63,3
+np.float32,0x3f0c3aa8,0x3f7db8b8,3
+np.float32,0xbcdb5980,0x3fcc7d5b,3
+np.float32,0x3f4738d4,0x3f2dd1ed,3
+np.float32,0x3f4d7064,0x3f23ab14,3
+np.float32,0xbeb1d576,0x3ff67774,3
+np.float32,0xbf507166,0x40216bb3,3
+np.float32,0x3e86484c,0x3fa71813,3
+np.float32,0x3f09123e,0x3f80bd35,3
+np.float32,0xbe9abe0e,0x3ff05cb2,3
+np.float32,0x3f3019dc,0x3f4fed21,3
+np.float32,0xbe99e00e,0x3ff0227d,3
+np.float32,0xbf155ec5,0x400c6739,3
+np.float32,0x3f5857ba,0x3f106698,3
+np.float32,0x3edf619c,0x3f8f45fb,3
+np.float32,0xbf5ab76a,0x40261664,3
+np.float32,0x3e54b5a8,0x3fae4738,3
+np.float32,0xbee92772,0x4002ca40,3
+np.float32,0x3f2fd610,0x3f504a7a,3
+np.float32,0xbf38521c,0x4017f97e,3
+np.float32,0xff800000,0x7fc00000,3
+np.float32,0x3e2da348,0x3fb34077,3
+np.float32,0x3f2f85fa,0x3f50b894,3
+np.float32,0x3e88f9c8,0x3fa66551,3
+np.float32,0xbf61e570,0x4029b648,3
+np.float32,0xbeab362c,0x3ff4b4a1,3
+np.float32,0x3ec6c310,0x3f9607bd,3
+np.float32,0x3f0d7bda,0x3f7c3810,3
+np.float32,0xbeba5d36,0x3ff8bf99,3
+np.float32,0x3f4b0554,0x3f27adda,3
+np.float32,0x3f60f5dc,0x3efebfb3,3
+np.float32,0x3f36ce2c,0x3f468603,3
+np.float32,0xbe70afac,0x3fe76e8e,3
+np.float32,0x3f673350,0x3ee339b5,3
+np.float32,0xbe124cf0,0x3fdb698c,3
+np.float32,0xbf1243dc,0x400b73d0,3
+np.float32,0x3f3c8850,0x3f3e3407,3
+np.float32,0x3ea02f24,0x3fa05500,3
+np.float32,0xbeffed34,0x400607db,3
+np.float32,0x3f5c75c2,0x3f08817c,3
+np.float32,0x3f4b2fbe,0x3f27682d,3
+np.float32,0x3ee47c34,0x3f8dd9f9,3
+np.float32,0x3f50d48c,0x3f1de584,3
+np.float32,0x3f12dc5e,0x3f75b628,3
+np.float32,0xbefe7e4a,0x4005d2f4,3
+np.float32,0xbec2e846,0x3ffb0cbc,3
+np.float32,0xbedc3036,0x4000fb80,3
+np.float32,0xbf48aedc,0x401e311f,3
+np.float32,0x3f6e032e,0x3ec11363,3
+np.float32,0xbf60de15,0x40292b72,3
+np.float32,0x3f06585e,0x3f8258ba,3
+np.float32,0x3ef49b98,0x3f894e66,3
+np.float32,0x3cc5fe00,0x3fc5f7cf,3
+np.float32,0xbf7525c5,0x40365c2c,3
+np.float32,0x3f64f9f8,0x3eed5fb2,3
+np.float32,0x3e8849c0,0x3fa692fb,3
+np.float32,0x3e50c878,0x3faec79e,3
+np.float32,0x3ed61530,0x3f91d831,3
+np.float32,0xbf54872e,0x40233724,3
+np.float32,0xbf52ee7f,0x4022815e,3
+np.float32,0xbe708c24,0x3fe769fc,3
+np.float32,0xbf26fc54,0x40120260,3
+np.float32,0x3f226e8a,0x3f6228db,3
+np.float32,0xbef30406,0x40042eb8,3
+np.float32,0x3f5d996c,0x3f063f5f,3
+np.float32,0xbf425f9c,0x401bb618,3
+np.float32,0x3e4bb260,0x3faf6dc9,3
+np.float32,0xbe52d5a4,0x3fe39b29,3
+np.float32,0xbe169cf0,0x3fdbf505,3
+np.float32,0xbedfc422,0x40017a8e,3
+np.float32,0x3d8ffef0,0x3fc00e05,3
+np.float32,0xbf12bdab,0x400b98f2,3
+np.float32,0x3f295d0a,0x3f590e88,3
+np.float32,0x3f49d8e4,0x3f2998aa,3
+np.float32,0xbef914f4,0x40050c12,3
+np.float32,0xbf4ea2b5,0x4020a61e,3
+np.float32,0xbf3a89e5,0x4018c762,3
+np.float32,0x3e8707b4,0x3fa6e67a,3
+np.float32,0x3ac55400,0x3fc8de86,3
+np.float32,0x800000,0x3fc90fdb,3
+np.float32,0xbeb9762c,0x3ff8819b,3
+np.float32,0xbebbe23c,0x3ff92815,3
+np.float32,0xbf598c88,0x402587a1,3
+np.float32,0x3e95d864,0x3fa30b4a,3
+np.float32,0x3f7f6f40,0x3d882486,3
+np.float32,0xbf53658c,0x4022b604,3
+np.float32,0xbf2a35f2,0x401314ad,3
+np.float32,0x3eb14380,0x3f9bcf28,3
+np.float32,0x3f0e0c64,0x3f7b8a7a,3
+np.float32,0x3d349920,0x3fc36a9a,3
+np.float32,0xbec2092c,0x3ffad071,3
+np.float32,0xbe1d08e8,0x3fdcc4e0,3
+np.float32,0xbf008968,0x40063243,3
+np.float32,0xbefad582,0x40054c51,3
+np.float32,0xbe52d010,0x3fe39a72,3
+np.float32,0x3f4afdac,0x3f27ba6b,3
+np.float32,0x3f6c483c,0x3eca4408,3
+np.float32,0xbef3cb68,0x40044b0c,3
+np.float32,0x3e94687c,0x3fa36b6f,3
+np.float32,0xbf64ae5c,0x402b39bb,3
+np.float32,0xbf0022b4,0x40061497,3
+np.float32,0x80000001,0x3fc90fdb,3
+np.float32,0x3f25bcd0,0x3f5dda4b,3
+np.float32,0x3ed91b40,0x3f9102d7,3
+np.float32,0x3f800000,0x0,3
+np.float32,0xbebc6aca,0x3ff94cca,3
+np.float32,0x3f239e9a,0x3f609e7d,3
+np.float32,0xbf7312be,0x4034a305,3
+np.float32,0x3efd16d0,0x3f86e148,3
+np.float32,0x3f52753a,0x3f1b0f72,3
+np.float32,0xbde58960,0x3fd7702c,3
+np.float32,0x3ef88580,0x3f883099,3
+np.float32,0x3eebaefc,0x3f8bd51e,3
+np.float32,0x3e877d2c,0x3fa6c807,3
+np.float32,0x3f1a0324,0x3f6cdf32,3
+np.float32,0xbedfe20a,0x40017eb6,3
+np.float32,0x3f205a3c,0x3f64d69d,3
+np.float32,0xbeed5b7c,0x400361b0,3
+np.float32,0xbf69ba10,0x402e2ad0,3
+np.float32,0x3c4fe200,0x3fc77014,3
+np.float32,0x3f043310,0x3f839a69,3
+np.float32,0xbeaf359a,0x3ff5c485,3
+np.float32,0x3db3f110,0x3fbdcd12,3
+np.float32,0x3e24af88,0x3fb462ed,3
+np.float32,0xbf34e858,0x4016c1c8,3
+np.float32,0x3f3334f2,0x3f4b9cd0,3
+np.float32,0xbf145882,0x400c16a2,3
+np.float32,0xbf541c38,0x40230748,3
+np.float32,0x3eba7e10,0x3f99574b,3
+np.float32,0xbe34c6e0,0x3fdfc731,3
+np.float32,0xbe957abe,0x3feefbf0,3
+np.float32,0xbf595a59,0x40256fdb,3
+np.float32,0xbdedc7b8,0x3fd7f4f0,3
+np.float32,0xbf627c02,0x402a06a9,3
+np.float32,0x3f339b78,0x3f4b0d18,3
+np.float32,0xbf2df6d2,0x40145929,3
+np.float32,0x3f617726,0x3efc9fd8,3
+np.float32,0xbee3a8fc,0x40020561,3
+np.float32,0x3efe9f68,0x3f867043,3
+np.float32,0xbf2c3e76,0x4013c3ba,3
+np.float32,0xbf218f28,0x40103d84,3
+np.float32,0xbf1ea847,0x400f4f7f,3
+np.float32,0x3ded9160,0x3fba2e31,3
+np.float32,0x3bce1b00,0x3fc841bf,3
+np.float32,0xbe90566e,0x3feda46a,3
+np.float32,0xbf5ea2ba,0x4028056b,3
+np.float32,0x3f538e62,0x3f191ee6,3
+np.float32,0xbf59e054,0x4025af74,3
+np.float32,0xbe8c98ba,0x3fecab24,3
+np.float32,0x3ee7bdb0,0x3f8cf0b7,3
+np.float32,0xbf2eb828,0x40149b2b,3
+np.float32,0xbe5eb904,0x3fe52068,3
+np.float32,0xbf16b422,0x400cd08d,3
+np.float32,0x3f1ab9b4,0x3f6bfa58,3
+np.float32,0x3dc23040,0x3fbce82a,3
+np.float32,0xbf29d9e7,0x4012f5e5,3
+np.float32,0xbf38f30a,0x40183393,3
+np.float32,0x3e88e798,0x3fa66a09,3
+np.float32,0x3f1d07e6,0x3f69124f,3
+np.float32,0xbe1d3d34,0x3fdccb7e,3
+np.float32,0xbf1715be,0x400ceec2,3
+np.float32,0x3f7a0eac,0x3e5d11f7,3
+np.float32,0xbe764924,0x3fe82707,3
+np.float32,0xbf01a1f8,0x4006837c,3
+np.float32,0x3f2be730,0x3f55a661,3
+np.float32,0xbf7bb070,0x403d4ce5,3
+np.float32,0xbd602110,0x3fd011c9,3
+np.float32,0x3f5d080c,0x3f07609d,3
+np.float32,0xbda20400,0x3fd332d1,3
+np.float32,0x3f1c62da,0x3f69e308,3
+np.float32,0xbf2c6916,0x4013d223,3
+np.float32,0xbf44f8fd,0x401cb816,3
+np.float32,0x3f4da392,0x3f235539,3
+np.float32,0x3e9e8aa0,0x3fa0c3a0,3
+np.float32,0x3e9633c4,0x3fa2f366,3
+np.float32,0xbf0422ab,0x40073ddd,3
+np.float32,0x3f518386,0x3f1cb603,3
+np.float32,0x3f24307a,0x3f5fe096,3
+np.float32,0xbdfb4220,0x3fd8ce24,3
+np.float32,0x3f179d28,0x3f6fdc7d,3
+np.float32,0xbecc2df0,0x3ffd911e,3
+np.float32,0x3f3dff0c,0x3f3c0782,3
+np.float32,0xbf58c4d8,0x4025295b,3
+np.float32,0xbdcf8438,0x3fd60dd3,3
+np.float32,0xbeeaf1b2,0x40030aa7,3
+np.float32,0xbf298a28,0x4012db45,3
+np.float32,0x3f6c4dec,0x3eca2678,3
+np.float32,0x3f4d1ac8,0x3f243a59,3
+np.float32,0x3f62cdfa,0x3ef6e8f8,3
+np.float32,0xbee8acce,0x4002b909,3
+np.float32,0xbd5f2af0,0x3fd00a15,3
+np.float32,0x3f5fde8e,0x3f01a453,3
+np.float32,0x3e95233c,0x3fa33aa4,3
+np.float32,0x3ecd2a60,0x3f9449be,3
+np.float32,0x3f10aa86,0x3f78619d,3
+np.float32,0x3f3888e8,0x3f440a70,3
+np.float32,0x3eeb5bfc,0x3f8bec7d,3
+np.float32,0xbe12d654,0x3fdb7ae6,3
+np.float32,0x3eca3110,0x3f951931,3
+np.float32,0xbe2d1b7c,0x3fdece05,3
+np.float32,0xbf29e9db,0x4012fb3a,3
+np.float32,0xbf0c50b8,0x4009a845,3
+np.float32,0xbed9f0e4,0x4000abef,3
+np.float64,0x3fd078ec5ba0f1d8,0x3ff4f7c00595a4d3,2
+np.float64,0xbfdbc39743b7872e,0x400027f85bce43b2,2
+np.float64,0xbfacd2707c39a4e0,0x3ffa08ae1075d766,2
+np.float64,0xbfc956890f32ad14,0x3ffc52308e7285fd,2
+np.float64,0xbf939c2298273840,0x3ff9706d18e6ea6b,2
+np.float64,0xbfe0d7048961ae09,0x4000fff4406bd395,2
+np.float64,0xbfe9d19b86f3a337,0x4004139bc683a69f,2
+np.float64,0x3fd35c7f90a6b900,0x3ff437220e9123f8,2
+np.float64,0x3fdddca171bbb944,0x3ff15da61e61ec08,2
+np.float64,0x3feb300de9f6601c,0x3fe1c6fadb68cdca,2
+np.float64,0xbfef1815327e302a,0x400739808fc6f964,2
+np.float64,0xbfe332d78e6665af,0x4001b6c4ef922f7c,2
+np.float64,0xbfedbf4dfb7b7e9c,0x40061cefed62a58b,2
+np.float64,0xbfd8dcc7e3b1b990,0x3fff84307713c2c3,2
+np.float64,0xbfedaf161c7b5e2c,0x400612027c1b2b25,2
+np.float64,0xbfed9bde897b37bd,0x4006053f05bd7d26,2
+np.float64,0xbfe081ebc26103d8,0x4000e70755eb66e0,2
+np.float64,0xbfe0366f9c606cdf,0x4000d11212f29afd,2
+np.float64,0xbfc7c115212f822c,0x3ffc1e8c9d58f7db,2
+np.float64,0x3fd8dd9a78b1bb34,0x3ff2bf8d0f4c9376,2
+np.float64,0xbfe54eff466a9dfe,0x4002655950b611f4,2
+np.float64,0xbfe4aad987e955b3,0x40022efb19882518,2
+np.float64,0x3f70231ca0204600,0x3ff911d834e7abf4,2
+np.float64,0x3fede01d047bc03a,0x3fd773cecbd8561b,2
+np.float64,0xbfd6a00d48ad401a,0x3ffee9fd7051633f,2
+np.float64,0x3fd44f3d50a89e7c,0x3ff3f74dd0fc9c91,2
+np.float64,0x3fe540f0d0ea81e2,0x3feb055a7c7d43d6,2
+np.float64,0xbf3ba2e200374800,0x3ff923b582650c6c,2
+np.float64,0x3fe93b2d3f72765a,0x3fe532fa15331072,2
+np.float64,0x3fee8ce5a17d19cc,0x3fd35666eefbe336,2
+np.float64,0x3fe55d5f8feabac0,0x3feadf3dcfe251d4,2
+np.float64,0xbfd1d2ede8a3a5dc,0x3ffda600041ac884,2
+np.float64,0xbfee41186e7c8231,0x40067a625cc6f64d,2
+np.float64,0x3fe521a8b9ea4352,0x3feb2f1a6c8084e5,2
+np.float64,0x3fc65378ef2ca6f0,0x3ff653dfe81ee9f2,2
+np.float64,0x3fdaba0fbcb57420,0x3ff23d630995c6ba,2
+np.float64,0xbfe6b7441d6d6e88,0x4002e182539a2994,2
+np.float64,0x3fda00b6dcb4016c,0x3ff2703d516f28e7,2
+np.float64,0xbfe8699f01f0d33e,0x400382326920ea9e,2
+np.float64,0xbfef5889367eb112,0x4007832af5983793,2
+np.float64,0x3fefb57c8aff6afa,0x3fc14700ab38dcef,2
+np.float64,0xbfda0dfdaab41bfc,0x3fffd75b6fd497f6,2
+np.float64,0xbfb059c36620b388,0x3ffa27c528b97a42,2
+np.float64,0xbfdd450ab1ba8a16,0x40005dcac6ab50fd,2
+np.float64,0xbfe54d6156ea9ac2,0x400264ce9f3f0fb9,2
+np.float64,0xbfe076e94760edd2,0x4000e3d1374884da,2
+np.float64,0xbfc063286720c650,0x3ffb2fd1d6bff0ef,2
+np.float64,0xbfe24680f2e48d02,0x40016ddfbb5bcc0e,2
+np.float64,0xbfdc9351d2b926a4,0x400044e3756fb765,2
+np.float64,0x3fefb173d8ff62e8,0x3fc1bd5626f80850,2
+np.float64,0x3fe77c117a6ef822,0x3fe7e57089bad2ec,2
+np.float64,0xbfddbcebf7bb79d8,0x40006eadb60406b3,2
+np.float64,0xbfecf6625ff9ecc5,0x40059e6c6961a6db,2
+np.float64,0x3fdc8950b8b912a0,0x3ff1bcfb2e27795b,2
+np.float64,0xbfeb2fa517765f4a,0x4004b00aee3e6888,2
+np.float64,0x3fd0efc88da1df90,0x3ff4d8f7cbd8248a,2
+np.float64,0xbfe6641a2becc834,0x4002c43362c1bd0f,2
+np.float64,0xbfe28aec0fe515d8,0x400182c91d4df039,2
+np.float64,0xbfd5ede8d0abdbd2,0x3ffeba7baef05ae8,2
+np.float64,0xbfbd99702a3b32e0,0x3ffafca21c1053f1,2
+np.float64,0x3f96f043f82de080,0x3ff8c6384d5eb610,2
+np.float64,0xbfe5badbc9eb75b8,0x400289c8cd5873d1,2
+np.float64,0x3fe5c6bf95eb8d80,0x3fea5093e9a3e43e,2
+np.float64,0x3fb1955486232ab0,0x3ff8086d4c3e71d5,2
+np.float64,0xbfea145f397428be,0x4004302237a35871,2
+np.float64,0xbfdabe685db57cd0,0x400003e2e29725fb,2
+np.float64,0xbfefc79758ff8f2f,0x400831814e23bfc8,2
+np.float64,0x3fd7edb66cafdb6c,0x3ff3006c5123bfaf,2
+np.float64,0xbfeaf7644bf5eec8,0x400495a7963ce4ed,2
+np.float64,0x3fdf838d78bf071c,0x3ff0e527eed73800,2
+np.float64,0xbfd1a0165ba3402c,0x3ffd98c5ab76d375,2
+np.float64,0x3fd75b67a9aeb6d0,0x3ff327c8d80b17cf,2
+np.float64,0x3fc2aa9647255530,0x3ff6ca854b157df1,2
+np.float64,0xbfe0957fd4612b00,0x4000ecbf3932becd,2
+np.float64,0x3fda1792c0b42f24,0x3ff269fbb2360487,2
+np.float64,0x3fd480706ca900e0,0x3ff3ea53a6aa3ae8,2
+np.float64,0xbfd0780ed9a0f01e,0x3ffd4bfd544c7d47,2
+np.float64,0x3feeec0cd77dd81a,0x3fd0a8a241fdb441,2
+np.float64,0x3fcfa933e93f5268,0x3ff5223478621a6b,2
+np.float64,0x3fdad2481fb5a490,0x3ff236b86c6b2b49,2
+np.float64,0x3fe03b129de07626,0x3ff09f21fb868451,2
+np.float64,0xbfc01212cd202424,0x3ffb259a07159ae9,2
+np.float64,0x3febdb912df7b722,0x3fe0768e20dac8c9,2
+np.float64,0xbfbf2148763e4290,0x3ffb154c361ce5bf,2
+np.float64,0xbfb1a7eb1e234fd8,0x3ffa3cb37ac4a176,2
+np.float64,0xbfe26ad1ec64d5a4,0x400178f480ecce8d,2
+np.float64,0x3fe6d1cd1b6da39a,0x3fe8dc20ec4dad3b,2
+np.float64,0xbfede0e53dfbc1ca,0x4006340d3bdd7c97,2
+np.float64,0xbfe8fd1bd9f1fa38,0x4003bc3477f93f40,2
+np.float64,0xbfe329d0f26653a2,0x4001b3f345af5648,2
+np.float64,0xbfe4bb20eee97642,0x40023451404d6d08,2
+np.float64,0x3fb574832e2ae900,0x3ff7ca4bed0c7110,2
+np.float64,0xbfdf3c098fbe7814,0x4000a525bb72d659,2
+np.float64,0x3fa453e6d428a7c0,0x3ff87f512bb9b0c6,2
+np.float64,0x3faaec888435d920,0x3ff84a7d9e4def63,2
+np.float64,0xbfcdc240df3b8480,0x3ffce30ece754e7f,2
+np.float64,0xbf8c3220f0386440,0x3ff95a600ae6e157,2
+np.float64,0x3fe806076c700c0e,0x3fe71784a96c76eb,2
+np.float64,0x3fedf9b0e17bf362,0x3fd6e35fc0a7b6c3,2
+np.float64,0xbfe1b48422636908,0x400141bd8ed251bc,2
+np.float64,0xbfe82e2817705c50,0x40036b5a5556d021,2
+np.float64,0xbfc8ef8ff931df20,0x3ffc450ffae7ce58,2
+np.float64,0xbfe919fa94f233f5,0x4003c7cce4697fe8,2
+np.float64,0xbfc3ace4a72759c8,0x3ffb9a197bb22651,2
+np.float64,0x3fe479f71ee8f3ee,0x3fec0bd2f59097aa,2
+np.float64,0xbfeeb54a967d6a95,0x4006da12c83649c5,2
+np.float64,0x3fe5e74ea8ebce9e,0x3fea2407cef0f08c,2
+np.float64,0x3fb382baf2270570,0x3ff7e98213b921ba,2
+np.float64,0xbfdd86fd3cbb0dfa,0x40006712952ddbcf,2
+np.float64,0xbfd250eb52a4a1d6,0x3ffdc6d56253b1cd,2
+np.float64,0x3fea30c4ed74618a,0x3fe3962deba4f30e,2
+np.float64,0x3fc895963d312b30,0x3ff60a5d52fcbccc,2
+np.float64,0x3fe9cc4f6273989e,0x3fe442740942c80f,2
+np.float64,0xbfe8769f5cf0ed3f,0x4003873b4cb5bfce,2
+np.float64,0xbfe382f3726705e7,0x4001cfeb3204d110,2
+np.float64,0x3fbfe9a9163fd350,0x3ff7220bd2b97c8f,2
+np.float64,0xbfca6162bb34c2c4,0x3ffc743f939358f1,2
+np.float64,0x3fe127a014e24f40,0x3ff0147c4bafbc39,2
+np.float64,0x3fee9cdd2a7d39ba,0x3fd2e9ef45ab122f,2
+np.float64,0x3fa9ffb97c33ff80,0x3ff851e69fa3542c,2
+np.float64,0x3fd378f393a6f1e8,0x3ff42faafa77de56,2
+np.float64,0xbfe4df1e1669be3c,0x400240284df1c321,2
+np.float64,0x3fed0ed79bfa1db0,0x3fdba89060aa96fb,2
+np.float64,0x3fdef2ee52bde5dc,0x3ff10e942244f4f1,2
+np.float64,0xbfdab38f3ab5671e,0x40000264d8d5b49b,2
+np.float64,0x3fbe95a96e3d2b50,0x3ff73774cb59ce2d,2
+np.float64,0xbfe945653af28aca,0x4003d9657bf129c2,2
+np.float64,0xbfb18f3f2a231e80,0x3ffa3b27cba23f50,2
+np.float64,0xbfef50bf22fea17e,0x40077998a850082c,2
+np.float64,0xbfc52b8c212a5718,0x3ffbca8d6560a2da,2
+np.float64,0x7ff8000000000000,0x7ff8000000000000,2
+np.float64,0x3fc1e3a02d23c740,0x3ff6e3a5fcac12a4,2
+np.float64,0xbfeb5e4ea5f6bc9d,0x4004c65abef9426f,2
+np.float64,0xbfe425b132684b62,0x400203c29608b00d,2
+np.float64,0xbfbfa1c19e3f4380,0x3ffb1d6367711158,2
+np.float64,0x3fbba2776e3744f0,0x3ff766f6df586fad,2
+np.float64,0xbfb5d0951e2ba128,0x3ffa7f712480b25e,2
+np.float64,0xbfe949fdab7293fb,0x4003db4530a18507,2
+np.float64,0xbfcf13519b3e26a4,0x3ffd0e6f0a6c38ee,2
+np.float64,0x3f91e6d72823cdc0,0x3ff8da5f08909b6e,2
+np.float64,0x3f78a2e360314600,0x3ff909586727caef,2
+np.float64,0xbfe1ae7e8fe35cfd,0x40013fef082caaa3,2
+np.float64,0x3fe97a6dd1f2f4dc,0x3fe4cb4b99863478,2
+np.float64,0xbfcc1e1e69383c3c,0x3ffcad250a949843,2
+np.float64,0x3faccb797c399700,0x3ff83b8066b49330,2
+np.float64,0x3fe7a2647a6f44c8,0x3fe7acceae6ec425,2
+np.float64,0xbfec3bfcf0f877fa,0x4005366af5a7175b,2
+np.float64,0xbfe2310b94646217,0x400167588fceb228,2
+np.float64,0x3feb167372762ce6,0x3fe1f74c0288fad8,2
+np.float64,0xbfb722b4ee2e4568,0x3ffa94a81b94dfca,2
+np.float64,0x3fc58da9712b1b50,0x3ff66cf8f072aa14,2
+np.float64,0xbfe7fff9d6effff4,0x400359d01b8141de,2
+np.float64,0xbfd56691c5aacd24,0x3ffe9686697797e8,2
+np.float64,0x3fe3ab0557e7560a,0x3fed1593959ef8e8,2
+np.float64,0x3fdd458995ba8b14,0x3ff1883d6f22a322,2
+np.float64,0x3fe7bbed2cef77da,0x3fe786d618094cda,2
+np.float64,0x3fa31a30c4263460,0x3ff88920b936fd79,2
+np.float64,0x8010000000000000,0x3ff921fb54442d18,2
+np.float64,0xbfdc5effbdb8be00,0x40003d95fe0dff11,2
+np.float64,0x3febfdad7e77fb5a,0x3fe030b5297dbbdd,2
+np.float64,0x3fe4f3f3b2e9e7e8,0x3feb6bc59eeb2be2,2
+np.float64,0xbfe44469fd6888d4,0x40020daa5488f97a,2
+np.float64,0xbfe19fddb0e33fbc,0x40013b8c902b167b,2
+np.float64,0x3fa36ad17c26d5a0,0x3ff8869b3e828134,2
+np.float64,0x3fcf23e6c93e47d0,0x3ff5336491a65d1e,2
+np.float64,0xffefffffffffffff,0x7ff8000000000000,2
+np.float64,0xbfe375f4cee6ebea,0x4001cbd2ba42e8b5,2
+np.float64,0xbfaef1215c3de240,0x3ffa19ab02081189,2
+np.float64,0xbfec39c59c78738b,0x4005353dc38e3d78,2
+np.float64,0x7ff4000000000000,0x7ffc000000000000,2
+np.float64,0xbfec09bb7b781377,0x40051c0a5754cb3a,2
+np.float64,0x3fe8301f2870603e,0x3fe6d783c5ef0944,2
+np.float64,0xbfed418c987a8319,0x4005cbae1b8693d1,2
+np.float64,0xbfdc16e7adb82dd0,0x4000338b634eaf03,2
+np.float64,0x3fd5d361bdaba6c4,0x3ff390899300a54c,2
+np.float64,0xbff0000000000000,0x400921fb54442d18,2
+np.float64,0x3fd5946232ab28c4,0x3ff3a14767813f29,2
+np.float64,0x3fe833e5fef067cc,0x3fe6d1be720edf2d,2
+np.float64,0x3fedf746a67bee8e,0x3fd6f127fdcadb7b,2
+np.float64,0x3fd90353d3b206a8,0x3ff2b54f7d369ba9,2
+np.float64,0x3fec4b4b72f89696,0x3fdf1b38d2e93532,2
+np.float64,0xbfe9c67596f38ceb,0x40040ee5f524ce03,2
+np.float64,0x3fd350d91aa6a1b4,0x3ff43a303c0da27f,2
+np.float64,0x3fd062603ba0c4c0,0x3ff4fd9514b935d8,2
+np.float64,0xbfe24c075f64980e,0x40016f8e9f2663b3,2
+np.float64,0x3fdaa546eeb54a8c,0x3ff2431a88fef1d5,2
+np.float64,0x3fe92b8151f25702,0x3fe54c67e005cbf9,2
+np.float64,0xbfe1be8b8a637d17,0x400144c078f67c6e,2
+np.float64,0xbfe468a1d7e8d144,0x40021964b118cbf4,2
+np.float64,0xbfdc6de4fab8dbca,0x40003fa9e27893d8,2
+np.float64,0xbfe3c2788ae784f1,0x4001e407ba3aa956,2
+np.float64,0xbfe2bf1542e57e2a,0x400192d4a9072016,2
+np.float64,0xbfe6982f4c6d305e,0x4002d681b1991bbb,2
+np.float64,0x3fdbceb1c4b79d64,0x3ff1f0f117b9d354,2
+np.float64,0x3fdb3705e7b66e0c,0x3ff21af01ca27ace,2
+np.float64,0x3fe3e6358ee7cc6c,0x3fecca4585053983,2
+np.float64,0xbfe16d6a9a62dad5,0x40012c7988aee247,2
+np.float64,0xbfce66e4413ccdc8,0x3ffcf83b08043a0c,2
+np.float64,0xbfeb6cd46876d9a9,0x4004cd61733bfb79,2
+np.float64,0xbfdb1cdd64b639ba,0x400010e6cf087cb7,2
+np.float64,0xbfe09e4e30e13c9c,0x4000ef5277c47721,2
+np.float64,0xbfee88dd127d11ba,0x4006b3cd443643ac,2
+np.float64,0xbf911e06c8223c00,0x3ff966744064fb05,2
+np.float64,0xbfe8f22bc471e458,0x4003b7d5513af295,2
+np.float64,0x3fe3d7329567ae66,0x3fecdd6c241f83ee,2
+np.float64,0x3fc8a9404b315280,0x3ff607dc175edf3f,2
+np.float64,0x3fe7eb80ad6fd702,0x3fe73f8fdb3e6a6c,2
+np.float64,0x3fef0931e37e1264,0x3fcf7fde80a3c5ab,2
+np.float64,0x3fe2ed3c3fe5da78,0x3fee038334cd1860,2
+np.float64,0x3fe251fdb8e4a3fc,0x3feec26dc636ac31,2
+np.float64,0x3feb239436764728,0x3fe1de9462455da7,2
+np.float64,0xbfe63fd7eeec7fb0,0x4002b78cfa3d2fa6,2
+np.float64,0x3fdd639cb5bac738,0x3ff17fc7d92b3eee,2
+np.float64,0x3fd0a7a13fa14f44,0x3ff4eba95c559c84,2
+np.float64,0x3fe804362d70086c,0x3fe71a44cd91ffa4,2
+np.float64,0xbfe0fecf6e61fd9f,0x40010bac8edbdc4f,2
+np.float64,0x3fcb74acfd36e958,0x3ff5ac84437f1b7c,2
+np.float64,0x3fe55053e1eaa0a8,0x3feaf0bf76304c30,2
+np.float64,0x3fc06b508d20d6a0,0x3ff7131da17f3902,2
+np.float64,0x3fdd78750fbaf0ec,0x3ff179e97fbf7f65,2
+np.float64,0x3fe44cb946689972,0x3fec46859b5da6be,2
+np.float64,0xbfeb165a7ff62cb5,0x4004a41c9cc9589e,2
+np.float64,0x3fe01ffb2b603ff6,0x3ff0aed52bf1c3c1,2
+np.float64,0x3f983c60a83078c0,0x3ff8c107805715ab,2
+np.float64,0x3fd8b5ff13b16c00,0x3ff2ca4a837a476a,2
+np.float64,0x3fc80510a1300a20,0x3ff61cc3b4af470b,2
+np.float64,0xbfd3935b06a726b6,0x3ffe1b3a2066f473,2
+np.float64,0xbfdd4a1f31ba943e,0x40005e81979ed445,2
+np.float64,0xbfa76afdd42ed600,0x3ff9dd63ffba72d2,2
+np.float64,0x3fe7e06d496fc0da,0x3fe7503773566707,2
+np.float64,0xbfea5fbfe874bf80,0x40045106af6c538f,2
+np.float64,0x3fee000c487c0018,0x3fd6bef1f8779d88,2
+np.float64,0xbfb39f4ee2273ea0,0x3ffa5c3f2b3888ab,2
+np.float64,0x3feb9247b0772490,0x3fe1092d2905efce,2
+np.float64,0x3fdaa39b4cb54738,0x3ff243901da0da17,2
+np.float64,0x3fcd5b2b493ab658,0x3ff56e262e65b67d,2
+np.float64,0x3fcf82512f3f04a0,0x3ff52738847c55f2,2
+np.float64,0x3fe2af5e0c655ebc,0x3fee4ffab0c82348,2
+np.float64,0xbfec0055d0f800ac,0x4005172d325933e8,2
+np.float64,0x3fe71da9336e3b52,0x3fe86f2e12f6e303,2
+np.float64,0x3fbefab0723df560,0x3ff731188ac716ec,2
+np.float64,0xbfe11dca28623b94,0x400114d3d4ad370d,2
+np.float64,0x3fbcbda8ca397b50,0x3ff755281078abd4,2
+np.float64,0x3fe687c7126d0f8e,0x3fe945099a7855cc,2
+np.float64,0xbfecde510579bca2,0x400590606e244591,2
+np.float64,0xbfd72de681ae5bce,0x3fff0ff797ad1755,2
+np.float64,0xbfe7c0f7386f81ee,0x40034226e0805309,2
+np.float64,0x3fd8d55619b1aaac,0x3ff2c1cb3267b14e,2
+np.float64,0x3fecd7a2ad79af46,0x3fdcabbffeaa279e,2
+np.float64,0x3fee7fb1a8fcff64,0x3fd3ae620286fe19,2
+np.float64,0xbfc5f3a3592be748,0x3ffbe3ed204d9842,2
+np.float64,0x3fec9e5527793caa,0x3fddb00bc8687e4b,2
+np.float64,0x3fc35dc70f26bb90,0x3ff6b3ded7191e33,2
+np.float64,0x3fda91c07ab52380,0x3ff24878848fec8f,2
+np.float64,0xbfe12cde1fe259bc,0x4001194ab99d5134,2
+np.float64,0xbfd35ab736a6b56e,0x3ffe0c5ce8356d16,2
+np.float64,0x3fc9c94123339280,0x3ff5e3239f3ad795,2
+np.float64,0xbfe72f54926e5ea9,0x40030c95d1d02b56,2
+np.float64,0xbfee283186fc5063,0x40066786bd0feb79,2
+np.float64,0xbfe7b383f56f6708,0x40033d23ef0e903d,2
+np.float64,0x3fd6037327ac06e8,0x3ff383bf2f311ddb,2
+np.float64,0x3fe0e344b561c68a,0x3ff03cd90fd4ba65,2
+np.float64,0xbfef0ff54b7e1feb,0x400730fa5fce381e,2
+np.float64,0x3fd269929da4d324,0x3ff476b230136d32,2
+np.float64,0xbfbc5fb9f638bf70,0x3ffae8e63a4e3234,2
+np.float64,0xbfe2e8bc84e5d179,0x40019fb5874f4310,2
+np.float64,0xbfd7017413ae02e8,0x3fff040d843c1531,2
+np.float64,0x3fefd362fa7fa6c6,0x3fbababc3ddbb21d,2
+np.float64,0x3fecb62ed3f96c5e,0x3fdd44ba77ccff94,2
+np.float64,0xbfb16fad5222df58,0x3ffa392d7f02b522,2
+np.float64,0x3fbcf4abc639e950,0x3ff751b23c40e27f,2
+np.float64,0x3fe128adbce2515c,0x3ff013dc91db04b5,2
+np.float64,0x3fa5dd9d842bbb40,0x3ff87300c88d512f,2
+np.float64,0xbfe61efcaf6c3dfa,0x4002ac27117f87c9,2
+np.float64,0x3feffe1233fffc24,0x3f9638d3796a4954,2
+np.float64,0xbfe78548b66f0a92,0x40032c0447b7bfe2,2
+np.float64,0x3fe7bd38416f7a70,0x3fe784e86d6546b6,2
+np.float64,0x3fe0d6bc5961ad78,0x3ff0443899e747ac,2
+np.float64,0xbfd0bb6e47a176dc,0x3ffd5d6dff390d41,2
+np.float64,0xbfec1d16b8f83a2e,0x40052620378d3b78,2
+np.float64,0x3fe9bbec20f377d8,0x3fe45e167c7a3871,2
+np.float64,0xbfeed81d9dfdb03b,0x4006f9dec2db7310,2
+np.float64,0xbfe1e35179e3c6a3,0x40014fd1b1186ac0,2
+np.float64,0xbfc9c7e605338fcc,0x3ffc60a6bd1a7126,2
+np.float64,0x3feec92810fd9250,0x3fd1afde414ab338,2
+np.float64,0xbfeb9f1d90773e3b,0x4004e606b773f5b0,2
+np.float64,0x3fcbabdf6b3757c0,0x3ff5a573866404af,2
+np.float64,0x3fe9f4e1fff3e9c4,0x3fe3fd7b6712dd7b,2
+np.float64,0xbfe6c0175ded802e,0x4002e4a4dc12f3fe,2
+np.float64,0xbfeefc96f37df92e,0x40071d367cd721ff,2
+np.float64,0xbfeaab58dc7556b2,0x400472ce37e31e50,2
+np.float64,0xbfc62668772c4cd0,0x3ffbea5e6c92010a,2
+np.float64,0x3fafe055fc3fc0a0,0x3ff822ce6502519a,2
+np.float64,0x3fd7b648ffaf6c90,0x3ff30f5a42f11418,2
+np.float64,0xbfe934fe827269fd,0x4003d2b9fed9e6ad,2
+np.float64,0xbfe6d691f2edad24,0x4002eca6a4b1797b,2
+np.float64,0x3fc7e62ced2fcc58,0x3ff620b1f44398b7,2
+np.float64,0xbfc89be9f33137d4,0x3ffc3a67a497f59c,2
+np.float64,0xbfe7793d536ef27a,0x40032794bf14dd64,2
+np.float64,0x3fde55a02dbcab40,0x3ff13b5f82d223e4,2
+np.float64,0xbfc8eabd7b31d57c,0x3ffc4472a81cb6d0,2
+np.float64,0x3fddcb5468bb96a8,0x3ff162899c381f2e,2
+np.float64,0xbfec7554d8f8eaaa,0x40055550e18ec463,2
+np.float64,0x3fd0b6e8b6a16dd0,0x3ff4e7b4781a50e3,2
+np.float64,0x3fedaae01b7b55c0,0x3fd8964916cdf53d,2
+np.float64,0x3fe0870f8a610e20,0x3ff072e7db95c2a2,2
+np.float64,0xbfec3e3ce2787c7a,0x4005379d0f6be873,2
+np.float64,0xbfe65502586caa04,0x4002beecff89147f,2
+np.float64,0xbfe0df39a961be74,0x4001025e36d1c061,2
+np.float64,0xbfb5d8edbe2bb1d8,0x3ffa7ff72b7d6a2b,2
+np.float64,0xbfde89574bbd12ae,0x40008ba4cd74544d,2
+np.float64,0xbfe72938f0ee5272,0x40030a5efd1acb6d,2
+np.float64,0xbfcd500d133aa01c,0x3ffcd462f9104689,2
+np.float64,0x3fe0350766606a0e,0x3ff0a2a3664e2c14,2
+np.float64,0xbfc892fb573125f8,0x3ffc3944641cc69d,2
+np.float64,0xbfba7dc7c634fb90,0x3ffaca9a6a0ffe61,2
+np.float64,0xbfeac94478759289,0x40048068a8b83e45,2
+np.float64,0xbfe8f60c1af1ec18,0x4003b961995b6e51,2
+np.float64,0x3fea1c0817743810,0x3fe3ba28c1643cf7,2
+np.float64,0xbfe42a0fefe85420,0x4002052aadd77f01,2
+np.float64,0x3fd2c61c56a58c38,0x3ff45e84cb9a7fa9,2
+np.float64,0xbfd83fb7cdb07f70,0x3fff59ab4790074c,2
+np.float64,0x3fd95e630fb2bcc8,0x3ff29c8bee1335ad,2
+np.float64,0x3feee88f387dd11e,0x3fd0c3ad3ded4094,2
+np.float64,0x3fe061291160c252,0x3ff0890010199bbc,2
+np.float64,0xbfdc7db3b5b8fb68,0x400041dea3759443,2
+np.float64,0x3fee23b320fc4766,0x3fd5ee73d7aa5c56,2
+np.float64,0xbfdc25c590b84b8c,0x4000359cf98a00b4,2
+np.float64,0xbfd63cbfd2ac7980,0x3ffecf7b9cf99b3c,2
+np.float64,0xbfbeb3c29a3d6788,0x3ffb0e66ecc0fc3b,2
+np.float64,0xbfd2f57fd6a5eb00,0x3ffdf1d7c79e1532,2
+np.float64,0xbfab3eda9c367db0,0x3ff9fc0c875f42e9,2
+np.float64,0xbfe12df1c6e25be4,0x4001199c673e698c,2
+np.float64,0x3fef8ab23a7f1564,0x3fc5aff358c59f1c,2
+np.float64,0x3fe562f50feac5ea,0x3fead7bce205f7d9,2
+np.float64,0x3fdc41adbeb8835c,0x3ff1d0f71341b8f2,2
+np.float64,0x3fe2748967e4e912,0x3fee9837f970ff9e,2
+np.float64,0xbfdaa89d57b5513a,0x400000e3889ba4cf,2
+np.float64,0x3fdf2a137dbe5428,0x3ff0fecfbecbbf86,2
+np.float64,0xbfea1fdcd2f43fba,0x4004351974b32163,2
+np.float64,0xbfe34a93a3e69528,0x4001be323946a3e0,2
+np.float64,0x3fe929bacff25376,0x3fe54f47bd7f4cf2,2
+np.float64,0xbfd667fbd6accff8,0x3ffedb04032b3a1a,2
+np.float64,0xbfeb695796f6d2af,0x4004cbb08ec6f525,2
+np.float64,0x3fd204df2ea409c0,0x3ff490f51e6670f5,2
+np.float64,0xbfd89a2757b1344e,0x3fff722127b988c4,2
+np.float64,0xbfd0787187a0f0e4,0x3ffd4c16dbe94f32,2
+np.float64,0x3fd44239bfa88474,0x3ff3fabbfb24b1fa,2
+np.float64,0xbfeb0b3489f61669,0x40049ee33d811d33,2
+np.float64,0x3fdcf04eaab9e09c,0x3ff1a02a29996c4e,2
+np.float64,0x3fd4c51e4fa98a3c,0x3ff3d8302c68fc9a,2
+np.float64,0x3fd1346645a268cc,0x3ff4c72b4970ecaf,2
+np.float64,0x3fd6a89d09ad513c,0x3ff357af6520afac,2
+np.float64,0xbfba0f469a341e90,0x3ffac3a8f41bed23,2
+np.float64,0xbfe13f8ddce27f1c,0x40011ed557719fd6,2
+np.float64,0x3fd43e5e26a87cbc,0x3ff3fbc040fc30dc,2
+np.float64,0x3fe838125a707024,0x3fe6cb5c987248f3,2
+np.float64,0x3fe128c30c625186,0x3ff013cff238dd1b,2
+np.float64,0xbfcd4718833a8e30,0x3ffcd33c96bde6f9,2
+np.float64,0x3fe43fcd08e87f9a,0x3fec573997456ec1,2
+np.float64,0xbfe9a29104734522,0x4003ffd502a1b57f,2
+np.float64,0xbfe4709d7968e13b,0x40021bfc5cd55af4,2
+np.float64,0x3fd21c3925a43874,0x3ff48adf48556cbb,2
+np.float64,0x3fe9a521b2734a44,0x3fe4844fc054e839,2
+np.float64,0xbfdfa6a912bf4d52,0x4000b4730ad8521e,2
+np.float64,0x3fe3740702e6e80e,0x3fed5b106283b6ed,2
+np.float64,0x3fd0a3aa36a14754,0x3ff4ecb02a5e3f49,2
+np.float64,0x3fdcb903d0b97208,0x3ff1afa5d692c5b9,2
+np.float64,0xbfe7d67839efacf0,0x40034a3146abf6f2,2
+np.float64,0x3f9981c6d8330380,0x3ff8bbf1853d7b90,2
+np.float64,0xbfe9d4191673a832,0x400414a9ab453c5d,2
+np.float64,0x3fef0a1e5c7e143c,0x3fcf70b02a54c415,2
+np.float64,0xbfd996dee6b32dbe,0x3fffb6cf707ad8e4,2
+np.float64,0x3fe19bef17e337de,0x3fef9e70d4fcedae,2
+np.float64,0x3fe34a59716694b2,0x3fed8f6d5cfba474,2
+np.float64,0x3fdf27e27cbe4fc4,0x3ff0ff70500e0c7c,2
+np.float64,0xbfe19df87fe33bf1,0x40013afb401de24c,2
+np.float64,0xbfbdfd97ba3bfb30,0x3ffb02ef8c225e57,2
+np.float64,0xbfe3d3417267a683,0x4001e95ed240b0f8,2
+np.float64,0x3fe566498b6acc94,0x3fead342957d4910,2
+np.float64,0x3ff0000000000000,0x0,2
+np.float64,0x3feb329bd8766538,0x3fe1c2225aafe3b4,2
+np.float64,0xbfc19ca703233950,0x3ffb575b5df057b9,2
+np.float64,0x3fe755027d6eaa04,0x3fe81eb99c262e00,2
+np.float64,0xbfe6c2b8306d8570,0x4002e594199f9eec,2
+np.float64,0x3fd69438e6ad2870,0x3ff35d2275ae891d,2
+np.float64,0x3fda3e7285b47ce4,0x3ff25f5573dd47ae,2
+np.float64,0x3fe7928a166f2514,0x3fe7c4490ef4b9a9,2
+np.float64,0xbfd4eb71b9a9d6e4,0x3ffe75e8ccb74be1,2
+np.float64,0xbfcc3a07f1387410,0x3ffcb0b8af914a5b,2
+np.float64,0xbfe6e80225edd004,0x4002f2e26eae8999,2
+np.float64,0xbfb347728a268ee8,0x3ffa56bd526a12db,2
+np.float64,0x3fe5140ead6a281e,0x3feb4132c9140a1c,2
+np.float64,0xbfc147f125228fe4,0x3ffb4cab18b9050f,2
+np.float64,0xbfcb9145b537228c,0x3ffc9b1b6227a8c9,2
+np.float64,0xbfda84ef4bb509de,0x3ffff7f8a674e17d,2
+np.float64,0x3fd2eb6bbfa5d6d8,0x3ff454c225529d7e,2
+np.float64,0x3fe18c95f1e3192c,0x3fefb0cf0efba75a,2
+np.float64,0x3fe78606efef0c0e,0x3fe7d6c3a092d64c,2
+np.float64,0x3fbad5119a35aa20,0x3ff773dffe3ce660,2
+np.float64,0x3fd0cf5903a19eb4,0x3ff4e15fd21fdb42,2
+np.float64,0xbfd85ce90bb0b9d2,0x3fff618ee848e974,2
+np.float64,0x3fe90e11b9f21c24,0x3fe57be62f606f4a,2
+np.float64,0x3fd7a2040faf4408,0x3ff314ce85457ec2,2
+np.float64,0xbfd73fba69ae7f74,0x3fff14bff3504811,2
+np.float64,0x3fa04b4bd42096a0,0x3ff89f9b52f521a2,2
+np.float64,0xbfd7219ce5ae433a,0x3fff0cac0b45cc18,2
+np.float64,0xbfe0cf4661e19e8d,0x4000fdadb14e3c22,2
+np.float64,0x3fd07469fea0e8d4,0x3ff4f8eaa9b2394a,2
+np.float64,0x3f9b05c5d8360b80,0x3ff8b5e10672db5c,2
+np.float64,0x3fe4c25b916984b8,0x3febad29bd0e25e2,2
+np.float64,0xbfde8b4891bd1692,0x40008beb88d5c409,2
+np.float64,0xbfe199a7efe33350,0x400139b089aee21c,2
+np.float64,0x3fecdad25cf9b5a4,0x3fdc9d062867e8c3,2
+np.float64,0xbfe979b277f2f365,0x4003eedb061e25a4,2
+np.float64,0x3fc8c7311f318e60,0x3ff6040b9aeaad9d,2
+np.float64,0x3fd2b605b8a56c0c,0x3ff462b9a955c224,2
+np.float64,0x3fc073b6ad20e770,0x3ff7120e9f2fd63c,2
+np.float64,0xbfec60ede678c1dc,0x40054a3863e24dc2,2
+np.float64,0x3fe225171be44a2e,0x3feef910dca420ea,2
+np.float64,0xbfd7529762aea52e,0x3fff19d00661f650,2
+np.float64,0xbfd781783daf02f0,0x3fff2667b90be461,2
+np.float64,0x3fe3f6ec6d67edd8,0x3fecb4e814a2e33a,2
+np.float64,0x3fece6702df9cce0,0x3fdc6719d92a50d2,2
+np.float64,0xbfb5c602ce2b8c08,0x3ffa7ec761ba856a,2
+np.float64,0xbfd61f0153ac3e02,0x3ffec78e3b1a6c4d,2
+np.float64,0xbfec3462b2f868c5,0x400532630bbd7050,2
+np.float64,0xbfdd248485ba490a,0x400059391c07c1bb,2
+np.float64,0xbfd424921fa84924,0x3ffe416a85d1dcdf,2
+np.float64,0x3fbb23a932364750,0x3ff76eef79209f7f,2
+np.float64,0x3fca248b0f344918,0x3ff5d77c5c1b4e5e,2
+np.float64,0xbfe69af4a4ed35ea,0x4002d77c2e4fbd4e,2
+np.float64,0x3fdafe3cdcb5fc78,0x3ff22a9be6efbbf2,2
+np.float64,0xbfebba3377f77467,0x4004f3836e1fe71a,2
+np.float64,0xbfe650fae06ca1f6,0x4002bd851406377c,2
+np.float64,0x3fda630007b4c600,0x3ff2554f1832bd94,2
+np.float64,0xbfda8107d9b50210,0x3ffff6e6209659f3,2
+np.float64,0x3fea759a02f4eb34,0x3fe31d1a632c9aae,2
+np.float64,0x3fbf88149e3f1030,0x3ff728313aa12ccb,2
+np.float64,0x3f7196d2a0232e00,0x3ff910647e1914c1,2
+np.float64,0x3feeae51d17d5ca4,0x3fd2709698d31f6f,2
+np.float64,0xbfd73cd663ae79ac,0x3fff13f96300b55a,2
+np.float64,0x3fd4fc5f06a9f8c0,0x3ff3c99359854b97,2
+np.float64,0x3fb29f5d6e253ec0,0x3ff7f7c20e396b20,2
+np.float64,0xbfd757c82aaeaf90,0x3fff1b34c6141e98,2
+np.float64,0x3fc56fd4cf2adfa8,0x3ff670c145122909,2
+np.float64,0x3fc609a2f52c1348,0x3ff65d3ef3cade2c,2
+np.float64,0xbfe1de631163bcc6,0x40014e5528fadb73,2
+np.float64,0xbfe7eb4a726fd695,0x40035202f49d95c4,2
+np.float64,0xbfc9223771324470,0x3ffc4b84d5e263b9,2
+np.float64,0x3fee91a8a87d2352,0x3fd3364befde8de6,2
+np.float64,0x3fbc9784fe392f10,0x3ff7578e29f6a1b2,2
+np.float64,0xbfec627c2c78c4f8,0x40054b0ff2cb9c55,2
+np.float64,0xbfb8b406a6316810,0x3ffaadd97062fb8c,2
+np.float64,0xbfecf98384f9f307,0x4005a043d9110d79,2
+np.float64,0xbfe5834bab6b0698,0x400276f114aebee4,2
+np.float64,0xbfd90f391eb21e72,0x3fff91e26a8f48f3,2
+np.float64,0xbfee288ce2fc511a,0x400667cb09aa04b3,2
+np.float64,0x3fd5aa5e32ab54bc,0x3ff39b7080a52214,2
+np.float64,0xbfee7ef907fcfdf2,0x4006ab96a8eba4c5,2
+np.float64,0x3fd6097973ac12f4,0x3ff3822486978bd1,2
+np.float64,0xbfe02d14b8e05a2a,0x4000ce5be53047b1,2
+np.float64,0xbf9c629a6838c540,0x3ff993897728c3f9,2
+np.float64,0xbfee2024667c4049,0x40066188782fb1f0,2
+np.float64,0xbfa42a88fc285510,0x3ff9c35a4bbce104,2
+np.float64,0x3fa407af5c280f60,0x3ff881b360d8eea1,2
+np.float64,0x3fed0ba42cfa1748,0x3fdbb7d55609175f,2
+np.float64,0xbfdd0b5844ba16b0,0x400055b0bb59ebb2,2
+np.float64,0x3fd88d97e6b11b30,0x3ff2d53c1ecb8f8c,2
+np.float64,0xbfeb7a915ef6f523,0x4004d410812eb84c,2
+np.float64,0xbfb5f979ca2bf2f0,0x3ffa8201d73cd4ca,2
+np.float64,0x3fb3b65dd6276cc0,0x3ff7e64576199505,2
+np.float64,0x3fcd47a7793a8f50,0x3ff570a7b672f160,2
+np.float64,0xbfa41dd30c283ba0,0x3ff9c2f488127eb3,2
+np.float64,0x3fe4b1ea1f6963d4,0x3febc2bed7760427,2
+np.float64,0xbfdd0f81d2ba1f04,0x400056463724b768,2
+np.float64,0x3fd15d93f7a2bb28,0x3ff4bc7a24eacfd7,2
+np.float64,0xbfe3213af8e64276,0x4001b14579dfded3,2
+np.float64,0x3fd90dfbeab21bf8,0x3ff2b26a6c2c3bb3,2
+np.float64,0xbfd02d54bca05aaa,0x3ffd38ab3886b203,2
+np.float64,0x3fc218dcad2431b8,0x3ff6dced56d5b417,2
+np.float64,0x3fea5edf71f4bdbe,0x3fe3455ee09f27e6,2
+np.float64,0x3fa74319042e8640,0x3ff867d224545438,2
+np.float64,0x3fd970ad92b2e15c,0x3ff2979084815dc1,2
+np.float64,0x3fce0a4bf73c1498,0x3ff557a4df32df3e,2
+np.float64,0x3fef5c8e10feb91c,0x3fc99ca0eeaaebe4,2
+np.float64,0xbfedae997ffb5d33,0x400611af18f407ab,2
+np.float64,0xbfbcf07d6239e0f8,0x3ffaf201177a2d36,2
+np.float64,0xbfc3c52541278a4c,0x3ffb9d2af0408e4a,2
+np.float64,0x3fe4ef44e4e9de8a,0x3feb71f7331255e5,2
+np.float64,0xbfccd9f5f539b3ec,0x3ffcc53a99339592,2
+np.float64,0xbfda32c745b4658e,0x3fffe16e8727ef89,2
+np.float64,0xbfef54932a7ea926,0x40077e4605e61ca1,2
+np.float64,0x3fe9d4ae3573a95c,0x3fe4344a069a3fd0,2
+np.float64,0x3fda567e73b4acfc,0x3ff258bd77a663c7,2
+np.float64,0xbfd5bcac5eab7958,0x3ffead6379c19c52,2
+np.float64,0xbfee5e56f97cbcae,0x40069131fc54018d,2
+np.float64,0x3fc2d4413925a880,0x3ff6c54163816298,2
+np.float64,0xbfe9ddf6e873bbee,0x400418d8c722f7c5,2
+np.float64,0x3fdaf2a683b5e54c,0x3ff22dcda599d69c,2
+np.float64,0xbfca69789f34d2f0,0x3ffc7547ff10b1a6,2
+np.float64,0x3fed076f62fa0ede,0x3fdbcbda03c1d72a,2
+np.float64,0xbfcb38326f367064,0x3ffc8fb55dadeae5,2
+np.float64,0x3fe1938705e3270e,0x3fefa88130c5adda,2
+np.float64,0x3feaffae3b75ff5c,0x3fe221e3da537c7e,2
+np.float64,0x3fefc94acb7f9296,0x3fbd9a360ace67b4,2
+np.float64,0xbfe8bddeb0f17bbe,0x4003a316685c767e,2
+np.float64,0x3fbe10fbee3c21f0,0x3ff73fceb10650f5,2
+np.float64,0x3fde9126c1bd224c,0x3ff12a742f734d0a,2
+np.float64,0xbfe9686c91f2d0d9,0x4003e7bc6ee77906,2
+np.float64,0xbfb1ba4892237490,0x3ffa3dda064c2509,2
+np.float64,0xbfe2879100e50f22,0x400181c1a5b16f0f,2
+np.float64,0x3fd1cd40b6a39a80,0x3ff49f70e3064e95,2
+np.float64,0xbfc965869132cb0c,0x3ffc5419f3b43701,2
+np.float64,0x3fea7a6f2874f4de,0x3fe31480fb2dd862,2
+np.float64,0x3fc3bc56892778b0,0x3ff6a7e8fa0e8b0e,2
+np.float64,0x3fec1ed451f83da8,0x3fdfd78e564b8ad7,2
+np.float64,0x3feb77d16df6efa2,0x3fe13d083344e45e,2
+np.float64,0xbfe822e7c67045d0,0x400367104a830cf6,2
+np.float64,0x8000000000000001,0x3ff921fb54442d18,2
+np.float64,0xbfd4900918a92012,0x3ffe5dc0e19737b4,2
+np.float64,0x3fed184187fa3084,0x3fdb7b7a39f234f4,2
+np.float64,0x3fecef846179df08,0x3fdc3cb2228c3682,2
+np.float64,0xbfe2d2aed165a55e,0x400198e21c5b861b,2
+np.float64,0x7ff0000000000000,0x7ff8000000000000,2
+np.float64,0xbfee9409a07d2813,0x4006bd358232d073,2
+np.float64,0xbfecedc2baf9db86,0x4005995df566fc21,2
+np.float64,0x3fe6d857396db0ae,0x3fe8d2cb8794aa99,2
+np.float64,0xbf9a579e7834af40,0x3ff98b5cc8021e1c,2
+np.float64,0x3fc664fefb2cca00,0x3ff651a664ccf8fa,2
+np.float64,0xbfe8a7aa0e714f54,0x40039a5b4df938a0,2
+np.float64,0xbfdf27d380be4fa8,0x4000a241074dbae6,2
+np.float64,0x3fe00ddf55e01bbe,0x3ff0b94eb1ea1851,2
+np.float64,0x3feb47edbff68fdc,0x3fe199822d075959,2
+np.float64,0x3fb4993822293270,0x3ff7d80c838186d0,2
+np.float64,0xbfca2cd1473459a4,0x3ffc6d88c8de3d0d,2
+np.float64,0xbfea7d9c7674fb39,0x40045e4559e9e52d,2
+np.float64,0x3fe0dce425e1b9c8,0x3ff04099cab23289,2
+np.float64,0x3fd6bb7e97ad76fc,0x3ff352a30434499c,2
+np.float64,0x3fd4a4f16da949e4,0x3ff3e0b07432c9aa,2
+np.float64,0x8000000000000000,0x3ff921fb54442d18,2
+np.float64,0x3fe688f5b56d11ec,0x3fe9435f63264375,2
+np.float64,0xbfdf5a427ebeb484,0x4000a97a6c5d4abc,2
+np.float64,0xbfd1f3483fa3e690,0x3ffdae6c8a299383,2
+np.float64,0xbfeac920db759242,0x4004805862be51ec,2
+np.float64,0x3fef5bc711feb78e,0x3fc9ac40fba5b93b,2
+np.float64,0x3fe4bd9e12e97b3c,0x3febb363c787d381,2
+np.float64,0x3fef6a59ab7ed4b4,0x3fc880f1324eafce,2
+np.float64,0x3fc07a362120f470,0x3ff7113cf2c672b3,2
+np.float64,0xbfe4d6dbe2e9adb8,0x40023d6f6bea44b7,2
+np.float64,0xbfec2d6a15785ad4,0x40052eb425cc37a2,2
+np.float64,0x3fc90dae05321b60,0x3ff5fb10015d2934,2
+np.float64,0xbfa9239f74324740,0x3ff9eb2d057068ea,2
+np.float64,0xbfeb4fc8baf69f92,0x4004bf5e17fb08a4,2
+np.float64,0x0,0x3ff921fb54442d18,2
+np.float64,0x3faaf1884c35e320,0x3ff84a5591dbe1f3,2
+np.float64,0xbfed842561fb084b,0x4005f5c0a19116ce,2
+np.float64,0xbfc64850c32c90a0,0x3ffbeeac2ee70f9a,2
+np.float64,0x3fd7d879f5afb0f4,0x3ff306254c453436,2
+np.float64,0xbfdabaa586b5754c,0x4000035e6ac83a2b,2
+np.float64,0xbfebfeefa977fddf,0x4005167446fb9faf,2
+np.float64,0xbfe9383462727069,0x4003d407aa6a1577,2
+np.float64,0x3fe108dfb6e211c0,0x3ff026ac924b281d,2
+np.float64,0xbf85096df02a12c0,0x3ff94c0e60a22ede,2
+np.float64,0xbfe3121cd566243a,0x4001ac8f90db5882,2
+np.float64,0xbfd227f62aa44fec,0x3ffdbc26bb175dcc,2
+np.float64,0x3fd931af2cb26360,0x3ff2a8b62dfe003c,2
+np.float64,0xbfd9b794e3b36f2a,0x3fffbfbc89ec013d,2
+np.float64,0x3fc89b2e6f313660,0x3ff609a6e67f15f2,2
+np.float64,0x3fc0b14a8f216298,0x3ff70a4b6905aad2,2
+np.float64,0xbfeda11a657b4235,0x400608b3f9fff574,2
+np.float64,0xbfed2ee9ec7a5dd4,0x4005c040b7c02390,2
+np.float64,0xbfef7819d8fef034,0x4007ac6bf75cf09d,2
+np.float64,0xbfcc4720fb388e40,0x3ffcb2666a00b336,2
+np.float64,0xbfe05dec4be0bbd8,0x4000dc8a25ca3760,2
+np.float64,0x3fb093416e212680,0x3ff81897b6d8b374,2
+np.float64,0xbfc6ab89332d5714,0x3ffbfb4559d143e7,2
+np.float64,0x3fc51948512a3290,0x3ff67bb9df662c0a,2
+np.float64,0x3fed4d94177a9b28,0x3fda76c92f0c0132,2
+np.float64,0x3fdd195fbeba32c0,0x3ff194a5586dd18e,2
+np.float64,0x3fe3f82799e7f050,0x3fecb354c2faf55c,2
+np.float64,0x3fecac2169f95842,0x3fdd7222296cb7a7,2
+np.float64,0x3fe3d3f36fe7a7e6,0x3fece18f45e30dd7,2
+np.float64,0x3fe31ff63d663fec,0x3fedc46c77d30c6a,2
+np.float64,0xbfe3120c83e62419,0x4001ac8a7c4aa742,2
+np.float64,0x3fe7c1a7976f8350,0x3fe77e4a9307c9f8,2
+np.float64,0x3fe226fe9de44dfe,0x3feef6c0f3cb00fa,2
+np.float64,0x3fd5c933baab9268,0x3ff3933e8a37de42,2
+np.float64,0x3feaa98496f5530a,0x3fe2c003832ebf21,2
+np.float64,0xbfc6f80a2f2df014,0x3ffc04fd54cb1317,2
+np.float64,0x3fde5e18d0bcbc30,0x3ff138f7b32a2ca3,2
+np.float64,0xbfe30c8dd566191c,0x4001aad4af935a78,2
+np.float64,0x3fbe8d196e3d1a30,0x3ff737fec8149ecc,2
+np.float64,0x3feaee6731f5dcce,0x3fe241fa42cce22d,2
+np.float64,0x3fef9cc46cff3988,0x3fc3f17b708dbdbb,2
+np.float64,0xbfdb181bdeb63038,0x4000103ecf405602,2
+np.float64,0xbfc58de0ed2b1bc0,0x3ffbd704c14e15cd,2
+np.float64,0xbfee05d5507c0bab,0x40064e480faba6d8,2
+np.float64,0x3fe27d0ffa64fa20,0x3fee8dc71ef79f2c,2
+np.float64,0xbfe4f7ad4c69ef5a,0x400248456cd09a07,2
+np.float64,0xbfe4843e91e9087d,0x4002225f3e139c84,2
+np.float64,0x3fe7158b9c6e2b18,0x3fe87ae845c5ba96,2
+np.float64,0xbfea64316074c863,0x400452fd2bc23a44,2
+np.float64,0xbfc9f3ae4133e75c,0x3ffc663d482afa42,2
+np.float64,0xbfd5e18513abc30a,0x3ffeb72fc76d7071,2
+np.float64,0xbfd52f6438aa5ec8,0x3ffe87e5b18041e5,2
+np.float64,0xbfea970650f52e0d,0x400469a4a6758154,2
+np.float64,0xbfe44321b7e88644,0x40020d404a2141b1,2
+np.float64,0x3fdf5a39bbbeb474,0x3ff0f10453059dbd,2
+np.float64,0xbfa1d4069423a810,0x3ff9b0a2eacd2ce2,2
+np.float64,0xbfc36d16a326da2c,0x3ffb92077d41d26a,2
+np.float64,0x1,0x3ff921fb54442d18,2
+np.float64,0x3feb232a79764654,0x3fe1df5beeb249d0,2
+np.float64,0xbfed2003d5fa4008,0x4005b737c2727583,2
+np.float64,0x3fd5b093a3ab6128,0x3ff399ca2db1d96d,2
+np.float64,0x3fca692c3d34d258,0x3ff5ceb86b79223e,2
+np.float64,0x3fd6bbdf89ad77c0,0x3ff3528916df652d,2
+np.float64,0xbfefdadd46ffb5bb,0x40085ee735e19f19,2
+np.float64,0x3feb69fb2676d3f6,0x3fe157ee0c15691e,2
+np.float64,0x3fe44c931f689926,0x3fec46b6f5e3f265,2
+np.float64,0xbfc43ddbcb287bb8,0x3ffbac71d268d74d,2
+np.float64,0x3fe6e16d43edc2da,0x3fe8c5cf0f0daa66,2
+np.float64,0x3fe489efc76913e0,0x3febf704ca1ac2a6,2
+np.float64,0xbfe590aadceb2156,0x40027b764205cf78,2
+np.float64,0xbf782e8aa0305d00,0x3ff93a29e81928ab,2
+np.float64,0x3fedcb80cffb9702,0x3fd7e5d1f98a418b,2
+np.float64,0x3fe075858060eb0c,0x3ff07d23ab46b60f,2
+np.float64,0x3fe62a68296c54d0,0x3fe9c77f7068043b,2
+np.float64,0x3feff16a3c7fe2d4,0x3fae8e8a739cc67a,2
+np.float64,0xbfd6ed93e3addb28,0x3ffefebab206fa99,2
+np.float64,0x3fe40d8ccf681b1a,0x3fec97e9cd29966d,2
+np.float64,0x3fd6408210ac8104,0x3ff3737a7d374107,2
+np.float64,0x3fec8023b8f90048,0x3fde35ebfb2b3afd,2
+np.float64,0xbfe13babd4627758,0x40011dae5c07c56b,2
+np.float64,0xbfd2183e61a4307c,0x3ffdb80dd747cfbe,2
+np.float64,0x3feae8eb1d75d1d6,0x3fe24c1f6e42ae77,2
+np.float64,0xbfea559b9c74ab37,0x40044c8e5e123b20,2
+np.float64,0xbfd12c9d57a2593a,0x3ffd7ac6222f561c,2
+np.float64,0x3fe32eb697e65d6e,0x3fedb202693875b6,2
+np.float64,0xbfde0808c3bc1012,0x4000794bd8616ea3,2
+np.float64,0x3fe14958a06292b2,0x3ff0007b40ac648a,2
+np.float64,0x3fe3d388a6e7a712,0x3fece21751a6dd7c,2
+np.float64,0x3fe7ad7897ef5af2,0x3fe79c5b3da302a7,2
+np.float64,0x3fec75527e78eaa4,0x3fde655de0cf0508,2
+np.float64,0x3fea920d4c75241a,0x3fe2ea48f031d908,2
+np.float64,0x7fefffffffffffff,0x7ff8000000000000,2
+np.float64,0xbfc17a68cb22f4d0,0x3ffb530925f41aa0,2
+np.float64,0xbfe1c93166e39263,0x400147f3cb435dec,2
+np.float64,0x3feb97c402f72f88,0x3fe0fe5b561bf869,2
+np.float64,0x3fb58ff5162b1ff0,0x3ff7c8933fa969dc,2
+np.float64,0x3fe68e2beded1c58,0x3fe93c075283703b,2
+np.float64,0xbf94564cc828aca0,0x3ff97355e5ee35db,2
+np.float64,0x3fd31061c9a620c4,0x3ff44b150ec96998,2
+np.float64,0xbfc7d0c89f2fa190,0x3ffc208bf4eddc4d,2
+np.float64,0x3fe5736f1d6ae6de,0x3feac18f84992d1e,2
+np.float64,0x3fdb62e480b6c5c8,0x3ff20ecfdc4afe7c,2
+np.float64,0xbfc417228b282e44,0x3ffba78afea35979,2
+np.float64,0x3f8f5ba1303eb780,0x3ff8e343714630ff,2
+np.float64,0x3fe8e99126f1d322,0x3fe5b6511d4c0798,2
+np.float64,0xbfe2ec08a1e5d812,0x4001a0bb28a85875,2
+np.float64,0x3fea3b46cf74768e,0x3fe383dceaa74296,2
+np.float64,0xbfe008b5ed60116c,0x4000c3d62c275d40,2
+np.float64,0xbfcd9f8a4b3b3f14,0x3ffcde98d6484202,2
+np.float64,0xbfdb5fb112b6bf62,0x40001a22137ef1c9,2
+np.float64,0xbfe9079565f20f2b,0x4003c0670c92e401,2
+np.float64,0xbfce250dc53c4a1c,0x3ffcefc2b3dc3332,2
+np.float64,0x3fe9ba85d373750c,0x3fe4607131b28773,2
+np.float64,0x10000000000000,0x3ff921fb54442d18,2
+np.float64,0xbfeb9ef42c773de8,0x4004e5f239203ad8,2
+np.float64,0xbfd6bf457dad7e8a,0x3ffef2563d87b18d,2
+np.float64,0x3fe4de9aa5e9bd36,0x3feb87f97defb04a,2
+np.float64,0x3fedb4f67cfb69ec,0x3fd8603c465bffac,2
+np.float64,0x3fe7b6d9506f6db2,0x3fe78e670c7bdb67,2
+np.float64,0x3fe071717460e2e2,0x3ff07f84472d9cc5,2
+np.float64,0xbfed2e79dbfa5cf4,0x4005bffc6f9ad24f,2
+np.float64,0x3febb8adc377715c,0x3fe0bcebfbd45900,2
+np.float64,0xbfee2cffd87c5a00,0x40066b20a037c478,2
+np.float64,0x3fef7e358d7efc6c,0x3fc6d0ba71a542a8,2
+np.float64,0xbfef027eef7e04fe,0x400723291cb00a7a,2
+np.float64,0x3fac96da34392dc0,0x3ff83d260a936c6a,2
+np.float64,0x3fe9dba94a73b752,0x3fe428736b94885e,2
+np.float64,0x3fed37581efa6eb0,0x3fdae49dcadf1d90,2
+np.float64,0xbfe6e61037edcc20,0x4002f23031b8d522,2
+np.float64,0xbfdea7204dbd4e40,0x40008fe1f37918b7,2
+np.float64,0x3feb9f8edb773f1e,0x3fe0eef20bd4387b,2
+np.float64,0x3feeb0b6ed7d616e,0x3fd25fb3b7a525d6,2
+np.float64,0xbfd7ce9061af9d20,0x3fff3b25d531aa2b,2
+np.float64,0xbfc806b509300d6c,0x3ffc2768743a8360,2
+np.float64,0xbfa283882c250710,0x3ff9b61fda28914a,2
+np.float64,0x3fdec70050bd8e00,0x3ff11b1d769b578f,2
+np.float64,0xbfc858a44930b148,0x3ffc31d6758b4721,2
+np.float64,0x3fdc321150b86424,0x3ff1d5504c3c91e4,2
+np.float64,0x3fd9416870b282d0,0x3ff2a46f3a850f5b,2
+np.float64,0x3fdd756968baead4,0x3ff17ac510a5573f,2
+np.float64,0xbfedfd632cfbfac6,0x400648345a2f89b0,2
+np.float64,0x3fd6874285ad0e84,0x3ff36098ebff763f,2
+np.float64,0x3fe6daacc9edb55a,0x3fe8cf75fae1e35f,2
+np.float64,0x3fe53f19766a7e32,0x3feb07d0e97cd55b,2
+np.float64,0x3fd13cc36ca27988,0x3ff4c4ff801b1faa,2
+np.float64,0x3fe4f21cbce9e43a,0x3feb6e34a72ef529,2
+np.float64,0xbfc21c1cc9243838,0x3ffb67726394ca89,2
+np.float64,0x3fe947a3f2728f48,0x3fe51eae4660e23c,2
+np.float64,0xbfce78cd653cf19c,0x3ffcfa89194b3f5e,2
+np.float64,0x3fe756f049eeade0,0x3fe81be7f2d399e2,2
+np.float64,0xbfcc727cf138e4f8,0x3ffcb7f547841bb0,2
+np.float64,0xbfc2d8d58f25b1ac,0x3ffb7f496cc72458,2
+np.float64,0xbfcfd0e4653fa1c8,0x3ffd26e1309bc80b,2
+np.float64,0xbfe2126c106424d8,0x40015e0e01db6a4a,2
+np.float64,0x3fe580e4306b01c8,0x3feaaf683ce51aa5,2
+np.float64,0x3fcea8a1b93d5140,0x3ff543456c0d28c7,2
+np.float64,0xfff0000000000000,0x7ff8000000000000,2
+np.float64,0xbfd9d5da72b3abb4,0x3fffc8013113f968,2
+np.float64,0xbfe1fdfcea63fbfa,0x400157def2e4808d,2
+np.float64,0xbfc0022e0720045c,0x3ffb239963e7cbf2,2
diff --git a/numpy/core/tests/data/umath-validation-set-arccosh.csv b/numpy/core/tests/data/umath-validation-set-arccosh.csv
new file mode 100644 (file)
index 0000000..0defe50
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0x3f83203f,0x3e61d9d6,2
+np.float32,0x3f98dea1,0x3f1d1af6,2
+np.float32,0x7fa00000,0x7fe00000,2
+np.float32,0x7eba99af,0x42b0d032,2
+np.float32,0x3fc95a13,0x3f833650,2
+np.float32,0x3fce9a45,0x3f8771e1,2
+np.float32,0x3fc1bd96,0x3f797811,2
+np.float32,0x7eba2391,0x42b0ceed,2
+np.float32,0x7d4e8f15,0x42acdb8c,2
+np.float32,0x3feca42e,0x3f9cc88e,2
+np.float32,0x7e2b314e,0x42af412e,2
+np.float32,0x7f7fffff,0x42b2d4fc,2
+np.float32,0x3f803687,0x3d6c4380,2
+np.float32,0x3fa0edbd,0x3f33e706,2
+np.float32,0x3faa8074,0x3f4b3d3c,2
+np.float32,0x3fa0c49e,0x3f337af3,2
+np.float32,0x3f8c9ec4,0x3ee18812,2
+np.float32,0x7efef78e,0x42b17006,2
+np.float32,0x3fc75720,0x3f818aa4,2
+np.float32,0x7f52d4c8,0x42b27198,2
+np.float32,0x3f88f21e,0x3ebe52b0,2
+np.float32,0x3ff7a042,0x3fa3a07a,2
+np.float32,0x7f52115c,0x42b26fbd,2
+np.float32,0x3fc6bf6f,0x3f810b42,2
+np.float32,0x3fd105d0,0x3f895649,2
+np.float32,0x3fee7c2a,0x3f9df66e,2
+np.float32,0x7f0ff9a5,0x42b1ae4f,2
+np.float32,0x7e81f075,0x42b016e7,2
+np.float32,0x3fa57d65,0x3f3f70c6,2
+np.float32,0x80800000,0xffc00000,2
+np.float32,0x7da239f5,0x42adc2bf,2
+np.float32,0x3f9e432c,0x3f2cbd80,2
+np.float32,0x3ff2839b,0x3fa07ee4,2
+np.float32,0x3fec8aef,0x3f9cb850,2
+np.float32,0x7d325893,0x42ac905b,2
+np.float32,0x3fa27431,0x3f37dade,2
+np.float32,0x3fce7408,0x3f8753ae,2
+np.float32,0x3fde6684,0x3f93353f,2
+np.float32,0x3feb9a3e,0x3f9c1cff,2
+np.float32,0x7deb34bb,0x42ae80f0,2
+np.float32,0x3fed9300,0x3f9d61b7,2
+np.float32,0x7f35e253,0x42b225fb,2
+np.float32,0x7e6db57f,0x42afe93f,2
+np.float32,0x3fa41f08,0x3f3c10bc,2
+np.float32,0x3fb0d4da,0x3f590de3,2
+np.float32,0x3fb5c690,0x3f632351,2
+np.float32,0x3fcde9ce,0x3f86e638,2
+np.float32,0x3f809c7b,0x3dc81161,2
+np.float32,0x3fd77291,0x3f8e3226,2
+np.float32,0x3fc21a06,0x3f7a1a82,2
+np.float32,0x3fba177e,0x3f6b8139,2
+np.float32,0x7f370dff,0x42b22944,2
+np.float32,0x3fe5bfcc,0x3f9841c1,2
+np.float32,0x3feb0caa,0x3f9bc139,2
+np.float32,0x7f4fe5c3,0x42b26a6c,2
+np.float32,0x7f1e1419,0x42b1de28,2
+np.float32,0x7f5e3c96,0x42b28c92,2
+np.float32,0x3f8cd313,0x3ee3521e,2
+np.float32,0x3fa97824,0x3f48e049,2
+np.float32,0x7d8ca281,0x42ad799e,2
+np.float32,0x3f96b51b,0x3f165193,2
+np.float32,0x3f81328a,0x3e0bf504,2
+np.float32,0x3ff60bf3,0x3fa2ab45,2
+np.float32,0x3ff9b629,0x3fa4e107,2
+np.float32,0x3fecacfc,0x3f9cce37,2
+np.float32,0x3fba8804,0x3f6c5600,2
+np.float32,0x3f81f752,0x3e333fdd,2
+np.float32,0x3fb5b262,0x3f62fb46,2
+np.float32,0x3fa21bc0,0x3f36f7e6,2
+np.float32,0x3fbc87bb,0x3f7011dc,2
+np.float32,0x3fe18b32,0x3f9565ae,2
+np.float32,0x7dfb6dd5,0x42aea316,2
+np.float32,0x3fb7c602,0x3f670ee3,2
+np.float32,0x7efeb6a2,0x42b16f84,2
+np.float32,0x3fa56180,0x3f3f2ca4,2
+np.float32,0x3f8dcaff,0x3eeb9ac0,2
+np.float32,0x7e876238,0x42b02beb,2
+np.float32,0x7f0bb67d,0x42b19eec,2
+np.float32,0x3faca01c,0x3f4fffa5,2
+np.float32,0x3fdb57ee,0x3f9108b8,2
+np.float32,0x3fe3bade,0x3f96e4b7,2
+np.float32,0x7f7aa2dd,0x42b2ca25,2
+np.float32,0x3fed92ec,0x3f9d61aa,2
+np.float32,0x7eb789b1,0x42b0c7b9,2
+np.float32,0x7f7f16e4,0x42b2d329,2
+np.float32,0x3fb6647e,0x3f645b84,2
+np.float32,0x3f99335e,0x3f1e1d96,2
+np.float32,0x7e690a11,0x42afdf17,2
+np.float32,0x7dff2f95,0x42aeaaae,2
+np.float32,0x7f70adfd,0x42b2b564,2
+np.float32,0x3fe92252,0x3f9a80fe,2
+np.float32,0x3fef54ce,0x3f9e7fe5,2
+np.float32,0x3ff24eaa,0x3fa05df9,2
+np.float32,0x7f04565a,0x42b18328,2
+np.float32,0x3fcb8b80,0x3f85007f,2
+np.float32,0x3fcd4d0a,0x3f866983,2
+np.float32,0x3fbe7d82,0x3f73a911,2
+np.float32,0x3f8a7a8a,0x3ecdc8f6,2
+np.float32,0x3f912441,0x3f030d56,2
+np.float32,0x3f9b29d6,0x3f23f663,2
+np.float32,0x3fab7f36,0x3f4d7c6c,2
+np.float32,0x7dfedafc,0x42aeaa04,2
+np.float32,0x3fe190c0,0x3f956982,2
+np.float32,0x3f927515,0x3f07e0bb,2
+np.float32,0x3ff6442a,0x3fa2cd7e,2
+np.float32,0x7f6656d0,0x42b29ee8,2
+np.float32,0x3fe29aa0,0x3f96201f,2
+np.float32,0x3fa4a247,0x3f3d5687,2
+np.float32,0x3fa1cf19,0x3f363226,2
+np.float32,0x3fc20037,0x3f79ed36,2
+np.float32,0x7cc1241a,0x42ab5645,2
+np.float32,0x3fafd540,0x3f56f25a,2
+np.float32,0x7e5b3f5f,0x42afbfdb,2
+np.float32,0x7f48de5f,0x42b258d0,2
+np.float32,0x3fce1ca0,0x3f870e85,2
+np.float32,0x7ee40bb2,0x42b136e4,2
+np.float32,0x7ecdb133,0x42b10212,2
+np.float32,0x3f9f181c,0x3f2f02ca,2
+np.float32,0x3f936cbf,0x3f0b4f63,2
+np.float32,0x3fa4f8ea,0x3f3e2c2f,2
+np.float32,0x3fcc03e2,0x3f8561ac,2
+np.float32,0x3fb801f2,0x3f67831b,2
+np.float32,0x7e141dad,0x42aef70c,2
+np.float32,0x3fe8c04e,0x3f9a4087,2
+np.float32,0x3f8548d5,0x3e929f37,2
+np.float32,0x7f148d7d,0x42b1be56,2
+np.float32,0x3fd2c9a2,0x3f8ab1ed,2
+np.float32,0x7eb374fd,0x42b0bc36,2
+np.float32,0x7f296d36,0x42b201a7,2
+np.float32,0x3ff138e2,0x3f9fb09d,2
+np.float32,0x3ff42898,0x3fa18347,2
+np.float32,0x7da8c5e1,0x42add700,2
+np.float32,0x7dcf72c4,0x42ae40a4,2
+np.float32,0x7ea571fc,0x42b09296,2
+np.float32,0x3fc0953d,0x3f776ba3,2
+np.float32,0x7f1773dd,0x42b1c83c,2
+np.float32,0x7ef53b68,0x42b15c17,2
+np.float32,0x3f85d69f,0x3e9a0f3a,2
+np.float32,0x7e8b9a05,0x42b03ba0,2
+np.float32,0x3ff07d20,0x3f9f3ad2,2
+np.float32,0x7e8da32c,0x42b0430a,2
+np.float32,0x7ef96004,0x42b164ab,2
+np.float32,0x3fdfaa62,0x3f941837,2
+np.float32,0x7f0057c5,0x42b17377,2
+np.float32,0x3fb2663f,0x3f5c5065,2
+np.float32,0x3fd3d8c3,0x3f8b8055,2
+np.float32,0x1,0xffc00000,2
+np.float32,0x3fd536c1,0x3f8c8862,2
+np.float32,0x3f91b953,0x3f053619,2
+np.float32,0x3fb3305c,0x3f5deee1,2
+np.float32,0x7ecd86b9,0x42b101a8,2
+np.float32,0x3fbf71c5,0x3f75624d,2
+np.float32,0x3ff5f0f4,0x3fa29ad2,2
+np.float32,0x3fe50389,0x3f97c328,2
+np.float32,0x3fa325a1,0x3f399e69,2
+np.float32,0x3fe4397a,0x3f973a9f,2
+np.float32,0x3f8684c6,0x3ea2b784,2
+np.float32,0x7f25ae00,0x42b1f634,2
+np.float32,0x3ff7cbf7,0x3fa3badb,2
+np.float32,0x7f73f0e0,0x42b2bc48,2
+np.float32,0x3fc88b70,0x3f828b92,2
+np.float32,0x3fb01c16,0x3f578886,2
+np.float32,0x7e557623,0x42afb229,2
+np.float32,0x3fcbcd5b,0x3f8535b4,2
+np.float32,0x7f7157e4,0x42b2b6cd,2
+np.float32,0x7f51d9d4,0x42b26f36,2
+np.float32,0x7f331a3b,0x42b21e17,2
+np.float32,0x7f777fb5,0x42b2c3b2,2
+np.float32,0x3f832001,0x3e61d11f,2
+np.float32,0x7f2cd055,0x42b20bca,2
+np.float32,0x3f89831f,0x3ec42f76,2
+np.float32,0x7f21da33,0x42b1ea3d,2
+np.float32,0x3f99e416,0x3f20330a,2
+np.float32,0x7f2c8ea1,0x42b20b07,2
+np.float32,0x7f462c98,0x42b251e6,2
+np.float32,0x7f4fdb3f,0x42b26a52,2
+np.float32,0x3fcc1338,0x3f856e07,2
+np.float32,0x3f823673,0x3e3e20da,2
+np.float32,0x7dbfe89d,0x42ae18c6,2
+np.float32,0x3fc9b04c,0x3f837d38,2
+np.float32,0x7dba3213,0x42ae094d,2
+np.float32,0x7ec5a483,0x42b0eda1,2
+np.float32,0x3fbc4d14,0x3f6fa543,2
+np.float32,0x3fc85ce2,0x3f8264f1,2
+np.float32,0x7f77c816,0x42b2c447,2
+np.float32,0x3f9c9281,0x3f280492,2
+np.float32,0x7f49b3e2,0x42b25aef,2
+np.float32,0x3fa7e4da,0x3f45347c,2
+np.float32,0x7e0c9df5,0x42aedc72,2
+np.float32,0x7f21fd1a,0x42b1eaab,2
+np.float32,0x7f7c63ad,0x42b2cdb6,2
+np.float32,0x7f4eb80a,0x42b26783,2
+np.float32,0x7e98038c,0x42b0673c,2
+np.float32,0x7e89ba08,0x42b034b4,2
+np.float32,0x3ffc06ba,0x3fa64094,2
+np.float32,0x3fae63f6,0x3f53db36,2
+np.float32,0x3fbc2d30,0x3f6f6a1c,2
+np.float32,0x7de0e5e5,0x42ae69fe,2
+np.float32,0x7e09ed18,0x42aed28d,2
+np.float32,0x3fea78f8,0x3f9b6129,2
+np.float32,0x7dfe0bcc,0x42aea863,2
+np.float32,0x7ee21d03,0x42b13289,2
+np.float32,0x3fcc3aed,0x3f858dfc,2
+np.float32,0x3fe6b3ba,0x3f98e4ea,2
+np.float32,0x3f90f25f,0x3f025225,2
+np.float32,0x7f1bcaf4,0x42b1d6b3,2
+np.float32,0x3f83ac81,0x3e74c20e,2
+np.float32,0x3f98681d,0x3f1bae16,2
+np.float32,0x3fe1f2d9,0x3f95ad08,2
+np.float32,0x3fa279d7,0x3f37e951,2
+np.float32,0x3feb922a,0x3f9c17c4,2
+np.float32,0x7f1c72e8,0x42b1d8da,2
+np.float32,0x3fea156b,0x3f9b2038,2
+np.float32,0x3fed6bda,0x3f9d48aa,2
+np.float32,0x3fa86142,0x3f46589c,2
+np.float32,0x3ff16bc2,0x3f9fd072,2
+np.float32,0x3fbebf65,0x3f74207b,2
+np.float32,0x7e7b78b5,0x42b00610,2
+np.float32,0x3ff51ab8,0x3fa217f0,2
+np.float32,0x3f8361bb,0x3e6adf07,2
+np.float32,0x7edbceed,0x42b1240e,2
+np.float32,0x7f10e2c0,0x42b1b18a,2
+np.float32,0x3fa7bc58,0x3f44d4ef,2
+np.float32,0x3f813bde,0x3e0e1138,2
+np.float32,0x7f30d5b9,0x42b21791,2
+np.float32,0x3fb4f450,0x3f61806a,2
+np.float32,0x7eee02c4,0x42b14cca,2
+np.float32,0x7ec74b62,0x42b0f1e4,2
+np.float32,0x3ff96bca,0x3fa4b498,2
+np.float32,0x7f50e304,0x42b26cda,2
+np.float32,0x7eb14c57,0x42b0b603,2
+np.float32,0x7c3f0733,0x42a9edbf,2
+np.float32,0x7ea57acb,0x42b092b1,2
+np.float32,0x7f2788dc,0x42b1fbe7,2
+np.float32,0x3fa39f14,0x3f3ad09b,2
+np.float32,0x3fc3a7e0,0x3f7ccfa0,2
+np.float32,0x3fe70a73,0x3f991eb0,2
+np.float32,0x7f4831f7,0x42b25718,2
+np.float32,0x3fe947d0,0x3f9a999c,2
+np.float32,0x7ef2b1c7,0x42b156c4,2
+np.float32,0x3fede0ea,0x3f9d937f,2
+np.float32,0x3f9fef8e,0x3f314637,2
+np.float32,0x3fc313c5,0x3f7bcebd,2
+np.float32,0x7ee99337,0x42b14328,2
+np.float32,0x7eb9042e,0x42b0cbd5,2
+np.float32,0x3fc9d3dc,0x3f839a69,2
+np.float32,0x3fb2c018,0x3f5d091d,2
+np.float32,0x3fcc4e8f,0x3f859dc5,2
+np.float32,0x3fa9363b,0x3f484819,2
+np.float32,0x7f72ce2e,0x42b2b9e4,2
+np.float32,0x7e639326,0x42afd2f1,2
+np.float32,0x7f4595d3,0x42b25060,2
+np.float32,0x7f6d0ac4,0x42b2ad97,2
+np.float32,0x7f1bda0d,0x42b1d6e5,2
+np.float32,0x3fd85ffd,0x3f8ee0ed,2
+np.float32,0x3f91d53f,0x3f059c8e,2
+np.float32,0x7d06e103,0x42ac0155,2
+np.float32,0x3fb83126,0x3f67de6e,2
+np.float32,0x7d81ce1f,0x42ad5097,2
+np.float32,0x7f79cb3b,0x42b2c86b,2
+np.float32,0x7f800000,0x7f800000,2
+np.float32,0x3fdbfffd,0x3f918137,2
+np.float32,0x7f4ecb1c,0x42b267b2,2
+np.float32,0x3fc2c122,0x3f7b3ed3,2
+np.float32,0x7f415854,0x42b24544,2
+np.float32,0x7e3d988b,0x42af7575,2
+np.float32,0x3f83ca99,0x3e789fcb,2
+np.float32,0x7f274f70,0x42b1fb38,2
+np.float32,0x7f0d20e6,0x42b1a416,2
+np.float32,0x3fdf3a1d,0x3f93c9c1,2
+np.float32,0x7efaa13e,0x42b1673d,2
+np.float32,0x3fb20b15,0x3f5b9434,2
+np.float32,0x3f86af9f,0x3ea4c664,2
+np.float32,0x3fe4fcb0,0x3f97be8a,2
+np.float32,0x3f920683,0x3f065085,2
+np.float32,0x3fa4b278,0x3f3d7e8b,2
+np.float32,0x3f8077a8,0x3daef77f,2
+np.float32,0x7e865be4,0x42b02807,2
+np.float32,0x3fcea7e2,0x3f877c9f,2
+np.float32,0x7e7e9db1,0x42b00c6d,2
+np.float32,0x3f9819aa,0x3f1aba7e,2
+np.float32,0x7f2b6c4b,0x42b207a7,2
+np.float32,0x7ef85e3e,0x42b16299,2
+np.float32,0x3fbd8290,0x3f71df8b,2
+np.float32,0x3fbbb615,0x3f6e8c8c,2
+np.float32,0x7f1bc7f5,0x42b1d6a9,2
+np.float32,0x3fbb4fea,0x3f6dcdad,2
+np.float32,0x3fb67e09,0x3f648dd1,2
+np.float32,0x3fc83495,0x3f824374,2
+np.float32,0x3fe52980,0x3f97dcbc,2
+np.float32,0x3f87d893,0x3eb25d7c,2
+np.float32,0x3fdb805a,0x3f9125c0,2
+np.float32,0x3fb33f0f,0x3f5e0ce1,2
+np.float32,0x3facc524,0x3f50516b,2
+np.float32,0x3ff40484,0x3fa16d0e,2
+np.float32,0x3ff078bf,0x3f9f3811,2
+np.float32,0x7f736747,0x42b2bb27,2
+np.float32,0x7f55768b,0x42b277f3,2
+np.float32,0x80000001,0xffc00000,2
+np.float32,0x7f6463d1,0x42b29a8e,2
+np.float32,0x3f8f8b59,0x3ef9d792,2
+np.float32,0x3f8a6f4d,0x3ecd5bf4,2
+np.float32,0x3fe958d9,0x3f9aa4ca,2
+np.float32,0x7f1e2ce2,0x42b1de78,2
+np.float32,0x3fb8584a,0x3f682a05,2
+np.float32,0x7dea3dc6,0x42ae7ed5,2
+np.float32,0x7f53a815,0x42b27399,2
+np.float32,0x7e0cf986,0x42aeddbf,2
+np.float32,0x7f3afb71,0x42b23422,2
+np.float32,0x3fd87d6e,0x3f8ef685,2
+np.float32,0x3ffcaa46,0x3fa6a0d7,2
+np.float32,0x7eecd276,0x42b14a3a,2
+np.float32,0x3ffc30b4,0x3fa65951,2
+np.float32,0x7e9c85e2,0x42b07634,2
+np.float32,0x3f95d862,0x3f1383de,2
+np.float32,0x7ef21410,0x42b15577,2
+np.float32,0x3fbfa1b5,0x3f75b86e,2
+np.float32,0x3fd6d90f,0x3f8dc086,2
+np.float32,0x0,0xffc00000,2
+np.float32,0x7e885dcd,0x42b02f9f,2
+np.float32,0x3fb3e057,0x3f5f54bf,2
+np.float32,0x7f40afdd,0x42b24385,2
+np.float32,0x3fb795c2,0x3f66b120,2
+np.float32,0x3fba7c11,0x3f6c3f73,2
+np.float32,0x3ffef620,0x3fa7f828,2
+np.float32,0x7d430508,0x42acbe1e,2
+np.float32,0x3f8d2892,0x3ee6369f,2
+np.float32,0x3fbea139,0x3f73e9d5,2
+np.float32,0x3ffaa928,0x3fa571b9,2
+np.float32,0x7fc00000,0x7fc00000,2
+np.float32,0x7f16f9ce,0x42b1c69f,2
+np.float32,0x3fa8f753,0x3f47b657,2
+np.float32,0x3fd48a63,0x3f8c06ac,2
+np.float32,0x7f13419e,0x42b1b9d9,2
+np.float32,0x3fdf1526,0x3f93afde,2
+np.float32,0x3f903c8b,0x3eff3be8,2
+np.float32,0x7f085323,0x42b1925b,2
+np.float32,0x7cdbe309,0x42ab98ac,2
+np.float32,0x3fba2cfd,0x3f6ba9f1,2
+np.float32,0x7f5a805d,0x42b283e4,2
+np.float32,0x7f6753dd,0x42b2a119,2
+np.float32,0x3fed9f02,0x3f9d6964,2
+np.float32,0x3f96422c,0x3f14ddba,2
+np.float32,0x7f22f2a9,0x42b1edb1,2
+np.float32,0x3fe3fcfd,0x3f97119d,2
+np.float32,0x7e018ad0,0x42aeb271,2
+np.float32,0x7db896f5,0x42ae04de,2
+np.float32,0x7e55c795,0x42afb2ec,2
+np.float32,0x7f58ef8d,0x42b28036,2
+np.float32,0x7f24a16a,0x42b1f2f3,2
+np.float32,0x3fcf714c,0x3f881b09,2
+np.float32,0x3fcdd056,0x3f86d200,2
+np.float32,0x7f02fad0,0x42b17de0,2
+np.float32,0x7eeab877,0x42b145a9,2
+np.float32,0x3fd6029d,0x3f8d20f7,2
+np.float32,0x3fd4f8cd,0x3f8c59d6,2
+np.float32,0x3fb29d4a,0x3f5cc1a5,2
+np.float32,0x3fb11e2d,0x3f59a77a,2
+np.float32,0x7eded576,0x42b12b0e,2
+np.float32,0x7f26c2a5,0x42b1f988,2
+np.float32,0x3fb6165b,0x3f63c151,2
+np.float32,0x7f3bca47,0x42b23657,2
+np.float32,0x7d8c93bf,0x42ad7968,2
+np.float32,0x3f8ede02,0x3ef47176,2
+np.float32,0x3fbef762,0x3f7485b9,2
+np.float32,0x7f1419af,0x42b1bcc6,2
+np.float32,0x7d9e8c79,0x42adb701,2
+np.float32,0x3fa26336,0x3f37af63,2
+np.float32,0x7f5f5590,0x42b28f18,2
+np.float32,0x3fddc93a,0x3f92c651,2
+np.float32,0x3ff0a5fc,0x3f9f547f,2
+np.float32,0x3fb2f6b8,0x3f5d790e,2
+np.float32,0x3ffe59a4,0x3fa79d2c,2
+np.float32,0x7e4df848,0x42af9fde,2
+np.float32,0x3fb0ab3b,0x3f58b678,2
+np.float32,0x7ea54d47,0x42b09225,2
+np.float32,0x3fdd6404,0x3f927eb2,2
+np.float32,0x3f846dc0,0x3e864caa,2
+np.float32,0x7d046aee,0x42abf7e7,2
+np.float32,0x7f7c5a05,0x42b2cda3,2
+np.float32,0x3faf6126,0x3f55fb21,2
+np.float32,0x7f36a910,0x42b22829,2
+np.float32,0x3fdc7b36,0x3f91d938,2
+np.float32,0x3fff443e,0x3fa82577,2
+np.float32,0x7ee7154a,0x42b13daa,2
+np.float32,0x3f944742,0x3f0e435c,2
+np.float32,0x7f5b510a,0x42b285cc,2
+np.float32,0x3f9bc940,0x3f25c4d2,2
+np.float32,0x3fee4782,0x3f9dd4ea,2
+np.float32,0x3fcfc2dd,0x3f885aea,2
+np.float32,0x7eab65cf,0x42b0a4af,2
+np.float32,0x3f9cf908,0x3f292689,2
+np.float32,0x7ed35501,0x42b10feb,2
+np.float32,0x7dabb70a,0x42addfd9,2
+np.float32,0x7f348919,0x42b2222b,2
+np.float32,0x3fb137d4,0x3f59dd17,2
+np.float32,0x7e7b36c9,0x42b0058a,2
+np.float32,0x7e351fa4,0x42af5e0d,2
+np.float32,0x3f973c0c,0x3f18011e,2
+np.float32,0xff800000,0xffc00000,2
+np.float32,0x3f9b0a4b,0x3f239a33,2
+np.float32,0x3f87c4cf,0x3eb17e7e,2
+np.float32,0x7ef67760,0x42b15eaa,2
+np.float32,0x3fc4d2c8,0x3f7ed20f,2
+np.float32,0x7e940dac,0x42b059b8,2
+np.float32,0x7f6e6a52,0x42b2b08d,2
+np.float32,0x3f838752,0x3e6fe4b2,2
+np.float32,0x3fd8f046,0x3f8f4a94,2
+np.float32,0x3fa82112,0x3f45c223,2
+np.float32,0x3fd49b16,0x3f8c1345,2
+np.float32,0x7f02a941,0x42b17ca1,2
+np.float32,0x3f8a9d2c,0x3ecf1768,2
+np.float32,0x7c9372e3,0x42aacc0f,2
+np.float32,0x3fd260b3,0x3f8a619a,2
+np.float32,0x3f8a1b88,0x3eca27cb,2
+np.float32,0x7d25d510,0x42ac6b1c,2
+np.float32,0x7ef5a578,0x42b15cf5,2
+np.float32,0x3fe6625d,0x3f98ae9a,2
+np.float32,0x3ff53240,0x3fa22658,2
+np.float32,0x3f8bb2e6,0x3ed944cf,2
+np.float32,0x7f4679b1,0x42b252ad,2
+np.float32,0x3fa8db30,0x3f4774fc,2
+np.float32,0x7ee5fafd,0x42b13b37,2
+np.float32,0x3fc405e0,0x3f7d71fb,2
+np.float32,0x3f9303cd,0x3f09ddfd,2
+np.float32,0x7f486e67,0x42b257b2,2
+np.float32,0x7e73f12b,0x42aff680,2
+np.float32,0x3fe80f8b,0x3f99cbe4,2
+np.float32,0x3f84200a,0x3e81a3f3,2
+np.float32,0x3fa14e5c,0x3f34e3ce,2
+np.float32,0x3fda22ec,0x3f9029bb,2
+np.float32,0x3f801772,0x3d1aef98,2
+np.float32,0x7eaa1428,0x42b0a0bb,2
+np.float32,0x3feae0b3,0x3f9ba4aa,2
+np.float32,0x7ea439b4,0x42b08ecc,2
+np.float32,0x3fa28b1c,0x3f381579,2
+np.float32,0x7e8af247,0x42b03937,2
+np.float32,0x3fd19216,0x3f89c2b7,2
+np.float32,0x7f6ea033,0x42b2b100,2
+np.float32,0x3fad4fbf,0x3f518224,2
+np.float32,0x3febd940,0x3f9c45bd,2
+np.float32,0x7f4643a3,0x42b25221,2
+np.float32,0x7ec34478,0x42b0e771,2
+np.float32,0x7f18c83b,0x42b1ccb5,2
+np.float32,0x3fc665ad,0x3f80bf94,2
+np.float32,0x3ff0a999,0x3f9f56c4,2
+np.float32,0x3faf1cd2,0x3f5568fe,2
+np.float32,0x7ecd9dc6,0x42b101e1,2
+np.float32,0x3faad282,0x3f4bf754,2
+np.float32,0x3ff905a0,0x3fa47771,2
+np.float32,0x7f596481,0x42b28149,2
+np.float32,0x7f1cb31f,0x42b1d9ac,2
+np.float32,0x7e266719,0x42af32a6,2
+np.float32,0x7eccce06,0x42b0ffdb,2
+np.float32,0x3f9b6f71,0x3f24c102,2
+np.float32,0x3f80e4ba,0x3df1d6bc,2
+np.float32,0x3f843d51,0x3e836a60,2
+np.float32,0x7f70bd88,0x42b2b585,2
+np.float32,0x3fe4cc96,0x3f979e18,2
+np.float32,0x3ff737c7,0x3fa36151,2
+np.float32,0x3ff1197e,0x3f9f9cf4,2
+np.float32,0x7f08e190,0x42b19471,2
+np.float32,0x3ff1542e,0x3f9fc1b2,2
+np.float32,0x3ff6673c,0x3fa2e2d2,2
+np.float32,0xbf800000,0xffc00000,2
+np.float32,0x7e3f9ba7,0x42af7add,2
+np.float32,0x7f658ff6,0x42b29d2d,2
+np.float32,0x3f93441c,0x3f0ac0d9,2
+np.float32,0x7f526a74,0x42b27096,2
+np.float32,0x7f5b00c8,0x42b28511,2
+np.float32,0x3ff212f8,0x3fa038cf,2
+np.float32,0x7e0bd60d,0x42aed998,2
+np.float32,0x7f71ef7f,0x42b2b80e,2
+np.float32,0x7f7a897e,0x42b2c9f1,2
+np.float32,0x7e8b76a6,0x42b03b1e,2
+np.float32,0x7efa0da3,0x42b1660f,2
+np.float32,0x3fce9166,0x3f876ae0,2
+np.float32,0x3fc4163d,0x3f7d8e30,2
+np.float32,0x3fdb3784,0x3f90f16b,2
+np.float32,0x7c5f177b,0x42aa3d30,2
+np.float32,0x3fc6276d,0x3f808af5,2
+np.float32,0x7bac9cc2,0x42a856f4,2
+np.float32,0x3fe5876f,0x3f981bea,2
+np.float32,0x3fef60e3,0x3f9e878a,2
+np.float32,0x3fb23cd8,0x3f5bfb06,2
+np.float32,0x3fe114e2,0x3f951402,2
+np.float32,0x7ca8ef04,0x42ab11b4,2
+np.float32,0x7d93c2ad,0x42ad92ec,2
+np.float32,0x3fe5bb8a,0x3f983ee6,2
+np.float32,0x7f0182fd,0x42b1781b,2
+np.float32,0x7da63bb2,0x42adcf3d,2
+np.float32,0x3fac46b7,0x3f4f399e,2
+np.float32,0x7f7a5d8f,0x42b2c997,2
+np.float32,0x7f76572e,0x42b2c14b,2
+np.float32,0x7f42d53e,0x42b24931,2
+np.float32,0x7f7ffd00,0x42b2d4f6,2
+np.float32,0x3fc346c3,0x3f7c2756,2
+np.float32,0x7f1f6ae3,0x42b1e27a,2
+np.float32,0x3f87fb56,0x3eb3e2ee,2
+np.float32,0x3fed17a2,0x3f9d12b4,2
+np.float32,0x7f5ea903,0x42b28d8c,2
+np.float32,0x3f967f82,0x3f15a4ab,2
+np.float32,0x7d3b540c,0x42aca984,2
+np.float32,0x7f56711a,0x42b27a4a,2
+np.float32,0x7f122223,0x42b1b5ee,2
+np.float32,0x3fd6fa34,0x3f8dd919,2
+np.float32,0x3fadd62e,0x3f52a7b3,2
+np.float32,0x3fb7bf0c,0x3f67015f,2
+np.float32,0x7edf4ba7,0x42b12c1d,2
+np.float32,0x7e33cc65,0x42af5a4b,2
+np.float32,0x3fa6be17,0x3f427831,2
+np.float32,0x3fa07aa8,0x3f32b7d4,2
+np.float32,0x3fa4a3af,0x3f3d5a01,2
+np.float32,0x3fdbb267,0x3f9149a8,2
+np.float32,0x7ed45e25,0x42b1126c,2
+np.float32,0x3fe3f432,0x3f970ba6,2
+np.float32,0x7f752080,0x42b2bec3,2
+np.float32,0x3f872747,0x3eaa62ea,2
+np.float32,0x7e52175d,0x42afaa03,2
+np.float32,0x3fdc766c,0x3f91d5ce,2
+np.float32,0x7ecd6841,0x42b1015c,2
+np.float32,0x7f3d6c40,0x42b23ac6,2
+np.float32,0x3fb80c14,0x3f6796b9,2
+np.float32,0x3ff6ad56,0x3fa30d68,2
+np.float32,0x3fda44c3,0x3f90423e,2
+np.float32,0x3fdcba0c,0x3f9205fc,2
+np.float32,0x7e14a720,0x42aef8e6,2
+np.float32,0x3fe9e489,0x3f9b0047,2
+np.float32,0x7e69f933,0x42afe123,2
+np.float32,0x3ff3ee6d,0x3fa15f71,2
+np.float32,0x3f8538cd,0x3e91c1a7,2
+np.float32,0x3fdc3f07,0x3f91ae46,2
+np.float32,0x3fba2ef0,0x3f6bada2,2
+np.float32,0x7da64cd8,0x42adcf71,2
+np.float32,0x3fc34bd2,0x3f7c301d,2
+np.float32,0x3fa273aa,0x3f37d984,2
+np.float32,0x3ff0338c,0x3f9f0c86,2
+np.float32,0x7ed62cef,0x42b116c3,2
+np.float32,0x3f911e7e,0x3f02f7c6,2
+np.float32,0x7c8514c9,0x42aa9792,2
+np.float32,0x3fea2a74,0x3f9b2df5,2
+np.float32,0x3fe036f8,0x3f947a25,2
+np.float32,0x7c5654bf,0x42aa28ad,2
+np.float32,0x3fd9e423,0x3f8ffc32,2
+np.float32,0x7eec0439,0x42b1487b,2
+np.float32,0x3fc580f4,0x3f7ffb62,2
+np.float32,0x3fb0e316,0x3f592bbe,2
+np.float32,0x7c4cfb7d,0x42aa11d8,2
+np.float32,0x3faf9704,0x3f566e00,2
+np.float32,0x3fa7cf8a,0x3f45023d,2
+np.float32,0x7f7b724d,0x42b2cbcc,2
+np.float32,0x7f05bfe3,0x42b18897,2
+np.float32,0x3f90bde3,0x3f018bf3,2
+np.float32,0x7c565479,0x42aa28ad,2
+np.float32,0x3f94b517,0x3f0fb8e5,2
+np.float32,0x3fd6aadd,0x3f8d9e3c,2
+np.float32,0x7f09b37c,0x42b1977f,2
+np.float32,0x7f2b45ea,0x42b20734,2
+np.float32,0x3ff1d15e,0x3fa00fe9,2
+np.float32,0x3f99bce6,0x3f1fbd6c,2
+np.float32,0x7ecd1f76,0x42b100a7,2
+np.float32,0x7f443e2b,0x42b24ce2,2
+np.float32,0x7da7d6a5,0x42add428,2
+np.float32,0x7ebe0193,0x42b0d975,2
+np.float32,0x7ee13c43,0x42b1308b,2
+np.float32,0x3f8adf1b,0x3ed18e0c,2
+np.float32,0x7f76ce65,0x42b2c242,2
+np.float32,0x7e34f43d,0x42af5d92,2
+np.float32,0x7f306b76,0x42b2165d,2
+np.float32,0x7e1fd07f,0x42af1df7,2
+np.float32,0x3fab9a41,0x3f4db909,2
+np.float32,0x3fc23d1a,0x3f7a5803,2
+np.float32,0x3f8b7403,0x3ed70245,2
+np.float32,0x3f8c4dd6,0x3edebbae,2
+np.float32,0x3fe5f411,0x3f9864cd,2
+np.float32,0x3f88128b,0x3eb4e508,2
+np.float32,0x3fcb09de,0x3f84976f,2
+np.float32,0x7f32f2f5,0x42b21da6,2
+np.float32,0x3fe75610,0x3f9950f6,2
+np.float32,0x3f993edf,0x3f1e408d,2
+np.float32,0x3fc4a9d7,0x3f7e8be9,2
+np.float32,0x7f74551a,0x42b2bd1a,2
+np.float32,0x7de87129,0x42ae7ae2,2
+np.float32,0x7f18bbbd,0x42b1cc8c,2
+np.float32,0x7e7e1dd4,0x42b00b6c,2
+np.float32,0x3ff6e55b,0x3fa32f64,2
+np.float32,0x3fa634c8,0x3f412df3,2
+np.float32,0x3fd0fb7c,0x3f894e49,2
+np.float32,0x3ff4f6a6,0x3fa201d7,2
+np.float32,0x7f69d418,0x42b2a69a,2
+np.float32,0x7cb9632d,0x42ab414a,2
+np.float32,0x3fc57d36,0x3f7ff503,2
+np.float32,0x7e9e2ed7,0x42b07b9b,2
+np.float32,0x7f2e6868,0x42b2107d,2
+np.float32,0x3fa3169a,0x3f39785d,2
+np.float32,0x7f03cde0,0x42b18117,2
+np.float32,0x7f6d75d2,0x42b2ae7f,2
+np.float32,0x3ff483f2,0x3fa1bb75,2
+np.float32,0x7f1b39f7,0x42b1d4d6,2
+np.float32,0x3f8c7a7d,0x3ee0481e,2
+np.float32,0x3f989095,0x3f1c2b19,2
+np.float32,0x3fa4cbfd,0x3f3dbd87,2
+np.float32,0x7f75b00f,0x42b2bfef,2
+np.float32,0x3f940724,0x3f0d6756,2
+np.float32,0x7f5e5a1a,0x42b28cd6,2
+np.float32,0x800000,0xffc00000,2
+np.float32,0x7edd1d29,0x42b12716,2
+np.float32,0x3fa3e9e4,0x3f3b8c16,2
+np.float32,0x7e46d70e,0x42af8dd5,2
+np.float32,0x3f824745,0x3e40ec1e,2
+np.float32,0x3fd67623,0x3f8d770a,2
+np.float32,0x3fe9a6f3,0x3f9ad7fa,2
+np.float32,0x3fdda67c,0x3f92adc1,2
+np.float32,0x7ccb6c9a,0x42ab70d4,2
+np.float32,0x3ffd364a,0x3fa6f2fe,2
+np.float32,0x7e02424c,0x42aeb545,2
+np.float32,0x3fb6d2f2,0x3f6534a1,2
+np.float32,0x3fe1fe26,0x3f95b4cc,2
+np.float32,0x7e93ac57,0x42b05867,2
+np.float32,0x7f7b3433,0x42b2cb4d,2
+np.float32,0x3fb76803,0x3f66580d,2
+np.float32,0x3f9af881,0x3f23661b,2
+np.float32,0x3fd58062,0x3f8cbf98,2
+np.float32,0x80000000,0xffc00000,2
+np.float32,0x7f1af8f4,0x42b1d3ff,2
+np.float32,0x3fe66bba,0x3f98b4dc,2
+np.float32,0x7f6bd7bf,0x42b2aaff,2
+np.float32,0x3f84f79a,0x3e8e2e49,2
+np.float32,0x7e475b06,0x42af8f28,2
+np.float32,0x3faff89b,0x3f573d5e,2
+np.float32,0x7de5aa77,0x42ae74bb,2
+np.float32,0x3f8e9e42,0x3ef26cd2,2
+np.float32,0x3fb1cec3,0x3f5b1740,2
+np.float32,0x3f8890d6,0x3eba4821,2
+np.float32,0x3f9b39e9,0x3f242547,2
+np.float32,0x3fc895a4,0x3f829407,2
+np.float32,0x7f77943c,0x42b2c3dc,2
+np.float32,0x7f390d58,0x42b22ed2,2
+np.float32,0x3fe7e160,0x3f99ad58,2
+np.float32,0x3f93d2a0,0x3f0cb205,2
+np.float32,0x7f29499b,0x42b2013c,2
+np.float32,0x3f8c11b2,0x3edca10f,2
+np.float32,0x7e898ef8,0x42b03413,2
+np.float32,0x3fdff942,0x3f944f34,2
+np.float32,0x7f3d602f,0x42b23aa5,2
+np.float32,0x3f8a50f3,0x3ecc345b,2
+np.float32,0x3fa1f86d,0x3f369ce4,2
+np.float32,0x3f97ad95,0x3f19681d,2
+np.float32,0x3ffad1e0,0x3fa589e5,2
+np.float32,0x3fa70590,0x3f432311,2
+np.float32,0x7e6840cb,0x42afdd5c,2
+np.float32,0x3fd4036d,0x3f8ba0aa,2
+np.float32,0x7f7cc953,0x42b2ce84,2
+np.float32,0x7f228e1e,0x42b1ec74,2
+np.float32,0x7e37a866,0x42af652a,2
+np.float32,0x3fda22d0,0x3f9029a7,2
+np.float32,0x7f736bff,0x42b2bb31,2
+np.float32,0x3f9833b6,0x3f1b0b8e,2
+np.float32,0x7f466001,0x42b2526a,2
+np.float32,0xff7fffff,0xffc00000,2
+np.float32,0x7dd62bcd,0x42ae50f8,2
+np.float32,0x7f1d2bfe,0x42b1db36,2
+np.float32,0x7ecffe9e,0x42b107c5,2
+np.float32,0x7ebefe0a,0x42b0dc1b,2
+np.float32,0x7f45c63d,0x42b250dd,2
+np.float32,0x7f601af0,0x42b290db,2
+np.float32,0x3fcbb88a,0x3f8524e5,2
+np.float32,0x7ede55ff,0x42b129e8,2
+np.float32,0x7ea5dd5a,0x42b093e2,2
+np.float32,0x3ff53857,0x3fa22a12,2
+np.float32,0x3f8dbd6a,0x3eeb28a4,2
+np.float32,0x3fd1b467,0x3f89dd2c,2
+np.float32,0x3fe0423f,0x3f9481fc,2
+np.float32,0x3f84b421,0x3e8a6174,2
+np.float32,0x7f4efc97,0x42b2682c,2
+np.float32,0x7f601b33,0x42b290dc,2
+np.float32,0x3f94f240,0x3f108719,2
+np.float32,0x7decd251,0x42ae8471,2
+np.float32,0x3fdc457c,0x3f91b2e2,2
+np.float32,0x3f92a966,0x3f089c5a,2
+np.float32,0x3fc9732f,0x3f834afc,2
+np.float32,0x3f97948f,0x3f19194e,2
+np.float32,0x7f0824a1,0x42b191ac,2
+np.float32,0x7f0365a5,0x42b17f81,2
+np.float32,0x3f800000,0x0,2
+np.float32,0x7f0054c6,0x42b1736b,2
+np.float32,0x3fe86544,0x3f9a0484,2
+np.float32,0x7e95f844,0x42b0604e,2
+np.float32,0x3fce8602,0x3f8761e2,2
+np.float32,0x3fc726c8,0x3f81621d,2
+np.float32,0x3fcf6b03,0x3f88161b,2
+np.float32,0x3fceb843,0x3f87898a,2
+np.float32,0x3fe2f8b2,0x3f966071,2
+np.float32,0x7f3c8e7f,0x42b2386d,2
+np.float32,0x3fcee13a,0x3f87a9d2,2
+np.float32,0x3fc4df27,0x3f7ee73c,2
+np.float32,0x3ffde486,0x3fa758e3,2
+np.float32,0x3fa91be0,0x3f480b17,2
+np.float32,0x7f2a5a7d,0x42b20472,2
+np.float32,0x7e278d80,0x42af362d,2
+np.float32,0x3f96d091,0x3f16a9d5,2
+np.float32,0x7e925225,0x42b053b2,2
+np.float32,0x7f7ef83a,0x42b2d2ec,2
+np.float32,0x7eb4923a,0x42b0bf61,2
+np.float32,0x7e98bf19,0x42b069b3,2
+np.float32,0x3fac93a2,0x3f4fe410,2
+np.float32,0x7f46389c,0x42b25205,2
+np.float32,0x3f9fd447,0x3f30fd54,2
+np.float32,0x3fef42d4,0x3f9e7483,2
+np.float32,0x7f482174,0x42b256ed,2
+np.float32,0x3f97aedb,0x3f196c1e,2
+np.float32,0x7f764edd,0x42b2c13a,2
+np.float32,0x3f9117b5,0x3f02de5c,2
+np.float32,0x3fc7984e,0x3f81c12d,2
+np.float64,0x3ff1e2cb7463c597,0x3fdec6caf39e0c0e,2
+np.float64,0x3ffe4f89789c9f13,0x3ff40f4b1da0f3e9,2
+np.float64,0x7f6a5c9ac034b935,0x408605e51703c145,2
+np.float64,0x7fdcb6ece3b96dd9,0x40862d6521e16d60,2
+np.float64,0x3ff6563e182cac7c,0x3feb9d8210f3fa88,2
+np.float64,0x7fde32025f3c6404,0x40862dcc1d1a9b7f,2
+np.float64,0x7fd755ed35aeabd9,0x40862bbc5522b779,2
+np.float64,0x3ff5c81f4bcb903e,0x3fea71f10b954ea3,2
+np.float64,0x3fffe805d35fd00c,0x3ff50463a1ba2938,2
+np.float64,0x7fd045a1c1a08b43,0x408628d9f431f2f5,2
+np.float64,0x3ff49f7dd9893efc,0x3fe7c6736e17ea8e,2
+np.float64,0x7fccfbc1fd39f783,0x408627eca79acf51,2
+np.float64,0x3ff1af0a00035e14,0x3fdd1c0e7d5706ea,2
+np.float64,0x7fe7bd17162f7a2d,0x4086316af683502b,2
+np.float64,0x3ff0941b8d012837,0x3fd128d274065ac0,2
+np.float64,0x3ffa0c5d98b418bb,0x3ff11af9c8edd17f,2
+np.float64,0x3ffad9733355b2e6,0x3ff1b6d1307acb42,2
+np.float64,0x3ffabb2a33d57654,0x3ff1a0442b034e50,2
+np.float64,0x3ff36118b0c6c231,0x3fe472b7dfb23516,2
+np.float64,0x3ff2441d3664883a,0x3fe0d61145608f0c,2
+np.float64,0x7fe039862d20730b,0x40862e5f8ed752d3,2
+np.float64,0x7fb1dde24023bbc4,0x40861e824cdb0664,2
+np.float64,0x7face6335839cc66,0x40861ccf90a26e16,2
+np.float64,0x3ffb5d0e1af6ba1c,0x3ff2170f6f42fafe,2
+np.float64,0x3ff5c2c6a50b858d,0x3fea665aabf04407,2
+np.float64,0x3ffabb409db57681,0x3ff1a054ea32bfc3,2
+np.float64,0x3ff1e054e983c0aa,0x3fdeb30c17286cb6,2
+np.float64,0x7fe467f73268cfed,0x4086303529e52e9b,2
+np.float64,0x7fe0e86bf961d0d7,0x40862eb40788b04a,2
+np.float64,0x3ffb743542f6e86a,0x3ff227b4ea5acee0,2
+np.float64,0x3ff2de6826e5bcd0,0x3fe2e31fcde0a96c,2
+np.float64,0x7fd6b27ccfad64f9,0x40862b8385697c31,2
+np.float64,0x7fe0918e8d21231c,0x40862e8a82d9517a,2
+np.float64,0x7fd0ca0395a19406,0x4086291a0696ed33,2
+np.float64,0x3ffb042496960849,0x3ff1d658c928abfc,2
+np.float64,0x3ffcd0409799a081,0x3ff31877df0cb245,2
+np.float64,0x7fe429bd06685379,0x4086301c9f259934,2
+np.float64,0x3ff933076092660f,0x3ff06d2e5f4d9ab7,2
+np.float64,0x7feaefcb28f5df95,0x4086326dccf88e6f,2
+np.float64,0x7fb5f2c1f82be583,0x40862027ac02a39d,2
+np.float64,0x3ffb5d9e3bd6bb3c,0x3ff21777501d097e,2
+np.float64,0x10000000000000,0xfff8000000000000,2
+np.float64,0x3ff70361596e06c3,0x3fecf675ceda7e19,2
+np.float64,0x3ff71a21b5ee3444,0x3fed224fa048d9a9,2
+np.float64,0x3ffb102b86762057,0x3ff1df2cc9390518,2
+np.float64,0x7feaaeb35c355d66,0x4086325a60704a90,2
+np.float64,0x7fd9a3d0a93347a0,0x40862c7d300fc076,2
+np.float64,0x7fabcf159c379e2a,0x40861c80cdbbff27,2
+np.float64,0x7fd1c066ec2380cd,0x4086298c3006fee6,2
+np.float64,0x3ff3d5ae2d67ab5c,0x3fe5bc16447428db,2
+np.float64,0x3ff4b76add696ed6,0x3fe800f5bbf21376,2
+np.float64,0x3ff60d89ee0c1b14,0x3feb063fdebe1a68,2
+np.float64,0x7f1d2648003a4c8f,0x4085eaf9238af95a,2
+np.float64,0x7fe8b45f6df168be,0x408631bca5abf6d6,2
+np.float64,0x7fe9ea5308f3d4a5,0x4086321ea2bd3af9,2
+np.float64,0x7fcb6ba5a636d74a,0x4086277b208075ed,2
+np.float64,0x3ff621cfd74c43a0,0x3feb30d59baf5919,2
+np.float64,0x3ff7bc8ca0af7919,0x3fee524da8032896,2
+np.float64,0x7fda22dd0c3445b9,0x40862ca47326d063,2
+np.float64,0x7fd02ed4b2a05da8,0x408628ceb6919421,2
+np.float64,0x3ffe64309fdcc861,0x3ff41c1b18940709,2
+np.float64,0x3ffee4042abdc808,0x3ff46a6005bccb41,2
+np.float64,0x3ff078145b00f029,0x3fceeb3d6bfae0eb,2
+np.float64,0x7fda20fd20b441f9,0x40862ca3e03b990b,2
+np.float64,0x3ffa9e9e9af53d3d,0x3ff18ade3cbee789,2
+np.float64,0x3ff0a1062501420c,0x3fd1e32de6d18c0d,2
+np.float64,0x3ff3bdf118477be2,0x3fe57ad89b7fdf8b,2
+np.float64,0x3ff101c0d5c20382,0x3fd6965d3539be47,2
+np.float64,0x7feba3b53b774769,0x408632a28c7aca4d,2
+np.float64,0x3ff598db5d4b31b7,0x3fea0aa65c0b421a,2
+np.float64,0x3ff5fdfbb72bfbf8,0x3feae55accde4a5e,2
+np.float64,0x7fe5bae53aab75c9,0x408630b5e7a5b92a,2
+np.float64,0x3ff8f668afd1ecd2,0x3ff03af686666c9c,2
+np.float64,0x3ff5ba72dd2b74e6,0x3fea5441f223c093,2
+np.float64,0x3ff8498147109302,0x3fef4e45d501601d,2
+np.float64,0x7feddcfa5efbb9f4,0x4086334106a6e76b,2
+np.float64,0x7fd1a30200234603,0x4086297ee5cc562c,2
+np.float64,0x3ffffa8ee07ff51e,0x3ff50f1dc46f1303,2
+np.float64,0x7fef7ed00ebefd9f,0x408633ae01dabe52,2
+np.float64,0x3ffb6e062276dc0c,0x3ff22344c58c2016,2
+np.float64,0x7fcf2b59943e56b2,0x4086288190dd5eeb,2
+np.float64,0x3ffa589f9254b13f,0x3ff155cc081eee0b,2
+np.float64,0x3ff05415ca60a82c,0x3fc9e45565baef0a,2
+np.float64,0x7feb34bed576697d,0x408632822d5a178c,2
+np.float64,0x3ff3993845c73270,0x3fe51423baf246c3,2
+np.float64,0x3ff88367aaf106d0,0x3fefb2d9ca9f1192,2
+np.float64,0x7fef364304fe6c85,0x4086339b7ed82997,2
+np.float64,0x7fcba2c317374585,0x4086278b24e42934,2
+np.float64,0x3ff1aef885e35df1,0x3fdd1b79f55b20c0,2
+np.float64,0x7fe19367886326ce,0x40862f035f867445,2
+np.float64,0x3ff3c8295e279053,0x3fe5970aa670d32e,2
+np.float64,0x3ff6edda164ddbb4,0x3feccca9eb59d6b9,2
+np.float64,0x7fdeaea940bd5d52,0x40862dece02d151b,2
+np.float64,0x7fea9d6324353ac5,0x408632552ddf0d4f,2
+np.float64,0x7fe60e39e66c1c73,0x408630d45b1ad0c4,2
+np.float64,0x7fde06325abc0c64,0x40862dc07910038c,2
+np.float64,0x7f9ec89d303d9139,0x408617c55ea4c576,2
+np.float64,0x3ff9801930530032,0x3ff0abe5be046051,2
+np.float64,0x3ff4d5859689ab0b,0x3fe849a7f7a19fa3,2
+np.float64,0x3ff38afbc48715f8,0x3fe4ebb7710cbab9,2
+np.float64,0x3ffd88a0e77b1142,0x3ff3916964407e21,2
+np.float64,0x1,0xfff8000000000000,2
+np.float64,0x3ff5db59e58bb6b4,0x3fea9b6b5ccc116f,2
+np.float64,0x3ffd4b05b15a960c,0x3ff369792f661a90,2
+np.float64,0x7fdcebc4fb39d789,0x40862d73cd623378,2
+np.float64,0x3ff5b56f944b6adf,0x3fea4955d6b06ca3,2
+np.float64,0x7fd4e4abf2a9c957,0x40862ad9e9da3c61,2
+np.float64,0x7fe08e0d6aa11c1a,0x40862e88d17ef277,2
+np.float64,0x3ff0dfc97da1bf93,0x3fd50f9004136d8f,2
+np.float64,0x7fdec38eaebd871c,0x40862df2511e26b4,2
+np.float64,0x7ff8000000000000,0x7ff8000000000000,2
+np.float64,0x3ff21865504430cb,0x3fe033fe3cf3947a,2
+np.float64,0x7fdc139708b8272d,0x40862d371cfbad03,2
+np.float64,0x7fe1fe3be3a3fc77,0x40862f336e3ba63a,2
+np.float64,0x7fd9fa2493b3f448,0x40862c97f2960be9,2
+np.float64,0x3ff0a027db414050,0x3fd1d6e54a707c87,2
+np.float64,0x3ff568b16f4ad163,0x3fe99f5c6d7b6e18,2
+np.float64,0x3ffe2f82877c5f05,0x3ff3fb54bd0da753,2
+np.float64,0x7fbaf5778435eaee,0x408621ccc9e2c1be,2
+np.float64,0x7fc5aaf8362b55ef,0x40862598e7072a49,2
+np.float64,0x7fe0ebfdd4a1d7fb,0x40862eb5b7bf99d5,2
+np.float64,0x7fd8efeb5931dfd6,0x40862c444636f408,2
+np.float64,0x3ff361a308c6c346,0x3fe4744cae63e6df,2
+np.float64,0x7fef287d39be50f9,0x40863397f65c807e,2
+np.float64,0x7fe72c4a14ae5893,0x4086313992e52082,2
+np.float64,0x3ffd1be44cba37c8,0x3ff34a9a45239eb9,2
+np.float64,0x3ff50369c18a06d4,0x3fe8b69319f091f1,2
+np.float64,0x3ffb333c25766678,0x3ff1f8c78eeb28f1,2
+np.float64,0x7fe12050416240a0,0x40862ece4e2f2f24,2
+np.float64,0x7fe348f5526691ea,0x40862fc16fbe7b6c,2
+np.float64,0x3ff343cc4d068799,0x3fe41c2a30cab7d2,2
+np.float64,0x7fd1b0daaa2361b4,0x408629852b3104ff,2
+np.float64,0x3ff6a41f37ad483e,0x3fec3b36ee6c6d4a,2
+np.float64,0x3ffad9439435b287,0x3ff1b6add9a1b3d7,2
+np.float64,0x7fbeb9a2f23d7345,0x408622d89ac1eaba,2
+np.float64,0x3ffab3d39fb567a7,0x3ff19ac75b4427f3,2
+np.float64,0x3ff890003ed12000,0x3fefc8844471c6ad,2
+np.float64,0x3ffc9f595e593eb2,0x3ff2f7a8699f06d8,2
+np.float64,0x7fe2224ef6e4449d,0x40862f43684a154a,2
+np.float64,0x3ffa67ba08d4cf74,0x3ff161525778df99,2
+np.float64,0x7fe87e24b570fc48,0x408631ab02b159fb,2
+np.float64,0x7fd6e99be92dd337,0x40862b96dba73685,2
+np.float64,0x7fe90f39fdf21e73,0x408631d9dbd36c1e,2
+np.float64,0x3ffb7806abd6f00e,0x3ff22a719b0f4c46,2
+np.float64,0x3ffa511ba3d4a238,0x3ff1500c124f6e17,2
+np.float64,0x3ff5d7a569abaf4b,0x3fea937391c280e8,2
+np.float64,0x7fc4279d20284f39,0x40862504a5cdcb96,2
+np.float64,0x3ffe8791b1fd0f24,0x3ff431f1ed7eaba0,2
+np.float64,0x7fe3b2f5276765e9,0x40862fecf15e2535,2
+np.float64,0x7feeab0e7abd561c,0x408633778044cfbc,2
+np.float64,0x7fdba88531375109,0x40862d1860306d7a,2
+np.float64,0x7fe7b19b3def6335,0x4086316716d6890b,2
+np.float64,0x3ff9e9437413d287,0x3ff0ff89431c748c,2
+np.float64,0x3ff960716a52c0e3,0x3ff092498028f802,2
+np.float64,0x3ff271bf56a4e37f,0x3fe1786fc8dd775d,2
+np.float64,0x3fff2a6578be54cb,0x3ff494bbe303eeb5,2
+np.float64,0x3ffd842eb5fb085e,0x3ff38e8b7ba42bc5,2
+np.float64,0x3ff91600e5d22c02,0x3ff0553c6a6b3d93,2
+np.float64,0x3ff9153f45f22a7e,0x3ff0549c0eaecf95,2
+np.float64,0x7fe0ab319da15662,0x40862e96da3b19f9,2
+np.float64,0x3ff06acd1f60d59a,0x3fcd2aca543d2772,2
+np.float64,0x3ffb3e7a54d67cf4,0x3ff200f288cd391b,2
+np.float64,0x3ffd01356f1a026b,0x3ff339003462a56c,2
+np.float64,0x3ffacd35def59a6c,0x3ff1adb8d32b3ec0,2
+np.float64,0x3ff6f953264df2a6,0x3fece2f992948d6e,2
+np.float64,0x3ff0fa91f5a1f524,0x3fd64609a28f1590,2
+np.float64,0x7fd1b7610ca36ec1,0x408629881e03dc7d,2
+np.float64,0x3ff4317fb7c86300,0x3fe6b086ed265887,2
+np.float64,0x3ff3856198070ac3,0x3fe4dbb6bc88b9e3,2
+np.float64,0x7fed7fc4573aff88,0x40863327e7013a81,2
+np.float64,0x3ffe53cbbf5ca798,0x3ff411f07a29b1f4,2
+np.float64,0x3ff092195b012433,0x3fd10b1c0b4b14fe,2
+np.float64,0x3ff1a3171163462e,0x3fdcb5c301d5d40d,2
+np.float64,0x3ffa1401f1742804,0x3ff120eb319e9faa,2
+np.float64,0x7fd352f6f426a5ed,0x40862a3a048feb6d,2
+np.float64,0x7fd4ee246fa9dc48,0x40862add895d808f,2
+np.float64,0x3ff0675cfa00ceba,0x3fccb2222c5493ca,2
+np.float64,0x3ffe5cb38f3cb967,0x3ff417773483d161,2
+np.float64,0x7fe11469ea2228d3,0x40862ec8bd3e497f,2
+np.float64,0x3fff13cba67e2798,0x3ff4872fe2c26104,2
+np.float64,0x3ffb73d3d316e7a8,0x3ff2276f08612ea2,2
+np.float64,0x7febfb70f237f6e1,0x408632bbc9450721,2
+np.float64,0x3ff84a0d87b0941b,0x3fef4f3b707e3145,2
+np.float64,0x7fd71fd5082e3fa9,0x40862ba9b4091172,2
+np.float64,0x3ff560737d8ac0e7,0x3fe98cc9c9ba2f61,2
+np.float64,0x3ff46a266ae8d44d,0x3fe74190e5234822,2
+np.float64,0x7fe8cc9225719923,0x408631c477db9708,2
+np.float64,0x3ff871de5930e3bc,0x3fef948f7d00fbef,2
+np.float64,0x3ffd0bc7895a178f,0x3ff33ffc18357721,2
+np.float64,0x3ff66099f9ccc134,0x3febb2bc775b4720,2
+np.float64,0x7fe91f1be9723e37,0x408631deec3a5c9e,2
+np.float64,0x7fd60462f12c08c5,0x40862b4537e1c1c6,2
+np.float64,0x3ff053100ba0a620,0x3fc9bc0c21e2284f,2
+np.float64,0x7fd864c611b0c98b,0x40862c1724506255,2
+np.float64,0x7fd191decb2323bd,0x408629771bfb68cc,2
+np.float64,0x3ff792a1656f2543,0x3fee054f2e135fcf,2
+np.float64,0x7fd03625cea06c4b,0x408628d253b840e3,2
+np.float64,0x7fc3967716272ced,0x408624ca35451042,2
+np.float64,0x7fe6636cb32cc6d8,0x408630f3073a22a7,2
+np.float64,0x3ffc2d3976585a73,0x3ff2a9d4c0dae607,2
+np.float64,0x3fffd10ee79fa21e,0x3ff4f70db69888be,2
+np.float64,0x3ff1d4fcae23a9f9,0x3fde57675007b23c,2
+np.float64,0x3ffa5da19e14bb43,0x3ff1599f74d1c113,2
+np.float64,0x3ff7f4eb0d6fe9d6,0x3feeb85189659e99,2
+np.float64,0x7fbcca44d8399489,0x408622536234f7c1,2
+np.float64,0x7fef5f97ec3ebf2f,0x408633a60fdde0d7,2
+np.float64,0x7fde4a66da3c94cd,0x40862dd290ebc184,2
+np.float64,0x3ff072957a40e52b,0x3fce34d913d87613,2
+np.float64,0x3ff2bc4c9dc57899,0x3fe27497e6ebe27d,2
+np.float64,0x7fd7d152b4afa2a4,0x40862be63469eecd,2
+np.float64,0x3ff957d768f2afaf,0x3ff08b4ad8062a73,2
+np.float64,0x7fe4bc5f45a978be,0x40863055fd66e4eb,2
+np.float64,0x7fc90de345321bc6,0x408626c24ce7e370,2
+np.float64,0x3ff2d7a37d85af47,0x3fe2cd6a40b544a0,2
+np.float64,0x7fe536ea1f6a6dd3,0x40863084bade76a3,2
+np.float64,0x3fff970c9cdf2e19,0x3ff4d524572356dd,2
+np.float64,0x3ffe173ae63c2e76,0x3ff3ec1ee35ad28c,2
+np.float64,0x3ff714025cce2805,0x3fed168aedff4a2b,2
+np.float64,0x7fce7b414c3cf682,0x40862853dcdd19d4,2
+np.float64,0x3ff019623f2032c4,0x3fbc7c602df0bbaf,2
+np.float64,0x3ff72f57fd0e5eb0,0x3fed4ae75f697432,2
+np.float64,0x3ff283778e8506ef,0x3fe1b5c5725b0dfd,2
+np.float64,0x3ff685a29aed0b45,0x3febfdfdedd581e2,2
+np.float64,0x3ff942d24fb285a4,0x3ff07a224c3ecfaf,2
+np.float64,0x3ff2e4a9f465c954,0x3fe2f71905399e8f,2
+np.float64,0x7fdfa1c7fa3f438f,0x40862e2b4e06f098,2
+np.float64,0x3ff49b59c26936b4,0x3fe7bc41c8c1e59d,2
+np.float64,0x3ff2102d3704205a,0x3fe014bf7e28924e,2
+np.float64,0x3ff88de3b8311bc8,0x3fefc4e3e0a15a89,2
+np.float64,0x7fea5ba25374b744,0x40863241519c9b66,2
+np.float64,0x3fffe5df637fcbbf,0x3ff5032488f570f9,2
+np.float64,0x7fe67cfefe6cf9fd,0x408630fc25333cb4,2
+np.float64,0x3ff090bf2b01217e,0x3fd0f6fcf1092b4a,2
+np.float64,0x7fecd75bc5f9aeb7,0x408632f9b6c2e013,2
+np.float64,0x7fe15df38c62bbe6,0x40862eeae5ac944b,2
+np.float64,0x3ff4757875a8eaf1,0x3fe75e0eafbe28ce,2
+np.float64,0x7fecca8a51b99514,0x408632f627c23923,2
+np.float64,0x3ff91ca529d2394a,0x3ff05abb327fd1ca,2
+np.float64,0x3ffb962993b72c53,0x3ff23ff831717579,2
+np.float64,0x3ffd548a2c7aa914,0x3ff36fac7f56d716,2
+np.float64,0x7fbafb5cb035f6b8,0x408621ce898a02fb,2
+np.float64,0x3ff1d86daca3b0db,0x3fde73536c29218c,2
+np.float64,0x7fa8d0f8f431a1f1,0x40861b97a03c3a18,2
+np.float64,0x3ff44f1067489e21,0x3fe6fcbd8144ab2a,2
+np.float64,0x7fec062b07380c55,0x408632bed9c6ce85,2
+np.float64,0x3ff7e11e0fcfc23c,0x3fee94ada7efaac4,2
+np.float64,0x7fe77505c1aeea0b,0x4086315287dda0ba,2
+np.float64,0x7fc465af2728cb5d,0x4086251d236107f7,2
+np.float64,0x3ffe811c4a7d0238,0x3ff42df7e8b6cf2d,2
+np.float64,0x7fe05a471260b48d,0x40862e6fa502738b,2
+np.float64,0x7fec32cd9778659a,0x408632cb8d98c5a3,2
+np.float64,0x7fd203a220a40743,0x408629aa43b010c0,2
+np.float64,0x7fed71f7d17ae3ef,0x4086332428207101,2
+np.float64,0x3ff3918999e72313,0x3fe4fe5e8991402f,2
+np.float64,0x3ff3ecae38c7d95c,0x3fe5fa787d887981,2
+np.float64,0x7fd65345b82ca68a,0x40862b61aed8c64e,2
+np.float64,0x3ff1efdd01c3dfba,0x3fdf2eae36139204,2
+np.float64,0x3ffba9344f375268,0x3ff24d7fdcfc313b,2
+np.float64,0x7fd0469b35208d35,0x408628da6ed24bdd,2
+np.float64,0x7fe525782daa4aef,0x4086307e240c8b30,2
+np.float64,0x3ff8e473d371c8e8,0x3ff02beebd4171c7,2
+np.float64,0x3ff59a43898b3487,0x3fea0dc0a6acea0a,2
+np.float64,0x7fef50c7263ea18d,0x408633a247d7cd42,2
+np.float64,0x7fe8b5a301f16b45,0x408631bd0e71c855,2
+np.float64,0x3ff209369de4126d,0x3fdff4264334446b,2
+np.float64,0x3ffbe2ff4437c5fe,0x3ff2763b356814c7,2
+np.float64,0x3ff55938156ab270,0x3fe97c70514f91bf,2
+np.float64,0x3fff5d8bf81ebb18,0x3ff4b333b230672a,2
+np.float64,0x3ff16a317bc2d463,0x3fdab84e7faa468f,2
+np.float64,0x3ff7e64f8dafcc9f,0x3fee9e0bd57e9566,2
+np.float64,0x7fef4dc065be9b80,0x408633a181e25abb,2
+np.float64,0x3ff64a24a62c9449,0x3feb849ced76437e,2
+np.float64,0x7fc3cb85ef27970b,0x408624dfc39c8f74,2
+np.float64,0x7fec2162a77842c4,0x408632c69b0d43b6,2
+np.float64,0x7feccee6dc399dcd,0x408632f75de98c46,2
+np.float64,0x7faff4f5f43fe9eb,0x40861d9d89be14c9,2
+np.float64,0x7fee82df60fd05be,0x4086336cfdeb7317,2
+np.float64,0x3ffe54588d9ca8b1,0x3ff41247eb2f75ca,2
+np.float64,0x3ffe5615b55cac2c,0x3ff4135c4eb11620,2
+np.float64,0x3ffdaf9a6a1b5f35,0x3ff3aa70e50d1692,2
+np.float64,0x3ff69c045f4d3809,0x3fec2b00734e2cde,2
+np.float64,0x7fd049239aa09246,0x408628dbad6dd995,2
+np.float64,0x3ff2acbe8465597d,0x3fe24138652195e1,2
+np.float64,0x3ffb288302365106,0x3ff1f0f86ca7e5d1,2
+np.float64,0x3fff6fe8d87edfd2,0x3ff4be136acf53c5,2
+np.float64,0x3ffc87c8bfb90f92,0x3ff2e7bbd65867cb,2
+np.float64,0x3ff173327ca2e665,0x3fdb0b945abb00d7,2
+np.float64,0x3ff9a5cf7a134b9f,0x3ff0ca2450f07c78,2
+np.float64,0x7faf782b043ef055,0x40861d7e0e9b35ef,2
+np.float64,0x3ffa0874975410e9,0x3ff117ee3dc8f5ba,2
+np.float64,0x7fc710fc7f2e21f8,0x40862618fed167fb,2
+np.float64,0x7feb73f4c876e7e9,0x40863294ae3ac1eb,2
+np.float64,0x8000000000000000,0xfff8000000000000,2
+np.float64,0x7fb46615c028cc2b,0x40861f91bade4dad,2
+np.float64,0x7fc26b064624d60c,0x4086244c1b76c938,2
+np.float64,0x3ff06ab9fa40d574,0x3fcd282fd971d1b4,2
+np.float64,0x3ff61da7410c3b4e,0x3feb28201031af02,2
+np.float64,0x3ffec7ba1b9d8f74,0x3ff459342511f952,2
+np.float64,0x7ff4000000000000,0x7ffc000000000000,2
+np.float64,0x7fe5d570422baae0,0x408630bfa75008c9,2
+np.float64,0x3ffa895832f512b0,0x3ff17ad41555dccb,2
+np.float64,0x7fd343ac21a68757,0x40862a33ad59947a,2
+np.float64,0x3ffc1eeb37383dd6,0x3ff29ff29e55a006,2
+np.float64,0x7fee3c5c507c78b8,0x4086335a6b768090,2
+np.float64,0x7fe96d774a32daee,0x408631f7b9937e36,2
+np.float64,0x7fb878362430f06b,0x40862106603497b6,2
+np.float64,0x7fec0a79c03814f3,0x408632c01479905e,2
+np.float64,0x3ffa2f143c145e28,0x3ff135e25d902e1a,2
+np.float64,0x3ff14ccff80299a0,0x3fd9a0cd3397b14c,2
+np.float64,0x3ff97980dcb2f302,0x3ff0a6942a8133ab,2
+np.float64,0x3ff872e2d1f0e5c6,0x3fef96526eb2f756,2
+np.float64,0x7fdf1c9b46be3936,0x40862e0957fee329,2
+np.float64,0x7fcab6525d356ca4,0x408627458791f029,2
+np.float64,0x3ff964e74a52c9ce,0x3ff095e8845d523c,2
+np.float64,0x3ffb3aa23c967544,0x3ff1fe282d897c13,2
+np.float64,0x7fdd8a36afbb146c,0x40862d9f2b05f61b,2
+np.float64,0x3ffea39f42fd473e,0x3ff4432a48176399,2
+np.float64,0x7fea614f68b4c29e,0x408632430a750385,2
+np.float64,0x7feeafb86abd5f70,0x40863378b79f70cf,2
+np.float64,0x3ff80bc94eb01792,0x3feee138e9d626bd,2
+np.float64,0x7fcaca74743594e8,0x4086274b8ce4d1e1,2
+np.float64,0x3ff8b14815316290,0x3ff000b3526c8321,2
+np.float64,0x7fc698eb5f2d31d6,0x408625eeec86cd2b,2
+np.float64,0x7fe15429a3e2a852,0x40862ee6621205b8,2
+np.float64,0x7fee37f81b7c6fef,0x4086335941ed80dd,2
+np.float64,0x3ff8097ab3f012f6,0x3feedd1bafc3196e,2
+np.float64,0x7fe7c889ceaf9113,0x4086316ed13f2394,2
+np.float64,0x7fceca94513d9528,0x4086286893a06824,2
+np.float64,0x3ff593a103cb2742,0x3fe9ff1af4f63cc9,2
+np.float64,0x7fee237d24bc46f9,0x40863353d4142c87,2
+np.float64,0x3ffbf71e4777ee3c,0x3ff2844c0ed9f4d9,2
+np.float64,0x3ff490c65c09218d,0x3fe7a2216d9f69fd,2
+np.float64,0x3fff5ceaf1feb9d6,0x3ff4b2d430a90110,2
+np.float64,0x3ff55baecceab75e,0x3fe98203980666c4,2
+np.float64,0x3ff511bc306a2378,0x3fe8d81ce7be7b50,2
+np.float64,0x3ff38f83dcc71f08,0x3fe4f89f130d5f87,2
+np.float64,0x3ff73a3676ee746d,0x3fed5f98a65107ee,2
+np.float64,0x7fc27e50c824fca1,0x408624547828bc49,2
+np.float64,0xfff0000000000000,0xfff8000000000000,2
+np.float64,0x3fff38959ebe712b,0x3ff49d362c7ba16a,2
+np.float64,0x3ffad6d23a75ada4,0x3ff1b4dda6394ed0,2
+np.float64,0x3ffe77c6c2dcef8e,0x3ff4283698835ecb,2
+np.float64,0x3fff5feb413ebfd6,0x3ff4b49bcbdb3aa9,2
+np.float64,0x3ff0d30aa161a615,0x3fd4751bcdd7d727,2
+np.float64,0x3ff51e07e00a3c10,0x3fe8f4bd1408d694,2
+np.float64,0x8010000000000000,0xfff8000000000000,2
+np.float64,0x7fd231d2fe2463a5,0x408629beaceafcba,2
+np.float64,0x3fff6b4aee1ed696,0x3ff4bb58544bf8eb,2
+np.float64,0x3ff91fcd2f323f9a,0x3ff05d56e33db6b3,2
+np.float64,0x3ff3b889ab477113,0x3fe56bdeab74cce5,2
+np.float64,0x3ff99bfe30d337fc,0x3ff0c24bbf265561,2
+np.float64,0x3ffbe9e5eaf7d3cc,0x3ff27b0fe60f827a,2
+np.float64,0x7fd65678e92cacf1,0x40862b62d44fe8b6,2
+np.float64,0x7fd9cc477233988e,0x40862c89c638ee48,2
+np.float64,0x3ffc123c72d82479,0x3ff297294d05cbc0,2
+np.float64,0x3ff58abad58b1576,0x3fe9eb65da2a867a,2
+np.float64,0x7fe534887b2a6910,0x40863083d4ec2877,2
+np.float64,0x7fe1d3dcb123a7b8,0x40862f208116c55e,2
+np.float64,0x7fd4d570dba9aae1,0x40862ad412c413cd,2
+np.float64,0x3fffce7d3fdf9cfa,0x3ff4f58f02451928,2
+np.float64,0x3ffa76901c74ed20,0x3ff16c9a5851539c,2
+np.float64,0x7fdd88ffa23b11fe,0x40862d9ed6c6f426,2
+np.float64,0x3ff09fdbb9e13fb7,0x3fd1d2ae4fcbf713,2
+np.float64,0x7fe64567772c8ace,0x408630e845dbc290,2
+np.float64,0x7fb1a849ba235092,0x40861e6a291535b2,2
+np.float64,0x3ffaddb105f5bb62,0x3ff1b9f68f4c419b,2
+np.float64,0x7fd2fc3d5025f87a,0x40862a15cbc1df75,2
+np.float64,0x7fdea7d872bd4fb0,0x40862deb190b2c50,2
+np.float64,0x7fd50ea97eaa1d52,0x40862ae9edc4c812,2
+np.float64,0x3fff659c245ecb38,0x3ff4b7fb18b31aea,2
+np.float64,0x3ff3f1fbb7c7e3f7,0x3fe608bd9d76268c,2
+np.float64,0x3ff76869d9aed0d4,0x3fedb6c23d3a317b,2
+np.float64,0x7fedd4efe93ba9df,0x4086333edeecaa43,2
+np.float64,0x3ff9a5bd4eb34b7a,0x3ff0ca15d02bc960,2
+np.float64,0x3ffd9359cc5b26b4,0x3ff39850cb1a6b6c,2
+np.float64,0x7fe912d0427225a0,0x408631db00e46272,2
+np.float64,0x3ffb3802fe567006,0x3ff1fc4093646465,2
+np.float64,0x3ff02cc38a205987,0x3fc2e8182802a07b,2
+np.float64,0x3ffda953dd1b52a8,0x3ff3a66c504cf207,2
+np.float64,0x7fe0a487e4a1490f,0x40862e93a6f20152,2
+np.float64,0x7fed265ed1fa4cbd,0x4086330f838ae431,2
+np.float64,0x7fd0000114200001,0x408628b76ec48b5c,2
+np.float64,0x3ff2c262786584c5,0x3fe288860d354b0f,2
+np.float64,0x8000000000000001,0xfff8000000000000,2
+np.float64,0x3ffdae9f075b5d3e,0x3ff3a9d006ae55c1,2
+np.float64,0x3ffb69c72156d38e,0x3ff22037cbb85e5b,2
+np.float64,0x7feeae255f7d5c4a,0x408633784e89bc05,2
+np.float64,0x7feb13927c362724,0x408632786630c55d,2
+np.float64,0x7fef49e072be93c0,0x408633a08451d476,2
+np.float64,0x3fff23d6337e47ac,0x3ff490ceb6e634ae,2
+np.float64,0x3ffba82cf8f7505a,0x3ff24cc51c73234d,2
+np.float64,0x7fe948719ef290e2,0x408631ec0b36476e,2
+np.float64,0x3ff41926c5e8324e,0x3fe670e14bbda8cd,2
+np.float64,0x3ff91f09c1523e14,0x3ff05cb5731878da,2
+np.float64,0x3ff6ae6afccd5cd6,0x3fec4fbeca764086,2
+np.float64,0x3ff927f7e0f24ff0,0x3ff06413eeb8eb1e,2
+np.float64,0x3ff19dd2b9e33ba5,0x3fdc882f97994600,2
+np.float64,0x7fe8e502c5b1ca05,0x408631cc56526fff,2
+np.float64,0x7feb49f70fb693ed,0x4086328868486fcd,2
+np.float64,0x3ffd942d535b285a,0x3ff398d8d89f52ca,2
+np.float64,0x7fc3b9c5c627738b,0x408624d893e692ca,2
+np.float64,0x7fea0780ff340f01,0x408632279fa46704,2
+np.float64,0x7fe4c90066a99200,0x4086305adb47a598,2
+np.float64,0x7fdb209113364121,0x40862cf0ab64fd7d,2
+np.float64,0x3ff38617e5470c30,0x3fe4ddc0413b524f,2
+np.float64,0x7fea1b5b803436b6,0x4086322db767f091,2
+np.float64,0x7fe2004898e40090,0x40862f3457795dc5,2
+np.float64,0x3ff3c4360ac7886c,0x3fe58c29843a4c75,2
+np.float64,0x3ff504bc168a0978,0x3fe8b9ada7f698e6,2
+np.float64,0x3ffd3e936fda7d27,0x3ff3615912c5b4ac,2
+np.float64,0x3ffbdc52fb97b8a6,0x3ff2718dae5f1f2b,2
+np.float64,0x3fffef6d84ffdedb,0x3ff508adbc8556cf,2
+np.float64,0x3ff23b65272476ca,0x3fe0b646ed2579eb,2
+np.float64,0x7fe4633068a8c660,0x408630334a4b7ff7,2
+np.float64,0x3ff769b754aed36f,0x3fedb932af0223f9,2
+np.float64,0x7fe7482d92ee905a,0x408631432de1b057,2
+np.float64,0x3ff5dd682aabbad0,0x3fea9fd5e506a86d,2
+np.float64,0x7fd68399a2ad0732,0x40862b72ed89805d,2
+np.float64,0x3ffad7acc3d5af5a,0x3ff1b57fe632c948,2
+np.float64,0x3ffc68e43698d1c8,0x3ff2d2be6f758761,2
+np.float64,0x3ff4e517fbc9ca30,0x3fe86eddf5e63a58,2
+np.float64,0x3ff34c63c56698c8,0x3fe435b74ccd6a13,2
+np.float64,0x7fea9456c17528ad,0x4086325275237015,2
+np.float64,0x7fee6573f2fccae7,0x4086336543760346,2
+np.float64,0x7fd5496fb9aa92de,0x40862b0023235667,2
+np.float64,0x7ff0000000000000,0x7ff0000000000000,2
+np.float64,0x3ffb70e31256e1c6,0x3ff22552f54b13e0,2
+np.float64,0x3ff66a33988cd467,0x3febc656da46a1ca,2
+np.float64,0x3fff0af2eb1e15e6,0x3ff481dec325f5c8,2
+np.float64,0x3ff6a0233d0d4046,0x3fec33400958eda1,2
+np.float64,0x7fdb11e2d5b623c5,0x40862cec55e405f9,2
+np.float64,0x3ffb8a015ad71402,0x3ff2374d7b563a72,2
+np.float64,0x3ff1807d8ce300fb,0x3fdb849e4bce8335,2
+np.float64,0x3ffefd535e3dfaa6,0x3ff479aaac6ffe79,2
+np.float64,0x3ff701e23a6e03c4,0x3fecf39072d96fc7,2
+np.float64,0x3ff4ac809f895901,0x3fe7e6598f2335a5,2
+np.float64,0x3ff0309f26a0613e,0x3fc3b3f4b2783690,2
+np.float64,0x3ff241dd0ce483ba,0x3fe0cde2cb639144,2
+np.float64,0x3ffabce63fb579cc,0x3ff1a18fe2a2da59,2
+np.float64,0x3ffd84b967db0973,0x3ff38ee4f240645d,2
+np.float64,0x7fc3f88b9a27f116,0x408624f1e10cdf3f,2
+np.float64,0x7fe1d5fd5923abfa,0x40862f2175714a3a,2
+np.float64,0x7fe487b145690f62,0x4086304190700183,2
+np.float64,0x7fe7997feaef32ff,0x4086315eeefdddd2,2
+np.float64,0x3ff8f853b671f0a8,0x3ff03c907353a8da,2
+np.float64,0x7fca4c23b5349846,0x408627257ace5778,2
+np.float64,0x7fe0c9bf3a21937d,0x40862ea576c3ea43,2
+np.float64,0x7fc442b389288566,0x4086250f5f126ec9,2
+np.float64,0x7fc6d382ed2da705,0x40862603900431b0,2
+np.float64,0x7fe40b069068160c,0x4086301066468124,2
+np.float64,0x3ff7f62a146fec54,0x3feeba8dfc4363fe,2
+np.float64,0x3ff721e8e94e43d2,0x3fed313a6755d34f,2
+np.float64,0x7fe579feaf2af3fc,0x4086309ddefb6112,2
+np.float64,0x3ffe2c6bde5c58d8,0x3ff3f9665dc9a16e,2
+np.float64,0x7fcf9998ed3f3331,0x4086289dab274788,2
+np.float64,0x7fdb03af2236075d,0x40862ce82252e490,2
+np.float64,0x7fe72799392e4f31,0x40863137f428ee71,2
+np.float64,0x7f9f2190603e4320,0x408617dc5b3b3c3c,2
+np.float64,0x3ff69c56d52d38ae,0x3fec2ba59fe938b2,2
+np.float64,0x7fdcde27bf39bc4e,0x40862d70086cd06d,2
+np.float64,0x3ff654d6b8eca9ae,0x3feb9aa0107609a6,2
+np.float64,0x7fdf69d967bed3b2,0x40862e1d1c2b94c2,2
+np.float64,0xffefffffffffffff,0xfff8000000000000,2
+np.float64,0x7fedfd073f3bfa0d,0x40863349980c2c8b,2
+np.float64,0x7f7c1856803830ac,0x40860bf312b458c7,2
+np.float64,0x7fe9553f1bb2aa7d,0x408631f0173eadd5,2
+np.float64,0x3ff6e92efc2dd25e,0x3fecc38f98e7e1a7,2
+np.float64,0x7fe9719ac532e335,0x408631f906cd79c3,2
+np.float64,0x3ff60e56ae4c1cad,0x3feb07ef8637ec7e,2
+np.float64,0x3ff0d0803501a100,0x3fd455c0af195a9c,2
+np.float64,0x7fe75248a3eea490,0x40863146a614aec1,2
+np.float64,0x7fdff61ead3fec3c,0x40862e408643d7aa,2
+np.float64,0x7fed4ac7a4fa958e,0x408633197b5cf6ea,2
+np.float64,0x7fe58d44562b1a88,0x408630a5098d1bbc,2
+np.float64,0x7fd89dcdb1b13b9a,0x40862c29c2979288,2
+np.float64,0x3ff205deda240bbe,0x3fdfda67c84fd3a8,2
+np.float64,0x7fdf84c15abf0982,0x40862e23f361923d,2
+np.float64,0x3ffe012b3afc0256,0x3ff3de3dfa5f47ce,2
+np.float64,0x3ffe2f3512dc5e6a,0x3ff3fb245206398e,2
+np.float64,0x7fed6174c2bac2e9,0x4086331faa699617,2
+np.float64,0x3ff1f30f8783e61f,0x3fdf47e06f2c40d1,2
+np.float64,0x3ff590da9eab21b5,0x3fe9f8f7b4baf3c2,2
+np.float64,0x3ffb3ca1eb967944,0x3ff1ff9baf66d704,2
+np.float64,0x7fe50ba9a5aa1752,0x408630745ab7fd3c,2
+np.float64,0x3ff43743a4a86e87,0x3fe6bf7ae80b1dda,2
+np.float64,0x3ff47e1a24e8fc34,0x3fe773acca44c7d6,2
+np.float64,0x3ff589ede9eb13dc,0x3fe9e99f28fab3a4,2
+np.float64,0x3ff72f2cbf8e5e5a,0x3fed4a94e7edbf24,2
+np.float64,0x3ffa4f9bbc549f38,0x3ff14ee60aea45d3,2
+np.float64,0x3ff975dae732ebb6,0x3ff0a3a1fbd7284a,2
+np.float64,0x7fbcf14ee039e29d,0x4086225e33f3793e,2
+np.float64,0x3ff10e027f621c05,0x3fd71cce2452b4e0,2
+np.float64,0x3ff33ea193067d43,0x3fe40cbac4daaddc,2
+np.float64,0x7fbef8f2263df1e3,0x408622e905c8e1b4,2
+np.float64,0x3fff7f5bfe3efeb8,0x3ff4c732e83df253,2
+np.float64,0x3ff5700a6b4ae015,0x3fe9afdd7b8b82b0,2
+np.float64,0x3ffd5099da5aa134,0x3ff36d1bf26e55bf,2
+np.float64,0x3ffed8e0f89db1c2,0x3ff4639ff065107a,2
+np.float64,0x3fff9d0c463f3a18,0x3ff4d8a9f297cf52,2
+np.float64,0x3ff23db5b2e47b6b,0x3fe0bebdd48f961a,2
+np.float64,0x3ff042bff1e08580,0x3fc713bf24cc60ef,2
+np.float64,0x7feb4fe97a769fd2,0x4086328a26675646,2
+np.float64,0x3ffeafbfeedd5f80,0x3ff44a955a553b1c,2
+np.float64,0x3ff83fb524507f6a,0x3fef3d1729ae0976,2
+np.float64,0x3ff1992294433245,0x3fdc5f5ce53dd197,2
+np.float64,0x7fe89fe629b13fcb,0x408631b601a83867,2
+np.float64,0x7fe53e4d74aa7c9a,0x40863087839b52f1,2
+np.float64,0x3ff113713e6226e2,0x3fd757631ca7cd09,2
+np.float64,0x7fd4a0b7a629416e,0x40862abfba27a09b,2
+np.float64,0x3ff184c6e2a3098e,0x3fdbab2e3966ae57,2
+np.float64,0x3ffafbbf77f5f77f,0x3ff1d02bb331d9f9,2
+np.float64,0x3ffc6099a358c134,0x3ff2cd16941613d1,2
+np.float64,0x3ffb7c441ef6f888,0x3ff22d7b12e31432,2
+np.float64,0x3ff625ba5eec4b75,0x3feb39060e55fb79,2
+np.float64,0x7fde879acbbd0f35,0x40862de2aab4d72d,2
+np.float64,0x7f930aed982615da,0x408613edb6df8528,2
+np.float64,0x7fa4b82dac29705a,0x40861a261c0a9aae,2
+np.float64,0x7fced5c16b3dab82,0x4086286b7a73e611,2
+np.float64,0x7fe133749d2266e8,0x40862ed73a41b112,2
+np.float64,0x3ff2d8146ea5b029,0x3fe2ced55dbf997d,2
+np.float64,0x3ff60dac77ac1b59,0x3feb0688b0e54c7b,2
+np.float64,0x3ff275d9b024ebb3,0x3fe186b87258b834,2
+np.float64,0x3ff533e6500a67cd,0x3fe92746c8b50ddd,2
+np.float64,0x7fe370896666e112,0x40862fd1ca144736,2
+np.float64,0x7fee7695357ced29,0x40863369c459420e,2
+np.float64,0x7fd1e0528023c0a4,0x4086299a85caffd0,2
+np.float64,0x7fd05c7b24a0b8f5,0x408628e52824386f,2
+np.float64,0x3ff11dcc3b023b98,0x3fd7c56c8cef1be1,2
+np.float64,0x7fc9d9fae933b3f5,0x408627027404bc5f,2
+np.float64,0x7fe2359981246b32,0x40862f4be675e90d,2
+np.float64,0x3ffb10a949962152,0x3ff1df88f83b8cde,2
+np.float64,0x3ffa65b53654cb6a,0x3ff15fc8956ccc87,2
+np.float64,0x3ff0000000000000,0x0,2
+np.float64,0x7fad97ef703b2fde,0x40861d002f3d02da,2
+np.float64,0x3ff57aaf93aaf55f,0x3fe9c7b01f194edb,2
+np.float64,0x7fe9ecd73f33d9ad,0x4086321f69917205,2
+np.float64,0x3ff0dcb79c61b96f,0x3fd4eac86a7a9c38,2
+np.float64,0x7fee9c12ffbd3825,0x4086337396cd706d,2
+np.float64,0x3ff52c40af4a5881,0x3fe915a8a7de8f00,2
+np.float64,0x3ffbcfff59779ffe,0x3ff268e523fe8dda,2
+np.float64,0x7fe014cb4b602996,0x40862e4d5de42a03,2
+np.float64,0x7fae2370e83c46e1,0x40861d258dd5b3ee,2
+np.float64,0x7fe9e33602f3c66b,0x4086321c704ac2bb,2
+np.float64,0x3ff648acd74c915a,0x3feb8195ca53bcaa,2
+np.float64,0x7fe385f507670be9,0x40862fda95ebaf44,2
+np.float64,0x3ffb0e382c361c70,0x3ff1ddbea963e0a7,2
+np.float64,0x3ff47d6b6ae8fad7,0x3fe771f80ad37cd2,2
+np.float64,0x3ffca7d538f94faa,0x3ff2fd5f62e851ac,2
+np.float64,0x3ff83e949c107d29,0x3fef3b1c5bbac99b,2
+np.float64,0x7fc6fb933a2df725,0x408626118e51a286,2
+np.float64,0x7fe43a1454e87428,0x4086302318512d9b,2
+np.float64,0x7fe51fe32aaa3fc5,0x4086307c07271348,2
+np.float64,0x3ff35e563966bcac,0x3fe46aa2856ef85f,2
+np.float64,0x3ff84dd4e4909baa,0x3fef55d86d1d5c2e,2
+np.float64,0x7febe3d84077c7b0,0x408632b507686f03,2
+np.float64,0x3ff6aca2e32d5946,0x3fec4c32a2368ee3,2
+np.float64,0x7fe7070e3e6e0e1b,0x4086312caddb0454,2
+np.float64,0x7fd3657f2aa6cafd,0x40862a41acf47e70,2
+np.float64,0x3ff61534456c2a68,0x3feb1663900af13b,2
+np.float64,0x3ff8bc556eb178ab,0x3ff00a16b5403f88,2
+np.float64,0x3ffa7782e3f4ef06,0x3ff16d529c94a438,2
+np.float64,0x7fc15785ed22af0b,0x408623d0cd94fb86,2
+np.float64,0x3ff2e3eeb6e5c7dd,0x3fe2f4c4876d3edf,2
+np.float64,0x3ff2e4e17e85c9c3,0x3fe2f7c9e437b22e,2
+np.float64,0x7feb3aaf67f6755e,0x40863283ec4a0d76,2
+np.float64,0x7fe89efcf7313df9,0x408631b5b5e41263,2
+np.float64,0x3ffcc6fad4f98df6,0x3ff31245778dff6d,2
+np.float64,0x3ff356114466ac22,0x3fe45253d040a024,2
+np.float64,0x3ff81c70d2d038e2,0x3feefed71ebac776,2
+np.float64,0x7fdb75c96136eb92,0x40862d09a603f03e,2
+np.float64,0x3ff340f91b8681f2,0x3fe413bb6e6d4a54,2
+np.float64,0x3fff906079df20c1,0x3ff4d13869d16bc7,2
+np.float64,0x3ff226a42d644d48,0x3fe0698d316f1ac0,2
+np.float64,0x3ff948abc3b29158,0x3ff07eeb0b3c81ba,2
+np.float64,0x3ffc25df1fb84bbe,0x3ff2a4c13ad4edad,2
+np.float64,0x7fe07ea3b960fd46,0x40862e815b4cf43d,2
+np.float64,0x3ff497d3dae92fa8,0x3fe7b3917bf10311,2
+np.float64,0x7fea561db1f4ac3a,0x4086323fa4aef2a9,2
+np.float64,0x7fd1b49051236920,0x40862986d8759ce5,2
+np.float64,0x7f7ba3bd6037477a,0x40860bd19997fd90,2
+np.float64,0x3ff01126dd00224e,0x3fb76b67938dfb11,2
+np.float64,0x3ff29e1105053c22,0x3fe2102a4c5fa102,2
+np.float64,0x3ff9de2a6553bc55,0x3ff0f6cfe4dea30e,2
+np.float64,0x7fc558e7d42ab1cf,0x4086257a608fc055,2
+np.float64,0x3ff79830a74f3061,0x3fee0f93db153d65,2
+np.float64,0x7fe2661648e4cc2c,0x40862f6117a71eb2,2
+np.float64,0x3ff140cf4262819e,0x3fd92aefedae1ab4,2
+np.float64,0x3ff5f36251abe6c5,0x3feaced481ceaee3,2
+np.float64,0x7fc80911d5301223,0x4086266d4757f768,2
+np.float64,0x3ff9079a6c320f35,0x3ff04949d21ebe1e,2
+np.float64,0x3ffde8d2e09bd1a6,0x3ff3cedca8a5db5d,2
+np.float64,0x3ffadd1de375ba3c,0x3ff1b989790e8d93,2
+np.float64,0x3ffdbc40ee1b7882,0x3ff3b286b1c7da57,2
+np.float64,0x3ff8ff514771fea2,0x3ff04264add00971,2
+np.float64,0x7fefd7d0e63fafa1,0x408633c47d9f7ae4,2
+np.float64,0x3ffc47798c588ef3,0x3ff2bbe441fa783a,2
+np.float64,0x7fe6ebc55b6dd78a,0x408631232d9abf31,2
+np.float64,0xbff0000000000000,0xfff8000000000000,2
+np.float64,0x7fd378e4afa6f1c8,0x40862a49a8f98cb4,2
+np.float64,0x0,0xfff8000000000000,2
+np.float64,0x3ffe88ed7efd11db,0x3ff432c7ecb95492,2
+np.float64,0x3ff4f5509289eaa1,0x3fe8955a11656323,2
+np.float64,0x7fda255b41344ab6,0x40862ca53676a23e,2
+np.float64,0x3ffebe85b9bd7d0c,0x3ff453992cd55dea,2
+np.float64,0x3ff5d6180b8bac30,0x3fea901c2160c3bc,2
+np.float64,0x3ffcdfb8fcf9bf72,0x3ff322c83b3bc735,2
+np.float64,0x3ff3c91c26679238,0x3fe599a652b7cf59,2
+np.float64,0x7fc389f7a62713ee,0x408624c518edef93,2
+np.float64,0x3ffe1245ba1c248c,0x3ff3e901b2c4a47a,2
+np.float64,0x7fe1e76e95e3cedc,0x40862f29446f9eff,2
+np.float64,0x3ff02ae4f92055ca,0x3fc28221abd63daa,2
+np.float64,0x7fbf648a143ec913,0x40862304a0619d03,2
+np.float64,0x3ff2be7ef8657cfe,0x3fe27bcc6c97522e,2
+np.float64,0x3ffa7595e514eb2c,0x3ff16bdc64249ad1,2
+np.float64,0x3ff4ee130049dc26,0x3fe884354cbad8c9,2
+np.float64,0x3ff19211fc232424,0x3fdc2160bf3eae40,2
+np.float64,0x3ffec215aedd842c,0x3ff455c4cdd50c32,2
+np.float64,0x7fe7cb50ffaf96a1,0x4086316fc06a53af,2
+np.float64,0x3fffa679161f4cf2,0x3ff4de30ba7ac5b8,2
+np.float64,0x7fdcb459763968b2,0x40862d646a21011d,2
+np.float64,0x3ff9f338d6d3e672,0x3ff1075835d8f64e,2
+np.float64,0x3ff8de3319d1bc66,0x3ff026ae858c0458,2
+np.float64,0x7fee0199d33c0333,0x4086334ad03ac683,2
+np.float64,0x3ffc06076c380c0f,0x3ff28eaec3814faa,2
+np.float64,0x3ffe9e2e235d3c5c,0x3ff43fd4d2191a7f,2
+np.float64,0x3ffd93b06adb2761,0x3ff398888239cde8,2
+np.float64,0x7fefe4b71cffc96d,0x408633c7ba971b92,2
+np.float64,0x7fb2940352252806,0x40861ed244bcfed6,2
+np.float64,0x3ffba4647e3748c9,0x3ff24a15f02e11b9,2
+np.float64,0x7fd2d9543725b2a7,0x40862a0708446596,2
+np.float64,0x7fc04997f120932f,0x4086235055d35251,2
+np.float64,0x3ff6d14313ada286,0x3fec94b177f5d3fc,2
+np.float64,0x3ff279fc8684f3f9,0x3fe19511c3e5b9a8,2
+np.float64,0x3ff42f4609085e8c,0x3fe6aabe526ce2bc,2
+np.float64,0x7fc1c6c62a238d8b,0x408624037de7f6ec,2
+np.float64,0x7fe31ff4b8e63fe8,0x40862fb05b40fd16,2
+np.float64,0x7fd2a8825fa55104,0x408629f234d460d6,2
+np.float64,0x3ffe8c1d725d183b,0x3ff434bdc444143f,2
+np.float64,0x3ff0e9dc3e21d3b8,0x3fd58676e2c13fc9,2
+np.float64,0x3ffed03172fda063,0x3ff45e59f7aa6c8b,2
+np.float64,0x7fd74621962e8c42,0x40862bb6e90d66f8,2
+np.float64,0x3ff1faa29663f545,0x3fdf833a2c5efde1,2
+np.float64,0x7fda02834db40506,0x40862c9a860d6747,2
+np.float64,0x7f709b2fc021365f,0x408607be328eb3eb,2
+np.float64,0x7fec0d58aa381ab0,0x408632c0e61a1af6,2
+np.float64,0x3ff524d1720a49a3,0x3fe90479968d40fd,2
+np.float64,0x7fd64cb3b32c9966,0x40862b5f53c4b0b4,2
+np.float64,0x3ff9593e3ed2b27c,0x3ff08c6eea5f6e8b,2
+np.float64,0x3ff7de8b1f6fbd16,0x3fee9007abcfdf7b,2
+np.float64,0x7fe8d816d6b1b02d,0x408631c82e38a894,2
+np.float64,0x7fd726bbe22e4d77,0x40862bac16ee8d52,2
+np.float64,0x7fa70b07d42e160f,0x40861affcc4265e2,2
+np.float64,0x7fe18b4091e31680,0x40862effa8bce66f,2
+np.float64,0x3ff830253010604a,0x3fef21b2eaa75758,2
+np.float64,0x3fffcade407f95bc,0x3ff4f3734b24c419,2
+np.float64,0x3ff8c17cecb182fa,0x3ff00e75152d7bda,2
+np.float64,0x7fdad9b9d035b373,0x40862cdbabb793ba,2
+np.float64,0x3ff9f9e154f3f3c2,0x3ff10c8dfdbd2510,2
+np.float64,0x3ff465e162e8cbc3,0x3fe736c751c75b73,2
+np.float64,0x3ff9b4cd8493699b,0x3ff0d616235544b8,2
+np.float64,0x7fe557c4a56aaf88,0x4086309114ed12d9,2
+np.float64,0x7fe5999133eb3321,0x408630a9991a9b54,2
+np.float64,0x7fe7c9009e2f9200,0x4086316ef9359a47,2
+np.float64,0x3ff8545cabd0a8ba,0x3fef6141f1030c36,2
+np.float64,0x3ffa1f1712943e2e,0x3ff129849d492ce3,2
+np.float64,0x7fea803a14750073,0x4086324c652c276c,2
+np.float64,0x3ff5b6f97fcb6df3,0x3fea4cb0b97b18e9,2
+np.float64,0x7fc2efdfc425dfbf,0x40862485036a5c6e,2
+np.float64,0x7fe2c78e5be58f1c,0x40862f8b0a5e7baf,2
+np.float64,0x7fe80d7fff301aff,0x40863185e234060a,2
+np.float64,0x3ffd895d457b12ba,0x3ff391e2cac7a3f8,2
+np.float64,0x3ff44c9764a8992f,0x3fe6f6690396c232,2
+np.float64,0x3ff731688b8e62d1,0x3fed4ed70fac3839,2
+np.float64,0x3ff060200460c040,0x3fcbad4a07d97f0e,2
+np.float64,0x3ffbd2f70a17a5ee,0x3ff26afb46ade929,2
+np.float64,0x7febe9e841f7d3d0,0x408632b6c465ddd9,2
+np.float64,0x3ff2532f8be4a65f,0x3fe10c6cd8d64cf4,2
+np.float64,0x7fefffffffffffff,0x408633ce8fb9f87e,2
+np.float64,0x3ff3a1ae3a47435c,0x3fe52c00210cc459,2
+np.float64,0x7fe9c34ae6b38695,0x408632128d150149,2
+np.float64,0x3fff311029fe6220,0x3ff498b852f30bff,2
+np.float64,0x3ffd4485a1ba890c,0x3ff3653b6fa701cd,2
+np.float64,0x7fd52718b1aa4e30,0x40862af330d9c68c,2
+np.float64,0x3ff10b695a4216d3,0x3fd7009294e367b7,2
+np.float64,0x3ffdf73de59bee7c,0x3ff3d7fa96d2c1ae,2
+np.float64,0x3ff2f1c75965e38f,0x3fe320aaff3db882,2
+np.float64,0x3ff2a56a5a854ad5,0x3fe228cc4ad7e7a5,2
+np.float64,0x7fe60cd1cf6c19a3,0x408630d3d87a04b3,2
+np.float64,0x3ff89fa65c113f4c,0x3fefe3543773180c,2
+np.float64,0x3ffd253130ba4a62,0x3ff350b76ba692a0,2
+np.float64,0x7feaad7051f55ae0,0x40863259ff932d62,2
+np.float64,0x7fd9cc37cf33986f,0x40862c89c15f963b,2
+np.float64,0x3ff8c08de771811c,0x3ff00daa9c17acd7,2
+np.float64,0x7fea58b25d34b164,0x408632406d54cc6f,2
+np.float64,0x7fe5f161fd2be2c3,0x408630c9ddf272a5,2
+np.float64,0x3ff5840dbf8b081c,0x3fe9dc9117b4cbc7,2
+np.float64,0x3ff3fd762307faec,0x3fe6277cd530c640,2
+np.float64,0x3ff9095c98b212b9,0x3ff04abff170ac24,2
+np.float64,0x7feaac66017558cb,0x40863259afb4f8ce,2
+np.float64,0x7fd78f96bcaf1f2c,0x40862bd00175fdf9,2
+np.float64,0x3ffaca27e0959450,0x3ff1ab72b8f8633e,2
+np.float64,0x3ffb7f18cb96fe32,0x3ff22f81bcb8907b,2
+np.float64,0x3ffcce48d1199c92,0x3ff317276f62c0b2,2
+np.float64,0x3ffcb9a7f3797350,0x3ff30958e0d6a34d,2
+np.float64,0x7fda569ef6b4ad3d,0x40862cb43b33275a,2
+np.float64,0x7fde9f0893bd3e10,0x40862de8cc036283,2
+np.float64,0x3ff428be3928517c,0x3fe699bb5ab58904,2
+np.float64,0x7fa4d3344029a668,0x40861a3084989291,2
+np.float64,0x3ff03607bd006c0f,0x3fc4c4840cf35f48,2
+np.float64,0x3ff2b1335c056267,0x3fe25000846b75a2,2
+np.float64,0x7fe0cb8bd8e19717,0x40862ea65237d496,2
+np.float64,0x3fff4b1b7b9e9637,0x3ff4a83fb08e7b24,2
+np.float64,0x7fe7526140aea4c2,0x40863146ae86069c,2
+np.float64,0x7fbfcfb7c23f9f6f,0x4086231fc246ede5,2
diff --git a/numpy/core/tests/data/umath-validation-set-arcsin.csv b/numpy/core/tests/data/umath-validation-set-arcsin.csv
new file mode 100644 (file)
index 0000000..cb94c93
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0xbe7d3a7c,0xbe7fe217,4
+np.float32,0x3dc102f0,0x3dc14c60,4
+np.float32,0xbe119c28,0xbe121aef,4
+np.float32,0xbe51cd68,0xbe534c75,4
+np.float32,0x3c04a300,0x3c04a35f,4
+np.float32,0xbf4f0b62,0xbf712a69,4
+np.float32,0x3ef61a5c,0x3f005cf6,4
+np.float32,0xbf13024c,0xbf1c97df,4
+np.float32,0x3e93b580,0x3e95d6b5,4
+np.float32,0x3e44e7b8,0x3e4623a5,4
+np.float32,0xbe35df20,0xbe36d773,4
+np.float32,0x3eecd2c0,0x3ef633cf,4
+np.float32,0x3f2772ba,0x3f36862a,4
+np.float32,0x3e211ea8,0x3e21cac5,4
+np.float32,0x3e3b3d90,0x3e3c4cc6,4
+np.float32,0x3f37c962,0x3f4d018c,4
+np.float32,0x3e92ad88,0x3e94c31a,4
+np.float32,0x3f356ffc,0x3f49a766,4
+np.float32,0x3f487ba2,0x3f665254,4
+np.float32,0x3f061c46,0x3f0d27ae,4
+np.float32,0xbee340a2,0xbeeb7722,4
+np.float32,0xbe85aede,0xbe874026,4
+np.float32,0x3f34cf9a,0x3f48c474,4
+np.float32,0x3e29a690,0x3e2a6fbd,4
+np.float32,0xbeb29428,0xbeb669d1,4
+np.float32,0xbe606d40,0xbe624370,4
+np.float32,0x3dae6860,0x3dae9e85,4
+np.float32,0xbf04872b,0xbf0b4d25,4
+np.float32,0x3f2080e2,0x3f2d7ab0,4
+np.float32,0xbec77dcc,0xbecceb27,4
+np.float32,0x3e0dda10,0x3e0e4f38,4
+np.float32,0xbefaf970,0xbf03262c,4
+np.float32,0x3f576a0c,0x3f7ffee6,4
+np.float32,0x3f222382,0x3f2f95d6,4
+np.float32,0x7fc00000,0x7fc00000,4
+np.float32,0x3e41c468,0x3e42f14e,4
+np.float32,0xbf2f64dd,0xbf4139a8,4
+np.float32,0xbf60ef90,0xbf895956,4
+np.float32,0xbf67c855,0xbf90eff0,4
+np.float32,0xbed35aee,0xbed9df00,4
+np.float32,0xbf2c7d92,0xbf3d448f,4
+np.float32,0x3f7b1604,0x3faff122,4
+np.float32,0xbf7c758b,0xbfb3bf87,4
+np.float32,0x3ecda1c8,0x3ed39acf,4
+np.float32,0x3f3af8ae,0x3f519fcb,4
+np.float32,0xbf16e6a3,0xbf2160fd,4
+np.float32,0x3f0c97d2,0x3f14d668,4
+np.float32,0x3f0a8060,0x3f1257b9,4
+np.float32,0x3f27905a,0x3f36ad57,4
+np.float32,0x3eeaeba4,0x3ef40efe,4
+np.float32,0x3e58dde0,0x3e5a8580,4
+np.float32,0xbf0cabe2,0xbf14ee6b,4
+np.float32,0xbe805ca8,0xbe81bf03,4
+np.float32,0x3f5462ba,0x3f7a7b85,4
+np.float32,0xbee235d0,0xbeea4d8b,4
+np.float32,0xbe880cb0,0xbe89b426,4
+np.float32,0x80000001,0x80000001,4
+np.float32,0x3f208c00,0x3f2d88f6,4
+np.float32,0xbf34f3d2,0xbf48f7a2,4
+np.float32,0x3f629428,0x3f8b1763,4
+np.float32,0xbf52a900,0xbf776b4a,4
+np.float32,0xbd17f8d0,0xbd1801be,4
+np.float32,0xbef7cada,0xbf0153d1,4
+np.float32,0x3f7d3b90,0x3fb63967,4
+np.float32,0xbd6a20b0,0xbd6a4160,4
+np.float32,0x3f740496,0x3fa1beb7,4
+np.float32,0x3ed8762c,0x3edf7dd9,4
+np.float32,0x3f53b066,0x3f793d42,4
+np.float32,0xbe9de718,0xbea084f9,4
+np.float32,0x3ea3ae90,0x3ea69b4b,4
+np.float32,0x3f1b8f00,0x3f273183,4
+np.float32,0x3f5cd6ac,0x3f852ead,4
+np.float32,0x3f29d510,0x3f39b169,4
+np.float32,0x3ee2a934,0x3eeace33,4
+np.float32,0x3eecac94,0x3ef608c2,4
+np.float32,0xbea915e2,0xbeac5203,4
+np.float32,0xbd316e90,0xbd317cc8,4
+np.float32,0xbf70b495,0xbf9c97b6,4
+np.float32,0xbe80d976,0xbe823ff3,4
+np.float32,0x3e9205f8,0x3e94143f,4
+np.float32,0x3f49247e,0x3f676296,4
+np.float32,0x3d9030c0,0x3d904f50,4
+np.float32,0x3e4df058,0x3e4f5a5c,4
+np.float32,0xbe1fd360,0xbe207b58,4
+np.float32,0xbf69dc7c,0xbf937006,4
+np.float32,0x3f36babe,0x3f4b7df3,4
+np.float32,0xbe8c9758,0xbe8e6bb7,4
+np.float32,0xbf4de72d,0xbf6f3c20,4
+np.float32,0xbecdad68,0xbed3a780,4
+np.float32,0xbf73e2cf,0xbfa18702,4
+np.float32,0xbece16a8,0xbed41a75,4
+np.float32,0x3f618a96,0x3f89fc6d,4
+np.float32,0xbf325853,0xbf454ea9,4
+np.float32,0x3f138568,0x3f1d3828,4
+np.float32,0xbf56a6e9,0xbf7e9748,4
+np.float32,0x3ef5d594,0x3f0035bf,4
+np.float32,0xbf408220,0xbf59dfaa,4
+np.float32,0xbed120e6,0xbed76dd5,4
+np.float32,0xbf6dbda5,0xbf986cee,4
+np.float32,0x3f744a38,0x3fa23282,4
+np.float32,0xbe4b56d8,0xbe4cb329,4
+np.float32,0x3f54c5f2,0x3f7b2d97,4
+np.float32,0xbd8b1c90,0xbd8b3801,4
+np.float32,0x3ee19a48,0x3ee9a03b,4
+np.float32,0x3f48460e,0x3f65fc3d,4
+np.float32,0x3eb541c0,0x3eb9461e,4
+np.float32,0xbea7d098,0xbeaaf98c,4
+np.float32,0xbda99e40,0xbda9d00c,4
+np.float32,0xbefb2ca6,0xbf03438d,4
+np.float32,0x3f4256be,0x3f5cab0b,4
+np.float32,0xbdbdb198,0xbdbdf74d,4
+np.float32,0xbf325b5f,0xbf4552e9,4
+np.float32,0xbf704d1a,0xbf9c00b4,4
+np.float32,0x3ebb1d04,0x3ebf8cf8,4
+np.float32,0xbed03566,0xbed66bf1,4
+np.float32,0x3e8fcee8,0x3e91c501,4
+np.float32,0xbf2e1eec,0xbf3f7b9d,4
+np.float32,0x3f33c4d2,0x3f474cac,4
+np.float32,0x3f598ef4,0x3f8201b4,4
+np.float32,0x3e09bb30,0x3e0a2660,4
+np.float32,0x3ed4e228,0x3edb8cdb,4
+np.float32,0x3eb7a190,0x3ebbd0a1,4
+np.float32,0xbd9ae630,0xbd9b0c18,4
+np.float32,0x3f43020e,0x3f5db2d7,4
+np.float32,0xbec06ac0,0xbec542d4,4
+np.float32,0x3f3dfde0,0x3f561674,4
+np.float32,0xbf64084a,0xbf8cabe6,4
+np.float32,0xbd6f95b0,0xbd6fb8b7,4
+np.float32,0x3f268640,0x3f354e2d,4
+np.float32,0xbe72b4bc,0xbe7509b2,4
+np.float32,0xbf3414fa,0xbf47bd5a,4
+np.float32,0xbf375218,0xbf4c566b,4
+np.float32,0x3f203c1a,0x3f2d2273,4
+np.float32,0xbd503530,0xbd504c2b,4
+np.float32,0xbc45e540,0xbc45e67b,4
+np.float32,0xbf175c4f,0xbf21f2c6,4
+np.float32,0x3f7432a6,0x3fa20b2b,4
+np.float32,0xbf43367f,0xbf5e03d8,4
+np.float32,0x3eb3997c,0x3eb780c4,4
+np.float32,0x3e5574c8,0x3e570878,4
+np.float32,0xbf04b57b,0xbf0b8349,4
+np.float32,0x3f6216d8,0x3f8a914b,4
+np.float32,0xbf57a237,0xbf80337d,4
+np.float32,0xbee1403a,0xbee93bee,4
+np.float32,0xbeaf9b9a,0xbeb33f3b,4
+np.float32,0xbf109374,0xbf19a223,4
+np.float32,0xbeae6824,0xbeb1f810,4
+np.float32,0xbcff9320,0xbcff9dbe,4
+np.float32,0x3ed205c0,0x3ed868a9,4
+np.float32,0x3d897c30,0x3d8996ad,4
+np.float32,0xbf2899d2,0xbf380d4c,4
+np.float32,0xbf54cb0b,0xbf7b36c2,4
+np.float32,0x3ea8e8ec,0x3eac2262,4
+np.float32,0x3ef5e1a0,0x3f003c9d,4
+np.float32,0xbf00c81e,0xbf06f1e2,4
+np.float32,0xbf346775,0xbf483181,4
+np.float32,0x3f7a4fe4,0x3fae077c,4
+np.float32,0x3f00776e,0x3f06948f,4
+np.float32,0xbe0a3078,0xbe0a9cbc,4
+np.float32,0xbeba0b06,0xbebe66be,4
+np.float32,0xbdff4e38,0xbdfff8b2,4
+np.float32,0xbe927f70,0xbe9492ff,4
+np.float32,0x3ebb07e0,0x3ebf7642,4
+np.float32,0x3ebcf8e0,0x3ec18c95,4
+np.float32,0x3f49bdfc,0x3f685b51,4
+np.float32,0x3cbc29c0,0x3cbc2dfd,4
+np.float32,0xbe9e951a,0xbea13bf1,4
+np.float32,0xbe8c237c,0xbe8df33d,4
+np.float32,0x3e17f198,0x3e1881c4,4
+np.float32,0xbd0b5220,0xbd0b5902,4
+np.float32,0xbf34c4a2,0xbf48b4f5,4
+np.float32,0xbedaa814,0xbee1ea94,4
+np.float32,0x3ebf5d6c,0x3ec42053,4
+np.float32,0x3cd04b40,0x3cd050ff,4
+np.float32,0xbec33fe0,0xbec85244,4
+np.float32,0xbf00b27a,0xbf06d8d8,4
+np.float32,0x3f15d7be,0x3f201243,4
+np.float32,0xbe3debd0,0xbe3f06f7,4
+np.float32,0xbea81704,0xbeab4418,4
+np.float32,0x1,0x1,4
+np.float32,0x3f49e6ba,0x3f689d8b,4
+np.float32,0x3f351030,0x3f491fc0,4
+np.float32,0x3e607de8,0x3e625482,4
+np.float32,0xbe8dbbe4,0xbe8f9c0e,4
+np.float32,0x3edbf350,0x3ee35924,4
+np.float32,0xbf0c84c4,0xbf14bf9c,4
+np.float32,0x3eb218b0,0x3eb5e61a,4
+np.float32,0x3e466dd0,0x3e47b138,4
+np.float32,0xbe8ece94,0xbe90ba01,4
+np.float32,0xbe82ec2a,0xbe84649a,4
+np.float32,0xbf7e1f10,0xbfb98b9e,4
+np.float32,0xbf2d00ea,0xbf3df688,4
+np.float32,0x3db7cdd0,0x3db80d36,4
+np.float32,0xbe388b98,0xbe398f25,4
+np.float32,0xbd86cb40,0xbd86e436,4
+np.float32,0x7f7fffff,0x7fc00000,4
+np.float32,0x3f472a60,0x3f6436c6,4
+np.float32,0xbf5b2c1d,0xbf838d87,4
+np.float32,0x3f0409ea,0x3f0abad8,4
+np.float32,0x3f47dd0e,0x3f6553f0,4
+np.float32,0x3e3eab00,0x3e3fc98a,4
+np.float32,0xbf7c2a7f,0xbfb2e19b,4
+np.float32,0xbeda0048,0xbee13112,4
+np.float32,0x3f46600a,0x3f62f5b2,4
+np.float32,0x3f45aef4,0x3f61de43,4
+np.float32,0x3dd40a50,0x3dd46bc4,4
+np.float32,0xbf6cdd0b,0xbf974191,4
+np.float32,0x3f78de4c,0x3faac725,4
+np.float32,0x3f3c39a4,0x3f53777f,4
+np.float32,0xbe2a30ec,0xbe2afc0b,4
+np.float32,0xbf3c0ef0,0xbf533887,4
+np.float32,0x3ecb6548,0x3ed12a53,4
+np.float32,0x3eb994e8,0x3ebde7fc,4
+np.float32,0x3d4c1ee0,0x3d4c3487,4
+np.float32,0xbf52cb6d,0xbf77a7eb,4
+np.float32,0x3eb905d4,0x3ebd4e80,4
+np.float32,0x3e712428,0x3e736d72,4
+np.float32,0xbf79ee6e,0xbfad22be,4
+np.float32,0x3de6f8b0,0x3de776c1,4
+np.float32,0x3e9b2898,0x3e9da325,4
+np.float32,0x3ea09b20,0x3ea35d20,4
+np.float32,0x3d0ea9a0,0x3d0eb103,4
+np.float32,0xbd911500,0xbd913423,4
+np.float32,0x3e004618,0x3e009c97,4
+np.float32,0x3f5e0e5a,0x3f86654c,4
+np.float32,0x3f2e6300,0x3f3fd88b,4
+np.float32,0x3e0cf5d0,0x3e0d68c3,4
+np.float32,0x3d6a16c0,0x3d6a376c,4
+np.float32,0x3f7174aa,0x3f9db53c,4
+np.float32,0xbe04bba0,0xbe051b81,4
+np.float32,0xbe6fdcb4,0xbe721c92,4
+np.float32,0x3f4379f0,0x3f5e6c31,4
+np.float32,0xbf680098,0xbf913257,4
+np.float32,0xbf3c31ca,0xbf536bea,4
+np.float32,0x3f59db58,0x3f824a4e,4
+np.float32,0xbf3ffc84,0xbf591554,4
+np.float32,0x3d1d5160,0x3d1d5b48,4
+np.float32,0x3f6c64ae,0x3f96a3da,4
+np.float32,0xbf1b49fd,0xbf26daaa,4
+np.float32,0x3ec80be0,0x3ecd8576,4
+np.float32,0x3f3becc0,0x3f530629,4
+np.float32,0xbea93890,0xbeac76c1,4
+np.float32,0x3f5b3acc,0x3f839bbd,4
+np.float32,0xbf5d6818,0xbf85bef9,4
+np.float32,0x3f794266,0x3fab9fa6,4
+np.float32,0xbee8eb7c,0xbef1cf3b,4
+np.float32,0xbf360a06,0xbf4a821e,4
+np.float32,0x3f441cf6,0x3f5f693d,4
+np.float32,0x3e60de40,0x3e62b742,4
+np.float32,0xbebb3d7e,0xbebfafdc,4
+np.float32,0x3e56a3a0,0x3e583e28,4
+np.float32,0x3f375bfe,0x3f4c6499,4
+np.float32,0xbf384d7d,0xbf4dbf9a,4
+np.float32,0x3efb03a4,0x3f032c06,4
+np.float32,0x3f1d5d10,0x3f29794d,4
+np.float32,0xbe25f7dc,0xbe26b41d,4
+np.float32,0x3f6d2f88,0x3f97aebb,4
+np.float32,0xbe9fa100,0xbea255cb,4
+np.float32,0xbf21dafa,0xbf2f382a,4
+np.float32,0x3d3870e0,0x3d3880d9,4
+np.float32,0x3eeaf00c,0x3ef413f4,4
+np.float32,0xbc884ea0,0xbc88503c,4
+np.float32,0xbf7dbdad,0xbfb80b6d,4
+np.float32,0xbf4eb713,0xbf709b46,4
+np.float32,0xbf1c0ad4,0xbf27cd92,4
+np.float32,0x3f323088,0x3f451737,4
+np.float32,0x3e405d88,0x3e4183e1,4
+np.float32,0x3d7ad580,0x3d7afdb4,4
+np.float32,0xbf207338,0xbf2d6927,4
+np.float32,0xbecf7948,0xbed59e1a,4
+np.float32,0x3f16ff94,0x3f217fde,4
+np.float32,0xbdf19588,0xbdf225dd,4
+np.float32,0xbf4d9654,0xbf6eb442,4
+np.float32,0xbf390b9b,0xbf4ed220,4
+np.float32,0xbe155a74,0xbe15e354,4
+np.float32,0x3f519e4c,0x3f759850,4
+np.float32,0xbee3f08c,0xbeec3b84,4
+np.float32,0xbf478be7,0xbf64d23b,4
+np.float32,0xbefdee50,0xbf04d92a,4
+np.float32,0x3e8def78,0x3e8fd1bc,4
+np.float32,0x3e3df2a8,0x3e3f0dee,4
+np.float32,0xbf413e22,0xbf5afd97,4
+np.float32,0xbf1b8bc4,0xbf272d71,4
+np.float32,0xbf31e5be,0xbf44af22,4
+np.float32,0x3de7e080,0x3de86010,4
+np.float32,0xbf5ddf7e,0xbf863645,4
+np.float32,0x3f3eba6a,0x3f57306e,4
+np.float32,0xff7fffff,0x7fc00000,4
+np.float32,0x3ec22d5c,0x3ec72973,4
+np.float32,0x80800000,0x80800000,4
+np.float32,0x3f032e0c,0x3f09ba82,4
+np.float32,0x3d74bd60,0x3d74e2b7,4
+np.float32,0xbea0d61e,0xbea39b42,4
+np.float32,0xbefdfa78,0xbf04e02a,4
+np.float32,0x3e5cb220,0x3e5e70ec,4
+np.float32,0xbe239e54,0xbe2452a4,4
+np.float32,0x3f452738,0x3f61090e,4
+np.float32,0x3e99a2e0,0x3e9c0a66,4
+np.float32,0x3e4394d8,0x3e44ca5f,4
+np.float32,0x3f4472e2,0x3f5fef14,4
+np.float32,0xbf46bc70,0xbf638814,4
+np.float32,0xbf0b910f,0xbf139c7a,4
+np.float32,0x3f36b4a6,0x3f4b753f,4
+np.float32,0x3e0bf478,0x3e0c64f6,4
+np.float32,0x3ce02480,0x3ce02ba9,4
+np.float32,0xbd904b10,0xbd9069b1,4
+np.float32,0xbf7f5d72,0xbfc00b70,4
+np.float32,0x3f62127e,0x3f8a8ca8,4
+np.float32,0xbf320253,0xbf44d6e4,4
+np.float32,0x3f2507be,0x3f335833,4
+np.float32,0x3f299284,0x3f395887,4
+np.float32,0xbd8211b0,0xbd82281d,4
+np.float32,0xbd3374c0,0xbd338376,4
+np.float32,0x3f36c56a,0x3f4b8d30,4
+np.float32,0xbf51f704,0xbf76331f,4
+np.float32,0xbe9871ca,0xbe9acab2,4
+np.float32,0xbe818d8c,0xbe82fa0f,4
+np.float32,0x3f08b958,0x3f103c18,4
+np.float32,0x3f22559a,0x3f2fd698,4
+np.float32,0xbf11f388,0xbf1b4db8,4
+np.float32,0x3ebe1990,0x3ec2c359,4
+np.float32,0xbe75ab38,0xbe7816b6,4
+np.float32,0x3e96102c,0x3e984c99,4
+np.float32,0xbe80d9d2,0xbe824052,4
+np.float32,0x3ef47588,0x3efeda7f,4
+np.float32,0xbe45e524,0xbe4725ea,4
+np.float32,0x3f7f9e7a,0x3fc213ff,4
+np.float32,0x3f1d3c36,0x3f294faa,4
+np.float32,0xbf3c58db,0xbf53a591,4
+np.float32,0x3f0d3d20,0x3f159c69,4
+np.float32,0x3f744be6,0x3fa23552,4
+np.float32,0x3f2e0cea,0x3f3f630e,4
+np.float32,0x3e193c10,0x3e19cff7,4
+np.float32,0xbf4150ac,0xbf5b19dd,4
+np.float32,0xbf145f72,0xbf1e4355,4
+np.float32,0xbb76cc00,0xbb76cc26,4
+np.float32,0x3f756780,0x3fa41b3e,4
+np.float32,0x3ea9b868,0x3eacfe3c,4
+np.float32,0x3d07c920,0x3d07cf7f,4
+np.float32,0xbf2263d4,0xbf2fe8ff,4
+np.float32,0x3e53b3f8,0x3e553daa,4
+np.float32,0xbf785be8,0xbfa9b5ba,4
+np.float32,0x3f324f7a,0x3f454254,4
+np.float32,0xbf2188f2,0xbf2ece5b,4
+np.float32,0xbe33781c,0xbe3466a2,4
+np.float32,0xbd3cf120,0xbd3d024c,4
+np.float32,0x3f06b18a,0x3f0dd70f,4
+np.float32,0x3f40d63e,0x3f5a5f6a,4
+np.float32,0x3f752340,0x3fa3a41e,4
+np.float32,0xbe1cf1c0,0xbe1d90bc,4
+np.float32,0xbf02d948,0xbf0957d7,4
+np.float32,0x3f73bed0,0x3fa14bf7,4
+np.float32,0x3d914920,0x3d916864,4
+np.float32,0x7fa00000,0x7fe00000,4
+np.float32,0xbe67a5d8,0xbe69aba7,4
+np.float32,0x3f689c4a,0x3f91eb9f,4
+np.float32,0xbf196e00,0xbf248601,4
+np.float32,0xbf50dacb,0xbf7444fe,4
+np.float32,0x3f628b86,0x3f8b0e1e,4
+np.float32,0x3f6ee2f2,0x3f99fe7f,4
+np.float32,0x3ee5df40,0x3eee6492,4
+np.float32,0x3f501746,0x3f72f41b,4
+np.float32,0xbf1f0f18,0xbf2ba164,4
+np.float32,0xbf1a8bfd,0xbf25ec01,4
+np.float32,0xbd4926f0,0xbd493ba9,4
+np.float32,0xbf4e364f,0xbf6fc17b,4
+np.float32,0x3e50c578,0x3e523ed4,4
+np.float32,0x3f65bf10,0x3f8e95ce,4
+np.float32,0xbe8d75a2,0xbe8f52f2,4
+np.float32,0xbf3f557e,0xbf581962,4
+np.float32,0xbeff2bfc,0xbf05903a,4
+np.float32,0x3f5e8bde,0x3f86e3d8,4
+np.float32,0xbf7a0012,0xbfad4b9b,4
+np.float32,0x3edefce0,0x3ee6b790,4
+np.float32,0xbf0003de,0xbf060f09,4
+np.float32,0x3efc4650,0x3f03e548,4
+np.float32,0x3f4582e4,0x3f6198f5,4
+np.float32,0x3f10086c,0x3f18f9d0,4
+np.float32,0x3f1cd304,0x3f28ca77,4
+np.float32,0x3f683366,0x3f916e8d,4
+np.float32,0xbed49392,0xbedb3675,4
+np.float32,0xbf6fe5f6,0xbf9b6c0e,4
+np.float32,0xbf59b416,0xbf8224f6,4
+np.float32,0x3d20c960,0x3d20d3f4,4
+np.float32,0x3f6b00d6,0x3f94dbe7,4
+np.float32,0x3f6c26ae,0x3f965352,4
+np.float32,0xbf370ea6,0xbf4bf5dd,4
+np.float32,0x3dfe7230,0x3dff1af1,4
+np.float32,0xbefc21a8,0xbf03d038,4
+np.float32,0x3f16a990,0x3f21156a,4
+np.float32,0xbef8ac0c,0xbf01d48f,4
+np.float32,0x3f170de8,0x3f21919d,4
+np.float32,0x3db9ef80,0x3dba3122,4
+np.float32,0x3d696400,0x3d698461,4
+np.float32,0x3f007aa2,0x3f069843,4
+np.float32,0x3f22827c,0x3f3010a9,4
+np.float32,0x3f3650dc,0x3f4ae6f1,4
+np.float32,0xbf1d8037,0xbf29a5e1,4
+np.float32,0xbf08fdc4,0xbf108d0e,4
+np.float32,0xbd8df350,0xbd8e1079,4
+np.float32,0xbf36bb32,0xbf4b7e98,4
+np.float32,0x3f2e3756,0x3f3f9ced,4
+np.float32,0x3d5a6f20,0x3d5a89aa,4
+np.float32,0x3f55d568,0x3f7d1889,4
+np.float32,0x3e1ed110,0x3e1f75d9,4
+np.float32,0x3e7386b8,0x3e75e1dc,4
+np.float32,0x3f48ea0e,0x3f670434,4
+np.float32,0x3e921fb0,0x3e942f14,4
+np.float32,0xbf0d4d0b,0xbf15af7f,4
+np.float32,0x3f179ed2,0x3f224549,4
+np.float32,0xbf3a328e,0xbf507e6d,4
+np.float32,0xbf74591a,0xbfa24b6e,4
+np.float32,0x3ec7d1c4,0x3ecd4657,4
+np.float32,0xbf6ecbed,0xbf99de85,4
+np.float32,0x3db0bd00,0x3db0f559,4
+np.float32,0x7f800000,0x7fc00000,4
+np.float32,0x3e0373b8,0x3e03d0d6,4
+np.float32,0xbf439784,0xbf5e9a04,4
+np.float32,0xbef97a9e,0xbf024ac6,4
+np.float32,0x3e4d71a8,0x3e4ed90a,4
+np.float32,0xbf14d868,0xbf1ed7e3,4
+np.float32,0xbf776870,0xbfa7ce37,4
+np.float32,0xbe32a500,0xbe339038,4
+np.float32,0xbf326d8a,0xbf456c3d,4
+np.float32,0xbe9b758c,0xbe9df3e7,4
+np.float32,0x3d9515a0,0x3d95376a,4
+np.float32,0x3e3f7320,0x3e40953e,4
+np.float32,0xbee57e7e,0xbeedf84f,4
+np.float32,0x3e821e94,0x3e838ffd,4
+np.float32,0x3f74beaa,0x3fa2f721,4
+np.float32,0xbe9b7672,0xbe9df4d9,4
+np.float32,0x3f4041fc,0x3f597e71,4
+np.float32,0xbe9ea7c4,0xbea14f92,4
+np.float32,0xbf800000,0xbfc90fdb,4
+np.float32,0x3e04fb90,0x3e055bfd,4
+np.float32,0xbf14d3d6,0xbf1ed245,4
+np.float32,0xbe84ebec,0xbe86763e,4
+np.float32,0x3f08e568,0x3f107039,4
+np.float32,0x3d8dc9e0,0x3d8de6ef,4
+np.float32,0x3ea4549c,0x3ea74a94,4
+np.float32,0xbebd2806,0xbec1bf51,4
+np.float32,0x3f311a26,0x3f439498,4
+np.float32,0xbf3d2222,0xbf54cf7e,4
+np.float32,0x3e00c500,0x3e011c81,4
+np.float32,0xbe35ed1c,0xbe36e5a9,4
+np.float32,0xbd4ec020,0xbd4ed6a0,4
+np.float32,0x3e1eb088,0x3e1f54eb,4
+np.float32,0x3cf94840,0x3cf9521a,4
+np.float32,0xbf010c5d,0xbf0740e0,4
+np.float32,0xbf3bd63b,0xbf52e502,4
+np.float32,0x3f233f30,0x3f310542,4
+np.float32,0x3ea24128,0x3ea519d7,4
+np.float32,0x3f478b38,0x3f64d124,4
+np.float32,0x3f1e0c6c,0x3f2a57ec,4
+np.float32,0xbf3ad294,0xbf51680a,4
+np.float32,0x3ede0554,0x3ee5a4b4,4
+np.float32,0x3e451a98,0x3e46577d,4
+np.float32,0x3f520164,0x3f764542,4
+np.float32,0x0,0x0,4
+np.float32,0xbd056cd0,0xbd0572db,4
+np.float32,0xbf58b018,0xbf812f5e,4
+np.float32,0x3e036eb0,0x3e03cbc3,4
+np.float32,0x3d1377a0,0x3d137fc9,4
+np.float32,0xbf692d3a,0xbf929a2c,4
+np.float32,0xbec60fb8,0xbecb5dea,4
+np.float32,0x3ed23340,0x3ed89a8e,4
+np.float32,0x3c87f040,0x3c87f1d9,4
+np.float32,0x3dac62f0,0x3dac9737,4
+np.float32,0xbed97c16,0xbee09f02,4
+np.float32,0xbf2d5f3c,0xbf3e769c,4
+np.float32,0xbc3b7c40,0xbc3b7d4c,4
+np.float32,0x3ed998ec,0x3ee0bedd,4
+np.float32,0x3dd86630,0x3dd8cdcb,4
+np.float32,0x3e8b4304,0x3e8d09ea,4
+np.float32,0x3f51e6b0,0x3f761697,4
+np.float32,0x3ec51f24,0x3eca5923,4
+np.float32,0xbf647430,0xbf8d2307,4
+np.float32,0x3f253d9c,0x3f339eb2,4
+np.float32,0x3dc969d0,0x3dc9bd4b,4
+np.float32,0xbc2f1300,0xbc2f13da,4
+np.float32,0xbf170007,0xbf21806d,4
+np.float32,0x3f757d10,0x3fa4412e,4
+np.float32,0xbe7864ac,0xbe7ae564,4
+np.float32,0x3f2ffe90,0x3f420cfb,4
+np.float32,0xbe576138,0xbe590012,4
+np.float32,0xbf517a21,0xbf755959,4
+np.float32,0xbf159cfe,0xbf1fc9d5,4
+np.float32,0xbf638b2a,0xbf8c22cf,4
+np.float32,0xff800000,0x7fc00000,4
+np.float32,0x3ed19ca0,0x3ed7f569,4
+np.float32,0x3f7c4460,0x3fb32d26,4
+np.float32,0x3ebfae6c,0x3ec477ab,4
+np.float32,0x3dd452d0,0x3dd4b4a8,4
+np.float32,0x3f471482,0x3f6413fb,4
+np.float32,0xbf49d704,0xbf6883fe,4
+np.float32,0xbd42c4e0,0xbd42d7af,4
+np.float32,0xbeb02994,0xbeb3d668,4
+np.float32,0x3f4d1fd8,0x3f6dedd2,4
+np.float32,0x3efb591c,0x3f035d11,4
+np.float32,0x80000000,0x80000000,4
+np.float32,0xbf50f782,0xbf7476ad,4
+np.float32,0x3d7232c0,0x3d7256f0,4
+np.float32,0x3f649460,0x3f8d46bb,4
+np.float32,0x3f5561bc,0x3f7c46a9,4
+np.float32,0x3e64f6a0,0x3e66ea5d,4
+np.float32,0x3e5b0470,0x3e5cb8f9,4
+np.float32,0xbe9b6b2c,0xbe9de904,4
+np.float32,0x3f6c33f4,0x3f966486,4
+np.float32,0x3f5cee54,0x3f854613,4
+np.float32,0x3ed3e044,0x3eda716e,4
+np.float32,0xbf3cac7f,0xbf542131,4
+np.float32,0x3c723500,0x3c723742,4
+np.float32,0x3de59900,0x3de614d3,4
+np.float32,0xbdf292f8,0xbdf32517,4
+np.float32,0x3f05c8b2,0x3f0cc59b,4
+np.float32,0xbf1ab182,0xbf261b14,4
+np.float32,0xbda396f0,0xbda3c39a,4
+np.float32,0xbf270ed0,0xbf360231,4
+np.float32,0x3f2063e6,0x3f2d557e,4
+np.float32,0x3c550280,0x3c550409,4
+np.float32,0xbe103b48,0xbe10b679,4
+np.float32,0xbebae390,0xbebf4f40,4
+np.float32,0x3f3bc868,0x3f52d0aa,4
+np.float32,0xbd62f880,0xbd631647,4
+np.float32,0xbe7a38f4,0xbe7cc833,4
+np.float32,0x3f09d796,0x3f118f39,4
+np.float32,0xbf5fa558,0xbf8802d0,4
+np.float32,0x3f111cc8,0x3f1a48b0,4
+np.float32,0x3e831958,0x3e849356,4
+np.float32,0xbf614dbd,0xbf89bc3b,4
+np.float32,0xbd521510,0xbd522cac,4
+np.float32,0x3f05af22,0x3f0ca7a0,4
+np.float32,0xbf1ac60e,0xbf2634df,4
+np.float32,0xbf6bd05e,0xbf95e3fe,4
+np.float32,0xbd1fa6e0,0xbd1fb13b,4
+np.float32,0xbeb82f7a,0xbebc68b1,4
+np.float32,0xbd92aaf8,0xbd92cb23,4
+np.float32,0xbe073a54,0xbe079fbf,4
+np.float32,0xbf198655,0xbf24a468,4
+np.float32,0x3f62f6d8,0x3f8b81ba,4
+np.float32,0x3eef4310,0x3ef8f4f9,4
+np.float32,0x3e8988e0,0x3e8b3eae,4
+np.float32,0xbf3ddba5,0xbf55e367,4
+np.float32,0x3dc6d2e0,0x3dc7232b,4
+np.float32,0xbf31040e,0xbf437601,4
+np.float32,0x3f1bb74a,0x3f276442,4
+np.float32,0xbf0075d2,0xbf0692b3,4
+np.float32,0xbf606ce0,0xbf88d0ff,4
+np.float32,0xbf083856,0xbf0fa39d,4
+np.float32,0xbdb25b20,0xbdb2950a,4
+np.float32,0xbeb86860,0xbebca5ae,4
+np.float32,0x3de83160,0x3de8b176,4
+np.float32,0xbf33a98f,0xbf472664,4
+np.float32,0x3e7795f8,0x3e7a1058,4
+np.float32,0x3e0ca6f8,0x3e0d192a,4
+np.float32,0xbf1aef60,0xbf2668c3,4
+np.float32,0xbda53b58,0xbda5695e,4
+np.float32,0xbf178096,0xbf221fc5,4
+np.float32,0xbf0a4159,0xbf120ccf,4
+np.float32,0x3f7bca36,0x3fb1d0df,4
+np.float32,0xbef94360,0xbf022b26,4
+np.float32,0xbef16f36,0xbefb6ad6,4
+np.float32,0x3f53a7e6,0x3f792e25,4
+np.float32,0xbf7c536f,0xbfb35993,4
+np.float32,0xbe84aaa0,0xbe8632a2,4
+np.float32,0x3ecb3998,0x3ed0fab9,4
+np.float32,0x3f539304,0x3f79090a,4
+np.float32,0xbf3c7816,0xbf53d3b3,4
+np.float32,0xbe7a387c,0xbe7cc7b7,4
+np.float32,0x3f7000e4,0x3f9b92b1,4
+np.float32,0x3e08fd70,0x3e0966e5,4
+np.float32,0x3db97ba0,0x3db9bcc8,4
+np.float32,0xbee99056,0xbef2886a,4
+np.float32,0xbf0668da,0xbf0d819e,4
+np.float32,0x3e58a408,0x3e5a4a51,4
+np.float32,0x3f3440b8,0x3f47faed,4
+np.float32,0xbf19a2ce,0xbf24c7ff,4
+np.float32,0xbe75e990,0xbe7856ee,4
+np.float32,0x3f3c865c,0x3f53e8cb,4
+np.float32,0x3e5e03d0,0x3e5fcac9,4
+np.float32,0x3edb8e34,0x3ee2e932,4
+np.float32,0xbf7e1f5f,0xbfb98ce4,4
+np.float32,0xbf7372ff,0xbfa0d0ae,4
+np.float32,0xbf3ee850,0xbf577548,4
+np.float32,0x3ef19658,0x3efb9737,4
+np.float32,0xbe8088de,0xbe81ecaf,4
+np.float32,0x800000,0x800000,4
+np.float32,0xbde39dd8,0xbde4167a,4
+np.float32,0xbf065d7a,0xbf0d7441,4
+np.float32,0xbde52c78,0xbde5a79b,4
+np.float32,0xbe3a28c0,0xbe3b333e,4
+np.float32,0x3f6e8b3c,0x3f998516,4
+np.float32,0x3f3485c2,0x3f485c39,4
+np.float32,0x3e6f2c68,0x3e71673e,4
+np.float32,0xbe4ec9cc,0xbe50385e,4
+np.float32,0xbf1c3bb0,0xbf280b39,4
+np.float32,0x3ec8ea18,0x3ece76f7,4
+np.float32,0x3e26b5f8,0x3e2774c9,4
+np.float32,0x3e1e4a38,0x3e1eed5c,4
+np.float32,0xbee7a106,0xbef05c6b,4
+np.float32,0xbf305928,0xbf4289d8,4
+np.float32,0x3f0c431c,0x3f147118,4
+np.float32,0xbe57ba6c,0xbe595b52,4
+np.float32,0x3eabc9cc,0x3eaf2fc7,4
+np.float32,0xbef1ed24,0xbefbf9ae,4
+np.float32,0xbf61b576,0xbf8a29cc,4
+np.float32,0x3e9c1ff4,0x3e9ea6cb,4
+np.float32,0x3f6c53b2,0x3f968dbe,4
+np.float32,0x3e2d1b80,0x3e2df156,4
+np.float32,0x3e9f2f70,0x3ea1de4a,4
+np.float32,0xbf5861ee,0xbf80e61a,4
+np.float32,0x3f429144,0x3f5d0505,4
+np.float32,0x3e235cc8,0x3e24103e,4
+np.float32,0xbf354879,0xbf496f6a,4
+np.float32,0xbf20a146,0xbf2da447,4
+np.float32,0x3e8d8968,0x3e8f6785,4
+np.float32,0x3f3fbc94,0x3f58b4c1,4
+np.float32,0x3f2c5f50,0x3f3d1b9f,4
+np.float32,0x3f7bf0f8,0x3fb23d23,4
+np.float32,0xbf218282,0xbf2ec60f,4
+np.float32,0x3f2545aa,0x3f33a93e,4
+np.float32,0xbf4b17be,0xbf6a9018,4
+np.float32,0xbb9df700,0xbb9df728,4
+np.float32,0x3f685d54,0x3f91a06c,4
+np.float32,0x3efdfe2c,0x3f04e24c,4
+np.float32,0x3ef1c5a0,0x3efbccd9,4
+np.float32,0xbf41d731,0xbf5be76e,4
+np.float32,0x3ebd1360,0x3ec1a919,4
+np.float32,0xbf706bd4,0xbf9c2d58,4
+np.float32,0x3ea525e4,0x3ea8279d,4
+np.float32,0xbe51f1b0,0xbe537186,4
+np.float32,0x3f5e8cf6,0x3f86e4f4,4
+np.float32,0xbdad2520,0xbdad5a19,4
+np.float32,0xbf5c5704,0xbf84b0e5,4
+np.float32,0x3f47b54e,0x3f65145e,4
+np.float32,0x3eb4fc78,0x3eb8fc0c,4
+np.float32,0x3dca1450,0x3dca68a1,4
+np.float32,0x3eb02a74,0x3eb3d757,4
+np.float32,0x3f74ae6a,0x3fa2db75,4
+np.float32,0x3f800000,0x3fc90fdb,4
+np.float32,0xbdb46a00,0xbdb4a5f2,4
+np.float32,0xbe9f2ba6,0xbea1da4e,4
+np.float32,0x3f0afa70,0x3f12e8f7,4
+np.float32,0xbf677b20,0xbf909547,4
+np.float32,0x3eff9188,0x3f05cacf,4
+np.float32,0x3f720562,0x3f9e911b,4
+np.float32,0xbf7180d8,0xbf9dc794,4
+np.float32,0xbee7d076,0xbef0919d,4
+np.float32,0x3f0432ce,0x3f0aea95,4
+np.float32,0x3f3bc4c8,0x3f52cb54,4
+np.float32,0xbea72f30,0xbeaa4ebe,4
+np.float32,0x3e90ed00,0x3e92ef33,4
+np.float32,0xbda63670,0xbda6654a,4
+np.float32,0xbf5a6f85,0xbf82d7e0,4
+np.float32,0x3e6e8808,0x3e70be34,4
+np.float32,0xbf4f3822,0xbf71768f,4
+np.float32,0x3e5c8a68,0x3e5e483f,4
+np.float32,0xbf0669d4,0xbf0d82c4,4
+np.float32,0xbf79f77c,0xbfad37b0,4
+np.float32,0x3f25c82c,0x3f345453,4
+np.float32,0x3f1b2948,0x3f26b188,4
+np.float32,0x3ef7e288,0x3f016159,4
+np.float32,0x3c274280,0x3c27433e,4
+np.float32,0xbf4c8fa0,0xbf6cfd5e,4
+np.float32,0x3ea4ccb4,0x3ea7c966,4
+np.float32,0xbf7b157e,0xbfafefca,4
+np.float32,0xbee4c2b0,0xbeed264d,4
+np.float32,0xbc1fd640,0xbc1fd6e6,4
+np.float32,0x3e892308,0x3e8ad4f6,4
+np.float32,0xbf3f69c7,0xbf5837ed,4
+np.float32,0x3ec879e8,0x3ecdfd05,4
+np.float32,0x3f07a8c6,0x3f0efa30,4
+np.float32,0x3f67b880,0x3f90dd4d,4
+np.float32,0x3e8a11c8,0x3e8bccd5,4
+np.float32,0x3f7df6fc,0x3fb8e935,4
+np.float32,0xbef3e498,0xbefe3599,4
+np.float32,0xbf18ad7d,0xbf2395d8,4
+np.float32,0x3f2bce74,0x3f3c57f5,4
+np.float32,0xbf38086e,0xbf4d5c2e,4
+np.float32,0x3f772d7a,0x3fa75c35,4
+np.float32,0xbf3b6e24,0xbf524c00,4
+np.float32,0xbdd39108,0xbdd3f1d4,4
+np.float32,0xbf691f6b,0xbf928974,4
+np.float32,0x3f146188,0x3f1e45e4,4
+np.float32,0xbf56045b,0xbf7d6e03,4
+np.float32,0xbf4b2ee4,0xbf6ab622,4
+np.float32,0xbf3fa3f6,0xbf588f9d,4
+np.float32,0x3f127bb0,0x3f1bf398,4
+np.float32,0x3ed858a0,0x3edf5d3e,4
+np.float32,0xbd6de3b0,0xbd6e05fa,4
+np.float32,0xbecc662c,0xbed24261,4
+np.float32,0xbd6791d0,0xbd67b170,4
+np.float32,0xbf146016,0xbf1e441e,4
+np.float32,0xbf61f04c,0xbf8a6841,4
+np.float32,0xbe7f16d0,0xbe80e6e7,4
+np.float32,0xbebf93e6,0xbec45b10,4
+np.float32,0xbe8a59fc,0xbe8c17d1,4
+np.float32,0xbebc7a0c,0xbec10426,4
+np.float32,0xbf2a682e,0xbf3a7649,4
+np.float32,0xbe18d0cc,0xbe19637b,4
+np.float32,0x3d7f5100,0x3d7f7b66,4
+np.float32,0xbf10f5fa,0xbf1a1998,4
+np.float32,0x3f25e956,0x3f347fdc,4
+np.float32,0x3e6e8658,0x3e70bc78,4
+np.float32,0x3f21a5de,0x3f2ef3a5,4
+np.float32,0xbf4e71d4,0xbf702607,4
+np.float32,0xbf49d6b6,0xbf688380,4
+np.float32,0xbdb729c0,0xbdb7687c,4
+np.float32,0xbf63e1f4,0xbf8c81c7,4
+np.float32,0x3dda6cb0,0x3ddad73e,4
+np.float32,0x3ee1bc40,0x3ee9c612,4
+np.float32,0x3ebdb5f8,0x3ec2581b,4
+np.float32,0x3f7d9576,0x3fb77646,4
+np.float32,0x3e087140,0x3e08d971,4
+np.float64,0xbfdba523cfb74a48,0xbfdc960ddd9c0506,3
+np.float64,0x3fb51773622a2ee0,0x3fb51d93f77089d5,3
+np.float64,0x3fc839f6d33073f0,0x3fc85f9a47dfe8e6,3
+np.float64,0xbfecba2d82f9745b,0xbff1d55416c6c993,3
+np.float64,0x3fd520fe47aa41fc,0x3fd58867f1179634,3
+np.float64,0x3fe1b369c56366d4,0x3fe2c1ac9dd2c45a,3
+np.float64,0xbfec25a7cd784b50,0xbff133417389b12d,3
+np.float64,0xbfd286342ea50c68,0xbfd2cb0bca22e66d,3
+np.float64,0x3fd5f6fe5eabedfc,0x3fd66bad16680d08,3
+np.float64,0xbfe863a87570c751,0xbfebbb9b637eb6dc,3
+np.float64,0x3fc97f5b4d32feb8,0x3fc9ab5066d8eaec,3
+np.float64,0xbfcb667af936ccf4,0xbfcb9d3017047a1d,3
+np.float64,0xbfd1b7b9afa36f74,0xbfd1f3c175706154,3
+np.float64,0x3fef97385b7f2e70,0x3ff6922a1a6c709f,3
+np.float64,0xbfd13e4205a27c84,0xbfd1757c993cdb74,3
+np.float64,0xbfd18d88aca31b12,0xbfd1c7dd75068f7d,3
+np.float64,0x3fe040ce0f60819c,0x3fe10c59d2a27089,3
+np.float64,0xbfddc7deddbb8fbe,0xbfdef9de5baecdda,3
+np.float64,0xbfcf6e96193edd2c,0xbfcfc1bb7396b9a3,3
+np.float64,0x3fd544f494aa89e8,0x3fd5ae850e2b37dd,3
+np.float64,0x3fe15b381fe2b670,0x3fe25841c7bfe2af,3
+np.float64,0xbfde793420bcf268,0xbfdfc2ddc7b4a341,3
+np.float64,0x3fd0d5db30a1abb8,0x3fd1092cef4aa4fb,3
+np.float64,0x3fe386a08c670d42,0x3fe50059bbf7f491,3
+np.float64,0xbfe0aae3a96155c8,0xbfe1880ef13e95ce,3
+np.float64,0xbfe80eeb03f01dd6,0xbfeb39e9f107e944,3
+np.float64,0xbfd531af3caa635e,0xbfd59a178f17552a,3
+np.float64,0x3fcced14ab39da28,0x3fcd2d9a806337ef,3
+np.float64,0xbfdb4c71bcb698e4,0xbfdc33d9d9daf708,3
+np.float64,0xbfde7375ecbce6ec,0xbfdfbc5611bc48ff,3
+np.float64,0x3fecc5707a798ae0,0x3ff1e2268d778017,3
+np.float64,0x3fe8f210a1f1e422,0x3fec9b3349a5baa2,3
+np.float64,0x3fe357f9b8e6aff4,0x3fe4c5a0b89a9228,3
+np.float64,0xbfe0f863b761f0c8,0xbfe1e3283494c3d4,3
+np.float64,0x3fd017c395a02f88,0x3fd044761f2f4a66,3
+np.float64,0x3febeb4746f7d68e,0x3ff0f6b955e7feb6,3
+np.float64,0xbfbdaaeeae3b55e0,0xbfbdbc0950109261,3
+np.float64,0xbfea013095f40261,0xbfee5b8fe8ad8593,3
+np.float64,0xbfe9f87b7973f0f7,0xbfee4ca3a8438d72,3
+np.float64,0x3fd37f77cfa6fef0,0x3fd3d018c825f057,3
+np.float64,0x3fb0799cee20f340,0x3fb07c879e7cb63f,3
+np.float64,0xbfdcfd581cb9fab0,0xbfde15e35314b52d,3
+np.float64,0xbfd49781b8a92f04,0xbfd4f6fa1516fefc,3
+np.float64,0x3fb3fcb6d627f970,0x3fb401ed44a713a8,3
+np.float64,0x3fd5737ef8aae6fc,0x3fd5dfe42d4416c7,3
+np.float64,0x7ff4000000000000,0x7ffc000000000000,3
+np.float64,0xbfe56ae780ead5cf,0xbfe776ea5721b900,3
+np.float64,0x3fd4567786a8acf0,0x3fd4b255421c161a,3
+np.float64,0x3fef6fb58cfedf6c,0x3ff62012dfcf0a33,3
+np.float64,0xbfd1dbcd3da3b79a,0xbfd2194fd628f74d,3
+np.float64,0x3fd9350016b26a00,0x3fd9e8b01eb023e9,3
+np.float64,0xbfe4fb3a69e9f675,0xbfe6e1d2c9eca56c,3
+np.float64,0x3fe9fe0f73f3fc1e,0x3fee5631cfd39772,3
+np.float64,0xbfd51c1bc6aa3838,0xbfd5833b3bd53543,3
+np.float64,0x3fc64158e12c82b0,0x3fc65e7352f237d7,3
+np.float64,0x3fd0d8ee1ba1b1dc,0x3fd10c5c99a16f0e,3
+np.float64,0x3fd5554e15aaaa9c,0x3fd5bfdb9ec9e873,3
+np.float64,0x3fe61ce209ec39c4,0x3fe869bc4c28437d,3
+np.float64,0xbfe4e42c8c69c859,0xbfe6c356dac7e2db,3
+np.float64,0xbfe157021062ae04,0xbfe2533ed39f4212,3
+np.float64,0x3fe844066cf0880c,0x3feb8aea0b7bd0a4,3
+np.float64,0x3fe55016586aa02c,0x3fe752e4b2a67b9f,3
+np.float64,0x3fdabce619b579cc,0x3fdb95809bc789d9,3
+np.float64,0x3fee03bae37c0776,0x3ff3778ba38ca882,3
+np.float64,0xbfeb2f5844f65eb0,0xbff03dd1b767d3c8,3
+np.float64,0x3fedcfdbaffb9fb8,0x3ff32e81d0639164,3
+np.float64,0x3fe06fc63ee0df8c,0x3fe142fc27f92eaf,3
+np.float64,0x3fe7ce90fd6f9d22,0x3fead8f832bbbf5d,3
+np.float64,0xbfbc0015ce380028,0xbfbc0e7470e06e86,3
+np.float64,0xbfe9b3de90f367bd,0xbfedd857931dfc6b,3
+np.float64,0xbfcb588f5936b120,0xbfcb8ef0124a4f21,3
+np.float64,0x3f8d376a503a6f00,0x3f8d37ab43e7988d,3
+np.float64,0xbfdb123a40b62474,0xbfdbf38b6cf5db92,3
+np.float64,0xbfee7da6be7cfb4e,0xbff433042cd9d5eb,3
+np.float64,0xbfc4c9e01b2993c0,0xbfc4e18dbafe37ef,3
+np.float64,0x3fedd42faffba860,0x3ff334790cd18a19,3
+np.float64,0x3fe9cdf772f39bee,0x3fee044f87b856ab,3
+np.float64,0x3fe0245881e048b2,0x3fe0eb5a1f739c8d,3
+np.float64,0xbfe4712bd9e8e258,0xbfe62cb3d82034aa,3
+np.float64,0x3fe9a16b46f342d6,0x3fedb972b2542551,3
+np.float64,0xbfe57ab4536af568,0xbfe78c34b03569c2,3
+np.float64,0x3fb6d6ceb22dada0,0x3fb6de976964d6dd,3
+np.float64,0x3fc3ac23a3275848,0x3fc3c02de53919b8,3
+np.float64,0xbfccb531e7396a64,0xbfccf43ec69f6281,3
+np.float64,0xbfd2f07fc8a5e100,0xbfd33a35a8c41b62,3
+np.float64,0xbfe3e5dd04e7cbba,0xbfe57940157c27ba,3
+np.float64,0x3feefe40757dfc80,0x3ff51bc72b846af6,3
+np.float64,0x8000000000000001,0x8000000000000001,3
+np.float64,0x3fecb7b766796f6e,0x3ff1d28972a0fc7e,3
+np.float64,0xbfea1bf1357437e2,0xbfee89a6532bfd71,3
+np.float64,0xbfca3983b7347308,0xbfca696463b791ef,3
+np.float64,0x10000000000000,0x10000000000000,3
+np.float64,0xbf886b45d030d680,0xbf886b6bbc04314b,3
+np.float64,0x3fd5224bb5aa4498,0x3fd589c92e82218f,3
+np.float64,0xbfec799874f8f331,0xbff18d5158b8e640,3
+np.float64,0xbf88124410302480,0xbf88126863350a16,3
+np.float64,0xbfe37feaaa66ffd6,0xbfe4f7e24382e79d,3
+np.float64,0x3fd777eca1aeefd8,0x3fd8076ead6d55dc,3
+np.float64,0x3fecaaeb3af955d6,0x3ff1c4159fa3e965,3
+np.float64,0xbfeb81e4e6f703ca,0xbff08d4e4c77fada,3
+np.float64,0xbfd7d0a0edafa142,0xbfd866e37010312e,3
+np.float64,0x3feda48c00fb4918,0x3ff2f3fd33c36307,3
+np.float64,0x3feb87ecc4770fda,0x3ff09336e490deda,3
+np.float64,0xbfefd78ad27faf16,0xbff78abbafb50ac1,3
+np.float64,0x3fe58e918c6b1d24,0x3fe7a70b38cbf016,3
+np.float64,0x3fda163b95b42c78,0x3fdade86b88ba4ee,3
+np.float64,0x3fe8fc1aaf71f836,0x3fecab3f93b59df5,3
+np.float64,0xbf8de56f903bcac0,0xbf8de5b527cec797,3
+np.float64,0xbfec112db2f8225b,0xbff11dd648de706f,3
+np.float64,0x3fc3214713264290,0x3fc333b1c862f7d0,3
+np.float64,0xbfeb5e5836f6bcb0,0xbff06ac364b49177,3
+np.float64,0x3fc23d9777247b30,0x3fc24d8ae3bcb615,3
+np.float64,0xbfdf0eed65be1dda,0xbfe036cea9b9dfb6,3
+np.float64,0xbfb2d5c85a25ab90,0xbfb2da24bb409ff3,3
+np.float64,0xbfecdda0c3f9bb42,0xbff1fdf94fc6e89e,3
+np.float64,0x3fdfe79154bfcf24,0x3fe0b338e0476a9d,3
+np.float64,0xbfd712ac6bae2558,0xbfd79abde21f287b,3
+np.float64,0x3fea3f148a747e2a,0x3feec6bed9d4fa04,3
+np.float64,0x3fd4879e4ca90f3c,0x3fd4e632fa4e2edd,3
+np.float64,0x3fe9137a9e7226f6,0x3fecd0c441088d6a,3
+np.float64,0xbfc75bf4ef2eb7e8,0xbfc77da8347d742d,3
+np.float64,0xbfd94090a0b28122,0xbfd9f5458816ed5a,3
+np.float64,0x3fde439cbcbc8738,0x3fdf85fbf496b61f,3
+np.float64,0xbfe18bacdce3175a,0xbfe29210e01237f7,3
+np.float64,0xbfd58ec413ab1d88,0xbfd5fcd838f0a934,3
+np.float64,0xbfeae5af2d75cb5e,0xbfeff1de1b4a06be,3
+np.float64,0x3fb64d1a162c9a30,0x3fb65458fb831354,3
+np.float64,0x3fc18b1e15231640,0x3fc1994c6ffd7a6a,3
+np.float64,0xbfd7b881bcaf7104,0xbfd84ce89a9ee8c7,3
+np.float64,0x3feb916a40f722d4,0x3ff09c8aa851d7c4,3
+np.float64,0x3fdab5fbb5b56bf8,0x3fdb8de43961bbde,3
+np.float64,0x3fe4f35402e9e6a8,0x3fe6d75dc5082894,3
+np.float64,0x3fe2fdb2e5e5fb66,0x3fe454e32a5d2182,3
+np.float64,0x3fe8607195f0c0e4,0x3febb6a4c3bf6a5c,3
+np.float64,0x3fd543ca9aaa8794,0x3fd5ad49203ae572,3
+np.float64,0x3fe8e05ca1f1c0ba,0x3fec7eff123dcc58,3
+np.float64,0x3fe298b6ca65316e,0x3fe3d81d2927c4dd,3
+np.float64,0x3fcfecea733fd9d8,0x3fd0220f1d0faf78,3
+np.float64,0xbfe2e739f065ce74,0xbfe439004e73772a,3
+np.float64,0xbfd1ae6b82a35cd8,0xbfd1ea129a5ee756,3
+np.float64,0xbfeb7edff576fdc0,0xbff08a5a638b8a8b,3
+np.float64,0x3fe5b645ff6b6c8c,0x3fe7dcee1faefe3f,3
+np.float64,0xbfd478427ba8f084,0xbfd4d5fc7c239e60,3
+np.float64,0xbfe39904e3e7320a,0xbfe517972b30b1e5,3
+np.float64,0xbfd3b75b6ba76eb6,0xbfd40acf20a6e074,3
+np.float64,0x3fd596267aab2c4c,0x3fd604b01faeaf75,3
+np.float64,0x3fe134463762688c,0x3fe229fc36784a72,3
+np.float64,0x3fd25dadf7a4bb5c,0x3fd2a0b9e04ea060,3
+np.float64,0xbfc05d3e0b20ba7c,0xbfc068bd2bb9966f,3
+np.float64,0x3f8cf517b039ea00,0x3f8cf556ed74b163,3
+np.float64,0x3fda87361cb50e6c,0x3fdb5a75af897e7f,3
+np.float64,0x3fe53e1926ea7c32,0x3fe73acf01b8ff31,3
+np.float64,0x3fe2e94857e5d290,0x3fe43b8cc820f9c7,3
+np.float64,0x3fd81fe6acb03fcc,0x3fd8bc623c0068cf,3
+np.float64,0xbfddf662c3bbecc6,0xbfdf2e76dc90786e,3
+np.float64,0x3fece174fbf9c2ea,0x3ff2026a1a889580,3
+np.float64,0xbfdc83c5b8b9078c,0xbfdd8dcf6ee3b7da,3
+np.float64,0x3feaf5448f75ea8a,0x3ff0075b108bcd0d,3
+np.float64,0xbfebf32f7ef7e65f,0xbff0fed42aaa826a,3
+np.float64,0x3fe389e5e8e713cc,0x3fe5047ade055ccb,3
+np.float64,0x3f635cdcc026ba00,0x3f635cddeea082ce,3
+np.float64,0x3fae580f543cb020,0x3fae5c9d5108a796,3
+np.float64,0x3fec9fafce793f60,0x3ff1b77bec654f00,3
+np.float64,0x3fb19d226e233a40,0x3fb1a0b32531f7ee,3
+np.float64,0xbfdf9a71e7bf34e4,0xbfe086cef88626c7,3
+np.float64,0x8010000000000000,0x8010000000000000,3
+np.float64,0xbfef170ba2fe2e17,0xbff54ed4675f5b8a,3
+np.float64,0xbfcc6e2f8f38dc60,0xbfccab65fc34d183,3
+np.float64,0x3fee756c4bfcead8,0x3ff4258782c137e6,3
+np.float64,0xbfd461c218a8c384,0xbfd4be3e391f0ff4,3
+np.float64,0xbfe3b64686e76c8d,0xbfe53caa16d6c90f,3
+np.float64,0xbfc1c65d8d238cbc,0xbfc1d51e58f82403,3
+np.float64,0x3fe6e06c63edc0d8,0x3fe97cb832eeb6a2,3
+np.float64,0xbfc9fc20b933f840,0xbfca2ab004312d85,3
+np.float64,0xbfe29aa6df65354e,0xbfe3da7ecf3ba466,3
+np.float64,0x3fea4df7d1749bf0,0x3feee0d448bd4746,3
+np.float64,0xbfedec6161fbd8c3,0xbff3563e1d943aa2,3
+np.float64,0x3fdb6f0437b6de08,0x3fdc5a1888b1213d,3
+np.float64,0xbfe270cbd3e4e198,0xbfe3a72ac27a0b0c,3
+np.float64,0xbfdfff8068bfff00,0xbfe0c1088e3b8983,3
+np.float64,0xbfd28edbe6a51db8,0xbfd2d416c8ed363e,3
+np.float64,0xbfb4e35f9229c6c0,0xbfb4e9531d2a737f,3
+np.float64,0xbfee6727e97cce50,0xbff40e7717576e46,3
+np.float64,0xbfddb5fbddbb6bf8,0xbfdee5aad78f5361,3
+np.float64,0xbfdf9d3e9dbf3a7e,0xbfe0886b191f2957,3
+np.float64,0x3fa57e77042afce0,0x3fa5801518ea9342,3
+np.float64,0x3f95c4e4882b89c0,0x3f95c55003c8e714,3
+np.float64,0x3fd9b10f61b36220,0x3fda6fe5d635a8aa,3
+np.float64,0xbfe2973411652e68,0xbfe3d641fe9885fd,3
+np.float64,0xbfee87bd5a7d0f7b,0xbff443bea81b3fff,3
+np.float64,0x3f9ea064c83d40c0,0x3f9ea19025085b2f,3
+np.float64,0xbfe4b823dfe97048,0xbfe689623d30dc75,3
+np.float64,0xbfa06a326c20d460,0xbfa06aeacbcd3eb8,3
+np.float64,0x3fe1e5c4c1e3cb8a,0x3fe2fe44b822f20e,3
+np.float64,0x3f99dafaa833b600,0x3f99dbaec10a1a0a,3
+np.float64,0xbfed7cb3877af967,0xbff2bfe9e556aaf9,3
+np.float64,0x3fd604f2e2ac09e4,0x3fd67a89408ce6ba,3
+np.float64,0x3fec57b60f78af6c,0x3ff16881f46d60f7,3
+np.float64,0xbfea2e3a17745c74,0xbfeea95c7190fd42,3
+np.float64,0xbfd60a7c37ac14f8,0xbfd6806ed642de35,3
+np.float64,0xbfe544b9726a8973,0xbfe743ac399d81d7,3
+np.float64,0xbfd13520faa26a42,0xbfd16c02034a8fe0,3
+np.float64,0xbfea9ea59ff53d4b,0xbfef70538ee12e00,3
+np.float64,0x3fd66633f8accc68,0x3fd6e23c13ab0e9e,3
+np.float64,0xbfe4071bd3e80e38,0xbfe5a3c9ba897d81,3
+np.float64,0xbfbe1659fa3c2cb0,0xbfbe2831d4fed196,3
+np.float64,0xbfd3312777a6624e,0xbfd37df09b9baeba,3
+np.float64,0x3fd13997caa27330,0x3fd170a4900c8907,3
+np.float64,0xbfe7cbc235ef9784,0xbfead4c4d6cbf129,3
+np.float64,0xbfe1456571628acb,0xbfe23e4ec768c8e2,3
+np.float64,0xbfedf1a044fbe340,0xbff35da96773e176,3
+np.float64,0x3fce38b1553c7160,0x3fce8270709774f9,3
+np.float64,0xbfecb01761f9602f,0xbff1c9e9d382f1f8,3
+np.float64,0xbfe0a03560e1406b,0xbfe17b8d5a1ca662,3
+np.float64,0x3fe50f37cbea1e70,0x3fe6fc55e1ae7da6,3
+np.float64,0xbfe12d64a0625aca,0xbfe221d3a7834e43,3
+np.float64,0xbf6fb288403f6500,0xbf6fb28d6f389db6,3
+np.float64,0x3fda831765b50630,0x3fdb55eecae58ca9,3
+np.float64,0x3fe1a0fe4c6341fc,0x3fe2ab9564304425,3
+np.float64,0xbfef2678a77e4cf1,0xbff56ff42b2797bb,3
+np.float64,0xbfab269c1c364d40,0xbfab29df1cd48779,3
+np.float64,0x3fe8ec82a271d906,0x3fec92567d7a6675,3
+np.float64,0xbfc235115f246a24,0xbfc244ee567682ea,3
+np.float64,0x3feef5bf8d7deb80,0x3ff50ad4875ee9bd,3
+np.float64,0x3fe768b5486ed16a,0x3fea421356160e65,3
+np.float64,0xbfd4255684a84aae,0xbfd47e8baf7ec7f6,3
+np.float64,0x3fc7f67f2b2fed00,0x3fc81ae83cf92dd5,3
+np.float64,0x3fe9b1b19a736364,0x3fedd4b0e24ee741,3
+np.float64,0x3fb27eb9e624fd70,0x3fb282dacd89ce28,3
+np.float64,0xbfd490b710a9216e,0xbfd4efcdeb213458,3
+np.float64,0xbfd1347b2ca268f6,0xbfd16b55dece2d38,3
+np.float64,0x3fc6a5668d2d4ad0,0x3fc6c41452c0c087,3
+np.float64,0xbfca7b209f34f640,0xbfcaac710486f6bd,3
+np.float64,0x3fc23a1a47247438,0x3fc24a047fd4c27a,3
+np.float64,0x3fdb1413a8b62828,0x3fdbf595e2d994bc,3
+np.float64,0xbfea69b396f4d367,0xbfef11bdd2b0709a,3
+np.float64,0x3fd14c9958a29934,0x3fd1846161b10422,3
+np.float64,0xbfe205f44be40be8,0xbfe325283aa3c6a8,3
+np.float64,0x3fecd03c9ef9a07a,0x3ff1ee85aaf52a01,3
+np.float64,0x3fe34281d7e68504,0x3fe4aab63e6de816,3
+np.float64,0xbfe120e2376241c4,0xbfe213023ab03939,3
+np.float64,0xbfe951edc4f2a3dc,0xbfed3615e38576f8,3
+np.float64,0x3fe5a2286f6b4450,0x3fe7c196e0ec10ed,3
+np.float64,0xbfed7a3e1f7af47c,0xbff2bcc0793555d2,3
+np.float64,0x3fe050274960a04e,0x3fe11e2e256ea5cc,3
+np.float64,0xbfcfa71f653f4e40,0xbfcffc11483d6a06,3
+np.float64,0x3f6ead2e403d5a00,0x3f6ead32f314c052,3
+np.float64,0x3fe3a2a026674540,0x3fe523bfe085f6ec,3
+np.float64,0xbfe294a62e65294c,0xbfe3d31ebd0b4ca2,3
+np.float64,0xbfb4894d06291298,0xbfb48ef4b8e256b8,3
+np.float64,0xbfc0c042c1218084,0xbfc0cc98ac2767c4,3
+np.float64,0xbfc6a32cb52d4658,0xbfc6c1d1597ed06b,3
+np.float64,0xbfd30f7777a61eee,0xbfd35aa39fee34eb,3
+np.float64,0x3fe7fc2c2eeff858,0x3feb1d8a558b5537,3
+np.float64,0x7fefffffffffffff,0x7ff8000000000000,3
+np.float64,0xbfdadf917bb5bf22,0xbfdbbbae9a9f67a0,3
+np.float64,0xbfcf0395e13e072c,0xbfcf5366015f7362,3
+np.float64,0xbfe8644c9170c899,0xbfebbc98e74a227d,3
+np.float64,0x3fc3b2d8e52765b0,0x3fc3c6f7d44cffaa,3
+np.float64,0x3fc57407b92ae810,0x3fc58e12ccdd47a1,3
+np.float64,0x3fd56a560daad4ac,0x3fd5d62b8dfcc058,3
+np.float64,0x3fd595deefab2bbc,0x3fd6046420b2f79b,3
+np.float64,0xbfd5360f50aa6c1e,0xbfd59ebaacd815b8,3
+np.float64,0x3fdfb6aababf6d54,0x3fe0970b8aac9f61,3
+np.float64,0x3ff0000000000000,0x3ff921fb54442d18,3
+np.float64,0xbfeb3a8958f67513,0xbff04872e8278c79,3
+np.float64,0x3f9e1ea6683c3d40,0x3f9e1fc326186705,3
+np.float64,0x3fe6b6d5986d6dac,0x3fe94175bd60b19d,3
+np.float64,0xbfee4d90b77c9b21,0xbff3e60e9134edc2,3
+np.float64,0x3fd806ce0cb00d9c,0x3fd8a14c4855a8f5,3
+np.float64,0x3fd54acc75aa9598,0x3fd5b4b72fcbb5df,3
+np.float64,0xbfe59761f16b2ec4,0xbfe7b2fa5d0244ac,3
+np.float64,0xbfcd4fa3513a9f48,0xbfcd92d0814a5383,3
+np.float64,0xbfdc827523b904ea,0xbfdd8c577b53053c,3
+np.float64,0xbfd4bb7f34a976fe,0xbfd51d00d9a99360,3
+np.float64,0xbfe818bc87f03179,0xbfeb48d1ea0199c5,3
+np.float64,0xbfa8a2e15c3145c0,0xbfa8a5510ba0e45c,3
+np.float64,0xbfb6d15f422da2c0,0xbfb6d922689da015,3
+np.float64,0x3fcd04eaab3a09d8,0x3fcd46131746ef08,3
+np.float64,0x3fcfb5cfbb3f6ba0,0x3fd0059d308237f3,3
+np.float64,0x3fe8dcf609f1b9ec,0x3fec7997973010b6,3
+np.float64,0xbfdf1834d7be306a,0xbfe03c1d4e2b48f0,3
+np.float64,0x3fee82ae50fd055c,0x3ff43b545066fe1a,3
+np.float64,0xbfde039c08bc0738,0xbfdf3d6ed4d2ee5c,3
+np.float64,0x3fec07389bf80e72,0x3ff1137ed0acd161,3
+np.float64,0xbfef44c010fe8980,0xbff5b488ad22a4c5,3
+np.float64,0x3f76e722e02dce00,0x3f76e72ab2759d88,3
+np.float64,0xbfcaa9e6053553cc,0xbfcadc41125fca93,3
+np.float64,0x3fed6088147ac110,0x3ff29c06c4ef35fc,3
+np.float64,0x3fd32bd836a657b0,0x3fd3785fdb75909f,3
+np.float64,0xbfeedbb1d97db764,0xbff4d87f6c82a93c,3
+np.float64,0xbfe40f31d5e81e64,0xbfe5ae292cf258a2,3
+np.float64,0x7ff8000000000000,0x7ff8000000000000,3
+np.float64,0xbfeb2b25bc76564c,0xbff039d81388550c,3
+np.float64,0x3fec5008fa78a012,0x3ff1604195801da3,3
+np.float64,0x3fce2d4f293c5aa0,0x3fce76b99c2db4da,3
+np.float64,0xbfdc435412b886a8,0xbfdd45e7b7813f1e,3
+np.float64,0x3fdf2c9d06be593c,0x3fe047cb03c141b6,3
+np.float64,0x3fddefc61ebbdf8c,0x3fdf26fb8fad9fae,3
+np.float64,0x3fab50218436a040,0x3fab537395eaf3bb,3
+np.float64,0xbfd5b95a8fab72b6,0xbfd62a191a59343a,3
+np.float64,0x3fdbf803b4b7f008,0x3fdcf211578e98c3,3
+np.float64,0xbfec8c255979184b,0xbff1a1bee108ed30,3
+np.float64,0x3fe33cdaffe679b6,0x3fe4a3a318cd994f,3
+np.float64,0x3fd8cf585cb19eb0,0x3fd97a408bf3c38c,3
+np.float64,0x3fe919dde07233bc,0x3fecdb0ea13a2455,3
+np.float64,0xbfd5ba35e4ab746c,0xbfd62b024805542d,3
+np.float64,0x3fd2f933e7a5f268,0x3fd343527565e97c,3
+np.float64,0xbfe5b9f8ddeb73f2,0xbfe7e1f772c3e438,3
+np.float64,0x3fe843cd92f0879c,0x3feb8a92d68eae3e,3
+np.float64,0xbfd096b234a12d64,0xbfd0c7beca2c6605,3
+np.float64,0xbfef3363da7e66c8,0xbff58c98dde6c27c,3
+np.float64,0x3fd51b01ddaa3604,0x3fd582109d89ead1,3
+np.float64,0x3fea0f10ff741e22,0x3fee736c2d2a2067,3
+np.float64,0x3fc276e7b724edd0,0x3fc28774520bc6d4,3
+np.float64,0xbfef9abc9f7f3579,0xbff69d49762b1889,3
+np.float64,0x3fe1539ec0e2a73e,0x3fe24f370b7687d0,3
+np.float64,0x3fad72350c3ae460,0x3fad765e7766682a,3
+np.float64,0x3fa289a47c251340,0x3fa28aae12f41646,3
+np.float64,0xbfe5c488e5eb8912,0xbfe7f05d7e7dcddb,3
+np.float64,0xbfc22ef1d7245de4,0xbfc23ebeb990a1b8,3
+np.float64,0x3fe59a0b80eb3418,0x3fe7b695fdcba1de,3
+np.float64,0xbfe9cad619f395ac,0xbfedff0514d91e2c,3
+np.float64,0x3fc8bc74eb3178e8,0x3fc8e48cb22da666,3
+np.float64,0xbfc5389a3f2a7134,0xbfc551cd6febc544,3
+np.float64,0x3fce82feb33d0600,0x3fceceecce2467ef,3
+np.float64,0x3fda346791b468d0,0x3fdaff95154a4ca6,3
+np.float64,0x3fd04501fea08a04,0x3fd073397b32607e,3
+np.float64,0xbfb6be498a2d7c90,0xbfb6c5f93aeb0e57,3
+np.float64,0x3fe1f030dd63e062,0x3fe30ad8fb97cce0,3
+np.float64,0xbfee3fb36dfc7f67,0xbff3d0a5e380b86f,3
+np.float64,0xbfa876773c30ecf0,0xbfa878d9d3df6a3f,3
+np.float64,0x3fdb58296eb6b054,0x3fdc40ceffb17f82,3
+np.float64,0xbfea16b5d8742d6c,0xbfee809b99fd6adc,3
+np.float64,0xbfdc5062b6b8a0c6,0xbfdd547623275fdb,3
+np.float64,0x3fef6db242fedb64,0x3ff61ab4cdaef467,3
+np.float64,0xbfc9f778f933eef0,0xbfca25eef1088167,3
+np.float64,0xbfd22063eba440c8,0xbfd260c8766c69cf,3
+np.float64,0x3fdd2379f2ba46f4,0x3fde40b025cb1ffa,3
+np.float64,0xbfea967af2f52cf6,0xbfef61a178774636,3
+np.float64,0x3fe4f5b49fe9eb6a,0x3fe6da8311a5520e,3
+np.float64,0x3feccde17b799bc2,0x3ff1ebd0ea228b71,3
+np.float64,0x3fe1bb76506376ec,0x3fe2cb56fca01840,3
+np.float64,0xbfef94e583ff29cb,0xbff68aeab8ba75a2,3
+np.float64,0x3fed024a55fa0494,0x3ff228ea5d456e9d,3
+np.float64,0xbfe877b2a8f0ef65,0xbfebdaa1a4712459,3
+np.float64,0x3fef687a8d7ed0f6,0x3ff60cf5fef8d448,3
+np.float64,0xbfeeb2dc8afd65b9,0xbff48dda6a906cd6,3
+np.float64,0x3fdb2e28aeb65c50,0x3fdc12620655eb7a,3
+np.float64,0x3fedc1863afb830c,0x3ff31ae823315e83,3
+np.float64,0xbfe6b1bb546d6376,0xbfe93a38163e3a59,3
+np.float64,0x3fe479c78468f390,0x3fe637e5c0fc5730,3
+np.float64,0x3fbad1fade35a3f0,0x3fbade9a43ca05cf,3
+np.float64,0xbfe2d1c563e5a38b,0xbfe41e712785900c,3
+np.float64,0xbfc08c33ed211868,0xbfc09817a752d500,3
+np.float64,0xbfecce0935f99c12,0xbff1ebfe84524037,3
+np.float64,0x3fce4ef0e73c9de0,0x3fce995638a3dc48,3
+np.float64,0xbfd2fb2343a5f646,0xbfd345592517ca18,3
+np.float64,0x3fd848f7cdb091f0,0x3fd8e8bee5f7b49a,3
+np.float64,0x3fe532b7d2ea6570,0x3fe72b9ac747926a,3
+np.float64,0x3fd616aadcac2d54,0x3fd68d692c5cad42,3
+np.float64,0x3fd7720eb3aee41c,0x3fd801206a0e1e43,3
+np.float64,0x3fee835a35fd06b4,0x3ff43c7175eb7a54,3
+np.float64,0xbfe2e8f70b65d1ee,0xbfe43b2800a947a7,3
+np.float64,0xbfed38f45d7a71e9,0xbff26acd6bde7174,3
+np.float64,0xbfc0c62661218c4c,0xbfc0d28964d66120,3
+np.float64,0x3fe97940bef2f282,0x3fed76b986a74ee3,3
+np.float64,0x3fc96f7dc532def8,0x3fc99b20044c8fcf,3
+np.float64,0xbfd60201eeac0404,0xbfd677675efaaedc,3
+np.float64,0x3fe63c0867ec7810,0x3fe894f060200140,3
+np.float64,0xbfef6144b37ec289,0xbff5fa589a515ba8,3
+np.float64,0xbfde2da0c8bc5b42,0xbfdf6d0b59e3232a,3
+np.float64,0xbfd7401612ae802c,0xbfd7cb74ddd413b9,3
+np.float64,0x3fe41c012de83802,0x3fe5be9d87da3f82,3
+np.float64,0x3fdf501609bea02c,0x3fe05c1d96a2270b,3
+np.float64,0x3fcf9fa1233f3f40,0x3fcff45598e72f07,3
+np.float64,0x3fd4e3895ea9c714,0x3fd547580d8392a2,3
+np.float64,0x3fe1e8ff5fe3d1fe,0x3fe3022a0b86a2ab,3
+np.float64,0xbfe0aa55956154ab,0xbfe18768823da589,3
+np.float64,0x3fb2a0aa26254150,0x3fb2a4e1faff1c93,3
+np.float64,0x3fd3823417a70468,0x3fd3d2f808dbb167,3
+np.float64,0xbfaed323643da640,0xbfaed7e9bef69811,3
+np.float64,0x3fe661e8c4ecc3d2,0x3fe8c9c535f43c16,3
+np.float64,0xbfa429777c2852f0,0xbfa42acd38ba02a6,3
+np.float64,0x3fb5993ea22b3280,0x3fb59fd353e47397,3
+np.float64,0x3fee62d21efcc5a4,0x3ff40788f9278ade,3
+np.float64,0xbf813fb810227f80,0xbf813fc56d8f3c53,3
+np.float64,0x3fd56205deaac40c,0x3fd5cd59671ef193,3
+np.float64,0x3fd31a4de5a6349c,0x3fd365fe401b66e8,3
+np.float64,0xbfec7cc7a478f98f,0xbff190cf69703ca4,3
+np.float64,0xbf755881a02ab100,0xbf755887f52e7794,3
+np.float64,0x3fdd1c92e6ba3924,0x3fde38efb4e8605c,3
+np.float64,0x3fdf49da80be93b4,0x3fe0588af8dd4a34,3
+np.float64,0x3fe1fcdbf2e3f9b8,0x3fe31a27b9d273f2,3
+np.float64,0x3fe2a0f18be541e4,0x3fe3e23b159ce20f,3
+np.float64,0xbfed0f1561fa1e2b,0xbff23820fc0a54ca,3
+np.float64,0x3fe34a006c669400,0x3fe4b419b9ed2b83,3
+np.float64,0xbfd51be430aa37c8,0xbfd583005a4d62e7,3
+np.float64,0x3fe5ec4e336bd89c,0x3fe826caad6b0f65,3
+np.float64,0xbfdad71b1fb5ae36,0xbfdbb25bef8b53d8,3
+np.float64,0xbfe8eac2d871d586,0xbfec8f8cac7952f9,3
+np.float64,0xbfe1d5aef663ab5e,0xbfe2eae14b7ccdfd,3
+np.float64,0x3fec11d3157823a6,0x3ff11e8279506753,3
+np.float64,0xbfe67ff1166cffe2,0xbfe8f3e61c1dfd32,3
+np.float64,0xbfd101eecda203de,0xbfd136e0e9557022,3
+np.float64,0x3fde6c9e5cbcd93c,0x3fdfb48ee7efe134,3
+np.float64,0x3fec3ede9c787dbe,0x3ff14dead1e5cc1c,3
+np.float64,0x3fe7a022086f4044,0x3fea93ce2980b161,3
+np.float64,0xbfc3b2b1b7276564,0xbfc3c6d02d60bb21,3
+np.float64,0x7ff0000000000000,0x7ff8000000000000,3
+np.float64,0x3fe60b5647ec16ac,0x3fe8517ef0544b40,3
+np.float64,0xbfd20ab654a4156c,0xbfd24a2f1b8e4932,3
+np.float64,0xbfe4aa1e2f69543c,0xbfe677005cbd2646,3
+np.float64,0xbfc831cc0b306398,0xbfc8574910d0b86d,3
+np.float64,0xbfc3143495262868,0xbfc3267961b79198,3
+np.float64,0x3fc14d64c1229ac8,0x3fc15afea90a319d,3
+np.float64,0x3fc0a5a207214b48,0x3fc0b1bd2f15c1b0,3
+np.float64,0xbfc0b8351521706c,0xbfc0c4792672d6db,3
+np.float64,0xbfdc383600b8706c,0xbfdd398429e163bd,3
+np.float64,0x3fd9e17321b3c2e8,0x3fdaa4c4d140a622,3
+np.float64,0xbfd44f079ea89e10,0xbfd4aa7d6deff4ab,3
+np.float64,0xbfc3de52a927bca4,0xbfc3f2f8f65f4c3f,3
+np.float64,0x3fe7779d566eef3a,0x3fea57f8592dbaad,3
+np.float64,0xbfe309039e661207,0xbfe462f47f9a64e5,3
+np.float64,0x3fd8e06d08b1c0dc,0x3fd98cc946e440a6,3
+np.float64,0x3fdde66c9ebbccd8,0x3fdf1c68009a8dc1,3
+np.float64,0x3fd4369c6ba86d38,0x3fd490bf460a69e4,3
+np.float64,0xbfe132252fe2644a,0xbfe22775e109cc2e,3
+np.float64,0x3fee15483c7c2a90,0x3ff39111de89036f,3
+np.float64,0xbfc1d5ee8123abdc,0xbfc1e4d66c6871a5,3
+np.float64,0x3fc851c52b30a388,0x3fc877d93fb4ae1a,3
+np.float64,0x3fdaade707b55bd0,0x3fdb85001661fffe,3
+np.float64,0xbfe79fb7f96f3f70,0xbfea9330ec27ac10,3
+np.float64,0xbfe8b0f725f161ee,0xbfec3411c0e4517a,3
+np.float64,0xbfea79f5f374f3ec,0xbfef2e9dd9270488,3
+np.float64,0x3fe0b5fe5b616bfc,0x3fe19512a36a4534,3
+np.float64,0xbfad7c622c3af8c0,0xbfad808fea96a804,3
+np.float64,0xbfe3e24dbce7c49c,0xbfe574b4c1ea9818,3
+np.float64,0xbfe80b038af01607,0xbfeb33fec279576a,3
+np.float64,0xbfef69e2ea7ed3c6,0xbff610a5593a18bc,3
+np.float64,0x3fdcc0bb39b98178,0x3fddd1f8c9a46430,3
+np.float64,0xbfba39976a347330,0xbfba4563bb5369a4,3
+np.float64,0xbfebf9768ef7f2ed,0xbff10548ab725f74,3
+np.float64,0xbfec21c066f84381,0xbff12f2803ba052f,3
+np.float64,0xbfca216a6b3442d4,0xbfca50c5e1e5748e,3
+np.float64,0x3fd5e40da4abc81c,0x3fd65783f9a22946,3
+np.float64,0x3fc235ca17246b98,0x3fc245a8f453173f,3
+np.float64,0x3fecb5b867796b70,0x3ff1d046a0bfda69,3
+np.float64,0x3fcb457fef368b00,0x3fcb7b6daa8165a7,3
+np.float64,0xbfa5ed6f7c2bdae0,0xbfa5ef27244e2e42,3
+np.float64,0x3fecf618a1f9ec32,0x3ff21a86cc104542,3
+np.float64,0x3fe9d95413f3b2a8,0x3fee178dcafa11fc,3
+np.float64,0xbfe93a5357f274a7,0xbfed0f9a565da84a,3
+np.float64,0xbfeb9e45ff773c8c,0xbff0a93cab8e258d,3
+np.float64,0x3fcbd9d0bd37b3a0,0x3fcc134e87cae241,3
+np.float64,0x3fe55d4db76aba9c,0x3fe764a0e028475a,3
+np.float64,0xbfc8a6fc71314df8,0xbfc8ceaafbfc59a7,3
+np.float64,0x3fe0615fa660c2c0,0x3fe1323611c4cbc2,3
+np.float64,0x3fb965558632cab0,0x3fb9700b84de20ab,3
+np.float64,0x8000000000000000,0x8000000000000000,3
+np.float64,0x3fe76776c6eeceee,0x3fea40403e24a9f1,3
+np.float64,0x3fe3b7f672676fec,0x3fe53ece71a1a1b1,3
+np.float64,0xbfa9b82ba4337050,0xbfa9baf15394ca64,3
+np.float64,0xbfe31faf49663f5e,0xbfe47f31b1ca73dc,3
+np.float64,0xbfcc4c6beb3898d8,0xbfcc88c5f814b2c1,3
+np.float64,0x3fd481530aa902a8,0x3fd4df8df03bc155,3
+np.float64,0x3fd47593b8a8eb28,0x3fd4d327ab78a1a8,3
+np.float64,0x3fd70e6ccbae1cd8,0x3fd7962fe8b63d46,3
+np.float64,0x3fd25191f7a4a324,0x3fd2941623c88e02,3
+np.float64,0x3fd0603ef0a0c07c,0x3fd08f64e97588dc,3
+np.float64,0xbfc653bae52ca774,0xbfc6711e5e0d8ea9,3
+np.float64,0xbfd11db8fea23b72,0xbfd153b63c6e8812,3
+np.float64,0xbfea9bde25f537bc,0xbfef6b52268e139a,3
+np.float64,0x1,0x1,3
+np.float64,0xbfefd3806d7fa701,0xbff776dcef9583ca,3
+np.float64,0xbfe0fb8cfde1f71a,0xbfe1e6e2e774a8f8,3
+np.float64,0x3fea384534f4708a,0x3feebadaa389be0d,3
+np.float64,0x3feff761c97feec4,0x3ff866157b9d072d,3
+np.float64,0x3fe7131ccb6e263a,0x3fe9c58b4389f505,3
+np.float64,0x3fe9084f7872109e,0x3fecbed0355dbc8f,3
+np.float64,0x3f708e89e0211d00,0x3f708e8cd4946b9e,3
+np.float64,0xbfe39185f067230c,0xbfe50e1cd178244d,3
+np.float64,0x3fd67cc1a9acf984,0x3fd6fa514784b48c,3
+np.float64,0xbfecaef005f95de0,0xbff1c89c9c3ef94a,3
+np.float64,0xbfe12eec81e25dd9,0xbfe223a4285bba9a,3
+np.float64,0x3fbe7f9faa3cff40,0x3fbe92363525068d,3
+np.float64,0xbfe1950b2b632a16,0xbfe29d45fc1e4ce9,3
+np.float64,0x3fe45049e6e8a094,0x3fe6020de759e383,3
+np.float64,0x3fe4d10c8969a21a,0x3fe6aa1fe42cbeb9,3
+np.float64,0xbfe9d04658f3a08d,0xbfee08370a0dbf0c,3
+np.float64,0x3fe14fb314e29f66,0x3fe24a8d73663521,3
+np.float64,0xbfef4abfe4fe9580,0xbff5c2c1ff1250ca,3
+np.float64,0xbfe6162b366c2c56,0xbfe86073ac3c6243,3
+np.float64,0x3feffe781e7ffcf0,0x3ff8d2cbedd6a1b5,3
+np.float64,0xbff0000000000000,0xbff921fb54442d18,3
+np.float64,0x3fc1dc45ad23b888,0x3fc1eb3d9bddda58,3
+np.float64,0xbfe793f6fcef27ee,0xbfea81c93d65aa64,3
+np.float64,0x3fdef6d2bbbdeda4,0x3fe029079d42efb5,3
+np.float64,0xbfdf0ac479be1588,0xbfe0346dbc95963f,3
+np.float64,0xbfd33927d7a67250,0xbfd38653f90a5b73,3
+np.float64,0xbfe248b072e49161,0xbfe37631ef6572e1,3
+np.float64,0xbfc8ceb6af319d6c,0xbfc8f7288657f471,3
+np.float64,0x3fdd7277fcbae4f0,0x3fde99886e6766ef,3
+np.float64,0xbfe0d30c6561a619,0xbfe1b72f90bf53d6,3
+np.float64,0xbfcb0fe07d361fc0,0xbfcb448e2eae9542,3
+np.float64,0xbfe351f57fe6a3eb,0xbfe4be13eef250f2,3
+np.float64,0x3fe85ec02cf0bd80,0x3febb407e2e52e4c,3
+np.float64,0x3fc8bc59b53178b0,0x3fc8e470f65800ec,3
+np.float64,0xbfd278d447a4f1a8,0xbfd2bd133c9c0620,3
+np.float64,0x3feda5cfd87b4ba0,0x3ff2f5ab4324f43f,3
+np.float64,0xbfd2b32a36a56654,0xbfd2fa09c36afd34,3
+np.float64,0xbfed4a81cb7a9504,0xbff28077a4f4fff4,3
+np.float64,0x3fdf079bf9be0f38,0x3fe0329f7fb13f54,3
+np.float64,0x3fd14097f6a28130,0x3fd177e9834ec23f,3
+np.float64,0xbfaeab11843d5620,0xbfaeafc5531eb6b5,3
+np.float64,0xbfac3f8c14387f20,0xbfac433893d53360,3
+np.float64,0xbfc139d7ed2273b0,0xbfc14743adbbe660,3
+np.float64,0x3fe78cb02cef1960,0x3fea7707f76edba9,3
+np.float64,0x3fefe16b41ffc2d6,0x3ff7bff36a7aa7b8,3
+np.float64,0x3fec5260d378a4c2,0x3ff162c588b0da38,3
+np.float64,0x3fedb146f17b628e,0x3ff304f90d3a15d1,3
+np.float64,0x3fd1fd45f7a3fa8c,0x3fd23c2dc3929e20,3
+np.float64,0x3fe0898a5ee11314,0x3fe1610c63e726eb,3
+np.float64,0x3fe7719946eee332,0x3fea4f205eecb59f,3
+np.float64,0x3fe955218972aa44,0x3fed3b530c1f7651,3
+np.float64,0x3fe0ccbf4461997e,0x3fe1afc7b4587836,3
+np.float64,0xbfe9204314f24086,0xbfece5605780e346,3
+np.float64,0xbfe552017feaa403,0xbfe755773cbd74d5,3
+np.float64,0x3fd8ce4b32b19c98,0x3fd9791c8dd44eae,3
+np.float64,0x3fef89acd9ff135a,0x3ff668f78adf7ced,3
+np.float64,0x3fc9d713ad33ae28,0x3fca04da6c293bbd,3
+np.float64,0xbfe22d9c4de45b38,0xbfe3553effadcf92,3
+np.float64,0x3fa5cda38c2b9b40,0x3fa5cf53c5787482,3
+np.float64,0x3fa878ebdc30f1e0,0x3fa87b4f2bf1d4c3,3
+np.float64,0x3fe8030353700606,0x3feb27e196928789,3
+np.float64,0x3fb50607222a0c10,0x3fb50c188ce391e6,3
+np.float64,0x3fd9ba4ab4b37494,0x3fda79fa8bd40f45,3
+np.float64,0x3fb564598e2ac8b0,0x3fb56abe42d1ba13,3
+np.float64,0xbfd1177c83a22efa,0xbfd14d3d7ef30cc4,3
+np.float64,0xbfd952cec7b2a59e,0xbfda09215d17c0ac,3
+np.float64,0x3fe1d8066663b00c,0x3fe2edb35770b8dd,3
+np.float64,0xbfc89427a3312850,0xbfc8bb7a7c389497,3
+np.float64,0xbfe86ebfd3f0dd80,0xbfebccc2ba0f506c,3
+np.float64,0x3fc390578b2720b0,0x3fc3a40cb7f5f728,3
+np.float64,0xbfd122f9b8a245f4,0xbfd15929dc57a897,3
+np.float64,0x3f8d0636d03a0c80,0x3f8d06767de576df,3
+np.float64,0xbfe4b55d8b696abb,0xbfe685be537a9637,3
+np.float64,0xbfdfd51cf9bfaa3a,0xbfe0a894fcff0c76,3
+np.float64,0xbfd37c1f52a6f83e,0xbfd3cc9593c37aad,3
+np.float64,0x3fd0e8283ea1d050,0x3fd11c25c800785a,3
+np.float64,0x3fd3160784a62c10,0x3fd36183a6c2880c,3
+np.float64,0x3fd4c66e57a98cdc,0x3fd5288fe3394eff,3
+np.float64,0x3fee2f7e3afc5efc,0x3ff3b8063eb30cdc,3
+np.float64,0xbfe526773a6a4cee,0xbfe71b4364215b18,3
+np.float64,0x3fea01181e740230,0x3fee5b65eccfd130,3
+np.float64,0xbfe51c03f76a3808,0xbfe70d5919d37587,3
+np.float64,0x3fd97e1375b2fc28,0x3fda3845da40b22b,3
+np.float64,0x3fd5c14a14ab8294,0x3fd632890d07ed03,3
+np.float64,0xbfec9b474279368e,0xbff1b28f50584fe3,3
+np.float64,0x3fe0139ca860273a,0x3fe0d7fc377f001c,3
+np.float64,0x3fdb080c9db61018,0x3fdbe85056358fa0,3
+np.float64,0xbfdd72ceb1bae59e,0xbfde99ea171661eb,3
+np.float64,0xbfe64e934fec9d26,0xbfe8aec2ef24be63,3
+np.float64,0x3fd1036a93a206d4,0x3fd1386adabe01bd,3
+np.float64,0x3febc9d4a5f793aa,0x3ff0d4c069f1e67d,3
+np.float64,0xbfe547a16fea8f43,0xbfe747902fe6fb4d,3
+np.float64,0x3fc289b0f9251360,0x3fc29a709de6bdd9,3
+np.float64,0xbfe694494a6d2892,0xbfe9108f3dc133e2,3
+np.float64,0x3fd827dfe4b04fc0,0x3fd8c4fe40532b91,3
+np.float64,0xbfe8b89418f17128,0xbfec400c5a334b2e,3
+np.float64,0x3fed5605147aac0a,0x3ff28ed1f612814a,3
+np.float64,0xbfed36af31fa6d5e,0xbff26804e1f71af0,3
+np.float64,0x3fdbb01c02b76038,0x3fdca2381558bbf0,3
+np.float64,0x3fe2a951666552a2,0x3fe3ec88f780f9e6,3
+np.float64,0x3fe662defbecc5be,0x3fe8cb1dbfca98ab,3
+np.float64,0x3fd098b1b3a13164,0x3fd0c9d064e4eaf2,3
+np.float64,0x3fefa10edeff421e,0x3ff6b1c6187b18a8,3
+np.float64,0xbfec4feb7a789fd7,0xbff16021ef37a219,3
+np.float64,0x3fd8e415bbb1c82c,0x3fd990c1f8b786bd,3
+np.float64,0xbfead5a09275ab41,0xbfefd44fab5b4f6e,3
+np.float64,0xbfe8666c16f0ccd8,0xbfebbfe0c9f2a9ae,3
+np.float64,0x3fdc962132b92c44,0x3fdda2525a6f406c,3
+np.float64,0xbfe2037f03e406fe,0xbfe3222ec2a3449e,3
+np.float64,0xbfec82c27e790585,0xbff197626ea9df1e,3
+np.float64,0x3fd2b4e03ca569c0,0x3fd2fbd3c7fda23e,3
+np.float64,0xbfe9b0dee5f361be,0xbfedd34f6d3dfe8a,3
+np.float64,0x3feef45cd17de8ba,0x3ff508180687b591,3
+np.float64,0x3f82c39bf0258700,0x3f82c3ad24c3b3f1,3
+np.float64,0xbfca848cfd350918,0xbfcab612ce258546,3
+np.float64,0x3fd6442aaaac8854,0x3fd6bdea54016e48,3
+np.float64,0x3fe550799e6aa0f4,0x3fe75369c9ea5b1e,3
+np.float64,0xbfe0e9d5a361d3ac,0xbfe1d20011139d89,3
+np.float64,0x3fbfc9ff1e3f9400,0x3fbfdf0ea6885c80,3
+np.float64,0xbfa187e8b4230fd0,0xbfa188c95072092e,3
+np.float64,0x3fcd28c9533a5190,0x3fcd6ae879c21b47,3
+np.float64,0x3fc6227ec52c4500,0x3fc63f1fbb441d29,3
+np.float64,0x3fe9b7a2ed736f46,0x3feddeab49b2d176,3
+np.float64,0x3fd4aee93da95dd4,0x3fd50fb3b71e0339,3
+np.float64,0xbfe164dacf62c9b6,0xbfe263bb2f7dd5d9,3
+np.float64,0x3fec62e525f8c5ca,0x3ff17496416d9921,3
+np.float64,0x3fdd363ee0ba6c7c,0x3fde55c6a49a5f86,3
+np.float64,0x3fe65cbf75ecb97e,0x3fe8c28d31ff3ebd,3
+np.float64,0xbfe76d27ca6eda50,0xbfea4899e3661425,3
+np.float64,0xbfc305738d260ae8,0xbfc3178dcfc9d30f,3
+np.float64,0xbfd3aa2a54a75454,0xbfd3fcf1e1ce8328,3
+np.float64,0x3fd1609fc9a2c140,0x3fd1992efa539b9f,3
+np.float64,0xbfac1291bc382520,0xbfac162cc7334b4d,3
+np.float64,0xbfedb461ea7b68c4,0xbff309247850455d,3
+np.float64,0xbfe8d2adf8f1a55c,0xbfec6947be90ba92,3
+np.float64,0xbfd7128965ae2512,0xbfd79a9855bcfc5a,3
+np.float64,0x3fe8deb09471bd62,0x3fec7c56b3aee531,3
+np.float64,0xbfe5f4d329ebe9a6,0xbfe8327ea8189af8,3
+np.float64,0xbfd3b46ac9a768d6,0xbfd407b80b12ff17,3
+np.float64,0x3fec899d7cf9133a,0x3ff19ef26baca36f,3
+np.float64,0xbfec192fd5783260,0xbff126306e507fd0,3
+np.float64,0x3fe945bdaef28b7c,0x3fed222f787310bf,3
+np.float64,0xbfeff9635d7ff2c7,0xbff87d6773f318eb,3
+np.float64,0xbfd604b81cac0970,0xbfd67a4aa852559a,3
+np.float64,0x3fcd1cc9d53a3990,0x3fcd5e962e237c24,3
+np.float64,0xbfed77b0fffaef62,0xbff2b97a1c9b6483,3
+np.float64,0xbfc9c69325338d28,0xbfc9f401500402fb,3
+np.float64,0xbfdf97e246bf2fc4,0xbfe0855601ea9db3,3
+np.float64,0x3fc7e6304f2fcc60,0x3fc80a4e718504cd,3
+np.float64,0x3fec3b599e7876b4,0x3ff14a2d1b9c68e6,3
+np.float64,0xbfe98618e1f30c32,0xbfed8bfbb31c394a,3
+np.float64,0xbfe59b3c0feb3678,0xbfe7b832d6df81de,3
+np.float64,0xbfe54ce2fe6a99c6,0xbfe74e9a85be4116,3
+np.float64,0x3fc9db49cb33b690,0x3fca092737ef500a,3
+np.float64,0xbfb4a922ae295248,0xbfb4aee4e39078a9,3
+np.float64,0xbfd0e542e0a1ca86,0xbfd11925208d66af,3
+np.float64,0x3fd70543f2ae0a88,0x3fd78c5e9238a3ee,3
+np.float64,0x3fd67f7a7facfef4,0x3fd6fd3998df8545,3
+np.float64,0xbfe40b643d6816c8,0xbfe5a947e427f298,3
+np.float64,0xbfcd85f69b3b0bec,0xbfcdcaa24b75f1a3,3
+np.float64,0x3fec705fb4f8e0c0,0x3ff1833c82163ee2,3
+np.float64,0x3fb37650ea26eca0,0x3fb37b20c16fb717,3
+np.float64,0x3fe5ebfa55ebd7f4,0x3fe826578d716e70,3
+np.float64,0x3fe991dfe5f323c0,0x3fed9f8a4bf1f588,3
+np.float64,0xbfd658bd0aacb17a,0xbfd6d3dd06e54900,3
+np.float64,0xbfc24860252490c0,0xbfc258701a0b9290,3
+np.float64,0xbfefb8d763ff71af,0xbff705b6ea4a569d,3
+np.float64,0x3fb8fcb4ae31f970,0x3fb906e809e7899f,3
+np.float64,0x3fce6343cb3cc688,0x3fceae41d1629625,3
+np.float64,0xbfd43d5a11a87ab4,0xbfd497da25687e07,3
+np.float64,0xbfe9568851f2ad11,0xbfed3d9e5fe83a76,3
+np.float64,0x3fe1b66153e36cc2,0x3fe2c53c7e016271,3
+np.float64,0x3fef27452bfe4e8a,0x3ff571b3486ed416,3
+np.float64,0x3fca87c0a7350f80,0x3fcab958a7bb82d4,3
+np.float64,0xbfd8776a8fb0eed6,0xbfd91afaf2f50edf,3
+np.float64,0x3fe9522a76f2a454,0x3fed3679264e1525,3
+np.float64,0x3fea14ff2cf429fe,0x3fee7da6431cc316,3
+np.float64,0x3fe970618bf2e0c4,0x3fed68154d54dd97,3
+np.float64,0x3fd3410cfca68218,0x3fd38e9b21792240,3
+np.float64,0xbf6a8070c0350100,0xbf6a8073c7c34517,3
+np.float64,0xbfbe449de23c8938,0xbfbe56c8e5e4d98b,3
+np.float64,0x3fedbc92e27b7926,0x3ff314313216d8e6,3
+np.float64,0xbfe3be4706677c8e,0xbfe546d3ceb85aea,3
+np.float64,0x3fe30cd6d76619ae,0x3fe467b6f2664a8d,3
+np.float64,0x3fd7d69b21afad38,0x3fd86d54284d05ad,3
+np.float64,0xbfe501001fea0200,0xbfe6e978afcff4d9,3
+np.float64,0xbfe44ba3d8e89748,0xbfe5fc0a31cd1e3e,3
+np.float64,0x3fec52f7c078a5f0,0x3ff16367acb209b2,3
+np.float64,0xbfcb19efcb3633e0,0xbfcb4ed9235a7d47,3
+np.float64,0xbfab86796c370cf0,0xbfab89df7bf15710,3
+np.float64,0xbfb962feda32c600,0xbfb96db1e1679c98,3
+np.float64,0x3fe0dd14e861ba2a,0x3fe1c2fc72810567,3
+np.float64,0x3fe41bcc6de83798,0x3fe5be59b7f9003b,3
+np.float64,0x3fc82f4c4f305e98,0x3fc854bd9798939f,3
+np.float64,0xbfcd143a613a2874,0xbfcd55cbd1619d84,3
+np.float64,0xbfd52da61baa5b4c,0xbfd595d0b3543439,3
+np.float64,0xbfb71b4a8e2e3698,0xbfb7235a4ab8432f,3
+np.float64,0xbfec141a19782834,0xbff120e1e39fc856,3
+np.float64,0xbfdba9319db75264,0xbfdc9a8ca2578bb2,3
+np.float64,0xbfbce5d74639cbb0,0xbfbcf5a4878cfa51,3
+np.float64,0x3fde67f7b3bccff0,0x3fdfaf45a9f843ad,3
+np.float64,0xbfe12d87bc625b10,0xbfe221fd4476eb71,3
+np.float64,0x3fe35b8f6be6b71e,0x3fe4ca20f65179e1,3
+np.float64,0xbfdbada1d3b75b44,0xbfdc9f78b19f93d1,3
+np.float64,0xbfc60159c52c02b4,0xbfc61d79b879f598,3
+np.float64,0x3fd6b81c38ad7038,0x3fd739c27bfa16d8,3
+np.float64,0xbfd646a253ac8d44,0xbfd6c08c19612bbb,3
+np.float64,0xbfe6babef0ed757e,0xbfe94703d0bfa311,3
+np.float64,0xbfed5671f1faace4,0xbff28f5a3f3683d0,3
+np.float64,0x3fc01d1e85203a40,0x3fc02817ec0dfd38,3
+np.float64,0xbfe9188a61f23115,0xbfecd8eb5da84223,3
+np.float64,0x3fdca3bab9b94774,0x3fddb1868660c239,3
+np.float64,0xbfa255750c24aaf0,0xbfa25675f7b36343,3
+np.float64,0x3fb3602db626c060,0x3fb364ed2d5b2876,3
+np.float64,0xbfd30a14bda6142a,0xbfd354ff703b8862,3
+np.float64,0xbfe1cfe381639fc7,0xbfe2e3e720b968c8,3
+np.float64,0xbfd2af6a4fa55ed4,0xbfd2f61e190bcd1f,3
+np.float64,0xbfe93c50937278a1,0xbfed12d64bb10d73,3
+np.float64,0x3fddd8bc44bbb178,0x3fdf0ced7f9005cc,3
+np.float64,0x3fdb2bc73cb65790,0x3fdc0fc0e18e425e,3
+np.float64,0xbfd073f6aba0e7ee,0xbfd0a3cb5468a961,3
+np.float64,0x3fed4bad7b7a975a,0x3ff281ebeb75e414,3
+np.float64,0xbfdc75b50bb8eb6a,0xbfdd7e1a7631cb22,3
+np.float64,0x3fd458a90fa8b154,0x3fd4b4a5817248ce,3
+np.float64,0x3feead5db57d5abc,0x3ff484286fab55ff,3
+np.float64,0x3fb3894382271280,0x3fb38e217b4e7905,3
+np.float64,0xffefffffffffffff,0x7ff8000000000000,3
+np.float64,0xbfe428212ae85042,0xbfe5ce36f226bea8,3
+np.float64,0xbfc08b39f7211674,0xbfc0971b93ebc7ad,3
+np.float64,0xbfc2e7cf5525cfa0,0xbfc2f994eb72b623,3
+np.float64,0xbfdb0d85afb61b0c,0xbfdbee5a2de3c5db,3
+np.float64,0xfff0000000000000,0x7ff8000000000000,3
+np.float64,0xbfd0d36af7a1a6d6,0xbfd106a5f05ef6ff,3
+np.float64,0xbfc333d0912667a0,0xbfc3467162b7289a,3
+np.float64,0x3fcdababc53b5758,0x3fcdf16458c20fa8,3
+np.float64,0x3fd0821b38a10438,0x3fd0b26e3e0b9185,3
+np.float64,0x0,0x0,3
+np.float64,0x3feb7f70edf6fee2,0x3ff08ae81854bf20,3
+np.float64,0x3fe6e075716dc0ea,0x3fe97cc5254be6ff,3
+np.float64,0x3fea13b682f4276e,0x3fee7b6f18073b5b,3
diff --git a/numpy/core/tests/data/umath-validation-set-arcsinh.csv b/numpy/core/tests/data/umath-validation-set-arcsinh.csv
new file mode 100644 (file)
index 0000000..1da29c8
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0xbf24142a,0xbf1a85ef,2
+np.float32,0x3e71cf91,0x3e6f9e37,2
+np.float32,0xe52a7,0xe52a7,2
+np.float32,0x3ef1e074,0x3ee9add9,2
+np.float32,0x806160ac,0x806160ac,2
+np.float32,0x7e2d59a2,0x42af4798,2
+np.float32,0xbf32cac9,0xbf26bf96,2
+np.float32,0x3f081701,0x3f026142,2
+np.float32,0x3f23cc88,0x3f1a499c,2
+np.float32,0xbf090d94,0xbf033ad0,2
+np.float32,0x803af2fc,0x803af2fc,2
+np.float32,0x807eb17e,0x807eb17e,2
+np.float32,0x5c0d8e,0x5c0d8e,2
+np.float32,0x3f7b79d2,0x3f5e6b1d,2
+np.float32,0x806feeae,0x806feeae,2
+np.float32,0x3e4b423a,0x3e49f274,2
+np.float32,0x3f49e5ac,0x3f394a41,2
+np.float32,0x3f18cd4e,0x3f10ef35,2
+np.float32,0xbed75734,0xbed17322,2
+np.float32,0x7f591151,0x42b28085,2
+np.float32,0xfefe9da6,0xc2b16f51,2
+np.float32,0xfeac90fc,0xc2b0a82a,2
+np.float32,0x805c198e,0x805c198e,2
+np.float32,0x7f66d6df,0x42b2a004,2
+np.float32,0x505438,0x505438,2
+np.float32,0xbf39a209,0xbf2c5255,2
+np.float32,0x7fa00000,0x7fe00000,2
+np.float32,0xc84cb,0xc84cb,2
+np.float32,0x7f07d6f5,0x42b19088,2
+np.float32,0x79d7e4,0x79d7e4,2
+np.float32,0xff32f6a0,0xc2b21db1,2
+np.float32,0x7c005c05,0x42a9222e,2
+np.float32,0x3ec449aa,0x3ebfc5ae,2
+np.float32,0x800ec323,0x800ec323,2
+np.float32,0xff1c904c,0xc2b1d93a,2
+np.float32,0x7f4eca52,0x42b267b0,2
+np.float32,0x3ee06540,0x3ed9c514,2
+np.float32,0x6aab4,0x6aab4,2
+np.float32,0x3e298d8c,0x3e28c99e,2
+np.float32,0xbf38d162,0xbf2ba94a,2
+np.float32,0x2d9083,0x2d9083,2
+np.float32,0x7eae5032,0x42b0ad52,2
+np.float32,0x3ead5b3c,0x3eaa3443,2
+np.float32,0x806fef66,0x806fef66,2
+np.float32,0x3f5b614e,0x3f46ca71,2
+np.float32,0xbf4c906a,0xbf3b60fc,2
+np.float32,0x8049453e,0x8049453e,2
+np.float32,0x3d305220,0x3d304432,2
+np.float32,0x2e1a89,0x2e1a89,2
+np.float32,0xbf4e74ec,0xbf3cdacf,2
+np.float32,0x807a827a,0x807a827a,2
+np.float32,0x80070745,0x80070745,2
+np.float32,0xbe1ba2fc,0xbe1b0b28,2
+np.float32,0xbe5131d0,0xbe4fc421,2
+np.float32,0x5bfd98,0x5bfd98,2
+np.float32,0xbd8e1a48,0xbd8dfd27,2
+np.float32,0x8006c160,0x8006c160,2
+np.float32,0x346490,0x346490,2
+np.float32,0xbdbdf060,0xbdbdaaf0,2
+np.float32,0x3ea9d0c4,0x3ea6d8c7,2
+np.float32,0xbf2aaa28,0xbf200916,2
+np.float32,0xbf160c26,0xbf0e9047,2
+np.float32,0x80081fd4,0x80081fd4,2
+np.float32,0x7db44283,0x42adf8b6,2
+np.float32,0xbf1983f8,0xbf118bf5,2
+np.float32,0x2c4a35,0x2c4a35,2
+np.float32,0x6165a7,0x6165a7,2
+np.float32,0xbe776b44,0xbe75129f,2
+np.float32,0xfe81841a,0xc2b0153b,2
+np.float32,0xbf7d1b2f,0xbf5f9461,2
+np.float32,0x80602d36,0x80602d36,2
+np.float32,0xfe8d5046,0xc2b041dd,2
+np.float32,0xfe5037bc,0xc2afa56d,2
+np.float32,0x4bbea6,0x4bbea6,2
+np.float32,0xfea039de,0xc2b0822d,2
+np.float32,0x7ea627a4,0x42b094c7,2
+np.float32,0x3f556198,0x3f423591,2
+np.float32,0xfedbae04,0xc2b123c1,2
+np.float32,0xbe30432c,0xbe2f6744,2
+np.float32,0x80202c77,0x80202c77,2
+np.float32,0xff335cc1,0xc2b21ed5,2
+np.float32,0x3e1e1ebe,0x3e1d7f95,2
+np.float32,0x8021c9c0,0x8021c9c0,2
+np.float32,0x7dc978,0x7dc978,2
+np.float32,0xff6cfabc,0xc2b2ad75,2
+np.float32,0x7f2bd542,0x42b208e0,2
+np.float32,0x53bf33,0x53bf33,2
+np.float32,0x804e04bb,0x804e04bb,2
+np.float32,0x3f30d2f9,0x3f2521ca,2
+np.float32,0x3dfde876,0x3dfd4316,2
+np.float32,0x46f8b1,0x46f8b1,2
+np.float32,0xbd5f9e20,0xbd5f81ba,2
+np.float32,0x807d6a22,0x807d6a22,2
+np.float32,0xff3881da,0xc2b22d50,2
+np.float32,0x1b1cb5,0x1b1cb5,2
+np.float32,0x3f75f2d0,0x3f5a7435,2
+np.float32,0xfee39c1a,0xc2b135e9,2
+np.float32,0x7f79f14a,0x42b2c8b9,2
+np.float32,0x8000e2d1,0x8000e2d1,2
+np.float32,0xab779,0xab779,2
+np.float32,0xbede6690,0xbed7f102,2
+np.float32,0x76e20d,0x76e20d,2
+np.float32,0x3ed714cb,0x3ed135e9,2
+np.float32,0xbeaa6f44,0xbea76f31,2
+np.float32,0x7f7dc8b1,0x42b2d089,2
+np.float32,0x108cb2,0x108cb2,2
+np.float32,0x7d37ba82,0x42ac9f94,2
+np.float32,0x3f31d068,0x3f25f221,2
+np.float32,0x8010a331,0x8010a331,2
+np.float32,0x3f2fdc7c,0x3f2456cd,2
+np.float32,0x7f7a9a67,0x42b2ca13,2
+np.float32,0x3f2acb31,0x3f202492,2
+np.float32,0x7f54fa94,0x42b276c9,2
+np.float32,0x3ebf8a70,0x3ebb553c,2
+np.float32,0x7f75b1a7,0x42b2bff2,2
+np.float32,0x7daebe07,0x42ade8cc,2
+np.float32,0xbd3a3ef0,0xbd3a2e86,2
+np.float32,0x8078ec9e,0x8078ec9e,2
+np.float32,0x3eda206a,0x3ed403ec,2
+np.float32,0x3f7248f2,0x3f57cd77,2
+np.float32,0x805d55ba,0x805d55ba,2
+np.float32,0xff30dc3e,0xc2b217a3,2
+np.float32,0xbe12b27c,0xbe123333,2
+np.float32,0xbf6ed9cf,0xbf554cd0,2
+np.float32,0xbed9eb5c,0xbed3d31c,2
+np.float32,0xbf1c9aea,0xbf14307b,2
+np.float32,0x3f540ac4,0x3f412de2,2
+np.float32,0x800333ac,0x800333ac,2
+np.float32,0x3f74cdb4,0x3f59a09a,2
+np.float32,0xbf41dc41,0xbf32ee6f,2
+np.float32,0xff2c7804,0xc2b20ac4,2
+np.float32,0x514493,0x514493,2
+np.float32,0xbddf1220,0xbddea1cf,2
+np.float32,0xfeaf74de,0xc2b0b0ab,2
+np.float32,0xfe5dfb30,0xc2afc633,2
+np.float32,0xbf4785c4,0xbf376bdb,2
+np.float32,0x80191cd3,0x80191cd3,2
+np.float32,0xfe44f708,0xc2af88fb,2
+np.float32,0x3d4cd8a0,0x3d4cc2ca,2
+np.float32,0x7f572eff,0x42b27c0f,2
+np.float32,0x8031bacb,0x8031bacb,2
+np.float32,0x7f2ea684,0x42b21133,2
+np.float32,0xbea1976a,0xbe9f05bb,2
+np.float32,0x3d677b41,0x3d675bc1,2
+np.float32,0x3f61bf24,0x3f4b9870,2
+np.float32,0x7ef55ddf,0x42b15c5f,2
+np.float32,0x3eabcb20,0x3ea8b91c,2
+np.float32,0xff73d9ec,0xc2b2bc18,2
+np.float32,0x77b9f5,0x77b9f5,2
+np.float32,0x4c6c6c,0x4c6c6c,2
+np.float32,0x7ed09c94,0x42b10949,2
+np.float32,0xdeeec,0xdeeec,2
+np.float32,0x7eac5858,0x42b0a782,2
+np.float32,0x7e190658,0x42af07bd,2
+np.float32,0xbe3c8980,0xbe3b7ce2,2
+np.float32,0x8059e86e,0x8059e86e,2
+np.float32,0xff201836,0xc2b1e4a5,2
+np.float32,0xbeac109c,0xbea8fafb,2
+np.float32,0x7edd1e2b,0x42b12718,2
+np.float32,0x639cd8,0x639cd8,2
+np.float32,0x3f5e4cae,0x3f490059,2
+np.float32,0x3d84c185,0x3d84a9c4,2
+np.float32,0xbe8c1130,0xbe8a605b,2
+np.float32,0x80000000,0x80000000,2
+np.float32,0x3f1da5e4,0x3f151404,2
+np.float32,0x7f75a873,0x42b2bfdf,2
+np.float32,0xbd873540,0xbd871c28,2
+np.float32,0xbe8e5e10,0xbe8c9808,2
+np.float32,0x7f004bf2,0x42b17347,2
+np.float32,0x800000,0x800000,2
+np.float32,0xbf6d6b79,0xbf544095,2
+np.float32,0x7ed7b563,0x42b11a6a,2
+np.float32,0x80693745,0x80693745,2
+np.float32,0x3ee0f608,0x3eda49a8,2
+np.float32,0xfe1285a4,0xc2aef181,2
+np.float32,0x72d946,0x72d946,2
+np.float32,0x6a0dca,0x6a0dca,2
+np.float32,0x3f5c9df6,0x3f47ba99,2
+np.float32,0xff002af6,0xc2b172c4,2
+np.float32,0x3f4ac98f,0x3f39fd0a,2
+np.float32,0x8066acf7,0x8066acf7,2
+np.float32,0xbcaa4e60,0xbcaa4b3c,2
+np.float32,0x80162813,0x80162813,2
+np.float32,0xff34b318,0xc2b222a2,2
+np.float32,0x7f1ce33c,0x42b1da49,2
+np.float32,0x3f0e55ab,0x3f07ddb0,2
+np.float32,0x7c75d996,0x42aa6eec,2
+np.float32,0xbf221bc6,0xbf18dc89,2
+np.float32,0x3f5a1a4c,0x3f45d1d4,2
+np.float32,0x7f2451b8,0x42b1f1fb,2
+np.float32,0x3ec55ca0,0x3ec0c655,2
+np.float32,0x3f752dc2,0x3f59e600,2
+np.float32,0xbe33f638,0xbe330c4d,2
+np.float32,0x3e2a9148,0x3e29c9d8,2
+np.float32,0x3f3362a1,0x3f273c01,2
+np.float32,0x5f83b3,0x5f83b3,2
+np.float32,0x3e362488,0x3e353216,2
+np.float32,0x140bcf,0x140bcf,2
+np.float32,0x7e3e96df,0x42af7822,2
+np.float32,0xbebc7082,0xbeb86ce6,2
+np.float32,0xbe92a92e,0xbe90b9d2,2
+np.float32,0xff3d8afc,0xc2b23b19,2
+np.float32,0x804125e3,0x804125e3,2
+np.float32,0x3f3675d1,0x3f29bedb,2
+np.float32,0xff70bb09,0xc2b2b57f,2
+np.float32,0x3f29681c,0x3f1efcd2,2
+np.float32,0xbdc70380,0xbdc6b3a8,2
+np.float32,0x54e0dd,0x54e0dd,2
+np.float32,0x3d545de0,0x3d54458c,2
+np.float32,0x7f800000,0x7f800000,2
+np.float32,0x8014a4c2,0x8014a4c2,2
+np.float32,0xbe93f58a,0xbe91f938,2
+np.float32,0x17de33,0x17de33,2
+np.float32,0xfefb679a,0xc2b168d2,2
+np.float32,0xbf23423e,0xbf19d511,2
+np.float32,0x7e893fa1,0x42b032ec,2
+np.float32,0x3f44fe2d,0x3f356bda,2
+np.float32,0xbebb2e78,0xbeb73e8f,2
+np.float32,0x3f5632e0,0x3f42d633,2
+np.float32,0x3ddd8698,0x3ddd1896,2
+np.float32,0x80164ea7,0x80164ea7,2
+np.float32,0x80087b37,0x80087b37,2
+np.float32,0xbf06ab1e,0xbf011f95,2
+np.float32,0x3db95524,0x3db9149f,2
+np.float32,0x7aa1fbb3,0x42a570a1,2
+np.float32,0xbd84fc48,0xbd84e467,2
+np.float32,0x3d65c6f5,0x3d65a826,2
+np.float32,0xfe987800,0xc2b068c4,2
+np.float32,0x7ec59532,0x42b0ed7a,2
+np.float32,0x3ea0232c,0x3e9da29a,2
+np.float32,0x80292a08,0x80292a08,2
+np.float32,0x734cfe,0x734cfe,2
+np.float32,0x3f3b6d63,0x3f2dc596,2
+np.float32,0x3f27bcc1,0x3f1d97e6,2
+np.float32,0xfe1da554,0xc2af16f9,2
+np.float32,0x7c91f5,0x7c91f5,2
+np.float32,0xfe4e78cc,0xc2afa11e,2
+np.float32,0x7e4b4e08,0x42af9933,2
+np.float32,0xfe0949ec,0xc2aed02e,2
+np.float32,0x7e2f057f,0x42af4c81,2
+np.float32,0xbf200ae0,0xbf171ce1,2
+np.float32,0x3ebcc244,0x3eb8b99e,2
+np.float32,0xbf68f58d,0xbf50f7aa,2
+np.float32,0x4420b1,0x4420b1,2
+np.float32,0x3f5b61bf,0x3f46cac7,2
+np.float32,0x3fec78,0x3fec78,2
+np.float32,0x7f4183c8,0x42b245b7,2
+np.float32,0xbf10587c,0xbf099ee2,2
+np.float32,0x0,0x0,2
+np.float32,0x7ec84dc3,0x42b0f47a,2
+np.float32,0x3f5fbd7b,0x3f4a166d,2
+np.float32,0xbd884eb8,0xbd883502,2
+np.float32,0xfe3f10a4,0xc2af7969,2
+np.float32,0xff3f4920,0xc2b23fc9,2
+np.float32,0x8013900f,0x8013900f,2
+np.float32,0x8003529d,0x8003529d,2
+np.float32,0xbf032384,0xbefbfb3c,2
+np.float32,0xff418c7c,0xc2b245ce,2
+np.float32,0xbec0aad0,0xbebc633b,2
+np.float32,0xfdbff178,0xc2ae18de,2
+np.float32,0x68ab15,0x68ab15,2
+np.float32,0xbdfc4a88,0xbdfba848,2
+np.float32,0xbf5adec6,0xbf466747,2
+np.float32,0x807d5dcc,0x807d5dcc,2
+np.float32,0x61d144,0x61d144,2
+np.float32,0x807e3a03,0x807e3a03,2
+np.float32,0x1872f2,0x1872f2,2
+np.float32,0x7f2a272c,0x42b203d8,2
+np.float32,0xfe7f8314,0xc2b00e3a,2
+np.float32,0xbe42aeac,0xbe418737,2
+np.float32,0x8024b614,0x8024b614,2
+np.float32,0xbe41b6b8,0xbe40939a,2
+np.float32,0xa765c,0xa765c,2
+np.float32,0x7ea74f4b,0x42b09853,2
+np.float32,0x7f7ef631,0x42b2d2e7,2
+np.float32,0x7eaef5e6,0x42b0af38,2
+np.float32,0xff733d85,0xc2b2bacf,2
+np.float32,0x537ac0,0x537ac0,2
+np.float32,0xbeca4790,0xbec55b1d,2
+np.float32,0x80117314,0x80117314,2
+np.float32,0xfe958536,0xc2b05ec5,2
+np.float32,0x8066ecc2,0x8066ecc2,2
+np.float32,0xbf56baf3,0xbf433e82,2
+np.float32,0x1f7fd7,0x1f7fd7,2
+np.float32,0x3e942104,0x3e9222fc,2
+np.float32,0xfeaffe82,0xc2b0b23c,2
+np.float32,0xfe0e02b0,0xc2aee17e,2
+np.float32,0xbf800000,0xbf61a1b3,2
+np.float32,0x800b7e49,0x800b7e49,2
+np.float32,0x6c514f,0x6c514f,2
+np.float32,0xff800000,0xff800000,2
+np.float32,0x7f7d9a45,0x42b2d02b,2
+np.float32,0x800c9c69,0x800c9c69,2
+np.float32,0x274b14,0x274b14,2
+np.float32,0xbf4b22b0,0xbf3a42e2,2
+np.float32,0x63e5ae,0x63e5ae,2
+np.float32,0xbe18facc,0xbe186a90,2
+np.float32,0x7e137351,0x42aef4bd,2
+np.float32,0x80518ffd,0x80518ffd,2
+np.float32,0xbf0a8ffc,0xbf048f0d,2
+np.float32,0x841d,0x841d,2
+np.float32,0x7edfdc9e,0x42b12d69,2
+np.float32,0xfd1092b0,0xc2ac24de,2
+np.float32,0x7e2c9bdf,0x42af4566,2
+np.float32,0x7f7fffff,0x42b2d4fc,2
+np.float32,0x3f4954a6,0x3f38d853,2
+np.float32,0xbe83efd2,0xbe8284c3,2
+np.float32,0x800e8e02,0x800e8e02,2
+np.float32,0x78ad39,0x78ad39,2
+np.float32,0x7eb0f967,0x42b0b514,2
+np.float32,0xbe39aa94,0xbe38a9ee,2
+np.float32,0x80194e7b,0x80194e7b,2
+np.float32,0x3cf3a340,0x3cf39a0f,2
+np.float32,0x3ed3117a,0x3ecd8173,2
+np.float32,0x7f530b11,0x42b2721c,2
+np.float32,0xff756ba2,0xc2b2bf60,2
+np.float32,0x15ea25,0x15ea25,2
+np.float32,0x803cbb64,0x803cbb64,2
+np.float32,0x3f34722d,0x3f281a2c,2
+np.float32,0x3ddd88e0,0x3ddd1adb,2
+np.float32,0x3f54244c,0x3f41418b,2
+np.float32,0x3e0adb98,0x3e0a6f8b,2
+np.float32,0x80800000,0x80800000,2
+np.float32,0x58902b,0x58902b,2
+np.float32,0xfe3b50b8,0xc2af6f43,2
+np.float32,0xfe0846d0,0xc2aecc64,2
+np.float32,0xbe0299d0,0xbe023fd4,2
+np.float32,0x18dde6,0x18dde6,2
+np.float32,0x8039fe8b,0x8039fe8b,2
+np.float32,0x8015d179,0x8015d179,2
+np.float32,0x3f551322,0x3f41f947,2
+np.float32,0x2ab387,0x2ab387,2
+np.float32,0xbf7e311e,0xbf6059d0,2
+np.float32,0xbdba58a8,0xbdba1713,2
+np.float32,0xbf1d008a,0xbf148724,2
+np.float32,0xbf6b9c97,0xbf52ec98,2
+np.float32,0x802acf04,0x802acf04,2
+np.float32,0x1,0x1,2
+np.float32,0xbe9e16d6,0xbe9bade3,2
+np.float32,0xbf048a14,0xbefe78c7,2
+np.float32,0x7e432ad3,0x42af8449,2
+np.float32,0xbdcc7fe0,0xbdcc2944,2
+np.float32,0x6dfc27,0x6dfc27,2
+np.float32,0xfef6eed8,0xc2b15fa1,2
+np.float32,0xbeeff6e8,0xbee7f2e4,2
+np.float32,0x7e3a6ca8,0x42af6cd2,2
+np.float32,0xff2c82e8,0xc2b20ae4,2
+np.float32,0x3e9f8d74,0x3e9d13b0,2
+np.float32,0x7ea36191,0x42b08c29,2
+np.float32,0x7f734bed,0x42b2baed,2
+np.float32,0x7f2df96d,0x42b20f37,2
+np.float32,0x5036fd,0x5036fd,2
+np.float32,0x806eab38,0x806eab38,2
+np.float32,0xbe9db90e,0xbe9b5446,2
+np.float32,0xfeef6fac,0xc2b14fd9,2
+np.float32,0xc2bf7,0xc2bf7,2
+np.float32,0xff53ec3d,0xc2b2743d,2
+np.float32,0x7e837637,0x42b01cde,2
+np.float32,0xbefb5934,0xbef23662,2
+np.float32,0x3f6cec80,0x3f53e371,2
+np.float32,0x3e86e7de,0x3e85643f,2
+np.float32,0x3f09cb42,0x3f03e1ef,2
+np.float32,0xbec3d236,0xbebf5620,2
+np.float32,0xfedef246,0xc2b12b50,2
+np.float32,0xbf08d6a8,0xbf030a62,2
+np.float32,0x8036cbf9,0x8036cbf9,2
+np.float32,0x3f74d3e3,0x3f59a512,2
+np.float32,0x6a600c,0x6a600c,2
+np.float32,0xfd1295b0,0xc2ac2bf1,2
+np.float32,0xbeb61142,0xbeb26efa,2
+np.float32,0x80216556,0x80216556,2
+np.float32,0xbf1fa0f6,0xbf16c30a,2
+np.float32,0x3e0af8e1,0x3e0a8c90,2
+np.float32,0x80434709,0x80434709,2
+np.float32,0x49efd9,0x49efd9,2
+np.float32,0x7f7cce6c,0x42b2ce8f,2
+np.float32,0x6e5450,0x6e5450,2
+np.float32,0x7f0fc115,0x42b1ad86,2
+np.float32,0x632db0,0x632db0,2
+np.float32,0x3f6f4c2a,0x3f55a064,2
+np.float32,0x7ec4f273,0x42b0ebd3,2
+np.float32,0x61ae1e,0x61ae1e,2
+np.float32,0x5f47c4,0x5f47c4,2
+np.float32,0xbf3c8f62,0xbf2eaf54,2
+np.float32,0xfca38900,0xc2ab0113,2
+np.float32,0x3ec89d52,0x3ec3ce78,2
+np.float32,0xbe0e3f70,0xbe0dcb53,2
+np.float32,0x805d3156,0x805d3156,2
+np.float32,0x3eee33f8,0x3ee65a4e,2
+np.float32,0xbeda7e9a,0xbed45a90,2
+np.float32,0x7e2fac7b,0x42af4e69,2
+np.float32,0x7efd0e28,0x42b16c2c,2
+np.float32,0x3f0c7b17,0x3f063e46,2
+np.float32,0xbf395bec,0xbf2c198f,2
+np.float32,0xfdf1c3f8,0xc2ae8f05,2
+np.float32,0xbe11f4e4,0xbe117783,2
+np.float32,0x7eddc901,0x42b128a3,2
+np.float32,0x3f4bad09,0x3f3aaf33,2
+np.float32,0xfefb5d76,0xc2b168bd,2
+np.float32,0x3ed3a4cf,0x3ece09a3,2
+np.float32,0x7ec582e4,0x42b0ed4a,2
+np.float32,0x3dc2268a,0x3dc1dc64,2
+np.float32,0x3ef9b17c,0x3ef0b9c9,2
+np.float32,0x2748ac,0x2748ac,2
+np.float32,0xfed6a602,0xc2b117e4,2
+np.float32,0xbefc9c36,0xbef35832,2
+np.float32,0x7e0476,0x7e0476,2
+np.float32,0x804be1a0,0x804be1a0,2
+np.float32,0xbefbc1c2,0xbef2943a,2
+np.float32,0xbd4698f0,0xbd46850a,2
+np.float32,0x688627,0x688627,2
+np.float32,0x3f7f7685,0x3f61406f,2
+np.float32,0x827fb,0x827fb,2
+np.float32,0x3f503264,0x3f3e34fd,2
+np.float32,0x7f5458d1,0x42b27543,2
+np.float32,0x800ac01f,0x800ac01f,2
+np.float32,0x6188dd,0x6188dd,2
+np.float32,0x806ac0ba,0x806ac0ba,2
+np.float32,0xbe14493c,0xbe13c5cc,2
+np.float32,0x3f77542c,0x3f5b72ae,2
+np.float32,0xfeaacab6,0xc2b0a2df,2
+np.float32,0x7f2893d5,0x42b1ff15,2
+np.float32,0x66b528,0x66b528,2
+np.float32,0xbf653e24,0xbf4e3573,2
+np.float32,0x801a2853,0x801a2853,2
+np.float32,0x3f3d8c98,0x3f2f7b04,2
+np.float32,0xfdffbad8,0xc2aeabc5,2
+np.float32,0x3dd50f,0x3dd50f,2
+np.float32,0x3f325a4c,0x3f266353,2
+np.float32,0xfcc48ec0,0xc2ab5f3f,2
+np.float32,0x3e6f5b9a,0x3e6d3ae5,2
+np.float32,0x3dbcd62b,0x3dbc91ee,2
+np.float32,0xbf7458d9,0xbf594c1c,2
+np.float32,0xff5adb24,0xc2b284b9,2
+np.float32,0x807b246d,0x807b246d,2
+np.float32,0x3f800000,0x3f61a1b3,2
+np.float32,0x231a28,0x231a28,2
+np.float32,0xbdc66258,0xbdc61341,2
+np.float32,0x3c84b4b4,0x3c84b338,2
+np.float32,0xbf215894,0xbf183783,2
+np.float32,0xff4ee298,0xc2b267ec,2
+np.float32,0x801ef52e,0x801ef52e,2
+np.float32,0x1040b0,0x1040b0,2
+np.float32,0xff545582,0xc2b2753b,2
+np.float32,0x3f3b9dda,0x3f2decaf,2
+np.float32,0x730f99,0x730f99,2
+np.float32,0xff7fffff,0xc2b2d4fc,2
+np.float32,0xff24cc5e,0xc2b1f379,2
+np.float32,0xbe9b456a,0xbe98fc0b,2
+np.float32,0x188fb,0x188fb,2
+np.float32,0x3f5c7ce2,0x3f47a18a,2
+np.float32,0x7fc00000,0x7fc00000,2
+np.float32,0x806ea4da,0x806ea4da,2
+np.float32,0xfe810570,0xc2b01345,2
+np.float32,0x8036af89,0x8036af89,2
+np.float32,0x8043cec6,0x8043cec6,2
+np.float32,0x80342bb3,0x80342bb3,2
+np.float32,0x1a2bd4,0x1a2bd4,2
+np.float32,0x3f6248c2,0x3f4bff9a,2
+np.float32,0x8024eb35,0x8024eb35,2
+np.float32,0x7ea55872,0x42b09247,2
+np.float32,0x806d6e56,0x806d6e56,2
+np.float32,0x25c21a,0x25c21a,2
+np.float32,0x3f4e95f3,0x3f3cf483,2
+np.float32,0x15ca38,0x15ca38,2
+np.float32,0x803f01b2,0x803f01b2,2
+np.float32,0xbe731634,0xbe70dc10,2
+np.float32,0x3e80cee4,0x3e7ef933,2
+np.float32,0x3ef6dda5,0x3eee2e7b,2
+np.float32,0x3f3dfdc2,0x3f2fd5ed,2
+np.float32,0xff0492a7,0xc2b18411,2
+np.float32,0xbf1d0adf,0xbf148ff3,2
+np.float32,0xfcf75460,0xc2abd4e3,2
+np.float32,0x3f46fca6,0x3f36ffa6,2
+np.float32,0xbe63b5c0,0xbe61dfb3,2
+np.float32,0xff019bec,0xc2b1787d,2
+np.float32,0x801f14a9,0x801f14a9,2
+np.float32,0x3f176cfa,0x3f0fc051,2
+np.float32,0x3f69d976,0x3f51a015,2
+np.float32,0x3f4917cb,0x3f38a87a,2
+np.float32,0x3b2a0bea,0x3b2a0bdd,2
+np.float32,0xbf41d857,0xbf32eb50,2
+np.float32,0xbf08841a,0xbf02c18f,2
+np.float32,0x7ec86f14,0x42b0f4d0,2
+np.float32,0xbf7d15d1,0xbf5f9090,2
+np.float32,0xbd080550,0xbd07feea,2
+np.float32,0xbf6f1bef,0xbf557d26,2
+np.float32,0xfebc282c,0xc2b0d473,2
+np.float32,0x3e68d2f5,0x3e66dd03,2
+np.float32,0x3f3ed8fe,0x3f3085d5,2
+np.float32,0xff2f78ae,0xc2b2139a,2
+np.float32,0xff647a70,0xc2b29ac1,2
+np.float32,0xfd0859a0,0xc2ac06e2,2
+np.float32,0x3ea578a8,0x3ea2b7e1,2
+np.float32,0x6c58c6,0x6c58c6,2
+np.float32,0xff23f26a,0xc2b1f0d2,2
+np.float32,0x800902a4,0x800902a4,2
+np.float32,0xfe8ba64e,0xc2b03bcd,2
+np.float32,0x3f091143,0x3f033e0f,2
+np.float32,0x8017c4bd,0x8017c4bd,2
+np.float32,0xbf708fd4,0xbf568c8c,2
+np.float32,0x3be1d8,0x3be1d8,2
+np.float32,0x80091f07,0x80091f07,2
+np.float32,0x68eabe,0x68eabe,2
+np.float32,0xfe9ab2c8,0xc2b07033,2
+np.float32,0x3eabe752,0x3ea8d3d7,2
+np.float32,0xbf7adcb2,0xbf5dfaf5,2
+np.float32,0x801ecc01,0x801ecc01,2
+np.float32,0xbf5570a9,0xbf424123,2
+np.float32,0x3e89eecd,0x3e88510e,2
+np.float32,0xfeb2feee,0xc2b0bae4,2
+np.float32,0xbeb25ec2,0xbeaef22b,2
+np.float32,0x201e49,0x201e49,2
+np.float32,0x800a35f6,0x800a35f6,2
+np.float32,0xbf02d449,0xbefb6e2a,2
+np.float32,0x3f062bea,0x3f00aef6,2
+np.float32,0x7f5219ff,0x42b26fd2,2
+np.float32,0xbd4561d0,0xbd454e47,2
+np.float32,0x3f6c4789,0x3f536a4b,2
+np.float32,0x7f58b06d,0x42b27fa1,2
+np.float32,0x7f132f39,0x42b1b999,2
+np.float32,0x3e05dcb4,0x3e057bd8,2
+np.float32,0x7f526045,0x42b2707d,2
+np.float32,0x3f6117d0,0x3f4b1adb,2
+np.float32,0xbf21f47d,0xbf18bb57,2
+np.float32,0x1a26d6,0x1a26d6,2
+np.float32,0x46b114,0x46b114,2
+np.float32,0x3eb24518,0x3eaed9ef,2
+np.float32,0xfe2139c8,0xc2af2278,2
+np.float32,0xbf7c36fb,0xbf5ef1f6,2
+np.float32,0x3f193834,0x3f114af7,2
+np.float32,0xff3ea650,0xc2b23e14,2
+np.float32,0xfeeb3bca,0xc2b146c7,2
+np.float32,0x7e8b8ca0,0x42b03b6f,2
+np.float32,0x3eed903d,0x3ee5c5d2,2
+np.float32,0xbdc73740,0xbdc6e72a,2
+np.float32,0x7e500307,0x42afa4ec,2
+np.float32,0xe003c,0xe003c,2
+np.float32,0x3e612bb4,0x3e5f64fd,2
+np.float32,0xfd81e248,0xc2ad50e6,2
+np.float32,0x766a4f,0x766a4f,2
+np.float32,0x3e8708c9,0x3e858414,2
+np.float32,0xbf206c58,0xbf176f7f,2
+np.float32,0x7e93aeb0,0x42b0586f,2
+np.float32,0xfd9d36b8,0xc2adb2ad,2
+np.float32,0xff1f4e0e,0xc2b1e21d,2
+np.float32,0x3f22bd5a,0x3f1964f8,2
+np.float32,0x7f6a517a,0x42b2a7ad,2
+np.float32,0xff6ca773,0xc2b2acc1,2
+np.float32,0x7f6bf453,0x42b2ab3d,2
+np.float32,0x3edfdd64,0x3ed9489f,2
+np.float32,0xbeafc5ba,0xbeac7daa,2
+np.float32,0x7d862039,0x42ad615b,2
+np.float32,0xbe9d2002,0xbe9ac1fc,2
+np.float32,0xbdcc54c0,0xbdcbfe5b,2
+np.float32,0xbf1bc0aa,0xbf13762a,2
+np.float32,0xbf4679ce,0xbf36984b,2
+np.float32,0x3ef45696,0x3eebe713,2
+np.float32,0xff6eb999,0xc2b2b137,2
+np.float32,0xbe4b2e4c,0xbe49dee8,2
+np.float32,0x3f498951,0x3f3901b7,2
+np.float32,0xbe9692f4,0xbe947be1,2
+np.float32,0xbf44ce26,0xbf3545c8,2
+np.float32,0x805787a8,0x805787a8,2
+np.float32,0xbf342650,0xbf27dc26,2
+np.float32,0x3edafbf0,0x3ed4cdd2,2
+np.float32,0x3f6fb858,0x3f55ef63,2
+np.float32,0xff227d0a,0xc2b1ec3f,2
+np.float32,0xfeb9a202,0xc2b0cd89,2
+np.float32,0x7f5b12c1,0x42b2853b,2
+np.float32,0x584578,0x584578,2
+np.float32,0x7ec0b76f,0x42b0e0b5,2
+np.float32,0x3f57f54b,0x3f442f10,2
+np.float32,0x7eef3620,0x42b14f5d,2
+np.float32,0x4525b5,0x4525b5,2
+np.float32,0x801bd407,0x801bd407,2
+np.float32,0xbed1f166,0xbecc7703,2
+np.float32,0x3f57e732,0x3f442449,2
+np.float32,0x80767cd5,0x80767cd5,2
+np.float32,0xbef1a7d2,0xbee97aa3,2
+np.float32,0x3dd5b1af,0x3dd54ee6,2
+np.float32,0x960c,0x960c,2
+np.float32,0x7c392d41,0x42a9ddd1,2
+np.float32,0x3f5c9a34,0x3f47b7c1,2
+np.float32,0x3f5cecee,0x3f47f667,2
+np.float32,0xbee482ce,0xbedd8899,2
+np.float32,0x8066ba7e,0x8066ba7e,2
+np.float32,0x7ed76127,0x42b119a2,2
+np.float32,0x805ca40b,0x805ca40b,2
+np.float32,0x7f5ed5d1,0x42b28df3,2
+np.float32,0xfe9e1b1e,0xc2b07b5b,2
+np.float32,0x3f0201a2,0x3ef9f6c4,2
+np.float32,0xbf2e6430,0xbf232039,2
+np.float32,0x80326b4d,0x80326b4d,2
+np.float32,0x3f11dc7c,0x3f0af06e,2
+np.float32,0xbe89c42e,0xbe8827e6,2
+np.float32,0x3f3c69f8,0x3f2e9133,2
+np.float32,0x806326a9,0x806326a9,2
+np.float32,0x3f1c5286,0x3f13f2b6,2
+np.float32,0xff5c0ead,0xc2b28786,2
+np.float32,0xff32b952,0xc2b21d01,2
+np.float32,0x7dd27c4e,0x42ae4815,2
+np.float32,0xbf7a6816,0xbf5da7a2,2
+np.float32,0xfeac72f8,0xc2b0a7d1,2
+np.float32,0x335ad7,0x335ad7,2
+np.float32,0xbe682da4,0xbe663bcc,2
+np.float32,0x3f2df244,0x3f22c208,2
+np.float32,0x80686e8e,0x80686e8e,2
+np.float32,0x7f50120f,0x42b26ad9,2
+np.float32,0x3dbc596a,0x3dbc15b3,2
+np.float32,0xbf4f2868,0xbf3d666d,2
+np.float32,0x80000001,0x80000001,2
+np.float32,0xff66c059,0xc2b29fd2,2
+np.float32,0xfe8bbcaa,0xc2b03c1f,2
+np.float32,0x3ece6a51,0x3ec93271,2
+np.float32,0x7f06cd26,0x42b18c9a,2
+np.float32,0x7e41e6dc,0x42af80f5,2
+np.float32,0x7d878334,0x42ad669f,2
+np.float32,0xfe8c5c4c,0xc2b03e67,2
+np.float32,0x337a05,0x337a05,2
+np.float32,0x3e63801d,0x3e61ab58,2
+np.float32,0x62c315,0x62c315,2
+np.float32,0x802aa888,0x802aa888,2
+np.float32,0x80038b43,0x80038b43,2
+np.float32,0xff5c1271,0xc2b2878f,2
+np.float32,0xff4184a5,0xc2b245b9,2
+np.float32,0x7ef58f4b,0x42b15cc6,2
+np.float32,0x7f42d8ac,0x42b2493a,2
+np.float32,0x806609f2,0x806609f2,2
+np.float32,0x801e763b,0x801e763b,2
+np.float32,0x7f2bc073,0x42b208a2,2
+np.float32,0x801d7d7f,0x801d7d7f,2
+np.float32,0x7d415dc1,0x42acb9c2,2
+np.float32,0xbf624ff9,0xbf4c0502,2
+np.float32,0xbf603afd,0xbf4a74e2,2
+np.float32,0x8007fe42,0x8007fe42,2
+np.float32,0x800456db,0x800456db,2
+np.float32,0x620871,0x620871,2
+np.float32,0x3e9c6c1e,0x3e9a15fa,2
+np.float32,0x4245d,0x4245d,2
+np.float32,0x8035bde9,0x8035bde9,2
+np.float32,0xbf597418,0xbf45533c,2
+np.float32,0x3c730f80,0x3c730d38,2
+np.float32,0x3f7cd8ed,0x3f5f6540,2
+np.float32,0x807e49c3,0x807e49c3,2
+np.float32,0x3d6584c0,0x3d65660c,2
+np.float32,0xff42a744,0xc2b248b8,2
+np.float32,0xfedc6f56,0xc2b12583,2
+np.float32,0x806263a4,0x806263a4,2
+np.float32,0x175a17,0x175a17,2
+np.float32,0x3f1e8537,0x3f15d208,2
+np.float32,0x4055b5,0x4055b5,2
+np.float32,0x438aa6,0x438aa6,2
+np.float32,0x8038507f,0x8038507f,2
+np.float32,0xbed75348,0xbed16f85,2
+np.float32,0x7f07b7d6,0x42b19012,2
+np.float32,0xfe8b9d30,0xc2b03bac,2
+np.float32,0x805c501c,0x805c501c,2
+np.float32,0x3ef22b1d,0x3ee9f159,2
+np.float32,0x802b6759,0x802b6759,2
+np.float32,0x45281a,0x45281a,2
+np.float32,0xbf7e9970,0xbf60a3cf,2
+np.float32,0xbf14d152,0xbf0d8062,2
+np.float32,0x3d9ff950,0x3d9fcfc8,2
+np.float32,0x7865d9,0x7865d9,2
+np.float32,0xbee67fa4,0xbedf58eb,2
+np.float32,0x7dc822d1,0x42ae2e44,2
+np.float32,0x3f3af0fe,0x3f2d612c,2
+np.float32,0xbefea106,0xbef5274e,2
+np.float32,0xbf758a3f,0xbf5a28c5,2
+np.float32,0xbf331bdd,0xbf270209,2
+np.float32,0x7f51c901,0x42b26f0d,2
+np.float32,0x3f67c33b,0x3f5014d8,2
+np.float32,0xbbc9d980,0xbbc9d92c,2
+np.float32,0xbc407540,0xbc40741e,2
+np.float32,0x7eed9a3c,0x42b14be9,2
+np.float32,0x1be0fe,0x1be0fe,2
+np.float32,0xbf6b4913,0xbf52af1f,2
+np.float32,0xbda8eba8,0xbda8bac6,2
+np.float32,0x8004bcea,0x8004bcea,2
+np.float32,0xff6f6afe,0xc2b2b2b3,2
+np.float32,0xbf205810,0xbf175e50,2
+np.float32,0x80651944,0x80651944,2
+np.float32,0xbec73016,0xbec27a3f,2
+np.float32,0x5701b9,0x5701b9,2
+np.float32,0xbf1062ce,0xbf09a7df,2
+np.float32,0x3e0306ae,0x3e02abd1,2
+np.float32,0x7bfc62,0x7bfc62,2
+np.float32,0xbf48dd3c,0xbf387a6b,2
+np.float32,0x8009573e,0x8009573e,2
+np.float32,0x660a2c,0x660a2c,2
+np.float32,0xff2280da,0xc2b1ec4b,2
+np.float32,0xbf7034fe,0xbf564a54,2
+np.float32,0xbeeb448e,0xbee3b045,2
+np.float32,0xff4e949c,0xc2b2672b,2
+np.float32,0xbf3c4486,0xbf2e7309,2
+np.float32,0x7eb086d8,0x42b0b3c8,2
+np.float32,0x7eac8aca,0x42b0a817,2
+np.float32,0xfd3d2d60,0xc2acae8b,2
+np.float32,0xbf363226,0xbf2987bd,2
+np.float32,0x7f02e524,0x42b17d8c,2
+np.float32,0x8049a148,0x8049a148,2
+np.float32,0x147202,0x147202,2
+np.float32,0x8031d3f6,0x8031d3f6,2
+np.float32,0xfe78bf68,0xc2b0007d,2
+np.float32,0x7ebd16d0,0x42b0d6fb,2
+np.float32,0xbdaed2e8,0xbdae9cbb,2
+np.float32,0x802833ae,0x802833ae,2
+np.float32,0x7f62adf6,0x42b296b5,2
+np.float32,0xff2841c0,0xc2b1fe1b,2
+np.float32,0xbeb2c47e,0xbeaf523b,2
+np.float32,0x7e42a36e,0x42af82e6,2
+np.float32,0x41ea29,0x41ea29,2
+np.float32,0xbcaaa800,0xbcaaa4d7,2
+np.float64,0x3fed71f27ebae3e5,0x3fea5c6095012ca6,2
+np.float64,0x224dc392449b9,0x224dc392449b9,2
+np.float64,0x3fdf897a7d3f12f5,0x3fde620339360992,2
+np.float64,0xbfe1f99a5123f334,0xbfe124a57cfaf556,2
+np.float64,0xbfd9725c3bb2e4b8,0xbfd8d1e3f75110c7,2
+np.float64,0x3fe38977546712ee,0x3fe27d9d37f4b91f,2
+np.float64,0xbfc36c29e526d854,0xbfc3594743ee45c4,2
+np.float64,0xbfe5cbec332b97d8,0xbfe4638802316849,2
+np.float64,0x2ff35efe5fe6d,0x2ff35efe5fe6d,2
+np.float64,0x7fd3f828e227f051,0x40862a7d4a40b1e0,2
+np.float64,0xffd06fc11620df82,0xc08628ee8f1bf6c8,2
+np.float64,0x3fe5321bf4aa6438,0x3fe3e3d9fa453199,2
+np.float64,0xffd07a323ca0f464,0xc08628f3a2930f8c,2
+np.float64,0x3fdf7abe7abef57c,0x3fde54cb193d49cb,2
+np.float64,0x40941f1881285,0x40941f1881285,2
+np.float64,0xffef18defc7e31bd,0xc0863393f2c9f061,2
+np.float64,0xbfe379f871e6f3f1,0xbfe270620cb68347,2
+np.float64,0xffec829848f90530,0xc08632e210edaa2b,2
+np.float64,0x80070c00574e1801,0x80070c00574e1801,2
+np.float64,0xffce7654b23ceca8,0xc086285291e89975,2
+np.float64,0x7fc9932daa33265a,0x408626ec6cc2b807,2
+np.float64,0x355ee98c6abde,0x355ee98c6abde,2
+np.float64,0x3fac54962c38a920,0x3fac50e40b6c19f2,2
+np.float64,0x800857984af0af31,0x800857984af0af31,2
+np.float64,0x7fea6a3d55f4d47a,0x40863245bf39f179,2
+np.float64,0x3fdb8fab33371f56,0x3fdac5ffc9e1c347,2
+np.float64,0x800a887a7bf510f5,0x800a887a7bf510f5,2
+np.float64,0xbfbdbda3c63b7b48,0xbfbdac9dd5a2d3e8,2
+np.float64,0xbfd4a2457b29448a,0xbfd44acb3b316d6d,2
+np.float64,0x7fd5329a502a6534,0x40862af789b528b5,2
+np.float64,0x3fd96a7bceb2d4f8,0x3fd8ca92104d6cd6,2
+np.float64,0x3fde6a0cd6bcd41a,0x3fdd5f4b85abf749,2
+np.float64,0xbfc7faaff32ff560,0xbfc7d7560b8c4a52,2
+np.float64,0x7fec381b2f787035,0x408632cd0e9c095c,2
+np.float64,0x1fc2eb543f85e,0x1fc2eb543f85e,2
+np.float64,0x7ac6000af58c1,0x7ac6000af58c1,2
+np.float64,0xffe060a87920c150,0xc0862e72c37d5a4e,2
+np.float64,0xbfb7d8c89e2fb190,0xbfb7cffd3c3f8e3a,2
+np.float64,0x3fd91033deb22068,0x3fd87695b067aa1e,2
+np.float64,0x3fec1aff01b835fe,0x3fe95d5cbd729af7,2
+np.float64,0x7fb97f69ec32fed3,0x4086215aaae5c697,2
+np.float64,0x7feaf1e4e5f5e3c9,0x4086326e6ca6a2bb,2
+np.float64,0x800537e44d0a6fc9,0x800537e44d0a6fc9,2
+np.float64,0x800b2a0d0d36541a,0x800b2a0d0d36541a,2
+np.float64,0x3fe2193846e43270,0x3fe140308550138e,2
+np.float64,0x5e2a0a32bc542,0x5e2a0a32bc542,2
+np.float64,0xffe5888b09eb1116,0xc08630a348783aa3,2
+np.float64,0xbfceb9b5033d736c,0xbfce701049c10435,2
+np.float64,0x7fe5d68589abad0a,0x408630c00ce63f23,2
+np.float64,0x8009b5457ff36a8b,0x8009b5457ff36a8b,2
+np.float64,0xbfb5518c2e2aa318,0xbfb54b42638ca718,2
+np.float64,0x3f9c58469838b080,0x3f9c575974fbcd7b,2
+np.float64,0x3fe8db4b4731b697,0x3fe6dc9231587966,2
+np.float64,0x8007d0f77f4fa1f0,0x8007d0f77f4fa1f0,2
+np.float64,0x7fe79eef542f3dde,0x40863160c673c67f,2
+np.float64,0xffbdc0b6163b8170,0xc0862296be4bf032,2
+np.float64,0x3fbb8d3312371a66,0x3fbb7fa76fb4cf8d,2
+np.float64,0xffd8a0eedbb141de,0xc0862c2ac6e512f0,2
+np.float64,0x7fee99d8d87d33b1,0x4086337301c4c8df,2
+np.float64,0xffe7479b552e8f36,0xc0863142fba0f0ec,2
+np.float64,0xffedf8ef4abbf1de,0xc08633488068fe69,2
+np.float64,0x895c4d9f12b8a,0x895c4d9f12b8a,2
+np.float64,0x29b4caf05369a,0x29b4caf05369a,2
+np.float64,0xbfefb90d657f721b,0xbfec01efa2425b35,2
+np.float64,0xde07c3bdbc0f9,0xde07c3bdbc0f9,2
+np.float64,0x7feae9fd02f5d3f9,0x4086326c1368ed5a,2
+np.float64,0x3feab792da756f26,0x3fe84f6e15338ed7,2
+np.float64,0xbfeff8ed72fff1db,0xbfec2f35da06daaf,2
+np.float64,0x8004b2c132896583,0x8004b2c132896583,2
+np.float64,0xbf9fcb00103f9600,0xbf9fc9b1751c569e,2
+np.float64,0x4182b72e83058,0x4182b72e83058,2
+np.float64,0x90820d812105,0x90820d812105,2
+np.float64,0xbfdec9a0ba3d9342,0xbfddb585df607ce1,2
+np.float64,0x7fdc0a69a03814d2,0x40862d347f201b63,2
+np.float64,0xbfef0708937e0e11,0xbfeb82d27f8ea97f,2
+np.float64,0xffda57e4ddb4afca,0xc0862cb49e2e0c4c,2
+np.float64,0xbfa30b9af4261730,0xbfa30a7b4a633060,2
+np.float64,0x7feb57fcc4b6aff9,0x4086328c83957a0b,2
+np.float64,0x7fe6759153eceb22,0x408630f980433963,2
+np.float64,0x7fdd3278c8ba64f1,0x40862d87445243e9,2
+np.float64,0xd3b8e6b9a771d,0xd3b8e6b9a771d,2
+np.float64,0x6267dc88c4cfc,0x6267dc88c4cfc,2
+np.float64,0x7fedd3cf00bba79d,0x4086333e91712ff5,2
+np.float64,0xffbe512ce03ca258,0xc08622bd39314cea,2
+np.float64,0xbfe71742ca6e2e86,0xbfe572ccbf2d010d,2
+np.float64,0x8002fb048c65f60a,0x8002fb048c65f60a,2
+np.float64,0x800d9d9ddf7b3b3c,0x800d9d9ddf7b3b3c,2
+np.float64,0xbfeaf6230df5ec46,0xbfe87f5d751ec3d5,2
+np.float64,0xbfe69973a42d32e8,0xbfe50c680f7002fe,2
+np.float64,0x3fe309cf87e613a0,0x3fe21048714ce1ac,2
+np.float64,0x800435d17a286ba4,0x800435d17a286ba4,2
+np.float64,0x7fefffffffffffff,0x408633ce8fb9f87e,2
+np.float64,0x3fe36ade1766d5bc,0x3fe26379fb285dde,2
+np.float64,0x3f98d8d94831b1c0,0x3f98d839885dc527,2
+np.float64,0xbfd08f7ae5211ef6,0xbfd0618ab5293e1e,2
+np.float64,0xbfcf630bd53ec618,0xbfcf14a0cd20704d,2
+np.float64,0xbfe58f0ca6eb1e1a,0xbfe4312225df8e28,2
+np.float64,0xffef4f6406be9ec7,0xc08633a1ed1d27e5,2
+np.float64,0x7fe10120b3e20240,0x40862ebfaf94e6e8,2
+np.float64,0xffe96c52fbb2d8a5,0xc08631f75d9a59a0,2
+np.float64,0xbfe448a333e89146,0xbfe31fee44c3ec43,2
+np.float64,0x80045ff4e788bfeb,0x80045ff4e788bfeb,2
+np.float64,0x7fefaa2f823f545e,0x408633b8fea29524,2
+np.float64,0xffea6b8bf234d717,0xc0863246248e5960,2
+np.float64,0xbfdb085d80b610bc,0xbfda498b15b43eec,2
+np.float64,0xbfd5e12da3abc25c,0xbfd57970e2b8aecc,2
+np.float64,0x3fcc84928a390925,0x3fcc497c417a89f3,2
+np.float64,0xbfdcb713bf396e28,0xbfdbd46c5e731fd9,2
+np.float64,0xffdf50c0453ea180,0xc0862e16b5562f25,2
+np.float64,0x800342c2f7268587,0x800342c2f7268587,2
+np.float64,0x7feb8b6d743716da,0x4086329b8248de2c,2
+np.float64,0x800a9b18b4953632,0x800a9b18b4953632,2
+np.float64,0xffedaf0d12fb5e19,0xc0863334af82de1a,2
+np.float64,0x800aebda4ab5d7b5,0x800aebda4ab5d7b5,2
+np.float64,0xbfa9f5848433eb10,0xbfa9f2ac7ac065d4,2
+np.float64,0x3fea375928f46eb2,0x3fe7ec9f10eeac7d,2
+np.float64,0x3fd6c213fead8428,0x3fd64dcc1eff5f1b,2
+np.float64,0xbfa0476f44208ee0,0xbfa046bb986007ac,2
+np.float64,0x6c8e18aed91c4,0x6c8e18aed91c4,2
+np.float64,0x8000000000000001,0x8000000000000001,2
+np.float64,0x7fea86b5ba350d6a,0x4086324e59f13027,2
+np.float64,0x2316c3b0462d9,0x2316c3b0462d9,2
+np.float64,0x3fec4e3281389c65,0x3fe983c5c9d65940,2
+np.float64,0x3fbb87c47f772,0x3fbb87c47f772,2
+np.float64,0x8004af00fdc95e03,0x8004af00fdc95e03,2
+np.float64,0xbfd316db9ba62db8,0xbfd2d12765b9d155,2
+np.float64,0x3fec1a7a99f834f6,0x3fe95cf941889b3d,2
+np.float64,0x3feff7e1477fefc3,0x3fec2e782392d4b9,2
+np.float64,0xbfc683ea042d07d4,0xbfc66698cfa5026e,2
+np.float64,0x3fdbc8aaa9b79154,0x3fdafa50e6fc3fff,2
+np.float64,0xfb3b630ff676d,0xfb3b630ff676d,2
+np.float64,0x7fe715ef8eae2bde,0x40863131d794b41f,2
+np.float64,0x7fefa06c11bf40d7,0x408633b686c7996a,2
+np.float64,0x80002a40f5205483,0x80002a40f5205483,2
+np.float64,0x7fe95f3c74b2be78,0x408631f33e37bf76,2
+np.float64,0x3fb2977b32252ef0,0x3fb2934eaf5a4be8,2
+np.float64,0x3fc0f3dbc821e7b8,0x3fc0e745288c84c3,2
+np.float64,0x3fda98da56b531b5,0x3fd9e2b19447dacc,2
+np.float64,0x3f95b9d5202b73aa,0x3f95b96a53282949,2
+np.float64,0x3fdc1ace7738359d,0x3fdb4597d31df7ff,2
+np.float64,0xffeac5bb2e358b76,0xc0863261452ab66c,2
+np.float64,0xbfefb1b78f7f636f,0xbfebfcb9be100ced,2
+np.float64,0xf5c9e191eb93c,0xf5c9e191eb93c,2
+np.float64,0x3fe83a977630752f,0x3fe65d0df90ff6ef,2
+np.float64,0x3fc317515d262ea0,0x3fc3056072b719f0,2
+np.float64,0x7fe2dcfab225b9f4,0x40862f94257c28a2,2
+np.float64,0xca2b115794562,0xca2b115794562,2
+np.float64,0x3fd495301aa92a60,0x3fd43e57108761d5,2
+np.float64,0x800ccc4293199885,0x800ccc4293199885,2
+np.float64,0xc8d3173d91a63,0xc8d3173d91a63,2
+np.float64,0xbf2541bb7e4a8,0xbf2541bb7e4a8,2
+np.float64,0xbfe9a330df334662,0xbfe779816573f5be,2
+np.float64,0xffd5e4c8252bc990,0xc0862b39b3ca5d72,2
+np.float64,0x3fe90f3a53721e75,0x3fe70585ae09531d,2
+np.float64,0xbfe2b5ddc7a56bbc,0xbfe1c7fa91a675ed,2
+np.float64,0xbf981a0360303400,0xbf9819719345073a,2
+np.float64,0x19174b0e322ea,0x19174b0e322ea,2
+np.float64,0xbfd2f71a1725ee34,0xbfd2b2b6f7cd10b1,2
+np.float64,0x80056e83236add07,0x80056e83236add07,2
+np.float64,0x7fe4bc41d9697883,0x40863055f20ce0cb,2
+np.float64,0xffe76e06c46edc0d,0xc086315024b25559,2
+np.float64,0x3fe3c4f0f96789e2,0x3fe2b04b584609bf,2
+np.float64,0x3fe6cfc533ed9f8a,0x3fe538b4d784d5ee,2
+np.float64,0x7fd234a640a4694c,0x408629bfead4f0b2,2
+np.float64,0x3fdbc49c9ab78939,0x3fdaf698a83d08e2,2
+np.float64,0x3fe4c5336ee98a66,0x3fe388c6ddb60e0a,2
+np.float64,0xf4b9497be9729,0xf4b9497be9729,2
+np.float64,0x3fb312be12262580,0x3fb30e3c847c1d16,2
+np.float64,0x3fe9554218f2aa84,0x3fe73c8b311c7a98,2
+np.float64,0xff899816a0333040,0xc08610bfb2cd8559,2
+np.float64,0x8006008ad52c0116,0x8006008ad52c0116,2
+np.float64,0x3fd7d47be4afa8f8,0x3fd74fa71ec17fd0,2
+np.float64,0x8010000000000000,0x8010000000000000,2
+np.float64,0xdf2a9943be553,0xdf2a9943be553,2
+np.float64,0xbfeb86bf1eb70d7e,0xbfe8ed797580ba5c,2
+np.float64,0x800e2c0c28bc5818,0x800e2c0c28bc5818,2
+np.float64,0xbfe2be65d4657ccc,0xbfe1cf578dec2323,2
+np.float64,0xbfedea3a5afbd475,0xbfeab490bf05e585,2
+np.float64,0xbfe04b1583a0962b,0xbfdf523dfd7be25c,2
+np.float64,0x75929bb4eb254,0x75929bb4eb254,2
+np.float64,0x3fd7b4968caf692d,0x3fd731c0938ff97c,2
+np.float64,0x60bd8fd2c17b3,0x60bd8fd2c17b3,2
+np.float64,0xbfdaf15e70b5e2bc,0xbfda345a95ce18fe,2
+np.float64,0x7fdd7c35c2baf86b,0x40862d9b5f40c6b2,2
+np.float64,0x7feeb4d2ab7d69a4,0x4086337a0c0dffaf,2
+np.float64,0xffe65b5a1decb6b4,0xc08630f024420efb,2
+np.float64,0x7feb272b30764e55,0x4086327e2e553aa2,2
+np.float64,0x3fd27513e8a4ea28,0x3fd235ea49670f6a,2
+np.float64,0x3fe6541a6aeca834,0x3fe4d3a5b69fd1b6,2
+np.float64,0xbfe0c6ca0f618d94,0xbfe017058259efdb,2
+np.float64,0x7fc1bf07b7237e0e,0x4086240000fa5a52,2
+np.float64,0x7fe96af9c0f2d5f3,0x408631f6f0f4faa2,2
+np.float64,0x3fe0728be7a0e518,0x3fdf9881a5869de9,2
+np.float64,0xffe8ea4441b1d488,0xc08631ce0685ae7e,2
+np.float64,0xffd0b973f02172e8,0xc08629121e7fdf85,2
+np.float64,0xffe37b907a26f720,0xc0862fd6529401a0,2
+np.float64,0x3fe0ee826461dd05,0x3fe03a2a424a1b40,2
+np.float64,0xbfe8073c92300e79,0xbfe6340cbd179ac1,2
+np.float64,0x800768383f8ed071,0x800768383f8ed071,2
+np.float64,0x8002e467c7c5c8d0,0x8002e467c7c5c8d0,2
+np.float64,0xbfd8d53ea5b1aa7e,0xbfd83fa7243289d7,2
+np.float64,0xffebefce2bb7df9c,0xc08632b874f4f8dc,2
+np.float64,0xffe3be9eb9277d3d,0xc0862ff1ac70ad0b,2
+np.float64,0xffe2f8a82e65f150,0xc0862f9fd9e77d86,2
+np.float64,0xbfa01d151c203a30,0xbfa01c66dc13a70a,2
+np.float64,0x800877062d30ee0d,0x800877062d30ee0d,2
+np.float64,0xaade16a755bc3,0xaade16a755bc3,2
+np.float64,0xbfeb1abc70363579,0xbfe89b52c3b003aa,2
+np.float64,0x80097d0b2ad2fa17,0x80097d0b2ad2fa17,2
+np.float64,0x8001499907429333,0x8001499907429333,2
+np.float64,0x3fe8db2aaf71b656,0x3fe6dc7873f1b235,2
+np.float64,0x5cfeadc4b9fd6,0x5cfeadc4b9fd6,2
+np.float64,0xff3f77d1fe7ef,0xff3f77d1fe7ef,2
+np.float64,0xffeecd56f9bd9aad,0xc08633806cb1163d,2
+np.float64,0xbf96f3ca582de7a0,0xbf96f34c6b8e1c85,2
+np.float64,0x7ed6b44afdad7,0x7ed6b44afdad7,2
+np.float64,0x80071808da4e3012,0x80071808da4e3012,2
+np.float64,0x3feb8aee2bf715dc,0x3fe8f0a55516615c,2
+np.float64,0x800038f62e2071ed,0x800038f62e2071ed,2
+np.float64,0x3fb13f9af2227f30,0x3fb13c456ced8e08,2
+np.float64,0xffd584d1812b09a4,0xc0862b165558ec0c,2
+np.float64,0x800b20c30fb64186,0x800b20c30fb64186,2
+np.float64,0x80024f9646e49f2d,0x80024f9646e49f2d,2
+np.float64,0xffefffffffffffff,0xc08633ce8fb9f87e,2
+np.float64,0x3fdddbcb5bbbb797,0x3fdcde981111f650,2
+np.float64,0xffed14077f3a280e,0xc086330a795ad634,2
+np.float64,0x800fec2da7ffd85b,0x800fec2da7ffd85b,2
+np.float64,0x3fe8205ffc7040c0,0x3fe6482318d217f9,2
+np.float64,0x3013e5226027d,0x3013e5226027d,2
+np.float64,0xffe4e5aad469cb55,0xc0863065dc2fb4e3,2
+np.float64,0x5cb0f7b2b9620,0x5cb0f7b2b9620,2
+np.float64,0xbfeb4537d2768a70,0xbfe8bbb2c1d3bff9,2
+np.float64,0xbfd859e297b0b3c6,0xbfd7cc807948bf9d,2
+np.float64,0x71f00b8ce3e02,0x71f00b8ce3e02,2
+np.float64,0xf5c1b875eb837,0xf5c1b875eb837,2
+np.float64,0xa0f35c8141e8,0xa0f35c8141e8,2
+np.float64,0xffe24860b42490c1,0xc0862f54222f616e,2
+np.float64,0xffcd9ae8583b35d0,0xc08628181e643a42,2
+np.float64,0x7fe9b710c7736e21,0x4086320ec033490f,2
+np.float64,0x3fd2b9ca1d257394,0x3fd277e631f0c0b3,2
+np.float64,0x23559bfc46ab4,0x23559bfc46ab4,2
+np.float64,0x8002adf75e455bef,0x8002adf75e455bef,2
+np.float64,0xbfefa4d75cbf49af,0xbfebf392e51d6a1a,2
+np.float64,0xffcfef263e3fde4c,0xc08628b336adb611,2
+np.float64,0x80061acaa8ec3596,0x80061acaa8ec3596,2
+np.float64,0x7fc1b33be0236677,0x408623faaddcc17e,2
+np.float64,0x7fe3a84083675080,0x40862fe8972e41e1,2
+np.float64,0xbfe756c1276ead82,0xbfe5a6318b061e1b,2
+np.float64,0xbfae4b71b43c96e0,0xbfae46ed0b6203a4,2
+np.float64,0x800421c6d0a8438e,0x800421c6d0a8438e,2
+np.float64,0x8009ad56fe335aae,0x8009ad56fe335aae,2
+np.float64,0xbfe71afc976e35f9,0xbfe575d21f3d7193,2
+np.float64,0x7fec0bbe4c38177c,0x408632c0710f1d8a,2
+np.float64,0x750e1daeea1c4,0x750e1daeea1c4,2
+np.float64,0x800501d4240a03a9,0x800501d4240a03a9,2
+np.float64,0x800794955cef292b,0x800794955cef292b,2
+np.float64,0x3fdf8a87f5bf1510,0x3fde62f4f00cfa19,2
+np.float64,0xbfebebdbc7f7d7b8,0xbfe939e51ba1340c,2
+np.float64,0xbfe3a16217a742c4,0xbfe292039dd08a71,2
+np.float64,0x3fed6cd04c3ad9a1,0x3fea58995973f74b,2
+np.float64,0xffcad8787335b0f0,0xc086274fbb35dd37,2
+np.float64,0x3fcb178e3d362f1c,0x3fcae4c9f3e6dddc,2
+np.float64,0xbfcadc669435b8cc,0xbfcaaae7cf075420,2
+np.float64,0x7fe0e3906321c720,0x40862eb1bacc5c43,2
+np.float64,0xff8ad5edb035abc0,0xc0861120b6404d0b,2
+np.float64,0x3fe175a21562eb44,0x3fe0b13120a46549,2
+np.float64,0xbfeb4c4a5f769895,0xbfe8c1147f1c9d8f,2
+np.float64,0x7fca22f4e63445e9,0x40862718e9b4094e,2
+np.float64,0x3fe4269d0c684d3a,0x3fe3032aa2015c53,2
+np.float64,0x3fef551c09beaa38,0x3febbabe03f49c83,2
+np.float64,0xffd843df9fb087c0,0xc0862c0c52d5e5d9,2
+np.float64,0x7fc497e2ca292fc5,0x40862530bbd9fcc7,2
+np.float64,0x3fee02919efc0523,0x3feac655588a4acd,2
+np.float64,0x7fed1e52c0fa3ca5,0x4086330d4ddd8a2c,2
+np.float64,0xba04d4ef7409b,0xba04d4ef7409b,2
+np.float64,0x3fee22d0937c45a2,0x3feaddd4ca66b447,2
+np.float64,0xffeb2558cf764ab1,0xc086327da4e84053,2
+np.float64,0xbfe103d987e207b3,0xbfe04d04818ad1ff,2
+np.float64,0x3f9fd7fed03faffe,0x3f9fd6ae9a45be84,2
+np.float64,0x800a53ec4c34a7d9,0x800a53ec4c34a7d9,2
+np.float64,0xbfe2feb17f65fd63,0xbfe206b9d33a78a2,2
+np.float64,0x989bdd613139,0x989bdd613139,2
+np.float64,0xbfdd0ad3fb3a15a8,0xbfdc20c32a530741,2
+np.float64,0xbfc4222163284444,0xbfc40d1c612784b5,2
+np.float64,0xc30cf5c78619f,0xc30cf5c78619f,2
+np.float64,0x3fe913bd6732277b,0x3fe70912f76bad71,2
+np.float64,0x98f175f531e2f,0x98f175f531e2f,2
+np.float64,0x3fed8c1f717b183f,0x3fea6f9fb3af3423,2
+np.float64,0x7fee46b085bc8d60,0x4086335d269eb7e9,2
+np.float64,0x8007480f564e901f,0x8007480f564e901f,2
+np.float64,0xc9b96e179372e,0xc9b96e179372e,2
+np.float64,0x3fe44deac4289bd6,0x3fe32463a74a69e7,2
+np.float64,0x80021d6c5c243ad9,0x80021d6c5c243ad9,2
+np.float64,0xbfebc805a6f7900b,0xbfe91edcf65a1c19,2
+np.float64,0x80044748adc88e92,0x80044748adc88e92,2
+np.float64,0x4007ee44800fe,0x4007ee44800fe,2
+np.float64,0xbfe24307a4648610,0xbfe1648ad5c47b6f,2
+np.float64,0xbfee6d3a93fcda75,0xbfeb13e1a3196e78,2
+np.float64,0x3fe49a287f293451,0x3fe364a11b9f0068,2
+np.float64,0x80052b37ceaa5670,0x80052b37ceaa5670,2
+np.float64,0xbfd42be893a857d2,0xbfd3da05dac7c286,2
+np.float64,0xffb4bbe4ac2977c8,0xc0861fb31bda6956,2
+np.float64,0xbfc732a4142e6548,0xbfc7129a4eafa399,2
+np.float64,0x7fd0696791a0d2ce,0x408628eb7756cb9c,2
+np.float64,0x3fe46c8f8d68d91f,0x3fe33e3df16187c1,2
+np.float64,0x3fe3a28f1ce7451e,0x3fe293043238d08c,2
+np.float64,0xffedc4eb723b89d6,0xc086333a92258c15,2
+np.float64,0x8000d15b4c41a2b7,0x8000d15b4c41a2b7,2
+np.float64,0xffeb73450236e689,0xc08632947b0148ab,2
+np.float64,0xffe68cf4722d19e8,0xc0863101d08d77bd,2
+np.float64,0x800c70eb4698e1d7,0x800c70eb4698e1d7,2
+np.float64,0xffa94387ff529,0xffa94387ff529,2
+np.float64,0x7fe3835d996706ba,0x40862fd985ff8e7d,2
+np.float64,0x3fe55e476feabc8e,0x3fe408a15594ec52,2
+np.float64,0xffc69672222d2ce4,0xc08625ee0c4c0f6a,2
+np.float64,0xbf9d900b883b2020,0xbf9d8efe811d36df,2
+np.float64,0xbfdb9b9755b7372e,0xbfdad0f2aa2cb110,2
+np.float64,0xffeade6073b5bcc0,0xc08632689f17a25d,2
+np.float64,0xffd1d6a6baa3ad4e,0xc086299630a93a7b,2
+np.float64,0x7fd05ba25620b744,0x408628e4be1ef845,2
+np.float64,0xbfc7d422d52fa844,0xbfc7b170a61531bf,2
+np.float64,0x3fd5196797aa32d0,0x3fd4bc0f0e7d8e1d,2
+np.float64,0x617594a4c2eb3,0x617594a4c2eb3,2
+np.float64,0x7fd779bc4caef378,0x40862bc89271b882,2
+np.float64,0xffd2fb262ba5f64c,0xc0862a15561e9524,2
+np.float64,0x72fd661ae5fad,0x72fd661ae5fad,2
+np.float64,0x3fecf441f339e884,0x3fe9ff880d584f64,2
+np.float64,0x7fc3a8968827512c,0x408624d198b05c61,2
+np.float64,0x3fe7a25c56ef44b9,0x3fe5e32509a7c32d,2
+np.float64,0x7fd117d514222fa9,0x4086293ec640d5f2,2
+np.float64,0x3fe37dfe5ee6fbfc,0x3fe273d1bcaa1ef0,2
+np.float64,0xbfed4cd19d7a99a3,0xbfea41064cba4c8b,2
+np.float64,0x8003ff12aaa7fe26,0x8003ff12aaa7fe26,2
+np.float64,0x3fcbc3d1193787a2,0x3fcb8d39e3e88264,2
+np.float64,0xe9ba1a91d3744,0xe9ba1a91d3744,2
+np.float64,0x8002ab71998556e4,0x8002ab71998556e4,2
+np.float64,0x800110057922200c,0x800110057922200c,2
+np.float64,0xbfe3b7af19a76f5e,0xbfe2a502fc0a2882,2
+np.float64,0x7fd9de9d5e33bd3a,0x40862c8f73cccabf,2
+np.float64,0xbfba0f0a86341e18,0xbfba0392f44c2771,2
+np.float64,0x8000000000000000,0x8000000000000000,2
+np.float64,0x7fe5d162e96ba2c5,0x408630be2b15e01b,2
+np.float64,0x800b7f0eac76fe1e,0x800b7f0eac76fe1e,2
+np.float64,0xff98bed150317da0,0xc086160633164f5f,2
+np.float64,0x3fef91fd70ff23fb,0x3febe629709d0ae7,2
+np.float64,0x7fe5bea7f16b7d4f,0x408630b749f445e9,2
+np.float64,0xbfe3dc428467b885,0xbfe2c41ea93fab07,2
+np.float64,0xbfeba1fbfcf743f8,0xbfe9021b52851bb9,2
+np.float64,0x7fd2fb2108a5f641,0x40862a1553f45830,2
+np.float64,0x7feb8199a4370332,0x40863298a7169dad,2
+np.float64,0x800f97ff8d7f2fff,0x800f97ff8d7f2fff,2
+np.float64,0x3fd5e20b6b2bc417,0x3fd57a42bd1c0993,2
+np.float64,0x8006b4072dad680f,0x8006b4072dad680f,2
+np.float64,0x605dccf2c0bba,0x605dccf2c0bba,2
+np.float64,0x3fc705ed142e0bda,0x3fc6e69971d86f73,2
+np.float64,0xffd2ba1aad257436,0xc08629f9bc918f8b,2
+np.float64,0x8002954e23c52a9d,0x8002954e23c52a9d,2
+np.float64,0xbfecc65da7798cbb,0xbfe9dd745be18562,2
+np.float64,0x7fc66110482cc220,0x408625db0db57ef8,2
+np.float64,0x3fcd09446d3a1289,0x3fcccaf2dd0a41ea,2
+np.float64,0x3febe7095437ce13,0x3fe93642d1e73b2a,2
+np.float64,0x8004773c7da8ee7a,0x8004773c7da8ee7a,2
+np.float64,0x8001833241230665,0x8001833241230665,2
+np.float64,0x3fe6a262db6d44c6,0x3fe513b3dab5adce,2
+np.float64,0xe6282cc1cc506,0xe6282cc1cc506,2
+np.float64,0x800b9d8553973b0b,0x800b9d8553973b0b,2
+np.float64,0x3fdfbe0c7b3f7c19,0x3fde912375d867a8,2
+np.float64,0x7fd5ac11ebab5823,0x40862b24dfc6d08e,2
+np.float64,0x800e4b7cb1fc96f9,0x800e4b7cb1fc96f9,2
+np.float64,0x3fe14706da628e0e,0x3fe0883aec2a917a,2
+np.float64,0x7fc963f97532c7f2,0x408626dd9b0cafe1,2
+np.float64,0xbfe9c250b5b384a2,0xbfe791c5eabcb05d,2
+np.float64,0x3fe8d16e6c71a2dd,0x3fe6d4c7a33a0bf4,2
+np.float64,0x3fe474ae4628e95d,0x3fe34515c93f4733,2
+np.float64,0x3fbf3257ee3e64b0,0x3fbf1eb530e126ea,2
+np.float64,0x8005f089b3abe114,0x8005f089b3abe114,2
+np.float64,0x3fece07bccf9c0f8,0x3fe9f0dc228124d5,2
+np.float64,0xbfc52521632a4a44,0xbfc50ccebdf59c2c,2
+np.float64,0x7fdf53beb13ea77c,0x40862e177918195e,2
+np.float64,0x8003d9f6ad07b3ee,0x8003d9f6ad07b3ee,2
+np.float64,0xffeacf96bbb59f2d,0xc086326436b38b1a,2
+np.float64,0xdccaea29b995e,0xdccaea29b995e,2
+np.float64,0x5948d21eb291b,0x5948d21eb291b,2
+np.float64,0x10000000000000,0x10000000000000,2
+np.float64,0x7fef6d2c543eda58,0x408633a98593cdf5,2
+np.float64,0x7feda454f47b48a9,0x40863331cb6dc9f7,2
+np.float64,0x3fdd377cecba6ef8,0x3fdc4968f74a9c83,2
+np.float64,0x800644096d4c8814,0x800644096d4c8814,2
+np.float64,0xbfe33ca15ae67942,0xbfe23be5de832bd8,2
+np.float64,0xffce9582bd3d2b04,0xc086285abdf9bf9d,2
+np.float64,0x3fe6621e86acc43d,0x3fe4df231bfa93e1,2
+np.float64,0xee7d19e9dcfa3,0xee7d19e9dcfa3,2
+np.float64,0x800be5997277cb33,0x800be5997277cb33,2
+np.float64,0x82069041040e,0x82069041040e,2
+np.float64,0x800d6efdc19addfc,0x800d6efdc19addfc,2
+np.float64,0x7fb27770ee24eee1,0x40861ec5ed91b839,2
+np.float64,0x3fd506064caa0c0d,0x3fd4a9a66353fefd,2
+np.float64,0xbfeca9b36bf95367,0xbfe9c81f03ba37b8,2
+np.float64,0xffeab1b7bab5636f,0xc086325b47f61f2b,2
+np.float64,0xffc99f5b2e333eb8,0xc08626f03b08b412,2
+np.float64,0x3fbf1a71bc3e34e3,0x3fbf06fbcaa5de58,2
+np.float64,0x3fe75015736ea02b,0x3fe5a0cd8d763d8d,2
+np.float64,0xffe6a7442fad4e88,0xc086310b20addba4,2
+np.float64,0x3fe5d62ff86bac60,0x3fe46c033195bf28,2
+np.float64,0x7fd0b1f0362163df,0x4086290e857dc1be,2
+np.float64,0xbe0353737c06b,0xbe0353737c06b,2
+np.float64,0x7fec912d8739225a,0x408632e627704635,2
+np.float64,0xded8ba2fbdb18,0xded8ba2fbdb18,2
+np.float64,0x7fec0b53fdf816a7,0x408632c052bc1bd2,2
+np.float64,0x7fe9640d12b2c819,0x408631f4c2ba54d8,2
+np.float64,0x800be714eeb7ce2a,0x800be714eeb7ce2a,2
+np.float64,0xbfcf444a793e8894,0xbfcef6c126b54853,2
+np.float64,0xffeb20cf1bf6419e,0xc086327c4e6ffe80,2
+np.float64,0xc07de22180fd,0xc07de22180fd,2
+np.float64,0xffed129d387a253a,0xc086330a15ad0adb,2
+np.float64,0x3fd9e94fedb3d2a0,0x3fd94049924706a8,2
+np.float64,0x7fe6ba488c2d7490,0x40863111d51e7861,2
+np.float64,0xbfebbdf25db77be5,0xbfe91740ad7ba521,2
+np.float64,0x7fbc6c3c4838d878,0x40862239160cb613,2
+np.float64,0xbfefa82ecebf505e,0xbfebf5f31957dffd,2
+np.float64,0x800bebeb7ad7d7d7,0x800bebeb7ad7d7d7,2
+np.float64,0x7fecccc6f8f9998d,0x408632f6c6da8aac,2
+np.float64,0xcbe4926197ca,0xcbe4926197ca,2
+np.float64,0x2c5d9fd858bb5,0x2c5d9fd858bb5,2
+np.float64,0xbfe9fb021073f604,0xbfe7bddc61f1151a,2
+np.float64,0xbfebb18572f7630b,0xbfe90ddc5002313f,2
+np.float64,0x13bb0d3227763,0x13bb0d3227763,2
+np.float64,0x3feefa5e5cbdf4bd,0x3feb79b9e8ce16bf,2
+np.float64,0x3fc97f086132fe10,0x3fc9549fc8e15ecb,2
+np.float64,0xffe70887c06e110f,0xc086312d30fd31cf,2
+np.float64,0xa00c113540182,0xa00c113540182,2
+np.float64,0x800950984772a131,0x800950984772a131,2
+np.float64,0x1,0x1,2
+np.float64,0x3fd83b4026b07680,0x3fd7afdc659d9a34,2
+np.float64,0xbfe32348fbe64692,0xbfe226292a706a1a,2
+np.float64,0x800b894dcc77129c,0x800b894dcc77129c,2
+np.float64,0xeb2ca419d6595,0xeb2ca419d6595,2
+np.float64,0xbff0000000000000,0xbfec34366179d427,2
+np.float64,0x3feb269e99f64d3d,0x3fe8a4634b927a21,2
+np.float64,0xbfe83149d7706294,0xbfe655a2b245254e,2
+np.float64,0xbfe6eef3ca6ddde8,0xbfe5521310e24d16,2
+np.float64,0x3fea89a4b7b51349,0x3fe82c1fc69edcec,2
+np.float64,0x800f2a8bf17e5518,0x800f2a8bf17e5518,2
+np.float64,0x800f71fac29ee3f6,0x800f71fac29ee3f6,2
+np.float64,0xe7cb31f1cf966,0xe7cb31f1cf966,2
+np.float64,0x3b0f8752761f2,0x3b0f8752761f2,2
+np.float64,0x3fea27dea3744fbd,0x3fe7e0a4705476b2,2
+np.float64,0xbfa97c019c32f800,0xbfa97950c1257b92,2
+np.float64,0xffeff13647ffe26c,0xc08633cadc7105ed,2
+np.float64,0x3feee162353dc2c4,0x3feb67c2da0fbce8,2
+np.float64,0x80088c0807911810,0x80088c0807911810,2
+np.float64,0x3fe936ab1db26d56,0x3fe72489bc69719d,2
+np.float64,0xa2f84bd545f0a,0xa2f84bd545f0a,2
+np.float64,0xbfed445ed27a88be,0xbfea3acac0aaf482,2
+np.float64,0x800faf3e69df5e7d,0x800faf3e69df5e7d,2
+np.float64,0x3fc145a330228b46,0x3fc13853f11b1c90,2
+np.float64,0xbfe25ec5abe4bd8c,0xbfe17c9e9b486f07,2
+np.float64,0x3fe119b160e23363,0x3fe0604b10178966,2
+np.float64,0x7fe0cbf2836197e4,0x40862ea6831e5f4a,2
+np.float64,0x3fe75dd3b4eebba8,0x3fe5abe80fd628fb,2
+np.float64,0x3f7c391000387220,0x3f7c39015d8f3a36,2
+np.float64,0x899d9cad133b4,0x899d9cad133b4,2
+np.float64,0x3fe5f0e34febe1c6,0x3fe4820cefe138fc,2
+np.float64,0x7fe060dfdba0c1bf,0x40862e72de8afcd0,2
+np.float64,0xbfae42f7103c85f0,0xbfae3e7630819c60,2
+np.float64,0x35f1f2c06be5,0x35f1f2c06be5,2
+np.float64,0xffc5194d362a329c,0xc086256266c8b7ad,2
+np.float64,0xbfda034f1b34069e,0xbfd95860a44c43ad,2
+np.float64,0x32bcebca6579e,0x32bcebca6579e,2
+np.float64,0xbfd1751ebca2ea3e,0xbfd13f79f45bf75c,2
+np.float64,0x3fee4fa1e5bc9f44,0x3feafe69e0d6c1c7,2
+np.float64,0x7f9c03cd5038079a,0x4086170459172900,2
+np.float64,0x7fc5fb6d6d2bf6da,0x408625b6651cfc73,2
+np.float64,0x7ff8000000000000,0x7ff8000000000000,2
+np.float64,0xffd1a8162ca3502c,0xc0862981333931ad,2
+np.float64,0x7fc415c198282b82,0x408624fd8c155d1b,2
+np.float64,0xffda37fbe7b46ff8,0xc0862caae7865c43,2
+np.float64,0xbfef4312257e8624,0xbfebadd89f3ee31c,2
+np.float64,0xbfec45e1fd788bc4,0xbfe97d8b14db6274,2
+np.float64,0xbfe6fdcfd26dfba0,0xbfe55e25b770d00a,2
+np.float64,0x7feb66d424f6cda7,0x40863290d9ff7ea2,2
+np.float64,0x8b08a29916115,0x8b08a29916115,2
+np.float64,0xffe12ca25c625944,0xc0862ed40d769f72,2
+np.float64,0x7ff4000000000000,0x7ffc000000000000,2
+np.float64,0x804925e100925,0x804925e100925,2
+np.float64,0xcebf3e019d9,0xcebf3e019d9,2
+np.float64,0xbfd5d75d4aabaeba,0xbfd57027671dedf7,2
+np.float64,0x800b829ecd37053e,0x800b829ecd37053e,2
+np.float64,0x800b1205daf6240c,0x800b1205daf6240c,2
+np.float64,0x3fdf7e9889befd31,0x3fde583fdff406c3,2
+np.float64,0x7ff0000000000000,0x7ff0000000000000,2
+np.float64,0x3fdc09760d3812ec,0x3fdb35b55c8090c6,2
+np.float64,0x800c4d99e4f89b34,0x800c4d99e4f89b34,2
+np.float64,0xffbaa6772e354cf0,0xc08621b535badb2f,2
+np.float64,0xbfc91188fd322310,0xbfc8e933b5d25ea7,2
+np.float64,0xffc1b947f4237290,0xc08623fd69164251,2
+np.float64,0x3fc6ab3b252d5678,0x3fc68d50bbac106d,2
+np.float64,0xffac8eb968391d70,0xc0861cb734833355,2
+np.float64,0xffe29a35c365346b,0xc0862f77a1aed6d8,2
+np.float64,0x3fde14b9543c2973,0x3fdd122697779015,2
+np.float64,0xbf10f5400021e000,0xbf10f53fffef1383,2
+np.float64,0xffe0831aa3e10635,0xc0862e838553d0ca,2
+np.float64,0x3fccbadbcf3975b8,0x3fcc7e768d0154ec,2
+np.float64,0x3fe092ef66e125df,0x3fdfd212a7116c9b,2
+np.float64,0xbfd727f039ae4fe0,0xbfd6adad040b2334,2
+np.float64,0xbfe4223b93a84477,0xbfe2ff7587364db4,2
+np.float64,0x3f4e5c3a003cb874,0x3f4e5c39b75c70f7,2
+np.float64,0x800e76b1a87ced63,0x800e76b1a87ced63,2
+np.float64,0x3fed2b7368fa56e7,0x3fea2863b9131b8c,2
+np.float64,0xffadb76ec43b6ee0,0xc0861d08ae79f20c,2
+np.float64,0x800b6a0cd1f6d41a,0x800b6a0cd1f6d41a,2
+np.float64,0xffee6aa943fcd552,0xc0863366a24250d5,2
+np.float64,0xbfe68cbc4e6d1978,0xbfe502040591aa5b,2
+np.float64,0xff859a38002b3480,0xc0860f64726235cc,2
+np.float64,0x3474d13e68e9b,0x3474d13e68e9b,2
+np.float64,0xffc11d49f6223a94,0xc08623b5c2df9712,2
+np.float64,0x800d82d019bb05a0,0x800d82d019bb05a0,2
+np.float64,0xbfe2af0192255e03,0xbfe1c20e38106388,2
+np.float64,0x3fe97d13c032fa28,0x3fe75bba11a65f86,2
+np.float64,0x7fcd457e133a8afb,0x40862800e80f5863,2
+np.float64,0x9d7254cf3ae4b,0x9d7254cf3ae4b,2
+np.float64,0x8003047675a608ee,0x8003047675a608ee,2
+np.float64,0x3fead6cd7d75ad9a,0x3fe8676138e5ff93,2
+np.float64,0x3fea6ee3b0f4ddc7,0x3fe817838a2bcbe3,2
+np.float64,0x3feed0edea7da1dc,0x3feb5bea3cb12fe2,2
+np.float64,0x88003fe510008,0x88003fe510008,2
+np.float64,0x3fe64cadc56c995c,0x3fe4cd8ead87fc79,2
+np.float64,0xaae30c5955c62,0xaae30c5955c62,2
+np.float64,0x7fc8c97cae3192f8,0x408626ac579f4fc5,2
+np.float64,0xbfc2bc0e8b25781c,0xbfc2ab188fdab7dc,2
+np.float64,0xc8f8e5e791f1d,0xc8f8e5e791f1d,2
+np.float64,0x3fecfaa5d6f9f54c,0x3fea0444dabe5a15,2
+np.float64,0xbfeb93740ff726e8,0xbfe8f71a9ab13baf,2
+np.float64,0xffd951236c32a246,0xc0862c633a4661eb,2
+np.float64,0x3fddbc5fcd3b78c0,0x3fdcc21c1a0a9246,2
+np.float64,0xbfd242443da48488,0xbfd20512d91f7924,2
+np.float64,0x2a3689b2546d2,0x2a3689b2546d2,2
+np.float64,0xffe24c67382498ce,0xc0862f55e4ea6283,2
+np.float64,0x800cbfce22197f9c,0x800cbfce22197f9c,2
+np.float64,0x8002269428044d29,0x8002269428044d29,2
+np.float64,0x7fd44babbd289756,0x40862a9e79b51c3b,2
+np.float64,0x3feea056a27d40ad,0x3feb38dcddb682f0,2
+np.float64,0xffeca8174b39502e,0xc08632ec8f88a5b2,2
+np.float64,0x7fbe0853a03c10a6,0x408622a9e8d53a9e,2
+np.float64,0xbfa9704b2432e090,0xbfa96d9dfc8c0cc2,2
+np.float64,0x800bda28fab7b452,0x800bda28fab7b452,2
+np.float64,0xbfb0ffa2f621ff48,0xbfb0fc71f405e82a,2
+np.float64,0xbfe66c04216cd808,0xbfe4e73ea3b58cf6,2
+np.float64,0x3fe336ea5d266dd5,0x3fe236ffcf078c62,2
+np.float64,0xbfe7729ae6aee536,0xbfe5bcad4b8ac62d,2
+np.float64,0x558cfc96ab1a0,0x558cfc96ab1a0,2
+np.float64,0xbfe7d792aaefaf26,0xbfe60de1b8f0279d,2
+np.float64,0xffd19ef6bda33dee,0xc086297d0ffee3c7,2
+np.float64,0x666b3ab4ccd68,0x666b3ab4ccd68,2
+np.float64,0xffa3d89e3c27b140,0xc08619cdeb2c1e49,2
+np.float64,0xbfb1728f7f62f,0xbfb1728f7f62f,2
+np.float64,0x3fc76319f32ec634,0x3fc74247bd005e20,2
+np.float64,0xbfbf1caee23e3960,0xbfbf0934c13d70e2,2
+np.float64,0x7fe79626f32f2c4d,0x4086315dcc68a5cb,2
+np.float64,0xffee78c4603cf188,0xc086336a572c05c2,2
+np.float64,0x3fce546eda3ca8de,0x3fce0d8d737fd31d,2
+np.float64,0xa223644d4446d,0xa223644d4446d,2
+np.float64,0x3fecea878b79d510,0x3fe9f850d50973f6,2
+np.float64,0x3fc20e0ea1241c1d,0x3fc1fedda87c5e75,2
+np.float64,0xffd1c5a99ca38b54,0xc086298e8e94cd47,2
+np.float64,0x7feb2c299d765852,0x4086327fa6db2808,2
+np.float64,0xcaf9d09595f3a,0xcaf9d09595f3a,2
+np.float64,0xbfe293bf21e5277e,0xbfe1aa7f6ac274ef,2
+np.float64,0xbfbaa3c8ce354790,0xbfba97891df19c01,2
+np.float64,0x3faf5784543eaf09,0x3faf5283acc7d71d,2
+np.float64,0x7fc014f8f62029f1,0x40862336531c662d,2
+np.float64,0xbfe0d9ac2d61b358,0xbfe027bce36699ca,2
+np.float64,0x8003e112ff27c227,0x8003e112ff27c227,2
+np.float64,0xffec0d4151381a82,0xc08632c0df718dd0,2
+np.float64,0x7fa2156fb0242ade,0x4086190f7587d708,2
+np.float64,0xd698358dad307,0xd698358dad307,2
+np.float64,0xbfed8d1b0efb1a36,0xbfea70588ef9ba18,2
+np.float64,0xbfd2cae6a92595ce,0xbfd28851e2185dee,2
+np.float64,0xffe7a36764ef46ce,0xc086316249c9287a,2
+np.float64,0xbfdb8ad8e5b715b2,0xbfdac19213c14315,2
+np.float64,0x3b5dba6076bc,0x3b5dba6076bc,2
+np.float64,0x800e6e8347bcdd07,0x800e6e8347bcdd07,2
+np.float64,0x800bea9f3fb7d53f,0x800bea9f3fb7d53f,2
+np.float64,0x7fb6d0e5fc2da1cb,0x4086207714c4ab85,2
+np.float64,0x0,0x0,2
+np.float64,0xbfe2aa1e1465543c,0xbfe1bdd550ef2966,2
+np.float64,0x7fd3f6a47fa7ed48,0x40862a7caea33055,2
+np.float64,0x800094e292c129c6,0x800094e292c129c6,2
+np.float64,0x800e1500ecbc2a02,0x800e1500ecbc2a02,2
+np.float64,0xbfd8ff6f97b1fee0,0xbfd866f84346ecdc,2
+np.float64,0x681457d0d028c,0x681457d0d028c,2
+np.float64,0x3feed0b5987da16b,0x3feb5bc1ab424984,2
+np.float64,0x3fdbcb34cdb79668,0x3fdafca540f32c06,2
+np.float64,0xbfdc9eacdcb93d5a,0xbfdbbe274aa8aeb0,2
+np.float64,0xffe6e35d526dc6ba,0xc08631203df38ed2,2
+np.float64,0x3fcac1cc65358398,0x3fca90de41889613,2
+np.float64,0xbfebf07a55b7e0f5,0xbfe93d6007db0c67,2
+np.float64,0xbfd7a7b1e7af4f64,0xbfd725a9081c22cb,2
+np.float64,0x800232bd7de4657c,0x800232bd7de4657c,2
+np.float64,0x7fb1dae43c23b5c7,0x40861e80f5c0a64e,2
+np.float64,0x8013ded70027c,0x8013ded70027c,2
+np.float64,0x7fc4373a59286e74,0x4086250ad60575d0,2
+np.float64,0xbfe9980fd6733020,0xbfe770d1352d0ed3,2
+np.float64,0x8008a66b8dd14cd7,0x8008a66b8dd14cd7,2
+np.float64,0xbfaebc67f83d78d0,0xbfaeb7b015848478,2
+np.float64,0xffd0c52762218a4e,0xc0862917b564afc6,2
+np.float64,0xbfd503860aaa070c,0xbfd4a74618441561,2
+np.float64,0x5bdacabcb7b5a,0x5bdacabcb7b5a,2
+np.float64,0xf3623cffe6c48,0xf3623cffe6c48,2
+np.float64,0x7fe16c6c7ea2d8d8,0x40862ef18d90201f,2
+np.float64,0x3ff0000000000000,0x3fec34366179d427,2
+np.float64,0x7fe19cbc84233978,0x40862f079dcbc169,2
+np.float64,0x3fcfd3d6933fa7ad,0x3fcf822187907f6b,2
+np.float64,0x8007d65d672facbc,0x8007d65d672facbc,2
+np.float64,0xffca6115aa34c22c,0xc086272bd7728750,2
+np.float64,0xbfe77ab1556ef562,0xbfe5c332fb55b66e,2
+np.float64,0x8001ed797c23daf4,0x8001ed797c23daf4,2
+np.float64,0x7fdd3d16cb3a7a2d,0x40862d8a2c869281,2
+np.float64,0x75f36beaebe6e,0x75f36beaebe6e,2
+np.float64,0xffda3c2798b47850,0xc0862cac2d3435df,2
+np.float64,0xbfa37cc3c426f980,0xbfa37b8f9d3ec4b7,2
+np.float64,0x80030ea8bd061d52,0x80030ea8bd061d52,2
+np.float64,0xffe41f7617683eec,0xc08630188a3e135e,2
+np.float64,0x800e40590dfc80b2,0x800e40590dfc80b2,2
+np.float64,0x3fea950d80f52a1c,0x3fe834e74481e66f,2
+np.float64,0xffec95e39a792bc6,0xc08632e779150084,2
+np.float64,0xbfd54310ecaa8622,0xbfd4e39c4d767002,2
+np.float64,0xffd40c9971a81932,0xc0862a85764eb2f4,2
+np.float64,0xb0a2230761445,0xb0a2230761445,2
+np.float64,0x80092973661252e7,0x80092973661252e7,2
+np.float64,0x7fb13b030a227605,0x40861e380aeb5549,2
+np.float64,0x3fbd5d8db23abb1b,0x3fbd4d2a0b94af36,2
+np.float64,0xbfd6cb8567ad970a,0xbfd656b19ab8fa61,2
+np.float64,0xbfe7c0fd346f81fa,0xbfe5fbc28807c794,2
+np.float64,0xffd586579eab0cb0,0xc0862b16e65c0754,2
+np.float64,0x8000e52da461ca5c,0x8000e52da461ca5c,2
+np.float64,0x3fc69d17112d3a2e,0x3fc67f63fe1fea1c,2
+np.float64,0x3fd36ba892a6d750,0x3fd3225be1fa87af,2
+np.float64,0x7fe2850598e50a0a,0x40862f6e7fcd6c1a,2
+np.float64,0x80074a4dacce949c,0x80074a4dacce949c,2
+np.float64,0x3fe25eea4d64bdd5,0x3fe17cbe5fefbd4e,2
+np.float64,0xbfe250c08be4a181,0xbfe17074c520e5de,2
+np.float64,0x8000f5665481eacd,0x8000f5665481eacd,2
+np.float64,0x7fdb3172f83662e5,0x40862cf5a46764f1,2
+np.float64,0x7fd8ed82d631db05,0x40862c4380658afa,2
+np.float64,0xffec5163feb8a2c7,0xc08632d4366aab06,2
+np.float64,0x800ff14ac6ffe296,0x800ff14ac6ffe296,2
+np.float64,0xbfc7cc7aea2f98f4,0xbfc7a9e9cb38f023,2
+np.float64,0xbfd50cdfc32a19c0,0xbfd4b0282b452fb2,2
+np.float64,0xbfec256d75b84adb,0xbfe965328c1860b2,2
+np.float64,0xffe860c4cdb0c189,0xc08631a164b7059a,2
+np.float64,0xbfe23de164247bc3,0xbfe16011bffa4651,2
+np.float64,0xcc96b39d992d7,0xcc96b39d992d7,2
+np.float64,0xbfec43acf938875a,0xbfe97be3a13b50c3,2
+np.float64,0xc4f587bb89eb1,0xc4f587bb89eb1,2
+np.float64,0xbfcd971d9a3b2e3c,0xbfcd5537ad15dab4,2
+np.float64,0xffcaf00d8035e01c,0xc0862756bf2cdf8f,2
+np.float64,0x8008c26f93f184e0,0x8008c26f93f184e0,2
+np.float64,0xfff0000000000000,0xfff0000000000000,2
+np.float64,0xbfd13552c3a26aa6,0xbfd101e5e252eb7b,2
+np.float64,0x7fe497235e292e46,0x4086304792fb423a,2
+np.float64,0x7fd6dc0192adb802,0x40862b921a5e935d,2
+np.float64,0xf16d49a1e2da9,0xf16d49a1e2da9,2
+np.float64,0xffef6b1b71bed636,0xc08633a8feed0178,2
+np.float64,0x7fe15ec62f62bd8b,0x40862eeb46b193dc,2
+np.float64,0x3fef4369ec7e86d4,0x3febae1768be52cc,2
+np.float64,0x4f84e8e89f09e,0x4f84e8e89f09e,2
+np.float64,0xbfe19e71ade33ce4,0xbfe0d4fad05e0ebc,2
+np.float64,0xbfe7e1df1defc3be,0xbfe616233e15b3d0,2
+np.float64,0x7fe9349afdb26935,0x408631e5c1c5c6cd,2
+np.float64,0xff90c35ac82186c0,0xc08612e896a06467,2
+np.float64,0xbfe88bf8807117f1,0xbfe69dc786464422,2
+np.float64,0x3feaf9ff6475f3fe,0x3fe8825132410d18,2
+np.float64,0x9ff487a33fe91,0x9ff487a33fe91,2
+np.float64,0x7fedb30159bb6602,0x40863335c0419322,2
+np.float64,0x800bddf6ed77bbee,0x800bddf6ed77bbee,2
+np.float64,0x3fd919df133233be,0x3fd87f963b9584ce,2
+np.float64,0x7fd64da3b52c9b46,0x40862b5fa9dd3b6d,2
+np.float64,0xbfce288db43c511c,0xbfcde2d953407ae8,2
+np.float64,0x3fe88bc72771178e,0x3fe69da05e9e9b4e,2
+np.float64,0x800feafe259fd5fc,0x800feafe259fd5fc,2
+np.float64,0x3febbbff4a7777ff,0x3fe915c78f6a280f,2
+np.float64,0xbfefbde4417f7bc9,0xbfec055f4fb2cd21,2
+np.float64,0xf13ca103e2794,0xf13ca103e2794,2
+np.float64,0x3fe6423884ec8471,0x3fe4c4f97eaa876a,2
+np.float64,0x800ca01c8cb94039,0x800ca01c8cb94039,2
+np.float64,0x3fbc5073f638a0e0,0x3fbc41c163ac0001,2
+np.float64,0xbfda0d83cfb41b08,0xbfd961d4cacc82cf,2
+np.float64,0x800f37b8f17e6f72,0x800f37b8f17e6f72,2
+np.float64,0x7fe0b08cd7216119,0x40862e996becb771,2
+np.float64,0xffd4222a40a84454,0xc0862a8e0c984917,2
+np.float64,0x7feb3df98ff67bf2,0x40863284e3a86ee6,2
+np.float64,0x8001d5d291e3aba6,0x8001d5d291e3aba6,2
+np.float64,0xbfd3c21629a7842c,0xbfd3750095a5894a,2
+np.float64,0xbfd069eb48a0d3d6,0xbfd03d2b1c2ae9db,2
+np.float64,0xffeb1be2973637c4,0xc086327ada954662,2
+np.float64,0x3fc659f97e2cb3f3,0x3fc63d497a451f10,2
+np.float64,0xbfeb624bc776c498,0xbfe8d1cf7c0626ca,2
+np.float64,0xffeedf26e23dbe4d,0xc08633850baab425,2
+np.float64,0xffe70da48a6e1b48,0xc086312ef75d5036,2
+np.float64,0x2b4f4830569ea,0x2b4f4830569ea,2
+np.float64,0xffe82e7fcfb05cff,0xc0863190d4771f75,2
+np.float64,0x3fcc2c1fd5385840,0x3fcbf3211ddc5123,2
+np.float64,0x7fe22ced5a6459da,0x40862f481629ee6a,2
+np.float64,0x7fe13d2895e27a50,0x40862edbbc411899,2
+np.float64,0x3fd54c4280aa9884,0x3fd4ec55a946c5d7,2
+np.float64,0xffd75b8e01aeb71c,0xc0862bbe42d76e5e,2
+np.float64,0x7f1d5376fe3ab,0x7f1d5376fe3ab,2
+np.float64,0x3fe6ec6c902dd8d9,0x3fe55004f35192bd,2
+np.float64,0x5634504aac68b,0x5634504aac68b,2
+np.float64,0x3feedb0d83bdb61b,0x3feb633467467ce6,2
+np.float64,0x3fddb1c0dcbb6380,0x3fdcb87a02daf1fa,2
+np.float64,0xbfa832da443065b0,0xbfa8308c70257209,2
+np.float64,0x87a9836b0f531,0x87a9836b0f531,2
diff --git a/numpy/core/tests/data/umath-validation-set-arctan.csv b/numpy/core/tests/data/umath-validation-set-arctan.csv
new file mode 100644 (file)
index 0000000..1e92073
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0x3f338252,0x3f1c8d9c,3
+np.float32,0x7e569df2,0x3fc90fdb,3
+np.float32,0xbf347e25,0xbf1d361f,3
+np.float32,0xbf0a654e,0xbefdbfd2,3
+np.float32,0x8070968e,0x8070968e,3
+np.float32,0x803cfb27,0x803cfb27,3
+np.float32,0x8024362e,0x8024362e,3
+np.float32,0xfd55dca0,0xbfc90fdb,3
+np.float32,0x592b82,0x592b82,3
+np.float32,0x802eb8e1,0x802eb8e1,3
+np.float32,0xbc5fef40,0xbc5febae,3
+np.float32,0x3f1f6ce8,0x3f0e967c,3
+np.float32,0x20bedc,0x20bedc,3
+np.float32,0xbf058860,0xbef629c7,3
+np.float32,0x311504,0x311504,3
+np.float32,0xbd23f560,0xbd23defa,3
+np.float32,0x800ff4e8,0x800ff4e8,3
+np.float32,0x355009,0x355009,3
+np.float32,0x3f7be42e,0x3f46fdb3,3
+np.float32,0xbf225f7c,0xbf10b364,3
+np.float32,0x8074fa9e,0x8074fa9e,3
+np.float32,0xbea4b418,0xbe9f59ce,3
+np.float32,0xbe909c14,0xbe8cf045,3
+np.float32,0x80026bee,0x80026bee,3
+np.float32,0x3d789c20,0x3d784e25,3
+np.float32,0x7f56a4ba,0x3fc90fdb,3
+np.float32,0xbf70d141,0xbf413db7,3
+np.float32,0xbf2c4886,0xbf17a505,3
+np.float32,0x7e2993bf,0x3fc90fdb,3
+np.float32,0xbe2c8a30,0xbe2aef28,3
+np.float32,0x803f82d9,0x803f82d9,3
+np.float32,0x3f062fbc,0x3ef730a1,3
+np.float32,0x3f349ee0,0x3f1d4bfa,3
+np.float32,0x3eccfb69,0x3ec2f9e8,3
+np.float32,0x7e8a85dd,0x3fc90fdb,3
+np.float32,0x25331,0x25331,3
+np.float32,0x464f19,0x464f19,3
+np.float32,0x8035c818,0x8035c818,3
+np.float32,0x802e5799,0x802e5799,3
+np.float32,0x64e1c0,0x64e1c0,3
+np.float32,0x701cc2,0x701cc2,3
+np.float32,0x265c57,0x265c57,3
+np.float32,0x807a053f,0x807a053f,3
+np.float32,0x3bd2c412,0x3bd2c354,3
+np.float32,0xff28f1c8,0xbfc90fdb,3
+np.float32,0x7f08f08b,0x3fc90fdb,3
+np.float32,0x800c50e4,0x800c50e4,3
+np.float32,0x369674,0x369674,3
+np.float32,0xbf5b7db3,0xbf3571bf,3
+np.float32,0x7edcf5e2,0x3fc90fdb,3
+np.float32,0x800e5d4b,0x800e5d4b,3
+np.float32,0x80722554,0x80722554,3
+np.float32,0x693f33,0x693f33,3
+np.float32,0x800844e4,0x800844e4,3
+np.float32,0xbf111b82,0xbf0402ec,3
+np.float32,0x7df9c9ac,0x3fc90fdb,3
+np.float32,0xbf6619a6,0xbf3b6f57,3
+np.float32,0x8002fafe,0x8002fafe,3
+np.float32,0xfe1e67f8,0xbfc90fdb,3
+np.float32,0x3f7f4bf8,0x3f48b5b7,3
+np.float32,0x7f017b20,0x3fc90fdb,3
+np.float32,0x2d9b07,0x2d9b07,3
+np.float32,0x803aa174,0x803aa174,3
+np.float32,0x7d530336,0x3fc90fdb,3
+np.float32,0x80662195,0x80662195,3
+np.float32,0xfd5ebcf0,0xbfc90fdb,3
+np.float32,0xbe7b8dcc,0xbe76ab59,3
+np.float32,0x7f2bacaf,0x3fc90fdb,3
+np.float32,0x3f194fc4,0x3f0a229e,3
+np.float32,0x7ee21cdf,0x3fc90fdb,3
+np.float32,0x3f5a17fc,0x3f34a307,3
+np.float32,0x7f100c58,0x3fc90fdb,3
+np.float32,0x7e9128f5,0x3fc90fdb,3
+np.float32,0xbf2107c6,0xbf0fbdb4,3
+np.float32,0xbd29c800,0xbd29af22,3
+np.float32,0xbf5af499,0xbf3522a6,3
+np.float32,0x801bde44,0x801bde44,3
+np.float32,0xfeb4761a,0xbfc90fdb,3
+np.float32,0x3d88aa1b,0x3d887650,3
+np.float32,0x7eba5e0b,0x3fc90fdb,3
+np.float32,0x803906bd,0x803906bd,3
+np.float32,0x80101512,0x80101512,3
+np.float32,0x7e898f83,0x3fc90fdb,3
+np.float32,0x806406d3,0x806406d3,3
+np.float32,0x7ed20fc0,0x3fc90fdb,3
+np.float32,0x20827d,0x20827d,3
+np.float32,0x3f361359,0x3f1e43fe,3
+np.float32,0xfe4ef8d8,0xbfc90fdb,3
+np.float32,0x805e7d2d,0x805e7d2d,3
+np.float32,0xbe4316b0,0xbe40c745,3
+np.float32,0xbf0a1c06,0xbefd4e5a,3
+np.float32,0x3e202860,0x3e1edee1,3
+np.float32,0xbeb32a2c,0xbeac5899,3
+np.float32,0xfe528838,0xbfc90fdb,3
+np.float32,0x2f73e2,0x2f73e2,3
+np.float32,0xbe16e010,0xbe15cc27,3
+np.float32,0x3f50d6c5,0x3f2f2d75,3
+np.float32,0xbe88a6a2,0xbe8589c7,3
+np.float32,0x3ee36060,0x3ed5fb36,3
+np.float32,0x6c978b,0x6c978b,3
+np.float32,0x7f1b735f,0x3fc90fdb,3
+np.float32,0x3dad8256,0x3dad1885,3
+np.float32,0x807f5094,0x807f5094,3
+np.float32,0x65c358,0x65c358,3
+np.float32,0xff315ce4,0xbfc90fdb,3
+np.float32,0x7411a6,0x7411a6,3
+np.float32,0x80757b04,0x80757b04,3
+np.float32,0x3eec73a6,0x3edd82f4,3
+np.float32,0xfe9f69e8,0xbfc90fdb,3
+np.float32,0x801f4fa8,0x801f4fa8,3
+np.float32,0xbf6f2fae,0xbf405f79,3
+np.float32,0xfea206b6,0xbfc90fdb,3
+np.float32,0x3f257301,0x3f12e1ee,3
+np.float32,0x7ea6a506,0x3fc90fdb,3
+np.float32,0x80800000,0x80800000,3
+np.float32,0xff735c2d,0xbfc90fdb,3
+np.float32,0x80197f95,0x80197f95,3
+np.float32,0x7f4a354f,0x3fc90fdb,3
+np.float32,0xff320c00,0xbfc90fdb,3
+np.float32,0x3f2659de,0x3f138484,3
+np.float32,0xbe5451bc,0xbe515a52,3
+np.float32,0x3f6e228c,0x3f3fcf7c,3
+np.float32,0x66855a,0x66855a,3
+np.float32,0x8034b3a3,0x8034b3a3,3
+np.float32,0xbe21a2fc,0xbe20505d,3
+np.float32,0x7f79e2dc,0x3fc90fdb,3
+np.float32,0xbe19a8e0,0xbe18858c,3
+np.float32,0x10802c,0x10802c,3
+np.float32,0xfeee579e,0xbfc90fdb,3
+np.float32,0x3f3292c8,0x3f1becc0,3
+np.float32,0xbf595a71,0xbf34350a,3
+np.float32,0xbf7c3373,0xbf4725f4,3
+np.float32,0xbdd30938,0xbdd24b36,3
+np.float32,0x153a17,0x153a17,3
+np.float32,0x807282a0,0x807282a0,3
+np.float32,0xfe817322,0xbfc90fdb,3
+np.float32,0x3f1b3628,0x3f0b8771,3
+np.float32,0x41be8f,0x41be8f,3
+np.float32,0x7f4a8343,0x3fc90fdb,3
+np.float32,0x3dc4ea2b,0x3dc44fae,3
+np.float32,0x802aac25,0x802aac25,3
+np.float32,0xbf20e1d7,0xbf0fa284,3
+np.float32,0xfd91a1b0,0xbfc90fdb,3
+np.float32,0x3f0d5476,0x3f012265,3
+np.float32,0x21c916,0x21c916,3
+np.float32,0x807df399,0x807df399,3
+np.float32,0x7e207b4c,0x3fc90fdb,3
+np.float32,0x8055f8ff,0x8055f8ff,3
+np.float32,0x7edf3b01,0x3fc90fdb,3
+np.float32,0x803a8df3,0x803a8df3,3
+np.float32,0x3ce3b002,0x3ce3a101,3
+np.float32,0x3f62dd54,0x3f39a248,3
+np.float32,0xff33ae10,0xbfc90fdb,3
+np.float32,0x7e3de69d,0x3fc90fdb,3
+np.float32,0x8024581e,0x8024581e,3
+np.float32,0xbf4ac99d,0xbf2b807a,3
+np.float32,0x3f157d19,0x3f074d8c,3
+np.float32,0xfed383f4,0xbfc90fdb,3
+np.float32,0xbf5a39fa,0xbf34b6b8,3
+np.float32,0x800d757d,0x800d757d,3
+np.float32,0x807d606b,0x807d606b,3
+np.float32,0x3e828f89,0x3e7fac2d,3
+np.float32,0x7a6604,0x7a6604,3
+np.float32,0x7dc7e72b,0x3fc90fdb,3
+np.float32,0x80144146,0x80144146,3
+np.float32,0x7c2eed69,0x3fc90fdb,3
+np.float32,0x3f5b4d8c,0x3f3555fc,3
+np.float32,0xfd8b7778,0xbfc90fdb,3
+np.float32,0xfc9d9140,0xbfc90fdb,3
+np.float32,0xbea265d4,0xbe9d4232,3
+np.float32,0xbe9344d0,0xbe8f65da,3
+np.float32,0x3f71f19a,0x3f41d65b,3
+np.float32,0x804a3f59,0x804a3f59,3
+np.float32,0x3e596290,0x3e563476,3
+np.float32,0x3e994ee4,0x3e94f546,3
+np.float32,0xbc103e00,0xbc103d0c,3
+np.float32,0xbf1cd896,0xbf0cb889,3
+np.float32,0x7f52b080,0x3fc90fdb,3
+np.float32,0xff584452,0xbfc90fdb,3
+np.float32,0x58b26b,0x58b26b,3
+np.float32,0x3f23cd4c,0x3f11b799,3
+np.float32,0x707d7,0x707d7,3
+np.float32,0xff732cff,0xbfc90fdb,3
+np.float32,0x3e41c2a6,0x3e3f7f0f,3
+np.float32,0xbf7058e9,0xbf40fdcf,3
+np.float32,0x7dca9857,0x3fc90fdb,3
+np.float32,0x7f0eb44b,0x3fc90fdb,3
+np.float32,0x8000405c,0x8000405c,3
+np.float32,0x4916ab,0x4916ab,3
+np.float32,0x4811a8,0x4811a8,3
+np.float32,0x3d69bf,0x3d69bf,3
+np.float32,0xfeadcf1e,0xbfc90fdb,3
+np.float32,0x3e08dbbf,0x3e080d58,3
+np.float32,0xff031f88,0xbfc90fdb,3
+np.float32,0xbe09cab8,0xbe08f818,3
+np.float32,0x21d7cd,0x21d7cd,3
+np.float32,0x3f23230d,0x3f113ea9,3
+np.float32,0x7e8a48d4,0x3fc90fdb,3
+np.float32,0x413869,0x413869,3
+np.float32,0x7e832990,0x3fc90fdb,3
+np.float32,0x800f5c09,0x800f5c09,3
+np.float32,0x7f5893b6,0x3fc90fdb,3
+np.float32,0x7f06b5b1,0x3fc90fdb,3
+np.float32,0xbe1cbee8,0xbe1b89d6,3
+np.float32,0xbf279f14,0xbf1468a8,3
+np.float32,0xfea86060,0xbfc90fdb,3
+np.float32,0x3e828174,0x3e7f91bb,3
+np.float32,0xff682c82,0xbfc90fdb,3
+np.float32,0x4e20f3,0x4e20f3,3
+np.float32,0x7f17d7e9,0x3fc90fdb,3
+np.float32,0x80671f92,0x80671f92,3
+np.float32,0x7f6dd100,0x3fc90fdb,3
+np.float32,0x3f219a4d,0x3f102695,3
+np.float32,0x803c9808,0x803c9808,3
+np.float32,0x3c432ada,0x3c43287d,3
+np.float32,0xbd3db450,0xbd3d91a2,3
+np.float32,0x3baac135,0x3baac0d0,3
+np.float32,0xff7fffe1,0xbfc90fdb,3
+np.float32,0xfe38a6f4,0xbfc90fdb,3
+np.float32,0x3dfb0a04,0x3df9cb04,3
+np.float32,0x800b05c2,0x800b05c2,3
+np.float32,0x644163,0x644163,3
+np.float32,0xff03a025,0xbfc90fdb,3
+np.float32,0x3f7d506c,0x3f47b641,3
+np.float32,0xff0e682a,0xbfc90fdb,3
+np.float32,0x3e09b7b0,0x3e08e567,3
+np.float32,0x7f72a216,0x3fc90fdb,3
+np.float32,0x7f800000,0x3fc90fdb,3
+np.float32,0x8050a281,0x8050a281,3
+np.float32,0x7edafa2f,0x3fc90fdb,3
+np.float32,0x3f4e0df6,0x3f2d7f2f,3
+np.float32,0xbf6728e0,0xbf3c050f,3
+np.float32,0x3e904ce4,0x3e8ca6eb,3
+np.float32,0x0,0x0,3
+np.float32,0xfd215070,0xbfc90fdb,3
+np.float32,0x7e406b15,0x3fc90fdb,3
+np.float32,0xbf2803c9,0xbf14af18,3
+np.float32,0x5950c8,0x5950c8,3
+np.float32,0xbeddcec8,0xbed14faa,3
+np.float32,0xbec6457e,0xbebd2aa5,3
+np.float32,0xbf42843c,0xbf2656db,3
+np.float32,0x3ee9cba8,0x3edb5163,3
+np.float32,0xbe30c954,0xbe2f0f90,3
+np.float32,0xbeee6b44,0xbedf216f,3
+np.float32,0xbe35d818,0xbe33f7cd,3
+np.float32,0xbe47c630,0xbe454bc6,3
+np.float32,0x801b146f,0x801b146f,3
+np.float32,0x7f6788da,0x3fc90fdb,3
+np.float32,0x3eaef088,0x3ea8927d,3
+np.float32,0x3eb5983e,0x3eae81fc,3
+np.float32,0x40b51d,0x40b51d,3
+np.float32,0xfebddd04,0xbfc90fdb,3
+np.float32,0x3e591aee,0x3e55efea,3
+np.float32,0xbe2b6b48,0xbe29d81f,3
+np.float32,0xff4a8826,0xbfc90fdb,3
+np.float32,0x3e791df0,0x3e745eac,3
+np.float32,0x7c8f681f,0x3fc90fdb,3
+np.float32,0xfe7a15c4,0xbfc90fdb,3
+np.float32,0x3c8963,0x3c8963,3
+np.float32,0x3f0afa0a,0x3efea5cc,3
+np.float32,0xbf0d2680,0xbf00ff29,3
+np.float32,0x3dc306b0,0x3dc27096,3
+np.float32,0x7f4cf105,0x3fc90fdb,3
+np.float32,0xbe196060,0xbe183ea4,3
+np.float32,0x5caf1c,0x5caf1c,3
+np.float32,0x801f2852,0x801f2852,3
+np.float32,0xbe01aa0c,0xbe00fa53,3
+np.float32,0x3f0cfd32,0x3f00df7a,3
+np.float32,0x7d82038e,0x3fc90fdb,3
+np.float32,0x7f7b927f,0x3fc90fdb,3
+np.float32,0xbe93b2e4,0xbe8fcb7f,3
+np.float32,0x1ffe8c,0x1ffe8c,3
+np.float32,0x3faaf6,0x3faaf6,3
+np.float32,0x3e32b1b8,0x3e30e9ab,3
+np.float32,0x802953c0,0x802953c0,3
+np.float32,0xfe5d9844,0xbfc90fdb,3
+np.float32,0x3e1a59d0,0x3e193292,3
+np.float32,0x801c6edc,0x801c6edc,3
+np.float32,0x1ecf41,0x1ecf41,3
+np.float32,0xfe56b09c,0xbfc90fdb,3
+np.float32,0x7e878351,0x3fc90fdb,3
+np.float32,0x3f401e2c,0x3f24cfcb,3
+np.float32,0xbf204a40,0xbf0f35bb,3
+np.float32,0x3e155a98,0x3e144ee1,3
+np.float32,0xbf34f929,0xbf1d8838,3
+np.float32,0x801bbf70,0x801bbf70,3
+np.float32,0x7e7c9730,0x3fc90fdb,3
+np.float32,0x7cc23432,0x3fc90fdb,3
+np.float32,0xbf351638,0xbf1d9b97,3
+np.float32,0x80152094,0x80152094,3
+np.float32,0x3f2d731c,0x3f187219,3
+np.float32,0x804ab0b7,0x804ab0b7,3
+np.float32,0x37d6db,0x37d6db,3
+np.float32,0xbf3ccc56,0xbf22acbf,3
+np.float32,0x3e546f8c,0x3e5176e7,3
+np.float32,0xbe90e87e,0xbe8d3707,3
+np.float32,0x48256c,0x48256c,3
+np.float32,0x7e2468d0,0x3fc90fdb,3
+np.float32,0x807af47e,0x807af47e,3
+np.float32,0x3ed4b221,0x3ec996f0,3
+np.float32,0x3d3b1956,0x3d3af811,3
+np.float32,0xbe69d93c,0xbe65e7f0,3
+np.float32,0xff03ff14,0xbfc90fdb,3
+np.float32,0x801e79dc,0x801e79dc,3
+np.float32,0x3f467c53,0x3f28d63d,3
+np.float32,0x3eab6baa,0x3ea56a1c,3
+np.float32,0xbf15519c,0xbf072d1c,3
+np.float32,0x7f0bd8e8,0x3fc90fdb,3
+np.float32,0xbe1e0d1c,0xbe1cd053,3
+np.float32,0x8016edab,0x8016edab,3
+np.float32,0x7ecaa09b,0x3fc90fdb,3
+np.float32,0x3f72e6d9,0x3f4257a8,3
+np.float32,0xbefe787e,0xbeec29a4,3
+np.float32,0xbee989e8,0xbedb1af9,3
+np.float32,0xbe662db0,0xbe626a45,3
+np.float32,0x495bf7,0x495bf7,3
+np.float32,0x26c379,0x26c379,3
+np.float32,0x7f54d41a,0x3fc90fdb,3
+np.float32,0x801e7dd9,0x801e7dd9,3
+np.float32,0x80000000,0x80000000,3
+np.float32,0xfa3d3000,0xbfc90fdb,3
+np.float32,0xfa3cb800,0xbfc90fdb,3
+np.float32,0x264894,0x264894,3
+np.float32,0xff6de011,0xbfc90fdb,3
+np.float32,0x7e9045b2,0x3fc90fdb,3
+np.float32,0x3f2253a8,0x3f10aaf4,3
+np.float32,0xbd462bf0,0xbd460469,3
+np.float32,0x7f1796af,0x3fc90fdb,3
+np.float32,0x3e718858,0x3e6d3279,3
+np.float32,0xff437d7e,0xbfc90fdb,3
+np.float32,0x805ae7cb,0x805ae7cb,3
+np.float32,0x807e32e9,0x807e32e9,3
+np.float32,0x3ee0bafc,0x3ed3c453,3
+np.float32,0xbf721dee,0xbf41edc3,3
+np.float32,0xfec9f792,0xbfc90fdb,3
+np.float32,0x7f050720,0x3fc90fdb,3
+np.float32,0x182261,0x182261,3
+np.float32,0x3e39e678,0x3e37e5be,3
+np.float32,0x7e096e4b,0x3fc90fdb,3
+np.float32,0x103715,0x103715,3
+np.float32,0x3f7e7741,0x3f484ae4,3
+np.float32,0x3e29aea5,0x3e28277c,3
+np.float32,0x58c183,0x58c183,3
+np.float32,0xff72fdb2,0xbfc90fdb,3
+np.float32,0xbd9a9420,0xbd9a493c,3
+np.float32,0x7f1e07e7,0x3fc90fdb,3
+np.float32,0xff79f522,0xbfc90fdb,3
+np.float32,0x7c7d0e96,0x3fc90fdb,3
+np.float32,0xbeba9e8e,0xbeb2f504,3
+np.float32,0xfd880a80,0xbfc90fdb,3
+np.float32,0xff7f2a33,0xbfc90fdb,3
+np.float32,0x3e861ae0,0x3e83289c,3
+np.float32,0x7f0161c1,0x3fc90fdb,3
+np.float32,0xfe844ff8,0xbfc90fdb,3
+np.float32,0xbebf4b98,0xbeb7128e,3
+np.float32,0x652bee,0x652bee,3
+np.float32,0xff188a4b,0xbfc90fdb,3
+np.float32,0xbf800000,0xbf490fdb,3
+np.float32,0x80418711,0x80418711,3
+np.float32,0xbeb712d4,0xbeafd1f6,3
+np.float32,0xbf7cee28,0xbf478491,3
+np.float32,0xfe66c59c,0xbfc90fdb,3
+np.float32,0x4166a2,0x4166a2,3
+np.float32,0x3dfa1a2c,0x3df8deb5,3
+np.float32,0xbdbfbcb8,0xbdbf2e0f,3
+np.float32,0xfe60ef70,0xbfc90fdb,3
+np.float32,0xfe009444,0xbfc90fdb,3
+np.float32,0xfeb27aa0,0xbfc90fdb,3
+np.float32,0xbe99f7bc,0xbe95902b,3
+np.float32,0x8043d28d,0x8043d28d,3
+np.float32,0xfe5328c4,0xbfc90fdb,3
+np.float32,0x8017b27e,0x8017b27e,3
+np.float32,0x3ef1d2cf,0x3ee1ebd7,3
+np.float32,0x805ddd90,0x805ddd90,3
+np.float32,0xbf424263,0xbf262d17,3
+np.float32,0xfc99dde0,0xbfc90fdb,3
+np.float32,0xbf7ec13b,0xbf487015,3
+np.float32,0xbef727ea,0xbee64377,3
+np.float32,0xff15ce95,0xbfc90fdb,3
+np.float32,0x1fbba4,0x1fbba4,3
+np.float32,0x3f3b2368,0x3f2198a9,3
+np.float32,0xfefda26e,0xbfc90fdb,3
+np.float32,0x801519ad,0x801519ad,3
+np.float32,0x80473fa2,0x80473fa2,3
+np.float32,0x7e7a8bc1,0x3fc90fdb,3
+np.float32,0x3e8a9289,0x3e87548a,3
+np.float32,0x3ed68987,0x3ecb2872,3
+np.float32,0x805bca66,0x805bca66,3
+np.float32,0x8079c4e3,0x8079c4e3,3
+np.float32,0x3a2510,0x3a2510,3
+np.float32,0x7eedc598,0x3fc90fdb,3
+np.float32,0x80681956,0x80681956,3
+np.float32,0xff64c778,0xbfc90fdb,3
+np.float32,0x806bbc46,0x806bbc46,3
+np.float32,0x433643,0x433643,3
+np.float32,0x705b92,0x705b92,3
+np.float32,0xff359392,0xbfc90fdb,3
+np.float32,0xbee78672,0xbed96fa7,3
+np.float32,0x3e21717b,0x3e202010,3
+np.float32,0xfea13c34,0xbfc90fdb,3
+np.float32,0x2c8895,0x2c8895,3
+np.float32,0x3ed33290,0x3ec84f7c,3
+np.float32,0x3e63031e,0x3e5f662e,3
+np.float32,0x7e30907b,0x3fc90fdb,3
+np.float32,0xbe293708,0xbe27b310,3
+np.float32,0x3ed93738,0x3ecd6ea3,3
+np.float32,0x9db7e,0x9db7e,3
+np.float32,0x3f7cd1b8,0x3f47762c,3
+np.float32,0x3eb5143c,0x3eae0cb0,3
+np.float32,0xbe69b234,0xbe65c2d7,3
+np.float32,0x3f6e74de,0x3f3ffb97,3
+np.float32,0x5d0559,0x5d0559,3
+np.float32,0x3e1e8c30,0x3e1d4c70,3
+np.float32,0xbf2d1878,0xbf1833ef,3
+np.float32,0xff2adf82,0xbfc90fdb,3
+np.float32,0x8012e2c1,0x8012e2c1,3
+np.float32,0x7f031be3,0x3fc90fdb,3
+np.float32,0x805ff94e,0x805ff94e,3
+np.float32,0x3e9d5b27,0x3e98aa31,3
+np.float32,0x3f56d5cf,0x3f32bc9e,3
+np.float32,0x3eaa0412,0x3ea4267f,3
+np.float32,0xbe899ea4,0xbe86712f,3
+np.float32,0x800f2f48,0x800f2f48,3
+np.float32,0x3f1c2269,0x3f0c33ea,3
+np.float32,0x3f4a5f64,0x3f2b3f28,3
+np.float32,0x80739318,0x80739318,3
+np.float32,0x806e9b47,0x806e9b47,3
+np.float32,0x3c8cd300,0x3c8ccf73,3
+np.float32,0x7f39a39d,0x3fc90fdb,3
+np.float32,0x3ec95d61,0x3ebfd9dc,3
+np.float32,0xff351ff8,0xbfc90fdb,3
+np.float32,0xff3a8f58,0xbfc90fdb,3
+np.float32,0x7f313ec0,0x3fc90fdb,3
+np.float32,0x803aed13,0x803aed13,3
+np.float32,0x7f771d9b,0x3fc90fdb,3
+np.float32,0x8045a6d6,0x8045a6d6,3
+np.float32,0xbc85f280,0xbc85ef72,3
+np.float32,0x7e9c68f5,0x3fc90fdb,3
+np.float32,0xbf0f9379,0xbf02d975,3
+np.float32,0x7e97bcb1,0x3fc90fdb,3
+np.float32,0x804a07d5,0x804a07d5,3
+np.float32,0x802e6117,0x802e6117,3
+np.float32,0x7ed5e388,0x3fc90fdb,3
+np.float32,0x80750455,0x80750455,3
+np.float32,0xff4a8325,0xbfc90fdb,3
+np.float32,0xbedb6866,0xbecf497c,3
+np.float32,0x52ea3b,0x52ea3b,3
+np.float32,0xff773172,0xbfc90fdb,3
+np.float32,0xbeaa8ff0,0xbea4a46e,3
+np.float32,0x7eef2058,0x3fc90fdb,3
+np.float32,0x3f712472,0x3f4169d3,3
+np.float32,0xff6c8608,0xbfc90fdb,3
+np.float32,0xbf6eaa41,0xbf40182a,3
+np.float32,0x3eb03c24,0x3ea9bb34,3
+np.float32,0xfe118cd4,0xbfc90fdb,3
+np.float32,0x3e5b03b0,0x3e57c378,3
+np.float32,0x7f34d92d,0x3fc90fdb,3
+np.float32,0x806c3418,0x806c3418,3
+np.float32,0x7f3074e3,0x3fc90fdb,3
+np.float32,0x8002df02,0x8002df02,3
+np.float32,0x3f6df63a,0x3f3fb7b7,3
+np.float32,0xfd2b4100,0xbfc90fdb,3
+np.float32,0x80363d5c,0x80363d5c,3
+np.float32,0xbeac1f98,0xbea60bd6,3
+np.float32,0xff7fffff,0xbfc90fdb,3
+np.float32,0x80045097,0x80045097,3
+np.float32,0xfe011100,0xbfc90fdb,3
+np.float32,0x80739ef5,0x80739ef5,3
+np.float32,0xff3976ed,0xbfc90fdb,3
+np.float32,0xbe18e3a0,0xbe17c49e,3
+np.float32,0xbe289294,0xbe2712f6,3
+np.float32,0x3f1d41e7,0x3f0d050e,3
+np.float32,0x39364a,0x39364a,3
+np.float32,0x8072b77e,0x8072b77e,3
+np.float32,0x3f7cfec0,0x3f478cf6,3
+np.float32,0x2f68f6,0x2f68f6,3
+np.float32,0xbf031fb8,0xbef25c84,3
+np.float32,0xbf0b842c,0xbeff7afc,3
+np.float32,0x3f081e7e,0x3efa3676,3
+np.float32,0x7f7fffff,0x3fc90fdb,3
+np.float32,0xff15da0e,0xbfc90fdb,3
+np.float32,0x3d2001b2,0x3d1fece1,3
+np.float32,0x7f76efef,0x3fc90fdb,3
+np.float32,0x3f2405dd,0x3f11dfb7,3
+np.float32,0xa0319,0xa0319,3
+np.float32,0x3e23d2bd,0x3e227255,3
+np.float32,0xbd4d4c50,0xbd4d205e,3
+np.float32,0x382344,0x382344,3
+np.float32,0x21bbf,0x21bbf,3
+np.float32,0xbf209e82,0xbf0f7239,3
+np.float32,0xff03bf9f,0xbfc90fdb,3
+np.float32,0x7b1789,0x7b1789,3
+np.float32,0xff314944,0xbfc90fdb,3
+np.float32,0x1a63eb,0x1a63eb,3
+np.float32,0x803dc983,0x803dc983,3
+np.float32,0x3f0ff558,0x3f0323dc,3
+np.float32,0x3f544f2c,0x3f313f58,3
+np.float32,0xff032948,0xbfc90fdb,3
+np.float32,0x7f4933cc,0x3fc90fdb,3
+np.float32,0x7f14c5ed,0x3fc90fdb,3
+np.float32,0x803aeebf,0x803aeebf,3
+np.float32,0xbf0d4c0f,0xbf011bf5,3
+np.float32,0xbeaf8de2,0xbea91f57,3
+np.float32,0xff3ae030,0xbfc90fdb,3
+np.float32,0xbb362d00,0xbb362ce1,3
+np.float32,0x3d1f79e0,0x3d1f6544,3
+np.float32,0x3f56e9d9,0x3f32c860,3
+np.float32,0x3f723e5e,0x3f41fee2,3
+np.float32,0x4c0179,0x4c0179,3
+np.float32,0xfee36132,0xbfc90fdb,3
+np.float32,0x619ae6,0x619ae6,3
+np.float32,0xfde5d670,0xbfc90fdb,3
+np.float32,0xff079ac5,0xbfc90fdb,3
+np.float32,0x3e974fbd,0x3e931fae,3
+np.float32,0x8020ae6b,0x8020ae6b,3
+np.float32,0x6b5af1,0x6b5af1,3
+np.float32,0xbeb57cd6,0xbeae69a3,3
+np.float32,0x806e7eb2,0x806e7eb2,3
+np.float32,0x7e666edb,0x3fc90fdb,3
+np.float32,0xbf458c18,0xbf283ff0,3
+np.float32,0x3e50518e,0x3e4d8399,3
+np.float32,0x3e9ce224,0x3e983b98,3
+np.float32,0x3e6bc067,0x3e67b6c6,3
+np.float32,0x13783d,0x13783d,3
+np.float32,0xff3d518c,0xbfc90fdb,3
+np.float32,0xfeba5968,0xbfc90fdb,3
+np.float32,0xbf0b9f76,0xbeffa50f,3
+np.float32,0xfe174900,0xbfc90fdb,3
+np.float32,0x3f38bb0a,0x3f200527,3
+np.float32,0x7e94a77d,0x3fc90fdb,3
+np.float32,0x29d776,0x29d776,3
+np.float32,0xbf4e058d,0xbf2d7a15,3
+np.float32,0xbd94abc8,0xbd946923,3
+np.float32,0xbee62db0,0xbed85124,3
+np.float32,0x800000,0x800000,3
+np.float32,0xbef1df7e,0xbee1f636,3
+np.float32,0xbcf3cd20,0xbcf3bab5,3
+np.float32,0x80007b05,0x80007b05,3
+np.float32,0x3d9b3f2e,0x3d9af351,3
+np.float32,0xbf714a68,0xbf417dee,3
+np.float32,0xbf2a2d37,0xbf163069,3
+np.float32,0x8055104f,0x8055104f,3
+np.float32,0x7f5c40d7,0x3fc90fdb,3
+np.float32,0x1,0x1,3
+np.float32,0xff35f3a6,0xbfc90fdb,3
+np.float32,0xd9c7c,0xd9c7c,3
+np.float32,0xbf440cfc,0xbf274f22,3
+np.float32,0x8050ac43,0x8050ac43,3
+np.float32,0x63ee16,0x63ee16,3
+np.float32,0x7d90419b,0x3fc90fdb,3
+np.float32,0xfee22198,0xbfc90fdb,3
+np.float32,0xc2ead,0xc2ead,3
+np.float32,0x7f5cd6a6,0x3fc90fdb,3
+np.float32,0x3f6fab7e,0x3f40a184,3
+np.float32,0x3ecf998c,0x3ec53a73,3
+np.float32,0x7e5271f0,0x3fc90fdb,3
+np.float32,0x67c016,0x67c016,3
+np.float32,0x2189c8,0x2189c8,3
+np.float32,0x27d892,0x27d892,3
+np.float32,0x3f0d02c4,0x3f00e3c0,3
+np.float32,0xbf69ebca,0xbf3d8862,3
+np.float32,0x3e60c0d6,0x3e5d3ebb,3
+np.float32,0x3f45206c,0x3f27fc66,3
+np.float32,0xbf6b47dc,0xbf3e4592,3
+np.float32,0xfe9be2e2,0xbfc90fdb,3
+np.float32,0x7fa00000,0x7fe00000,3
+np.float32,0xff271562,0xbfc90fdb,3
+np.float32,0x3e2e5270,0x3e2caaaf,3
+np.float32,0x80222934,0x80222934,3
+np.float32,0xbd01d220,0xbd01c701,3
+np.float32,0x223aa0,0x223aa0,3
+np.float32,0x3f4b5a7e,0x3f2bd967,3
+np.float32,0x3f217d85,0x3f101200,3
+np.float32,0xbf57663a,0xbf331144,3
+np.float32,0x3f219862,0x3f102536,3
+np.float32,0x28a28c,0x28a28c,3
+np.float32,0xbf3f55f4,0xbf244f86,3
+np.float32,0xbf3de287,0xbf236092,3
+np.float32,0xbf1c1ce2,0xbf0c2fe3,3
+np.float32,0x80000001,0x80000001,3
+np.float32,0x3db695d0,0x3db61a90,3
+np.float32,0x6c39bf,0x6c39bf,3
+np.float32,0x7e33a12f,0x3fc90fdb,3
+np.float32,0x67623a,0x67623a,3
+np.float32,0x3e45dc54,0x3e4373b6,3
+np.float32,0x7f62fa68,0x3fc90fdb,3
+np.float32,0x3f0e1d01,0x3f01bbe5,3
+np.float32,0x3f13dc69,0x3f0615f5,3
+np.float32,0x246703,0x246703,3
+np.float32,0xbf1055b5,0xbf036d07,3
+np.float32,0x7f46d3d0,0x3fc90fdb,3
+np.float32,0x3d2b8086,0x3d2b66e5,3
+np.float32,0xbf03be44,0xbef35776,3
+np.float32,0x3f800000,0x3f490fdb,3
+np.float32,0xbec8d226,0xbebf613d,3
+np.float32,0x3d8faf00,0x3d8f72d4,3
+np.float32,0x170c4e,0x170c4e,3
+np.float32,0xff14c0f0,0xbfc90fdb,3
+np.float32,0xff16245d,0xbfc90fdb,3
+np.float32,0x7f44ce6d,0x3fc90fdb,3
+np.float32,0xbe8175d8,0xbe7d9aeb,3
+np.float32,0x3df7a4a1,0x3df67254,3
+np.float32,0xfe2cc46c,0xbfc90fdb,3
+np.float32,0x3f284e63,0x3f14e335,3
+np.float32,0x7e46e5d6,0x3fc90fdb,3
+np.float32,0x397be4,0x397be4,3
+np.float32,0xbf2560bc,0xbf12d50b,3
+np.float32,0x3ed9b8c1,0x3ecddc60,3
+np.float32,0xfec18c5a,0xbfc90fdb,3
+np.float32,0x64894d,0x64894d,3
+np.float32,0x36a65d,0x36a65d,3
+np.float32,0x804ffcd7,0x804ffcd7,3
+np.float32,0x800f79e4,0x800f79e4,3
+np.float32,0x5d45ac,0x5d45ac,3
+np.float32,0x6cdda0,0x6cdda0,3
+np.float32,0xbf7f2077,0xbf489fe5,3
+np.float32,0xbf152f78,0xbf0713a1,3
+np.float32,0x807bf344,0x807bf344,3
+np.float32,0x3f775023,0x3f44a4d8,3
+np.float32,0xbf3edf67,0xbf240365,3
+np.float32,0x7eed729c,0x3fc90fdb,3
+np.float32,0x14cc29,0x14cc29,3
+np.float32,0x7edd7b6b,0x3fc90fdb,3
+np.float32,0xbf3c6e2c,0xbf226fb7,3
+np.float32,0x51b9ad,0x51b9ad,3
+np.float32,0x3f617ee8,0x3f38dd7c,3
+np.float32,0xff800000,0xbfc90fdb,3
+np.float32,0x7f440ea0,0x3fc90fdb,3
+np.float32,0x3e639893,0x3e5ff49e,3
+np.float32,0xbd791bb0,0xbd78cd3c,3
+np.float32,0x8059fcbc,0x8059fcbc,3
+np.float32,0xbf7d1214,0xbf4796bd,3
+np.float32,0x3ef368fa,0x3ee33788,3
+np.float32,0xbecec0f4,0xbec48055,3
+np.float32,0xbc83d940,0xbc83d656,3
+np.float32,0xbce01220,0xbce003d4,3
+np.float32,0x803192a5,0x803192a5,3
+np.float32,0xbe40e0c0,0xbe3ea4f0,3
+np.float32,0xfb692600,0xbfc90fdb,3
+np.float32,0x3f1bec65,0x3f0c0c88,3
+np.float32,0x7f042798,0x3fc90fdb,3
+np.float32,0xbe047374,0xbe03b83b,3
+np.float32,0x7f7c6630,0x3fc90fdb,3
+np.float32,0x7f58dae3,0x3fc90fdb,3
+np.float32,0x80691c92,0x80691c92,3
+np.float32,0x7dbe76,0x7dbe76,3
+np.float32,0xbf231384,0xbf11339d,3
+np.float32,0xbef4acf8,0xbee43f8b,3
+np.float32,0x3ee9f9d0,0x3edb7793,3
+np.float32,0x3f0064f6,0x3eee04a8,3
+np.float32,0x313732,0x313732,3
+np.float32,0xfd58cf80,0xbfc90fdb,3
+np.float32,0x3f7a2bc9,0x3f461d30,3
+np.float32,0x7f7681af,0x3fc90fdb,3
+np.float32,0x7f504211,0x3fc90fdb,3
+np.float32,0xfeae0c00,0xbfc90fdb,3
+np.float32,0xbee14396,0xbed436d1,3
+np.float32,0x7fc00000,0x7fc00000,3
+np.float32,0x693406,0x693406,3
+np.float32,0x3eb4a679,0x3eadab1b,3
+np.float32,0x550505,0x550505,3
+np.float32,0xfd493d10,0xbfc90fdb,3
+np.float32,0x3f4fc907,0x3f2e8b2c,3
+np.float32,0x80799aa4,0x80799aa4,3
+np.float32,0xff1ea89b,0xbfc90fdb,3
+np.float32,0xff424510,0xbfc90fdb,3
+np.float32,0x7f68d026,0x3fc90fdb,3
+np.float32,0xbea230ca,0xbe9d1200,3
+np.float32,0x7ea585da,0x3fc90fdb,3
+np.float32,0x3f3db211,0x3f23414c,3
+np.float32,0xfea4d964,0xbfc90fdb,3
+np.float32,0xbf17fe18,0xbf092984,3
+np.float32,0x7cc8a2,0x7cc8a2,3
+np.float32,0xff0330ba,0xbfc90fdb,3
+np.float32,0x3f769835,0x3f444592,3
+np.float32,0xeb0ac,0xeb0ac,3
+np.float32,0x7f7e45de,0x3fc90fdb,3
+np.float32,0xbdb510a8,0xbdb49873,3
+np.float32,0x3ebf900b,0x3eb74e9c,3
+np.float32,0xbf21bbce,0xbf103e89,3
+np.float32,0xbf3f4682,0xbf24459d,3
+np.float32,0x7eb6e9c8,0x3fc90fdb,3
+np.float32,0xbf42532d,0xbf2637be,3
+np.float32,0xbd3b2600,0xbd3b04b4,3
+np.float32,0x3f1fa9aa,0x3f0ec23e,3
+np.float32,0x7ed6a0f1,0x3fc90fdb,3
+np.float32,0xff4759a1,0xbfc90fdb,3
+np.float32,0x6d26e3,0x6d26e3,3
+np.float32,0xfe1108e0,0xbfc90fdb,3
+np.float32,0xfdf76900,0xbfc90fdb,3
+np.float32,0xfec66f22,0xbfc90fdb,3
+np.float32,0xbf3d097f,0xbf22d458,3
+np.float32,0x3d85be25,0x3d858d99,3
+np.float32,0x7f36739f,0x3fc90fdb,3
+np.float32,0x7bc0a304,0x3fc90fdb,3
+np.float32,0xff48dd90,0xbfc90fdb,3
+np.float32,0x48cab0,0x48cab0,3
+np.float32,0x3ed3943c,0x3ec8a2ef,3
+np.float32,0xbf61488e,0xbf38bede,3
+np.float32,0x3f543df5,0x3f313525,3
+np.float32,0x5cf2ca,0x5cf2ca,3
+np.float32,0x572686,0x572686,3
+np.float32,0x80369c7c,0x80369c7c,3
+np.float32,0xbd2c1d20,0xbd2c0338,3
+np.float32,0x3e255428,0x3e23ea0b,3
+np.float32,0xbeba9ee0,0xbeb2f54c,3
+np.float32,0x8015c165,0x8015c165,3
+np.float32,0x3d31f488,0x3d31d7e6,3
+np.float32,0x3f68591c,0x3f3cac43,3
+np.float32,0xf5ed5,0xf5ed5,3
+np.float32,0xbf3b1d34,0xbf21949e,3
+np.float32,0x1f0343,0x1f0343,3
+np.float32,0x3f0e52b5,0x3f01e4ef,3
+np.float32,0x7f57c596,0x3fc90fdb,3
+np.float64,0x7fd8e333ddb1c667,0x3ff921fb54442d18,3
+np.float64,0x800bcc9cdad7993a,0x800bcc9cdad7993a,3
+np.float64,0x3fcd6f81df3adf00,0x3fcceebbafc5d55e,3
+np.float64,0x3fed7338a57ae671,0x3fe7ce3e5811fc0a,3
+np.float64,0x7fe64994fcac9329,0x3ff921fb54442d18,3
+np.float64,0xfa5a6345f4b4d,0xfa5a6345f4b4d,3
+np.float64,0xe9dcd865d3b9b,0xe9dcd865d3b9b,3
+np.float64,0x7fea6cffabf4d9fe,0x3ff921fb54442d18,3
+np.float64,0xa9e1de6153c3c,0xa9e1de6153c3c,3
+np.float64,0xab6bdc5356d7c,0xab6bdc5356d7c,3
+np.float64,0x80062864a02c50ca,0x80062864a02c50ca,3
+np.float64,0xbfdac03aa7b58076,0xbfd9569f3230128d,3
+np.float64,0xbfe61b77752c36ef,0xbfe3588f51b8be8f,3
+np.float64,0x800bc854c8d790aa,0x800bc854c8d790aa,3
+np.float64,0x3feed1a2da3da346,0x3fe887f9b8ea031f,3
+np.float64,0x3fe910d3697221a7,0x3fe54365a53d840e,3
+np.float64,0x7fe7ab4944ef5692,0x3ff921fb54442d18,3
+np.float64,0x3fa462f1a028c5e3,0x3fa460303a6a4e69,3
+np.float64,0x800794f1a3af29e4,0x800794f1a3af29e4,3
+np.float64,0x3fee6fe7fafcdfd0,0x3fe854f863816d55,3
+np.float64,0x8000000000000000,0x8000000000000000,3
+np.float64,0x7f336472fe66d,0x7f336472fe66d,3
+np.float64,0xffb1623ac822c478,0xbff921fb54442d18,3
+np.float64,0x3fbacd68ce359ad2,0x3fbab480b3638846,3
+np.float64,0xffd5c02706ab804e,0xbff921fb54442d18,3
+np.float64,0xbfd4daf03d29b5e0,0xbfd42928f069c062,3
+np.float64,0x800c6e85dbd8dd0c,0x800c6e85dbd8dd0c,3
+np.float64,0x800e3599c5bc6b34,0x800e3599c5bc6b34,3
+np.float64,0x2c0d654c581ad,0x2c0d654c581ad,3
+np.float64,0xbfdd3eb13fba7d62,0xbfdb6e8143302de7,3
+np.float64,0x800b60cb8776c197,0x800b60cb8776c197,3
+np.float64,0x80089819ad113034,0x80089819ad113034,3
+np.float64,0x29fe721453fcf,0x29fe721453fcf,3
+np.float64,0x3fe8722f4df0e45f,0x3fe4e026d9eadb4d,3
+np.float64,0xffd1fbcd01a3f79a,0xbff921fb54442d18,3
+np.float64,0x7fc74e1e982e9c3c,0x3ff921fb54442d18,3
+np.float64,0x800c09d3d15813a8,0x800c09d3d15813a8,3
+np.float64,0xbfeee4578b3dc8af,0xbfe891ab3d6c3ce4,3
+np.float64,0xffdd01a6f33a034e,0xbff921fb54442d18,3
+np.float64,0x7fcc130480382608,0x3ff921fb54442d18,3
+np.float64,0xffcbb6bd1d376d7c,0xbff921fb54442d18,3
+np.float64,0xc068a53780d15,0xc068a53780d15,3
+np.float64,0xbfc974f15532e9e4,0xbfc92100b355f3e7,3
+np.float64,0x3fe6da79442db4f3,0x3fe3d87393b082e7,3
+np.float64,0xd9d9be4db3b38,0xd9d9be4db3b38,3
+np.float64,0x5ea50a20bd4a2,0x5ea50a20bd4a2,3
+np.float64,0xbfe5597f7d2ab2ff,0xbfe2d3ccc544b52b,3
+np.float64,0x80019364e4e326cb,0x80019364e4e326cb,3
+np.float64,0x3fed2902c3fa5206,0x3fe7a5e1df07e5c1,3
+np.float64,0xbfa7b72b5c2f6e50,0xbfa7b2d545b3cc1f,3
+np.float64,0xffdb60dd43b6c1ba,0xbff921fb54442d18,3
+np.float64,0x81a65d8b034cc,0x81a65d8b034cc,3
+np.float64,0x8000c30385818608,0x8000c30385818608,3
+np.float64,0x6022f5f4c045f,0x6022f5f4c045f,3
+np.float64,0x8007a2bb810f4578,0x8007a2bb810f4578,3
+np.float64,0x7fdc68893238d111,0x3ff921fb54442d18,3
+np.float64,0x7fd443454ea8868a,0x3ff921fb54442d18,3
+np.float64,0xffe6b04209ed6084,0xbff921fb54442d18,3
+np.float64,0x7fcd9733d13b2e67,0x3ff921fb54442d18,3
+np.float64,0xf5ee80a9ebdd0,0xf5ee80a9ebdd0,3
+np.float64,0x3fe3788e8de6f11e,0x3fe17dec7e6843a0,3
+np.float64,0x3fee36f62f7c6dec,0x3fe836f832515b43,3
+np.float64,0xf6cb49aded969,0xf6cb49aded969,3
+np.float64,0x3fd2b15ea4a562bc,0x3fd22fdc09920e67,3
+np.float64,0x7fccf6aef139ed5d,0x3ff921fb54442d18,3
+np.float64,0x3fd396b8ce272d72,0x3fd3026118857bd4,3
+np.float64,0x7fe53d3c80ea7a78,0x3ff921fb54442d18,3
+np.float64,0x3feae88fc4f5d120,0x3fe65fb04b18ef7a,3
+np.float64,0x3fedc643747b8c86,0x3fe7fafa6c20e25a,3
+np.float64,0xffdb2dc0df365b82,0xbff921fb54442d18,3
+np.float64,0xbfa2af3658255e70,0xbfa2ad17348f4253,3
+np.float64,0x3f8aa77b30354ef6,0x3f8aa71892336a69,3
+np.float64,0xbfdd1b1efbba363e,0xbfdb510dcd186820,3
+np.float64,0x800f50d99c5ea1b3,0x800f50d99c5ea1b3,3
+np.float64,0xff6ed602403dac00,0xbff921fb54442d18,3
+np.float64,0x800477d71aa8efaf,0x800477d71aa8efaf,3
+np.float64,0xbfe729a9e86e5354,0xbfe40ca78d9eefcf,3
+np.float64,0x3fd81ab2d4303566,0x3fd70d7e3937ea22,3
+np.float64,0xb617cbab6c2fa,0xb617cbab6c2fa,3
+np.float64,0x7fefffffffffffff,0x3ff921fb54442d18,3
+np.float64,0xffa40933ac281260,0xbff921fb54442d18,3
+np.float64,0xbfe1ede621e3dbcc,0xbfe057bb2b341ced,3
+np.float64,0xbfec700f03b8e01e,0xbfe73fb190bc722e,3
+np.float64,0x6e28af02dc517,0x6e28af02dc517,3
+np.float64,0x3fe37ad37ae6f5a7,0x3fe17f94674818a9,3
+np.float64,0x8000cbdeeae197bf,0x8000cbdeeae197bf,3
+np.float64,0x3fe8fd1f01f1fa3e,0x3fe5372bbec5d72c,3
+np.float64,0x3f8f9229103f2452,0x3f8f918531894256,3
+np.float64,0x800536858e0a6d0c,0x800536858e0a6d0c,3
+np.float64,0x7fe82bb4f9f05769,0x3ff921fb54442d18,3
+np.float64,0xffc1c2fb592385f8,0xbff921fb54442d18,3
+np.float64,0x7f924ddfc0249bbf,0x3ff921fb54442d18,3
+np.float64,0xffd5e125c52bc24c,0xbff921fb54442d18,3
+np.float64,0xbfef0d8738be1b0e,0xbfe8a6ef17b16c10,3
+np.float64,0x3fc9c8875233910f,0x3fc9715e708503cb,3
+np.float64,0xbfe2d926f4e5b24e,0xbfe108956e61cbb3,3
+np.float64,0x7fd61c496dac3892,0x3ff921fb54442d18,3
+np.float64,0x7fed545c6b7aa8b8,0x3ff921fb54442d18,3
+np.float64,0x8003746fea86e8e1,0x8003746fea86e8e1,3
+np.float64,0x3fdf515e75bea2bd,0x3fdd201a5585caa3,3
+np.float64,0xffda87c8ee350f92,0xbff921fb54442d18,3
+np.float64,0xffc675d8e22cebb0,0xbff921fb54442d18,3
+np.float64,0xffcdc173433b82e8,0xbff921fb54442d18,3
+np.float64,0xffed9df1517b3be2,0xbff921fb54442d18,3
+np.float64,0x3fd6a2eec72d45de,0x3fd5c1f1d7dcddcf,3
+np.float64,0xffec116a66f822d4,0xbff921fb54442d18,3
+np.float64,0x8007c2a2458f8545,0x8007c2a2458f8545,3
+np.float64,0x3fe4ee80d969dd02,0x3fe2895076094668,3
+np.float64,0x3fe3cae7116795ce,0x3fe1b9c07e0d03a7,3
+np.float64,0xbfd81bf8d8b037f2,0xbfd70e9bbbb4ca57,3
+np.float64,0x800c88ccd1f9119a,0x800c88ccd1f9119a,3
+np.float64,0xffdab2aee2b5655e,0xbff921fb54442d18,3
+np.float64,0x3fe743d227ee87a4,0x3fe41dcaef186d96,3
+np.float64,0x3fb060fd0220c1fa,0x3fb05b47f56ebbb4,3
+np.float64,0xbfd3f03772a7e06e,0xbfd3541522377291,3
+np.float64,0x190a5ae03216,0x190a5ae03216,3
+np.float64,0x3fe48c71916918e4,0x3fe24442f45b3183,3
+np.float64,0x800862470590c48e,0x800862470590c48e,3
+np.float64,0x7fd3ced89d279db0,0x3ff921fb54442d18,3
+np.float64,0x3feb3d9b4ab67b37,0x3fe69140cf2623f7,3
+np.float64,0xbc3f296b787e5,0xbc3f296b787e5,3
+np.float64,0xbfed6b905dfad721,0xbfe7ca1881a8c0fd,3
+np.float64,0xbfe621c2aaac4386,0xbfe35cd1969a82db,3
+np.float64,0x8009e7b17593cf63,0x8009e7b17593cf63,3
+np.float64,0x80045f580ca8beb1,0x80045f580ca8beb1,3
+np.float64,0xbfea2e177e745c2f,0xbfe5f13971633339,3
+np.float64,0x3fee655787fccab0,0x3fe84f6b98b6de26,3
+np.float64,0x3fc9cde92f339bd0,0x3fc9768a88b2c97c,3
+np.float64,0x3fc819c3b3303388,0x3fc7d25e1526e731,3
+np.float64,0x3fd3e848d2a7d090,0x3fd34cd9e6af558f,3
+np.float64,0x3fe19dacac633b5a,0x3fe01a6b4d27adc2,3
+np.float64,0x800b190da316321c,0x800b190da316321c,3
+np.float64,0xd5c69711ab8d3,0xd5c69711ab8d3,3
+np.float64,0xbfdc31bed7b8637e,0xbfda8ea3c1309d6d,3
+np.float64,0xbfd02ba007a05740,0xbfcfad86f0d756dc,3
+np.float64,0x3fe874473d70e88e,0x3fe4e1793cd82123,3
+np.float64,0xffb465585c28cab0,0xbff921fb54442d18,3
+np.float64,0xbfb5d8e13e2bb1c0,0xbfb5cb5c7807fc4d,3
+np.float64,0xffe80f933bf01f26,0xbff921fb54442d18,3
+np.float64,0x7feea783f5fd4f07,0x3ff921fb54442d18,3
+np.float64,0xbfae6665f43cccd0,0xbfae5d45b0a6f90a,3
+np.float64,0x800bd6ef5a77addf,0x800bd6ef5a77addf,3
+np.float64,0x800d145babda28b8,0x800d145babda28b8,3
+np.float64,0x39de155473bc3,0x39de155473bc3,3
+np.float64,0x3fefbd6bb1ff7ad8,0x3fe9008e73a3296e,3
+np.float64,0x3fc40bca3d281798,0x3fc3e2710e167007,3
+np.float64,0x3fcae0918335c120,0x3fca7e09e704a678,3
+np.float64,0x51287fbea2511,0x51287fbea2511,3
+np.float64,0x7fa6bc33a82d7866,0x3ff921fb54442d18,3
+np.float64,0xe72a2bebce546,0xe72a2bebce546,3
+np.float64,0x3fe1c8fd686391fa,0x3fe03b9622aeb4e3,3
+np.float64,0x3fe2a73ac3654e76,0x3fe0e36bc1ee4ac4,3
+np.float64,0x59895218b312b,0x59895218b312b,3
+np.float64,0xc6dc25c78db85,0xc6dc25c78db85,3
+np.float64,0xbfc06cfac520d9f4,0xbfc0561f85d2c907,3
+np.float64,0xbfea912dc4f5225c,0xbfe62c3b1c01c793,3
+np.float64,0x3fb78ce89a2f19d0,0x3fb77bfcb65a67d3,3
+np.float64,0xbfece5cdea39cb9c,0xbfe78103d24099e5,3
+np.float64,0x30d3054e61a61,0x30d3054e61a61,3
+np.float64,0xbfd3fe26fba7fc4e,0xbfd360c8447c4f7a,3
+np.float64,0x800956072a92ac0f,0x800956072a92ac0f,3
+np.float64,0x7fe639b3b6ec7366,0x3ff921fb54442d18,3
+np.float64,0x800ee30240bdc605,0x800ee30240bdc605,3
+np.float64,0x7fef6af0d2bed5e1,0x3ff921fb54442d18,3
+np.float64,0xffefce8725ff9d0d,0xbff921fb54442d18,3
+np.float64,0x3fe2e311da65c624,0x3fe10ff1623089dc,3
+np.float64,0xbfe7e5cbe56fcb98,0xbfe486c3daeda67c,3
+np.float64,0x80095bc14472b783,0x80095bc14472b783,3
+np.float64,0xffef0cb4553e1968,0xbff921fb54442d18,3
+np.float64,0xe3e60567c7cc1,0xe3e60567c7cc1,3
+np.float64,0xffde919f06bd233e,0xbff921fb54442d18,3
+np.float64,0x3fe3f9632e27f2c6,0x3fe1db49ebd21c4e,3
+np.float64,0x9dee9a233bdd4,0x9dee9a233bdd4,3
+np.float64,0xbfe3bb0602e7760c,0xbfe1ae41b6d4c488,3
+np.float64,0x3fc46945a128d288,0x3fc43da54c6c6a2a,3
+np.float64,0x7fdef149ac3de292,0x3ff921fb54442d18,3
+np.float64,0x800a96c76d752d8f,0x800a96c76d752d8f,3
+np.float64,0x3f971a32382e3464,0x3f9719316b9e9baf,3
+np.float64,0x7fe97bcf15b2f79d,0x3ff921fb54442d18,3
+np.float64,0x7fea894558f5128a,0x3ff921fb54442d18,3
+np.float64,0x3fc9e3be1933c780,0x3fc98b847c3923eb,3
+np.float64,0x3f7accac40359959,0x3f7acc9330741b64,3
+np.float64,0xa80c136950183,0xa80c136950183,3
+np.float64,0x3fe408732b2810e6,0x3fe1e61e7cbc8824,3
+np.float64,0xffa775bc042eeb80,0xbff921fb54442d18,3
+np.float64,0x3fbf04bd223e0980,0x3fbede37b8fc697e,3
+np.float64,0x7fd999b34c333366,0x3ff921fb54442d18,3
+np.float64,0xe72146dfce429,0xe72146dfce429,3
+np.float64,0x4f511ee49ea24,0x4f511ee49ea24,3
+np.float64,0xffb3e6e58827cdc8,0xbff921fb54442d18,3
+np.float64,0x3fd1f180cfa3e300,0x3fd17e85b2871de2,3
+np.float64,0x97c8e45b2f91d,0x97c8e45b2f91d,3
+np.float64,0xbfeeb20e88fd641d,0xbfe8778f878440bf,3
+np.float64,0xbfe1fc6dee23f8dc,0xbfe062c815a93cde,3
+np.float64,0xab4bf71f5697f,0xab4bf71f5697f,3
+np.float64,0xa9675a2952cec,0xa9675a2952cec,3
+np.float64,0xbfef3ea4a33e7d49,0xbfe8c02743ebc1b6,3
+np.float64,0x3fe22a2eafa4545d,0x3fe08577afca52a9,3
+np.float64,0x3fe8a08daaf1411c,0x3fe4fd5a34f05305,3
+np.float64,0xbfc6cda77b2d9b50,0xbfc6910bcfa0cf4f,3
+np.float64,0x3fec398394387307,0x3fe7211dd5276500,3
+np.float64,0x3fe36c95c626d92c,0x3fe1752e5aa2357b,3
+np.float64,0xffd8b9e7073173ce,0xbff921fb54442d18,3
+np.float64,0xffe19f043ae33e08,0xbff921fb54442d18,3
+np.float64,0x800e3640709c6c81,0x800e3640709c6c81,3
+np.float64,0x3fe7d6c20aafad84,0x3fe47d1a3307d9c8,3
+np.float64,0x80093fd63b727fad,0x80093fd63b727fad,3
+np.float64,0xffe1a671a4634ce3,0xbff921fb54442d18,3
+np.float64,0xbfe53a6b386a74d6,0xbfe2be41859cb10d,3
+np.float64,0xbfed149a097a2934,0xbfe79ab7e3e93c1c,3
+np.float64,0x7fc2769a5724ed34,0x3ff921fb54442d18,3
+np.float64,0xffd01e4e99a03c9e,0xbff921fb54442d18,3
+np.float64,0xa61f38434c3e7,0xa61f38434c3e7,3
+np.float64,0x800ad4ac5195a959,0x800ad4ac5195a959,3
+np.float64,0x7ff8000000000000,0x7ff8000000000000,3
+np.float64,0x80034a45b6c6948c,0x80034a45b6c6948c,3
+np.float64,0x6350b218c6a17,0x6350b218c6a17,3
+np.float64,0xfff0000000000000,0xbff921fb54442d18,3
+np.float64,0x3fe363e759e6c7cf,0x3fe16ed58d80f9ce,3
+np.float64,0xffe3b98e59e7731c,0xbff921fb54442d18,3
+np.float64,0x3fdbf7b40337ef68,0x3fda5df7ad3c80f9,3
+np.float64,0xbfe9cdf784739bef,0xbfe5b74f346ef93d,3
+np.float64,0xbfc321bea326437c,0xbfc2fdc0d4ff7561,3
+np.float64,0xbfe40f77d2a81ef0,0xbfe1eb28c4ae4dde,3
+np.float64,0x7fe071806960e300,0x3ff921fb54442d18,3
+np.float64,0x7fd269006ea4d200,0x3ff921fb54442d18,3
+np.float64,0x80017a56e0e2f4af,0x80017a56e0e2f4af,3
+np.float64,0x8004b4ea09a969d5,0x8004b4ea09a969d5,3
+np.float64,0xbfedbb01e63b7604,0xbfe7f4f0e84297df,3
+np.float64,0x3fe44454826888a9,0x3fe210ff6d005706,3
+np.float64,0xbfe0e77e6ea1cefd,0xbfdf1a977da33402,3
+np.float64,0xbfed6d4c8c3ada99,0xbfe7cb0932093f60,3
+np.float64,0x1d74cb9e3ae9a,0x1d74cb9e3ae9a,3
+np.float64,0x80082a785d1054f1,0x80082a785d1054f1,3
+np.float64,0x3fe58393266b0726,0x3fe2f0d8e91d4887,3
+np.float64,0xffe4028899680510,0xbff921fb54442d18,3
+np.float64,0x783a2e5af0746,0x783a2e5af0746,3
+np.float64,0x7fcdce88e73b9d11,0x3ff921fb54442d18,3
+np.float64,0x3fc58672a72b0ce5,0x3fc5535e090e56e2,3
+np.float64,0x800889c839b11391,0x800889c839b11391,3
+np.float64,0xffe5e05c466bc0b8,0xbff921fb54442d18,3
+np.float64,0xbfcbef6ebe37dedc,0xbfcb810752468f49,3
+np.float64,0xffe9408563b2810a,0xbff921fb54442d18,3
+np.float64,0xbfee4738367c8e70,0xbfe83f8e5dd7602f,3
+np.float64,0xbfe4aeb587295d6b,0xbfe25c7a0c76a454,3
+np.float64,0xffc9aea0a7335d40,0xbff921fb54442d18,3
+np.float64,0xe1e02199c3c04,0xe1e02199c3c04,3
+np.float64,0xbfbd9400783b2800,0xbfbd729345d1d14f,3
+np.float64,0x7a5418bcf4a84,0x7a5418bcf4a84,3
+np.float64,0x3fdc1c2fa5b83860,0x3fda7c935965ae72,3
+np.float64,0x80076a9f58ced53f,0x80076a9f58ced53f,3
+np.float64,0x3fedc4bf957b897f,0x3fe7fa2a83148f1c,3
+np.float64,0x800981b8a9d30372,0x800981b8a9d30372,3
+np.float64,0xffe1082311621046,0xbff921fb54442d18,3
+np.float64,0xe0091f89c0124,0xe0091f89c0124,3
+np.float64,0xbfce8d674f3d1ad0,0xbfcdfdbf2ddaa0ca,3
+np.float64,0x800516e72eaa2dcf,0x800516e72eaa2dcf,3
+np.float64,0xffe61ee64c6c3dcc,0xbff921fb54442d18,3
+np.float64,0x7fed2683cafa4d07,0x3ff921fb54442d18,3
+np.float64,0xffd4faf27729f5e4,0xbff921fb54442d18,3
+np.float64,0x7fe308fa842611f4,0x3ff921fb54442d18,3
+np.float64,0x3fc612a62b2c2550,0x3fc5db9ddbd4e159,3
+np.float64,0xbfe5b01e766b603d,0xbfe30f72a875e988,3
+np.float64,0x3fc2dd8b9a25bb17,0x3fc2bb06246b9f78,3
+np.float64,0x8170908102e12,0x8170908102e12,3
+np.float64,0x800c1c8a8a583915,0x800c1c8a8a583915,3
+np.float64,0xffe5d91e8b6bb23c,0xbff921fb54442d18,3
+np.float64,0xffd140adee22815c,0xbff921fb54442d18,3
+np.float64,0xbfe2f1f5f8e5e3ec,0xbfe11afa5d749952,3
+np.float64,0xbfed6d1d587ada3b,0xbfe7caef9ecf7651,3
+np.float64,0x3fe9b85e67f370bd,0x3fe5aa3474768982,3
+np.float64,0x7fdc8932edb91265,0x3ff921fb54442d18,3
+np.float64,0x7fd136bc54a26d78,0x3ff921fb54442d18,3
+np.float64,0x800a1ea12a343d43,0x800a1ea12a343d43,3
+np.float64,0x3fec6a5c1b78d4b8,0x3fe73c82235c3f8f,3
+np.float64,0x800fbf6a00df7ed4,0x800fbf6a00df7ed4,3
+np.float64,0xbfd0e6e0cda1cdc2,0xbfd0864bf8cad294,3
+np.float64,0x3fc716df482e2dbf,0x3fc6d7fbfd4a8470,3
+np.float64,0xbfe75990936eb321,0xbfe42bffec3fa0d7,3
+np.float64,0x3fd58e54a02b1ca9,0x3fd4cace1107a5cc,3
+np.float64,0xbfc9c04136338084,0xbfc9696ad2591d54,3
+np.float64,0xdd1f0147ba3e0,0xdd1f0147ba3e0,3
+np.float64,0x5c86a940b90e,0x5c86a940b90e,3
+np.float64,0xbfecae3b8e795c77,0xbfe7624d4988c612,3
+np.float64,0xffd0370595206e0c,0xbff921fb54442d18,3
+np.float64,0xbfdc26d443384da8,0xbfda857ecd33ba9f,3
+np.float64,0xbfd1c849d9a39094,0xbfd15849449cc378,3
+np.float64,0xffee04acdb3c0959,0xbff921fb54442d18,3
+np.float64,0xbfded1056dbda20a,0xbfdcb83b30e1528c,3
+np.float64,0x7fb7b826622f704c,0x3ff921fb54442d18,3
+np.float64,0xbfee4df8ae7c9bf1,0xbfe8431df9dfd05d,3
+np.float64,0x7fe7f3670e2fe6cd,0x3ff921fb54442d18,3
+np.float64,0x8008ac9ae0d15936,0x8008ac9ae0d15936,3
+np.float64,0x800dce9f3b3b9d3f,0x800dce9f3b3b9d3f,3
+np.float64,0x7fbb19db203633b5,0x3ff921fb54442d18,3
+np.float64,0x3fe56c7f302ad8fe,0x3fe2e0eec3ad45fd,3
+np.float64,0x7fe82c05c570580b,0x3ff921fb54442d18,3
+np.float64,0xc0552b7780aa6,0xc0552b7780aa6,3
+np.float64,0x39d40e3073a83,0x39d40e3073a83,3
+np.float64,0x3fd8db54d731b6aa,0x3fd7b589b3ee9b20,3
+np.float64,0xffcdd355233ba6ac,0xbff921fb54442d18,3
+np.float64,0x3fbe97b3a43d2f67,0x3fbe72bca9be0348,3
+np.float64,0xbff0000000000000,0xbfe921fb54442d18,3
+np.float64,0xbfb4f55e6229eac0,0xbfb4e96df18a75a7,3
+np.float64,0xbfc66399ba2cc734,0xbfc62a3298bd96fc,3
+np.float64,0x3fd00988bb201311,0x3fcf6d67a9374c38,3
+np.float64,0x7fe471867d28e30c,0x3ff921fb54442d18,3
+np.float64,0xbfe38e0e64271c1d,0xbfe18d9888b7523b,3
+np.float64,0x8009dc127573b825,0x8009dc127573b825,3
+np.float64,0x800047bde4608f7d,0x800047bde4608f7d,3
+np.float64,0xffeede42c77dbc85,0xbff921fb54442d18,3
+np.float64,0xd8cf6d13b19ee,0xd8cf6d13b19ee,3
+np.float64,0xbfd08fb302a11f66,0xbfd034b1f8235e23,3
+np.float64,0x7fdb404c0b368097,0x3ff921fb54442d18,3
+np.float64,0xbfd6ba0438ad7408,0xbfd5d673e3276ec1,3
+np.float64,0xffd9568027b2ad00,0xbff921fb54442d18,3
+np.float64,0xbfb313b73e262770,0xbfb30ab4acb4fa67,3
+np.float64,0xbfe2dc1a15e5b834,0xbfe10ac5f8f3acd3,3
+np.float64,0xbfee426bf4bc84d8,0xbfe83d061df91edd,3
+np.float64,0xd9142c2fb2286,0xd9142c2fb2286,3
+np.float64,0x7feb0d11dff61a23,0x3ff921fb54442d18,3
+np.float64,0x800fea5b509fd4b7,0x800fea5b509fd4b7,3
+np.float64,0x3fe1a8818da35103,0x3fe022ba1bdf366e,3
+np.float64,0x8010000000000000,0x8010000000000000,3
+np.float64,0xbfd8fc6de6b1f8dc,0xbfd7d24726ed8dcc,3
+np.float64,0xf4b3dc2de967c,0xf4b3dc2de967c,3
+np.float64,0x8af0409b15e08,0x8af0409b15e08,3
+np.float64,0x3fb21e6934243cd2,0x3fb216b065f8709a,3
+np.float64,0x3fc53069392a60d2,0x3fc4ffa931211fb9,3
+np.float64,0xffc955812c32ab04,0xbff921fb54442d18,3
+np.float64,0xbfe3de42b1a7bc86,0xbfe1c7bd1324de75,3
+np.float64,0x1dc149a03b82a,0x1dc149a03b82a,3
+np.float64,0x8001bc5a24a378b5,0x8001bc5a24a378b5,3
+np.float64,0x3da14c407b44,0x3da14c407b44,3
+np.float64,0x80025e8da924bd1c,0x80025e8da924bd1c,3
+np.float64,0xbfcb0141c9360284,0xbfca9d572ea5e1f3,3
+np.float64,0xc90036fd92007,0xc90036fd92007,3
+np.float64,0x138312c427063,0x138312c427063,3
+np.float64,0x800dda3a963bb475,0x800dda3a963bb475,3
+np.float64,0x3fe9339934f26732,0x3fe558e723291f78,3
+np.float64,0xbfea8357027506ae,0xbfe6240826faaf48,3
+np.float64,0x7fe04735cae08e6b,0x3ff921fb54442d18,3
+np.float64,0x3fe29aca3c653594,0x3fe0da214c8bc6a4,3
+np.float64,0x3fbe1f09a03c3e13,0x3fbdfbbefef0155b,3
+np.float64,0x816ee4ad02ddd,0x816ee4ad02ddd,3
+np.float64,0xffddd1b31d3ba366,0xbff921fb54442d18,3
+np.float64,0x3fe2e01e0625c03c,0x3fe10dc0bd6677c2,3
+np.float64,0x3fec6bcf1978d79e,0x3fe73d518cddeb7c,3
+np.float64,0x7fe01aaaf8603555,0x3ff921fb54442d18,3
+np.float64,0xdf300cc5be602,0xdf300cc5be602,3
+np.float64,0xbfe71c01a36e3804,0xbfe403af80ce47b8,3
+np.float64,0xffa5be00ac2b7c00,0xbff921fb54442d18,3
+np.float64,0xbfda9ba711b5374e,0xbfd93775e3ac6bda,3
+np.float64,0xbfe56d8a27eadb14,0xbfe2e1a7185e8e6d,3
+np.float64,0x800f1bc937be3792,0x800f1bc937be3792,3
+np.float64,0x800a61d93c74c3b3,0x800a61d93c74c3b3,3
+np.float64,0x7fe71a52fcae34a5,0x3ff921fb54442d18,3
+np.float64,0x7fb4aef256295de4,0x3ff921fb54442d18,3
+np.float64,0x3fe6c1e861ed83d1,0x3fe3c828f281a7ef,3
+np.float64,0x3fba128402342508,0x3fb9fb94cf141860,3
+np.float64,0x3fee55a7ecfcab50,0x3fe8472a9af893ee,3
+np.float64,0x3fe586f31b2b0de6,0x3fe2f32bce9e91bc,3
+np.float64,0xbfbb1d1442363a28,0xbfbb034c7729d5f2,3
+np.float64,0xc78b4d3f8f16a,0xc78b4d3f8f16a,3
+np.float64,0x7fdbc277d4b784ef,0x3ff921fb54442d18,3
+np.float64,0xbfa728ca2c2e5190,0xbfa724c04e73ccbd,3
+np.float64,0x7fefc7b2143f8f63,0x3ff921fb54442d18,3
+np.float64,0x3fd153a3dda2a748,0x3fd0ebccd33a4dca,3
+np.float64,0xbfe18a6eace314de,0xbfe00ba32ec89d30,3
+np.float64,0x7feef518537dea30,0x3ff921fb54442d18,3
+np.float64,0x8005f007cd4be010,0x8005f007cd4be010,3
+np.float64,0x7fd890b840b12170,0x3ff921fb54442d18,3
+np.float64,0x7feed0582ebda0af,0x3ff921fb54442d18,3
+np.float64,0x1013f53220280,0x1013f53220280,3
+np.float64,0xbfe77273986ee4e7,0xbfe43c375a8bf6de,3
+np.float64,0x7fe3ab8918675711,0x3ff921fb54442d18,3
+np.float64,0xbfc6ad515b2d5aa4,0xbfc671b2f7f86624,3
+np.float64,0x7fcd86231d3b0c45,0x3ff921fb54442d18,3
+np.float64,0xffe2523299a4a464,0xbff921fb54442d18,3
+np.float64,0x7fcadc5a1b35b8b3,0x3ff921fb54442d18,3
+np.float64,0x3fe5e020c4ebc042,0x3fe330418eec75bd,3
+np.float64,0x7fe332a9dc266553,0x3ff921fb54442d18,3
+np.float64,0xfa11dc21f425,0xfa11dc21f425,3
+np.float64,0xbec800177d900,0xbec800177d900,3
+np.float64,0x3fcadd057835ba0b,0x3fca7aa42face8bc,3
+np.float64,0xbfe6b9a206ad7344,0xbfe3c2a9719803de,3
+np.float64,0x3fbb4250b63684a0,0x3fbb281e9cefc519,3
+np.float64,0x7fef8787517f0f0e,0x3ff921fb54442d18,3
+np.float64,0x8001315c2d6262b9,0x8001315c2d6262b9,3
+np.float64,0xbfd94e3cf2b29c7a,0xbfd819257d36f56c,3
+np.float64,0xf1f325abe3e65,0xf1f325abe3e65,3
+np.float64,0x7fd6c07079ad80e0,0x3ff921fb54442d18,3
+np.float64,0x7fe328b075a65160,0x3ff921fb54442d18,3
+np.float64,0x7fe7998f812f331e,0x3ff921fb54442d18,3
+np.float64,0xffe026bb65604d76,0xbff921fb54442d18,3
+np.float64,0xffd6c06de8ad80dc,0xbff921fb54442d18,3
+np.float64,0x3fcd5a37bf3ab46f,0x3fccda82935d98ce,3
+np.float64,0xffc3e5a45227cb48,0xbff921fb54442d18,3
+np.float64,0x3febf7dd8177efbc,0x3fe6fc0bb999883e,3
+np.float64,0x7fd7047ea92e08fc,0x3ff921fb54442d18,3
+np.float64,0x35b3fc406b680,0x35b3fc406b680,3
+np.float64,0x7fd52e97632a5d2e,0x3ff921fb54442d18,3
+np.float64,0x3fd464d401a8c9a8,0x3fd3be2967fc97c3,3
+np.float64,0x800e815b2ebd02b6,0x800e815b2ebd02b6,3
+np.float64,0x3fca8428af350850,0x3fca257b466b8970,3
+np.float64,0x8007b7526f6f6ea6,0x8007b7526f6f6ea6,3
+np.float64,0x82f60a8f05ec2,0x82f60a8f05ec2,3
+np.float64,0x3fb71a5d0a2e34c0,0x3fb70a629ef8e2a2,3
+np.float64,0x7fc8570c7d30ae18,0x3ff921fb54442d18,3
+np.float64,0x7fe5528e77eaa51c,0x3ff921fb54442d18,3
+np.float64,0xffc20dbbf1241b78,0xbff921fb54442d18,3
+np.float64,0xeb13368fd6267,0xeb13368fd6267,3
+np.float64,0x7fe7d529056faa51,0x3ff921fb54442d18,3
+np.float64,0x3fecd02eabf9a05d,0x3fe77516f0ba1ac4,3
+np.float64,0x800fcba6a09f974d,0x800fcba6a09f974d,3
+np.float64,0x7fe7e8e015afd1bf,0x3ff921fb54442d18,3
+np.float64,0xbfd271a382a4e348,0xbfd1f513a191c595,3
+np.float64,0x9f1014013e21,0x9f1014013e21,3
+np.float64,0x3fc05da47f20bb49,0x3fc04708a13a3a47,3
+np.float64,0x3fe0f427dda1e850,0x3fdf2e60ba8678b9,3
+np.float64,0xbfecb29fa539653f,0xbfe764bc791c45dd,3
+np.float64,0x45881ec68b104,0x45881ec68b104,3
+np.float64,0x8000000000000001,0x8000000000000001,3
+np.float64,0x3fe9c67ee1338cfe,0x3fe5b2c7b3df6ce8,3
+np.float64,0x7fedb8fef6bb71fd,0x3ff921fb54442d18,3
+np.float64,0x3fe54f6aaaea9ed6,0x3fe2ccd1df2abaa9,3
+np.float64,0x7feff58a1bbfeb13,0x3ff921fb54442d18,3
+np.float64,0x7fe3b62827276c4f,0x3ff921fb54442d18,3
+np.float64,0x3fe5feb682ebfd6d,0x3fe345105bc6d980,3
+np.float64,0x3fe49f38d9693e72,0x3fe2518b2824757f,3
+np.float64,0x8006bfd27c6d7fa6,0x8006bfd27c6d7fa6,3
+np.float64,0x3fc13409e2226814,0x3fc119ce0c01a5a2,3
+np.float64,0x95f8c7212bf19,0x95f8c7212bf19,3
+np.float64,0x3fd9f0fa6133e1f5,0x3fd8a567515edecf,3
+np.float64,0x3fef95cbe5ff2b98,0x3fe8ec88c768ba0b,3
+np.float64,0x3fbed28bba3da510,0x3fbeacbf136e51c2,3
+np.float64,0xbfd3987aeca730f6,0xbfd303fca58e3e60,3
+np.float64,0xbfed0f90cbfa1f22,0xbfe797f59249410d,3
+np.float64,0xffe55d8cbf2abb19,0xbff921fb54442d18,3
+np.float64,0x3feb4d9fc6769b40,0x3fe69a88131a1f1f,3
+np.float64,0x80085569acd0aad4,0x80085569acd0aad4,3
+np.float64,0x20557a6e40ab0,0x20557a6e40ab0,3
+np.float64,0x3fead2fd5df5a5fb,0x3fe653091f33b27f,3
+np.float64,0x3fe7b9983eaf7330,0x3fe46a50c4b5235e,3
+np.float64,0xffdad237ffb5a470,0xbff921fb54442d18,3
+np.float64,0xbfe5cc39a4eb9874,0xbfe322ad3a903f93,3
+np.float64,0x800ad6eecb35adde,0x800ad6eecb35adde,3
+np.float64,0xffec620f6438c41e,0xbff921fb54442d18,3
+np.float64,0xbfe5ef29122bde52,0xbfe33a7dfcc255e2,3
+np.float64,0x3fd451e7d0a8a3d0,0x3fd3acfa4939af10,3
+np.float64,0x8003ea93c127d528,0x8003ea93c127d528,3
+np.float64,0x800b48d37c9691a7,0x800b48d37c9691a7,3
+np.float64,0x3fe7e202acafc405,0x3fe484558246069b,3
+np.float64,0x80070c9b686e1938,0x80070c9b686e1938,3
+np.float64,0xbfda90bbc6352178,0xbfd92e25fcd12288,3
+np.float64,0x800e1ffebb1c3ffe,0x800e1ffebb1c3ffe,3
+np.float64,0x3ff0000000000000,0x3fe921fb54442d18,3
+np.float64,0xffd8cfdd46319fba,0xbff921fb54442d18,3
+np.float64,0x7fd8cd4182319a82,0x3ff921fb54442d18,3
+np.float64,0x3fed8bb778bb176f,0x3fe7db7c77c4c694,3
+np.float64,0x3fc74a70302e94e0,0x3fc709e95d6defec,3
+np.float64,0x3fe87269d070e4d4,0x3fe4e04bcc4a2137,3
+np.float64,0x7fb48223f6290447,0x3ff921fb54442d18,3
+np.float64,0xffe8ec444b71d888,0xbff921fb54442d18,3
+np.float64,0x7fde17d280bc2fa4,0x3ff921fb54442d18,3
+np.float64,0x3fd1cbde01a397bc,0x3fd15b9bb7b3147b,3
+np.float64,0x800883a64451074d,0x800883a64451074d,3
+np.float64,0x7fe3160a3f262c13,0x3ff921fb54442d18,3
+np.float64,0xbfe051d4d9a0a3aa,0xbfde2ecf14dc75fb,3
+np.float64,0xbfd89de689b13bce,0xbfd780176d1a28a3,3
+np.float64,0x3fecde2bf779bc58,0x3fe77ccf10bdd8e2,3
+np.float64,0xffe75774dc6eaee9,0xbff921fb54442d18,3
+np.float64,0x7fe834414d706882,0x3ff921fb54442d18,3
+np.float64,0x1,0x1,3
+np.float64,0xbfea5e4e4a74bc9c,0xbfe60e0601711835,3
+np.float64,0xffec248d4cb8491a,0xbff921fb54442d18,3
+np.float64,0xffd9942c2c332858,0xbff921fb54442d18,3
+np.float64,0xa9db36a553b67,0xa9db36a553b67,3
+np.float64,0x7fec630718b8c60d,0x3ff921fb54442d18,3
+np.float64,0xbfd062188f20c432,0xbfd009ecd652be89,3
+np.float64,0x8001b84e3023709d,0x8001b84e3023709d,3
+np.float64,0xbfe9e26d7cb3c4db,0xbfe5c3b157ecf668,3
+np.float64,0xbfef66ddf33ecdbc,0xbfe8d4b1f6410a24,3
+np.float64,0x3fd8d7109431ae21,0x3fd7b1d4860719a2,3
+np.float64,0xffee0f53107c1ea5,0xbff921fb54442d18,3
+np.float64,0x80000b4fd60016a0,0x80000b4fd60016a0,3
+np.float64,0xbfd99ff6e5333fee,0xbfd85fb3cbdaa049,3
+np.float64,0xbfe9cfd268339fa5,0xbfe5b86ef021a1b1,3
+np.float64,0xe32eace1c65d6,0xe32eace1c65d6,3
+np.float64,0xffc81f6627303ecc,0xbff921fb54442d18,3
+np.float64,0x7fe98dadde331b5b,0x3ff921fb54442d18,3
+np.float64,0xbfbcebd11e39d7a0,0xbfbccc8ec47883c7,3
+np.float64,0x7fe164880f22c90f,0x3ff921fb54442d18,3
+np.float64,0x800467c0cae8cf82,0x800467c0cae8cf82,3
+np.float64,0x800071e4b140e3ca,0x800071e4b140e3ca,3
+np.float64,0xbfc87a7eae30f4fc,0xbfc82fbc55bb0f24,3
+np.float64,0xffb2e0e23225c1c8,0xbff921fb54442d18,3
+np.float64,0x20ef338041df,0x20ef338041df,3
+np.float64,0x7fe6de71ca6dbce3,0x3ff921fb54442d18,3
+np.float64,0x5d1fa026ba3f5,0x5d1fa026ba3f5,3
+np.float64,0xffd112a9ce222554,0xbff921fb54442d18,3
+np.float64,0x3fb351f66626a3ed,0x3fb3489ab578c452,3
+np.float64,0x7fef7b2bd3bef657,0x3ff921fb54442d18,3
+np.float64,0xffe144f5d4e289eb,0xbff921fb54442d18,3
+np.float64,0xffd63a6750ac74ce,0xbff921fb54442d18,3
+np.float64,0x7fd2d8bb25a5b175,0x3ff921fb54442d18,3
+np.float64,0x3fec5920a078b242,0x3fe732dcffcf6521,3
+np.float64,0x80009a8b7f813518,0x80009a8b7f813518,3
+np.float64,0x3fdea220893d4441,0x3fdc921edf6bf3d8,3
+np.float64,0x8006cee2208d9dc5,0x8006cee2208d9dc5,3
+np.float64,0xdd0b0081ba17,0xdd0b0081ba17,3
+np.float64,0x7ff4000000000000,0x7ffc000000000000,3
+np.float64,0xbfdac33955358672,0xbfd9592bce7daf1f,3
+np.float64,0x7fe8301d7170603a,0x3ff921fb54442d18,3
+np.float64,0xbfc1d34d8523a69c,0xbfc1b62449af9684,3
+np.float64,0x800c62239458c447,0x800c62239458c447,3
+np.float64,0xffd398c009a73180,0xbff921fb54442d18,3
+np.float64,0xbfe0c6d9ee218db4,0xbfdee777557f4401,3
+np.float64,0x3feccdd373799ba7,0x3fe773c9c2263f89,3
+np.float64,0xbfd21898bda43132,0xbfd1a2be8545fcc5,3
+np.float64,0x3fd77019b62ee033,0x3fd67793cabdf267,3
+np.float64,0x7fa609cad42c1395,0x3ff921fb54442d18,3
+np.float64,0x7fb4eaea5a29d5d4,0x3ff921fb54442d18,3
+np.float64,0x3fc570dc9a2ae1b9,0x3fc53e5f6218a799,3
+np.float64,0x800344ae8466895e,0x800344ae8466895e,3
+np.float64,0xbfc7c985252f930c,0xbfc784d60fa27bac,3
+np.float64,0xffaa2929fc345250,0xbff921fb54442d18,3
+np.float64,0xffe63e5ee9ac7cbe,0xbff921fb54442d18,3
+np.float64,0x73f0280ce7e06,0x73f0280ce7e06,3
+np.float64,0xffc525f8822a4bf0,0xbff921fb54442d18,3
+np.float64,0x7fd744d00aae899f,0x3ff921fb54442d18,3
+np.float64,0xbfe0fe590761fcb2,0xbfdf3e493e8b1f32,3
+np.float64,0xfae04ae7f5c0a,0xfae04ae7f5c0a,3
+np.float64,0xef821939df043,0xef821939df043,3
+np.float64,0x7fef6135843ec26a,0x3ff921fb54442d18,3
+np.float64,0xbfebf34dcbf7e69c,0xbfe6f97588a8f911,3
+np.float64,0xbfeec0b498fd8169,0xbfe87f2eceeead12,3
+np.float64,0x7fb67161b42ce2c2,0x3ff921fb54442d18,3
+np.float64,0x3fdcfd998639fb33,0x3fdb38934927c096,3
+np.float64,0xffda5960bc34b2c2,0xbff921fb54442d18,3
+np.float64,0xbfe11f8c71223f19,0xbfdf71fe770c96ab,3
+np.float64,0x3fe4ac1bab695838,0x3fe25aa4517b8322,3
+np.float64,0x3f730458a02608b1,0x3f73044fabb5e999,3
+np.float64,0x3fdb14ffcdb62a00,0x3fd99ea6c241a3ed,3
+np.float64,0xbfc93208cd326410,0xbfc8e09d78b6d4db,3
+np.float64,0x19e734dc33ce8,0x19e734dc33ce8,3
+np.float64,0x3fe5e98428abd308,0x3fe336a6a085eb55,3
+np.float64,0x7fec672a1378ce53,0x3ff921fb54442d18,3
+np.float64,0x800f8bd8d4ff17b2,0x800f8bd8d4ff17b2,3
+np.float64,0xbfe5a12e4e6b425c,0xbfe30533f99d5d06,3
+np.float64,0x75a34cb0eb46a,0x75a34cb0eb46a,3
+np.float64,0x7fe1d21d16a3a439,0x3ff921fb54442d18,3
+np.float64,0x7ff0000000000000,0x3ff921fb54442d18,3
+np.float64,0xffe0f50db261ea1b,0xbff921fb54442d18,3
+np.float64,0xbfd9dc22feb3b846,0xbfd8937ec965a501,3
+np.float64,0x8009d68e48d3ad1d,0x8009d68e48d3ad1d,3
+np.float64,0xbfe2eba620e5d74c,0xbfe1164d7d273c60,3
+np.float64,0x992efa09325e0,0x992efa09325e0,3
+np.float64,0x3fdab640ea356c82,0x3fd94e20cab88db2,3
+np.float64,0x69a6f04ad34df,0x69a6f04ad34df,3
+np.float64,0x3fe397df25272fbe,0x3fe194bd1a3a6192,3
+np.float64,0xebcce9fdd799d,0xebcce9fdd799d,3
+np.float64,0x3fbb49490c369292,0x3fbb2f02eccc497d,3
+np.float64,0xffd871f980b0e3f4,0xbff921fb54442d18,3
+np.float64,0x800348f6966691ee,0x800348f6966691ee,3
+np.float64,0xbfebc270a7f784e1,0xbfe6dda8d0d80f26,3
+np.float64,0xffd6d559b1adaab4,0xbff921fb54442d18,3
+np.float64,0x3fec3635c0b86c6c,0x3fe71f420256e43e,3
+np.float64,0x7fbc82ad7039055a,0x3ff921fb54442d18,3
+np.float64,0x7f873050602e60a0,0x3ff921fb54442d18,3
+np.float64,0x3fca44b8c3348970,0x3fc9e8a1a1a2d96e,3
+np.float64,0x3fe0fc308fe1f861,0x3fdf3aeb469ea225,3
+np.float64,0x7fefc27de8bf84fb,0x3ff921fb54442d18,3
+np.float64,0x8005f3f3916be7e8,0x8005f3f3916be7e8,3
+np.float64,0xbfd4278c7c284f18,0xbfd38678988873b6,3
+np.float64,0x435eafc486bd7,0x435eafc486bd7,3
+np.float64,0xbfd01f5199203ea4,0xbfcf96631f2108a3,3
+np.float64,0xffd5ee9185abdd24,0xbff921fb54442d18,3
+np.float64,0xffedb363257b66c5,0xbff921fb54442d18,3
+np.float64,0x800d68e6e11ad1ce,0x800d68e6e11ad1ce,3
+np.float64,0xbfcf687f8e3ed100,0xbfceccb771b0d39a,3
+np.float64,0x7feb3b9ef2f6773d,0x3ff921fb54442d18,3
+np.float64,0x3fe15ec5ca62bd8c,0x3fdfd3fab9d96f81,3
+np.float64,0x10000000000000,0x10000000000000,3
+np.float64,0xd2386f81a470e,0xd2386f81a470e,3
+np.float64,0xb9feed4573fde,0xb9feed4573fde,3
+np.float64,0x3fe7ed25c9efda4c,0x3fe48b7b72db4014,3
+np.float64,0xbfe01478726028f1,0xbfddcd1f5a2efc59,3
+np.float64,0x9946d02f328da,0x9946d02f328da,3
+np.float64,0xbfe3bb67f06776d0,0xbfe1ae88aa81c5a6,3
+np.float64,0xbfd3fd8a4c27fb14,0xbfd3603982e3b78d,3
+np.float64,0xffd5c3ab912b8758,0xbff921fb54442d18,3
+np.float64,0xffd5f502b12bea06,0xbff921fb54442d18,3
+np.float64,0xbfc64981ec2c9304,0xbfc610e0382b1fa6,3
+np.float64,0xffec42e3413885c6,0xbff921fb54442d18,3
+np.float64,0x80084eb4ed109d6a,0x80084eb4ed109d6a,3
+np.float64,0xbfd17cac9fa2f95a,0xbfd112020588a4b3,3
+np.float64,0xbfd06c1359a0d826,0xbfd0134a28aa9a66,3
+np.float64,0x7fdc3d7c03b87af7,0x3ff921fb54442d18,3
+np.float64,0x7bdf5aaaf7bec,0x7bdf5aaaf7bec,3
+np.float64,0xbfee3cd966fc79b3,0xbfe83a14bc07ac3b,3
+np.float64,0x7fec910da3f9221a,0x3ff921fb54442d18,3
+np.float64,0xffb4ea667029d4d0,0xbff921fb54442d18,3
+np.float64,0x800103d7cce207b0,0x800103d7cce207b0,3
+np.float64,0x7fbb229a6c364534,0x3ff921fb54442d18,3
+np.float64,0x0,0x0,3
+np.float64,0xffd8fccd0331f99a,0xbff921fb54442d18,3
+np.float64,0xbfd0784ae1a0f096,0xbfd01ebff62e39ad,3
+np.float64,0xbfed2ec9b3ba5d93,0xbfe7a9099410bc76,3
+np.float64,0x800690b8d16d2172,0x800690b8d16d2172,3
+np.float64,0x7fc061b26520c364,0x3ff921fb54442d18,3
+np.float64,0x8007ec47054fd88f,0x8007ec47054fd88f,3
+np.float64,0x775546b6eeaa9,0x775546b6eeaa9,3
+np.float64,0x8005e00fb56bc020,0x8005e00fb56bc020,3
+np.float64,0xbfe510f8d0ea21f2,0xbfe2a16862b5a37f,3
+np.float64,0xffd87a6bf3b0f4d8,0xbff921fb54442d18,3
+np.float64,0x800906e3d0520dc8,0x800906e3d0520dc8,3
+np.float64,0x2296f000452f,0x2296f000452f,3
+np.float64,0xbfe3189fa2e63140,0xbfe1378c0e005be4,3
+np.float64,0xb4d2447f69a49,0xb4d2447f69a49,3
+np.float64,0xffd056a24a20ad44,0xbff921fb54442d18,3
+np.float64,0xbfe3b23fe4e76480,0xbfe1a7e5840fcbeb,3
+np.float64,0x80018ee270831dc6,0x80018ee270831dc6,3
+np.float64,0x800df89f245bf13e,0x800df89f245bf13e,3
+np.float64,0x3fee1409d7bc2814,0x3fe824779d133232,3
+np.float64,0xbfef8d81667f1b03,0xbfe8e85523620368,3
+np.float64,0xffd8a6519b314ca4,0xbff921fb54442d18,3
+np.float64,0x7fc7bc86f32f790d,0x3ff921fb54442d18,3
+np.float64,0xffea6159e674c2b3,0xbff921fb54442d18,3
+np.float64,0x3fe153c3fba2a788,0x3fdfc2f74769d300,3
+np.float64,0xffc4261ef3284c3c,0xbff921fb54442d18,3
+np.float64,0x7fe8a8961ff1512b,0x3ff921fb54442d18,3
+np.float64,0xbfe3fb1fd167f640,0xbfe1dc89dcb7ecdf,3
+np.float64,0x3fd88577c2b10af0,0x3fd76acc09660704,3
+np.float64,0x3fe128ec27e251d8,0x3fdf808fc7ebcd8f,3
+np.float64,0xbfed6ca7c4fad950,0xbfe7caafe9a3e213,3
+np.float64,0xbf9a3912b8347220,0xbf9a379b3349352e,3
+np.float64,0xbfd724d7bcae49b0,0xbfd6351efa2a5fc5,3
+np.float64,0xbfed59700a7ab2e0,0xbfe7c043014c694c,3
+np.float64,0x8002ad435bc55a87,0x8002ad435bc55a87,3
+np.float64,0xffe46ed345a8dda6,0xbff921fb54442d18,3
+np.float64,0x7fd2f1d1d825e3a3,0x3ff921fb54442d18,3
+np.float64,0xbfea0265e23404cc,0xbfe5d6fb3fd30464,3
+np.float64,0xbfd17e049122fc0a,0xbfd113421078bbae,3
+np.float64,0xffea03b986b40772,0xbff921fb54442d18,3
+np.float64,0x800b55331a16aa67,0x800b55331a16aa67,3
+np.float64,0xbfc6fcafbf2df960,0xbfc6be9ecd0ebc1f,3
+np.float64,0xd6a36017ad46c,0xd6a36017ad46c,3
+np.float64,0xbfe9ba86dfb3750e,0xbfe5ab840cb0ef86,3
+np.float64,0x75c4a108eb895,0x75c4a108eb895,3
+np.float64,0x8008d6bc8051ad79,0x8008d6bc8051ad79,3
+np.float64,0xbfd3dc5984a7b8b4,0xbfd341f78e0528ec,3
+np.float64,0xffe1cbb01aa39760,0xbff921fb54442d18,3
+np.float64,0x3fc7e292f52fc526,0x3fc79d0ce9365767,3
+np.float64,0xbfcbeae2bd37d5c4,0xbfcb7cb034f82467,3
+np.float64,0x8000f0c62e21e18d,0x8000f0c62e21e18d,3
+np.float64,0xbfe23d8bc6247b18,0xbfe09418ee35c3c7,3
+np.float64,0x717394bae2e73,0x717394bae2e73,3
+np.float64,0xffa2ef1cc425de40,0xbff921fb54442d18,3
+np.float64,0x3fd938c229b27184,0x3fd806900735c99d,3
+np.float64,0x800bf3ec8a77e7d9,0x800bf3ec8a77e7d9,3
+np.float64,0xffeef41dd57de83b,0xbff921fb54442d18,3
+np.float64,0x8008df97e5b1bf30,0x8008df97e5b1bf30,3
+np.float64,0xffe9ab9d0db35739,0xbff921fb54442d18,3
+np.float64,0x99ff391333fe7,0x99ff391333fe7,3
+np.float64,0x3fb864b4a630c969,0x3fb851e883ea2cf9,3
+np.float64,0x22c1230a45825,0x22c1230a45825,3
+np.float64,0xff2336fbfe467,0xff2336fbfe467,3
+np.float64,0xbfd488f4cea911ea,0xbfd3def0490f5414,3
+np.float64,0x3fa379c78426f38f,0x3fa377607370800b,3
+np.float64,0xbfb0873302210e68,0xbfb08155b78dfd53,3
+np.float64,0xbfdf9ff7c2bf3ff0,0xbfdd5f658e357ad2,3
+np.float64,0x800978719192f0e4,0x800978719192f0e4,3
+np.float64,0xbfba8759ea350eb0,0xbfba6f325013b9e5,3
+np.float64,0xbfdd3e6b06ba7cd6,0xbfdb6e472b6091b0,3
+np.float64,0x7fe0c334a7a18668,0x3ff921fb54442d18,3
+np.float64,0xbfeb971feb772e40,0xbfe6c4e0f61404d1,3
+np.float64,0x3fe2a50968e54a13,0x3fe0e1c8b8d96e85,3
+np.float64,0x800fa9c5515f538b,0x800fa9c5515f538b,3
+np.float64,0x800f8532fbbf0a66,0x800f8532fbbf0a66,3
+np.float64,0x167d6f1e2cfaf,0x167d6f1e2cfaf,3
+np.float64,0xffee88e769fd11ce,0xbff921fb54442d18,3
+np.float64,0xbfeecc8529fd990a,0xbfe885520cdad8ea,3
+np.float64,0xffefffffffffffff,0xbff921fb54442d18,3
+np.float64,0xbfef6a566afed4ad,0xbfe8d6767b4c4235,3
+np.float64,0xffec12415af82482,0xbff921fb54442d18,3
+np.float64,0x3678a20a6cf15,0x3678a20a6cf15,3
+np.float64,0xffe468d54ee8d1aa,0xbff921fb54442d18,3
+np.float64,0x800ad6006795ac01,0x800ad6006795ac01,3
+np.float64,0x8001d5b61063ab6d,0x8001d5b61063ab6d,3
+np.float64,0x800dfcd1863bf9a3,0x800dfcd1863bf9a3,3
+np.float64,0xc9fbff6f93f80,0xc9fbff6f93f80,3
+np.float64,0xffe55c20f9eab842,0xbff921fb54442d18,3
+np.float64,0xbfcb596b6536b2d8,0xbfcaf1b339c5c615,3
+np.float64,0xbfe092689ea124d1,0xbfde94fa58946e51,3
+np.float64,0x3fe9ec733af3d8e6,0x3fe5c9bf5dee2623,3
+np.float64,0x3fe30f3d83261e7b,0x3fe1309fd6620e03,3
+np.float64,0xffd31d7f84263b00,0xbff921fb54442d18,3
+np.float64,0xbfe88d2d3e711a5a,0xbfe4f12b5a136178,3
+np.float64,0xffc81e4ce1303c98,0xbff921fb54442d18,3
+np.float64,0xffe5b96ebfab72dd,0xbff921fb54442d18,3
+np.float64,0x512f0502a25e1,0x512f0502a25e1,3
+np.float64,0x7fa3a376982746ec,0x3ff921fb54442d18,3
+np.float64,0x80005b5f2f60b6bf,0x80005b5f2f60b6bf,3
+np.float64,0xc337cc69866fa,0xc337cc69866fa,3
+np.float64,0x3fe7719c4caee339,0x3fe43bab42b19e64,3
+np.float64,0x7fde7ec1d93cfd83,0x3ff921fb54442d18,3
+np.float64,0x3fd2f38f3825e71e,0x3fd26cc7b1dd0acb,3
+np.float64,0x7fce298b993c5316,0x3ff921fb54442d18,3
+np.float64,0x56ae3b2cad5c8,0x56ae3b2cad5c8,3
+np.float64,0x3fe9299f2bf2533e,0x3fe552bddd999e72,3
+np.float64,0x7feff3a4823fe748,0x3ff921fb54442d18,3
+np.float64,0xbfd05c670aa0b8ce,0xbfd00494d78e9e97,3
+np.float64,0xffe745323eae8a64,0xbff921fb54442d18,3
diff --git a/numpy/core/tests/data/umath-validation-set-arctanh.csv b/numpy/core/tests/data/umath-validation-set-arctanh.csv
new file mode 100644 (file)
index 0000000..a655269
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0x3ee82930,0x3efa60fd,2
+np.float32,0x3f0aa640,0x3f1b3e13,2
+np.float32,0x3ec1a21c,0x3ecbbf8d,2
+np.float32,0x3cdb1740,0x3cdb24a1,2
+np.float32,0xbf28b6f3,0xbf4a86ac,2
+np.float32,0xbe490dcc,0xbe4bb2eb,2
+np.float32,0x80000001,0x80000001,2
+np.float32,0xbf44f9dd,0xbf826ce1,2
+np.float32,0xbf1d66c4,0xbf37786b,2
+np.float32,0x3f0ad26a,0x3f1b7c9b,2
+np.float32,0x3f7b6c54,0x4016aab0,2
+np.float32,0xbf715bb8,0xbfe1a0bc,2
+np.float32,0xbee8a562,0xbefafd6a,2
+np.float32,0x3db94d00,0x3db9cf16,2
+np.float32,0x3ee2970c,0x3ef368b3,2
+np.float32,0x3f3f8614,0x3f77fdca,2
+np.float32,0xbf1fb5f0,0xbf3b3789,2
+np.float32,0x3f798dc0,0x400b96bb,2
+np.float32,0x3e975d64,0x3e9c0573,2
+np.float32,0xbe3f1908,0xbe415d1f,2
+np.float32,0x3f2cea38,0x3f52192e,2
+np.float32,0x3e82f1ac,0x3e85eaa1,2
+np.float32,0x3eab6b30,0x3eb24acd,2
+np.float32,0xbe9bb90c,0xbea0cf5f,2
+np.float32,0xbf43e847,0xbf81202f,2
+np.float32,0xbd232fa0,0xbd2345c0,2
+np.float32,0xbbabbc00,0xbbabbc67,2
+np.float32,0xbf0b2975,0xbf1bf808,2
+np.float32,0xbef5ab0a,0xbf05d305,2
+np.float32,0x3f2cad16,0x3f51a8e2,2
+np.float32,0xbef75940,0xbf06eb08,2
+np.float32,0xbf0c1216,0xbf1d4325,2
+np.float32,0x3e7bdc08,0x3e8090c2,2
+np.float32,0x3da14e10,0x3da1a3c5,2
+np.float32,0x3f627412,0x3fb2bf21,2
+np.float32,0xbd6d08c0,0xbd6d4ca0,2
+np.float32,0x3f3e2368,0x3f74df8b,2
+np.float32,0xbe0df104,0xbe0edc77,2
+np.float32,0x3e8a265c,0x3e8da833,2
+np.float32,0xbdccdbb0,0xbdcd8ba8,2
+np.float32,0x3eb080c4,0x3eb80a44,2
+np.float32,0x3e627800,0x3e6645fe,2
+np.float32,0xbd8be0b0,0xbd8c1886,2
+np.float32,0xbf3282ac,0xbf5cae8c,2
+np.float32,0xbe515910,0xbe545707,2
+np.float32,0xbf2e64ac,0xbf54d637,2
+np.float32,0x3e0fc230,0x3e10b6de,2
+np.float32,0x3eb13ca0,0x3eb8df94,2
+np.float32,0x3f07a3ca,0x3f170572,2
+np.float32,0x3f2c7026,0x3f513935,2
+np.float32,0x3f3c4ec8,0x3f70d67c,2
+np.float32,0xbee9cce8,0xbefc724f,2
+np.float32,0xbe53ca60,0xbe56e3f3,2
+np.float32,0x3dd9e9a0,0x3ddabd98,2
+np.float32,0x3f38b8d4,0x3f69319b,2
+np.float32,0xbe176dc4,0xbe188c1d,2
+np.float32,0xbf322f2e,0xbf5c0c51,2
+np.float32,0xbe9b8676,0xbea097a2,2
+np.float32,0xbca44280,0xbca44823,2
+np.float32,0xbe2b0248,0xbe2ca036,2
+np.float32,0x3d101e80,0x3d102dbd,2
+np.float32,0xbf4eb610,0xbf8f526d,2
+np.float32,0xbec32a50,0xbecd89d1,2
+np.float32,0x3d549100,0x3d54c1ee,2
+np.float32,0x3f78e55e,0x40087025,2
+np.float32,0x3e592798,0x3e5c802d,2
+np.float32,0x3de045d0,0x3de12cfb,2
+np.float32,0xbdad28e0,0xbdad92f7,2
+np.float32,0x3e9a69e0,0x3e9f5e59,2
+np.float32,0x3e809778,0x3e836716,2
+np.float32,0xbf3278d9,0xbf5c9b6d,2
+np.float32,0x3f39fa00,0x3f6bd4a5,2
+np.float32,0xbec8143c,0xbed34ffa,2
+np.float32,0x3ddb7f40,0x3ddc57e6,2
+np.float32,0x3f0e8342,0x3f20c634,2
+np.float32,0x3f353dda,0x3f6213a4,2
+np.float32,0xbe96b400,0xbe9b4bea,2
+np.float32,0x3e626580,0x3e66328a,2
+np.float32,0xbde091c8,0xbde179df,2
+np.float32,0x3eb47b5c,0x3ebc91ca,2
+np.float32,0xbf282182,0xbf497f2f,2
+np.float32,0x3ea9f64c,0x3eb0a748,2
+np.float32,0x3f28dd4e,0x3f4aca86,2
+np.float32,0xbf71de18,0xbfe3f587,2
+np.float32,0x7fa00000,0x7fe00000,2
+np.float32,0xbf6696a6,0xbfbcf11a,2
+np.float32,0xbc853ae0,0xbc853de2,2
+np.float32,0xbeced246,0xbedb51b8,2
+np.float32,0x3f3472a4,0x3f607e00,2
+np.float32,0xbee90124,0xbefb7117,2
+np.float32,0x3eb45b90,0x3ebc6d7c,2
+np.float32,0xbe53ead0,0xbe5705d6,2
+np.float32,0x3f630c80,0x3fb420e2,2
+np.float32,0xbf408cd0,0xbf7a56a2,2
+np.float32,0x3dda4ed0,0x3ddb23f1,2
+np.float32,0xbf37ae88,0xbf67096b,2
+np.float32,0xbdd48c28,0xbdd550c9,2
+np.float32,0xbf5745b0,0xbf9cb4a4,2
+np.float32,0xbf44e6fc,0xbf8255c1,2
+np.float32,0x3f5c8e6a,0x3fa65020,2
+np.float32,0xbea45fe8,0xbeaa6630,2
+np.float32,0x3f08bdee,0x3f188ef5,2
+np.float32,0x3ec77e74,0x3ed29f4b,2
+np.float32,0xbf1a1d3c,0xbf324029,2
+np.float32,0x3cad7340,0x3cad79e3,2
+np.float32,0xbf4fac2e,0xbf90b72a,2
+np.float32,0x3f58516e,0x3f9e8330,2
+np.float32,0x3f442008,0x3f816391,2
+np.float32,0xbf6e0c6c,0xbfd42854,2
+np.float32,0xbf266f7a,0xbf4689b2,2
+np.float32,0x3eb7e2f0,0x3ec077ba,2
+np.float32,0xbf320fd0,0xbf5bcf83,2
+np.float32,0xbf6a76b9,0xbfc80a11,2
+np.float32,0xbf2a91b4,0xbf4dd526,2
+np.float32,0x3f176e30,0x3f2e150e,2
+np.float32,0xbdcccad0,0xbdcd7a9c,2
+np.float32,0x3f60a8a4,0x3faebbf7,2
+np.float32,0x3d9706f0,0x3d974d40,2
+np.float32,0x3ef3cd34,0x3f049d58,2
+np.float32,0xbf73c615,0xbfed79fe,2
+np.float32,0x3df1b170,0x3df2d31b,2
+np.float32,0x3f632a46,0x3fb466c7,2
+np.float32,0xbf3ea18e,0xbf75f9ce,2
+np.float32,0xbf3ea05c,0xbf75f71f,2
+np.float32,0xbdd76750,0xbdd83403,2
+np.float32,0xbca830c0,0xbca836cd,2
+np.float32,0x3f1d4162,0x3f373c59,2
+np.float32,0x3c115700,0x3c1157fa,2
+np.float32,0x3dae8ab0,0x3daef758,2
+np.float32,0xbcad5020,0xbcad56bf,2
+np.float32,0x3ee299c4,0x3ef36c15,2
+np.float32,0xbf7f566c,0xc054c3bd,2
+np.float32,0x3f0cc698,0x3f1e4557,2
+np.float32,0xbe75c648,0xbe7aaa04,2
+np.float32,0x3ea29238,0x3ea86417,2
+np.float32,0x3f09d9c0,0x3f1a1d61,2
+np.float32,0x3f67275c,0x3fbe74b3,2
+np.float32,0x3e1a4e18,0x3e1b7d3a,2
+np.float32,0xbef6e3fc,0xbf069e98,2
+np.float32,0xbf6038ac,0xbfadc9fd,2
+np.float32,0xbe46bdd4,0xbe494b7f,2
+np.float32,0xbf4df1f4,0xbf8e3a98,2
+np.float32,0x3d094dc0,0x3d095aed,2
+np.float32,0x3f44c7d2,0x3f822fa3,2
+np.float32,0xbea30816,0xbea8e737,2
+np.float32,0xbe3c27c4,0xbe3e511b,2
+np.float32,0x3f3bb47c,0x3f6f8789,2
+np.float32,0xbe423760,0xbe4498c3,2
+np.float32,0x3ece1a74,0x3eda7634,2
+np.float32,0x3f14d1f6,0x3f2a1a89,2
+np.float32,0xbf4d9e8f,0xbf8dc4c1,2
+np.float32,0xbe92968e,0xbe96cd7f,2
+np.float32,0x3e99e6c0,0x3e9ece26,2
+np.float32,0xbf397361,0xbf6ab878,2
+np.float32,0xbf4fcea4,0xbf90e99f,2
+np.float32,0x3de37640,0x3de46779,2
+np.float32,0x3eb1b604,0x3eb9698c,2
+np.float32,0xbf52d0a2,0xbf957361,2
+np.float32,0xbe20435c,0xbe21975a,2
+np.float32,0x3f437a58,0x3f809bf1,2
+np.float32,0x3f27d1cc,0x3f48f335,2
+np.float32,0x3f7d4ff2,0x4027d1e2,2
+np.float32,0xbef732e4,0xbf06d205,2
+np.float32,0x3f4a0ae6,0x3f88e18e,2
+np.float32,0x3f800000,0x7f800000,2
+np.float32,0x3e3e56a0,0x3e4093ba,2
+np.float32,0xbed2fcfa,0xbee0517d,2
+np.float32,0xbe0e0114,0xbe0eecd7,2
+np.float32,0xbe808574,0xbe8353db,2
+np.float32,0x3f572e2a,0x3f9c8c86,2
+np.float32,0x80800000,0x80800000,2
+np.float32,0x3f3f3c82,0x3f775703,2
+np.float32,0xbf6e2482,0xbfd4818b,2
+np.float32,0xbf3943b0,0xbf6a5439,2
+np.float32,0x3f6e42ac,0x3fd4f1ea,2
+np.float32,0x3eb676c4,0x3ebed619,2
+np.float32,0xbe5e56c4,0xbe61ef6c,2
+np.float32,0x3eea200c,0x3efcdb65,2
+np.float32,0x3e3d2c78,0x3e3f5ef8,2
+np.float32,0xbdfd8fb0,0xbdfede71,2
+np.float32,0xbee69c8a,0xbef86e89,2
+np.float32,0x3e9efca0,0x3ea46a1c,2
+np.float32,0x3e4c2498,0x3e4ee9ee,2
+np.float32,0xbf3cc93c,0xbf71e21d,2
+np.float32,0x3ee0d77c,0x3ef13d2b,2
+np.float32,0xbefbcd2a,0xbf09d6a3,2
+np.float32,0x3f6dbe5c,0x3fd30a3e,2
+np.float32,0x3dae63e0,0x3daed03f,2
+np.float32,0xbd5001e0,0xbd502fb9,2
+np.float32,0x3f59632a,0x3fa067c8,2
+np.float32,0x3f0d355a,0x3f1ee452,2
+np.float32,0x3f2cbe5c,0x3f51c896,2
+np.float32,0x3c5e6e80,0x3c5e7200,2
+np.float32,0xbe8ac49c,0xbe8e52f0,2
+np.float32,0x3f54e576,0x3f98c0e6,2
+np.float32,0xbeaa0762,0xbeb0ba7c,2
+np.float32,0x3ec81e88,0x3ed35c21,2
+np.float32,0x3f5a6738,0x3fa23fb6,2
+np.float32,0xbf24a682,0xbf43784a,2
+np.float32,0x1,0x1,2
+np.float32,0x3ee6bc24,0x3ef89630,2
+np.float32,0x3f19444a,0x3f30ecf5,2
+np.float32,0x3ec1fc70,0x3ecc28fc,2
+np.float32,0xbf706e14,0xbfdd92fb,2
+np.float32,0x3eccb630,0x3ed8cd98,2
+np.float32,0xbcdf7aa0,0xbcdf88d3,2
+np.float32,0xbe450da8,0xbe478a8e,2
+np.float32,0x3ec9c210,0x3ed54c0b,2
+np.float32,0xbf3b86ca,0xbf6f24d1,2
+np.float32,0x3edcc7a0,0x3eec3a5c,2
+np.float32,0x3f075d5c,0x3f16a39a,2
+np.float32,0xbf5719ce,0xbf9c69de,2
+np.float32,0x3f62cb22,0x3fb3885a,2
+np.float32,0x3f639216,0x3fb55c93,2
+np.float32,0xbf473ee7,0xbf85413a,2
+np.float32,0xbf01b66c,0xbf0eea86,2
+np.float32,0x3e872d80,0x3e8a74f8,2
+np.float32,0xbf60957e,0xbfae925c,2
+np.float32,0xbf6847b2,0xbfc1929b,2
+np.float32,0x3f78bb94,0x4007b363,2
+np.float32,0xbf47efdb,0xbf8622db,2
+np.float32,0xbe1f2308,0xbe206fd6,2
+np.float32,0xbf414926,0xbf7c0a7e,2
+np.float32,0x3eecc268,0x3f00194d,2
+np.float32,0x3eb086d0,0x3eb81120,2
+np.float32,0xbef1af80,0xbf033ff5,2
+np.float32,0xbf454e56,0xbf82d4aa,2
+np.float32,0x3e622560,0x3e65ef20,2
+np.float32,0x3f50d2b2,0x3f926a83,2
+np.float32,0x3eb2c45c,0x3eba9d2c,2
+np.float32,0x3e42d1a0,0x3e4538c9,2
+np.float32,0xbf24cc5c,0xbf43b8e3,2
+np.float32,0x3e8c6464,0x3e90141a,2
+np.float32,0xbf3abff2,0xbf6d79c5,2
+np.float32,0xbec8f2e6,0xbed456fa,2
+np.float32,0xbf787b38,0xc00698b4,2
+np.float32,0xbf58d5cd,0xbf9f6c03,2
+np.float32,0x3df4ee20,0x3df61ba8,2
+np.float32,0xbf34581e,0xbf604951,2
+np.float32,0xbeba5cf4,0xbec35119,2
+np.float32,0xbf76c22d,0xbfffc51c,2
+np.float32,0x3ef63b2c,0x3f0630b4,2
+np.float32,0x3eeadb64,0x3efdc877,2
+np.float32,0x3dfd8c70,0x3dfedb24,2
+np.float32,0x3f441600,0x3f81576d,2
+np.float32,0x3f23a0d8,0x3f41bbf6,2
+np.float32,0x3cb84d40,0x3cb85536,2
+np.float32,0xbf25cb5c,0xbf456e38,2
+np.float32,0xbc108540,0xbc108636,2
+np.float32,0xbc5b9140,0xbc5b949e,2
+np.float32,0xbf62ff40,0xbfb401dd,2
+np.float32,0x3e8e0710,0x3e91d93e,2
+np.float32,0x3f1b6ae0,0x3f344dfd,2
+np.float32,0xbf4dbbbe,0xbf8dedea,2
+np.float32,0x3f1a5fb2,0x3f32a880,2
+np.float32,0xbe56bd00,0xbe59f8cb,2
+np.float32,0xbf490a5c,0xbf87902d,2
+np.float32,0xbf513072,0xbf92f717,2
+np.float32,0x3e73ee28,0x3e78b542,2
+np.float32,0x3f0a4c7a,0x3f1abf2c,2
+np.float32,0x3e10d5c8,0x3e11d00b,2
+np.float32,0xbf771aac,0xc001207e,2
+np.float32,0x3efe2f54,0x3f0b6a46,2
+np.float32,0xbea5f3ea,0xbeac291f,2
+np.float32,0xbf1a73e8,0xbf32c845,2
+np.float32,0x3ebcc82c,0x3ec61c4f,2
+np.float32,0xbf24f492,0xbf43fd9a,2
+np.float32,0x3ecbd908,0x3ed7c691,2
+np.float32,0x3f461c5e,0x3f83d3f0,2
+np.float32,0x3eed0524,0x3f0043c1,2
+np.float32,0x3d06e840,0x3d06f4bf,2
+np.float32,0x3eb6c974,0x3ebf34d7,2
+np.float32,0xbf1c85e1,0xbf36100f,2
+np.float32,0x3ed697d0,0x3ee4ad04,2
+np.float32,0x3eab0484,0x3eb1d733,2
+np.float32,0xbf3b02f2,0xbf6e0935,2
+np.float32,0xbeeab154,0xbefd9334,2
+np.float32,0xbf695372,0xbfc49881,2
+np.float32,0x3e8aaa7c,0x3e8e36be,2
+np.float32,0xbf208754,0xbf3c8f7b,2
+np.float32,0xbe0dbf28,0xbe0ea9a1,2
+np.float32,0x3ca780c0,0x3ca786ba,2
+np.float32,0xbeb320b4,0xbebb065e,2
+np.float32,0x3f13c698,0x3f288821,2
+np.float32,0xbe8cbbec,0xbe9072c4,2
+np.float32,0x3f1ed534,0x3f39c8df,2
+np.float32,0x3e1ca450,0x3e1de190,2
+np.float32,0x3f54be1c,0x3f988134,2
+np.float32,0x3f34e4ee,0x3f6161b4,2
+np.float32,0xbf7e6913,0xc038b246,2
+np.float32,0x3d3c3f20,0x3d3c6119,2
+np.float32,0x3ca9dc80,0x3ca9e2bc,2
+np.float32,0xbf577ea2,0xbf9d161a,2
+np.float32,0xbedb22c8,0xbeea3644,2
+np.float32,0x3f22a044,0x3f400bfa,2
+np.float32,0xbe214b8c,0xbe22a637,2
+np.float32,0x3e8cd300,0x3e908bbc,2
+np.float32,0xbec4d214,0xbecf7a58,2
+np.float32,0x3e9399a4,0x3e97e7e4,2
+np.float32,0xbee6a1a2,0xbef874ed,2
+np.float32,0xbf323742,0xbf5c1bfd,2
+np.float32,0x3f48b882,0x3f8725ac,2
+np.float32,0xbf4d4dba,0xbf8d532e,2
+np.float32,0xbf59640a,0xbfa0695a,2
+np.float32,0xbf2ad562,0xbf4e4f03,2
+np.float32,0x3e317d98,0x3e334d03,2
+np.float32,0xbf6a5b71,0xbfc7b5a2,2
+np.float32,0x3e87b434,0x3e8b05cf,2
+np.float32,0xbf1c344c,0xbf358dee,2
+np.float32,0x3e449428,0x3e470c65,2
+np.float32,0xbf2c0f2f,0xbf508808,2
+np.float32,0xbec5b5ac,0xbed0859c,2
+np.float32,0xbf4aa956,0xbf89b4b1,2
+np.float32,0x3f6dd374,0x3fd35717,2
+np.float32,0x3f45f76c,0x3f83a5ef,2
+np.float32,0xbed1fba8,0xbedf1bd5,2
+np.float32,0xbd26b2d0,0xbd26ca66,2
+np.float32,0xbe9817c2,0xbe9cd1c3,2
+np.float32,0x3e725988,0x3e770875,2
+np.float32,0xbf1a8ded,0xbf32f132,2
+np.float32,0xbe695860,0xbe6d83d3,2
+np.float32,0x3d8cecd0,0x3d8d25ea,2
+np.float32,0x3f574706,0x3f9cb6ec,2
+np.float32,0xbf5c5a1f,0xbfa5eaf3,2
+np.float32,0x3e7a7c88,0x3e7fab83,2
+np.float32,0xff800000,0xffc00000,2
+np.float32,0x3f66396a,0x3fbbfbb0,2
+np.float32,0x3ed6e588,0x3ee50b53,2
+np.float32,0xbb56d500,0xbb56d532,2
+np.float32,0x3ebd23fc,0x3ec6869a,2
+np.float32,0xbf70d490,0xbfdf4af5,2
+np.float32,0x3e514f88,0x3e544d15,2
+np.float32,0x3e660f98,0x3e6a0dac,2
+np.float32,0xbf034da1,0xbf1110bb,2
+np.float32,0xbf60d9be,0xbfaf2714,2
+np.float32,0x3df67b10,0x3df7ae64,2
+np.float32,0xbeeedc0a,0xbf017010,2
+np.float32,0xbe149224,0xbe15a072,2
+np.float32,0x3f455084,0x3f82d759,2
+np.float32,0x3f210f9e,0x3f3d7093,2
+np.float32,0xbeaea3e0,0xbeb5edd3,2
+np.float32,0x3e0724b0,0x3e07efad,2
+np.float32,0x3f09a784,0x3f19d6ac,2
+np.float32,0xbf044340,0xbf125ee8,2
+np.float32,0xbf71adc9,0xbfe315fe,2
+np.float32,0x3efd3870,0x3f0ac6a8,2
+np.float32,0xbf53c7a6,0xbf96f6df,2
+np.float32,0xbf3cf784,0xbf7247af,2
+np.float32,0x3e0ce9e0,0x3e0dd035,2
+np.float32,0xbd3051a0,0xbd306d89,2
+np.float32,0x3ecab804,0x3ed66f77,2
+np.float32,0x3e984350,0x3e9d0189,2
+np.float32,0x3edd1c00,0x3eeca20b,2
+np.float32,0xbe8e22a0,0xbe91f71b,2
+np.float32,0x3ebebc18,0x3ec85fd6,2
+np.float32,0xba275c00,0xba275c01,2
+np.float32,0x3f1d8190,0x3f37a385,2
+np.float32,0x3f17343e,0x3f2dbbfe,2
+np.float32,0x3caa8000,0x3caa864e,2
+np.float32,0x3e7a7308,0x3e7fa168,2
+np.float32,0x3f7359a6,0x3feb3e1a,2
+np.float32,0xbf7ad15a,0xc012a743,2
+np.float32,0xbf122efb,0xbf262812,2
+np.float32,0xbf03ba04,0xbf11a3fa,2
+np.float32,0x3ed7a90c,0x3ee5f8d4,2
+np.float32,0xbe23e318,0xbe254eed,2
+np.float32,0xbe2866f4,0xbe29f20a,2
+np.float32,0xbeaedff2,0xbeb631d0,2
+np.float32,0x0,0x0,2
+np.float32,0x3ef2a034,0x3f03dafd,2
+np.float32,0x3f35806c,0x3f62994e,2
+np.float32,0xbf655e19,0xbfb9c718,2
+np.float32,0x3f5d54ce,0x3fa7d4f4,2
+np.float32,0x3f33e64a,0x3f5f67e3,2
+np.float32,0x3ebf4010,0x3ec8f923,2
+np.float32,0xbe050dc8,0xbe05cf70,2
+np.float32,0x3f61693e,0x3fb063b0,2
+np.float32,0xbd94ac00,0xbd94ef12,2
+np.float32,0x3e9de008,0x3ea32f61,2
+np.float32,0xbe3d042c,0xbe3f3540,2
+np.float32,0x3e8fdfc0,0x3e93d9e4,2
+np.float32,0x3f28bc48,0x3f4a9019,2
+np.float32,0x3edea928,0x3eee8b09,2
+np.float32,0xbf05f673,0xbf14b362,2
+np.float32,0xbf360730,0xbf63a914,2
+np.float32,0xbe3fb454,0xbe41fe0a,2
+np.float32,0x3f6d99a8,0x3fd28552,2
+np.float32,0xbf3ae866,0xbf6dd052,2
+np.float32,0x3f5b1164,0x3fa37aec,2
+np.float32,0xbf64a451,0xbfb7f61b,2
+np.float32,0xbdd79bd0,0xbdd86919,2
+np.float32,0x3e89fc00,0x3e8d7a85,2
+np.float32,0x3f4bf690,0x3f8b77ea,2
+np.float32,0x3cbdf280,0x3cbdfb38,2
+np.float32,0x3f138f98,0x3f2835b4,2
+np.float32,0xbe33967c,0xbe3576bc,2
+np.float32,0xbf298164,0xbf4bedda,2
+np.float32,0x3e9955cc,0x3e9e2edb,2
+np.float32,0xbf79b383,0xc00c56c0,2
+np.float32,0x3ea0834c,0x3ea61aea,2
+np.float32,0xbf511184,0xbf92c89a,2
+np.float32,0x3f4d9fba,0x3f8dc666,2
+np.float32,0x3f3387c2,0x3f5ead80,2
+np.float32,0x3e3f7360,0x3e41babb,2
+np.float32,0xbf3cc4d6,0xbf71d879,2
+np.float32,0x3f2e4402,0x3f54994e,2
+np.float32,0x3e6a7118,0x3e6eabff,2
+np.float32,0xbf05d83e,0xbf1489cc,2
+np.float32,0xbdce4fd8,0xbdcf039a,2
+np.float32,0xbf03e2f4,0xbf11dbaf,2
+np.float32,0x3f1ea0a0,0x3f397375,2
+np.float32,0x3f7aff54,0x4013cb1b,2
+np.float32,0x3f5ef158,0x3fab1801,2
+np.float32,0xbe33bcc8,0xbe359e40,2
+np.float32,0xbf04dd0e,0xbf133111,2
+np.float32,0xbf14f887,0xbf2a54d1,2
+np.float32,0x3f75c37a,0x3ff9196e,2
+np.float32,0x3f35c3c8,0x3f6320f2,2
+np.float32,0x3f53bb94,0x3f96e3c3,2
+np.float32,0x3f4d473e,0x3f8d4a19,2
+np.float32,0xbdfe19e0,0xbdff6ac9,2
+np.float32,0xbf7f0cc4,0xc049342d,2
+np.float32,0xbdbfc778,0xbdc057bb,2
+np.float32,0xbf7575b7,0xbff73067,2
+np.float32,0xbe9df488,0xbea34609,2
+np.float32,0xbefbd3c6,0xbf09daff,2
+np.float32,0x3f19962c,0x3f316cbd,2
+np.float32,0x3f7acec6,0x40129732,2
+np.float32,0xbf5db7de,0xbfa89a21,2
+np.float32,0x3f62f444,0x3fb3e830,2
+np.float32,0xbf522adb,0xbf94737f,2
+np.float32,0xbef6ceb2,0xbf0690ba,2
+np.float32,0xbf57c41e,0xbf9d8db0,2
+np.float32,0x3eb3360c,0x3ebb1eb0,2
+np.float32,0x3f29327e,0x3f4b618e,2
+np.float32,0xbf08d099,0xbf18a916,2
+np.float32,0x3ea21014,0x3ea7d369,2
+np.float32,0x3f39e516,0x3f6ba861,2
+np.float32,0x3e7c4f28,0x3e80ce08,2
+np.float32,0xbec5a7f8,0xbed07582,2
+np.float32,0xbf0b1b46,0xbf1be3e7,2
+np.float32,0xbef0e0ec,0xbf02bb2e,2
+np.float32,0x3d835a30,0x3d838869,2
+np.float32,0x3f08aa40,0x3f18736e,2
+np.float32,0x3eb0e4c8,0x3eb87bcd,2
+np.float32,0x3eb3821c,0x3ebb7564,2
+np.float32,0xbe3a7320,0xbe3c8d5a,2
+np.float32,0x3e43f8c0,0x3e466b10,2
+np.float32,0x3e914288,0x3e955b69,2
+np.float32,0x3ec7d800,0x3ed308e7,2
+np.float32,0x3e603df8,0x3e63eef2,2
+np.float32,0x3f225cac,0x3f3f9ac6,2
+np.float32,0x3e3db8f0,0x3e3ff06b,2
+np.float32,0x3f358d78,0x3f62b38c,2
+np.float32,0xbed9bd64,0xbee88158,2
+np.float32,0x800000,0x800000,2
+np.float32,0x3f1adfce,0x3f337230,2
+np.float32,0xbefdc346,0xbf0b229d,2
+np.float32,0xbf091018,0xbf190208,2
+np.float32,0xbf800000,0xff800000,2
+np.float32,0x3f27c2c4,0x3f48d8db,2
+np.float32,0x3ef59c80,0x3f05c993,2
+np.float32,0x3e18a340,0x3e19c893,2
+np.float32,0x3f209610,0x3f3ca7c5,2
+np.float32,0x3f69cc22,0x3fc60087,2
+np.float32,0xbf66cf07,0xbfbd8721,2
+np.float32,0xbf768098,0xbffdfcc4,2
+np.float32,0x3df27a40,0x3df39ec4,2
+np.float32,0x3daf5bd0,0x3dafca02,2
+np.float32,0x3f53f2be,0x3f973b41,2
+np.float32,0xbf7edcbc,0xc0436ce3,2
+np.float32,0xbdf61db8,0xbdf74fae,2
+np.float32,0x3e2c9328,0x3e2e3cb2,2
+np.float32,0x3f1a4570,0x3f327f41,2
+np.float32,0xbf766306,0xbffd32f1,2
+np.float32,0xbf468b9d,0xbf845f0f,2
+np.float32,0x3e398970,0x3e3b9bb1,2
+np.float32,0xbbefa900,0xbbefaa18,2
+np.float32,0xbf54c989,0xbf9893ad,2
+np.float32,0x3f262cf6,0x3f46169d,2
+np.float32,0x3f638a8a,0x3fb54a98,2
+np.float32,0xbeb36c78,0xbebb5cb8,2
+np.float32,0xbeac4d42,0xbeb34993,2
+np.float32,0x3f1d1942,0x3f36fbf2,2
+np.float32,0xbf5d49ba,0xbfa7bf07,2
+np.float32,0xbf182b5c,0xbf2f38d0,2
+np.float32,0x3f41a742,0x3f7ce5ef,2
+np.float32,0x3f0b9a6c,0x3f1c9898,2
+np.float32,0x3e847494,0x3e8788f3,2
+np.float32,0xbde41608,0xbde50941,2
+np.float32,0x3f693944,0x3fc44b5a,2
+np.float32,0x3f0386b2,0x3f115e37,2
+np.float32,0x3f3a08b0,0x3f6bf3c1,2
+np.float32,0xbf78ee64,0xc0089977,2
+np.float32,0xbf013a11,0xbf0e436e,2
+np.float32,0x3f00668e,0x3f0d2836,2
+np.float32,0x3e6d9850,0x3e720081,2
+np.float32,0x3eacf578,0x3eb4075d,2
+np.float32,0x3f18aef8,0x3f3004b4,2
+np.float32,0x3de342f0,0x3de43385,2
+np.float32,0x3e56cee8,0x3e5a0b85,2
+np.float32,0xbf287912,0xbf4a1966,2
+np.float32,0x3e92c948,0x3e9704c2,2
+np.float32,0x3c07d080,0x3c07d14c,2
+np.float32,0xbe90f6a0,0xbe9508e0,2
+np.float32,0x3e8b4f28,0x3e8ee884,2
+np.float32,0xbf35b56c,0xbf6303ff,2
+np.float32,0xbef512b8,0xbf057027,2
+np.float32,0x3e36c630,0x3e38c0cd,2
+np.float32,0x3f0b3ca8,0x3f1c134a,2
+np.float32,0x3e4cd610,0x3e4fa2c5,2
+np.float32,0xbf5a8372,0xbfa273a3,2
+np.float32,0xbecaad3c,0xbed662ae,2
+np.float32,0xbec372d2,0xbecddeac,2
+np.float32,0x3f6fb2b2,0x3fda8a22,2
+np.float32,0x3f365f28,0x3f645b5a,2
+np.float32,0xbecd00fa,0xbed926a4,2
+np.float32,0xbebafa32,0xbec40672,2
+np.float32,0xbf235b73,0xbf4146c4,2
+np.float32,0x3f7a4658,0x400f6e2c,2
+np.float32,0x3f35e824,0x3f636a54,2
+np.float32,0x3cb87640,0x3cb87e3c,2
+np.float32,0xbf296288,0xbf4bb6ee,2
+np.float32,0x7f800000,0xffc00000,2
+np.float32,0xbf4de86e,0xbf8e2d1a,2
+np.float32,0xbf4ace12,0xbf89e5f3,2
+np.float32,0x3d65a300,0x3d65e0b5,2
+np.float32,0xbe10c534,0xbe11bf21,2
+np.float32,0xbeba3c1c,0xbec32b3e,2
+np.float32,0x3e87eaf8,0x3e8b40b8,2
+np.float32,0x3d5c3bc0,0x3d5c722d,2
+np.float32,0x3e8c14b8,0x3e8fbdf8,2
+np.float32,0xbf06c6f0,0xbf15d327,2
+np.float32,0xbe0f1e30,0xbe100f96,2
+np.float32,0xbee244b0,0xbef30251,2
+np.float32,0x3f2a21b0,0x3f4d0c1d,2
+np.float32,0xbf5f7f81,0xbfac408e,2
+np.float32,0xbe3dba2c,0xbe3ff1b2,2
+np.float32,0x3f3ffc22,0x3f790abf,2
+np.float32,0x3edc3dac,0x3eeb90fd,2
+np.float32,0x7f7fffff,0xffc00000,2
+np.float32,0x3ecfaaac,0x3edc5485,2
+np.float32,0x3f0affbe,0x3f1bbcd9,2
+np.float32,0x3f5f2264,0x3fab7dca,2
+np.float32,0x3f37394c,0x3f66186c,2
+np.float32,0xbe6b2f6c,0xbe6f74e3,2
+np.float32,0x3f284772,0x3f49c1f1,2
+np.float32,0xbdf27bc8,0xbdf3a051,2
+np.float32,0xbc8b14e0,0xbc8b184c,2
+np.float32,0x3f6a867c,0x3fc83b07,2
+np.float32,0x3f1ec876,0x3f39b429,2
+np.float32,0x3f6fd9a8,0x3fdb28d6,2
+np.float32,0xbf473cca,0xbf853e8c,2
+np.float32,0x3e23eff8,0x3e255c23,2
+np.float32,0x3ebefdfc,0x3ec8ac5d,2
+np.float32,0x3f6c8c22,0x3fced2b1,2
+np.float32,0x3f168388,0x3f2cad44,2
+np.float32,0xbece2410,0xbeda81ac,2
+np.float32,0x3f5532f0,0x3f993eea,2
+np.float32,0x3ef1938c,0x3f032dfa,2
+np.float32,0xbef05268,0xbf025fba,2
+np.float32,0x3f552e4a,0x3f993754,2
+np.float32,0x3e9ed068,0x3ea4392d,2
+np.float32,0xbe1a0c24,0xbe1b39be,2
+np.float32,0xbf2623aa,0xbf46068c,2
+np.float32,0xbe1cc300,0xbe1e00fc,2
+np.float32,0xbe9c0576,0xbea12397,2
+np.float32,0xbd827338,0xbd82a07e,2
+np.float32,0x3f0fc31a,0x3f229786,2
+np.float32,0x3e577810,0x3e5abc7d,2
+np.float32,0x3e0e1cb8,0x3e0f0906,2
+np.float32,0x3e84d344,0x3e87ee73,2
+np.float32,0xbf39c45e,0xbf6b6337,2
+np.float32,0x3edfb25c,0x3eefd273,2
+np.float32,0x3e016398,0x3e021596,2
+np.float32,0xbefeb1be,0xbf0bc0de,2
+np.float32,0x3f37e104,0x3f677196,2
+np.float32,0x3f545316,0x3f97d500,2
+np.float32,0xbefc165a,0xbf0a06ed,2
+np.float32,0xbf0923e6,0xbf191dcd,2
+np.float32,0xbf386508,0xbf68831f,2
+np.float32,0xbf3d4630,0xbf72f4e1,2
+np.float32,0x3f3dbe82,0x3f73ff13,2
+np.float32,0xbf703de4,0xbfdcc7e2,2
+np.float32,0xbf531482,0xbf95dd1a,2
+np.float32,0xbf0af1b6,0xbf1ba8f4,2
+np.float32,0xbec8fd9c,0xbed463a4,2
+np.float32,0xbe230320,0xbe24691a,2
+np.float32,0xbf7de541,0xc02faf38,2
+np.float32,0x3efd2360,0x3f0ab8b7,2
+np.float32,0x3db7f350,0x3db87291,2
+np.float32,0x3e74c510,0x3e799924,2
+np.float32,0x3da549c0,0x3da5a5fc,2
+np.float32,0x3e8a3bc4,0x3e8dbf4a,2
+np.float32,0xbf69f086,0xbfc66e84,2
+np.float32,0x3f323f8e,0x3f5c2c17,2
+np.float32,0x3ec0ae3c,0x3ecaa334,2
+np.float32,0xbebe8966,0xbec824fc,2
+np.float32,0x3f34691e,0x3f606b13,2
+np.float32,0x3f13790e,0x3f2813f5,2
+np.float32,0xbf61c027,0xbfb12618,2
+np.float32,0x3e90c690,0x3e94d4a1,2
+np.float32,0xbefce8f0,0xbf0a920e,2
+np.float32,0xbf5c0e8a,0xbfa559a7,2
+np.float32,0x3f374f60,0x3f6645b6,2
+np.float32,0x3f25f6fa,0x3f45b967,2
+np.float32,0x3f2421aa,0x3f42963a,2
+np.float32,0x3ebfa328,0x3ec96c57,2
+np.float32,0x3e3bef28,0x3e3e1685,2
+np.float32,0x3ea3fa3c,0x3ea9f4dd,2
+np.float32,0x3f362b8e,0x3f63f2b2,2
+np.float32,0xbedcef18,0xbeec6ada,2
+np.float32,0xbdd29c88,0xbdd35bd0,2
+np.float32,0x3f261aea,0x3f45f76f,2
+np.float32,0xbe62c470,0xbe66965e,2
+np.float32,0x7fc00000,0x7fc00000,2
+np.float32,0xbee991aa,0xbefc277b,2
+np.float32,0xbf571960,0xbf9c6923,2
+np.float32,0xbe6fb410,0xbe743b41,2
+np.float32,0x3eb1bed0,0x3eb9738d,2
+np.float32,0x80000000,0x80000000,2
+np.float32,0x3eddcbe4,0x3eed7a69,2
+np.float32,0xbf2a81ba,0xbf4db86d,2
+np.float32,0x3f74da54,0x3ff38737,2
+np.float32,0xbeb6bff4,0xbebf29f4,2
+np.float32,0x3f445752,0x3f81a698,2
+np.float32,0x3ed081b4,0x3edd5618,2
+np.float32,0xbee73802,0xbef931b4,2
+np.float32,0xbd13f2a0,0xbd14031c,2
+np.float32,0xbb4d1200,0xbb4d122c,2
+np.float32,0xbee8777a,0xbefac393,2
+np.float32,0x3f42047c,0x3f7dc06c,2
+np.float32,0xbd089270,0xbd089f67,2
+np.float32,0xbf628c16,0xbfb2f66b,2
+np.float32,0x3e72e098,0x3e77978d,2
+np.float32,0x3ed967cc,0x3ee818e4,2
+np.float32,0x3e284c80,0x3e29d6d9,2
+np.float32,0x3f74e8ba,0x3ff3dbef,2
+np.float32,0x3f013e86,0x3f0e4969,2
+np.float32,0xbf610d4f,0xbfaf983c,2
+np.float32,0xbf3c8d36,0xbf715eba,2
+np.float32,0xbedbc756,0xbeeaffdb,2
+np.float32,0x3e143ec8,0x3e154b4c,2
+np.float32,0xbe1c9808,0xbe1dd4fc,2
+np.float32,0xbe887a1e,0xbe8bdac5,2
+np.float32,0xbe85c4bc,0xbe88f17a,2
+np.float32,0x3f35967e,0x3f62c5b4,2
+np.float32,0x3ea2c4a4,0x3ea89c2d,2
+np.float32,0xbc8703c0,0xbc8706e1,2
+np.float32,0xbf13d52c,0xbf289dff,2
+np.float32,0xbf63bb56,0xbfb5bf29,2
+np.float32,0xbf61c5ef,0xbfb13319,2
+np.float32,0xbf128410,0xbf26a675,2
+np.float32,0x3f03fcf2,0x3f11ff13,2
+np.float32,0xbe49c924,0xbe4c75cd,2
+np.float32,0xbf211a9c,0xbf3d82c5,2
+np.float32,0x3f7e9d52,0x403d1b42,2
+np.float32,0x3edfefd4,0x3ef01e71,2
+np.float32,0x3ebc5bd8,0x3ec59efb,2
+np.float32,0x3d7b02e0,0x3d7b537f,2
+np.float32,0xbf1163ba,0xbf24fb43,2
+np.float32,0x3f5072f2,0x3f91dbf1,2
+np.float32,0xbee700ce,0xbef8ec60,2
+np.float32,0x3f534168,0x3f962359,2
+np.float32,0x3e6d6c40,0x3e71d1ef,2
+np.float32,0x3def9d70,0x3df0b7a8,2
+np.float32,0x3e89cf80,0x3e8d4a8a,2
+np.float32,0xbf687ca7,0xbfc2290f,2
+np.float32,0x3f35e134,0x3f635c51,2
+np.float32,0x3e59eef8,0x3e5d50fa,2
+np.float32,0xbf65c9e1,0xbfbada61,2
+np.float32,0xbf759292,0xbff7e43d,2
+np.float32,0x3f4635a0,0x3f83f372,2
+np.float32,0x3f29baaa,0x3f4c53f1,2
+np.float32,0x3f6b15a6,0x3fc9fe04,2
+np.float32,0x3edabc88,0x3ee9b922,2
+np.float32,0x3ef382e0,0x3f046d4d,2
+np.float32,0xbe351310,0xbe36ff7f,2
+np.float32,0xbf05c935,0xbf14751c,2
+np.float32,0xbf0e7c50,0xbf20bc24,2
+np.float32,0xbf69bc94,0xbfc5d1b8,2
+np.float32,0xbed41aca,0xbee1aa23,2
+np.float32,0x3f518c08,0x3f938162,2
+np.float32,0xbf3d7974,0xbf73661a,2
+np.float32,0x3f1951a6,0x3f3101c9,2
+np.float32,0xbeb3f436,0xbebbf787,2
+np.float32,0xbf77a190,0xc0031d43,2
+np.float32,0x3eb5b3cc,0x3ebdf6e7,2
+np.float32,0xbed534b4,0xbee2fed2,2
+np.float32,0xbe53e1b8,0xbe56fc56,2
+np.float32,0x3f679e20,0x3fbfb91c,2
+np.float32,0xff7fffff,0xffc00000,2
+np.float32,0xbf7b9bcb,0xc0180073,2
+np.float32,0xbf5635e8,0xbf9aea15,2
+np.float32,0xbe5a3318,0xbe5d9856,2
+np.float32,0xbe003284,0xbe00df9a,2
+np.float32,0x3eb119a4,0x3eb8b7d6,2
+np.float32,0xbf3bccf8,0xbf6fbc84,2
+np.float32,0x3f36f600,0x3f658ea8,2
+np.float32,0x3f1ea834,0x3f397fc2,2
+np.float32,0xbe7cfb54,0xbe8129b3,2
+np.float32,0xbe9b3746,0xbea0406a,2
+np.float32,0x3edc0f90,0x3eeb586c,2
+np.float32,0x3e1842e8,0x3e19660c,2
+np.float32,0xbd8f10b0,0xbd8f4c70,2
+np.float32,0xbf064aca,0xbf1527a2,2
+np.float32,0x3e632e58,0x3e6705be,2
+np.float32,0xbef28ba4,0xbf03cdbb,2
+np.float32,0x3f27b21e,0x3f48bbaf,2
+np.float32,0xbe6f30d4,0xbe73b06e,2
+np.float32,0x3f3e6cb0,0x3f75834b,2
+np.float32,0xbf264aa5,0xbf4649f0,2
+np.float32,0xbf690775,0xbfc3b978,2
+np.float32,0xbf3e4a38,0xbf753632,2
+np.float64,0x3fe12bbe8c62577e,0x3fe32de8e5f961b0,2
+np.float64,0x3fc9b8909b337120,0x3fca1366da00efff,2
+np.float64,0x3feaee4245f5dc84,0x3ff3a011ea0432f3,2
+np.float64,0xbfe892c000f12580,0xbff03e5adaed6f0c,2
+np.float64,0xbf9be8de4837d1c0,0xbf9beaa367756bd1,2
+np.float64,0x3fe632e58fec65cc,0x3feb5ccc5114ca38,2
+np.float64,0x3fe78a0ef7ef141e,0x3fee1b4521d8eb6c,2
+np.float64,0x3feec27a65fd84f4,0x3fff643c8318e81e,2
+np.float64,0x3fbed6efce3dade0,0x3fbefd76cff00111,2
+np.float64,0xbfe3a05fab6740c0,0xbfe6db078aeeb0ca,2
+np.float64,0x3fdca11a56b94234,0x3fdece9e6eacff1b,2
+np.float64,0x3fe0fb15aae1f62c,0x3fe2e9e095ec2089,2
+np.float64,0x3fede12abf7bc256,0x3ffafd0ff4142807,2
+np.float64,0x3feb919edcf7233e,0x3ff4c9aa0bc2432f,2
+np.float64,0x3fd39633b5a72c68,0x3fd43c2e6d5f441c,2
+np.float64,0x3fd9efcbfeb3df98,0x3fdb83f03e58f91c,2
+np.float64,0x3fe2867a36650cf4,0x3fe525858c8ce72e,2
+np.float64,0x3fdacbb8f3b59770,0x3fdc8cd431b6e3ff,2
+np.float64,0x3fcc120503382408,0x3fcc88a8fa43e1c6,2
+np.float64,0xbfd99ff4eab33fea,0xbfdb24a20ae3687d,2
+np.float64,0xbfe8caf0157195e0,0xbff083b8dd0941d3,2
+np.float64,0x3fddc9bf92bb9380,0x3fe022aac0f761d5,2
+np.float64,0x3fe2dbb66e65b76c,0x3fe5a6e7caf3f1f2,2
+np.float64,0x3fe95f5c4a72beb8,0x3ff1444697e96138,2
+np.float64,0xbfc6b163d92d62c8,0xbfc6ef6e006658a1,2
+np.float64,0x3fdf1b2616be364c,0x3fe0fcbd2848c9e8,2
+np.float64,0xbfdca1ccf7b9439a,0xbfdecf7dc0eaa663,2
+np.float64,0x3fe078d6a260f1ae,0x3fe236a7c66ef6c2,2
+np.float64,0x3fdf471bb9be8e38,0x3fe11990ec74e704,2
+np.float64,0xbfe417626be82ec5,0xbfe79c9aa5ed2e2f,2
+np.float64,0xbfeb9cf5677739eb,0xbff4dfc24c012c90,2
+np.float64,0x3f8d9142b03b2280,0x3f8d91c9559d4779,2
+np.float64,0x3fb052c67220a590,0x3fb05873c90d1cd6,2
+np.float64,0x3fd742e2c7ae85c4,0x3fd860128947d15d,2
+np.float64,0x3fec2e2a2bf85c54,0x3ff60eb554bb8d71,2
+np.float64,0xbfeb2b8bc8f65718,0xbff40b734679497a,2
+np.float64,0x3fe25f8e0d64bf1c,0x3fe4eb381d077803,2
+np.float64,0x3fe56426256ac84c,0x3fe9dafbe79370f0,2
+np.float64,0x3feecc1e5d7d983c,0x3fffa49bedc7aa25,2
+np.float64,0xbfc88ce94b3119d4,0xbfc8dbba0fdee2d2,2
+np.float64,0xbfabcf51ac379ea0,0xbfabd6552aa63da3,2
+np.float64,0xbfccc8b849399170,0xbfcd48d6ff057a4d,2
+np.float64,0x3fd2f831e8a5f064,0x3fd38e67b0dda905,2
+np.float64,0x3fcafdcd6135fb98,0x3fcb670ae2ef4d36,2
+np.float64,0x3feda6042efb4c08,0x3ffa219442ac4ea5,2
+np.float64,0x3fed382b157a7056,0x3ff8bc01bc6d10bc,2
+np.float64,0x3fed858a50fb0b14,0x3ff9b1c05cb6cc0f,2
+np.float64,0x3fcc3960653872c0,0x3fccb2045373a3d1,2
+np.float64,0xbfec5177e478a2f0,0xbff65eb4557d94eb,2
+np.float64,0x3feafe0d5e75fc1a,0x3ff3bb4a260a0dcb,2
+np.float64,0x3fe08bc87ee11790,0x3fe25078aac99d31,2
+np.float64,0xffefffffffffffff,0xfff8000000000000,2
+np.float64,0x3f79985ce0333100,0x3f799872b591d1cb,2
+np.float64,0xbfd4001cf9a8003a,0xbfd4b14b9035b94f,2
+np.float64,0x3fe54a17e6ea9430,0x3fe9ac0f18682343,2
+np.float64,0xbfb4e07fea29c100,0xbfb4ec6520dd0689,2
+np.float64,0xbfed2b6659fa56cd,0xbff895ed57dc1450,2
+np.float64,0xbfe81fc8b5f03f92,0xbfef6b95e72a7a7c,2
+np.float64,0xbfe6aced16ed59da,0xbfec4ce131ee3704,2
+np.float64,0xbfe599f30ceb33e6,0xbfea3d07c1cd78e2,2
+np.float64,0xbfe0ff278b61fe4f,0xbfe2ef8b5efa89ed,2
+np.float64,0xbfe3e9406467d281,0xbfe750e43e841736,2
+np.float64,0x3fcc6b52cf38d6a8,0x3fcce688f4fb2cf1,2
+np.float64,0xbfc890e8133121d0,0xbfc8dfdfee72d258,2
+np.float64,0x3fe46e81dbe8dd04,0x3fe82e09783811a8,2
+np.float64,0x3fd94455e5b288ac,0x3fdab7cef2de0b1f,2
+np.float64,0xbfe82151fff042a4,0xbfef6f254c9696ca,2
+np.float64,0x3fcee1ac1d3dc358,0x3fcf80a6ed07070a,2
+np.float64,0x3fcce8f90939d1f0,0x3fcd6ad18d34f8b5,2
+np.float64,0x3fd6afe56fad5fcc,0x3fd7b7567526b1fb,2
+np.float64,0x3fb1a77092234ee0,0x3fb1ae9fe0d176fc,2
+np.float64,0xbfeb758b0d76eb16,0xbff493d105652edc,2
+np.float64,0xbfb857c24e30af88,0xbfb86aa4da3be53f,2
+np.float64,0x3fe89064eff120ca,0x3ff03b7c5b3339a8,2
+np.float64,0xbfc1bd2fef237a60,0xbfc1da99893473ed,2
+np.float64,0xbfe5ad6e2eeb5adc,0xbfea60ed181b5c05,2
+np.float64,0x3fd5a66358ab4cc8,0x3fd6899e640aeb1f,2
+np.float64,0xbfe198e832e331d0,0xbfe3c8c9496d0de5,2
+np.float64,0xbfdaa5c0d7b54b82,0xbfdc5ed7d3c5ce49,2
+np.float64,0x3fcceccb6939d998,0x3fcd6ed88c2dd3a5,2
+np.float64,0xbfe44413eae88828,0xbfe7e6cd32b34046,2
+np.float64,0xbfc7cbeccf2f97d8,0xbfc8139a2626edae,2
+np.float64,0x3fbf31e4fa3e63d0,0x3fbf59c6e863255e,2
+np.float64,0x3fdf03fa05be07f4,0x3fe0ed953f7989ad,2
+np.float64,0x3fe7f4eaceefe9d6,0x3fef092ca7e2ac39,2
+np.float64,0xbfc084e9d92109d4,0xbfc09ca10fd6aaea,2
+np.float64,0xbf88cfbf70319f80,0xbf88d00effa6d897,2
+np.float64,0x7ff4000000000000,0x7ffc000000000000,2
+np.float64,0xbfa0176e9c202ee0,0xbfa018ca0a6ceef3,2
+np.float64,0xbfd88d0815b11a10,0xbfd9dfc6c6bcbe4e,2
+np.float64,0x3fe89f7730713eee,0x3ff04de52fb536f3,2
+np.float64,0xbfedc9707bfb92e1,0xbffaa25fcf9dd6da,2
+np.float64,0x3fe936d1a6726da4,0x3ff10e40c2d94bc9,2
+np.float64,0x3fdb64aec7b6c95c,0x3fdd473177317b3f,2
+np.float64,0xbfee4f9aaefc9f35,0xbffcdd212667003c,2
+np.float64,0x3fe3730067e6e600,0x3fe692b0a0babf5f,2
+np.float64,0xbfc257e58924afcc,0xbfc27871f8c218d7,2
+np.float64,0x3fe62db12dec5b62,0x3feb52c61b97d9f6,2
+np.float64,0xbfe3ff491367fe92,0xbfe774f1b3a96fd6,2
+np.float64,0x3fea43255274864a,0x3ff28b0c4b7b8d21,2
+np.float64,0xbfea37923c746f24,0xbff27962159f2072,2
+np.float64,0x3fcd0ac3c73a1588,0x3fcd8e6f8de41755,2
+np.float64,0xbfdccafde6b995fc,0xbfdf030fea8a0630,2
+np.float64,0x3fdba35268b746a4,0x3fdd94094f6f50c1,2
+np.float64,0x3fc68ea1d92d1d40,0x3fc6cb8d07cbb0e4,2
+np.float64,0xbfb88b1f6e311640,0xbfb89e7af4e58778,2
+np.float64,0xbfedc7cadffb8f96,0xbffa9c3766227956,2
+np.float64,0x3fe7928d3eef251a,0x3fee2dcf2ac7961b,2
+np.float64,0xbfeff42ede7fe85e,0xc00cef6b0f1e8323,2
+np.float64,0xbfebf07fa477e0ff,0xbff5893f99e15236,2
+np.float64,0x3fe3002ab9660056,0x3fe5defba550c583,2
+np.float64,0x3feb8f4307f71e86,0x3ff4c517ec8d6de9,2
+np.float64,0x3fd3c16f49a782e0,0x3fd46becaacf74da,2
+np.float64,0x3fc7613df12ec278,0x3fc7a52b2a3c3368,2
+np.float64,0xbfe33af560e675eb,0xbfe63a6528ff1587,2
+np.float64,0xbfde86495abd0c92,0xbfe09bd7ba05b461,2
+np.float64,0x3fe1e7fb4ee3cff6,0x3fe43b04311c0ab6,2
+np.float64,0xbfc528b6bd2a516c,0xbfc55ae0a0c184c8,2
+np.float64,0xbfd81025beb0204c,0xbfd94dd72d804613,2
+np.float64,0x10000000000000,0x10000000000000,2
+np.float64,0x3fc1151c47222a38,0x3fc12f5aad80a6bf,2
+np.float64,0x3feafa136775f426,0x3ff3b46854da0b3a,2
+np.float64,0x3fed2da0747a5b40,0x3ff89c85b658459e,2
+np.float64,0x3fda2a4b51b45498,0x3fdbca0d908ddbbd,2
+np.float64,0xbfd04cf518a099ea,0xbfd0aae0033b9e4c,2
+np.float64,0xbfb9065586320ca8,0xbfb91adb7e31f322,2
+np.float64,0xbfd830b428b06168,0xbfd973ca3c484d8d,2
+np.float64,0x3fc952f7ed32a5f0,0x3fc9a9994561fc1a,2
+np.float64,0xbfeb06c83c760d90,0xbff3ca77b326df20,2
+np.float64,0xbfeb1c98ac763931,0xbff3f0d0900f6149,2
+np.float64,0x3fdf061dbebe0c3c,0x3fe0eefb32b48d17,2
+np.float64,0xbf9acbaf28359760,0xbf9acd4024be9fec,2
+np.float64,0x3fec0adde2f815bc,0x3ff5c1628423794d,2
+np.float64,0xbfc4bc750d2978ec,0xbfc4eba43f590b94,2
+np.float64,0x3fdbe47878b7c8f0,0x3fdde44a2b500d73,2
+np.float64,0x3fe160d18162c1a4,0x3fe378cff08f18f0,2
+np.float64,0x3fc3b58dfd276b18,0x3fc3de01d3802de9,2
+np.float64,0x3fa860343430c060,0x3fa864ecd07ec962,2
+np.float64,0x3fcaebfb4b35d7f8,0x3fcb546512d1b4c7,2
+np.float64,0x3fe3fda558e7fb4a,0x3fe772412e5776de,2
+np.float64,0xbfe8169f2c702d3e,0xbfef5666c9a10f6d,2
+np.float64,0x3feda78e9efb4f1e,0x3ffa270712ded769,2
+np.float64,0xbfda483161b49062,0xbfdbedfbf2e850ba,2
+np.float64,0x3fd7407cf3ae80f8,0x3fd85d4f52622743,2
+np.float64,0xbfd63de4d4ac7bca,0xbfd73550a33e3c32,2
+np.float64,0xbfd9c30b90b38618,0xbfdb4e7695c856f3,2
+np.float64,0x3fcd70c00b3ae180,0x3fcdfa0969e0a119,2
+np.float64,0x3feb4f127f769e24,0x3ff44bf42514e0f4,2
+np.float64,0xbfec1db44af83b69,0xbff5ea54aed1f8e9,2
+np.float64,0x3fd68ff051ad1fe0,0x3fd792d0ed6d6122,2
+np.float64,0x3fe0a048a5614092,0x3fe26c80a826b2a2,2
+np.float64,0x3fd59f3742ab3e70,0x3fd6818563fcaf80,2
+np.float64,0x3fca26ecf9344dd8,0x3fca867ceb5d7ba8,2
+np.float64,0x3fdc1d547ab83aa8,0x3fde2a9cea866484,2
+np.float64,0xbfc78df6312f1bec,0xbfc7d3719b698a39,2
+np.float64,0x3fe754e72b6ea9ce,0x3feda89ea844a2e5,2
+np.float64,0x3fe740c1a4ee8184,0x3fed7dc56ec0c425,2
+np.float64,0x3fe77566a9eeeace,0x3fedee6f408df6de,2
+np.float64,0xbfbbf5bf8e37eb80,0xbfbc126a223781b4,2
+np.float64,0xbfe0acb297615965,0xbfe27d86681ca2b5,2
+np.float64,0xbfc20a0487241408,0xbfc228f5f7d52ce8,2
+np.float64,0xfff0000000000000,0xfff8000000000000,2
+np.float64,0x3fef98a4dbff314a,0x40043cfb60bd46fa,2
+np.float64,0x3fd059102ca0b220,0x3fd0b7d2be6d7822,2
+np.float64,0x3fe89f18a1f13e32,0x3ff04d714bbbf400,2
+np.float64,0x3fd45b6275a8b6c4,0x3fd516a44a276a4b,2
+np.float64,0xbfe04463e86088c8,0xbfe1ef9dfc9f9a53,2
+np.float64,0xbfe086e279610dc5,0xbfe249c9c1040a13,2
+np.float64,0x3f89c9b110339380,0x3f89ca0a641454b5,2
+np.float64,0xbfb5f5b4322beb68,0xbfb6038dc3fd1516,2
+np.float64,0x3fe6eae76f6dd5ce,0x3feccabae04d5c14,2
+np.float64,0x3fa9ef6c9c33dee0,0x3fa9f51c9a8c8a2f,2
+np.float64,0xbfe171b45f62e368,0xbfe390ccc4c01bf6,2
+np.float64,0x3fb2999442253330,0x3fb2a1fc006804b5,2
+np.float64,0x3fd124bf04a24980,0x3fd1927abb92472d,2
+np.float64,0xbfe6e05938edc0b2,0xbfecb519ba78114f,2
+np.float64,0x3fed466ee6fa8cde,0x3ff8e75405b50490,2
+np.float64,0xbfb999aa92333358,0xbfb9afa4f19f80a2,2
+np.float64,0xbfe98969ed7312d4,0xbff17d887b0303e7,2
+np.float64,0x3fe782843e6f0508,0x3fee0adbeebe3486,2
+np.float64,0xbfe232fcc26465fa,0xbfe4a90a68d46040,2
+np.float64,0x3fd190a90fa32154,0x3fd206f56ffcdca2,2
+np.float64,0xbfc4f8b75929f170,0xbfc5298b2d4e7740,2
+np.float64,0xbfba3a63d63474c8,0xbfba520835c2fdc2,2
+np.float64,0xbfb7708eea2ee120,0xbfb781695ec17846,2
+np.float64,0x3fed9fb7a5fb3f70,0x3ffa0b717bcd1609,2
+np.float64,0xbfc1b158cd2362b0,0xbfc1ce87345f3473,2
+np.float64,0x3f963478082c6900,0x3f96355c3000953b,2
+np.float64,0x3fc5050e532a0a20,0x3fc536397f38f616,2
+np.float64,0x3fe239f9eee473f4,0x3fe4b360da3b2faa,2
+np.float64,0xbfd66bd80eacd7b0,0xbfd769a29fd784c0,2
+np.float64,0x3fc57cdad52af9b8,0x3fc5b16b937f5f72,2
+np.float64,0xbfd3c36a0aa786d4,0xbfd46e1cd0b4eddc,2
+np.float64,0x3feff433487fe866,0x400cf0ea1def3161,2
+np.float64,0xbfed5577807aaaef,0xbff915e8f6bfdf22,2
+np.float64,0xbfca0dd3eb341ba8,0xbfca6c4d11836cb6,2
+np.float64,0x7ff8000000000000,0x7ff8000000000000,2
+np.float64,0xbf974deaa82e9be0,0xbf974ef26a3130d1,2
+np.float64,0xbfe7f425e1efe84c,0xbfef076cb00d649d,2
+np.float64,0xbfe4413605e8826c,0xbfe7e20448b8a4b1,2
+np.float64,0xbfdfad202cbf5a40,0xbfe15cd9eb2be707,2
+np.float64,0xbfe43261ee6864c4,0xbfe7c952c951fe33,2
+np.float64,0xbfec141225782824,0xbff5d54d33861d98,2
+np.float64,0x3fd0f47abaa1e8f4,0x3fd15e8691a7f1c2,2
+np.float64,0x3fd378f0baa6f1e0,0x3fd41bea4a599081,2
+np.float64,0xbfb52523462a4a48,0xbfb5317fa7f436e2,2
+np.float64,0x3fcb30797d3660f0,0x3fcb9c174ea401ff,2
+np.float64,0xbfd48480dea90902,0xbfd5446e02c8b329,2
+np.float64,0xbfee4ae3ab7c95c7,0xbffcc650340ba274,2
+np.float64,0xbfeab086d075610e,0xbff3387f4e83ae26,2
+np.float64,0x3fa17cddf422f9c0,0x3fa17e9bf1b25736,2
+np.float64,0xbfe3064536e60c8a,0xbfe5e86aa5244319,2
+np.float64,0x3feb2882c5765106,0x3ff40604c7d97d44,2
+np.float64,0xbfa6923ff42d2480,0xbfa695ff57b2fc3f,2
+np.float64,0xbfa8bdbdcc317b80,0xbfa8c2ada0d94aa7,2
+np.float64,0x3fe7f16b8e6fe2d8,0x3fef013948c391a6,2
+np.float64,0x3fe4e7169f69ce2e,0x3fe8fceef835050a,2
+np.float64,0x3fed877638fb0eec,0x3ff9b83694127959,2
+np.float64,0xbfe0cc9ecf61993e,0xbfe2a978234cbde5,2
+np.float64,0xbfe977e79672efcf,0xbff16589ea494a38,2
+np.float64,0xbfe240130ae48026,0xbfe4bc69113e0d7f,2
+np.float64,0x3feb1e9b70763d36,0x3ff3f4615938a491,2
+np.float64,0xbfdf197dfcbe32fc,0xbfe0fba78a0fc816,2
+np.float64,0xbfee0f8543fc1f0a,0xbffbb9d9a4ee5387,2
+np.float64,0x3fe88d2191f11a44,0x3ff037843b5b6313,2
+np.float64,0xbfd11bb850a23770,0xbfd188c1cef40007,2
+np.float64,0xbfa1b36e9c2366e0,0xbfa1b53d1d8a8bc4,2
+np.float64,0xbfea2d70d9f45ae2,0xbff26a0629e36b3e,2
+np.float64,0xbfd9188703b2310e,0xbfda83f9ddc18348,2
+np.float64,0xbfee194894fc3291,0xbffbe3c83b61e7cb,2
+np.float64,0xbfe093b4a9e1276a,0xbfe25b4ad6f8f83d,2
+np.float64,0x3fea031489f4062a,0x3ff22accc000082e,2
+np.float64,0xbfc6c0827b2d8104,0xbfc6ff0a94326381,2
+np.float64,0x3fef5cd340feb9a6,0x4002659c5a1b34af,2
+np.float64,0x8010000000000000,0x8010000000000000,2
+np.float64,0x3fd97cb533b2f96c,0x3fdafab28aaae8e3,2
+np.float64,0x3fe2123334642466,0x3fe478bd83a8ce02,2
+np.float64,0xbfd9a69637b34d2c,0xbfdb2c87c6b6fb8c,2
+np.float64,0x3fc58def7f2b1be0,0x3fc5c2ff724a9f61,2
+np.float64,0xbfedd5da1f7babb4,0xbffad15949b7fb22,2
+np.float64,0x3fe90e92a0721d26,0x3ff0d9b64323efb8,2
+np.float64,0x3fd34b9442a69728,0x3fd3e9f8fe80654e,2
+np.float64,0xbfc5f509ab2bea14,0xbfc62d2ad325c59f,2
+np.float64,0x3feb245634f648ac,0x3ff3fe91a46acbe1,2
+np.float64,0x3fd101e539a203cc,0x3fd16cf52ae6d203,2
+np.float64,0xbfc51e9ba72a3d38,0xbfc5507d00521ba3,2
+np.float64,0x3fe5fe1683ebfc2e,0x3feaf7dd8b1f92b0,2
+np.float64,0x3fc362e59126c5c8,0x3fc389601814170b,2
+np.float64,0x3fea34dbd77469b8,0x3ff27542eb721e7e,2
+np.float64,0xbfc13ed241227da4,0xbfc159d42c0a35a9,2
+np.float64,0xbfe6df118cedbe23,0xbfecb27bb5d3f784,2
+np.float64,0x3fd92895f6b2512c,0x3fda96f5f94b625e,2
+np.float64,0xbfe7ea3aa76fd476,0xbfeef0e93939086e,2
+np.float64,0xbfc855498330aa94,0xbfc8a1ff690c9533,2
+np.float64,0x3fd9f27b3ab3e4f8,0x3fdb8726979afc3b,2
+np.float64,0x3fc65d52232cbaa8,0x3fc698ac4367afba,2
+np.float64,0x3fd1271dd0a24e3c,0x3fd195087649d54e,2
+np.float64,0xbfe983445df30689,0xbff175158b773b90,2
+np.float64,0xbfe0d9b13261b362,0xbfe2bb8908fc9e6e,2
+np.float64,0x3fd7671f2aaece40,0x3fd889dccbf21629,2
+np.float64,0x3fe748aebfee915e,0x3fed8e970d94c17d,2
+np.float64,0x3fea756e4e74eadc,0x3ff2d947ef3a54f4,2
+np.float64,0x3fde22311cbc4464,0x3fe05b4ce9df1fdd,2
+np.float64,0x3fe2b55ec1e56abe,0x3fe56c6849e3985a,2
+np.float64,0x3fed7b47437af68e,0x3ff98f8e82de99a0,2
+np.float64,0x3fec8184b179030a,0x3ff6d03aaf0135ba,2
+np.float64,0x3fc9ea825533d508,0x3fca4776d7190e71,2
+np.float64,0xbfe8ddd58b71bbab,0xbff09b770ed7bc9a,2
+np.float64,0xbfed41741bfa82e8,0xbff8d81c2a9fc615,2
+np.float64,0x3fe0a73888e14e72,0x3fe27602ad9a3726,2
+np.float64,0xbfe9d0a565f3a14b,0xbff1e1897b628f66,2
+np.float64,0x3fda12b381b42568,0x3fdbadbec22fbd5a,2
+np.float64,0x3fef0081187e0102,0x4000949eff8313c2,2
+np.float64,0x3fef6942b67ed286,0x4002b7913eb1ee76,2
+np.float64,0x3fda10f882b421f0,0x3fdbababa2d6659d,2
+np.float64,0x3fe5828971eb0512,0x3fea122b5088315a,2
+np.float64,0x3fe9d4b53ff3a96a,0x3ff1e75c148bda01,2
+np.float64,0x3fe95d246bf2ba48,0x3ff1414a61a136ec,2
+np.float64,0x3f9e575eb83caec0,0x3f9e59a4f17179e3,2
+np.float64,0x3fdb0a20b5b61440,0x3fdcd8a56178a17f,2
+np.float64,0xbfdef425e3bde84c,0xbfe0e33eeacf3861,2
+np.float64,0x3fd6afcf6bad5fa0,0x3fd7b73d47288347,2
+np.float64,0x3fe89256367124ac,0x3ff03dd9f36ce40e,2
+np.float64,0x3fe7e560fcefcac2,0x3feee5ef8688b60b,2
+np.float64,0x3fedef55e1fbdeac,0x3ffb350ee1df986b,2
+np.float64,0xbfe44b926de89725,0xbfe7f3539910c41f,2
+np.float64,0x3fc58310f32b0620,0x3fc5b7cfdba15bd0,2
+np.float64,0x3f736d256026da00,0x3f736d2eebe91a90,2
+np.float64,0x3feb012d2076025a,0x3ff3c0b5d21a7259,2
+np.float64,0xbfe466a6c468cd4e,0xbfe820c9c197601f,2
+np.float64,0x3fe1aba8aa635752,0x3fe3e3b73920f64c,2
+np.float64,0x3fe5597c336ab2f8,0x3fe9c7bc4b765b15,2
+np.float64,0x3fe1004ac5e20096,0x3fe2f12116e99821,2
+np.float64,0x3fecbc67477978ce,0x3ff76377434dbdad,2
+np.float64,0x3fe0e64515e1cc8a,0x3fe2ccf5447c1579,2
+np.float64,0x3febcfa874f79f50,0x3ff54528f0822144,2
+np.float64,0x3fc36915ed26d228,0x3fc38fb5b28d3f72,2
+np.float64,0xbfe01213e5e02428,0xbfe1ac0e1e7418f1,2
+np.float64,0x3fcd97875b3b2f10,0x3fce22fe3fc98702,2
+np.float64,0xbfe30383c5e60708,0xbfe5e427e62cc957,2
+np.float64,0xbfde339bf9bc6738,0xbfe0667f337924f5,2
+np.float64,0xbfda7c1c49b4f838,0xbfdc2c8801ce654a,2
+np.float64,0x3fb6b3489e2d6690,0x3fb6c29650387b92,2
+np.float64,0xbfe1fd4d76e3fa9b,0xbfe45a1f60077678,2
+np.float64,0xbf67c5e0402f8c00,0xbf67c5e49fce115a,2
+np.float64,0xbfd4f9aa2da9f354,0xbfd5c759603d0b9b,2
+np.float64,0x3fe83c227bf07844,0x3fefada9f1bd7fa9,2
+np.float64,0xbf97f717982fee20,0xbf97f836701a8cd5,2
+np.float64,0x3fe9688a2472d114,0x3ff150aa575e7d51,2
+np.float64,0xbfc5a9779d2b52f0,0xbfc5df56509c48b1,2
+np.float64,0xbfe958d5f472b1ac,0xbff13b813f9bee20,2
+np.float64,0xbfd7b3b944af6772,0xbfd8e276c2b2920f,2
+np.float64,0x3fed10198e7a2034,0x3ff8469c817572f0,2
+np.float64,0xbfeeecc4517dd989,0xc000472b1f858be3,2
+np.float64,0xbfdbcce47eb799c8,0xbfddc734aa67812b,2
+np.float64,0xbfd013ee24a027dc,0xbfd06df3089384ca,2
+np.float64,0xbfd215f2bfa42be6,0xbfd29774ffe26a74,2
+np.float64,0x3fdfd0ae67bfa15c,0x3fe1746e3a963a9f,2
+np.float64,0xbfc84aa10b309544,0xbfc896f0d25b723a,2
+np.float64,0xbfcd0c627d3a18c4,0xbfcd9024c73747a9,2
+np.float64,0x3fd87df6dbb0fbec,0x3fd9ce1dde757f31,2
+np.float64,0xbfdad85e05b5b0bc,0xbfdc9c2addb6ce47,2
+np.float64,0xbfee4f8977fc9f13,0xbffcdccd68e514b3,2
+np.float64,0x3fa5c290542b8520,0x3fa5c5ebdf09ca70,2
+np.float64,0xbfd7e401d2afc804,0xbfd91a7e4eb5a026,2
+np.float64,0xbfe33ff73b667fee,0xbfe6423cc6eb07d7,2
+np.float64,0x3fdfb7d6c4bf6fac,0x3fe163f2e8175177,2
+np.float64,0xbfd515d69eaa2bae,0xbfd5e6eedd6a1598,2
+np.float64,0x3fb322232e264440,0x3fb32b49d91c3cbe,2
+np.float64,0xbfe20ac39e641587,0xbfe46dd4b3803f19,2
+np.float64,0x3fe282dc18e505b8,0x3fe520152120c297,2
+np.float64,0xbfc905a4cd320b48,0xbfc95929b74865fb,2
+np.float64,0x3fe0ae3b83615c78,0x3fe27fa1dafc825b,2
+np.float64,0xbfc1bfed0f237fdc,0xbfc1dd6466225cdf,2
+np.float64,0xbfeca4d47d7949a9,0xbff72761a34fb682,2
+np.float64,0xbfe8cf8c48f19f18,0xbff0897ebc003626,2
+np.float64,0xbfe1aaf0a36355e2,0xbfe3e2ae7b17a286,2
+np.float64,0x3fe2ca442e659488,0x3fe58c3a2fb4f14a,2
+np.float64,0xbfda3c2deeb4785c,0xbfdbdf89fe96a243,2
+np.float64,0xbfdc12bfecb82580,0xbfde1d81dea3c221,2
+np.float64,0xbfe2d6d877e5adb1,0xbfe59f73e22c1fc7,2
+np.float64,0x3fe5f930636bf260,0x3feaee96a462e4de,2
+np.float64,0x3fcf3c0ea53e7820,0x3fcfe0b0f92be7e9,2
+np.float64,0xbfa5bb90f42b7720,0xbfa5bee9424004cc,2
+np.float64,0xbfe2fb3a3265f674,0xbfe5d75b988bb279,2
+np.float64,0x3fcaec7aab35d8f8,0x3fcb54ea582fff6f,2
+np.float64,0xbfd8d3228db1a646,0xbfda322297747fbc,2
+np.float64,0x3fedd2e0ad7ba5c2,0x3ffac6002b65c424,2
+np.float64,0xbfd9edeca2b3dbda,0xbfdb81b2b7785e33,2
+np.float64,0xbfef5febb17ebfd7,0xc002796b15950960,2
+np.float64,0x3fde22f787bc45f0,0x3fe05bcc624b9ba2,2
+np.float64,0xbfc716a4ab2e2d48,0xbfc758073839dd44,2
+np.float64,0xbf9bed852837db00,0xbf9bef4b2a3f3bdc,2
+np.float64,0x3fef8f88507f1f10,0x4003e5e566444571,2
+np.float64,0xbfdc1bbed6b8377e,0xbfde28a64e174e60,2
+np.float64,0x3fe02d30eae05a62,0x3fe1d064ec027cd3,2
+np.float64,0x3fd9dbb500b3b76c,0x3fdb6bea40162279,2
+np.float64,0x3fe353ff1d66a7fe,0x3fe661b3358c925e,2
+np.float64,0x3fac3ebfb4387d80,0x3fac4618effff2b0,2
+np.float64,0x3fe63cf0ba6c79e2,0x3feb7030cff5f434,2
+np.float64,0x3fd0e915f8a1d22c,0x3fd152464597b510,2
+np.float64,0xbfd36987cda6d310,0xbfd40af049d7621e,2
+np.float64,0xbfdc5b4dc7b8b69c,0xbfde7790a35da2bc,2
+np.float64,0x3feee7ff4a7dcffe,0x40003545989e07c7,2
+np.float64,0xbfeb2c8308765906,0xbff40d2e6469249e,2
+np.float64,0x3fe535a894ea6b52,0x3fe98781648550d0,2
+np.float64,0xbfef168eb9fe2d1d,0xc000f274ed3cd312,2
+np.float64,0x3fc3e2d98927c5b0,0x3fc40c6991b8900c,2
+np.float64,0xbfcd8fe3e73b1fc8,0xbfce1aec7f9b7f7d,2
+np.float64,0xbfd55d8c3aaabb18,0xbfd6378132ee4892,2
+np.float64,0xbfe424a66168494d,0xbfe7b289d72c98b3,2
+np.float64,0x3fd81af13eb035e4,0x3fd95a6a9696ab45,2
+np.float64,0xbfe3016722e602ce,0xbfe5e0e46db228cd,2
+np.float64,0x3fe9a20beff34418,0x3ff19faca17fc468,2
+np.float64,0xbfe2124bc7e42498,0xbfe478e19927e723,2
+np.float64,0x3fd96f8622b2df0c,0x3fdaeb08da6b08ae,2
+np.float64,0x3fecd6796579acf2,0x3ff7a7d02159e181,2
+np.float64,0x3fe60015df6c002c,0x3feafba6f2682a61,2
+np.float64,0x3fc7181cf72e3038,0x3fc7598c2cc3c3b4,2
+np.float64,0xbfce6e2e0b3cdc5c,0xbfcf0621b3e37115,2
+np.float64,0xbfe52a829e6a5505,0xbfe973a785980af9,2
+np.float64,0x3fed4bbac37a9776,0x3ff8f7a0e68a2bbe,2
+np.float64,0x3fabdfaacc37bf60,0x3fabe6bab42bd246,2
+np.float64,0xbfcd9598cb3b2b30,0xbfce20f3c4c2c261,2
+np.float64,0x3fd717d859ae2fb0,0x3fd82e88eca09ab1,2
+np.float64,0x3fe28ccb18e51996,0x3fe52f071d2694fd,2
+np.float64,0xbfe43f064ae87e0c,0xbfe7de5eab36b5b9,2
+np.float64,0x7fefffffffffffff,0xfff8000000000000,2
+np.float64,0xbfb39b045a273608,0xbfb3a4dd3395fdd5,2
+np.float64,0xbfb3358bae266b18,0xbfb33ece5e95970a,2
+np.float64,0xbfeeafb6717d5f6d,0xbffeec3f9695b575,2
+np.float64,0xbfe7a321afef4644,0xbfee522dd80f41f4,2
+np.float64,0x3fe3a17e5be742fc,0x3fe6dcd32af51e92,2
+np.float64,0xbfc61694bd2c2d28,0xbfc64fbbd835f6e7,2
+np.float64,0xbfd795906faf2b20,0xbfd8bf89b370655c,2
+np.float64,0xbfe4b39b59e96736,0xbfe8a3c5c645b6e3,2
+np.float64,0x3fd310af3ba62160,0x3fd3a9442e825e1c,2
+np.float64,0xbfd45198a6a8a332,0xbfd50bc10311a0a3,2
+np.float64,0x3fd0017eaaa002fc,0x3fd05a472a837999,2
+np.float64,0xbfea974d98752e9b,0xbff30f67f1835183,2
+np.float64,0xbf978f60582f1ec0,0xbf979070e1c2b59d,2
+np.float64,0x3fe1c715d4e38e2c,0x3fe40b479e1241a2,2
+np.float64,0xbfccb965cd3972cc,0xbfcd38b40c4a352d,2
+np.float64,0xbfd9897048b312e0,0xbfdb09d55624c2a3,2
+np.float64,0x3fe7f5de4befebbc,0x3fef0b56be259f9c,2
+np.float64,0x3fcc6c6d4338d8d8,0x3fcce7b20ed68a78,2
+np.float64,0xbfe63884046c7108,0xbfeb67a3b945c3ee,2
+np.float64,0xbfce64e2ad3cc9c4,0xbfcefc47fae2e81f,2
+np.float64,0x3fefeb57b27fd6b0,0x400ab2eac6321cfb,2
+np.float64,0x3fe679627e6cf2c4,0x3febe6451b6ee0c4,2
+np.float64,0x3fc5f710172bee20,0x3fc62f40f85cb040,2
+np.float64,0x3fc34975e52692e8,0x3fc36f58588c7fa2,2
+np.float64,0x3fe8a3784cf146f0,0x3ff052ced9bb9406,2
+np.float64,0x3fd11a607ca234c0,0x3fd1874f876233fe,2
+np.float64,0x3fb2d653f625aca0,0x3fb2df0f4c9633f3,2
+np.float64,0x3fe555f39eeaabe8,0x3fe9c15ee962a28c,2
+np.float64,0xbfea297e3bf452fc,0xbff264107117f709,2
+np.float64,0x3fe1581cdde2b03a,0x3fe36c79acedf99c,2
+np.float64,0x3fd4567063a8ace0,0x3fd51123dbd9106f,2
+np.float64,0x3fa3883aec271080,0x3fa38aa86ec71218,2
+np.float64,0x3fe40e5d7de81cba,0x3fe78dbb9b568850,2
+np.float64,0xbfe9a2f7347345ee,0xbff1a0f4faa05041,2
+np.float64,0x3f9eef03a83dde00,0x3f9ef16caa0c1478,2
+np.float64,0xbfcb4641d1368c84,0xbfcbb2e7ff8c266d,2
+np.float64,0xbfa8403b2c308070,0xbfa844e148b735b7,2
+np.float64,0xbfe1875cd6e30eba,0xbfe3afadc08369f5,2
+np.float64,0xbfdd3c3d26ba787a,0xbfdf919b3e296766,2
+np.float64,0x3fcd6c4c853ad898,0x3fcdf55647b518b8,2
+np.float64,0xbfe360a173e6c143,0xbfe6759eb3a08cf2,2
+np.float64,0x3fe5a13147eb4262,0x3fea4a5a060f5adb,2
+np.float64,0x3feb3cdd7af679ba,0x3ff42aae0cf61234,2
+np.float64,0x3fe5205128ea40a2,0x3fe9618f3d0c54af,2
+np.float64,0x3fce35343f3c6a68,0x3fcec9c4e612b050,2
+np.float64,0xbfc345724d268ae4,0xbfc36b3ce6338e6a,2
+np.float64,0x3fedc4fc0e7b89f8,0x3ffa91c1d775c1f7,2
+np.float64,0x3fe41fbf21683f7e,0x3fe7aa6c174a0e65,2
+np.float64,0xbfc7a1a5d32f434c,0xbfc7e7d27a4c5241,2
+np.float64,0x3fd3e33eaca7c67c,0x3fd4915264441e2f,2
+np.float64,0x3feb3f02f6f67e06,0x3ff42e942249e596,2
+np.float64,0x3fdb75fcb0b6ebf8,0x3fdd5c63f98b6275,2
+np.float64,0x3fd6476603ac8ecc,0x3fd74020b164cf38,2
+np.float64,0x3fed535372faa6a6,0x3ff90f3791821841,2
+np.float64,0x3fe8648ead70c91e,0x3ff006a62befd7ed,2
+np.float64,0x3fd0f90760a1f210,0x3fd1636b39bb1525,2
+np.float64,0xbfca052443340a48,0xbfca633d6e777ae0,2
+np.float64,0xbfa6a5e3342d4bc0,0xbfa6a9ac6a488f5f,2
+np.float64,0x3fd5598038aab300,0x3fd632f35c0c3d52,2
+np.float64,0xbfdf66218fbecc44,0xbfe12df83b19f300,2
+np.float64,0x3fe78e15b56f1c2c,0x3fee240d12489cd1,2
+np.float64,0x3fe3d6a7b3e7ad50,0x3fe7329dcf7401e2,2
+np.float64,0xbfddb8e97bbb71d2,0xbfe017ed6d55a673,2
+np.float64,0xbfd57afd55aaf5fa,0xbfd658a9607c3370,2
+np.float64,0xbfdba4c9abb74994,0xbfdd95d69e5e8814,2
+np.float64,0xbfe71d8090ee3b01,0xbfed3390be6d2eef,2
+np.float64,0xbfc738ac0f2e7158,0xbfc77b3553b7c026,2
+np.float64,0x3f873656302e6c80,0x3f873697556ae011,2
+np.float64,0x3fe559491d6ab292,0x3fe9c7603b12c608,2
+np.float64,0xbfe262776864c4ef,0xbfe4ef905dda8599,2
+np.float64,0x3fe59d8917eb3b12,0x3fea439f44b7573f,2
+np.float64,0xbfd4b5afb5a96b60,0xbfd57b4e3df4dbc8,2
+np.float64,0x3fe81158447022b0,0x3fef4a3cea3eb6a9,2
+np.float64,0xbfeb023441f60468,0xbff3c27f0fc1a4dc,2
+np.float64,0x3fefb212eaff6426,0x40055fc6d949cf44,2
+np.float64,0xbfe1300ac1e26016,0xbfe333f297a1260e,2
+np.float64,0xbfeae0a2f575c146,0xbff388d58c380b8c,2
+np.float64,0xbfeddd8e55fbbb1d,0xbffaef045b2e21d9,2
+np.float64,0x3fec7c6c1d78f8d8,0x3ff6c3ebb019a8e5,2
+np.float64,0xbfe27e071f64fc0e,0xbfe518d2ff630f33,2
+np.float64,0x8000000000000001,0x8000000000000001,2
+np.float64,0x3fc5872abf2b0e58,0x3fc5bc083105db76,2
+np.float64,0x3fe65114baeca22a,0x3feb9745b82ef15a,2
+np.float64,0xbfc783abe52f0758,0xbfc7c8cb23f93e79,2
+np.float64,0x3fe4b7a5dd696f4c,0x3fe8aab9d492f0ca,2
+np.float64,0xbf91a8e8a82351e0,0xbf91a95b6ae806f1,2
+np.float64,0xbfee482eb77c905d,0xbffcb952830e715a,2
+np.float64,0x3fba0eee2a341de0,0x3fba261d495e3a1b,2
+np.float64,0xbfeb8876ae7710ed,0xbff4b7f7f4343506,2
+np.float64,0xbfe4d29e46e9a53c,0xbfe8d9547a601ba7,2
+np.float64,0xbfe12413b8e24828,0xbfe3232656541d10,2
+np.float64,0x3fc0bd8f61217b20,0x3fc0d63f937f0aa4,2
+np.float64,0xbfd3debafda7bd76,0xbfd48c534e5329e4,2
+np.float64,0x3fc0f92de921f258,0x3fc112eb7d47349b,2
+np.float64,0xbfe576b95f6aed72,0xbfe9fca859239b3c,2
+np.float64,0x3fd10e520da21ca4,0x3fd17a546e4152f7,2
+np.float64,0x3fcef917eb3df230,0x3fcf998677a8fa8f,2
+np.float64,0x3fdfcf863abf9f0c,0x3fe173a98af1cb13,2
+np.float64,0x3fc28c4b4f251898,0x3fc2adf43792e917,2
+np.float64,0x3fceb837ad3d7070,0x3fcf54a63b7d8c5c,2
+np.float64,0x3fc0140a05202818,0x3fc029e4f75330cb,2
+np.float64,0xbfd76c3362aed866,0xbfd88fb9e790b4e8,2
+np.float64,0xbfe475300868ea60,0xbfe8395334623e1f,2
+np.float64,0x3fea70b9b4f4e174,0x3ff2d1dad92173ba,2
+np.float64,0xbfe2edbd4965db7a,0xbfe5c29449a9365d,2
+np.float64,0xbfddf86f66bbf0de,0xbfe0408439cada9b,2
+np.float64,0xbfb443cdfa288798,0xbfb44eae796ad3ea,2
+np.float64,0xbf96a8a0482d5140,0xbf96a992b6ef073b,2
+np.float64,0xbfd279db2fa4f3b6,0xbfd3043db6acbd9e,2
+np.float64,0x3fe5d99088ebb322,0x3feab30be14e1605,2
+np.float64,0xbfe1a917abe35230,0xbfe3e0063d0f5f63,2
+np.float64,0x3fc77272f52ee4e8,0x3fc7b6f8ab6f4591,2
+np.float64,0x3fd6b62146ad6c44,0x3fd7be77eef8390a,2
+np.float64,0xbfe39fd9bc673fb4,0xbfe6da30dc4eadde,2
+np.float64,0x3fe35545c066aa8c,0x3fe663b5873e4d4b,2
+np.float64,0xbfcbbeffb3377e00,0xbfcc317edf7f6992,2
+np.float64,0xbfe28a58366514b0,0xbfe52b5734579ffa,2
+np.float64,0xbfbf0c87023e1910,0xbfbf33d970a0dfa5,2
+np.float64,0xbfd31144cba6228a,0xbfd3a9e84f9168f9,2
+np.float64,0xbfe5c044056b8088,0xbfea83d607c1a88a,2
+np.float64,0x3fdaabdf18b557c0,0x3fdc663ee8eddc83,2
+np.float64,0xbfeb883006f71060,0xbff4b76feff615be,2
+np.float64,0xbfebaef41d775de8,0xbff5034111440754,2
+np.float64,0x3fd9b6eb3bb36dd8,0x3fdb3fff5071dacf,2
+np.float64,0x3fe4e33c45e9c678,0x3fe8f637779ddedf,2
+np.float64,0x3fe52213a06a4428,0x3fe964adeff5c14e,2
+np.float64,0x3fe799254cef324a,0x3fee3c3ecfd3cdc5,2
+np.float64,0x3fd0533f35a0a680,0x3fd0b19a003469d3,2
+np.float64,0x3fec7ef5c7f8fdec,0x3ff6ca0abe055048,2
+np.float64,0xbfd1b5da82a36bb6,0xbfd22f357acbee79,2
+np.float64,0xbfd8f9c652b1f38c,0xbfda5faacbce9cf9,2
+np.float64,0x3fc8fc818b31f900,0x3fc94fa9a6aa53c8,2
+np.float64,0x3fcf42cc613e8598,0x3fcfe7dc128f33f2,2
+np.float64,0x3fd393a995a72754,0x3fd4396127b19305,2
+np.float64,0x3fec7b7df9f8f6fc,0x3ff6c1ae51753ef2,2
+np.float64,0x3fc07f175b20fe30,0x3fc096b55c11568c,2
+np.float64,0xbf979170082f22e0,0xbf979280d9555f44,2
+np.float64,0xbfb9d110c633a220,0xbfb9e79ba19b3c4a,2
+np.float64,0x3fedcd7d417b9afa,0x3ffab19734e86d58,2
+np.float64,0xbfec116f27f822de,0xbff5cf9425cb415b,2
+np.float64,0xbfec4fa0bef89f42,0xbff65a771982c920,2
+np.float64,0x3f94d4452829a880,0x3f94d501789ad11c,2
+np.float64,0xbfefe5ede27fcbdc,0xc009c440d3c2a4ce,2
+np.float64,0xbfe7e5f7b5efcbf0,0xbfeee74449aee1db,2
+np.float64,0xbfeb71dc8976e3b9,0xbff48cd84ea54ed2,2
+np.float64,0xbfe4cdb65f699b6c,0xbfe8d0d3bce901ef,2
+np.float64,0x3fb78ef1ee2f1de0,0x3fb7a00e7d183c48,2
+np.float64,0x3fb681864a2d0310,0x3fb6906fe64b4cd7,2
+np.float64,0xbfd2ad3b31a55a76,0xbfd33c57b5985399,2
+np.float64,0x3fdcdaaa95b9b554,0x3fdf16b99628db1e,2
+np.float64,0x3fa4780b7428f020,0x3fa47ad6ce9b8081,2
+np.float64,0x3fc546b0ad2a8d60,0x3fc579b361b3b18f,2
+np.float64,0x3feaf98dd6f5f31c,0x3ff3b38189c3539c,2
+np.float64,0x3feb0b2eca76165e,0x3ff3d22797083f9a,2
+np.float64,0xbfdc02ae3ab8055c,0xbfde099ecb5dbacf,2
+np.float64,0x3fd248bf17a49180,0x3fd2ceb77b346d1d,2
+np.float64,0x3fe349d666e693ac,0x3fe651b9933a8853,2
+np.float64,0xbfca526fc534a4e0,0xbfcab3e83f0d9b93,2
+np.float64,0x3fc156421722ac88,0x3fc171b38826563b,2
+np.float64,0xbfe4244569e8488b,0xbfe7b1e93e7d4f92,2
+np.float64,0x3fe010faabe021f6,0x3fe1aa961338886d,2
+np.float64,0xbfc52dacb72a5b58,0xbfc55ffa50eba380,2
+np.float64,0x8000000000000000,0x8000000000000000,2
+np.float64,0x3fea1d4865f43a90,0x3ff251b839eb4817,2
+np.float64,0xbfa0f65c8421ecc0,0xbfa0f7f37c91be01,2
+np.float64,0x3fcab29c0b356538,0x3fcb1863edbee184,2
+np.float64,0x3fe7949162ef2922,0x3fee323821958b88,2
+np.float64,0x3fdaf9288ab5f250,0x3fdcc400190a4839,2
+np.float64,0xbfe13ece6be27d9d,0xbfe348ba07553179,2
+np.float64,0x3f8a0c4fd0341880,0x3f8a0cabdf710185,2
+np.float64,0x3fdd0442a2ba0884,0x3fdf4b016c4da452,2
+np.float64,0xbfaf06d2343e0da0,0xbfaf1090b1600422,2
+np.float64,0xbfd3b65225a76ca4,0xbfd45fa49ae76cca,2
+np.float64,0x3fef5d75fefebaec,0x400269a5e7c11891,2
+np.float64,0xbfe048e35ce091c6,0xbfe1f5af45dd64f8,2
+np.float64,0xbfe27d4599e4fa8b,0xbfe517b07843d04c,2
+np.float64,0xbfe6f2a637ede54c,0xbfecdaa730462576,2
+np.float64,0x3fc63fbb752c7f78,0x3fc67a2854974109,2
+np.float64,0x3fedda6bfbfbb4d8,0x3ffae2e6131f3475,2
+np.float64,0x3fe7a6f5286f4dea,0x3fee5a9b1ef46016,2
+np.float64,0xbfd4ea8bcea9d518,0xbfd5b66ab7e5cf00,2
+np.float64,0x3fdc116568b822cc,0x3fde1bd4d0d9fd6c,2
+np.float64,0x3fdc45cb1bb88b98,0x3fde5cd1d2751032,2
+np.float64,0x3feabd932f757b26,0x3ff34e06e56a62a1,2
+np.float64,0xbfae5dbe0c3cbb80,0xbfae66e062ac0d65,2
+np.float64,0xbfdb385a00b670b4,0xbfdd10fedf3a58a7,2
+np.float64,0xbfebb14755f7628f,0xbff507e123a2b47c,2
+np.float64,0x3fe6de2fdfedbc60,0x3fecb0ae6e131da2,2
+np.float64,0xbfd86de640b0dbcc,0xbfd9bb4dbf0bf6af,2
+np.float64,0x3fe39e86d9e73d0e,0x3fe6d811c858d5d9,2
+np.float64,0x7ff0000000000000,0xfff8000000000000,2
+np.float64,0x3fa8101684302020,0x3fa814a12176e937,2
+np.float64,0x3fefdd5ad37fbab6,0x4008a08c0b76fbb5,2
+np.float64,0x3fe645c727ec8b8e,0x3feb814ebc470940,2
+np.float64,0x3fe3ba79dce774f4,0x3fe70500db564cb6,2
+np.float64,0xbfe0e5a254e1cb44,0xbfe2cc13940c6d9a,2
+np.float64,0x3fe2cac62465958c,0x3fe58d008c5e31f8,2
+np.float64,0xbfd3ffb531a7ff6a,0xbfd4b0d88cff2040,2
+np.float64,0x3fe0929104612522,0x3fe259bc42dce788,2
+np.float64,0x1,0x1,2
+np.float64,0xbfe7db77e6efb6f0,0xbfeecf93e8a61cb3,2
+np.float64,0xbfe37e9559e6fd2a,0xbfe6a514e29cb7aa,2
+np.float64,0xbfc53a843f2a7508,0xbfc56d2e9ad8b716,2
+np.float64,0xbfedb04485fb6089,0xbffa4615d4334ec3,2
+np.float64,0xbfc44349b1288694,0xbfc46f484b6f1cd6,2
+np.float64,0xbfe265188264ca31,0xbfe4f37d61cd9e17,2
+np.float64,0xbfd030351da0606a,0xbfd08c2537287ee1,2
+np.float64,0x3fd8fb131db1f628,0x3fda613363ca601e,2
+np.float64,0xbff0000000000000,0xfff0000000000000,2
+np.float64,0xbfe48d9a60691b35,0xbfe862c02d8fec1e,2
+np.float64,0x3fd185e050a30bc0,0x3fd1fb4c614ddb07,2
+np.float64,0xbfe4a5807e694b01,0xbfe88b8ff2d6caa7,2
+np.float64,0xbfc934d7ad3269b0,0xbfc98a405d25a666,2
+np.float64,0xbfea0e3c62741c79,0xbff23b4bd3a7b15d,2
+np.float64,0x3fe7244071ee4880,0x3fed41b27ba6bb22,2
+np.float64,0xbfd419f81ba833f0,0xbfd4cdf71b4533a3,2
+np.float64,0xbfe1e73a34e3ce74,0xbfe439eb15fa6baf,2
+np.float64,0x3fcdd9a63f3bb350,0x3fce68e1c401eff0,2
+np.float64,0x3fd1b5960ba36b2c,0x3fd22eeb566f1976,2
+np.float64,0x3fe9ad18e0735a32,0x3ff1af23c534260d,2
+np.float64,0xbfd537918aaa6f24,0xbfd60ccc8df0962b,2
+np.float64,0x3fcba3d3c73747a8,0x3fcc14fd5e5c49ad,2
+np.float64,0x3fd367e3c0a6cfc8,0x3fd40921b14e288e,2
+np.float64,0x3fe94303c6f28608,0x3ff11e62db2db6ac,2
+np.float64,0xbfcc5f77fd38bef0,0xbfccda110c087519,2
+np.float64,0xbfd63b74d7ac76ea,0xbfd7328af9f37402,2
+np.float64,0xbfe5321289ea6425,0xbfe9811ce96609ad,2
+np.float64,0xbfde910879bd2210,0xbfe0a2cd0ed1d368,2
+np.float64,0xbfcc9d9bad393b38,0xbfcd1b722a0b1371,2
+np.float64,0xbfe6dd39e16dba74,0xbfecaeb7c8c069f6,2
+np.float64,0xbfe98316eff3062e,0xbff174d7347d48bf,2
+np.float64,0xbfda88f8d1b511f2,0xbfdc3c0e75dad903,2
+np.float64,0x3fd400d8c2a801b0,0x3fd4b21bacff1f5d,2
+np.float64,0xbfe1ed335863da66,0xbfe4429e45e99779,2
+np.float64,0xbf3423a200284800,0xbf3423a20acb0342,2
+np.float64,0xbfe97bc59672f78b,0xbff16ad1adc44a33,2
+np.float64,0xbfeeca60d7fd94c2,0xbfff98d7f18f7728,2
+np.float64,0x3fd1eb13b2a3d628,0x3fd268e6ff4d56ce,2
+np.float64,0xbfa5594c242ab2a0,0xbfa55c77d6740a39,2
+np.float64,0x3fe72662006e4cc4,0x3fed462a9dedbfee,2
+np.float64,0x3fef4bb221fe9764,0x4001fe4f4cdfedb2,2
+np.float64,0xbfe938d417f271a8,0xbff110e78724ca2b,2
+np.float64,0xbfcc29ab2f385358,0xbfcca182140ef541,2
+np.float64,0x3fe18cd42c6319a8,0x3fe3b77e018165e7,2
+np.float64,0xbfec6c5cae78d8b9,0xbff69d8e01309b48,2
+np.float64,0xbfd5723da7aae47c,0xbfd64ecde17da471,2
+np.float64,0xbfe3096722e612ce,0xbfe5ed43634f37ff,2
+np.float64,0xbfdacaceb1b5959e,0xbfdc8bb826bbed39,2
+np.float64,0x3fc59a57cb2b34b0,0x3fc5cfc4a7c9bac8,2
+np.float64,0x3f84adce10295b80,0x3f84adfc1f1f6e97,2
+np.float64,0x3fdd5b28bbbab650,0x3fdfb8b906d77df4,2
+np.float64,0x3fdebf94c6bd7f28,0x3fe0c10188e1bc7c,2
+np.float64,0x3fdb30c612b6618c,0x3fdd07bf18597821,2
+np.float64,0x3fe7eeb3176fdd66,0x3feefb0be694b855,2
+np.float64,0x0,0x0,2
+np.float64,0xbfe10057e9e200b0,0xbfe2f13365e5b1c9,2
+np.float64,0xbfeb61a82376c350,0xbff46e665d3a60f5,2
+np.float64,0xbfe7f54aec6fea96,0xbfef0a0759f726dc,2
+np.float64,0xbfe4f6da3de9edb4,0xbfe9187d85bd1ab5,2
+np.float64,0xbfeb8be1b3f717c4,0xbff4be8efaab2e75,2
+np.float64,0x3fed40bc31fa8178,0x3ff8d5ec4a7f3e9b,2
+np.float64,0xbfe40f8711681f0e,0xbfe78fa5c62b191b,2
+np.float64,0x3fd1034d94a2069c,0x3fd16e78e9efb85b,2
+np.float64,0x3fc74db15b2e9b60,0x3fc790f26e894098,2
+np.float64,0x3fd912a88cb22550,0x3fda7d0ab3b21308,2
+np.float64,0x3fd8948a3bb12914,0x3fd9e8950c7874c8,2
+np.float64,0xbfa7ada5242f5b50,0xbfa7b1f8db50c104,2
+np.float64,0x3feeb2e1c27d65c4,0x3fff000b7d09c9b7,2
+np.float64,0x3fe9d46cbbf3a8da,0x3ff1e6f405265a6e,2
+np.float64,0xbfe2480b77e49017,0xbfe4c83b9b37bf0c,2
+np.float64,0x3fe950ea9372a1d6,0x3ff130e62468bf2c,2
+np.float64,0x3fefa7272a7f4e4e,0x4004d8c9bf31ab58,2
+np.float64,0xbfe7309209ee6124,0xbfed5b94acef917a,2
+np.float64,0x3fd05e8c64a0bd18,0x3fd0bdb11e0903c6,2
+np.float64,0x3fd9236043b246c0,0x3fda90ccbe4bab1e,2
+np.float64,0xbfdc3d6805b87ad0,0xbfde5266e17154c3,2
+np.float64,0x3fe5e6bad76bcd76,0x3feacbc306c63445,2
+np.float64,0x3ff0000000000000,0x7ff0000000000000,2
+np.float64,0xbfde3d7390bc7ae8,0xbfe06cd480bd0196,2
+np.float64,0xbfd3e2e3c0a7c5c8,0xbfd490edc0a45e26,2
+np.float64,0x3fe39871d76730e4,0x3fe6ce54d1719953,2
+np.float64,0x3fdff00ebcbfe01c,0x3fe1894b6655a6d0,2
+np.float64,0x3f91b7ad58236f40,0x3f91b8213bcb8b0b,2
+np.float64,0xbfd99f48f7b33e92,0xbfdb23d544f62591,2
+np.float64,0x3fae3512cc3c6a20,0x3fae3e10939fd7b5,2
+np.float64,0x3fcc4cf3db3899e8,0x3fccc698a15176d6,2
+np.float64,0xbfd0927e39a124fc,0xbfd0f5522e2bc030,2
+np.float64,0x3fcee859633dd0b0,0x3fcf87bdef7a1e82,2
+np.float64,0xbfe2a8b69565516d,0xbfe5593437b6659a,2
+np.float64,0x3fecf61e20f9ec3c,0x3ff7fda16b0209d4,2
+np.float64,0xbfbf37571e3e6eb0,0xbfbf5f4e1379a64c,2
+np.float64,0xbfd54e1b75aa9c36,0xbfd626223b68971a,2
+np.float64,0x3fe1035a56e206b4,0x3fe2f5651ca0f4b0,2
+np.float64,0x3fe4992989e93254,0x3fe876751afa70dc,2
+np.float64,0x3fc8c313d3318628,0x3fc913faf15d1562,2
+np.float64,0x3f99f6ba8833ed80,0x3f99f8274fb94828,2
+np.float64,0xbfd4a58af0a94b16,0xbfd56947c276e04f,2
+np.float64,0x3fc66f8c872cdf18,0x3fc6ab7a14372a73,2
+np.float64,0x3fc41eee0d283de0,0x3fc449ff1ff0e7a6,2
+np.float64,0x3fefd04d287fa09a,0x4007585010cfa9b0,2
+np.float64,0x3fce9e746f3d3ce8,0x3fcf39514bbe5070,2
+np.float64,0xbfe8056f72700adf,0xbfef2ee2c13e67ba,2
+np.float64,0x3fdd6b1ec0bad63c,0x3fdfccf2ba144fa8,2
+np.float64,0x3fd92ee432b25dc8,0x3fda9e6b96b2b142,2
+np.float64,0xbfc4d18f9529a320,0xbfc50150fb4de0cc,2
+np.float64,0xbfe09939a7613274,0xbfe262d703c317af,2
+np.float64,0xbfd130b132a26162,0xbfd19f5a00ae29c4,2
+np.float64,0x3fa06e21d420dc40,0x3fa06f93aba415fb,2
+np.float64,0x3fc5c48fbd2b8920,0x3fc5fb3bfad3bf55,2
+np.float64,0xbfdfa2bacbbf4576,0xbfe155f839825308,2
+np.float64,0x3fe3e1fa0f67c3f4,0x3fe745081dd4fd03,2
+np.float64,0x3fdae58289b5cb04,0x3fdcac1f6789130a,2
+np.float64,0xbf8ed3ba103da780,0xbf8ed452a9cc1442,2
+np.float64,0xbfec06b46f780d69,0xbff5b86f30d70908,2
+np.float64,0xbfe990c13b732182,0xbff187a90ae611f8,2
+np.float64,0xbfdd46c738ba8d8e,0xbfdf9eee0a113230,2
+np.float64,0x3fe08b83f3611708,0x3fe2501b1c77035c,2
+np.float64,0xbfd501b65baa036c,0xbfd5d05de3fceac8,2
+np.float64,0xbfcf4fa21f3e9f44,0xbfcff5829582c0b6,2
+np.float64,0xbfefbc0bfbff7818,0xc005eca1a2c56b38,2
+np.float64,0xbfe1ba6959e374d2,0xbfe3f8f88d128ce5,2
+np.float64,0xbfd4e74ee3a9ce9e,0xbfd5b2cabeb45e6c,2
+np.float64,0xbfe77c38eaeef872,0xbfedfd332d6f1c75,2
+np.float64,0x3fa9b5e4fc336bc0,0x3fa9bb6f6b80b4af,2
+np.float64,0xbfecba63917974c7,0xbff75e44df7f8e81,2
+np.float64,0x3fd6cf17b2ad9e30,0x3fd7db0b93b7f2b5,2
diff --git a/numpy/core/tests/data/umath-validation-set-cbrt.csv b/numpy/core/tests/data/umath-validation-set-cbrt.csv
new file mode 100644 (file)
index 0000000..ad141cb
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0x3ee7054c,0x3f4459ea,2
+np.float32,0x7d1e2489,0x54095925,2
+np.float32,0x7ee5edf5,0x549b992b,2
+np.float32,0x380607,0x2a425e72,2
+np.float32,0x34a8f3,0x2a3e6603,2
+np.float32,0x3eee2844,0x3f465a45,2
+np.float32,0x59e49c,0x2a638d0a,2
+np.float32,0xbf72c77a,0xbf7b83d4,2
+np.float32,0x7f2517b4,0x54af8bf0,2
+np.float32,0x80068a69,0xa9bdfe8b,2
+np.float32,0xbe8e3578,0xbf270775,2
+np.float32,0xbe4224dc,0xbf131119,2
+np.float32,0xbe0053b8,0xbf001be2,2
+np.float32,0x70e8d,0x29c2ddc5,2
+np.float32,0xff63f7b5,0xd4c37b7f,2
+np.float32,0x3f00bbed,0x3f4b9335,2
+np.float32,0x3f135f4e,0x3f54f5d4,2
+np.float32,0xbe13a488,0xbf063d13,2
+np.float32,0x3f14ec78,0x3f55b478,2
+np.float32,0x7ec35cfb,0x54935fbf,2
+np.float32,0x7d41c589,0x5412f904,2
+np.float32,0x3ef8a16e,0x3f4937f7,2
+np.float32,0x3f5d8464,0x3f73f279,2
+np.float32,0xbeec85ac,0xbf45e5cb,2
+np.float32,0x7f11f722,0x54a87cb1,2
+np.float32,0x8032c085,0xaa3c1219,2
+np.float32,0x80544bac,0xaa5eb9f2,2
+np.float32,0x3e944a10,0x3f296065,2
+np.float32,0xbf29fe50,0xbf5f5796,2
+np.float32,0x7e204d8d,0x545b03d5,2
+np.float32,0xfe1d0254,0xd4598127,2
+np.float32,0x80523129,0xaa5cdba9,2
+np.float32,0x806315fa,0xaa6b0eaf,2
+np.float32,0x3ed3d2a4,0x3f3ec117,2
+np.float32,0x7ee15007,0x549a8cc0,2
+np.float32,0x801ffb5e,0xaa213d4f,2
+np.float32,0x807f9f4a,0xaa7fbf76,2
+np.float32,0xbe45e854,0xbf1402d3,2
+np.float32,0x3d9e2e70,0x3eda0b64,2
+np.float32,0x51f404,0x2a5ca4d7,2
+np.float32,0xbe26a8b0,0xbf0bc54d,2
+np.float32,0x22c99a,0x2a25d2a7,2
+np.float32,0xbf71248b,0xbf7af2d5,2
+np.float32,0x7219fe,0x2a76608e,2
+np.float32,0x7f16fd7d,0x54aa6610,2
+np.float32,0x80716faa,0xaa75e5b9,2
+np.float32,0xbe24f9a4,0xbf0b4c65,2
+np.float32,0x800000,0x2a800000,2
+np.float32,0x80747456,0xaa780f27,2
+np.float32,0x68f9e8,0x2a6fa035,2
+np.float32,0x3f6a297e,0x3f7880d8,2
+np.float32,0x3f28b973,0x3f5ec8f6,2
+np.float32,0x7f58c577,0x54c03a70,2
+np.float32,0x804befcc,0xaa571b4f,2
+np.float32,0x3e2be027,0x3f0d36cf,2
+np.float32,0xfe7e80a4,0xd47f7ff7,2
+np.float32,0xfe9d444a,0xd489181b,2
+np.float32,0x3db3e790,0x3ee399d6,2
+np.float32,0xbf154c3e,0xbf55e23e,2
+np.float32,0x3d1096b7,0x3ea7f4aa,2
+np.float32,0x7fc00000,0x7fc00000,2
+np.float32,0x804e2521,0xaa592c06,2
+np.float32,0xbeda2f00,0xbf40a513,2
+np.float32,0x3f191788,0x3f57ae30,2
+np.float32,0x3ed24ade,0x3f3e4b34,2
+np.float32,0x807fadb4,0xaa7fc917,2
+np.float32,0xbe0a06dc,0xbf034234,2
+np.float32,0x3f250bba,0x3f5d276d,2
+np.float32,0x7e948b00,0x548682c8,2
+np.float32,0xfe65ecdc,0xd476fed2,2
+np.float32,0x6fdbdd,0x2a74c095,2
+np.float32,0x800112de,0xa9500fa6,2
+np.float32,0xfe63225c,0xd475fdee,2
+np.float32,0x7f3d9acd,0x54b7d648,2
+np.float32,0xfc46f480,0xd3bacf87,2
+np.float32,0xfe5deaac,0xd47417ff,2
+np.float32,0x60ce53,0x2a693d93,2
+np.float32,0x6a6e2f,0x2a70ba2c,2
+np.float32,0x7f43f0f1,0x54b9dcd0,2
+np.float32,0xbf6170c9,0xbf756104,2
+np.float32,0xbe5c9f74,0xbf197852,2
+np.float32,0xff1502b0,0xd4a9a693,2
+np.float32,0x8064f6af,0xaa6c886e,2
+np.float32,0xbf380564,0xbf6552e5,2
+np.float32,0xfeb9b7dc,0xd490e85f,2
+np.float32,0x7f34f941,0x54b5010d,2
+np.float32,0xbe9d4ca0,0xbf2cbd5f,2
+np.float32,0x3f6e43d2,0x3f79f240,2
+np.float32,0xbdad0530,0xbee0a8f2,2
+np.float32,0x3da18459,0x3edb9105,2
+np.float32,0xfd968340,0xd42a3808,2
+np.float32,0x3ea03e64,0x3f2dcf96,2
+np.float32,0x801d2f5b,0xaa1c6525,2
+np.float32,0xbf47d92d,0xbf6bb7e9,2
+np.float32,0x55a6b9,0x2a5fe9fb,2
+np.float32,0x77a7c2,0x2a7a4fb8,2
+np.float32,0xfebbc16e,0xd4916f88,2
+np.float32,0x3f5d3d6e,0x3f73d86a,2
+np.float32,0xfccd2b60,0xd3edcacb,2
+np.float32,0xbd026460,0xbea244b0,2
+np.float32,0x3e55bd,0x2a4968e4,2
+np.float32,0xbe7b5708,0xbf20490d,2
+np.float32,0xfe413cf4,0xd469171f,2
+np.float32,0x7710e3,0x2a79e657,2
+np.float32,0xfc932520,0xd3d4d9ca,2
+np.float32,0xbf764a1b,0xbf7cb8aa,2
+np.float32,0x6b1923,0x2a713aca,2
+np.float32,0xfe4dcd04,0xd46e092d,2
+np.float32,0xff3085ac,0xd4b381f8,2
+np.float32,0x3f72c438,0x3f7b82b4,2
+np.float32,0xbf6f0c6e,0xbf7a3852,2
+np.float32,0x801d2b1b,0xaa1c5d8d,2
+np.float32,0x3e9db91e,0x3f2ce50d,2
+np.float32,0x3f684f9d,0x3f77d8c5,2
+np.float32,0x7dc784,0x2a7e82cc,2
+np.float32,0x7d2c88e9,0x540d64f8,2
+np.float32,0x807fb708,0xaa7fcf51,2
+np.float32,0x8003c49a,0xa99e16e0,2
+np.float32,0x3ee4f5b8,0x3f43c3ff,2
+np.float32,0xfe992c5e,0xd487e4ec,2
+np.float32,0x4b4dfa,0x2a568216,2
+np.float32,0x3d374c80,0x3eb5c6a8,2
+np.float32,0xbd3a4700,0xbeb6c15c,2
+np.float32,0xbf13cb80,0xbf5529e5,2
+np.float32,0xbe7306d4,0xbf1e7f91,2
+np.float32,0xbf800000,0xbf800000,2
+np.float32,0xbea42efe,0xbf2f394e,2
+np.float32,0x3e1981d0,0x3f07fe2c,2
+np.float32,0x3f17ea1d,0x3f572047,2
+np.float32,0x7dc1e0,0x2a7e7efe,2
+np.float32,0x80169c08,0xaa0fa320,2
+np.float32,0x3f3e1972,0x3f67d248,2
+np.float32,0xfe5d3c88,0xd473d815,2
+np.float32,0xbf677448,0xbf778aac,2
+np.float32,0x7e799b7d,0x547dd9e4,2
+np.float32,0x3f00bb2c,0x3f4b92cf,2
+np.float32,0xbeb29f9c,0xbf343798,2
+np.float32,0xbd6b7830,0xbec59a86,2
+np.float32,0x807a524a,0xaa7c282a,2
+np.float32,0xbe0a7a04,0xbf0366ab,2
+np.float32,0x80237470,0xaa26e061,2
+np.float32,0x3ccbc0f6,0x3e95744f,2
+np.float32,0x3edec6bc,0x3f41fcb6,2
+np.float32,0x3f635198,0x3f760efa,2
+np.float32,0x800eca4f,0xa9f960d8,2
+np.float32,0x3f800000,0x3f800000,2
+np.float32,0xff4eeb9e,0xd4bd456a,2
+np.float32,0x56f4e,0x29b29e70,2
+np.float32,0xff5383a0,0xd4bea95c,2
+np.float32,0x3f4c3a77,0x3f6d6d94,2
+np.float32,0x3f6c324a,0x3f79388c,2
+np.float32,0xbebdc092,0xbf37e27c,2
+np.float32,0xff258956,0xd4afb42e,2
+np.float32,0xdc78c,0x29f39012,2
+np.float32,0xbf2db06a,0xbf60f2f5,2
+np.float32,0xbe3c5808,0xbf119660,2
+np.float32,0xbf1ba866,0xbf58e0f4,2
+np.float32,0x80377640,0xaa41b79d,2
+np.float32,0x4fdc4d,0x2a5abfea,2
+np.float32,0x7f5e7560,0x54c1e516,2
+np.float32,0xfeb4d3f2,0xd48f9fde,2
+np.float32,0x3f12a622,0x3f549c7d,2
+np.float32,0x7f737ed7,0x54c7d2dc,2
+np.float32,0xa0ddc,0x29db456d,2
+np.float32,0xfe006740,0xd44b6689,2
+np.float32,0x3f17dfd4,0x3f571b6c,2
+np.float32,0x67546e,0x2a6e5dd1,2
+np.float32,0xff0d0f11,0xd4a693e2,2
+np.float32,0xbd170090,0xbeaa6738,2
+np.float32,0x5274a0,0x2a5d1806,2
+np.float32,0x3e154fe0,0x3f06be1a,2
+np.float32,0x7ddb302e,0x5440f0a7,2
+np.float32,0x3f579d10,0x3f71c2af,2
+np.float32,0xff2bc5bb,0xd4b1e20c,2
+np.float32,0xfee8fa6a,0xd49c4872,2
+np.float32,0xbea551b0,0xbf2fa07b,2
+np.float32,0xfeabc75c,0xd48d3004,2
+np.float32,0x7f50a5a8,0x54bdcbd1,2
+np.float32,0x50354b,0x2a5b110d,2
+np.float32,0x7d139f13,0x54063b6b,2
+np.float32,0xbeee1b08,0xbf465699,2
+np.float32,0xfe5e1650,0xd47427fe,2
+np.float32,0x7f7fffff,0x54cb2ff5,2
+np.float32,0xbf52ede8,0xbf6fff35,2
+np.float32,0x804bba81,0xaa56e8f1,2
+np.float32,0x6609e2,0x2a6d5e94,2
+np.float32,0x692621,0x2a6fc1d6,2
+np.float32,0xbf288bb6,0xbf5eb4d3,2
+np.float32,0x804f28c4,0xaa5a1b82,2
+np.float32,0xbdaad2a8,0xbedfb46e,2
+np.float32,0x5e04f8,0x2a66fb13,2
+np.float32,0x804c10da,0xaa573a81,2
+np.float32,0xbe412764,0xbf12d0fd,2
+np.float32,0x801c35cc,0xaa1aa250,2
+np.float32,0x6364d4,0x2a6b4cf9,2
+np.float32,0xbf6d3cea,0xbf79962f,2
+np.float32,0x7e5a9935,0x5472defb,2
+np.float32,0xbe73a38c,0xbf1ea19c,2
+np.float32,0xbd35e950,0xbeb550f2,2
+np.float32,0x46cc16,0x2a5223d6,2
+np.float32,0x3f005288,0x3f4b5b97,2
+np.float32,0x8034e8b7,0xaa3eb2be,2
+np.float32,0xbea775fc,0xbf3061cf,2
+np.float32,0xea0e9,0x29f87751,2
+np.float32,0xbf38faaf,0xbf65b89d,2
+np.float32,0xbedf3184,0xbf421bb0,2
+np.float32,0xbe04250c,0xbf015def,2
+np.float32,0x7f56dae8,0x54bfa901,2
+np.float32,0xfebe3e04,0xd492132e,2
+np.float32,0x3e4dc326,0x3f15f19e,2
+np.float32,0x803da197,0xaa48a621,2
+np.float32,0x7eeb35aa,0x549cc7c6,2
+np.float32,0xfebb3eb6,0xd4914dc0,2
+np.float32,0xfed17478,0xd496d5e2,2
+np.float32,0x80243694,0xaa280ed2,2
+np.float32,0x8017e666,0xaa1251d3,2
+np.float32,0xbf07e942,0xbf4f4a3e,2
+np.float32,0xbf578fa6,0xbf71bdab,2
+np.float32,0x7ed8d80f,0x549896b6,2
+np.float32,0x3f2277ae,0x3f5bff11,2
+np.float32,0x7e6f195b,0x547a3cd4,2
+np.float32,0xbf441559,0xbf6a3a91,2
+np.float32,0x7f1fb427,0x54ad9d8d,2
+np.float32,0x71695f,0x2a75e12d,2
+np.float32,0xbd859588,0xbece19a1,2
+np.float32,0x7f5702fc,0x54bfb4eb,2
+np.float32,0x3f040008,0x3f4d4842,2
+np.float32,0x3de00ca5,0x3ef4df89,2
+np.float32,0x3eeabb03,0x3f45658c,2
+np.float32,0x3dfe5e65,0x3eff7480,2
+np.float32,0x1,0x26a14518,2
+np.float32,0x8065e400,0xaa6d4130,2
+np.float32,0xff50e1bb,0xd4bdde07,2
+np.float32,0xbe88635a,0xbf24b7e9,2
+np.float32,0x3f46bfab,0x3f6b4908,2
+np.float32,0xbd85c3c8,0xbece3168,2
+np.float32,0xbe633f64,0xbf1afdb1,2
+np.float32,0xff2c7706,0xd4b21f2a,2
+np.float32,0xbf02816c,0xbf4c812a,2
+np.float32,0x80653aeb,0xaa6cbdab,2
+np.float32,0x3eef1d10,0x3f469e24,2
+np.float32,0x3d9944bf,0x3ed7c36a,2
+np.float32,0x1b03d4,0x2a186b2b,2
+np.float32,0x3f251b7c,0x3f5d2e76,2
+np.float32,0x3edebab0,0x3f41f937,2
+np.float32,0xfefc2148,0xd4a073ff,2
+np.float32,0x7448ee,0x2a77f051,2
+np.float32,0x3bb8a400,0x3e3637ee,2
+np.float32,0x57df36,0x2a61d527,2
+np.float32,0xfd8b9098,0xd425fccb,2
+np.float32,0x7f67627e,0x54c4744d,2
+np.float32,0x801165d7,0xaa039fba,2
+np.float32,0x53aae5,0x2a5e2bfd,2
+np.float32,0x8014012b,0xaa09e4f1,2
+np.float32,0x3f7a2d53,0x3f7e0b4b,2
+np.float32,0x3f5fb700,0x3f74c052,2
+np.float32,0x7f192a06,0x54ab366c,2
+np.float32,0x3f569611,0x3f71603b,2
+np.float32,0x25e2dc,0x2a2a9b65,2
+np.float32,0x8036465e,0xaa405342,2
+np.float32,0x804118e1,0xaa4c5785,2
+np.float32,0xbef08d3e,0xbf4703e1,2
+np.float32,0x3447e2,0x2a3df0be,2
+np.float32,0xbf2a350b,0xbf5f6f8c,2
+np.float32,0xbec87e3e,0xbf3b4a73,2
+np.float32,0xbe99a4a8,0xbf2b6412,2
+np.float32,0x2ea2ae,0x2a36d77e,2
+np.float32,0xfcb69600,0xd3e4b9e3,2
+np.float32,0x717700,0x2a75eb06,2
+np.float32,0xbf4e81ce,0xbf6e4ecc,2
+np.float32,0xbe2021ac,0xbf09ebee,2
+np.float32,0xfef94eee,0xd49fda31,2
+np.float32,0x8563e,0x29ce0015,2
+np.float32,0x7f5d0ca5,0x54c17c0f,2
+np.float32,0x3f16459a,0x3f56590f,2
+np.float32,0xbe12f7bc,0xbf0608a0,2
+np.float32,0x3f10fd3d,0x3f53ce5f,2
+np.float32,0x3ca5e1b0,0x3e8b8d96,2
+np.float32,0xbe5288e0,0xbf17181f,2
+np.float32,0xbf7360f6,0xbf7bb8c9,2
+np.float32,0x7e989d33,0x5487ba88,2
+np.float32,0x3ea7b5dc,0x3f307839,2
+np.float32,0x7e8da0c9,0x548463f0,2
+np.float32,0xfeaf7888,0xd48e3122,2
+np.float32,0x7d90402d,0x5427d321,2
+np.float32,0x72e309,0x2a76f0ee,2
+np.float32,0xbe1faa34,0xbf09c998,2
+np.float32,0xbf2b1652,0xbf5fd1f4,2
+np.float32,0x8051eb0c,0xaa5c9cca,2
+np.float32,0x7edf02bf,0x549a058e,2
+np.float32,0x7fa00000,0x7fe00000,2
+np.float32,0x3f67f873,0x3f77b9c1,2
+np.float32,0x3f276b63,0x3f5e358c,2
+np.float32,0x7eeb4bf2,0x549cccb9,2
+np.float32,0x3bfa2c,0x2a46d675,2
+np.float32,0x3e133c50,0x3f061d75,2
+np.float32,0x3ca302c0,0x3e8abe4a,2
+np.float32,0x802e152e,0xaa361dd5,2
+np.float32,0x3f504810,0x3f6efd0a,2
+np.float32,0xbf43e0b5,0xbf6a2599,2
+np.float32,0x80800000,0xaa800000,2
+np.float32,0x3f1c0980,0x3f590e03,2
+np.float32,0xbf0084f6,0xbf4b7638,2
+np.float32,0xfee72d32,0xd49be10d,2
+np.float32,0x3f3c00ed,0x3f66f763,2
+np.float32,0x80511e81,0xaa5be492,2
+np.float32,0xfdd1b8a0,0xd43e1f0d,2
+np.float32,0x7d877474,0x54245785,2
+np.float32,0x7f110bfe,0x54a82207,2
+np.float32,0xff800000,0xff800000,2
+np.float32,0x6b6a2,0x29bfa706,2
+np.float32,0xbf5bdfd9,0xbf7357b7,2
+np.float32,0x8025bfa3,0xaa2a6676,2
+np.float32,0x3a3581,0x2a44dd3a,2
+np.float32,0x542c2a,0x2a5e9e2f,2
+np.float32,0xbe1d5650,0xbf091d57,2
+np.float32,0x3e97760d,0x3f2a935e,2
+np.float32,0x7f5dcde2,0x54c1b460,2
+np.float32,0x800bde1e,0xa9e7bbaf,2
+np.float32,0x3e6b9e61,0x3f1cdf07,2
+np.float32,0x7d46c003,0x54143884,2
+np.float32,0x80073fbb,0xa9c49e67,2
+np.float32,0x503c23,0x2a5b1748,2
+np.float32,0x7eb7b070,0x549060c8,2
+np.float32,0xe9d8f,0x29f86456,2
+np.float32,0xbeedd4f0,0xbf464320,2
+np.float32,0x3f40d5d6,0x3f68eda1,2
+np.float32,0xff201f28,0xd4adc44b,2
+np.float32,0xbdf61e98,0xbefca9c7,2
+np.float32,0x3e8a0dc9,0x3f2562e3,2
+np.float32,0xbc0c0c80,0xbe515f61,2
+np.float32,0x2b3c15,0x2a3248e3,2
+np.float32,0x42a7bb,0x2a4df592,2
+np.float32,0x7f337947,0x54b480af,2
+np.float32,0xfec21db4,0xd4930f4b,2
+np.float32,0x7f4fdbf3,0x54bd8e94,2
+np.float32,0x1e2253,0x2a1e1286,2
+np.float32,0x800c4c80,0xa9ea819e,2
+np.float32,0x7e96f5b7,0x54873c88,2
+np.float32,0x7ce4e131,0x53f69ed4,2
+np.float32,0xbead8372,0xbf327b63,2
+np.float32,0x3e15ca7e,0x3f06e2f3,2
+np.float32,0xbf63e17b,0xbf7642da,2
+np.float32,0xff5bdbdb,0xd4c122f9,2
+np.float32,0x3f44411e,0x3f6a4bfd,2
+np.float32,0xfd007da0,0xd40029d2,2
+np.float32,0xbe940168,0xbf2944b7,2
+np.float32,0x80000000,0x80000000,2
+np.float32,0x3d28e356,0x3eb0e1b8,2
+np.float32,0x3eb9fcd8,0x3f36a918,2
+np.float32,0x4f6410,0x2a5a51eb,2
+np.float32,0xbdf18e30,0xbefb1775,2
+np.float32,0x32edbd,0x2a3c49e3,2
+np.float32,0x801f70a5,0xaa2052da,2
+np.float32,0x8045a045,0xaa50f98c,2
+np.float32,0xbdd6cb00,0xbef17412,2
+np.float32,0x3f118f2c,0x3f541557,2
+np.float32,0xbe65c378,0xbf1b8f95,2
+np.float32,0xfd9a9060,0xd42bbb8b,2
+np.float32,0x3f04244f,0x3f4d5b0f,2
+np.float32,0xff05214b,0xd4a3656f,2
+np.float32,0xfe342cd0,0xd463b706,2
+np.float32,0x3f3409a8,0x3f63a836,2
+np.float32,0x80205db2,0xaa21e1e5,2
+np.float32,0xbf37c982,0xbf653a03,2
+np.float32,0x3f36ce8f,0x3f64d17e,2
+np.float32,0x36ffda,0x2a412d61,2
+np.float32,0xff569752,0xd4bf94e6,2
+np.float32,0x802fdb0f,0xaa386c3a,2
+np.float32,0x7ec55a87,0x5493df71,2
+np.float32,0x7f2234c7,0x54ae847e,2
+np.float32,0xbf02df76,0xbf4cb23d,2
+np.float32,0x3d68731a,0x3ec4c156,2
+np.float32,0x8146,0x2921cd8e,2
+np.float32,0x80119364,0xaa041235,2
+np.float32,0xfe6c1c00,0xd47930b5,2
+np.float32,0x8070da44,0xaa757996,2
+np.float32,0xfefbf50c,0xd4a06a9d,2
+np.float32,0xbf01b6a8,0xbf4c170a,2
+np.float32,0x110702,0x2a02aedb,2
+np.float32,0xbf063cd4,0xbf4e6f87,2
+np.float32,0x3f1ff178,0x3f5ad9dd,2
+np.float32,0xbf76dcd4,0xbf7cead0,2
+np.float32,0x80527281,0xaa5d1620,2
+np.float32,0xfea96df8,0xd48c8a7f,2
+np.float32,0x68db02,0x2a6f88b0,2
+np.float32,0x62d971,0x2a6adec7,2
+np.float32,0x3e816fe0,0x3f21df04,2
+np.float32,0x3f586379,0x3f720cc0,2
+np.float32,0x804a3718,0xaa5577ff,2
+np.float32,0x2e2506,0x2a3632b2,2
+np.float32,0x3f297d,0x2a4a4bf3,2
+np.float32,0xbe37aba8,0xbf105f88,2
+np.float32,0xbf18b264,0xbf577ea7,2
+np.float32,0x7f50d02d,0x54bdd8b5,2
+np.float32,0xfee296dc,0xd49ad757,2
+np.float32,0x7ec5137e,0x5493cdb1,2
+np.float32,0x3f4811f4,0x3f6bce3a,2
+np.float32,0xfdff32a0,0xd44af991,2
+np.float32,0x3f6ef140,0x3f7a2ed6,2
+np.float32,0x250838,0x2a2950b5,2
+np.float32,0x25c28e,0x2a2a6ada,2
+np.float32,0xbe875e50,0xbf244e90,2
+np.float32,0x3e3bdff8,0x3f11776a,2
+np.float32,0x3e9fe493,0x3f2daf17,2
+np.float32,0x804d8599,0xaa5897d9,2
+np.float32,0x3f0533da,0x3f4de759,2
+np.float32,0xbe63023c,0xbf1aefc8,2
+np.float32,0x80636e5e,0xaa6b547f,2
+np.float32,0xff112958,0xd4a82d5d,2
+np.float32,0x3e924112,0x3f28991f,2
+np.float32,0xbe996ffc,0xbf2b507a,2
+np.float32,0x802a7cda,0xaa314081,2
+np.float32,0x8022b524,0xaa25b21e,2
+np.float32,0x3f0808c8,0x3f4f5a43,2
+np.float32,0xbef0ec2a,0xbf471e0b,2
+np.float32,0xff4c2345,0xd4bc6b3c,2
+np.float32,0x25ccc8,0x2a2a7a3b,2
+np.float32,0x7f4467d6,0x54ba0260,2
+np.float32,0x7f506539,0x54bdb846,2
+np.float32,0x412ab4,0x2a4c6a2a,2
+np.float32,0x80672c4a,0xaa6e3ef0,2
+np.float32,0xbddfb7f8,0xbef4c0ac,2
+np.float32,0xbf250bb9,0xbf5d276c,2
+np.float32,0x807dca65,0xaa7e84bd,2
+np.float32,0xbf63b8e0,0xbf763438,2
+np.float32,0xbeed1b0c,0xbf460f6b,2
+np.float32,0x8021594f,0xaa238136,2
+np.float32,0xbebc74c8,0xbf377710,2
+np.float32,0x3e9f8e3b,0x3f2d8fce,2
+np.float32,0x7f50ca09,0x54bdd6d8,2
+np.float32,0x805797c1,0xaa6197df,2
+np.float32,0x3de198f9,0x3ef56f98,2
+np.float32,0xf154d,0x29fb0392,2
+np.float32,0xff7fffff,0xd4cb2ff5,2
+np.float32,0xfed22fa8,0xd49702c4,2
+np.float32,0xbf733736,0xbf7baa64,2
+np.float32,0xbf206a8a,0xbf5b1108,2
+np.float32,0xbca49680,0xbe8b3078,2
+np.float32,0xfecba794,0xd4956e1a,2
+np.float32,0x80126582,0xaa061886,2
+np.float32,0xfee5cc82,0xd49b919f,2
+np.float32,0xbf7ad6ae,0xbf7e4491,2
+np.float32,0x7ea88c81,0x548c4c0c,2
+np.float32,0xbf493a0d,0xbf6c4255,2
+np.float32,0xbf06dda0,0xbf4ec1d4,2
+np.float32,0xff3f6e84,0xd4b86cf6,2
+np.float32,0x3e4fe093,0x3f1674b0,2
+np.float32,0x8048ad60,0xaa53fbde,2
+np.float32,0x7ebb7112,0x54915ac5,2
+np.float32,0x5bd191,0x2a652a0d,2
+np.float32,0xfe3121d0,0xd4626cfb,2
+np.float32,0x7e4421c6,0x546a3f83,2
+np.float32,0x19975b,0x2a15b14f,2
+np.float32,0x801c8087,0xaa1b2a64,2
+np.float32,0xfdf6e950,0xd448c0f6,2
+np.float32,0x74e711,0x2a786083,2
+np.float32,0xbf2b2f2e,0xbf5fdccb,2
+np.float32,0x7ed19ece,0x5496e00b,2
+np.float32,0x7f6f8322,0x54c6ba63,2
+np.float32,0x3e90316d,0x3f27cd69,2
+np.float32,0x7ecb42ce,0x54955571,2
+np.float32,0x3f6d49be,0x3f799aaf,2
+np.float32,0x8053d327,0xaa5e4f9a,2
+np.float32,0x7ebd7361,0x5491df3e,2
+np.float32,0xfdb6eed0,0xd435a7aa,2
+np.float32,0x7f3e79f4,0x54b81e4b,2
+np.float32,0xfe83afa6,0xd4813794,2
+np.float32,0x37c443,0x2a421246,2
+np.float32,0xff075a10,0xd4a44cd8,2
+np.float32,0x3ebc5fe0,0x3f377047,2
+np.float32,0x739694,0x2a77714e,2
+np.float32,0xfe832946,0xd4810b91,2
+np.float32,0x7f2638e6,0x54aff235,2
+np.float32,0xfe87f7a6,0xd4829a3f,2
+np.float32,0x3f50f3f8,0x3f6f3eb8,2
+np.float32,0x3eafa3d0,0x3f333548,2
+np.float32,0xbec26ee6,0xbf39626f,2
+np.float32,0x7e6f924f,0x547a66ff,2
+np.float32,0x7f0baa46,0x54a606f8,2
+np.float32,0xbf6dfc49,0xbf79d939,2
+np.float32,0x7f005709,0x54a1699d,2
+np.float32,0x7ee3d7ef,0x549b2057,2
+np.float32,0x803709a4,0xaa4138d7,2
+np.float32,0x3f7bf49a,0x3f7ea509,2
+np.float32,0x509db7,0x2a5b6ff5,2
+np.float32,0x7eb1b0d4,0x548ec9ff,2
+np.float32,0x7eb996ec,0x5490dfce,2
+np.float32,0xbf1fcbaa,0xbf5ac89e,2
+np.float32,0x3e2c9a98,0x3f0d69cc,2
+np.float32,0x3ea77994,0x3f306312,2
+np.float32,0x3f3cbfe4,0x3f67457c,2
+np.float32,0x8422a,0x29cd5a30,2
+np.float32,0xbd974558,0xbed6d264,2
+np.float32,0xfecee77a,0xd496387f,2
+np.float32,0x3f51876b,0x3f6f76f1,2
+np.float32,0x3b1a25,0x2a45ddad,2
+np.float32,0xfe9912f0,0xd487dd67,2
+np.float32,0x3f3ab13d,0x3f666d99,2
+np.float32,0xbf35565a,0xbf64341b,2
+np.float32,0x7d4e84aa,0x54162091,2
+np.float32,0x4c2570,0x2a574dea,2
+np.float32,0x7e82dca6,0x5480f26b,2
+np.float32,0x7f5503e7,0x54bf1c8d,2
+np.float32,0xbeb85034,0xbf361c59,2
+np.float32,0x80460a69,0xaa516387,2
+np.float32,0x805fbbab,0xaa68602c,2
+np.float32,0x7d4b4c1b,0x541557b8,2
+np.float32,0xbefa9a0a,0xbf49bfbc,2
+np.float32,0x3dbd233f,0x3ee76e09,2
+np.float32,0x58b6df,0x2a628d50,2
+np.float32,0xfcdcc180,0xd3f3aad9,2
+np.float32,0x423a37,0x2a4d8487,2
+np.float32,0xbed8b32a,0xbf403507,2
+np.float32,0x3f68e85d,0x3f780f0b,2
+np.float32,0x7ee13c4b,0x549a883d,2
+np.float32,0xff2ed4c5,0xd4b2eec1,2
+np.float32,0xbf54dadc,0xbf70b99a,2
+np.float32,0x3f78b0af,0x3f7d8a32,2
+np.float32,0x3f377372,0x3f651635,2
+np.float32,0xfdaa6178,0xd43166bc,2
+np.float32,0x8060c337,0xaa6934a6,2
+np.float32,0x7ec752c2,0x54945cf6,2
+np.float32,0xbd01a760,0xbea1f624,2
+np.float32,0x6f6599,0x2a746a35,2
+np.float32,0x3f6315b0,0x3f75f95b,2
+np.float32,0x7f2baf32,0x54b1da44,2
+np.float32,0x3e400353,0x3f1286d8,2
+np.float32,0x40d3bf,0x2a4c0f15,2
+np.float32,0x7f733aca,0x54c7c03d,2
+np.float32,0x7e5c5407,0x5473828b,2
+np.float32,0x80191703,0xaa14b56a,2
+np.float32,0xbf4fc144,0xbf6ec970,2
+np.float32,0xbf1137a7,0xbf53eacd,2
+np.float32,0x80575410,0xaa615db3,2
+np.float32,0xbd0911d0,0xbea4fe07,2
+np.float32,0x3e98534a,0x3f2ae643,2
+np.float32,0x3f3b089a,0x3f669185,2
+np.float32,0x4fc752,0x2a5aacc1,2
+np.float32,0xbef44ddc,0xbf480b6e,2
+np.float32,0x80464217,0xaa519af4,2
+np.float32,0x80445fae,0xaa4fb6de,2
+np.float32,0x80771cf4,0xaa79eec8,2
+np.float32,0xfd9182e8,0xd4284fed,2
+np.float32,0xff0a5d16,0xd4a58288,2
+np.float32,0x3f33e169,0x3f63973e,2
+np.float32,0x8021a247,0xaa23f820,2
+np.float32,0xbf362522,0xbf648ab8,2
+np.float32,0x3f457cd7,0x3f6ac95e,2
+np.float32,0xbcadf400,0xbe8dc7e2,2
+np.float32,0x80237210,0xaa26dca7,2
+np.float32,0xbf1293c9,0xbf54939f,2
+np.float32,0xbc5e73c0,0xbe744a37,2
+np.float32,0x3c03f980,0x3e4d44df,2
+np.float32,0x7da46f,0x2a7e6b20,2
+np.float32,0x5d4570,0x2a665dd0,2
+np.float32,0x3e93fbac,0x3f294287,2
+np.float32,0x7e6808fd,0x5477bfa4,2
+np.float32,0xff5aa9a6,0xd4c0c925,2
+np.float32,0xbf5206ba,0xbf6fa767,2
+np.float32,0xbf6e513e,0xbf79f6f1,2
+np.float32,0x3ed01c0f,0x3f3da20f,2
+np.float32,0xff47d93d,0xd4bb1704,2
+np.float32,0x7f466cfd,0x54baa514,2
+np.float32,0x665e10,0x2a6d9fc8,2
+np.float32,0x804d0629,0xaa5820e8,2
+np.float32,0x7e0beaa0,0x54514e7e,2
+np.float32,0xbf7fcb6c,0xbf7fee78,2
+np.float32,0x3f6c5b03,0x3f7946dd,2
+np.float32,0x3e941504,0x3f294c30,2
+np.float32,0xbf2749ad,0xbf5e26a1,2
+np.float32,0xfec2a00a,0xd493302d,2
+np.float32,0x3f15a358,0x3f560bce,2
+np.float32,0x3f15c4e7,0x3f561bcd,2
+np.float32,0xfedc8692,0xd499728c,2
+np.float32,0x7e8f6902,0x5484f180,2
+np.float32,0x7f663d62,0x54c42136,2
+np.float32,0x8027ea62,0xaa2d99b4,2
+np.float32,0x3f3d093d,0x3f67636d,2
+np.float32,0x7f118c33,0x54a85382,2
+np.float32,0x803e866a,0xaa499d43,2
+np.float32,0x80053632,0xa9b02407,2
+np.float32,0xbf36dd66,0xbf64d7af,2
+np.float32,0xbf560358,0xbf71292b,2
+np.float32,0x139a8,0x29596bc0,2
+np.float32,0xbe04f75c,0xbf01a26c,2
+np.float32,0xfe1c3268,0xd45920fa,2
+np.float32,0x7ec77f72,0x5494680c,2
+np.float32,0xbedde724,0xbf41bbba,2
+np.float32,0x3e81dbe0,0x3f220bfd,2
+np.float32,0x800373ac,0xa99989d4,2
+np.float32,0x3f7f859a,0x3f7fd72d,2
+np.float32,0x3eb9dc7e,0x3f369e80,2
+np.float32,0xff5f8eb7,0xd4c236b1,2
+np.float32,0xff1c03cb,0xd4ac44ac,2
+np.float32,0x18cfe1,0x2a14285b,2
+np.float32,0x7f21b075,0x54ae54fd,2
+np.float32,0xff490bd8,0xd4bb7680,2
+np.float32,0xbf15dc22,0xbf5626de,2
+np.float32,0xfe1d5a10,0xd459a9a3,2
+np.float32,0x750544,0x2a7875e4,2
+np.float32,0x8023d5df,0xaa2778b3,2
+np.float32,0x3e42aa08,0x3f1332b2,2
+np.float32,0x3ecaa751,0x3f3bf60d,2
+np.float32,0x0,0x0,2
+np.float32,0x80416da6,0xaa4cb011,2
+np.float32,0x3f4ea9ae,0x3f6e5e22,2
+np.float32,0x2113f4,0x2a230f8e,2
+np.float32,0x3f35c2e6,0x3f64619a,2
+np.float32,0xbf50db8a,0xbf6f3564,2
+np.float32,0xff4d5cea,0xd4bccb8a,2
+np.float32,0x7ee54420,0x549b72d2,2
+np.float32,0x64ee68,0x2a6c81f7,2
+np.float32,0x5330da,0x2a5dbfc2,2
+np.float32,0x80047f88,0xa9a7b467,2
+np.float32,0xbda01078,0xbedae800,2
+np.float32,0xfe96d05a,0xd487315f,2
+np.float32,0x8003cc10,0xa99e7ef4,2
+np.float32,0x8007b4ac,0xa9c8aa3d,2
+np.float32,0x5d4bcf,0x2a66630e,2
+np.float32,0xfdd0c0b0,0xd43dd403,2
+np.float32,0xbf7a1d82,0xbf7e05f0,2
+np.float32,0x74ca33,0x2a784c0f,2
+np.float32,0x804f45e5,0xaa5a3640,2
+np.float32,0x7e6d16aa,0x547988c4,2
+np.float32,0x807d5762,0xaa7e3714,2
+np.float32,0xfecf93d0,0xd4966229,2
+np.float32,0xfecbd25c,0xd4957890,2
+np.float32,0xff7db31c,0xd4ca93b0,2
+np.float32,0x3dac9e18,0x3ee07c4a,2
+np.float32,0xbf4b2d28,0xbf6d0509,2
+np.float32,0xbd4f4c50,0xbebd62e0,2
+np.float32,0xbd2eac40,0xbeb2e0ee,2
+np.float32,0x3d01b69b,0x3ea1fc7b,2
+np.float32,0x7ec63902,0x549416ed,2
+np.float32,0xfcc47700,0xd3ea616d,2
+np.float32,0xbf5ddec2,0xbf7413a1,2
+np.float32,0xff6a6110,0xd4c54c52,2
+np.float32,0xfdfae2a0,0xd449d335,2
+np.float32,0x7e54868c,0x547099cd,2
+np.float32,0x802b5b88,0xaa327413,2
+np.float32,0x80440e72,0xaa4f647a,2
+np.float32,0x3e313c94,0x3f0eaad5,2
+np.float32,0x3ebb492a,0x3f3715a2,2
+np.float32,0xbef56286,0xbf4856d5,2
+np.float32,0x3f0154ba,0x3f4be3a0,2
+np.float32,0xff2df86c,0xd4b2a376,2
+np.float32,0x3ef6a850,0x3f48af57,2
+np.float32,0x3d8d33e1,0x3ed1f22d,2
+np.float32,0x4dd9b9,0x2a58e615,2
+np.float32,0x7f1caf83,0x54ac83c9,2
+np.float32,0xbf7286b3,0xbf7b6d73,2
+np.float32,0x80064f88,0xa9bbbd9f,2
+np.float32,0xbf1f55fa,0xbf5a92db,2
+np.float32,0x546a81,0x2a5ed516,2
+np.float32,0xbe912880,0xbf282d0a,2
+np.float32,0x5df587,0x2a66ee6e,2
+np.float32,0x801f706c,0xaa205279,2
+np.float32,0x58cb6d,0x2a629ece,2
+np.float32,0xfe754f8c,0xd47c62da,2
+np.float32,0xbefb6f4c,0xbf49f8e7,2
+np.float32,0x80000001,0xa6a14518,2
+np.float32,0xbf067837,0xbf4e8df4,2
+np.float32,0x3e8e715c,0x3f271ee4,2
+np.float32,0x8009de9b,0xa9d9ebc8,2
+np.float32,0xbf371ff1,0xbf64f36e,2
+np.float32,0x7f5ce661,0x54c170e4,2
+np.float32,0x3f3c47d1,0x3f671467,2
+np.float32,0xfea5e5a6,0xd48b8eb2,2
+np.float32,0xff62b17f,0xd4c31e15,2
+np.float32,0xff315932,0xd4b3c98f,2
+np.float32,0xbf1c3ca8,0xbf5925b9,2
+np.float32,0x7f800000,0x7f800000,2
+np.float32,0xfdf20868,0xd4476c3b,2
+np.float32,0x5b790e,0x2a64e052,2
+np.float32,0x3f5ddf4e,0x3f7413d4,2
+np.float32,0x7f1a3182,0x54ab9861,2
+np.float32,0x3f4b906e,0x3f6d2b9d,2
+np.float32,0x7ebac760,0x54912edb,2
+np.float32,0x7f626d3f,0x54c30a7e,2
+np.float32,0x3e27b058,0x3f0c0edc,2
+np.float32,0x8041e69c,0xaa4d2de8,2
+np.float32,0x3f42cee0,0x3f69b84a,2
+np.float32,0x7ec5fe83,0x5494085b,2
+np.float32,0x9d3e6,0x29d99cde,2
+np.float32,0x3edc50c0,0x3f41452d,2
+np.float32,0xbf2c463a,0xbf60562c,2
+np.float32,0x800bfa33,0xa9e871e8,2
+np.float32,0x7c9f2c,0x2a7dba4d,2
+np.float32,0x7f2ef9fd,0x54b2fb73,2
+np.float32,0x80741847,0xaa77cdb9,2
+np.float32,0x7e9c462a,0x5488ce1b,2
+np.float32,0x3ea47ec1,0x3f2f55a9,2
+np.float32,0x7f311c43,0x54b3b4f5,2
+np.float32,0x3d8f4c73,0x3ed2facd,2
+np.float32,0x806d7bd2,0xaa7301ef,2
+np.float32,0xbf633d24,0xbf760799,2
+np.float32,0xff4f9a3f,0xd4bd7a99,2
+np.float32,0x3f6021ca,0x3f74e73d,2
+np.float32,0x7e447015,0x546a5eac,2
+np.float32,0x6bff3c,0x2a71e711,2
+np.float32,0xe9c9f,0x29f85f06,2
+np.float32,0x8009fe14,0xa9dad277,2
+np.float32,0x807cf79c,0xaa7df644,2
+np.float32,0xff440e1b,0xd4b9e608,2
+np.float32,0xbddf9a50,0xbef4b5db,2
+np.float32,0x7f3b1c39,0x54b706fc,2
+np.float32,0x3c7471a0,0x3e7c16a7,2
+np.float32,0x8065b02b,0xaa6d18ee,2
+np.float32,0x7f63a3b2,0x54c36379,2
+np.float32,0xbe9c9d92,0xbf2c7d33,2
+np.float32,0x3d93aad3,0x3ed51a2e,2
+np.float32,0xbf41b040,0xbf694571,2
+np.float32,0x80396b9e,0xaa43f899,2
+np.float64,0x800fa025695f404b,0xaaa4000ff64bb00c,2
+np.float64,0xbfecc00198f98003,0xbfeee0b623fbd94b,2
+np.float64,0x7f9eeb60b03dd6c0,0x55291bf8554bb303,2
+np.float64,0x3fba74485634e890,0x3fde08710bdb148d,2
+np.float64,0xbfdd9a75193b34ea,0xbfe8bf711660a2f5,2
+np.float64,0xbfcf92e17a3f25c4,0xbfe4119eda6f3773,2
+np.float64,0xbfe359e2ba66b3c6,0xbfeb0f7ae97ea142,2
+np.float64,0x20791a5640f24,0x2a9441f13d262bed,2
+np.float64,0x3fe455fbfae8abf8,0x3feb830d63e1022c,2
+np.float64,0xbd112b7b7a226,0x2aa238c097ec269a,2
+np.float64,0x93349ba126694,0x2aa0c363cd74465a,2
+np.float64,0x20300cd440602,0x2a9432b4f4081209,2
+np.float64,0x3fdcfae677b9f5cc,0x3fe892a9ee56fe8d,2
+np.float64,0xbfefaae3f7bf55c8,0xbfefe388066132c4,2
+np.float64,0x1a7d6eb634faf,0x2a92ed9851d29ab5,2
+np.float64,0x7fd5308d39aa6119,0x553be444e30326c6,2
+np.float64,0xff811c7390223900,0xd5205cb404952fa7,2
+np.float64,0x80083d24aff07a4a,0xaaa0285cf764d898,2
+np.float64,0x800633810ccc6703,0xaa9d65341419586b,2
+np.float64,0x800ff456223fe8ac,0xaaa423bbcc24dff1,2
+np.float64,0x7fde5c99aebcb932,0x553f71be7d6d9daa,2
+np.float64,0x3fed961c4b3b2c39,0x3fef2ca146270cac,2
+np.float64,0x7fe744d30c6e89a5,0x554220a4cdc78e62,2
+np.float64,0x3fd8f527c7b1ea50,0x3fe76101085be1cb,2
+np.float64,0xbfc96a14b232d428,0xbfe2ab1a8962606c,2
+np.float64,0xffe85f540cf0bea7,0xd54268dff964519a,2
+np.float64,0x800e3be0fe7c77c2,0xaaa3634efd7f020b,2
+np.float64,0x3feb90d032f721a0,0x3fee72a4579e8b12,2
+np.float64,0xffe05674aaa0ace9,0xd5401c9e3fb4abcf,2
+np.float64,0x3fefc2e32c3f85c6,0x3fefeb940924bf42,2
+np.float64,0xbfecfd89e9f9fb14,0xbfeef6addf73ee49,2
+np.float64,0xf5862717eb0c5,0x2aa3e1428780382d,2
+np.float64,0xffc3003b32260078,0xd53558f92202dcdb,2
+np.float64,0x3feb4c152c36982a,0x3fee5940f7da0825,2
+np.float64,0x3fe7147b002e28f6,0x3fecb2948f46d1e3,2
+np.float64,0x7fe00ad9b4a015b2,0x5540039d15e1da54,2
+np.float64,0x8010000000000000,0xaaa428a2f98d728b,2
+np.float64,0xbfd3a41bfea74838,0xbfe595ab45b1be91,2
+np.float64,0x7fdbfd6e5537fadc,0x553e9a6e1107b8d0,2
+np.float64,0x800151d9d9a2a3b4,0xaa918cd8fb63f40f,2
+np.float64,0x7fe6828401ad0507,0x5541eda05dcd1fcf,2
+np.float64,0x3fdae1e7a1b5c3d0,0x3fe7f711e72ecc35,2
+np.float64,0x7fdf4936133e926b,0x553fc29c8d5edea3,2
+np.float64,0x80079de12d4f3bc3,0xaa9f7b06a9286da4,2
+np.float64,0x3fe1261cade24c39,0x3fe9fe09488e417a,2
+np.float64,0xbfc20dce21241b9c,0xbfe0a842fb207a28,2
+np.float64,0x3fe3285dfa2650bc,0x3feaf85215f59ef9,2
+np.float64,0x7fe42b93aea85726,0x554148c3c3bb35e3,2
+np.float64,0xffe6c74e7f6d8e9c,0xd541ffd13fa36dbd,2
+np.float64,0x3fe73ea139ee7d42,0x3fecc402242ab7d3,2
+np.float64,0xffbd4b46be3a9690,0xd53392de917c72e4,2
+np.float64,0x800caed8df395db2,0xaaa2a811a02e6be4,2
+np.float64,0x800aacdb6c9559b7,0xaaa19d6fbc8feebf,2
+np.float64,0x839fb4eb073f7,0x2aa0264b98327c12,2
+np.float64,0xffd0157ba9a02af8,0xd5397157a11c0d05,2
+np.float64,0x7fddc8ff173b91fd,0x553f3e7663fb2ac7,2
+np.float64,0x67b365facf66d,0x2a9dd4d838b0d853,2
+np.float64,0xffe12e7fc7225cff,0xd5406272a83a8e1b,2
+np.float64,0x7fea5b19a034b632,0x5542e567658b3e36,2
+np.float64,0x124989d824932,0x2a90ba8dc7a39532,2
+np.float64,0xffe12ef098225de0,0xd54062968450a078,2
+np.float64,0x3fea2f44a3f45e8a,0x3fedee3c461f4716,2
+np.float64,0x3fe6b033e66d6068,0x3fec88c8035e06b1,2
+np.float64,0x3fe928a2ccf25146,0x3fed88d4cde7a700,2
+np.float64,0x3feead27e97d5a50,0x3fef8d7537d82e60,2
+np.float64,0x8003ab80b6875702,0xaa98adfedd7715a9,2
+np.float64,0x45a405828b481,0x2a9a1fa99a4eff1e,2
+np.float64,0x8002ddebad85bbd8,0xaa96babfda4e0031,2
+np.float64,0x3fc278c32824f186,0x3fe0c8e7c979fbd5,2
+np.float64,0x2e10fffc5c221,0x2a96c30a766d06fa,2
+np.float64,0xffd6ba8c2ead7518,0xd53c8d1d92bc2788,2
+np.float64,0xbfeb5ec3a036bd87,0xbfee602bbf0a0d01,2
+np.float64,0x3fed5bd58f7ab7ab,0x3fef181bf591a4a7,2
+np.float64,0x7feb5274a5b6a4e8,0x55431fcf81876218,2
+np.float64,0xaf8fd6cf5f1fb,0x2aa1c6edbb1e2aaf,2
+np.float64,0x7fece718f179ce31,0x55437c74efb90933,2
+np.float64,0xbfa3c42d0c278860,0xbfd5a16407c77e73,2
+np.float64,0x800b5cff0576b9fe,0xaaa1fc4ecb0dec4f,2
+np.float64,0x800be89ae557d136,0xaaa244d115fc0963,2
+np.float64,0x800d2578f5ba4af2,0xaaa2e18a3a3fc134,2
+np.float64,0x80090ff93e321ff3,0xaaa0add578e3cc3c,2
+np.float64,0x28c5a240518c,0x2a81587cccd7e202,2
+np.float64,0x7fec066929780cd1,0x55434971435d1069,2
+np.float64,0x7fc84d4d15309a99,0x55372c204515694f,2
+np.float64,0xffe070a75de0e14e,0xd54025365046dad2,2
+np.float64,0x7fe5b27cc36b64f9,0x5541b5b822f0b6ca,2
+np.float64,0x3fdea35ac8bd46b6,0x3fe9086a0fb792c2,2
+np.float64,0xbfe79996f7af332e,0xbfece9571d37a5b3,2
+np.float64,0xffdfb47f943f6900,0xd53fe6c14c3366db,2
+np.float64,0xc015cf63802ba,0x2aa2517164d075f4,2
+np.float64,0x7feba98948375312,0x5543340b5b1f1181,2
+np.float64,0x8008678e6550cf1d,0xaaa043e7cea90da5,2
+np.float64,0x3fb11b92fa223726,0x3fd9f8b53be4d90b,2
+np.float64,0x7fc9b18cf0336319,0x55379b42da882047,2
+np.float64,0xbfe5043e736a087d,0xbfebd0c67db7a8e3,2
+np.float64,0x7fde88546a3d10a8,0x553f80cfe5bcf5fe,2
+np.float64,0x8006a6c82dcd4d91,0xaa9e171d182ba049,2
+np.float64,0xbfa0f707ac21ee10,0xbfd48e5d3faa1699,2
+np.float64,0xbfe7716bffaee2d8,0xbfecd8e6abfb8964,2
+np.float64,0x9511ccab2a23a,0x2aa0d56d748f0313,2
+np.float64,0x8003ddb9b847bb74,0xaa991ca06fd9d308,2
+np.float64,0x80030710fac60e23,0xaa9725845ac95fe8,2
+np.float64,0xffece5bbaeb9cb76,0xd5437c2670f894f4,2
+np.float64,0x3fd9be5c72b37cb9,0x3fe79f2e932a5708,2
+np.float64,0x1f050cca3e0a3,0x2a93f36499fe5228,2
+np.float64,0x3fd5422becaa8458,0x3fe6295d6150df58,2
+np.float64,0xffd72c050e2e580a,0xd53cbc52d73b495f,2
+np.float64,0xbfe66d5235ecdaa4,0xbfec6ca27e60bf23,2
+np.float64,0x17ac49a42f58a,0x2a923b5b757087a0,2
+np.float64,0xffd39edc40273db8,0xd53b2f7bb99b96bf,2
+np.float64,0x7fde6cf009bcd9df,0x553f77614eb30d75,2
+np.float64,0x80042b4c3fa85699,0xaa99c05fbdd057db,2
+np.float64,0xbfde5547f8bcaa90,0xbfe8f3147d67a940,2
+np.float64,0xbfdd02f9bf3a05f4,0xbfe894f2048aa3fe,2
+np.float64,0xbfa20ec82c241d90,0xbfd4fd02ee55aac7,2
+np.float64,0x8002f670f8c5ece3,0xaa96fad7e53dd479,2
+np.float64,0x80059f24d7eb3e4a,0xaa9c7312dae0d7bc,2
+np.float64,0x7fe6ae7423ad5ce7,0x5541f9430be53062,2
+np.float64,0xe135ea79c26be,0x2aa350d8f8c526e1,2
+np.float64,0x3fec188ce4f8311a,0x3feea44d21c23f68,2
+np.float64,0x800355688286aad2,0xaa97e6ca51eb8357,2
+np.float64,0xa2d6530b45acb,0x2aa15635bbd366e8,2
+np.float64,0x600e0150c01c1,0x2a9d1456ea6c239c,2
+np.float64,0x8009c30863338611,0xaaa118f94b188bcf,2
+np.float64,0x3fe7e4c0dfefc982,0x3fed07e8480b8c07,2
+np.float64,0xbfddac6407bb58c8,0xbfe8c46f63a50225,2
+np.float64,0xbc85e977790bd,0x2aa2344636ed713d,2
+np.float64,0xfff0000000000000,0xfff0000000000000,2
+np.float64,0xffcd1570303a2ae0,0xd5389a27d5148701,2
+np.float64,0xbf937334d026e660,0xbfd113762e4e29a7,2
+np.float64,0x3fdbfdaa9b37fb55,0x3fe84a425fdff7df,2
+np.float64,0xffc10800f5221000,0xd5349535ffe12030,2
+np.float64,0xaf40f3755e81f,0x2aa1c443af16cd27,2
+np.float64,0x800f7da34f7efb47,0xaaa3f14bf25fc89f,2
+np.float64,0xffe4a60125a94c02,0xd5416b764a294128,2
+np.float64,0xbf8e25aa903c4b40,0xbfcf5ebc275b4789,2
+np.float64,0x3fca681bbb34d038,0x3fe2e882bcaee320,2
+np.float64,0xbfd0f3c9c1a1e794,0xbfe48d0df7b47572,2
+np.float64,0xffeb99b49d373368,0xd5433060dc641910,2
+np.float64,0x3fe554fb916aa9f8,0x3febf437cf30bd67,2
+np.float64,0x80079518d0af2a32,0xaa9f6ee87044745a,2
+np.float64,0x5e01a8a0bc036,0x2a9cdf0badf222c3,2
+np.float64,0xbfea9831b3f53064,0xbfee1601ee953ab3,2
+np.float64,0xbfc369d1a826d3a4,0xbfe110b675c311e0,2
+np.float64,0xa82e640d505cd,0x2aa1863d4e523b9c,2
+np.float64,0x3fe506d70a2a0dae,0x3febd1eba3aa83fa,2
+np.float64,0xcbacba7197598,0x2aa2adeb9927f1f2,2
+np.float64,0xc112d6038225b,0x2aa25978f12038b0,2
+np.float64,0xffa7f5f44c2febf0,0xd52d0ede02d4e18b,2
+np.float64,0x8006f218e34de433,0xaa9e870cf373b4eb,2
+np.float64,0xffe6d9a5d06db34b,0xd54204a4adc608c7,2
+np.float64,0x7fe717210eae2e41,0x554214bf3e2b5228,2
+np.float64,0xbfdd4b45cdba968c,0xbfe8a94c7f225f8e,2
+np.float64,0x883356571066b,0x2aa055ab0b2a8833,2
+np.float64,0x3fe307fc02a60ff8,0x3feae9175053288f,2
+np.float64,0x3fefa985f77f530c,0x3fefe31289446615,2
+np.float64,0x8005698a98aad316,0xaa9c17814ff7d630,2
+np.float64,0x3fea77333c74ee66,0x3fee098ba70e10fd,2
+np.float64,0xbfd1d00b0023a016,0xbfe4e497fd1cbea1,2
+np.float64,0x80009b0c39813619,0xaa8b130a6909cc3f,2
+np.float64,0x3fdbeb896fb7d714,0x3fe84502ba5437f8,2
+np.float64,0x3fb6e7e3562dcfc7,0x3fdca00d35c389ad,2
+np.float64,0xb2d46ebf65a8e,0x2aa1e2fe158d0838,2
+np.float64,0xbfd5453266aa8a64,0xbfe62a6a74c8ef6e,2
+np.float64,0x7fe993aa07732753,0x5542b5438bf31cb7,2
+np.float64,0xbfda5a098cb4b414,0xbfe7ce6d4d606203,2
+np.float64,0xbfe40c3ce068187a,0xbfeb61a32c57a6d0,2
+np.float64,0x3fcf17671d3e2ed0,0x3fe3f753170ab686,2
+np.float64,0xbfe4f814b6e9f02a,0xbfebcb67c60b7b08,2
+np.float64,0x800efedf59fdfdbf,0xaaa3ba4ed44ad45a,2
+np.float64,0x800420b556e8416b,0xaa99aa7fb14edeab,2
+np.float64,0xbf6e4ae6403c9600,0xbfc3cb2b29923989,2
+np.float64,0x3fda5c760a34b8ec,0x3fe7cf2821c52391,2
+np.float64,0x7f898faac0331f55,0x5522b44a01408188,2
+np.float64,0x3fd55af4b7aab5e9,0x3fe631f6d19503b3,2
+np.float64,0xbfa30a255c261450,0xbfd55caf0826361d,2
+np.float64,0x7fdfb801343f7001,0x553fe7ee50b9199a,2
+np.float64,0x7fa89ee91c313dd1,0x552d528ca2a4d659,2
+np.float64,0xffea72921d34e524,0xd542eb01af2e470d,2
+np.float64,0x3feddf0f33fbbe1e,0x3fef462b67fc0a91,2
+np.float64,0x3fe36700b566ce01,0x3feb1596caa8eff7,2
+np.float64,0x7fe6284a25ac5093,0x5541d58be3956601,2
+np.float64,0xffda16f7c8b42df0,0xd53de4f722485205,2
+np.float64,0x7f9355b94026ab72,0x552578cdeb41d2ca,2
+np.float64,0xffd3a9b022275360,0xd53b347b02dcea21,2
+np.float64,0x3fcb7f4f4a36fe9f,0x3fe32a40e9f6c1aa,2
+np.float64,0x7fdb958836372b0f,0x553e746103f92111,2
+np.float64,0x3fd37761c0a6eec4,0x3fe5853c5654027e,2
+np.float64,0x3fe449f1a2e893e4,0x3feb7d9e4eacc356,2
+np.float64,0x80077dfbef0efbf9,0xaa9f4ed788d2fadd,2
+np.float64,0x4823aa7890476,0x2a9a6eb4b653bad5,2
+np.float64,0xbfede01a373bc034,0xbfef468895fbcd29,2
+np.float64,0xbfe2bac5f125758c,0xbfeac4811c4dd66f,2
+np.float64,0x3fec10373af8206e,0x3feea14529e0f178,2
+np.float64,0x3fe305e30ca60bc6,0x3feae81a2f9d0302,2
+np.float64,0xa9668c5f52cd2,0x2aa1910e3a8f2113,2
+np.float64,0xbfd98b1717b3162e,0xbfe78f75995335d2,2
+np.float64,0x800fa649c35f4c94,0xaaa402ae79026a8f,2
+np.float64,0xbfb07dacf620fb58,0xbfd9a7d33d93a30f,2
+np.float64,0x80015812f382b027,0xaa91a843e9c85c0e,2
+np.float64,0x3fc687d96c2d0fb3,0x3fe1ef0ac16319c5,2
+np.float64,0xbfecad2ecd795a5e,0xbfeed9f786697af0,2
+np.float64,0x1608c1242c119,0x2a91cd11e9b4ccd2,2
+np.float64,0x6df775e8dbeef,0x2a9e6ba8c71130eb,2
+np.float64,0xffe96e9332b2dd26,0xd542ac342d06299b,2
+np.float64,0x7fecb6a3b8396d46,0x5543718af8162472,2
+np.float64,0x800d379f893a6f3f,0xaaa2ea36bbcb9308,2
+np.float64,0x3f924cdb202499b6,0x3fd0bb90af8d1f79,2
+np.float64,0x0,0x0,2
+np.float64,0x7feaf3b365f5e766,0x5543099a160e2427,2
+np.float64,0x3fea169ed0742d3e,0x3fede4d526e404f8,2
+np.float64,0x7feaf5f2f775ebe5,0x55430a2196c5f35a,2
+np.float64,0xbfc80d4429301a88,0xbfe2541f2ddd3334,2
+np.float64,0xffc75203b32ea408,0xd536db2837068689,2
+np.float64,0xffed2850e63a50a1,0xd5438b1217b72b8a,2
+np.float64,0x7fc16b0e7f22d61c,0x5534bcd0bfddb6f0,2
+np.float64,0x7feee8ed09fdd1d9,0x5543ed5b3ca483ab,2
+np.float64,0x7fb6c7ee662d8fdc,0x5531fffb5d46dafb,2
+np.float64,0x3fd77cebf8aef9d8,0x3fe6e9242e2bd29d,2
+np.float64,0x3f81c33f70238680,0x3fca4c7f3c9848f7,2
+np.float64,0x3fd59fea92ab3fd5,0x3fe649c1558cadd5,2
+np.float64,0xffeba82d4bf7505a,0xd54333bad387f7bd,2
+np.float64,0xffd37630e1a6ec62,0xd53b1ca62818c670,2
+np.float64,0xffec2c1e70b8583c,0xd5435213dcd27c22,2
+np.float64,0x7fec206971f840d2,0x55434f6660a8ae41,2
+np.float64,0x3fed2964adba52c9,0x3fef0642fe72e894,2
+np.float64,0xffd08e30d6211c62,0xd539b060e0ae02da,2
+np.float64,0x3e5f976c7cbf4,0x2a992e6ff991a122,2
+np.float64,0xffe6eee761adddce,0xd5420a393c67182f,2
+np.float64,0xbfe8ec9a31f1d934,0xbfed714426f58147,2
+np.float64,0x7fefffffffffffff,0x554428a2f98d728b,2
+np.float64,0x3fb3ae8b2c275d16,0x3fdb36b81b18a546,2
+np.float64,0x800f73df4dfee7bf,0xaaa3ed1a3e2cf49c,2
+np.float64,0xffd0c8873b21910e,0xd539ce6a3eab5dfd,2
+np.float64,0x3facd6c49439ad80,0x3fd8886f46335df1,2
+np.float64,0x3935859c726b2,0x2a98775f6438dbb1,2
+np.float64,0x7feed879fbfdb0f3,0x5543e9d1ac239469,2
+np.float64,0xbfe84dd990f09bb3,0xbfed323af09543b1,2
+np.float64,0xbfe767cc5a6ecf98,0xbfecd4f39aedbacb,2
+np.float64,0xffd8bd91d5b17b24,0xd53d5eb3734a2609,2
+np.float64,0xbfe13edeb2a27dbe,0xbfea0a856f0b9656,2
+np.float64,0xd933dd53b267c,0x2aa3158784e428c9,2
+np.float64,0xbfef6fef987edfdf,0xbfefcfb1c160462b,2
+np.float64,0x8009eeda4893ddb5,0xaaa13268a41045b1,2
+np.float64,0xab48c7a156919,0x2aa1a1a9c124c87d,2
+np.float64,0xa997931d532f3,0x2aa192bfe5b7bbb4,2
+np.float64,0xffe39ce8b1e739d1,0xd5411fa1c5c2cbd8,2
+np.float64,0x7e7ac2f6fcf59,0x2a9fdf6f263a9e9f,2
+np.float64,0xbfee1e35a6fc3c6b,0xbfef5c25d32b4047,2
+np.float64,0xffe5589c626ab138,0xd5419d220cc9a6da,2
+np.float64,0x7fe12509bf224a12,0x55405f7036dc5932,2
+np.float64,0xa6f15ba94de2c,0x2aa17b3367b1fc1b,2
+np.float64,0x3fca8adbfa3515b8,0x3fe2f0ca775749e5,2
+np.float64,0xbfcb03aa21360754,0xbfe30d5b90ca41f7,2
+np.float64,0x3fefafb2da7f5f66,0x3fefe5251aead4e7,2
+np.float64,0xffd90a59d23214b4,0xd53d7cf63a644f0e,2
+np.float64,0x3fba499988349333,0x3fddf84154fab7e5,2
+np.float64,0x800a76a0bc54ed42,0xaaa17f68cf67f2fa,2
+np.float64,0x3fea33d15bb467a3,0x3fedeff7f445b2ff,2
+np.float64,0x8005d9b0726bb362,0xaa9cd48624afeca9,2
+np.float64,0x7febf42e9a77e85c,0x55434541d8073376,2
+np.float64,0xbfedfc4469bbf889,0xbfef505989f7ee7d,2
+np.float64,0x8001211f1422423f,0xaa90a9889d865349,2
+np.float64,0x800e852f7fdd0a5f,0xaaa3845f11917f8e,2
+np.float64,0xffefd613c87fac27,0xd5441fd17ec669b4,2
+np.float64,0x7fed2a74543a54e8,0x55438b8c637da8b8,2
+np.float64,0xb83d50ff707aa,0x2aa210b4fc11e4b2,2
+np.float64,0x10000000000000,0x2aa428a2f98d728b,2
+np.float64,0x474ad9208e97,0x2a84e5a31530368a,2
+np.float64,0xffd0c5498ea18a94,0xd539ccc0e5cb425e,2
+np.float64,0x8001a8e9c82351d4,0xaa92f1aee6ca5b7c,2
+np.float64,0xd28db1e5a51b6,0x2aa2e328c0788f4a,2
+np.float64,0x3bf734ac77ee7,0x2a98da65c014b761,2
+np.float64,0x3fe56e17c96adc30,0x3febff2b6b829b7a,2
+np.float64,0x7783113eef063,0x2a9f46c3f09eb42c,2
+np.float64,0x3fd69d4e42ad3a9d,0x3fe69f83a21679f4,2
+np.float64,0x3fd34f4841a69e90,0x3fe5766b3c771616,2
+np.float64,0x3febb49895b76931,0x3fee7fcb603416c9,2
+np.float64,0x7fe8d6cb55f1ad96,0x554286c3b3bf4313,2
+np.float64,0xbfe67c6ba36cf8d8,0xbfec730218f2e284,2
+np.float64,0xffef9d97723f3b2e,0xd54413e38b6c29be,2
+np.float64,0x12d8cd2a25b1b,0x2a90e5ccd37b8563,2
+np.float64,0x81fe019103fc0,0x2aa01524155e73c5,2
+np.float64,0x7fe95d546f72baa8,0x5542a7fabfd425ff,2
+np.float64,0x800e742f1f9ce85e,0xaaa37cbe09e1f874,2
+np.float64,0xffd96bd3a732d7a8,0xd53da3086071264a,2
+np.float64,0x4ef2691e9de4e,0x2a9b3d316047fd6d,2
+np.float64,0x1a91684c3522e,0x2a92f25913c213de,2
+np.float64,0x3d5151b87aa2b,0x2a9909dbd9a44a84,2
+np.float64,0x800d9049435b2093,0xaaa31424e32d94a2,2
+np.float64,0xffe5b25fcc2b64bf,0xd541b5b0416b40b5,2
+np.float64,0xffe0eb784c21d6f0,0xd5404d083c3d6bc6,2
+np.float64,0x8007ceefbf0f9de0,0xaa9fbe0d739368b4,2
+np.float64,0xb78529416f0b,0x2a8ca3b29b5b3f18,2
+np.float64,0x7fba61130034c225,0x5532e6d4ca0f2918,2
+np.float64,0x3fba8d67ae351acf,0x3fde11efd6239b09,2
+np.float64,0x3fe7f24c576fe498,0x3fed0d63947a854d,2
+np.float64,0x2bb58dec576b3,0x2a965de7fca12aff,2
+np.float64,0xbfe86ceec4f0d9de,0xbfed3ea7f1d084e2,2
+np.float64,0x7fd1a7f7bca34fee,0x553a3f01b67fad2a,2
+np.float64,0x3fd9a43acfb34874,0x3fe7972dc5d8dfd6,2
+np.float64,0x7fd9861acdb30c35,0x553dad3b1bbb3b4d,2
+np.float64,0xffecc0c388398186,0xd54373d3b903deec,2
+np.float64,0x3fa6f86e9c2df0e0,0x3fd6bdbe40fcf710,2
+np.float64,0x800ddd99815bbb33,0xaaa33820d2f889bb,2
+np.float64,0x7fe087089b610e10,0x55402c868348a6d3,2
+np.float64,0x3fdf43d249be87a5,0x3fe933d29fbf7c23,2
+np.float64,0x7fe4f734c7a9ee69,0x5541822e56c40725,2
+np.float64,0x3feb39a9d3b67354,0x3fee526bf1f69f0e,2
+np.float64,0x3fe61454a0ec28a9,0x3fec46d7c36f7566,2
+np.float64,0xbfeafaa0a375f541,0xbfee3af2e49d457a,2
+np.float64,0x3fda7378e1b4e6f0,0x3fe7d613a3f92c40,2
+np.float64,0xe3e31c5fc7c64,0x2aa3645c12e26171,2
+np.float64,0xbfe97a556df2f4ab,0xbfeda8aa84cf3544,2
+np.float64,0xff612f9c80225f00,0xd514a51e5a2a8a97,2
+np.float64,0x800c51c8a0f8a391,0xaaa279fe7d40b50b,2
+np.float64,0xffd6f9d2312df3a4,0xd53ca783a5f8d110,2
+np.float64,0xbfead48bd7f5a918,0xbfee2cb2f89c5e57,2
+np.float64,0x800f5949e89eb294,0xaaa3e1a67a10cfef,2
+np.float64,0x800faf292b7f5e52,0xaaa40675e0c96cfd,2
+np.float64,0xbfedc238453b8470,0xbfef3c179d2d0209,2
+np.float64,0x3feb0443c5760888,0x3fee3e8bf29089c2,2
+np.float64,0xb26f69e164ded,0x2aa1df9f3dd7d765,2
+np.float64,0x3fcacdc053359b80,0x3fe300a67765b667,2
+np.float64,0x3fe8b274647164e8,0x3fed5a4cd4da8155,2
+np.float64,0x291e6782523ce,0x2a95ea7ac1b13a68,2
+np.float64,0xbfc4fc094e29f814,0xbfe1838671fc8513,2
+np.float64,0x3fbf1301f23e2600,0x3fdfb03a6f13e597,2
+np.float64,0xffeb36554ab66caa,0xd543193d8181e4f9,2
+np.float64,0xbfd969a52db2d34a,0xbfe78528ae61f16d,2
+np.float64,0x800cccd04d3999a1,0xaaa2b6b7a2d2d2d6,2
+np.float64,0x808eb4cb011d7,0x2aa005effecb2b4a,2
+np.float64,0x7fe839b3f9b07367,0x55425f61e344cd6d,2
+np.float64,0xbfeb25b6ed764b6e,0xbfee4b0234fee365,2
+np.float64,0xffefffffffffffff,0xd54428a2f98d728b,2
+np.float64,0xbfe01305da60260c,0xbfe9700b784af7e9,2
+np.float64,0xffcbf36b0a37e6d8,0xd538474b1d74ffe1,2
+np.float64,0xffaeebe3e83dd7c0,0xd52fa2e8dabf7209,2
+np.float64,0xbfd9913bf0b32278,0xbfe7915907aab13c,2
+np.float64,0xbfe7d125d9efa24c,0xbfecfff563177706,2
+np.float64,0xbfee98d23cbd31a4,0xbfef867ae393e446,2
+np.float64,0x3fe30efb67e61df6,0x3feaec6344633d11,2
+np.float64,0x1,0x2990000000000000,2
+np.float64,0x7fd5524fd3aaa49f,0x553bf30d18ab877e,2
+np.float64,0xc98b403f93168,0x2aa29d2fadb13c07,2
+np.float64,0xffe57080046ae100,0xd541a3b1b687360e,2
+np.float64,0x7fe20bade5e4175b,0x5540a79b94294f40,2
+np.float64,0x3fe155400a22aa80,0x3fea15c45f5b5837,2
+np.float64,0x7fe428dc8f6851b8,0x554147fd2ce93cc1,2
+np.float64,0xffefb77eb67f6efc,0xd544195dcaff4980,2
+np.float64,0x3fe49e733b293ce6,0x3feba394b833452a,2
+np.float64,0x38e01e3e71c05,0x2a986b2c955bad21,2
+np.float64,0x7fe735eb376e6bd5,0x55421cc51290d92d,2
+np.float64,0xbfd81d8644b03b0c,0xbfe71ce6d6fbd51a,2
+np.float64,0x8009a32325134647,0xaaa10645d0e6b0d7,2
+np.float64,0x56031ab8ac064,0x2a9c074be40b1f80,2
+np.float64,0xff8989aa30331340,0xd522b2d319a0ac6e,2
+np.float64,0xbfd6c183082d8306,0xbfe6ab8ffb3a8293,2
+np.float64,0x7ff8000000000000,0x7ff8000000000000,2
+np.float64,0xbfe17b68b1e2f6d2,0xbfea28dac8e0c457,2
+np.float64,0x3fbb50e42236a1c8,0x3fde5b090d51e3bd,2
+np.float64,0xffc2bb7cbf2576f8,0xd5353f1b3571c17f,2
+np.float64,0xbfe7576bca6eaed8,0xbfecce388241f47c,2
+np.float64,0x3fe7b52b04ef6a56,0x3fecf495bef99e7e,2
+np.float64,0xffe5511af82aa236,0xd5419b11524e8350,2
+np.float64,0xbfe66d5edf2cdabe,0xbfec6ca7d7b5be8c,2
+np.float64,0xc84a0ba790942,0x2aa29346f16a2cb4,2
+np.float64,0x6db5e7a0db6be,0x2a9e659c0e8244a0,2
+np.float64,0x7fef8f7b647f1ef6,0x554410e67af75d27,2
+np.float64,0xbfe2b4ada7e5695c,0xbfeac1997ec5a064,2
+np.float64,0xbfe99372e03326e6,0xbfedb2662b287543,2
+np.float64,0x3fa45d352428ba6a,0x3fd5d8a895423abb,2
+np.float64,0x3fa029695c2052d3,0x3fd439f858998886,2
+np.float64,0xffe0a9bd3261537a,0xd54037d0cd8bfcda,2
+np.float64,0xbfef83e09a7f07c1,0xbfefd66a4070ce73,2
+np.float64,0x7fee3dcc31fc7b97,0x5543c8503869407e,2
+np.float64,0xffbd16f1603a2de0,0xd533872fa5be978b,2
+np.float64,0xbfe8173141b02e62,0xbfed1c478614c6f4,2
+np.float64,0xbfef57aa277eaf54,0xbfefc77fdab27771,2
+np.float64,0x7fe883a02f31073f,0x554271ff0e3208da,2
+np.float64,0xe3adb63bc75b7,0x2aa362d833d0e41c,2
+np.float64,0x8001c430bac38862,0xaa93575026d26510,2
+np.float64,0x12fb347225f67,0x2a90f00eb9edb3fe,2
+np.float64,0x3fe53f83cbaa7f08,0x3febead40de452c2,2
+np.float64,0xbfe7f67227efece4,0xbfed0f10e32ad220,2
+np.float64,0xb8c5b45d718b7,0x2aa2152912cda86d,2
+np.float64,0x3fd23bb734a4776e,0x3fe50e5d3008c095,2
+np.float64,0x8001fd558ee3faac,0xaa941faa1f7ed450,2
+np.float64,0xffe6bbeda9ed77db,0xd541fcd185a63afa,2
+np.float64,0x4361d79086c3c,0x2a99d692237c30b7,2
+np.float64,0xbfd012f004a025e0,0xbfe43093e290fd0d,2
+np.float64,0xffe1d8850423b10a,0xd54097cf79d8d01e,2
+np.float64,0x3fccf4df7939e9bf,0x3fe37f8cf8be6436,2
+np.float64,0x8000546bc6c0a8d8,0xaa861bb3588556f2,2
+np.float64,0xbfecb4d6ba7969ae,0xbfeedcb6239135fe,2
+np.float64,0xbfaeb425cc3d6850,0xbfd90cfc103bb896,2
+np.float64,0x800ec037ec7d8070,0xaaa39eae8bde9774,2
+np.float64,0xbfeeaf863dfd5f0c,0xbfef8e4514772a8a,2
+np.float64,0xffec67c6c4b8cf8d,0xd5435fad89f900cf,2
+np.float64,0x3fda4498da348932,0x3fe7c7f6b3f84048,2
+np.float64,0xbfd05fd3dea0bfa8,0xbfe4509265a9b65f,2
+np.float64,0x3fe42cc713a8598e,0x3feb706ba9cd533c,2
+np.float64,0xec22d4d7d845b,0x2aa39f8cccb9711c,2
+np.float64,0x7fda30606c3460c0,0x553deea865065196,2
+np.float64,0xbfd58cba8bab1976,0xbfe64327ce32d611,2
+np.float64,0xadd521c75baa4,0x2aa1b7efce201a98,2
+np.float64,0x7fed43c1027a8781,0x55439131832b6429,2
+np.float64,0x800bee278fb7dc4f,0xaaa247a71e776db4,2
+np.float64,0xbfe9be5dd2737cbc,0xbfedc2f9501755b0,2
+np.float64,0x8003f4854447e90b,0xaa994d9b5372b13b,2
+np.float64,0xbfe5d0f867eba1f1,0xbfec29f8dd8b33a4,2
+np.float64,0x3fd79102d5af2206,0x3fe6efaa7a1efddb,2
+np.float64,0xbfeae783c835cf08,0xbfee33cdb4a44e81,2
+np.float64,0x3fcf1713e83e2e28,0x3fe3f7414753ddfb,2
+np.float64,0xffe5ab3cff2b567a,0xd541b3bf0213274a,2
+np.float64,0x7fe0fc65d8a1f8cb,0x554052761ac96386,2
+np.float64,0x7e81292efd026,0x2a9fdff8c01ae86f,2
+np.float64,0x80091176039222ec,0xaaa0aebf0565dfa6,2
+np.float64,0x800d2bf5ab5a57ec,0xaaa2e4a4c31e7e29,2
+np.float64,0xffd1912ea923225e,0xd53a33b2856726ab,2
+np.float64,0x800869918ed0d323,0xaaa0453408e1295d,2
+np.float64,0xffba0898fa341130,0xd532d19b202a9646,2
+np.float64,0xbfe09fac29613f58,0xbfe9b9687b5811a1,2
+np.float64,0xbfbd4ae82e3a95d0,0xbfdf1220f6f0fdfa,2
+np.float64,0xffea11d27bb423a4,0xd542d3d3e1522474,2
+np.float64,0xbfe6b05705ad60ae,0xbfec88d6bcab2683,2
+np.float64,0x3fe624a3f2ec4948,0x3fec4dcc78ddf871,2
+np.float64,0x53483018a6907,0x2a9bba8f92006b69,2
+np.float64,0xbfec0a6eeb7814de,0xbfee9f2a741248d7,2
+np.float64,0x3fe8c8ce6371919d,0x3fed63250c643482,2
+np.float64,0xbfe26b0ef964d61e,0xbfea9e511db83437,2
+np.float64,0xffa0408784208110,0xd52987f62c369ae9,2
+np.float64,0xffc153abc322a758,0xd534b384b5c5fe63,2
+np.float64,0xbfbdce88a63b9d10,0xbfdf4065ef0b01d4,2
+np.float64,0xffed4a4136fa9482,0xd54392a450f8b0af,2
+np.float64,0x8007aa18748f5432,0xaa9f8bd2226d4299,2
+np.float64,0xbfdab4d3e8b569a8,0xbfe7e9a5402540e5,2
+np.float64,0x7fe68914f92d1229,0x5541ef5e78fa35de,2
+np.float64,0x800a538bb1b4a718,0xaaa16bc487711295,2
+np.float64,0xffe02edbc8605db7,0xd5400f8f713df890,2
+np.float64,0xffe8968053712d00,0xd54276b9cc7f460a,2
+np.float64,0x800a4ce211d499c5,0xaaa1680491deb40c,2
+np.float64,0x3f988080f8310102,0x3fd2713691e99329,2
+np.float64,0xf64e42a7ec9c9,0x2aa3e6a7af780878,2
+np.float64,0xff73cc7100279900,0xd51b4478c3409618,2
+np.float64,0x71e6722ce3ccf,0x2a9ec76ddf296ce0,2
+np.float64,0x8006ca16ab0d942e,0xaa9e4bfd862af570,2
+np.float64,0x8000000000000000,0x8000000000000000,2
+np.float64,0xbfed373e02ba6e7c,0xbfef0b2b7bb767b3,2
+np.float64,0xa6cb0f694d962,0x2aa179dd16b0242b,2
+np.float64,0x7fec14626cf828c4,0x55434ca55b7c85d5,2
+np.float64,0x3fcda404513b4808,0x3fe3a68e8d977752,2
+np.float64,0xbfeb94995f772933,0xbfee74091d288b81,2
+np.float64,0x3fce2299a13c4530,0x3fe3c2603f28d23b,2
+np.float64,0xffd07f4534a0fe8a,0xd539a8a6ebc5a603,2
+np.float64,0x7fdb1c651e3638c9,0x553e478a6385c86b,2
+np.float64,0x3fec758336f8eb06,0x3feec5f3b92c8b28,2
+np.float64,0x796fc87cf2dfa,0x2a9f7184a4ad8c49,2
+np.float64,0x3fef9ba866ff3750,0x3fefde6a446fc2cd,2
+np.float64,0x964d26c72c9a5,0x2aa0e143f1820179,2
+np.float64,0xbfef6af750bed5ef,0xbfefce04870a97bd,2
+np.float64,0x3fe2f3961aa5e72c,0x3feadf769321a3ff,2
+np.float64,0xbfd6b706e9ad6e0e,0xbfe6a8141c5c3b5d,2
+np.float64,0x7fe0ecc40a21d987,0x55404d72c2b46a82,2
+np.float64,0xbfe560d19deac1a3,0xbfebf962681a42a4,2
+np.float64,0xbfea37170ab46e2e,0xbfedf136ee9df02b,2
+np.float64,0xbfebf78947b7ef12,0xbfee9847ef160257,2
+np.float64,0x800551f8312aa3f1,0xaa9bee7d3aa5491b,2
+np.float64,0xffed2513897a4a26,0xd5438a58c4ae28ec,2
+np.float64,0x7fd962d75cb2c5ae,0x553d9f8a0c2016f3,2
+np.float64,0x3fefdd8512bfbb0a,0x3feff47d8da7424d,2
+np.float64,0xbfefa5b43bff4b68,0xbfefe1ca42867af0,2
+np.float64,0xbfc8a2853531450c,0xbfe279bb7b965729,2
+np.float64,0x800c8843bc391088,0xaaa2951344e7b29b,2
+np.float64,0x7fe22587bae44b0e,0x5540af8bb58cfe86,2
+np.float64,0xbfe159fae822b3f6,0xbfea182394eafd8d,2
+np.float64,0xbfe6fdfd50edfbfa,0xbfeca93f2a3597d0,2
+np.float64,0xbfe5cd5afaeb9ab6,0xbfec286a8ce0470f,2
+np.float64,0xbfc84bb97f309774,0xbfe263ef0f8f1f6e,2
+np.float64,0x7fd9c1e548b383ca,0x553dc4556874ecb9,2
+np.float64,0x7fda43d33bb487a5,0x553df60f61532fc0,2
+np.float64,0xbfe774bd25eee97a,0xbfecda42e8578c1f,2
+np.float64,0x800df1f5ab9be3ec,0xaaa34184712e69db,2
+np.float64,0xbff0000000000000,0xbff0000000000000,2
+np.float64,0x3fe14ec21b629d84,0x3fea128244215713,2
+np.float64,0x7fc1ce7843239cf0,0x5534e3fa8285b7b8,2
+np.float64,0xbfe922b204724564,0xbfed86818687d649,2
+np.float64,0x3fc58924fb2b1248,0x3fe1aa715ff6ebbf,2
+np.float64,0x8008b637e4d16c70,0xaaa0760b53abcf46,2
+np.float64,0xffbf55bd4c3eab78,0xd53404a23091a842,2
+np.float64,0x9f6b4a753ed6a,0x2aa136ef9fef9596,2
+np.float64,0xbfd11da7f8a23b50,0xbfe49deb493710d8,2
+np.float64,0x800a2f07fcd45e10,0xaaa157237c98b4f6,2
+np.float64,0x3fdd4defa4ba9bdf,0x3fe8aa0bcf895f4f,2
+np.float64,0x7fe9b0ab05f36155,0x5542bc5335414473,2
+np.float64,0x3fe89c97de313930,0x3fed51a1189b8982,2
+np.float64,0x3fdd45c8773a8b91,0x3fe8a7c2096fbf5a,2
+np.float64,0xbfeb6f64daf6deca,0xbfee665167ef43ad,2
+np.float64,0xffdf9da1c4bf3b44,0xd53fdf141944a983,2
+np.float64,0x3fde092ed0bc125c,0x3fe8de25bfbfc2db,2
+np.float64,0xbfcb21f96b3643f4,0xbfe3147904c258cf,2
+np.float64,0x800c9c934f993927,0xaaa29f17c43f021b,2
+np.float64,0x9b91814d37230,0x2aa11329e59bf6b0,2
+np.float64,0x3fe28a7e0b6514fc,0x3feaad6d23e2eadd,2
+np.float64,0xffecf38395f9e706,0xd5437f3ee1cd61e4,2
+np.float64,0x3fcade92a935bd25,0x3fe3049f4c1da1d0,2
+np.float64,0x800ab25d95d564bc,0xaaa1a076d7c66e04,2
+np.float64,0xffc0989e1e21313c,0xd53467f3b8158298,2
+np.float64,0x3fd81523eeb02a48,0x3fe71a38d2da8a82,2
+np.float64,0x7fe5b9dd402b73ba,0x5541b7b9b8631010,2
+np.float64,0x2c160d94582c3,0x2a966e51b503a3d1,2
+np.float64,0x2c416ffa5882f,0x2a9675aaef8b29c4,2
+np.float64,0x7fefe2ff01bfc5fd,0x55442289faf22b86,2
+np.float64,0xbfd469bf5d28d37e,0xbfe5dd239ffdc7eb,2
+np.float64,0xbfdd56f3eabaade8,0xbfe8ac93244ca17b,2
+np.float64,0xbfe057b89160af71,0xbfe9941557340bb3,2
+np.float64,0x800c50e140b8a1c3,0xaaa2798ace9097ee,2
+np.float64,0xbfda5a8984b4b514,0xbfe7ce93d65a56b0,2
+np.float64,0xbfcd6458323ac8b0,0xbfe39872514127bf,2
+np.float64,0x3fefb1f5ebff63ec,0x3fefe5e761b49b89,2
+np.float64,0x3fea3abc1df47578,0x3fedf29a1c997863,2
+np.float64,0x7fcb4a528e3694a4,0x553815f169667213,2
+np.float64,0x8c77da7b18efc,0x2aa080e52bdedb54,2
+np.float64,0x800e5dde4c5cbbbd,0xaaa372b16fd8b1ad,2
+np.float64,0x3fd2976038a52ec0,0x3fe5316b4f79fdbc,2
+np.float64,0x69413a0ed2828,0x2a9dfacd9cb44286,2
+np.float64,0xbfebbac0bdb77582,0xbfee820d9288b631,2
+np.float64,0x1a12aa7c34256,0x2a92d407e073bbfe,2
+np.float64,0xbfc41a27c3283450,0xbfe143c8665b0d3c,2
+np.float64,0xffe4faa41369f548,0xd54183230e0ce613,2
+np.float64,0xbfdeae81f23d5d04,0xbfe90b734bf35b68,2
+np.float64,0x3fc984ba58330975,0x3fe2b19e9052008e,2
+np.float64,0x7fe6e51b8d2dca36,0x554207a74ae2bb39,2
+np.float64,0x80081a58a81034b2,0xaaa0117d4aff11c8,2
+np.float64,0x7fde3fddfe3c7fbb,0x553f67d0082acc67,2
+np.float64,0x3fac7c999038f933,0x3fd86ec2f5dc3aa4,2
+np.float64,0x7fa26b4c4c24d698,0x552a9e6ea8545c18,2
+np.float64,0x3fdacd06e6b59a0e,0x3fe7f0dc0e8f9c6d,2
+np.float64,0x80064b62cbec96c6,0xaa9d8ac0506fdd05,2
+np.float64,0xb858116170b1,0x2a8caea703d9ccc8,2
+np.float64,0xbfe8d94ccef1b29a,0xbfed69a8782cbf3d,2
+np.float64,0x8005607d6a6ac0fc,0xaa9c07cf8620b037,2
+np.float64,0xbfe66a52daacd4a6,0xbfec6b5e403e6864,2
+np.float64,0x7fc398c2e0273185,0x5535918245894606,2
+np.float64,0x74b2d7dce965c,0x2a9f077020defdbc,2
+np.float64,0x7fe8f7a4d9b1ef49,0x55428eeae210e8eb,2
+np.float64,0x80027deddc84fbdc,0xaa95b11ff9089745,2
+np.float64,0xffeba2a94e774552,0xd5433273f6568902,2
+np.float64,0x80002f8259405f05,0xaa8240b68d7b9dc4,2
+np.float64,0xbfdf0d84883e1b0a,0xbfe92532c69c5802,2
+np.float64,0xbfcdfa7b6b3bf4f8,0xbfe3b997a84d0914,2
+np.float64,0x800c18b04e183161,0xaaa25d46d60b15c6,2
+np.float64,0xffeaf1e37c35e3c6,0xd543092cd929ac19,2
+np.float64,0xbfc5aa07752b5410,0xbfe1b36ab5ec741f,2
+np.float64,0x3fe5c491d1eb8924,0x3fec24a1c3f6a178,2
+np.float64,0xbfeb736937f6e6d2,0xbfee67cd296e6fa9,2
+np.float64,0xffec3d5718787aad,0xd5435602e1a2cc43,2
+np.float64,0x7fe71e1da86e3c3a,0x55421691ead882cb,2
+np.float64,0x3fdd6ed0c93adda2,0x3fe8b341d066c43c,2
+np.float64,0x7fbe3d7a203c7af3,0x5533c83e53283430,2
+np.float64,0x3fdc20cb56384197,0x3fe854676360aba9,2
+np.float64,0xb7a1ac636f436,0x2aa20b9d40d66e78,2
+np.float64,0x3fb1491bb8229237,0x3fda0fabad1738ee,2
+np.float64,0xbfdf9c0ce73f381a,0xbfe94b716dbe35ee,2
+np.float64,0xbfbd4f0ad23a9e18,0xbfdf1397329a2dce,2
+np.float64,0xbfe4e0caac69c196,0xbfebc119b8a181cd,2
+np.float64,0x5753641aaea6d,0x2a9c2ba3e92b0cd2,2
+np.float64,0x72bb814ae5771,0x2a9eda92fada66de,2
+np.float64,0x57ed8f5aafdb3,0x2a9c3c2e1d42e609,2
+np.float64,0xffec33359c38666a,0xd54353b2acd0daf1,2
+np.float64,0x3fa5fe6e8c2bfce0,0x3fd66a0b3bf2720a,2
+np.float64,0xffe2dc8d7ca5b91a,0xd540e6ebc097d601,2
+np.float64,0x7fd99d260eb33a4b,0x553db626c9c75f78,2
+np.float64,0xbfe2dd73e425bae8,0xbfead4fc4b93a727,2
+np.float64,0xdcd4a583b9a95,0x2aa33094c9a17ad7,2
+np.float64,0x7fb0af6422215ec7,0x553039a606e8e64f,2
+np.float64,0x7fdfab6227bf56c3,0x553fe3b26164aeda,2
+np.float64,0x1e4d265e3c9a6,0x2a93cba8a1a8ae6d,2
+np.float64,0xbfdc7d097238fa12,0xbfe86ee2f24fd473,2
+np.float64,0x7fe5d35d29eba6b9,0x5541bea5878bce2b,2
+np.float64,0xffcb886a903710d4,0xd53828281710aab5,2
+np.float64,0xffe058c7ffe0b190,0xd5401d61e9a7cbcf,2
+np.float64,0x3ff0000000000000,0x3ff0000000000000,2
+np.float64,0xffd5b1c1132b6382,0xd53c1c839c098340,2
+np.float64,0x3fe2e7956725cf2b,0x3fead9c907b9d041,2
+np.float64,0x800a8ee293951dc6,0xaaa18ce3f079f118,2
+np.float64,0x7febcd3085b79a60,0x55433c47e1f822ad,2
+np.float64,0x3feb0e14cd761c2a,0x3fee423542102546,2
+np.float64,0x3fb45e6d0628bcda,0x3fdb86db67d0c992,2
+np.float64,0x7fa836e740306dce,0x552d2907cb8118b2,2
+np.float64,0x3fd15ba25b22b745,0x3fe4b6b018409d78,2
+np.float64,0xbfb59980ce2b3300,0xbfdc1206274cb51d,2
+np.float64,0x3fdef1b87fbde371,0x3fe91dafc62124a1,2
+np.float64,0x7fed37a4337a6f47,0x55438e7e0b50ae37,2
+np.float64,0xffe6c87633ad90ec,0xd542001f216ab448,2
+np.float64,0x8008d2548ab1a4a9,0xaaa087ad272d8e17,2
+np.float64,0xbfd1d6744da3ace8,0xbfe4e71965adda74,2
+np.float64,0xbfb27f751224fee8,0xbfdaa82132775406,2
+np.float64,0x3fe2b336ae65666d,0x3feac0e6b13ec2d2,2
+np.float64,0xffc6bac2262d7584,0xd536a951a2eecb49,2
+np.float64,0x7fdb661321b6cc25,0x553e62dfd7fcd3f3,2
+np.float64,0xffe83567d5706acf,0xd5425e4bb5027568,2
+np.float64,0xbf7f0693e03e0d00,0xbfc9235314d53f82,2
+np.float64,0x3feb32b218766564,0x3fee4fd5847f3722,2
+np.float64,0x3fec25d33df84ba6,0x3feea91fcd4aebab,2
+np.float64,0x7fe17abecb22f57d,0x55407a8ba661207c,2
+np.float64,0xbfe5674b1eeace96,0xbfebfc351708dc70,2
+np.float64,0xbfe51a2d2f6a345a,0xbfebda702c9d302a,2
+np.float64,0x3fec05584af80ab0,0x3fee9d502a7bf54d,2
+np.float64,0xffda8871dcb510e4,0xd53e10105f0365b5,2
+np.float64,0xbfc279c31824f388,0xbfe0c9354d871484,2
+np.float64,0x1cbed61e397dc,0x2a937364712cd518,2
+np.float64,0x800787d198af0fa4,0xaa9f5c847affa1d2,2
+np.float64,0x80079f6d65af3edc,0xaa9f7d2863368bbd,2
+np.float64,0xb942f1e97285e,0x2aa2193e0c513b7f,2
+np.float64,0x7fe9078263320f04,0x554292d85dee2c18,2
+np.float64,0xbfe4de0761a9bc0f,0xbfebbfe04116b829,2
+np.float64,0xbfdbe6f3fc37cde8,0xbfe843aea59a0749,2
+np.float64,0xffcb6c0de136d81c,0xd5381fd9c525b813,2
+np.float64,0x9b6bda9336d7c,0x2aa111c924c35386,2
+np.float64,0x3fe17eece422fdda,0x3fea2a9bacd78607,2
+np.float64,0xd8011c49b0024,0x2aa30c87574fc0c6,2
+np.float64,0xbfc0a08b3f214118,0xbfe034d48f0d8dc0,2
+np.float64,0x3fd60adb1eac15b8,0x3fe66e42e4e7e6b5,2
+np.float64,0x80011d68ea023ad3,0xaa909733befbb962,2
+np.float64,0xffb35ac32426b588,0xd5310c4be1c37270,2
+np.float64,0x3fee8b56c9bd16ae,0x3fef81d8d15f6939,2
+np.float64,0x3fdc10a45e382149,0x3fe84fbe4cf11e68,2
+np.float64,0xbfc85dc45e30bb88,0xbfe2687b5518abde,2
+np.float64,0x3fd53b85212a770a,0x3fe6270d6d920d0f,2
+np.float64,0x800fc158927f82b1,0xaaa40e303239586f,2
+np.float64,0x11af5e98235ed,0x2a908b04a790083f,2
+np.float64,0xbfe2a097afe54130,0xbfeab80269eece99,2
+np.float64,0xbfd74ac588ae958c,0xbfe6d8ca3828d0b8,2
+np.float64,0xffea18ab2ef43156,0xd542d579ab31df1e,2
+np.float64,0xbfecda7058f9b4e1,0xbfeeea29c33b7913,2
+np.float64,0x3fc4ac56ed2958b0,0x3fe16d3e2bd7806d,2
+np.float64,0x3feccc898cb99913,0x3feee531f217dcfa,2
+np.float64,0xffeb3a64c5b674c9,0xd5431a30a41f0905,2
+np.float64,0x3fe5a7ee212b4fdc,0x3fec1844af9076fc,2
+np.float64,0x80080fdb52301fb7,0xaaa00a8b4274db67,2
+np.float64,0x800b3e7e47d67cfd,0xaaa1ec2876959852,2
+np.float64,0x80063fb8ee2c7f73,0xaa9d7875c9f20d6f,2
+np.float64,0x7fdacf80d0b59f01,0x553e2acede4c62a8,2
+np.float64,0x401e9b24803d4,0x2a996a0a75d0e093,2
+np.float64,0x3fe6c29505ed852a,0x3fec907a6d8c10af,2
+np.float64,0x8005c04ee2cb809f,0xaa9caa9813faef46,2
+np.float64,0xbfe1360f21e26c1e,0xbfea06155d6985b6,2
+np.float64,0xffc70606682e0c0c,0xd536c239b9d4be0a,2
+np.float64,0x800e639afefcc736,0xaaa37547d0229a26,2
+np.float64,0x3fe5589290aab125,0x3febf5c925c4e6db,2
+np.float64,0x8003b59330276b27,0xaa98c47e44524335,2
+np.float64,0x800d67ec22dacfd8,0xaaa301251b6a730a,2
+np.float64,0x7fdaeb5025b5d69f,0x553e35397dfe87eb,2
+np.float64,0x3fdae32a24b5c654,0x3fe7f771bc108f6c,2
+np.float64,0xffe6c1fc93ad83f8,0xd541fe6a6a716756,2
+np.float64,0xbfd7b9c1d32f7384,0xbfe6fcdae563d638,2
+np.float64,0x800e1bea06fc37d4,0xaaa354c0bf61449c,2
+np.float64,0xbfd78f097aaf1e12,0xbfe6ef068329bdf4,2
+np.float64,0x7fea6a400874d47f,0x5542e905978ad722,2
+np.float64,0x8008b4377cb1686f,0xaaa074c87eee29f9,2
+np.float64,0x8002f3fb8d45e7f8,0xaa96f47ac539b614,2
+np.float64,0xbfcf2b3fd13e5680,0xbfe3fb91c0cc66ad,2
+np.float64,0xffecca2f5279945e,0xd54375f361075927,2
+np.float64,0x7ff0000000000000,0x7ff0000000000000,2
+np.float64,0x7f84d5a5a029ab4a,0x552178d1d4e8640e,2
+np.float64,0x3fea8a4b64351497,0x3fee10c332440eb2,2
+np.float64,0x800fe01ac1dfc036,0xaaa41b34d91a4bee,2
+np.float64,0x3fc0b3d8872167b1,0x3fe03b178d354f8d,2
+np.float64,0x5ee8b0acbdd17,0x2a9cf69f2e317729,2
+np.float64,0x8006ef0407adde09,0xaa9e82888f3dd83e,2
+np.float64,0x7fdbb08a07b76113,0x553e7e4e35b938b9,2
+np.float64,0x49663f9c92cc9,0x2a9a95e0affe5108,2
+np.float64,0x7fd9b87e79b370fc,0x553dc0b5cff3dc7d,2
+np.float64,0xbfd86ae657b0d5cc,0xbfe73584d02bdd2b,2
+np.float64,0x3fd4d4a13729a942,0x3fe6030a962aaaf8,2
+np.float64,0x7fcc246bcb3848d7,0x5538557309449bba,2
+np.float64,0xbfdc86a7d5b90d50,0xbfe871a2983c2a29,2
+np.float64,0xd2a6e995a54dd,0x2aa2e3e9c0fdd6c0,2
+np.float64,0x3f92eb447825d680,0x3fd0eb4fd2ba16d2,2
+np.float64,0x800d4001697a8003,0xaaa2ee358661b75c,2
+np.float64,0x3fd3705fd1a6e0c0,0x3fe582a6f321d7d6,2
+np.float64,0xbfcfdf51533fbea4,0xbfe421c3bdd9f2a3,2
+np.float64,0x3fe268e87964d1d1,0x3fea9d47e08aad8a,2
+np.float64,0x24b8901e49713,0x2a951adeefe7b31b,2
+np.float64,0x3fedb35d687b66bb,0x3fef36e440850bf8,2
+np.float64,0x3fb7ab5cbe2f56c0,0x3fdcf097380721c6,2
+np.float64,0x3f8c4eaa10389d54,0x3fceb7ecb605b73b,2
+np.float64,0xbfed831ed6fb063e,0xbfef25f462a336f1,2
+np.float64,0x7fd8c52112318a41,0x553d61b0ee609f58,2
+np.float64,0xbfe71c4ff76e38a0,0xbfecb5d32e789771,2
+np.float64,0xbfe35fb7b166bf70,0xbfeb12328e75ee6b,2
+np.float64,0x458e1a3a8b1c4,0x2a9a1cebadc81342,2
+np.float64,0x8003c1b3ad478368,0xaa98df5ed060b28c,2
+np.float64,0x7ff4000000000000,0x7ffc000000000000,2
+np.float64,0x7fe17098c162e131,0x5540775a9a3a104f,2
+np.float64,0xbfd95cb71732b96e,0xbfe7812acf7ea511,2
+np.float64,0x8000000000000001,0xa990000000000000,2
+np.float64,0xbfde0e7d9ebc1cfc,0xbfe8df9ca9e49a5b,2
+np.float64,0xffef4f67143e9ecd,0xd5440348a6a2f231,2
+np.float64,0x7fe37d23c826fa47,0x5541165de17caa03,2
+np.float64,0xbfcc0e5f85381cc0,0xbfe34b44b0deefe9,2
+np.float64,0x3fe858f1c470b1e4,0x3fed36ab90557d89,2
+np.float64,0x800e857278fd0ae5,0xaaa3847d13220545,2
+np.float64,0x3febd31a66f7a635,0x3fee8af90e66b043,2
+np.float64,0x7fd3fde1b127fbc2,0x553b5b186a49b968,2
+np.float64,0x3fd3dabb8b27b577,0x3fe5a99b446bed26,2
+np.float64,0xffeb4500f1768a01,0xd5431cab828e254a,2
+np.float64,0xffccca8fc6399520,0xd53884f8b505e79e,2
+np.float64,0xffeee9406b7dd280,0xd543ed6d27a1a899,2
+np.float64,0xffecdde0f0f9bbc1,0xd5437a6258b14092,2
+np.float64,0xe6b54005cd6a8,0x2aa378c25938dfda,2
+np.float64,0x7fe610f1022c21e1,0x5541cf460b972925,2
+np.float64,0xbfe5a170ec6b42e2,0xbfec1576081e3232,2
index 2e75f044cb8c0fa87730a5df6f05cd9d40678bb4..e315c28b81f2c07d669050fe7f65f04444e09df1 100644 (file)
@@ -663,3 +663,713 @@ np.float32,0x474e9420,0x3dff77b2,2
 np.float32,0x45cbdb23,0x3dff7240,2
 np.float32,0x44222747,0x3dffb039,2
 np.float32,0x4772e419,0xbdff74b8,2
+np.float64,0x1,0x3ff0000000000000,4
+np.float64,0x8000000000000001,0x3ff0000000000000,4
+np.float64,0x10000000000000,0x3ff0000000000000,4
+np.float64,0x8010000000000000,0x3ff0000000000000,4
+np.float64,0x7fefffffffffffff,0xbfefffe62ecfab75,4
+np.float64,0xffefffffffffffff,0xbfefffe62ecfab75,4
+np.float64,0x7ff0000000000000,0xfff8000000000000,4
+np.float64,0xfff0000000000000,0xfff8000000000000,4
+np.float64,0x7ff8000000000000,0x7ff8000000000000,4
+np.float64,0x7ff4000000000000,0x7ffc000000000000,4
+np.float64,0xbfc28bd9dd2517b4,0x3fefaa28ba13a702,4
+np.float64,0x3fb673c62e2ce790,0x3fefe083847a717f,4
+np.float64,0xbfe3e1dac7e7c3b6,0x3fea0500ba099f3a,4
+np.float64,0xbfbe462caa3c8c58,0x3fefc6c8b9c1c87c,4
+np.float64,0xbfb9353576326a68,0x3fefd8513e50e6b1,4
+np.float64,0xbfc05e798520bcf4,0x3fefbd1ad81cf089,4
+np.float64,0xbfe3ca3be2e79478,0x3fea12b995ea6574,4
+np.float64,0xbfde875d46bd0eba,0x3fec6d888662a824,4
+np.float64,0x3fafc4e02c3f89c0,0x3feff03c34bffd69,4
+np.float64,0xbf98855848310ac0,0x3feffda6c1588bdb,4
+np.float64,0x3fe66c51186cd8a2,0x3fe875c61c630ecb,4
+np.float64,0xbfedff1c3b7bfe38,0x3fe2f0c8c9e8fa39,4
+np.float64,0x3fd6082267ac1044,0x3fee1f6023695050,4
+np.float64,0xbfe78449b06f0894,0x3fe7bda2b223850e,4
+np.float64,0x3feedb8e63fdb71c,0x3fe23d5dfd2dd33f,4
+np.float64,0xbfc0a9de3d2153bc,0x3fefbaadf5e5285e,4
+np.float64,0x3fc04c67432098d0,0x3fefbdae07b7de8d,4
+np.float64,0xbfeeef84c4fddf0a,0x3fe22cf37f309d88,4
+np.float64,0x3fc04bb025209760,0x3fefbdb3d7d34ecf,4
+np.float64,0x3fd6b84d48ad709c,0x3fee013403da6e2a,4
+np.float64,0x3fec1ae25d7835c4,0x3fe46e62195cf274,4
+np.float64,0xbfdc6fdf9bb8dfc0,0x3fece48dc78bbb2e,4
+np.float64,0x3fb4db2c9229b660,0x3fefe4d42f79bf49,4
+np.float64,0xbfc0ed698521dad4,0x3fefb8785ea658c9,4
+np.float64,0xbfee82772b7d04ee,0x3fe2864a80efe8e9,4
+np.float64,0x3fd575b664aaeb6c,0x3fee37c669a12879,4
+np.float64,0x3fe4afb1c5e95f64,0x3fe98b177194439c,4
+np.float64,0x3fd93962f9b272c4,0x3fed8bef61876294,4
+np.float64,0x3fd97ae025b2f5c0,0x3fed7f4cfbf4d300,4
+np.float64,0xbfd9afdb1bb35fb6,0x3fed74fdc44dabb1,4
+np.float64,0x3f8ae65e3035cc80,0x3fefff4b1a0ea62b,4
+np.float64,0xbfe7e58664efcb0d,0x3fe77c02a1cbb670,4
+np.float64,0x3fe5f68b37ebed16,0x3fe8c10f849a5d4d,4
+np.float64,0x3fd9137d61b226fc,0x3fed9330eb4815a1,4
+np.float64,0x3fc146d019228da0,0x3fefb57e2d4d52f8,4
+np.float64,0xbfda6036edb4c06e,0x3fed521b2b578679,4
+np.float64,0xbfe78ddfb0ef1bc0,0x3fe7b734319a77e4,4
+np.float64,0x3fe0877823610ef0,0x3febd33a993dd786,4
+np.float64,0x3fbc61af2e38c360,0x3fefcdb4f889756d,4
+np.float64,0x3fd4dcdca4a9b9b8,0x3fee50962ffea5ae,4
+np.float64,0xbfe03cb29f607965,0x3febf7dbf640a75a,4
+np.float64,0xbfc81de407303bc8,0x3fef6f066cef64bc,4
+np.float64,0x3fd8dea42db1bd48,0x3fed9d3e00dbe0b3,4
+np.float64,0x3feac75e94f58ebe,0x3fe56f1f47f97896,4
+np.float64,0x3fb3a1ea6e2743d0,0x3fefe7ec1247cdaa,4
+np.float64,0x3fd695c0f4ad2b80,0x3fee0730bd40883d,4
+np.float64,0xbfd2c631f5a58c64,0x3feea20cbd1105d7,4
+np.float64,0xbfe978a8e1f2f152,0x3fe663014d40ad7a,4
+np.float64,0x3fd8b6b76ab16d70,0x3feda4c879aacc19,4
+np.float64,0x3feaafd30e755fa6,0x3fe5809514c28453,4
+np.float64,0x3fe1e37dc263c6fc,0x3feb20f9ad1f3f5c,4
+np.float64,0x3fd0ec7c24a1d8f8,0x3feee34048f43b75,4
+np.float64,0xbfe3881cbf67103a,0x3fea38d7886e6f53,4
+np.float64,0xbfd7023957ae0472,0x3fedf4471c765a1c,4
+np.float64,0xbfebc51c4ef78a38,0x3fe4b01c424e297b,4
+np.float64,0xbfe20a93eae41528,0x3feb0c2aa321d2e0,4
+np.float64,0x3fef39be867e737e,0x3fe1efaba9164d27,4
+np.float64,0x3fe8ea9576f1d52a,0x3fe6c7a8826ce1be,4
+np.float64,0x3fea921d91f5243c,0x3fe5968c6cf78963,4
+np.float64,0x3fd7ee5d31afdcbc,0x3fedc9f19d43fe61,4
+np.float64,0xbfe3ed581767dab0,0x3fe9fe4ee2f2b1cd,4
+np.float64,0xbfc40923d5281248,0x3fef9bd8ee9f6e68,4
+np.float64,0x3fe411a834682350,0x3fe9e9103854f057,4
+np.float64,0xbfedf6ccdf7bed9a,0x3fe2f77ad6543246,4
+np.float64,0xbfe8788a44f0f114,0x3fe7172f3aa0c742,4
+np.float64,0xbfce728f173ce520,0x3fef1954083bea04,4
+np.float64,0xbfd64dd0acac9ba2,0x3fee138c3293c246,4
+np.float64,0xbfe00669f5600cd4,0x3fec121443945350,4
+np.float64,0xbfe7152ba2ee2a58,0x3fe8079465d09846,4
+np.float64,0x3fe8654d8f70ca9c,0x3fe7247c94f09596,4
+np.float64,0x3fea68045cf4d008,0x3fe5b58cfe81a243,4
+np.float64,0xbfcd4779073a8ef4,0x3fef2a9d78153fa5,4
+np.float64,0xbfdb4456e5b688ae,0x3fed23b11614203f,4
+np.float64,0x3fcb5d59cd36bab0,0x3fef45818216a515,4
+np.float64,0xbfd914ff5ab229fe,0x3fed92e73746fea8,4
+np.float64,0x3fe4d211db69a424,0x3fe97653f433d15f,4
+np.float64,0xbfdbbb9224b77724,0x3fed0adb593dde80,4
+np.float64,0x3fd424ceafa8499c,0x3fee6d9124795d33,4
+np.float64,0x3feb5968f976b2d2,0x3fe501d116efbf54,4
+np.float64,0x3fee7d92a2fcfb26,0x3fe28a479b6a9dcf,4
+np.float64,0x3fc308e9972611d0,0x3fefa595f4df0c89,4
+np.float64,0x3fda79cd77b4f39c,0x3fed4cf8e69ba1f8,4
+np.float64,0x3fcbcf42d5379e88,0x3fef3f6a6a77c187,4
+np.float64,0x3fe13a1da662743c,0x3feb79504faea888,4
+np.float64,0xbfee4435f07c886c,0x3fe2b8ea98d2fc29,4
+np.float64,0x3fd65d68ccacbad0,0x3fee10e1ac7ada89,4
+np.float64,0x3fef2f89bb7e5f14,0x3fe1f81e882cc3f4,4
+np.float64,0xbfef0a7769fe14ef,0x3fe216bf384fc646,4
+np.float64,0x3fc065277320ca50,0x3fefbce44835c193,4
+np.float64,0x3fe9c1a74d73834e,0x3fe62e9ee0c2f2bf,4
+np.float64,0x3fd9d96e5db3b2dc,0x3fed6cd88eb51f6a,4
+np.float64,0x3fe02bf1c56057e4,0x3febfffc24b5a7ba,4
+np.float64,0xbfd6814350ad0286,0x3fee0ab9ad318b84,4
+np.float64,0x3f9fcbec583f97c0,0x3feffc0d0f1d8e75,4
+np.float64,0x3fe23524e5e46a4a,0x3feaf55372949a06,4
+np.float64,0xbfbdc95f6a3b92c0,0x3fefc89c21d44995,4
+np.float64,0x3fe961bb9cf2c378,0x3fe6735d6e1cca58,4
+np.float64,0xbfe8f1c370f1e387,0x3fe6c29d1be8bee9,4
+np.float64,0x3fd880d43ab101a8,0x3fedaee3c7ccfc96,4
+np.float64,0xbfedb37005fb66e0,0x3fe32d91ef2e3bd3,4
+np.float64,0xfdce287bfb9c5,0x3ff0000000000000,4
+np.float64,0x9aa1b9e735437,0x3ff0000000000000,4
+np.float64,0x6beac6e0d7d59,0x3ff0000000000000,4
+np.float64,0x47457aae8e8b0,0x3ff0000000000000,4
+np.float64,0x35ff13b46bfe3,0x3ff0000000000000,4
+np.float64,0xb9c0c82b73819,0x3ff0000000000000,4
+np.float64,0x1a8dc21a351b9,0x3ff0000000000000,4
+np.float64,0x7e87ef6afd0ff,0x3ff0000000000000,4
+np.float64,0x620a6588c414d,0x3ff0000000000000,4
+np.float64,0x7f366000fe6e,0x3ff0000000000000,4
+np.float64,0x787e39f4f0fc8,0x3ff0000000000000,4
+np.float64,0xf5134f1fea26a,0x3ff0000000000000,4
+np.float64,0xbce700ef79ce0,0x3ff0000000000000,4
+np.float64,0x144d7cc8289b1,0x3ff0000000000000,4
+np.float64,0xb9fbc5b973f79,0x3ff0000000000000,4
+np.float64,0xc3d6292d87ac5,0x3ff0000000000000,4
+np.float64,0xc1084e618210a,0x3ff0000000000000,4
+np.float64,0xb6b9eca56d73e,0x3ff0000000000000,4
+np.float64,0xc7ac4b858f58a,0x3ff0000000000000,4
+np.float64,0x516d75d2a2daf,0x3ff0000000000000,4
+np.float64,0x9dc089d93b811,0x3ff0000000000000,4
+np.float64,0x7b5f2840f6be6,0x3ff0000000000000,4
+np.float64,0x121d3ce8243a9,0x3ff0000000000000,4
+np.float64,0xf0be0337e17c1,0x3ff0000000000000,4
+np.float64,0xff58a5cbfeb15,0x3ff0000000000000,4
+np.float64,0xdaf1d07fb5e3a,0x3ff0000000000000,4
+np.float64,0x61d95382c3b2b,0x3ff0000000000000,4
+np.float64,0xe4df943fc9bf3,0x3ff0000000000000,4
+np.float64,0xf72ac2bdee559,0x3ff0000000000000,4
+np.float64,0x12dafbf625b60,0x3ff0000000000000,4
+np.float64,0xee11d427dc23b,0x3ff0000000000000,4
+np.float64,0xf4f8eb37e9f1e,0x3ff0000000000000,4
+np.float64,0xad7cb5df5af97,0x3ff0000000000000,4
+np.float64,0x59fc9b06b3f94,0x3ff0000000000000,4
+np.float64,0x3c3e65e4787ce,0x3ff0000000000000,4
+np.float64,0xe37bc993c6f79,0x3ff0000000000000,4
+np.float64,0x13bd6330277ad,0x3ff0000000000000,4
+np.float64,0x56cc2800ad986,0x3ff0000000000000,4
+np.float64,0x6203b8fcc4078,0x3ff0000000000000,4
+np.float64,0x75c7c8b8eb8fa,0x3ff0000000000000,4
+np.float64,0x5ebf8e00bd7f2,0x3ff0000000000000,4
+np.float64,0xda81f2f1b503f,0x3ff0000000000000,4
+np.float64,0x6adb17d6d5b64,0x3ff0000000000000,4
+np.float64,0x1ba68eee374d3,0x3ff0000000000000,4
+np.float64,0xeecf6fbbdd9ee,0x3ff0000000000000,4
+np.float64,0x24d6dd8e49add,0x3ff0000000000000,4
+np.float64,0xdf7cb81bbef97,0x3ff0000000000000,4
+np.float64,0xafd7be1b5faf8,0x3ff0000000000000,4
+np.float64,0xdb90ca35b721a,0x3ff0000000000000,4
+np.float64,0xa72903a14e521,0x3ff0000000000000,4
+np.float64,0x14533ee028a7,0x3ff0000000000000,4
+np.float64,0x7951540cf2a2b,0x3ff0000000000000,4
+np.float64,0x22882be045106,0x3ff0000000000000,4
+np.float64,0x136270d626c4f,0x3ff0000000000000,4
+np.float64,0x6a0f5744d41ec,0x3ff0000000000000,4
+np.float64,0x21e0d1aa43c1b,0x3ff0000000000000,4
+np.float64,0xee544155dca88,0x3ff0000000000000,4
+np.float64,0xcbe8aac797d16,0x3ff0000000000000,4
+np.float64,0x6c065e80d80e,0x3ff0000000000000,4
+np.float64,0xe57f0411cafe1,0x3ff0000000000000,4
+np.float64,0xdec3a6bdbd875,0x3ff0000000000000,4
+np.float64,0xf4d23a0fe9a48,0x3ff0000000000000,4
+np.float64,0xda77ef47b4efe,0x3ff0000000000000,4
+np.float64,0x8c405c9b1880c,0x3ff0000000000000,4
+np.float64,0x4eced5149d9db,0x3ff0000000000000,4
+np.float64,0x16b6552c2d6cc,0x3ff0000000000000,4
+np.float64,0x6fbc262cdf785,0x3ff0000000000000,4
+np.float64,0x628c3844c5188,0x3ff0000000000000,4
+np.float64,0x6d827d2cdb050,0x3ff0000000000000,4
+np.float64,0xd1bfdf29a37fc,0x3ff0000000000000,4
+np.float64,0xd85400fdb0a80,0x3ff0000000000000,4
+np.float64,0xcc420b2d98842,0x3ff0000000000000,4
+np.float64,0xac41d21b5883b,0x3ff0000000000000,4
+np.float64,0x432f18d4865e4,0x3ff0000000000000,4
+np.float64,0xe7e89a1bcfd14,0x3ff0000000000000,4
+np.float64,0x9b1141d536228,0x3ff0000000000000,4
+np.float64,0x6805f662d00bf,0x3ff0000000000000,4
+np.float64,0xc76552358ecab,0x3ff0000000000000,4
+np.float64,0x4ae8ffee95d21,0x3ff0000000000000,4
+np.float64,0x4396c096872d9,0x3ff0000000000000,4
+np.float64,0x6e8e55d4dd1cb,0x3ff0000000000000,4
+np.float64,0x4c2e33dc985c7,0x3ff0000000000000,4
+np.float64,0xbce814a579d03,0x3ff0000000000000,4
+np.float64,0x911681b5222d0,0x3ff0000000000000,4
+np.float64,0x5f90a4b2bf215,0x3ff0000000000000,4
+np.float64,0x26f76be84deee,0x3ff0000000000000,4
+np.float64,0xb2f7536165eeb,0x3ff0000000000000,4
+np.float64,0x4de4e6089bc9d,0x3ff0000000000000,4
+np.float64,0xf2e016afe5c03,0x3ff0000000000000,4
+np.float64,0xb9b7b949736f7,0x3ff0000000000000,4
+np.float64,0x3363ea1866c7e,0x3ff0000000000000,4
+np.float64,0xd1a3bd6ba3478,0x3ff0000000000000,4
+np.float64,0xae89f3595d13f,0x3ff0000000000000,4
+np.float64,0xddbd9601bb7c,0x3ff0000000000000,4
+np.float64,0x5de41a06bbc84,0x3ff0000000000000,4
+np.float64,0xfd58c86dfab19,0x3ff0000000000000,4
+np.float64,0x24922e8c49247,0x3ff0000000000000,4
+np.float64,0xcda040339b408,0x3ff0000000000000,4
+np.float64,0x5fe500b2bfca1,0x3ff0000000000000,4
+np.float64,0x9214abb924296,0x3ff0000000000000,4
+np.float64,0x800609fe0a2c13fd,0x3ff0000000000000,4
+np.float64,0x800c7c6fe518f8e0,0x3ff0000000000000,4
+np.float64,0x800a1a9491b4352a,0x3ff0000000000000,4
+np.float64,0x800b45e0e8968bc2,0x3ff0000000000000,4
+np.float64,0x8008497e57d092fd,0x3ff0000000000000,4
+np.float64,0x800b9c0af0173816,0x3ff0000000000000,4
+np.float64,0x800194cccb43299a,0x3ff0000000000000,4
+np.float64,0x8001c91ef183923f,0x3ff0000000000000,4
+np.float64,0x800f25b5ccde4b6c,0x3ff0000000000000,4
+np.float64,0x800ce63ccc79cc7a,0x3ff0000000000000,4
+np.float64,0x800d8fb2e83b1f66,0x3ff0000000000000,4
+np.float64,0x80083cd06f7079a1,0x3ff0000000000000,4
+np.float64,0x800823598e9046b3,0x3ff0000000000000,4
+np.float64,0x8001c1319de38264,0x3ff0000000000000,4
+np.float64,0x800f2b68543e56d1,0x3ff0000000000000,4
+np.float64,0x80022a4f4364549f,0x3ff0000000000000,4
+np.float64,0x800f51badf7ea376,0x3ff0000000000000,4
+np.float64,0x8003fbf31e27f7e7,0x3ff0000000000000,4
+np.float64,0x800d4c00e2fa9802,0x3ff0000000000000,4
+np.float64,0x800023b974804774,0x3ff0000000000000,4
+np.float64,0x800860778990c0ef,0x3ff0000000000000,4
+np.float64,0x800a15c241542b85,0x3ff0000000000000,4
+np.float64,0x8003097d9dc612fc,0x3ff0000000000000,4
+np.float64,0x800d77d8541aefb1,0x3ff0000000000000,4
+np.float64,0x80093804ab52700a,0x3ff0000000000000,4
+np.float64,0x800d2b3bfd7a5678,0x3ff0000000000000,4
+np.float64,0x800da24bcd5b4498,0x3ff0000000000000,4
+np.float64,0x8006eee1c28dddc4,0x3ff0000000000000,4
+np.float64,0x80005137fa40a271,0x3ff0000000000000,4
+np.float64,0x8007a3fbc22f47f8,0x3ff0000000000000,4
+np.float64,0x800dcd97071b9b2e,0x3ff0000000000000,4
+np.float64,0x80065b36048cb66d,0x3ff0000000000000,4
+np.float64,0x8004206ba72840d8,0x3ff0000000000000,4
+np.float64,0x8007e82b98cfd058,0x3ff0000000000000,4
+np.float64,0x8001a116ed23422f,0x3ff0000000000000,4
+np.float64,0x800c69e9ff18d3d4,0x3ff0000000000000,4
+np.float64,0x8003843688e7086e,0x3ff0000000000000,4
+np.float64,0x800335e3b8866bc8,0x3ff0000000000000,4
+np.float64,0x800e3308f0bc6612,0x3ff0000000000000,4
+np.float64,0x8002a9ec55c553d9,0x3ff0000000000000,4
+np.float64,0x80001c2084e03842,0x3ff0000000000000,4
+np.float64,0x800bc2bbd8d78578,0x3ff0000000000000,4
+np.float64,0x800ae6bcc555cd7a,0x3ff0000000000000,4
+np.float64,0x80083f7a13907ef5,0x3ff0000000000000,4
+np.float64,0x800d83ed76db07db,0x3ff0000000000000,4
+np.float64,0x800a12251974244b,0x3ff0000000000000,4
+np.float64,0x800a69c95714d393,0x3ff0000000000000,4
+np.float64,0x800cd5a85639ab51,0x3ff0000000000000,4
+np.float64,0x800e0e1837bc1c31,0x3ff0000000000000,4
+np.float64,0x8007b5ca39ef6b95,0x3ff0000000000000,4
+np.float64,0x800cf961cad9f2c4,0x3ff0000000000000,4
+np.float64,0x80066e8fc14cdd20,0x3ff0000000000000,4
+np.float64,0x8001cb8c7b43971a,0x3ff0000000000000,4
+np.float64,0x800002df68a005c0,0x3ff0000000000000,4
+np.float64,0x8003e6681567ccd1,0x3ff0000000000000,4
+np.float64,0x800b039126b60723,0x3ff0000000000000,4
+np.float64,0x800d2e1b663a5c37,0x3ff0000000000000,4
+np.float64,0x800188b3e2a31169,0x3ff0000000000000,4
+np.float64,0x8001f272e943e4e7,0x3ff0000000000000,4
+np.float64,0x800d7f53607afea7,0x3ff0000000000000,4
+np.float64,0x80092cafa4f25960,0x3ff0000000000000,4
+np.float64,0x800fc009f07f8014,0x3ff0000000000000,4
+np.float64,0x8003da896507b514,0x3ff0000000000000,4
+np.float64,0x800d4d1b4c3a9a37,0x3ff0000000000000,4
+np.float64,0x8007a835894f506c,0x3ff0000000000000,4
+np.float64,0x80057ba0522af741,0x3ff0000000000000,4
+np.float64,0x8009b7054b336e0b,0x3ff0000000000000,4
+np.float64,0x800b2c6c125658d9,0x3ff0000000000000,4
+np.float64,0x8008b1840ad16308,0x3ff0000000000000,4
+np.float64,0x8007ea0e3befd41d,0x3ff0000000000000,4
+np.float64,0x800dd658683bacb1,0x3ff0000000000000,4
+np.float64,0x8008cda48fd19b49,0x3ff0000000000000,4
+np.float64,0x8003acca14c75995,0x3ff0000000000000,4
+np.float64,0x8008bd152d717a2b,0x3ff0000000000000,4
+np.float64,0x80010d1ea3621a3e,0x3ff0000000000000,4
+np.float64,0x800130b78b826170,0x3ff0000000000000,4
+np.float64,0x8002cf3a46e59e75,0x3ff0000000000000,4
+np.float64,0x800b76e7fa76edd0,0x3ff0000000000000,4
+np.float64,0x800e065fe1dc0cc0,0x3ff0000000000000,4
+np.float64,0x8000dd527ea1baa6,0x3ff0000000000000,4
+np.float64,0x80032cb234665965,0x3ff0000000000000,4
+np.float64,0x800affc1acb5ff84,0x3ff0000000000000,4
+np.float64,0x80074be23fee97c5,0x3ff0000000000000,4
+np.float64,0x8004f83eafc9f07e,0x3ff0000000000000,4
+np.float64,0x800b02a115560543,0x3ff0000000000000,4
+np.float64,0x800b324a55766495,0x3ff0000000000000,4
+np.float64,0x800ffbcfd69ff7a0,0x3ff0000000000000,4
+np.float64,0x800830bc7b906179,0x3ff0000000000000,4
+np.float64,0x800cbafe383975fd,0x3ff0000000000000,4
+np.float64,0x8001ee42bfe3dc86,0x3ff0000000000000,4
+np.float64,0x8005b00fdc0b6020,0x3ff0000000000000,4
+np.float64,0x8005e7addd0bcf5c,0x3ff0000000000000,4
+np.float64,0x8001ae4cb0635c9a,0x3ff0000000000000,4
+np.float64,0x80098a9941131533,0x3ff0000000000000,4
+np.float64,0x800334c929466993,0x3ff0000000000000,4
+np.float64,0x8009568239d2ad05,0x3ff0000000000000,4
+np.float64,0x800f0639935e0c73,0x3ff0000000000000,4
+np.float64,0x800cebce7499d79d,0x3ff0000000000000,4
+np.float64,0x800482ee4c2905dd,0x3ff0000000000000,4
+np.float64,0x8007b7bd9e2f6f7c,0x3ff0000000000000,4
+np.float64,0x3fe654469f2ca88d,0x3fe8853f6c01ffb3,4
+np.float64,0x3feb4d7297369ae5,0x3fe50ad5bb621408,4
+np.float64,0x3feef53ba43dea77,0x3fe2283f356f8658,4
+np.float64,0x3fddf564eabbeaca,0x3fec8ec0e0dead9c,4
+np.float64,0x3fd3a69078274d21,0x3fee80e05c320000,4
+np.float64,0x3fecdafe5d39b5fd,0x3fe3d91a5d440fd9,4
+np.float64,0x3fd93286bc32650d,0x3fed8d40696cd10e,4
+np.float64,0x3fc0d34eb821a69d,0x3fefb954023d4284,4
+np.float64,0x3fc7b4b9a02f6973,0x3fef73e8739787ce,4
+np.float64,0x3fe08c839a611907,0x3febd0bc6f5641cd,4
+np.float64,0x3fb3d1758627a2eb,0x3fefe776f6183f96,4
+np.float64,0x3fef93c9ff3f2794,0x3fe1a4d2f622627d,4
+np.float64,0x3fea8d0041351a01,0x3fe59a52a1c78c9e,4
+np.float64,0x3fe3e26a30e7c4d4,0x3fea04ad3e0bbf8d,4
+np.float64,0x3fe5a34c9f6b4699,0x3fe8f57c5ccd1eab,4
+np.float64,0x3fc21ef859243df1,0x3fefae0b68a3a2e7,4
+np.float64,0x3fed7dd585fafbab,0x3fe35860041e5b0d,4
+np.float64,0x3fe5abacf22b575a,0x3fe8f03d8b6ef0f2,4
+np.float64,0x3fe426451f284c8a,0x3fe9dcf21f13205b,4
+np.float64,0x3fc01f6456203ec9,0x3fefbf19e2a8e522,4
+np.float64,0x3fe1cf2772239e4f,0x3feb2bbd645c7697,4
+np.float64,0x3fd18c4ace231896,0x3feecdfdd086c110,4
+np.float64,0x3fe8387d5b7070fb,0x3fe74358f2ec4910,4
+np.float64,0x3fdce51c2239ca38,0x3feccb2ae5459632,4
+np.float64,0x3fe5b0f2e4eb61e6,0x3fe8ecef4dbe4277,4
+np.float64,0x3fe1ceeb08a39dd6,0x3feb2bdd4dcfb3df,4
+np.float64,0x3febc5899d778b13,0x3fe4afc8dd8ad228,4
+np.float64,0x3fe7a47fbe2f48ff,0x3fe7a7fd9b352ea5,4
+np.float64,0x3fe7f74e1fafee9c,0x3fe76feb2755b247,4
+np.float64,0x3fe2bfad04e57f5a,0x3feaa9b46adddaeb,4
+np.float64,0x3fd06a090320d412,0x3feef40c334f8fba,4
+np.float64,0x3fdc97297d392e53,0x3fecdc16a3e22fcb,4
+np.float64,0x3fdc1a3f3838347e,0x3fecf6db2769d404,4
+np.float64,0x3fcca90096395201,0x3fef338156fcd218,4
+np.float64,0x3fed464733fa8c8e,0x3fe38483f0465d91,4
+np.float64,0x3fe7e067d82fc0d0,0x3fe77f7c8c9de896,4
+np.float64,0x3fc014fa0b2029f4,0x3fefbf6d84c933f8,4
+np.float64,0x3fd3bf1524277e2a,0x3fee7d2997b74dec,4
+np.float64,0x3fec153b86782a77,0x3fe472bb5497bb2a,4
+np.float64,0x3fd3e4d9d5a7c9b4,0x3fee776842691902,4
+np.float64,0x3fea6c0e2c74d81c,0x3fe5b2954cb458d9,4
+np.float64,0x3fee8f6a373d1ed4,0x3fe27bb9e348125b,4
+np.float64,0x3fd30c6dd42618dc,0x3fee97d2cab2b0bc,4
+np.float64,0x3fe4f90e6d69f21d,0x3fe95ea3dd4007f2,4
+np.float64,0x3fe271d467e4e3a9,0x3fead470d6d4008b,4
+np.float64,0x3fef2983897e5307,0x3fe1fd1a4debe33b,4
+np.float64,0x3fe980cc83b30199,0x3fe65d2fb8a0eb46,4
+np.float64,0x3fdfdf53db3fbea8,0x3fec1cf95b2a1cc7,4
+np.float64,0x3fe4d5307ba9aa61,0x3fe974701b4156cb,4
+np.float64,0x3fdb4e2345b69c47,0x3fed21aa6c146512,4
+np.float64,0x3fe3f7830327ef06,0x3fe9f85f6c88c2a8,4
+np.float64,0x3fca915fb63522bf,0x3fef502b73a52ecf,4
+np.float64,0x3fe66d3709ecda6e,0x3fe87531d7372d7a,4
+np.float64,0x3fd86000bcb0c001,0x3fedb5018dd684ca,4
+np.float64,0x3fe516e5feea2dcc,0x3fe94c68b111404e,4
+np.float64,0x3fd83c53dd3078a8,0x3fedbb9e5dd9e165,4
+np.float64,0x3fedfeeb673bfdd7,0x3fe2f0f0253c5d5d,4
+np.float64,0x3fe0dc6f9c21b8df,0x3feba8e2452410c2,4
+np.float64,0x3fbe154d643c2a9b,0x3fefc780a9357457,4
+np.float64,0x3fe5f63986abec73,0x3fe8c1434951a40a,4
+np.float64,0x3fbce0e50839c1ca,0x3fefcbeeaa27de75,4
+np.float64,0x3fd7ef5c5c2fdeb9,0x3fedc9c3022495b3,4
+np.float64,0x3fc1073914220e72,0x3fefb79de80fc0fd,4
+np.float64,0x3fe1a93c3d235278,0x3feb3fb21f86ac67,4
+np.float64,0x3fe321ee53e643dd,0x3fea72e2999f1e22,4
+np.float64,0x3fa881578c3102af,0x3feff69e6e51e0d6,4
+np.float64,0x3fd313482a262690,0x3fee96d161199495,4
+np.float64,0x3fe7272cd6ae4e5a,0x3fe7fbacbd0d8f43,4
+np.float64,0x3fd6cf4015ad9e80,0x3fedfd3513d544b8,4
+np.float64,0x3fc67b7e6d2cf6fd,0x3fef81f5c16923a4,4
+np.float64,0x3fa1999c14233338,0x3feffb2913a14184,4
+np.float64,0x3fc74eb8dd2e9d72,0x3fef78909a138e3c,4
+np.float64,0x3fc0b9274921724f,0x3fefba2ebd5f3e1c,4
+np.float64,0x3fd53fa156aa7f43,0x3fee40a18e952e88,4
+np.float64,0x3feaccbca4b59979,0x3fe56b22b33eb713,4
+np.float64,0x3fe6a01e3a2d403c,0x3fe8543fbd820ecc,4
+np.float64,0x3fd392a869a72551,0x3fee83e0ffe0e8de,4
+np.float64,0x3fe44d8928689b12,0x3fe9c5bf3c8fffdb,4
+np.float64,0x3fca3f209f347e41,0x3fef5461b6fa0924,4
+np.float64,0x3fee9e84b07d3d09,0x3fe26f638f733549,4
+np.float64,0x3faf49acb03e9359,0x3feff0b583cd8c48,4
+np.float64,0x3fea874b2af50e96,0x3fe59e882fa6febf,4
+np.float64,0x3fc50b72772a16e5,0x3fef918777dc41be,4
+np.float64,0x3fe861d1d4f0c3a4,0x3fe726e44d9d42c2,4
+np.float64,0x3fcadd2e2535ba5c,0x3fef4c3e2b56da38,4
+np.float64,0x3fea59c29cb4b385,0x3fe5c0043e586439,4
+np.float64,0x3fc1ffef0d23ffde,0x3fefaf22be452d13,4
+np.float64,0x3fc2d8dbc125b1b8,0x3fefa75b646d8e4e,4
+np.float64,0x3fd66c6471acd8c9,0x3fee0e5038b895c0,4
+np.float64,0x3fd0854adfa10a96,0x3feef0945bcc5c99,4
+np.float64,0x3feaac7076f558e1,0x3fe58316c23a82ad,4
+np.float64,0x3fdda49db3bb493b,0x3feca0e347c0ad6f,4
+np.float64,0x3fe43a539de874a7,0x3fe9d11d722d4822,4
+np.float64,0x3feeee3ebbfddc7d,0x3fe22dffd251e9af,4
+np.float64,0x3f8ee2c5b03dc58b,0x3fefff11855a7b6c,4
+np.float64,0x3fcd7107c63ae210,0x3fef2840bb55ca52,4
+np.float64,0x3f8d950d203b2a1a,0x3fefff253a08e40e,4
+np.float64,0x3fd40a5e57a814bd,0x3fee71a633c761fc,4
+np.float64,0x3fee836ec83d06de,0x3fe28580975be2fd,4
+np.float64,0x3fd7bbe87f2f77d1,0x3fedd31f661890cc,4
+np.float64,0xbfe05bf138a0b7e2,0x3febe8a000d96e47,4
+np.float64,0xbf88bddd90317bc0,0x3fefff66f6e2ff26,4
+np.float64,0xbfdc9cbb12393976,0x3fecdae2982335db,4
+np.float64,0xbfd85b4eccb0b69e,0x3fedb5e0dd87f702,4
+np.float64,0xbfe5c326cb2b864e,0x3fe8e180f525fa12,4
+np.float64,0xbfe381a0e4a70342,0x3fea3c8e5e3ab78e,4
+np.float64,0xbfe58d892c2b1b12,0x3fe9031551617aed,4
+np.float64,0xbfd7f3a52cafe74a,0x3fedc8fa97edd080,4
+np.float64,0xbfef3417bc7e682f,0x3fe1f45989f6a009,4
+np.float64,0xbfddfb8208bbf704,0x3fec8d5fa9970773,4
+np.float64,0xbfdab69bcc356d38,0x3fed40b2f6c347c6,4
+np.float64,0xbfed3f7cf17a7efa,0x3fe389e4ff4d9235,4
+np.float64,0xbfe47675d9a8ecec,0x3fe9ad6829a69e94,4
+np.float64,0xbfd030e2902061c6,0x3feefb3f811e024f,4
+np.float64,0xbfc376ac7226ed58,0x3fefa1798712b37e,4
+np.float64,0xbfdb7e54a0b6fcaa,0x3fed17a974c4bc28,4
+np.float64,0xbfdb7d5d5736faba,0x3fed17dcf31a8d84,4
+np.float64,0xbf876bd6502ed7c0,0x3fefff76dce6232c,4
+np.float64,0xbfd211e6c02423ce,0x3feebba41f0a1764,4
+np.float64,0xbfb443e3962887c8,0x3fefe658953629d4,4
+np.float64,0xbfe81b09e9b03614,0x3fe757882e4fdbae,4
+np.float64,0xbfdcb905d2b9720c,0x3fecd4c22cfe84e5,4
+np.float64,0xbfe3b62d99276c5b,0x3fea1e5520b3098d,4
+np.float64,0xbfbf05b25c3e0b68,0x3fefc3ecc04bca8e,4
+np.float64,0xbfdedc885b3db910,0x3fec59e22feb49f3,4
+np.float64,0xbfe33aa282667545,0x3fea64f2d55ec471,4
+np.float64,0xbfec84745a3908e9,0x3fe41cb3214e7044,4
+np.float64,0xbfddefdff1bbdfc0,0x3fec8fff88d4d0ec,4
+np.float64,0xbfd26ae6aca4d5ce,0x3feeaf208c7fedf6,4
+np.float64,0xbfee010591fc020b,0x3fe2ef3e57211a5e,4
+np.float64,0xbfb8cfddca319fb8,0x3fefd98d8f7918ed,4
+np.float64,0xbfe991648f3322c9,0x3fe6514e54670bae,4
+np.float64,0xbfee63fd087cc7fa,0x3fe29f1bfa3297cc,4
+np.float64,0xbfe1685942a2d0b2,0x3feb617f5f839eee,4
+np.float64,0xbfc6fc2fd62df860,0x3fef7c4698fd58cf,4
+np.float64,0xbfe42723d3a84e48,0x3fe9dc6ef7243e90,4
+np.float64,0xbfc3a7e89d274fd0,0x3fef9f99e3314e77,4
+np.float64,0xbfeb4c9521f6992a,0x3fe50b7c919bc6d8,4
+np.float64,0xbf707b34e020f680,0x3fefffef05e30264,4
+np.float64,0xbfc078478e20f090,0x3fefbc479305d5aa,4
+np.float64,0xbfd494ac4ca92958,0x3fee5c11f1cd8269,4
+np.float64,0xbfdaf888a035f112,0x3fed3346ae600469,4
+np.float64,0xbfa5d8ed502bb1e0,0x3feff88b0f262609,4
+np.float64,0xbfeec0cbfffd8198,0x3fe253543b2371cb,4
+np.float64,0xbfe594b5986b296b,0x3fe8fe9b39fb3940,4
+np.float64,0xbfc8ece7c631d9d0,0x3fef652bd0611ac7,4
+np.float64,0xbfd8ffeca0b1ffda,0x3fed96ebdf9b65cb,4
+np.float64,0xbfba9b221e353648,0x3fefd3cc21e2f15c,4
+np.float64,0xbfca63a52c34c74c,0x3fef52848eb9ed3b,4
+np.float64,0xbfe588e9b06b11d4,0x3fe905f7403e8881,4
+np.float64,0xbfc76f82db2edf04,0x3fef77138fe9bbc2,4
+np.float64,0xbfeeb3f334bd67e6,0x3fe25ddadb1096d6,4
+np.float64,0xbfbf2b64ce3e56c8,0x3fefc35a9555f6df,4
+np.float64,0xbfe9920e4ff3241c,0x3fe650d4ab8f5c42,4
+np.float64,0xbfb4a54c02294a98,0x3fefe55fc85ae5e9,4
+np.float64,0xbfe353b0c766a762,0x3fea56c02d17e4b7,4
+np.float64,0xbfd99961a4b332c4,0x3fed795fcd00dbf9,4
+np.float64,0xbfef191ddabe323c,0x3fe20aa79524f636,4
+np.float64,0xbfb25d060224ba10,0x3fefeaeee5cc8c0b,4
+np.float64,0xbfe6022428ec0448,0x3fe8b9b46e776194,4
+np.float64,0xbfed1a236cba3447,0x3fe3a76bee0d9861,4
+np.float64,0xbfc59671e72b2ce4,0x3fef8bc4daef6f14,4
+np.float64,0xbfdf2711703e4e22,0x3fec4886a8c9ceb5,4
+np.float64,0xbfeb7e207536fc41,0x3fe4e610c783f168,4
+np.float64,0xbfe6cdf5bcad9bec,0x3fe8365f8a59bc81,4
+np.float64,0xbfe55294adaaa52a,0x3fe927b0af5ccd09,4
+np.float64,0xbfdf4a88913e9512,0x3fec4036df58ba74,4
+np.float64,0xbfebb7efe4376fe0,0x3fe4ba276006992d,4
+np.float64,0xbfe09f29cfa13e54,0x3febc77f4f9c95e7,4
+np.float64,0xbfdf8c75653f18ea,0x3fec30ac924e4f46,4
+np.float64,0xbfefd601c7ffac04,0x3fe16d6f21bcb9c1,4
+np.float64,0xbfeae97ff5f5d300,0x3fe555bb5b87efe9,4
+np.float64,0xbfed427f02fa84fe,0x3fe387830db093bc,4
+np.float64,0xbfa33909cc267210,0x3feffa3a1bcb50dd,4
+np.float64,0xbfe9aa4bf5f35498,0x3fe63f6e98f6aa0f,4
+np.float64,0xbfe2d7349b25ae69,0x3fea9caa7c331e7e,4
+np.float64,0xbfcdbb2a3a3b7654,0x3fef2401c9659e4b,4
+np.float64,0xbfc8a90919315214,0x3fef686fe7fc0513,4
+np.float64,0xbfe62a98df2c5532,0x3fe89ff22a02cc6b,4
+np.float64,0xbfdc0f67b3b81ed0,0x3fecf928b637798f,4
+np.float64,0xbfebb32bf6f76658,0x3fe4bdc893c09698,4
+np.float64,0xbfec067996380cf3,0x3fe47e132741db97,4
+np.float64,0xbfd9774e1d32ee9c,0x3fed7ffe1e87c434,4
+np.float64,0xbfef989890bf3131,0x3fe1a0d025c80cf4,4
+np.float64,0xbfe59887e62b3110,0x3fe8fc382a3d4197,4
+np.float64,0xbfdea0a11e3d4142,0x3fec67b987e236ec,4
+np.float64,0xbfe2ec495825d892,0x3fea90efb231602d,4
+np.float64,0xbfb329c5c2265388,0x3fefe90f1b8209c3,4
+np.float64,0xbfdcd2dcd339a5ba,0x3feccf24c60b1478,4
+np.float64,0xbfe537ea18aa6fd4,0x3fe938237e217fe0,4
+np.float64,0xbfe8675ce170ceba,0x3fe723105925ce3a,4
+np.float64,0xbfd70723acae0e48,0x3fedf369ac070e65,4
+np.float64,0xbfea9d8692b53b0d,0x3fe58e1ee42e3fdb,4
+np.float64,0xbfcfeb96653fd72c,0x3fef029770033bdc,4
+np.float64,0xbfcc06c92d380d94,0x3fef3c69797d9b0a,4
+np.float64,0xbfe16b7c4f62d6f8,0x3feb5fdf9f0a9a07,4
+np.float64,0xbfed4d7a473a9af4,0x3fe37ecee27b1eb7,4
+np.float64,0xbfe6a6f6942d4ded,0x3fe84fccdf762b19,4
+np.float64,0xbfda46d867348db0,0x3fed572d928fa657,4
+np.float64,0xbfdbd9482db7b290,0x3fed049b5f907b52,4
+np.float64,0x7fe992ceb933259c,0xbfeb15af92aad70e,4
+np.float64,0x7fe3069204a60d23,0xbfe5eeff454240e9,4
+np.float64,0x7fe729dbf32e53b7,0xbfefe0528a330e4c,4
+np.float64,0x7fec504fb638a09e,0x3fd288e95dbedf65,4
+np.float64,0x7fe1d30167a3a602,0xbfeffc41f946fd02,4
+np.float64,0x7fed7f8ffd3aff1f,0x3fefe68ec604a19d,4
+np.float64,0x7fd2f23635a5e46b,0x3fea63032efbb447,4
+np.float64,0x7fd4c86db1a990da,0x3fdf6b9f7888db5d,4
+np.float64,0x7fe7554db6eeaa9a,0x3fe1b41476861bb0,4
+np.float64,0x7fe34e823ba69d03,0x3fefc435532e6294,4
+np.float64,0x7fec5c82fef8b905,0x3fef8f0c6473034f,4
+np.float64,0x7feba221bff74442,0xbfea95b81eb19b47,4
+np.float64,0x7fe74808a5ae9010,0xbfd3aa322917c3e5,4
+np.float64,0x7fdf41b7e0be836f,0x3fd14283c7147282,4
+np.float64,0x7fec09892f381311,0x3fe5240376ae484b,4
+np.float64,0x7faaf80bf435f017,0x3fe20227fa811423,4
+np.float64,0x7f8422d8402845b0,0x3fe911714593b8a0,4
+np.float64,0x7fd23a7fada474fe,0x3feff9f40aa37e9c,4
+np.float64,0x7fef4a4806fe948f,0x3fec6eca89cb4a62,4
+np.float64,0x7fe1e71cf763ce39,0xbfea6ac63f9ba457,4
+np.float64,0x7fe3e555be27caaa,0xbfe75b305d0dbbfd,4
+np.float64,0x7fcb8bac96371758,0xbfe8b126077f9d4c,4
+np.float64,0x7fc98e2c84331c58,0x3fef9092eb0bc85a,4
+np.float64,0x7fe947cf2b728f9d,0xbfebfff2c5b7d198,4
+np.float64,0x7feee8058c3dd00a,0xbfef21ebaae2eb17,4
+np.float64,0x7fef61d8d5bec3b1,0xbfdf1a032fb1c864,4
+np.float64,0x7fcf714b6f3ee296,0x3fe6fc89a8084098,4
+np.float64,0x7fa9a8b44c335168,0xbfeb16c149cea943,4
+np.float64,0x7fd175c482a2eb88,0xbfef64d341e73f88,4
+np.float64,0x7feab8e6a87571cc,0x3feb10069c397464,4
+np.float64,0x7fe3ade72de75bcd,0x3fd1753e333d5790,4
+np.float64,0x7fb26d87d224db0f,0xbfe753d36b18f4ca,4
+np.float64,0x7fdb7ef159b6fde2,0x3fe5c0a6044d3607,4
+np.float64,0x7fd5af86422b5f0c,0x3fe77193c95f6484,4
+np.float64,0x7fee9e00b07d3c00,0x3fe864d494596845,4
+np.float64,0x7fef927a147f24f3,0xbfe673b14715693d,4
+np.float64,0x7fd0aea63c215d4b,0xbfeff435f119fce9,4
+np.float64,0x7fd02e3796a05c6e,0x3fe4f7e3706e9a3d,4
+np.float64,0x7fd3ed61da27dac3,0xbfefef2f057f168c,4
+np.float64,0x7fefaca0d4ff5941,0x3fd3e8ad205cd4ab,4
+np.float64,0x7feb659e06f6cb3b,0x3fd64d803203e027,4
+np.float64,0x7fc94ccfaf32999e,0x3fee04922209369a,4
+np.float64,0x7feb4ec294f69d84,0xbfd102763a056c89,4
+np.float64,0x7fe2ada6ac655b4c,0x3fef4f6792aa6093,4
+np.float64,0x7fe5f40fdc2be81f,0xbfb4a6327186eee8,4
+np.float64,0x7fe7584bc3eeb097,0xbfd685b8ff94651d,4
+np.float64,0x7fe45d276be8ba4e,0x3fee53b13f7e442f,4
+np.float64,0x7fe6449b3d6c8935,0xbfe7e08bafa75251,4
+np.float64,0x7f8d62e6b03ac5cc,0x3fe73d30762f38fd,4
+np.float64,0x7fe3a76f72a74ede,0xbfeb48a28bc60968,4
+np.float64,0x7fd057706920aee0,0x3fdece8fa06f626c,4
+np.float64,0x7fe45ae158e8b5c2,0x3fe7a70f47b4d349,4
+np.float64,0x7fea8a5a983514b4,0x3fefb053d5f9ddd7,4
+np.float64,0x7fdd1e86ab3a3d0c,0x3fe3cded1b93816b,4
+np.float64,0x7fdb456108b68ac1,0xbfe37574c0b9bf8f,4
+np.float64,0x7fe972602432e4bf,0x3fef9a26e65ec01c,4
+np.float64,0x7fdbe2385637c470,0x3fed541df57969e1,4
+np.float64,0x7fe57f03602afe06,0x3fbd90f595cbbd94,4
+np.float64,0x7feb0ceb68f619d6,0xbfeae9cb8ee5261f,4
+np.float64,0x7fe6abfe6c6d57fc,0xbfef40a6edaca26f,4
+np.float64,0x7fe037ea08606fd3,0xbfda817d75858597,4
+np.float64,0x7fdd75a52dbaeb49,0x3feef2a0d91d6aa1,4
+np.float64,0x7fe8f9af66b1f35e,0xbfedfceef2a3bfc9,4
+np.float64,0x7fedf762b53beec4,0x3fd8b4f21ef69ee3,4
+np.float64,0x7fe99295b7f3252a,0x3feffc24d970383e,4
+np.float64,0x7fe797b0172f2f5f,0x3fee089aa56f7ce8,4
+np.float64,0x7fed89dcc97b13b9,0xbfcfa2bb0c3ea41f,4
+np.float64,0x7fae9e8d5c3d3d1a,0xbfe512ffe16c6b08,4
+np.float64,0x7fefaecbe27f5d97,0x3fbfc718a5e972f1,4
+np.float64,0x7fce0236d93c046d,0xbfa9b7cd790db256,4
+np.float64,0x7fa9689aac32d134,0x3feced501946628a,4
+np.float64,0x7feb1469e93628d3,0x3fef2a988e7673ed,4
+np.float64,0x7fdba78344b74f06,0xbfe092e78965b30c,4
+np.float64,0x7fece54c3fb9ca97,0x3fd3cfd184bed2e6,4
+np.float64,0x7fdb84212b370841,0xbfe25ebf2db6ee55,4
+np.float64,0x7fbe3e8bf23c7d17,0x3fe2ee72df573345,4
+np.float64,0x7fe43d9803687b2f,0xbfed2eff6a9e66a0,4
+np.float64,0x7fb0f9c00a21f37f,0x3feff70f3276fdb7,4
+np.float64,0x7fea0c6cbbb418d8,0xbfefa612494798b2,4
+np.float64,0x7fe4b3239e296646,0xbfe74dd959af8cdc,4
+np.float64,0x7fe5c6a773eb8d4e,0xbfd06944048f8d2b,4
+np.float64,0x7fb1c1278223824e,0xbfeb533a34655bde,4
+np.float64,0x7fd21c09ee243813,0xbfe921ccbc9255c3,4
+np.float64,0x7fe051020c20a203,0x3fbd519d700c1f2f,4
+np.float64,0x7fe0c76845e18ed0,0x3fefb9595191a31b,4
+np.float64,0x7fe6b0b57b6d616a,0xbf8c59a8ba5fcd9a,4
+np.float64,0x7fd386c460270d88,0x3fe8ffea5d1a5c46,4
+np.float64,0x7feeb884713d7108,0x3fee9b2247ef6c0d,4
+np.float64,0x7fd85f71b6b0bee2,0xbfefc30ec3e28f07,4
+np.float64,0x7fc341366426826c,0x3fd4234d35386d3b,4
+np.float64,0x7fe56482dd6ac905,0x3fe7189de6a50668,4
+np.float64,0x7fec67a2e3f8cf45,0xbfef86d0b940f37f,4
+np.float64,0x7fe38b202fe7163f,0x3feb90b75caa2030,4
+np.float64,0x7fdcbc64883978c8,0x3fed4f758fbf64d4,4
+np.float64,0x7fea5f0598f4be0a,0x3fdd503a417b3d4d,4
+np.float64,0x7fda3b6bcf3476d7,0x3fea6e9af3f7f9f5,4
+np.float64,0x7fc7d7896c2faf12,0x3fda2bebc36a2363,4
+np.float64,0x7fe7e8e2626fd1c4,0xbfe7d5e390c4cc3f,4
+np.float64,0x7fde0f3d7abc1e7a,0xbfede7a0ecfa3606,4
+np.float64,0x7fc692b8f52d2571,0x3feff0cd7ab6f61b,4
+np.float64,0xff92d1fce825a400,0xbfc921c36fc014fa,4
+np.float64,0xffdec3af2fbd875e,0xbfed6a77e6a0364e,4
+np.float64,0xffef46e7d9be8dcf,0xbfed7d39476f7e27,4
+np.float64,0xffe2c2ce4525859c,0x3fe1757261316bc9,4
+np.float64,0xffe27c8b5864f916,0xbfefe017c0d43457,4
+np.float64,0xffe184d7442309ae,0x3fa1fb8c49dba596,4
+np.float64,0xffddf5f98d3bebf4,0x3fee4f8eaa5f847e,4
+np.float64,0xffee3ef354fc7de6,0xbfebfd60fa51b2ba,4
+np.float64,0xffdecb3e85bd967e,0x3fbfad2667a8b468,4
+np.float64,0xffe4ee900b29dd20,0xbfdc02dc626f91cd,4
+np.float64,0xffd3179f6da62f3e,0xbfe2cfe442511776,4
+np.float64,0xffe99ef7cef33def,0x3f50994542a7f303,4
+np.float64,0xffe2b66b1ae56cd6,0xbfefe3e066eb6329,4
+np.float64,0xff8f72aff03ee540,0x3fe9c46224cf5003,4
+np.float64,0xffd29beb85a537d8,0x3fefcb0b6166be71,4
+np.float64,0xffaef02d4c3de060,0xbfef5fb71028fc72,4
+np.float64,0xffd39a2a89273456,0x3fe6d4b183205dca,4
+np.float64,0xffef8a9392ff1526,0x3fedb99fbf402468,4
+np.float64,0xffb9b3f31e3367e8,0x3fee1005270fcf80,4
+np.float64,0xffed9d5c693b3ab8,0x3fd110f4b02365d5,4
+np.float64,0xffeaba45f9f5748b,0x3fe499e0a6f4afb2,4
+np.float64,0xffdba3f70d3747ee,0xbfca0c30493ae519,4
+np.float64,0xffa35b985426b730,0xbfdb625df56bcf45,4
+np.float64,0xffccbc9728397930,0x3fc53cbc59020704,4
+np.float64,0xffef73c942bee792,0xbfdc647a7a5e08be,4
+np.float64,0xffcb5acfb236b5a0,0x3feeb4ec038c39fc,4
+np.float64,0xffea116fe2b422df,0x3fefe03b6ae0b435,4
+np.float64,0xffe97de6e7b2fbcd,0xbfd2025698fab9eb,4
+np.float64,0xffdddba314bbb746,0x3fd31f0fdb8f93be,4
+np.float64,0xffd613a24a2c2744,0xbfebbb1efae884b3,4
+np.float64,0xffe3d938aa67b271,0xbfc2099cead3d3be,4
+np.float64,0xffdf08c2e33e1186,0xbfefd236839b900d,4
+np.float64,0xffea6ba8bd34d751,0x3fe8dfc032114719,4
+np.float64,0xffe3202083e64040,0x3fed513b81432a22,4
+np.float64,0xffb2397db62472f8,0xbfee7d7fe1c3f76c,4
+np.float64,0xffd9d0682ab3a0d0,0x3fe0bcf9e531ad79,4
+np.float64,0xffc293df202527c0,0xbfe58d0bdece5e64,4
+np.float64,0xffe1422c7da28458,0xbf81bd72595f2341,4
+np.float64,0xffd64e4ed4ac9c9e,0x3fa4334cc011c703,4
+np.float64,0xffe40a970ae8152e,0x3fead3d258b55b7d,4
+np.float64,0xffc8c2f2223185e4,0xbfef685f07c8b9fd,4
+np.float64,0xffe4b2f7216965ee,0x3fe3861d3d896a83,4
+np.float64,0xffdb531db3b6a63c,0x3fe18cb8332dd59d,4
+np.float64,0xffe8e727a3b1ce4e,0xbfe57b15abb677b9,4
+np.float64,0xffe530c1e12a6184,0xbfb973ea5535e48f,4
+np.float64,0xffe6f7849cedef08,0x3fd39a37ec5af4b6,4
+np.float64,0xffead62a78b5ac54,0x3fe69b3f6c7aa24b,4
+np.float64,0xffeefdd725fdfbad,0xbfc08a456111fdd5,4
+np.float64,0xffe682182fed0430,0x3fecc7c1292761d2,4
+np.float64,0xffee0ca8dcbc1951,0x3fef6cc361ef2c19,4
+np.float64,0xffec9b338f393666,0x3fefa9ab8e0471b5,4
+np.float64,0xffe13c5e29a278bc,0xbfef8da74ad83398,4
+np.float64,0xffd7bd48c62f7a92,0x3fe3468cd4ac9d34,4
+np.float64,0xffedd0ed14bba1d9,0xbfd563a83477077b,4
+np.float64,0xffe86b83f3f0d707,0x3fe9eb3c658e4b2d,4
+np.float64,0xffd6a4db4bad49b6,0xbfc7e11276166e17,4
+np.float64,0xffc29e8404253d08,0x3fd35971961c789f,4
+np.float64,0xffe27cf3d664f9e7,0xbfeca0f73c72f810,4
+np.float64,0xffc34152352682a4,0x3fef384e564c002c,4
+np.float64,0xffe395728ba72ae4,0x3f8fe18c2de86eba,4
+np.float64,0xffed86c4fbbb0d89,0x3fef709db881c672,4
+np.float64,0xffe8a98d37f1531a,0x3fd4879c8f73c3dc,4
+np.float64,0xffb8ce9fea319d40,0xbfb853c8fe46b08d,4
+np.float64,0xffe7f26db8efe4db,0xbfec1cfd3e5c2ac1,4
+np.float64,0xffd7935b77af26b6,0x3fb7368c89b2a460,4
+np.float64,0xffc5840ed02b081c,0x3fd92220b56631f3,4
+np.float64,0xffc36a873926d510,0x3fa84d61baf61811,4
+np.float64,0xffe06ea583e0dd4a,0x3feb647e348b9e39,4
+np.float64,0xffe6a33031ed4660,0xbfe096b851dc1a0a,4
+np.float64,0xffe001c938e00392,0x3fe4eece77623e7a,4
+np.float64,0xffc1e4f23b23c9e4,0xbfdb9bb1f83f6ac4,4
+np.float64,0xffecd3ecbab9a7d9,0x3fbafb1f800f177d,4
+np.float64,0xffc2d3016825a604,0xbfef650e8b0d6afb,4
+np.float64,0xffe222cb68e44596,0x3fde3690e44de5bd,4
+np.float64,0xffe5bb145e2b7628,0x3fedbb98e23c9dc1,4
+np.float64,0xffe9e5823b73cb04,0xbfee41661016c03c,4
+np.float64,0xffd234a00ba46940,0x3fda0312cda580c2,4
+np.float64,0xffe0913ed6e1227d,0xbfed508bb529bd23,4
+np.float64,0xffe8e3596171c6b2,0xbfdc33e1c1d0310e,4
+np.float64,0xffef9c6835ff38cf,0x3fea8ce6d27dfba3,4
+np.float64,0xffdd3bcf66ba779e,0x3fe50523d2b6470e,4
+np.float64,0xffe57e8cf06afd1a,0xbfee600933347247,4
+np.float64,0xffe0d8c65fa1b18c,0x3fe75091f93d5e4c,4
+np.float64,0xffea7c8c16b4f918,0x3fee681724795198,4
+np.float64,0xffe34f7a05269ef4,0xbfe3c3e179676f13,4
+np.float64,0xffd28894a6a5112a,0xbfe5d1027aee615d,4
+np.float64,0xffc73be6f22e77cc,0x3fe469bbc08b472a,4
+np.float64,0xffe7f71b066fee36,0x3fe7ed136c8fdfaa,4
+np.float64,0xffebc13e29f7827c,0x3fefcdc6e677d314,4
+np.float64,0xffd53e9c942a7d3a,0x3fea5a02c7341749,4
+np.float64,0xffd7191b23ae3236,0x3fea419b66023443,4
+np.float64,0xffe9480325b29006,0xbfefeaff5fa38cd5,4
+np.float64,0xffba46dc0e348db8,0xbfefa54f4de28eba,4
+np.float64,0xffdd4cc31eba9986,0x3fe60bb41fe1c4da,4
+np.float64,0xffe13a70dea274e1,0xbfaa9192f7bd6c9b,4
+np.float64,0xffde25127bbc4a24,0x3f7c75f45e29be7d,4
+np.float64,0xffe4076543a80eca,0x3fea5aad50d2f687,4
+np.float64,0xffe61512acec2a25,0xbfefffeb67401649,4
+np.float64,0xffef812ec1ff025d,0xbfe919c7c073c766,4
+np.float64,0xffd5552aeaaaaa56,0x3fc89d38ab047396,4
diff --git a/numpy/core/tests/data/umath-validation-set-cosh.csv b/numpy/core/tests/data/umath-validation-set-cosh.csv
new file mode 100644 (file)
index 0000000..c9e446c
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0xfe0ac238,0x7f800000,3
+np.float32,0xbf553b86,0x3faf079b,3
+np.float32,0xff4457da,0x7f800000,3
+np.float32,0xff7253f3,0x7f800000,3
+np.float32,0x5a5802,0x3f800000,3
+np.float32,0x3db03413,0x3f80795b,3
+np.float32,0x7f6795c9,0x7f800000,3
+np.float32,0x805b9142,0x3f800000,3
+np.float32,0xfeea581a,0x7f800000,3
+np.float32,0x3f7e2dba,0x3fc472f6,3
+np.float32,0x3d9c4d74,0x3f805f7a,3
+np.float32,0x7f18c665,0x7f800000,3
+np.float32,0x7f003e23,0x7f800000,3
+np.float32,0x3d936fa0,0x3f8054f3,3
+np.float32,0x3f32034f,0x3fa0368e,3
+np.float32,0xff087604,0x7f800000,3
+np.float32,0x380a5,0x3f800000,3
+np.float32,0x3f59694e,0x3fb10077,3
+np.float32,0x3e63e648,0x3f832ee4,3
+np.float32,0x80712f42,0x3f800000,3
+np.float32,0x3e169908,0x3f816302,3
+np.float32,0x3f2d766e,0x3f9e8692,3
+np.float32,0x3d6412e0,0x3f8032d0,3
+np.float32,0xbde689e8,0x3f80cfd4,3
+np.float32,0x483e2e,0x3f800000,3
+np.float32,0xff1ba2d0,0x7f800000,3
+np.float32,0x80136bff,0x3f800000,3
+np.float32,0x3f72534c,0x3fbdc1d4,3
+np.float32,0x3e9eb381,0x3f8632c6,3
+np.float32,0x3e142892,0x3f815795,3
+np.float32,0x0,0x3f800000,3
+np.float32,0x2f2528,0x3f800000,3
+np.float32,0x7f38be13,0x7f800000,3
+np.float32,0xfeee6896,0x7f800000,3
+np.float32,0x7f09095d,0x7f800000,3
+np.float32,0xbe94d,0x3f800000,3
+np.float32,0xbedcf8d4,0x3f8c1b74,3
+np.float32,0xbf694c02,0x3fb8ef07,3
+np.float32,0x3e2261f8,0x3f819cde,3
+np.float32,0xbf01d3ce,0x3f90d0e0,3
+np.float32,0xbeb7b3a2,0x3f8853de,3
+np.float32,0x8046de7b,0x3f800000,3
+np.float32,0xbcb45ea0,0x3f8007f1,3
+np.float32,0x3eef14af,0x3f8e35dd,3
+np.float32,0xbf047316,0x3f91846e,3
+np.float32,0x801cef45,0x3f800000,3
+np.float32,0x3e9ad891,0x3f85e609,3
+np.float32,0xff20e9cf,0x7f800000,3
+np.float32,0x80068434,0x3f800000,3
+np.float32,0xbe253020,0x3f81ab49,3
+np.float32,0x3f13f4b8,0x3f95fac9,3
+np.float32,0x804accd1,0x3f800000,3
+np.float32,0x3dee3e10,0x3f80ddf7,3
+np.float32,0xbe6c4690,0x3f836c29,3
+np.float32,0xff30d431,0x7f800000,3
+np.float32,0xbec82416,0x3f89e791,3
+np.float32,0x3f30bbcb,0x3f9fbbcc,3
+np.float32,0x3f5620a2,0x3faf72b8,3
+np.float32,0x807a8130,0x3f800000,3
+np.float32,0x3e3cb02d,0x3f822de0,3
+np.float32,0xff4839ac,0x7f800000,3
+np.float32,0x800a3e9c,0x3f800000,3
+np.float32,0x3dffd65b,0x3f810002,3
+np.float32,0xbf2b1492,0x3f9da987,3
+np.float32,0xbf21602c,0x3f9a48fe,3
+np.float32,0x512531,0x3f800000,3
+np.float32,0x24b99a,0x3f800000,3
+np.float32,0xbf53e345,0x3fae67b1,3
+np.float32,0xff2126ec,0x7f800000,3
+np.float32,0x7e79b49d,0x7f800000,3
+np.float32,0x3ea3cf04,0x3f869b6f,3
+np.float32,0x7f270059,0x7f800000,3
+np.float32,0x3f625b2f,0x3fb561e1,3
+np.float32,0xbf59947e,0x3fb11519,3
+np.float32,0xfe0d1c64,0x7f800000,3
+np.float32,0xbf3f3eae,0x3fa568e2,3
+np.float32,0x7c04d1,0x3f800000,3
+np.float32,0x7e66bd,0x3f800000,3
+np.float32,0x8011880d,0x3f800000,3
+np.float32,0x3f302f07,0x3f9f8759,3
+np.float32,0x4e3375,0x3f800000,3
+np.float32,0xfe67a134,0x7f800000,3
+np.float32,0xff670249,0x7f800000,3
+np.float32,0x7e19f27d,0x7f800000,3
+np.float32,0xbf36ce12,0x3fa20b81,3
+np.float32,0xbe6bcfc4,0x3f8368b5,3
+np.float32,0x76fcba,0x3f800000,3
+np.float32,0x7f30abaf,0x7f800000,3
+np.float32,0x3f4c1f6d,0x3faae43c,3
+np.float32,0x7f61f44a,0x7f800000,3
+np.float32,0xbf4bb3c9,0x3faab4af,3
+np.float32,0xbda15ee0,0x3f8065c6,3
+np.float32,0xfbb4e800,0x7f800000,3
+np.float32,0x7fa00000,0x7fe00000,3
+np.float32,0x80568501,0x3f800000,3
+np.float32,0xfeb285e4,0x7f800000,3
+np.float32,0x804423a7,0x3f800000,3
+np.float32,0x7e6c0f21,0x7f800000,3
+np.float32,0x7f136b3c,0x7f800000,3
+np.float32,0x3f2d08e6,0x3f9e5e9c,3
+np.float32,0xbf6b454e,0x3fb9f7e6,3
+np.float32,0x3e6bceb0,0x3f8368ad,3
+np.float32,0xff1ad16a,0x7f800000,3
+np.float32,0x7cce1a04,0x7f800000,3
+np.float32,0xff7bcf95,0x7f800000,3
+np.float32,0x8049788d,0x3f800000,3
+np.float32,0x7ec45918,0x7f800000,3
+np.float32,0xff7fffff,0x7f800000,3
+np.float32,0x8039a1a0,0x3f800000,3
+np.float32,0x7e90cd72,0x7f800000,3
+np.float32,0xbf7dfd53,0x3fc456cc,3
+np.float32,0x3eeeb664,0x3f8e2a76,3
+np.float32,0x8055ef9b,0x3f800000,3
+np.float32,0x7ee06ddd,0x7f800000,3
+np.float32,0xba2cc000,0x3f800002,3
+np.float32,0x806da632,0x3f800000,3
+np.float32,0x7ecfaaf5,0x7f800000,3
+np.float32,0x3ddd12e6,0x3f80bf19,3
+np.float32,0xbf754394,0x3fbf60b1,3
+np.float32,0x6f3f19,0x3f800000,3
+np.float32,0x800a9af0,0x3f800000,3
+np.float32,0xfeef13ea,0x7f800000,3
+np.float32,0x7f74841f,0x7f800000,3
+np.float32,0xbeb9a2f0,0x3f888181,3
+np.float32,0x77cbb,0x3f800000,3
+np.float32,0xbf587f84,0x3fb0911b,3
+np.float32,0x210ba5,0x3f800000,3
+np.float32,0x3ee60a28,0x3f8d2367,3
+np.float32,0xbe3731ac,0x3f820dc7,3
+np.float32,0xbee8cfee,0x3f8d765e,3
+np.float32,0x7b2ef179,0x7f800000,3
+np.float32,0xfe81377c,0x7f800000,3
+np.float32,0x6ac98c,0x3f800000,3
+np.float32,0x3f51f144,0x3fad8288,3
+np.float32,0x80785750,0x3f800000,3
+np.float32,0x3f46615a,0x3fa864ff,3
+np.float32,0xbf35ac9e,0x3fa19b8e,3
+np.float32,0x7f0982ac,0x7f800000,3
+np.float32,0x1b2610,0x3f800000,3
+np.float32,0x3ed8bb25,0x3f8ba3df,3
+np.float32,0xbeb41bac,0x3f88006d,3
+np.float32,0xff48e89d,0x7f800000,3
+np.float32,0x3ed0ab8c,0x3f8ac755,3
+np.float32,0xbe64671c,0x3f833282,3
+np.float32,0x64bce4,0x3f800000,3
+np.float32,0x284f79,0x3f800000,3
+np.float32,0x7e09faa7,0x7f800000,3
+np.float32,0x4376c1,0x3f800000,3
+np.float32,0x805ca8c0,0x3f800000,3
+np.float32,0xff0859d5,0x7f800000,3
+np.float32,0xbed2f3b2,0x3f8b04dd,3
+np.float32,0x8045bd0c,0x3f800000,3
+np.float32,0x3f0e6216,0x3f94503f,3
+np.float32,0x3f41e3ae,0x3fa68035,3
+np.float32,0x80088ccc,0x3f800000,3
+np.float32,0x3f37fc19,0x3fa2812f,3
+np.float32,0x71c87d,0x3f800000,3
+np.float32,0x8024f4b2,0x3f800000,3
+np.float32,0xff78dd88,0x7f800000,3
+np.float32,0xbda66c90,0x3f806c40,3
+np.float32,0x7f33ef0d,0x7f800000,3
+np.float32,0x46a343,0x3f800000,3
+np.float32,0xff1dce38,0x7f800000,3
+np.float32,0x1b935d,0x3f800000,3
+np.float32,0x3ebec598,0x3f88fd0e,3
+np.float32,0xff115530,0x7f800000,3
+np.float32,0x803916aa,0x3f800000,3
+np.float32,0xff60a3e2,0x7f800000,3
+np.float32,0x3b8ddd48,0x3f80004f,3
+np.float32,0x3f761b6e,0x3fbfd8ea,3
+np.float32,0xbdf55b88,0x3f80eb70,3
+np.float32,0x37374,0x3f800000,3
+np.float32,0x3de150e0,0x3f80c682,3
+np.float32,0x3f343278,0x3fa10a83,3
+np.float32,0xbe9baefa,0x3f85f68b,3
+np.float32,0x3d8d43,0x3f800000,3
+np.float32,0x3e80994b,0x3f840f0c,3
+np.float32,0xbe573c6c,0x3f82d685,3
+np.float32,0x805b83b4,0x3f800000,3
+np.float32,0x683d88,0x3f800000,3
+np.float32,0x692465,0x3f800000,3
+np.float32,0xbdc345f8,0x3f809511,3
+np.float32,0x3f7c1c5a,0x3fc3406f,3
+np.float32,0xbf40bef3,0x3fa606df,3
+np.float32,0xff1e25b9,0x7f800000,3
+np.float32,0x3e4481e0,0x3f825d37,3
+np.float32,0x75d188,0x3f800000,3
+np.float32,0x3ea53cec,0x3f86b956,3
+np.float32,0xff105a54,0x7f800000,3
+np.float32,0x7f800000,0x7f800000,3
+np.float32,0x7f11f0b0,0x7f800000,3
+np.float32,0xbf58a57d,0x3fb0a328,3
+np.float32,0xbdd11e38,0x3f80aaf8,3
+np.float32,0xbea94adc,0x3f870fa0,3
+np.float32,0x3e9dd780,0x3f862180,3
+np.float32,0xff1786b9,0x7f800000,3
+np.float32,0xfec46aa2,0x7f800000,3
+np.float32,0x7f4300c1,0x7f800000,3
+np.float32,0x29ba2b,0x3f800000,3
+np.float32,0x3f4112e2,0x3fa62993,3
+np.float32,0xbe6c9224,0x3f836e5d,3
+np.float32,0x7f0e42a3,0x7f800000,3
+np.float32,0xff6390ad,0x7f800000,3
+np.float32,0x3f54e374,0x3faede94,3
+np.float32,0x7f2642a2,0x7f800000,3
+np.float32,0x7f46b2be,0x7f800000,3
+np.float32,0xfe59095c,0x7f800000,3
+np.float32,0x7146a0,0x3f800000,3
+np.float32,0x3f07763d,0x3f925786,3
+np.float32,0x3d172780,0x3f801651,3
+np.float32,0xff66f1c5,0x7f800000,3
+np.float32,0xff025349,0x7f800000,3
+np.float32,0x6ce99d,0x3f800000,3
+np.float32,0xbf7e4f50,0x3fc48685,3
+np.float32,0xbeff8ca2,0x3f904708,3
+np.float32,0x3e6c8,0x3f800000,3
+np.float32,0x7f7153dc,0x7f800000,3
+np.float32,0xbedcf612,0x3f8c1b26,3
+np.float32,0xbbc2f180,0x3f800094,3
+np.float32,0xbf397399,0x3fa314b8,3
+np.float32,0x6c6e35,0x3f800000,3
+np.float32,0x7f50a88b,0x7f800000,3
+np.float32,0xfe84093e,0x7f800000,3
+np.float32,0x3f737b9d,0x3fbe6478,3
+np.float32,0x7f6a5340,0x7f800000,3
+np.float32,0xbde83c20,0x3f80d2e7,3
+np.float32,0xff769ce9,0x7f800000,3
+np.float32,0xfdd33c30,0x7f800000,3
+np.float32,0xbc95cb60,0x3f80057a,3
+np.float32,0x8007a40d,0x3f800000,3
+np.float32,0x3f55d90c,0x3faf5132,3
+np.float32,0x80282082,0x3f800000,3
+np.float32,0xbf43b1f2,0x3fa7418c,3
+np.float32,0x3f1dc7cb,0x3f991731,3
+np.float32,0xbd4346a0,0x3f80253f,3
+np.float32,0xbf5aa82a,0x3fb19946,3
+np.float32,0x3f4b8c22,0x3faaa333,3
+np.float32,0x3d13468c,0x3f80152f,3
+np.float32,0x7db77097,0x7f800000,3
+np.float32,0x4a00df,0x3f800000,3
+np.float32,0xbedea5e0,0x3f8c4b64,3
+np.float32,0x80482543,0x3f800000,3
+np.float32,0xbef344fe,0x3f8eb8dd,3
+np.float32,0x7ebd4044,0x7f800000,3
+np.float32,0xbf512c0e,0x3fad287e,3
+np.float32,0x3db28cce,0x3f807c9c,3
+np.float32,0xbd0f5ae0,0x3f801412,3
+np.float32,0xfe7ed9ac,0x7f800000,3
+np.float32,0x3eb1aa82,0x3f87c8b4,3
+np.float32,0xfef1679e,0x7f800000,3
+np.float32,0xff3629f2,0x7f800000,3
+np.float32,0xff3562b4,0x7f800000,3
+np.float32,0x3dcafe1d,0x3f80a118,3
+np.float32,0xfedf242a,0x7f800000,3
+np.float32,0xbf43102a,0x3fa6fda4,3
+np.float32,0x8028834e,0x3f800000,3
+np.float32,0x805c8513,0x3f800000,3
+np.float32,0x3f59306a,0x3fb0e550,3
+np.float32,0x3eda2c9c,0x3f8bcc4a,3
+np.float32,0x80023524,0x3f800000,3
+np.float32,0x7ef72879,0x7f800000,3
+np.float32,0x661c8a,0x3f800000,3
+np.float32,0xfec3ba6c,0x7f800000,3
+np.float32,0x805aaca6,0x3f800000,3
+np.float32,0xff5c1f13,0x7f800000,3
+np.float32,0x3f6ab3f4,0x3fb9ab6b,3
+np.float32,0x3f014896,0x3f90ac20,3
+np.float32,0x3f030584,0x3f91222a,3
+np.float32,0xbf74853d,0x3fbef71d,3
+np.float32,0xbf534ee0,0x3fae2323,3
+np.float32,0x2c90c3,0x3f800000,3
+np.float32,0x7f62ad25,0x7f800000,3
+np.float32,0x1c8847,0x3f800000,3
+np.float32,0x7e2a8d43,0x7f800000,3
+np.float32,0x807a09cd,0x3f800000,3
+np.float32,0x413871,0x3f800000,3
+np.float32,0x80063692,0x3f800000,3
+np.float32,0x3edaf29b,0x3f8be211,3
+np.float32,0xbf64a7ab,0x3fb68b2d,3
+np.float32,0xfe56a720,0x7f800000,3
+np.float32,0xbf54a8d4,0x3faec350,3
+np.float32,0x3ecbaef7,0x3f8a4350,3
+np.float32,0x3f413714,0x3fa63890,3
+np.float32,0x7d3aa8,0x3f800000,3
+np.float32,0xbea9a13c,0x3f8716e7,3
+np.float32,0x7ef7553e,0x7f800000,3
+np.float32,0x8056f29f,0x3f800000,3
+np.float32,0xff1f7ffe,0x7f800000,3
+np.float32,0x3f41953b,0x3fa65f9c,3
+np.float32,0x3daa2f,0x3f800000,3
+np.float32,0xff0893e4,0x7f800000,3
+np.float32,0xbefc7ec6,0x3f8fe207,3
+np.float32,0xbb026800,0x3f800011,3
+np.float32,0x341e4f,0x3f800000,3
+np.float32,0x3e7b708a,0x3f83e0d1,3
+np.float32,0xa18cb,0x3f800000,3
+np.float32,0x7e290239,0x7f800000,3
+np.float32,0xbf4254f2,0x3fa6af62,3
+np.float32,0x80000000,0x3f800000,3
+np.float32,0x3f0a6c,0x3f800000,3
+np.float32,0xbec44d28,0x3f898609,3
+np.float32,0xf841f,0x3f800000,3
+np.float32,0x7f01a693,0x7f800000,3
+np.float32,0x8053340b,0x3f800000,3
+np.float32,0xfd4e7990,0x7f800000,3
+np.float32,0xbf782f1f,0x3fc10356,3
+np.float32,0xbe962118,0x3f858acc,3
+np.float32,0xfe8cd702,0x7f800000,3
+np.float32,0x7ecd986f,0x7f800000,3
+np.float32,0x3ebe775f,0x3f88f59b,3
+np.float32,0x8065524f,0x3f800000,3
+np.float32,0x3ede7fc4,0x3f8c471e,3
+np.float32,0x7f5e15ea,0x7f800000,3
+np.float32,0xbe871ada,0x3f847b78,3
+np.float32,0x3f21958b,0x3f9a5af7,3
+np.float32,0x3f64d480,0x3fb6a1fa,3
+np.float32,0xff18b0e9,0x7f800000,3
+np.float32,0xbf0840dd,0x3f928fd9,3
+np.float32,0x80104f5d,0x3f800000,3
+np.float32,0x643b94,0x3f800000,3
+np.float32,0xbc560a80,0x3f8002cc,3
+np.float32,0x3f5c75d6,0x3fb2786e,3
+np.float32,0x7f365fc9,0x7f800000,3
+np.float32,0x54e965,0x3f800000,3
+np.float32,0x6dcd4d,0x3f800000,3
+np.float32,0x3f2057a0,0x3f99f04d,3
+np.float32,0x272fa3,0x3f800000,3
+np.float32,0xff423dc9,0x7f800000,3
+np.float32,0x80273463,0x3f800000,3
+np.float32,0xfe21cc78,0x7f800000,3
+np.float32,0x7fc00000,0x7fc00000,3
+np.float32,0x802feb65,0x3f800000,3
+np.float32,0x3dc733d0,0x3f809b21,3
+np.float32,0x65d56b,0x3f800000,3
+np.float32,0x80351d8e,0x3f800000,3
+np.float32,0xbf244247,0x3f9b43dd,3
+np.float32,0x7f328e7e,0x7f800000,3
+np.float32,0x7f4d9712,0x7f800000,3
+np.float32,0x2c505d,0x3f800000,3
+np.float32,0xbf232ebe,0x3f9ae5a0,3
+np.float32,0x804a363a,0x3f800000,3
+np.float32,0x80417102,0x3f800000,3
+np.float32,0xbf48b170,0x3fa963d4,3
+np.float32,0x7ea3e3b6,0x7f800000,3
+np.float32,0xbf41415b,0x3fa63cd2,3
+np.float32,0xfe3af7c8,0x7f800000,3
+np.float32,0x7f478010,0x7f800000,3
+np.float32,0x80143113,0x3f800000,3
+np.float32,0x3f7626a7,0x3fbfdf2e,3
+np.float32,0xfea20b0a,0x7f800000,3
+np.float32,0x80144d64,0x3f800000,3
+np.float32,0x7db9ba47,0x7f800000,3
+np.float32,0x7f7fffff,0x7f800000,3
+np.float32,0xbe410834,0x3f8247ef,3
+np.float32,0x14a7af,0x3f800000,3
+np.float32,0x7eaebf9e,0x7f800000,3
+np.float32,0xff800000,0x7f800000,3
+np.float32,0x3f0a7d8e,0x3f9330fd,3
+np.float32,0x3ef780,0x3f800000,3
+np.float32,0x3f62253e,0x3fb546d1,3
+np.float32,0x3f4cbeac,0x3fab2acc,3
+np.float32,0x25db1,0x3f800000,3
+np.float32,0x65c54a,0x3f800000,3
+np.float32,0x800f0645,0x3f800000,3
+np.float32,0x3ed28c78,0x3f8af9f0,3
+np.float32,0x8040c6ce,0x3f800000,3
+np.float32,0x5e4e9a,0x3f800000,3
+np.float32,0xbd3fd2b0,0x3f8023f1,3
+np.float32,0xbf5d2d3f,0x3fb2d1b6,3
+np.float32,0x7ead999f,0x7f800000,3
+np.float32,0xbf30dc86,0x3f9fc805,3
+np.float32,0xff2b0a62,0x7f800000,3
+np.float32,0x3d5180e9,0x3f802adf,3
+np.float32,0x3f62716f,0x3fb56d0d,3
+np.float32,0x7e82ae9c,0x7f800000,3
+np.float32,0xfe2d4bdc,0x7f800000,3
+np.float32,0x805cc7d4,0x3f800000,3
+np.float32,0xfb50f700,0x7f800000,3
+np.float32,0xff57b684,0x7f800000,3
+np.float32,0x80344f01,0x3f800000,3
+np.float32,0x7f2af372,0x7f800000,3
+np.float32,0xfeab6204,0x7f800000,3
+np.float32,0x30b251,0x3f800000,3
+np.float32,0x3eed8cc4,0x3f8e0698,3
+np.float32,0x7eeb1c6a,0x7f800000,3
+np.float32,0x3f17ece6,0x3f9735b0,3
+np.float32,0x21e985,0x3f800000,3
+np.float32,0x3f3a7df3,0x3fa37e34,3
+np.float32,0x802a14a2,0x3f800000,3
+np.float32,0x807d4d5b,0x3f800000,3
+np.float32,0x7f6093ce,0x7f800000,3
+np.float32,0x3f800000,0x3fc583ab,3
+np.float32,0x3da2c26e,0x3f806789,3
+np.float32,0xfe05f278,0x7f800000,3
+np.float32,0x800000,0x3f800000,3
+np.float32,0xbee63342,0x3f8d282e,3
+np.float32,0xbf225586,0x3f9a9bd4,3
+np.float32,0xbed60e86,0x3f8b59ba,3
+np.float32,0xbec99484,0x3f8a0ca3,3
+np.float32,0x3e967c71,0x3f859199,3
+np.float32,0x7f26ab62,0x7f800000,3
+np.float32,0xca7f4,0x3f800000,3
+np.float32,0xbf543790,0x3fae8ebc,3
+np.float32,0x3e4c1ed9,0x3f828d2d,3
+np.float32,0xbdf37f88,0x3f80e7e1,3
+np.float32,0xff0cc44e,0x7f800000,3
+np.float32,0x5dea48,0x3f800000,3
+np.float32,0x31023c,0x3f800000,3
+np.float32,0x3ea10733,0x3f866208,3
+np.float32,0x3e11e6f2,0x3f814d2e,3
+np.float32,0x80641960,0x3f800000,3
+np.float32,0x3ef779a8,0x3f8f3edb,3
+np.float32,0x3f2a5062,0x3f9d632a,3
+np.float32,0x2b7d34,0x3f800000,3
+np.float32,0x3eeb95c5,0x3f8dca67,3
+np.float32,0x805c1357,0x3f800000,3
+np.float32,0x3db3a79d,0x3f807e29,3
+np.float32,0xfded1900,0x7f800000,3
+np.float32,0x45f362,0x3f800000,3
+np.float32,0x451f38,0x3f800000,3
+np.float32,0x801d3ae5,0x3f800000,3
+np.float32,0x458d45,0x3f800000,3
+np.float32,0xfda9d298,0x7f800000,3
+np.float32,0x467439,0x3f800000,3
+np.float32,0x7f66554a,0x7f800000,3
+np.float32,0xfef2375a,0x7f800000,3
+np.float32,0xbf33fc47,0x3fa0f5d7,3
+np.float32,0x3f75ba69,0x3fbfa2d0,3
+np.float32,0xfeb625b2,0x7f800000,3
+np.float32,0x8066b371,0x3f800000,3
+np.float32,0x3f5cb4e9,0x3fb29718,3
+np.float32,0x7f3b6a58,0x7f800000,3
+np.float32,0x7f6b35ea,0x7f800000,3
+np.float32,0xbf6ee555,0x3fbbe5be,3
+np.float32,0x3d836e21,0x3f804380,3
+np.float32,0xff43cd0c,0x7f800000,3
+np.float32,0xff55c1fa,0x7f800000,3
+np.float32,0xbf0dfccc,0x3f9432a6,3
+np.float32,0x3ed92121,0x3f8baf00,3
+np.float32,0x80068cc1,0x3f800000,3
+np.float32,0xff0103f9,0x7f800000,3
+np.float32,0x7e51b175,0x7f800000,3
+np.float32,0x8012f214,0x3f800000,3
+np.float32,0x62d298,0x3f800000,3
+np.float32,0xbf3e1525,0x3fa4ef8d,3
+np.float32,0x806b4882,0x3f800000,3
+np.float32,0xbf38c146,0x3fa2ce7c,3
+np.float32,0xbed59c30,0x3f8b4d70,3
+np.float32,0x3d1910c0,0x3f8016e2,3
+np.float32,0x7f33d55b,0x7f800000,3
+np.float32,0x7f5800e3,0x7f800000,3
+np.float32,0x5b2c5d,0x3f800000,3
+np.float32,0x807be750,0x3f800000,3
+np.float32,0x7eb297c1,0x7f800000,3
+np.float32,0x7dafee62,0x7f800000,3
+np.float32,0x7d9e23f0,0x7f800000,3
+np.float32,0x3e580537,0x3f82dbd8,3
+np.float32,0xbf800000,0x3fc583ab,3
+np.float32,0x7f40f880,0x7f800000,3
+np.float32,0x775ad3,0x3f800000,3
+np.float32,0xbedacd36,0x3f8bddf3,3
+np.float32,0x2138f6,0x3f800000,3
+np.float32,0x52c3b7,0x3f800000,3
+np.float32,0x8041cfdd,0x3f800000,3
+np.float32,0x7bf16791,0x7f800000,3
+np.float32,0xbe95869c,0x3f857f55,3
+np.float32,0xbf199796,0x3f97bcaf,3
+np.float32,0x3ef8da38,0x3f8f6b45,3
+np.float32,0x803f3648,0x3f800000,3
+np.float32,0x80026fd2,0x3f800000,3
+np.float32,0x7eb3ac26,0x7f800000,3
+np.float32,0x3e49921b,0x3f827ce8,3
+np.float32,0xbf689aed,0x3fb892de,3
+np.float32,0x3f253509,0x3f9b9779,3
+np.float32,0xff17894a,0x7f800000,3
+np.float32,0x3cd12639,0x3f800aae,3
+np.float32,0x1db14b,0x3f800000,3
+np.float32,0x39a0bf,0x3f800000,3
+np.float32,0xfdfe1d08,0x7f800000,3
+np.float32,0xff416cd2,0x7f800000,3
+np.float32,0x8070d818,0x3f800000,3
+np.float32,0x3e516e12,0x3f82afb8,3
+np.float32,0x80536651,0x3f800000,3
+np.float32,0xbf2903d2,0x3f9cecb7,3
+np.float32,0x3e896ae4,0x3f84a353,3
+np.float32,0xbd6ba2c0,0x3f80363d,3
+np.float32,0x80126d3e,0x3f800000,3
+np.float32,0xfd9d43d0,0x7f800000,3
+np.float32,0x7b56b6,0x3f800000,3
+np.float32,0xff04718e,0x7f800000,3
+np.float32,0x31440f,0x3f800000,3
+np.float32,0xbf7a1313,0x3fc215c9,3
+np.float32,0x7f43d6a0,0x7f800000,3
+np.float32,0x3f566503,0x3faf92cc,3
+np.float32,0xbf39eb0e,0x3fa343f1,3
+np.float32,0xbe35fd70,0x3f8206df,3
+np.float32,0x800c36ac,0x3f800000,3
+np.float32,0x60d061,0x3f800000,3
+np.float32,0x80453e12,0x3f800000,3
+np.float32,0xfe17c36c,0x7f800000,3
+np.float32,0x3d8c72,0x3f800000,3
+np.float32,0xfe8e9134,0x7f800000,3
+np.float32,0xff5d89de,0x7f800000,3
+np.float32,0x7f45020e,0x7f800000,3
+np.float32,0x3f28225e,0x3f9c9d01,3
+np.float32,0xbf3b6900,0x3fa3dbdd,3
+np.float32,0x80349023,0x3f800000,3
+np.float32,0xbf14d780,0x3f964042,3
+np.float32,0x3f56b5d2,0x3fafb8c3,3
+np.float32,0x800c639c,0x3f800000,3
+np.float32,0x7f7a19c8,0x7f800000,3
+np.float32,0xbf7a0815,0x3fc20f86,3
+np.float32,0xbec55926,0x3f89a06e,3
+np.float32,0x4b2cd2,0x3f800000,3
+np.float32,0xbf271eb2,0x3f9c41c8,3
+np.float32,0xff26e168,0x7f800000,3
+np.float32,0x800166b2,0x3f800000,3
+np.float32,0xbde97e38,0x3f80d532,3
+np.float32,0xbf1f93ec,0x3f99af1a,3
+np.float32,0x7f2896ed,0x7f800000,3
+np.float32,0x3da7d96d,0x3f806e1d,3
+np.float32,0x802b7237,0x3f800000,3
+np.float32,0xfdca6bc0,0x7f800000,3
+np.float32,0xbed2e300,0x3f8b0318,3
+np.float32,0x8079d9e8,0x3f800000,3
+np.float32,0x3f388c81,0x3fa2b9c2,3
+np.float32,0x3ed2607c,0x3f8af54a,3
+np.float32,0xff287de6,0x7f800000,3
+np.float32,0x3f55ed89,0x3faf5ac9,3
+np.float32,0x7f5b6af7,0x7f800000,3
+np.float32,0xbeb24730,0x3f87d698,3
+np.float32,0x1,0x3f800000,3
+np.float32,0x3f3a2350,0x3fa35a3b,3
+np.float32,0x8013b422,0x3f800000,3
+np.float32,0x3e9a6560,0x3f85dd35,3
+np.float32,0x80510631,0x3f800000,3
+np.float32,0xfeae39d6,0x7f800000,3
+np.float32,0x7eb437ad,0x7f800000,3
+np.float32,0x8047545b,0x3f800000,3
+np.float32,0x806a1c71,0x3f800000,3
+np.float32,0xbe5543f0,0x3f82c93b,3
+np.float32,0x40e8d,0x3f800000,3
+np.float32,0x63d18b,0x3f800000,3
+np.float32,0x1fa1ea,0x3f800000,3
+np.float32,0x801944e0,0x3f800000,3
+np.float32,0xbf4c7ac6,0x3fab0cae,3
+np.float32,0x7f2679d4,0x7f800000,3
+np.float32,0x3f0102fc,0x3f9099d0,3
+np.float32,0x7e44bdc1,0x7f800000,3
+np.float32,0xbf2072f6,0x3f99f970,3
+np.float32,0x5c7d38,0x3f800000,3
+np.float32,0x30a2e6,0x3f800000,3
+np.float32,0x805b9ca3,0x3f800000,3
+np.float32,0x7cc24ad5,0x7f800000,3
+np.float32,0x3f4f7920,0x3fac6357,3
+np.float32,0x111d62,0x3f800000,3
+np.float32,0xbf4de40a,0x3fabad77,3
+np.float32,0x805d0354,0x3f800000,3
+np.float32,0xbb3d2b00,0x3f800023,3
+np.float32,0x3ef229e7,0x3f8e960b,3
+np.float32,0x3f15754e,0x3f9670e0,3
+np.float32,0xbf689c6b,0x3fb893a5,3
+np.float32,0xbf3796c6,0x3fa2599b,3
+np.float32,0xbe95303c,0x3f8578f2,3
+np.float32,0xfee330de,0x7f800000,3
+np.float32,0xff0d9705,0x7f800000,3
+np.float32,0xbeb0ebd0,0x3f87b7dd,3
+np.float32,0xbf4d5a13,0x3fab6fe7,3
+np.float32,0x80142f5a,0x3f800000,3
+np.float32,0x7e01a87b,0x7f800000,3
+np.float32,0xbe45e5ec,0x3f8265d7,3
+np.float32,0x7f4ac255,0x7f800000,3
+np.float32,0x3ebf6a60,0x3f890ccb,3
+np.float32,0x7f771e16,0x7f800000,3
+np.float32,0x3f41834e,0x3fa6582b,3
+np.float32,0x3f7f6f98,0x3fc52ef0,3
+np.float32,0x7e4ad775,0x7f800000,3
+np.float32,0x3eb39991,0x3f87f4c4,3
+np.float32,0x1e3f4,0x3f800000,3
+np.float32,0x7e84ba19,0x7f800000,3
+np.float32,0x80640be4,0x3f800000,3
+np.float32,0x3f459fc8,0x3fa81272,3
+np.float32,0x3f554ed0,0x3faf109b,3
+np.float32,0x3c6617,0x3f800000,3
+np.float32,0x7f441158,0x7f800000,3
+np.float32,0x7f66e6d8,0x7f800000,3
+np.float32,0x7f565152,0x7f800000,3
+np.float32,0x7f16d550,0x7f800000,3
+np.float32,0xbd4f1950,0x3f8029e5,3
+np.float32,0xcf722,0x3f800000,3
+np.float32,0x3f37d6fd,0x3fa272ad,3
+np.float32,0xff7324ea,0x7f800000,3
+np.float32,0x804bc246,0x3f800000,3
+np.float32,0x7f099ef8,0x7f800000,3
+np.float32,0x5f838b,0x3f800000,3
+np.float32,0x80523534,0x3f800000,3
+np.float32,0x3f595e84,0x3fb0fb50,3
+np.float32,0xfdef8ac8,0x7f800000,3
+np.float32,0x3d9a07,0x3f800000,3
+np.float32,0x410f61,0x3f800000,3
+np.float32,0xbf715dbb,0x3fbd3bcb,3
+np.float32,0xbedd4734,0x3f8c242f,3
+np.float32,0x7e86739a,0x7f800000,3
+np.float32,0x3e81f144,0x3f8424fe,3
+np.float32,0x7f6342d1,0x7f800000,3
+np.float32,0xff6919a3,0x7f800000,3
+np.float32,0xff051878,0x7f800000,3
+np.float32,0x800ba28f,0x3f800000,3
+np.float32,0xfefab3d8,0x7f800000,3
+np.float32,0xff612a84,0x7f800000,3
+np.float32,0x800cd5ab,0x3f800000,3
+np.float32,0x802a07ae,0x3f800000,3
+np.float32,0xfef6ee3a,0x7f800000,3
+np.float32,0x8037e896,0x3f800000,3
+np.float32,0x3ef2d86f,0x3f8eab7d,3
+np.float32,0x3eafe53d,0x3f87a0cb,3
+np.float32,0xba591c00,0x3f800003,3
+np.float32,0x3e9ed028,0x3f863508,3
+np.float32,0x4a12a8,0x3f800000,3
+np.float32,0xbee55c84,0x3f8d0f45,3
+np.float32,0x8038a8d3,0x3f800000,3
+np.float32,0xff055243,0x7f800000,3
+np.float32,0xbf659067,0x3fb701ca,3
+np.float32,0xbee36a86,0x3f8cd5e0,3
+np.float32,0x7f1d74c1,0x7f800000,3
+np.float32,0xbf7657df,0x3fbffaad,3
+np.float32,0x7e37ee34,0x7f800000,3
+np.float32,0xff04bc74,0x7f800000,3
+np.float32,0x806d194e,0x3f800000,3
+np.float32,0x7f5596c3,0x7f800000,3
+np.float32,0xbe09d268,0x3f81293e,3
+np.float32,0x79ff75,0x3f800000,3
+np.float32,0xbf55479c,0x3faf0d3e,3
+np.float32,0xbe5428ec,0x3f82c1d4,3
+np.float32,0x3f624134,0x3fb554d7,3
+np.float32,0x2ccb8a,0x3f800000,3
+np.float32,0xfc082040,0x7f800000,3
+np.float32,0xff315467,0x7f800000,3
+np.float32,0x3e6ea2d2,0x3f837dd5,3
+np.float32,0x8020fdd1,0x3f800000,3
+np.float32,0x7f0416a1,0x7f800000,3
+np.float32,0x710a1b,0x3f800000,3
+np.float32,0x3dfcd050,0x3f80f9fc,3
+np.float32,0xfe995e96,0x7f800000,3
+np.float32,0x3f020d00,0x3f90e006,3
+np.float32,0x8064263e,0x3f800000,3
+np.float32,0xfcee4160,0x7f800000,3
+np.float32,0x801b3a18,0x3f800000,3
+np.float32,0x3f62c984,0x3fb59955,3
+np.float32,0x806e8355,0x3f800000,3
+np.float32,0x7e94f65d,0x7f800000,3
+np.float32,0x1173de,0x3f800000,3
+np.float32,0x3e3ff3b7,0x3f824166,3
+np.float32,0x803b4aea,0x3f800000,3
+np.float32,0x804c5bcc,0x3f800000,3
+np.float32,0x509fe5,0x3f800000,3
+np.float32,0xbf33b5ee,0x3fa0db0b,3
+np.float32,0x3f2ac15c,0x3f9d8ba4,3
+np.float32,0x7f2c54f8,0x7f800000,3
+np.float32,0x7f33d933,0x7f800000,3
+np.float32,0xbf09b2b4,0x3f92f795,3
+np.float32,0x805db8d6,0x3f800000,3
+np.float32,0x6d6e66,0x3f800000,3
+np.float32,0x3ddfea92,0x3f80c40c,3
+np.float32,0xfda719b8,0x7f800000,3
+np.float32,0x5d657f,0x3f800000,3
+np.float32,0xbf005ba3,0x3f906df6,3
+np.float32,0xbf45e606,0x3fa8305c,3
+np.float32,0x5e9fd1,0x3f800000,3
+np.float32,0x8079dc45,0x3f800000,3
+np.float32,0x7e9c40e3,0x7f800000,3
+np.float32,0x6bd5f6,0x3f800000,3
+np.float32,0xbea14a0e,0x3f866761,3
+np.float32,0x7e7323f3,0x7f800000,3
+np.float32,0x7f0c0a79,0x7f800000,3
+np.float32,0xbf7d7aeb,0x3fc40b0f,3
+np.float32,0x437588,0x3f800000,3
+np.float32,0xbf356376,0x3fa17f63,3
+np.float32,0x7f129921,0x7f800000,3
+np.float32,0x7f47a52e,0x7f800000,3
+np.float32,0xba8cb400,0x3f800005,3
+np.float32,0x802284e0,0x3f800000,3
+np.float32,0xbe820f56,0x3f8426ec,3
+np.float32,0x7f2ef6cf,0x7f800000,3
+np.float32,0xbf70a090,0x3fbcd501,3
+np.float32,0xbf173fea,0x3f96ff6d,3
+np.float32,0x3e19c489,0x3f817224,3
+np.float32,0x7f429b30,0x7f800000,3
+np.float32,0xbdae4118,0x3f8076af,3
+np.float32,0x3e70ad30,0x3f838d41,3
+np.float32,0x335fed,0x3f800000,3
+np.float32,0xff5359cf,0x7f800000,3
+np.float32,0xbf17e42b,0x3f9732f1,3
+np.float32,0xff3a950b,0x7f800000,3
+np.float32,0xbcca70c0,0x3f800a02,3
+np.float32,0x3f2cda62,0x3f9e4dad,3
+np.float32,0x3f50c185,0x3facf805,3
+np.float32,0x80000001,0x3f800000,3
+np.float32,0x807b86d2,0x3f800000,3
+np.float32,0x8010c2cf,0x3f800000,3
+np.float32,0x3f130fb8,0x3f95b519,3
+np.float32,0x807dc546,0x3f800000,3
+np.float32,0xbee20740,0x3f8cad3f,3
+np.float32,0x80800000,0x3f800000,3
+np.float32,0x3cbd90c0,0x3f8008c6,3
+np.float32,0x3e693488,0x3f835571,3
+np.float32,0xbe70cd44,0x3f838e35,3
+np.float32,0xbe348dc8,0x3f81feb1,3
+np.float32,0x3f31ea90,0x3fa02d3f,3
+np.float32,0xfcd7e180,0x7f800000,3
+np.float32,0xbe30a75c,0x3f81e8d0,3
+np.float32,0x3e552c5a,0x3f82c89d,3
+np.float32,0xff513f74,0x7f800000,3
+np.float32,0xbdb16248,0x3f807afd,3
+np.float64,0x7fbbf954e437f2a9,0x7ff0000000000000,2
+np.float64,0x581bbf0cb0379,0x3ff0000000000000,2
+np.float64,0x7ff8000000000000,0x7ff8000000000000,2
+np.float64,0xffb959a2a632b348,0x7ff0000000000000,2
+np.float64,0xbfdbd6baebb7ad76,0x3ff189a5ca25a6e1,2
+np.float64,0xbfd094ec9aa129da,0x3ff08a3f6b918065,2
+np.float64,0x3fe236753f646cea,0x3ff2a982660b8b43,2
+np.float64,0xbfe537fadfaa6ff6,0x3ff3a5f1c49c31bf,2
+np.float64,0xbfe31fa7dc663f50,0x3ff2f175374aef0e,2
+np.float64,0x3fc4b6569f296cb0,0x3ff035bde801bb53,2
+np.float64,0x800ce3c00f99c780,0x3ff0000000000000,2
+np.float64,0xbfebcde33e779bc6,0x3ff66de82cd30fc5,2
+np.float64,0x800dc09d3b7b813b,0x3ff0000000000000,2
+np.float64,0x80067d4c450cfa99,0x3ff0000000000000,2
+np.float64,0x1f6ade203ed7,0x3ff0000000000000,2
+np.float64,0xbfd4e311eca9c624,0x3ff0dc1383d6c3db,2
+np.float64,0x800649b3a54c9368,0x3ff0000000000000,2
+np.float64,0xcc14d1ab9829a,0x3ff0000000000000,2
+np.float64,0x3fc290c5bb25218b,0x3ff02b290f46dd6d,2
+np.float64,0x3fe78eb8376f1d70,0x3ff488f3bc259537,2
+np.float64,0xffc60f58e82c1eb0,0x7ff0000000000000,2
+np.float64,0x3fd35666ad26accd,0x3ff0bc6573da6bcd,2
+np.float64,0x7fc20257a62404ae,0x7ff0000000000000,2
+np.float64,0x80076d842e0edb09,0x3ff0000000000000,2
+np.float64,0x3fd8e44b08b1c898,0x3ff139b9a1f8428e,2
+np.float64,0x7fd6f6fc7a2dedf8,0x7ff0000000000000,2
+np.float64,0x3fa01b9f0820373e,0x3ff00206f8ad0f1b,2
+np.float64,0x69ed190ed3da4,0x3ff0000000000000,2
+np.float64,0xbfd997eb34b32fd6,0x3ff14be65a5db4a0,2
+np.float64,0x7feada2d0935b459,0x7ff0000000000000,2
+np.float64,0xbf80987120213100,0x3ff000226d29a9fc,2
+np.float64,0xbfef203e37fe407c,0x3ff82f51f04e8821,2
+np.float64,0xffe3dcf91fa7b9f2,0x7ff0000000000000,2
+np.float64,0x9a367283346cf,0x3ff0000000000000,2
+np.float64,0x800feb09f7bfd614,0x3ff0000000000000,2
+np.float64,0xbfe0319f9520633f,0x3ff217c5205c403f,2
+np.float64,0xbfa91eabd4323d50,0x3ff004ee4347f627,2
+np.float64,0x3fd19cbf7d23397f,0x3ff09c13e8e43571,2
+np.float64,0xffeb8945f0b7128b,0x7ff0000000000000,2
+np.float64,0x800a0eb4f2141d6a,0x3ff0000000000000,2
+np.float64,0xffe83e7312f07ce6,0x7ff0000000000000,2
+np.float64,0xffca53fee834a7fc,0x7ff0000000000000,2
+np.float64,0x800881cbf1710398,0x3ff0000000000000,2
+np.float64,0x80003e6abbe07cd6,0x3ff0000000000000,2
+np.float64,0xbfef6a998afed533,0x3ff859b7852d1b4d,2
+np.float64,0x3fd4eb7577a9d6eb,0x3ff0dcc601261aab,2
+np.float64,0xbfc9c12811338250,0x3ff05331268b05c8,2
+np.float64,0x7fddf84e5e3bf09c,0x7ff0000000000000,2
+np.float64,0xbfd4d6fbbc29adf8,0x3ff0db12db19d187,2
+np.float64,0x80077892bfaef126,0x3ff0000000000000,2
+np.float64,0xffae9d49543d3a90,0x7ff0000000000000,2
+np.float64,0xbfd8bef219317de4,0x3ff136034e5d2f1b,2
+np.float64,0xffe89c74ddb138e9,0x7ff0000000000000,2
+np.float64,0x8003b6bbb7e76d78,0x3ff0000000000000,2
+np.float64,0x315a4e8462b4b,0x3ff0000000000000,2
+np.float64,0x800ee616edddcc2e,0x3ff0000000000000,2
+np.float64,0xdfb27f97bf650,0x3ff0000000000000,2
+np.float64,0x8004723dc328e47c,0x3ff0000000000000,2
+np.float64,0xbfe529500daa52a0,0x3ff3a0b9b33fc84c,2
+np.float64,0xbfe4e46a7ce9c8d5,0x3ff3886ce0f92612,2
+np.float64,0xbf52003680240000,0x3ff00000a203d61a,2
+np.float64,0xffd3400458268008,0x7ff0000000000000,2
+np.float64,0x80076deb444edbd7,0x3ff0000000000000,2
+np.float64,0xa612f6c14c27,0x3ff0000000000000,2
+np.float64,0xbfd41c74c9a838ea,0x3ff0cbe61e16aecf,2
+np.float64,0x43f464a887e8d,0x3ff0000000000000,2
+np.float64,0x800976e748b2edcf,0x3ff0000000000000,2
+np.float64,0xffc79d6ba12f3ad8,0x7ff0000000000000,2
+np.float64,0xffd6dbcb022db796,0x7ff0000000000000,2
+np.float64,0xffd6a9672a2d52ce,0x7ff0000000000000,2
+np.float64,0x3fe95dcfa632bb9f,0x3ff54bbad2ee919e,2
+np.float64,0x3febadd2e1375ba6,0x3ff65e336c47c018,2
+np.float64,0x7fd47c37d828f86f,0x7ff0000000000000,2
+np.float64,0xbfd4ea59e0a9d4b4,0x3ff0dcae6af3e443,2
+np.float64,0x2c112afc58226,0x3ff0000000000000,2
+np.float64,0x8008122bced02458,0x3ff0000000000000,2
+np.float64,0x7fe7105ab3ee20b4,0x7ff0000000000000,2
+np.float64,0x80089634df312c6a,0x3ff0000000000000,2
+np.float64,0x68e9fbc8d1d40,0x3ff0000000000000,2
+np.float64,0xbfec1e1032f83c20,0x3ff69590b9f18ea8,2
+np.float64,0xbfedf181623be303,0x3ff787ef48935dc6,2
+np.float64,0xffe8600457f0c008,0x7ff0000000000000,2
+np.float64,0x7a841ec6f5084,0x3ff0000000000000,2
+np.float64,0x459a572e8b34c,0x3ff0000000000000,2
+np.float64,0x3fe8a232bef14465,0x3ff4fac1780f731e,2
+np.float64,0x3fcb37597d366eb3,0x3ff05cf08ab14ebd,2
+np.float64,0xbfb0261d00204c38,0x3ff00826fb86ca8a,2
+np.float64,0x3fc6e7a6dd2dcf4e,0x3ff041c1222ffa79,2
+np.float64,0xee65dd03dccbc,0x3ff0000000000000,2
+np.float64,0xffe26fdc23e4dfb8,0x7ff0000000000000,2
+np.float64,0x7fe8d6c8cab1ad91,0x7ff0000000000000,2
+np.float64,0xbfeb64bf2676c97e,0x3ff63abb8607828c,2
+np.float64,0x3fd28417b425082f,0x3ff0ac9eb22a732b,2
+np.float64,0xbfd26835b3a4d06c,0x3ff0aa94c48fb6d2,2
+np.float64,0xffec617a01b8c2f3,0x7ff0000000000000,2
+np.float64,0xe1bfff01c3800,0x3ff0000000000000,2
+np.float64,0x3fd4def913a9bdf4,0x3ff0dbbc7271046f,2
+np.float64,0x94f4c17129e98,0x3ff0000000000000,2
+np.float64,0x8009b2eaa33365d6,0x3ff0000000000000,2
+np.float64,0x3fd9633b41b2c678,0x3ff1468388bdfb65,2
+np.float64,0xffe0ae5c80e15cb8,0x7ff0000000000000,2
+np.float64,0x7fdfc35996bf86b2,0x7ff0000000000000,2
+np.float64,0x3fcfc5bdc23f8b7c,0x3ff07ed5caa4545c,2
+np.float64,0xd48b4907a9169,0x3ff0000000000000,2
+np.float64,0xbfe0a2cc52614598,0x3ff2361665895d95,2
+np.float64,0xbfe9068f90720d1f,0x3ff525b82491a1a5,2
+np.float64,0x4238b9208472,0x3ff0000000000000,2
+np.float64,0x800e6b2bf69cd658,0x3ff0000000000000,2
+np.float64,0x7fb638b6ae2c716c,0x7ff0000000000000,2
+np.float64,0x7fe267641764cec7,0x7ff0000000000000,2
+np.float64,0xffc0933d3521267c,0x7ff0000000000000,2
+np.float64,0x7fddfdfb533bfbf6,0x7ff0000000000000,2
+np.float64,0xced2a8e99da55,0x3ff0000000000000,2
+np.float64,0x2a80d5165501b,0x3ff0000000000000,2
+np.float64,0xbfeead2ab63d5a55,0x3ff7eeb5cbcfdcab,2
+np.float64,0x80097f6f92f2fee0,0x3ff0000000000000,2
+np.float64,0x3fee1f29b77c3e54,0x3ff7a0a58c13df62,2
+np.float64,0x3f9d06b8383a0d70,0x3ff001a54a2d8cf8,2
+np.float64,0xbfc8b41d3f31683c,0x3ff04c85379dd6b0,2
+np.float64,0xffd2a04c1e254098,0x7ff0000000000000,2
+np.float64,0xbfb71c01e02e3800,0x3ff010b34220e838,2
+np.float64,0xbfe69249ef6d2494,0x3ff425e48d1e938b,2
+np.float64,0xffefffffffffffff,0x7ff0000000000000,2
+np.float64,0x3feb1d52fbf63aa6,0x3ff618813ae922d7,2
+np.float64,0x7fb8d1a77e31a34e,0x7ff0000000000000,2
+np.float64,0xffc3cfc4ed279f88,0x7ff0000000000000,2
+np.float64,0x2164b9fc42c98,0x3ff0000000000000,2
+np.float64,0x3fbb868cee370d1a,0x3ff017b31b0d4d27,2
+np.float64,0x3fcd6dea583adbd5,0x3ff06cbd16bf44a0,2
+np.float64,0xbfecd041d479a084,0x3ff6efb25f61012d,2
+np.float64,0xbfb0552e6e20aa60,0x3ff00856ca83834a,2
+np.float64,0xe6293cbfcc528,0x3ff0000000000000,2
+np.float64,0x7fba58394034b072,0x7ff0000000000000,2
+np.float64,0x33bc96d467794,0x3ff0000000000000,2
+np.float64,0xffe90ea86bf21d50,0x7ff0000000000000,2
+np.float64,0xbfc626ea6d2c4dd4,0x3ff03d7e01ec3849,2
+np.float64,0x65b56fe4cb6af,0x3ff0000000000000,2
+np.float64,0x3fea409fb7f4813f,0x3ff5b171deab0ebd,2
+np.float64,0x3fe849c1df709384,0x3ff4d59063ff98c4,2
+np.float64,0x169073082d20f,0x3ff0000000000000,2
+np.float64,0xcc8b6add9916e,0x3ff0000000000000,2
+np.float64,0xbfef3d78d5fe7af2,0x3ff83fecc26abeea,2
+np.float64,0x3fe8c65a4a718cb4,0x3ff50a23bfeac7df,2
+np.float64,0x3fde9fa5c8bd3f4c,0x3ff1ddeb12b9d623,2
+np.float64,0xffe2af536da55ea6,0x7ff0000000000000,2
+np.float64,0x800186d0b0c30da2,0x3ff0000000000000,2
+np.float64,0x3fe9ba3c1d737478,0x3ff574ab2bf3a560,2
+np.float64,0xbfe1489c46a29138,0x3ff2641d36b30e21,2
+np.float64,0xbfe4b6b7c0e96d70,0x3ff37880ac8b0540,2
+np.float64,0x800e66ad82fccd5b,0x3ff0000000000000,2
+np.float64,0x7ff0000000000000,0x7ff0000000000000,2
+np.float64,0x7febb0fd477761fa,0x7ff0000000000000,2
+np.float64,0xbfdc433f2eb8867e,0x3ff195ec2a6cce27,2
+np.float64,0x3fe12c5a172258b4,0x3ff25c225b8a34bb,2
+np.float64,0xbfef6f116c3ede23,0x3ff85c47eaed49a0,2
+np.float64,0x800af6f60f35edec,0x3ff0000000000000,2
+np.float64,0xffe567999a2acf32,0x7ff0000000000000,2
+np.float64,0xbfc5ac5ae72b58b4,0x3ff03adb50ec04f3,2
+np.float64,0x3fea1b57e23436b0,0x3ff5a06f98541767,2
+np.float64,0x7fcc3e36fb387c6d,0x7ff0000000000000,2
+np.float64,0x8000c8dc698191ba,0x3ff0000000000000,2
+np.float64,0x3fee5085ed7ca10c,0x3ff7bb92f61245b8,2
+np.float64,0x7fbb9f803a373eff,0x7ff0000000000000,2
+np.float64,0xbfe1e5e806e3cbd0,0x3ff2918f2d773007,2
+np.float64,0x8008f8c3f3b1f188,0x3ff0000000000000,2
+np.float64,0x7fe53df515ea7be9,0x7ff0000000000000,2
+np.float64,0x7fdbb87fb3b770fe,0x7ff0000000000000,2
+np.float64,0x3fefcc0f50ff981f,0x3ff89210a6a04e6b,2
+np.float64,0x3fe33f87d0267f10,0x3ff2fb989ea4f2bc,2
+np.float64,0x1173992022e8,0x3ff0000000000000,2
+np.float64,0x3fef534632bea68c,0x3ff84c5ca9713ff9,2
+np.float64,0x3fc5991d552b3238,0x3ff03a72bfdb6e5f,2
+np.float64,0x3fdad90dc1b5b21c,0x3ff16db868180034,2
+np.float64,0xffe20b8078e41700,0x7ff0000000000000,2
+np.float64,0x7fdf409a82be8134,0x7ff0000000000000,2
+np.float64,0x3fccb7e691396fcd,0x3ff06786b6ccdbcb,2
+np.float64,0xffe416e0b7282dc1,0x7ff0000000000000,2
+np.float64,0xffe3a8a981275152,0x7ff0000000000000,2
+np.float64,0x3fd9c8bd31b3917c,0x3ff150ee6f5f692f,2
+np.float64,0xffeab6fef6356dfd,0x7ff0000000000000,2
+np.float64,0x3fe9c5e3faf38bc8,0x3ff579e18c9bd548,2
+np.float64,0x800b173e44762e7d,0x3ff0000000000000,2
+np.float64,0xffe2719db764e33b,0x7ff0000000000000,2
+np.float64,0x3fd1fcf31223f9e6,0x3ff0a2da7ad99856,2
+np.float64,0x80082c4afcd05896,0x3ff0000000000000,2
+np.float64,0xa56e5e4b4adcc,0x3ff0000000000000,2
+np.float64,0xffbbbddab2377bb8,0x7ff0000000000000,2
+np.float64,0x3b3927c076726,0x3ff0000000000000,2
+np.float64,0x3fec03fd58f807fb,0x3ff6889b8a774728,2
+np.float64,0xbfaa891fb4351240,0x3ff00580987bd914,2
+np.float64,0x7fb4800c4a290018,0x7ff0000000000000,2
+np.float64,0xffbb5d2b6036ba58,0x7ff0000000000000,2
+np.float64,0x7fd6608076acc100,0x7ff0000000000000,2
+np.float64,0x31267e4c624d1,0x3ff0000000000000,2
+np.float64,0x33272266664e5,0x3ff0000000000000,2
+np.float64,0x47bb37f28f768,0x3ff0000000000000,2
+np.float64,0x3fe134bb4ee26977,0x3ff25e7ea647a928,2
+np.float64,0xbfe2b5f42ba56be8,0x3ff2d05cbdc7344b,2
+np.float64,0xbfe0e013fd61c028,0x3ff246dfce572914,2
+np.float64,0x7fecedcda4f9db9a,0x7ff0000000000000,2
+np.float64,0x8001816c2da302d9,0x3ff0000000000000,2
+np.float64,0xffced8b65b3db16c,0x7ff0000000000000,2
+np.float64,0xffdc1d4a0b383a94,0x7ff0000000000000,2
+np.float64,0x7fe94e7339f29ce5,0x7ff0000000000000,2
+np.float64,0x33fb846667f71,0x3ff0000000000000,2
+np.float64,0x800a1380e9542702,0x3ff0000000000000,2
+np.float64,0x800b74eaa776e9d6,0x3ff0000000000000,2
+np.float64,0x5681784aad030,0x3ff0000000000000,2
+np.float64,0xbfee0eb7917c1d6f,0x3ff797b949f7f6b4,2
+np.float64,0xffe4ec5fd2a9d8bf,0x7ff0000000000000,2
+np.float64,0xbfcd7401dd3ae804,0x3ff06cea52c792c0,2
+np.float64,0x800587563beb0ead,0x3ff0000000000000,2
+np.float64,0x3fc15c6f3322b8de,0x3ff025bbd030166d,2
+np.float64,0x7feb6b4caf76d698,0x7ff0000000000000,2
+np.float64,0x7fe136ef82a26dde,0x7ff0000000000000,2
+np.float64,0xf592dac3eb25c,0x3ff0000000000000,2
+np.float64,0x7fd300baf6a60175,0x7ff0000000000000,2
+np.float64,0x7fc880de9e3101bc,0x7ff0000000000000,2
+np.float64,0x7fe7a1aa5caf4354,0x7ff0000000000000,2
+np.float64,0x2f9b8e0e5f373,0x3ff0000000000000,2
+np.float64,0xffcc9071993920e4,0x7ff0000000000000,2
+np.float64,0x8009e151b313c2a4,0x3ff0000000000000,2
+np.float64,0xbfd46e2d18a8dc5a,0x3ff0d27a7b37c1ae,2
+np.float64,0x3fe65c7961acb8f3,0x3ff4116946062a4c,2
+np.float64,0x7fd31b371626366d,0x7ff0000000000000,2
+np.float64,0x98dc924d31b93,0x3ff0000000000000,2
+np.float64,0x268bef364d17f,0x3ff0000000000000,2
+np.float64,0x7fd883ba56310774,0x7ff0000000000000,2
+np.float64,0x3fc53f01a32a7e03,0x3ff0388dea9cd63e,2
+np.float64,0xffe1ea8c0563d518,0x7ff0000000000000,2
+np.float64,0x3fd0bf0e63a17e1d,0x3ff08d0577f5ffa6,2
+np.float64,0x7fef42418f7e8482,0x7ff0000000000000,2
+np.float64,0x8000bccd38c1799b,0x3ff0000000000000,2
+np.float64,0xbfe6c48766ed890f,0x3ff43936fa4048c8,2
+np.float64,0xbfb2a38f3a254720,0x3ff00adc7f7b2822,2
+np.float64,0x3fd5262b2eaa4c56,0x3ff0e1af492c08f5,2
+np.float64,0x80065b4691ecb68e,0x3ff0000000000000,2
+np.float64,0xfb6b9e9ff6d74,0x3ff0000000000000,2
+np.float64,0x8006c71e6ecd8e3e,0x3ff0000000000000,2
+np.float64,0x3fd0a3e43ca147c8,0x3ff08b3ad7b42485,2
+np.float64,0xbfc82d8607305b0c,0x3ff04949d6733ef6,2
+np.float64,0xde048c61bc092,0x3ff0000000000000,2
+np.float64,0xffcf73e0fa3ee7c0,0x7ff0000000000000,2
+np.float64,0xbfe8639d7830c73b,0x3ff4e05f97948376,2
+np.float64,0x8010000000000000,0x3ff0000000000000,2
+np.float64,0x67f01a2acfe04,0x3ff0000000000000,2
+np.float64,0x3fe222e803e445d0,0x3ff2a3a75e5f29d8,2
+np.float64,0xffef84c6387f098b,0x7ff0000000000000,2
+np.float64,0x3fe5969c1e6b2d38,0x3ff3c80130462bb2,2
+np.float64,0x8009f56953d3ead3,0x3ff0000000000000,2
+np.float64,0x3fe05c9b6360b937,0x3ff2232e1cba5617,2
+np.float64,0x3fd8888d63b1111b,0x3ff130a5b788d52f,2
+np.float64,0xffe3a9e6f26753ce,0x7ff0000000000000,2
+np.float64,0x800e2aaa287c5554,0x3ff0000000000000,2
+np.float64,0x3fea8d6c82351ad9,0x3ff5d4d8cde9a11d,2
+np.float64,0x7feef700723dee00,0x7ff0000000000000,2
+np.float64,0x3fa5cb77242b96e0,0x3ff003b62b3e50f1,2
+np.float64,0x7fb68f0a862d1e14,0x7ff0000000000000,2
+np.float64,0x7fb97ee83432fdcf,0x7ff0000000000000,2
+np.float64,0x7fd74a78632e94f0,0x7ff0000000000000,2
+np.float64,0x7fcfe577713fcaee,0x7ff0000000000000,2
+np.float64,0xffe192ee5ea325dc,0x7ff0000000000000,2
+np.float64,0x477d6ae48efae,0x3ff0000000000000,2
+np.float64,0xffe34d5237669aa4,0x7ff0000000000000,2
+np.float64,0x7fe3ce8395a79d06,0x7ff0000000000000,2
+np.float64,0x80019c01ffa33805,0x3ff0000000000000,2
+np.float64,0x74b5b56ce96b7,0x3ff0000000000000,2
+np.float64,0x7fe05ecdeda0bd9b,0x7ff0000000000000,2
+np.float64,0xffe9693eb232d27d,0x7ff0000000000000,2
+np.float64,0xffd2be2c7da57c58,0x7ff0000000000000,2
+np.float64,0x800dbd5cbc1b7aba,0x3ff0000000000000,2
+np.float64,0xbfa36105d426c210,0x3ff002ef2e3a87f7,2
+np.float64,0x800b2d69fb765ad4,0x3ff0000000000000,2
+np.float64,0xbfdb81c9a9370394,0x3ff1802d409cbf7a,2
+np.float64,0x7fd481d014a9039f,0x7ff0000000000000,2
+np.float64,0xffe66c3c1fecd878,0x7ff0000000000000,2
+np.float64,0x3fc55865192ab0c8,0x3ff03915b51e8839,2
+np.float64,0xd6a78987ad4f1,0x3ff0000000000000,2
+np.float64,0x800c6cc80d58d990,0x3ff0000000000000,2
+np.float64,0x979435a12f29,0x3ff0000000000000,2
+np.float64,0xbfbd971e7a3b2e40,0x3ff01b647e45f5a6,2
+np.float64,0x80067565bfeceacc,0x3ff0000000000000,2
+np.float64,0x8001ad689ce35ad2,0x3ff0000000000000,2
+np.float64,0x7fa43253dc2864a7,0x7ff0000000000000,2
+np.float64,0xbfe3dda307e7bb46,0x3ff32ef99a2efe1d,2
+np.float64,0x3fe5d7b395ebaf68,0x3ff3dfd33cdc8ef4,2
+np.float64,0xd94cc9c3b2999,0x3ff0000000000000,2
+np.float64,0x3fee5a513fbcb4a2,0x3ff7c0f17b876ce5,2
+np.float64,0xffe27761fa64eec4,0x7ff0000000000000,2
+np.float64,0x3feb788119b6f102,0x3ff64446f67f4efa,2
+np.float64,0xbfed6e10dffadc22,0x3ff741d5ef610ca0,2
+np.float64,0x7fe73cf98b2e79f2,0x7ff0000000000000,2
+np.float64,0x7847d09af08fb,0x3ff0000000000000,2
+np.float64,0x29ded2da53bdb,0x3ff0000000000000,2
+np.float64,0xbfe51c1ec1aa383e,0x3ff39c0b7cf832e2,2
+np.float64,0xbfeafd5e65f5fabd,0x3ff609548a787f57,2
+np.float64,0x3fd872a26fb0e545,0x3ff12e7fbd95505c,2
+np.float64,0x7fed6b7c1b7ad6f7,0x7ff0000000000000,2
+np.float64,0xffe7ba9ec16f753d,0x7ff0000000000000,2
+np.float64,0x7f89b322f0336645,0x7ff0000000000000,2
+np.float64,0xbfad1677383a2cf0,0x3ff0069ca67e7baa,2
+np.float64,0x3fe0906d04a120da,0x3ff2311b04b7bfef,2
+np.float64,0xffe4b3c9d4296793,0x7ff0000000000000,2
+np.float64,0xbfe476bb0ce8ed76,0x3ff36277d2921a74,2
+np.float64,0x7fc35655cf26acab,0x7ff0000000000000,2
+np.float64,0x7fe9980f0373301d,0x7ff0000000000000,2
+np.float64,0x9e6e04cb3cdc1,0x3ff0000000000000,2
+np.float64,0x800b89e0afb713c2,0x3ff0000000000000,2
+np.float64,0x800bd951a3f7b2a4,0x3ff0000000000000,2
+np.float64,0x29644a9e52c8a,0x3ff0000000000000,2
+np.float64,0x3fe1be2843637c51,0x3ff285e90d8387e4,2
+np.float64,0x7fa233cce4246799,0x7ff0000000000000,2
+np.float64,0xbfcfb7bc2d3f6f78,0x3ff07e657de3e2ed,2
+np.float64,0xffd7c953e7af92a8,0x7ff0000000000000,2
+np.float64,0xbfc5bbaf772b7760,0x3ff03b2ee4febb1e,2
+np.float64,0x8007b7315a6f6e63,0x3ff0000000000000,2
+np.float64,0xbfe906d902320db2,0x3ff525d7e16acfe0,2
+np.float64,0x3fde33d8553c67b1,0x3ff1d09faa19aa53,2
+np.float64,0x61fe76a0c3fcf,0x3ff0000000000000,2
+np.float64,0xa75e355b4ebc7,0x3ff0000000000000,2
+np.float64,0x3fc9e6d86033cdb1,0x3ff05426299c7064,2
+np.float64,0x7fd83f489eb07e90,0x7ff0000000000000,2
+np.float64,0x8000000000000001,0x3ff0000000000000,2
+np.float64,0x80014434ae62886a,0x3ff0000000000000,2
+np.float64,0xbfe21af9686435f3,0x3ff2a149338bdefe,2
+np.float64,0x9354e6cd26a9d,0x3ff0000000000000,2
+np.float64,0xb42b95f768573,0x3ff0000000000000,2
+np.float64,0xbfecb4481bb96890,0x3ff6e15d269dd651,2
+np.float64,0x3f97842ae82f0840,0x3ff0011485156f28,2
+np.float64,0xffdef63d90bdec7c,0x7ff0000000000000,2
+np.float64,0x7fe511a8d36a2351,0x7ff0000000000000,2
+np.float64,0xbf8cb638a0396c80,0x3ff000670c318fb6,2
+np.float64,0x3fe467e1f668cfc4,0x3ff35d65f93ccac6,2
+np.float64,0xbfce7d88f03cfb10,0x3ff074c22475fe5b,2
+np.float64,0x6d0a4994da14a,0x3ff0000000000000,2
+np.float64,0xbfb3072580260e48,0x3ff00b51d3913e9f,2
+np.float64,0x8008fcde36b1f9bd,0x3ff0000000000000,2
+np.float64,0x3fd984df66b309c0,0x3ff149f29125eca4,2
+np.float64,0xffee2a10fe7c5421,0x7ff0000000000000,2
+np.float64,0x80039168ace722d2,0x3ff0000000000000,2
+np.float64,0xffda604379b4c086,0x7ff0000000000000,2
+np.float64,0xffdc6a405bb8d480,0x7ff0000000000000,2
+np.float64,0x3fe62888b26c5111,0x3ff3fdda754c4372,2
+np.float64,0x8008b452cb5168a6,0x3ff0000000000000,2
+np.float64,0x6165d540c2cbb,0x3ff0000000000000,2
+np.float64,0xbfee0c04d17c180a,0x3ff796431c64bcbe,2
+np.float64,0x800609b8448c1371,0x3ff0000000000000,2
+np.float64,0x800fc3fca59f87f9,0x3ff0000000000000,2
+np.float64,0x77f64848efeca,0x3ff0000000000000,2
+np.float64,0x8007cf522d8f9ea5,0x3ff0000000000000,2
+np.float64,0xbfe9fb0b93f3f617,0x3ff591cb0052e22c,2
+np.float64,0x7fd569d5f0aad3ab,0x7ff0000000000000,2
+np.float64,0x7fe5cf489d6b9e90,0x7ff0000000000000,2
+np.float64,0x7fd6e193e92dc327,0x7ff0000000000000,2
+np.float64,0xf78988a5ef131,0x3ff0000000000000,2
+np.float64,0x3fe8f97562b1f2eb,0x3ff5201080fbc12d,2
+np.float64,0x7febfd69d7b7fad3,0x7ff0000000000000,2
+np.float64,0xffc07b5c1720f6b8,0x7ff0000000000000,2
+np.float64,0xbfd966926832cd24,0x3ff146da9adf492e,2
+np.float64,0x7fef5bd9edfeb7b3,0x7ff0000000000000,2
+np.float64,0xbfd2afbc96255f7a,0x3ff0afd601febf44,2
+np.float64,0x7fdd4ea6293a9d4b,0x7ff0000000000000,2
+np.float64,0xbfe8a1e916b143d2,0x3ff4faa23c2793e5,2
+np.float64,0x800188fcd8c311fa,0x3ff0000000000000,2
+np.float64,0xbfe30803f1661008,0x3ff2e9fc729baaee,2
+np.float64,0x7fefffffffffffff,0x7ff0000000000000,2
+np.float64,0x3fd287bec3250f7e,0x3ff0ace34d3102f6,2
+np.float64,0x1f0ee9443e1de,0x3ff0000000000000,2
+np.float64,0xbfd92f73da325ee8,0x3ff14143e4fa2c5a,2
+np.float64,0x3fed7c9bdffaf938,0x3ff74984168734d3,2
+np.float64,0x8002c4d1696589a4,0x3ff0000000000000,2
+np.float64,0xfe03011bfc060,0x3ff0000000000000,2
+np.float64,0x7f7a391e6034723c,0x7ff0000000000000,2
+np.float64,0xffd6fd46f82dfa8e,0x7ff0000000000000,2
+np.float64,0xbfd7520a742ea414,0x3ff112f1ba5d4f91,2
+np.float64,0x8009389d8812713b,0x3ff0000000000000,2
+np.float64,0x7fefb846aaff708c,0x7ff0000000000000,2
+np.float64,0x3fd98a0983331413,0x3ff14a79efb8adbf,2
+np.float64,0xbfd897158db12e2c,0x3ff132137902cf3e,2
+np.float64,0xffc4048d5928091c,0x7ff0000000000000,2
+np.float64,0x80036ae46046d5ca,0x3ff0000000000000,2
+np.float64,0x7faba7ed3c374fd9,0x7ff0000000000000,2
+np.float64,0xbfec4265e1f884cc,0x3ff6a7b8602422c9,2
+np.float64,0xaa195e0b5432c,0x3ff0000000000000,2
+np.float64,0x3feac15d317582ba,0x3ff5ed115758145f,2
+np.float64,0x6c13a5bcd8275,0x3ff0000000000000,2
+np.float64,0xbfed20b8883a4171,0x3ff7194dbd0dc988,2
+np.float64,0x800cde65c899bccc,0x3ff0000000000000,2
+np.float64,0x7c72912af8e53,0x3ff0000000000000,2
+np.float64,0x3fe49d2bb4e93a57,0x3ff36fab3aba15d4,2
+np.float64,0xbfd598fa02ab31f4,0x3ff0eb72fc472025,2
+np.float64,0x8007a191712f4324,0x3ff0000000000000,2
+np.float64,0xbfdeb14872bd6290,0x3ff1e01ca83f35fd,2
+np.float64,0xbfe1da46b3e3b48e,0x3ff28e23ad2f5615,2
+np.float64,0x800a2f348e745e69,0x3ff0000000000000,2
+np.float64,0xbfee66928afccd25,0x3ff7c7ac7dbb3273,2
+np.float64,0xffd78a0a2b2f1414,0x7ff0000000000000,2
+np.float64,0x7fc5fa80b82bf500,0x7ff0000000000000,2
+np.float64,0x800e6d7260dcdae5,0x3ff0000000000000,2
+np.float64,0xbfd6cff2aaad9fe6,0x3ff106f78ee61642,2
+np.float64,0x7fe1041d1d220839,0x7ff0000000000000,2
+np.float64,0xbfdf75586cbeeab0,0x3ff1f8dbaa7e57f0,2
+np.float64,0xffdcaae410b955c8,0x7ff0000000000000,2
+np.float64,0x800fe5e0d1ffcbc2,0x3ff0000000000000,2
+np.float64,0x800d7999527af333,0x3ff0000000000000,2
+np.float64,0xbfe62c233bac5846,0x3ff3ff34220a204c,2
+np.float64,0x7fe99bbff8f3377f,0x7ff0000000000000,2
+np.float64,0x7feeaf471d3d5e8d,0x7ff0000000000000,2
+np.float64,0xd5904ff5ab20a,0x3ff0000000000000,2
+np.float64,0x3fd07aae3320f55c,0x3ff08888c227c968,2
+np.float64,0x7fea82b8dff50571,0x7ff0000000000000,2
+np.float64,0xffef2db9057e5b71,0x7ff0000000000000,2
+np.float64,0xbfe2077fef640f00,0x3ff29b7dd0d39d36,2
+np.float64,0xbfe09a4d7c61349b,0x3ff233c7e88881f4,2
+np.float64,0x3fda50c4cbb4a188,0x3ff15f28a71deee7,2
+np.float64,0x7fe7d9ee6b2fb3dc,0x7ff0000000000000,2
+np.float64,0x3febbf6faeb77edf,0x3ff666d13682ea93,2
+np.float64,0xc401a32988035,0x3ff0000000000000,2
+np.float64,0xbfeab30aa8f56615,0x3ff5e65dcc6603f8,2
+np.float64,0x92c8cea32591a,0x3ff0000000000000,2
+np.float64,0xbff0000000000000,0x3ff8b07551d9f550,2
+np.float64,0xbfbddfb4dc3bbf68,0x3ff01bebaec38faa,2
+np.float64,0xbfd8de3e2a31bc7c,0x3ff1391f4830d20b,2
+np.float64,0xffc83a8f8a307520,0x7ff0000000000000,2
+np.float64,0x3fee026ef53c04de,0x3ff7911337085827,2
+np.float64,0x7fbaf380b235e700,0x7ff0000000000000,2
+np.float64,0xffe5b89fa62b713f,0x7ff0000000000000,2
+np.float64,0xbfdc1ff54ab83fea,0x3ff191e8c0b60bb2,2
+np.float64,0x6ae3534cd5c6b,0x3ff0000000000000,2
+np.float64,0xbfea87e558750fcb,0x3ff5d24846013794,2
+np.float64,0xffe0f467bee1e8cf,0x7ff0000000000000,2
+np.float64,0x7fee3b0dc7bc761b,0x7ff0000000000000,2
+np.float64,0x3fed87521afb0ea4,0x3ff74f2f5cd36a5c,2
+np.float64,0x7b3c9882f6794,0x3ff0000000000000,2
+np.float64,0x7fdd1a62243a34c3,0x7ff0000000000000,2
+np.float64,0x800f1dc88d3e3b91,0x3ff0000000000000,2
+np.float64,0x7fc3213cfa264279,0x7ff0000000000000,2
+np.float64,0x3fe40e0f3d681c1e,0x3ff33f135e9d5ded,2
+np.float64,0x7febf14e51f7e29c,0x7ff0000000000000,2
+np.float64,0xffe96c630c72d8c5,0x7ff0000000000000,2
+np.float64,0x7fdd82fbe7bb05f7,0x7ff0000000000000,2
+np.float64,0xbf9a6a0b1034d420,0x3ff0015ce009f7d8,2
+np.float64,0xbfceb4f8153d69f0,0x3ff0766e3ecc77df,2
+np.float64,0x3fd9de31e633bc64,0x3ff15327b794a16e,2
+np.float64,0x3faa902a30352054,0x3ff00583848d1969,2
+np.float64,0x0,0x3ff0000000000000,2
+np.float64,0x3fbe3459c43c68b4,0x3ff01c8af6710ef6,2
+np.float64,0xbfa8df010031be00,0x3ff004d5632dc9f5,2
+np.float64,0x7fbcf6cf2a39ed9d,0x7ff0000000000000,2
+np.float64,0xffe4236202a846c4,0x7ff0000000000000,2
+np.float64,0x3fd35ed52e26bdaa,0x3ff0bd0b231f11f7,2
+np.float64,0x7fe7a2df532f45be,0x7ff0000000000000,2
+np.float64,0xffe32f8315665f06,0x7ff0000000000000,2
+np.float64,0x7fe1a69f03e34d3d,0x7ff0000000000000,2
+np.float64,0x7fa5542b742aa856,0x7ff0000000000000,2
+np.float64,0x3fe84e9f8ef09d3f,0x3ff4d79816359765,2
+np.float64,0x29076fe6520ef,0x3ff0000000000000,2
+np.float64,0xffd70894f7ae112a,0x7ff0000000000000,2
+np.float64,0x800188edcbe311dc,0x3ff0000000000000,2
+np.float64,0x3fe2c7acda258f5a,0x3ff2d5dad4617703,2
+np.float64,0x3f775d41a02ebb00,0x3ff000110f212445,2
+np.float64,0x7fe8a084d1714109,0x7ff0000000000000,2
+np.float64,0x3fe31562d8a62ac6,0x3ff2ee35055741cd,2
+np.float64,0xbfd195d4d1a32baa,0x3ff09b98a50c151b,2
+np.float64,0xffaae9ff0c35d400,0x7ff0000000000000,2
+np.float64,0xff819866502330c0,0x7ff0000000000000,2
+np.float64,0x7fddc64815bb8c8f,0x7ff0000000000000,2
+np.float64,0xbfd442b428288568,0x3ff0cef70aa73ae6,2
+np.float64,0x8002e7625aa5cec5,0x3ff0000000000000,2
+np.float64,0x7fe8d4f70e71a9ed,0x7ff0000000000000,2
+np.float64,0xbfc3bd015f277a04,0x3ff030cbf16f29d9,2
+np.float64,0x3fd315d5baa62bab,0x3ff0b77a551a5335,2
+np.float64,0x7fa638b4642c7168,0x7ff0000000000000,2
+np.float64,0x3fdea8b795bd516f,0x3ff1df0bb70cdb79,2
+np.float64,0xbfd78754762f0ea8,0x3ff117ee0f29abed,2
+np.float64,0x8009f6a37633ed47,0x3ff0000000000000,2
+np.float64,0x3fea1daf75343b5f,0x3ff5a1804789bf13,2
+np.float64,0x3fd044b6c0a0896e,0x3ff0850b7297d02f,2
+np.float64,0x8003547a9c86a8f6,0x3ff0000000000000,2
+np.float64,0x3fa6c2cd782d859b,0x3ff0040c4ac8f44a,2
+np.float64,0x3fe225baaae44b76,0x3ff2a47f5e1f5e85,2
+np.float64,0x8000000000000000,0x3ff0000000000000,2
+np.float64,0x3fcb53da8736a7b8,0x3ff05db45af470ac,2
+np.float64,0x80079f8f140f3f1f,0x3ff0000000000000,2
+np.float64,0xbfcd1d7e2b3a3afc,0x3ff06a6b6845d05f,2
+np.float64,0x96df93672dbf3,0x3ff0000000000000,2
+np.float64,0xdef86e43bdf0e,0x3ff0000000000000,2
+np.float64,0xbfec05a09db80b41,0x3ff6896b768eea08,2
+np.float64,0x7fe3ff91d267ff23,0x7ff0000000000000,2
+np.float64,0xffea3eaa07347d53,0x7ff0000000000000,2
+np.float64,0xbfebde1cc1f7bc3a,0x3ff675e34ac2afc2,2
+np.float64,0x629bcde8c537a,0x3ff0000000000000,2
+np.float64,0xbfdde4fcff3bc9fa,0x3ff1c7061d21f0fe,2
+np.float64,0x3fee60fd003cc1fa,0x3ff7c49af3878a51,2
+np.float64,0x3fe5c92ac32b9256,0x3ff3da7a7929588b,2
+np.float64,0xbfe249c78f64938f,0x3ff2af52a06f1a50,2
+np.float64,0xbfc6de9dbe2dbd3c,0x3ff0418d284ee29f,2
+np.float64,0xffc8ef094631de14,0x7ff0000000000000,2
+np.float64,0x3fdef05f423de0bf,0x3ff1e800caba8ab5,2
+np.float64,0xffc1090731221210,0x7ff0000000000000,2
+np.float64,0xbfedec9b5fbbd937,0x3ff7854b6792a24a,2
+np.float64,0xbfb873507630e6a0,0x3ff012b23b3b7a67,2
+np.float64,0xbfe3cd6692679acd,0x3ff3299d6936ec4b,2
+np.float64,0xbfb107c890220f90,0x3ff0091122162472,2
+np.float64,0xbfe4e6ee48e9cddc,0x3ff3894e5a5e70a6,2
+np.float64,0xffe6fa3413edf468,0x7ff0000000000000,2
+np.float64,0x3fe2faf79b65f5ef,0x3ff2e5e11fae8b54,2
+np.float64,0xbfdfeb8df9bfd71c,0x3ff208189691b15f,2
+np.float64,0x75d2d03ceba5b,0x3ff0000000000000,2
+np.float64,0x3feb48c182b69183,0x3ff62d4462eba6cb,2
+np.float64,0xffcda9f7ff3b53f0,0x7ff0000000000000,2
+np.float64,0x7fcafbdcbd35f7b8,0x7ff0000000000000,2
+np.float64,0xbfd1895523a312aa,0x3ff09aba642a78d9,2
+np.float64,0x3fe3129c3f662538,0x3ff2ed546bbfafcf,2
+np.float64,0x3fb444dee02889be,0x3ff00cd86273b964,2
+np.float64,0xbf73b32d7ee77,0x3ff0000000000000,2
+np.float64,0x3fae19904c3c3321,0x3ff00714865c498a,2
+np.float64,0x7fefbfaef5bf7f5d,0x7ff0000000000000,2
+np.float64,0x8000dc3816e1b871,0x3ff0000000000000,2
+np.float64,0x8003f957ba47f2b0,0x3ff0000000000000,2
+np.float64,0xbfe3563c7ea6ac79,0x3ff302dcebc92856,2
+np.float64,0xbfdc80fbae3901f8,0x3ff19cfe73e58092,2
+np.float64,0x8009223b04524476,0x3ff0000000000000,2
+np.float64,0x3fd95f431c32be86,0x3ff1461c21cb03f0,2
+np.float64,0x7ff4000000000000,0x7ffc000000000000,2
+np.float64,0xbfe7c12ed3ef825e,0x3ff49d59c265efcd,2
+np.float64,0x10000000000000,0x3ff0000000000000,2
+np.float64,0x7fc5e2632f2bc4c5,0x7ff0000000000000,2
+np.float64,0xffd8f6b4c7b1ed6a,0x7ff0000000000000,2
+np.float64,0x80034b93d4069728,0x3ff0000000000000,2
+np.float64,0xffdf5d4c1dbeba98,0x7ff0000000000000,2
+np.float64,0x800bc63d70178c7b,0x3ff0000000000000,2
+np.float64,0xbfeba31ea0f7463d,0x3ff658fa27073d2b,2
+np.float64,0xbfeebeede97d7ddc,0x3ff7f89a8e80dec4,2
+np.float64,0x7feb0f1f91361e3e,0x7ff0000000000000,2
+np.float64,0xffec3158d0b862b1,0x7ff0000000000000,2
+np.float64,0x3fde51cbfbbca398,0x3ff1d44c2ff15b3d,2
+np.float64,0xd58fb2b3ab1f7,0x3ff0000000000000,2
+np.float64,0x80028b9e32e5173d,0x3ff0000000000000,2
+np.float64,0x7fea77a56c74ef4a,0x7ff0000000000000,2
+np.float64,0x3fdaabbd4a35577b,0x3ff168d82edf2fe0,2
+np.float64,0xbfe69c39cc2d3874,0x3ff429b2f4cdb362,2
+np.float64,0x3b78f5d876f20,0x3ff0000000000000,2
+np.float64,0x7fa47d116428fa22,0x7ff0000000000000,2
+np.float64,0xbfe4118b0ce82316,0x3ff3403d989f780f,2
+np.float64,0x800482e793c905d0,0x3ff0000000000000,2
+np.float64,0xbfe48e5728e91cae,0x3ff36a9020bf9d20,2
+np.float64,0x7fe078ba8860f174,0x7ff0000000000000,2
+np.float64,0x3fd80843e5b01088,0x3ff1242f401e67da,2
+np.float64,0x3feb1f6965f63ed3,0x3ff6197fc590e143,2
+np.float64,0xffa41946d8283290,0x7ff0000000000000,2
+np.float64,0xffe30de129661bc2,0x7ff0000000000000,2
+np.float64,0x3fec9c8e1ab9391c,0x3ff6d542ea2f49b4,2
+np.float64,0x3fdc3e4490387c89,0x3ff1955ae18cac37,2
+np.float64,0xffef49d9c77e93b3,0x7ff0000000000000,2
+np.float64,0xfff0000000000000,0x7ff0000000000000,2
+np.float64,0x3fe0442455608849,0x3ff21cab90067d5c,2
+np.float64,0xbfed86aebd3b0d5e,0x3ff74ed8d4b75f50,2
+np.float64,0xffe4600d2b28c01a,0x7ff0000000000000,2
+np.float64,0x7fc1e8ccff23d199,0x7ff0000000000000,2
+np.float64,0x8008d49b0091a936,0x3ff0000000000000,2
+np.float64,0xbfe4139df028273c,0x3ff340ef3c86227c,2
+np.float64,0xbfe9ab4542b3568a,0x3ff56dfe32061247,2
+np.float64,0xbfd76dd365aedba6,0x3ff11589bab5fe71,2
+np.float64,0x3fd42cf829a859f0,0x3ff0cd3844bb0e11,2
+np.float64,0x7fd077cf2e20ef9d,0x7ff0000000000000,2
+np.float64,0x3fd7505760aea0b0,0x3ff112c937b3f088,2
+np.float64,0x1f93341a3f267,0x3ff0000000000000,2
+np.float64,0x7fe3c3c1b0678782,0x7ff0000000000000,2
+np.float64,0x800f85cec97f0b9e,0x3ff0000000000000,2
+np.float64,0xd93ab121b2756,0x3ff0000000000000,2
+np.float64,0xbfef8066fd7f00ce,0x3ff8663ed7d15189,2
+np.float64,0xffe31dd4af663ba9,0x7ff0000000000000,2
+np.float64,0xbfd7ff05a6affe0c,0x3ff1234c09bb686d,2
+np.float64,0xbfe718c31fee3186,0x3ff45a0c2d0ef7b0,2
+np.float64,0x800484bf33e9097f,0x3ff0000000000000,2
+np.float64,0xffd409dad02813b6,0x7ff0000000000000,2
+np.float64,0x3fe59679896b2cf4,0x3ff3c7f49e4fbbd3,2
+np.float64,0xbfd830c54d30618a,0x3ff1281729861390,2
+np.float64,0x1d4fc81c3a9fa,0x3ff0000000000000,2
+np.float64,0x3fd334e4272669c8,0x3ff0b9d5d82894f0,2
+np.float64,0xffc827e65c304fcc,0x7ff0000000000000,2
+np.float64,0xffe2d1814aa5a302,0x7ff0000000000000,2
+np.float64,0xffd7b5b8d32f6b72,0x7ff0000000000000,2
+np.float64,0xbfdbc9f077b793e0,0x3ff18836b9106ad0,2
+np.float64,0x7fc724c2082e4983,0x7ff0000000000000,2
+np.float64,0x3fa39ed72c273da0,0x3ff00302051ce17e,2
+np.float64,0xbfe3c4c209678984,0x3ff326c4fd16b5cd,2
+np.float64,0x7fe91f6d00f23ed9,0x7ff0000000000000,2
+np.float64,0x8004ee93fea9dd29,0x3ff0000000000000,2
+np.float64,0xbfe7c32d0eaf865a,0x3ff49e290ed2ca0e,2
+np.float64,0x800ea996b29d532d,0x3ff0000000000000,2
+np.float64,0x2df9ec1c5bf3e,0x3ff0000000000000,2
+np.float64,0xabb175df5762f,0x3ff0000000000000,2
+np.float64,0xffe3fc9c8e27f938,0x7ff0000000000000,2
+np.float64,0x7fb358a62826b14b,0x7ff0000000000000,2
+np.float64,0x800aedcccaf5db9a,0x3ff0000000000000,2
+np.float64,0xffca530c5234a618,0x7ff0000000000000,2
+np.float64,0x40f91e9681f24,0x3ff0000000000000,2
+np.float64,0x80098f4572f31e8b,0x3ff0000000000000,2
+np.float64,0xbfdc58c21fb8b184,0x3ff1986115f8fe92,2
+np.float64,0xbfebeafd40b7d5fa,0x3ff67c3cf34036e3,2
+np.float64,0x7fd108861a22110b,0x7ff0000000000000,2
+np.float64,0xff8e499ae03c9340,0x7ff0000000000000,2
+np.float64,0xbfd2f58caa25eb1a,0x3ff0b50b1bffafdf,2
+np.float64,0x3fa040c9bc208193,0x3ff002105e95aefa,2
+np.float64,0xbfd2ebc0a5a5d782,0x3ff0b44ed5a11584,2
+np.float64,0xffe237bc93a46f78,0x7ff0000000000000,2
+np.float64,0x3fd557c5eeaaaf8c,0x3ff0e5e0a575e1ba,2
+np.float64,0x7abb419ef5769,0x3ff0000000000000,2
+np.float64,0xffefa1fe353f43fb,0x7ff0000000000000,2
+np.float64,0x3fa6f80ba02df017,0x3ff0041f51fa0d76,2
+np.float64,0xbfdce79488b9cf2a,0x3ff1a8e32877beb4,2
+np.float64,0x2285f3e4450bf,0x3ff0000000000000,2
+np.float64,0x3bf7eb7277efe,0x3ff0000000000000,2
+np.float64,0xbfd5925fd3ab24c0,0x3ff0eae1c2ac2e78,2
+np.float64,0xbfed6325227ac64a,0x3ff73c14a2ad5bfe,2
+np.float64,0x8000429c02408539,0x3ff0000000000000,2
+np.float64,0xb67c21e76cf84,0x3ff0000000000000,2
+np.float64,0x3fec3d3462f87a69,0x3ff6a51e4c027eb7,2
+np.float64,0x3feae69cbcf5cd3a,0x3ff5fe9387314afd,2
+np.float64,0x7fd0c9a0ec219341,0x7ff0000000000000,2
+np.float64,0x8004adb7f6295b71,0x3ff0000000000000,2
+np.float64,0xffd61fe8bb2c3fd2,0x7ff0000000000000,2
+np.float64,0xffe7fb3834aff670,0x7ff0000000000000,2
+np.float64,0x7fd1eef163a3dde2,0x7ff0000000000000,2
+np.float64,0x2e84547a5d08b,0x3ff0000000000000,2
+np.float64,0x8002d8875ee5b10f,0x3ff0000000000000,2
+np.float64,0x3fe1d1c5f763a38c,0x3ff28ba524fb6de8,2
+np.float64,0x8001dea0bc43bd42,0x3ff0000000000000,2
+np.float64,0xfecfad91fd9f6,0x3ff0000000000000,2
+np.float64,0xffed7965fa3af2cb,0x7ff0000000000000,2
+np.float64,0xbfe6102ccc2c205a,0x3ff3f4c082506686,2
+np.float64,0x3feff75b777feeb6,0x3ff8ab6222578e0c,2
+np.float64,0x3fb8a97bd43152f8,0x3ff013057f0a9d89,2
+np.float64,0xffe234b5e964696c,0x7ff0000000000000,2
+np.float64,0x984d9137309b2,0x3ff0000000000000,2
+np.float64,0xbfe42e9230e85d24,0x3ff349fb7d1a7560,2
+np.float64,0xbfecc8b249f99165,0x3ff6ebd0fea0ea72,2
+np.float64,0x8000840910410813,0x3ff0000000000000,2
+np.float64,0xbfd81db9e7303b74,0x3ff126402d3539ec,2
+np.float64,0x800548eb7fea91d8,0x3ff0000000000000,2
+np.float64,0xbfe4679ad0e8cf36,0x3ff35d4db89296a3,2
+np.float64,0x3fd4c55b5a298ab7,0x3ff0d99da31081f9,2
+np.float64,0xbfa8f5b38c31eb60,0x3ff004de3a23b32d,2
+np.float64,0x80005d348e80ba6a,0x3ff0000000000000,2
+np.float64,0x800c348d6118691b,0x3ff0000000000000,2
+np.float64,0xffd6b88f84ad7120,0x7ff0000000000000,2
+np.float64,0x3fc1aaaa82235555,0x3ff027136afd08e0,2
+np.float64,0x7fca7d081b34fa0f,0x7ff0000000000000,2
+np.float64,0x1,0x3ff0000000000000,2
+np.float64,0xbfdc810d1139021a,0x3ff19d007408cfe3,2
+np.float64,0xbfe5dce05f2bb9c0,0x3ff3e1bb9234617b,2
+np.float64,0xffecfe2c32b9fc58,0x7ff0000000000000,2
+np.float64,0x95b2891b2b651,0x3ff0000000000000,2
+np.float64,0x8000b60c6c616c1a,0x3ff0000000000000,2
+np.float64,0x4944f0889289f,0x3ff0000000000000,2
+np.float64,0x3fe6e508696dca10,0x3ff445d1b94863e9,2
+np.float64,0xbfe63355d0ec66ac,0x3ff401e74f16d16f,2
+np.float64,0xbfe9b9595af372b3,0x3ff57445e1b4d670,2
+np.float64,0x800e16f7313c2dee,0x3ff0000000000000,2
+np.float64,0xffe898f5f0b131eb,0x7ff0000000000000,2
+np.float64,0x3fe91ac651f2358d,0x3ff52e787c21c004,2
+np.float64,0x7fbfaac6783f558c,0x7ff0000000000000,2
+np.float64,0xd8ef3dfbb1de8,0x3ff0000000000000,2
+np.float64,0xbfc58c13a52b1828,0x3ff03a2c19d65019,2
+np.float64,0xbfbde55e8a3bcac0,0x3ff01bf648a3e0a7,2
+np.float64,0xffc3034930260694,0x7ff0000000000000,2
+np.float64,0xea77a64dd4ef5,0x3ff0000000000000,2
+np.float64,0x800cfe7e7739fcfd,0x3ff0000000000000,2
+np.float64,0x4960f31a92c1f,0x3ff0000000000000,2
+np.float64,0x3fd9552c94b2aa58,0x3ff14515a29add09,2
+np.float64,0xffe8b3244c316648,0x7ff0000000000000,2
+np.float64,0x3fe8201e6a70403d,0x3ff4c444fa679cce,2
+np.float64,0xffe9ab7c20f356f8,0x7ff0000000000000,2
+np.float64,0x3fed8bba5f7b1774,0x3ff751853c4c95c5,2
+np.float64,0x8007639cb76ec73a,0x3ff0000000000000,2
+np.float64,0xbfe396db89672db7,0x3ff317bfd1d6fa8c,2
+np.float64,0xbfeb42f888f685f1,0x3ff62a7e0eee56b1,2
+np.float64,0x3fe894827c712904,0x3ff4f4f561d9ea13,2
+np.float64,0xb66b3caf6cd68,0x3ff0000000000000,2
+np.float64,0x800f8907fdbf1210,0x3ff0000000000000,2
+np.float64,0x7fe9b0cddb73619b,0x7ff0000000000000,2
+np.float64,0xbfda70c0e634e182,0x3ff1628c6fdffc53,2
+np.float64,0x3fe0b5f534a16bea,0x3ff23b4ed4c2b48e,2
+np.float64,0xbfe8eee93671ddd2,0x3ff51b85b3c50ae4,2
+np.float64,0xbfe8c22627f1844c,0x3ff50858787a3bfe,2
+np.float64,0x37bb83c86f771,0x3ff0000000000000,2
+np.float64,0xffb7827ffe2f0500,0x7ff0000000000000,2
+np.float64,0x64317940c864,0x3ff0000000000000,2
+np.float64,0x800430ecee6861db,0x3ff0000000000000,2
+np.float64,0x3fa4291fbc285240,0x3ff0032d0204f6dd,2
+np.float64,0xffec69f76af8d3ee,0x7ff0000000000000,2
+np.float64,0x3ff0000000000000,0x3ff8b07551d9f550,2
+np.float64,0x3fc4cf3c42299e79,0x3ff0363fb1d3c254,2
+np.float64,0x7fe0223a77e04474,0x7ff0000000000000,2
+np.float64,0x800a3d4fa4347aa0,0x3ff0000000000000,2
+np.float64,0x3fdd273f94ba4e7f,0x3ff1b05b686e6879,2
+np.float64,0x3feca79052f94f20,0x3ff6dadedfa283aa,2
+np.float64,0x5e7f6f80bcfef,0x3ff0000000000000,2
+np.float64,0xbfef035892fe06b1,0x3ff81efb39cbeba2,2
+np.float64,0x3fee6c08e07cd812,0x3ff7caad952860a1,2
+np.float64,0xffeda715877b4e2a,0x7ff0000000000000,2
+np.float64,0x800580286b0b0052,0x3ff0000000000000,2
+np.float64,0x800703a73fee074f,0x3ff0000000000000,2
+np.float64,0xbfccf96a6639f2d4,0x3ff0696330a60832,2
+np.float64,0x7feb408442368108,0x7ff0000000000000,2
+np.float64,0x3fedc87a46fb90f5,0x3ff771e3635649a9,2
+np.float64,0x3fd8297b773052f7,0x3ff12762bc0cea76,2
+np.float64,0x3fee41bb03fc8376,0x3ff7b37b2da48ab4,2
+np.float64,0xbfe2b05a226560b4,0x3ff2cea17ae7c528,2
+np.float64,0xbfd2e92cf2a5d25a,0x3ff0b41d605ced61,2
+np.float64,0x4817f03a902ff,0x3ff0000000000000,2
+np.float64,0x8c9d4f0d193aa,0x3ff0000000000000,2
diff --git a/numpy/core/tests/data/umath-validation-set-exp2.csv b/numpy/core/tests/data/umath-validation-set-exp2.csv
new file mode 100644 (file)
index 0000000..e19e9eb
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0xbdfe94b0,0x3f6adda6,2
+np.float32,0x3f20f8f8,0x3fc5ec69,2
+np.float32,0x7040b5,0x3f800000,2
+np.float32,0x30ec5,0x3f800000,2
+np.float32,0x3eb63070,0x3fa3ce29,2
+np.float32,0xff4dda3d,0x0,2
+np.float32,0x805b832f,0x3f800000,2
+np.float32,0x3e883fb7,0x3f99ed8c,2
+np.float32,0x3f14d71f,0x3fbf8708,2
+np.float32,0xff7b1e55,0x0,2
+np.float32,0xbf691ac6,0x3f082fa2,2
+np.float32,0x7ee3e6ab,0x7f800000,2
+np.float32,0xbec6e2b4,0x3f439248,2
+np.float32,0xbf5f5ec2,0x3f0bd2c0,2
+np.float32,0x8025cc2c,0x3f800000,2
+np.float32,0x7e0d7672,0x7f800000,2
+np.float32,0xff4bbc5c,0x0,2
+np.float32,0xbd94fb30,0x3f73696b,2
+np.float32,0x6cc079,0x3f800000,2
+np.float32,0x803cf080,0x3f800000,2
+np.float32,0x71d418,0x3f800000,2
+np.float32,0xbf24a442,0x3f23ec1e,2
+np.float32,0xbe6c9510,0x3f5a1e1d,2
+np.float32,0xbe8fb284,0x3f52be38,2
+np.float32,0x7ea64754,0x7f800000,2
+np.float32,0x7fc00000,0x7fc00000,2
+np.float32,0x80620cfd,0x3f800000,2
+np.float32,0x3f3e20e8,0x3fd62e72,2
+np.float32,0x3f384600,0x3fd2d00e,2
+np.float32,0xff362150,0x0,2
+np.float32,0xbf349fa8,0x3f1cfaef,2
+np.float32,0xbf776cf2,0x3f0301a6,2
+np.float32,0x8021fc60,0x3f800000,2
+np.float32,0xbdb75280,0x3f70995c,2
+np.float32,0x7e9363a6,0x7f800000,2
+np.float32,0x7e728422,0x7f800000,2
+np.float32,0xfe91edc2,0x0,2
+np.float32,0x3f5f438c,0x3fea491d,2
+np.float32,0x3f2afae9,0x3fcb5c1f,2
+np.float32,0xbef8e766,0x3f36c448,2
+np.float32,0xba522c00,0x3f7fdb97,2
+np.float32,0xff18ee8c,0x0,2
+np.float32,0xbee8c5f4,0x3f3acd44,2
+np.float32,0x3e790448,0x3f97802c,2
+np.float32,0x3e8c9541,0x3f9ad571,2
+np.float32,0xbf03fa9f,0x3f331460,2
+np.float32,0x801ee053,0x3f800000,2
+np.float32,0xbf773230,0x3f03167f,2
+np.float32,0x356fd9,0x3f800000,2
+np.float32,0x8009cd88,0x3f800000,2
+np.float32,0x7f2bac51,0x7f800000,2
+np.float32,0x4d9eeb,0x3f800000,2
+np.float32,0x3133,0x3f800000,2
+np.float32,0x7f4290e0,0x7f800000,2
+np.float32,0xbf5e6523,0x3f0c3161,2
+np.float32,0x3f19182e,0x3fc1bf10,2
+np.float32,0x7e1248bb,0x7f800000,2
+np.float32,0xff5f7aae,0x0,2
+np.float32,0x7e8557b5,0x7f800000,2
+np.float32,0x26fc7f,0x3f800000,2
+np.float32,0x80397d61,0x3f800000,2
+np.float32,0x3cb1825d,0x3f81efe0,2
+np.float32,0x3ed808d0,0x3fab7c45,2
+np.float32,0xbf6f668a,0x3f05e259,2
+np.float32,0x3e3c7802,0x3f916abd,2
+np.float32,0xbd5ac5a0,0x3f76b21b,2
+np.float32,0x805aa6c9,0x3f800000,2
+np.float32,0xbe4d6f68,0x3f5ec3e1,2
+np.float32,0x3f3108b2,0x3fceb87f,2
+np.float32,0x3ec385cc,0x3fa6c9fb,2
+np.float32,0xbe9fc1ce,0x3f4e35e8,2
+np.float32,0x43b68,0x3f800000,2
+np.float32,0x3ef0cdcc,0x3fb15557,2
+np.float32,0x3e3f729b,0x3f91b5e1,2
+np.float32,0x7f52a4df,0x7f800000,2
+np.float32,0xbf56da96,0x3f0f15b9,2
+np.float32,0xbf161d2b,0x3f2a7faf,2
+np.float32,0x3e8df763,0x3f9b1fbe,2
+np.float32,0xff4f0780,0x0,2
+np.float32,0x8048f594,0x3f800000,2
+np.float32,0x3e62bb1d,0x3f953b7e,2
+np.float32,0xfe58e764,0x0,2
+np.float32,0x3dd2c922,0x3f897718,2
+np.float32,0x7fa00000,0x7fe00000,2
+np.float32,0xff07b4b2,0x0,2
+np.float32,0x7f6231a0,0x7f800000,2
+np.float32,0xb8d1d,0x3f800000,2
+np.float32,0x3ee01d24,0x3fad5f16,2
+np.float32,0xbf43f59f,0x3f169869,2
+np.float32,0x801f5257,0x3f800000,2
+np.float32,0x803c15d8,0x3f800000,2
+np.float32,0x3f171a08,0x3fc0b42a,2
+np.float32,0x127aef,0x3f800000,2
+np.float32,0xfd1c6,0x3f800000,2
+np.float32,0x3f1ed13e,0x3fc4c59a,2
+np.float32,0x57fd4f,0x3f800000,2
+np.float32,0x6e8c61,0x3f800000,2
+np.float32,0x804019ab,0x3f800000,2
+np.float32,0x3ef4e5c6,0x3fb251a1,2
+np.float32,0x5044c3,0x3f800000,2
+np.float32,0x3f04460f,0x3fb7204b,2
+np.float32,0x7e326b47,0x7f800000,2
+np.float32,0x800a7e4c,0x3f800000,2
+np.float32,0xbf47ec82,0x3f14fccc,2
+np.float32,0xbedb1b3e,0x3f3e4a4d,2
+np.float32,0x3f741d86,0x3ff7e4b0,2
+np.float32,0xbe249d20,0x3f6501a6,2
+np.float32,0xbf2ea152,0x3f1f8c68,2
+np.float32,0x3ec6dbcc,0x3fa78b3f,2
+np.float32,0x7ebd9bb4,0x7f800000,2
+np.float32,0x3f61b574,0x3febd77a,2
+np.float32,0x3f3dfb2b,0x3fd61891,2
+np.float32,0x3c7d95,0x3f800000,2
+np.float32,0x8071e840,0x3f800000,2
+np.float32,0x15c6fe,0x3f800000,2
+np.float32,0xbf096601,0x3f307893,2
+np.float32,0x7f5c2ef9,0x7f800000,2
+np.float32,0xbe79f750,0x3f582689,2
+np.float32,0x1eb692,0x3f800000,2
+np.float32,0xbd8024f0,0x3f75226d,2
+np.float32,0xbf5a8be8,0x3f0da950,2
+np.float32,0xbf4d28f3,0x3f12e3e1,2
+np.float32,0x7f800000,0x7f800000,2
+np.float32,0xfea8a758,0x0,2
+np.float32,0x8075d2cf,0x3f800000,2
+np.float32,0xfd99af58,0x0,2
+np.float32,0x9e6a,0x3f800000,2
+np.float32,0x2fa19f,0x3f800000,2
+np.float32,0x3e9f4206,0x3f9ecc56,2
+np.float32,0xbee0b666,0x3f3cd9fc,2
+np.float32,0xbec558c4,0x3f43fab1,2
+np.float32,0x7e9a77df,0x7f800000,2
+np.float32,0xff3a9694,0x0,2
+np.float32,0x3f3b3708,0x3fd47f9a,2
+np.float32,0x807cd6d4,0x3f800000,2
+np.float32,0x804aa422,0x3f800000,2
+np.float32,0xfead7a70,0x0,2
+np.float32,0x3f08c610,0x3fb95efe,2
+np.float32,0xff390126,0x0,2
+np.float32,0x5d2d47,0x3f800000,2
+np.float32,0x8006849c,0x3f800000,2
+np.float32,0x654f6e,0x3f800000,2
+np.float32,0xff478a16,0x0,2
+np.float32,0x3f480b0c,0x3fdc024c,2
+np.float32,0xbc3b96c0,0x3f7df9f4,2
+np.float32,0xbcc96460,0x3f7bacb5,2
+np.float32,0x7f349f30,0x7f800000,2
+np.float32,0xbe08fa98,0x3f6954a1,2
+np.float32,0x4f3a13,0x3f800000,2
+np.float32,0x7f6a5ab4,0x7f800000,2
+np.float32,0x7eb85247,0x7f800000,2
+np.float32,0xbf287246,0x3f223e08,2
+np.float32,0x801584d0,0x3f800000,2
+np.float32,0x7ec25371,0x7f800000,2
+np.float32,0x3f002165,0x3fb51552,2
+np.float32,0x3e1108a8,0x3f8d3429,2
+np.float32,0x4f0f88,0x3f800000,2
+np.float32,0x7f67c1ce,0x7f800000,2
+np.float32,0xbf4348f8,0x3f16dedf,2
+np.float32,0xbe292b64,0x3f644d24,2
+np.float32,0xbf2bfa36,0x3f20b2d6,2
+np.float32,0xbf2a6e58,0x3f215f71,2
+np.float32,0x3e97d5d3,0x3f9d35df,2
+np.float32,0x31f597,0x3f800000,2
+np.float32,0x100544,0x3f800000,2
+np.float32,0x10a197,0x3f800000,2
+np.float32,0x3f44df50,0x3fda20d2,2
+np.float32,0x59916d,0x3f800000,2
+np.float32,0x707472,0x3f800000,2
+np.float32,0x8054194e,0x3f800000,2
+np.float32,0x80627b01,0x3f800000,2
+np.float32,0x7f4d5a5b,0x7f800000,2
+np.float32,0xbcecad00,0x3f7aeca5,2
+np.float32,0xff69c541,0x0,2
+np.float32,0xbe164e20,0x3f673c3a,2
+np.float32,0x3dd321de,0x3f897b39,2
+np.float32,0x3c9c4900,0x3f81b431,2
+np.float32,0x7f0efae3,0x7f800000,2
+np.float32,0xbf1b3ee6,0x3f282567,2
+np.float32,0x3ee858ac,0x3faf5083,2
+np.float32,0x3f0e6a39,0x3fbc3965,2
+np.float32,0x7f0c06d8,0x7f800000,2
+np.float32,0x801dd236,0x3f800000,2
+np.float32,0x564245,0x3f800000,2
+np.float32,0x7e99d3ad,0x7f800000,2
+np.float32,0xff3b0164,0x0,2
+np.float32,0x3f386f18,0x3fd2e785,2
+np.float32,0x7f603c39,0x7f800000,2
+np.float32,0x3cbd9b00,0x3f8211f0,2
+np.float32,0x2178e2,0x3f800000,2
+np.float32,0x5db226,0x3f800000,2
+np.float32,0xfec78d62,0x0,2
+np.float32,0x7f40bc1e,0x7f800000,2
+np.float32,0x80325064,0x3f800000,2
+np.float32,0x3f6068dc,0x3feb0377,2
+np.float32,0xfe8b95c6,0x0,2
+np.float32,0xbe496894,0x3f5f5f87,2
+np.float32,0xbf18722a,0x3f296cf4,2
+np.float32,0x332d0e,0x3f800000,2
+np.float32,0x3f6329dc,0x3fecc5c0,2
+np.float32,0x807d1802,0x3f800000,2
+np.float32,0x3e8afcee,0x3f9a7ff1,2
+np.float32,0x26a0a7,0x3f800000,2
+np.float32,0x7f13085d,0x7f800000,2
+np.float32,0x68d547,0x3f800000,2
+np.float32,0x7e9b04ae,0x7f800000,2
+np.float32,0x3f3ecdfe,0x3fd692ea,2
+np.float32,0x805256f4,0x3f800000,2
+np.float32,0x3f312dc8,0x3fcecd42,2
+np.float32,0x23ca15,0x3f800000,2
+np.float32,0x3f53c455,0x3fe31ad6,2
+np.float32,0xbf21186c,0x3f2580fd,2
+np.float32,0x803b9bb1,0x3f800000,2
+np.float32,0xff6ae1fc,0x0,2
+np.float32,0x2103cf,0x3f800000,2
+np.float32,0xbedcec6c,0x3f3dd29d,2
+np.float32,0x7f520afa,0x7f800000,2
+np.float32,0x7e8b44f2,0x7f800000,2
+np.float32,0xfef7f6ce,0x0,2
+np.float32,0xbd5e7c30,0x3f768a6f,2
+np.float32,0xfeb36848,0x0,2
+np.float32,0xff49effb,0x0,2
+np.float32,0xbec207c0,0x3f44dc74,2
+np.float32,0x3e91147f,0x3f9bc77f,2
+np.float32,0xfe784cd4,0x0,2
+np.float32,0xfd1a7250,0x0,2
+np.float32,0xff3b3f48,0x0,2
+np.float32,0x3f685db5,0x3ff0219f,2
+np.float32,0x3f370976,0x3fd21bae,2
+np.float32,0xfed4cc20,0x0,2
+np.float32,0xbf41e337,0x3f17714a,2
+np.float32,0xbf4e8638,0x3f12593a,2
+np.float32,0x3edaf0f1,0x3fac295e,2
+np.float32,0x803cbb4f,0x3f800000,2
+np.float32,0x7f492043,0x7f800000,2
+np.float32,0x2cabcf,0x3f800000,2
+np.float32,0x17f8ac,0x3f800000,2
+np.float32,0x3e846478,0x3f99205a,2
+np.float32,0x76948f,0x3f800000,2
+np.float32,0x1,0x3f800000,2
+np.float32,0x7ea6419e,0x7f800000,2
+np.float32,0xa5315,0x3f800000,2
+np.float32,0xff3a8e32,0x0,2
+np.float32,0xbe5714e8,0x3f5d50b7,2
+np.float32,0xfeadf960,0x0,2
+np.float32,0x3ebbd1a8,0x3fa50efc,2
+np.float32,0x7f31dce7,0x7f800000,2
+np.float32,0x80314999,0x3f800000,2
+np.float32,0x8017f41b,0x3f800000,2
+np.float32,0x7ed6d051,0x7f800000,2
+np.float32,0x7f525688,0x7f800000,2
+np.float32,0x7f7fffff,0x7f800000,2
+np.float32,0x3e8b0461,0x3f9a8180,2
+np.float32,0x3d9fe46e,0x3f871e1f,2
+np.float32,0x5e6d8f,0x3f800000,2
+np.float32,0xbf09ae55,0x3f305608,2
+np.float32,0xfe7028c4,0x0,2
+np.float32,0x7f3ade56,0x7f800000,2
+np.float32,0xff4c9ef9,0x0,2
+np.float32,0x7e3199cf,0x7f800000,2
+np.float32,0x8048652f,0x3f800000,2
+np.float32,0x805e1237,0x3f800000,2
+np.float32,0x189ed8,0x3f800000,2
+np.float32,0xbea7c094,0x3f4bfd98,2
+np.float32,0xbf2f109c,0x3f1f5c5c,2
+np.float32,0xbf0e7f4c,0x3f2e0d2c,2
+np.float32,0x8005981f,0x3f800000,2
+np.float32,0xbf762005,0x3f0377f3,2
+np.float32,0xbf0f60ab,0x3f2da317,2
+np.float32,0xbf4aa3e7,0x3f13e54e,2
+np.float32,0xbf348fd2,0x3f1d01aa,2
+np.float32,0x3e530b50,0x3f93a7fb,2
+np.float32,0xbf0b05a4,0x3f2fb26a,2
+np.float32,0x3eea416c,0x3fafc4aa,2
+np.float32,0x805ad04d,0x3f800000,2
+np.float32,0xbf6328d8,0x3f0a655e,2
+np.float32,0x3f7347b9,0x3ff75558,2
+np.float32,0xfda3ca68,0x0,2
+np.float32,0x80497d21,0x3f800000,2
+np.float32,0x3e740452,0x3f96fd22,2
+np.float32,0x3e528e57,0x3f939b7e,2
+np.float32,0x3e9e19fa,0x3f9e8cbd,2
+np.float32,0x8078060b,0x3f800000,2
+np.float32,0x3f3fea7a,0x3fd73872,2
+np.float32,0xfcfa30a0,0x0,2
+np.float32,0x7f4eb4bf,0x7f800000,2
+np.float32,0x3f712618,0x3ff5e900,2
+np.float32,0xbf668f0e,0x3f0920c6,2
+np.float32,0x3f3001e9,0x3fce259d,2
+np.float32,0xbe9b6fac,0x3f4f6b9c,2
+np.float32,0xbf61fcf3,0x3f0ad5ec,2
+np.float32,0xff08a55c,0x0,2
+np.float32,0x3e805014,0x3f984872,2
+np.float32,0x6ce04c,0x3f800000,2
+np.float32,0x7f7cbc07,0x7f800000,2
+np.float32,0x3c87dc,0x3f800000,2
+np.float32,0x3f2ee498,0x3fcd869a,2
+np.float32,0x4b1116,0x3f800000,2
+np.float32,0x3d382d06,0x3f840d5f,2
+np.float32,0xff7de21e,0x0,2
+np.float32,0x3f2f1d6d,0x3fcda63c,2
+np.float32,0xbf1c1618,0x3f27c38a,2
+np.float32,0xff4264b1,0x0,2
+np.float32,0x8026e5e7,0x3f800000,2
+np.float32,0xbe6fa180,0x3f59ab02,2
+np.float32,0xbe923c02,0x3f52053b,2
+np.float32,0xff3aa453,0x0,2
+np.float32,0x3f77a7ac,0x3ffa47d0,2
+np.float32,0xbed15f36,0x3f40d08a,2
+np.float32,0xa62d,0x3f800000,2
+np.float32,0xbf342038,0x3f1d3123,2
+np.float32,0x7f2f7f80,0x7f800000,2
+np.float32,0x7f2b6fc1,0x7f800000,2
+np.float32,0xff323540,0x0,2
+np.float32,0x3f1a2b6e,0x3fc24faa,2
+np.float32,0x800cc1d2,0x3f800000,2
+np.float32,0xff38fa01,0x0,2
+np.float32,0x80800000,0x3f800000,2
+np.float32,0xbf3d22e0,0x3f196745,2
+np.float32,0x7f40fd62,0x7f800000,2
+np.float32,0x7e1785c7,0x7f800000,2
+np.float32,0x807408c4,0x3f800000,2
+np.float32,0xbf300192,0x3f1ef485,2
+np.float32,0x351e3d,0x3f800000,2
+np.float32,0x7f5ab736,0x7f800000,2
+np.float32,0x2f1696,0x3f800000,2
+np.float32,0x806ac5d7,0x3f800000,2
+np.float32,0x42ec59,0x3f800000,2
+np.float32,0x7f79f52d,0x7f800000,2
+np.float32,0x44ad28,0x3f800000,2
+np.float32,0xbf49dc9c,0x3f143532,2
+np.float32,0x3f6c1f1f,0x3ff295e7,2
+np.float32,0x1589b3,0x3f800000,2
+np.float32,0x3f49b44e,0x3fdd0031,2
+np.float32,0x7f5942c9,0x7f800000,2
+np.float32,0x3f2dab28,0x3fccd877,2
+np.float32,0xff7fffff,0x0,2
+np.float32,0x80578eb2,0x3f800000,2
+np.float32,0x3f39ba67,0x3fd3a50b,2
+np.float32,0x8020340d,0x3f800000,2
+np.float32,0xbf6025b2,0x3f0b8783,2
+np.float32,0x8015ccfe,0x3f800000,2
+np.float32,0x3f6b9762,0x3ff23cd0,2
+np.float32,0xfeeb0c86,0x0,2
+np.float32,0x802779bc,0x3f800000,2
+np.float32,0xbf32bf64,0x3f1dc796,2
+np.float32,0xbf577eb6,0x3f0ed631,2
+np.float32,0x0,0x3f800000,2
+np.float32,0xfe99de6c,0x0,2
+np.float32,0x7a4e53,0x3f800000,2
+np.float32,0x1a15d3,0x3f800000,2
+np.float32,0x8035fe16,0x3f800000,2
+np.float32,0x3e845784,0x3f991dab,2
+np.float32,0x43d688,0x3f800000,2
+np.float32,0xbd447cc0,0x3f77a0b7,2
+np.float32,0x3f83fa,0x3f800000,2
+np.float32,0x3f141df2,0x3fbf2719,2
+np.float32,0x805c586a,0x3f800000,2
+np.float32,0x14c47e,0x3f800000,2
+np.float32,0x3d3bed00,0x3f8422d4,2
+np.float32,0x7f6f4ecd,0x7f800000,2
+np.float32,0x3f0a5e5a,0x3fba2c5c,2
+np.float32,0x523ecf,0x3f800000,2
+np.float32,0xbef4a6e8,0x3f37d262,2
+np.float32,0xff54eb58,0x0,2
+np.float32,0xff3fc875,0x0,2
+np.float32,0x8067c392,0x3f800000,2
+np.float32,0xfedae910,0x0,2
+np.float32,0x80595979,0x3f800000,2
+np.float32,0x3ee87d1d,0x3faf5929,2
+np.float32,0x7f5bad33,0x7f800000,2
+np.float32,0xbf45b868,0x3f15e109,2
+np.float32,0x3ef2277d,0x3fb1a868,2
+np.float32,0x3ca5a950,0x3f81ce8c,2
+np.float32,0x3e70f4e6,0x3f96ad25,2
+np.float32,0xfe3515bc,0x0,2
+np.float32,0xfe4af088,0x0,2
+np.float32,0xff3c78b2,0x0,2
+np.float32,0x7f50f51a,0x7f800000,2
+np.float32,0x3e3a232a,0x3f913009,2
+np.float32,0x7dfec6ff,0x7f800000,2
+np.float32,0x3e1bbaec,0x3f8e3ad6,2
+np.float32,0xbd658fa0,0x3f763ee7,2
+np.float32,0xfe958684,0x0,2
+np.float32,0x503670,0x3f800000,2
+np.float32,0x3f800000,0x40000000,2
+np.float32,0x1bbec6,0x3f800000,2
+np.float32,0xbea7bb7c,0x3f4bff00,2
+np.float32,0xff3a24a2,0x0,2
+np.float32,0xbf416240,0x3f17a635,2
+np.float32,0xbf800000,0x3f000000,2
+np.float32,0xff0c965c,0x0,2
+np.float32,0x80000000,0x3f800000,2
+np.float32,0xbec2c69a,0x3f44a99e,2
+np.float32,0x5b68d4,0x3f800000,2
+np.float32,0xb9a93000,0x3f7ff158,2
+np.float32,0x3d5a0dd8,0x3f84cfbc,2
+np.float32,0xbeaf7a28,0x3f49de4e,2
+np.float32,0x3ee83555,0x3faf4820,2
+np.float32,0xfd320330,0x0,2
+np.float32,0xe1af2,0x3f800000,2
+np.float32,0x7cf28caf,0x7f800000,2
+np.float32,0x80781009,0x3f800000,2
+np.float32,0xbf1e0baf,0x3f26e04d,2
+np.float32,0x7edb05b1,0x7f800000,2
+np.float32,0x3de004,0x3f800000,2
+np.float32,0xff436af6,0x0,2
+np.float32,0x802a9408,0x3f800000,2
+np.float32,0x7ed82205,0x7f800000,2
+np.float32,0x3e3f8212,0x3f91b767,2
+np.float32,0x16a2b2,0x3f800000,2
+np.float32,0xff1e5af3,0x0,2
+np.float32,0xbf1c860c,0x3f2790b7,2
+np.float32,0x3f3bc5da,0x3fd4d1d6,2
+np.float32,0x7f5f7085,0x7f800000,2
+np.float32,0x7f68e409,0x7f800000,2
+np.float32,0x7f4b3388,0x7f800000,2
+np.float32,0x7ecaf440,0x7f800000,2
+np.float32,0x80078785,0x3f800000,2
+np.float32,0x3ebd800d,0x3fa56f45,2
+np.float32,0xbe39a140,0x3f61c58e,2
+np.float32,0x803b587e,0x3f800000,2
+np.float32,0xbeaaa418,0x3f4b31c4,2
+np.float32,0xff7e2b9f,0x0,2
+np.float32,0xff5180a3,0x0,2
+np.float32,0xbf291394,0x3f21f73c,2
+np.float32,0x7f7b9698,0x7f800000,2
+np.float32,0x4218da,0x3f800000,2
+np.float32,0x7f135262,0x7f800000,2
+np.float32,0x804c10e8,0x3f800000,2
+np.float32,0xbf1c2a54,0x3f27ba5a,2
+np.float32,0x7f41fd32,0x7f800000,2
+np.float32,0x3e5cc464,0x3f94a195,2
+np.float32,0xff7a2fa7,0x0,2
+np.float32,0x3e05dc30,0x3f8c23c9,2
+np.float32,0x7f206d99,0x7f800000,2
+np.float32,0xbe9ae520,0x3f4f9287,2
+np.float32,0xfe4f4d58,0x0,2
+np.float32,0xbf44db42,0x3f163ae3,2
+np.float32,0x3f65ac48,0x3fee6300,2
+np.float32,0x3ebfaf36,0x3fa5ecb0,2
+np.float32,0x3f466719,0x3fdb08b0,2
+np.float32,0x80000001,0x3f800000,2
+np.float32,0xff4b3c7b,0x0,2
+np.float32,0x3df44374,0x3f8b0819,2
+np.float32,0xfea4b540,0x0,2
+np.float32,0x7f358e3d,0x7f800000,2
+np.float32,0x801f5e63,0x3f800000,2
+np.float32,0x804ae77e,0x3f800000,2
+np.float32,0xdbb5,0x3f800000,2
+np.float32,0x7f0a7e3b,0x7f800000,2
+np.float32,0xbe4152e4,0x3f609953,2
+np.float32,0x4b9579,0x3f800000,2
+np.float32,0x3ece0bd4,0x3fa92ea5,2
+np.float32,0x7e499d9a,0x7f800000,2
+np.float32,0x80637d8a,0x3f800000,2
+np.float32,0x3e50a425,0x3f936a8b,2
+np.float32,0xbf0e8cb0,0x3f2e06dd,2
+np.float32,0x802763e2,0x3f800000,2
+np.float32,0xff73041b,0x0,2
+np.float32,0xfea466da,0x0,2
+np.float32,0x80064c73,0x3f800000,2
+np.float32,0xbef29222,0x3f385728,2
+np.float32,0x8029c215,0x3f800000,2
+np.float32,0xbd3994e0,0x3f7815d1,2
+np.float32,0xbe6ac9e4,0x3f5a61f3,2
+np.float32,0x804b58b0,0x3f800000,2
+np.float32,0xbdb83be0,0x3f70865c,2
+np.float32,0x7ee18da2,0x7f800000,2
+np.float32,0xfd4ca010,0x0,2
+np.float32,0x807c668b,0x3f800000,2
+np.float32,0xbd40ed90,0x3f77c6e9,2
+np.float32,0x7efc6881,0x7f800000,2
+np.float32,0xfe633bfc,0x0,2
+np.float32,0x803ce363,0x3f800000,2
+np.float32,0x7ecba81e,0x7f800000,2
+np.float32,0xfdcb2378,0x0,2
+np.float32,0xbebc5524,0x3f4662b2,2
+np.float32,0xfaa30000,0x0,2
+np.float32,0x805d451b,0x3f800000,2
+np.float32,0xbee85600,0x3f3ae996,2
+np.float32,0xfefb0a54,0x0,2
+np.float32,0xbdfc6690,0x3f6b0a08,2
+np.float32,0x58a57,0x3f800000,2
+np.float32,0x3b41b7,0x3f800000,2
+np.float32,0x7c99812d,0x7f800000,2
+np.float32,0xbd3ae740,0x3f78079d,2
+np.float32,0xbf4a48a7,0x3f1409dd,2
+np.float32,0xfdeaad58,0x0,2
+np.float32,0xbe9aa65a,0x3f4fa42c,2
+np.float32,0x3f79d78c,0x3ffbc458,2
+np.float32,0x805e7389,0x3f800000,2
+np.float32,0x7ebb3612,0x7f800000,2
+np.float32,0x2e27dc,0x3f800000,2
+np.float32,0x80726dec,0x3f800000,2
+np.float32,0xfe8fb738,0x0,2
+np.float32,0xff1ff3bd,0x0,2
+np.float32,0x7f5264a2,0x7f800000,2
+np.float32,0x3f5a6893,0x3fe739ca,2
+np.float32,0xbec4029c,0x3f44558d,2
+np.float32,0xbef65cfa,0x3f37657e,2
+np.float32,0x63aba1,0x3f800000,2
+np.float32,0xfbb6e200,0x0,2
+np.float32,0xbf3466fc,0x3f1d1307,2
+np.float32,0x3f258844,0x3fc861d7,2
+np.float32,0xbf5f29a7,0x3f0be6dc,2
+np.float32,0x802b51cd,0x3f800000,2
+np.float32,0xbe9094dc,0x3f527dae,2
+np.float32,0xfec2e68c,0x0,2
+np.float32,0x807b38bd,0x3f800000,2
+np.float32,0xbf594662,0x3f0e2663,2
+np.float32,0x7cbcf747,0x7f800000,2
+np.float32,0xbe4b88f0,0x3f5f0d47,2
+np.float32,0x3c53c4,0x3f800000,2
+np.float32,0xbe883562,0x3f54e3f7,2
+np.float32,0xbf1efaf0,0x3f267456,2
+np.float32,0x3e22cd3e,0x3f8ee98b,2
+np.float32,0x80434875,0x3f800000,2
+np.float32,0xbf000b44,0x3f34ff6e,2
+np.float32,0x7f311c3a,0x7f800000,2
+np.float32,0x802f7f3f,0x3f800000,2
+np.float32,0x805155fe,0x3f800000,2
+np.float32,0x7f5d7485,0x7f800000,2
+np.float32,0x80119197,0x3f800000,2
+np.float32,0x3f445b8b,0x3fd9d30d,2
+np.float32,0xbf638eb3,0x3f0a3f38,2
+np.float32,0x402410,0x3f800000,2
+np.float32,0xbc578a40,0x3f7dad1d,2
+np.float32,0xbeecbf8a,0x3f39cc9e,2
+np.float32,0x7f2935a4,0x7f800000,2
+np.float32,0x3f570fea,0x3fe523e2,2
+np.float32,0xbf06bffa,0x3f31bdb6,2
+np.float32,0xbf2afdfd,0x3f2120ba,2
+np.float32,0x7f76f7ab,0x7f800000,2
+np.float32,0xfee2d1e8,0x0,2
+np.float32,0x800b026d,0x3f800000,2
+np.float32,0xff0eda75,0x0,2
+np.float32,0x3d4c,0x3f800000,2
+np.float32,0xbed538a2,0x3f3fcffb,2
+np.float32,0x3f73f4f9,0x3ff7c979,2
+np.float32,0x2aa9fc,0x3f800000,2
+np.float32,0x806a45b3,0x3f800000,2
+np.float32,0xff770d35,0x0,2
+np.float32,0x7e999be3,0x7f800000,2
+np.float32,0x80741128,0x3f800000,2
+np.float32,0xff6aac34,0x0,2
+np.float32,0x470f74,0x3f800000,2
+np.float32,0xff423b7b,0x0,2
+np.float32,0x17dfdd,0x3f800000,2
+np.float32,0x7f029e12,0x7f800000,2
+np.float32,0x803fcb9d,0x3f800000,2
+np.float32,0x3f3dc3,0x3f800000,2
+np.float32,0x7f3a27bc,0x7f800000,2
+np.float32,0x3e473108,0x3f9279ec,2
+np.float32,0x7f4add5d,0x7f800000,2
+np.float32,0xfd9736e0,0x0,2
+np.float32,0x805f1df2,0x3f800000,2
+np.float32,0x6c49c1,0x3f800000,2
+np.float32,0x7ec733c7,0x7f800000,2
+np.float32,0x804c1abf,0x3f800000,2
+np.float32,0x3de2e887,0x3f8a37a5,2
+np.float32,0x3f51630a,0x3fe1a561,2
+np.float32,0x3de686a8,0x3f8a62ff,2
+np.float32,0xbedb3538,0x3f3e439c,2
+np.float32,0xbf3aa892,0x3f1a6f9e,2
+np.float32,0x7ee5fb32,0x7f800000,2
+np.float32,0x7e916c9b,0x7f800000,2
+np.float32,0x3f033f1c,0x3fb69e19,2
+np.float32,0x25324b,0x3f800000,2
+np.float32,0x3f348d1d,0x3fd0b2e2,2
+np.float32,0x3f5797e8,0x3fe57851,2
+np.float32,0xbf69c316,0x3f07f1a0,2
+np.float32,0xbe8b7fb0,0x3f53f1bf,2
+np.float32,0xbdbbc190,0x3f703d00,2
+np.float32,0xff6c4fc0,0x0,2
+np.float32,0x7f29fcbe,0x7f800000,2
+np.float32,0x3f678d19,0x3fef9a23,2
+np.float32,0x73d140,0x3f800000,2
+np.float32,0x3e25bdd2,0x3f8f326b,2
+np.float32,0xbeb775ec,0x3f47b2c6,2
+np.float32,0xff451c4d,0x0,2
+np.float32,0x8072c466,0x3f800000,2
+np.float32,0x3f65e836,0x3fee89b2,2
+np.float32,0x52ca7a,0x3f800000,2
+np.float32,0x62cfed,0x3f800000,2
+np.float32,0xbf583dd0,0x3f0e8c5c,2
+np.float32,0xbf683842,0x3f088342,2
+np.float32,0x3f1a7828,0x3fc2780c,2
+np.float32,0x800ea979,0x3f800000,2
+np.float32,0xbeb9133c,0x3f474328,2
+np.float32,0x3ef09fc7,0x3fb14a4b,2
+np.float32,0x7ebbcb75,0x7f800000,2
+np.float32,0xff316c0e,0x0,2
+np.float32,0x805b84e3,0x3f800000,2
+np.float32,0x3d6a55e0,0x3f852d8a,2
+np.float32,0x3e755788,0x3f971fd1,2
+np.float32,0x3ee7aacb,0x3faf2743,2
+np.float32,0x7f714039,0x7f800000,2
+np.float32,0xff70bad8,0x0,2
+np.float32,0xbe0b74c8,0x3f68f08c,2
+np.float32,0xbf6cb170,0x3f06de86,2
+np.float32,0x7ec1fbff,0x7f800000,2
+np.float32,0x8014b1f6,0x3f800000,2
+np.float32,0xfe8b45fe,0x0,2
+np.float32,0x6e2220,0x3f800000,2
+np.float32,0x3ed1777d,0x3fa9f7ab,2
+np.float32,0xff48e467,0x0,2
+np.float32,0xff76c5aa,0x0,2
+np.float32,0x3e9bd330,0x3f9e0fd7,2
+np.float32,0x3f17de4f,0x3fc11aae,2
+np.float32,0x7eeaa2fd,0x7f800000,2
+np.float32,0xbf572746,0x3f0ef806,2
+np.float32,0x7e235554,0x7f800000,2
+np.float32,0xfe24fc1c,0x0,2
+np.float32,0x7daf71ad,0x7f800000,2
+np.float32,0x800d4a6b,0x3f800000,2
+np.float32,0xbf6fc31d,0x3f05c0ce,2
+np.float32,0x1c4d93,0x3f800000,2
+np.float32,0x7ee9200c,0x7f800000,2
+np.float32,0x3f54b4da,0x3fe3aeec,2
+np.float32,0x2b37b1,0x3f800000,2
+np.float32,0x3f7468bd,0x3ff81731,2
+np.float32,0x3f2850ea,0x3fc9e5f4,2
+np.float32,0xbe0d47ac,0x3f68a6f9,2
+np.float32,0x314877,0x3f800000,2
+np.float32,0x802700c3,0x3f800000,2
+np.float32,0x7e2c915f,0x7f800000,2
+np.float32,0x800d0059,0x3f800000,2
+np.float32,0x3f7f3c25,0x3fff7862,2
+np.float32,0xff735d31,0x0,2
+np.float32,0xff7e339e,0x0,2
+np.float32,0xbef96cf0,0x3f36a340,2
+np.float32,0x3db6ea21,0x3f882cb2,2
+np.float32,0x67cb3d,0x3f800000,2
+np.float32,0x801f349d,0x3f800000,2
+np.float32,0x3f1390ec,0x3fbede29,2
+np.float32,0x7f13644a,0x7f800000,2
+np.float32,0x804a369b,0x3f800000,2
+np.float32,0x80262666,0x3f800000,2
+np.float32,0x7e850fbc,0x7f800000,2
+np.float32,0x18b002,0x3f800000,2
+np.float32,0x8051f1ed,0x3f800000,2
+np.float32,0x3eba48f6,0x3fa4b753,2
+np.float32,0xbf3f4130,0x3f1886a9,2
+np.float32,0xbedac006,0x3f3e61cf,2
+np.float32,0xbf097c70,0x3f306ddc,2
+np.float32,0x4aba6d,0x3f800000,2
+np.float32,0x580078,0x3f800000,2
+np.float32,0x3f64d82e,0x3fedda40,2
+np.float32,0x7f781fd6,0x7f800000,2
+np.float32,0x6aff3d,0x3f800000,2
+np.float32,0xff25e074,0x0,2
+np.float32,0x7ea9ec89,0x7f800000,2
+np.float32,0xbf63b816,0x3f0a2fbb,2
+np.float32,0x133f07,0x3f800000,2
+np.float32,0xff800000,0x0,2
+np.float32,0x8013dde7,0x3f800000,2
+np.float32,0xff770b95,0x0,2
+np.float32,0x806154e8,0x3f800000,2
+np.float32,0x3f1e7bce,0x3fc4981a,2
+np.float32,0xff262c78,0x0,2
+np.float32,0x3f59a652,0x3fe6c04c,2
+np.float32,0x7f220166,0x7f800000,2
+np.float32,0x7eb24939,0x7f800000,2
+np.float32,0xbed58bb0,0x3f3fba6a,2
+np.float32,0x3c2ad000,0x3f80eda7,2
+np.float32,0x2adb2e,0x3f800000,2
+np.float32,0xfe8b213e,0x0,2
+np.float32,0xbf2e0c1e,0x3f1fccea,2
+np.float32,0x7e1716be,0x7f800000,2
+np.float32,0x80184e73,0x3f800000,2
+np.float32,0xbf254743,0x3f23a3d5,2
+np.float32,0x8063a722,0x3f800000,2
+np.float32,0xbe50adf0,0x3f5e46c7,2
+np.float32,0x3f614158,0x3feb8d60,2
+np.float32,0x8014bbc8,0x3f800000,2
+np.float32,0x283bc7,0x3f800000,2
+np.float32,0x3ffb5c,0x3f800000,2
+np.float32,0xfe8de6bc,0x0,2
+np.float32,0xbea6e086,0x3f4c3b82,2
+np.float32,0xfee64b92,0x0,2
+np.float32,0x506c1a,0x3f800000,2
+np.float32,0xff342af8,0x0,2
+np.float32,0x6b6f4c,0x3f800000,2
+np.float32,0xfeb42b1e,0x0,2
+np.float32,0x3e49384a,0x3f92ad71,2
+np.float32,0x152d08,0x3f800000,2
+np.float32,0x804c8f09,0x3f800000,2
+np.float32,0xff5e927d,0x0,2
+np.float32,0x6374da,0x3f800000,2
+np.float32,0x3f48f011,0x3fdc8ae4,2
+np.float32,0xbf446a30,0x3f1668e8,2
+np.float32,0x3ee77073,0x3faf196e,2
+np.float32,0xff4caa40,0x0,2
+np.float32,0x7efc9363,0x7f800000,2
+np.float32,0xbf706dcc,0x3f05830d,2
+np.float32,0xfe29c7e8,0x0,2
+np.float32,0x803cfe58,0x3f800000,2
+np.float32,0x3ec34c7c,0x3fa6bd0a,2
+np.float32,0x3eb85b62,0x3fa44968,2
+np.float32,0xfda1b9d8,0x0,2
+np.float32,0x802932cd,0x3f800000,2
+np.float32,0xbf5cde78,0x3f0cc5fa,2
+np.float32,0x3f31bf44,0x3fcf1ec8,2
+np.float32,0x803a0882,0x3f800000,2
+np.float32,0x800000,0x3f800000,2
+np.float32,0x3f54110e,0x3fe34a08,2
+np.float32,0x80645ea9,0x3f800000,2
+np.float32,0xbd8c1070,0x3f7425c3,2
+np.float32,0x801a006a,0x3f800000,2
+np.float32,0x7f5d161e,0x7f800000,2
+np.float32,0x805b5df3,0x3f800000,2
+np.float32,0xbf71a7c0,0x3f0511be,2
+np.float32,0xbe9a55c0,0x3f4fbad6,2
+np.float64,0xde7e2fd9bcfc6,0x3ff0000000000000,2
+np.float64,0xbfd8cd88eb319b12,0x3fe876349efbfa2b,2
+np.float64,0x3fe4fa13ace9f428,0x3ff933fbb117d196,2
+np.float64,0x475b3d048eb68,0x3ff0000000000000,2
+np.float64,0x7fef39ed07be73d9,0x7ff0000000000000,2
+np.float64,0x80026b84d904d70a,0x3ff0000000000000,2
+np.float64,0xebd60627d7ac1,0x3ff0000000000000,2
+np.float64,0xbfd7cbefdbaf97e0,0x3fe8bad30f6cf8e1,2
+np.float64,0x7fc17c605a22f8c0,0x7ff0000000000000,2
+np.float64,0x8cdac05119b58,0x3ff0000000000000,2
+np.float64,0x3fc45cd60a28b9ac,0x3ff1dd8028ec3f41,2
+np.float64,0x7fef4fce137e9f9b,0x7ff0000000000000,2
+np.float64,0xe5a2b819cb457,0x3ff0000000000000,2
+np.float64,0xe3bcfd4dc77a0,0x3ff0000000000000,2
+np.float64,0x68f0b670d1e17,0x3ff0000000000000,2
+np.float64,0xae69a6455cd35,0x3ff0000000000000,2
+np.float64,0xffe7007a0c6e00f4,0x0,2
+np.float64,0x59fc57a8b3f8c,0x3ff0000000000000,2
+np.float64,0xbfeee429c0bdc854,0x3fe0638fa62bed9f,2
+np.float64,0x80030bb6e206176f,0x3ff0000000000000,2
+np.float64,0x8006967a36ad2cf5,0x3ff0000000000000,2
+np.float64,0x3fe128176a22502f,0x3ff73393301e5dc8,2
+np.float64,0x218de20c431bd,0x3ff0000000000000,2
+np.float64,0x3fe7dbc48aafb789,0x3ffad38989b5955c,2
+np.float64,0xffda1ef411343de8,0x0,2
+np.float64,0xc6b392838d673,0x3ff0000000000000,2
+np.float64,0x7fe6d080c1ada101,0x7ff0000000000000,2
+np.float64,0xbfed36dd67fa6dbb,0x3fe0fec342c4ee89,2
+np.float64,0x3fee2bb6a3fc576e,0x3ffec1c149f1f092,2
+np.float64,0xbfd1f785eb23ef0c,0x3fea576eb01233cb,2
+np.float64,0x7fdad29a1f35a533,0x7ff0000000000000,2
+np.float64,0xffe8928c4fb12518,0x0,2
+np.float64,0x7fb123160022462b,0x7ff0000000000000,2
+np.float64,0x8007ab56cfaf56ae,0x3ff0000000000000,2
+np.float64,0x7fda342d6634685a,0x7ff0000000000000,2
+np.float64,0xbfe3b7e42c676fc8,0x3fe4e05cf8685b8a,2
+np.float64,0xffa708be7c2e1180,0x0,2
+np.float64,0xbfe8ffbece31ff7e,0x3fe29eb84077a34a,2
+np.float64,0xbf91002008220040,0x3fefa245058f05cb,2
+np.float64,0x8000281f0ee0503f,0x3ff0000000000000,2
+np.float64,0x8005617adc2ac2f6,0x3ff0000000000000,2
+np.float64,0x7fa84fec60309fd8,0x7ff0000000000000,2
+np.float64,0x8d00c0231a018,0x3ff0000000000000,2
+np.float64,0xbfdfe52ca63fca5a,0x3fe6a7324cc00d57,2
+np.float64,0x7fcc81073d39020d,0x7ff0000000000000,2
+np.float64,0x800134ff5a6269ff,0x3ff0000000000000,2
+np.float64,0xffc7fff98d2ffff4,0x0,2
+np.float64,0x8000925ce50124bb,0x3ff0000000000000,2
+np.float64,0xffe2530c66a4a618,0x0,2
+np.float64,0x7fc99070673320e0,0x7ff0000000000000,2
+np.float64,0xbfddd5c1f13bab84,0x3fe72a0c80f8df39,2
+np.float64,0x3fe1c220fee38442,0x3ff7817ec66aa55b,2
+np.float64,0x3fb9a1e1043343c2,0x3ff1265e575e6404,2
+np.float64,0xffef72e0833ee5c0,0x0,2
+np.float64,0x3fe710c0416e2181,0x3ffa5e93588aaa69,2
+np.float64,0xbfd8d23cbab1a47a,0x3fe874f5b9d99885,2
+np.float64,0x7fe9628ebd72c51c,0x7ff0000000000000,2
+np.float64,0xdd5fa611babf5,0x3ff0000000000000,2
+np.float64,0x8002bafac86575f6,0x3ff0000000000000,2
+np.float64,0x68acea44d159e,0x3ff0000000000000,2
+np.float64,0xffd776695eaeecd2,0x0,2
+np.float64,0x80059b59bb4b36b4,0x3ff0000000000000,2
+np.float64,0xbdcdd2af7b9bb,0x3ff0000000000000,2
+np.float64,0x8002b432ee856867,0x3ff0000000000000,2
+np.float64,0xcbc72f09978e6,0x3ff0000000000000,2
+np.float64,0xbfee8f4bf6fd1e98,0x3fe081cc0318b170,2
+np.float64,0xffc6e2892d2dc514,0x0,2
+np.float64,0x7feb682e4db6d05c,0x7ff0000000000000,2
+np.float64,0x8004b70a04296e15,0x3ff0000000000000,2
+np.float64,0x42408a4284812,0x3ff0000000000000,2
+np.float64,0xbfe9b8b197f37163,0x3fe254b4c003ce0a,2
+np.float64,0x3fcaadf5f5355bec,0x3ff27ca7876a8d20,2
+np.float64,0xfff0000000000000,0x0,2
+np.float64,0x7fea8376d33506ed,0x7ff0000000000000,2
+np.float64,0xffef73c2d63ee785,0x0,2
+np.float64,0xffe68b2bae2d1657,0x0,2
+np.float64,0x3fd8339cb2306739,0x3ff4cb774d616f90,2
+np.float64,0xbfc6d1db4d2da3b8,0x3fec47bb873a309c,2
+np.float64,0x7fe858016230b002,0x7ff0000000000000,2
+np.float64,0x7fe74cb99d2e9972,0x7ff0000000000000,2
+np.float64,0xffec2e96dc385d2d,0x0,2
+np.float64,0xb762a9876ec55,0x3ff0000000000000,2
+np.float64,0x3feca230c5794462,0x3ffdbfe62a572f52,2
+np.float64,0xbfb5ebad3a2bd758,0x3fee27eed86dcc39,2
+np.float64,0x471c705a8e38f,0x3ff0000000000000,2
+np.float64,0x7fc79bb5cf2f376b,0x7ff0000000000000,2
+np.float64,0xbfe53d6164ea7ac3,0x3fe4331b3beb73bd,2
+np.float64,0xbfe375a3f766eb48,0x3fe4fe67edb516e6,2
+np.float64,0x3fe1c7686ca38ed1,0x3ff7842f04770ba9,2
+np.float64,0x242e74dc485cf,0x3ff0000000000000,2
+np.float64,0x8009c06ab71380d6,0x3ff0000000000000,2
+np.float64,0x3fd08505efa10a0c,0x3ff3227b735b956d,2
+np.float64,0xffe3dfcecda7bf9d,0x0,2
+np.float64,0x8001f079bbc3e0f4,0x3ff0000000000000,2
+np.float64,0x3fddc706b6bb8e0c,0x3ff616d927987363,2
+np.float64,0xbfd151373ea2a26e,0x3fea870ba53ec126,2
+np.float64,0x7fe89533bfb12a66,0x7ff0000000000000,2
+np.float64,0xffed302cbc3a6059,0x0,2
+np.float64,0x3fd871cc28b0e398,0x3ff4d97d58c16ae2,2
+np.float64,0x7fbe9239683d2472,0x7ff0000000000000,2
+np.float64,0x848a445909149,0x3ff0000000000000,2
+np.float64,0x8007b104ce2f620a,0x3ff0000000000000,2
+np.float64,0x7fc2cd6259259ac4,0x7ff0000000000000,2
+np.float64,0xbfeadb640df5b6c8,0x3fe1e2b068de10af,2
+np.float64,0x800033b2f1a06767,0x3ff0000000000000,2
+np.float64,0x7fe54e5b7caa9cb6,0x7ff0000000000000,2
+np.float64,0x4f928f209f26,0x3ff0000000000000,2
+np.float64,0x8003c3dc6f2787ba,0x3ff0000000000000,2
+np.float64,0xbfd55a59daaab4b4,0x3fe9649d57b32b5d,2
+np.float64,0xffe3e2968d67c52c,0x0,2
+np.float64,0x80087434d550e86a,0x3ff0000000000000,2
+np.float64,0xffdde800083bd000,0x0,2
+np.float64,0xffe291f0542523e0,0x0,2
+np.float64,0xbfe1419bc3e28338,0x3fe6051d4f95a34a,2
+np.float64,0x3fd9d00ee1b3a01e,0x3ff5292bb8d5f753,2
+np.float64,0x3fdb720b60b6e417,0x3ff589d133625374,2
+np.float64,0xbfe3e21f0967c43e,0x3fe4cd4d02e3ef9a,2
+np.float64,0x7fd7e27f3dafc4fd,0x7ff0000000000000,2
+np.float64,0x3fd1cc2620a3984c,0x3ff366befbc38e3e,2
+np.float64,0x3fe78d05436f1a0b,0x3ffaa5ee4ea54b79,2
+np.float64,0x7e2acc84fc55a,0x3ff0000000000000,2
+np.float64,0x800ffb861c5ff70c,0x3ff0000000000000,2
+np.float64,0xffb2b0db1a2561b8,0x0,2
+np.float64,0xbfe80c2363701847,0x3fe301fdfe789576,2
+np.float64,0x7fe383c1c3e70783,0x7ff0000000000000,2
+np.float64,0xbfeefc02e6fdf806,0x3fe05b1a8528bf6c,2
+np.float64,0xbfe42c9268285925,0x3fe4abdc14793cb8,2
+np.float64,0x1,0x3ff0000000000000,2
+np.float64,0xa71c7ce94e390,0x3ff0000000000000,2
+np.float64,0x800ed4e6777da9cd,0x3ff0000000000000,2
+np.float64,0x3fde11b35d3c2367,0x3ff628bdc6dd1b78,2
+np.float64,0x3fef3964dbfe72ca,0x3fff777cae357608,2
+np.float64,0x3fefe369b7ffc6d4,0x3fffec357be508a3,2
+np.float64,0xbfdef1855f3de30a,0x3fe6e348c58e3fed,2
+np.float64,0x3fee0e2bc13c1c58,0x3ffeae1909c1b973,2
+np.float64,0xbfd31554ffa62aaa,0x3fea06628b2f048a,2
+np.float64,0x800dc56bcc7b8ad8,0x3ff0000000000000,2
+np.float64,0x7fbba01b8e374036,0x7ff0000000000000,2
+np.float64,0x7fd9737a92b2e6f4,0x7ff0000000000000,2
+np.float64,0x3feeae0fac3d5c1f,0x3fff1913705f1f07,2
+np.float64,0x3fdcc64fcdb98ca0,0x3ff5d9c3e5862972,2
+np.float64,0x3fdad9f83db5b3f0,0x3ff56674e81c1bd1,2
+np.float64,0x32b8797065710,0x3ff0000000000000,2
+np.float64,0x3fd20deae6241bd6,0x3ff37495bc057394,2
+np.float64,0x7fc899f0763133e0,0x7ff0000000000000,2
+np.float64,0x80045805fc08b00d,0x3ff0000000000000,2
+np.float64,0xbfcd8304cb3b0608,0x3feb4611f1eaa30c,2
+np.float64,0x3fd632a2fcac6544,0x3ff4592e1ea14fb0,2
+np.float64,0xffeeb066007d60cb,0x0,2
+np.float64,0x800bb12a42b76255,0x3ff0000000000000,2
+np.float64,0xbfe060fe1760c1fc,0x3fe6714640ab2574,2
+np.float64,0x80067ed737acfdaf,0x3ff0000000000000,2
+np.float64,0x3fd5ec3211abd864,0x3ff449adea82e73e,2
+np.float64,0x7fc4b2fdc22965fb,0x7ff0000000000000,2
+np.float64,0xff656afd002ad600,0x0,2
+np.float64,0xffeadefcdcb5bdf9,0x0,2
+np.float64,0x80052f18610a5e32,0x3ff0000000000000,2
+np.float64,0xbfd5b75c78ab6eb8,0x3fe94b15e0f39194,2
+np.float64,0xa4d3de2b49a7c,0x3ff0000000000000,2
+np.float64,0xbfe321c93de64392,0x3fe524ac7bbee401,2
+np.float64,0x3feb32f5def665ec,0x3ffcd6e4e5f9c271,2
+np.float64,0x7fe6b07e4ced60fc,0x7ff0000000000000,2
+np.float64,0x3fe013bb2de02776,0x3ff6aa4c32ab5ba4,2
+np.float64,0xbfeadd81d375bb04,0x3fe1e1de89b4aebf,2
+np.float64,0xffece7678079cece,0x0,2
+np.float64,0x3fe3d87b8467b0f8,0x3ff897cf22505e4d,2
+np.float64,0xffc4e3a05129c740,0x0,2
+np.float64,0xbfddee6b03bbdcd6,0x3fe723dd83ab49bd,2
+np.float64,0x3fcc4e2672389c4d,0x3ff2a680db769116,2
+np.float64,0x3fd8ed221ab1da44,0x3ff4f569aec8b850,2
+np.float64,0x80000a3538a0146b,0x3ff0000000000000,2
+np.float64,0x8004832eb109065e,0x3ff0000000000000,2
+np.float64,0xffdca83c60395078,0x0,2
+np.float64,0xffef551cda3eaa39,0x0,2
+np.float64,0x800fd95dd65fb2bc,0x3ff0000000000000,2
+np.float64,0x3ff0000000000000,0x4000000000000000,2
+np.float64,0xbfc06f5c4f20deb8,0x3fed466c17305ad8,2
+np.float64,0xbfeb01b5f476036c,0x3fe1d3de0f4211f4,2
+np.float64,0xbfdb2b9284365726,0x3fe7d7b02f790b05,2
+np.float64,0xff76ba83202d7500,0x0,2
+np.float64,0x3fd3f1c59ea7e38c,0x3ff3db96b3a0aaad,2
+np.float64,0x8b99ff6d17340,0x3ff0000000000000,2
+np.float64,0xbfeb383aa0f67075,0x3fe1bedcf2531c08,2
+np.float64,0x3fe321e35fa643c7,0x3ff83749a5d686ee,2
+np.float64,0xbfd863eb2130c7d6,0x3fe8923fcc39bac7,2
+np.float64,0x9e71dd333ce3c,0x3ff0000000000000,2
+np.float64,0x9542962b2a853,0x3ff0000000000000,2
+np.float64,0xba2c963b74593,0x3ff0000000000000,2
+np.float64,0x80019f4d0ca33e9b,0x3ff0000000000000,2
+np.float64,0xffde3e39a73c7c74,0x0,2
+np.float64,0x800258ae02c4b15d,0x3ff0000000000000,2
+np.float64,0xbfd99a535a3334a6,0x3fe8402f3a0662a5,2
+np.float64,0xe6c62143cd8c4,0x3ff0000000000000,2
+np.float64,0x7fbcc828f0399051,0x7ff0000000000000,2
+np.float64,0xbfe42e3596285c6b,0x3fe4ab2066d66071,2
+np.float64,0xffe2ee42d365dc85,0x0,2
+np.float64,0x3fe1f98abea3f315,0x3ff79dc68002a80b,2
+np.float64,0x7fd7225891ae44b0,0x7ff0000000000000,2
+np.float64,0x477177408ee30,0x3ff0000000000000,2
+np.float64,0xbfe16a7e2162d4fc,0x3fe5f1a5c745385d,2
+np.float64,0xbf98aaee283155e0,0x3fef785952e9c089,2
+np.float64,0x7fd7c14a8daf8294,0x7ff0000000000000,2
+np.float64,0xf7e7713defcee,0x3ff0000000000000,2
+np.float64,0x800769aa11aed355,0x3ff0000000000000,2
+np.float64,0xbfed30385e3a6071,0x3fe10135a3bd9ae6,2
+np.float64,0x3fe6dd7205edbae4,0x3ffa4155899efd70,2
+np.float64,0x800d705d26bae0ba,0x3ff0000000000000,2
+np.float64,0xa443ac1f48876,0x3ff0000000000000,2
+np.float64,0xbfec8cfec43919fe,0x3fe13dbf966e6633,2
+np.float64,0x7fd246efaa248dde,0x7ff0000000000000,2
+np.float64,0x800f2ad14afe55a3,0x3ff0000000000000,2
+np.float64,0x800487a894c90f52,0x3ff0000000000000,2
+np.float64,0x80014c4f19e2989f,0x3ff0000000000000,2
+np.float64,0x3fc11f265f223e4d,0x3ff18def05c971e5,2
+np.float64,0xffeb6d565776daac,0x0,2
+np.float64,0x7fd5ca5df8ab94bb,0x7ff0000000000000,2
+np.float64,0xbfe33de4fde67bca,0x3fe517d0e212cd1c,2
+np.float64,0xbfd1c738e5a38e72,0x3fea6539e9491693,2
+np.float64,0xbfec1d8c33b83b18,0x3fe16790fbca0c65,2
+np.float64,0xbfeecb464b7d968d,0x3fe06c67e2aefa55,2
+np.float64,0xbfd621dbf1ac43b8,0x3fe92dfa32d93846,2
+np.float64,0x80069a02860d3406,0x3ff0000000000000,2
+np.float64,0xbfe84f650e309eca,0x3fe2e661300f1975,2
+np.float64,0x7fc1d2cec523a59d,0x7ff0000000000000,2
+np.float64,0x3fd7706d79aee0db,0x3ff49fb033353dfe,2
+np.float64,0xffd94ba458329748,0x0,2
+np.float64,0x7fea98ba1a753173,0x7ff0000000000000,2
+np.float64,0xbfe756ba092ead74,0x3fe34d428d1857bc,2
+np.float64,0xffecfbd836b9f7b0,0x0,2
+np.float64,0x3fd211fbe5a423f8,0x3ff375711a3641e0,2
+np.float64,0x7fee24f7793c49ee,0x7ff0000000000000,2
+np.float64,0x7fe6a098886d4130,0x7ff0000000000000,2
+np.float64,0xbfd4ade909a95bd2,0x3fe99436524db1f4,2
+np.float64,0xbfeb704e6476e09d,0x3fe1a95be4a21bc6,2
+np.float64,0xffefc0f6627f81ec,0x0,2
+np.float64,0x7feff3f896ffe7f0,0x7ff0000000000000,2
+np.float64,0xa3f74edb47eea,0x3ff0000000000000,2
+np.float64,0xbfe0a551cf214aa4,0x3fe65027a7ff42e3,2
+np.float64,0x3fe164b23622c964,0x3ff7521c6225f51d,2
+np.float64,0x7fc258752324b0e9,0x7ff0000000000000,2
+np.float64,0x4739b3348e737,0x3ff0000000000000,2
+np.float64,0xb0392b1d60726,0x3ff0000000000000,2
+np.float64,0x7fe26f42e5e4de85,0x7ff0000000000000,2
+np.float64,0x8004601f87e8c040,0x3ff0000000000000,2
+np.float64,0xffe92ce37b3259c6,0x0,2
+np.float64,0x3fe620da3a6c41b4,0x3ff9d6ee3d005466,2
+np.float64,0x3fd850cfa2b0a1a0,0x3ff4d20bd249d411,2
+np.float64,0xffdcdfdfb5b9bfc0,0x0,2
+np.float64,0x800390297d672054,0x3ff0000000000000,2
+np.float64,0x3fde5864f6bcb0ca,0x3ff639bb9321f5ef,2
+np.float64,0x3fee484cec7c909a,0x3ffed4d2c6274219,2
+np.float64,0x7fe9b9a064b37340,0x7ff0000000000000,2
+np.float64,0xffe50028b8aa0051,0x0,2
+np.float64,0x3fe37774ade6eee9,0x3ff864558498a9a8,2
+np.float64,0x7fef83c724bf078d,0x7ff0000000000000,2
+np.float64,0xbfeb58450fb6b08a,0x3fe1b290556be73d,2
+np.float64,0x7fd7161475ae2c28,0x7ff0000000000000,2
+np.float64,0x3fece09621f9c12c,0x3ffde836a583bbdd,2
+np.float64,0x3fd045790ea08af2,0x3ff31554778fd4e2,2
+np.float64,0xbfe7c7dd6cef8fbb,0x3fe31e2eeda857fc,2
+np.float64,0xffe9632f5372c65e,0x0,2
+np.float64,0x800d4f3a703a9e75,0x3ff0000000000000,2
+np.float64,0xffea880e4df5101c,0x0,2
+np.float64,0xbfeb7edc4ff6fdb8,0x3fe1a3cb5dc33594,2
+np.float64,0xbfcaae4bab355c98,0x3febb1ee65e16b58,2
+np.float64,0xbfde598a19bcb314,0x3fe709145eafaaf8,2
+np.float64,0x3feefb6d78fdf6db,0x3fff4d5c8c68e39a,2
+np.float64,0x13efc75427dfa,0x3ff0000000000000,2
+np.float64,0xffe26f65c064decb,0x0,2
+np.float64,0xbfed5c1addfab836,0x3fe0f1133bd2189a,2
+np.float64,0x7fe7a7cf756f4f9e,0x7ff0000000000000,2
+np.float64,0xffc681702e2d02e0,0x0,2
+np.float64,0x8003d6ab5067ad57,0x3ff0000000000000,2
+np.float64,0xffa695f1342d2be0,0x0,2
+np.float64,0xbfcf8857db3f10b0,0x3feafa14da8c29a4,2
+np.float64,0xbfe8ca06be71940e,0x3fe2b46f6d2c64b4,2
+np.float64,0x3451c74468a3a,0x3ff0000000000000,2
+np.float64,0x3fde47d5f6bc8fac,0x3ff635bf8e024716,2
+np.float64,0xffda159d5db42b3a,0x0,2
+np.float64,0x7fef9fecaa3f3fd8,0x7ff0000000000000,2
+np.float64,0x3fd4e745e3a9ce8c,0x3ff410a9cb6fd8bf,2
+np.float64,0xffef57019b3eae02,0x0,2
+np.float64,0xbfe6604f4f6cc09e,0x3fe3b55de43c626d,2
+np.float64,0xffe066a424a0cd48,0x0,2
+np.float64,0x3fd547de85aa8fbc,0x3ff425b2a7a16675,2
+np.float64,0xffb3c69280278d28,0x0,2
+np.float64,0xffebe0b759f7c16e,0x0,2
+np.float64,0x3fefc84106ff9082,0x3fffd973687337d8,2
+np.float64,0x501c42a4a0389,0x3ff0000000000000,2
+np.float64,0x7feb45d13eb68ba1,0x7ff0000000000000,2
+np.float64,0xbfb16a8c2e22d518,0x3fee86a9c0f9291a,2
+np.float64,0x3be327b877c66,0x3ff0000000000000,2
+np.float64,0x7fe4a58220694b03,0x7ff0000000000000,2
+np.float64,0x3fe0286220a050c4,0x3ff6b472157ab8f2,2
+np.float64,0x3fc9381825327030,0x3ff2575fbea2bf5d,2
+np.float64,0xbfd1af7ee8a35efe,0x3fea6c032cf7e669,2
+np.float64,0xbfea9b0f39b5361e,0x3fe1fbae14b40b4d,2
+np.float64,0x39efe4aa73dfd,0x3ff0000000000000,2
+np.float64,0xffeb06fdc8360dfb,0x0,2
+np.float64,0xbfda481e72b4903c,0x3fe812b4b08d4884,2
+np.float64,0xbfd414ba5ba82974,0x3fe9bec9474bdfe6,2
+np.float64,0x7fe707177b6e0e2e,0x7ff0000000000000,2
+np.float64,0x8000000000000001,0x3ff0000000000000,2
+np.float64,0xbfede6a75bbbcd4f,0x3fe0be874cccd399,2
+np.float64,0x8006cdb577cd9b6c,0x3ff0000000000000,2
+np.float64,0x800051374f20a26f,0x3ff0000000000000,2
+np.float64,0x3fe5cba8c96b9752,0x3ff9a76b3adcc122,2
+np.float64,0xbfee3933487c7267,0x3fe0a0b190f9609a,2
+np.float64,0x3fd574b8d8aae970,0x3ff42f7e83de1af9,2
+np.float64,0xba5db72b74bb7,0x3ff0000000000000,2
+np.float64,0x3fa9bf512c337ea0,0x3ff0914a7f743a94,2
+np.float64,0xffe8cb736c3196e6,0x0,2
+np.float64,0x3761b2f06ec37,0x3ff0000000000000,2
+np.float64,0x8b4d4433169a9,0x3ff0000000000000,2
+np.float64,0x800f0245503e048b,0x3ff0000000000000,2
+np.float64,0x7fb20d54ac241aa8,0x7ff0000000000000,2
+np.float64,0x3fdf26666b3e4ccd,0x3ff66b8995142017,2
+np.float64,0xbfcbf2a83737e550,0x3feb8173a7b9d6b5,2
+np.float64,0x3fd31572a0a62ae5,0x3ff3ac6c94313dcd,2
+np.float64,0x7fb6c2807a2d8500,0x7ff0000000000000,2
+np.float64,0x800799758f2f32ec,0x3ff0000000000000,2
+np.float64,0xe72f1f6bce5e4,0x3ff0000000000000,2
+np.float64,0x3fe0e0f223a1c1e4,0x3ff70fed5b761673,2
+np.float64,0x3fe6d4f133eda9e2,0x3ffa3c8000c169eb,2
+np.float64,0xbfe1ccc3d8639988,0x3fe5c32148bedbda,2
+np.float64,0x3fea71c53574e38a,0x3ffc5f31201fe9be,2
+np.float64,0x9e0323eb3c065,0x3ff0000000000000,2
+np.float64,0x8005cc79a5cb98f4,0x3ff0000000000000,2
+np.float64,0x1dace1f83b59d,0x3ff0000000000000,2
+np.float64,0x10000000000000,0x3ff0000000000000,2
+np.float64,0xbfdef50830bdea10,0x3fe6e269fc17ebef,2
+np.float64,0x8010000000000000,0x3ff0000000000000,2
+np.float64,0xbfdfa82192bf5044,0x3fe6b6313ee0a095,2
+np.float64,0x3fd9398fe2b27320,0x3ff506ca2093c060,2
+np.float64,0x8002721fe664e441,0x3ff0000000000000,2
+np.float64,0x800c04166ad8082d,0x3ff0000000000000,2
+np.float64,0xffec3918b3387230,0x0,2
+np.float64,0x3fec62d5dfb8c5ac,0x3ffd972ea4a54b32,2
+np.float64,0x3fe7e42a0b6fc854,0x3ffad86b0443181d,2
+np.float64,0x3fc0aff5f3215fec,0x3ff1836058d4d210,2
+np.float64,0xbf82ff68a025fec0,0x3fefcb7f06862dce,2
+np.float64,0xae2e35195c5c7,0x3ff0000000000000,2
+np.float64,0x3fece3bddf79c77c,0x3ffdea41fb1ba8fa,2
+np.float64,0xbfa97b947832f730,0x3feeea34ebedbbd2,2
+np.float64,0xbfdfb1b1ce3f6364,0x3fe6b3d72871335c,2
+np.float64,0xbfe61a4f24ac349e,0x3fe3d356bf991b06,2
+np.float64,0x7fe23117a5e4622e,0x7ff0000000000000,2
+np.float64,0x800552a8cccaa552,0x3ff0000000000000,2
+np.float64,0x625b4d0ac4b6a,0x3ff0000000000000,2
+np.float64,0x3f86cf15702d9e00,0x3ff01fbe0381676d,2
+np.float64,0x800d7d1b685afa37,0x3ff0000000000000,2
+np.float64,0x3fe2cb6e40a596dd,0x3ff80a1a562f7fc9,2
+np.float64,0x3fe756eb8e2eadd7,0x3ffa86c638aad07d,2
+np.float64,0x800dc9a5513b934b,0x3ff0000000000000,2
+np.float64,0xbfbbdd118a37ba20,0x3fedacb4624f3cee,2
+np.float64,0x800de01f8efbc03f,0x3ff0000000000000,2
+np.float64,0x800da1a3fe9b4348,0x3ff0000000000000,2
+np.float64,0xbf87d8c7602fb180,0x3fefbe2614998ab6,2
+np.float64,0xbfdfff6141bffec2,0x3fe6a0c54d9f1bc8,2
+np.float64,0xee8fbba5dd1f8,0x3ff0000000000000,2
+np.float64,0x3fe79dc93e6f3b92,0x3ffaaf9d7d955b2c,2
+np.float64,0xffedd4b3d07ba967,0x0,2
+np.float64,0x800905dfc1720bc0,0x3ff0000000000000,2
+np.float64,0x3fd9e483b8b3c907,0x3ff52ddc6c950e7f,2
+np.float64,0xe34ffefdc6a00,0x3ff0000000000000,2
+np.float64,0x2168e62242d1e,0x3ff0000000000000,2
+np.float64,0x800349950e26932b,0x3ff0000000000000,2
+np.float64,0x7fc50da8532a1b50,0x7ff0000000000000,2
+np.float64,0xae1a4d115c34a,0x3ff0000000000000,2
+np.float64,0xa020f0b74041e,0x3ff0000000000000,2
+np.float64,0x3fd2aa2f77a5545f,0x3ff3959f09519a25,2
+np.float64,0x3fbfefc3223fdf86,0x3ff171f3df2d408b,2
+np.float64,0xbfea9fc340b53f86,0x3fe1f9d92b712654,2
+np.float64,0xffe9b920a5337240,0x0,2
+np.float64,0xbfe2eb0265e5d605,0x3fe53dd195782de3,2
+np.float64,0x7fb932c70e32658d,0x7ff0000000000000,2
+np.float64,0x3fda816bfcb502d8,0x3ff551f8d5c84c82,2
+np.float64,0x3fed68cbe9fad198,0x3ffe40f6692d5693,2
+np.float64,0x32df077665be2,0x3ff0000000000000,2
+np.float64,0x7fdc9c2f3539385d,0x7ff0000000000000,2
+np.float64,0x7fe71091a2ee2122,0x7ff0000000000000,2
+np.float64,0xbfe68106c46d020e,0x3fe3a76b56024c2c,2
+np.float64,0xffcf0572823e0ae4,0x0,2
+np.float64,0xbfeeab341fbd5668,0x3fe077d496941cda,2
+np.float64,0x7fe7ada0d2af5b41,0x7ff0000000000000,2
+np.float64,0xffacdef2a439bde0,0x0,2
+np.float64,0x3fe4200f3128401e,0x3ff8be0ddf30fd1e,2
+np.float64,0xffd9022a69320454,0x0,2
+np.float64,0xbfe8e06914f1c0d2,0x3fe2ab5fe7fffb5a,2
+np.float64,0x3fc4b976602972ed,0x3ff1e6786fa7a890,2
+np.float64,0xbfd784c105af0982,0x3fe8cdeb1cdbd57e,2
+np.float64,0x7feb20a20eb64143,0x7ff0000000000000,2
+np.float64,0xbfc87dd83630fbb0,0x3fec067c1e7e6983,2
+np.float64,0x7fe5400cbe6a8018,0x7ff0000000000000,2
+np.float64,0xbfb4a1f5e22943e8,0x3fee42e6c81559a9,2
+np.float64,0x3fe967c575f2cf8a,0x3ffbbd8bc0d5c50d,2
+np.float64,0xbfeb059cf4760b3a,0x3fe1d25c592c4dab,2
+np.float64,0xbfeef536d5bdea6e,0x3fe05d832c15c64a,2
+np.float64,0x3fa90b3f6432167f,0x3ff08d410dd732cc,2
+np.float64,0xbfeaff265e75fe4d,0x3fe1d4db3fb3208d,2
+np.float64,0x6d93d688db27b,0x3ff0000000000000,2
+np.float64,0x800ab9b4ea55736a,0x3ff0000000000000,2
+np.float64,0x3fd444b39d288967,0x3ff3ed749d48d444,2
+np.float64,0xbfd5f2c0d0abe582,0x3fe93ad6124d88e7,2
+np.float64,0x3fea8fd915f51fb2,0x3ffc71b32cb92d60,2
+np.float64,0xbfd23d6491a47aca,0x3fea43875709b0f0,2
+np.float64,0xffe76f75ce6edeeb,0x0,2
+np.float64,0x1f5670da3eacf,0x3ff0000000000000,2
+np.float64,0x8000d89c9621b13a,0x3ff0000000000000,2
+np.float64,0x3fedb51c52bb6a39,0x3ffe732279c228ff,2
+np.float64,0x7f99215ac83242b5,0x7ff0000000000000,2
+np.float64,0x742a6864e854e,0x3ff0000000000000,2
+np.float64,0xbfe02fb340205f66,0x3fe689495f9164e3,2
+np.float64,0x7fef4c12b0fe9824,0x7ff0000000000000,2
+np.float64,0x3fd40e17c2a81c30,0x3ff3e1aee8ed972f,2
+np.float64,0x7fdcd264e939a4c9,0x7ff0000000000000,2
+np.float64,0x3fdb675838b6ceb0,0x3ff587526241c550,2
+np.float64,0x3fdf1a4081be3480,0x3ff66896a18c2385,2
+np.float64,0xbfea5082b874a106,0x3fe218cf8f11be13,2
+np.float64,0xffe1a0ebf7e341d8,0x0,2
+np.float64,0x3fed0a2222ba1444,0x3ffe032ce928ae7d,2
+np.float64,0xffeae036da75c06d,0x0,2
+np.float64,0x5b05fc8ab60c0,0x3ff0000000000000,2
+np.float64,0x7fd8aae5f03155cb,0x7ff0000000000000,2
+np.float64,0xbfd0b4d9fda169b4,0x3feab41e58b6ccb7,2
+np.float64,0xffdcaffa57395ff4,0x0,2
+np.float64,0xbfcbf1455437e28c,0x3feb81a884182c5d,2
+np.float64,0x3f9d6700b83ace01,0x3ff0525657db35d4,2
+np.float64,0x4fd5b0b29fab7,0x3ff0000000000000,2
+np.float64,0x3fe9af2df5b35e5c,0x3ffbe895684df916,2
+np.float64,0x800dfd41f9dbfa84,0x3ff0000000000000,2
+np.float64,0xbf2a30457e546,0x3ff0000000000000,2
+np.float64,0x7fc6be37182d7c6d,0x7ff0000000000000,2
+np.float64,0x800e0f9788dc1f2f,0x3ff0000000000000,2
+np.float64,0x8006890c704d121a,0x3ff0000000000000,2
+np.float64,0xffecb1a7cbb9634f,0x0,2
+np.float64,0xffb35c330426b868,0x0,2
+np.float64,0x7fe8f2ba8a71e574,0x7ff0000000000000,2
+np.float64,0xf3ccff8fe79a0,0x3ff0000000000000,2
+np.float64,0x3fdf19a84e3e3351,0x3ff66871b17474c1,2
+np.float64,0x80049a662d0934cd,0x3ff0000000000000,2
+np.float64,0xdf5bb4bbbeb77,0x3ff0000000000000,2
+np.float64,0x8005eca030cbd941,0x3ff0000000000000,2
+np.float64,0xffe5f239586be472,0x0,2
+np.float64,0xbfc4526a0728a4d4,0x3fecaa52fbf5345e,2
+np.float64,0xbfe8f1ecda31e3da,0x3fe2a44c080848b3,2
+np.float64,0x3feebd32f4bd7a66,0x3fff234788938c3e,2
+np.float64,0xffd6ca04e9ad940a,0x0,2
+np.float64,0x7ff0000000000000,0x7ff0000000000000,2
+np.float64,0xbfd4c560a9a98ac2,0x3fe98db6d97442fc,2
+np.float64,0x8005723471cae46a,0x3ff0000000000000,2
+np.float64,0xbfeb278299764f05,0x3fe1c54b48f8ba4b,2
+np.float64,0x8007907b376f20f7,0x3ff0000000000000,2
+np.float64,0x7fe9c2fd01b385f9,0x7ff0000000000000,2
+np.float64,0x7fdaa37368b546e6,0x7ff0000000000000,2
+np.float64,0xbfe6d0f3786da1e7,0x3fe38582271cada7,2
+np.float64,0xbfea9b77823536ef,0x3fe1fb8575cd1b7d,2
+np.float64,0xbfe90ac38bf21587,0x3fe29a471b47a2e8,2
+np.float64,0xbfe9c51844738a30,0x3fe24fc8de03ea84,2
+np.float64,0x3fe45a9013a8b520,0x3ff8dd7c80f1cf75,2
+np.float64,0xbfe5780551eaf00a,0x3fe419832a6a4c56,2
+np.float64,0xffefffffffffffff,0x0,2
+np.float64,0x7fe3778c84a6ef18,0x7ff0000000000000,2
+np.float64,0xbfdc8a60413914c0,0x3fe77dc55b85028f,2
+np.float64,0xef47ae2fde8f6,0x3ff0000000000000,2
+np.float64,0x8001269fa4c24d40,0x3ff0000000000000,2
+np.float64,0x3fe9d2d39e73a5a7,0x3ffbfe2a66c4148e,2
+np.float64,0xffee61f528fcc3e9,0x0,2
+np.float64,0x3fe8a259ab7144b3,0x3ffb47e797a34bd2,2
+np.float64,0x3f906d610820dac0,0x3ff02dccda8e1a75,2
+np.float64,0x3fe70739f32e0e74,0x3ffa59232f4fcd07,2
+np.float64,0x3fe6b7f5e6ad6fec,0x3ffa2c0cc54f2c16,2
+np.float64,0x95a91a792b524,0x3ff0000000000000,2
+np.float64,0xbfedf6fcf57bedfa,0x3fe0b89bb40081cc,2
+np.float64,0xbfa4d2de9c29a5c0,0x3fef1c485678d657,2
+np.float64,0x3fe130470d22608e,0x3ff737b0be409a38,2
+np.float64,0x3fcf8035423f006b,0x3ff2f9d7c3c6a302,2
+np.float64,0xffe5995a3eab32b4,0x0,2
+np.float64,0xffca68c63034d18c,0x0,2
+np.float64,0xff9d53af903aa760,0x0,2
+np.float64,0x800563f1de6ac7e4,0x3ff0000000000000,2
+np.float64,0x7fce284fa63c509e,0x7ff0000000000000,2
+np.float64,0x7fb2a3959a25472a,0x7ff0000000000000,2
+np.float64,0x7fdbe2652f37c4c9,0x7ff0000000000000,2
+np.float64,0x800d705bbc1ae0b8,0x3ff0000000000000,2
+np.float64,0x7fd9bd2347b37a46,0x7ff0000000000000,2
+np.float64,0x3fcac3c0fb358782,0x3ff27ed62d6c8221,2
+np.float64,0x800110691ec220d3,0x3ff0000000000000,2
+np.float64,0x3fef79a8157ef350,0x3fffa368513eb909,2
+np.float64,0x7fe8bd2f0e317a5d,0x7ff0000000000000,2
+np.float64,0x7fd3040e60a6081c,0x7ff0000000000000,2
+np.float64,0xffea50723234a0e4,0x0,2
+np.float64,0xbfe6220054ac4400,0x3fe3d00961238a93,2
+np.float64,0x3f9eddd8c83dbbc0,0x3ff0567b0c73005a,2
+np.float64,0xbfa4a062c42940c0,0x3fef1e68badde324,2
+np.float64,0xbfd077ad4720ef5a,0x3feac5d577581d07,2
+np.float64,0x7fdfd4b025bfa95f,0x7ff0000000000000,2
+np.float64,0xd00d3cf3a01a8,0x3ff0000000000000,2
+np.float64,0x7fe3010427260207,0x7ff0000000000000,2
+np.float64,0x22ea196645d44,0x3ff0000000000000,2
+np.float64,0x7fd747e8cd2e8fd1,0x7ff0000000000000,2
+np.float64,0xd50665e7aa0cd,0x3ff0000000000000,2
+np.float64,0x7fe1da580ae3b4af,0x7ff0000000000000,2
+np.float64,0xffeb218ecfb6431d,0x0,2
+np.float64,0xbf887d0dd030fa00,0x3fefbc6252c8b354,2
+np.float64,0x3fcaa31067354621,0x3ff27b904c07e07f,2
+np.float64,0x7fe698cc4ded3198,0x7ff0000000000000,2
+np.float64,0x1c40191a38804,0x3ff0000000000000,2
+np.float64,0x80086fd20e30dfa4,0x3ff0000000000000,2
+np.float64,0x7fed34d5eaba69ab,0x7ff0000000000000,2
+np.float64,0xffd00b52622016a4,0x0,2
+np.float64,0x3f80abcdb021579b,0x3ff0172d27945851,2
+np.float64,0x3fe614cfd66c29a0,0x3ff9d031e1839191,2
+np.float64,0x80021d71c8843ae4,0x3ff0000000000000,2
+np.float64,0x800bc2adc657855c,0x3ff0000000000000,2
+np.float64,0x6b9fec1cd73fe,0x3ff0000000000000,2
+np.float64,0xffd9093b5f321276,0x0,2
+np.float64,0x800d3c6c77fa78d9,0x3ff0000000000000,2
+np.float64,0xffe80fc1cbf01f83,0x0,2
+np.float64,0xffbffbaf2a3ff760,0x0,2
+np.float64,0x3fea1ed29eb43da5,0x3ffc2c64ec0e17a3,2
+np.float64,0x7ff4000000000000,0x7ffc000000000000,2
+np.float64,0x3fd944a052328941,0x3ff5094f4c43ecca,2
+np.float64,0x800b1f9416163f29,0x3ff0000000000000,2
+np.float64,0x800f06bf33de0d7e,0x3ff0000000000000,2
+np.float64,0xbfdbf0d226b7e1a4,0x3fe7a4f73793d95b,2
+np.float64,0xffe7306c30ae60d8,0x0,2
+np.float64,0x7fe991accfb32359,0x7ff0000000000000,2
+np.float64,0x3fcc0040d2380082,0x3ff29ea47e4f07d4,2
+np.float64,0x7fefffffffffffff,0x7ff0000000000000,2
+np.float64,0x0,0x3ff0000000000000,2
+np.float64,0x3fe1423f7be2847e,0x3ff740bc1d3b20f8,2
+np.float64,0xbfeae3a3cab5c748,0x3fe1df7e936f8504,2
+np.float64,0x800b2da7d6165b50,0x3ff0000000000000,2
+np.float64,0x800b2404fcd6480a,0x3ff0000000000000,2
+np.float64,0x6fcbcf88df97b,0x3ff0000000000000,2
+np.float64,0xa248c0e14492,0x3ff0000000000000,2
+np.float64,0xffd255776824aaee,0x0,2
+np.float64,0x80057b3effeaf67f,0x3ff0000000000000,2
+np.float64,0x3feb0b07d7761610,0x3ffcbdfe1be5a594,2
+np.float64,0x924e1019249c2,0x3ff0000000000000,2
+np.float64,0x80074307e80e8611,0x3ff0000000000000,2
+np.float64,0xffb207fa46240ff8,0x0,2
+np.float64,0x95ac388d2b587,0x3ff0000000000000,2
+np.float64,0xbff0000000000000,0x3fe0000000000000,2
+np.float64,0x3fd38b6a492716d5,0x3ff3c59f62b5add5,2
+np.float64,0x7fe49362c3e926c5,0x7ff0000000000000,2
+np.float64,0x7fe842889db08510,0x7ff0000000000000,2
+np.float64,0xbfba6003e834c008,0x3fedcb620a2d9856,2
+np.float64,0xffe7e782bd6fcf05,0x0,2
+np.float64,0x7fd9b93d9433727a,0x7ff0000000000000,2
+np.float64,0x7fc8fcb61d31f96b,0x7ff0000000000000,2
+np.float64,0xbfef9be8db3f37d2,0x3fe022d603b81dc2,2
+np.float64,0x6f4fc766de9fa,0x3ff0000000000000,2
+np.float64,0xbfe93016f132602e,0x3fe28b42d782d949,2
+np.float64,0x3fe10e52b8e21ca5,0x3ff726a38b0bb895,2
+np.float64,0x3fbbba0ae6377416,0x3ff13f56084a9da3,2
+np.float64,0x3fe09e42ece13c86,0x3ff6eeb57e775e24,2
+np.float64,0x800942e39fb285c8,0x3ff0000000000000,2
+np.float64,0xffe5964370eb2c86,0x0,2
+np.float64,0x3fde479f32bc8f3e,0x3ff635b2619ba53a,2
+np.float64,0x3fe826e187f04dc3,0x3ffaff52b79c3a08,2
+np.float64,0x3febcbf1eab797e4,0x3ffd37152e5e2598,2
+np.float64,0x3fa0816a202102d4,0x3ff05c8e6a8b00d5,2
+np.float64,0xbd005ccb7a00c,0x3ff0000000000000,2
+np.float64,0x44c12fdc89827,0x3ff0000000000000,2
+np.float64,0xffc8fdffa431fc00,0x0,2
+np.float64,0xffeb4f5a87b69eb4,0x0,2
+np.float64,0xbfb07e7f8420fd00,0x3fee9a32924fe6a0,2
+np.float64,0xbfbd9d1bb63b3a38,0x3fed88ca81e5771c,2
+np.float64,0x8008682a74f0d055,0x3ff0000000000000,2
+np.float64,0x3fdeedbc7b3ddb79,0x3ff65dcb7c55f4dc,2
+np.float64,0x8009e889c613d114,0x3ff0000000000000,2
+np.float64,0x3faea831f43d5064,0x3ff0ad935e890e49,2
+np.float64,0xf0af1703e15e3,0x3ff0000000000000,2
+np.float64,0xffec06c4a5f80d88,0x0,2
+np.float64,0x53a1cc0ca743a,0x3ff0000000000000,2
+np.float64,0x7fd10c9eea22193d,0x7ff0000000000000,2
+np.float64,0xbfd48a6bf0a914d8,0x3fe99e0d109f2bac,2
+np.float64,0x3fd6dfe931adbfd4,0x3ff47f81c2dfc5d3,2
+np.float64,0x3fed20e86b7a41d0,0x3ffe11fecc7bc686,2
+np.float64,0xbfea586818b4b0d0,0x3fe215b7747d5cb8,2
+np.float64,0xbfd4ad3e20295a7c,0x3fe99465ab8c3275,2
+np.float64,0x3fd6619ee4acc33e,0x3ff4638b7b80c08a,2
+np.float64,0x3fdf6fcb63bedf97,0x3ff67d62fd3d560c,2
+np.float64,0x800a9191e7152324,0x3ff0000000000000,2
+np.float64,0x3fd2ff3c0da5fe78,0x3ff3a7b17e892a28,2
+np.float64,0x8003dbf1f327b7e5,0x3ff0000000000000,2
+np.float64,0xffea6b89a934d712,0x0,2
+np.float64,0x7fcfb879043f70f1,0x7ff0000000000000,2
+np.float64,0xea6a84dbd4d51,0x3ff0000000000000,2
+np.float64,0x800ec97a815d92f5,0x3ff0000000000000,2
+np.float64,0xffe304c3a8660987,0x0,2
+np.float64,0xbfefe24dd3ffc49c,0x3fe00a4e065be96d,2
+np.float64,0xffd3cc8c00a79918,0x0,2
+np.float64,0x95be8b7b2b7d2,0x3ff0000000000000,2
+np.float64,0x7fe20570cba40ae1,0x7ff0000000000000,2
+np.float64,0x7f97a06da02f40da,0x7ff0000000000000,2
+np.float64,0xffe702b9522e0572,0x0,2
+np.float64,0x3fada2d8543b45b1,0x3ff0a7adc4201e08,2
+np.float64,0x235e6acc46bce,0x3ff0000000000000,2
+np.float64,0x3fea6bc28ef4d786,0x3ffc5b7fc68fddac,2
+np.float64,0xffdbc9f505b793ea,0x0,2
+np.float64,0xffe98b137ff31626,0x0,2
+np.float64,0x800e26c6721c4d8d,0x3ff0000000000000,2
+np.float64,0x80080de445301bc9,0x3ff0000000000000,2
+np.float64,0x37e504a86fca1,0x3ff0000000000000,2
+np.float64,0x8002f5f60325ebed,0x3ff0000000000000,2
+np.float64,0x5c8772feb90ef,0x3ff0000000000000,2
+np.float64,0xbfe021abb4604358,0x3fe69023a51d22b8,2
+np.float64,0x3fde744f8fbce8a0,0x3ff64074dc84edd7,2
+np.float64,0xbfdd92899f3b2514,0x3fe73aefd9701858,2
+np.float64,0x7fc1ad5c51235ab8,0x7ff0000000000000,2
+np.float64,0xaae2f98955c5f,0x3ff0000000000000,2
+np.float64,0x7f9123d5782247aa,0x7ff0000000000000,2
+np.float64,0xbfe3f8e94b67f1d2,0x3fe4c30ab28e9cb7,2
+np.float64,0x7fdaba8b4cb57516,0x7ff0000000000000,2
+np.float64,0x7fefc85cfeff90b9,0x7ff0000000000000,2
+np.float64,0xffb83b4f523076a0,0x0,2
+np.float64,0xbfe888a68c71114d,0x3fe2ceff17c203d1,2
+np.float64,0x800de1dac4bbc3b6,0x3ff0000000000000,2
+np.float64,0xbfe4f27f09e9e4fe,0x3fe453f9af407eac,2
+np.float64,0xffe3d2713467a4e2,0x0,2
+np.float64,0xbfebaab840375570,0x3fe1931131b98842,2
+np.float64,0x93892a1b27126,0x3ff0000000000000,2
+np.float64,0x1e8e7f983d1d1,0x3ff0000000000000,2
+np.float64,0x3fecc950627992a0,0x3ffdd926f036add0,2
+np.float64,0xbfd41dfb1aa83bf6,0x3fe9bc34ece35b94,2
+np.float64,0x800aebfc6555d7f9,0x3ff0000000000000,2
+np.float64,0x7fe33ba52ca67749,0x7ff0000000000000,2
+np.float64,0xffe57c9b3feaf936,0x0,2
+np.float64,0x3fdd12464fba248c,0x3ff5ebc5598e6bd0,2
+np.float64,0xffe06d7f0fe0dafe,0x0,2
+np.float64,0x800e55b7fe9cab70,0x3ff0000000000000,2
+np.float64,0x3fd33803c8267008,0x3ff3b3cb78b2d642,2
+np.float64,0xe9cab8a1d3957,0x3ff0000000000000,2
+np.float64,0x3fb38ac166271580,0x3ff0de906947c0f0,2
+np.float64,0xbfd67aa552acf54a,0x3fe915cf64a389fd,2
+np.float64,0x1db96daa3b72f,0x3ff0000000000000,2
+np.float64,0xbfee9f08f4fd3e12,0x3fe07c2c615add3c,2
+np.float64,0xf14f6d65e29ee,0x3ff0000000000000,2
+np.float64,0x800bce089e179c12,0x3ff0000000000000,2
+np.float64,0xffc42dcc37285b98,0x0,2
+np.float64,0x7fd5f37063abe6e0,0x7ff0000000000000,2
+np.float64,0xbfd943c2cbb28786,0x3fe856f6452ec753,2
+np.float64,0x8ddfbc091bbf8,0x3ff0000000000000,2
+np.float64,0xbfe153491e22a692,0x3fe5fcb075dbbd5d,2
+np.float64,0xffe7933999ef2672,0x0,2
+np.float64,0x7ff8000000000000,0x7ff8000000000000,2
+np.float64,0x8000000000000000,0x3ff0000000000000,2
+np.float64,0xbfe9154580b22a8b,0x3fe2960bac3a8220,2
+np.float64,0x800dc6dda21b8dbb,0x3ff0000000000000,2
+np.float64,0xbfb26225a824c448,0x3fee7239a457df81,2
+np.float64,0xbfd7b68c83af6d1a,0x3fe8c08e351ab468,2
+np.float64,0xffde01f7213c03ee,0x0,2
+np.float64,0x3fe54cbe0faa997c,0x3ff9614527191d72,2
+np.float64,0xbfd6bec3732d7d86,0x3fe90354909493de,2
+np.float64,0xbfef3c85bd7e790b,0x3fe0444f8c489ca6,2
+np.float64,0x899501b7132a0,0x3ff0000000000000,2
+np.float64,0xbfe17a456462f48b,0x3fe5ea2719a9a84b,2
+np.float64,0xffe34003b8668007,0x0,2
+np.float64,0x7feff6a3633fed46,0x7ff0000000000000,2
+np.float64,0x3fba597ecc34b2fe,0x3ff12ee72e4de474,2
+np.float64,0x4084c7b68109a,0x3ff0000000000000,2
+np.float64,0x3fad23bf4c3a4780,0x3ff0a4d06193ff6d,2
+np.float64,0xffd0fe2707a1fc4e,0x0,2
+np.float64,0xb96cb43f72d97,0x3ff0000000000000,2
+np.float64,0x7fc4d684d829ad09,0x7ff0000000000000,2
+np.float64,0x7fdc349226b86923,0x7ff0000000000000,2
+np.float64,0x7fd82851cd3050a3,0x7ff0000000000000,2
+np.float64,0x800cde0041b9bc01,0x3ff0000000000000,2
+np.float64,0x4e8caa1e9d196,0x3ff0000000000000,2
+np.float64,0xbfed06a6d2fa0d4e,0x3fe1108c3682b05a,2
+np.float64,0xffe8908122312102,0x0,2
+np.float64,0xffe56ed6d9aaddad,0x0,2
+np.float64,0x3fedd6db00fbadb6,0x3ffe896c68c4b26e,2
+np.float64,0x3fde31f9b4bc63f4,0x3ff6307e08f8b6ba,2
+np.float64,0x6bb963c2d772d,0x3ff0000000000000,2
+np.float64,0x787b7142f0f6f,0x3ff0000000000000,2
+np.float64,0x3fe6e4147c6dc829,0x3ffa451bbdece240,2
+np.float64,0x8003857401470ae9,0x3ff0000000000000,2
+np.float64,0xbfeae82c3c75d058,0x3fe1ddbd66e65aab,2
+np.float64,0x7fe174707c62e8e0,0x7ff0000000000000,2
+np.float64,0x80008d2545e11a4b,0x3ff0000000000000,2
+np.float64,0xbfecc2dce17985ba,0x3fe129ad4325985a,2
+np.float64,0xbfe1fa1daf63f43c,0x3fe5adcb0731a44b,2
+np.float64,0x7fcf2530203e4a5f,0x7ff0000000000000,2
+np.float64,0xbfea5cefe874b9e0,0x3fe213f134b61f4a,2
+np.float64,0x800103729f2206e6,0x3ff0000000000000,2
+np.float64,0xbfe8442ff7708860,0x3fe2eaf850faa169,2
+np.float64,0x8006c78e19ed8f1d,0x3ff0000000000000,2
+np.float64,0x3fc259589c24b2b1,0x3ff1abe6a4d28816,2
+np.float64,0xffed02b7b5ba056e,0x0,2
+np.float64,0xbfce0aa4fe3c1548,0x3feb32115d92103e,2
+np.float64,0x7fec06e78bf80dce,0x7ff0000000000000,2
+np.float64,0xbfe0960bbc612c18,0x3fe6578ab29b70d4,2
+np.float64,0x3fee45841cbc8b08,0x3ffed2f6ca808ad3,2
+np.float64,0xbfeb0f8ebef61f1e,0x3fe1ce86003044cd,2
+np.float64,0x8002c357358586af,0x3ff0000000000000,2
+np.float64,0x3fe9aa10cc735422,0x3ffbe57e294ce68b,2
+np.float64,0x800256c0a544ad82,0x3ff0000000000000,2
+np.float64,0x4de6e1449bcdd,0x3ff0000000000000,2
+np.float64,0x65e9bc9ccbd38,0x3ff0000000000000,2
+np.float64,0xbfe53b0fa9aa7620,0x3fe4341f0aa29bbc,2
+np.float64,0xbfcdd94cd13bb298,0x3feb3956acd2e2dd,2
+np.float64,0x8004a49b65a94938,0x3ff0000000000000,2
+np.float64,0x800d3d05deba7a0c,0x3ff0000000000000,2
+np.float64,0x3fe4e05bce69c0b8,0x3ff925f55602a7e0,2
+np.float64,0xffe391e3256723c6,0x0,2
+np.float64,0xbfe92f0f37b25e1e,0x3fe28bacc76ae753,2
+np.float64,0x3f990238d8320472,0x3ff045edd36e2d62,2
+np.float64,0xffed8d15307b1a2a,0x0,2
+np.float64,0x3fee82e01afd05c0,0x3ffefc09e8b9c2b7,2
+np.float64,0xffb2d94b2225b298,0x0,2
diff --git a/numpy/core/tests/data/umath-validation-set-expm1.csv b/numpy/core/tests/data/umath-validation-set-expm1.csv
new file mode 100644 (file)
index 0000000..732ae86
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0x80606724,0x80606724,3
+np.float32,0xbf16790f,0xbee38e14,3
+np.float32,0xbf1778a1,0xbee4a97f,3
+np.float32,0x7d4fc610,0x7f800000,3
+np.float32,0xbec30a20,0xbea230d5,3
+np.float32,0x3eae8a36,0x3ecffac5,3
+np.float32,0xbf1f08f1,0xbeece93c,3
+np.float32,0x80374376,0x80374376,3
+np.float32,0x3f2e04ca,0x3f793115,3
+np.float32,0x7e2c7e36,0x7f800000,3
+np.float32,0xbf686cae,0xbf18bcf0,3
+np.float32,0xbf5518cd,0xbf10a3da,3
+np.float32,0x807e233c,0x807e233c,3
+np.float32,0x7f4edd54,0x7f800000,3
+np.float32,0x7ed70088,0x7f800000,3
+np.float32,0x801675da,0x801675da,3
+np.float32,0x806735d5,0x806735d5,3
+np.float32,0xfe635fec,0xbf800000,3
+np.float32,0xfed88a0a,0xbf800000,3
+np.float32,0xff52c052,0xbf800000,3
+np.float32,0x7fc00000,0x7fc00000,3
+np.float32,0xff4f65f9,0xbf800000,3
+np.float32,0xfe0f6c20,0xbf800000,3
+np.float32,0x80322b30,0x80322b30,3
+np.float32,0xfb757000,0xbf800000,3
+np.float32,0x3c81e0,0x3c81e0,3
+np.float32,0x79d56a,0x79d56a,3
+np.float32,0x8029d7af,0x8029d7af,3
+np.float32,0x8058a593,0x8058a593,3
+np.float32,0x3f3a13c7,0x3f88c75c,3
+np.float32,0x2a6b05,0x2a6b05,3
+np.float32,0xbd64c960,0xbd5e83ae,3
+np.float32,0x80471052,0x80471052,3
+np.float32,0xbe5dd950,0xbe47766c,3
+np.float32,0xfd8f88f0,0xbf800000,3
+np.float32,0x75a4b7,0x75a4b7,3
+np.float32,0x3f726f2e,0x3fc9fb7d,3
+np.float32,0x3ed6795c,0x3f053115,3
+np.float32,0x17d7f5,0x17d7f5,3
+np.float32,0xbf4cf19b,0xbf0d094f,3
+np.float32,0x3e0ec532,0x3e1933c6,3
+np.float32,0xff084016,0xbf800000,3
+np.float32,0x800829aa,0x800829aa,3
+np.float32,0x806d7302,0x806d7302,3
+np.float32,0x7f59d9da,0x7f800000,3
+np.float32,0x15f8b9,0x15f8b9,3
+np.float32,0x803befb3,0x803befb3,3
+np.float32,0x525043,0x525043,3
+np.float32,0x51a647,0x51a647,3
+np.float32,0xbf1cfce4,0xbeeab3d9,3
+np.float32,0x3f1f27a4,0x3f5cb1d2,3
+np.float32,0xbebc3a04,0xbe9d8142,3
+np.float32,0xbeea548c,0xbebc07e5,3
+np.float32,0x3f47401c,0x3f96c2a3,3
+np.float32,0x806b1ea3,0x806b1ea3,3
+np.float32,0x3ea56bb8,0x3ec3450c,3
+np.float32,0x3f7b4963,0x3fd597b5,3
+np.float32,0x7f051fa0,0x7f800000,3
+np.float32,0x1d411c,0x1d411c,3
+np.float32,0xff0b6a35,0xbf800000,3
+np.float32,0xbead63c0,0xbe9314f7,3
+np.float32,0x3738be,0x3738be,3
+np.float32,0x3f138cc8,0x3f479155,3
+np.float32,0x800a539f,0x800a539f,3
+np.float32,0x801b0ebd,0x801b0ebd,3
+np.float32,0x318fcd,0x318fcd,3
+np.float32,0x3ed67556,0x3f052e06,3
+np.float32,0x702886,0x702886,3
+np.float32,0x80000001,0x80000001,3
+np.float32,0x70a174,0x70a174,3
+np.float32,0x4f9c66,0x4f9c66,3
+np.float32,0x3e3e1927,0x3e50e351,3
+np.float32,0x7eac9a4d,0x7f800000,3
+np.float32,0x4b7407,0x4b7407,3
+np.float32,0x7f5bd2fd,0x7f800000,3
+np.float32,0x3eaafc58,0x3ecaffbd,3
+np.float32,0xbc989360,0xbc9729e2,3
+np.float32,0x3f470e5c,0x3f968c7b,3
+np.float32,0x4c5672,0x4c5672,3
+np.float32,0xff2b2ee2,0xbf800000,3
+np.float32,0xbf28a104,0xbef7079b,3
+np.float32,0x2c6175,0x2c6175,3
+np.float32,0x3d7e4fb0,0x3d832f9f,3
+np.float32,0x763276,0x763276,3
+np.float32,0x3cf364,0x3cf364,3
+np.float32,0xbf7ace75,0xbf1fe48c,3
+np.float32,0xff19e858,0xbf800000,3
+np.float32,0x80504c70,0x80504c70,3
+np.float32,0xff390210,0xbf800000,3
+np.float32,0x8046a743,0x8046a743,3
+np.float32,0x80000000,0x80000000,3
+np.float32,0x806c51da,0x806c51da,3
+np.float32,0x806ab38f,0x806ab38f,3
+np.float32,0x3f3de863,0x3f8cc538,3
+np.float32,0x7f6d45bb,0x7f800000,3
+np.float32,0xfd16ec60,0xbf800000,3
+np.float32,0x80513cba,0x80513cba,3
+np.float32,0xbf68996b,0xbf18cefa,3
+np.float32,0xfe039f2c,0xbf800000,3
+np.float32,0x3f013207,0x3f280c55,3
+np.float32,0x7ef4bc07,0x7f800000,3
+np.float32,0xbe8b65ac,0xbe741069,3
+np.float32,0xbf7a8186,0xbf1fc7a6,3
+np.float32,0x802532e5,0x802532e5,3
+np.float32,0x32c7df,0x32c7df,3
+np.float32,0x3ce4dceb,0x3ce81701,3
+np.float32,0xfe801118,0xbf800000,3
+np.float32,0x3d905f20,0x3d9594fb,3
+np.float32,0xbe11ed28,0xbe080168,3
+np.float32,0x59e773,0x59e773,3
+np.float32,0x3e9a2547,0x3eb3dd57,3
+np.float32,0x7ecb7c67,0x7f800000,3
+np.float32,0x7f69a67e,0x7f800000,3
+np.float32,0xff121e11,0xbf800000,3
+np.float32,0x3f7917cb,0x3fd2ad8c,3
+np.float32,0xbf1a7da8,0xbee7fc0c,3
+np.float32,0x3f077e66,0x3f329c40,3
+np.float32,0x3ce8e040,0x3cec37b3,3
+np.float32,0xbf3f0b8e,0xbf069f4d,3
+np.float32,0x3f52f194,0x3fa3c9d6,3
+np.float32,0xbf0e7422,0xbeda80f2,3
+np.float32,0xfd67e230,0xbf800000,3
+np.float32,0xff14d9a9,0xbf800000,3
+np.float32,0x3f3546e3,0x3f83dc2b,3
+np.float32,0x3e152e3a,0x3e20983d,3
+np.float32,0x4a89a3,0x4a89a3,3
+np.float32,0x63217,0x63217,3
+np.float32,0xbeb9e2a8,0xbe9be153,3
+np.float32,0x7e9fa049,0x7f800000,3
+np.float32,0x7f58110c,0x7f800000,3
+np.float32,0x3e88290c,0x3e9bfba9,3
+np.float32,0xbf2cb206,0xbefb3494,3
+np.float32,0xff5880c4,0xbf800000,3
+np.float32,0x7ecff3ac,0x7f800000,3
+np.float32,0x3f4b3de6,0x3f9b23fd,3
+np.float32,0xbebd2048,0xbe9e208c,3
+np.float32,0xff08f7a2,0xbf800000,3
+np.float32,0xff473330,0xbf800000,3
+np.float32,0x1,0x1,3
+np.float32,0xbf5dc239,0xbf14584b,3
+np.float32,0x458e3f,0x458e3f,3
+np.float32,0xbdb8a650,0xbdb091f8,3
+np.float32,0xff336ffc,0xbf800000,3
+np.float32,0x3c60bd00,0x3c624966,3
+np.float32,0xbe16a4f8,0xbe0c1664,3
+np.float32,0x3f214246,0x3f60a0f0,3
+np.float32,0x7fa00000,0x7fe00000,3
+np.float32,0x7e08737e,0x7f800000,3
+np.float32,0x3f70574c,0x3fc74b8e,3
+np.float32,0xbed5745c,0xbeae8c77,3
+np.float32,0x361752,0x361752,3
+np.float32,0x3eb276d6,0x3ed584ea,3
+np.float32,0x3f03fc1e,0x3f2cb1a5,3
+np.float32,0x3fafd1,0x3fafd1,3
+np.float32,0x7e50d74c,0x7f800000,3
+np.float32,0x3eeca5,0x3eeca5,3
+np.float32,0x5dc963,0x5dc963,3
+np.float32,0x7f0e63ae,0x7f800000,3
+np.float32,0x8021745f,0x8021745f,3
+np.float32,0xbf5881a9,0xbf121d07,3
+np.float32,0x7dadc7fd,0x7f800000,3
+np.float32,0xbf2c0798,0xbefa86bb,3
+np.float32,0x3e635f50,0x3e7e97a9,3
+np.float32,0xbf2053fa,0xbeee4c0e,3
+np.float32,0x3e8eee2b,0x3ea4dfcc,3
+np.float32,0xfc8a03c0,0xbf800000,3
+np.float32,0xfd9e4948,0xbf800000,3
+np.float32,0x801e817e,0x801e817e,3
+np.float32,0xbf603a27,0xbf1560c3,3
+np.float32,0x7f729809,0x7f800000,3
+np.float32,0x3f5a1864,0x3fac0e04,3
+np.float32,0x3e7648b8,0x3e8b3677,3
+np.float32,0x3edade24,0x3f088bc1,3
+np.float32,0x65e16e,0x65e16e,3
+np.float32,0x3f24aa50,0x3f671117,3
+np.float32,0x803cb1d0,0x803cb1d0,3
+np.float32,0xbe7b1858,0xbe5eadcc,3
+np.float32,0xbf19bb27,0xbee726fb,3
+np.float32,0xfd1f6e60,0xbf800000,3
+np.float32,0xfeb0de60,0xbf800000,3
+np.float32,0xff511a52,0xbf800000,3
+np.float32,0xff7757f7,0xbf800000,3
+np.float32,0x463ff5,0x463ff5,3
+np.float32,0x3f770d12,0x3fcffcc2,3
+np.float32,0xbf208562,0xbeee80dc,3
+np.float32,0x6df204,0x6df204,3
+np.float32,0xbf62d24f,0xbf1673fb,3
+np.float32,0x3dfcf210,0x3e069d5f,3
+np.float32,0xbef26002,0xbec114d7,3
+np.float32,0x7f800000,0x7f800000,3
+np.float32,0x7f30fb85,0x7f800000,3
+np.float32,0x7ee5dfef,0x7f800000,3
+np.float32,0x3f317829,0x3f800611,3
+np.float32,0x3f4b0bbd,0x3f9aec88,3
+np.float32,0x7edf708c,0x7f800000,3
+np.float32,0xff071260,0xbf800000,3
+np.float32,0x3e7b8c30,0x3e8e9198,3
+np.float32,0x3f33778b,0x3f82077f,3
+np.float32,0x3e8cd11d,0x3ea215fd,3
+np.float32,0x8004483d,0x8004483d,3
+np.float32,0x801633e3,0x801633e3,3
+np.float32,0x7e76eb15,0x7f800000,3
+np.float32,0x3c1571,0x3c1571,3
+np.float32,0x7de3de52,0x7f800000,3
+np.float32,0x804ae906,0x804ae906,3
+np.float32,0x7f3a2616,0x7f800000,3
+np.float32,0xff7fffff,0xbf800000,3
+np.float32,0xff5d17e4,0xbf800000,3
+np.float32,0xbeaa6704,0xbe90f252,3
+np.float32,0x7e6a43af,0x7f800000,3
+np.float32,0x2a0f35,0x2a0f35,3
+np.float32,0xfd8fece0,0xbf800000,3
+np.float32,0xfeef2e2a,0xbf800000,3
+np.float32,0xff800000,0xbf800000,3
+np.float32,0xbeefcc52,0xbebf78e4,3
+np.float32,0x3db6c490,0x3dbf2bd5,3
+np.float32,0x8290f,0x8290f,3
+np.float32,0xbeace648,0xbe92bb7f,3
+np.float32,0x801fea79,0x801fea79,3
+np.float32,0x3ea6c230,0x3ec51ebf,3
+np.float32,0x3e5f2ca3,0x3e795c8a,3
+np.float32,0x3eb6f634,0x3edbeb9f,3
+np.float32,0xff790b45,0xbf800000,3
+np.float32,0x3d82e240,0x3d872816,3
+np.float32,0x3f0d6a57,0x3f3cc7db,3
+np.float32,0x7f08531a,0x7f800000,3
+np.float32,0x702b6d,0x702b6d,3
+np.float32,0x7d3a3c38,0x7f800000,3
+np.float32,0x3d0a7fb3,0x3d0cddf3,3
+np.float32,0xff28084c,0xbf800000,3
+np.float32,0xfeee8804,0xbf800000,3
+np.float32,0x804094eb,0x804094eb,3
+np.float32,0x7acb39,0x7acb39,3
+np.float32,0x3f01c07a,0x3f28f88c,3
+np.float32,0x3e05c500,0x3e0ee674,3
+np.float32,0xbe6f7c38,0xbe558ac1,3
+np.float32,0x803b1f4b,0x803b1f4b,3
+np.float32,0xbf76561f,0xbf1e332b,3
+np.float32,0xff30d368,0xbf800000,3
+np.float32,0x7e2e1f38,0x7f800000,3
+np.float32,0x3ee085b8,0x3f0ce7c0,3
+np.float32,0x8064c4a7,0x8064c4a7,3
+np.float32,0xa7c1d,0xa7c1d,3
+np.float32,0x3f27498a,0x3f6c14bc,3
+np.float32,0x137ca,0x137ca,3
+np.float32,0x3d0a5c60,0x3d0cb969,3
+np.float32,0x80765f1f,0x80765f1f,3
+np.float32,0x80230a71,0x80230a71,3
+np.float32,0x3f321ed2,0x3f80acf4,3
+np.float32,0x7d61e7f4,0x7f800000,3
+np.float32,0xbf39f7f2,0xbf0430f7,3
+np.float32,0xbe2503f8,0xbe1867e8,3
+np.float32,0x29333d,0x29333d,3
+np.float32,0x7edc5a0e,0x7f800000,3
+np.float32,0xbe81a8a2,0xbe651663,3
+np.float32,0x7f76ab6d,0x7f800000,3
+np.float32,0x7f46111f,0x7f800000,3
+np.float32,0xff0fc888,0xbf800000,3
+np.float32,0x805ece89,0x805ece89,3
+np.float32,0xc390b,0xc390b,3
+np.float32,0xff64bdee,0xbf800000,3
+np.float32,0x3dd07e4e,0x3ddb79bd,3
+np.float32,0xfecc1f10,0xbf800000,3
+np.float32,0x803f5177,0x803f5177,3
+np.float32,0x802a24d2,0x802a24d2,3
+np.float32,0x7f27d0cc,0x7f800000,3
+np.float32,0x3ef57c98,0x3f1d7e88,3
+np.float32,0x7b848d,0x7b848d,3
+np.float32,0x7f7fffff,0x7f800000,3
+np.float32,0xfe889c46,0xbf800000,3
+np.float32,0xff2d6dc5,0xbf800000,3
+np.float32,0x3f53a186,0x3fa492a6,3
+np.float32,0xbf239c94,0xbef1c90c,3
+np.float32,0xff7c0f4e,0xbf800000,3
+np.float32,0x3e7c69a9,0x3e8f1f3a,3
+np.float32,0xbf47c9e9,0xbf0ab2a9,3
+np.float32,0xbc1eaf00,0xbc1deae9,3
+np.float32,0x3f4a6d39,0x3f9a3d8e,3
+np.float32,0x3f677930,0x3fbc26eb,3
+np.float32,0x3f45eea1,0x3f955418,3
+np.float32,0x7f61a1f8,0x7f800000,3
+np.float32,0xff58c7c6,0xbf800000,3
+np.float32,0x80239801,0x80239801,3
+np.float32,0xff56e616,0xbf800000,3
+np.float32,0xff62052c,0xbf800000,3
+np.float32,0x8009b615,0x8009b615,3
+np.float32,0x293d6b,0x293d6b,3
+np.float32,0xfe9e585c,0xbf800000,3
+np.float32,0x7f58ff4b,0x7f800000,3
+np.float32,0x10937c,0x10937c,3
+np.float32,0x7f5cc13f,0x7f800000,3
+np.float32,0x110c5d,0x110c5d,3
+np.float32,0x805e51fc,0x805e51fc,3
+np.float32,0xbedcf70a,0xbeb3766c,3
+np.float32,0x3f4d5e42,0x3f9d8091,3
+np.float32,0xff5925a0,0xbf800000,3
+np.float32,0x7e87cafa,0x7f800000,3
+np.float32,0xbf6474b2,0xbf171fee,3
+np.float32,0x4b39b2,0x4b39b2,3
+np.float32,0x8020cc28,0x8020cc28,3
+np.float32,0xff004ed8,0xbf800000,3
+np.float32,0xbf204cf5,0xbeee448d,3
+np.float32,0x3e30cf10,0x3e40fdb1,3
+np.float32,0x80202bee,0x80202bee,3
+np.float32,0xbf55a985,0xbf10e2bc,3
+np.float32,0xbe297dd8,0xbe1c351c,3
+np.float32,0x5780d9,0x5780d9,3
+np.float32,0x7ef729fa,0x7f800000,3
+np.float32,0x8039a3b5,0x8039a3b5,3
+np.float32,0x7cdd3f,0x7cdd3f,3
+np.float32,0x7ef0145a,0x7f800000,3
+np.float32,0x807ad7ae,0x807ad7ae,3
+np.float32,0x7f6c2643,0x7f800000,3
+np.float32,0xbec56124,0xbea3c929,3
+np.float32,0x512c3b,0x512c3b,3
+np.float32,0xbed3effe,0xbead8c1e,3
+np.float32,0x7f5e0a4d,0x7f800000,3
+np.float32,0x3f315316,0x3f7fc200,3
+np.float32,0x7eca5727,0x7f800000,3
+np.float32,0x7f4834f3,0x7f800000,3
+np.float32,0x8004af6d,0x8004af6d,3
+np.float32,0x3f223ca4,0x3f6277e3,3
+np.float32,0x7eea4fdd,0x7f800000,3
+np.float32,0x3e7143e8,0x3e880763,3
+np.float32,0xbf737008,0xbf1d160e,3
+np.float32,0xfc408b00,0xbf800000,3
+np.float32,0x803912ca,0x803912ca,3
+np.float32,0x7db31f4e,0x7f800000,3
+np.float32,0xff578b54,0xbf800000,3
+np.float32,0x3f068ec4,0x3f31062b,3
+np.float32,0x35f64f,0x35f64f,3
+np.float32,0x80437df4,0x80437df4,3
+np.float32,0x568059,0x568059,3
+np.float32,0x8005f8ba,0x8005f8ba,3
+np.float32,0x6824ad,0x6824ad,3
+np.float32,0xff3fdf30,0xbf800000,3
+np.float32,0xbf6f7682,0xbf1b89d6,3
+np.float32,0x3dcea8a0,0x3dd971f5,3
+np.float32,0x3ee32a62,0x3f0ef5a9,3
+np.float32,0xbf735bcd,0xbf1d0e3d,3
+np.float32,0x7e8c7c28,0x7f800000,3
+np.float32,0x3ed552bc,0x3f045161,3
+np.float32,0xfed90a8a,0xbf800000,3
+np.float32,0xbe454368,0xbe336d2a,3
+np.float32,0xbf171d26,0xbee4442d,3
+np.float32,0x80652bf9,0x80652bf9,3
+np.float32,0xbdbaaa20,0xbdb26914,3
+np.float32,0x3f56063d,0x3fa7522e,3
+np.float32,0x3d3d4fd3,0x3d41c13f,3
+np.float32,0x80456040,0x80456040,3
+np.float32,0x3dc15586,0x3dcac0ef,3
+np.float32,0x7f753060,0x7f800000,3
+np.float32,0x7f7d8039,0x7f800000,3
+np.float32,0xfdebf280,0xbf800000,3
+np.float32,0xbf1892c3,0xbee5e116,3
+np.float32,0xbf0f1468,0xbedb3878,3
+np.float32,0x40d85c,0x40d85c,3
+np.float32,0x3f93dd,0x3f93dd,3
+np.float32,0xbf5730fd,0xbf118c24,3
+np.float32,0xfe17aa44,0xbf800000,3
+np.float32,0x3dc0baf4,0x3dca1716,3
+np.float32,0xbf3433d8,0xbf015efb,3
+np.float32,0x1c59f5,0x1c59f5,3
+np.float32,0x802b1540,0x802b1540,3
+np.float32,0xbe47df6c,0xbe35936e,3
+np.float32,0xbe8e7070,0xbe78af32,3
+np.float32,0xfe7057f4,0xbf800000,3
+np.float32,0x80668b69,0x80668b69,3
+np.float32,0xbe677810,0xbe4f2c2d,3
+np.float32,0xbe7a2f1c,0xbe5df733,3
+np.float32,0xfeb79e3c,0xbf800000,3
+np.float32,0xbeb6e320,0xbe99c9e8,3
+np.float32,0xfea188f2,0xbf800000,3
+np.float32,0x7dcaeb15,0x7f800000,3
+np.float32,0x1be567,0x1be567,3
+np.float32,0xbf4041cc,0xbf07320d,3
+np.float32,0x3f721aa7,0x3fc98e9a,3
+np.float32,0x7f5aa835,0x7f800000,3
+np.float32,0x15180e,0x15180e,3
+np.float32,0x3f73d739,0x3fcbccdb,3
+np.float32,0xbeecd380,0xbebd9b36,3
+np.float32,0x3f2caec7,0x3f768fea,3
+np.float32,0xbeaf65f2,0xbe9482bb,3
+np.float32,0xfe6aa384,0xbf800000,3
+np.float32,0xbf4f2c0a,0xbf0e085e,3
+np.float32,0xbf2b5907,0xbef9d431,3
+np.float32,0x3e855e0d,0x3e985960,3
+np.float32,0x8056cc64,0x8056cc64,3
+np.float32,0xff746bb5,0xbf800000,3
+np.float32,0x3e0332f6,0x3e0bf986,3
+np.float32,0xff637720,0xbf800000,3
+np.float32,0xbf330676,0xbf00c990,3
+np.float32,0x3ec449a1,0x3eef3862,3
+np.float32,0x766541,0x766541,3
+np.float32,0xfe2edf6c,0xbf800000,3
+np.float32,0xbebb28ca,0xbe9cc3e2,3
+np.float32,0x3f16c930,0x3f4d5ce4,3
+np.float32,0x7f1a9a4a,0x7f800000,3
+np.float32,0x3e9ba1,0x3e9ba1,3
+np.float32,0xbf73d5f6,0xbf1d3d69,3
+np.float32,0xfdc8a8b0,0xbf800000,3
+np.float32,0x50f051,0x50f051,3
+np.float32,0xff0add02,0xbf800000,3
+np.float32,0x1e50bf,0x1e50bf,3
+np.float32,0x3f04d287,0x3f2e1948,3
+np.float32,0x7f1e50,0x7f1e50,3
+np.float32,0x2affb3,0x2affb3,3
+np.float32,0x80039f07,0x80039f07,3
+np.float32,0x804ba79e,0x804ba79e,3
+np.float32,0x7b5a8eed,0x7f800000,3
+np.float32,0x3e1a8b28,0x3e26d0a7,3
+np.float32,0x3ea95f29,0x3ec8bfa4,3
+np.float32,0x7e09fa55,0x7f800000,3
+np.float32,0x7eacb1b3,0x7f800000,3
+np.float32,0x3e8ad7c0,0x3e9f7dec,3
+np.float32,0x7e0e997c,0x7f800000,3
+np.float32,0x3f4422b4,0x3f936398,3
+np.float32,0x806bd222,0x806bd222,3
+np.float32,0x677ae6,0x677ae6,3
+np.float32,0x62cf68,0x62cf68,3
+np.float32,0x7e4e594e,0x7f800000,3
+np.float32,0x80445fd1,0x80445fd1,3
+np.float32,0xff3a0d04,0xbf800000,3
+np.float32,0x8052b256,0x8052b256,3
+np.float32,0x3cb34440,0x3cb53e11,3
+np.float32,0xbf0e3865,0xbeda3c6d,3
+np.float32,0x3f49f5df,0x3f99ba17,3
+np.float32,0xbed75a22,0xbeafcc09,3
+np.float32,0xbf7aec64,0xbf1fefc8,3
+np.float32,0x7f35a62d,0x7f800000,3
+np.float32,0xbf787b03,0xbf1f03fc,3
+np.float32,0x8006a62a,0x8006a62a,3
+np.float32,0x3f6419e7,0x3fb803c7,3
+np.float32,0x3ecea2e5,0x3efe8f01,3
+np.float32,0x80603577,0x80603577,3
+np.float32,0xff73198c,0xbf800000,3
+np.float32,0x7def110a,0x7f800000,3
+np.float32,0x544efd,0x544efd,3
+np.float32,0x3f052340,0x3f2ea0fc,3
+np.float32,0xff306666,0xbf800000,3
+np.float32,0xbf800000,0xbf21d2a7,3
+np.float32,0xbed3e150,0xbead826a,3
+np.float32,0x3f430c99,0x3f92390f,3
+np.float32,0xbf4bffa4,0xbf0c9c73,3
+np.float32,0xfd97a710,0xbf800000,3
+np.float32,0x3cadf0fe,0x3cafcd1a,3
+np.float32,0x807af7b4,0x807af7b4,3
+np.float32,0xbc508600,0xbc4f33bc,3
+np.float32,0x7f3e0ec7,0x7f800000,3
+np.float32,0xbe51334c,0xbe3d36f7,3
+np.float32,0xfe7b7fb4,0xbf800000,3
+np.float32,0xfed9c45e,0xbf800000,3
+np.float32,0x3da024eb,0x3da6926a,3
+np.float32,0x7eed9e76,0x7f800000,3
+np.float32,0xbf2b8f1f,0xbefa0b91,3
+np.float32,0x3f2b9286,0x3f746318,3
+np.float32,0xfe8af49c,0xbf800000,3
+np.float32,0x9c4f7,0x9c4f7,3
+np.float32,0x801d7543,0x801d7543,3
+np.float32,0xbf66474a,0xbf17de66,3
+np.float32,0xbf562155,0xbf1116b1,3
+np.float32,0x46a8de,0x46a8de,3
+np.float32,0x8053fe6b,0x8053fe6b,3
+np.float32,0xbf6ee842,0xbf1b51f3,3
+np.float32,0xbf6ad78e,0xbf19b565,3
+np.float32,0xbf012574,0xbecad7ff,3
+np.float32,0x748364,0x748364,3
+np.float32,0x8073f59b,0x8073f59b,3
+np.float32,0xff526825,0xbf800000,3
+np.float32,0xfeb02dc4,0xbf800000,3
+np.float32,0x8033eb1c,0x8033eb1c,3
+np.float32,0x3f3685ea,0x3f8520cc,3
+np.float32,0x7f657902,0x7f800000,3
+np.float32,0xbf75eac4,0xbf1e0a1f,3
+np.float32,0xfe67f384,0xbf800000,3
+np.float32,0x3f56d3cc,0x3fa83faf,3
+np.float32,0x44a4ce,0x44a4ce,3
+np.float32,0x1dc4b3,0x1dc4b3,3
+np.float32,0x4fb3b2,0x4fb3b2,3
+np.float32,0xbea904a4,0xbe8ff3ed,3
+np.float32,0x7e668f16,0x7f800000,3
+np.float32,0x7f538378,0x7f800000,3
+np.float32,0x80541709,0x80541709,3
+np.float32,0x80228040,0x80228040,3
+np.float32,0x7ef9694e,0x7f800000,3
+np.float32,0x3f5fca9b,0x3fb2ce54,3
+np.float32,0xbe9c43c2,0xbe86ab84,3
+np.float32,0xfecee000,0xbf800000,3
+np.float32,0x5a65c2,0x5a65c2,3
+np.float32,0x3f736572,0x3fcb3985,3
+np.float32,0xbf2a03f7,0xbef87600,3
+np.float32,0xfe96b488,0xbf800000,3
+np.float32,0xfedd8800,0xbf800000,3
+np.float32,0x80411804,0x80411804,3
+np.float32,0x7edcb0a6,0x7f800000,3
+np.float32,0x2bb882,0x2bb882,3
+np.float32,0x3f800000,0x3fdbf0a9,3
+np.float32,0x764b27,0x764b27,3
+np.float32,0x7e92035d,0x7f800000,3
+np.float32,0x3e80facb,0x3e92ae1d,3
+np.float32,0x8040b81a,0x8040b81a,3
+np.float32,0x7f487fe4,0x7f800000,3
+np.float32,0xbc641780,0xbc6282ed,3
+np.float32,0x804b0bb9,0x804b0bb9,3
+np.float32,0x7d0b7c39,0x7f800000,3
+np.float32,0xff072080,0xbf800000,3
+np.float32,0xbed7aff8,0xbeb00462,3
+np.float32,0x35e247,0x35e247,3
+np.float32,0xbf7edd19,0xbf216766,3
+np.float32,0x8004a539,0x8004a539,3
+np.float32,0xfdfc1790,0xbf800000,3
+np.float32,0x8037a841,0x8037a841,3
+np.float32,0xfed0a8a8,0xbf800000,3
+np.float32,0x7f1f1697,0x7f800000,3
+np.float32,0x3f2ccc6e,0x3f76ca23,3
+np.float32,0x35eada,0x35eada,3
+np.float32,0xff111f42,0xbf800000,3
+np.float32,0x3ee1ab7f,0x3f0dcbbe,3
+np.float32,0xbf6e89ee,0xbf1b2cd4,3
+np.float32,0x3f58611c,0x3faa0cdc,3
+np.float32,0x1ac6a6,0x1ac6a6,3
+np.float32,0xbf1286fa,0xbedf2312,3
+np.float32,0x7e451137,0x7f800000,3
+np.float32,0xbe92c326,0xbe7f3405,3
+np.float32,0x3f2fdd16,0x3f7cd87b,3
+np.float32,0xbe5c0ea0,0xbe4604c2,3
+np.float32,0xbdb29968,0xbdab0883,3
+np.float32,0x3964,0x3964,3
+np.float32,0x3f0dc236,0x3f3d60a0,3
+np.float32,0x7c3faf06,0x7f800000,3
+np.float32,0xbef41f7a,0xbec22b16,3
+np.float32,0x3f4c0289,0x3f9bfdcc,3
+np.float32,0x806084e9,0x806084e9,3
+np.float32,0x3ed1d8dd,0x3f01b0c1,3
+np.float32,0x806d8d8b,0x806d8d8b,3
+np.float32,0x3f052180,0x3f2e9e0a,3
+np.float32,0x803d85d5,0x803d85d5,3
+np.float32,0x3e0afd70,0x3e14dd48,3
+np.float32,0x2fbc63,0x2fbc63,3
+np.float32,0x2e436f,0x2e436f,3
+np.float32,0xbf7b19e6,0xbf2000da,3
+np.float32,0x3f34022e,0x3f829362,3
+np.float32,0x3d2b40e0,0x3d2ee246,3
+np.float32,0x3f5298b4,0x3fa3649b,3
+np.float32,0xbdb01328,0xbda8b7de,3
+np.float32,0x7f693c81,0x7f800000,3
+np.float32,0xbeb1abc0,0xbe961edc,3
+np.float32,0x801d9b5d,0x801d9b5d,3
+np.float32,0x80628668,0x80628668,3
+np.float32,0x800f57dd,0x800f57dd,3
+np.float32,0x8017c94f,0x8017c94f,3
+np.float32,0xbf16f5f4,0xbee418b8,3
+np.float32,0x3e686476,0x3e827022,3
+np.float32,0xbf256796,0xbef3abd9,3
+np.float32,0x7f1b4485,0x7f800000,3
+np.float32,0xbea0b3cc,0xbe89ed21,3
+np.float32,0xfee08b2e,0xbf800000,3
+np.float32,0x523cb4,0x523cb4,3
+np.float32,0x3daf2cb2,0x3db6e273,3
+np.float32,0xbd531c40,0xbd4dc323,3
+np.float32,0x80078fe5,0x80078fe5,3
+np.float32,0x80800000,0x80800000,3
+np.float32,0x3f232438,0x3f642d1a,3
+np.float32,0x3ec29446,0x3eecb7c0,3
+np.float32,0x3dbcd2a4,0x3dc5cd1d,3
+np.float32,0x7f045b0d,0x7f800000,3
+np.float32,0x7f22e6d1,0x7f800000,3
+np.float32,0xbf5d3430,0xbf141c80,3
+np.float32,0xbe03ec70,0xbdf78ee6,3
+np.float32,0x3e93ec9a,0x3eab822f,3
+np.float32,0x7f3b9262,0x7f800000,3
+np.float32,0x65ac6a,0x65ac6a,3
+np.float32,0x3db9a8,0x3db9a8,3
+np.float32,0xbf37ab59,0xbf031306,3
+np.float32,0x33c40e,0x33c40e,3
+np.float32,0x7f7a478f,0x7f800000,3
+np.float32,0xbe8532d0,0xbe6a906f,3
+np.float32,0x801c081d,0x801c081d,3
+np.float32,0xbe4212a0,0xbe30ca73,3
+np.float32,0xff0b603e,0xbf800000,3
+np.float32,0x4554dc,0x4554dc,3
+np.float32,0x3dd324be,0x3dde695e,3
+np.float32,0x3f224c44,0x3f629557,3
+np.float32,0x8003cd79,0x8003cd79,3
+np.float32,0xbf31351c,0xbeffc2fd,3
+np.float32,0x8034603a,0x8034603a,3
+np.float32,0xbf6fcb70,0xbf1bab24,3
+np.float32,0x804eb67e,0x804eb67e,3
+np.float32,0xff05c00e,0xbf800000,3
+np.float32,0x3eb5b36f,0x3eda1ec7,3
+np.float32,0x3f1ed7f9,0x3f5c1d90,3
+np.float32,0x3f052d8a,0x3f2eb24b,3
+np.float32,0x5ddf51,0x5ddf51,3
+np.float32,0x7e50c11c,0x7f800000,3
+np.float32,0xff74f55a,0xbf800000,3
+np.float32,0x4322d,0x4322d,3
+np.float32,0x3f16f8a9,0x3f4db27a,3
+np.float32,0x3f4f23d6,0x3f9f7c2c,3
+np.float32,0xbf706c1e,0xbf1bea0a,3
+np.float32,0x3f2cbd52,0x3f76ac77,3
+np.float32,0xf3043,0xf3043,3
+np.float32,0xfee79de0,0xbf800000,3
+np.float32,0x7e942f69,0x7f800000,3
+np.float32,0x180139,0x180139,3
+np.float32,0xff69c678,0xbf800000,3
+np.float32,0x3f46773f,0x3f95e840,3
+np.float32,0x804aae1c,0x804aae1c,3
+np.float32,0x3eb383b4,0x3ed7024c,3
+np.float32,0x8032624e,0x8032624e,3
+np.float32,0xbd0a0f80,0xbd07c27d,3
+np.float32,0xbf1c9b98,0xbeea4a61,3
+np.float32,0x7f370999,0x7f800000,3
+np.float32,0x801931f9,0x801931f9,3
+np.float32,0x3f6f45ce,0x3fc5eea0,3
+np.float32,0xff0ab4cc,0xbf800000,3
+np.float32,0x4c043d,0x4c043d,3
+np.float32,0x8002a599,0x8002a599,3
+np.float32,0xbc4a6080,0xbc4921d7,3
+np.float32,0x3f008d14,0x3f26fb72,3
+np.float32,0x7f48b3d9,0x7f800000,3
+np.float32,0x7cb2ec7e,0x7f800000,3
+np.float32,0xbf1338bd,0xbedfeb61,3
+np.float32,0x0,0x0,3
+np.float32,0xbf2f5b64,0xbefde71c,3
+np.float32,0xbe422974,0xbe30dd56,3
+np.float32,0x3f776be8,0x3fd07950,3
+np.float32,0xbf3e97a1,0xbf06684a,3
+np.float32,0x7d28cb26,0x7f800000,3
+np.float32,0x801618d2,0x801618d2,3
+np.float32,0x807e4f83,0x807e4f83,3
+np.float32,0x8006b07d,0x8006b07d,3
+np.float32,0xfea1c042,0xbf800000,3
+np.float32,0xff24ef74,0xbf800000,3
+np.float32,0xfef7ab16,0xbf800000,3
+np.float32,0x70b771,0x70b771,3
+np.float32,0x7daeb64e,0x7f800000,3
+np.float32,0xbe66e378,0xbe4eb59c,3
+np.float32,0xbead1534,0xbe92dcf7,3
+np.float32,0x7e6769b8,0x7f800000,3
+np.float32,0x7ecd0890,0x7f800000,3
+np.float32,0xbe7380d8,0xbe58b747,3
+np.float32,0x3efa6f2f,0x3f218265,3
+np.float32,0x3f59dada,0x3fabc5eb,3
+np.float32,0xff0f2d20,0xbf800000,3
+np.float32,0x8060210e,0x8060210e,3
+np.float32,0x3ef681e8,0x3f1e51c8,3
+np.float32,0x77a6dd,0x77a6dd,3
+np.float32,0xbebfdd0e,0xbea00399,3
+np.float32,0xfe889b72,0xbf800000,3
+np.float32,0x8049ed2c,0x8049ed2c,3
+np.float32,0x3b089dc4,0x3b08c23e,3
+np.float32,0xbf13c7c4,0xbee08c28,3
+np.float32,0x3efa13b9,0x3f2137d7,3
+np.float32,0x3e9385dc,0x3eaaf914,3
+np.float32,0x7e0e6a43,0x7f800000,3
+np.float32,0x7df6d63f,0x7f800000,3
+np.float32,0x3f3efead,0x3f8dea03,3
+np.float32,0xff52548c,0xbf800000,3
+np.float32,0x803ff9d8,0x803ff9d8,3
+np.float32,0x3c825823,0x3c836303,3
+np.float32,0xfc9e97a0,0xbf800000,3
+np.float32,0xfe644f48,0xbf800000,3
+np.float32,0x802f5017,0x802f5017,3
+np.float32,0x3d5753b9,0x3d5d1661,3
+np.float32,0x7f2a55d2,0x7f800000,3
+np.float32,0x7f4dabfe,0x7f800000,3
+np.float32,0x3f49492a,0x3f98fc47,3
+np.float32,0x3f4d1589,0x3f9d2f82,3
+np.float32,0xff016208,0xbf800000,3
+np.float32,0xbf571cb7,0xbf118365,3
+np.float32,0xbf1ef297,0xbeecd136,3
+np.float32,0x36266b,0x36266b,3
+np.float32,0xbed07b0e,0xbeab4129,3
+np.float32,0x7f553365,0x7f800000,3
+np.float32,0xfe9bb8c6,0xbf800000,3
+np.float32,0xbeb497d6,0xbe982e19,3
+np.float32,0xbf27af6c,0xbef60d16,3
+np.float32,0x55cf51,0x55cf51,3
+np.float32,0x3eab1db0,0x3ecb2e4f,3
+np.float32,0x3e777603,0x3e8bf62f,3
+np.float32,0x7f10e374,0x7f800000,3
+np.float32,0xbf1f6480,0xbeed4b8d,3
+np.float32,0x40479d,0x40479d,3
+np.float32,0x156259,0x156259,3
+np.float32,0x3d852e30,0x3d899b2d,3
+np.float32,0x80014ff3,0x80014ff3,3
+np.float32,0xbd812fa8,0xbd7a645c,3
+np.float32,0x800ab780,0x800ab780,3
+np.float32,0x3ea02ff4,0x3ebc13bd,3
+np.float32,0x7e858b8e,0x7f800000,3
+np.float32,0x75d63b,0x75d63b,3
+np.float32,0xbeb15c94,0xbe95e6e3,3
+np.float32,0x3da0cee0,0x3da74a39,3
+np.float32,0xff21c01c,0xbf800000,3
+np.float32,0x8049b5eb,0x8049b5eb,3
+np.float32,0x80177ab0,0x80177ab0,3
+np.float32,0xff137a50,0xbf800000,3
+np.float32,0x3f7febba,0x3fdbd51c,3
+np.float32,0x8041e4dd,0x8041e4dd,3
+np.float32,0x99b8c,0x99b8c,3
+np.float32,0x5621ba,0x5621ba,3
+np.float32,0x14b534,0x14b534,3
+np.float32,0xbe2eb3a8,0xbe209c95,3
+np.float32,0x7e510c28,0x7f800000,3
+np.float32,0x804ec2f2,0x804ec2f2,3
+np.float32,0x3f662406,0x3fba82b0,3
+np.float32,0x800000,0x800000,3
+np.float32,0x3f3120d6,0x3f7f5d96,3
+np.float32,0x7f179b8e,0x7f800000,3
+np.float32,0x7f65278e,0x7f800000,3
+np.float32,0xfeb50f52,0xbf800000,3
+np.float32,0x7f051bd1,0x7f800000,3
+np.float32,0x7ea0558d,0x7f800000,3
+np.float32,0xbd0a96c0,0xbd08453f,3
+np.float64,0xee82da5ddd05c,0xee82da5ddd05c,3
+np.float64,0x800c3a22d7f87446,0x800c3a22d7f87446,3
+np.float64,0xbfd34b20eaa69642,0xbfd0a825e7688d3e,3
+np.float64,0x3fd6a0f2492d41e5,0x3fdb253b906057b3,3
+np.float64,0xbfda13d8783427b0,0xbfd56b1d76684332,3
+np.float64,0xbfe50b5a99ea16b5,0xbfded7dd82c6f746,3
+np.float64,0x3f82468fc0248d20,0x3f825b7fa9378ee9,3
+np.float64,0x7ff0000000000000,0x7ff0000000000000,3
+np.float64,0x856e50290adca,0x856e50290adca,3
+np.float64,0x7fde55a5fa3cab4b,0x7ff0000000000000,3
+np.float64,0x7fcf2c8dd93e591b,0x7ff0000000000000,3
+np.float64,0x8001b3a0e3236743,0x8001b3a0e3236743,3
+np.float64,0x8000fdb14821fb63,0x8000fdb14821fb63,3
+np.float64,0xbfe3645e08e6c8bc,0xbfdd161362a5e9ef,3
+np.float64,0x7feb34d28b3669a4,0x7ff0000000000000,3
+np.float64,0x80099dd810933bb1,0x80099dd810933bb1,3
+np.float64,0xbfedbcc1097b7982,0xbfe35d86414d53dc,3
+np.float64,0x7fdc406fbdb880de,0x7ff0000000000000,3
+np.float64,0x800c4bf85ab897f1,0x800c4bf85ab897f1,3
+np.float64,0x3fd8f7b0e0b1ef60,0x3fde89b497ae20d8,3
+np.float64,0xffe4fced5c69f9da,0xbff0000000000000,3
+np.float64,0xbfe54d421fea9a84,0xbfdf1be0cbfbfcba,3
+np.float64,0x800af72f3535ee5f,0x800af72f3535ee5f,3
+np.float64,0x3fe24e6570e49ccb,0x3fe8b3a86d970411,3
+np.float64,0xbfdd7b22d0baf646,0xbfd79fac2e4f7558,3
+np.float64,0xbfe6a7654c6d4eca,0xbfe03c1f13f3b409,3
+np.float64,0x3fe2c3eb662587d7,0x3fe98566e625d4f5,3
+np.float64,0x3b1ef71e763e0,0x3b1ef71e763e0,3
+np.float64,0xffed03c6baba078d,0xbff0000000000000,3
+np.float64,0x3febac19d0b75834,0x3ff5fdacc9d51bcd,3
+np.float64,0x800635d6794c6bae,0x800635d6794c6bae,3
+np.float64,0xbfe8cafc827195f9,0xbfe1411438608ae1,3
+np.float64,0x7feeb616a83d6c2c,0x7ff0000000000000,3
+np.float64,0x3fd52d62a2aa5ac5,0x3fd91a07a7f18f44,3
+np.float64,0x80036996b8a6d32e,0x80036996b8a6d32e,3
+np.float64,0x2b1945965632a,0x2b1945965632a,3
+np.float64,0xbfecb5e8c9796bd2,0xbfe2f40fca276aa2,3
+np.float64,0x3fe8669ed4f0cd3e,0x3ff24c89fc9cdbff,3
+np.float64,0x71e9f65ee3d3f,0x71e9f65ee3d3f,3
+np.float64,0xbfd5ab262bab564c,0xbfd261ae108ef79e,3
+np.float64,0xbfe7091342ee1226,0xbfe06bf5622d75f6,3
+np.float64,0x49e888d093d12,0x49e888d093d12,3
+np.float64,0x2272f3dc44e5f,0x2272f3dc44e5f,3
+np.float64,0x7fe98736e0b30e6d,0x7ff0000000000000,3
+np.float64,0x30fa9cde61f54,0x30fa9cde61f54,3
+np.float64,0x7fdc163fc0382c7f,0x7ff0000000000000,3
+np.float64,0xffb40d04ee281a08,0xbff0000000000000,3
+np.float64,0xffe624617f2c48c2,0xbff0000000000000,3
+np.float64,0x3febb582bd376b05,0x3ff608da584d1716,3
+np.float64,0xfc30a5a5f8615,0xfc30a5a5f8615,3
+np.float64,0x3fef202efd7e405e,0x3ffa52009319b069,3
+np.float64,0x8004d0259829a04c,0x8004d0259829a04c,3
+np.float64,0x800622dc71ec45ba,0x800622dc71ec45ba,3
+np.float64,0xffefffffffffffff,0xbff0000000000000,3
+np.float64,0x800e89113c9d1223,0x800e89113c9d1223,3
+np.float64,0x7fba7fde3034ffbb,0x7ff0000000000000,3
+np.float64,0xbfeea31e807d463d,0xbfe3b7369b725915,3
+np.float64,0x3feb7c9589f6f92c,0x3ff5c56cf71b0dff,3
+np.float64,0x3fd52d3b59aa5a77,0x3fd919d0f683fd07,3
+np.float64,0x800de90a43fbd215,0x800de90a43fbd215,3
+np.float64,0x3fe7eb35a9efd66b,0x3ff1c940dbfc6ef9,3
+np.float64,0xbda0adcb7b416,0xbda0adcb7b416,3
+np.float64,0x7fc5753e3a2aea7b,0x7ff0000000000000,3
+np.float64,0xffdd101d103a203a,0xbff0000000000000,3
+np.float64,0x7fcb54f56836a9ea,0x7ff0000000000000,3
+np.float64,0xbfd61c8d6eac391a,0xbfd2b23bc0a2cef4,3
+np.float64,0x3feef55de37deabc,0x3ffa198639a0161d,3
+np.float64,0x7fe4ffbfaea9ff7e,0x7ff0000000000000,3
+np.float64,0x9d1071873a20e,0x9d1071873a20e,3
+np.float64,0x3fef1ecb863e3d97,0x3ffa502a81e09cfc,3
+np.float64,0xad2da12b5a5b4,0xad2da12b5a5b4,3
+np.float64,0xffe614b74c6c296e,0xbff0000000000000,3
+np.float64,0xffe60d3f286c1a7e,0xbff0000000000000,3
+np.float64,0x7fda7d91f4b4fb23,0x7ff0000000000000,3
+np.float64,0x800023f266a047e6,0x800023f266a047e6,3
+np.float64,0x7fdf5f9ad23ebf35,0x7ff0000000000000,3
+np.float64,0x3fa7459f002e8b3e,0x3fa7cf178dcf0af6,3
+np.float64,0x3fe9938d61f3271b,0x3ff39516a13caec3,3
+np.float64,0xbfd59314c3ab262a,0xbfd250830f73efd2,3
+np.float64,0xbfc7e193f72fc328,0xbfc5c924339dd7a8,3
+np.float64,0x7fec1965f17832cb,0x7ff0000000000000,3
+np.float64,0xbfd932908eb26522,0xbfd4d4312d272580,3
+np.float64,0xbfdf2d08e2be5a12,0xbfd8add1413b0b1b,3
+np.float64,0x7fdcf7cc74b9ef98,0x7ff0000000000000,3
+np.float64,0x7fc79300912f2600,0x7ff0000000000000,3
+np.float64,0xffd4bd8f23297b1e,0xbff0000000000000,3
+np.float64,0x41869ce0830e,0x41869ce0830e,3
+np.float64,0x3fe5dcec91ebb9da,0x3fef5e213598cbd4,3
+np.float64,0x800815d9c2902bb4,0x800815d9c2902bb4,3
+np.float64,0x800ba1a4b877434a,0x800ba1a4b877434a,3
+np.float64,0x80069d7bdc4d3af8,0x80069d7bdc4d3af8,3
+np.float64,0xcf00d4339e01b,0xcf00d4339e01b,3
+np.float64,0x80072b71bd4e56e4,0x80072b71bd4e56e4,3
+np.float64,0x80059ca6fbab394f,0x80059ca6fbab394f,3
+np.float64,0x3fe522fc092a45f8,0x3fedf212682bf894,3
+np.float64,0x7fe17f384ea2fe70,0x7ff0000000000000,3
+np.float64,0x0,0x0,3
+np.float64,0x3f72bb4c20257698,0x3f72c64766b52069,3
+np.float64,0x7fbc97c940392f92,0x7ff0000000000000,3
+np.float64,0xffc5904ebd2b209c,0xbff0000000000000,3
+np.float64,0xbfe34fb55b669f6a,0xbfdcff81dd30a49d,3
+np.float64,0x8007ccda006f99b5,0x8007ccda006f99b5,3
+np.float64,0x3fee50e4c8fca1ca,0x3ff9434c7750ad0f,3
+np.float64,0x7fee7b07c67cf60f,0x7ff0000000000000,3
+np.float64,0x3fdcce4a5a399c95,0x3fe230c83f28218a,3
+np.float64,0x7fee5187b37ca30e,0x7ff0000000000000,3
+np.float64,0x3fc48f6a97291ed8,0x3fc64db6200a9833,3
+np.float64,0xc7fec3498ffd9,0xc7fec3498ffd9,3
+np.float64,0x800769c59d2ed38c,0x800769c59d2ed38c,3
+np.float64,0xffe69ede782d3dbc,0xbff0000000000000,3
+np.float64,0x3fecd9770979b2ee,0x3ff76a1f2f0f08f2,3
+np.float64,0x5aa358a8b546c,0x5aa358a8b546c,3
+np.float64,0xbfe795a0506f2b40,0xbfe0afcc52c0166b,3
+np.float64,0xffd4ada1e8a95b44,0xbff0000000000000,3
+np.float64,0xffcac1dc213583b8,0xbff0000000000000,3
+np.float64,0xffe393c15fa72782,0xbff0000000000000,3
+np.float64,0xbfcd6a3c113ad478,0xbfca47a2157b9cdd,3
+np.float64,0xffedde20647bbc40,0xbff0000000000000,3
+np.float64,0x3fd0d011b1a1a024,0x3fd33a57945559f4,3
+np.float64,0x3fef27e29f7e4fc6,0x3ffa5c314e0e3d69,3
+np.float64,0xffe96ff71f72dfee,0xbff0000000000000,3
+np.float64,0xffe762414f2ec482,0xbff0000000000000,3
+np.float64,0x3fc2dcfd3d25b9fa,0x3fc452f41682a12e,3
+np.float64,0xbfbdb125b63b6248,0xbfbc08e6553296d4,3
+np.float64,0x7b915740f724,0x7b915740f724,3
+np.float64,0x60b502b2c16a1,0x60b502b2c16a1,3
+np.float64,0xbfeb38b0be367162,0xbfe254f6782cfc47,3
+np.float64,0x800dc39a3edb8735,0x800dc39a3edb8735,3
+np.float64,0x3fea4fb433349f68,0x3ff468b97cf699f5,3
+np.float64,0xbfd49967962932d0,0xbfd19ceb41ff4cd0,3
+np.float64,0xbfebf75cd377eeba,0xbfe2a576bdbccccc,3
+np.float64,0xbfb653d65c2ca7b0,0xbfb561ab8fcb3f26,3
+np.float64,0xffe3f34b8727e696,0xbff0000000000000,3
+np.float64,0x3fdd798064baf301,0x3fe2b7c130a6fc63,3
+np.float64,0x3febe027e6b7c050,0x3ff63bac1b22e12d,3
+np.float64,0x7fcaa371af3546e2,0x7ff0000000000000,3
+np.float64,0xbfe6ee980a2ddd30,0xbfe05f0bc5dc80d2,3
+np.float64,0xc559c33f8ab39,0xc559c33f8ab39,3
+np.float64,0x84542c2b08a86,0x84542c2b08a86,3
+np.float64,0xbfe5645e046ac8bc,0xbfdf3398dc3cc1bd,3
+np.float64,0x3fee8c48ae7d1892,0x3ff9902899480526,3
+np.float64,0x3fb706471c2e0c8e,0x3fb817787aace8db,3
+np.float64,0x7fefe78f91ffcf1e,0x7ff0000000000000,3
+np.float64,0xbfcf6d560b3edaac,0xbfcbddc72a2130df,3
+np.float64,0x7fd282bfd925057f,0x7ff0000000000000,3
+np.float64,0x3fb973dbee32e7b8,0x3fbac2c87cbd0215,3
+np.float64,0x3fd1ce38ff239c72,0x3fd4876de5164420,3
+np.float64,0x8008ac2e3c31585d,0x8008ac2e3c31585d,3
+np.float64,0x3fa05e06dc20bc00,0x3fa0a1b7de904dce,3
+np.float64,0x7fd925f215324be3,0x7ff0000000000000,3
+np.float64,0x3f949d95d0293b2c,0x3f94d31197d51874,3
+np.float64,0xffdded9e67bbdb3c,0xbff0000000000000,3
+np.float64,0x3fed390dcfba721c,0x3ff7e08c7a709240,3
+np.float64,0x7fe6e62300adcc45,0x7ff0000000000000,3
+np.float64,0xbfd779bc312ef378,0xbfd3a6cb64bb0181,3
+np.float64,0x3fe43e9877287d31,0x3fec3e100ef935fd,3
+np.float64,0x210b68e44216e,0x210b68e44216e,3
+np.float64,0x3fcdffc1e73bff84,0x3fd0e729d02ec539,3
+np.float64,0xcea10c0f9d422,0xcea10c0f9d422,3
+np.float64,0x7feb97a82d772f4f,0x7ff0000000000000,3
+np.float64,0x9b4b4d953696a,0x9b4b4d953696a,3
+np.float64,0x3fd1bd8e95237b1d,0x3fd4716dd34cf828,3
+np.float64,0x800fc273841f84e7,0x800fc273841f84e7,3
+np.float64,0xbfd2aef167255de2,0xbfd0340f30d82f18,3
+np.float64,0x800d021a551a0435,0x800d021a551a0435,3
+np.float64,0xffebf934a8b7f268,0xbff0000000000000,3
+np.float64,0x3fd819849fb03308,0x3fdd43bca0aac749,3
+np.float64,0x7ff8000000000000,0x7ff8000000000000,3
+np.float64,0x27c34b064f86a,0x27c34b064f86a,3
+np.float64,0x7fef4f5a373e9eb3,0x7ff0000000000000,3
+np.float64,0x7fd92fccce325f99,0x7ff0000000000000,3
+np.float64,0x800520869d6a410e,0x800520869d6a410e,3
+np.float64,0x3fccbcaddf397958,0x3fd01bf6b0c4d97f,3
+np.float64,0x80039ebfc4273d80,0x80039ebfc4273d80,3
+np.float64,0xbfed1f0b3c7a3e16,0xbfe31ea6e4c69141,3
+np.float64,0x7fee1bb7c4bc376f,0x7ff0000000000000,3
+np.float64,0xbfa8bee1d8317dc0,0xbfa8283b7dbf95a9,3
+np.float64,0x3fe797db606f2fb6,0x3ff171b1c2bc8fe5,3
+np.float64,0xbfee2ecfdbbc5da0,0xbfe38a3f0a43d14e,3
+np.float64,0x3fe815c7f1302b90,0x3ff1f65165c45d71,3
+np.float64,0xbfbb265c94364cb8,0xbfb9c27ec61a9a1d,3
+np.float64,0x3fcf1cab5d3e3957,0x3fd19c07444642f9,3
+np.float64,0xbfe6ae753f6d5cea,0xbfe03f99666dbe17,3
+np.float64,0xbfd18a2a73a31454,0xbfceaee204aca016,3
+np.float64,0x3fb8a1dffc3143c0,0x3fb9db38341ab1a3,3
+np.float64,0x7fd2a0376025406e,0x7ff0000000000000,3
+np.float64,0x7fe718c0e3ae3181,0x7ff0000000000000,3
+np.float64,0x3fb264d42424c9a8,0x3fb3121f071d4db4,3
+np.float64,0xd27190a7a4e32,0xd27190a7a4e32,3
+np.float64,0xbfe467668c68cecd,0xbfde2c4616738d5e,3
+np.float64,0x800ab9a2b9357346,0x800ab9a2b9357346,3
+np.float64,0x7fcbd108d537a211,0x7ff0000000000000,3
+np.float64,0x3fb79bba6e2f3770,0x3fb8bb2c140d3445,3
+np.float64,0xffefa7165e3f4e2c,0xbff0000000000000,3
+np.float64,0x7fb40185a428030a,0x7ff0000000000000,3
+np.float64,0xbfe9e3d58e73c7ab,0xbfe1c04d51c83d69,3
+np.float64,0x7fef5b97b17eb72e,0x7ff0000000000000,3
+np.float64,0x800a2957683452af,0x800a2957683452af,3
+np.float64,0x800f54f1925ea9e3,0x800f54f1925ea9e3,3
+np.float64,0xeffa4e77dff4a,0xeffa4e77dff4a,3
+np.float64,0xffbe501aa03ca038,0xbff0000000000000,3
+np.float64,0x8006c651bced8ca4,0x8006c651bced8ca4,3
+np.float64,0x3fe159faff22b3f6,0x3fe708f78efbdbed,3
+np.float64,0x800e7d59a31cfab3,0x800e7d59a31cfab3,3
+np.float64,0x3fe6ac2f272d585e,0x3ff07ee5305385c3,3
+np.float64,0x7fd014c054202980,0x7ff0000000000000,3
+np.float64,0xbfe4800b11e90016,0xbfde4648c6f29ce5,3
+np.float64,0xbfe6738470ece709,0xbfe0227b5b42b713,3
+np.float64,0x3fed052add3a0a56,0x3ff7a01819e65c6e,3
+np.float64,0xffe03106f120620e,0xbff0000000000000,3
+np.float64,0x7fe11df4d4e23be9,0x7ff0000000000000,3
+np.float64,0xbfcea25d7b3d44bc,0xbfcb3e808e7ce852,3
+np.float64,0xd0807b03a1010,0xd0807b03a1010,3
+np.float64,0x8004eda4fec9db4b,0x8004eda4fec9db4b,3
+np.float64,0x3fceb5c98d3d6b90,0x3fd15a894b15dd9f,3
+np.float64,0xbfee27228afc4e45,0xbfe38741702f3c0b,3
+np.float64,0xbfe606278c6c0c4f,0xbfdfd7cb6093652d,3
+np.float64,0xbfd66f59bc2cdeb4,0xbfd2ecb2297f6afc,3
+np.float64,0x4aee390095dc8,0x4aee390095dc8,3
+np.float64,0xbfe391355d67226a,0xbfdd46ddc0997014,3
+np.float64,0xffd27765e7a4eecc,0xbff0000000000000,3
+np.float64,0xbfe795e20a2f2bc4,0xbfe0afebc66c4dbd,3
+np.float64,0x7fc9a62e81334c5c,0x7ff0000000000000,3
+np.float64,0xffe4e57e52a9cafc,0xbff0000000000000,3
+np.float64,0x7fac326c8c3864d8,0x7ff0000000000000,3
+np.float64,0x3fe8675f6370cebf,0x3ff24d5863029c15,3
+np.float64,0x7fcf4745e73e8e8b,0x7ff0000000000000,3
+np.float64,0x7fcc9aec9f3935d8,0x7ff0000000000000,3
+np.float64,0x3fec2e8fcab85d20,0x3ff699ccd0b2fed6,3
+np.float64,0x3fd110a968222153,0x3fd38e81a88c2d13,3
+np.float64,0xffb3a68532274d08,0xbff0000000000000,3
+np.float64,0xf0e562bbe1cad,0xf0e562bbe1cad,3
+np.float64,0xbfe815b9e5f02b74,0xbfe0ec9f5023aebc,3
+np.float64,0xbf5151d88022a400,0xbf514f80c465feea,3
+np.float64,0x2547e3144a8fd,0x2547e3144a8fd,3
+np.float64,0x3fedcc0c28fb9818,0x3ff899612fbeb4c5,3
+np.float64,0x3fdc3d1c0f387a38,0x3fe1bf6e2d39bd75,3
+np.float64,0x7fe544dbe62a89b7,0x7ff0000000000000,3
+np.float64,0x8001500e48e2a01d,0x8001500e48e2a01d,3
+np.float64,0xbfed3b2b09fa7656,0xbfe329f3e7bada64,3
+np.float64,0xbfe76a943aeed528,0xbfe09b24e3aa3f79,3
+np.float64,0x3fe944330e328866,0x3ff33d472dee70c5,3
+np.float64,0x8004bbbd6cc9777c,0x8004bbbd6cc9777c,3
+np.float64,0xbfe28133fb650268,0xbfdc1ac230ac4ef5,3
+np.float64,0xc1370af7826e2,0xc1370af7826e2,3
+np.float64,0x7fcfa47f5f3f48fe,0x7ff0000000000000,3
+np.float64,0xbfa3002a04260050,0xbfa2a703a538b54e,3
+np.float64,0xffef44f3903e89e6,0xbff0000000000000,3
+np.float64,0xc32cce298659a,0xc32cce298659a,3
+np.float64,0x7b477cc2f68f0,0x7b477cc2f68f0,3
+np.float64,0x40a7f4ec814ff,0x40a7f4ec814ff,3
+np.float64,0xffee38edf67c71db,0xbff0000000000000,3
+np.float64,0x3fe23f6f1ce47ede,0x3fe8992b8bb03499,3
+np.float64,0x7fc8edfe7f31dbfc,0x7ff0000000000000,3
+np.float64,0x800bb8e6fb3771ce,0x800bb8e6fb3771ce,3
+np.float64,0xbfe11d364ee23a6c,0xbfda82a0c2ef9e46,3
+np.float64,0xbfeb993cb4b7327a,0xbfe27df565da85dc,3
+np.float64,0x10000000000000,0x10000000000000,3
+np.float64,0x3fc1f997d723f330,0x3fc34c5cff060af1,3
+np.float64,0x6e326fa0dc64f,0x6e326fa0dc64f,3
+np.float64,0x800fa30c2c5f4618,0x800fa30c2c5f4618,3
+np.float64,0x7fed16ad603a2d5a,0x7ff0000000000000,3
+np.float64,0x9411cf172823a,0x9411cf172823a,3
+np.float64,0xffece51d4cb9ca3a,0xbff0000000000000,3
+np.float64,0x3fdda3d1453b47a3,0x3fe2d954f7849890,3
+np.float64,0xffd58330172b0660,0xbff0000000000000,3
+np.float64,0xbfc6962ae52d2c54,0xbfc4b4bdf0069f17,3
+np.float64,0xbfb4010a8e280218,0xbfb33e1236f7efa0,3
+np.float64,0x7fd0444909208891,0x7ff0000000000000,3
+np.float64,0xbfe027a24de04f44,0xbfd95e9064101e7c,3
+np.float64,0xa6f3f3214de9,0xa6f3f3214de9,3
+np.float64,0xbfe112eb0fe225d6,0xbfda768f7cbdf346,3
+np.float64,0xbfe99e90d4b33d22,0xbfe1a153e45a382a,3
+np.float64,0xffecb34f8e79669e,0xbff0000000000000,3
+np.float64,0xbfdf32c9653e6592,0xbfd8b159caf5633d,3
+np.float64,0x3fe9519829b2a330,0x3ff34c0a8152e20f,3
+np.float64,0xffd08ec8a7a11d92,0xbff0000000000000,3
+np.float64,0xffd19b71b6a336e4,0xbff0000000000000,3
+np.float64,0x7feda6b9377b4d71,0x7ff0000000000000,3
+np.float64,0x800fda2956bfb453,0x800fda2956bfb453,3
+np.float64,0x3fe54f601bea9ec0,0x3fee483cb03cbde4,3
+np.float64,0xbfe2a8ad5ee5515a,0xbfdc46ee7a10bf0d,3
+np.float64,0xbfd336c8bd266d92,0xbfd09916d432274a,3
+np.float64,0xfff0000000000000,0xbff0000000000000,3
+np.float64,0x3fd9a811a9b35024,0x3fdf8fa68cc048e3,3
+np.float64,0x3fe078c68520f18d,0x3fe58aecc1f9649b,3
+np.float64,0xbfc6d5aa3a2dab54,0xbfc4e9ea84f3d73c,3
+np.float64,0xf9682007f2d04,0xf9682007f2d04,3
+np.float64,0x3fee54523dbca8a4,0x3ff947b826de81f4,3
+np.float64,0x80461e5d008c4,0x80461e5d008c4,3
+np.float64,0x3fdd6d12d5bada26,0x3fe2ade8dee2fa02,3
+np.float64,0x3fcd5f0dfd3abe18,0x3fd081d6cd25731d,3
+np.float64,0x7fa36475c826c8eb,0x7ff0000000000000,3
+np.float64,0xbfdf3ce052be79c0,0xbfd8b78baccfb908,3
+np.float64,0x7fcd890dd13b121b,0x7ff0000000000000,3
+np.float64,0x8000000000000001,0x8000000000000001,3
+np.float64,0x800ec0f4281d81e8,0x800ec0f4281d81e8,3
+np.float64,0xbfba960116352c00,0xbfb94085424496d9,3
+np.float64,0x3fdddedc9bbbbdb8,0x3fe30853fe4ef5ce,3
+np.float64,0x238092a847013,0x238092a847013,3
+np.float64,0xbfe38d4803271a90,0xbfdd429a955c46af,3
+np.float64,0xbfd4c9067329920c,0xbfd1bf6255ed91a4,3
+np.float64,0xbfbee213923dc428,0xbfbd17ce1bda6088,3
+np.float64,0xffd5a2d337ab45a6,0xbff0000000000000,3
+np.float64,0x7fe21bfcf82437f9,0x7ff0000000000000,3
+np.float64,0x3fe2a2714da544e3,0x3fe949594a74ea25,3
+np.float64,0x800e05cf8ebc0b9f,0x800e05cf8ebc0b9f,3
+np.float64,0x559a1526ab343,0x559a1526ab343,3
+np.float64,0xffe6a1b7906d436e,0xbff0000000000000,3
+np.float64,0xffef27d6253e4fab,0xbff0000000000000,3
+np.float64,0xbfe0f90ab0a1f216,0xbfda5828a1edde48,3
+np.float64,0x9675d2ab2cebb,0x9675d2ab2cebb,3
+np.float64,0xffee0f7eecfc1efd,0xbff0000000000000,3
+np.float64,0x2ec005625d801,0x2ec005625d801,3
+np.float64,0x7fde35ff14bc6bfd,0x7ff0000000000000,3
+np.float64,0xffe03f36d9e07e6d,0xbff0000000000000,3
+np.float64,0x7fe09ff7c4213fef,0x7ff0000000000000,3
+np.float64,0xffeac29dd1b5853b,0xbff0000000000000,3
+np.float64,0x3fb63120aa2c6241,0x3fb72ea3de98a853,3
+np.float64,0xffd079eb84a0f3d8,0xbff0000000000000,3
+np.float64,0xbfd3c2cc75a78598,0xbfd1005996880b3f,3
+np.float64,0x7fb80507ee300a0f,0x7ff0000000000000,3
+np.float64,0xffe8006105f000c1,0xbff0000000000000,3
+np.float64,0x8009138b0ab22716,0x8009138b0ab22716,3
+np.float64,0xbfd6dfb40b2dbf68,0xbfd33b8e4008e3b0,3
+np.float64,0xbfe7c2cf9bef859f,0xbfe0c55c807460df,3
+np.float64,0xbfe75fe4da6ebfca,0xbfe09600256d3b81,3
+np.float64,0xffd662fc73acc5f8,0xbff0000000000000,3
+np.float64,0x20b99dbc41735,0x20b99dbc41735,3
+np.float64,0x3fe10b38ade21671,0x3fe68229a9bbeefc,3
+np.float64,0x3743b99c6e878,0x3743b99c6e878,3
+np.float64,0xff9eb5ed903d6be0,0xbff0000000000000,3
+np.float64,0x3ff0000000000000,0x3ffb7e151628aed3,3
+np.float64,0xffb9e0569e33c0b0,0xbff0000000000000,3
+np.float64,0x7fd39c804fa73900,0x7ff0000000000000,3
+np.float64,0x3fe881ef67f103df,0x3ff269dd704b7129,3
+np.float64,0x1b6eb40236dd7,0x1b6eb40236dd7,3
+np.float64,0xbfe734ea432e69d4,0xbfe0813e6355d02f,3
+np.float64,0xffcf48f3743e91e8,0xbff0000000000000,3
+np.float64,0xffed10bcf6fa2179,0xbff0000000000000,3
+np.float64,0x3fef07723b7e0ee4,0x3ffa3156123f3c15,3
+np.float64,0xffe45c704aa8b8e0,0xbff0000000000000,3
+np.float64,0xb7b818d96f703,0xb7b818d96f703,3
+np.float64,0x42fcc04085f99,0x42fcc04085f99,3
+np.float64,0xbfda7ced01b4f9da,0xbfd5b0ce1e5524ae,3
+np.float64,0xbfe1e5963d63cb2c,0xbfdb6a87b6c09185,3
+np.float64,0x7fdfa18003bf42ff,0x7ff0000000000000,3
+np.float64,0xbfe3790a43e6f214,0xbfdd2c9a38b4f089,3
+np.float64,0xffe0ff5b9ae1feb6,0xbff0000000000000,3
+np.float64,0x80085a7d3110b4fb,0x80085a7d3110b4fb,3
+np.float64,0xffd6bfa6622d7f4c,0xbff0000000000000,3
+np.float64,0xbfef5ddc7cfebbb9,0xbfe3fe170521593e,3
+np.float64,0x3fc21773fa242ee8,0x3fc36ebda1f91a72,3
+np.float64,0x7fc04d98da209b31,0x7ff0000000000000,3
+np.float64,0xbfeba3b535b7476a,0xbfe282602e3c322e,3
+np.float64,0xffd41fb5c1a83f6c,0xbff0000000000000,3
+np.float64,0xf87d206df0fa4,0xf87d206df0fa4,3
+np.float64,0x800060946fc0c12a,0x800060946fc0c12a,3
+np.float64,0x3fe69d5f166d3abe,0x3ff06fdddcf4ca93,3
+np.float64,0x7fe9b5793b336af1,0x7ff0000000000000,3
+np.float64,0x7fe0dd4143e1ba82,0x7ff0000000000000,3
+np.float64,0xbfa8eaea3c31d5d0,0xbfa8522e397da3bd,3
+np.float64,0x119f0078233e1,0x119f0078233e1,3
+np.float64,0xbfd78a207aaf1440,0xbfd3b225bbf2ab4f,3
+np.float64,0xc66a6d4d8cd4e,0xc66a6d4d8cd4e,3
+np.float64,0xe7fc4b57cff8a,0xe7fc4b57cff8a,3
+np.float64,0x800883e8091107d0,0x800883e8091107d0,3
+np.float64,0x3fa6520c842ca419,0x3fa6d06e1041743a,3
+np.float64,0x3fa563182c2ac630,0x3fa5d70e27a84c97,3
+np.float64,0xe6a30b61cd462,0xe6a30b61cd462,3
+np.float64,0x3fee85dac37d0bb6,0x3ff987cfa41a9778,3
+np.float64,0x3fe8f621db71ec44,0x3ff2e7b768a2e9d0,3
+np.float64,0x800f231d861e463b,0x800f231d861e463b,3
+np.float64,0xbfe22eb07c645d61,0xbfdbbdbb853ab4c6,3
+np.float64,0x7fd2dda2dea5bb45,0x7ff0000000000000,3
+np.float64,0xbfd09b79a0a136f4,0xbfcd4147606ffd27,3
+np.float64,0xca039cc394074,0xca039cc394074,3
+np.float64,0x8000000000000000,0x8000000000000000,3
+np.float64,0xcb34575d9668b,0xcb34575d9668b,3
+np.float64,0x3fea62c1f3f4c584,0x3ff47e6dc67ec89f,3
+np.float64,0x7fe544c8606a8990,0x7ff0000000000000,3
+np.float64,0xffe0a980c4615301,0xbff0000000000000,3
+np.float64,0x3fdd67d5f8bacfac,0x3fe2a9c3421830f1,3
+np.float64,0xffe41d3dda283a7b,0xbff0000000000000,3
+np.float64,0xffeed59e5ffdab3c,0xbff0000000000000,3
+np.float64,0xffeeae8326fd5d05,0xbff0000000000000,3
+np.float64,0x800d70b4fa7ae16a,0x800d70b4fa7ae16a,3
+np.float64,0xffec932e6839265c,0xbff0000000000000,3
+np.float64,0xee30b185dc616,0xee30b185dc616,3
+np.float64,0x7fc3cf4397279e86,0x7ff0000000000000,3
+np.float64,0xbfeab34f1875669e,0xbfe21b868229de7d,3
+np.float64,0xf45f5f7de8bec,0xf45f5f7de8bec,3
+np.float64,0x3fad2c4b203a5896,0x3fae0528b568f3cf,3
+np.float64,0xbfe2479543e48f2a,0xbfdbd9e57cf64028,3
+np.float64,0x3fd41a1473283429,0x3fd79df2bc60debb,3
+np.float64,0x3febb5155ef76a2a,0x3ff608585afd698b,3
+np.float64,0xffe21f5303e43ea6,0xbff0000000000000,3
+np.float64,0x7fe9ef390833de71,0x7ff0000000000000,3
+np.float64,0xffe8ee873d71dd0e,0xbff0000000000000,3
+np.float64,0x7fd7cbc55e2f978a,0x7ff0000000000000,3
+np.float64,0x80081f9080d03f21,0x80081f9080d03f21,3
+np.float64,0x7fecbafc8b3975f8,0x7ff0000000000000,3
+np.float64,0x800b6c4b0b16d896,0x800b6c4b0b16d896,3
+np.float64,0xbfaa0fc2d4341f80,0xbfa968cdf32b98ad,3
+np.float64,0x3fec79fe4078f3fc,0x3ff6f5361a4a5d93,3
+np.float64,0xbfb14b79de2296f0,0xbfb0b93b75ecec11,3
+np.float64,0x800009d084c013a2,0x800009d084c013a2,3
+np.float64,0x4a4cdfe29499d,0x4a4cdfe29499d,3
+np.float64,0xbfe721c2d56e4386,0xbfe077f541987d76,3
+np.float64,0x3e5f539e7cbeb,0x3e5f539e7cbeb,3
+np.float64,0x3fd23f044c247e09,0x3fd51ceafcdd64aa,3
+np.float64,0x3fc70785b02e0f0b,0x3fc93b2a37eb342a,3
+np.float64,0xbfe7ab4ec7af569e,0xbfe0ba28eecbf6b0,3
+np.float64,0x800c1d4134583a83,0x800c1d4134583a83,3
+np.float64,0xffd9a73070334e60,0xbff0000000000000,3
+np.float64,0x68a4bf24d1499,0x68a4bf24d1499,3
+np.float64,0x7feba9d9507753b2,0x7ff0000000000000,3
+np.float64,0xbfe9d747db73ae90,0xbfe1bab53d932010,3
+np.float64,0x800a9a4aed953496,0x800a9a4aed953496,3
+np.float64,0xffcb89b0ad371360,0xbff0000000000000,3
+np.float64,0xbfc62388b82c4710,0xbfc4547be442a38c,3
+np.float64,0x800a006d187400db,0x800a006d187400db,3
+np.float64,0x3fcef2fbd33de5f8,0x3fd18177b2150148,3
+np.float64,0x8000b74e3da16e9d,0x8000b74e3da16e9d,3
+np.float64,0x25be536e4b7cb,0x25be536e4b7cb,3
+np.float64,0x3fa86e189430dc31,0x3fa905b4684c9f01,3
+np.float64,0xa7584b114eb0a,0xa7584b114eb0a,3
+np.float64,0x800331133c866227,0x800331133c866227,3
+np.float64,0x3fb52b48142a5690,0x3fb611a6f6e7c664,3
+np.float64,0x3fe825797cf04af2,0x3ff206fd60e98116,3
+np.float64,0x3fd0bec4e5217d8a,0x3fd323db3ffd59b2,3
+np.float64,0x907b43a120f7,0x907b43a120f7,3
+np.float64,0x3fed31eb1d3a63d6,0x3ff7d7a91c6930a4,3
+np.float64,0x7f97a13d782f427a,0x7ff0000000000000,3
+np.float64,0xffc7121a702e2434,0xbff0000000000000,3
+np.float64,0xbfe8bb4cbbf1769a,0xbfe139d7f46f1fb1,3
+np.float64,0xbfe3593cc5a6b27a,0xbfdd09ec91d6cd48,3
+np.float64,0x7fcff218ff9ff,0x7fcff218ff9ff,3
+np.float64,0x3fe73651d4ae6ca4,0x3ff10c5c1d21d127,3
+np.float64,0x80054e396eaa9c74,0x80054e396eaa9c74,3
+np.float64,0x3fe527d5f9aa4fac,0x3fedfb7743db9b53,3
+np.float64,0x7fec6f28c5f8de51,0x7ff0000000000000,3
+np.float64,0x3fcd2bbff53a5780,0x3fd061987416b49b,3
+np.float64,0xffd1f0046423e008,0xbff0000000000000,3
+np.float64,0x80034d97fac69b31,0x80034d97fac69b31,3
+np.float64,0x3faa803f14350080,0x3fab32e3f8073be4,3
+np.float64,0x3fcf8da0163f1b40,0x3fd1e42ba2354c8e,3
+np.float64,0x3fd573c2632ae785,0x3fd97c37609d18d7,3
+np.float64,0x7f922960482452c0,0x7ff0000000000000,3
+np.float64,0x800ebd0c5d3d7a19,0x800ebd0c5d3d7a19,3
+np.float64,0xbfee63b7807cc76f,0xbfe39ec7981035db,3
+np.float64,0xffdc023f8e380480,0xbff0000000000000,3
+np.float64,0x3fe3ffa02c67ff40,0x3febc7f8b900ceba,3
+np.float64,0x36c508b86d8a2,0x36c508b86d8a2,3
+np.float64,0x3fc9fbb0f133f760,0x3fcccee9f6ba801c,3
+np.float64,0x3fd75c1d5faeb83b,0x3fdc3150f9eff99e,3
+np.float64,0x3fe9a8d907b351b2,0x3ff3accc78a31df8,3
+np.float64,0x3fdd8fdcafbb1fb8,0x3fe2c97c97757994,3
+np.float64,0x3fb10c34ca22186a,0x3fb1a0cc42c76b86,3
+np.float64,0xbff0000000000000,0xbfe43a54e4e98864,3
+np.float64,0xffd046aefda08d5e,0xbff0000000000000,3
+np.float64,0x80067989758cf314,0x80067989758cf314,3
+np.float64,0x3fee9d77763d3aef,0x3ff9a67ff0841ba5,3
+np.float64,0xffe4d3cbf8e9a798,0xbff0000000000000,3
+np.float64,0x800f9cab273f3956,0x800f9cab273f3956,3
+np.float64,0x800a5c84f9f4b90a,0x800a5c84f9f4b90a,3
+np.float64,0x4fd377009fa8,0x4fd377009fa8,3
+np.float64,0xbfe7ba26af6f744e,0xbfe0c13ce45d6f95,3
+np.float64,0x609c8a86c1392,0x609c8a86c1392,3
+np.float64,0x7fe4d0296ea9a052,0x7ff0000000000000,3
+np.float64,0x59847bccb3090,0x59847bccb3090,3
+np.float64,0xbfdf944157bf2882,0xbfd8ed092bacad43,3
+np.float64,0xbfe7560a632eac15,0xbfe091405ec34973,3
+np.float64,0x3fea0699f4340d34,0x3ff415eb72089230,3
+np.float64,0x800a5533f374aa68,0x800a5533f374aa68,3
+np.float64,0xbf8e8cdb103d19c0,0xbf8e52cffcb83774,3
+np.float64,0x3fe87d9e52f0fb3d,0x3ff2653952344b81,3
+np.float64,0x7fca3950f73472a1,0x7ff0000000000000,3
+np.float64,0xffd5d1068aaba20e,0xbff0000000000000,3
+np.float64,0x3fd1a5f169a34be4,0x3fd4524b6ef17f91,3
+np.float64,0x3fdc4b95a8b8972c,0x3fe1caafd8652bf7,3
+np.float64,0x3fe333f65a6667ed,0x3fea502fb1f8a578,3
+np.float64,0xbfc117aaac222f54,0xbfc00018a4b84b6e,3
+np.float64,0x7fecf2efdf39e5df,0x7ff0000000000000,3
+np.float64,0x4e99d83e9d33c,0x4e99d83e9d33c,3
+np.float64,0x800d18937bda3127,0x800d18937bda3127,3
+np.float64,0x3fd6c67778ad8cef,0x3fdb5aba70a3ea9e,3
+np.float64,0x3fdbb71770b76e2f,0x3fe157ae8da20bc5,3
+np.float64,0xbfe9faf6ebf3f5ee,0xbfe1ca963d83f17f,3
+np.float64,0x80038850ac0710a2,0x80038850ac0710a2,3
+np.float64,0x8006beb72f8d7d6f,0x8006beb72f8d7d6f,3
+np.float64,0x3feead67bffd5acf,0x3ff9bb43e8b15e2f,3
+np.float64,0xbfd1174b89222e98,0xbfcdff9972799907,3
+np.float64,0x7fee2c077cfc580e,0x7ff0000000000000,3
+np.float64,0xbfbdbd904e3b7b20,0xbfbc13f4916ed466,3
+np.float64,0xffee47b8fe3c8f71,0xbff0000000000000,3
+np.float64,0xffd161884222c310,0xbff0000000000000,3
+np.float64,0xbfd42f27c4a85e50,0xbfd14fa8d67ba5ee,3
+np.float64,0x7fefffffffffffff,0x7ff0000000000000,3
+np.float64,0x8008151791b02a30,0x8008151791b02a30,3
+np.float64,0xbfba79029234f208,0xbfb926616cf41755,3
+np.float64,0x8004c486be29890e,0x8004c486be29890e,3
+np.float64,0x7fe5325a252a64b3,0x7ff0000000000000,3
+np.float64,0x5a880f04b5103,0x5a880f04b5103,3
+np.float64,0xbfe6f4b7702de96f,0xbfe06209002dd72c,3
+np.float64,0xbfdf8b3739bf166e,0xbfd8e783efe3c30f,3
+np.float64,0xbfe32571c8e64ae4,0xbfdcd128b9aa49a1,3
+np.float64,0xbfe97c98c172f932,0xbfe1920ac0fc040f,3
+np.float64,0x3fd0b513a2a16a28,0x3fd31744e3a1bf0a,3
+np.float64,0xffe3ab70832756e0,0xbff0000000000000,3
+np.float64,0x80030f055ce61e0b,0x80030f055ce61e0b,3
+np.float64,0xffd5f3b21b2be764,0xbff0000000000000,3
+np.float64,0x800c1f2d6c783e5b,0x800c1f2d6c783e5b,3
+np.float64,0x80075f4f148ebe9f,0x80075f4f148ebe9f,3
+np.float64,0xbfa5a046f42b4090,0xbfa52cfbf8992256,3
+np.float64,0xffd6702583ace04c,0xbff0000000000000,3
+np.float64,0x800dc0a5cf1b814c,0x800dc0a5cf1b814c,3
+np.float64,0x14f2203a29e45,0x14f2203a29e45,3
+np.float64,0x800421a40ee84349,0x800421a40ee84349,3
+np.float64,0xbfea7c279df4f84f,0xbfe2037fff3ed877,3
+np.float64,0xbfe9b41ddcf3683c,0xbfe1aafe18a44bf8,3
+np.float64,0xffe7b037022f606e,0xbff0000000000000,3
+np.float64,0x800bafb648775f6d,0x800bafb648775f6d,3
+np.float64,0x800b81681d5702d1,0x800b81681d5702d1,3
+np.float64,0x3fe29f8dc8653f1c,0x3fe9442da1c32c6b,3
+np.float64,0xffef9a05dc7f340b,0xbff0000000000000,3
+np.float64,0x800c8c65a65918cb,0x800c8c65a65918cb,3
+np.float64,0xffe99df0d5f33be1,0xbff0000000000000,3
+np.float64,0x9afeb22535fd7,0x9afeb22535fd7,3
+np.float64,0x7fc620dd822c41ba,0x7ff0000000000000,3
+np.float64,0x29c2cdf25385b,0x29c2cdf25385b,3
+np.float64,0x2d92284e5b246,0x2d92284e5b246,3
+np.float64,0xffc794aa942f2954,0xbff0000000000000,3
+np.float64,0xbfe7ed907eafdb21,0xbfe0d9a7b1442497,3
+np.float64,0xbfd4e0d4aea9c1aa,0xbfd1d09366dba2a7,3
+np.float64,0xa70412c34e083,0xa70412c34e083,3
+np.float64,0x41dc0ee083b9,0x41dc0ee083b9,3
+np.float64,0x8000ece20da1d9c5,0x8000ece20da1d9c5,3
+np.float64,0x3fdf3dae103e7b5c,0x3fe42314bf826bc5,3
+np.float64,0x3fe972533c72e4a6,0x3ff3703761e70f04,3
+np.float64,0xffba1d2b82343a58,0xbff0000000000000,3
+np.float64,0xe0086c83c010e,0xe0086c83c010e,3
+np.float64,0x3fe6fb0dde6df61c,0x3ff0cf5fae01aa08,3
+np.float64,0x3fcfaf057e3f5e0b,0x3fd1f98c1fd20139,3
+np.float64,0xbfdca19d9239433c,0xbfd7158745192ca9,3
+np.float64,0xffb17f394e22fe70,0xbff0000000000000,3
+np.float64,0x7fe40f05c7681e0b,0x7ff0000000000000,3
+np.float64,0x800b3c575d5678af,0x800b3c575d5678af,3
+np.float64,0x7fa4ab20ac295640,0x7ff0000000000000,3
+np.float64,0xbfd2fff4f6a5ffea,0xbfd07069bb50e1a6,3
+np.float64,0xbfef81b9147f0372,0xbfe40b845a749787,3
+np.float64,0x7fd7400e54ae801c,0x7ff0000000000000,3
+np.float64,0x3fd4401a17a88034,0x3fd7d20fb76a4f3d,3
+np.float64,0xbfd3e907fd27d210,0xbfd11c64b7577fc5,3
+np.float64,0x7fe34bed9ae697da,0x7ff0000000000000,3
+np.float64,0x80039119c0472234,0x80039119c0472234,3
+np.float64,0xbfe2e36ac565c6d6,0xbfdc88454ee997b3,3
+np.float64,0xbfec57204478ae40,0xbfe2cd3183de1d2d,3
+np.float64,0x7fed7e2a12fafc53,0x7ff0000000000000,3
+np.float64,0x7fd5c5fa7d2b8bf4,0x7ff0000000000000,3
+np.float64,0x3fdcf368d6b9e6d0,0x3fe24decce1ebd35,3
+np.float64,0xbfe0ebfcf2e1d7fa,0xbfda48c9247ae8cf,3
+np.float64,0xbfe10dbea2e21b7e,0xbfda707d68b59674,3
+np.float64,0xbfdf201b6ebe4036,0xbfd8a5df27742fdf,3
+np.float64,0xffe16555be62caab,0xbff0000000000000,3
+np.float64,0xffc23a5db22474bc,0xbff0000000000000,3
+np.float64,0xffe1cbb3f8a39768,0xbff0000000000000,3
+np.float64,0x8007b823be0f7048,0x8007b823be0f7048,3
+np.float64,0xbfa5d1f3042ba3e0,0xbfa55c97cd77bf6e,3
+np.float64,0xbfe316a074662d41,0xbfdcc0da4e7334d0,3
+np.float64,0xbfdfab2bf2bf5658,0xbfd8fb046b88b51f,3
+np.float64,0xfacc9dabf5994,0xfacc9dabf5994,3
+np.float64,0xffe7e420a4efc841,0xbff0000000000000,3
+np.float64,0x800bb986cd57730e,0x800bb986cd57730e,3
+np.float64,0xbfe314fa38e629f4,0xbfdcbf09302c3bf5,3
+np.float64,0x7fc56b17772ad62e,0x7ff0000000000000,3
+np.float64,0x8006a87d54ad50fb,0x8006a87d54ad50fb,3
+np.float64,0xbfe6633e4a6cc67c,0xbfe01a67c3b3ff32,3
+np.float64,0x3fe0ff56eb21feae,0x3fe66df01defb0fb,3
+np.float64,0xffc369cfc126d3a0,0xbff0000000000000,3
+np.float64,0x7fe8775d9a30eeba,0x7ff0000000000000,3
+np.float64,0x3fb53db13e2a7b60,0x3fb625a7279cdac3,3
+np.float64,0xffee76e7e6fcedcf,0xbff0000000000000,3
+np.float64,0xb45595b568ab3,0xb45595b568ab3,3
+np.float64,0xffa09a1d50213440,0xbff0000000000000,3
+np.float64,0x7d11dc16fa23c,0x7d11dc16fa23c,3
+np.float64,0x7fd4cc2928299851,0x7ff0000000000000,3
+np.float64,0x6a30e0ead461d,0x6a30e0ead461d,3
+np.float64,0x7fd3ee735a27dce6,0x7ff0000000000000,3
+np.float64,0x8008d7084b31ae11,0x8008d7084b31ae11,3
+np.float64,0x3fe469353fe8d26a,0x3fec8e7e2df38590,3
+np.float64,0x3fcecef2743d9de5,0x3fd16a888b715dfd,3
+np.float64,0x460130d68c027,0x460130d68c027,3
+np.float64,0xbfd76510c62eca22,0xbfd398766b741d6e,3
+np.float64,0x800ec88c2a5d9118,0x800ec88c2a5d9118,3
+np.float64,0x3fac969c6c392d40,0x3fad66ca6a1e583c,3
+np.float64,0x3fe5c616bf6b8c2e,0x3fef30f931e8dde5,3
+np.float64,0xb4cb6cd56996e,0xb4cb6cd56996e,3
+np.float64,0xffc3eacf8827d5a0,0xbff0000000000000,3
+np.float64,0x3fe1ceaf60e39d5f,0x3fe7d31e0a627cf9,3
+np.float64,0xffea69b42ff4d368,0xbff0000000000000,3
+np.float64,0x800ff8aef99ff15e,0x800ff8aef99ff15e,3
+np.float64,0x6c3953f0d872b,0x6c3953f0d872b,3
+np.float64,0x8007ca5a0d0f94b5,0x8007ca5a0d0f94b5,3
+np.float64,0x800993ce3ad3279d,0x800993ce3ad3279d,3
+np.float64,0x3fe5a4d1516b49a2,0x3feeef67b22ac65b,3
+np.float64,0x8003d7512a67aea3,0x8003d7512a67aea3,3
+np.float64,0x33864430670c9,0x33864430670c9,3
+np.float64,0xbfdbf477e3b7e8f0,0xbfd6a63f1b36f424,3
+np.float64,0x3fb5da92582bb525,0x3fb6d04ef1a1d31a,3
+np.float64,0xe38aae71c7156,0xe38aae71c7156,3
+np.float64,0x3fcaf5590a35eab2,0x3fce01ed6eb6188e,3
+np.float64,0x800deba9b05bd754,0x800deba9b05bd754,3
+np.float64,0x7fee0cde287c19bb,0x7ff0000000000000,3
+np.float64,0xbfe0c2ae70e1855d,0xbfda17fa64d84fcf,3
+np.float64,0x518618faa30c4,0x518618faa30c4,3
+np.float64,0xbfeb4c49b8769894,0xbfe25d52cd7e529f,3
+np.float64,0xbfeb3aa21b367544,0xbfe255cae1df4cfd,3
+np.float64,0xffd23f1c5d247e38,0xbff0000000000000,3
+np.float64,0xff9a75132034ea20,0xbff0000000000000,3
+np.float64,0xbfef9d96307f3b2c,0xbfe415e8b6ce0e50,3
+np.float64,0x8004046f2f0808df,0x8004046f2f0808df,3
+np.float64,0x3fe15871aea2b0e3,0x3fe706532ea5c770,3
+np.float64,0x7fd86b1576b0d62a,0x7ff0000000000000,3
+np.float64,0xbfc240a5c724814c,0xbfc102c7971ca455,3
+np.float64,0xffd8ea670bb1d4ce,0xbff0000000000000,3
+np.float64,0xbfeb1ddd1ff63bba,0xbfe2497c4e27bb8e,3
+np.float64,0x3fcd47e0a33a8fc1,0x3fd0734444150d83,3
+np.float64,0xe00b6a65c016e,0xe00b6a65c016e,3
+np.float64,0xbfc7d582142fab04,0xbfc5bf1fbe755a4c,3
+np.float64,0x8cc91ca11993,0x8cc91ca11993,3
+np.float64,0x7fdbc530e3b78a61,0x7ff0000000000000,3
+np.float64,0x7fee437522bc86e9,0x7ff0000000000000,3
+np.float64,0xffe9e09ae2b3c135,0xbff0000000000000,3
+np.float64,0x8002841cada5083a,0x8002841cada5083a,3
+np.float64,0x3fd6b485f8ad690c,0x3fdb412135932699,3
+np.float64,0x80070e8d0b0e1d1b,0x80070e8d0b0e1d1b,3
+np.float64,0x7fed5df165babbe2,0x7ff0000000000000,3
+np.float64,0x7ff4000000000000,0x7ffc000000000000,3
+np.float64,0x7fe99d08cd333a11,0x7ff0000000000000,3
+np.float64,0xdfff4201bfff,0xdfff4201bfff,3
+np.float64,0x800ccf7aaf999ef6,0x800ccf7aaf999ef6,3
+np.float64,0x3fddb05aad3b60b5,0x3fe2e34bdd1dd9d5,3
+np.float64,0xbfe5e1c60e6bc38c,0xbfdfb3275cc1675f,3
+np.float64,0x8004fe674269fccf,0x8004fe674269fccf,3
+np.float64,0x7fe9280363325006,0x7ff0000000000000,3
+np.float64,0xf605b9f1ec0b7,0xf605b9f1ec0b7,3
+np.float64,0x800c7c214018f843,0x800c7c214018f843,3
+np.float64,0x7fd97eb6b9b2fd6c,0x7ff0000000000000,3
+np.float64,0x7fd03f8fb6207f1e,0x7ff0000000000000,3
+np.float64,0x7fc526b64d2a4d6c,0x7ff0000000000000,3
+np.float64,0xbfef1a7c42fe34f9,0xbfe3e4b4399e0fcf,3
+np.float64,0xffdde10a2fbbc214,0xbff0000000000000,3
+np.float64,0xbfdd274f72ba4e9e,0xbfd76aa73788863c,3
+np.float64,0xbfecf7f77af9efef,0xbfe30ee2ae03fed1,3
+np.float64,0xffde709322bce126,0xbff0000000000000,3
+np.float64,0x268b5dac4d16d,0x268b5dac4d16d,3
+np.float64,0x8005c099606b8134,0x8005c099606b8134,3
+np.float64,0xffcf54c1593ea984,0xbff0000000000000,3
+np.float64,0xbfee9b8ebabd371d,0xbfe3b44f2663139d,3
+np.float64,0x3faf0330643e0661,0x3faff88fab74b447,3
+np.float64,0x7fe1c6011be38c01,0x7ff0000000000000,3
+np.float64,0xbfe9d58053b3ab01,0xbfe1b9ea12242485,3
+np.float64,0xbfe15a80fee2b502,0xbfdaca2aa7d1231a,3
+np.float64,0x7fe0d766d8a1aecd,0x7ff0000000000000,3
+np.float64,0x800f65e6a21ecbcd,0x800f65e6a21ecbcd,3
+np.float64,0x7fc85e45a530bc8a,0x7ff0000000000000,3
+np.float64,0x3fcc240e5438481d,0x3fcf7954fc080ac3,3
+np.float64,0xffddd49da2bba93c,0xbff0000000000000,3
+np.float64,0x1376f36c26edf,0x1376f36c26edf,3
+np.float64,0x3feffb7af17ff6f6,0x3ffb77f0ead2f881,3
+np.float64,0x3fd9354ea9b26a9d,0x3fdee4e4c8db8239,3
+np.float64,0xffdf7beed4bef7de,0xbff0000000000000,3
+np.float64,0xbfdef256ecbde4ae,0xbfd889b0e213a019,3
+np.float64,0x800d78bd1e7af17a,0x800d78bd1e7af17a,3
+np.float64,0xb66d66276cdad,0xb66d66276cdad,3
+np.float64,0x7fd8f51138b1ea21,0x7ff0000000000000,3
+np.float64,0xffe8c9c302b19385,0xbff0000000000000,3
+np.float64,0x8000be4cf5417c9b,0x8000be4cf5417c9b,3
+np.float64,0xbfe2293a25645274,0xbfdbb78a8c547c68,3
+np.float64,0xce8392c19d08,0xce8392c19d08,3
+np.float64,0xbfe075736b60eae7,0xbfd9bc0f6e34a283,3
+np.float64,0xbfe8d6fe6a71adfd,0xbfe1469ba80b4915,3
+np.float64,0xffe0c7993fa18f32,0xbff0000000000000,3
+np.float64,0x3fce5210fd3ca422,0x3fd11b40a1270a95,3
+np.float64,0x6c0534a8d80a7,0x6c0534a8d80a7,3
+np.float64,0x23c1823647831,0x23c1823647831,3
+np.float64,0x3fc901253732024a,0x3fcb9d264accb07c,3
+np.float64,0x3fe42b8997685714,0x3fec1a39e207b6e4,3
+np.float64,0x3fec4fd00fb89fa0,0x3ff6c1fdd0c262c8,3
+np.float64,0x8007b333caaf6668,0x8007b333caaf6668,3
+np.float64,0x800f9275141f24ea,0x800f9275141f24ea,3
+np.float64,0xffbba361a23746c0,0xbff0000000000000,3
+np.float64,0xbfee4effa9fc9dff,0xbfe396c11d0cd524,3
+np.float64,0x3e47e84c7c8fe,0x3e47e84c7c8fe,3
+np.float64,0x3fe80eb7b1301d6f,0x3ff1eed318a00153,3
+np.float64,0x7fd3f4c5b4a7e98a,0x7ff0000000000000,3
+np.float64,0x158abab02b158,0x158abab02b158,3
+np.float64,0x1,0x1,3
+np.float64,0x1f1797883e2f4,0x1f1797883e2f4,3
+np.float64,0x3feec055d03d80ac,0x3ff9d3fb0394de33,3
+np.float64,0x8010000000000000,0x8010000000000000,3
+np.float64,0xbfd070860ea0e10c,0xbfccfeec2828efef,3
+np.float64,0x80015c8b3e82b917,0x80015c8b3e82b917,3
+np.float64,0xffef9956d9ff32ad,0xbff0000000000000,3
+np.float64,0x7fe7f087dd2fe10f,0x7ff0000000000000,3
+np.float64,0x8002e7718665cee4,0x8002e7718665cee4,3
+np.float64,0x3fdfb9adb2bf735c,0x3fe4887a86214c1e,3
+np.float64,0xffc7747dfb2ee8fc,0xbff0000000000000,3
+np.float64,0x3fec309bb5386137,0x3ff69c44e1738547,3
+np.float64,0xffdbe2bf9ab7c580,0xbff0000000000000,3
+np.float64,0xbfe6a274daed44ea,0xbfe039aff2be9d48,3
+np.float64,0x7fd5a4e4efab49c9,0x7ff0000000000000,3
+np.float64,0xffbe6aaeb03cd560,0xbff0000000000000,3
diff --git a/numpy/core/tests/data/umath-validation-set-log10.csv b/numpy/core/tests/data/umath-validation-set-log10.csv
new file mode 100644 (file)
index 0000000..7f5241a
--- /dev/null
@@ -0,0 +1,1629 @@
+dtype,input,output,ulperrortol
+np.float32,0x3f6fd5c8,0xbce80e8e,4
+np.float32,0x3ea4ab17,0xbefc3deb,4
+np.float32,0x3e87a133,0xbf13b0b7,4
+np.float32,0x3f0d9069,0xbe83bb19,4
+np.float32,0x3f7b9269,0xbbf84f47,4
+np.float32,0x3f7a9ffa,0xbc16fd97,4
+np.float32,0x7f535d34,0x4219cb66,4
+np.float32,0x3e79ad7c,0xbf1ce857,4
+np.float32,0x7e8bfd3b,0x4217dfe9,4
+np.float32,0x3f2d2ee9,0xbe2dcec6,4
+np.float32,0x572e04,0xc21862e4,4
+np.float32,0x7f36f8,0xc217bad5,4
+np.float32,0x3f7982fb,0xbc36aaed,4
+np.float32,0x45b019,0xc218c67c,4
+np.float32,0x3f521c46,0xbdafb3e3,4
+np.float32,0x80000001,0x7fc00000,4
+np.float32,0x3f336c81,0xbe1e107f,4
+np.float32,0x3eac92d7,0xbef1d0bb,4
+np.float32,0x47bdfc,0xc218b990,4
+np.float32,0x7f2d94c8,0x421973d1,4
+np.float32,0x7d53ff8d,0x4214fbb6,4
+np.float32,0x3f581e4e,0xbd96a079,4
+np.float32,0x7ddaf20d,0x42163e4e,4
+np.float32,0x3f341d3c,0xbe1c5b4c,4
+np.float32,0x7ef04ba9,0x4218d032,4
+np.float32,0x620ed2,0xc2182e99,4
+np.float32,0x507850,0xc2188682,4
+np.float32,0x7d08f9,0xc217c284,4
+np.float32,0x7f0cf2aa,0x42191734,4
+np.float32,0x3f109a17,0xbe7e04fe,4
+np.float32,0x7f426152,0x4219a625,4
+np.float32,0x7f32d5a3,0x42198113,4
+np.float32,0x2e14b2,0xc2197e6f,4
+np.float32,0x3a5acd,0xc219156a,4
+np.float32,0x50a565,0xc2188589,4
+np.float32,0x5b751c,0xc2184d97,4
+np.float32,0x7e4149f6,0x42173b22,4
+np.float32,0x3dc34bf9,0xbf82a42a,4
+np.float32,0x3d12bc28,0xbfb910d6,4
+np.float32,0x7ebd2584,0x421865c1,4
+np.float32,0x7f6b3375,0x4219faeb,4
+np.float32,0x7fa00000,0x7fe00000,4
+np.float32,0x3f35fe7d,0xbe17bd33,4
+np.float32,0x7db45c87,0x4215e818,4
+np.float32,0x3efff366,0xbe9a2b8d,4
+np.float32,0x3eb331d0,0xbee971a3,4
+np.float32,0x3f259d5f,0xbe41ae2e,4
+np.float32,0x3eab85ec,0xbef32c4a,4
+np.float32,0x7f194b8a,0x42193c8c,4
+np.float32,0x3f11a614,0xbe7acfc7,4
+np.float32,0x5b17,0xc221f16b,4
+np.float32,0x3f33dadc,0xbe1cff4d,4
+np.float32,0x3cda1506,0xbfc9920f,4
+np.float32,0x3f6856f1,0xbd2c8290,4
+np.float32,0x7f3357fb,0x42198257,4
+np.float32,0x7f56f329,0x4219d2e1,4
+np.float32,0x3ef84108,0xbea0f595,4
+np.float32,0x3f72340f,0xbcc51916,4
+np.float32,0x3daf28,0xc218fcbd,4
+np.float32,0x131035,0xc21b06f4,4
+np.float32,0x3f275c3b,0xbe3d0487,4
+np.float32,0x3ef06130,0xbea82069,4
+np.float32,0x3f57f3b0,0xbd974fef,4
+np.float32,0x7f6c4a78,0x4219fcfa,4
+np.float32,0x7e8421d0,0x4217c639,4
+np.float32,0x3f17a479,0xbe68e08e,4
+np.float32,0x7f03774e,0x4218f83b,4
+np.float32,0x441a33,0xc218d0b8,4
+np.float32,0x539158,0xc21875b6,4
+np.float32,0x3e8fcc75,0xbf0d3018,4
+np.float32,0x7ef74130,0x4218dce4,4
+np.float32,0x3ea6f4fa,0xbef92c38,4
+np.float32,0x7f3948ab,0x421990d5,4
+np.float32,0x7db6f8f5,0x4215ee7c,4
+np.float32,0x3ee44a2f,0xbeb399e5,4
+np.float32,0x156c59,0xc21ad30d,4
+np.float32,0x3f21ee53,0xbe4baf16,4
+np.float32,0x3f2c08f4,0xbe30c424,4
+np.float32,0x3f49885c,0xbdd4c6a9,4
+np.float32,0x3eae0b9c,0xbeefed54,4
+np.float32,0x1b5c1f,0xc21a6646,4
+np.float32,0x3e7330e2,0xbf1fd592,4
+np.float32,0x3ebbeb4c,0xbededf82,4
+np.float32,0x427154,0xc218dbb1,4
+np.float32,0x3f6b8b4b,0xbd142498,4
+np.float32,0x8e769,0xc21c5981,4
+np.float32,0x3e9db557,0xbf02ec1c,4
+np.float32,0x3f001bef,0xbe99f019,4
+np.float32,0x3e58b48c,0xbf2ca77a,4
+np.float32,0x3d46c16b,0xbfa8327c,4
+np.float32,0x7eeeb305,0x4218cd3b,4
+np.float32,0x3e3f163d,0xbf3aa446,4
+np.float32,0x3f66c872,0xbd3877d9,4
+np.float32,0x7f7162f8,0x421a0677,4
+np.float32,0x3edca3bc,0xbebb2e28,4
+np.float32,0x3dc1055b,0xbf834afa,4
+np.float32,0x12b16f,0xc21b0fad,4
+np.float32,0x3f733898,0xbcb62e16,4
+np.float32,0x3e617af8,0xbf283db0,4
+np.float32,0x7e86577a,0x4217cd99,4
+np.float32,0x3f0ba3c7,0xbe86c633,4
+np.float32,0x3f4cad25,0xbdc70247,4
+np.float32,0xb6cdf,0xc21bea9f,4
+np.float32,0x3f42971a,0xbdf3f49e,4
+np.float32,0x3e6ccad2,0xbf22cc78,4
+np.float32,0x7f2121b2,0x421952b8,4
+np.float32,0x3f6d3f55,0xbd075366,4
+np.float32,0x3f524f,0xc218f117,4
+np.float32,0x3e95b5d9,0xbf08b56a,4
+np.float32,0x7f6ae47d,0x4219fa56,4
+np.float32,0x267539,0xc219ceda,4
+np.float32,0x3ef72f6d,0xbea1eb2e,4
+np.float32,0x2100b2,0xc21a12e2,4
+np.float32,0x3d9777d1,0xbf90c4e7,4
+np.float32,0x44c6f5,0xc218cc56,4
+np.float32,0x7f2a613d,0x42196b8a,4
+np.float32,0x390a25,0xc2191f8d,4
+np.float32,0x3f1de5ad,0xbe56e703,4
+np.float32,0x2f59ce,0xc2197258,4
+np.float32,0x7f3b12a1,0x4219951b,4
+np.float32,0x3ecb66d4,0xbecd44ca,4
+np.float32,0x7e74ff,0xc217bd7d,4
+np.float32,0x7ed83f78,0x4218a14d,4
+np.float32,0x685994,0xc21812f1,4
+np.float32,0xbf800000,0x7fc00000,4
+np.float32,0x736f47,0xc217e60b,4
+np.float32,0x7f09c371,0x42190d0a,4
+np.float32,0x3f7ca51d,0xbbbbbce0,4
+np.float32,0x7f4b4d3b,0x4219ba1a,4
+np.float32,0x3f6c4471,0xbd0eb076,4
+np.float32,0xd944e,0xc21b9dcf,4
+np.float32,0x7cb06ffc,0x421375cd,4
+np.float32,0x586187,0xc2185cce,4
+np.float32,0x3f3cbf5b,0xbe078911,4
+np.float32,0x3f30b504,0xbe24d983,4
+np.float32,0x3f0a16ba,0xbe8941fd,4
+np.float32,0x5c43b0,0xc21849af,4
+np.float32,0x3dad74f6,0xbf893bd5,4
+np.float32,0x3c586958,0xbff087a6,4
+np.float32,0x3e8307a8,0xbf1786ba,4
+np.float32,0x7dcd1776,0x4216213d,4
+np.float32,0x3f44d107,0xbde9d662,4
+np.float32,0x3e2e6823,0xbf44cbec,4
+np.float32,0x3d87ea27,0xbf96caca,4
+np.float32,0x3e0c715b,0xbf5ce07e,4
+np.float32,0x7ec9cd5a,0x4218828e,4
+np.float32,0x3e26c0b4,0xbf49c93e,4
+np.float32,0x75b94e,0xc217dd50,4
+np.float32,0x3df7b9f5,0xbf6ad7f4,4
+np.float32,0x0,0xff800000,4
+np.float32,0x3f284795,0xbe3a94da,4
+np.float32,0x7ee49092,0x4218b9f0,4
+np.float32,0x7f4c20e0,0x4219bbe8,4
+np.float32,0x3efbbce8,0xbe9ddc4b,4
+np.float32,0x12274a,0xc21b1cb4,4
+np.float32,0x5fa1b1,0xc21839be,4
+np.float32,0x7f0b210e,0x4219116d,4
+np.float32,0x3f67092a,0xbd368545,4
+np.float32,0x3d572721,0xbfa3ca5b,4
+np.float32,0x3f7913ce,0xbc431028,4
+np.float32,0x3b0613,0xc2191059,4
+np.float32,0x3e1d16c0,0xbf506c6f,4
+np.float32,0xab130,0xc21c081d,4
+np.float32,0x3e23ac97,0xbf4bdb9d,4
+np.float32,0x7ef52368,0x4218d911,4
+np.float32,0x7f38e686,0x42198fe9,4
+np.float32,0x3f106a21,0xbe7e9897,4
+np.float32,0x3ecef8d5,0xbec96644,4
+np.float32,0x3ec37e02,0xbed61683,4
+np.float32,0x3efbd063,0xbe9dcb17,4
+np.float32,0x3f318fe3,0xbe22b402,4
+np.float32,0x7e5e5228,0x4217795d,4
+np.float32,0x72a046,0xc217e92c,4
+np.float32,0x7f6f970b,0x421a0324,4
+np.float32,0x3ed871b4,0xbebf72fb,4
+np.float32,0x7a2eaa,0xc217ccc8,4
+np.float32,0x3e819655,0xbf18c1d7,4
+np.float32,0x80800000,0x7fc00000,4
+np.float32,0x7eab0719,0x421838f9,4
+np.float32,0x7f0763cb,0x4219054f,4
+np.float32,0x3f191672,0xbe64a8af,4
+np.float32,0x7d4327,0xc217c1b6,4
+np.float32,0x3f724ba6,0xbcc3bea3,4
+np.float32,0x60fe06,0xc2183375,4
+np.float32,0x48cd59,0xc218b30b,4
+np.float32,0x3f7fec2b,0xb909d3f3,4
+np.float32,0x1c7bb9,0xc21a5460,4
+np.float32,0x24d8a8,0xc219e1e4,4
+np.float32,0x3e727c52,0xbf20283c,4
+np.float32,0x4bc460,0xc218a14a,4
+np.float32,0x63e313,0xc2182661,4
+np.float32,0x7f625581,0x4219e9d4,4
+np.float32,0x3eeb3e77,0xbeacedc0,4
+np.float32,0x7ef27a47,0x4218d437,4
+np.float32,0x27105a,0xc219c7e6,4
+np.float32,0x22a10b,0xc219fd7d,4
+np.float32,0x3f41e907,0xbdf711ab,4
+np.float32,0x7c1fbf95,0x4212155b,4
+np.float32,0x7e5acceb,0x42177244,4
+np.float32,0x3e0892fa,0xbf5ffb83,4
+np.float32,0x3ea0e51d,0xbf00b2c0,4
+np.float32,0x3e56fc29,0xbf2d8a51,4
+np.float32,0x7ee724ed,0x4218beed,4
+np.float32,0x7ebf142b,0x42186a46,4
+np.float32,0x7f6cf35c,0x4219fe37,4
+np.float32,0x3f11abf7,0xbe7abdcd,4
+np.float32,0x588d7a,0xc2185bf1,4
+np.float32,0x3f6e81d2,0xbcfbcf97,4
+np.float32,0x3f1b6be8,0xbe5dee2b,4
+np.float32,0x7f3815e0,0x42198df2,4
+np.float32,0x3f5bfc88,0xbd86d93d,4
+np.float32,0x3f3775d0,0xbe142bbc,4
+np.float32,0x78a958,0xc217d25a,4
+np.float32,0x2ff7c3,0xc2196c96,4
+np.float32,0x4b9c0,0xc21d733c,4
+np.float32,0x3ec025af,0xbed9ecf3,4
+np.float32,0x6443f0,0xc21824b3,4
+np.float32,0x3f754e28,0xbc97d299,4
+np.float32,0x3eaa91d3,0xbef4699d,4
+np.float32,0x3e5f2837,0xbf296478,4
+np.float32,0xe5676,0xc21b85a4,4
+np.float32,0x3f6859f2,0xbd2c6b90,4
+np.float32,0x3f68686b,0xbd2bfcc6,4
+np.float32,0x4b39b8,0xc218a47b,4
+np.float32,0x630ac4,0xc2182a28,4
+np.float32,0x160980,0xc21ac67d,4
+np.float32,0x3ed91c4d,0xbebec3fd,4
+np.float32,0x7ec27b0d,0x4218721f,4
+np.float32,0x3f3c0a5f,0xbe09344b,4
+np.float32,0x3dbff9c1,0xbf839841,4
+np.float32,0x7f0e8ea7,0x42191c40,4
+np.float32,0x3f36b162,0xbe1608e4,4
+np.float32,0x228bb3,0xc219fe90,4
+np.float32,0x2fdd30,0xc2196d8c,4
+np.float32,0x3e8fce8e,0xbf0d2e79,4
+np.float32,0x3f36acc7,0xbe16141a,4
+np.float32,0x7f44b51c,0x4219ab70,4
+np.float32,0x3ec3371c,0xbed66736,4
+np.float32,0x4388a2,0xc218d473,4
+np.float32,0x3f5aa6c3,0xbd8c4344,4
+np.float32,0x7f09fce4,0x42190dc3,4
+np.float32,0x7ed7854a,0x42189fce,4
+np.float32,0x7f4da83a,0x4219bf3a,4
+np.float32,0x3db8da28,0xbf85b25a,4
+np.float32,0x7f449686,0x4219ab2b,4
+np.float32,0x2eb25,0xc21e498c,4
+np.float32,0x3f2bcc08,0xbe3161bd,4
+np.float32,0x36c923,0xc219317b,4
+np.float32,0x3d52a866,0xbfa4f6d2,4
+np.float32,0x3f7d6688,0xbb913e4e,4
+np.float32,0x3f5a6ba4,0xbd8d33e3,4
+np.float32,0x719740,0xc217ed35,4
+np.float32,0x78a472,0xc217d26c,4
+np.float32,0x7ee33d0c,0x4218b759,4
+np.float32,0x7f668c1d,0x4219f208,4
+np.float32,0x3e29c600,0xbf47ca46,4
+np.float32,0x3f3cefc3,0xbe071712,4
+np.float32,0x3e224ebd,0xbf4cca41,4
+np.float32,0x7f1417be,0x42192d31,4
+np.float32,0x7f29d7d5,0x42196a23,4
+np.float32,0x3338ce,0xc2194f65,4
+np.float32,0x2a7897,0xc219a2b6,4
+np.float32,0x3d6bc3d8,0xbf9eb468,4
+np.float32,0x3f6bd7bf,0xbd11e392,4
+np.float32,0x7f6d26bf,0x4219fe98,4
+np.float32,0x3f52d378,0xbdacadb5,4
+np.float32,0x3efac453,0xbe9eb84a,4
+np.float32,0x3f692eb7,0xbd261184,4
+np.float32,0x3f6a0bb5,0xbd1f7ec1,4
+np.float32,0x3f037a49,0xbe942aa8,4
+np.float32,0x3f465bd4,0xbde2e530,4
+np.float32,0x7ef0f47b,0x4218d16a,4
+np.float32,0x637127,0xc218285e,4
+np.float32,0x3f41e511,0xbdf723d7,4
+np.float32,0x7f800000,0x7f800000,4
+np.float32,0x3f3342d5,0xbe1e77d5,4
+np.float32,0x7f57cfe6,0x4219d4a9,4
+np.float32,0x3e4358ed,0xbf3830a7,4
+np.float32,0x3ce25f15,0xbfc77f2b,4
+np.float32,0x7ed057e7,0x421890be,4
+np.float32,0x7ce154d9,0x4213e295,4
+np.float32,0x3ee91984,0xbeaef703,4
+np.float32,0x7e4e919c,0x421758af,4
+np.float32,0x6830e7,0xc218139e,4
+np.float32,0x3f12f08e,0xbe76e328,4
+np.float32,0x7f0a7a32,0x42190f56,4
+np.float32,0x7f38e,0xc21c8bd3,4
+np.float32,0x3e01def9,0xbf6593e3,4
+np.float32,0x3f5c8c6d,0xbd849432,4
+np.float32,0x3eed8747,0xbeaac7a3,4
+np.float32,0x3cadaa0e,0xbfd63b21,4
+np.float32,0x3f7532a9,0xbc996178,4
+np.float32,0x31f3ac,0xc2195a8f,4
+np.float32,0x3f0e0f97,0xbe82f3af,4
+np.float32,0x3f2a1f35,0xbe35bd3f,4
+np.float32,0x3f4547b2,0xbde7bebd,4
+np.float32,0x3f7988a6,0xbc36094c,4
+np.float32,0x74464c,0xc217e2d2,4
+np.float32,0x7f7518be,0x421a0d3f,4
+np.float32,0x7e97fa0a,0x42180473,4
+np.float32,0x584e3a,0xc2185d2f,4
+np.float32,0x3e7291f3,0xbf201e52,4
+np.float32,0xc0a05,0xc21bd359,4
+np.float32,0x3a3177,0xc21916a6,4
+np.float32,0x4f417f,0xc2188d45,4
+np.float32,0x263fce,0xc219d145,4
+np.float32,0x7e1d58,0xc217beb1,4
+np.float32,0x7f056af3,0x4218fec9,4
+np.float32,0x3f21c181,0xbe4c2a3f,4
+np.float32,0x7eca4956,0x4218839f,4
+np.float32,0x3e58afa8,0xbf2ca9fd,4
+np.float32,0x3f40d583,0xbdfc04ef,4
+np.float32,0x7f432fbb,0x4219a7fc,4
+np.float32,0x43aaa4,0xc218d393,4
+np.float32,0x7f2c9b62,0x42197150,4
+np.float32,0x5c3876,0xc21849e5,4
+np.float32,0x7f2034e8,0x42195029,4
+np.float32,0x7e5be772,0x42177481,4
+np.float32,0x80000000,0xff800000,4
+np.float32,0x3f5be03b,0xbd874bb0,4
+np.float32,0x3e32494f,0xbf4259be,4
+np.float32,0x3e1f4671,0xbf4ee30b,4
+np.float32,0x4606cc,0xc218c454,4
+np.float32,0x425cbc,0xc218dc3b,4
+np.float32,0x7dd9b8bf,0x42163bd0,4
+np.float32,0x3f0465d0,0xbe929db7,4
+np.float32,0x3f735077,0xbcb4d0fa,4
+np.float32,0x4d6a43,0xc21897b8,4
+np.float32,0x3e27d600,0xbf4910f5,4
+np.float32,0x3f06e0cc,0xbe8e7d24,4
+np.float32,0x3f3fd064,0xbe005e45,4
+np.float32,0x176f1,0xc21f7c2d,4
+np.float32,0x3eb64e6f,0xbee59d9c,4
+np.float32,0x7f0f075d,0x42191db8,4
+np.float32,0x3f718cbe,0xbcceb621,4
+np.float32,0x3ead7bda,0xbef0a54a,4
+np.float32,0x7f77c1a8,0x421a120c,4
+np.float32,0x3f6a79c5,0xbd1c3afd,4
+np.float32,0x3e992d1f,0xbf062a02,4
+np.float32,0x3e6f6335,0xbf219639,4
+np.float32,0x7f6d9a3e,0x4219ff70,4
+np.float32,0x557ed1,0xc2186b91,4
+np.float32,0x3f13a456,0xbe74c457,4
+np.float32,0x15c2dc,0xc21acc17,4
+np.float32,0x71f36f,0xc217ebcc,4
+np.float32,0x748dea,0xc217e1c1,4
+np.float32,0x7f0f32e0,0x42191e3f,4
+np.float32,0x5b1da8,0xc2184f41,4
+np.float32,0x3d865d3a,0xbf976e11,4
+np.float32,0x3f800000,0x0,4
+np.float32,0x7f67b56d,0x4219f444,4
+np.float32,0x6266a1,0xc2182d0c,4
+np.float32,0x3ec9c5e4,0xbecf0e6b,4
+np.float32,0x6a6a0e,0xc2180a3b,4
+np.float32,0x7e9db6fd,0x421814ef,4
+np.float32,0x3e7458f7,0xbf1f4e88,4
+np.float32,0x3ead8016,0xbef09fdc,4
+np.float32,0x3e263d1c,0xbf4a211e,4
+np.float32,0x7f6b3329,0x4219faeb,4
+np.float32,0x800000,0xc217b818,4
+np.float32,0x3f0654c7,0xbe8f6471,4
+np.float32,0x3f281b71,0xbe3b0990,4
+np.float32,0x7c4c8e,0xc217c524,4
+np.float32,0x7d113a87,0x4214537d,4
+np.float32,0x734b5f,0xc217e696,4
+np.float32,0x7f079d05,0x4219060b,4
+np.float32,0x3ee830b1,0xbeafd58b,4
+np.float32,0x3f1c3b8b,0xbe5b9d96,4
+np.float32,0x3f2bf0c6,0xbe3102aa,4
+np.float32,0x7ddffe22,0x42164871,4
+np.float32,0x3f1e58b4,0xbe55a37f,4
+np.float32,0x5f3edf,0xc2183b8a,4
+np.float32,0x7f1fb6ec,0x42194eca,4
+np.float32,0x3f78718e,0xbc55311e,4
+np.float32,0x3e574b7d,0xbf2d6152,4
+np.float32,0x7eab27c6,0x4218394e,4
+np.float32,0x7f34603c,0x421984e5,4
+np.float32,0x3f3a8b57,0xbe0cc1ca,4
+np.float32,0x3f744181,0xbca7134e,4
+np.float32,0x3f7e3bc4,0xbb45156b,4
+np.float32,0x93ab4,0xc21c498b,4
+np.float32,0x7ed5541e,0x42189b42,4
+np.float32,0x6bf8ec,0xc21803c4,4
+np.float32,0x757395,0xc217de58,4
+np.float32,0x7f177214,0x42193726,4
+np.float32,0x59935f,0xc21856d6,4
+np.float32,0x2cd9ba,0xc2198a78,4
+np.float32,0x3ef6fd5c,0xbea2183c,4
+np.float32,0x3ebb6c63,0xbedf75e0,4
+np.float32,0x7f43272c,0x4219a7e9,4
+np.float32,0x7f42e67d,0x4219a755,4
+np.float32,0x3f3f744f,0xbe0133f6,4
+np.float32,0x7f5fddaa,0x4219e4f4,4
+np.float32,0x3dc9874f,0xbf80e529,4
+np.float32,0x3f2efe64,0xbe292ec8,4
+np.float32,0x3e0406a6,0xbf63bf7c,4
+np.float32,0x3cdbb0aa,0xbfc92984,4
+np.float32,0x3e6597e7,0xbf263b30,4
+np.float32,0x3f0c1153,0xbe861807,4
+np.float32,0x7fce16,0xc217b8c6,4
+np.float32,0x3f5f4e5f,0xbd730dc6,4
+np.float32,0x3ed41ffa,0xbec3ee69,4
+np.float32,0x3f216c78,0xbe4d1446,4
+np.float32,0x3f123ed7,0xbe78fe4b,4
+np.float32,0x7f7e0ca9,0x421a1d34,4
+np.float32,0x7e318af4,0x42171558,4
+np.float32,0x7f1e1659,0x42194a3d,4
+np.float32,0x34d12a,0xc21941c2,4
+np.float32,0x3d9566ad,0xbf918870,4
+np.float32,0x3e799a47,0xbf1cf0e5,4
+np.float32,0x3e89dd6f,0xbf11df76,4
+np.float32,0x32f0d3,0xc21951d8,4
+np.float32,0x7e89d17e,0x4217d8f6,4
+np.float32,0x1f3b38,0xc21a2b6b,4
+np.float32,0x7ee9e060,0x4218c427,4
+np.float32,0x31a673,0xc2195d41,4
+np.float32,0x5180f1,0xc21880d5,4
+np.float32,0x3cd36f,0xc21902f8,4
+np.float32,0x3bb63004,0xc01050cb,4
+np.float32,0x3e8ee9d1,0xbf0ddfde,4
+np.float32,0x3d2a7da3,0xbfb0b970,4
+np.float32,0x3ea58107,0xbefb1dc3,4
+np.float32,0x7f6760b0,0x4219f3a2,4
+np.float32,0x7f7f9e08,0x421a1ff0,4
+np.float32,0x37e7f1,0xc219287b,4
+np.float32,0x3ef7eb53,0xbea14267,4
+np.float32,0x3e2eb581,0xbf449aa5,4
+np.float32,0x3da7671c,0xbf8b3568,4
+np.float32,0x7af36f7b,0x420f33ee,4
+np.float32,0x3eb3602c,0xbee93823,4
+np.float32,0x3f68bcff,0xbd2975de,4
+np.float32,0x3ea7cefb,0xbef80a9d,4
+np.float32,0x3f329689,0xbe202414,4
+np.float32,0x7f0c7c80,0x421915be,4
+np.float32,0x7f4739b8,0x4219b118,4
+np.float32,0x73af58,0xc217e515,4
+np.float32,0x7f13eb2a,0x42192cab,4
+np.float32,0x30f2d9,0xc2196395,4
+np.float32,0x7ea7066c,0x42182e71,4
+np.float32,0x669fec,0xc2181a5b,4
+np.float32,0x3f7d6876,0xbb90d1ef,4
+np.float32,0x3f08a4ef,0xbe8b9897,4
+np.float32,0x7f2a906c,0x42196c05,4
+np.float32,0x3ed3ca42,0xbec44856,4
+np.float32,0x9d27,0xc220fee2,4
+np.float32,0x3e4508a1,0xbf373c03,4
+np.float32,0x3e41f8de,0xbf38f9bb,4
+np.float32,0x3e912714,0xbf0c255b,4
+np.float32,0xff800000,0x7fc00000,4
+np.float32,0x7eefd13d,0x4218cf4f,4
+np.float32,0x3f491674,0xbdd6bded,4
+np.float32,0x3ef49512,0xbea445c9,4
+np.float32,0x3f045b79,0xbe92af15,4
+np.float32,0x3ef6c412,0xbea24bd5,4
+np.float32,0x3e6f3c28,0xbf21a85d,4
+np.float32,0x3ef71839,0xbea2000e,4
+np.float32,0x1,0xc23369f4,4
+np.float32,0x3e3fcfe4,0xbf3a3876,4
+np.float32,0x3e9d7a65,0xbf0315b2,4
+np.float32,0x20b7c4,0xc21a16bd,4
+np.float32,0x7f707b10,0x421a04cb,4
+np.float32,0x7fc00000,0x7fc00000,4
+np.float32,0x3f285ebd,0xbe3a57ac,4
+np.float32,0x74c9ea,0xc217e0dc,4
+np.float32,0x3f6501f2,0xbd4634ab,4
+np.float32,0x3f248959,0xbe4495cc,4
+np.float32,0x7e915ff0,0x4217f0b3,4
+np.float32,0x7edbb910,0x4218a864,4
+np.float32,0x3f7042dd,0xbce1bddb,4
+np.float32,0x6f08c9,0xc217f754,4
+np.float32,0x7f423993,0x4219a5ca,4
+np.float32,0x3f125704,0xbe78b4cd,4
+np.float32,0x7ef7f5ae,0x4218de28,4
+np.float32,0x3f2dd940,0xbe2c1a33,4
+np.float32,0x3f1ca78e,0xbe5a6a8b,4
+np.float32,0x244863,0xc219e8be,4
+np.float32,0x3f2614fe,0xbe406d6b,4
+np.float32,0x3e75e7a3,0xbf1e99b5,4
+np.float32,0x2bdd6e,0xc2199459,4
+np.float32,0x7e49e279,0x42174e7b,4
+np.float32,0x3e3bb09a,0xbf3ca2cd,4
+np.float32,0x649f06,0xc2182320,4
+np.float32,0x7f4a44e1,0x4219b7d6,4
+np.float32,0x400473,0xc218ec3a,4
+np.float32,0x3edb19ad,0xbebcbcad,4
+np.float32,0x3d8ee956,0xbf94006c,4
+np.float32,0x7e91c603,0x4217f1eb,4
+np.float32,0x221384,0xc21a04a6,4
+np.float32,0x7f7dd660,0x421a1cd5,4
+np.float32,0x7ef34609,0x4218d5ac,4
+np.float32,0x7f5ed529,0x4219e2e5,4
+np.float32,0x7f1bf685,0x42194438,4
+np.float32,0x3cdd094a,0xbfc8d294,4
+np.float32,0x7e87fc8e,0x4217d303,4
+np.float32,0x7f53d971,0x4219cc6b,4
+np.float32,0xabc8b,0xc21c0646,4
+np.float32,0x7f5011e6,0x4219c46a,4
+np.float32,0x7e460638,0x421745e5,4
+np.float32,0xa8126,0xc21c0ffd,4
+np.float32,0x3eec2a66,0xbeac0f2d,4
+np.float32,0x3f3a1213,0xbe0de340,4
+np.float32,0x7f5908db,0x4219d72c,4
+np.float32,0x7e0ad3c5,0x4216a7f3,4
+np.float32,0x3f2de40e,0xbe2bfe90,4
+np.float32,0x3d0463c5,0xbfbec8e4,4
+np.float32,0x7c7cde0b,0x4212e19a,4
+np.float32,0x74c24f,0xc217e0f9,4
+np.float32,0x3f14b4cb,0xbe71929b,4
+np.float32,0x3e94e192,0xbf09537f,4
+np.float32,0x3eebde71,0xbeac56bd,4
+np.float32,0x3f65e413,0xbd3f5b8a,4
+np.float32,0x7e109199,0x4216b9f9,4
+np.float32,0x3f22f5d0,0xbe48ddc0,4
+np.float32,0x3e22d3bc,0xbf4c6f4d,4
+np.float32,0x3f7a812f,0xbc1a680b,4
+np.float32,0x3f67f361,0xbd2f7d7c,4
+np.float32,0x3f1caa63,0xbe5a6281,4
+np.float32,0x3f306fde,0xbe2587ab,4
+np.float32,0x3e8df9d3,0xbf0e9b2f,4
+np.float32,0x3eaaccc4,0xbef41cd4,4
+np.float32,0x7f3f65ec,0x42199f45,4
+np.float32,0x3dc706e0,0xbf8196ec,4
+np.float32,0x3e14eaba,0xbf565cf6,4
+np.float32,0xcc60,0xc2208a09,4
+np.float32,0x358447,0xc2193be7,4
+np.float32,0x3dcecade,0xbf7eec70,4
+np.float32,0x3f20b4f8,0xbe4f0ef0,4
+np.float32,0x7e7c979f,0x4217b222,4
+np.float32,0x7f2387b9,0x4219594a,4
+np.float32,0x3f6f6e5c,0xbcee0e05,4
+np.float32,0x7f19ad81,0x42193da8,4
+np.float32,0x5635e1,0xc21867dd,4
+np.float32,0x4c5e97,0xc2189dc4,4
+np.float32,0x7f35f97f,0x421988d1,4
+np.float32,0x7f685224,0x4219f571,4
+np.float32,0x3eca0616,0xbecec7b8,4
+np.float32,0x3f436d0d,0xbdf024ca,4
+np.float32,0x12a97d,0xc21b106a,4
+np.float32,0x7f0fdc93,0x4219204d,4
+np.float32,0x3debfb42,0xbf703e65,4
+np.float32,0x3c6c54d2,0xbfeba291,4
+np.float32,0x7e5d7491,0x421777a1,4
+np.float32,0x3f4bd2f0,0xbdcab87d,4
+np.float32,0x3f7517f4,0xbc9ae510,4
+np.float32,0x3f71a59a,0xbccd480d,4
+np.float32,0x3f514653,0xbdb33f61,4
+np.float32,0x3f4e6ea4,0xbdbf694b,4
+np.float32,0x3eadadec,0xbef06526,4
+np.float32,0x3f3b41c1,0xbe0b0fbf,4
+np.float32,0xc35a,0xc2209e1e,4
+np.float32,0x384982,0xc2192575,4
+np.float32,0x3464c3,0xc2194556,4
+np.float32,0x7f5e20d9,0x4219e17d,4
+np.float32,0x3ea18b62,0xbf004016,4
+np.float32,0x63a02b,0xc218278c,4
+np.float32,0x7ef547ba,0x4218d953,4
+np.float32,0x3f2496fb,0xbe4470f4,4
+np.float32,0x7ea0c8c6,0x42181d81,4
+np.float32,0x3f42ba60,0xbdf35372,4
+np.float32,0x7e40d9,0xc217be34,4
+np.float32,0x3e95883b,0xbf08d750,4
+np.float32,0x3e0cddf3,0xbf5c8aa8,4
+np.float32,0x3f2305d5,0xbe48b20a,4
+np.float32,0x7f0d0941,0x4219177b,4
+np.float32,0x3f7b98d3,0xbbf6e477,4
+np.float32,0x3f687cdc,0xbd2b6057,4
+np.float32,0x3f42ce91,0xbdf2f73d,4
+np.float32,0x3ee00fc0,0xbeb7c217,4
+np.float32,0x7f3d483a,0x42199a53,4
+np.float32,0x3e1e08eb,0xbf4fc18d,4
+np.float32,0x7e202ff5,0x4216e798,4
+np.float32,0x582898,0xc2185ded,4
+np.float32,0x3e3552b1,0xbf40790c,4
+np.float32,0x3d3f7c87,0xbfaa44b6,4
+np.float32,0x669d8e,0xc2181a65,4
+np.float32,0x3f0e21b4,0xbe82d757,4
+np.float32,0x686f95,0xc2181293,4
+np.float32,0x3f48367f,0xbdda9ead,4
+np.float32,0x3dc27802,0xbf82e0a0,4
+np.float32,0x3f6ac40c,0xbd1a07d4,4
+np.float32,0x3bba6d,0xc2190b12,4
+np.float32,0x3ec7b6b0,0xbed15665,4
+np.float32,0x3f1f9ca4,0xbe521955,4
+np.float32,0x3ef2f147,0xbea5c4b8,4
+np.float32,0x7c65f769,0x4212b762,4
+np.float32,0x7e98e162,0x42180716,4
+np.float32,0x3f0f0c09,0xbe8169ea,4
+np.float32,0x3d67f03b,0xbf9f9d48,4
+np.float32,0x7f3751e4,0x42198c18,4
+np.float32,0x7f1fac61,0x42194ead,4
+np.float32,0x3e9b698b,0xbf048d89,4
+np.float32,0x7e66507b,0x42178913,4
+np.float32,0x7f5cb680,0x4219dea5,4
+np.float32,0x234700,0xc219f53e,4
+np.float32,0x3d9984ad,0xbf900591,4
+np.float32,0x3f33a3f2,0xbe1d872a,4
+np.float32,0x3eaf52b6,0xbeee4cf4,4
+np.float32,0x7f078930,0x421905ca,4
+np.float32,0x3f083b39,0xbe8c44df,4
+np.float32,0x3e3823f8,0xbf3ec231,4
+np.float32,0x3eef6f5d,0xbea9008c,4
+np.float32,0x6145e1,0xc218322c,4
+np.float32,0x16d9ae,0xc21ab65f,4
+np.float32,0x7e543376,0x421764a5,4
+np.float32,0x3ef77ccb,0xbea1a5a0,4
+np.float32,0x3f4a443f,0xbdd18af5,4
+np.float32,0x8f209,0xc21c5770,4
+np.float32,0x3ecac126,0xbecdfa33,4
+np.float32,0x3e8662f9,0xbf14b6c7,4
+np.float32,0x23759a,0xc219f2f4,4
+np.float32,0xf256d,0xc21b6d3f,4
+np.float32,0x3f579f93,0xbd98aaa2,4
+np.float32,0x3ed4cc8e,0xbec339cb,4
+np.float32,0x3ed25400,0xbec5d2a1,4
+np.float32,0x3ed6f8ba,0xbec0f795,4
+np.float32,0x7f36efd9,0x42198b2a,4
+np.float32,0x7f5169dd,0x4219c746,4
+np.float32,0x7de18a20,0x42164b80,4
+np.float32,0x3e8de526,0xbf0eab61,4
+np.float32,0x3de0cbcd,0xbf75a47e,4
+np.float32,0xe265f,0xc21b8b82,4
+np.float32,0x3df3cdbd,0xbf6c9e40,4
+np.float32,0x3f38a25a,0xbe115589,4
+np.float32,0x7f01f2c0,0x4218f311,4
+np.float32,0x3da7d5f4,0xbf8b10a5,4
+np.float32,0x4d4fe8,0xc2189850,4
+np.float32,0x3cc96d9d,0xbfcdfc8d,4
+np.float32,0x259a88,0xc219d8d7,4
+np.float32,0x7f1d5102,0x42194810,4
+np.float32,0x7e17ca91,0x4216cfa7,4
+np.float32,0x3f73d110,0xbcad7a8f,4
+np.float32,0x3f009383,0xbe9920ed,4
+np.float32,0x7e22af,0xc217be9f,4
+np.float32,0x3f7de2ce,0xbb6c0394,4
+np.float32,0x3edd0cd2,0xbebac45a,4
+np.float32,0x3ec9b5c1,0xbecf2035,4
+np.float32,0x3168c5,0xc2195f6b,4
+np.float32,0x3e935522,0xbf0a7d18,4
+np.float32,0x3e494077,0xbf34e120,4
+np.float32,0x3f52ed06,0xbdac41ec,4
+np.float32,0x3f73d51e,0xbcad3f65,4
+np.float32,0x3f03d453,0xbe939295,4
+np.float32,0x7ef4ee68,0x4218d8b1,4
+np.float32,0x3ed0e2,0xc218f4a7,4
+np.float32,0x4efab8,0xc2188ed3,4
+np.float32,0x3dbd5632,0xbf845d3b,4
+np.float32,0x7eecad4f,0x4218c972,4
+np.float32,0x9d636,0xc21c2d32,4
+np.float32,0x3e5f3b6b,0xbf295ae7,4
+np.float32,0x7f4932df,0x4219b57a,4
+np.float32,0x4b59b5,0xc218a3be,4
+np.float32,0x3e5de97f,0xbf2a03b4,4
+np.float32,0x3f1c479d,0xbe5b7b3c,4
+np.float32,0x3f42e7e4,0xbdf283a5,4
+np.float32,0x2445,0xc2238af2,4
+np.float32,0x7aa71b43,0x420e8c9e,4
+np.float32,0x3ede6e4e,0xbeb961e1,4
+np.float32,0x7f05dd3b,0x42190045,4
+np.float32,0x3ef5b55c,0xbea3404b,4
+np.float32,0x7f738624,0x421a0a62,4
+np.float32,0x3e7d50a1,0xbf1b4cb4,4
+np.float32,0x3f44cc4a,0xbde9ebcc,4
+np.float32,0x7e1a7b0b,0x4216d777,4
+np.float32,0x3f1d9868,0xbe57c0da,4
+np.float32,0x1ebee2,0xc21a3263,4
+np.float32,0x31685f,0xc2195f6e,4
+np.float32,0x368a8e,0xc2193379,4
+np.float32,0xa9847,0xc21c0c2e,4
+np.float32,0x3bd3b3,0xc2190a56,4
+np.float32,0x3961e4,0xc2191ce3,4
+np.float32,0x7e13a243,0x4216c34e,4
+np.float32,0x7f7b1790,0x421a17ff,4
+np.float32,0x3e55f020,0xbf2e1545,4
+np.float32,0x3f513861,0xbdb37aa8,4
+np.float32,0x3dd9e754,0xbf791ad2,4
+np.float32,0x5e8d86,0xc2183ec9,4
+np.float32,0x26b796,0xc219cbdd,4
+np.float32,0x429daa,0xc218da89,4
+np.float32,0x3f477caa,0xbdddd9ba,4
+np.float32,0x3f0e5114,0xbe828d45,4
+np.float32,0x3f54f362,0xbda3c286,4
+np.float32,0x6eac1c,0xc217f8c8,4
+np.float32,0x3f04c479,0xbe91fef5,4
+np.float32,0x3e993765,0xbf06228e,4
+np.float32,0x3eafd99f,0xbeeda21b,4
+np.float32,0x3f2a759e,0xbe34db96,4
+np.float32,0x3f05adfb,0xbe907937,4
+np.float32,0x3f6e2dfc,0xbd005980,4
+np.float32,0x3f2f2daa,0xbe28b6b5,4
+np.float32,0x15e746,0xc21ac931,4
+np.float32,0x7d34ca26,0x4214b4e5,4
+np.float32,0x7ebd175c,0x4218659f,4
+np.float32,0x7f1ed26b,0x42194c4c,4
+np.float32,0x2588b,0xc21eaab0,4
+np.float32,0x3f0065e3,0xbe996fe2,4
+np.float32,0x3f610376,0xbd658122,4
+np.float32,0x451995,0xc218ca41,4
+np.float32,0x70e083,0xc217f002,4
+np.float32,0x7e19821a,0x4216d4a8,4
+np.float32,0x3e7cd9a0,0xbf1b80fb,4
+np.float32,0x7f1a8f18,0x42194033,4
+np.float32,0x3f008fee,0xbe99271f,4
+np.float32,0xff7fffff,0x7fc00000,4
+np.float32,0x7f31d826,0x42197e9b,4
+np.float32,0x3f18cf12,0xbe657838,4
+np.float32,0x3e5c1bc7,0xbf2aebf9,4
+np.float32,0x3e3d3993,0xbf3bbaf8,4
+np.float32,0x68457a,0xc2181347,4
+np.float32,0x7ddf7561,0x42164761,4
+np.float32,0x7f47341b,0x4219b10c,4
+np.float32,0x4d3ecd,0xc21898b2,4
+np.float32,0x7f43dee8,0x4219a98b,4
+np.float32,0x3f0def7c,0xbe8325f5,4
+np.float32,0x3d5a551f,0xbfa2f994,4
+np.float32,0x7ed26602,0x4218951b,4
+np.float32,0x3ee7fa5b,0xbeb0099a,4
+np.float32,0x7ef74ea8,0x4218dcfc,4
+np.float32,0x6a3bb2,0xc2180afd,4
+np.float32,0x7f4c1e6e,0x4219bbe3,4
+np.float32,0x3e26f625,0xbf49a5a2,4
+np.float32,0xb8482,0xc21be70b,4
+np.float32,0x3f32f077,0xbe1f445b,4
+np.float32,0x7dd694b6,0x4216355a,4
+np.float32,0x7f3d62fd,0x42199a92,4
+np.float32,0x3f48e41a,0xbdd79cbf,4
+np.float32,0x338fc3,0xc2194c75,4
+np.float32,0x3e8355f0,0xbf174462,4
+np.float32,0x7f487e83,0x4219b3eb,4
+np.float32,0x2227f7,0xc21a039b,4
+np.float32,0x7e4383dd,0x4217403a,4
+np.float32,0x52d28b,0xc21879b2,4
+np.float32,0x12472c,0xc21b19a9,4
+np.float32,0x353530,0xc2193e7b,4
+np.float32,0x3f4e4728,0xbdc0137a,4
+np.float32,0x3bf169,0xc2190979,4
+np.float32,0x3eb3ee2e,0xbee8885f,4
+np.float32,0x3f03e3c0,0xbe937892,4
+np.float32,0x3c9f8408,0xbfdaf47f,4
+np.float32,0x40e792,0xc218e61b,4
+np.float32,0x5a6b29,0xc21852ab,4
+np.float32,0x7f268b83,0x4219616a,4
+np.float32,0x3ee25997,0xbeb57fa7,4
+np.float32,0x3f175324,0xbe69cf53,4
+np.float32,0x3f781d91,0xbc5e9827,4
+np.float32,0x7dba5210,0x4215f68c,4
+np.float32,0x7f1e66,0xc217bb2b,4
+np.float32,0x7f7fffff,0x421a209b,4
+np.float32,0x3f646202,0xbd4b10b8,4
+np.float32,0x575248,0xc218622b,4
+np.float32,0x7c67faa1,0x4212bb42,4
+np.float32,0x7f1683f2,0x42193469,4
+np.float32,0x1a3864,0xc21a7931,4
+np.float32,0x7f30ad75,0x42197bae,4
+np.float32,0x7f1c9d05,0x42194612,4
+np.float32,0x3e791795,0xbf1d2b2c,4
+np.float32,0x7e9ebc19,0x421817cd,4
+np.float32,0x4999b7,0xc218ae31,4
+np.float32,0x3d130e2c,0xbfb8f1cc,4
+np.float32,0x3f7e436f,0xbb41bb07,4
+np.float32,0x3ee00241,0xbeb7cf7d,4
+np.float32,0x7e496181,0x42174d5f,4
+np.float32,0x7efe58be,0x4218e978,4
+np.float32,0x3f5e5b0c,0xbd7aa43f,4
+np.float32,0x7ee4c6ab,0x4218ba59,4
+np.float32,0x3f6da8c6,0xbd043d7e,4
+np.float32,0x3e3e6e0f,0xbf3b064b,4
+np.float32,0x3f0143b3,0xbe97f10a,4
+np.float32,0x79170f,0xc217d0c6,4
+np.float32,0x517645,0xc218810f,4
+np.float32,0x3f1f9960,0xbe52226e,4
+np.float32,0x2a8df9,0xc219a1d6,4
+np.float32,0x2300a6,0xc219f8b8,4
+np.float32,0x3ee31355,0xbeb4c97a,4
+np.float32,0x3f20b05f,0xbe4f1ba9,4
+np.float32,0x3ee64249,0xbeb1b0ff,4
+np.float32,0x3a94b7,0xc21913b2,4
+np.float32,0x7ef7ef43,0x4218de1d,4
+np.float32,0x3f1abb5d,0xbe5fe872,4
+np.float32,0x7f65360b,0x4219ef72,4
+np.float32,0x3d315d,0xc219004c,4
+np.float32,0x3f26bbc4,0xbe3eafb9,4
+np.float32,0x3ee8c6e9,0xbeaf45de,4
+np.float32,0x7e5f1452,0x42177ae1,4
+np.float32,0x3f32e777,0xbe1f5aba,4
+np.float32,0x4d39a1,0xc21898d0,4
+np.float32,0x3e59ad15,0xbf2c2841,4
+np.float32,0x3f4be746,0xbdca5fc4,4
+np.float32,0x72e4fd,0xc217e821,4
+np.float32,0x1af0b8,0xc21a6d25,4
+np.float32,0x3f311147,0xbe23f18d,4
+np.float32,0x3f1ecebb,0xbe545880,4
+np.float32,0x7e90d293,0x4217ef02,4
+np.float32,0x3e3b366a,0xbf3ceb46,4
+np.float32,0x3f133239,0xbe761c96,4
+np.float32,0x7541ab,0xc217df15,4
+np.float32,0x3d8c8275,0xbf94f1a1,4
+np.float32,0x483b92,0xc218b689,4
+np.float32,0x3eb0dbed,0xbeec5c6b,4
+np.float32,0x3f00c676,0xbe98c8e2,4
+np.float32,0x3f445ac2,0xbdebed7c,4
+np.float32,0x3d2af4,0xc219007a,4
+np.float32,0x7f196ee1,0x42193cf2,4
+np.float32,0x290c94,0xc219b1db,4
+np.float32,0x3f5dbdc9,0xbd7f9019,4
+np.float32,0x3e80c62e,0xbf1974fc,4
+np.float32,0x3ec9ed2c,0xbecee326,4
+np.float32,0x7f469d60,0x4219afbb,4
+np.float32,0x3f698413,0xbd2386ce,4
+np.float32,0x42163f,0xc218de14,4
+np.float32,0x67a554,0xc21815f4,4
+np.float32,0x3f4bff74,0xbdc9f651,4
+np.float32,0x16a743,0xc21aba39,4
+np.float32,0x2eb8b0,0xc219784b,4
+np.float32,0x3eed9be1,0xbeaab45b,4
+np.float64,0x7fe0d76873e1aed0,0x40733f9d783bad7a,2
+np.float64,0x3fe22626bb244c4d,0xbfcf86a59864eea2,2
+np.float64,0x7f874113d02e8227,0x407324f54c4015b8,2
+np.float64,0x3fe40a46a9e8148d,0xbfca0411f533fcb9,2
+np.float64,0x3fd03932eea07266,0xbfe312bc9cf5649e,2
+np.float64,0x7fee5d2a1b3cba53,0x407343b5f56367a0,2
+np.float64,0x3feb7bda4a76f7b5,0xbfb0ea2c6edc784a,2
+np.float64,0x3fd6cd831a2d9b06,0xbfdcaf2e1a5faf51,2
+np.float64,0x98324e273064a,0xc0733e0e4c6d11c6,2
+np.float64,0x7fe1dd63b363bac6,0x4073400667c405c3,2
+np.float64,0x3fec5971f178b2e4,0xbfaaef32a7d94563,2
+np.float64,0x17abc07e2f579,0xc0734afca4da721e,2
+np.float64,0x3feec6ab5cfd8d57,0xbf9157f3545a8235,2
+np.float64,0x3fe3ae9622a75d2c,0xbfcb04b5ad254581,2
+np.float64,0x7fea73d854b4e7b0,0x407342c0a548f4c5,2
+np.float64,0x7fe29babf4653757,0x4073404eeb5fe714,2
+np.float64,0x7fd3a55d85a74aba,0x40733bde72e86c27,2
+np.float64,0x3fe83ce305f079c6,0xbfbee3511e85e0f1,2
+np.float64,0x3fd72087ea2e4110,0xbfdc4ab30802d7c2,2
+np.float64,0x7feb54ddab76a9ba,0x407342facb6f3ede,2
+np.float64,0xc57e34a18afd,0xc0734f82ec815baa,2
+np.float64,0x7a8cb97ef5198,0xc0733f8fb3777a67,2
+np.float64,0x7fe801032c300205,0x40734213dbe4eda9,2
+np.float64,0x3aefb1f475df7,0xc07344a5f08a0584,2
+np.float64,0x7fee85f1dd3d0be3,0x407343bf4441c2a7,2
+np.float64,0x3fdc7f1055b8fe21,0xbfd67d300630e893,2
+np.float64,0xe8ecddb3d1d9c,0xc0733b194f18f466,2
+np.float64,0x3fdf2b23c73e5648,0xbfd3ff6872c1f887,2
+np.float64,0x3fdba4aef2b7495e,0xbfd7557205e18b7b,2
+np.float64,0x3fe2ac34c6e5586a,0xbfcdf1dac69bfa08,2
+np.float64,0x3fc9852628330a4c,0xbfe66914f0fb9b0a,2
+np.float64,0x7fda211acf344235,0x40733dd9c2177aeb,2
+np.float64,0x3fe9420eb432841d,0xbfba4dd969a32575,2
+np.float64,0xb2f9d1ed65f3a,0xc0733cedfb6527ff,2
+np.float64,0x3fe9768a68f2ed15,0xbfb967c39c35c435,2
+np.float64,0x7fe8268462b04d08,0x4073421eaed32734,2
+np.float64,0x3fcf331f063e663e,0xbfe39e2f4b427ca9,2
+np.float64,0x7fd4eb9e2b29d73b,0x40733c4e4141418d,2
+np.float64,0x7fd2bba658a5774c,0x40733b89cd53d5b1,2
+np.float64,0x3fdfdf04913fbe09,0xbfd360c7fd9d251b,2
+np.float64,0x3fca5bfd0534b7fa,0xbfe5f5f844b2b20c,2
+np.float64,0x3feacd5032f59aa0,0xbfb3b5234ba8bf7b,2
+np.float64,0x7fe9241cec724839,0x4073426631362cec,2
+np.float64,0x3fe57aca20eaf594,0xbfc628e3ac2c6387,2
+np.float64,0x3fec6553ca38caa8,0xbfaa921368d3b222,2
+np.float64,0x3fe1e9676563d2cf,0xbfd020f866ba9b24,2
+np.float64,0x3fd5590667aab20d,0xbfde8458af5a4fd6,2
+np.float64,0x3fdf7528f43eea52,0xbfd3bdb438d6ba5e,2
+np.float64,0xb8dddc5571bbc,0xc0733cb4601e5bb2,2
+np.float64,0xe6d4e1fbcda9c,0xc0733b295ef4a4ba,2
+np.float64,0x3fe7019d962e033b,0xbfc257c0a6e8de16,2
+np.float64,0x3f94ef585029deb1,0xbffb07e5dfb0e936,2
+np.float64,0x7fc863b08030c760,0x4073388e28d7b354,2
+np.float64,0xf684443bed089,0xc0733ab46cfbff9a,2
+np.float64,0x7fe00e901d201d1f,0x40733f489c05a0f0,2
+np.float64,0x9e5c0a273cb82,0xc0733dc7af797e19,2
+np.float64,0x7fe49734f0692e69,0x4073410303680df0,2
+np.float64,0x7fb7b584442f6b08,0x4073338acff72502,2
+np.float64,0x3f99984c30333098,0xbff9a2642a6ed8cc,2
+np.float64,0x7fea2fcda8745f9a,0x407342aeae7f5e64,2
+np.float64,0xe580caadcb01a,0xc0733b33a3639217,2
+np.float64,0x1899ab3831336,0xc0734ab823729417,2
+np.float64,0x39bd4c76737aa,0xc07344ca6fac6d21,2
+np.float64,0xd755b2dbaeab7,0xc0733ba4fe19f2cc,2
+np.float64,0x3f952bebf82a57d8,0xbffaf3e7749c2512,2
+np.float64,0x3fe62ee5d72c5dcc,0xbfc45e3cb5baad08,2
+np.float64,0xb1264a7d624ca,0xc0733d003a1d0a66,2
+np.float64,0x3fc4bd1bcd297a38,0xbfe94b3058345c46,2
+np.float64,0x7fc5758bb32aeb16,0x407337aa7805497f,2
+np.float64,0x3fb0edcaf421db96,0xbff2dfb09c405294,2
+np.float64,0x3fd240fceaa481fa,0xbfe16f356bb36134,2
+np.float64,0x38c0c62a7181a,0xc07344e916d1e9b7,2
+np.float64,0x3fe98f2b3bf31e56,0xbfb8fc6eb622a820,2
+np.float64,0x3fe2bdf99c257bf3,0xbfcdbd0dbbae4d0b,2
+np.float64,0xce4b390d9c967,0xc0733bf14ada3134,2
+np.float64,0x3fd2ad607ba55ac1,0xbfe11da15167b37b,2
+np.float64,0x3fd8154f11b02a9e,0xbfdb2a6fabb9a026,2
+np.float64,0xf37849fde6f09,0xc0733aca8c64344c,2
+np.float64,0x3fcbae43b2375c87,0xbfe547f267c8e570,2
+np.float64,0x3fcd46fd7d3a8dfb,0xbfe48070f7232929,2
+np.float64,0x7fcdd245273ba489,0x407339f3d907b101,2
+np.float64,0x3fac75cd0838eb9a,0xbff4149d177b057b,2
+np.float64,0x7fe8ff3fd7f1fe7f,0x4073425bf968ba6f,2
+np.float64,0x7febadaa4df75b54,0x407343113a91f0e9,2
+np.float64,0x7fd5e4649c2bc8c8,0x40733c9f0620b065,2
+np.float64,0x903429812069,0xc07351b255e27887,2
+np.float64,0x3fe1d8c51c63b18a,0xbfd03ad448c1f1ee,2
+np.float64,0x3fe573ea646ae7d5,0xbfc63ab0bfd0e601,2
+np.float64,0x3f83b3f3c02767e8,0xc00022677e310649,2
+np.float64,0x7fd15d1582a2ba2a,0x40733b02c469c1d6,2
+np.float64,0x3fe63d3dabec7a7b,0xbfc43a56ee97b27e,2
+np.float64,0x7fe3a452fb2748a5,0x407340af1973c228,2
+np.float64,0x3fafac6b303f58d6,0xbff35651703ae9f2,2
+np.float64,0x513ddd24a27bc,0xc073426af96aaebb,2
+np.float64,0x3fef152246be2a45,0xbf89df79d7719282,2
+np.float64,0x3fe8c923e9f19248,0xbfbc67228e8db5f6,2
+np.float64,0x3fd6e2325fadc465,0xbfdc9602fb0b950f,2
+np.float64,0x3fe9616815f2c2d0,0xbfb9c4311a3b415b,2
+np.float64,0x2fe4e4005fc9d,0xc0734616fe294395,2
+np.float64,0x3fbceb02dc39d606,0xbfee4e68f1c7886f,2
+np.float64,0x7fe35e843d66bd07,0x407340963b066ad6,2
+np.float64,0x7fecd6c648f9ad8c,0x4073435a4c176e94,2
+np.float64,0x7fcbd72bf437ae57,0x4073397994b85665,2
+np.float64,0x3feff6443b3fec88,0xbf40eb380d5318ae,2
+np.float64,0x7fb9373cf6326e79,0x407333f869edef08,2
+np.float64,0x63790d9cc6f22,0xc0734102d4793cda,2
+np.float64,0x3f9de6efe83bcde0,0xbff88db6f0a6b56e,2
+np.float64,0xe00f2dc1c01f,0xc0734ea26ab84ff2,2
+np.float64,0xd7a9aa8baf536,0xc0733ba248fa33ab,2
+np.float64,0x3fee0089ea7c0114,0xbf9cab936ac31c4b,2
+np.float64,0x3fdec0d51cbd81aa,0xbfd45ed8878c5860,2
+np.float64,0x7fe91bf5e9f237eb,0x40734263f005081d,2
+np.float64,0x34ea7d1e69d50,0xc07345659dde7444,2
+np.float64,0x7fe67321a3ace642,0x4073419cc8130d95,2
+np.float64,0x9d1aeb2f3a35e,0xc0733dd5d506425c,2
+np.float64,0x7fbb01df003603bd,0x4073347282f1391d,2
+np.float64,0x42b945b285729,0xc07343c92d1bbef9,2
+np.float64,0x7fc92799b8324f32,0x407338c51e3f0733,2
+np.float64,0x3fe119c19b223383,0xbfd16ab707f65686,2
+np.float64,0x3fc9f9ac5333f359,0xbfe62a2f91ec0dff,2
+np.float64,0x3fd820d5a8b041ab,0xbfdb1d2586fe7b18,2
+np.float64,0x10000000000000,0xc0733a7146f72a42,2
+np.float64,0x3fe7e1543eafc2a8,0xbfc045362889592d,2
+np.float64,0xcbc0e1819783,0xc0734f4b68e05b1c,2
+np.float64,0xeb57e411d6afd,0xc0733b06efec001a,2
+np.float64,0xa9b74b47536ea,0xc0733d4c7bd06ddc,2
+np.float64,0x3fe56d4022eada80,0xbfc64bf8c7e3dd59,2
+np.float64,0x3fd445ca27288b94,0xbfdff40aecd0f882,2
+np.float64,0x3fe5af1cf5ab5e3a,0xbfc5a21d83699a04,2
+np.float64,0x7fed3431eb7a6863,0x40734370aa6131e1,2
+np.float64,0x3fd878dea1b0f1bd,0xbfdab8730dc00517,2
+np.float64,0x7ff8000000000000,0x7ff8000000000000,2
+np.float64,0x3feba9fcc1f753fa,0xbfb03027dcecbf65,2
+np.float64,0x7fca4feed6349fdd,0x4073391526327eb0,2
+np.float64,0x3fe7748ddbaee91c,0xbfc144b438218065,2
+np.float64,0x3fb5fbd94c2bf7b3,0xbff10ee6342c21a0,2
+np.float64,0x3feb603b97f6c077,0xbfb15a1f99d6d25e,2
+np.float64,0x3fe2e6fc8ce5cdf9,0xbfcd43edd7f3b4e6,2
+np.float64,0x7feb2b31f7765663,0x407342f02b306688,2
+np.float64,0x3fe290e2282521c4,0xbfce436deb8dbcf3,2
+np.float64,0x3fe3d5adf9e7ab5c,0xbfca96b8aa55d942,2
+np.float64,0x691899f2d2314,0xc07340a1026897c8,2
+np.float64,0x7fe468b008e8d15f,0x407340f33eadc628,2
+np.float64,0x3fb3a4c416274988,0xbff1d71da539a56e,2
+np.float64,0x3fe2442b29e48856,0xbfcf2b0037322661,2
+np.float64,0x3f376fbc7e6ef,0xc073442939a84643,2
+np.float64,0x3fe7c78d65ef8f1b,0xbfc08157cff411de,2
+np.float64,0xd4f27acba9e50,0xc0733bb8d38daa50,2
+np.float64,0x5198919ea3313,0xc07342633ba7cbea,2
+np.float64,0x7fd09f66f0a13ecd,0x40733ab5310b4385,2
+np.float64,0x3fdfe5531dbfcaa6,0xbfd35b487c7e739f,2
+np.float64,0x3fc4b0fecc2961fe,0xbfe95350c38c1640,2
+np.float64,0x7fd5ae21962b5c42,0x40733c8db78b7250,2
+np.float64,0x3fa4a8fcd42951fa,0xbff64e62fe602b72,2
+np.float64,0x7fc8e0e25831c1c4,0x407338b179b91223,2
+np.float64,0x7fdde1df6f3bc3be,0x40733ec87f9f027e,2
+np.float64,0x3fd8b9ad86b1735b,0xbfda6f385532c41b,2
+np.float64,0x3fd9f20ee933e41e,0xbfd91872fd858597,2
+np.float64,0x7feb35332df66a65,0x407342f2b9c715f0,2
+np.float64,0x7fe783dc7eaf07b8,0x407341ef41873706,2
+np.float64,0x7fceee929f3ddd24,0x40733a34e3c660fd,2
+np.float64,0x985b58d730b6b,0xc0733e0c6cfbb6f8,2
+np.float64,0x3fef4bb55cfe976b,0xbf83cb246c6f2a78,2
+np.float64,0x3fe218014f243003,0xbfcfb20ac683e1f6,2
+np.float64,0x7fe43b9fbea8773e,0x407340e3d5d5d29e,2
+np.float64,0x7fe148c74c62918e,0x40733fcba4367b8b,2
+np.float64,0x3feea4ad083d495a,0xbf93443917f3c991,2
+np.float64,0x8bcf6311179ed,0xc0733ea54d59dd31,2
+np.float64,0xf4b7a2dbe96f5,0xc0733ac175182401,2
+np.float64,0x543338baa8668,0xc073422b59165fe4,2
+np.float64,0x3fdb467317368ce6,0xbfd7b4d515929635,2
+np.float64,0x7fe3bbbc89e77778,0x407340b75cdf3de7,2
+np.float64,0x7fe693377aad266e,0x407341a6af60a0f1,2
+np.float64,0x3fc66210502cc421,0xbfe83bb940610a24,2
+np.float64,0x7fa75638982eac70,0x40732e9da476b816,2
+np.float64,0x3fe0d72a4761ae55,0xbfd1d7c82c479fab,2
+np.float64,0x97dec0dd2fbd8,0xc0733e121e072804,2
+np.float64,0x3fef33ec8c7e67d9,0xbf86701be6be8df1,2
+np.float64,0x7fcfca9b423f9536,0x40733a65a51efb94,2
+np.float64,0x9f2215633e443,0xc0733dbf043de9ed,2
+np.float64,0x2469373e48d28,0xc07347fe9e904b77,2
+np.float64,0x7fecc2e18cb985c2,0x407343557f58dfa2,2
+np.float64,0x3fde4acbfdbc9598,0xbfd4ca559e575e74,2
+np.float64,0x3fd6b11cf1ad623a,0xbfdcd1e17ef36114,2
+np.float64,0x3fc19ec494233d89,0xbfeb8ef228e8826a,2
+np.float64,0x4c89ee389913e,0xc07342d50c904f61,2
+np.float64,0x88c2046f11841,0xc0733ecc91369431,2
+np.float64,0x7fc88c13fd311827,0x40733899a125b392,2
+np.float64,0x3fcebd893a3d7b12,0xbfe3d2f35ab93765,2
+np.float64,0x3feb582a1476b054,0xbfb17ae8ec6a0465,2
+np.float64,0x7fd4369e5da86d3c,0x40733c1118b8cd67,2
+np.float64,0x3fda013fc1340280,0xbfd90831b85e98b2,2
+np.float64,0x7fed33d73fba67ad,0x4073437094ce1bd9,2
+np.float64,0x3fed3191053a6322,0xbfa468cc26a8f685,2
+np.float64,0x3fc04ed51c209daa,0xbfeca24a6f093bca,2
+np.float64,0x3fee4ac8763c9591,0xbf986458abbb90b5,2
+np.float64,0xa2d39dd145a74,0xc0733d9633651fbc,2
+np.float64,0x3fe7d9f86f2fb3f1,0xbfc0565a0b059f1c,2
+np.float64,0x3fe3250144e64a03,0xbfcc8eb2b9ae494b,2
+np.float64,0x7fe2b29507a56529,0x4073405774492075,2
+np.float64,0x7fdcdfcbe2b9bf97,0x40733e8b736b1bd8,2
+np.float64,0x3fc832730f3064e6,0xbfe7267ac9b2e7c3,2
+np.float64,0x3fc7e912e52fd226,0xbfe750dfc0aeae57,2
+np.float64,0x7fc960472f32c08d,0x407338d4b4cb3957,2
+np.float64,0x3fbdf182ea3be306,0xbfedd27150283ffb,2
+np.float64,0x3fd1e9359823d26b,0xbfe1b2ac7fd25f8d,2
+np.float64,0x7fbcf75f6039eebe,0x407334ef13eb16f8,2
+np.float64,0x3fe5a3c910eb4792,0xbfc5bf2f57c5d643,2
+np.float64,0x3fcf4f2a6e3e9e55,0xbfe391b6f065c4b8,2
+np.float64,0x3fee067873fc0cf1,0xbf9c53af0373fc0e,2
+np.float64,0xd3f08b85a7e12,0xc0733bc14357e686,2
+np.float64,0x7ff0000000000000,0x7ff0000000000000,2
+np.float64,0x3fc8635f6430c6bf,0xbfe70a7dc77749a7,2
+np.float64,0x3fe3ff5c52a7feb9,0xbfca22617c6636d5,2
+np.float64,0x3fbbae91fa375d24,0xbfeee9d4c300543f,2
+np.float64,0xe3f71b59c7ee4,0xc0733b3f99187375,2
+np.float64,0x7fca93d3be3527a6,0x40733926fd48ecd6,2
+np.float64,0x3fcd29f7223a53ee,0xbfe48e3edf32fe57,2
+np.float64,0x7fdc4ef6f8389ded,0x40733e68401cf2a6,2
+np.float64,0xe009bc81c014,0xc0734ea295ee3e5b,2
+np.float64,0x61f56c78c3eae,0xc073411e1dbd7c54,2
+np.float64,0x3fde131928bc2632,0xbfd4fda024f6927c,2
+np.float64,0x3fb21ee530243dca,0xbff266aaf0358129,2
+np.float64,0x7feaac82a4f55904,0x407342cf7809d9f9,2
+np.float64,0x3fe66ab177ecd563,0xbfc3c92d4d522819,2
+np.float64,0xfe9f9c2bfd3f4,0xc0733a7ade3a88a7,2
+np.float64,0x7fd0c5217c218a42,0x40733ac4e4c6dfa5,2
+np.float64,0x430f4ae6861ea,0xc07343c03d8a9442,2
+np.float64,0x494bff2a92981,0xc073432209d2fd16,2
+np.float64,0x3f8860e9d030c1d4,0xbffeca059ebf5e89,2
+np.float64,0x3fe43732dc286e66,0xbfc98800388bad2e,2
+np.float64,0x6443b60ec8877,0xc07340f4bab11827,2
+np.float64,0x3feda9be6d7b537d,0xbfa0dcb9a6914069,2
+np.float64,0x3fc5ceb6772b9d6d,0xbfe89868c881db70,2
+np.float64,0x3fbdf153023be2a6,0xbfedd2878c3b4949,2
+np.float64,0x7fe8f6b8e8f1ed71,0x407342599a30b273,2
+np.float64,0x3fea6fbdb8b4df7b,0xbfb53bf66f71ee96,2
+np.float64,0xc7ac3dbb8f588,0xc0733c2b525b7963,2
+np.float64,0x3fef3a91f77e7524,0xbf85b2bd3adbbe31,2
+np.float64,0x3f887cb97030f973,0xbffec21ccbb5d22a,2
+np.float64,0x8b2f1c9f165e4,0xc0733ead49300951,2
+np.float64,0x2c1cb32058397,0xc07346a951bd8d2b,2
+np.float64,0x3fe057edd620afdc,0xbfd2acf1881b7e99,2
+np.float64,0x7f82e9530025d2a5,0x4073238591dd52ce,2
+np.float64,0x3fe4e03dff69c07c,0xbfc7be96c5c006fc,2
+np.float64,0x52727b4aa4e50,0xc0734250c58ebbc1,2
+np.float64,0x3f99a62160334c43,0xbff99ea3ca09d8f9,2
+np.float64,0x3fd5314b4faa6297,0xbfdeb843daf01e03,2
+np.float64,0x3fefde89e13fbd14,0xbf5d1facb7a1e9de,2
+np.float64,0x7fb460f1a228c1e2,0x4073327d8cbc5f86,2
+np.float64,0xeb93efb3d727e,0xc0733b052a4990e4,2
+np.float64,0x3fe884baecf10976,0xbfbd9ba9cfe23713,2
+np.float64,0x7fefffffffffffff,0x40734413509f79ff,2
+np.float64,0x149dc7c6293ba,0xc0734bf26b1df025,2
+np.float64,0x64188f88c8313,0xc07340f7b8e6f4b5,2
+np.float64,0x3fdfac314abf5863,0xbfd38d3e9dba1b0e,2
+np.float64,0x3fd72052a42e40a5,0xbfdc4af30ee0b245,2
+np.float64,0x7fdd951f743b2a3e,0x40733eb68fafa838,2
+np.float64,0x65a2dd5acb45c,0xc07340dc8ed625e1,2
+np.float64,0x7fe89a79997134f2,0x4073423fbceb1cbe,2
+np.float64,0x3fe70a000d6e1400,0xbfc24381e09d02f7,2
+np.float64,0x3fe2cec160259d83,0xbfcd8b5e92354129,2
+np.float64,0x3feb9ef77a773def,0xbfb05c7b2ee6f388,2
+np.float64,0xe0d66689c1acd,0xc0733b582c779620,2
+np.float64,0x3fee86bd0ffd0d7a,0xbf94f7870502c325,2
+np.float64,0x186afc6230d60,0xc0734ac55fb66d5d,2
+np.float64,0xc0631f4b80c64,0xc0733c6d7149d373,2
+np.float64,0x3fdad1b87735a371,0xbfd82cca73ec663b,2
+np.float64,0x7fe7f6d313efeda5,0x40734210e84576ab,2
+np.float64,0x7fd7b7fce6af6ff9,0x40733d2d92ffdaaf,2
+np.float64,0x3fe6f35a28ade6b4,0xbfc27a4239b540c3,2
+np.float64,0x7fdb0b834eb61706,0x40733e17073a61f3,2
+np.float64,0x82f4661105e8d,0xc0733f19b34adeed,2
+np.float64,0x3fc77230112ee460,0xbfe796a7603c0d16,2
+np.float64,0x8000000000000000,0xfff0000000000000,2
+np.float64,0x7fb8317bc63062f7,0x407333aec761a739,2
+np.float64,0x7fd165609a22cac0,0x40733b061541ff15,2
+np.float64,0x3fed394768fa728f,0xbfa42e1596e1faf6,2
+np.float64,0x7febab693d7756d1,0x40734310a9ac828e,2
+np.float64,0x7fe809a69230134c,0x407342165b9acb69,2
+np.float64,0x3fc091d38f2123a7,0xbfec69a70fc23548,2
+np.float64,0x3fb2a8f5dc2551ec,0xbff2327f2641dd0d,2
+np.float64,0x7fc60b6fe02c16df,0x407337da5adc342c,2
+np.float64,0x3fefa53c3bbf4a78,0xbf73d1be15b73b00,2
+np.float64,0x7fee09c1717c1382,0x407343a2c479e1cb,2
+np.float64,0x8000000000000001,0x7ff8000000000000,2
+np.float64,0x3fede0b2733bc165,0xbf9e848ac2ecf604,2
+np.float64,0x3fee2ac331bc5586,0xbf9a3b699b721c9a,2
+np.float64,0x3fd4db12d829b626,0xbfdf2a413d1e453a,2
+np.float64,0x7fe605230dec0a45,0x4073417a67db06be,2
+np.float64,0x3fe378b2bf26f165,0xbfcb9dbb2b6d6832,2
+np.float64,0xc1d4c1ab83a98,0xc0733c60244cadbf,2
+np.float64,0x3feb15500e762aa0,0xbfb28c071d5efc22,2
+np.float64,0x3fe36225a626c44b,0xbfcbde4259e9047e,2
+np.float64,0x3fe7c586a72f8b0d,0xbfc08614b13ed4b2,2
+np.float64,0x7fb0f2d8cc21e5b1,0x40733135b2c7dd99,2
+np.float64,0x5957f3feb2aff,0xc07341c1df75638c,2
+np.float64,0x3fca4851bd3490a3,0xbfe6005ae5279485,2
+np.float64,0x824217d904843,0xc0733f232fd58f0f,2
+np.float64,0x4f9332269f267,0xc073428fd8e9cb32,2
+np.float64,0x3fea6f087374de11,0xbfb53ef0d03918b2,2
+np.float64,0x3fd9409ab4328135,0xbfd9d9231381e2b8,2
+np.float64,0x3fdba03b00374076,0xbfd759ec94a7ab5b,2
+np.float64,0x3fe0ce3766619c6f,0xbfd1e6912582ccf0,2
+np.float64,0x3fabd45ddc37a8bc,0xbff43c78d3188423,2
+np.float64,0x3fc3cadd592795bb,0xbfe9f1576c9b2c79,2
+np.float64,0x3fe10df049621be1,0xbfd17df2f2c28022,2
+np.float64,0x945b5d1328b6c,0xc0733e3bc06f1e75,2
+np.float64,0x7fc1c3742b2386e7,0x4073365a403d1051,2
+np.float64,0x7fdc957138b92ae1,0x40733e7977717586,2
+np.float64,0x7f943fa1a0287f42,0x407328d01de143f5,2
+np.float64,0x3fec9631c4392c64,0xbfa914b176d8f9d2,2
+np.float64,0x3fd8e7c008b1cf80,0xbfda3b9d9b6da8f4,2
+np.float64,0x7222f9fee4460,0xc073400e371516cc,2
+np.float64,0x3fe890e43eb121c8,0xbfbd64921462e823,2
+np.float64,0x3fcfd7fe2a3faffc,0xbfe3557e2f207800,2
+np.float64,0x3fed5dd1c1babba4,0xbfa318bb20db64e6,2
+np.float64,0x3fe6aa34c66d546a,0xbfc32c8a8991c11e,2
+np.float64,0x8ca79801196,0xc0736522bd5adf6a,2
+np.float64,0x3feb274079364e81,0xbfb2427b24b0ca20,2
+np.float64,0x7fe04927e4a0924f,0x40733f61c96f7f89,2
+np.float64,0x7c05f656f80bf,0xc0733f7a70555b4e,2
+np.float64,0x7fe97819eff2f033,0x4073427d4169b0f8,2
+np.float64,0x9def86e33bdf1,0xc0733dcc740b7175,2
+np.float64,0x7fedd1ef3f3ba3dd,0x40734395ceab8238,2
+np.float64,0x77bed86cef7dc,0xc0733fb8e0e9bf73,2
+np.float64,0x9274b41b24e97,0xc0733e52b16dff71,2
+np.float64,0x8010000000000000,0x7ff8000000000000,2
+np.float64,0x9c977855392ef,0xc0733ddba7d421d9,2
+np.float64,0xfb4560a3f68ac,0xc0733a9271e6a118,2
+np.float64,0xa67d9f394cfb4,0xc0733d6e9d58cc94,2
+np.float64,0x3fbfa766b03f4ecd,0xbfed0cccfecfc900,2
+np.float64,0x3fe177417522ee83,0xbfd0d45803bff01a,2
+np.float64,0x7fe85e077bb0bc0e,0x4073422e957a4aa3,2
+np.float64,0x7feeb0a6883d614c,0x407343c8f6568f7c,2
+np.float64,0xbab82edb75706,0xc0733ca2a2b20094,2
+np.float64,0xfadb44bdf5b69,0xc0733a9561b7ec04,2
+np.float64,0x3fefb9b82b3f7370,0xbf6ea776b2dcc3a9,2
+np.float64,0x7fe080ba8a610174,0x40733f795779b220,2
+np.float64,0x3f87faa1c02ff544,0xbffee76acafc92b7,2
+np.float64,0x7fed474108fa8e81,0x4073437531d4313e,2
+np.float64,0x3fdb7b229336f645,0xbfd77f583a4a067f,2
+np.float64,0x256dbf0c4adb9,0xc07347cd94e6fa81,2
+np.float64,0x3fd034ae25a0695c,0xbfe3169c15decdac,2
+np.float64,0x3a72177274e44,0xc07344b4cf7d68cd,2
+np.float64,0x7fa2522d5c24a45a,0x40732cef2f793470,2
+np.float64,0x3fb052bdde20a57c,0xbff3207fd413c848,2
+np.float64,0x3fdccfecbbb99fd9,0xbfd62ec04a1a687a,2
+np.float64,0x3fd403ac53280759,0xbfe027a31df2c8cc,2
+np.float64,0x3fab708e4036e11d,0xbff45591df4f2e8b,2
+np.float64,0x7fcfc001993f8002,0x40733a63539acf9d,2
+np.float64,0x3fd2b295dfa5652c,0xbfe119c1b476c536,2
+np.float64,0x7fe8061262b00c24,0x4073421552ae4538,2
+np.float64,0xffefffffffffffff,0x7ff8000000000000,2
+np.float64,0x7fed52093ffaa411,0x40734377c072a7e8,2
+np.float64,0xf3df902fe7bf2,0xc0733ac79a75ff7a,2
+np.float64,0x7fe13d382e227a6f,0x40733fc6fd0486bd,2
+np.float64,0x3621d5086c43b,0xc073453d31effbcd,2
+np.float64,0x3ff0000000000000,0x0,2
+np.float64,0x3fdaffea27b5ffd4,0xbfd7fd139dc1c2c5,2
+np.float64,0x7fea6536dc34ca6d,0x407342bccc564fdd,2
+np.float64,0x7fd478f00c28f1df,0x40733c27c0072fde,2
+np.float64,0x7fa72ef0502e5de0,0x40732e91e83db75c,2
+np.float64,0x7fd302970626052d,0x40733ba3ec6775f6,2
+np.float64,0x7fbb57ab0036af55,0x407334887348e613,2
+np.float64,0x3fda0ff722b41fee,0xbfd8f87b77930330,2
+np.float64,0x1e983ce23d309,0xc073493438f57e61,2
+np.float64,0x7fc90de97c321bd2,0x407338be01ffd4bd,2
+np.float64,0x7fe074b09c20e960,0x40733f7443f0dbe1,2
+np.float64,0x3fed5dec9fbabbd9,0xbfa317efb1fe8a95,2
+np.float64,0x7fdb877632b70eeb,0x40733e3697c88ba8,2
+np.float64,0x7fe4fb0067e9f600,0x40734124604b99e8,2
+np.float64,0x7fd447dc96288fb8,0x40733c1703ab2cce,2
+np.float64,0x3feb2d1e64f65a3d,0xbfb22a781df61c05,2
+np.float64,0xb6c8e6676d91d,0xc0733cc8859a0b91,2
+np.float64,0x3fdc3c2418387848,0xbfd6bec3a3c3cdb5,2
+np.float64,0x3fdecb9ccdbd973a,0xbfd4551c05721a8e,2
+np.float64,0x3feb1100e7762202,0xbfb29db911fe6768,2
+np.float64,0x3fe0444bc2a08898,0xbfd2ce69582e78c1,2
+np.float64,0x7fda403218b48063,0x40733de201d8340c,2
+np.float64,0x3fdc70421238e084,0xbfd68ba4bd48322b,2
+np.float64,0x3fe06e747c60dce9,0xbfd286bcac34a981,2
+np.float64,0x7fc1931d9623263a,0x407336473da54de4,2
+np.float64,0x229914da45323,0xc073485979ff141c,2
+np.float64,0x3fe142f92da285f2,0xbfd1280909992cb6,2
+np.float64,0xf1d02fa9e3a06,0xc0733ad6b19d71a0,2
+np.float64,0x3fb1fe9b0023fd36,0xbff27317d8252c16,2
+np.float64,0x3fa544b9242a8972,0xbff61ac38569bcfc,2
+np.float64,0x3feeb129d4fd6254,0xbf928f23ad20c1ee,2
+np.float64,0xa2510b7f44a22,0xc0733d9bc81ea0a1,2
+np.float64,0x3fca75694d34ead3,0xbfe5e8975b3646c2,2
+np.float64,0x7fece10621b9c20b,0x4073435cc3dd9a1b,2
+np.float64,0x7fe98a57d3b314af,0x4073428239b6a135,2
+np.float64,0x3fe259c62a64b38c,0xbfcee96682a0f355,2
+np.float64,0x3feaaa9b9d755537,0xbfb445779f3359af,2
+np.float64,0xdaadecfdb55be,0xc0733b899338432a,2
+np.float64,0x3fed00eae4fa01d6,0xbfa5dc8d77be5991,2
+np.float64,0x7fcc96c773392d8e,0x407339a8c5cd786e,2
+np.float64,0x3fef7b8b203ef716,0xbf7cff655ecb6424,2
+np.float64,0x7fd4008113a80101,0x40733bfe6552acb7,2
+np.float64,0x7fe99ff035b33fdf,0x407342881753ee2e,2
+np.float64,0x3ee031e87dc07,0xc0734432d736e492,2
+np.float64,0x3fddfe390f3bfc72,0xbfd510f1d9ec3e36,2
+np.float64,0x3fd9ddce74b3bb9d,0xbfd92e2d75a061bb,2
+np.float64,0x7fe5f742edebee85,0x40734176058e3a77,2
+np.float64,0x3fdb04185b360831,0xbfd7f8c63aa5e1c4,2
+np.float64,0xea2b0f43d4562,0xc0733b0fd77c8118,2
+np.float64,0x7fc3f4973527e92d,0x407337293bbb22c4,2
+np.float64,0x3fb9adfb38335bf6,0xbfeff4f3ea85821a,2
+np.float64,0x87fb98750ff73,0xc0733ed6ad83c269,2
+np.float64,0x3fe005721a200ae4,0xbfd33a9f1ebfb0ac,2
+np.float64,0xd9e04fe7b3c0a,0xc0733b901ee257f3,2
+np.float64,0x2c39102658723,0xc07346a4db63bf55,2
+np.float64,0x3f7dc28e003b851c,0xc0011c1d1233d948,2
+np.float64,0x3430fd3868620,0xc073457e24e0b70d,2
+np.float64,0xbff0000000000000,0x7ff8000000000000,2
+np.float64,0x3fd23e45e0247c8c,0xbfe17146bcf87b57,2
+np.float64,0x6599df3ecb33d,0xc07340dd2c41644c,2
+np.float64,0x3fdf074f31be0e9e,0xbfd41f6e9dbb68a5,2
+np.float64,0x7fdd6233f3bac467,0x40733eaa8f674b72,2
+np.float64,0x7fe03e8481607d08,0x40733f5d3df3b087,2
+np.float64,0x3fcc3b79f13876f4,0xbfe501bf3b379b77,2
+np.float64,0xe5d97ae3cbb30,0xc0733b30f47cbd12,2
+np.float64,0x8acbc4a115979,0xc0733eb240a4d2c6,2
+np.float64,0x3fedbdbc48bb7b79,0xbfa0470fd70c4359,2
+np.float64,0x3fde1611103c2c22,0xbfd4fae1fa8e7e5e,2
+np.float64,0x3fe09478bd2128f1,0xbfd246b7e85711dc,2
+np.float64,0x3fd6dfe8f3adbfd2,0xbfdc98ca2f32c1ad,2
+np.float64,0x72ccf274e599f,0xc0734003e5b0da63,2
+np.float64,0xe27c7265c4f8f,0xc0733b4b2d808566,2
+np.float64,0x7fee3161703c62c2,0x407343abe90f5649,2
+np.float64,0xf54fb5c1eaa0,0xc0734e01384fcf78,2
+np.float64,0xcde5924d9bcb3,0xc0733bf4b83c66c2,2
+np.float64,0x3fc46fdbe528dfb8,0xbfe97f55ef5e9683,2
+np.float64,0x7fe513528a2a26a4,0x4073412c69baceca,2
+np.float64,0x3fd29eca4aa53d95,0xbfe128801cd33ed0,2
+np.float64,0x7febb21718b7642d,0x4073431256def857,2
+np.float64,0x3fcab536c0356a6e,0xbfe5c73c59f41578,2
+np.float64,0x7fc7e9f0d82fd3e1,0x4073386b213e5dfe,2
+np.float64,0xb5b121276b624,0xc0733cd33083941c,2
+np.float64,0x7e0dd9bcfc1bc,0xc0733f5d8bf35050,2
+np.float64,0x3fd1c75106238ea2,0xbfe1cd11cccda0f4,2
+np.float64,0x9f060e673e0c2,0xc0733dc03da71909,2
+np.float64,0x7fd915a2f3322b45,0x40733d912af07189,2
+np.float64,0x3fd8cbae4431975d,0xbfda5b02ca661139,2
+np.float64,0x3fde8b411f3d1682,0xbfd48f6f710a53b6,2
+np.float64,0x3fc17a780622f4f0,0xbfebabb10c55255f,2
+np.float64,0x3fde5cbe5f3cb97d,0xbfd4b9e2e0101fb1,2
+np.float64,0x7fd859036530b206,0x40733d5c2252ff81,2
+np.float64,0xb0f5040f61ea1,0xc0733d02292f527b,2
+np.float64,0x3fde5c49ae3cb893,0xbfd4ba4db3ce2cf3,2
+np.float64,0x3fecc4518df988a3,0xbfa7af0bfc98bc65,2
+np.float64,0x3feffee03cbffdc0,0xbf0f3ede6ca7d695,2
+np.float64,0xbc5eac9b78bd6,0xc0733c92fb51c8ae,2
+np.float64,0x3fe2bb4ef765769e,0xbfcdc4f70a65dadc,2
+np.float64,0x5089443ca1129,0xc073427a7d0cde4a,2
+np.float64,0x3fd0d6e29121adc5,0xbfe28e28ece1db86,2
+np.float64,0xbe171e397c2e4,0xc0733c82cede5d02,2
+np.float64,0x4ede27be9dbc6,0xc073429fba1a4af1,2
+np.float64,0x3fe2aff3af655fe7,0xbfcde6b52a8ed3c1,2
+np.float64,0x7fd85ca295b0b944,0x40733d5d2adcccf1,2
+np.float64,0x24919bba49234,0xc07347f6ed704a6f,2
+np.float64,0x7fd74bc1eeae9783,0x40733d0d94a89011,2
+np.float64,0x3fc1cd12cb239a26,0xbfeb6a9c25c2a11d,2
+np.float64,0x3fdafbc0ac35f781,0xbfd8015ccf1f1b51,2
+np.float64,0x3fee01327c3c0265,0xbf9ca1d0d762dc18,2
+np.float64,0x3fe65bd7702cb7af,0xbfc3ee0de5c36b8d,2
+np.float64,0x7349c82ee693a,0xc0733ffc5b6eccf2,2
+np.float64,0x3fdc5906f738b20e,0xbfd6a26288eb5933,2
+np.float64,0x1,0xc07434e6420f4374,2
+np.float64,0x3fb966128a32cc25,0xbff00e0aa7273838,2
+np.float64,0x3fd501ff9a2a03ff,0xbfdef69133482121,2
+np.float64,0x194d4f3c329ab,0xc0734a861b44cfbe,2
+np.float64,0x3fec5d34f8f8ba6a,0xbfaad1b31510e70b,2
+np.float64,0x1635e4c22c6be,0xc0734b6dec650943,2
+np.float64,0x3fead2f8edb5a5f2,0xbfb39dac30a962cf,2
+np.float64,0x3f7dfa4ce03bf49a,0xc00115a112141aa7,2
+np.float64,0x3fef6827223ed04e,0xbf80a42c9edebfe9,2
+np.float64,0xe771f303cee3f,0xc0733b24a6269fe4,2
+np.float64,0x1160ccc622c1b,0xc0734d22604eacb9,2
+np.float64,0x3fc485cd08290b9a,0xbfe970723008c8c9,2
+np.float64,0x7fef99c518bf3389,0x407343fcf9ed202f,2
+np.float64,0x7fd8c1447a318288,0x40733d79a440b44d,2
+np.float64,0xaf219f955e434,0xc0733d149c13f440,2
+np.float64,0xcf45f6239e8bf,0xc0733be8ddda045d,2
+np.float64,0x7599394aeb328,0xc0733fd90fdbb0ea,2
+np.float64,0xc7f6390f8fec7,0xc0733c28bfbc66a3,2
+np.float64,0x3fd39ae96c2735d3,0xbfe0712274a8742b,2
+np.float64,0xa4d6c18f49ad8,0xc0733d805a0528f7,2
+np.float64,0x7fd9ea78d7b3d4f1,0x40733dcb2b74802a,2
+np.float64,0x3fecd251cb39a4a4,0xbfa742ed41d4ae57,2
+np.float64,0x7fed7a07cd7af40f,0x407343813476027e,2
+np.float64,0x3fd328ae7f26515d,0xbfe0c30b56a83c64,2
+np.float64,0x7fc937ff7a326ffe,0x407338c9a45b9140,2
+np.float64,0x3fcf1d31143e3a62,0xbfe3a7f760fbd6a8,2
+np.float64,0x7fb911dcbc3223b8,0x407333ee158cccc7,2
+np.float64,0x3fd352fc83a6a5f9,0xbfe0a47d2f74d283,2
+np.float64,0x7fd310753fa620e9,0x40733ba8fc4300dd,2
+np.float64,0x3febd64b4577ac97,0xbfaefd4a79f95c4b,2
+np.float64,0x6a6961a4d4d2d,0xc073408ae1687943,2
+np.float64,0x3fe4ba73d16974e8,0xbfc8239341b9e457,2
+np.float64,0x3fed8e7cac3b1cf9,0xbfa1a96a0cc5fcdc,2
+np.float64,0x7fd505ec04aa0bd7,0x40733c56f86e3531,2
+np.float64,0x3fdf166e9abe2cdd,0xbfd411e5f8569d70,2
+np.float64,0x7fe1bc6434e378c7,0x40733ff9861bdabb,2
+np.float64,0x3fd3b0b175a76163,0xbfe061ba5703f3c8,2
+np.float64,0x7fed75d7ffbaebaf,0x4073438037ba6f19,2
+np.float64,0x5a9e109cb53c3,0xc07341a8b04819c8,2
+np.float64,0x3fe14786b4e28f0d,0xbfd120b541bb880e,2
+np.float64,0x3fed4948573a9291,0xbfa3b471ff91614b,2
+np.float64,0x66aac5d8cd559,0xc07340ca9b18af46,2
+np.float64,0x3fdb48efd23691e0,0xbfd7b24c5694838b,2
+np.float64,0x7fe6da7d1eadb4f9,0x407341bc7d1fae43,2
+np.float64,0x7feb702cf336e059,0x40734301b96cc3c0,2
+np.float64,0x3fd1e60987a3cc13,0xbfe1b522cfcc3d0e,2
+np.float64,0x3feca57f50794aff,0xbfa89dc90625d39c,2
+np.float64,0x7fdc46dc56b88db8,0x40733e664294a0f9,2
+np.float64,0x8dc8fd811b920,0xc0733e8c5955df06,2
+np.float64,0xf01634abe02c7,0xc0733ae370a76d0c,2
+np.float64,0x3fc6f8d8ab2df1b1,0xbfe7df5093829464,2
+np.float64,0xda3d7597b47af,0xc0733b8d2702727a,2
+np.float64,0x7feefd53227dfaa5,0x407343da3d04db28,2
+np.float64,0x3fe2fbca3525f794,0xbfcd06e134417c08,2
+np.float64,0x7fd36d3ce226da79,0x40733bca7c322df1,2
+np.float64,0x7fec37e00b786fbf,0x4073433397b48a5b,2
+np.float64,0x3fbf133f163e267e,0xbfed4e72f1362a77,2
+np.float64,0x3fc11efbb9223df7,0xbfebf53002a561fe,2
+np.float64,0x3fc89c0e5431381d,0xbfe6ea562364bf81,2
+np.float64,0x3f9cd45da839a8bb,0xbff8ceb14669ee4b,2
+np.float64,0x23dc8fa647b93,0xc0734819aaa9b0ee,2
+np.float64,0x3fe829110d305222,0xbfbf3e60c45e2399,2
+np.float64,0x7fed8144e57b0289,0x40734382e917a02a,2
+np.float64,0x7fe033fbf7a067f7,0x40733f58bb00b20f,2
+np.float64,0xe3807f45c7010,0xc0733b43379415d1,2
+np.float64,0x3fd708fb342e11f6,0xbfdc670ef9793782,2
+np.float64,0x3fe88c924b311925,0xbfbd78210d9e7164,2
+np.float64,0x3fe0a2a7c7614550,0xbfd22efaf0472c4a,2
+np.float64,0x7fe3a37501a746e9,0x407340aecaeade41,2
+np.float64,0x3fd05077ec20a0f0,0xbfe2fedbf07a5302,2
+np.float64,0x7fd33bf61da677eb,0x40733bb8c58912aa,2
+np.float64,0x3feb29bdae76537b,0xbfb2384a8f61b5f9,2
+np.float64,0x3fec0fc14ff81f83,0xbfad3423e7ade174,2
+np.float64,0x3fd0f8b1a1a1f163,0xbfe2725dd4ccea8b,2
+np.float64,0x3fe382d26a6705a5,0xbfcb80dba4218bdf,2
+np.float64,0x3fa873f2cc30e7e6,0xbff522911cb34279,2
+np.float64,0x7fed7fd7377affad,0x4073438292f6829b,2
+np.float64,0x3feeacd8067d59b0,0xbf92cdbeda94b35e,2
+np.float64,0x7fe464d62228c9ab,0x407340f1eee19aa9,2
+np.float64,0xe997648bd32ed,0xc0733b143aa0fad3,2
+np.float64,0x7fea4869f13490d3,0x407342b5333b54f7,2
+np.float64,0x935b871926b71,0xc0733e47c6683319,2
+np.float64,0x28a9d0c05155,0xc0735a7e3532af83,2
+np.float64,0x79026548f204d,0xc0733fa6339ffa2f,2
+np.float64,0x3fdb1daaabb63b55,0xbfd7de839c240ace,2
+np.float64,0x3fc0db73b421b6e7,0xbfec2c6e36c4f416,2
+np.float64,0xb8b50ac1716b,0xc0734ff9fc60ebce,2
+np.float64,0x7fdf13e0c6be27c1,0x40733f0e44f69437,2
+np.float64,0x3fcd0cb97b3a1973,0xbfe49c34ff531273,2
+np.float64,0x3fcbac034b375807,0xbfe54913d73f180d,2
+np.float64,0x3fe091d2a2e123a5,0xbfd24b290a9218de,2
+np.float64,0xede43627dbc87,0xc0733af3c7c7f716,2
+np.float64,0x7fc037e7ed206fcf,0x407335b85fb0fedb,2
+np.float64,0x3fce7ae4c63cf5ca,0xbfe3f1350fe03f28,2
+np.float64,0x7fcdd862263bb0c3,0x407339f5458bb20e,2
+np.float64,0x4d7adf709af5d,0xc07342bf4edfadb2,2
+np.float64,0xdc6c03f3b8d81,0xc0733b7b74d6a635,2
+np.float64,0x3fe72ae0a4ee55c1,0xbfc1f4665608b21f,2
+np.float64,0xcd62f19d9ac5e,0xc0733bf92235e4d8,2
+np.float64,0xe3a7b8fdc74f7,0xc0733b4204f8e166,2
+np.float64,0x3fdafd35adb5fa6b,0xbfd7ffdca0753b36,2
+np.float64,0x3fa023e8702047d1,0xbff8059150ea1464,2
+np.float64,0x99ff336933fe7,0xc0733df961197517,2
+np.float64,0x7feeb365b9bd66ca,0x407343c995864091,2
+np.float64,0x7fe449b49f689368,0x407340e8aa3369e3,2
+np.float64,0x7faf5843043eb085,0x407330aa700136ca,2
+np.float64,0x3fd47b2922a8f652,0xbfdfab3de86f09ee,2
+np.float64,0x7fd9fc3248b3f864,0x40733dcfea6f9b3e,2
+np.float64,0xe20b0d8dc4162,0xc0733b4ea8fe7b3f,2
+np.float64,0x7feff8e0e23ff1c1,0x40734411c490ed70,2
+np.float64,0x7fa58382d02b0705,0x40732e0cf28e14fe,2
+np.float64,0xb8ad9a1b715b4,0xc0733cb630b8f2d4,2
+np.float64,0xe90abcf1d2158,0xc0733b186b04eeee,2
+np.float64,0x7fd6aa6f32ad54dd,0x40733cdccc636604,2
+np.float64,0x3fd8f84eedb1f09e,0xbfda292909a5298a,2
+np.float64,0x7fecd6b1d9f9ad63,0x4073435a472b05b5,2
+np.float64,0x3fd9f47604b3e8ec,0xbfd915e028cbf4a6,2
+np.float64,0x3fd20d9398241b27,0xbfe19691363dd508,2
+np.float64,0x3fe5ed09bbabda13,0xbfc5043dfc9c8081,2
+np.float64,0x7fbe5265363ca4c9,0x407335406f8e4fac,2
+np.float64,0xac2878af5850f,0xc0733d3311be9786,2
+np.float64,0xac2074555840f,0xc0733d3364970018,2
+np.float64,0x3fcd49b96b3a9373,0xbfe47f24c8181d9c,2
+np.float64,0x3fd10caca6a21959,0xbfe2620ae5594f9a,2
+np.float64,0xec5b87e9d8b71,0xc0733aff499e72ca,2
+np.float64,0x9d5e9fad3abd4,0xc0733dd2d70eeb4a,2
+np.float64,0x7fe3d3a24227a744,0x407340bfc2072fdb,2
+np.float64,0x3fc5f7a77c2bef4f,0xbfe87e69d502d784,2
+np.float64,0x33161a66662c4,0xc07345a436308244,2
+np.float64,0xa27acdc744f5a,0xc0733d99feb3d8ea,2
+np.float64,0x3fe2d9301565b260,0xbfcd6c914e204437,2
+np.float64,0x7fd5d111e12ba223,0x40733c98e14a6fd0,2
+np.float64,0x6c3387bed8672,0xc073406d3648171a,2
+np.float64,0x24d89fe849b15,0xc07347e97bec008c,2
+np.float64,0x3fefd763677faec7,0xbf61ae69caa9cad9,2
+np.float64,0x7fe0a4684ba148d0,0x40733f884d32c464,2
+np.float64,0x3fd5c3c939ab8792,0xbfddfaaefc1c7fca,2
+np.float64,0x3fec9b87a6b9370f,0xbfa8eb34efcc6b9b,2
+np.float64,0x3feb062431f60c48,0xbfb2ca6036698877,2
+np.float64,0x3fef97f6633f2fed,0xbf76bc742860a340,2
+np.float64,0x74477490e88ef,0xc0733fed220986bc,2
+np.float64,0x3fe4bea67ce97d4d,0xbfc818525292b0f6,2
+np.float64,0x3fc6add3a92d5ba7,0xbfe80cfdc9a90bda,2
+np.float64,0x847c9ce308f94,0xc0733f05026f5965,2
+np.float64,0x7fea53fd2eb4a7f9,0x407342b841fc4723,2
+np.float64,0x3fc55a16fc2ab42e,0xbfe8e3849130da34,2
+np.float64,0x3fbdf7d07c3befa1,0xbfedcf84b9c6c161,2
+np.float64,0x3fe5fb25aa6bf64b,0xbfc4e083ff96b116,2
+np.float64,0x61c776a8c38ef,0xc0734121611d84d7,2
+np.float64,0x3fec413164f88263,0xbfabadbd05131546,2
+np.float64,0x9bf06fe137e0e,0xc0733de315469ee0,2
+np.float64,0x2075eefc40ebf,0xc07348cae84de924,2
+np.float64,0x3fdd42e0143a85c0,0xbfd5c0b6f60b3cea,2
+np.float64,0xdbb1ab45b7636,0xc0733b8157329daf,2
+np.float64,0x3feac6d56bf58dab,0xbfb3d00771b28621,2
+np.float64,0x7fb2dc825025b904,0x407331f3e950751a,2
+np.float64,0x3fecea6efd79d4de,0xbfa689309cc0e3fe,2
+np.float64,0x3fd83abec7b0757e,0xbfdaff5c674a9c59,2
+np.float64,0x3fd396f7c0272df0,0xbfe073ee75c414ba,2
+np.float64,0x3fe10036c162006e,0xbfd1945a38342ae1,2
+np.float64,0x3fd5bbded52b77be,0xbfde04cca40d4156,2
+np.float64,0x3fe870945ab0e129,0xbfbdf72f0e6206fa,2
+np.float64,0x3fef72fddcbee5fc,0xbf7ee2dba88b1bad,2
+np.float64,0x4e111aa09c224,0xc07342b1e2b29643,2
+np.float64,0x3fd926d8b5b24db1,0xbfd9f58b78d6b061,2
+np.float64,0x3fc55679172aacf2,0xbfe8e5df687842e2,2
+np.float64,0x7f5f1749803e2e92,0x40731886e16cfc4d,2
+np.float64,0x7fea082b53b41056,0x407342a42227700e,2
+np.float64,0x3fece1d1d039c3a4,0xbfa6cb780988a469,2
+np.float64,0x3b2721d8764e5,0xc073449f6a5a4832,2
+np.float64,0x365cb7006cba,0xc0735879ba5f0b6e,2
+np.float64,0x7ff4000000000000,0x7ffc000000000000,2
+np.float64,0x7fe606ce92ac0d9c,0x4073417aeebe97e8,2
+np.float64,0x3fe237b544a46f6b,0xbfcf50f8f76d7df9,2
+np.float64,0x3fe7265e5eee4cbd,0xbfc1ff39089ec8d0,2
+np.float64,0x7fe2bb3c5ea57678,0x4073405aaad81cf2,2
+np.float64,0x3fd811df84b023bf,0xbfdb2e670ea8d8de,2
+np.float64,0x3f6a0efd00341dfa,0xc003fac1ae831241,2
+np.float64,0x3fd0d214afa1a429,0xbfe2922080a91c72,2
+np.float64,0x3feca6a350b94d47,0xbfa894eea3a96809,2
+np.float64,0x7fe23e5c76247cb8,0x4073402bbaaf71c7,2
+np.float64,0x3fe739a1fdae7344,0xbfc1d109f66efb5d,2
+np.float64,0x3fdf4b8e283e971c,0xbfd3e28f46169cc5,2
+np.float64,0x38f2535271e4b,0xc07344e3085219fa,2
+np.float64,0x7fd263a0f9a4c741,0x40733b68d945dae0,2
+np.float64,0x7fdd941863bb2830,0x40733eb651e3dca9,2
+np.float64,0xace7279159ce5,0xc0733d2b63b5947e,2
+np.float64,0x7fe34670b2268ce0,0x4073408d92770cb5,2
+np.float64,0x7fd11fa6dfa23f4d,0x40733aea02e76ea3,2
+np.float64,0x3fe6d9cbca6db398,0xbfc2b84b5c8c7eab,2
+np.float64,0x3fd69a0274ad3405,0xbfdcee3c7e52c463,2
+np.float64,0x3feb5af671f6b5ed,0xbfb16f88d739477f,2
+np.float64,0x3feea400163d4800,0xbf934e071c64fd0b,2
+np.float64,0x3fefd6bcf17fad7a,0xbf61f711c392b119,2
+np.float64,0x3fe148d43da291a8,0xbfd11e9cd3f91cd3,2
+np.float64,0x7fedf1308b7be260,0x4073439d135656da,2
+np.float64,0x3fe614c99c6c2993,0xbfc49fd1984dfd6d,2
+np.float64,0xd6e8d4e5add1b,0xc0733ba88256026e,2
+np.float64,0xfff0000000000000,0x7ff8000000000000,2
+np.float64,0x3fb530b5562a616b,0xbff1504bcc5c8f73,2
+np.float64,0xb7da68396fb4d,0xc0733cbe2790f52e,2
+np.float64,0x7fad78e26c3af1c4,0x4073303cdbfb0a15,2
+np.float64,0x7fee5698447cad30,0x407343b474573a8b,2
+np.float64,0x3fd488325c291065,0xbfdf999296d901e7,2
+np.float64,0x2669283a4cd26,0xc073479f823109a4,2
+np.float64,0x7fef3b090afe7611,0x407343e805a3b264,2
+np.float64,0x7fe8b96ae0f172d5,0x4073424874a342ab,2
+np.float64,0x7fef409f56fe813e,0x407343e943c3cd44,2
+np.float64,0x3fed28073dfa500e,0xbfa4b17e4cd31a3a,2
+np.float64,0x7f87ecc4802fd988,0x40732527e027b24b,2
+np.float64,0x3fdda24da0bb449b,0xbfd566a43ac035af,2
+np.float64,0x179fc9e62f3fa,0xc0734b0028c80fc1,2
+np.float64,0x3fef85b0927f0b61,0xbf7ac27565d5ab4f,2
+np.float64,0x5631501aac62b,0xc0734201be12c5d4,2
+np.float64,0x3fd782e424af05c8,0xbfdbd57544f8a7c3,2
+np.float64,0x3fe603a9a6ac0753,0xbfc4caff04dc3caf,2
+np.float64,0x7fbd5225163aa449,0x40733504b88f0a56,2
+np.float64,0x3fecd27506b9a4ea,0xbfa741dd70e6b08c,2
+np.float64,0x9c99603b3932c,0xc0733ddb922dc5db,2
+np.float64,0x3fbeb57f1a3d6afe,0xbfed789ff217aa08,2
+np.float64,0x3fef9c0f85bf381f,0xbf75d5c3d6cb281a,2
+np.float64,0x3fde4afb613c95f7,0xbfd4ca2a231c9005,2
+np.float64,0x396233d472c47,0xc07344d56ee70631,2
+np.float64,0x3fb31ea1c6263d44,0xbff207356152138d,2
+np.float64,0x3fe50bdf78aa17bf,0xbfc74ae0cbffb735,2
+np.float64,0xef74c701dee99,0xc0733ae81e4bb443,2
+np.float64,0x9a3e13a1347c3,0xc0733df68b60afc7,2
+np.float64,0x33ba4f886774b,0xc073458e03f0c13e,2
+np.float64,0x3fe8ba0e9931741d,0xbfbcaadf974e8f64,2
+np.float64,0x3fe090a4cd61214a,0xbfd24d236cf365d6,2
+np.float64,0x7fd87d992930fb31,0x40733d668b73b820,2
+np.float64,0x3fe6422b296c8456,0xbfc42e070b695d01,2
+np.float64,0x3febe9334677d267,0xbfae667864606cfe,2
+np.float64,0x771a3ce4ee348,0xc0733fc274d12c97,2
+np.float64,0x3fe0413542e0826b,0xbfd2d3b08fb5b8a6,2
+np.float64,0x3fd00870ea2010e2,0xbfe33cc04cbd42e0,2
+np.float64,0x3fe74fb817ae9f70,0xbfc19c45dbf919e1,2
+np.float64,0x40382fa08071,0xc07357514ced5577,2
+np.float64,0xa14968474292d,0xc0733da71a990f3a,2
+np.float64,0x5487c740a90fa,0xc0734224622d5801,2
+np.float64,0x3fed7d8d14fafb1a,0xbfa228f7ecc2ac03,2
+np.float64,0x3fe39bb485e73769,0xbfcb3a235a722960,2
+np.float64,0x3fd01090b2202121,0xbfe335b752589a22,2
+np.float64,0x3fd21a3e7da4347d,0xbfe18cd435a7c582,2
+np.float64,0x3fe7fa855a2ff50b,0xbfc00ab0665709fe,2
+np.float64,0x3fedc0d4577b81a9,0xbfa02fef3ff553fc,2
+np.float64,0x3fe99d4906333a92,0xbfb8bf18220e5e8e,2
+np.float64,0x3fd944ee3c3289dc,0xbfd9d46071675e73,2
+np.float64,0x3fe3ed8d52e7db1b,0xbfca53f8d4aef484,2
+np.float64,0x7fe748623a6e90c3,0x407341dd97c9dd79,2
+np.float64,0x3fea1b4b98343697,0xbfb6a1560a56927f,2
+np.float64,0xe1215715c242b,0xc0733b55dbf1f0a8,2
+np.float64,0x3fd0d5bccca1ab7a,0xbfe28f1b66d7a470,2
+np.float64,0x881a962710353,0xc0733ed51848a30d,2
+np.float64,0x3fcf022afe3e0456,0xbfe3b40eabf24501,2
+np.float64,0x3fdf1ac6bbbe358d,0xbfd40e03e888288d,2
+np.float64,0x3fa51a5eac2a34bd,0xbff628a7c34d51b3,2
+np.float64,0x3fdbaf408d375e81,0xbfd74ad39d97c92a,2
+np.float64,0x3fcd2418ea3a4832,0xbfe4910b009d8b11,2
+np.float64,0x3fc7b3062a2f660c,0xbfe7706dc47993e1,2
+np.float64,0x7fb8232218304643,0x407333aaa7041a9f,2
+np.float64,0x7fd5f186362be30b,0x40733ca32fdf9cc6,2
+np.float64,0x3fe57ef1d6aafde4,0xbfc61e23d00210c7,2
+np.float64,0x7c6830baf8d07,0xc0733f74f19e9dad,2
+np.float64,0xcacbfd5595980,0xc0733c0fb49edca7,2
+np.float64,0x3fdfdeac873fbd59,0xbfd36114c56bed03,2
+np.float64,0x3fd31f0889263e11,0xbfe0ca0cc1250169,2
+np.float64,0x3fe839fbe47073f8,0xbfbef0a2abc3d63f,2
+np.float64,0x3fc36af57e26d5eb,0xbfea3553f38770b7,2
+np.float64,0x3fe73dbc44ee7b79,0xbfc1c738f8fa6b3d,2
+np.float64,0x3fd3760e4da6ec1d,0xbfe08b5b609d11e5,2
+np.float64,0x3fee1cfa297c39f4,0xbf9b06d081bc9d5b,2
+np.float64,0xdfb01561bf61,0xc0734ea55e559888,2
+np.float64,0x687bd01cd0f7b,0xc07340ab67fe1816,2
+np.float64,0x3fefc88f4cbf911f,0xbf6828c359cf19dc,2
+np.float64,0x8ad34adb15a6a,0xc0733eb1e03811e5,2
+np.float64,0x3fe2b49c12e56938,0xbfcdd8dbdbc0ce59,2
+np.float64,0x6e05037adc0a1,0xc073404f91261635,2
+np.float64,0x3fe2fd737fe5fae7,0xbfcd020407ef4d78,2
+np.float64,0x3fd0f3c0dc21e782,0xbfe2766a1ab02eae,2
+np.float64,0x28564d9850acb,0xc073474875f87c5e,2
+np.float64,0x3fe4758015a8eb00,0xbfc8ddb45134a1bd,2
+np.float64,0x7fe7f19306efe325,0x4073420f626141a7,2
+np.float64,0x7fd27f34c0a4fe69,0x40733b733d2a5b50,2
+np.float64,0x92c2366325847,0xc0733e4f04f8195a,2
+np.float64,0x3fc21f8441243f09,0xbfeb2ad23bc1ab0b,2
+np.float64,0x3fc721d3e42e43a8,0xbfe7c69bb47b40c2,2
+np.float64,0x3fe2f11a1625e234,0xbfcd26363b9c36c3,2
+np.float64,0x3fdcb585acb96b0b,0xbfd648446237cb55,2
+np.float64,0x3fd4060bf2280c18,0xbfe025fd4c8a658b,2
+np.float64,0x7fb8ae2750315c4e,0x407333d23b025d08,2
+np.float64,0x3fe3a03119a74062,0xbfcb2d6c91b38552,2
+np.float64,0x7fdd2af92bba55f1,0x40733e9d737e16e6,2
+np.float64,0x3fe50b05862a160b,0xbfc74d20815fe36b,2
+np.float64,0x164409f82c882,0xc0734b6980e19c03,2
+np.float64,0x3fe4093712a8126e,0xbfca070367fda5e3,2
+np.float64,0xae3049935c609,0xc0733d1e3608797b,2
+np.float64,0x3fd71df4b4ae3be9,0xbfdc4dcb7637600d,2
+np.float64,0x7fca01e8023403cf,0x407339006c521c49,2
+np.float64,0x3fb0c5c43e218b88,0xbff2f03211c63f25,2
+np.float64,0x3fee757af83ceaf6,0xbf95f33a6e56b454,2
+np.float64,0x3f865f1f402cbe3f,0xbfff62d9c9072bd7,2
+np.float64,0x89864e95130ca,0xc0733ec29f1e32c6,2
+np.float64,0x3fe51482bcea2905,0xbfc73414ddc8f1b7,2
+np.float64,0x7fd802f8fa3005f1,0x40733d43684e460a,2
+np.float64,0x3fbeb86ca63d70d9,0xbfed774ccca9b8f5,2
+np.float64,0x3fb355dcc826abba,0xbff1f33f9339e7a3,2
+np.float64,0x3fe506c61eaa0d8c,0xbfc7585a3f7565a6,2
+np.float64,0x7fe393f25ba727e4,0x407340a94bcea73b,2
+np.float64,0xf66f532decdeb,0xc0733ab5041feb0f,2
+np.float64,0x3fe26e872be4dd0e,0xbfceaaab466f32e0,2
+np.float64,0x3fefd9e290bfb3c5,0xbf60977d24496295,2
+np.float64,0x7fe19c5f692338be,0x40733fecef53ad95,2
+np.float64,0x3fe80365ab3006cb,0xbfbfec4090ef76ec,2
+np.float64,0x3fe88ab39eb11567,0xbfbd8099388d054d,2
+np.float64,0x3fe68fb09fad1f61,0xbfc36db9de38c2c0,2
+np.float64,0x3fe9051883b20a31,0xbfbb5b75b8cb8f24,2
+np.float64,0x3fd4708683a8e10d,0xbfdfb9b085dd8a83,2
+np.float64,0x3fe00ac11a601582,0xbfd3316af3e43500,2
+np.float64,0xd16af30ba2d5f,0xc0733bd68e8252f9,2
+np.float64,0x3fb97d654632facb,0xbff007ac1257f575,2
+np.float64,0x7fd637c10fac6f81,0x40733cb949d76546,2
+np.float64,0x7fed2cab6dba5956,0x4073436edfc3764e,2
+np.float64,0x3fed04afbbba095f,0xbfa5bfaa5074b7f4,2
+np.float64,0x0,0xfff0000000000000,2
+np.float64,0x389a1dc671345,0xc07344edd4206338,2
+np.float64,0x3fbc9ba25a393745,0xbfee74c34f49b921,2
+np.float64,0x3feee749947dce93,0xbf8f032d9cf6b5ae,2
+np.float64,0xedc4cf89db89a,0xc0733af4b2a57920,2
+np.float64,0x3fe41629eba82c54,0xbfc9e321faf79e1c,2
+np.float64,0x3feb0bcbf7b61798,0xbfb2b31e5d952869,2
+np.float64,0xad60654b5ac0d,0xc0733d26860df676,2
+np.float64,0x3fe154e1ff22a9c4,0xbfd10b416e58c867,2
+np.float64,0x7fb20e9c8a241d38,0x407331a66453b8bc,2
+np.float64,0x7fcbbaaf7d37755e,0x4073397274f28008,2
+np.float64,0x187d0fbc30fa3,0xc0734ac03cc98cc9,2
+np.float64,0x7fd153afeaa2a75f,0x40733aff00b4311d,2
+np.float64,0x3fe05310a5e0a621,0xbfd2b5386aeecaac,2
+np.float64,0x7fea863b2b750c75,0x407342c57807f700,2
+np.float64,0x3fed5f0c633abe19,0xbfa30f6cfbc4bf94,2
+np.float64,0xf227c8b3e44f9,0xc0733ad42daaec9f,2
+np.float64,0x3fe956524772aca5,0xbfb9f4cabed7081d,2
+np.float64,0xefd11af7dfa24,0xc0733ae570ed2552,2
+np.float64,0x1690fff02d221,0xc0734b51a56c2980,2
+np.float64,0x7fd2e547a825ca8e,0x40733b992d6d9635,2
diff --git a/numpy/core/tests/data/umath-validation-set-log1p.csv b/numpy/core/tests/data/umath-validation-set-log1p.csv
new file mode 100644 (file)
index 0000000..6e4f88b
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0x3e10aca8,0x3e075347,2
+np.float32,0x3f776e66,0x3f2d2003,2
+np.float32,0xbf34e8ce,0xbf9cfd5c,2
+np.float32,0xbf0260ee,0xbf363f69,2
+np.float32,0x3ed285e8,0x3eb05870,2
+np.float32,0x262b88,0x262b88,2
+np.float32,0x3eeffd6c,0x3ec4cfdb,2
+np.float32,0x3ee86808,0x3ebf9f54,2
+np.float32,0x3f36eba8,0x3f0a0524,2
+np.float32,0xbf1c047a,0xbf70afc7,2
+np.float32,0x3ead2916,0x3e952902,2
+np.float32,0x61c9c9,0x61c9c9,2
+np.float32,0xff7fffff,0xffc00000,2
+np.float32,0x7f64ee52,0x42b138e0,2
+np.float32,0x7ed00b1e,0x42afa4ff,2
+np.float32,0x3db53340,0x3dada0b2,2
+np.float32,0x3e6b0a4a,0x3e5397a4,2
+np.float32,0x7ed5d64f,0x42afb310,2
+np.float32,0xbf12bc5f,0xbf59f5ee,2
+np.float32,0xbda12710,0xbda7d8b5,2
+np.float32,0xbe2e89d8,0xbe3f5a9f,2
+np.float32,0x3f5bee75,0x3f1ebea4,2
+np.float32,0x9317a,0x9317a,2
+np.float32,0x7ee00130,0x42afcad8,2
+np.float32,0x7ef0d16d,0x42afefe7,2
+np.float32,0xbec7463a,0xbefc6a44,2
+np.float32,0xbf760ecc,0xc04fe59c,2
+np.float32,0xbecacb3c,0xbf011ae3,2
+np.float32,0x3ead92be,0x3e9577f0,2
+np.float32,0xbf41510d,0xbfb41b3a,2
+np.float32,0x7f71d489,0x42b154f1,2
+np.float32,0x8023bcd5,0x8023bcd5,2
+np.float32,0x801d33d8,0x801d33d8,2
+np.float32,0x3f3f545d,0x3f0ee0d4,2
+np.float32,0xbf700682,0xc0318c25,2
+np.float32,0xbe54e990,0xbe6eb0a3,2
+np.float32,0x7f0289bf,0x42b01941,2
+np.float32,0xbd61ac90,0xbd682113,2
+np.float32,0xbf2ff310,0xbf94cd6f,2
+np.float32,0x7f10064a,0x42b04b98,2
+np.float32,0x804d0d6d,0x804d0d6d,2
+np.float32,0x80317b0a,0x80317b0a,2
+np.float32,0xbddfef18,0xbded2640,2
+np.float32,0x3f00c9ab,0x3ed0a5bd,2
+np.float32,0x7f04b905,0x42b021c1,2
+np.float32,0x7fc00000,0x7fc00000,2
+np.float32,0x6524c4,0x6524c4,2
+np.float32,0x3da08ae0,0x3d9a8f88,2
+np.float32,0x293ea9,0x293ea9,2
+np.float32,0x71499e,0x71499e,2
+np.float32,0xbf14f54d,0xbf5f38a5,2
+np.float32,0x806e60f5,0x806e60f5,2
+np.float32,0x3f5f34bb,0x3f207fff,2
+np.float32,0x80513427,0x80513427,2
+np.float32,0x7f379670,0x42b0c7dc,2
+np.float32,0x3efba888,0x3eccb20b,2
+np.float32,0x3eeadd1b,0x3ec14f4b,2
+np.float32,0x7ec5a27f,0x42af8ab8,2
+np.float32,0x3f2afe4e,0x3f02f7a2,2
+np.float32,0x5591c8,0x5591c8,2
+np.float32,0x3dbb7240,0x3db35bab,2
+np.float32,0x805b911b,0x805b911b,2
+np.float32,0x800000,0x800000,2
+np.float32,0x7e784c04,0x42ae9cab,2
+np.float32,0x7ebaae14,0x42af6d86,2
+np.float32,0xbec84f7a,0xbefe1d42,2
+np.float32,0x7cea8281,0x42aa56bf,2
+np.float32,0xbf542cf6,0xbfe1eb1b,2
+np.float32,0xbf6bfb13,0xc0231a5b,2
+np.float32,0x7d6eeaef,0x42abc32c,2
+np.float32,0xbf062f6b,0xbf3e2000,2
+np.float32,0x8073d8e9,0x8073d8e9,2
+np.float32,0xbea4db14,0xbec6f485,2
+np.float32,0x7d7e8d62,0x42abe3a0,2
+np.float32,0x7e8fc34e,0x42aee7c6,2
+np.float32,0x7dcbb0c3,0x42acd464,2
+np.float32,0x7e123c,0x7e123c,2
+np.float32,0x3d77af62,0x3d707c34,2
+np.float32,0x498cc8,0x498cc8,2
+np.float32,0x7f4e2206,0x42b1032a,2
+np.float32,0x3f734e0a,0x3f2b04a1,2
+np.float32,0x8053a9d0,0x8053a9d0,2
+np.float32,0xbe8a67e0,0xbea15be9,2
+np.float32,0xbf78e0ea,0xc065409e,2
+np.float32,0x352bdd,0x352bdd,2
+np.float32,0x3ee42be7,0x3ebcb38a,2
+np.float32,0x7f482d10,0x42b0f427,2
+np.float32,0xbf23155e,0xbf81b993,2
+np.float32,0x594920,0x594920,2
+np.float32,0x63f53f,0x63f53f,2
+np.float32,0x363592,0x363592,2
+np.float32,0x7dafbb78,0x42ac88cc,2
+np.float32,0x7f69516c,0x42b14298,2
+np.float32,0x3e1d5be2,0x3e126131,2
+np.float32,0x410c23,0x410c23,2
+np.float32,0x7ec9563c,0x42af9439,2
+np.float32,0xbedd3a0e,0xbf10d705,2
+np.float32,0x7f7c4f1f,0x42b16aa8,2
+np.float32,0xbe99b34e,0xbeb6c2d3,2
+np.float32,0x6cdc84,0x6cdc84,2
+np.float32,0x5b3bbe,0x5b3bbe,2
+np.float32,0x252178,0x252178,2
+np.float32,0x7d531865,0x42ab83c8,2
+np.float32,0xbf565b44,0xbfe873bf,2
+np.float32,0x5977ce,0x5977ce,2
+np.float32,0x588a58,0x588a58,2
+np.float32,0x3eae7054,0x3e961d51,2
+np.float32,0x725049,0x725049,2
+np.float32,0x7f2b9386,0x42b0a538,2
+np.float32,0xbe674714,0xbe831245,2
+np.float32,0x8044f0d8,0x8044f0d8,2
+np.float32,0x800a3c21,0x800a3c21,2
+np.float32,0x807b275b,0x807b275b,2
+np.float32,0xbf2463b6,0xbf83896e,2
+np.float32,0x801cca42,0x801cca42,2
+np.float32,0xbf28f2d0,0xbf8a121a,2
+np.float32,0x3f4168c2,0x3f1010ce,2
+np.float32,0x6f91a1,0x6f91a1,2
+np.float32,0xbf2b9eeb,0xbf8e0fc5,2
+np.float32,0xbea4c858,0xbec6d8e4,2
+np.float32,0xbf7abba0,0xc0788e88,2
+np.float32,0x802f18f7,0x802f18f7,2
+np.float32,0xbf7f6c75,0xc0c3145c,2
+np.float32,0xbe988210,0xbeb50f5e,2
+np.float32,0xbf219b7e,0xbf7f6a3b,2
+np.float32,0x7f800000,0x7f800000,2
+np.float32,0x7f7fffff,0x42b17218,2
+np.float32,0xbdca8d90,0xbdd5487e,2
+np.float32,0xbef683b0,0xbf2821b0,2
+np.float32,0x8043e648,0x8043e648,2
+np.float32,0xbf4319a4,0xbfb7cd1b,2
+np.float32,0x62c2b2,0x62c2b2,2
+np.float32,0xbf479ccd,0xbfc1a7b1,2
+np.float32,0x806c8a32,0x806c8a32,2
+np.float32,0x7f004447,0x42b01045,2
+np.float32,0x3f737d36,0x3f2b1ccf,2
+np.float32,0x3ee71f24,0x3ebebced,2
+np.float32,0x3ea0b6b4,0x3e8bc606,2
+np.float32,0x358fd7,0x358fd7,2
+np.float32,0xbe69780c,0xbe847d17,2
+np.float32,0x7f6bed18,0x42b14849,2
+np.float32,0xbf6a5113,0xc01dfe1d,2
+np.float32,0xbf255693,0xbf84de88,2
+np.float32,0x7f34acac,0x42b0bfac,2
+np.float32,0xbe8a3b6a,0xbea11efe,2
+np.float32,0x3f470d84,0x3f1342ab,2
+np.float32,0xbf2cbde3,0xbf8fc602,2
+np.float32,0x47c103,0x47c103,2
+np.float32,0xe3c94,0xe3c94,2
+np.float32,0xbec07afa,0xbef1693a,2
+np.float32,0x6a9cfe,0x6a9cfe,2
+np.float32,0xbe4339e0,0xbe5899da,2
+np.float32,0x7ea9bf1e,0x42af3cd6,2
+np.float32,0x3f6378b4,0x3f22c4c4,2
+np.float32,0xbd989ff0,0xbd9e9c77,2
+np.float32,0xbe6f2f50,0xbe88343d,2
+np.float32,0x3f7f2ac5,0x3f310764,2
+np.float32,0x3f256704,0x3eff2fb2,2
+np.float32,0x80786aca,0x80786aca,2
+np.float32,0x65d02f,0x65d02f,2
+np.float32,0x50d1c3,0x50d1c3,2
+np.float32,0x3f4a9d76,0x3f1541b4,2
+np.float32,0x802cf491,0x802cf491,2
+np.float32,0x3e935cec,0x3e81829b,2
+np.float32,0x3e2ad478,0x3e1dfd81,2
+np.float32,0xbf107cbd,0xbf54bef2,2
+np.float32,0xbf58c02e,0xbff007fe,2
+np.float32,0x80090808,0x80090808,2
+np.float32,0x805d1f66,0x805d1f66,2
+np.float32,0x6aec95,0x6aec95,2
+np.float32,0xbee3fc6e,0xbf16dc73,2
+np.float32,0x7f63314b,0x42b134f9,2
+np.float32,0x550443,0x550443,2
+np.float32,0xbefa8174,0xbf2c026e,2
+np.float32,0x3f7fb380,0x3f314bd5,2
+np.float32,0x80171f2c,0x80171f2c,2
+np.float32,0x3f2f56ae,0x3f058f2d,2
+np.float32,0x3eacaecb,0x3e94cd97,2
+np.float32,0xbe0c4f0c,0xbe16e69d,2
+np.float32,0x3f48e4cb,0x3f144b42,2
+np.float32,0x7f03efe2,0x42b01eb7,2
+np.float32,0xbf1019ac,0xbf53dbe9,2
+np.float32,0x3e958524,0x3e832eb5,2
+np.float32,0xbf1b23c6,0xbf6e72f2,2
+np.float32,0x12c554,0x12c554,2
+np.float32,0x7dee588c,0x42ad24d6,2
+np.float32,0xbe8c216c,0xbea3ba70,2
+np.float32,0x804553cb,0x804553cb,2
+np.float32,0xbe446324,0xbe5a0966,2
+np.float32,0xbef7150a,0xbf28adff,2
+np.float32,0xbf087282,0xbf42ec6e,2
+np.float32,0x3eeef15c,0x3ec41937,2
+np.float32,0x61bbd2,0x61bbd2,2
+np.float32,0x3e51b28d,0x3e3ec538,2
+np.float32,0x57e869,0x57e869,2
+np.float32,0x7e5e7711,0x42ae646c,2
+np.float32,0x8050b173,0x8050b173,2
+np.float32,0xbf63c90c,0xc00d2438,2
+np.float32,0xbeba774c,0xbee7dcf8,2
+np.float32,0x8016faac,0x8016faac,2
+np.float32,0xbe8b448c,0xbea28aaf,2
+np.float32,0x3e8cd448,0x3e78d29e,2
+np.float32,0x80484e02,0x80484e02,2
+np.float32,0x3f63ba68,0x3f22e78c,2
+np.float32,0x2e87bb,0x2e87bb,2
+np.float32,0x230496,0x230496,2
+np.float32,0x1327b2,0x1327b2,2
+np.float32,0xbf046c56,0xbf3a72d2,2
+np.float32,0x3ecefe60,0x3eadd69a,2
+np.float32,0x49c56e,0x49c56e,2
+np.float32,0x3df22d60,0x3de4e550,2
+np.float32,0x3f67c19d,0x3f250707,2
+np.float32,0x3f20eb9c,0x3ef9b624,2
+np.float32,0x3f05ca75,0x3ed742fa,2
+np.float32,0xbe8514f8,0xbe9a1d45,2
+np.float32,0x8070a003,0x8070a003,2
+np.float32,0x7e49650e,0x42ae317a,2
+np.float32,0x3de16ce9,0x3dd5dc3e,2
+np.float32,0xbf4ae952,0xbfc95f1f,2
+np.float32,0xbe44dd84,0xbe5aa0db,2
+np.float32,0x803c3bc0,0x803c3bc0,2
+np.float32,0x3eebb9e8,0x3ec1e692,2
+np.float32,0x80588275,0x80588275,2
+np.float32,0xbea1e69a,0xbec29d86,2
+np.float32,0x3f7b4bf8,0x3f2f154c,2
+np.float32,0x7eb47ecc,0x42af5c46,2
+np.float32,0x3d441e00,0x3d3f911a,2
+np.float32,0x7f54d40e,0x42b11388,2
+np.float32,0xbf47f17e,0xbfc26882,2
+np.float32,0x3ea7da57,0x3e912db4,2
+np.float32,0x3f59cc7b,0x3f1d984e,2
+np.float32,0x570e08,0x570e08,2
+np.float32,0x3e99560c,0x3e8620a2,2
+np.float32,0x3ecfbd14,0x3eae5e55,2
+np.float32,0x7e86be08,0x42aec698,2
+np.float32,0x3f10f28a,0x3ee5b5d3,2
+np.float32,0x7f228722,0x42b0897a,2
+np.float32,0x3f4b979b,0x3f15cd30,2
+np.float32,0xbf134283,0xbf5b30f9,2
+np.float32,0x3f2ae16a,0x3f02e64f,2
+np.float32,0x3e98e158,0x3e85c6cc,2
+np.float32,0x7ec39f27,0x42af857a,2
+np.float32,0x3effedb0,0x3ecf8cea,2
+np.float32,0xbd545620,0xbd5a09c1,2
+np.float32,0x503a28,0x503a28,2
+np.float32,0x3f712744,0x3f29e9a1,2
+np.float32,0x3edc6194,0x3eb748b1,2
+np.float32,0xbf4ec1e5,0xbfd2ff5f,2
+np.float32,0x3f46669e,0x3f12e4b5,2
+np.float32,0xabad3,0xabad3,2
+np.float32,0x80000000,0x80000000,2
+np.float32,0x803f2e6d,0x803f2e6d,2
+np.float32,0xbf431542,0xbfb7c3e6,2
+np.float32,0x3f6f2d53,0x3f28e496,2
+np.float32,0x546bd8,0x546bd8,2
+np.float32,0x25c80a,0x25c80a,2
+np.float32,0x3e50883c,0x3e3dcd7e,2
+np.float32,0xbf5fa2ba,0xc0045c14,2
+np.float32,0x80271c07,0x80271c07,2
+np.float32,0x8043755d,0x8043755d,2
+np.float32,0xbf3c5cea,0xbfaa5ee9,2
+np.float32,0x3f2fea38,0x3f05e6af,2
+np.float32,0x6da3dc,0x6da3dc,2
+np.float32,0xbf095945,0xbf44dc70,2
+np.float32,0xbe33d584,0xbe45c1f5,2
+np.float32,0x7eb41b2e,0x42af5b2b,2
+np.float32,0xbf0feb74,0xbf537242,2
+np.float32,0xbe96225a,0xbeb1b0b1,2
+np.float32,0x3f63b95f,0x3f22e700,2
+np.float32,0x0,0x0,2
+np.float32,0x3e20b0cc,0x3e154374,2
+np.float32,0xbf79880c,0xc06b6801,2
+np.float32,0xbea690b6,0xbec97b93,2
+np.float32,0xbf3e11ca,0xbfada449,2
+np.float32,0x7e7e6292,0x42aea912,2
+np.float32,0x3e793350,0x3e5f0b7b,2
+np.float32,0x802e7183,0x802e7183,2
+np.float32,0x3f1b3695,0x3ef2a788,2
+np.float32,0x801efa20,0x801efa20,2
+np.float32,0x3f1ec43a,0x3ef70f42,2
+np.float32,0xbf12c5ed,0xbf5a0c52,2
+np.float32,0x8005e99c,0x8005e99c,2
+np.float32,0xbf79f5e7,0xc06fcca5,2
+np.float32,0x3ecbaf50,0x3eab7a03,2
+np.float32,0x46b0fd,0x46b0fd,2
+np.float32,0x3edb9023,0x3eb6b631,2
+np.float32,0x7f24bc41,0x42b09063,2
+np.float32,0xbd8d9328,0xbd92b4c6,2
+np.float32,0x3f2c5d7f,0x3f03c9d9,2
+np.float32,0x807bebc9,0x807bebc9,2
+np.float32,0x7f797a99,0x42b164e2,2
+np.float32,0x756e3c,0x756e3c,2
+np.float32,0x80416f8a,0x80416f8a,2
+np.float32,0x3e0d512a,0x3e04611a,2
+np.float32,0x3f7be3e6,0x3f2f61ec,2
+np.float32,0x80075c41,0x80075c41,2
+np.float32,0xbe850294,0xbe9a046c,2
+np.float32,0x684679,0x684679,2
+np.float32,0x3eb393c4,0x3e99eed2,2
+np.float32,0x3f4177c6,0x3f10195b,2
+np.float32,0x3dd1f402,0x3dc7dfe5,2
+np.float32,0x3ef484d4,0x3ec7e2e1,2
+np.float32,0x53eb8f,0x53eb8f,2
+np.float32,0x7f072cb6,0x42b02b20,2
+np.float32,0xbf1b6b55,0xbf6f28d4,2
+np.float32,0xbd8a98d8,0xbd8f827d,2
+np.float32,0x3eafb418,0x3e970e96,2
+np.float32,0x6555af,0x6555af,2
+np.float32,0x7dd5118e,0x42aceb6f,2
+np.float32,0x800a13f7,0x800a13f7,2
+np.float32,0x331a9d,0x331a9d,2
+np.float32,0x8063773f,0x8063773f,2
+np.float32,0x3e95e068,0x3e837553,2
+np.float32,0x80654b32,0x80654b32,2
+np.float32,0x3dabe0e0,0x3da50bb3,2
+np.float32,0xbf6283c3,0xc00a5280,2
+np.float32,0x80751cc5,0x80751cc5,2
+np.float32,0x3f668eb6,0x3f2465c0,2
+np.float32,0x3e13c058,0x3e0a048c,2
+np.float32,0x77780c,0x77780c,2
+np.float32,0x3f7d6e48,0x3f302868,2
+np.float32,0x7e31f9e3,0x42adf22f,2
+np.float32,0x246c7b,0x246c7b,2
+np.float32,0xbe915bf0,0xbeaafa6c,2
+np.float32,0xbf800000,0xff800000,2
+np.float32,0x3f698f42,0x3f25f8e0,2
+np.float32,0x7e698885,0x42ae7d48,2
+np.float32,0x3f5bbd42,0x3f1ea42c,2
+np.float32,0x5b8444,0x5b8444,2
+np.float32,0xbf6065f6,0xc005e2c6,2
+np.float32,0xbeb95036,0xbee60dad,2
+np.float32,0xbf44f846,0xbfbbcade,2
+np.float32,0xc96e5,0xc96e5,2
+np.float32,0xbf213e90,0xbf7e6eae,2
+np.float32,0xbeb309cc,0xbedc4fe6,2
+np.float32,0xbe781cf4,0xbe8e0fe6,2
+np.float32,0x7f0cf0db,0x42b04083,2
+np.float32,0xbf7b6143,0xc08078f9,2
+np.float32,0x80526fc6,0x80526fc6,2
+np.float32,0x3f092bf3,0x3edbaeec,2
+np.float32,0x3ecdf154,0x3ead16df,2
+np.float32,0x2fe85b,0x2fe85b,2
+np.float32,0xbf5100a0,0xbfd8f871,2
+np.float32,0xbec09d40,0xbef1a028,2
+np.float32,0x5e6a85,0x5e6a85,2
+np.float32,0xbec0e2a0,0xbef20f6b,2
+np.float32,0x3f72e788,0x3f2ad00d,2
+np.float32,0x880a6,0x880a6,2
+np.float32,0x3d9e90bf,0x3d98b9fc,2
+np.float32,0x15cf25,0x15cf25,2
+np.float32,0x10171b,0x10171b,2
+np.float32,0x805cf1aa,0x805cf1aa,2
+np.float32,0x3f19bd36,0x3ef0d0d2,2
+np.float32,0x3ebe2bda,0x3ea1b774,2
+np.float32,0xbecd8192,0xbf035c49,2
+np.float32,0x3e2ce508,0x3e1fc21b,2
+np.float32,0x290f,0x290f,2
+np.float32,0x803b679f,0x803b679f,2
+np.float32,0x1,0x1,2
+np.float32,0x807a9c76,0x807a9c76,2
+np.float32,0xbf65fced,0xc01257f8,2
+np.float32,0x3f783414,0x3f2d8475,2
+np.float32,0x3f2d9d92,0x3f0488da,2
+np.float32,0xbddb5798,0xbde80018,2
+np.float32,0x3e91afb8,0x3e8034e7,2
+np.float32,0xbf1b775a,0xbf6f476d,2
+np.float32,0xbf73a32c,0xc041f3ba,2
+np.float32,0xbea39364,0xbec5121b,2
+np.float32,0x80375b94,0x80375b94,2
+np.float32,0x3f331252,0x3f07c3e9,2
+np.float32,0xbf285774,0xbf892e74,2
+np.float32,0x3e699bb8,0x3e526d55,2
+np.float32,0x3f08208a,0x3eda523a,2
+np.float32,0xbf42fb4a,0xbfb78d60,2
+np.float32,0x8029c894,0x8029c894,2
+np.float32,0x3e926c0c,0x3e80c76e,2
+np.float32,0x801e4715,0x801e4715,2
+np.float32,0x3e4b36d8,0x3e395ffd,2
+np.float32,0x8041556b,0x8041556b,2
+np.float32,0xbf2d99ba,0xbf9119bd,2
+np.float32,0x3ed83ea8,0x3eb46250,2
+np.float32,0xbe94a280,0xbeaf92b4,2
+np.float32,0x7f4c7a64,0x42b0ff0a,2
+np.float32,0x806d4022,0x806d4022,2
+np.float32,0xbed382f8,0xbf086d26,2
+np.float32,0x1846fe,0x1846fe,2
+np.float32,0xbe702558,0xbe88d4d8,2
+np.float32,0xbe650ee0,0xbe81a3cc,2
+np.float32,0x3ee9d088,0x3ec0970c,2
+np.float32,0x7f6d4498,0x42b14b30,2
+np.float32,0xbef9f9e6,0xbf2b7ddb,2
+np.float32,0xbf70c384,0xc0349370,2
+np.float32,0xbeff9e9e,0xbf3110c8,2
+np.float32,0xbef06372,0xbf224aa9,2
+np.float32,0xbf15a692,0xbf60e1fa,2
+np.float32,0x8058c117,0x8058c117,2
+np.float32,0xbd9f74b8,0xbda6017b,2
+np.float32,0x801bf130,0x801bf130,2
+np.float32,0x805da84c,0x805da84c,2
+np.float32,0xff800000,0xffc00000,2
+np.float32,0xbeb01de2,0xbed7d6d6,2
+np.float32,0x8077de08,0x8077de08,2
+np.float32,0x3e327668,0x3e2482c1,2
+np.float32,0xbe7add88,0xbe8fe1ab,2
+np.float32,0x805a3c2e,0x805a3c2e,2
+np.float32,0x80326a73,0x80326a73,2
+np.float32,0x800b8a34,0x800b8a34,2
+np.float32,0x8048c83a,0x8048c83a,2
+np.float32,0xbf3799d6,0xbfa1a975,2
+np.float32,0x807649c7,0x807649c7,2
+np.float32,0x3dfdbf90,0x3def3798,2
+np.float32,0xbf1b538a,0xbf6eec4c,2
+np.float32,0xbf1e5989,0xbf76baa0,2
+np.float32,0xc7a80,0xc7a80,2
+np.float32,0x8001be54,0x8001be54,2
+np.float32,0x3f435bbc,0x3f112c6d,2
+np.float32,0xbeabcff8,0xbed151d1,2
+np.float32,0x7de20c78,0x42ad09b7,2
+np.float32,0x3f0e6d2e,0x3ee27b1e,2
+np.float32,0xbf0cb352,0xbf4c3267,2
+np.float32,0x7f6ec06f,0x42b14e61,2
+np.float32,0x7f6fa8ef,0x42b15053,2
+np.float32,0xbf3d2a6a,0xbfabe623,2
+np.float32,0x7f077a4c,0x42b02c46,2
+np.float32,0xbf2a68dc,0xbf8c3cc4,2
+np.float32,0x802a5dbe,0x802a5dbe,2
+np.float32,0x807f631c,0x807f631c,2
+np.float32,0x3dc9b8,0x3dc9b8,2
+np.float32,0x3ebdc1b7,0x3ea16a0a,2
+np.float32,0x7ef29dab,0x42aff3b5,2
+np.float32,0x3e8ab1cc,0x3e757806,2
+np.float32,0x3f27e88e,0x3f011c6d,2
+np.float32,0x3cfd1455,0x3cf93fb5,2
+np.float32,0x7f7eebf5,0x42b16fef,2
+np.float32,0x3c9b2140,0x3c99ade9,2
+np.float32,0x7e928601,0x42aef183,2
+np.float32,0xbd7d2db0,0xbd82abae,2
+np.float32,0x3e6f0df3,0x3e56da20,2
+np.float32,0x7d36a2fc,0x42ab39a3,2
+np.float32,0xbf49d3a2,0xbfc6c859,2
+np.float32,0x7ee541d3,0x42afd6b6,2
+np.float32,0x80753dc0,0x80753dc0,2
+np.float32,0x3f4ce486,0x3f16865d,2
+np.float32,0x39e701,0x39e701,2
+np.float32,0x3f3d9ede,0x3f0de5fa,2
+np.float32,0x7fafb2,0x7fafb2,2
+np.float32,0x3e013fdc,0x3df37090,2
+np.float32,0x807b6a2c,0x807b6a2c,2
+np.float32,0xbe86800a,0xbe9c08c7,2
+np.float32,0x7f40f080,0x42b0e14d,2
+np.float32,0x7eef5afe,0x42afecc8,2
+np.float32,0x7ec30052,0x42af83da,2
+np.float32,0x3eacf768,0x3e9503e1,2
+np.float32,0x7f13ef0e,0x42b0594e,2
+np.float32,0x80419f4a,0x80419f4a,2
+np.float32,0xbf485932,0xbfc3562a,2
+np.float32,0xbe8a24d6,0xbea10011,2
+np.float32,0xbda791c0,0xbdaed2bc,2
+np.float32,0x3e9b5169,0x3e87a67d,2
+np.float32,0x807dd882,0x807dd882,2
+np.float32,0x7f40170e,0x42b0df0a,2
+np.float32,0x7f02f7f9,0x42b01af1,2
+np.float32,0x3ea38bf9,0x3e8decde,2
+np.float32,0x3e2e7ce8,0x3e211ed4,2
+np.float32,0x70a7a6,0x70a7a6,2
+np.float32,0x7d978592,0x42ac3ce7,2
+np.float32,0x804d12d0,0x804d12d0,2
+np.float32,0x80165dc8,0x80165dc8,2
+np.float32,0x80000001,0x80000001,2
+np.float32,0x3e325da0,0x3e246da6,2
+np.float32,0xbe063bb8,0xbe0fe281,2
+np.float32,0x160b8,0x160b8,2
+np.float32,0xbe5687a4,0xbe70bbef,2
+np.float32,0x7f11ab34,0x42b05168,2
+np.float32,0xc955c,0xc955c,2
+np.float32,0xbea0003a,0xbebfd826,2
+np.float32,0x3f7fbdd9,0x3f315102,2
+np.float32,0xbe61aefc,0xbe7ef121,2
+np.float32,0xbf1b9873,0xbf6f9bc3,2
+np.float32,0x3a6d14,0x3a6d14,2
+np.float32,0xbf1ad3b4,0xbf6da808,2
+np.float32,0x3ed2dd24,0x3eb0963d,2
+np.float32,0xbe81a4ca,0xbe957d52,2
+np.float32,0x7f1be3e9,0x42b07421,2
+np.float32,0x7f5ce943,0x42b1269e,2
+np.float32,0x7eebcbdf,0x42afe51d,2
+np.float32,0x807181b5,0x807181b5,2
+np.float32,0xbecb03ba,0xbf0149ad,2
+np.float32,0x42edb8,0x42edb8,2
+np.float32,0xbf3aeec8,0xbfa7b13f,2
+np.float32,0xbd0c4f00,0xbd0ec4a0,2
+np.float32,0x3e48d260,0x3e376070,2
+np.float32,0x1a9731,0x1a9731,2
+np.float32,0x7f323be4,0x42b0b8b5,2
+np.float32,0x1a327f,0x1a327f,2
+np.float32,0x17f1fc,0x17f1fc,2
+np.float32,0xbf2f4f9b,0xbf93c91a,2
+np.float32,0x3ede8934,0x3eb8c9c3,2
+np.float32,0xbf56aaac,0xbfe968bb,2
+np.float32,0x3e22cb5a,0x3e17148c,2
+np.float32,0x7d9def,0x7d9def,2
+np.float32,0x8045b963,0x8045b963,2
+np.float32,0x77404f,0x77404f,2
+np.float32,0x7e2c9efb,0x42ade28b,2
+np.float32,0x8058ad89,0x8058ad89,2
+np.float32,0x7f4139,0x7f4139,2
+np.float32,0x8020e12a,0x8020e12a,2
+np.float32,0x800c9daa,0x800c9daa,2
+np.float32,0x7f2c5ac5,0x42b0a789,2
+np.float32,0x3f04a47b,0x3ed5c043,2
+np.float32,0x804692d5,0x804692d5,2
+np.float32,0xbf6e7fa4,0xc02bb493,2
+np.float32,0x80330756,0x80330756,2
+np.float32,0x7f3e29ad,0x42b0d9e1,2
+np.float32,0xbebf689a,0xbeefb24d,2
+np.float32,0x3f29a86c,0x3f022a56,2
+np.float32,0x3e3bd1c0,0x3e2c72b3,2
+np.float32,0x3f78f2e8,0x3f2de546,2
+np.float32,0x3f3709be,0x3f0a16af,2
+np.float32,0x3e11f150,0x3e086f97,2
+np.float32,0xbf5867ad,0xbfeee8a0,2
+np.float32,0xbebfb328,0xbef0296c,2
+np.float32,0x2f7f15,0x2f7f15,2
+np.float32,0x805cfe84,0x805cfe84,2
+np.float32,0xbf504e01,0xbfd71589,2
+np.float32,0x3ee0903c,0x3eba330c,2
+np.float32,0xbd838990,0xbd87f399,2
+np.float32,0x3f14444e,0x3ee9ee7d,2
+np.float32,0x7e352583,0x42adfb3a,2
+np.float32,0x7e76f824,0x42ae99ec,2
+np.float32,0x3f772d00,0x3f2cfebf,2
+np.float32,0x801f7763,0x801f7763,2
+np.float32,0x3f760bf5,0x3f2c6b87,2
+np.float32,0xbf0bb696,0xbf4a03a5,2
+np.float32,0x3f175d2c,0x3eedd6d2,2
+np.float32,0xbf5723f8,0xbfeae288,2
+np.float32,0x24de0a,0x24de0a,2
+np.float32,0x3cd73f80,0x3cd47801,2
+np.float32,0x7f013305,0x42b013fa,2
+np.float32,0x3e3ad425,0x3e2b9c50,2
+np.float32,0x7d3d16,0x7d3d16,2
+np.float32,0x3ef49738,0x3ec7ef54,2
+np.float32,0x3f5b8612,0x3f1e8678,2
+np.float32,0x7f0eeb5c,0x42b047a7,2
+np.float32,0x7e9d7cb0,0x42af1675,2
+np.float32,0xbdd1cfb0,0xbddd5aa0,2
+np.float32,0xbf645dba,0xc00e78fe,2
+np.float32,0x3f511174,0x3f18d56c,2
+np.float32,0x3d91ad00,0x3d8cba62,2
+np.float32,0x805298da,0x805298da,2
+np.float32,0xbedb6af4,0xbf0f4090,2
+np.float32,0x3d23b1ba,0x3d208205,2
+np.float32,0xbea5783e,0xbec7dc87,2
+np.float32,0x79d191,0x79d191,2
+np.float32,0x3e894413,0x3e7337da,2
+np.float32,0x80800000,0x80800000,2
+np.float32,0xbf34a8d3,0xbf9c907b,2
+np.float32,0x3bae779a,0x3bae011f,2
+np.float32,0x8049284d,0x8049284d,2
+np.float32,0x3eb42cc4,0x3e9a600b,2
+np.float32,0x3da1e2d0,0x3d9bce5f,2
+np.float32,0x3f364b8a,0x3f09a7af,2
+np.float32,0x3d930b10,0x3d8e0118,2
+np.float32,0x8061f8d7,0x8061f8d7,2
+np.float32,0x3f473213,0x3f13573b,2
+np.float32,0x3f1e2a38,0x3ef65102,2
+np.float32,0x8068f7d9,0x8068f7d9,2
+np.float32,0x3f181ef8,0x3eeeca2c,2
+np.float32,0x3eeb6168,0x3ec1a9f5,2
+np.float32,0xc2db6,0xc2db6,2
+np.float32,0x3ef7b578,0x3eca0a69,2
+np.float32,0xbf5b5a84,0xbff8d075,2
+np.float32,0x7f479d5f,0x42b0f2b7,2
+np.float32,0x3e6f3c24,0x3e56ff92,2
+np.float32,0x3f45543a,0x3f1249f0,2
+np.float32,0xbea7c1fa,0xbecb40d2,2
+np.float32,0x7de082,0x7de082,2
+np.float32,0x383729,0x383729,2
+np.float32,0xbd91cb90,0xbd973eb3,2
+np.float32,0x7f320218,0x42b0b80f,2
+np.float32,0x5547f2,0x5547f2,2
+np.float32,0x291fe4,0x291fe4,2
+np.float32,0xbe078ba0,0xbe11655f,2
+np.float32,0x7e0c0658,0x42ad7764,2
+np.float32,0x7e129a2b,0x42ad8ee5,2
+np.float32,0x3f7c96d4,0x3f2fbc0c,2
+np.float32,0x3f800000,0x3f317218,2
+np.float32,0x7f131754,0x42b05662,2
+np.float32,0x15f833,0x15f833,2
+np.float32,0x80392ced,0x80392ced,2
+np.float32,0x3f7c141a,0x3f2f7a36,2
+np.float32,0xbf71c03f,0xc038dcfd,2
+np.float32,0xbe14fb2c,0xbe20fff3,2
+np.float32,0xbee0bac6,0xbf13f14c,2
+np.float32,0x801a32dd,0x801a32dd,2
+np.float32,0x8e12d,0x8e12d,2
+np.float32,0x3f48c606,0x3f143a04,2
+np.float32,0x7f418af5,0x42b0e2e6,2
+np.float32,0x3f1f2918,0x3ef78bb7,2
+np.float32,0x11141b,0x11141b,2
+np.float32,0x3e9fc9e8,0x3e8b11ad,2
+np.float32,0xbea5447a,0xbec79010,2
+np.float32,0xbe31d904,0xbe4359db,2
+np.float32,0x80184667,0x80184667,2
+np.float32,0xbf00503c,0xbf3212c2,2
+np.float32,0x3e0328cf,0x3df6d425,2
+np.float32,0x7ee8e1b7,0x42afdebe,2
+np.float32,0xbef95e24,0xbf2ae5db,2
+np.float32,0x7f3e4eed,0x42b0da45,2
+np.float32,0x3f43ee85,0x3f117fa0,2
+np.float32,0xbcfa2ac0,0xbcfe10fe,2
+np.float32,0x80162774,0x80162774,2
+np.float32,0x372e8b,0x372e8b,2
+np.float32,0x3f263802,0x3f0016b0,2
+np.float32,0x8008725f,0x8008725f,2
+np.float32,0x800beb40,0x800beb40,2
+np.float32,0xbe93308e,0xbead8a77,2
+np.float32,0x3d8a4240,0x3d85cab8,2
+np.float32,0x80179de0,0x80179de0,2
+np.float32,0x7f4a98f2,0x42b0fa4f,2
+np.float32,0x3f0d214e,0x3ee0cff1,2
+np.float32,0x80536c2c,0x80536c2c,2
+np.float32,0x7e7038ed,0x42ae8bbe,2
+np.float32,0x7f345af9,0x42b0bec4,2
+np.float32,0xbf243219,0xbf83442f,2
+np.float32,0x7e0d5555,0x42ad7c27,2
+np.float32,0x762e95,0x762e95,2
+np.float32,0x7ebf4548,0x42af79f6,2
+np.float32,0x8079639e,0x8079639e,2
+np.float32,0x3ef925c0,0x3ecb0260,2
+np.float32,0x3f708695,0x3f2996d6,2
+np.float32,0xfca9f,0xfca9f,2
+np.float32,0x8060dbf4,0x8060dbf4,2
+np.float32,0x4c8840,0x4c8840,2
+np.float32,0xbea922ee,0xbecd4ed5,2
+np.float32,0xbf4f28a9,0xbfd40b98,2
+np.float32,0xbe25ad48,0xbe34ba1b,2
+np.float32,0x3f2fb254,0x3f05c58c,2
+np.float32,0x3f73bcc2,0x3f2b3d5f,2
+np.float32,0xbf479a07,0xbfc1a165,2
+np.float32,0xbeb9a808,0xbee69763,2
+np.float32,0x7eb16a65,0x42af5376,2
+np.float32,0xbeb3e442,0xbedda042,2
+np.float32,0x3d8f439c,0x3d8a79ac,2
+np.float32,0x80347516,0x80347516,2
+np.float32,0x3e8a0c5d,0x3e74738c,2
+np.float32,0xbf0383a4,0xbf389289,2
+np.float32,0x806be8f5,0x806be8f5,2
+np.float32,0x8023f0c5,0x8023f0c5,2
+np.float32,0x2060e9,0x2060e9,2
+np.float32,0xbf759eba,0xc04d239f,2
+np.float32,0x3d84cc5a,0x3d80ab96,2
+np.float32,0xbf57746b,0xbfebdf87,2
+np.float32,0x3e418417,0x3e31401f,2
+np.float32,0xaecce,0xaecce,2
+np.float32,0x3cd1766f,0x3cced45c,2
+np.float32,0x53724a,0x53724a,2
+np.float32,0x3f773710,0x3f2d03de,2
+np.float32,0x8013d040,0x8013d040,2
+np.float32,0x4d0eb2,0x4d0eb2,2
+np.float32,0x8014364a,0x8014364a,2
+np.float32,0x7f3c56c9,0x42b0d4f2,2
+np.float32,0x3eee1e1c,0x3ec3891a,2
+np.float32,0xbdda3eb8,0xbde6c5a0,2
+np.float32,0x26ef4a,0x26ef4a,2
+np.float32,0x7ed3370c,0x42afacbf,2
+np.float32,0xbf06e31b,0xbf3f9ab7,2
+np.float32,0xbe3185f0,0xbe42f556,2
+np.float32,0x3dcf9abe,0x3dc5be41,2
+np.float32,0xbf3696d9,0xbf9fe2bd,2
+np.float32,0x3e68ee50,0x3e51e01a,2
+np.float32,0x3f3d4cc2,0x3f0db6ca,2
+np.float32,0x7fa00000,0x7fe00000,2
+np.float32,0xbf03070c,0xbf3792d0,2
+np.float32,0x3ea79e6c,0x3e910092,2
+np.float32,0xbf1a393a,0xbf6c2251,2
+np.float32,0x3f41eb0e,0x3f105afc,2
+np.float32,0x3ceadb2f,0x3ce78d79,2
+np.float32,0xbf5dc105,0xc000be2c,2
+np.float32,0x7ebb5a0e,0x42af6f5c,2
+np.float32,0xbf7c44eb,0xc0875058,2
+np.float32,0x6aaaf4,0x6aaaf4,2
+np.float32,0x807d8f23,0x807d8f23,2
+np.float32,0xbee6b142,0xbf194fef,2
+np.float32,0xbe83f256,0xbe989526,2
+np.float32,0x7d588e,0x7d588e,2
+np.float32,0x7cc80131,0x42aa0542,2
+np.float32,0x3e0ab198,0x3e02124f,2
+np.float32,0xbf6e64db,0xc02b52eb,2
+np.float32,0x3d238b56,0x3d205d1b,2
+np.float32,0xbeb408e2,0xbeddd8bc,2
+np.float32,0x3f78340d,0x3f2d8471,2
+np.float32,0x806162a3,0x806162a3,2
+np.float32,0x804e484f,0x804e484f,2
+np.float32,0xbeb8c576,0xbee53466,2
+np.float32,0x807aab15,0x807aab15,2
+np.float32,0x3f523e20,0x3f197ab8,2
+np.float32,0xbf009190,0xbf3295de,2
+np.float32,0x3df43da5,0x3de6bd82,2
+np.float32,0x7f639aea,0x42b135e6,2
+np.float32,0x3f1e638a,0x3ef697da,2
+np.float32,0xbf4884de,0xbfc3bac3,2
+np.float32,0xbe9336b6,0xbead931b,2
+np.float32,0x6daf7f,0x6daf7f,2
+np.float32,0xbf1fc152,0xbf7a70b1,2
+np.float32,0x3f103720,0x3ee4c649,2
+np.float32,0x3eeaa227,0x3ec126df,2
+np.float32,0x7f7ea945,0x42b16f69,2
+np.float32,0x3d3cd800,0x3d389ead,2
+np.float32,0x3f3d7268,0x3f0dcc6e,2
+np.float32,0xbf3c1b41,0xbfa9e2e3,2
+np.float32,0x3ecf3818,0x3eadffb2,2
+np.float32,0x3f1af312,0x3ef25372,2
+np.float32,0x48fae4,0x48fae4,2
+np.float64,0x7fedaa1ee4fb543d,0x40862da7ca7c308e,2
+np.float64,0x8007d2d810efa5b1,0x8007d2d810efa5b1,2
+np.float64,0x3fc385e069270bc0,0x3fc22b8884cf2c3b,2
+np.float64,0x68ed4130d1da9,0x68ed4130d1da9,2
+np.float64,0x8008e93e58d1d27d,0x8008e93e58d1d27d,2
+np.float64,0xbfd3d62852a7ac50,0xbfd7be3a7ad1af02,2
+np.float64,0xbfc1fa0ba923f418,0xbfc35f0f19447df7,2
+np.float64,0xbfe01b8cec20371a,0xbfe6658c7e6c8e50,2
+np.float64,0xbfeda81a147b5034,0xc004e9c94f2b91c1,2
+np.float64,0xbfe1c36a97e386d5,0xbfe9ead4d6beaa92,2
+np.float64,0x3fe50be51f2a17ca,0x3fe02c8067d9e5c5,2
+np.float64,0x3febed4d3337da9a,0x3fe413956466134f,2
+np.float64,0x80068ea59ced1d4c,0x80068ea59ced1d4c,2
+np.float64,0x3febe77d5877cefb,0x3fe4107ac088bc71,2
+np.float64,0x800ae77617d5ceed,0x800ae77617d5ceed,2
+np.float64,0x3fd0546b60a0a8d7,0x3fcd16c2e995ab23,2
+np.float64,0xbfe33e1476667c29,0xbfed6d7faec4db2f,2
+np.float64,0x3fe9d2fd51b3a5fb,0x3fe2eef834310219,2
+np.float64,0x8004249878284932,0x8004249878284932,2
+np.float64,0xbfd5b485c72b690c,0xbfda828ccc6a7a5c,2
+np.float64,0x7fcd6e6b6b3adcd6,0x408622807f04768e,2
+np.float64,0x3fd7f9c32caff386,0x3fd45d024514b8da,2
+np.float64,0x7f87eb9d702fd73a,0x40860aa99fcff27f,2
+np.float64,0xbfc5d1f6fb2ba3ec,0xbfc7ec367cb3fecc,2
+np.float64,0x8008316a44d062d5,0x8008316a44d062d5,2
+np.float64,0xbfd54e4358aa9c86,0xbfd9e889d2998a4a,2
+np.float64,0xda65facdb4cc0,0xda65facdb4cc0,2
+np.float64,0x3fc5b4f6f32b69f0,0x3fc40d13aa8e248b,2
+np.float64,0x3fd825a5d5b04b4c,0x3fd47ce73e04d3ff,2
+np.float64,0x7ac9d56ef593b,0x7ac9d56ef593b,2
+np.float64,0xbfd0a51977214a32,0xbfd34702071428be,2
+np.float64,0x3fd21f620b243ec4,0x3fcfea0c02193640,2
+np.float64,0x3fe6fb3f1b2df67e,0x3fe151ffb18c983b,2
+np.float64,0x700de022e01bd,0x700de022e01bd,2
+np.float64,0xbfbb76b81236ed70,0xbfbd0d31deea1ec7,2
+np.float64,0x3fecfc3856f9f870,0x3fe4a2fcadf221e0,2
+np.float64,0x3fede286517bc50c,0x3fe51af2fbd6ef63,2
+np.float64,0x7fdc8da96c391b52,0x408627ce09cfef2b,2
+np.float64,0x8000edfcfb81dbfb,0x8000edfcfb81dbfb,2
+np.float64,0x8009ebc42af3d789,0x8009ebc42af3d789,2
+np.float64,0x7fd658aaf8acb155,0x408625d80cd1ccc9,2
+np.float64,0x3feea584a37d4b09,0x3fe57f29a73729cd,2
+np.float64,0x4cfe494699fca,0x4cfe494699fca,2
+np.float64,0xbfe9d96460b3b2c9,0xbffa62ecfa026c77,2
+np.float64,0x7fdb3852c3b670a5,0x4086276c191dc9b1,2
+np.float64,0xbfe4d1fc9ee9a3f9,0xbff0d37ce37cf479,2
+np.float64,0xffefffffffffffff,0xfff8000000000000,2
+np.float64,0xbfd1c43d7fa3887a,0xbfd4cfbefb5f2c43,2
+np.float64,0x3fec4a8e0d78951c,0x3fe4453a82ca2570,2
+np.float64,0x7fafed74583fdae8,0x4086181017b8dac9,2
+np.float64,0x80076c4ebcced89e,0x80076c4ebcced89e,2
+np.float64,0x8001a9aa7b235356,0x8001a9aa7b235356,2
+np.float64,0x121260fe2424d,0x121260fe2424d,2
+np.float64,0x3fddd028e3bba052,0x3fd87998c4c43c5b,2
+np.float64,0x800ed1cf4a9da39f,0x800ed1cf4a9da39f,2
+np.float64,0xbfef2e63d7fe5cc8,0xc00d53480b16971b,2
+np.float64,0xbfedde3309fbbc66,0xc005ab55b7a7c127,2
+np.float64,0x3fda3e1e85b47c3d,0x3fd5fddafd8d6729,2
+np.float64,0x8007c6443c6f8c89,0x8007c6443c6f8c89,2
+np.float64,0xbfe101705f2202e0,0xbfe8420817665121,2
+np.float64,0x7fe0bff3c1e17fe7,0x4086291539c56d80,2
+np.float64,0x7fe6001dab6c003a,0x40862b43aa7cb060,2
+np.float64,0x7fbdecf7de3bd9ef,0x40861d170b1c51a5,2
+np.float64,0xbfc0fd508c21faa0,0xbfc23a5876e99fa3,2
+np.float64,0xbfcf6eb14f3edd64,0xbfd208cbf742c8ea,2
+np.float64,0x3f6d40ea403a81d5,0x3f6d33934ab8e799,2
+np.float64,0x7fc32600b6264c00,0x40861f10302357e0,2
+np.float64,0x3fd05870baa0b0e0,0x3fcd1d2af420fac7,2
+np.float64,0x80051d5120aa3aa3,0x80051d5120aa3aa3,2
+np.float64,0x3fdb783fcfb6f080,0x3fd6db229658c083,2
+np.float64,0x3fe0b61199e16c24,0x3fdae41e277be2eb,2
+np.float64,0x3daf62167b5ed,0x3daf62167b5ed,2
+np.float64,0xbfec3c53b6f878a7,0xc0011f0ce7a78a2a,2
+np.float64,0x800fc905161f920a,0x800fc905161f920a,2
+np.float64,0x3fdc7b9cc138f73a,0x3fd78f9c2360e661,2
+np.float64,0x7fe4079e97a80f3c,0x40862a83795f2443,2
+np.float64,0x8010000000000000,0x8010000000000000,2
+np.float64,0x7fe6da5345adb4a6,0x40862b9183c1e4b0,2
+np.float64,0xbfd0a76667214ecc,0xbfd34a1e0c1f6186,2
+np.float64,0x37fb0b906ff62,0x37fb0b906ff62,2
+np.float64,0x7fe170e59fa2e1ca,0x408629680a55e5c5,2
+np.float64,0x3fea900c77752019,0x3fe356eec75aa345,2
+np.float64,0x3fc575c63a2aeb8c,0x3fc3d701167d76b5,2
+np.float64,0x3fe8b45da87168bc,0x3fe24ecbb778fd44,2
+np.float64,0xbfcb990ab5373214,0xbfcf1596c076813c,2
+np.float64,0xf146fdfbe28e0,0xf146fdfbe28e0,2
+np.float64,0x8001fcd474c3f9aa,0x8001fcd474c3f9aa,2
+np.float64,0xbfe9b555eeb36aac,0xbffa0630c3bb485b,2
+np.float64,0x800f950be83f2a18,0x800f950be83f2a18,2
+np.float64,0x7feb0e03ab761c06,0x40862ceb30e36887,2
+np.float64,0x7fca51bd4a34a37a,0x4086219b9dfd35c9,2
+np.float64,0xbfdc27c34cb84f86,0xbfe28ccde8d6bc08,2
+np.float64,0x80009ce1714139c4,0x80009ce1714139c4,2
+np.float64,0x8005290fb1ea5220,0x8005290fb1ea5220,2
+np.float64,0xbfee81e6473d03cd,0xc00885972ca1699b,2
+np.float64,0x7fcfb11a373f6233,0x408623180b8f75d9,2
+np.float64,0xbfcb9c4bfd373898,0xbfcf19bd25881928,2
+np.float64,0x7feaec5885f5d8b0,0x40862ce136050e6c,2
+np.float64,0x8009e17a4a53c2f5,0x8009e17a4a53c2f5,2
+np.float64,0xbfe1cceb9e6399d7,0xbfea0038bd3def20,2
+np.float64,0x8009170bd7122e18,0x8009170bd7122e18,2
+np.float64,0xb2b6f7f1656df,0xb2b6f7f1656df,2
+np.float64,0x3fc75bfd1f2eb7f8,0x3fc574c858332265,2
+np.float64,0x3fa24c06ec249800,0x3fa1fa462ffcb8ec,2
+np.float64,0xaa9a4d2d5534a,0xaa9a4d2d5534a,2
+np.float64,0xbfd7b76208af6ec4,0xbfdda0c3200dcc9f,2
+np.float64,0x7f8cbab73039756d,0x40860c20cba57a94,2
+np.float64,0x3fdbcf9f48b79f3f,0x3fd71827a60e8b6d,2
+np.float64,0xbfdd60f71a3ac1ee,0xbfe3a94bc8cf134d,2
+np.float64,0xb9253589724a7,0xb9253589724a7,2
+np.float64,0xbfcf28e37e3e51c8,0xbfd1da9977b741e3,2
+np.float64,0x80011457f7e228b1,0x80011457f7e228b1,2
+np.float64,0x7fec33df737867be,0x40862d404a897122,2
+np.float64,0xae55f8f95cabf,0xae55f8f95cabf,2
+np.float64,0xbfc1ab9397235728,0xbfc303e5533d4a5f,2
+np.float64,0x7fef0f84b3be1f08,0x40862e05f9ba7118,2
+np.float64,0x7fdc94f328b929e5,0x408627d01449d825,2
+np.float64,0x3fee1b598c7c36b3,0x3fe53847be166834,2
+np.float64,0x3fee8326f37d064e,0x3fe56d96f3fbcf43,2
+np.float64,0x3fe7b18a83ef6316,0x3fe1bb6a6d48c675,2
+np.float64,0x3fe5db969c6bb72e,0x3fe0a8d7d151996c,2
+np.float64,0x3e3391d27c673,0x3e3391d27c673,2
+np.float64,0x3fe79a46d76f348e,0x3fe1ae09a96ea628,2
+np.float64,0x7ff4000000000000,0x7ffc000000000000,2
+np.float64,0x7fe57d6505aafac9,0x40862b13925547f1,2
+np.float64,0x3fc433371d28666e,0x3fc2c196a764c47b,2
+np.float64,0x8008dbf69cd1b7ee,0x8008dbf69cd1b7ee,2
+np.float64,0xbfe744f459ee89e8,0xbff4c847ad3ee152,2
+np.float64,0x80098aa245331545,0x80098aa245331545,2
+np.float64,0x6747112ece8e3,0x6747112ece8e3,2
+np.float64,0x5d342a40ba69,0x5d342a40ba69,2
+np.float64,0xf7a17739ef42f,0xf7a17739ef42f,2
+np.float64,0x3fe1b34a9d236695,0x3fdc2d7c4e2c347a,2
+np.float64,0x7fb53bf5ec2a77eb,0x40861a585ec8f7ff,2
+np.float64,0xbfe6256f1cec4ade,0xbff2d89a36be65ae,2
+np.float64,0xb783bc9b6f078,0xb783bc9b6f078,2
+np.float64,0xbfedf74a3bfbee94,0xc0060bb6f2bc11ef,2
+np.float64,0x3fda2a5eccb454be,0x3fd5efd7f18b8e81,2
+np.float64,0xbfb3838ab2270718,0xbfb44c337fbca3c3,2
+np.float64,0x3fb4ac6dc22958e0,0x3fb3e194ca01a502,2
+np.float64,0x76c11aaaed824,0x76c11aaaed824,2
+np.float64,0x80025bb1af04b764,0x80025bb1af04b764,2
+np.float64,0x3fdc02740ab804e8,0x3fd73b8cd6f95f19,2
+np.float64,0x3fe71856f5ee30ae,0x3fe162e9fafb4428,2
+np.float64,0x800236f332646de7,0x800236f332646de7,2
+np.float64,0x7fe13fd9d2e27fb3,0x408629516b42a317,2
+np.float64,0x7fdf6bbd34bed779,0x40862892069d805c,2
+np.float64,0x3fd4727beba8e4f8,0x3fd1be5b48d9e282,2
+np.float64,0x800e0fac9e5c1f59,0x800e0fac9e5c1f59,2
+np.float64,0xfb54423ff6a89,0xfb54423ff6a89,2
+np.float64,0x800fbf7ed47f7efe,0x800fbf7ed47f7efe,2
+np.float64,0x3fe9d41fa2f3a840,0x3fe2ef98dc1fd463,2
+np.float64,0x800d733e805ae67d,0x800d733e805ae67d,2
+np.float64,0x3feebe4c46fd7c98,0x3fe58bcf7f47264e,2
+np.float64,0x7fe1ab77b5e356ee,0x40862982bb3dce34,2
+np.float64,0xbfdddac05abbb580,0xbfe41aa45f72d5a2,2
+np.float64,0x3fe14219dee28434,0x3fdb9b137d1f1220,2
+np.float64,0x3fe25d3d5a24ba7b,0x3fdd06e1cf32d35a,2
+np.float64,0x8000fa4fbe81f4a0,0x8000fa4fbe81f4a0,2
+np.float64,0x3fe303e23e6607c4,0x3fddd94982efa9f1,2
+np.float64,0x3fe89cf5d83139ec,0x3fe24193a2e12f75,2
+np.float64,0x3fe9b36ef87366de,0x3fe2dd7cdc25a4a5,2
+np.float64,0xbfdb8b38f8371672,0xbfe2023ba7e002bb,2
+np.float64,0xafc354955f86b,0xafc354955f86b,2
+np.float64,0xbfe2f3d49e65e7a9,0xbfecb557a94123d3,2
+np.float64,0x800496617c092cc4,0x800496617c092cc4,2
+np.float64,0x32db0cfa65b62,0x32db0cfa65b62,2
+np.float64,0xbfd893bfa2b12780,0xbfdf02a8c1e545aa,2
+np.float64,0x7fd5ac927d2b5924,0x408625997e7c1f9b,2
+np.float64,0x3fde9defb8bd3be0,0x3fd9056190986349,2
+np.float64,0x80030cfeb54619fe,0x80030cfeb54619fe,2
+np.float64,0x3fcba85b273750b8,0x3fc90a5ca976594f,2
+np.float64,0x3fe98f6f5cf31edf,0x3fe2c97fcb4eca25,2
+np.float64,0x3fe33dbf90667b80,0x3fde21b83321b993,2
+np.float64,0x3fe4686636e8d0cc,0x3fdf928cdca751b3,2
+np.float64,0x80018ade6ce315be,0x80018ade6ce315be,2
+np.float64,0x7fa9af70c8335ee1,0x408616528cd5a906,2
+np.float64,0x3fbeb460aa3d68c0,0x3fbcff96b00a2193,2
+np.float64,0x7fa82c869830590c,0x408615d6598d9368,2
+np.float64,0xd08c0e6fa1182,0xd08c0e6fa1182,2
+np.float64,0x3fef4eb750fe9d6f,0x3fe5d522fd4e7f64,2
+np.float64,0xbfc586f5492b0dec,0xbfc791eaae92aad1,2
+np.float64,0x7fede64ac7bbcc95,0x40862db7f444fa7b,2
+np.float64,0x3fe540003d6a8000,0x3fe04bdfc2916a0b,2
+np.float64,0x8009417fe6f28300,0x8009417fe6f28300,2
+np.float64,0x3fe6959cf16d2b3a,0x3fe116a1ce01887b,2
+np.float64,0x3fb0a40036214800,0x3fb01f447778219a,2
+np.float64,0x3feff26e91ffe4dd,0x3fe627798fc859a7,2
+np.float64,0x7fed8e46cd7b1c8d,0x40862da044a1d102,2
+np.float64,0x7fec4eb774f89d6e,0x40862d47e43edb53,2
+np.float64,0x3fe800e5e07001cc,0x3fe1e8e2b9105fc2,2
+np.float64,0x800f4eb2f9be9d66,0x800f4eb2f9be9d66,2
+np.float64,0x800611659bcc22cc,0x800611659bcc22cc,2
+np.float64,0x3fd66e65d2acdccc,0x3fd33ad63a5e1000,2
+np.float64,0x800a9085b7f5210c,0x800a9085b7f5210c,2
+np.float64,0x7fdf933a3fbf2673,0x4086289c0e292f2b,2
+np.float64,0x1cd1ba7a39a38,0x1cd1ba7a39a38,2
+np.float64,0xbfefd0b10fffa162,0xc0149ded900ed851,2
+np.float64,0xbfe8c63485b18c69,0xbff7cf3078b1574f,2
+np.float64,0x3fecde56ca79bcae,0x3fe4934afbd7dda9,2
+np.float64,0x8006cd6888cd9ad2,0x8006cd6888cd9ad2,2
+np.float64,0x3fd7a391c2af4724,0x3fd41e2f74df2329,2
+np.float64,0x3fe6a8ad58ed515a,0x3fe121ccfb28e6f5,2
+np.float64,0x7fe18a80dd631501,0x40862973c09086b9,2
+np.float64,0xbf74fd6d8029fb00,0xbf750b3e368ebe6b,2
+np.float64,0x3fdd35e93dba6bd4,0x3fd810071faaffad,2
+np.float64,0x3feb0d8f57361b1f,0x3fe39b3abdef8b7a,2
+np.float64,0xbfd5ec7288abd8e6,0xbfdad764df0d2ca1,2
+np.float64,0x7fdc848272b90904,0x408627cb78f3fb9e,2
+np.float64,0x800ed3eda91da7db,0x800ed3eda91da7db,2
+np.float64,0x3fefac64857f58c9,0x3fe60459dbaad1ba,2
+np.float64,0x3fd1df7a5ba3bef4,0x3fcf864a39b926ff,2
+np.float64,0xfe26ca4bfc4da,0xfe26ca4bfc4da,2
+np.float64,0xbfd1099f8da21340,0xbfd3cf6e6efe934b,2
+np.float64,0xbfe15de9a7a2bbd4,0xbfe909cc895f8795,2
+np.float64,0x3fe89714ed712e2a,0x3fe23e40d31242a4,2
+np.float64,0x800387113e470e23,0x800387113e470e23,2
+np.float64,0x3fe4f80730e9f00e,0x3fe0208219314cf1,2
+np.float64,0x2f95a97c5f2b6,0x2f95a97c5f2b6,2
+np.float64,0x800ea7cdd87d4f9c,0x800ea7cdd87d4f9c,2
+np.float64,0xbf64b967c0297300,0xbf64c020a145b7a5,2
+np.float64,0xbfc5a91a342b5234,0xbfc7bafd77a61d81,2
+np.float64,0xbfe2226fe76444e0,0xbfeac33eb1d1b398,2
+np.float64,0x3fc6aaa8d42d5552,0x3fc4de79f5c68cd4,2
+np.float64,0x3fe54fd4c1ea9faa,0x3fe05561a9a5922b,2
+np.float64,0x80029c1f75653840,0x80029c1f75653840,2
+np.float64,0xbfcb4a84a2369508,0xbfceb1a23bac3995,2
+np.float64,0x80010abeff02157f,0x80010abeff02157f,2
+np.float64,0x7f92d12cf825a259,0x40860e49bde3a5b6,2
+np.float64,0x800933e7027267ce,0x800933e7027267ce,2
+np.float64,0x3fc022b12e204562,0x3fbe64acc53ed887,2
+np.float64,0xbfe35f938de6bf27,0xbfedc1f3e443c016,2
+np.float64,0x1f8d9bae3f1b4,0x1f8d9bae3f1b4,2
+np.float64,0x3fe552f22ceaa5e4,0x3fe057404072350f,2
+np.float64,0xbfa73753442e6ea0,0xbfa7c24a100190f1,2
+np.float64,0x7fb3e2982827c52f,0x408619d1efa676b6,2
+np.float64,0xbfd80cb7a5301970,0xbfde28e65f344f33,2
+np.float64,0xbfcde835973bd06c,0xbfd10806fba46c8f,2
+np.float64,0xbfd4e3c749a9c78e,0xbfd949aff65de39c,2
+np.float64,0x3fcb4b9d6f36973b,0x3fc8be02ad6dc0d3,2
+np.float64,0x1a63000034c7,0x1a63000034c7,2
+np.float64,0x7fdc9c751e3938e9,0x408627d22df71959,2
+np.float64,0x3fd74f3f712e9e7f,0x3fd3e07df0c37ec1,2
+np.float64,0xbfceab74d33d56e8,0xbfd187e99bf82903,2
+np.float64,0x7ff0000000000000,0x7ff0000000000000,2
+np.float64,0xbfb2cca466259948,0xbfb3868208e8de30,2
+np.float64,0x800204688b8408d2,0x800204688b8408d2,2
+np.float64,0x3e4547407c8aa,0x3e4547407c8aa,2
+np.float64,0xbfe4668846e8cd10,0xbff03c85189f3818,2
+np.float64,0x800dd350245ba6a0,0x800dd350245ba6a0,2
+np.float64,0xbfbc13c160382780,0xbfbdbd56ce996d16,2
+np.float64,0x7fe25a628a24b4c4,0x408629d06eb2d64d,2
+np.float64,0x3fd19dabbc233b57,0x3fcf1f3ed1d34c8c,2
+np.float64,0x547e20faa8fc5,0x547e20faa8fc5,2
+np.float64,0xbfe19392c6232726,0xbfe97ffe4f303335,2
+np.float64,0x3f87f9f6702ff400,0x3f87d64fb471bb04,2
+np.float64,0x9dfc52db3bf8b,0x9dfc52db3bf8b,2
+np.float64,0x800e1f5a9adc3eb5,0x800e1f5a9adc3eb5,2
+np.float64,0xbfddbd09c8bb7a14,0xbfe3fed7d7cffc70,2
+np.float64,0xbfeda71af87b4e36,0xc004e6631c514544,2
+np.float64,0xbfdbfcfe1bb7f9fc,0xbfe266b5d4a56265,2
+np.float64,0x3fe4ee78cd69dcf2,0x3fe01abba4e81fc9,2
+np.float64,0x800f13b820de2770,0x800f13b820de2770,2
+np.float64,0x3f861e09702c3c00,0x3f85ffae83b02c4f,2
+np.float64,0xbfc0972479212e48,0xbfc1c4bf70b30cbc,2
+np.float64,0x7fef057ef57e0afd,0x40862e036479f6a9,2
+np.float64,0x8bdbabe517b76,0x8bdbabe517b76,2
+np.float64,0xbfec495417f892a8,0xc0013ade88746d18,2
+np.float64,0x3fec680ab3f8d015,0x3fe454dd304b560d,2
+np.float64,0xbfae7ce60c3cf9d0,0xbfaf6eef15bbe56b,2
+np.float64,0x3fec314124786282,0x3fe437ca06294f5a,2
+np.float64,0x7fd5ed05b82bda0a,0x408625b125518e58,2
+np.float64,0x3feac9f02f3593e0,0x3fe3768104dd5cb7,2
+np.float64,0x0,0x0,2
+np.float64,0xbfddd2abd5bba558,0xbfe41312b8ea20de,2
+np.float64,0xbfedf9558c7bf2ab,0xc00613c53e0bb33a,2
+np.float64,0x3fef245ffefe48c0,0x3fe5bfb4dfe3b7a5,2
+np.float64,0x7fe178604922f0c0,0x4086296b77d5eaef,2
+np.float64,0x10000000000000,0x10000000000000,2
+np.float64,0x7fed026766ba04ce,0x40862d7a0dc45643,2
+np.float64,0xbfde27d8c3bc4fb2,0xbfe46336b6447697,2
+np.float64,0x3fe9485d9cb290bb,0x3fe2a1e4b6419423,2
+np.float64,0xbfe27b8a7464f715,0xbfeb9382f5b16f65,2
+np.float64,0x5c34d274b869b,0x5c34d274b869b,2
+np.float64,0xbfeee0b7453dc16f,0xc00acdb46459b6e6,2
+np.float64,0x7fe3dfb4d4e7bf69,0x40862a73785fdf12,2
+np.float64,0xb4635eef68c6c,0xb4635eef68c6c,2
+np.float64,0xbfe522a2c82a4546,0xbff148912a59a1d6,2
+np.float64,0x8009ba38a9737472,0x8009ba38a9737472,2
+np.float64,0xbfc056ff3820ae00,0xbfc17b2205fa180d,2
+np.float64,0x7fe1c8b8a0239170,0x4086298feeee6133,2
+np.float64,0x3fe2d2c6b9e5a58e,0x3fdd9b907471031b,2
+np.float64,0x3fa0a161bc2142c0,0x3fa05db36f6a073b,2
+np.float64,0x3fdef4268ebde84c,0x3fd93f980794d1e7,2
+np.float64,0x800ecd9fe2fd9b40,0x800ecd9fe2fd9b40,2
+np.float64,0xbfc9fbd45e33f7a8,0xbfcd0afc47c340f6,2
+np.float64,0x3fe8c3035b718606,0x3fe2570eb65551a1,2
+np.float64,0xbfe78c4ad2ef1896,0xbff54d25b3328742,2
+np.float64,0x8006f5dcf8adebbb,0x8006f5dcf8adebbb,2
+np.float64,0x800301dca2a603ba,0x800301dca2a603ba,2
+np.float64,0xad4289e55a851,0xad4289e55a851,2
+np.float64,0x80037764f9e6eecb,0x80037764f9e6eecb,2
+np.float64,0xbfe73575b26e6aec,0xbff4abfb5e985c62,2
+np.float64,0xbfc6cb91652d9724,0xbfc91a8001b33ec2,2
+np.float64,0xbfe3a918ffe75232,0xbfee7e6e4fd34c53,2
+np.float64,0x9bc84e2b3790a,0x9bc84e2b3790a,2
+np.float64,0x7fdeec303cbdd85f,0x408628714a49d996,2
+np.float64,0x3fe1d1dcb763a3ba,0x3fdc54ce060dc7f4,2
+np.float64,0x8008ae6432b15cc9,0x8008ae6432b15cc9,2
+np.float64,0x3fd8022fa2b00460,0x3fd46322bf02a609,2
+np.float64,0xbfc55b64472ab6c8,0xbfc75d9568f462e0,2
+np.float64,0xbfe8b165437162ca,0xbff7a15e2ead645f,2
+np.float64,0x7f759330feeb3,0x7f759330feeb3,2
+np.float64,0xbfd504f68eaa09ee,0xbfd97b06c01d7473,2
+np.float64,0x54702d5aa8e06,0x54702d5aa8e06,2
+np.float64,0xbfed1779337a2ef2,0xc0032f7109ef5a51,2
+np.float64,0xe248bd4dc4918,0xe248bd4dc4918,2
+np.float64,0xbfd8c59150318b22,0xbfdf53bca6ca8b1e,2
+np.float64,0xbfe3b9d942e773b2,0xbfeea9fcad277ba7,2
+np.float64,0x800934ec127269d9,0x800934ec127269d9,2
+np.float64,0xbfbb7f535a36fea8,0xbfbd16d61b6c52b8,2
+np.float64,0xccb185a199631,0xccb185a199631,2
+np.float64,0x3fe3dda76fe7bb4e,0x3fdee83bc6094301,2
+np.float64,0xbfe0c902f5e19206,0xbfe7ca7c0e888006,2
+np.float64,0xbfefeed08cbfdda1,0xc018aadc483c8724,2
+np.float64,0x7fd0c05c52a180b8,0x40862389daf64aac,2
+np.float64,0xbfd28e3323a51c66,0xbfd5e9ba278fb685,2
+np.float64,0xbef4103b7de82,0xbef4103b7de82,2
+np.float64,0x3fe7661fd12ecc40,0x3fe18ff7dfb696e2,2
+np.float64,0x3fddd5f2f0bbabe4,0x3fd87d8bb6719c3b,2
+np.float64,0x800b3914cfd6722a,0x800b3914cfd6722a,2
+np.float64,0xf3f09a97e7e14,0xf3f09a97e7e14,2
+np.float64,0x7f97092b502e1256,0x40860fe8054cf54e,2
+np.float64,0xbfdbec7917b7d8f2,0xbfe2580b4b792c79,2
+np.float64,0x7fe7ff215aaffe42,0x40862bf5887fa062,2
+np.float64,0x80080186e570030e,0x80080186e570030e,2
+np.float64,0xbfc27f05e624fe0c,0xbfc3fa214be4adc4,2
+np.float64,0x3fe4481be1689038,0x3fdf6b11e9c4ca72,2
+np.float64,0x3fd642cc9cac8598,0x3fd31a857fe70227,2
+np.float64,0xbef8782d7df0f,0xbef8782d7df0f,2
+np.float64,0x8003077dc2e60efc,0x8003077dc2e60efc,2
+np.float64,0x80083eb5a2507d6c,0x80083eb5a2507d6c,2
+np.float64,0x800e8d1eb77d1a3e,0x800e8d1eb77d1a3e,2
+np.float64,0xbfc7737cd22ee6f8,0xbfc9e7716f03f1fc,2
+np.float64,0xbfe9a2b4ddf3456a,0xbff9d71664a8fc78,2
+np.float64,0x7fe67c7d322cf8f9,0x40862b7066465194,2
+np.float64,0x3fec080ce2b8101a,0x3fe421dac225be46,2
+np.float64,0xbfe6d27beb6da4f8,0xbff3fbb1add521f7,2
+np.float64,0x3fdd4f96ceba9f2e,0x3fd821a638986dbe,2
+np.float64,0x3fbd89f1303b13e2,0x3fbbf49223a9d002,2
+np.float64,0xbfe94e2b9d329c57,0xbff907e549c534f5,2
+np.float64,0x3fe2f2cc51e5e599,0x3fddc3d6b4a834a1,2
+np.float64,0xfdcb5b49fb96c,0xfdcb5b49fb96c,2
+np.float64,0xbfea7108fa74e212,0xbffc01b392f4897b,2
+np.float64,0x3fd38baef7a7175c,0x3fd10e7fd3b958dd,2
+np.float64,0x3fa75bf9cc2eb800,0x3fa6d792ecdedb8e,2
+np.float64,0x7fd19fd20aa33fa3,0x408623f1e2cd04c3,2
+np.float64,0x3fd62c708dac58e0,0x3fd309ec7818d16e,2
+np.float64,0x3fdf489047be9120,0x3fd978640617c758,2
+np.float64,0x1,0x1,2
+np.float64,0xbfe21e7c3ea43cf8,0xbfeaba21320697d3,2
+np.float64,0xbfd3649047a6c920,0xbfd71a6f14223744,2
+np.float64,0xbfd68ca68c2d194e,0xbfdbcce6784e5d44,2
+np.float64,0x3fdb26b0ea364d62,0x3fd6a1f86f64ff74,2
+np.float64,0xbfd843821cb08704,0xbfde80e90805ab3f,2
+np.float64,0x3fd508a27aaa1144,0x3fd22fc203a7b9d8,2
+np.float64,0xbfdb951c7eb72a38,0xbfe20aeaec13699b,2
+np.float64,0x3fef556ba57eaad7,0x3fe5d8865cce0a6d,2
+np.float64,0x3fd0d224b3a1a448,0x3fcdde7be5d7e21e,2
+np.float64,0x8007ff272baffe4f,0x8007ff272baffe4f,2
+np.float64,0x3fe1c7bddf638f7c,0x3fdc47cc6cf2f5cd,2
+np.float64,0x7ff8000000000000,0x7ff8000000000000,2
+np.float64,0x2016d560402f,0x2016d560402f,2
+np.float64,0xbfcca10be9394218,0xbfd033f36b94fc54,2
+np.float64,0xbfdb833628b7066c,0xbfe1fb344b840c70,2
+np.float64,0x3fd8529cb3b0a539,0x3fd49d847fe77218,2
+np.float64,0xbfc0b0ebab2161d8,0xbfc1e260c60ffd1b,2
+np.float64,0xbfea8b9a79f51735,0xbffc4ee6be8a0fa2,2
+np.float64,0x7feca8fab7f951f4,0x40862d613e454646,2
+np.float64,0x7fd8c52d82318a5a,0x408626aaf37423a3,2
+np.float64,0xbfe364ad4526c95a,0xbfedcee39bc93ff5,2
+np.float64,0x800b78161256f02d,0x800b78161256f02d,2
+np.float64,0xbfd55f0153aabe02,0xbfda01a78f72d494,2
+np.float64,0x800315a5f0662b4d,0x800315a5f0662b4d,2
+np.float64,0x7fe4c0dca02981b8,0x40862acc27e4819f,2
+np.float64,0x8009825c703304b9,0x8009825c703304b9,2
+np.float64,0x3fe6e94e1cadd29c,0x3fe1478ccc634f49,2
+np.float64,0x7fe622d8586c45b0,0x40862b504177827e,2
+np.float64,0x3fe4458600688b0c,0x3fdf67e79a84b953,2
+np.float64,0xbfdd75d8a1baebb2,0xbfe3bc9e6ca1bbb5,2
+np.float64,0x3fde789c6bbcf138,0x3fd8ec1d435531b3,2
+np.float64,0x3fe7052b94ee0a58,0x3fe157c5c4418dc1,2
+np.float64,0x7fef31652abe62c9,0x40862e0eaeabcfc0,2
+np.float64,0x3fe279691ee4f2d2,0x3fdd2aa41eb43cd4,2
+np.float64,0xbfd533fa95aa67f6,0xbfd9c12f516d29d7,2
+np.float64,0x3fe6d057f96da0b0,0x3fe138fd96693a6a,2
+np.float64,0x800bad984f775b31,0x800bad984f775b31,2
+np.float64,0x7fdd6fdba4badfb6,0x4086280c73d8ef97,2
+np.float64,0x7fe9b5c0eef36b81,0x40862c82c6f57a53,2
+np.float64,0x8000bc02ece17807,0x8000bc02ece17807,2
+np.float64,0xbff0000000000000,0xfff0000000000000,2
+np.float64,0xbfed430be3fa8618,0xc003aaf338c75b3c,2
+np.float64,0x3fee17b759fc2f6f,0x3fe53668696bf48b,2
+np.float64,0x3f8d4cf9d03a9a00,0x3f8d17d2f532afdc,2
+np.float64,0x8005d6257b8bac4c,0x8005d6257b8bac4c,2
+np.float64,0xbfd17a6df9a2f4dc,0xbfd469e3848adc6e,2
+np.float64,0xb28a293965145,0xb28a293965145,2
+np.float64,0xbfe7d011e42fa024,0xbff5cf818998c8ec,2
+np.float64,0xbfe74f0f136e9e1e,0xbff4dad6ebb0443c,2
+np.float64,0x800f249fc9be4940,0x800f249fc9be4940,2
+np.float64,0x2542f8fe4a860,0x2542f8fe4a860,2
+np.float64,0xc48d40cd891a8,0xc48d40cd891a8,2
+np.float64,0x3fe4e64bc8e9cc98,0x3fe015c9eb3caa53,2
+np.float64,0x3fd33881eca67104,0x3fd0cea886be2457,2
+np.float64,0xbfd01748fba02e92,0xbfd28875959e6901,2
+np.float64,0x7fb7ab01f22f5603,0x40861b369927bf53,2
+np.float64,0xbfe340274ce6804e,0xbfed72b39f0ebb24,2
+np.float64,0x7fc16c0c3422d817,0x40861e4eaf1a286c,2
+np.float64,0x3fc26944a324d288,0x3fc133a77b356ac4,2
+np.float64,0xa149d7134293b,0xa149d7134293b,2
+np.float64,0x800837382d106e71,0x800837382d106e71,2
+np.float64,0x797d1740f2fa4,0x797d1740f2fa4,2
+np.float64,0xc3f15b7787e2c,0xc3f15b7787e2c,2
+np.float64,0x80cad1b90195a,0x80cad1b90195a,2
+np.float64,0x3fdd8f1142bb1e23,0x3fd84d21490d1ce6,2
+np.float64,0xbfbde6c9123bcd90,0xbfbfcc030a86836a,2
+np.float64,0x8007f77e032feefd,0x8007f77e032feefd,2
+np.float64,0x3fe74fed1c6e9fda,0x3fe18322cf19cb61,2
+np.float64,0xbfd8a40bbcb14818,0xbfdf1d23520ba74b,2
+np.float64,0xbfeb7a0e6076f41d,0xbfff4ddfb926efa5,2
+np.float64,0xbfcb8c5f663718c0,0xbfcf0570f702bda9,2
+np.float64,0xf668cd97ecd1a,0xf668cd97ecd1a,2
+np.float64,0xbfe92accf572559a,0xbff8b4393878ffdb,2
+np.float64,0xbfeaa955567552ab,0xbffca70c7d73eee5,2
+np.float64,0xbfe083a14f610742,0xbfe739d84bc35077,2
+np.float64,0x78290568f0521,0x78290568f0521,2
+np.float64,0x3fe94bae2372975c,0x3fe2a3beac5c9858,2
+np.float64,0x3fca4fbab9349f78,0x3fc7edbca2492acb,2
+np.float64,0x8000000000000000,0x8000000000000000,2
+np.float64,0x7fb9eb505433d6a0,0x40861bf0adedb74d,2
+np.float64,0x7fdc66f72a38cded,0x408627c32aeecf0f,2
+np.float64,0x2e8e6f445d1cf,0x2e8e6f445d1cf,2
+np.float64,0xbfec43195af88633,0xc0012d7e3f91b7e8,2
+np.float64,0x7fcdb971e93b72e3,0x40862294c9e3a7bc,2
+np.float64,0x800cabc461195789,0x800cabc461195789,2
+np.float64,0x2c79709c58f2f,0x2c79709c58f2f,2
+np.float64,0x8005d772d3cbaee6,0x8005d772d3cbaee6,2
+np.float64,0x3fe84d8c03709b18,0x3fe21490ce3673dd,2
+np.float64,0x7fe5578adc2aaf15,0x40862b056e8437d4,2
+np.float64,0xbf91298c58225320,0xbf914ec86c32d11f,2
+np.float64,0xc7ed2b6d8fda6,0xc7ed2b6d8fda6,2
+np.float64,0x2761404c4ec29,0x2761404c4ec29,2
+np.float64,0x3fbad3c48835a789,0x3fb9833c02385305,2
+np.float64,0x3fa46fee5428dfe0,0x3fa40a357fb24c23,2
+np.float64,0xbfe3900c6fe72019,0xbfee3dba29dd9d43,2
+np.float64,0x3fe7a9e41a6f53c8,0x3fe1b704dfb9884b,2
+np.float64,0xbfe74a7a1eee94f4,0xbff4d269cacb1f29,2
+np.float64,0xbfee609c72fcc139,0xc007da8499d34123,2
+np.float64,0x3fef2d5fc23e5ac0,0x3fe5c44414e59cb4,2
+np.float64,0xbfd7bdc0402f7b80,0xbfddaae1e7bb78fb,2
+np.float64,0xd71ee01dae3dc,0xd71ee01dae3dc,2
+np.float64,0x3fe98cbcdef3197a,0x3fe2c7ffe33c4541,2
+np.float64,0x8000f8dbb3a1f1b8,0x8000f8dbb3a1f1b8,2
+np.float64,0x3fe3e98ad567d316,0x3fdef6e58058313f,2
+np.float64,0x41ad0bfc835a2,0x41ad0bfc835a2,2
+np.float64,0x7fdcc2dc0d3985b7,0x408627dce39f77af,2
+np.float64,0xbfe47b980de8f730,0xbff059acdccd6e2b,2
+np.float64,0xbfef49b6577e936d,0xc00e714f46b2ccc1,2
+np.float64,0x3fac31816c386300,0x3fab71cb92b0db8f,2
+np.float64,0x3fe59097e76b2130,0x3fe07c299fd1127c,2
+np.float64,0xbfecf0df5cf9e1bf,0xc002c7ebdd65039c,2
+np.float64,0x3fd2b7d0b6a56fa1,0x3fd06b638990ae02,2
+np.float64,0xbfeb68deecf6d1be,0xbfff1187e042d3e4,2
+np.float64,0x3fd44a9771a8952f,0x3fd1a01867c5e302,2
+np.float64,0xf79a9dedef354,0xf79a9dedef354,2
+np.float64,0x800c25a170d84b43,0x800c25a170d84b43,2
+np.float64,0x3ff0000000000000,0x3fe62e42fefa39ef,2
+np.float64,0x3fbff4f7623fe9f0,0x3fbe1d3878f4c417,2
+np.float64,0xd284c845a5099,0xd284c845a5099,2
+np.float64,0xbfe3c7815f678f02,0xbfeecdab5ca2e651,2
+np.float64,0x3fc19c934e233927,0x3fc08036104b1f23,2
+np.float64,0x800b6096de16c12e,0x800b6096de16c12e,2
+np.float64,0xbfe962a67e32c54d,0xbff9392313a112a1,2
+np.float64,0x2b9d0116573a1,0x2b9d0116573a1,2
+np.float64,0x3fcab269ed3564d4,0x3fc83f7e1c3095b7,2
+np.float64,0x3fc8c78d86318f1b,0x3fc6a6cde5696f99,2
+np.float64,0xd5b1e9b5ab63d,0xd5b1e9b5ab63d,2
+np.float64,0xbfed802a47fb0054,0xc00465cad3b5b0ef,2
+np.float64,0xbfd73aaf08ae755e,0xbfdcdbd62b8af271,2
+np.float64,0xbfd4f13c0229e278,0xbfd95dacff79e570,2
+np.float64,0xbfe9622808f2c450,0xbff937f13c397e8d,2
+np.float64,0xbfeddfa62efbbf4c,0xc005b0c835eed829,2
+np.float64,0x3fd65663d4acacc8,0x3fd3290cd0e675dc,2
+np.float64,0x8005e890f1abd123,0x8005e890f1abd123,2
+np.float64,0xbfe924919fb24923,0xbff8a5a827a28756,2
+np.float64,0x3fe8cdf490719be9,0x3fe25d39535e8366,2
+np.float64,0x7fc229e6ff2453cd,0x40861ea40ef87a5a,2
+np.float64,0x3fe5cf53ceeb9ea8,0x3fe0a18e0b65f27e,2
+np.float64,0xa79cf6fb4f39f,0xa79cf6fb4f39f,2
+np.float64,0x7fddbb3c0f3b7677,0x40862820d5edf310,2
+np.float64,0x3e1011de7c203,0x3e1011de7c203,2
+np.float64,0x3fc0b59a83216b38,0x3fbf6916510ff411,2
+np.float64,0x8647f98d0c8ff,0x8647f98d0c8ff,2
+np.float64,0x8005dad33ecbb5a7,0x8005dad33ecbb5a7,2
+np.float64,0x8a80d0631501a,0x8a80d0631501a,2
+np.float64,0xbfe18f7d6ee31efb,0xbfe976f06713afc1,2
+np.float64,0xbfe06eaed560dd5e,0xbfe70eac696933e6,2
+np.float64,0xbfed8ef93c7b1df2,0xc00495bfa3195b53,2
+np.float64,0x3febe9c24677d385,0x3fe411b10db16c42,2
+np.float64,0x7fd5d80c1fabb017,0x408625a97a7787ba,2
+np.float64,0x3fca79b59334f368,0x3fc8108a521341dc,2
+np.float64,0xbfccf8db4339f1b8,0xbfd06c9a5424aadb,2
+np.float64,0xbfea5ac5a574b58b,0xbffbc21d1405d840,2
+np.float64,0x800ce2bf4b19c57f,0x800ce2bf4b19c57f,2
+np.float64,0xbfe8df896d31bf13,0xbff807ab38ac41ab,2
+np.float64,0x3feab83da9f5707c,0x3fe36cdd827c0eff,2
+np.float64,0x3fee717683bce2ed,0x3fe564879171719b,2
+np.float64,0x80025e5577c4bcac,0x80025e5577c4bcac,2
+np.float64,0x3fe3e5378e67ca70,0x3fdef1902c5d1efd,2
+np.float64,0x3fa014bb7c202980,0x3f9faacf9238d499,2
+np.float64,0x3fddbf5e16bb7ebc,0x3fd86e2311cb0f6d,2
+np.float64,0x3fd24e50e6a49ca0,0x3fd0198f04f82186,2
+np.float64,0x656b5214cad6b,0x656b5214cad6b,2
+np.float64,0x8b0a4bfd1614a,0x8b0a4bfd1614a,2
+np.float64,0xbfeeb6bd9e7d6d7b,0xc009b669285e319e,2
+np.float64,0x8000000000000001,0x8000000000000001,2
+np.float64,0xbfe719feceee33fe,0xbff47a4c8cbf0cca,2
+np.float64,0xbfd14fa8c8a29f52,0xbfd42f27b1aced39,2
+np.float64,0x7fec9dcb80f93b96,0x40862d5e1e70bbb9,2
+np.float64,0x7fecacb826f9596f,0x40862d6249746915,2
+np.float64,0x973459f52e68b,0x973459f52e68b,2
+np.float64,0x7f40a59e00214b3b,0x4085f194f45f82b1,2
+np.float64,0x7fc5dbaec32bb75d,0x4086201f3e7065d9,2
+np.float64,0x82d0801305a10,0x82d0801305a10,2
+np.float64,0x7fec81c0f4790381,0x40862d5643c0fc85,2
+np.float64,0xbfe2d81e9ee5b03d,0xbfec71a8e864ea40,2
+np.float64,0x6c545c9ad8a8c,0x6c545c9ad8a8c,2
+np.float64,0x3f9be95a5037d2b5,0x3f9b89b48ac8f5d8,2
+np.float64,0x8000cae9702195d4,0x8000cae9702195d4,2
+np.float64,0xbfd375f45126ebe8,0xbfd733677e54a80d,2
+np.float64,0x3fd29a5b81a534b7,0x3fd05494bf200278,2
+np.float64,0xfff0000000000000,0xfff8000000000000,2
+np.float64,0x7fca8fc195351f82,0x408621ae61aa6c13,2
+np.float64,0x1b28e2ae3651d,0x1b28e2ae3651d,2
+np.float64,0x3fe7fdbd14effb7a,0x3fe1e714884b46a8,2
+np.float64,0x3fdf1ce068be39c0,0x3fd95b054e0fad3d,2
+np.float64,0x3fe79f9a636f3f34,0x3fe1b11a40c00b3e,2
+np.float64,0x3fe60eb7036c1d6e,0x3fe0c72a02176874,2
+np.float64,0x229da17e453b5,0x229da17e453b5,2
+np.float64,0x3fc1a921b5235240,0x3fc08b3f35e47fb1,2
+np.float64,0xbb92d2af7725b,0xbb92d2af7725b,2
+np.float64,0x3fe4110cb1e8221a,0x3fdf2787de6c73f7,2
+np.float64,0xbfbc87771a390ef0,0xbfbe3f6e95622363,2
+np.float64,0xbfe74025dfee804c,0xbff4bf7b1895e697,2
+np.float64,0x964eb6592c9d7,0x964eb6592c9d7,2
+np.float64,0x3f951689b82a2d00,0x3f94dfb38d746fdf,2
+np.float64,0x800356271be6ac4f,0x800356271be6ac4f,2
+np.float64,0x7fefffffffffffff,0x40862e42fefa39ef,2
+np.float64,0xbfed5ce250fab9c5,0xc003f7ddfeb94345,2
+np.float64,0x3fec3d5dc1387abc,0x3fe43e39c02d86f4,2
+np.float64,0x3999897e73332,0x3999897e73332,2
+np.float64,0xbfdcb57744b96aee,0xbfe30c4b98f3d088,2
+np.float64,0x7f961fb0b82c3f60,0x40860f9549c3a380,2
+np.float64,0x67d6efcacfadf,0x67d6efcacfadf,2
+np.float64,0x8002c9498f859294,0x8002c9498f859294,2
+np.float64,0xbfa3033800260670,0xbfa35fe3bf43e188,2
+np.float64,0xbfeab2fc157565f8,0xbffcc413c486b4eb,2
+np.float64,0x3fe25e62f364bcc6,0x3fdd0856e19e3430,2
+np.float64,0x7fb2f42dda25e85b,0x4086196fb34a65fd,2
+np.float64,0x3fe0f1a5af61e34c,0x3fdb3235a1786efb,2
+np.float64,0x800a340ca1f4681a,0x800a340ca1f4681a,2
+np.float64,0x7c20b9def8418,0x7c20b9def8418,2
+np.float64,0xdf0842a1be109,0xdf0842a1be109,2
+np.float64,0x3fe9f22cc2f3e45a,0x3fe300359b842bf0,2
+np.float64,0x3fe389ed73e713da,0x3fde809780fe4432,2
+np.float64,0x9500fb932a020,0x9500fb932a020,2
+np.float64,0x3fd8a21ffdb14440,0x3fd4d70862345d86,2
+np.float64,0x800d99c15cbb3383,0x800d99c15cbb3383,2
+np.float64,0x3fd96c98c932d932,0x3fd568959c9b028f,2
+np.float64,0x7fc228483a24508f,0x40861ea358420976,2
+np.float64,0x7fc6737bef2ce6f7,0x408620560ffc6a98,2
+np.float64,0xbfb2c27cee2584f8,0xbfb37b8cc7774b5f,2
+np.float64,0xbfd18409f9230814,0xbfd4771d1a9a24fb,2
+np.float64,0x3fb53cb3f42a7968,0x3fb466f06f88044b,2
+np.float64,0x3fef61d0187ec3a0,0x3fe5dec8a9d13dd9,2
+np.float64,0x3fe59a6ffd2b34e0,0x3fe0820a99c6143d,2
+np.float64,0x3fce18aff43c3160,0x3fcb07c7b523f0d1,2
+np.float64,0xbfb1319a62226338,0xbfb1cc62f31b2b40,2
+np.float64,0xa00cce6d4019a,0xa00cce6d4019a,2
+np.float64,0x80068ae8e0ed15d3,0x80068ae8e0ed15d3,2
+np.float64,0x3fecef353239de6a,0x3fe49c280adc607b,2
+np.float64,0x3fdf1a7fb0be34ff,0x3fd9596bafe2d766,2
+np.float64,0x3feb5e12eeb6bc26,0x3fe3c6be3ede8d07,2
+np.float64,0x3fdeff5cd43dfeba,0x3fd947262ec96b05,2
+np.float64,0x3f995e75e832bd00,0x3f990f511f4c7f1c,2
+np.float64,0xbfeb5b3ed0b6b67e,0xbffee24fc0fc2881,2
+np.float64,0x7fb82aad0a305559,0x40861b614d901182,2
+np.float64,0xbfe5c3a4926b8749,0xbff23cd0ad144fe6,2
+np.float64,0x3fef47da373e8fb4,0x3fe5d1aaa4031993,2
+np.float64,0x7fc6a8c3872d5186,0x40862068f5ca84be,2
+np.float64,0x7fc0c2276221844e,0x40861dff2566d001,2
+np.float64,0x7fc9ce7d28339cf9,0x40862173541f84d1,2
+np.float64,0x3fce2c34933c5869,0x3fcb179428ad241d,2
+np.float64,0xbfcf864c293f0c98,0xbfd21872c4821cfc,2
+np.float64,0x3fc51fd1f82a3fa4,0x3fc38d4f1685c166,2
+np.float64,0xbfe2707b70a4e0f7,0xbfeb795fbd5bb444,2
+np.float64,0x46629b568cc54,0x46629b568cc54,2
+np.float64,0x7fe5f821f32bf043,0x40862b40c2cdea3f,2
+np.float64,0x3fedd2c9457ba592,0x3fe512ce92394526,2
+np.float64,0x7fe6dcb8ceadb971,0x40862b925a7dc05d,2
+np.float64,0x3fd1b983b4a37307,0x3fcf4ae2545cf64e,2
+np.float64,0xbfe1c93104639262,0xbfe9f7d28e4c0c82,2
+np.float64,0x995ebc2932bd8,0x995ebc2932bd8,2
+np.float64,0x800a4c3ee614987e,0x800a4c3ee614987e,2
+np.float64,0x3fbb58766e36b0f0,0x3fb9fb3b9810ec16,2
+np.float64,0xbfe36d636666dac7,0xbfede5080f69053c,2
+np.float64,0x3f4feee1003fddc2,0x3f4feae5f05443d1,2
+np.float64,0x3fed0b772ffa16ee,0x3fe4aafb924903c6,2
+np.float64,0x800bb3faef3767f6,0x800bb3faef3767f6,2
+np.float64,0x3fe285cda5e50b9c,0x3fdd3a58df06c427,2
+np.float64,0x7feb9d560bb73aab,0x40862d152362bb94,2
+np.float64,0x3fecd1f447f9a3e9,0x3fe48cc78288cb3f,2
+np.float64,0x3fca927b0c3524f6,0x3fc8250f49ba28df,2
+np.float64,0x7fcc19944e383328,0x40862221b02fcf43,2
+np.float64,0xbfd8ddf41db1bbe8,0xbfdf7b92073ff2fd,2
+np.float64,0x80006fe736e0dfcf,0x80006fe736e0dfcf,2
+np.float64,0x800bbeb66d577d6d,0x800bbeb66d577d6d,2
+np.float64,0xbfe4329353e86526,0xbfefeaf19ab92b42,2
+np.float64,0x2fad72805f5af,0x2fad72805f5af,2
+np.float64,0x3fe1b827aa637050,0x3fdc33bf46012c0d,2
+np.float64,0x3fc3f3f8e227e7f2,0x3fc28aeb86d65278,2
+np.float64,0x3fec018933780312,0x3fe41e619aa4285c,2
+np.float64,0xbfd92428e0b24852,0xbfdfeecb08d154df,2
+np.float64,0x2d7046845ae0a,0x2d7046845ae0a,2
+np.float64,0x7fde7fd2233cffa3,0x408628550f8a948f,2
+np.float64,0x8000a32cd241465a,0x8000a32cd241465a,2
+np.float64,0x8004267a45084cf5,0x8004267a45084cf5,2
+np.float64,0xbfe6b422556d6844,0xbff3c71f67661e6e,2
+np.float64,0x3fe3a37d922746fb,0x3fdea04e04d6195c,2
+np.float64,0xbfddcc54b53b98aa,0xbfe40d2389cdb848,2
+np.float64,0x3fe18b4b92a31697,0x3fdbf9e68cbf5794,2
+np.float64,0x7fc9c5b2ee338b65,0x408621709a17a47a,2
+np.float64,0x1ebd1ce03d7b,0x1ebd1ce03d7b,2
+np.float64,0x8008a6fc39d14df9,0x8008a6fc39d14df9,2
+np.float64,0x3fec11384c782270,0x3fe426bdaedd2965,2
+np.float64,0x3fefc28344ff8507,0x3fe60f75d34fc3d2,2
+np.float64,0xc35f379786be7,0xc35f379786be7,2
+np.float64,0x3feef51f4a7dea3e,0x3fe5a7b95d7786b5,2
+np.float64,0x3fec9b9f0379373e,0x3fe4702477abbb63,2
+np.float64,0x3fde94f8cdbd29f0,0x3fd8ff50f7df0a6f,2
+np.float64,0xbfed32d1cdfa65a4,0xc0037c1470f6f979,2
+np.float64,0x800d3ba44f5a7749,0x800d3ba44f5a7749,2
+np.float64,0x3fe3c56c8fe78ad9,0x3fdeca4eb9bb8918,2
+np.float64,0xbfe7c97242ef92e4,0xbff5c2950dfd6f69,2
+np.float64,0xbd9440057b288,0xbd9440057b288,2
+np.float64,0x7feb2fc111f65f81,0x40862cf524bd2001,2
+np.float64,0x800a431e2df4863d,0x800a431e2df4863d,2
+np.float64,0x80038a3b79e71478,0x80038a3b79e71478,2
+np.float64,0x80000c93d4601928,0x80000c93d4601928,2
+np.float64,0x7fe9fec022f3fd7f,0x40862c995db8ada0,2
+np.float64,0x3fead0129c35a025,0x3fe379d7a92c8f79,2
+np.float64,0x3fdd8cbaf7bb1974,0x3fd84b87ff0c26c7,2
+np.float64,0x3fe8fb7c60b1f6f9,0x3fe276d5339e7135,2
+np.float64,0x85a255e10b44b,0x85a255e10b44b,2
+np.float64,0xbfe507c23fea0f84,0xbff1212d2260022a,2
+np.float64,0x3fc5487c7b2a90f9,0x3fc3b03222d3d148,2
+np.float64,0x7fec0bdcb8f817b8,0x40862d34e8fd11e7,2
+np.float64,0xbfc5f34b4f2be698,0xbfc8146a899c7a0c,2
+np.float64,0xbfa2a49c14254940,0xbfa2fdab2eae3826,2
+np.float64,0x800ec52f15dd8a5e,0x800ec52f15dd8a5e,2
+np.float64,0xbfe3ba4b12a77496,0xbfeeab256b3e9422,2
+np.float64,0x80034d6c7ba69ada,0x80034d6c7ba69ada,2
+np.float64,0x7fd394d4202729a7,0x408624c98a216742,2
+np.float64,0xbfd4493a38289274,0xbfd865d67af2de91,2
+np.float64,0xe47d6203c8fad,0xe47d6203c8fad,2
+np.float64,0x98eb4e4b31d6a,0x98eb4e4b31d6a,2
+np.float64,0x4507fb128a100,0x4507fb128a100,2
+np.float64,0xbfc77032e42ee064,0xbfc9e36ab747a14d,2
+np.float64,0xa1f8a03b43f14,0xa1f8a03b43f14,2
+np.float64,0xbfc3d4da8527a9b4,0xbfc58c27af2476b0,2
+np.float64,0x3fc0eb7d6921d6fb,0x3fbfc858a077ed61,2
+np.float64,0x7fddb2e9403b65d2,0x4086281e98443709,2
+np.float64,0xbfa7ea62942fd4c0,0xbfa87dfd06b05d2a,2
+np.float64,0xbfe7d5c5426fab8a,0xbff5daa969c6d9e5,2
+np.float64,0x3fbf7cba0c3ef974,0x3fbdb23cd8fe875b,2
+np.float64,0x7fe92021eb324043,0x40862c53aee8b154,2
+np.float64,0x7fefbaa1827f7542,0x40862e3194737072,2
+np.float64,0x3fc6f82c402df059,0x3fc520432cbc533f,2
+np.float64,0x7fb37679a826ecf2,0x408619a5f857e27f,2
+np.float64,0x79ec1528f3d83,0x79ec1528f3d83,2
+np.float64,0x3fbefe1d0c3dfc3a,0x3fbd41650ba2c893,2
+np.float64,0x3fc3e5e11827cbc2,0x3fc27eb9b47c9c42,2
+np.float64,0x16aed1922d5db,0x16aed1922d5db,2
+np.float64,0x800124f7e58249f1,0x800124f7e58249f1,2
+np.float64,0x8004f7d12489efa3,0x8004f7d12489efa3,2
+np.float64,0x3fef80b8e27f0172,0x3fe5ee5fd43322c6,2
+np.float64,0xbfe7740c88eee819,0xbff51f823c8da14d,2
+np.float64,0xbfe6e1f1f6edc3e4,0xbff416bcb1302e7c,2
+np.float64,0x8001a2c4a7e3458a,0x8001a2c4a7e3458a,2
+np.float64,0x3fe861e155f0c3c2,0x3fe2201d3000c329,2
+np.float64,0x3fd00a101a201420,0x3fcca01087dbd728,2
+np.float64,0x7fdf0eb1133e1d61,0x4086287a327839b8,2
+np.float64,0x95e3ffdb2bc80,0x95e3ffdb2bc80,2
+np.float64,0x3fd87a1e8230f43d,0x3fd4ba1eb9be1270,2
+np.float64,0x3fedc4792afb88f2,0x3fe50b6529080f73,2
+np.float64,0x7fc9e81fa833d03e,0x4086217b428cc6ff,2
+np.float64,0xbfd21f1ba5a43e38,0xbfd54e048b988e09,2
+np.float64,0xbfbf52af5a3ea560,0xbfc0b4ab3b81fafc,2
+np.float64,0x7fe475f8e268ebf1,0x40862aaf14fee029,2
+np.float64,0x3fcf56899f3ead10,0x3fcc081de28ae9cf,2
+np.float64,0x917d407122fa8,0x917d407122fa8,2
+np.float64,0x22e23e3245c49,0x22e23e3245c49,2
+np.float64,0xbfeec2814f3d8503,0xc00a00ecca27b426,2
+np.float64,0xbfd97fee1c32ffdc,0xbfe04351dfe306ec,2
diff --git a/numpy/core/tests/data/umath-validation-set-log2.csv b/numpy/core/tests/data/umath-validation-set-log2.csv
new file mode 100644 (file)
index 0000000..179c651
--- /dev/null
@@ -0,0 +1,1629 @@
+dtype,input,output,ulperrortol
+np.float32,0x80000000,0xff800000,3
+np.float32,0x7f12870a,0x42fe63db,3
+np.float32,0x3ef29cf5,0xbf89eb12,3
+np.float32,0x3d6ba8fb,0xc083d26c,3
+np.float32,0x3d9907e8,0xc06f8230,3
+np.float32,0x4ee592,0xc2fd656e,3
+np.float32,0x58d8b1,0xc2fd0db3,3
+np.float32,0x7ba103,0xc2fc19aa,3
+np.float32,0x7f52e90e,0x42ff70e4,3
+np.float32,0x7fcb15,0xc2fc0132,3
+np.float32,0x7cb7129f,0x42f50855,3
+np.float32,0x9faba,0xc301ae59,3
+np.float32,0x7f300a,0xc2fc04b4,3
+np.float32,0x3f0bf047,0xbf5f10cb,3
+np.float32,0x2fb1fb,0xc2fed934,3
+np.float32,0x3eedb0d1,0xbf8db417,3
+np.float32,0x3d7a0b40,0xc0811638,3
+np.float32,0x2e0bac,0xc2fef334,3
+np.float32,0x6278c1,0xc2fcc1b9,3
+np.float32,0x7f61ab2e,0x42ffa2d9,3
+np.float32,0x8fe7c,0xc301d4be,3
+np.float32,0x3f25e6ee,0xbf203536,3
+np.float32,0x7efc78f0,0x42fdf5c0,3
+np.float32,0x6d7304,0xc2fc73a7,3
+np.float32,0x7f1a472a,0x42fe89ed,3
+np.float32,0x7dd029a6,0x42f96734,3
+np.float32,0x3e9b9327,0xbfdbf8f7,3
+np.float32,0x3f4eefc1,0xbe9d2942,3
+np.float32,0x7f5b9b64,0x42ff8ebc,3
+np.float32,0x3e458ee1,0xc017ed6e,3
+np.float32,0x3f7b766b,0xbcd35acf,3
+np.float32,0x3e616070,0xc00bc378,3
+np.float32,0x7f20e633,0x42fea8f8,3
+np.float32,0x3ee3b461,0xbf95a126,3
+np.float32,0x7e7722ba,0x42fbe5f8,3
+np.float32,0x3f0873d7,0xbf6861fa,3
+np.float32,0x7b4cb2,0xc2fc1ba3,3
+np.float32,0x3f0b6b02,0xbf60712e,3
+np.float32,0x9bff4,0xc301b6f2,3
+np.float32,0x3f07be25,0xbf6a4f0c,3
+np.float32,0x3ef10e57,0xbf8b1b75,3
+np.float32,0x46ad75,0xc2fdb6b1,3
+np.float32,0x3f7bc542,0xbcc4e3a9,3
+np.float32,0x3f6673d4,0xbe1b509c,3
+np.float32,0x7f19fe59,0x42fe8890,3
+np.float32,0x7f800000,0x7f800000,3
+np.float32,0x7f2fe696,0x42feead0,3
+np.float32,0x3dc9432d,0xc0563655,3
+np.float32,0x3ee47623,0xbf950446,3
+np.float32,0x3f1f8817,0xbf2eab51,3
+np.float32,0x7f220ec5,0x42feae44,3
+np.float32,0x2325e3,0xc2ffbab1,3
+np.float32,0x29dfc8,0xc2ff395a,3
+np.float32,0x7f524950,0x42ff6eb3,3
+np.float32,0x3e2234e0,0xc02a21c8,3
+np.float32,0x7f1c6f5a,0x42fe942f,3
+np.float32,0x3b6a61,0xc2fe36e7,3
+np.float32,0x3f1df90e,0xbf324ba9,3
+np.float32,0xb57f0,0xc3017f07,3
+np.float32,0x7d0eba,0xc2fc112e,3
+np.float32,0x403aa9,0xc2fdfd5c,3
+np.float32,0x3e74ecc7,0xc004155f,3
+np.float32,0x17509c,0xc30074f2,3
+np.float32,0x7f62196b,0x42ffa442,3
+np.float32,0x3ecef9a9,0xbfa7417a,3
+np.float32,0x7f14b158,0x42fe6eb1,3
+np.float32,0x3ede12be,0xbf9a40fe,3
+np.float32,0x42cfaa,0xc2fde03f,3
+np.float32,0x3f407b0f,0xbed2a6f5,3
+np.float32,0x7f7fffff,0x43000000,3
+np.float32,0x5467c6,0xc2fd3394,3
+np.float32,0x7ea6b80f,0x42fcc336,3
+np.float32,0x3f21e7b2,0xbf293704,3
+np.float32,0x3dc7e9eb,0xc056d542,3
+np.float32,0x7f3e6e67,0x42ff2571,3
+np.float32,0x3e3e809d,0xc01b4911,3
+np.float32,0x3f800000,0x0,3
+np.float32,0x3d8fd238,0xc0753d52,3
+np.float32,0x3f74aa65,0xbd85cd0e,3
+np.float32,0x7ec30305,0x42fd36ff,3
+np.float32,0x3e97bb93,0xbfe0971d,3
+np.float32,0x3e109d9c,0xc034bb1b,3
+np.float32,0x3f4a0b67,0xbeaed537,3
+np.float32,0x3f25a7aa,0xbf20c228,3
+np.float32,0x3ebc05eb,0xbfb8fd6b,3
+np.float32,0x3eebe749,0xbf8f18e5,3
+np.float32,0x3e9dc479,0xbfd96356,3
+np.float32,0x7f245200,0x42feb882,3
+np.float32,0x1573a8,0xc30093b5,3
+np.float32,0x3e66c4b9,0xc00994a6,3
+np.float32,0x3e73bffc,0xc0048709,3
+np.float32,0x3dfef8e5,0xc0405f16,3
+np.float32,0x403750,0xc2fdfd83,3
+np.float32,0x3ebedf17,0xbfb636a4,3
+np.float32,0x15cae6,0xc3008de2,3
+np.float32,0x3edf4d4e,0xbf993c24,3
+np.float32,0x3f7cc41e,0xbc963fb3,3
+np.float32,0x3e9e12a4,0xbfd907ee,3
+np.float32,0x7ded7b59,0x42f9c889,3
+np.float32,0x7f034878,0x42fe12b5,3
+np.float32,0x7ddce43f,0x42f9930b,3
+np.float32,0x3d82b257,0xc07e1333,3
+np.float32,0x3dae89c1,0xc0635dd4,3
+np.float32,0x6b1d00,0xc2fc8396,3
+np.float32,0x449a5a,0xc2fdccb3,3
+np.float32,0x4e89d2,0xc2fd68cb,3
+np.float32,0x7e1ae83f,0x42fa8cef,3
+np.float32,0x7e4bb22c,0x42fb572e,3
+np.float32,0x3de308ea,0xc04b1634,3
+np.float32,0x7f238c7a,0x42feb508,3
+np.float32,0x3f6c62a3,0xbdeb86f3,3
+np.float32,0x3e58cba6,0xc00f5908,3
+np.float32,0x7f7dd91f,0x42fff9c4,3
+np.float32,0x3d989376,0xc06fc88d,3
+np.float32,0x3dd013c5,0xc0532339,3
+np.float32,0x4b17e6,0xc2fd89ed,3
+np.float32,0x7f67f287,0x42ffb71e,3
+np.float32,0x3f69365e,0xbe09ba3c,3
+np.float32,0x3e4b8b21,0xc0152bf1,3
+np.float32,0x3a75b,0xc3032171,3
+np.float32,0x7f303676,0x42feec1f,3
+np.float32,0x7f6570e5,0x42ffaf18,3
+np.float32,0x3f5ed61e,0xbe4cf676,3
+np.float32,0x3e9b22f9,0xbfdc7e4f,3
+np.float32,0x2c095e,0xc2ff1428,3
+np.float32,0x3f1b17c1,0xbf391754,3
+np.float32,0x422dc6,0xc2fde746,3
+np.float32,0x3f677c8d,0xbe14b365,3
+np.float32,0x3ef85d0c,0xbf8597a9,3
+np.float32,0x3ecaaa6b,0xbfab2430,3
+np.float32,0x3f0607d1,0xbf6eff3d,3
+np.float32,0x3f011fdb,0xbf7cc50d,3
+np.float32,0x6ed7c1,0xc2fc6a4e,3
+np.float32,0x7ec2d1a2,0x42fd3644,3
+np.float32,0x3f75b7fe,0xbd7238a2,3
+np.float32,0x3ef2d146,0xbf89c344,3
+np.float32,0x7ec2cd27,0x42fd3633,3
+np.float32,0x7ee1e55a,0x42fda397,3
+np.float32,0x7f464d6a,0x42ff435c,3
+np.float32,0x7f469a93,0x42ff447b,3
+np.float32,0x7ece752f,0x42fd6121,3
+np.float32,0x2ed878,0xc2fee67b,3
+np.float32,0x75b23,0xc3021eff,3
+np.float32,0x3e0f4be4,0xc03593b8,3
+np.float32,0x2778e1,0xc2ff64fc,3
+np.float32,0x5fe2b7,0xc2fcd561,3
+np.float32,0x19b8a9,0xc30050ab,3
+np.float32,0x7df303e5,0x42f9d98d,3
+np.float32,0x608b8d,0xc2fcd051,3
+np.float32,0x588f46,0xc2fd1017,3
+np.float32,0x3eec6a11,0xbf8eb2a1,3
+np.float32,0x3f714121,0xbdaf4906,3
+np.float32,0x7f4f7b9e,0x42ff64c9,3
+np.float32,0x3c271606,0xc0d3b29c,3
+np.float32,0x3f002fe0,0xbf7f75f6,3
+np.float32,0x7efa4798,0x42fdef4f,3
+np.float32,0x3f61a865,0xbe3a601a,3
+np.float32,0x7e8087aa,0x42fc030d,3
+np.float32,0x3f70f0c7,0xbdb321ba,3
+np.float32,0x5db898,0xc2fce63f,3
+np.float32,0x7a965f,0xc2fc1fea,3
+np.float32,0x7f68b112,0x42ffb97c,3
+np.float32,0x7ef0ed3d,0x42fdd32d,3
+np.float32,0x7f3156a1,0x42fef0d3,3
+np.float32,0x3f1d405f,0xbf33fc6e,3
+np.float32,0x3e3494cf,0xc0203945,3
+np.float32,0x6018de,0xc2fcd3c1,3
+np.float32,0x623e49,0xc2fcc370,3
+np.float32,0x3ea29f0f,0xbfd3cad4,3
+np.float32,0xa514,0xc305a20c,3
+np.float32,0x3e1b2ab1,0xc02e3a8f,3
+np.float32,0x3f450b6f,0xbec1578f,3
+np.float32,0x7eb12908,0x42fcf015,3
+np.float32,0x3f10b720,0xbf52ab48,3
+np.float32,0x3e0a93,0xc2fe16f6,3
+np.float32,0x93845,0xc301cb96,3
+np.float32,0x7f4e9ce3,0x42ff61af,3
+np.float32,0x3f6d4296,0xbde09ceb,3
+np.float32,0x6ddede,0xc2fc70d0,3
+np.float32,0x3f4fb6fd,0xbe9a636d,3
+np.float32,0x3f6d08de,0xbde36c0b,3
+np.float32,0x3f56f057,0xbe8122ad,3
+np.float32,0x334e95,0xc2fea349,3
+np.float32,0x7efadbcd,0x42fdf104,3
+np.float32,0x3db02e88,0xc0628046,3
+np.float32,0x3f3309d1,0xbf041066,3
+np.float32,0x2d8722,0xc2fefb8f,3
+np.float32,0x7e926cac,0x42fc6356,3
+np.float32,0x3e3674ab,0xc01f452e,3
+np.float32,0x1b46ce,0xc3003afc,3
+np.float32,0x3f06a338,0xbf6d53fc,3
+np.float32,0x1b1ba7,0xc3003d46,3
+np.float32,0x319dfb,0xc2febc06,3
+np.float32,0x3e2f126a,0xc02315a5,3
+np.float32,0x3f40fe65,0xbed0af9e,3
+np.float32,0x3f1d842f,0xbf335d4b,3
+np.float32,0x3d044e4f,0xc09e78f8,3
+np.float32,0x7f272674,0x42fec51f,3
+np.float32,0x3cda6d8f,0xc0a753db,3
+np.float32,0x3eb92f12,0xbfbbccbb,3
+np.float32,0x7e4318f4,0x42fb3752,3
+np.float32,0x3c5890,0xc2fe2b6d,3
+np.float32,0x3d1993c9,0xc09796f8,3
+np.float32,0x7f18ef24,0x42fe8377,3
+np.float32,0x3e30c3a0,0xc0223244,3
+np.float32,0x3f27cd27,0xbf1c00ef,3
+np.float32,0x3f150957,0xbf47cd6c,3
+np.float32,0x7e7178a3,0x42fbd4d8,3
+np.float32,0x3f298db8,0xbf182ac3,3
+np.float32,0x7cb3be,0xc2fc1348,3
+np.float32,0x3ef64266,0xbf8729de,3
+np.float32,0x3eeb06ce,0xbf8fc8f2,3
+np.float32,0x3f406e36,0xbed2d845,3
+np.float32,0x7f1e1bd3,0x42fe9c0b,3
+np.float32,0x478dcc,0xc2fdad97,3
+np.float32,0x7f7937b5,0x42ffec2b,3
+np.float32,0x3f20f350,0xbf2b6624,3
+np.float32,0x7f13661a,0x42fe683c,3
+np.float32,0x208177,0xc2fff46b,3
+np.float32,0x263cfb,0xc2ff7c72,3
+np.float32,0x7f0bd28c,0x42fe4141,3
+np.float32,0x7230d8,0xc2fc5453,3
+np.float32,0x3f261bbf,0xbf1fbfb4,3
+np.float32,0x737b56,0xc2fc4c05,3
+np.float32,0x3ef88f33,0xbf857263,3
+np.float32,0x7e036464,0x42fa1352,3
+np.float32,0x4b5c4f,0xc2fd874d,3
+np.float32,0x3f77984d,0xbd454596,3
+np.float32,0x3f674202,0xbe162932,3
+np.float32,0x3e7157d9,0xc0057197,3
+np.float32,0x3f3f21da,0xbed7d861,3
+np.float32,0x7f1fb40f,0x42fea375,3
+np.float32,0x7ef0157f,0x42fdd096,3
+np.float32,0x3f71e88d,0xbda74962,3
+np.float32,0x3f174855,0xbf424728,3
+np.float32,0x3f3fdd2c,0xbed505d5,3
+np.float32,0x7b95d1,0xc2fc19ed,3
+np.float32,0x7f23f4e5,0x42feb6df,3
+np.float32,0x7d741925,0x42f7dcd6,3
+np.float32,0x60f81d,0xc2fccd14,3
+np.float32,0x3f17d267,0xbf40f6ae,3
+np.float32,0x3f036fc8,0xbf7636f8,3
+np.float32,0x167653,0xc30082b5,3
+np.float32,0x256d05,0xc2ff8c4f,3
+np.float32,0x3eccc63d,0xbfa93adb,3
+np.float32,0x7f6c91ea,0x42ffc5b2,3
+np.float32,0x2ee52a,0xc2fee5b3,3
+np.float32,0x3dc3579e,0xc058f80d,3
+np.float32,0x4c7170,0xc2fd7cc4,3
+np.float32,0x7f737f20,0x42ffdb03,3
+np.float32,0x3f2f9dbf,0xbf0b3119,3
+np.float32,0x3f4d0c54,0xbea3eec5,3
+np.float32,0x7e380862,0x42fb0c32,3
+np.float32,0x5d637f,0xc2fce8df,3
+np.float32,0x3f0aa623,0xbf627c27,3
+np.float32,0x3e4d5896,0xc0145b88,3
+np.float32,0x3f6cacdc,0xbde7e7ca,3
+np.float32,0x63a2c3,0xc2fcb90a,3
+np.float32,0x6c138c,0xc2fc7cfa,3
+np.float32,0x2063c,0xc303fb88,3
+np.float32,0x7e9e5a3e,0x42fc9d2f,3
+np.float32,0x56ec64,0xc2fd1ddd,3
+np.float32,0x7f1d6a35,0x42fe98cc,3
+np.float32,0x73dc96,0xc2fc4998,3
+np.float32,0x3e5d74e5,0xc00d6238,3
+np.float32,0x7f033cbb,0x42fe1273,3
+np.float32,0x3f5143fc,0xbe94e4e7,3
+np.float32,0x1d56d9,0xc3002010,3
+np.float32,0x2bf3e4,0xc2ff1591,3
+np.float32,0x3f2a6ef1,0xbf164170,3
+np.float32,0x3f33238b,0xbf03db58,3
+np.float32,0x22780e,0xc2ffc91a,3
+np.float32,0x7f00b873,0x42fe0425,3
+np.float32,0x3f7f6145,0xbb654706,3
+np.float32,0x7fc00000,0x7fc00000,3
+np.float32,0x63895a,0xc2fcb9c7,3
+np.float32,0x18a1b2,0xc30060a8,3
+np.float32,0x7e43c6a6,0x42fb39e3,3
+np.float32,0x78676e,0xc2fc2d30,3
+np.float32,0x3f16d839,0xbf435940,3
+np.float32,0x7eff78ba,0x42fdfe79,3
+np.float32,0x3f2e152c,0xbf0e6e54,3
+np.float32,0x3db20ced,0xc06186e1,3
+np.float32,0x3f0cd1d8,0xbf5cbf57,3
+np.float32,0x3fd7a8,0xc2fe01d2,3
+np.float32,0x3ebb075e,0xbfb9f816,3
+np.float32,0x7f94ef,0xc2fc026b,3
+np.float32,0x3d80ba0e,0xc07f7a2b,3
+np.float32,0x7f227e15,0x42feb03f,3
+np.float32,0x792264bf,0x42e6afcc,3
+np.float32,0x7f501576,0x42ff66ec,3
+np.float32,0x223629,0xc2ffcea3,3
+np.float32,0x40a79e,0xc2fdf87b,3
+np.float32,0x449483,0xc2fdccf2,3
+np.float32,0x3f4fa978,0xbe9a9382,3
+np.float32,0x7f148c53,0x42fe6df9,3
+np.float32,0x3ec98b3c,0xbfac2a98,3
+np.float32,0x3e4da320,0xc0143a0a,3
+np.float32,0x3d1d94bb,0xc09666d0,3
+np.float32,0x3c8e624e,0xc0bb155b,3
+np.float32,0x66a9af,0xc2fca2ef,3
+np.float32,0x3ec76ed7,0xbfae1c57,3
+np.float32,0x3f4b52f3,0xbeaa2b81,3
+np.float32,0x7e99bbb5,0x42fc8750,3
+np.float32,0x3f69a46b,0xbe0701be,3
+np.float32,0x3f775400,0xbd4ba495,3
+np.float32,0x131e56,0xc300be3c,3
+np.float32,0x3f30abb4,0xbf08fb10,3
+np.float32,0x7f7e528c,0x42fffb25,3
+np.float32,0x3eb89515,0xbfbc668a,3
+np.float32,0x7e9191b6,0x42fc5f02,3
+np.float32,0x7e80c7e9,0x42fc047e,3
+np.float32,0x3f77ef58,0xbd3d2995,3
+np.float32,0x7ddb1f8a,0x42f98d1b,3
+np.float32,0x7ebc6c4f,0x42fd1d9c,3
+np.float32,0x3f6638e0,0xbe1ccab8,3
+np.float32,0x7f4c45,0xc2fc0410,3
+np.float32,0x3e7d8aad,0xc000e414,3
+np.float32,0x3f4d148b,0xbea3d12e,3
+np.float32,0x3e98c45c,0xbfdf55f4,3
+np.float32,0x3d754c78,0xc081f8a9,3
+np.float32,0x17e4cf,0xc3006be3,3
+np.float32,0x7eb65814,0x42fd0563,3
+np.float32,0x3f65e0d8,0xbe1f0008,3
+np.float32,0x3e99541f,0xbfdea87e,3
+np.float32,0x3f3cb80e,0xbee13b27,3
+np.float32,0x3e99f0c0,0xbfddec3b,3
+np.float32,0x3f43903e,0xbec6ea66,3
+np.float32,0x7e211cd4,0x42faa9f2,3
+np.float32,0x824af,0xc301f971,3
+np.float32,0x3e16a56e,0xc030f56c,3
+np.float32,0x542b3b,0xc2fd35a6,3
+np.float32,0x3eeea2d1,0xbf8cf873,3
+np.float32,0x232e93,0xc2ffb9fa,3
+np.float32,0x3e8c52b9,0xbfef06aa,3
+np.float32,0x7f69c7e3,0x42ffbcef,3
+np.float32,0x3f573e43,0xbe801714,3
+np.float32,0x43b009,0xc2fdd69f,3
+np.float32,0x3ee571ab,0xbf943966,3
+np.float32,0x3ee3d5d8,0xbf958604,3
+np.float32,0x338b12,0xc2fe9fe4,3
+np.float32,0x29cb1f,0xc2ff3ac6,3
+np.float32,0x3f0892b4,0xbf680e7a,3
+np.float32,0x3e8c4f7f,0xbfef0ae9,3
+np.float32,0x7c9d3963,0x42f497e6,3
+np.float32,0x3f26ba84,0xbf1e5f59,3
+np.float32,0x3dd0acc0,0xc052df6f,3
+np.float32,0x3e43fbda,0xc018aa8c,3
+np.float32,0x3ec4fd0f,0xbfb0635d,3
+np.float32,0x3f52c8c6,0xbe8f8d85,3
+np.float32,0x3f5fdc5d,0xbe462fdb,3
+np.float32,0x3f461920,0xbebd6743,3
+np.float32,0x6161ff,0xc2fcc9ef,3
+np.float32,0x7f7ed306,0x42fffc9a,3
+np.float32,0x3d212263,0xc0955f46,3
+np.float32,0x3eca5826,0xbfab6f36,3
+np.float32,0x7d6317ac,0x42f7a77e,3
+np.float32,0x3eb02063,0xbfc50f60,3
+np.float32,0x7f71a6f8,0x42ffd565,3
+np.float32,0x1a3efe,0xc3004935,3
+np.float32,0x3dc599c9,0xc057e856,3
+np.float32,0x3f3e1301,0xbedbf205,3
+np.float32,0xf17d4,0xc301158d,3
+np.float32,0x3f615f84,0xbe3c3d85,3
+np.float32,0x3de63be1,0xc049cb77,3
+np.float32,0x3e8d2f51,0xbfede541,3
+np.float32,0x3a5cdd,0xc2fe441c,3
+np.float32,0x3f443ec0,0xbec4586a,3
+np.float32,0x3eacbd00,0xbfc8a5ad,3
+np.float32,0x3f600f6a,0xbe44df1b,3
+np.float32,0x5f77a6,0xc2fcd89c,3
+np.float32,0x476706,0xc2fdaf28,3
+np.float32,0x2f469,0xc3036fde,3
+np.float32,0x7dc4ba24,0x42f93d77,3
+np.float32,0x3e2d6080,0xc023fb9b,3
+np.float32,0x7e8d7135,0x42fc49c3,3
+np.float32,0x3f589065,0xbe77247b,3
+np.float32,0x3f59e210,0xbe6e2c05,3
+np.float32,0x7f51d388,0x42ff6d15,3
+np.float32,0x7d9a5fda,0x42f88a63,3
+np.float32,0x3e67d5bc,0xc00927ab,3
+np.float32,0x61d72c,0xc2fcc679,3
+np.float32,0x3ef3351d,0xbf897766,3
+np.float32,0x1,0xc3150000,3
+np.float32,0x7f653429,0x42ffae54,3
+np.float32,0x7e1ad3e5,0x42fa8c8e,3
+np.float32,0x3f4ca01d,0xbea57500,3
+np.float32,0x3f7606db,0xbd6ad13e,3
+np.float32,0x7ec4a27d,0x42fd3d1f,3
+np.float32,0x3efe4fd5,0xbf8138c7,3
+np.float32,0x77c2f1,0xc2fc3124,3
+np.float32,0x7e4d3251,0x42fb5c9a,3
+np.float32,0x3f543ac7,0xbe8a8154,3
+np.float32,0x7c3dbe29,0x42f322c4,3
+np.float32,0x408e01,0xc2fdf9a0,3
+np.float32,0x45069b,0xc2fdc829,3
+np.float32,0x3d7ecab7,0xc08037e8,3
+np.float32,0xf8c22,0xc3010a99,3
+np.float32,0x7f69af63,0x42ffbca2,3
+np.float32,0x7ec7d228,0x42fd48fe,3
+np.float32,0xff800000,0xffc00000,3
+np.float32,0xdd7c5,0xc301357c,3
+np.float32,0x143f38,0xc300a90e,3
+np.float32,0x7e65c176,0x42fbb01b,3
+np.float32,0x2c1a9e,0xc2ff1307,3
+np.float32,0x7f6e9224,0x42ffcbeb,3
+np.float32,0x3d32ab39,0xc0909a77,3
+np.float32,0x3e150b42,0xc031f22b,3
+np.float32,0x1f84b4,0xc300059a,3
+np.float32,0x3f71ce21,0xbda88c2a,3
+np.float32,0x2625c4,0xc2ff7e33,3
+np.float32,0x3dd0b293,0xc052dcdc,3
+np.float32,0x625c11,0xc2fcc290,3
+np.float32,0x3f610297,0xbe3e9f24,3
+np.float32,0x7ebdd5e5,0x42fd2320,3
+np.float32,0x3e883458,0xbff486ff,3
+np.float32,0x782313,0xc2fc2ed4,3
+np.float32,0x7f39c843,0x42ff132f,3
+np.float32,0x7f326aa7,0x42fef54d,3
+np.float32,0x4d2c71,0xc2fd75be,3
+np.float32,0x3f55747c,0xbe86409e,3
+np.float32,0x7f7f0867,0x42fffd34,3
+np.float32,0x321316,0xc2feb53f,3
+np.float32,0x3e1b37ed,0xc02e32b0,3
+np.float32,0x80edf,0xc301fd54,3
+np.float32,0x3f0b08ad,0xbf617607,3
+np.float32,0x7f3f4174,0x42ff28a2,3
+np.float32,0x3d79306d,0xc0813eb0,3
+np.float32,0x3f5f657a,0xbe49413d,3
+np.float32,0x3f56c63a,0xbe81b376,3
+np.float32,0x7f667123,0x42ffb24f,3
+np.float32,0x3f71021b,0xbdb24d43,3
+np.float32,0x7f434ab1,0x42ff380f,3
+np.float32,0x3dcae496,0xc055779c,3
+np.float32,0x3f5a7d88,0xbe6a0f5b,3
+np.float32,0x3cdf5c32,0xc0a64bf5,3
+np.float32,0x3e56222c,0xc0107d11,3
+np.float32,0x561a3a,0xc2fd24df,3
+np.float32,0x7ddd953c,0x42f9955a,3
+np.float32,0x7e35d839,0x42fb035c,3
+np.float32,0x3ec1816c,0xbfb3aeb2,3
+np.float32,0x7c87cfcd,0x42f42bc2,3
+np.float32,0xd9cd,0xc3053baf,3
+np.float32,0x3f388234,0xbef1e5b7,3
+np.float32,0x3edfcaca,0xbf98d47b,3
+np.float32,0x3ef28852,0xbf89fac8,3
+np.float32,0x7f7525df,0x42ffe001,3
+np.float32,0x7f6c33ef,0x42ffc48c,3
+np.float32,0x3ea4a881,0xbfd17e61,3
+np.float32,0x3f3e379f,0xbedb63c6,3
+np.float32,0x3f0524c1,0xbf717301,3
+np.float32,0x3db3e7f0,0xc06091d3,3
+np.float32,0x800000,0xc2fc0000,3
+np.float32,0x3f2f2897,0xbf0c27ce,3
+np.float32,0x7eb1776d,0x42fcf15c,3
+np.float32,0x3f039018,0xbf75dc37,3
+np.float32,0x3c4055,0xc2fe2c96,3
+np.float32,0x3f603653,0xbe43dea5,3
+np.float32,0x7f700d24,0x42ffd07c,3
+np.float32,0x3f4741a3,0xbeb918dc,3
+np.float32,0x3f5fe959,0xbe45da2d,3
+np.float32,0x3f3e4401,0xbedb33b1,3
+np.float32,0x7f0705ff,0x42fe2775,3
+np.float32,0x3ea85662,0xbfcd69b0,3
+np.float32,0x3f15f49f,0xbf458829,3
+np.float32,0x3f17c50e,0xbf411728,3
+np.float32,0x3e483f60,0xc016add2,3
+np.float32,0x3f1ab9e5,0xbf39f71b,3
+np.float32,0x3de0b6fb,0xc04c08fe,3
+np.float32,0x7e671225,0x42fbb452,3
+np.float32,0x80800000,0xffc00000,3
+np.float32,0xe2df3,0xc3012c9d,3
+np.float32,0x3ede1e3c,0xbf9a3770,3
+np.float32,0x3df2ffde,0xc044cfec,3
+np.float32,0x3eed8da5,0xbf8dcf6c,3
+np.float32,0x3ead15c3,0xbfc846e1,3
+np.float32,0x7ef3750a,0x42fddae4,3
+np.float32,0x7e6ab7c0,0x42fbbfe4,3
+np.float32,0x7ea4bbe5,0x42fcba5d,3
+np.float32,0x3f227706,0xbf27f0a1,3
+np.float32,0x3ef39bfd,0xbf89295a,3
+np.float32,0x3f289a20,0xbf1a3edd,3
+np.float32,0x7f225f82,0x42feafb4,3
+np.float32,0x768963,0xc2fc38bc,3
+np.float32,0x3f493c00,0xbeb1ccfc,3
+np.float32,0x3f4e7249,0xbe9ee9a7,3
+np.float32,0x1d0c3a,0xc30023c0,3
+np.float32,0x7f3c5f78,0x42ff1d6a,3
+np.float32,0xff7fffff,0xffc00000,3
+np.float32,0x3ee7896a,0xbf928c2a,3
+np.float32,0x3e788479,0xc002bd2e,3
+np.float32,0x3ee4df17,0xbf94af84,3
+np.float32,0x5e06d7,0xc2fce3d7,3
+np.float32,0x3d7b2776,0xc080e1dc,3
+np.float32,0x3e3d39d3,0xc01be7fd,3
+np.float32,0x7c81dece,0x42f40ab7,3
+np.float32,0x3f7d2085,0xbc856255,3
+np.float32,0x7f7f6627,0x42fffe44,3
+np.float32,0x7f5f2e94,0x42ff9aaa,3
+np.float32,0x7f5835f2,0x42ff8339,3
+np.float32,0x3f6a0e32,0xbe046580,3
+np.float32,0x7e16f586,0x42fa79dd,3
+np.float32,0x3f04a2f2,0xbf72dbc5,3
+np.float32,0x3f35e334,0xbefc7740,3
+np.float32,0x3f0d056e,0xbf5c3824,3
+np.float32,0x7ebeb95e,0x42fd2693,3
+np.float32,0x3c6192,0xc2fe2aff,3
+np.float32,0x3e892b4f,0xbff33958,3
+np.float32,0x3f61d694,0xbe3931df,3
+np.float32,0x29d183,0xc2ff3a56,3
+np.float32,0x7f0b0598,0x42fe3d04,3
+np.float32,0x7f743b28,0x42ffdd3d,3
+np.float32,0x3a2ed6,0xc2fe4663,3
+np.float32,0x3e27403a,0xc0274de8,3
+np.float32,0x3f58ee78,0xbe74a349,3
+np.float32,0x3eaa4b,0xc2fe0f92,3
+np.float32,0x3ecb613b,0xbfaa7de8,3
+np.float32,0x7f637d81,0x42ffa8c9,3
+np.float32,0x3f026e96,0xbf790c73,3
+np.float32,0x386cdf,0xc2fe5d0c,3
+np.float32,0x35abd1,0xc2fe8202,3
+np.float32,0x3eac3cd1,0xbfc92ee8,3
+np.float32,0x3f567869,0xbe82bf47,3
+np.float32,0x3f65c643,0xbe1faae6,3
+np.float32,0x7f5422b9,0x42ff752b,3
+np.float32,0x7c26e9,0xc2fc168c,3
+np.float32,0x7eff5cfd,0x42fdfe29,3
+np.float32,0x3f728e7f,0xbd9f6142,3
+np.float32,0x3f10fd43,0xbf51f874,3
+np.float32,0x7e7ada08,0x42fbf0fe,3
+np.float32,0x3e82a611,0xbffc37be,3
+np.float32,0xbf800000,0xffc00000,3
+np.float32,0x3dbe2e12,0xc05b711c,3
+np.float32,0x7e768fa9,0x42fbe440,3
+np.float32,0x5e44e8,0xc2fce1f0,3
+np.float32,0x7f25071a,0x42febbae,3
+np.float32,0x3f54db5e,0xbe885339,3
+np.float32,0x3f0f2c26,0xbf56a0b8,3
+np.float32,0x22f9a7,0xc2ffbe55,3
+np.float32,0x7ed63dcb,0x42fd7c77,3
+np.float32,0x7ea4fae2,0x42fcbb78,3
+np.float32,0x3f1d7766,0xbf337b47,3
+np.float32,0x7f16d59f,0x42fe7941,3
+np.float32,0x3f3a1bb6,0xbeeb855c,3
+np.float32,0x3ef57128,0xbf87c709,3
+np.float32,0xb24ff,0xc3018591,3
+np.float32,0x3ef99e27,0xbf84a983,3
+np.float32,0x3eac2ccf,0xbfc94013,3
+np.float32,0x3e9d3e1e,0xbfda00dc,3
+np.float32,0x718213,0xc2fc58c1,3
+np.float32,0x7edbf509,0x42fd8fea,3
+np.float32,0x70c7f1,0xc2fc5d80,3
+np.float32,0x3f7012f5,0xbdbdc6cd,3
+np.float32,0x12cba,0xc304c487,3
+np.float32,0x7f5d445d,0x42ff944c,3
+np.float32,0x7f3e30bd,0x42ff2481,3
+np.float32,0x63b110,0xc2fcb8a0,3
+np.float32,0x3f39f728,0xbeec1680,3
+np.float32,0x3f5bea58,0xbe6074b1,3
+np.float32,0x3f350749,0xbefff679,3
+np.float32,0x3e91ab2c,0xbfe81f3e,3
+np.float32,0x7ec53fe0,0x42fd3f6d,3
+np.float32,0x3f6cbbdc,0xbde72c8e,3
+np.float32,0x3f4df49f,0xbea0abcf,3
+np.float32,0x3e9c9638,0xbfdac674,3
+np.float32,0x7f3b82ec,0x42ff1a07,3
+np.float32,0x7f612a09,0x42ffa132,3
+np.float32,0x7ea26650,0x42fcafd3,3
+np.float32,0x3a615138,0xc122f26d,3
+np.float32,0x3f1108bd,0xbf51db39,3
+np.float32,0x6f80f6,0xc2fc65ea,3
+np.float32,0x3f7cb578,0xbc98ecb1,3
+np.float32,0x7f54d31a,0x42ff7790,3
+np.float32,0x196868,0xc3005532,3
+np.float32,0x3f01ee0a,0xbf7a7925,3
+np.float32,0x3e184013,0xc02ffb11,3
+np.float32,0xadde3,0xc3018ee3,3
+np.float32,0x252a91,0xc2ff9173,3
+np.float32,0x3f0382c2,0xbf7601a9,3
+np.float32,0x6d818c,0xc2fc7345,3
+np.float32,0x3bfbfd,0xc2fe2fdd,3
+np.float32,0x7f3cad19,0x42ff1e9a,3
+np.float32,0x4169a7,0xc2fdefdf,3
+np.float32,0x3f615d96,0xbe3c4a2b,3
+np.float32,0x3f036480,0xbf7656ac,3
+np.float32,0x7f5fbda3,0x42ff9c83,3
+np.float32,0x3d202d,0xc2fe21f1,3
+np.float32,0x3d0f5e5d,0xc09ac3e9,3
+np.float32,0x3f0fff6e,0xbf548142,3
+np.float32,0x7f11ed32,0x42fe60d2,3
+np.float32,0x3e6f856b,0xc00624b6,3
+np.float32,0x7f7c4dd7,0x42fff542,3
+np.float32,0x3e76fb86,0xc0034fa0,3
+np.float32,0x3e8a0d6e,0xbff209e7,3
+np.float32,0x3eacad19,0xbfc8b6ad,3
+np.float32,0xa7776,0xc3019cbe,3
+np.float32,0x3dc84d74,0xc056a754,3
+np.float32,0x3efb8052,0xbf834626,3
+np.float32,0x3f0e55fc,0xbf58cacc,3
+np.float32,0x7e0e71e3,0x42fa4efb,3
+np.float32,0x3ed5a800,0xbfa1639c,3
+np.float32,0x3f33335b,0xbf03babf,3
+np.float32,0x38cad7,0xc2fe5842,3
+np.float32,0x3bc21256,0xc0ecc927,3
+np.float32,0x3f09522d,0xbf660a19,3
+np.float32,0xcbd5d,0xc3015428,3
+np.float32,0x492752,0xc2fd9d42,3
+np.float32,0x3f2b9b32,0xbf13b904,3
+np.float32,0x6544ac,0xc2fcad09,3
+np.float32,0x52eb12,0xc2fd40b5,3
+np.float32,0x3f66a7c0,0xbe1a03e8,3
+np.float32,0x7ab289,0xc2fc1f41,3
+np.float32,0x62af5e,0xc2fcc020,3
+np.float32,0x7f73e9cf,0x42ffdc46,3
+np.float32,0x3e5eca,0xc2fe130e,3
+np.float32,0x3e3a10f4,0xc01d7602,3
+np.float32,0x3f04db46,0xbf723f0d,3
+np.float32,0x18fc4a,0xc3005b63,3
+np.float32,0x525bcb,0xc2fd45b6,3
+np.float32,0x3f6b9108,0xbdf5c769,3
+np.float32,0x3e992e8c,0xbfded5c5,3
+np.float32,0x7efea647,0x42fdfc18,3
+np.float32,0x7e8371db,0x42fc139e,3
+np.float32,0x3f397cfb,0xbeedfc69,3
+np.float32,0x7e46d233,0x42fb454a,3
+np.float32,0x7d5281ad,0x42f76f79,3
+np.float32,0x7f4c1878,0x42ff58a1,3
+np.float32,0x3e96ca5e,0xbfe1bd97,3
+np.float32,0x6a2743,0xc2fc8a3d,3
+np.float32,0x7f688781,0x42ffb8f8,3
+np.float32,0x7814b7,0xc2fc2f2d,3
+np.float32,0x3f2ffdc9,0xbf0a6756,3
+np.float32,0x3f766fa8,0xbd60fe24,3
+np.float32,0x4dc64e,0xc2fd7003,3
+np.float32,0x3a296f,0xc2fe46a8,3
+np.float32,0x3f2af942,0xbf15162e,3
+np.float32,0x7f702c32,0x42ffd0dc,3
+np.float32,0x7e61e318,0x42fba390,3
+np.float32,0x7f7d3bdb,0x42fff7fa,3
+np.float32,0x3ee87f3f,0xbf91c881,3
+np.float32,0x2bbc28,0xc2ff193c,3
+np.float32,0x3e01f918,0xc03e966e,3
+np.float32,0x7f0b39f4,0x42fe3e1a,3
+np.float32,0x3eaa4d64,0xbfcb4516,3
+np.float32,0x3e53901e,0xc0119a88,3
+np.float32,0x603cb,0xc3026957,3
+np.float32,0x7e81f926,0x42fc0b4d,3
+np.float32,0x5dab7c,0xc2fce6a6,3
+np.float32,0x3f46fefd,0xbeba1018,3
+np.float32,0x648448,0xc2fcb28a,3
+np.float32,0x3ec49470,0xbfb0c58b,3
+np.float32,0x3e8a5393,0xbff1ac2b,3
+np.float32,0x3f27ccfc,0xbf1c014e,3
+np.float32,0x3ed886e6,0xbf9eeca8,3
+np.float32,0x7cfbe06e,0x42f5f401,3
+np.float32,0x3f5aa7ba,0xbe68f229,3
+np.float32,0x9500d,0xc301c7e3,3
+np.float32,0x3f4861,0xc2fe0853,3
+np.float32,0x3e5ae104,0xc00e76f5,3
+np.float32,0x71253a,0xc2fc5b1e,3
+np.float32,0xcf7b8,0xc3014d9c,3
+np.float32,0x7f7edd2d,0x42fffcb7,3
+np.float32,0x3e9039ee,0xbfe9f5ab,3
+np.float32,0x2fd54e,0xc2fed712,3
+np.float32,0x3f600752,0xbe45147a,3
+np.float32,0x3f4da8f6,0xbea1bb5c,3
+np.float32,0x3f2d34a9,0xbf104bd9,3
+np.float32,0x3e1e66dd,0xc02c52d2,3
+np.float32,0x798276,0xc2fc2670,3
+np.float32,0xd55e2,0xc3014347,3
+np.float32,0x80000001,0xffc00000,3
+np.float32,0x3e7a5ead,0xc0020da6,3
+np.float32,0x7ec4c744,0x42fd3da9,3
+np.float32,0x597e00,0xc2fd085a,3
+np.float32,0x3dff6bf4,0xc0403575,3
+np.float32,0x5d6f1a,0xc2fce883,3
+np.float32,0x7e21faff,0x42faadea,3
+np.float32,0x3e570fea,0xc01016c6,3
+np.float32,0x28e6b6,0xc2ff4ab7,3
+np.float32,0x7e77062d,0x42fbe5a3,3
+np.float32,0x74cac4,0xc2fc43b0,3
+np.float32,0x3f707273,0xbdb93078,3
+np.float32,0x228e96,0xc2ffc737,3
+np.float32,0x686ac1,0xc2fc966b,3
+np.float32,0x3d76400d,0xc081cae8,3
+np.float32,0x3e9f502f,0xbfd7966b,3
+np.float32,0x3f6bc656,0xbdf32b1f,3
+np.float32,0x3edb828b,0xbf9c65d4,3
+np.float32,0x6c6e56,0xc2fc7a8e,3
+np.float32,0x3f04552e,0xbf73b48f,3
+np.float32,0x3f39cb69,0xbeecc457,3
+np.float32,0x7f681c44,0x42ffb7a3,3
+np.float32,0x7f5b44ee,0x42ff8d99,3
+np.float32,0x3e71430a,0xc005798d,3
+np.float32,0x3edcfde3,0xbf9b27c6,3
+np.float32,0x3f616a5a,0xbe3bf67f,3
+np.float32,0x3f523936,0xbe918548,3
+np.float32,0x3f39ce3a,0xbeecb925,3
+np.float32,0x3eac589a,0xbfc91120,3
+np.float32,0x7efc8d3d,0x42fdf5fc,3
+np.float32,0x5704b0,0xc2fd1d0f,3
+np.float32,0x7e7972e9,0x42fbecda,3
+np.float32,0x3eb0811c,0xbfc4aa13,3
+np.float32,0x7f1efcbb,0x42fea023,3
+np.float32,0x3e0b9e32,0xc037fa6b,3
+np.float32,0x7eef6a48,0x42fdce87,3
+np.float32,0x3cc0a373,0xc0ad20c0,3
+np.float32,0x3f2a75bb,0xbf1632ba,3
+np.float32,0x0,0xff800000,3
+np.float32,0x7ecdb6f4,0x42fd5e77,3
+np.float32,0x7f2e2dfd,0x42fee38d,3
+np.float32,0x3ee17f6e,0xbf976d8c,3
+np.float32,0x3f51e7ee,0xbe92a319,3
+np.float32,0x3f06942f,0xbf6d7d3c,3
+np.float32,0x3f7ba528,0xbccac6f1,3
+np.float32,0x3f413787,0xbecfd513,3
+np.float32,0x3e085e48,0xc03a2716,3
+np.float32,0x7e4c5e0e,0x42fb599c,3
+np.float32,0x306f76,0xc2fecdd4,3
+np.float32,0x7f5c2203,0x42ff9081,3
+np.float32,0x3d5355b4,0xc088da05,3
+np.float32,0x9a2a,0xc305bb4f,3
+np.float32,0x3db93a1f,0xc05de0db,3
+np.float32,0x4e50c6,0xc2fd6ae4,3
+np.float32,0x7ec4afed,0x42fd3d51,3
+np.float32,0x3a8f27,0xc2fe41a0,3
+np.float32,0x7f213caf,0x42feaa84,3
+np.float32,0x7e7b5f00,0x42fbf286,3
+np.float32,0x7e367194,0x42fb05ca,3
+np.float32,0x7f56e6de,0x42ff7ebd,3
+np.float32,0x3ed7383e,0xbfa00aef,3
+np.float32,0x7e844752,0x42fc184a,3
+np.float32,0x15157,0xc3049a19,3
+np.float32,0x3f78cd92,0xbd28824a,3
+np.float32,0x7ecddb16,0x42fd5ef9,3
+np.float32,0x3e479f16,0xc016f7d8,3
+np.float32,0x3f5cb418,0xbe5b2bd3,3
+np.float32,0x7c0934cb,0x42f2334e,3
+np.float32,0x3ebe5505,0xbfb6bc69,3
+np.float32,0x3eb1335a,0xbfc3eff5,3
+np.float32,0x3f2488a3,0xbf234444,3
+np.float32,0x642906,0xc2fcb52a,3
+np.float32,0x3da635fa,0xc067e15a,3
+np.float32,0x7e0d80db,0x42fa4a15,3
+np.float32,0x4f0b9d,0xc2fd640a,3
+np.float32,0x7e083806,0x42fa2df8,3
+np.float32,0x7f77f8c6,0x42ffe877,3
+np.float32,0x3e7bb46a,0xc0018ff5,3
+np.float32,0x3f06eb2e,0xbf6c8eca,3
+np.float32,0x7eae8f7c,0x42fce52a,3
+np.float32,0x3de481a0,0xc04a7d7f,3
+np.float32,0x3eed4311,0xbf8e096f,3
+np.float32,0x3f7b0300,0xbce8903d,3
+np.float32,0x3811b,0xc30330dd,3
+np.float32,0x3eb6f8e1,0xbfbe04bc,3
+np.float32,0x3ec35210,0xbfb1f55a,3
+np.float32,0x3d386916,0xc08f24a5,3
+np.float32,0x3f1fa197,0xbf2e704d,3
+np.float32,0x7f2020a5,0x42fea56a,3
+np.float32,0x7e1ea53f,0x42fa9e8c,3
+np.float32,0x3f148903,0xbf490bf9,3
+np.float32,0x3f2f56a0,0xbf0bc6c9,3
+np.float32,0x7da9fc,0xc2fc0d9b,3
+np.float32,0x3d802134,0xc07fe810,3
+np.float32,0x3f6cb927,0xbde74e57,3
+np.float32,0x7e05b125,0x42fa2023,3
+np.float32,0x3f3307f9,0xbf041433,3
+np.float32,0x5666bf,0xc2fd2250,3
+np.float32,0x3f51c93b,0xbe930f28,3
+np.float32,0x3eb5dcfe,0xbfbf241e,3
+np.float32,0xb2773,0xc301853f,3
+np.float32,0x7f4dee96,0x42ff5f3f,3
+np.float32,0x3e3f5c33,0xc01adee1,3
+np.float32,0x3f2ed29a,0xbf0cdd4a,3
+np.float32,0x3e3c01ef,0xc01c80ab,3
+np.float32,0x3ec2236e,0xbfb31458,3
+np.float32,0x7e841dc4,0x42fc1761,3
+np.float32,0x3df2cd8e,0xc044e30c,3
+np.float32,0x3f010901,0xbf7d0670,3
+np.float32,0x3c05ceaa,0xc0ddf39b,3
+np.float32,0x3f517226,0xbe944206,3
+np.float32,0x3f23c83d,0xbf24f522,3
+np.float32,0x7fc9da,0xc2fc0139,3
+np.float32,0x7f1bde53,0x42fe9181,3
+np.float32,0x3ea3786c,0xbfd2d4a5,3
+np.float32,0x3e83a71b,0xbffacdd2,3
+np.float32,0x3f6f0d4f,0xbdca61d5,3
+np.float32,0x7f5ab613,0x42ff8bb7,3
+np.float32,0x3ab1ec,0xc2fe3fea,3
+np.float32,0x4fbf58,0xc2fd5d82,3
+np.float32,0x3dea141b,0xc0484403,3
+np.float32,0x7d86ad3b,0x42f8258f,3
+np.float32,0x7f345315,0x42fefd29,3
+np.float32,0x3f3752fe,0xbef6a780,3
+np.float32,0x64830d,0xc2fcb293,3
+np.float32,0x3d9dc1eb,0xc06cb32a,3
+np.float32,0x3f2f935a,0xbf0b46f6,3
+np.float32,0xb90a4,0xc30177e3,3
+np.float32,0x4111dd,0xc2fdf3c1,3
+np.float32,0x3d4cd078,0xc08a4c68,3
+np.float32,0x3e95c3f1,0xbfe30011,3
+np.float32,0x3ec9f356,0xbfabcb4e,3
+np.float32,0x1b90d5,0xc3003717,3
+np.float32,0xee70f,0xc3011a3e,3
+np.float32,0x7fa00000,0x7fe00000,3
+np.float32,0x3f74cdb6,0xbd8422af,3
+np.float32,0x3d9b56fe,0xc06e2037,3
+np.float32,0x3f1853df,0xbf3fbc40,3
+np.float32,0x7d86a011,0x42f82547,3
+np.float32,0x3dff9629,0xc0402634,3
+np.float32,0x46f8c9,0xc2fdb39f,3
+np.float32,0x3e9b410b,0xbfdc5a87,3
+np.float32,0x3f5aed42,0xbe671cac,3
+np.float32,0x3b739886,0xc101257f,3
+np.float64,0x3fe2f58d6565eb1b,0xbfe82a641138e19a,2
+np.float64,0x3fee7f0642fcfe0d,0xbfb1c702f6974932,2
+np.float64,0x25b71f244b6e5,0xc090030d3b3c5d2b,2
+np.float64,0x8c9cc8e1193b,0xc0900b752a678fa8,2
+np.float64,0x3fd329b5d326536c,0xbffbd607f6db945c,2
+np.float64,0x3fb5109b3a2a2136,0xc00cd36bd15dfb18,2
+np.float64,0x3fd5393ae12a7276,0xbff97a7e4a157154,2
+np.float64,0x3fd374d1b926e9a3,0xbffb7c3e1a3a7ed3,2
+np.float64,0x3fe2c7f4e2658fea,0xbfe899f15ca78fcb,2
+np.float64,0x7fe3d6b81ee7ad6f,0x408ffa7b63d407ee,2
+np.float64,0x3fe086d097e10da1,0xbfee81456ce8dd03,2
+np.float64,0x7fd374a64ca6e94c,0x408ff241c7306d39,2
+np.float64,0x3fc0709a5b20e135,0xc007afdede31b29c,2
+np.float64,0x3fd4218f4b28431f,0xbffab2c696966e2d,2
+np.float64,0x143134c828628,0xc09006a8372c4d8a,2
+np.float64,0x3f8bd0aa0037a154,0xc018cf0e8b9c3107,2
+np.float64,0x7fe0ce905ee19d20,0x408ff8915e71bd67,2
+np.float64,0x3fda0f5f32b41ebe,0xbff4bd5e0869e820,2
+np.float64,0x7fe9ae63d0b35cc7,0x408ffd760ca4f292,2
+np.float64,0x3fe75abd9eeeb57b,0xbfdd1476fc8b3089,2
+np.float64,0x786c3110f0d87,0xc08ff8b44cedbeea,2
+np.float64,0x22c5fe80458d,0xc09013853591c2f2,2
+np.float64,0x3fdc250797384a0f,0xbff2f6a02c961f0b,2
+np.float64,0x3fa2b367b02566cf,0xc013199238485054,2
+np.float64,0x3fd26a910ca4d522,0xbffcc0e2089b1c0c,2
+np.float64,0x8068d3b300d1b,0xc08ff7f690210aac,2
+np.float64,0x3fe663bfa9ecc77f,0xbfe07cd95a43a5ce,2
+np.float64,0x3fd0ddb07321bb61,0xbffec886665e895e,2
+np.float64,0x3f91c730b0238e61,0xc0176452badc8d22,2
+np.float64,0x4dd10d309ba22,0xc08ffdbe738b1d8d,2
+np.float64,0x7fe322afa4a6455e,0x408ffa10c038f9de,2
+np.float64,0x7fdf7f7c42befef8,0x408ff7d147ddaad5,2
+np.float64,0x7fd673f386ace7e6,0x408ff3e920d00eef,2
+np.float64,0x3feaebfcadb5d7f9,0xbfcfe8ec27083478,2
+np.float64,0x3fdc6dc23738db84,0xbff2bb46794f07b8,2
+np.float64,0xcd8819599b103,0xc08ff288c5b2cf0f,2
+np.float64,0xfda00e77fb402,0xc08ff01b895d2236,2
+np.float64,0x840b02ff08161,0xc08ff7a41e41114c,2
+np.float64,0x3fbdce3a383b9c74,0xc008d1e61903a289,2
+np.float64,0x3fd24ed3c4a49da8,0xbffce3c12136b6d3,2
+np.float64,0x3fe8d0834131a107,0xbfd77b194e7051d4,2
+np.float64,0x3fdd0cb11aba1962,0xbff23b9dbd554455,2
+np.float64,0x1a32d97e3465c,0xc090052781a37271,2
+np.float64,0x3fdb09d2b1b613a5,0xbff3e396b862bd83,2
+np.float64,0x3fe04c848aa09909,0xbfef2540dd90103a,2
+np.float64,0x3fce0c48613c1891,0xc000b9f76877d744,2
+np.float64,0x3fc37109a226e213,0xc005c05d8b2b9a2f,2
+np.float64,0x81cf3837039e7,0xc08ff7d686517dff,2
+np.float64,0xd9342c29b2686,0xc08ff1e591c9a895,2
+np.float64,0x7fec731b0638e635,0x408ffea4884550a9,2
+np.float64,0x3fba0fc138341f82,0xc00a5e839b085f64,2
+np.float64,0x7fdda893b03b5126,0x408ff71f7c5a2797,2
+np.float64,0xd2a4bb03a5498,0xc08ff2402f7a907c,2
+np.float64,0x3fea61fb0d34c3f6,0xbfd1d293fbe76183,2
+np.float64,0x3fed5cf486fab9e9,0xbfbfc2e01a7ffff1,2
+np.float64,0x3fcbabc2bf375785,0xc001ad7750c9dbdf,2
+np.float64,0x3fdb5fff53b6bfff,0xbff39a7973a0c6a5,2
+np.float64,0x7feef05a00bde0b3,0x408fff9c5cbc8651,2
+np.float64,0xb1cf24f1639e5,0xc08ff434de10fffb,2
+np.float64,0x3fa583989c2b0731,0xc0124a8a3bbf18ce,2
+np.float64,0x7feae90bf9f5d217,0x408ffe002e7bbbea,2
+np.float64,0x3fe9ef41c4b3de84,0xbfd367878ae4528e,2
+np.float64,0x9be24ce337c4a,0xc08ff5b9b1c31cf9,2
+np.float64,0x3fe916894cb22d13,0xbfd677f915d58503,2
+np.float64,0x3fec1bab20f83756,0xbfc7f2777aabe8ee,2
+np.float64,0x3feaabf2873557e5,0xbfd0d11f28341233,2
+np.float64,0x3fd4d3c3b529a787,0xbff9e9e47acc8ca9,2
+np.float64,0x3fe4cfe96c699fd3,0xbfe3dc53fa739169,2
+np.float64,0xccfdb97399fb7,0xc08ff2908d893400,2
+np.float64,0x3fec7598be78eb31,0xbfc5a750f8f3441a,2
+np.float64,0x355be5fc6ab7e,0xc090010ca315b50b,2
+np.float64,0x3fba9f9074353f21,0xc00a1f80eaf5e581,2
+np.float64,0x7fdcaff189395fe2,0x408ff6bd1c5b90d9,2
+np.float64,0x3fd94d3b64b29a77,0xbff56be1b43d25f3,2
+np.float64,0x4e5f29949cbe6,0xc08ffda972da1d73,2
+np.float64,0x3fe654e2d9aca9c6,0xbfe09b88dcd8f15d,2
+np.float64,0x7fdc130190b82602,0x408ff67d496c1a27,2
+np.float64,0x3fbcd4701e39a8e0,0xc009343e36627e80,2
+np.float64,0x7fdaa4d38f3549a6,0x408ff5e2c6d8678f,2
+np.float64,0x3febe95e5237d2bd,0xbfc93e16d453fe3a,2
+np.float64,0x9ef5ca553deba,0xc08ff57ff4f7883d,2
+np.float64,0x7fe878e91170f1d1,0x408ffce795868fc8,2
+np.float64,0x3fe63dff466c7bff,0xbfe0caf2b79c9e5f,2
+np.float64,0x6561446ccac29,0xc08ffab0e383834c,2
+np.float64,0x30c6c2ae618d9,0xc09001914b30381b,2
+np.float64,0x7ff0000000000000,0x7ff0000000000000,2
+np.float64,0x3fe5c9daf1ab93b6,0xbfe1be81baf4dbdb,2
+np.float64,0x3fe0a03e24a1407c,0xbfee3a73c4c0e8f8,2
+np.float64,0xff2a2cf3fe546,0xc08ff009a7e6e782,2
+np.float64,0x7fcf0332213e0663,0x408fefa36235e210,2
+np.float64,0x3fb612affc2c2560,0xc00c494be9c8c33b,2
+np.float64,0x3fd2b259702564b3,0xbffc67967f077e75,2
+np.float64,0x7fcb63685d36c6d0,0x408fee343343f913,2
+np.float64,0x3fe369f1d5a6d3e4,0xbfe71251139939ad,2
+np.float64,0x3fdd17c618ba2f8c,0xbff232d11c986251,2
+np.float64,0x3f92cc8040259901,0xc01711d8e06b52ee,2
+np.float64,0x69a81dc2d3504,0xc08ffa36cdaf1141,2
+np.float64,0x3fea0fad99b41f5b,0xbfd2f4625a652645,2
+np.float64,0xd1cd5799a39ab,0xc08ff24c02b90d26,2
+np.float64,0x324e59ce649cc,0xc0900163ad091c76,2
+np.float64,0x3fc3d460a227a8c1,0xc00585f903dc7a7f,2
+np.float64,0xa7185ec74e30c,0xc08ff4ec7d65ccd9,2
+np.float64,0x3fa254eaac24a9d5,0xc01337053963321a,2
+np.float64,0x3feaeb112435d622,0xbfcfef3be17f81f6,2
+np.float64,0x60144c3ac028a,0xc08ffb4f8eb94595,2
+np.float64,0x7fa4d2ec6829a5d8,0x408fdb0a9670ab83,2
+np.float64,0x3fed1372f97a26e6,0xbfc1b1fe50d48a55,2
+np.float64,0x3fd5ade5972b5bcb,0xbff8fcf28f525031,2
+np.float64,0x7fe72e335bee5c66,0x408ffc4759236437,2
+np.float64,0x7fdfafab143f5f55,0x408ff7e2e22a8129,2
+np.float64,0x3fe90d0db9321a1b,0xbfd69ae5fe10eb9e,2
+np.float64,0x7fe20a59072414b1,0x408ff962a2492484,2
+np.float64,0x3fed853690bb0a6d,0xbfbdc9dc5f199d2b,2
+np.float64,0x3fd709d469ae13a9,0xbff795a218deb700,2
+np.float64,0x3fe21c35f5e4386c,0xbfea47d71789329b,2
+np.float64,0x9ea5ec053d4be,0xc08ff585c2f6b7a3,2
+np.float64,0x3fc0580f9e20b01f,0xc007c1268f49d037,2
+np.float64,0xd99127abb3225,0xc08ff1e0a1ff339d,2
+np.float64,0x3fdc8c9bbfb91937,0xbff2a2478354effb,2
+np.float64,0x3fe15fc6b162bf8d,0xbfec323ac358e008,2
+np.float64,0xffefffffffffffff,0x7ff8000000000000,2
+np.float64,0x3fee341afb3c6836,0xbfb556b6faee9a84,2
+np.float64,0x3fe4b64c56296c99,0xbfe4154835ad2afe,2
+np.float64,0x85de22810bbc5,0xc08ff77b914fe5b5,2
+np.float64,0x3fd22c72e3a458e6,0xbffd0f4269d20bb9,2
+np.float64,0xc090e5218123,0xc09009a4a65a8a8f,2
+np.float64,0x7fd9641692b2c82c,0x408ff5547782bdfc,2
+np.float64,0x3fd9b9cb28b37396,0xbff509a8fb59a9f1,2
+np.float64,0x3fcd2726f93a4e4e,0xc001135059a22117,2
+np.float64,0x3fa4b493d4296928,0xc0128323c7a55f4a,2
+np.float64,0x47455e788e8ac,0xc08ffec2101c1e82,2
+np.float64,0x3fe0d7e2e261afc6,0xbfeda0f1e2d0f4bd,2
+np.float64,0x3fe860fc5b70c1f9,0xbfd91dc42eaf72c2,2
+np.float64,0xa5d7805b4baf0,0xc08ff502bc819ff6,2
+np.float64,0xd83395b1b0673,0xc08ff1f33c3f94c2,2
+np.float64,0x3f865972e02cb2e6,0xc01a1243651565c8,2
+np.float64,0x52fc6952a5f8e,0xc08ffd006b158179,2
+np.float64,0x7fecac6c793958d8,0x408ffebbb1c09a70,2
+np.float64,0x7fe621ff606c43fe,0x408ffbbeb2b1473a,2
+np.float64,0x3fdb9f3f9db73e7f,0xbff365610c52bda7,2
+np.float64,0x7feab92992757252,0x408ffdeb92a04813,2
+np.float64,0xcc46c79f988d9,0xc08ff29adf03fb7c,2
+np.float64,0x3fe3156a03262ad4,0xbfe7dd0f598781c7,2
+np.float64,0x3fc00e3a61201c75,0xc007f5c121a87302,2
+np.float64,0x3fdce8e9f739d1d4,0xbff2581d41ef50ef,2
+np.float64,0x0,0xfff0000000000000,2
+np.float64,0x7d373ac4fa6e8,0xc08ff840fa8beaec,2
+np.float64,0x3fee41e0653c83c1,0xbfb4ae786f2a0d54,2
+np.float64,0x3ff0000000000000,0x0,2
+np.float64,0x7feca6fff9794dff,0x408ffeb982a70556,2
+np.float64,0x7fc532716d2a64e2,0x408feb3f0f6c095b,2
+np.float64,0x3fe4ec2954a9d853,0xbfe39dd44aa5a040,2
+np.float64,0x7fd3321d52a6643a,0x408ff21a0ab9cd85,2
+np.float64,0x7fd8f1b2dfb1e365,0x408ff52001fa7922,2
+np.float64,0x3fee5e58cabcbcb2,0xbfb3539734a24d8b,2
+np.float64,0x3feebf6e7dfd7edd,0xbfad7c648f025102,2
+np.float64,0x6008026ec0101,0xc08ffb5108b54a93,2
+np.float64,0x3fea06f5e2340dec,0xbfd3134a48283360,2
+np.float64,0x41cad13c8395b,0xc08fffae654b2426,2
+np.float64,0x7fedb5c9353b6b91,0x408fff249f1f32b6,2
+np.float64,0xe00c5af9c018c,0xc08ff189e68c655f,2
+np.float64,0x7feac398ddf58731,0x408ffdf01374de9f,2
+np.float64,0x3fed21127c7a4225,0xbfc15b8cf55628fa,2
+np.float64,0x3fd3446711a688ce,0xbffbb5f7252a9fa3,2
+np.float64,0x7fe75fa07a6ebf40,0x408ffc5fdb096018,2
+np.float64,0x3feeb1618cbd62c3,0xbfaece3bd0863070,2
+np.float64,0x7f5226e180244dc2,0x408fb174d506e52f,2
+np.float64,0x3fcd67deca3acfbe,0xc000f9cd7a490749,2
+np.float64,0xdc6f30efb8de6,0xc08ff1b9f2a22d2e,2
+np.float64,0x9c14931338293,0xc08ff5b5f975ec5d,2
+np.float64,0x7fe93e802df27cff,0x408ffd4354eba0e0,2
+np.float64,0x3feb92ae5077255d,0xbfcb7f2084e44dbb,2
+np.float64,0xd78dbfddaf1b8,0xc08ff1fc19fa5a13,2
+np.float64,0x7fe14c301fa2985f,0x408ff8e666cb6592,2
+np.float64,0xbda3d8b77b47b,0xc08ff37689f4b2e5,2
+np.float64,0x8a42953b14853,0xc08ff71c2db3b8cf,2
+np.float64,0x7fe4ca7e186994fb,0x408ffb05e94254a7,2
+np.float64,0x7fe92ffc5e325ff8,0x408ffd3cb0265b12,2
+np.float64,0x91b262912364d,0xc08ff681619be214,2
+np.float64,0x33fe2b0667fc6,0xc0900132f3fab55e,2
+np.float64,0x3fde10e9183c21d2,0xbff17060fb4416c7,2
+np.float64,0xb6b811cb6d702,0xc08ff3e46303b541,2
+np.float64,0x3fe4a7bda0a94f7b,0xbfe435c6481cd0e3,2
+np.float64,0x7fd9fe6057b3fcc0,0x408ff599c79a822c,2
+np.float64,0x3fef44bf917e897f,0xbfa11484e351a6e9,2
+np.float64,0x3fe57d701daafae0,0xbfe2618ab40fc01b,2
+np.float64,0x7fe52d2adbaa5a55,0x408ffb3c2fb1c99d,2
+np.float64,0xb432f66d6865f,0xc08ff40d6b4084fe,2
+np.float64,0xbff0000000000000,0x7ff8000000000000,2
+np.float64,0x7fecd2292bf9a451,0x408ffecad860de6f,2
+np.float64,0x3fddd2ae153ba55c,0xbff1a059adaca33e,2
+np.float64,0x3fee55d6e5bcabae,0xbfb3bb1c6179d820,2
+np.float64,0x7fc1d0085623a010,0x408fe93d16ada7a7,2
+np.float64,0x829b000105360,0xc08ff7c47629a68f,2
+np.float64,0x7fe1e0257523c04a,0x408ff94782cf0717,2
+np.float64,0x7fd652f9ad2ca5f2,0x408ff3d820ec892e,2
+np.float64,0x3fef2246203e448c,0xbfa444ab6209d8cd,2
+np.float64,0x3fec6c0ae178d816,0xbfc5e559ebd4e790,2
+np.float64,0x3fe6ddfee92dbbfe,0xbfdf06dd7d3fa7a8,2
+np.float64,0x3fb7fbcbea2ff798,0xc00b5404d859d148,2
+np.float64,0x7feb9a154d37342a,0x408ffe4b26c29e55,2
+np.float64,0x3fe4db717aa9b6e3,0xbfe3c2c6b3ef13bc,2
+np.float64,0x3fbae17dda35c2fc,0xc00a030f7f4b37e7,2
+np.float64,0x7fd632b9082c6571,0x408ff3c76826ef19,2
+np.float64,0x7fc4184a15283093,0x408feaa14adf00be,2
+np.float64,0x3fe052d19920a5a3,0xbfef136b5df81a3e,2
+np.float64,0x7fe38b872b67170d,0x408ffa4f51aafc86,2
+np.float64,0x3fef9842d03f3086,0xbf92d3d2a21d4be2,2
+np.float64,0x9cea662139d4d,0xc08ff5a634810daa,2
+np.float64,0x3fe35f0855e6be11,0xbfe72c4b564e62aa,2
+np.float64,0x3fecee3d3779dc7a,0xbfc29ee942f8729e,2
+np.float64,0x3fe7903fd72f2080,0xbfdc41db9b5f4048,2
+np.float64,0xb958889572b11,0xc08ff3ba366cf84b,2
+np.float64,0x3fcb3a67c53674d0,0xc001dd21081ad1ea,2
+np.float64,0xe3b1b53fc7637,0xc08ff15a3505e1ce,2
+np.float64,0xe5954ae9cb2aa,0xc08ff141cbbf0ae4,2
+np.float64,0x3fe394af74e7295f,0xbfe6ad1d13f206e8,2
+np.float64,0x7fe21dd704643bad,0x408ff96f13f80c1a,2
+np.float64,0x3fd23a7cf02474fa,0xbffcfd7454117a05,2
+np.float64,0x7fe257515e24aea2,0x408ff99378764d52,2
+np.float64,0x7fe4c5d0a6e98ba0,0x408ffb03503cf939,2
+np.float64,0x3fadc2c1603b8583,0xc0106b2c17550e3a,2
+np.float64,0x3fc0f7f02421efe0,0xc007525ac446864c,2
+np.float64,0x3feaf0b27275e165,0xbfcfc8a03eaa32ad,2
+np.float64,0x5ce7503cb9ceb,0xc08ffbb2de365fa8,2
+np.float64,0x2a0014f654003,0xc090026e41761a0d,2
+np.float64,0x7fe2c848a8e59090,0x408ff9d9b723ee89,2
+np.float64,0x7f66f54bc02dea97,0x408fbc2ae0ec5623,2
+np.float64,0xa35a890146b6,0xc0900a97b358ddbd,2
+np.float64,0x7fee267ded7c4cfb,0x408fff501560c9f5,2
+np.float64,0x3fe07c328520f865,0xbfee9ef7c3435b58,2
+np.float64,0x3fe67122cf6ce246,0xbfe06147001932ba,2
+np.float64,0x3fdacc8925359912,0xbff41824cece219e,2
+np.float64,0xffa3047fff461,0xc08ff00431ec9be3,2
+np.float64,0x3e1af43e7c35f,0xc090002c6573d29b,2
+np.float64,0x86fa94590df53,0xc08ff7632525ed92,2
+np.float64,0x7fec4c76227898eb,0x408ffe94d032c657,2
+np.float64,0x7fe2274ce1e44e99,0x408ff975194cfdff,2
+np.float64,0x7fe670e1b4ace1c2,0x408ffbe78cc451de,2
+np.float64,0x7fe853871db0a70d,0x408ffcd5e6a6ff47,2
+np.float64,0x3fcbf265db37e4cc,0xc0019026336e1176,2
+np.float64,0x3fef033cef3e067a,0xbfa726712eaae7f0,2
+np.float64,0x5d74973abae94,0xc08ffba15e6bb992,2
+np.float64,0x7fdd9c99b6bb3932,0x408ff71ad24a7ae0,2
+np.float64,0xbdc8e09b7b91c,0xc08ff3744939e9a3,2
+np.float64,0xdbfcff71b7fa0,0xc08ff1bfeecc9dfb,2
+np.float64,0xf9b38cf5f3672,0xc08ff0499af34a43,2
+np.float64,0x3fea820aa6b50415,0xbfd162a38e1927b1,2
+np.float64,0x3fe67f59a12cfeb3,0xbfe04412adca49dc,2
+np.float64,0x3feb301d9c76603b,0xbfce17e6edeb92d5,2
+np.float64,0x828ce00b0519c,0xc08ff7c5b5c57cde,2
+np.float64,0x4f935e229f26c,0xc08ffd7c67c1c54f,2
+np.float64,0x7fcd139e023a273b,0x408feee4f12ff11e,2
+np.float64,0x666a9944ccd54,0xc08ffa92d5e5cd64,2
+np.float64,0x3fe792f0fa6f25e2,0xbfdc374fda28f470,2
+np.float64,0xe996029bd32c1,0xc08ff10eb9b47a11,2
+np.float64,0x3fe7b0dd1eef61ba,0xbfdbc2676dc77db0,2
+np.float64,0x7fd3ec0127a7d801,0x408ff287bf47e27d,2
+np.float64,0x3fe793a8ea6f2752,0xbfdc347f7717e48d,2
+np.float64,0x7fdb89d15e3713a2,0x408ff64457a13ea2,2
+np.float64,0x3fe35b3cbbe6b679,0xbfe73557c8321b70,2
+np.float64,0x66573c94ccae8,0xc08ffa9504af7eb5,2
+np.float64,0x3fc620a2302c4144,0xc00442036b944a67,2
+np.float64,0x49b2fe0693660,0xc08ffe5f131c3c7e,2
+np.float64,0x7fda936cdfb526d9,0x408ff5db3ab3f701,2
+np.float64,0xc774ceef8ee9a,0xc08ff2e16d082fa1,2
+np.float64,0x4da9f8a09b55,0xc0900ee2206d0c88,2
+np.float64,0x3fe2ca5d5ae594bb,0xbfe89406611a5f1a,2
+np.float64,0x7fe0832497e10648,0x408ff85d1de6056e,2
+np.float64,0x3fe6a9e3222d53c6,0xbfdfda35a9bc2de1,2
+np.float64,0x3fed3d92c8ba7b26,0xbfc0a73620db8b98,2
+np.float64,0x3fdd2ec093ba5d81,0xbff2209cf78ce3f1,2
+np.float64,0x62fcb968c5f98,0xc08ffaf775a593c7,2
+np.float64,0xfcfb019ff9f60,0xc08ff0230e95bd16,2
+np.float64,0x3fd7a63e8f2f4c7d,0xbff6faf4fff7dbe0,2
+np.float64,0x3fef23b0ec3e4762,0xbfa4230cb176f917,2
+np.float64,0x340d1e6a681a5,0xc09001314b68a0a2,2
+np.float64,0x7fc0b85ba02170b6,0x408fe8821487b802,2
+np.float64,0x7fe9976e84f32edc,0x408ffd6bb6aaf467,2
+np.float64,0x329a0e9e65343,0xc090015b044e3270,2
+np.float64,0x3fea4928d3f49252,0xbfd2299b05546eab,2
+np.float64,0x3f188c70003118e0,0xc02ac3ce23bc5d5a,2
+np.float64,0x3fecce5020b99ca0,0xbfc36b23153d5f50,2
+np.float64,0x3fe203873e24070e,0xbfea86edb3690830,2
+np.float64,0x3fe02d9eaa205b3d,0xbfef7d18c54a76d2,2
+np.float64,0xef7537ebdeea7,0xc08ff0c55e9d89e7,2
+np.float64,0x3fedf7572efbeeae,0xbfb840af357cf07c,2
+np.float64,0xd1a97a61a354,0xc0900926fdfb96cc,2
+np.float64,0x7fe6a0daeced41b5,0x408ffc001edf1407,2
+np.float64,0x3fe5063625aa0c6c,0xbfe3647cfb949d62,2
+np.float64,0x7fe9b28d31736519,0x408ffd77eb4a922b,2
+np.float64,0x7feea90d033d5219,0x408fff81a4bbff62,2
+np.float64,0x3fe9494d17f2929a,0xbfd5bde02eb5287a,2
+np.float64,0x7feee17a8cbdc2f4,0x408fff96cf0dc16a,2
+np.float64,0xb2ad18ef655a3,0xc08ff4267eda8af8,2
+np.float64,0x3fad3b52683a76a5,0xc01085ab75b797ce,2
+np.float64,0x2300a65846016,0xc090037b81ce9500,2
+np.float64,0x3feb1041f9b62084,0xbfcef0c87d8b3249,2
+np.float64,0x3fdd887d3e3b10fa,0xbff1da0e1ede6db2,2
+np.float64,0x3fd3e410eb27c822,0xbffaf9b5fc9cc8cc,2
+np.float64,0x3fe0aa53e3e154a8,0xbfee1e7b5c486578,2
+np.float64,0x7fe33e389aa67c70,0x408ffa214fe50961,2
+np.float64,0x3fd27e3a43a4fc75,0xbffca84a79e8adeb,2
+np.float64,0x3fb309e0082613c0,0xc00dfe407b77a508,2
+np.float64,0x7feaf2ed8cf5e5da,0x408ffe046a9d1ba9,2
+np.float64,0x1e76167a3cec4,0xc0900448cd35ec67,2
+np.float64,0x3fe0a18e1721431c,0xbfee36cf1165a0d4,2
+np.float64,0x3fa73b78c02e76f2,0xc011d9069823b172,2
+np.float64,0x3fef6d48287eda90,0xbf9ab2d08722c101,2
+np.float64,0x8fdf0da31fbe2,0xc08ff6a6a2accaa1,2
+np.float64,0x3fc3638db826c71b,0xc005c86191688826,2
+np.float64,0xaa9c09c555381,0xc08ff4aefe1d9473,2
+np.float64,0x7fccb0f4523961e8,0x408feebd84773f23,2
+np.float64,0xede75dcfdbcec,0xc08ff0d89ba887d1,2
+np.float64,0x7f8a051520340a29,0x408fcd9cc17f0d95,2
+np.float64,0x3fef5ca2babeb945,0xbf9dc221f3618e6a,2
+np.float64,0x7fea0ff4bcf41fe8,0x408ffda193359f22,2
+np.float64,0x7fe05c53fd20b8a7,0x408ff841dc7123e8,2
+np.float64,0x3fc625664b2c4acd,0xc0043f8749b9a1d8,2
+np.float64,0x7fed58f98f7ab1f2,0x408fff00585f48c2,2
+np.float64,0x3fb3e5e51427cbca,0xc00d7bcb6528cafe,2
+np.float64,0x3fe728bd3d6e517a,0xbfdddafa72bd0f60,2
+np.float64,0x3fe3f005dd27e00c,0xbfe5d7b3ec93bca0,2
+np.float64,0x3fd74fbd1a2e9f7a,0xbff750001b63ce81,2
+np.float64,0x3fd3af6d85a75edb,0xbffb371d678d11b4,2
+np.float64,0x7fa690ad8c2d215a,0x408fdbf7db9c7640,2
+np.float64,0x3fbdfd38e23bfa72,0xc008bfc1c5c9b89e,2
+np.float64,0x3fe2374684a46e8d,0xbfea030c4595dfba,2
+np.float64,0x7fc0806c372100d7,0x408fe85b36fee334,2
+np.float64,0x3fef3ac47b7e7589,0xbfa2007195c5213f,2
+np.float64,0x3fb55473922aa8e7,0xc00cae7af8230e0c,2
+np.float64,0x7fe018dc152031b7,0x408ff811e0d712fa,2
+np.float64,0x3fe3b3fca56767f9,0xbfe6638ae2c99c62,2
+np.float64,0x7fac79818c38f302,0x408fdea720b39c3c,2
+np.float64,0x7fefffffffffffff,0x4090000000000000,2
+np.float64,0xd2b290cba5652,0xc08ff23f6d7152a6,2
+np.float64,0x7fc5848eb52b091c,0x408feb6b6f8b77d0,2
+np.float64,0xf399f62de733f,0xc08ff092ae319ad8,2
+np.float64,0x7fdec56c12bd8ad7,0x408ff78c4ddbc667,2
+np.float64,0x3fca640f1e34c81e,0xc0023969c5cbfa4c,2
+np.float64,0x3fd55225db2aa44c,0xbff95f7442a2189e,2
+np.float64,0x7fefa009a97f4012,0x408fffdd2f42ef9f,2
+np.float64,0x4a3b70609478,0xc0900f24e449bc3d,2
+np.float64,0x7fe3738b1ba6e715,0x408ffa411f2cb5e7,2
+np.float64,0x7fe5e53f0b6bca7d,0x408ffb9ed8d95cea,2
+np.float64,0x3fe274dd24a4e9ba,0xbfe967fb114b2a83,2
+np.float64,0x3fcbc58b8c378b17,0xc001a2bb1e158bcc,2
+np.float64,0x3fefc2c0043f8580,0xbf862c9b464dcf38,2
+np.float64,0xc2c4fafd858a0,0xc08ff327aecc409b,2
+np.float64,0x3fd8bc39a9b17873,0xbff5f1ad46e5a51c,2
+np.float64,0x3fdf341656be682d,0xbff094f41e7cb4c4,2
+np.float64,0x3fef8495c13f092c,0xbf966cf6313bae4c,2
+np.float64,0x3fe14e0f05229c1e,0xbfec6166f26b7161,2
+np.float64,0x3fed42d3b2ba85a7,0xbfc0860b773d35d8,2
+np.float64,0x7fd92bbac5b25775,0x408ff53abcb3fe0c,2
+np.float64,0xb1635b6f62c6c,0xc08ff43bdf47accf,2
+np.float64,0x4a3a2dbc94746,0xc08ffe49fabddb36,2
+np.float64,0x87d831290fb06,0xc08ff750419dc6fb,2
+np.float64,0x3fec4713f7f88e28,0xbfc6d6217c9f5cf9,2
+np.float64,0x7fed43ba2d3a8773,0x408ffef7fa2fc303,2
+np.float64,0x7fd1ec5b56a3d8b6,0x408ff14f62615f1e,2
+np.float64,0x3fee534b6c7ca697,0xbfb3da1951aa3e68,2
+np.float64,0x3febb564c2b76aca,0xbfca9737062e55e7,2
+np.float64,0x943e6b0f287ce,0xc08ff64e2d09335c,2
+np.float64,0xf177d957e2efb,0xc08ff0acab2999fa,2
+np.float64,0x7fb5b881a82b7102,0x408fe3872b4fde5e,2
+np.float64,0x3fdb2b4a97b65695,0xbff3c715c91359bc,2
+np.float64,0x3fac0a17e4381430,0xc010c330967309fb,2
+np.float64,0x7fd8057990b00af2,0x408ff4b0a287a348,2
+np.float64,0x1f9026a23f206,0xc09004144f3a19dd,2
+np.float64,0x3fdb2977243652ee,0xbff3c8a2fd05803d,2
+np.float64,0x3fe0f6e74b21edcf,0xbfed4c3bb956bae0,2
+np.float64,0xde9cc3bbbd399,0xc08ff19ce5c1e762,2
+np.float64,0x3fe72ce106ae59c2,0xbfddca7ab14ceba2,2
+np.float64,0x3fa8ee14e031dc2a,0xc01170d54ca88e86,2
+np.float64,0x3fe0b09bbb216137,0xbfee0d189a95b877,2
+np.float64,0x7fdfdcb157bfb962,0x408ff7f33cf2afea,2
+np.float64,0x3fef84d5f53f09ac,0xbf966134e2a154f4,2
+np.float64,0x3fea0e0b1bb41c16,0xbfd2fa2d36637d19,2
+np.float64,0x1ab76fd6356ef,0xc090050a9616ffbd,2
+np.float64,0x7fd0ccf79a2199ee,0x408ff09045af2dee,2
+np.float64,0x7fea929345f52526,0x408ffddadc322b07,2
+np.float64,0x3fe9ef629cf3dec5,0xbfd367129c166838,2
+np.float64,0x3feedf0ea2fdbe1d,0xbfaa862afca44c00,2
+np.float64,0x7fce725f723ce4be,0x408fef6cfd2769a8,2
+np.float64,0x7fe4313b3ca86275,0x408ffaaf9557ef8c,2
+np.float64,0xe2d46463c5a8d,0xc08ff165725c6b08,2
+np.float64,0x7fbacb4ace359695,0x408fe5f3647bd0d5,2
+np.float64,0x3fbafd009635fa01,0xc009f745a7a5c5d5,2
+np.float64,0x3fe3cea66ce79d4d,0xbfe6253b895e2838,2
+np.float64,0x7feaa71484354e28,0x408ffde3c0bad2a6,2
+np.float64,0x3fd755b8b42eab71,0xbff74a1444c6e654,2
+np.float64,0x3fc313e2172627c4,0xc005f830e77940c3,2
+np.float64,0x12d699a225ad4,0xc090070ec00f2338,2
+np.float64,0x3fa975fe8432ebfd,0xc01151b3da48b3f9,2
+np.float64,0x7fdce3103b39c61f,0x408ff6d19b3326fa,2
+np.float64,0x7fd341cbba268396,0x408ff2237490fdca,2
+np.float64,0x3fd8405885b080b1,0xbff6666d8802a7d5,2
+np.float64,0x3fe0f0cca3a1e199,0xbfed5cdb3e600791,2
+np.float64,0x7fbd56680c3aaccf,0x408fe6ff55bf378d,2
+np.float64,0x3f939c4f3027389e,0xc016d364dd6313fb,2
+np.float64,0x3fe9e87fac73d0ff,0xbfd37f9a2be4fe38,2
+np.float64,0x7fc93c6a883278d4,0x408fed4260e614f1,2
+np.float64,0x7fa88c0ff031181f,0x408fdcf09a46bd3a,2
+np.float64,0xd5487f99aa910,0xc08ff21b6390ab3b,2
+np.float64,0x3fe34acc96e69599,0xbfe75c9d290428fb,2
+np.float64,0x3fd17f5964a2feb3,0xbffdef50b524137b,2
+np.float64,0xe23dec0dc47be,0xc08ff16d1ce61dcb,2
+np.float64,0x3fec8bd64fb917ad,0xbfc5173941614b8f,2
+np.float64,0x3fc81d97d7303b30,0xc00343ccb791401d,2
+np.float64,0x7fe79ad18e2f35a2,0x408ffc7cf0ab0f2a,2
+np.float64,0x3f96306b402c60d7,0xc0161ce54754cac1,2
+np.float64,0xfb09fc97f6140,0xc08ff039d1d30123,2
+np.float64,0x3fec9c4afa793896,0xbfc4ace43ee46079,2
+np.float64,0x3f9262dac824c5b6,0xc01732a3a7eeb598,2
+np.float64,0x3fa5cd33f42b9a68,0xc01236ed4d315a3a,2
+np.float64,0x3fe7bb336caf7667,0xbfdb9a268a82e267,2
+np.float64,0xc6c338f98d867,0xc08ff2ebb8475bbc,2
+np.float64,0x3fd50714482a0e29,0xbff9b14a9f84f2c2,2
+np.float64,0xfff0000000000000,0x7ff8000000000000,2
+np.float64,0x3fde2cd0f93c59a2,0xbff15afe35a43a37,2
+np.float64,0xf1719cb9e2e34,0xc08ff0acf77b06d3,2
+np.float64,0xfd3caaf9fa796,0xc08ff020101771bd,2
+np.float64,0x7f750d63a02a1ac6,0x408fc32ad0caa362,2
+np.float64,0x7fcc50f4e238a1e9,0x408fee96a5622f1a,2
+np.float64,0x421d1da0843a4,0xc08fff9ffe62d869,2
+np.float64,0x3fd9e17023b3c2e0,0xbff4e631d687ee8e,2
+np.float64,0x3fe4999a09693334,0xbfe4556b3734c215,2
+np.float64,0xd619ef03ac33e,0xc08ff21013c85529,2
+np.float64,0x3fc4da522229b4a4,0xc004f150b2c573aa,2
+np.float64,0x3feb04b053b60961,0xbfcf3fc9e00ebc40,2
+np.float64,0x3fbedec5ea3dbd8c,0xc0086a33dc22fab5,2
+np.float64,0x7fec3b217ab87642,0x408ffe8dbc8ca041,2
+np.float64,0xdb257d33b64b0,0xc08ff1cb42d3c182,2
+np.float64,0x7fa2d92ec025b25d,0x408fd9e414d11cb0,2
+np.float64,0x3fa425c550284b8b,0xc012ab7cbf83be12,2
+np.float64,0x10b4869021692,0xc09007c0487d648a,2
+np.float64,0x7f97918c902f2318,0x408fd47867806574,2
+np.float64,0x3fe4f91238e9f224,0xbfe38160b4e99919,2
+np.float64,0x3fc2b1af6125635f,0xc00634343bc58461,2
+np.float64,0x3fc2a98071255301,0xc0063942bc8301be,2
+np.float64,0x3fe4cfc585299f8b,0xbfe3dca39f114f34,2
+np.float64,0x3fd1ea75b3a3d4eb,0xbffd63acd02c5406,2
+np.float64,0x3fd6bf48492d7e91,0xbff7e0cd249f80f9,2
+np.float64,0x76643d36ecc88,0xc08ff8e68f13b38c,2
+np.float64,0x7feeabab3e7d5755,0x408fff82a0fd4501,2
+np.float64,0x46c0d4a68d81b,0xc08ffed79abaddc9,2
+np.float64,0x3fd088d57ca111ab,0xbfff3dd0ed7128ea,2
+np.float64,0x3fed25887cba4b11,0xbfc13f47639bd645,2
+np.float64,0x7fd90984b4b21308,0x408ff52b022c7fb4,2
+np.float64,0x3fe6ef31daadde64,0xbfdec185760cbf21,2
+np.float64,0x3fe48dbe83291b7d,0xbfe47005b99920bd,2
+np.float64,0x3fdce8422f39d084,0xbff258a33a96cc8e,2
+np.float64,0xb8ecdef771d9c,0xc08ff3c0eca61b10,2
+np.float64,0x3fe9bbf9a03377f3,0xbfd41ecfdcc336b9,2
+np.float64,0x7fe2565339a4aca5,0x408ff992d8851eaf,2
+np.float64,0x3fe1693e3822d27c,0xbfec1919da2ca697,2
+np.float64,0x3fd3680488a6d009,0xbffb8b7330275947,2
+np.float64,0x7fbe4f3d2c3c9e79,0x408fe75fa3f4e600,2
+np.float64,0x7fd4cfef3ca99fdd,0x408ff308ee3ab50f,2
+np.float64,0x3fd9c9a51cb3934a,0xbff4fb7440055ce6,2
+np.float64,0x3fe08a9640a1152d,0xbfee76bd1bfbf5c2,2
+np.float64,0x3fef012c41fe0259,0xbfa757a2da7f9707,2
+np.float64,0x3fee653fe2fcca80,0xbfb2ffae0c95025c,2
+np.float64,0x7fd0776933a0eed1,0x408ff054e7b43d41,2
+np.float64,0x4c94e5c09929d,0xc08ffdedb7f49e5e,2
+np.float64,0xca3e3d17947c8,0xc08ff2b86dce2f7a,2
+np.float64,0x3fb528e1342a51c2,0xc00cc626c8e2d9ba,2
+np.float64,0xd774df81aee9c,0xc08ff1fd6f0a7548,2
+np.float64,0x3fc47a9b6128f537,0xc00526c577b80849,2
+np.float64,0x3fe29a6f6a6534df,0xbfe90a5f83644911,2
+np.float64,0x3fecda4f59f9b49f,0xbfc31e4a80c4cbb6,2
+np.float64,0x7fe51d44f5aa3a89,0x408ffb3382437426,2
+np.float64,0x3fd677fc412ceff9,0xbff82999086977e7,2
+np.float64,0x3fe2a3c7e7254790,0xbfe8f33415cdba9d,2
+np.float64,0x3fe6d8d1dc6db1a4,0xbfdf1bc61bc24dff,2
+np.float64,0x7febb32d8ef7665a,0x408ffe55a043ded1,2
+np.float64,0x60677860c0d0,0xc0900da2caa7d571,2
+np.float64,0x7390c2e0e7219,0xc08ff92df18bb5d2,2
+np.float64,0x3fca53711b34a6e2,0xc00240b07a9b529b,2
+np.float64,0x7fe7ce6dd8ef9cdb,0x408ffc961164ead9,2
+np.float64,0x7fc0c9de0d2193bb,0x408fe88e245767f6,2
+np.float64,0xc0ee217981dc4,0xc08ff343b77ea770,2
+np.float64,0x72bd4668e57a9,0xc08ff94323fd74fc,2
+np.float64,0x7fd6970e252d2e1b,0x408ff3fb1e2fead2,2
+np.float64,0x7fdcb61040396c20,0x408ff6bf926bc98f,2
+np.float64,0xda4faa25b49f6,0xc08ff1d68b3877f0,2
+np.float64,0x3feb344749f6688f,0xbfcdfba2d66c72c5,2
+np.float64,0x3fe2aa4284e55485,0xbfe8e32ae0683f57,2
+np.float64,0x3f8e8fcfd03d1fa0,0xc01843efb2129908,2
+np.float64,0x8000000000000000,0xfff0000000000000,2
+np.float64,0x3fd8e01155b1c023,0xbff5d0529dae9515,2
+np.float64,0x3fe8033f3370067e,0xbfda837c80b87e7c,2
+np.float64,0x7fc5bf831e2b7f05,0x408feb8ae3b039a0,2
+np.float64,0x3fd8dcdf5331b9bf,0xbff5d349e1ed422a,2
+np.float64,0x3fe58b4e302b169c,0xbfe243c9cbccde44,2
+np.float64,0x3fea8a2e47b5145d,0xbfd1464e37221894,2
+np.float64,0x75cd1e88eb9a4,0xc08ff8f553ef0475,2
+np.float64,0x7fcfc876e23f90ed,0x408fefebe6cc95e6,2
+np.float64,0x7f51aceb002359d5,0x408fb1263f9003fb,2
+np.float64,0x7fc2a1b877254370,0x408fe9c1ec52f8b9,2
+np.float64,0x7fd495810e292b01,0x408ff2e859414d31,2
+np.float64,0x7fd72048632e4090,0x408ff440690cebdb,2
+np.float64,0x7fd7aafaffaf6,0xc08ff803a390779f,2
+np.float64,0x7fe18067d4a300cf,0x408ff9090a02693f,2
+np.float64,0x3fdc1080f8b82102,0xbff3077bf44a89bd,2
+np.float64,0x3fc34a462f26948c,0xc005d777b3cdf139,2
+np.float64,0x3fe21e4a1fe43c94,0xbfea428acfbc6ea9,2
+np.float64,0x1f0d79083e1b0,0xc090042c65a7abf2,2
+np.float64,0x3fe8d0d15931a1a3,0xbfd779f6bbd4db78,2
+np.float64,0x3fe74578022e8af0,0xbfdd68b6c15e9f5e,2
+np.float64,0x50995dd0a132c,0xc08ffd56a5c8accf,2
+np.float64,0x3f9a6342b034c685,0xc0151ce1973c62bd,2
+np.float64,0x3f30856a00210ad4,0xc027e852f4d1fcbc,2
+np.float64,0x3febcf7646b79eed,0xbfc9e9cc9d12425c,2
+np.float64,0x8010000000000000,0x7ff8000000000000,2
+np.float64,0x3fdf520c02bea418,0xbff07ed5013f3062,2
+np.float64,0x3fe5433ecbea867e,0xbfe2df38968b6d14,2
+np.float64,0x3fb933a84e326751,0xc00ac1a144ad26c5,2
+np.float64,0x7b6d72c2f6daf,0xc08ff86b7a67f962,2
+np.float64,0xaef5dae75debc,0xc08ff46496bb2932,2
+np.float64,0x522d869aa45b1,0xc08ffd1d55281e98,2
+np.float64,0xa2462b05448c6,0xc08ff542fe0ac5fd,2
+np.float64,0x3fe2b71dd6e56e3c,0xbfe8c3690cf15415,2
+np.float64,0x3fe5778231aaef04,0xbfe26e495d09b783,2
+np.float64,0x3fe9b8d564f371ab,0xbfd42a161132970d,2
+np.float64,0x3f89ebc34033d787,0xc019373f90bfc7f1,2
+np.float64,0x3fe438ddc6e871bc,0xbfe53039341b0a93,2
+np.float64,0x873c75250e78f,0xc08ff75d8478dccd,2
+np.float64,0x807134cb00e27,0xc08ff7f5cf59c57a,2
+np.float64,0x3fac459878388b31,0xc010b6fe803bcdc2,2
+np.float64,0xca9dc7eb953b9,0xc08ff2b2fb480784,2
+np.float64,0x7feb38587bb670b0,0x408ffe21ff6d521e,2
+np.float64,0x7fd70e9b782e1d36,0x408ff437936b393a,2
+np.float64,0x3fa4037bbc2806f7,0xc012b55744c65ab2,2
+np.float64,0x3fd3d4637427a8c7,0xbffb0beebf4311ef,2
+np.float64,0x7fdabbda5db577b4,0x408ff5ecbc0d4428,2
+np.float64,0x7fda9be0a2b537c0,0x408ff5dee5d03d5a,2
+np.float64,0x7fe9c74396338e86,0x408ffd813506a18a,2
+np.float64,0x3fd058243e20b048,0xbfff822ffd8a7f21,2
+np.float64,0x3fe6aa6ca9ed54d9,0xbfdfd805629ff49e,2
+np.float64,0x3fd91431d5322864,0xbff5a025eea8c78b,2
+np.float64,0x7fe4d7f02329afdf,0x408ffb0d5d9b7878,2
+np.float64,0x3fe2954a12252a94,0xbfe917266e3e22d5,2
+np.float64,0x3fb25f7c8224bef9,0xc00e6764c81b3718,2
+np.float64,0x3fda4bddeeb497bc,0xbff4880638908c81,2
+np.float64,0x55dfd12eabbfb,0xc08ffc9b54ff4002,2
+np.float64,0x3fe8f399e031e734,0xbfd6f8e5c4dcd93f,2
+np.float64,0x3fd954a24832a945,0xbff56521f4707a06,2
+np.float64,0x3fdea911f2bd5224,0xbff0fcb2d0c2b2e2,2
+np.float64,0x3fe6b4ff8a2d69ff,0xbfdfacfc85cafeab,2
+np.float64,0x3fc7fa02042ff404,0xc00354e13b0767ad,2
+np.float64,0x3fe955088c72aa11,0xbfd593130f29949e,2
+np.float64,0xd7e74ec1afcea,0xc08ff1f74f61721c,2
+np.float64,0x3fe9d69c1ab3ad38,0xbfd3bf710a337e06,2
+np.float64,0x3fd85669a2b0acd3,0xbff65176143ccc1e,2
+np.float64,0x3fea99b285353365,0xbfd11062744783f2,2
+np.float64,0x3fe2c79f80a58f3f,0xbfe89ac33f990289,2
+np.float64,0x3f8332ba30266574,0xc01af2cb7b635783,2
+np.float64,0x30d0150061a1,0xc090119030f74c5d,2
+np.float64,0x3fdbf4cb06b7e996,0xbff31e5207aaa754,2
+np.float64,0x3fe6b56c216d6ad8,0xbfdfab42fb2941c5,2
+np.float64,0x7fc4dc239829b846,0x408feb0fb0e13fbe,2
+np.float64,0x3fd0ab85ef21570c,0xbfff0d95d6c7a35c,2
+np.float64,0x7fe13d75e5e27aeb,0x408ff8dc8efa476b,2
+np.float64,0x3fece3b832f9c770,0xbfc2e21b165d583f,2
+np.float64,0x3fe3a279c4e744f4,0xbfe68ca4fbb55dbf,2
+np.float64,0x3feb64659ef6c8cb,0xbfccb6204b6bf724,2
+np.float64,0x2279a6bc44f36,0xc0900391eeeb3e7c,2
+np.float64,0xb88046d571009,0xc08ff3c7b5b45300,2
+np.float64,0x7ff4000000000000,0x7ffc000000000000,2
+np.float64,0x3fe49af059a935e1,0xbfe4526c294f248f,2
+np.float64,0xa3e5508147cc,0xc0900a92ce5924b1,2
+np.float64,0x7fc56def3d2adbdd,0x408feb5f46c360e8,2
+np.float64,0x7fd99f3574333e6a,0x408ff56f3807987c,2
+np.float64,0x3fdc38d56fb871ab,0xbff2e667cad8f36a,2
+np.float64,0xd0b03507a1607,0xc08ff25bbcf8aa9d,2
+np.float64,0xc493f9078927f,0xc08ff30c5fa4e759,2
+np.float64,0x3fc86ddbcb30dbb8,0xc0031da1fcb56d75,2
+np.float64,0x7fe75dc395aebb86,0x408ffc5eef841491,2
+np.float64,0x1647618a2c8ed,0xc0900616ef9479c1,2
+np.float64,0xdf144763be289,0xc08ff196b527f3c9,2
+np.float64,0x3fe0b29da6a1653b,0xbfee078b5f4d7744,2
+np.float64,0x3feb055852b60ab1,0xbfcf3b4db5779a7a,2
+np.float64,0x3fe8bc1625f1782c,0xbfd7c739ade904bc,2
+np.float64,0x7fd19bfb8ea337f6,0x408ff11b2b55699c,2
+np.float64,0x3fed1d80d1ba3b02,0xbfc1722e8d3ce094,2
+np.float64,0x2d9c65925b38e,0xc09001f46bcd3bc5,2
+np.float64,0x7fed6f4d857ade9a,0x408fff091cf6a3b4,2
+np.float64,0x3fd070cd6ba0e19b,0xbfff5f7609ca29e8,2
+np.float64,0x7fea3508b8f46a10,0x408ffdb1f30bd6be,2
+np.float64,0x508b897ca1172,0xc08ffd58a0eb3583,2
+np.float64,0x7feba367b07746ce,0x408ffe4f0bf4bd4e,2
+np.float64,0x3fefebd5c4bfd7ac,0xbf6d20b4fcf21b69,2
+np.float64,0x3fd8ef07b8b1de0f,0xbff5c2745c0795a5,2
+np.float64,0x3fd38ed518271daa,0xbffb5d75f00f6900,2
+np.float64,0x6de0fecedbc20,0xc08ff9c307bbc647,2
+np.float64,0xafc0ffc35f820,0xc08ff45737e5d6b4,2
+np.float64,0x7fd282097ca50412,0x408ff1ae3b27bf3b,2
+np.float64,0x3fe2f2d50b65e5aa,0xbfe831042e6a1e99,2
+np.float64,0x3faa437bac3486f7,0xc01123d8d962205a,2
+np.float64,0x3feea54434fd4a88,0xbfaff202cc456647,2
+np.float64,0x3fc9e65b8633ccb7,0xc00270e77ffd19da,2
+np.float64,0x7fee15af61fc2b5e,0x408fff49a49154a3,2
+np.float64,0x7fefe670a73fcce0,0x408ffff6c44c1005,2
+np.float64,0x3fc0832d0f21065a,0xc007a2dc2f25384a,2
+np.float64,0x3fecfc96bcb9f92d,0xbfc24367c3912620,2
+np.float64,0x3feb705682b6e0ad,0xbfcc65b1bb16f9c5,2
+np.float64,0x3fe185c4f9630b8a,0xbfebcdb401af67a4,2
+np.float64,0x3fb0a5a9f6214b54,0xc00f8ada2566a047,2
+np.float64,0x7fe2908cdda52119,0x408ff9b744861fb1,2
+np.float64,0x7fee776e183ceedb,0x408fff6ee7c2f86e,2
+np.float64,0x3fce1d608f3c3ac1,0xc000b3685d006474,2
+np.float64,0x7fecf92aa339f254,0x408ffeda6c998267,2
+np.float64,0xce13cb519c27a,0xc08ff280f02882a9,2
+np.float64,0x1,0xc090c80000000000,2
+np.float64,0x3fe485a8afa90b51,0xbfe4823265d5a50a,2
+np.float64,0x3feea60908bd4c12,0xbfafdf7ad7fe203f,2
+np.float64,0x3fd2253033a44a60,0xbffd187d0ec8d5b9,2
+np.float64,0x435338fc86a68,0xc08fff6a591059dd,2
+np.float64,0x7fce8763a73d0ec6,0x408fef74f1e715ff,2
+np.float64,0x3fbe5ddb783cbbb7,0xc0089acc5afa794b,2
+np.float64,0x7fe4cf19ada99e32,0x408ffb0877ca302b,2
+np.float64,0x3fe94c9ea1b2993d,0xbfd5b1c2e867b911,2
+np.float64,0x3fe75541c72eaa84,0xbfdd2a27aa117699,2
+np.float64,0x8000000000000001,0x7ff8000000000000,2
+np.float64,0x7fdbec7f2c37d8fd,0x408ff66d69a7f818,2
+np.float64,0x8ef10d091de22,0xc08ff6b9ca5094f8,2
+np.float64,0x3fea69025b74d205,0xbfd1b9fe2c252c70,2
+np.float64,0x562376d0ac46f,0xc08ffc924111cd31,2
+np.float64,0x8e8097ab1d013,0xc08ff6c2e2706f67,2
+np.float64,0x3fca6803ed34d008,0xc00237aef808825b,2
+np.float64,0x7fe8fe9067b1fd20,0x408ffd25f459a7d1,2
+np.float64,0x3f918e8c7f233,0xc0900009fe011d54,2
+np.float64,0x3fdfe773833fcee7,0xbff011bc1af87bb9,2
+np.float64,0xefffef6fdfffe,0xc08ff0beb0f09eb0,2
+np.float64,0x7fe64610282c8c1f,0x408ffbd17209db18,2
+np.float64,0xe66be8c1ccd7d,0xc08ff13706c056e1,2
+np.float64,0x2837e570506fd,0xc09002ae4dae0c1a,2
+np.float64,0x3febe3a081f7c741,0xbfc964171f2a5a47,2
+np.float64,0x3fe21ed09a243da1,0xbfea41342d29c3ff,2
+np.float64,0x3fe1596c8162b2d9,0xbfec431eee30823a,2
+np.float64,0x8f2b9a131e574,0xc08ff6b51104ed4e,2
+np.float64,0x3fe88ed179711da3,0xbfd870d08a4a4b0c,2
+np.float64,0x34159bc2682b4,0xc09001305a885f94,2
+np.float64,0x1ed31e543da65,0xc0900437481577f8,2
+np.float64,0x3feafbe9de75f7d4,0xbfcf7bcdbacf1c61,2
+np.float64,0xfb16fb27f62e0,0xc08ff03938e682a2,2
+np.float64,0x3fe5cd5ba7eb9ab7,0xbfe1b7165771af3c,2
+np.float64,0x7fe72905e76e520b,0x408ffc44c4e7e80c,2
+np.float64,0x7fb7136e2e2e26db,0x408fe439fd383fb7,2
+np.float64,0x8fa585e11f4c,0xc0900b55a08a486b,2
+np.float64,0x7fed985ce47b30b9,0x408fff192b596821,2
+np.float64,0x3feaaf0869755e11,0xbfd0c671571b3764,2
+np.float64,0x3fa40fd4ec281faa,0xc012b1c8dc0b9e5f,2
+np.float64,0x7fda2a70993454e0,0x408ff5ad47b0c68a,2
+np.float64,0x3fe5f7e931abefd2,0xbfe15d52b3605abf,2
+np.float64,0x3fe9fc6d3533f8da,0xbfd338b06a790994,2
+np.float64,0x3fe060649420c0c9,0xbfeeed1756111891,2
+np.float64,0x3fce8435e33d086c,0xc0008c41cea9ed40,2
+np.float64,0x7ff8000000000000,0x7ff8000000000000,2
+np.float64,0x617820aec2f05,0xc08ffb251e9af0f0,2
+np.float64,0x7fcc4ab6ee38956d,0x408fee9419c8f77d,2
+np.float64,0x7fdefda2fc3dfb45,0x408ff7a15063bc05,2
+np.float64,0x7fe5138ccaaa2719,0x408ffb2e30f3a46e,2
+np.float64,0x3fe3817a836702f5,0xbfe6da7c2b25e35a,2
+np.float64,0x3fb8a7dafa314fb6,0xc00b025bc0784ebe,2
+np.float64,0x349dc420693d,0xc09011215825d2c8,2
+np.float64,0x6b0e504ad61cb,0xc08ffa0fee9c5cd6,2
+np.float64,0x273987644e732,0xc09002d34294ed79,2
+np.float64,0x3fc0bd8a6e217b15,0xc0077a5828b4d2f5,2
+np.float64,0x758b48c4eb16a,0xc08ff8fbc8fbe46a,2
+np.float64,0x3fc8a9a52631534a,0xc00301854ec0ef81,2
+np.float64,0x7fe79d29a76f3a52,0x408ffc7e1607a4c1,2
+np.float64,0x3fd7d3ebce2fa7d8,0xbff6ce8a94aebcda,2
+np.float64,0x7fd1cb68a52396d0,0x408ff13a17533b2b,2
+np.float64,0x7fda514a5d34a294,0x408ff5be5e081578,2
+np.float64,0x3fc40b4382281687,0xc0056632c8067228,2
+np.float64,0x7feff1208c3fe240,0x408ffffaa180fa0d,2
+np.float64,0x8f58739f1eb0f,0xc08ff6b17402689d,2
+np.float64,0x1fdbe9a23fb7e,0xc090040685b2d24f,2
+np.float64,0xcb1d0e87963a2,0xc08ff2abbd903b82,2
+np.float64,0x3fc45a6a1a28b4d4,0xc00538f86c4aeaee,2
+np.float64,0x3fe61885b1ac310b,0xbfe118fd2251d2ec,2
+np.float64,0x3fedf584c8fbeb0a,0xbfb8572433ff67a9,2
+np.float64,0x7fb0bddd1a217bb9,0x408fe085e0d621db,2
+np.float64,0x72d8d3e0e5b3,0xc0900ca02f68c7a1,2
+np.float64,0x5cca6ff6b994f,0xc08ffbb6751fda01,2
+np.float64,0x7fe3197839a632ef,0x408ffa0b2fccfb68,2
+np.float64,0x3fcce4d9c139c9b4,0xc0012dae05baa91b,2
+np.float64,0x3fe76d00f62eda02,0xbfdccc5f12799be1,2
+np.float64,0x3fc53c22f72a7846,0xc004bbaa9cbc7958,2
+np.float64,0x7fdda02f1ebb405d,0x408ff71c37c71659,2
+np.float64,0x3fe0844eaba1089d,0xbfee884722762583,2
+np.float64,0x3febb438dc776872,0xbfca9f05e1c691f1,2
+np.float64,0x3fdf4170cdbe82e2,0xbff08b1561c8d848,2
+np.float64,0x3fce1b8d6f3c371b,0xc000b41b69507671,2
+np.float64,0x8370e60706e1d,0xc08ff7b19ea0b4ca,2
+np.float64,0x7fa5bf92382b7f23,0x408fdb8aebb3df87,2
+np.float64,0x7fe4a59979a94b32,0x408ffaf15c1358cd,2
+np.float64,0x3faa66086034cc11,0xc0111c466b7835d6,2
+np.float64,0x7fb7a958262f52af,0x408fe48408b1e093,2
+np.float64,0x3fdaacc5f635598c,0xbff43390d06b5614,2
+np.float64,0x3fd2825b9e2504b7,0xbffca3234264f109,2
+np.float64,0x3fcede160a3dbc2c,0xc0006a759e29060c,2
+np.float64,0x7fd3b19603a7632b,0x408ff265b528371c,2
+np.float64,0x7fcf8a86ea3f150d,0x408fefd552e7f3b2,2
+np.float64,0xedbcc0f7db798,0xc08ff0daad12096b,2
+np.float64,0xf1e1683de3c2d,0xc08ff0a7a0a37e00,2
+np.float64,0xb6ebd9bf6dd7b,0xc08ff3e11e28378d,2
+np.float64,0x3fec8090d6f90122,0xbfc56031b72194cc,2
+np.float64,0x3fd3e10e37a7c21c,0xbffafd34a3ebc933,2
+np.float64,0x7fbb1c96aa36392c,0x408fe616347b3342,2
+np.float64,0x3fe2f3996f25e733,0xbfe82f25bc5d1bbd,2
+np.float64,0x7fe8709da870e13a,0x408ffce3ab6ce59a,2
+np.float64,0x7fea3233d1b46467,0x408ffdb0b3bbc6de,2
+np.float64,0x65fa4112cbf49,0xc08ffa9f85eb72b9,2
+np.float64,0x3fca2cae9f34595d,0xc00251bb275afb87,2
+np.float64,0x8135fd9f026c0,0xc08ff7e42e14dce7,2
+np.float64,0x7fe0a6f057e14de0,0x408ff876081a4bfe,2
+np.float64,0x10000000000000,0xc08ff00000000000,2
+np.float64,0x3fe1fd506263faa1,0xbfea96dd8c543b72,2
+np.float64,0xa5532c554aa66,0xc08ff50bf5bfc66d,2
+np.float64,0xc239d00b8473a,0xc08ff32ff0ea3f92,2
+np.float64,0x7fdb5314e336a629,0x408ff62d4ff60d82,2
+np.float64,0x3fe5f506e2abea0e,0xbfe16362a4682120,2
+np.float64,0x3fa20c60202418c0,0xc0134e08d82608b6,2
+np.float64,0x7fe03864b22070c8,0x408ff82866d65e9a,2
+np.float64,0x3fe72cf5656e59eb,0xbfddca298969effa,2
+np.float64,0x5c295386b852b,0xc08ffbca90b136c9,2
+np.float64,0x7fd71e5020ae3c9f,0x408ff43f6d58eb7c,2
+np.float64,0x3fd1905a842320b5,0xbffdd8ecd288159c,2
+np.float64,0x3fe6bddb256d7bb6,0xbfdf88fee1a820bb,2
+np.float64,0xe061b967c0c37,0xc08ff18581951561,2
+np.float64,0x3fe534f65cea69ed,0xbfe2fe45fe7d3040,2
+np.float64,0xdc7dae07b8fb6,0xc08ff1b93074ea76,2
+np.float64,0x3fd0425082a084a1,0xbfffa11838b21633,2
+np.float64,0xba723fc974e48,0xc08ff3a8b8d01c58,2
+np.float64,0x3fce42ffc73c8600,0xc000a5062678406e,2
+np.float64,0x3f2e6d3c7e5ce,0xc090001304cfd1c7,2
+np.float64,0x3fd4b2e5f7a965cc,0xbffa0e6e6bae0a68,2
+np.float64,0x3fe6db1d18edb63a,0xbfdf128158ee92d9,2
+np.float64,0x7fe4e5792f29caf1,0x408ffb14d9dbf133,2
+np.float64,0x3fc11cdf992239bf,0xc00739569619cd77,2
+np.float64,0x3fc05ea11220bd42,0xc007bc841b48a890,2
+np.float64,0x4bd592d497ab3,0xc08ffe0ab1c962e2,2
+np.float64,0x280068fc5000e,0xc09002b64955e865,2
+np.float64,0x7fe2f2637065e4c6,0x408ff9f379c1253a,2
+np.float64,0x3fefc38467ff8709,0xbf85e53e64b9a424,2
+np.float64,0x2d78ec5a5af1e,0xc09001f8ea8601e0,2
+np.float64,0x7feeef2b957dde56,0x408fff9bebe995f7,2
+np.float64,0x2639baf44c738,0xc09002f9618d623b,2
+np.float64,0x3fc562964d2ac52d,0xc004a6d76959ef78,2
+np.float64,0x3fe21b071fe4360e,0xbfea4adb2cd96ade,2
+np.float64,0x7fe56aa6802ad54c,0x408ffb5d81d1a898,2
+np.float64,0x4296b452852d7,0xc08fff8ad7fbcbe1,2
+np.float64,0x7fe3fac4ff27f589,0x408ffa9049eec479,2
+np.float64,0x7fe7a83e6caf507c,0x408ffc837f436604,2
+np.float64,0x3fc4ac5b872958b7,0xc0050add72381ac3,2
+np.float64,0x3fd6d697c02dad30,0xbff7c931a3eefb01,2
+np.float64,0x3f61e391c023c724,0xc021ad91e754f94b,2
+np.float64,0x10817f9c21031,0xc09007d20434d7bc,2
+np.float64,0x3fdb9c4c4cb73899,0xbff367d8615c5ece,2
+np.float64,0x3fe26ead6b64dd5b,0xbfe977771def5989,2
+np.float64,0x3fc43ea5c3287d4c,0xc00548c2163ae631,2
+np.float64,0x3fe05bd8bba0b7b1,0xbfeef9ea0db91abc,2
+np.float64,0x3feac78369358f07,0xbfd071e2b0aeab39,2
+np.float64,0x7fe254922ca4a923,0x408ff991bdd4e5d3,2
+np.float64,0x3fe5a2f5842b45eb,0xbfe21135c9a71666,2
+np.float64,0x3fd5daf98c2bb5f3,0xbff8cd24f7c07003,2
+np.float64,0x3fcb2a1384365427,0xc001e40f0d04299a,2
+np.float64,0x3fe073974360e72f,0xbfeeb7183a9930b7,2
+np.float64,0xcf3440819e688,0xc08ff270d3a71001,2
+np.float64,0x3fd35656cda6acae,0xbffba083fba4939d,2
+np.float64,0x7fe6c59b4ded8b36,0x408ffc12ce725425,2
+np.float64,0x3fba896f943512df,0xc00a291cb6947701,2
+np.float64,0x7fe54917e86a922f,0x408ffb4b5e0fb848,2
+np.float64,0x7fed2a3f51ba547e,0x408ffeede945a948,2
+np.float64,0x3fdc72bd5038e57b,0xbff2b73b7e93e209,2
+np.float64,0x7fefdb3f9f3fb67e,0x408ffff2b702a768,2
+np.float64,0x3fb0184430203088,0xc00fee8c1351763c,2
+np.float64,0x7d6c3668fad87,0xc08ff83c195f2cca,2
+np.float64,0x3fd5aa254aab544b,0xbff900f16365991b,2
+np.float64,0x3f963daab02c7b55,0xc0161974495b1b71,2
+np.float64,0x3fa7a9c5982f538b,0xc011bde0f6052a89,2
+np.float64,0xb3a5a74b674b5,0xc08ff4167bc97c81,2
+np.float64,0x7fad0c14503a1828,0x408fdee1f2d56cd7,2
+np.float64,0x43e0e9d887c1e,0xc08fff522837b13b,2
+np.float64,0x3fe513b20aea2764,0xbfe346ea994100e6,2
+np.float64,0x7fe4e10393e9c206,0x408ffb12630f6a06,2
+np.float64,0x68b286e2d1651,0xc08ffa51c0d795d4,2
+np.float64,0x7fe8de453331bc89,0x408ffd17012b75ac,2
+np.float64,0x1b3d77d4367b0,0xc09004edea60aa36,2
+np.float64,0x3fd351cbc326a398,0xbffba5f0f4d5fdba,2
+np.float64,0x3fd264951b24c92a,0xbffcc8636788b9bf,2
+np.float64,0xd2465761a48cb,0xc08ff2455c9c53e5,2
+np.float64,0x7fe46a0ef028d41d,0x408ffacfe32c6f5d,2
+np.float64,0x3fafd8ac4c3fb159,0xc010071bf33195d0,2
+np.float64,0x902aec5d2055e,0xc08ff6a08e28aabc,2
+np.float64,0x3fcea61bb03d4c37,0xc0007f76e509b657,2
+np.float64,0x7fe8d90f9571b21e,0x408ffd1495f952e7,2
+np.float64,0x7fa650c9442ca192,0x408fdbd6ff22fdd8,2
+np.float64,0x3fe8ecfdf171d9fc,0xbfd7115df40e8580,2
+np.float64,0x7fd4e6fe7f29cdfc,0x408ff315b0dae183,2
+np.float64,0x77df4c52efbea,0xc08ff8c1d5c1df33,2
+np.float64,0xe200b0cfc4016,0xc08ff1703cfb8e79,2
+np.float64,0x3fe230ea7e2461d5,0xbfea132d2385160e,2
+np.float64,0x7fd1f7ced723ef9d,0x408ff156bfbf92a4,2
+np.float64,0x3fea762818f4ec50,0xbfd18c12a88e5f79,2
+np.float64,0x7feea4ba7c7d4974,0x408fff8004164054,2
+np.float64,0x833ec605067d9,0xc08ff7b606383841,2
+np.float64,0x7fd0c2d7fea185af,0x408ff0894f3a0cf4,2
+np.float64,0x3fe1d7d61d23afac,0xbfeaf76fee875d3e,2
+np.float64,0x65adecb0cb5be,0xc08ffaa82cb09d68,2
index 64e78ae158a455b8455fde5769b53087a8ccc7df..3b913ccd9eb6c92c5055900154161cd2a8dc7dd8 100644 (file)
@@ -658,3 +658,713 @@ np.float32,0x441c5354,0xbdff76b4,2
 np.float32,0x44908b69,0x3e7dcf0d,2
 np.float32,0x478813ad,0xbe7e9d80,2
 np.float32,0x441c4351,0x3dff937b,2
+np.float64,0x1,0x1,4
+np.float64,0x8000000000000001,0x8000000000000001,4
+np.float64,0x10000000000000,0x10000000000000,4
+np.float64,0x8010000000000000,0x8010000000000000,4
+np.float64,0x7fefffffffffffff,0x3f7452fc98b34e97,4
+np.float64,0xffefffffffffffff,0xbf7452fc98b34e97,4
+np.float64,0x7ff0000000000000,0xfff8000000000000,4
+np.float64,0xfff0000000000000,0xfff8000000000000,4
+np.float64,0x7ff8000000000000,0x7ff8000000000000,4
+np.float64,0x7ff4000000000000,0x7ffc000000000000,4
+np.float64,0xbfda51b226b4a364,0xbfd9956328ff876c,4
+np.float64,0xbfb4a65aee294cb8,0xbfb4a09fd744f8a5,4
+np.float64,0xbfd73b914fae7722,0xbfd6b9cce55af379,4
+np.float64,0xbfd90c12b4b21826,0xbfd869a3867b51c2,4
+np.float64,0x3fe649bb3d6c9376,0x3fe48778d9b48a21,4
+np.float64,0xbfd5944532ab288a,0xbfd52c30e1951b42,4
+np.float64,0x3fb150c45222a190,0x3fb14d633eb8275d,4
+np.float64,0x3fe4a6ffa9e94e00,0x3fe33f8a95c33299,4
+np.float64,0x3fe8d2157171a42a,0x3fe667d904ac95a6,4
+np.float64,0xbfa889f52c3113f0,0xbfa8878d90a23fa5,4
+np.float64,0x3feb3234bef6646a,0x3fe809d541d9017a,4
+np.float64,0x3fc6de266f2dbc50,0x3fc6bf0ee80a0d86,4
+np.float64,0x3fe8455368f08aa6,0x3fe6028254338ed5,4
+np.float64,0xbfe5576079eaaec1,0xbfe3cb4a8f6bc3f5,4
+np.float64,0xbfe9f822ff73f046,0xbfe7360d7d5cb887,4
+np.float64,0xbfb1960e7e232c20,0xbfb1928438258602,4
+np.float64,0xbfca75938d34eb28,0xbfca4570979bf2fa,4
+np.float64,0x3fd767dd15aecfbc,0x3fd6e33039018bab,4
+np.float64,0xbfe987750ef30eea,0xbfe6e7ed30ce77f0,4
+np.float64,0xbfe87f95a1f0ff2b,0xbfe62ca7e928bb2a,4
+np.float64,0xbfd2465301a48ca6,0xbfd2070245775d76,4
+np.float64,0xbfb1306ed22260e0,0xbfb12d2088eaa4f9,4
+np.float64,0xbfd8089010b01120,0xbfd778f9db77f2f3,4
+np.float64,0x3fbf9cf4ee3f39f0,0x3fbf88674fde1ca2,4
+np.float64,0x3fe6d8468a6db08e,0x3fe4f403f38b7bec,4
+np.float64,0xbfd9e5deefb3cbbe,0xbfd932692c722351,4
+np.float64,0x3fd1584d55a2b09c,0x3fd122253eeecc2e,4
+np.float64,0x3fe857979cf0af30,0x3fe60fc12b5ba8db,4
+np.float64,0x3fe3644149e6c882,0x3fe239f47013cfe6,4
+np.float64,0xbfe22ea62be45d4c,0xbfe13834c17d56fe,4
+np.float64,0xbfe8d93e1df1b27c,0xbfe66cf4ee467fd2,4
+np.float64,0xbfe9c497c9f38930,0xbfe7127417da4204,4
+np.float64,0x3fd6791cecacf238,0x3fd6039ccb5a7fde,4
+np.float64,0xbfc1dc1b1523b838,0xbfc1cd48edd9ae19,4
+np.float64,0xbfc92a8491325508,0xbfc901176e0158a5,4
+np.float64,0x3fa8649b3430c940,0x3fa8623e82d9504f,4
+np.float64,0x3fe0bed6a1617dae,0x3fdffbb307fb1abe,4
+np.float64,0x3febdf7765f7beee,0x3fe87ad01a89b74a,4
+np.float64,0xbfd3a56d46a74ada,0xbfd356cf41bf83cd,4
+np.float64,0x3fd321d824a643b0,0x3fd2d93846a224b3,4
+np.float64,0xbfc6a49fb52d4940,0xbfc686704906e7d3,4
+np.float64,0xbfdd4103c9ba8208,0xbfdc3ef0c03615b4,4
+np.float64,0xbfe0b78a51e16f14,0xbfdfef0d9ffc38b5,4
+np.float64,0xbfdac7a908b58f52,0xbfda0158956ceecf,4
+np.float64,0xbfbfbf12f23f7e28,0xbfbfaa428989258c,4
+np.float64,0xbfd55f5aa2aabeb6,0xbfd4fa39de65f33a,4
+np.float64,0x3fe06969abe0d2d4,0x3fdf6744fafdd9cf,4
+np.float64,0x3fe56ab8be6ad572,0x3fe3da7a1986d543,4
+np.float64,0xbfeefbbec67df77e,0xbfea5d426132f4aa,4
+np.float64,0x3fe6e1f49cedc3ea,0x3fe4fb53f3d8e3d5,4
+np.float64,0x3feceb231c79d646,0x3fe923d3efa55414,4
+np.float64,0xbfd03dd08ea07ba2,0xbfd011549aa1998a,4
+np.float64,0xbfd688327aad1064,0xbfd611c61b56adbe,4
+np.float64,0xbfde3249d8bc6494,0xbfdd16a7237a39d5,4
+np.float64,0x3febd4b65677a96c,0x3fe873e1a401ef03,4
+np.float64,0xbfe46bd2b368d7a6,0xbfe31023c2467749,4
+np.float64,0x3fbf9f5cde3f3ec0,0x3fbf8aca8ec53c45,4
+np.float64,0x3fc20374032406e8,0x3fc1f43f1f2f4d5e,4
+np.float64,0xbfec143b16f82876,0xbfe89caa42582381,4
+np.float64,0xbfd14fa635a29f4c,0xbfd119ced11da669,4
+np.float64,0x3fe25236d4e4a46e,0x3fe156242d644b7a,4
+np.float64,0xbfe4ed793469daf2,0xbfe377a88928fd77,4
+np.float64,0xbfb363572626c6b0,0xbfb35e98d8fe87ae,4
+np.float64,0xbfb389d5aa2713a8,0xbfb384fae55565a7,4
+np.float64,0x3fca6e001934dc00,0x3fca3e0661eaca84,4
+np.float64,0x3fe748f3f76e91e8,0x3fe548ab2168aea6,4
+np.float64,0x3fef150efdfe2a1e,0x3fea6b92d74f60d3,4
+np.float64,0xbfd14b52b1a296a6,0xbfd115a387c0fa93,4
+np.float64,0x3fe3286b5ce650d6,0x3fe208a6469a7527,4
+np.float64,0xbfd57b4f4baaf69e,0xbfd514a12a9f7ab0,4
+np.float64,0xbfef14bd467e297b,0xbfea6b64bbfd42ce,4
+np.float64,0xbfe280bc90650179,0xbfe17d2c49955dba,4
+np.float64,0x3fca8759d7350eb0,0x3fca56d5c17bbc14,4
+np.float64,0xbfdf988f30bf311e,0xbfde53f96f69b05f,4
+np.float64,0x3f6b6eeb4036de00,0x3f6b6ee7e3f86f9a,4
+np.float64,0xbfed560be8faac18,0xbfe9656c5cf973d8,4
+np.float64,0x3fc6102c592c2058,0x3fc5f43efad5396d,4
+np.float64,0xbfdef64ed2bdec9e,0xbfddc4b7fbd45aea,4
+np.float64,0x3fe814acd570295a,0x3fe5df183d543bfe,4
+np.float64,0x3fca21313f344260,0x3fc9f2d47f64fbe2,4
+np.float64,0xbfe89932cc713266,0xbfe63f186a2f60ce,4
+np.float64,0x3fe4ffcff169ffa0,0x3fe386336115ee21,4
+np.float64,0x3fee6964087cd2c8,0x3fea093d31e2c2c5,4
+np.float64,0xbfbeea604e3dd4c0,0xbfbed72734852669,4
+np.float64,0xbfea1954fb7432aa,0xbfe74cdad8720032,4
+np.float64,0x3fea3e1a5ef47c34,0x3fe765ffba65a11d,4
+np.float64,0x3fcedb850b3db708,0x3fce8f39d92f00ba,4
+np.float64,0x3fd3b52d41a76a5c,0x3fd365d22b0003f9,4
+np.float64,0xbfa4108a0c282110,0xbfa40f397fcd844f,4
+np.float64,0x3fd7454c57ae8a98,0x3fd6c2e5542c6c83,4
+np.float64,0xbfeecd3c7a7d9a79,0xbfea42ca943a1695,4
+np.float64,0xbfdddda397bbbb48,0xbfdccb27283d4c4c,4
+np.float64,0x3fe6b52cf76d6a5a,0x3fe4d96ff32925ff,4
+np.float64,0xbfa39a75ec2734f0,0xbfa3993c0da84f87,4
+np.float64,0x3fdd3fe6fdba7fcc,0x3fdc3df12fe9e525,4
+np.float64,0xbfb57a98162af530,0xbfb5742525d5fbe2,4
+np.float64,0xbfd3e166cfa7c2ce,0xbfd38ff2891be9b0,4
+np.float64,0x3fdb6a04f9b6d408,0x3fda955e5018e9dc,4
+np.float64,0x3fe4ab03a4e95608,0x3fe342bfa76e1aa8,4
+np.float64,0xbfe6c8480b6d9090,0xbfe4e7eaa935b3f5,4
+np.float64,0xbdd6b5a17bae,0xbdd6b5a17bae,4
+np.float64,0xd6591979acb23,0xd6591979acb23,4
+np.float64,0x5adbed90b5b7e,0x5adbed90b5b7e,4
+np.float64,0xa664c5314cc99,0xa664c5314cc99,4
+np.float64,0x1727fb162e500,0x1727fb162e500,4
+np.float64,0xdb49a93db6935,0xdb49a93db6935,4
+np.float64,0xb10c958d62193,0xb10c958d62193,4
+np.float64,0xad38276f5a705,0xad38276f5a705,4
+np.float64,0x1d5d0b983aba2,0x1d5d0b983aba2,4
+np.float64,0x915f48e122be9,0x915f48e122be9,4
+np.float64,0x475958ae8eb2c,0x475958ae8eb2c,4
+np.float64,0x3af8406675f09,0x3af8406675f09,4
+np.float64,0x655e88a4cabd2,0x655e88a4cabd2,4
+np.float64,0x40fee8ce81fde,0x40fee8ce81fde,4
+np.float64,0xab83103f57062,0xab83103f57062,4
+np.float64,0x7cf934b8f9f27,0x7cf934b8f9f27,4
+np.float64,0x29f7524853eeb,0x29f7524853eeb,4
+np.float64,0x4a5e954894bd3,0x4a5e954894bd3,4
+np.float64,0x24638f3a48c73,0x24638f3a48c73,4
+np.float64,0xa4f32fc749e66,0xa4f32fc749e66,4
+np.float64,0xf8e92df7f1d26,0xf8e92df7f1d26,4
+np.float64,0x292e9d50525d4,0x292e9d50525d4,4
+np.float64,0xe937e897d26fd,0xe937e897d26fd,4
+np.float64,0xd3bde1d5a77bc,0xd3bde1d5a77bc,4
+np.float64,0xa447ffd548900,0xa447ffd548900,4
+np.float64,0xa3b7b691476f7,0xa3b7b691476f7,4
+np.float64,0x490095c892013,0x490095c892013,4
+np.float64,0xfc853235f90a7,0xfc853235f90a7,4
+np.float64,0x5a8bc082b5179,0x5a8bc082b5179,4
+np.float64,0x1baca45a37595,0x1baca45a37595,4
+np.float64,0x2164120842c83,0x2164120842c83,4
+np.float64,0x66692bdeccd26,0x66692bdeccd26,4
+np.float64,0xf205bdd3e40b8,0xf205bdd3e40b8,4
+np.float64,0x7c3fff98f8801,0x7c3fff98f8801,4
+np.float64,0xccdf10e199bf,0xccdf10e199bf,4
+np.float64,0x92db8e8125b8,0x92db8e8125b8,4
+np.float64,0x5789a8d6af136,0x5789a8d6af136,4
+np.float64,0xbdda869d7bb51,0xbdda869d7bb51,4
+np.float64,0xb665e0596ccbc,0xb665e0596ccbc,4
+np.float64,0x74e6b46ee9cd7,0x74e6b46ee9cd7,4
+np.float64,0x4f39cf7c9e73b,0x4f39cf7c9e73b,4
+np.float64,0xfdbf3907fb7e7,0xfdbf3907fb7e7,4
+np.float64,0xafdef4d55fbdf,0xafdef4d55fbdf,4
+np.float64,0xb49858236930b,0xb49858236930b,4
+np.float64,0x3ebe21d47d7c5,0x3ebe21d47d7c5,4
+np.float64,0x5b620512b6c41,0x5b620512b6c41,4
+np.float64,0x31918cda63232,0x31918cda63232,4
+np.float64,0x68b5741ed16af,0x68b5741ed16af,4
+np.float64,0xa5c09a5b4b814,0xa5c09a5b4b814,4
+np.float64,0x55f51c14abea4,0x55f51c14abea4,4
+np.float64,0xda8a3e41b515,0xda8a3e41b515,4
+np.float64,0x9ea9c8513d539,0x9ea9c8513d539,4
+np.float64,0x7f23b964fe478,0x7f23b964fe478,4
+np.float64,0xf6e08c7bedc12,0xf6e08c7bedc12,4
+np.float64,0x7267aa24e4cf6,0x7267aa24e4cf6,4
+np.float64,0x236bb93a46d78,0x236bb93a46d78,4
+np.float64,0x9a98430b35309,0x9a98430b35309,4
+np.float64,0xbb683fef76d08,0xbb683fef76d08,4
+np.float64,0x1ff0eb6e3fe1e,0x1ff0eb6e3fe1e,4
+np.float64,0xf524038fea481,0xf524038fea481,4
+np.float64,0xd714e449ae29d,0xd714e449ae29d,4
+np.float64,0x4154fd7682aa0,0x4154fd7682aa0,4
+np.float64,0x5b8d2f6cb71a7,0x5b8d2f6cb71a7,4
+np.float64,0xc91aa21d92355,0xc91aa21d92355,4
+np.float64,0xbd94fd117b2a0,0xbd94fd117b2a0,4
+np.float64,0x685b207ad0b65,0x685b207ad0b65,4
+np.float64,0xd2485b05a490c,0xd2485b05a490c,4
+np.float64,0x151ea5e62a3d6,0x151ea5e62a3d6,4
+np.float64,0x2635a7164c6b6,0x2635a7164c6b6,4
+np.float64,0x88ae3b5d115c8,0x88ae3b5d115c8,4
+np.float64,0x8a055a55140ac,0x8a055a55140ac,4
+np.float64,0x756f7694eadef,0x756f7694eadef,4
+np.float64,0x866d74630cdaf,0x866d74630cdaf,4
+np.float64,0x39e44f2873c8b,0x39e44f2873c8b,4
+np.float64,0x2a07ceb6540fb,0x2a07ceb6540fb,4
+np.float64,0xc52b96398a573,0xc52b96398a573,4
+np.float64,0x9546543b2a8cb,0x9546543b2a8cb,4
+np.float64,0x5b995b90b732c,0x5b995b90b732c,4
+np.float64,0x2de10a565bc22,0x2de10a565bc22,4
+np.float64,0x3b06ee94760df,0x3b06ee94760df,4
+np.float64,0xb18e77a5631cf,0xb18e77a5631cf,4
+np.float64,0x3b89ae3a77137,0x3b89ae3a77137,4
+np.float64,0xd9b0b6e5b3617,0xd9b0b6e5b3617,4
+np.float64,0x30b2310861647,0x30b2310861647,4
+np.float64,0x326a3ab464d48,0x326a3ab464d48,4
+np.float64,0x4c18610a9830d,0x4c18610a9830d,4
+np.float64,0x541dea42a83be,0x541dea42a83be,4
+np.float64,0xcd027dbf9a050,0xcd027dbf9a050,4
+np.float64,0x780a0f80f015,0x780a0f80f015,4
+np.float64,0x740ed5b2e81db,0x740ed5b2e81db,4
+np.float64,0xc226814d844d0,0xc226814d844d0,4
+np.float64,0xde958541bd2b1,0xde958541bd2b1,4
+np.float64,0xb563d3296ac7b,0xb563d3296ac7b,4
+np.float64,0x1db3b0b83b677,0x1db3b0b83b677,4
+np.float64,0xa7b0275d4f605,0xa7b0275d4f605,4
+np.float64,0x72f8d038e5f1b,0x72f8d038e5f1b,4
+np.float64,0x860ed1350c1da,0x860ed1350c1da,4
+np.float64,0x79f88262f3f11,0x79f88262f3f11,4
+np.float64,0x8817761f102ef,0x8817761f102ef,4
+np.float64,0xac44784b5888f,0xac44784b5888f,4
+np.float64,0x800fd594241fab28,0x800fd594241fab28,4
+np.float64,0x800ede32f8ddbc66,0x800ede32f8ddbc66,4
+np.float64,0x800de4c1121bc982,0x800de4c1121bc982,4
+np.float64,0x80076ebcddcedd7a,0x80076ebcddcedd7a,4
+np.float64,0x800b3fee06567fdc,0x800b3fee06567fdc,4
+np.float64,0x800b444426b68889,0x800b444426b68889,4
+np.float64,0x800b1c037a563807,0x800b1c037a563807,4
+np.float64,0x8001eb88c2a3d712,0x8001eb88c2a3d712,4
+np.float64,0x80058aae6dab155e,0x80058aae6dab155e,4
+np.float64,0x80083df2d4f07be6,0x80083df2d4f07be6,4
+np.float64,0x800e3b19d97c7634,0x800e3b19d97c7634,4
+np.float64,0x800a71c6f374e38e,0x800a71c6f374e38e,4
+np.float64,0x80048557f1490ab1,0x80048557f1490ab1,4
+np.float64,0x8000a00e6b01401e,0x8000a00e6b01401e,4
+np.float64,0x800766a3e2cecd49,0x800766a3e2cecd49,4
+np.float64,0x80015eb44602bd69,0x80015eb44602bd69,4
+np.float64,0x800bde885a77bd11,0x800bde885a77bd11,4
+np.float64,0x800224c53ea4498b,0x800224c53ea4498b,4
+np.float64,0x80048e8c6a291d1a,0x80048e8c6a291d1a,4
+np.float64,0x800b667e4af6ccfd,0x800b667e4af6ccfd,4
+np.float64,0x800ae3d7e395c7b0,0x800ae3d7e395c7b0,4
+np.float64,0x80086c245550d849,0x80086c245550d849,4
+np.float64,0x800d7d25f6fafa4c,0x800d7d25f6fafa4c,4
+np.float64,0x800f8d9ab0ff1b35,0x800f8d9ab0ff1b35,4
+np.float64,0x800690e949cd21d3,0x800690e949cd21d3,4
+np.float64,0x8003022381060448,0x8003022381060448,4
+np.float64,0x80085e0dad70bc1c,0x80085e0dad70bc1c,4
+np.float64,0x800e2ffc369c5ff9,0x800e2ffc369c5ff9,4
+np.float64,0x800b629b5af6c537,0x800b629b5af6c537,4
+np.float64,0x800fdc964b7fb92d,0x800fdc964b7fb92d,4
+np.float64,0x80036bb4b1c6d76a,0x80036bb4b1c6d76a,4
+np.float64,0x800b382f7f16705f,0x800b382f7f16705f,4
+np.float64,0x800ebac9445d7593,0x800ebac9445d7593,4
+np.float64,0x80015075c3e2a0ec,0x80015075c3e2a0ec,4
+np.float64,0x8002a6ec5ce54dd9,0x8002a6ec5ce54dd9,4
+np.float64,0x8009fab74a93f56f,0x8009fab74a93f56f,4
+np.float64,0x800c94b9ea992974,0x800c94b9ea992974,4
+np.float64,0x800dc2efd75b85e0,0x800dc2efd75b85e0,4
+np.float64,0x800be6400d57cc80,0x800be6400d57cc80,4
+np.float64,0x80021f6858443ed1,0x80021f6858443ed1,4
+np.float64,0x800600e2ac4c01c6,0x800600e2ac4c01c6,4
+np.float64,0x800a2159e6b442b4,0x800a2159e6b442b4,4
+np.float64,0x800c912f4bb9225f,0x800c912f4bb9225f,4
+np.float64,0x800a863a9db50c76,0x800a863a9db50c76,4
+np.float64,0x800ac16851d582d1,0x800ac16851d582d1,4
+np.float64,0x8003f7d32e87efa7,0x8003f7d32e87efa7,4
+np.float64,0x800be4eee3d7c9de,0x800be4eee3d7c9de,4
+np.float64,0x80069ff0ac4d3fe2,0x80069ff0ac4d3fe2,4
+np.float64,0x80061c986d4c3932,0x80061c986d4c3932,4
+np.float64,0x8000737b4de0e6f7,0x8000737b4de0e6f7,4
+np.float64,0x8002066ef7440cdf,0x8002066ef7440cdf,4
+np.float64,0x8001007050c200e1,0x8001007050c200e1,4
+np.float64,0x8008df9fa351bf40,0x8008df9fa351bf40,4
+np.float64,0x800f8394ee5f072a,0x800f8394ee5f072a,4
+np.float64,0x80008e0b01c11c17,0x80008e0b01c11c17,4
+np.float64,0x800f7088ed3ee112,0x800f7088ed3ee112,4
+np.float64,0x800285b86f650b72,0x800285b86f650b72,4
+np.float64,0x8008ec18af51d832,0x8008ec18af51d832,4
+np.float64,0x800da08523bb410a,0x800da08523bb410a,4
+np.float64,0x800de853ca7bd0a8,0x800de853ca7bd0a8,4
+np.float64,0x8008c8aefad1915e,0x8008c8aefad1915e,4
+np.float64,0x80010c39d5821874,0x80010c39d5821874,4
+np.float64,0x8009208349724107,0x8009208349724107,4
+np.float64,0x800783783f0f06f1,0x800783783f0f06f1,4
+np.float64,0x80025caf9984b960,0x80025caf9984b960,4
+np.float64,0x800bc76fa6778ee0,0x800bc76fa6778ee0,4
+np.float64,0x80017e2f89a2fc60,0x80017e2f89a2fc60,4
+np.float64,0x800ef169843de2d3,0x800ef169843de2d3,4
+np.float64,0x80098a5f7db314bf,0x80098a5f7db314bf,4
+np.float64,0x800d646f971ac8df,0x800d646f971ac8df,4
+np.float64,0x800110d1dc6221a4,0x800110d1dc6221a4,4
+np.float64,0x800f8b422a1f1684,0x800f8b422a1f1684,4
+np.float64,0x800785c97dcf0b94,0x800785c97dcf0b94,4
+np.float64,0x800da201283b4403,0x800da201283b4403,4
+np.float64,0x800a117cc7b422fa,0x800a117cc7b422fa,4
+np.float64,0x80024731cfa48e64,0x80024731cfa48e64,4
+np.float64,0x800199d456c333a9,0x800199d456c333a9,4
+np.float64,0x8005f66bab8becd8,0x8005f66bab8becd8,4
+np.float64,0x8008e7227c11ce45,0x8008e7227c11ce45,4
+np.float64,0x8007b66cc42f6cda,0x8007b66cc42f6cda,4
+np.float64,0x800669e6f98cd3cf,0x800669e6f98cd3cf,4
+np.float64,0x800aed917375db23,0x800aed917375db23,4
+np.float64,0x8008b6dd15116dbb,0x8008b6dd15116dbb,4
+np.float64,0x800f49869cfe930d,0x800f49869cfe930d,4
+np.float64,0x800a712661b4e24d,0x800a712661b4e24d,4
+np.float64,0x800944e816f289d1,0x800944e816f289d1,4
+np.float64,0x800eba0f8a1d741f,0x800eba0f8a1d741f,4
+np.float64,0x800cf6ded139edbe,0x800cf6ded139edbe,4
+np.float64,0x80023100c6246202,0x80023100c6246202,4
+np.float64,0x800c5a94add8b52a,0x800c5a94add8b52a,4
+np.float64,0x800adf329b95be66,0x800adf329b95be66,4
+np.float64,0x800af9afc115f360,0x800af9afc115f360,4
+np.float64,0x800d66ce837acd9d,0x800d66ce837acd9d,4
+np.float64,0x8003ffb5e507ff6d,0x8003ffb5e507ff6d,4
+np.float64,0x80027d280024fa51,0x80027d280024fa51,4
+np.float64,0x800fc37e1d1f86fc,0x800fc37e1d1f86fc,4
+np.float64,0x800fc7258b9f8e4b,0x800fc7258b9f8e4b,4
+np.float64,0x8003fb5789e7f6b0,0x8003fb5789e7f6b0,4
+np.float64,0x800eb4e7a13d69cf,0x800eb4e7a13d69cf,4
+np.float64,0x800951850952a30a,0x800951850952a30a,4
+np.float64,0x3fed4071be3a80e3,0x3fe95842074431df,4
+np.float64,0x3f8d2341203a4682,0x3f8d2300b453bd9f,4
+np.float64,0x3fdc8ce332b919c6,0x3fdb9cdf1440c28f,4
+np.float64,0x3fdc69bd84b8d37b,0x3fdb7d25c8166b7b,4
+np.float64,0x3fc4c22ad0298456,0x3fc4aae73e231b4f,4
+np.float64,0x3fea237809f446f0,0x3fe753cc6ca96193,4
+np.float64,0x3fd34cf6462699ed,0x3fd30268909bb47e,4
+np.float64,0x3fafce20643f9c41,0x3fafc8e41a240e35,4
+np.float64,0x3fdc6d416538da83,0x3fdb805262292863,4
+np.float64,0x3fe7d8362aefb06c,0x3fe5b2ce659db7fd,4
+np.float64,0x3fe290087de52011,0x3fe189f9a3eb123d,4
+np.float64,0x3fa62d2bf82c5a58,0x3fa62b65958ca2b8,4
+np.float64,0x3fafd134403fa269,0x3fafcbf670f8a6f3,4
+np.float64,0x3fa224e53c2449ca,0x3fa223ec5de1631b,4
+np.float64,0x3fb67e2c2c2cfc58,0x3fb676c445fb70a0,4
+np.float64,0x3fda358d01346b1a,0x3fd97b9441666eb2,4
+np.float64,0x3fdd30fc4bba61f9,0x3fdc308da423778d,4
+np.float64,0x3fc56e99c52add34,0x3fc5550004492621,4
+np.float64,0x3fe32d08de265a12,0x3fe20c761a73cec2,4
+np.float64,0x3fd46cf932a8d9f2,0x3fd414a7f3db03df,4
+np.float64,0x3fd94cfa2b3299f4,0x3fd8a5961b3e4bdd,4
+np.float64,0x3fed6ea3a6fadd47,0x3fe9745b2f6c9204,4
+np.float64,0x3fe4431d1768863a,0x3fe2ef61d0481de0,4
+np.float64,0x3fe1d8e00ea3b1c0,0x3fe0efab5050ee78,4
+np.float64,0x3fe56f37dcaade70,0x3fe3de00b0f392e0,4
+np.float64,0x3fde919a2dbd2334,0x3fdd6b6d2dcf2396,4
+np.float64,0x3fe251e3d4a4a3c8,0x3fe155de69605d60,4
+np.float64,0x3fe5e0ecc5abc1da,0x3fe436a5de5516cf,4
+np.float64,0x3fcd48780c3a90f0,0x3fcd073fa907ba9b,4
+np.float64,0x3fe4e8149229d029,0x3fe37360801d5b66,4
+np.float64,0x3fb9ef159633de2b,0x3fb9e3bc05a15d1d,4
+np.float64,0x3fc24a3f0424947e,0x3fc23a5432ca0e7c,4
+np.float64,0x3fe55ca196aab943,0x3fe3cf6b3143435a,4
+np.float64,0x3fe184544c2308a9,0x3fe0a7b49fa80aec,4
+np.float64,0x3fe2c76e83658edd,0x3fe1b8355c1ea771,4
+np.float64,0x3fea8d2c4ab51a59,0x3fe79ba85aabc099,4
+np.float64,0x3fd74f98abae9f31,0x3fd6cc85005d0593,4
+np.float64,0x3fec6de9a678dbd3,0x3fe8d59a1d23cdd1,4
+np.float64,0x3fec8a0e50f9141d,0x3fe8e7500f6f6a00,4
+np.float64,0x3fe9de6d08b3bcda,0x3fe7245319508767,4
+np.float64,0x3fe4461fd1688c40,0x3fe2f1cf0b93aba6,4
+np.float64,0x3fde342d9d3c685b,0x3fdd185609d5719d,4
+np.float64,0x3feb413fc8368280,0x3fe813c091d2519a,4
+np.float64,0x3fe64333156c8666,0x3fe48275b9a6a358,4
+np.float64,0x3fe03c65226078ca,0x3fdf18b26786be35,4
+np.float64,0x3fee11054dbc220b,0x3fe9d579a1cfa7ad,4
+np.float64,0x3fbaefccae35df99,0x3fbae314fef7c7ea,4
+np.float64,0x3feed4e3487da9c7,0x3fea4729241c8811,4
+np.float64,0x3fbb655df836cabc,0x3fbb57fcf9a097be,4
+np.float64,0x3fe68b0273ed1605,0x3fe4b96109afdf76,4
+np.float64,0x3fd216bfc3242d80,0x3fd1d957363f6a43,4
+np.float64,0x3fe01328d4a02652,0x3fded083bbf94aba,4
+np.float64,0x3fe3f9a61ae7f34c,0x3fe2b3f701b79028,4
+np.float64,0x3fed4e7cf8fa9cfa,0x3fe960d27084fb40,4
+np.float64,0x3faec08e343d811c,0x3faebbd2aa07ac1f,4
+np.float64,0x3fd2d1bbeea5a378,0x3fd28c9aefcf48ad,4
+np.float64,0x3fd92e941fb25d28,0x3fd889857f88410d,4
+np.float64,0x3fe43decb7e87bd9,0x3fe2eb32b4ee4667,4
+np.float64,0x3fef49cabcfe9395,0x3fea892f9a233f76,4
+np.float64,0x3fe3e96812e7d2d0,0x3fe2a6c6b45dd6ee,4
+np.float64,0x3fd24c0293a49805,0x3fd20c76d54473cb,4
+np.float64,0x3fb43d6b7e287ad7,0x3fb438060772795a,4
+np.float64,0x3fe87bf7d3f0f7f0,0x3fe62a0c47411c62,4
+np.float64,0x3fee82a2e07d0546,0x3fea17e27e752b7b,4
+np.float64,0x3fe40c01bbe81803,0x3fe2c2d9483f44d8,4
+np.float64,0x3fd686ccae2d0d99,0x3fd610763fb61097,4
+np.float64,0x3fe90fcf2af21f9e,0x3fe693c12df59ba9,4
+np.float64,0x3fefb3ce11ff679c,0x3feac3dd4787529d,4
+np.float64,0x3fcec53ff63d8a80,0x3fce79992af00c58,4
+np.float64,0x3fe599dd7bab33bb,0x3fe3ff5da7575d85,4
+np.float64,0x3fe9923b1a732476,0x3fe6ef71d13db456,4
+np.float64,0x3febf76fcef7eee0,0x3fe88a3952e11373,4
+np.float64,0x3fc2cfd128259fa2,0x3fc2be7fd47fd811,4
+np.float64,0x3fe4d37ae269a6f6,0x3fe36300d45e3745,4
+np.float64,0x3fe23aa2e4247546,0x3fe1424e172f756f,4
+np.float64,0x3fe4f0596ca9e0b3,0x3fe379f0c49de7ef,4
+np.float64,0x3fe2e4802fe5c900,0x3fe1d062a8812601,4
+np.float64,0x3fe5989c79eb3139,0x3fe3fe6308552dec,4
+np.float64,0x3fe3c53cb4e78a79,0x3fe28956e573aca4,4
+np.float64,0x3fe6512beeeca258,0x3fe48d2d5ece979f,4
+np.float64,0x3fd8473ddb308e7c,0x3fd7b33e38adc6ad,4
+np.float64,0x3fecd09c9679a139,0x3fe91361fa0c5bcb,4
+np.float64,0x3fc991530e3322a6,0x3fc965e2c514a9e9,4
+np.float64,0x3f6d4508403a8a11,0x3f6d45042b68acc5,4
+np.float64,0x3fea1f198f743e33,0x3fe750ce918d9330,4
+np.float64,0x3fd0a0bb4da14177,0x3fd07100f9c71e1c,4
+np.float64,0x3fd30c45ffa6188c,0x3fd2c499f9961f66,4
+np.float64,0x3fcad98e7c35b31d,0x3fcaa74293cbc52e,4
+np.float64,0x3fec8e4a5eb91c95,0x3fe8e9f898d118db,4
+np.float64,0x3fd19fdb79233fb7,0x3fd1670c00febd24,4
+np.float64,0x3fea9fcbb1f53f97,0x3fe7a836b29c4075,4
+np.float64,0x3fc6d12ea12da25d,0x3fc6b24bd2f89f59,4
+np.float64,0x3fd6af3658ad5e6d,0x3fd636613e08df3f,4
+np.float64,0x3fe31bc385a63787,0x3fe1fe3081621213,4
+np.float64,0x3fc0dbba2221b774,0x3fc0cf42c9313dba,4
+np.float64,0x3fef639ce87ec73a,0x3fea9795454f1036,4
+np.float64,0x3fee5f29dcbcbe54,0x3fea0349b288f355,4
+np.float64,0x3fed46bdb37a8d7b,0x3fe95c199f5aa569,4
+np.float64,0x3fef176afa3e2ed6,0x3fea6ce78b2aa3aa,4
+np.float64,0x3fc841e7683083cf,0x3fc81cccb84848cc,4
+np.float64,0xbfda3ec9a2347d94,0xbfd9840d180e9de3,4
+np.float64,0xbfcd5967ae3ab2d0,0xbfcd17be13142bb9,4
+np.float64,0xbfedf816573bf02d,0xbfe9c6bb06476c60,4
+np.float64,0xbfd0d6e10e21adc2,0xbfd0a54f99d2f3dc,4
+np.float64,0xbfe282df096505be,0xbfe17ef5e2e80760,4
+np.float64,0xbfd77ae6e62ef5ce,0xbfd6f4f6b603ad8a,4
+np.float64,0xbfe37b171aa6f62e,0xbfe24cb4b2d0ade4,4
+np.float64,0xbfef9e5ed9bf3cbe,0xbfeab817b41000bd,4
+np.float64,0xbfe624d6f96c49ae,0xbfe46b1e9c9aff86,4
+np.float64,0xbfefb5da65ff6bb5,0xbfeac4fc9c982772,4
+np.float64,0xbfd29a65d52534cc,0xbfd2579df8ff87b9,4
+np.float64,0xbfd40270172804e0,0xbfd3af6471104aef,4
+np.float64,0xbfb729ee7a2e53e0,0xbfb721d7dbd2705e,4
+np.float64,0xbfb746f1382e8de0,0xbfb73ebc1207f8e3,4
+np.float64,0xbfd3c7e606a78fcc,0xbfd377a8aa1b0dd9,4
+np.float64,0xbfd18c4880231892,0xbfd1543506584ad5,4
+np.float64,0xbfea988080753101,0xbfe7a34cba0d0fa1,4
+np.float64,0xbf877400e02ee800,0xbf8773df47fa7e35,4
+np.float64,0xbfb07e050820fc08,0xbfb07b198d4a52c9,4
+np.float64,0xbfee0a3621fc146c,0xbfe9d1745a05ba77,4
+np.float64,0xbfe78de246ef1bc4,0xbfe57bf2baab91c8,4
+np.float64,0xbfcdbfd3bd3b7fa8,0xbfcd7b728a955a06,4
+np.float64,0xbfe855ea79b0abd5,0xbfe60e8a4a17b921,4
+np.float64,0xbfd86c8e3530d91c,0xbfd7d5e36c918dc1,4
+np.float64,0xbfe4543169e8a863,0xbfe2fd23d42f552e,4
+np.float64,0xbfe41efbf1283df8,0xbfe2d235a2faed1a,4
+np.float64,0xbfd9a55464b34aa8,0xbfd8f7083f7281e5,4
+np.float64,0xbfe5f5078d6bea0f,0xbfe44637d910c270,4
+np.float64,0xbfe6d83e3dedb07c,0xbfe4f3fdadd10552,4
+np.float64,0xbfdb767e70b6ecfc,0xbfdaa0b6c17f3fb1,4
+np.float64,0xbfdfc91b663f9236,0xbfde7eb0dfbeaa26,4
+np.float64,0xbfbfbd18783f7a30,0xbfbfa84bf2fa1c8d,4
+np.float64,0xbfe51199242a2332,0xbfe39447dbe066ae,4
+np.float64,0xbfdbb94814b77290,0xbfdadd63bd796972,4
+np.float64,0xbfd8c6272cb18c4e,0xbfd828f2d9e8607e,4
+np.float64,0xbfce51e0b63ca3c0,0xbfce097ee908083a,4
+np.float64,0xbfe99a177d73342f,0xbfe6f4ec776a57ae,4
+np.float64,0xbfefde2ab0ffbc55,0xbfeadafdcbf54733,4
+np.float64,0xbfcccb5c1c3996b8,0xbfcc8d586a73d126,4
+np.float64,0xbfdf7ddcedbefbba,0xbfde3c749a906de7,4
+np.float64,0xbfef940516ff280a,0xbfeab26429e89f4b,4
+np.float64,0xbfe08009f1e10014,0xbfdf8eab352997eb,4
+np.float64,0xbfe9c02682b3804d,0xbfe70f5fd05f79ee,4
+np.float64,0xbfb3ca1732279430,0xbfb3c50bec5b453a,4
+np.float64,0xbfe368e81926d1d0,0xbfe23dc704d0887c,4
+np.float64,0xbfbd20cc2e3a4198,0xbfbd10b7e6d81c6c,4
+np.float64,0xbfd67ece4d2cfd9c,0xbfd608f527dcc5e7,4
+np.float64,0xbfdc02d1333805a2,0xbfdb20104454b79f,4
+np.float64,0xbfc007a626200f4c,0xbfbff9dc9dc70193,4
+np.float64,0xbfda9e4f8fb53ca0,0xbfd9db8af35dc630,4
+np.float64,0xbfd8173d77302e7a,0xbfd786a0cf3e2914,4
+np.float64,0xbfeb8fcbd0b71f98,0xbfe84734debc10fb,4
+np.float64,0xbfe4bf1cb7697e3a,0xbfe352c891113f29,4
+np.float64,0xbfc18624d5230c48,0xbfc178248e863b64,4
+np.float64,0xbfcf184bac3e3098,0xbfceca3b19be1ebe,4
+np.float64,0xbfd2269c42a44d38,0xbfd1e8920d72b694,4
+np.float64,0xbfe8808526b1010a,0xbfe62d5497292495,4
+np.float64,0xbfe498bd1da9317a,0xbfe334245eadea93,4
+np.float64,0xbfef0855aebe10ab,0xbfea6462f29aeaf9,4
+np.float64,0xbfdeb186c93d630e,0xbfdd87c37943c602,4
+np.float64,0xbfb29fe2ae253fc8,0xbfb29bae3c87efe4,4
+np.float64,0xbfddd9c6c3bbb38e,0xbfdcc7b400bf384b,4
+np.float64,0xbfe3506673e6a0cd,0xbfe2299f26295553,4
+np.float64,0xbfe765957a2ecb2b,0xbfe55e03cf22edab,4
+np.float64,0xbfecc9876c79930f,0xbfe90efaf15b6207,4
+np.float64,0xbfefb37a0a7f66f4,0xbfeac3af3898e7c2,4
+np.float64,0xbfeefa0da7bdf41b,0xbfea5c4cde53c1c3,4
+np.float64,0xbfe6639ee9ecc73e,0xbfe49b4e28a72482,4
+np.float64,0xbfef91a4bb7f2349,0xbfeab114ac9e25dd,4
+np.float64,0xbfc8b392bb316724,0xbfc88c657f4441a3,4
+np.float64,0xbfc88a358231146c,0xbfc863cb900970fe,4
+np.float64,0xbfef25a9d23e4b54,0xbfea74eda432aabe,4
+np.float64,0xbfe6aceea0ed59de,0xbfe4d32e54a3fd01,4
+np.float64,0xbfefe2b3e37fc568,0xbfeadd74f4605835,4
+np.float64,0xbfa9eecb8833dd90,0xbfa9ebf4f4cb2591,4
+np.float64,0xbfd42bad7428575a,0xbfd3d69de8e52d0a,4
+np.float64,0xbfbc366b4a386cd8,0xbfbc27ceee8f3019,4
+np.float64,0xbfd9bca7be337950,0xbfd90c80e6204e57,4
+np.float64,0xbfe8173f53f02e7f,0xbfe5e0f8d8ed329c,4
+np.float64,0xbfce22dbcb3c45b8,0xbfcddbc8159b63af,4
+np.float64,0xbfea2d7ba7345af7,0xbfe75aa62ad5b80a,4
+np.float64,0xbfc08b783e2116f0,0xbfc07faf8d501558,4
+np.float64,0xbfb8c4161c318830,0xbfb8ba33950748ec,4
+np.float64,0xbfddd930bcbbb262,0xbfdcc72dffdf51bb,4
+np.float64,0xbfd108ce8a22119e,0xbfd0d5801e7698bd,4
+np.float64,0xbfd5bd2b5dab7a56,0xbfd552c52c468c76,4
+np.float64,0xbfe7ffe67fefffcd,0xbfe5cfe96e35e6e5,4
+np.float64,0xbfa04ec6bc209d90,0xbfa04e120a2c25cc,4
+np.float64,0xbfef7752cc7eeea6,0xbfeaa28715addc4f,4
+np.float64,0xbfe7083c2eae1078,0xbfe5182bf8ddfc8e,4
+np.float64,0xbfe05dafd0a0bb60,0xbfdf52d397cfe5f6,4
+np.float64,0xbfacb4f2243969e0,0xbfacb118991ea235,4
+np.float64,0xbfc7d47e422fa8fc,0xbfc7b1504714a4fd,4
+np.float64,0xbfbd70b2243ae168,0xbfbd60182efb61de,4
+np.float64,0xbfe930e49cb261c9,0xbfe6ab272b3f9cfc,4
+np.float64,0xbfb5f537e62bea70,0xbfb5ee540dcdc635,4
+np.float64,0xbfbb0c8278361908,0xbfbaffa1f7642a87,4
+np.float64,0xbfe82af2447055e4,0xbfe5ef54ca8db9e8,4
+np.float64,0xbfe92245e6f2448c,0xbfe6a0d32168040b,4
+np.float64,0xbfb799a8522f3350,0xbfb7911a7ada3640,4
+np.float64,0x7faa8290c8350521,0x3fe5916f67209cd6,4
+np.float64,0x7f976597082ecb2d,0x3fcf94dce396bd37,4
+np.float64,0x7fede721237bce41,0x3fe3e7b1575b005f,4
+np.float64,0x7fd5f674d72bece9,0x3fe3210628eba199,4
+np.float64,0x7f9b0f1aa0361e34,0x3feffd34d15d1da7,4
+np.float64,0x7fec48346ab89068,0x3fe93dd84253d9a2,4
+np.float64,0x7f9cac76283958eb,0xbfec4cd999653868,4
+np.float64,0x7fed51ab6bbaa356,0x3fecc27fb5f37bca,4
+np.float64,0x7fded3c116bda781,0xbfda473efee47cf1,4
+np.float64,0x7fd19c48baa33890,0xbfe25700cbfc0326,4
+np.float64,0x7fe5c8f478ab91e8,0xbfee4ab6d84806be,4
+np.float64,0x7fe53c64e46a78c9,0x3fee19c3f227f4e1,4
+np.float64,0x7fc2ad1936255a31,0xbfe56db9b877f807,4
+np.float64,0x7fe2b071b52560e2,0xbfce3990a8d390a9,4
+np.float64,0x7fc93f3217327e63,0xbfd1f6d7ef838d2b,4
+np.float64,0x7fec26df08784dbd,0x3fd5397be41c93d9,4
+np.float64,0x7fcf4770183e8edf,0x3fe6354f5a785016,4
+np.float64,0x7fdc9fcc0bb93f97,0xbfeeeae952e8267d,4
+np.float64,0x7feb21f29c7643e4,0x3fec20122e33f1bf,4
+np.float64,0x7fd0b51273216a24,0x3fefb09f8daba00b,4
+np.float64,0x7fe747a9d76e8f53,0x3feb46a3232842a4,4
+np.float64,0x7fd58885972b110a,0xbfce5ea57c186221,4
+np.float64,0x7fca3ce85c3479d0,0x3fef93a24548e8ca,4
+np.float64,0x7fe1528a46a2a514,0xbfb54bb578d9da91,4
+np.float64,0x7fcc58b21b38b163,0x3feffb5b741ffc2d,4
+np.float64,0x7fdabcaaf5357955,0x3fecbf855db524d1,4
+np.float64,0x7fdd27c6933a4f8c,0xbfef2f41bb80144b,4
+np.float64,0x7fbda4e1be3b49c2,0x3fdb9b33f84f5381,4
+np.float64,0x7fe53363362a66c5,0x3fe4daff3a6a4ed0,4
+np.float64,0x7fe5719d62eae33a,0xbfef761d98f625d5,4
+np.float64,0x7f982ce5a83059ca,0x3fd0b27c3365f0a8,4
+np.float64,0x7fe6db8c42edb718,0x3fe786f4b1fe11a6,4
+np.float64,0x7fe62cca1b2c5993,0x3fd425b6c4c9714a,4
+np.float64,0x7feea88850bd5110,0xbfd7bbb432017175,4
+np.float64,0x7fad6c6ae43ad8d5,0x3fe82e49098bc6de,4
+np.float64,0x7fe70542f02e0a85,0x3fec3017960b4822,4
+np.float64,0x7feaf0bcbb35e178,0xbfc3aac74dd322d5,4
+np.float64,0x7fb5e152fe2bc2a5,0x3fd4b27a4720614c,4
+np.float64,0x7fe456ee5be8addc,0xbfe9e15ab5cff229,4
+np.float64,0x7fd4b53a8d296a74,0xbfefff450f503326,4
+np.float64,0x7fd7149d7a2e293a,0x3fef4ef0a9009096,4
+np.float64,0x7fd43fc5a8a87f8a,0x3fe0c929fee9dce7,4
+np.float64,0x7fef97022aff2e03,0x3fd4ea52a813da20,4
+np.float64,0x7fe035950ae06b29,0x3fef4e125394fb05,4
+np.float64,0x7fecd0548979a0a8,0x3fe89d226244037b,4
+np.float64,0x7fc79b3ac22f3675,0xbfee9c9cf78c8270,4
+np.float64,0x7fd8b8e8263171cf,0x3fe8e24437961db0,4
+np.float64,0x7fc288c23e251183,0xbfbaf8eca50986ca,4
+np.float64,0x7fe436b4b6686d68,0xbfecd661741931c4,4
+np.float64,0x7fcdf99abe3bf334,0x3feaa75c90830b92,4
+np.float64,0x7fd9f9739233f2e6,0xbfebbfcb301b0da5,4
+np.float64,0x7fd6fcbd1b2df979,0xbfccf2c77cb65f56,4
+np.float64,0x7fe242a97b248552,0xbfe5b0f13bcbabc8,4
+np.float64,0x7fe38bf3e06717e7,0x3fbc8fa9004d2668,4
+np.float64,0x7fecd0e8d479a1d1,0xbfe886a6b4f73a4a,4
+np.float64,0x7fe958d60232b1ab,0xbfeb7c4cf0cee2dd,4
+np.float64,0x7f9d492b583a9256,0xbfebe975d00221cb,4
+np.float64,0x7fd6c9983bad932f,0xbfefe817621a31f6,4
+np.float64,0x7fed0d7239fa1ae3,0x3feac7e1b6455b4b,4
+np.float64,0x7fe61dac90ec3b58,0x3fef845b9efe8421,4
+np.float64,0x7f9acd3010359a5f,0xbfe460d376200130,4
+np.float64,0x7fedced9673b9db2,0xbfeeaf23445e1944,4
+np.float64,0x7fd9f271a733e4e2,0xbfd41544535ecb78,4
+np.float64,0x7fe703339bee0666,0x3fef93334626b56c,4
+np.float64,0x7fec7761b7b8eec2,0xbfe6da9179e8e714,4
+np.float64,0x7fdd9fff043b3ffd,0xbfc0761dfb8d94f9,4
+np.float64,0x7fdc10ed17b821d9,0x3fe1481e2a26c77f,4
+np.float64,0x7fe7681e72aed03c,0x3fefff94a6d47c84,4
+np.float64,0x7fe18c29e1e31853,0x3fe86ebd2fd89456,4
+np.float64,0x7fb2fb273c25f64d,0xbfefc136f57e06de,4
+np.float64,0x7fac2bbb90385776,0x3fe25d8e3cdae7e3,4
+np.float64,0x7fed16789efa2cf0,0x3fe94555091fdfd9,4
+np.float64,0x7fd8fe8f7831fd1e,0xbfed58d520361902,4
+np.float64,0x7fa59bde3c2b37bb,0x3fef585391c077ff,4
+np.float64,0x7fda981b53353036,0x3fde02ca08737b5f,4
+np.float64,0x7fd29f388aa53e70,0xbfe04f5499246df2,4
+np.float64,0x7fcd0232513a0464,0xbfd9737f2f565829,4
+np.float64,0x7fe9a881bcf35102,0xbfe079cf285b35dd,4
+np.float64,0x7fdbe399a9b7c732,0x3fe965bc4220f340,4
+np.float64,0x7feb77414af6ee82,0xbfb7df2fcd491f55,4
+np.float64,0x7fa26e86c424dd0d,0xbfea474c3d65b9be,4
+np.float64,0x7feaee869e35dd0c,0xbfd7b333a888cd14,4
+np.float64,0x7fcbd67f6137acfe,0xbfe15a7a15dfcee6,4
+np.float64,0x7fe36991e766d323,0xbfeb288077c4ed9f,4
+np.float64,0x7fdcf4f4fcb9e9e9,0xbfea331ef7a75e7b,4
+np.float64,0x7fbe3445643c688a,0x3fedf21b94ae8e37,4
+np.float64,0x7fd984cfd2b3099f,0x3fc0d3ade71c395e,4
+np.float64,0x7fdec987b23d930e,0x3fe4af5e48f6c26e,4
+np.float64,0x7fde56a9953cad52,0x3fc8e7762cefb8b0,4
+np.float64,0x7fd39fb446273f68,0xbfe6c3443208f44d,4
+np.float64,0x7fc609c1a72c1382,0x3fe884e639571baa,4
+np.float64,0x7fe001be4b20037c,0xbfed0d90cbcb6010,4
+np.float64,0x7fce7ace283cf59b,0xbfd0303792e51f49,4
+np.float64,0x7fe27ba93da4f751,0x3fe548b5ce740d71,4
+np.float64,0x7fcc13c79b38278e,0xbfe2e14f5b64a1e9,4
+np.float64,0x7fc058550620b0a9,0x3fe44bb55ebd0590,4
+np.float64,0x7fa4ba8bf8297517,0x3fee59b39f9d08c4,4
+np.float64,0x7fe50d6872ea1ad0,0xbfea1eaa2d059e13,4
+np.float64,0x7feb7e33b476fc66,0xbfeff28a4424dd3e,4
+np.float64,0x7fe2d7d2a165afa4,0xbfdbaff0ba1ea460,4
+np.float64,0xffd126654b224cca,0xbfef0cd3031fb97c,4
+np.float64,0xffb5f884942bf108,0x3fe0de589bea2e4c,4
+np.float64,0xffe011b4bfe02369,0xbfe805a0edf1e1f2,4
+np.float64,0xffec13eae9b827d5,0x3fb5f30347d78447,4
+np.float64,0xffa6552ae82caa50,0x3fb1ecee60135f2f,4
+np.float64,0xffb62d38b02c5a70,0x3fbd35903148fd12,4
+np.float64,0xffe2c44ea425889d,0xbfd7616547f99a7d,4
+np.float64,0xffea24c61a74498c,0x3fef4a1b15ae9005,4
+np.float64,0xffd23a4ab2a47496,0x3fe933bfaa569ae9,4
+np.float64,0xffc34a073d269410,0xbfeec0f510bb7474,4
+np.float64,0xffeead84cfbd5b09,0x3feb2d635e5a78bd,4
+np.float64,0xffcfd8f3b43fb1e8,0xbfdd59625801771b,4
+np.float64,0xffd3c7f662a78fec,0x3f9cf3209edfbc4e,4
+np.float64,0xffe7b7e4f72f6fca,0xbfefdcff4925632c,4
+np.float64,0xffe48cab05e91956,0x3fe6b41217948423,4
+np.float64,0xffeb6980b336d301,0xbfca5de148f69324,4
+np.float64,0xffe3f15c4aa7e2b8,0xbfeb18efae892081,4
+np.float64,0xffcf290c713e5218,0x3fefe6f1a513ed26,4
+np.float64,0xffd80979b43012f4,0xbfde6c8df91af976,4
+np.float64,0xffc3181e0026303c,0x3fe7448f681def38,4
+np.float64,0xffedfa68f97bf4d1,0xbfeca6efb802d109,4
+np.float64,0xffca0931c0341264,0x3fe31b9f073b08cd,4
+np.float64,0xffe4c44934e98892,0x3feda393a2e8a0f7,4
+np.float64,0xffe65bb56f2cb76a,0xbfeffaf638a4b73e,4
+np.float64,0xffe406a332a80d46,0x3fe8151dadb853c1,4
+np.float64,0xffdb7eae9c36fd5e,0xbfeff89abf5ab16e,4
+np.float64,0xffe245a02da48b40,0x3fef1fb43e85f4b8,4
+np.float64,0xffe2bafa732575f4,0x3fcbab115c6fd86e,4
+np.float64,0xffe8b1eedb7163dd,0x3feff263df6f6b12,4
+np.float64,0xffe6c76c796d8ed8,0xbfe61a8668511293,4
+np.float64,0xffefe327d1ffc64f,0xbfd9b92887a84827,4
+np.float64,0xffa452180c28a430,0xbfa9b9e578a4e52f,4
+np.float64,0xffe9867d0bf30cf9,0xbfca577867588408,4
+np.float64,0xffdfe9b923bfd372,0x3fdab5c15f085c2d,4
+np.float64,0xffed590c6abab218,0xbfd7e7b6c5a120e6,4
+np.float64,0xffeaebcfbab5d79f,0x3fed58be8a9e2c3b,4
+np.float64,0xffe2ba83a8257507,0x3fe6c42a4ac1d4d9,4
+np.float64,0xffe01d5b0ee03ab6,0xbfe5dad6c9247db7,4
+np.float64,0xffe51095d52a212b,0x3fef822cebc32d8e,4
+np.float64,0xffebd7a901b7af51,0xbfe5e63f3e3b1185,4
+np.float64,0xffe4efdcde29dfb9,0xbfe811294dfa758f,4
+np.float64,0xffe3be1aa4a77c35,0x3fdd8dcfcd409bb1,4
+np.float64,0xffbe6f2f763cde60,0x3fd13766e43bd622,4
+np.float64,0xffeed3d80fbda7af,0x3fec10a23c1b7a4a,4
+np.float64,0xffd6ebff37add7fe,0xbfe6177411607c86,4
+np.float64,0xffe85a90f4b0b521,0x3fc09fdd66c8fde9,4
+np.float64,0xffea3d58c2b47ab1,0x3feb5bd4a04b3562,4
+np.float64,0xffef675be6beceb7,0x3fecd840683d1044,4
+np.float64,0xff726a088024d400,0x3feff2b4f47b5214,4
+np.float64,0xffc90856733210ac,0xbfe3c6ffbf6840a5,4
+np.float64,0xffc0b58d9a216b1c,0xbfe10314267d0611,4
+np.float64,0xffee1f3d0abc3e79,0xbfd12ea7efea9067,4
+np.float64,0xffd988c41a331188,0x3febe83802d8a32e,4
+np.float64,0xffe8f1ac9bb1e358,0xbfdbf5fa7e84f2f2,4
+np.float64,0xffe47af279e8f5e4,0x3fef11e339e5fa78,4
+np.float64,0xff9960a7f832c140,0xbfa150363f8ec5b2,4
+np.float64,0xffcac40fa7358820,0xbfec3d5847a3df1d,4
+np.float64,0xffcb024a9d360494,0xbfd060fa31fd6b6a,4
+np.float64,0xffe385ffb3270bff,0xbfee6859e8dcd9e8,4
+np.float64,0xffef62f2c53ec5e5,0x3fe0a71ffddfc718,4
+np.float64,0xffed87ff20fb0ffd,0xbfe661db7c4098e3,4
+np.float64,0xffe369278526d24e,0x3fd64d89a41822fc,4
+np.float64,0xff950288c02a0520,0x3fe1df91d1ad7d5c,4
+np.float64,0xffe70e7c2cee1cf8,0x3fc9fece08df2fd8,4
+np.float64,0xffbaf020b635e040,0xbfc68c43ff9911a7,4
+np.float64,0xffee0120b0fc0240,0x3f9f792e17b490b0,4
+np.float64,0xffe1fa4be7a3f498,0xbfef4b18ab4b319e,4
+np.float64,0xffe61887bf2c310f,0x3fe846714826cb32,4
+np.float64,0xffdc3cf77f3879ee,0x3fe033b948a36125,4
+np.float64,0xffcc2b86f238570c,0xbfefdcceac3f220f,4
+np.float64,0xffe1f030c0a3e061,0x3fef502a808c359a,4
+np.float64,0xffb872c4ee30e588,0x3fef66ed8d3e6175,4
+np.float64,0xffeac8fc617591f8,0xbfe5d8448602aac9,4
+np.float64,0xffe5be16afab7c2d,0x3fee75ccde3cd14d,4
+np.float64,0xffae230ad83c4610,0xbfe49bbe6074d459,4
+np.float64,0xffc8fbeff531f7e0,0x3f77201e0c927f97,4
+np.float64,0xffdc314f48b8629e,0x3fef810dfc5db118,4
+np.float64,0xffec1f8970783f12,0x3fe15567102e042a,4
+np.float64,0xffc6995f902d32c0,0xbfecd5d2eedf342c,4
+np.float64,0xffdc7af76b38f5ee,0xbfd6e754476ab320,4
+np.float64,0xffb30cf8682619f0,0x3fd5ac3dfc4048d0,4
+np.float64,0xffd3a77695a74eee,0xbfefb5d6889e36e9,4
+np.float64,0xffd8b971803172e4,0xbfeb7f62f0b6c70b,4
+np.float64,0xffde4c0234bc9804,0xbfed50ba9e16d5e0,4
+np.float64,0xffb62b3f342c5680,0xbfeabc0de4069b84,4
+np.float64,0xff9af5674035eac0,0xbfed6c198b6b1bd8,4
+np.float64,0xffdfe20cb43fc41a,0x3fb11f8238f66306,4
+np.float64,0xffd2ecd7a0a5d9b0,0xbfec17ef1a62b1e3,4
+np.float64,0xffce60f7863cc1f0,0x3fe6dbcad3e3a006,4
+np.float64,0xffbbb8306a377060,0xbfbfd0fbef485c4c,4
+np.float64,0xffd1b2bd2b23657a,0xbfda3e046d987b99,4
+np.float64,0xffc480f4092901e8,0xbfeeff0427f6897b,4
+np.float64,0xffe6e02d926dc05a,0xbfcd59552778890b,4
+np.float64,0xffd302e5b7a605cc,0xbfee7c08641366b0,4
+np.float64,0xffec2eb92f785d72,0xbfef5c9c7f771050,4
+np.float64,0xffea3e31a9747c62,0xbfc49cd54755faf0,4
+np.float64,0xffce0a4e333c149c,0x3feeb9a6d0db4aee,4
+np.float64,0xffdc520a2db8a414,0x3fefc7b72613dcd0,4
+np.float64,0xffe056b968a0ad72,0xbfe47a9fe1f827fb,4
+np.float64,0xffe5a10f4cab421e,0x3fec2b1f74b73dec,4
diff --git a/numpy/core/tests/data/umath-validation-set-sinh.csv b/numpy/core/tests/data/umath-validation-set-sinh.csv
new file mode 100644 (file)
index 0000000..5888c91
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0xfee27582,0xff800000,2
+np.float32,0xff19f092,0xff800000,2
+np.float32,0xbf393576,0xbf49cb31,2
+np.float32,0x8020fdea,0x8020fdea,2
+np.float32,0x455f4e,0x455f4e,2
+np.float32,0xff718c35,0xff800000,2
+np.float32,0x3f3215e3,0x3f40cce5,2
+np.float32,0x19e833,0x19e833,2
+np.float32,0xff2dcd49,0xff800000,2
+np.float32,0x7e8f6c95,0x7f800000,2
+np.float32,0xbf159dac,0xbf1e47a5,2
+np.float32,0x100d3d,0x100d3d,2
+np.float32,0xff673441,0xff800000,2
+np.float32,0x80275355,0x80275355,2
+np.float32,0x4812d0,0x4812d0,2
+np.float32,0x8072b956,0x8072b956,2
+np.float32,0xff3bb918,0xff800000,2
+np.float32,0x0,0x0,2
+np.float32,0xfe327798,0xff800000,2
+np.float32,0x41d4e2,0x41d4e2,2
+np.float32,0xfe34b1b8,0xff800000,2
+np.float32,0x80199f72,0x80199f72,2
+np.float32,0x807242ce,0x807242ce,2
+np.float32,0x3ef4202d,0x3efd7b48,2
+np.float32,0x763529,0x763529,2
+np.float32,0x4f6662,0x4f6662,2
+np.float32,0x3f18efe9,0x3f2232b5,2
+np.float32,0x80701846,0x80701846,2
+np.float32,0x3f599948,0x3f74c393,2
+np.float32,0x5a3d69,0x5a3d69,2
+np.float32,0xbf4a7e65,0xbf6047a3,2
+np.float32,0xff0d4c82,0xff800000,2
+np.float32,0x7a74db,0x7a74db,2
+np.float32,0x803388e6,0x803388e6,2
+np.float32,0x7f4430bb,0x7f800000,2
+np.float32,0x14c5b1,0x14c5b1,2
+np.float32,0xfa113400,0xff800000,2
+np.float32,0x7f4b3209,0x7f800000,2
+np.float32,0x8038d88c,0x8038d88c,2
+np.float32,0xbef2f9de,0xbefc330b,2
+np.float32,0xbe147b38,0xbe15008f,2
+np.float32,0x2b61e6,0x2b61e6,2
+np.float32,0x80000001,0x80000001,2
+np.float32,0x8060456c,0x8060456c,2
+np.float32,0x3f30fa82,0x3f3f6a99,2
+np.float32,0xfd1f0220,0xff800000,2
+np.float32,0xbf2b7555,0xbf389151,2
+np.float32,0xff100b7a,0xff800000,2
+np.float32,0x70d3cd,0x70d3cd,2
+np.float32,0x2a8d4a,0x2a8d4a,2
+np.float32,0xbf7b733f,0xbf92f05f,2
+np.float32,0x3f7106dc,0x3f8b1fc6,2
+np.float32,0x3f39da7a,0x3f4a9d79,2
+np.float32,0x3f5dd73f,0x3f7aaab5,2
+np.float32,0xbe8c8754,0xbe8e4cba,2
+np.float32,0xbf6c74c9,0xbf87c556,2
+np.float32,0x800efbbb,0x800efbbb,2
+np.float32,0xff054ab5,0xff800000,2
+np.float32,0x800b4b46,0x800b4b46,2
+np.float32,0xff77fd74,0xff800000,2
+np.float32,0x257d0,0x257d0,2
+np.float32,0x7caa0c,0x7caa0c,2
+np.float32,0x8025d24d,0x8025d24d,2
+np.float32,0x3d9f1b60,0x3d9f445c,2
+np.float32,0xbe3bf6e8,0xbe3d0595,2
+np.float32,0x54bb93,0x54bb93,2
+np.float32,0xbf3e6a45,0xbf507716,2
+np.float32,0x3f4bb26e,0x3f61e1cd,2
+np.float32,0x3f698edc,0x3f85aac5,2
+np.float32,0xff7bd0ef,0xff800000,2
+np.float32,0xbed07b68,0xbed64a8e,2
+np.float32,0xbf237c72,0xbf2ed3d2,2
+np.float32,0x27b0fa,0x27b0fa,2
+np.float32,0x3f7606d1,0x3f8ed7d6,2
+np.float32,0x790dc0,0x790dc0,2
+np.float32,0x7f68f3ac,0x7f800000,2
+np.float32,0xbed39288,0xbed9a52f,2
+np.float32,0x3f6f8266,0x3f8a0187,2
+np.float32,0x3fbdca,0x3fbdca,2
+np.float32,0xbf7c3e5d,0xbf938b2c,2
+np.float32,0x802321a8,0x802321a8,2
+np.float32,0x3eecab66,0x3ef53031,2
+np.float32,0x62b324,0x62b324,2
+np.float32,0x3f13afac,0x3f1c03fe,2
+np.float32,0xff315ad7,0xff800000,2
+np.float32,0xbf1fac0d,0xbf2a3a63,2
+np.float32,0xbf543984,0xbf6d61d6,2
+np.float32,0x71a212,0x71a212,2
+np.float32,0x114fbe,0x114fbe,2
+np.float32,0x3f5b6ff2,0x3f77505f,2
+np.float32,0xff6ff89e,0xff800000,2
+np.float32,0xff4527a1,0xff800000,2
+np.float32,0x22cb3,0x22cb3,2
+np.float32,0x7f53bb6b,0x7f800000,2
+np.float32,0xff3d2dea,0xff800000,2
+np.float32,0xfd21dac0,0xff800000,2
+np.float32,0xfc486140,0xff800000,2
+np.float32,0x7e2b693a,0x7f800000,2
+np.float32,0x8022a9fb,0x8022a9fb,2
+np.float32,0x80765de0,0x80765de0,2
+np.float32,0x13d299,0x13d299,2
+np.float32,0x7ee53713,0x7f800000,2
+np.float32,0xbde1c770,0xbde23c96,2
+np.float32,0xbd473fc0,0xbd4753de,2
+np.float32,0x3f1cb455,0x3f26acf3,2
+np.float32,0x683e49,0x683e49,2
+np.float32,0x3ed5a9fc,0x3edbeb79,2
+np.float32,0x3f4fe3f6,0x3f67814f,2
+np.float32,0x802a2bce,0x802a2bce,2
+np.float32,0x7e951b4c,0x7f800000,2
+np.float32,0xbe6eb260,0xbe70dd44,2
+np.float32,0xbe3daca8,0xbe3ec2cb,2
+np.float32,0xbe9c38b2,0xbe9ea822,2
+np.float32,0xff2e29dc,0xff800000,2
+np.float32,0x7f62c7cc,0x7f800000,2
+np.float32,0xbf6799a4,0xbf84416c,2
+np.float32,0xbe30a7f0,0xbe318898,2
+np.float32,0xc83d9,0xc83d9,2
+np.float32,0x3f05abf4,0x3f0bd447,2
+np.float32,0x7e9b018a,0x7f800000,2
+np.float32,0xbf0ed72e,0xbf165e5b,2
+np.float32,0x8011ac8c,0x8011ac8c,2
+np.float32,0xbeb7c706,0xbebbbfcb,2
+np.float32,0x803637f9,0x803637f9,2
+np.float32,0xfe787cc8,0xff800000,2
+np.float32,0x3f533d4b,0x3f6c0a50,2
+np.float32,0x3f5c0f1c,0x3f782dde,2
+np.float32,0x3f301f36,0x3f3e590d,2
+np.float32,0x2dc929,0x2dc929,2
+np.float32,0xff15018a,0xff800000,2
+np.float32,0x3f4d0c56,0x3f63afeb,2
+np.float32,0xbf7a2ae3,0xbf91f6e4,2
+np.float32,0xbe771b84,0xbe798346,2
+np.float32,0x80800000,0x80800000,2
+np.float32,0x7f5689ba,0x7f800000,2
+np.float32,0x3f1c3177,0x3f2610df,2
+np.float32,0x3f1b9664,0x3f255825,2
+np.float32,0x3f7e5066,0x3f9520d4,2
+np.float32,0xbf1935f8,0xbf2285ab,2
+np.float32,0x3f096cc7,0x3f101ef9,2
+np.float32,0x8030c180,0x8030c180,2
+np.float32,0x6627ed,0x6627ed,2
+np.float32,0x454595,0x454595,2
+np.float32,0x7de66a33,0x7f800000,2
+np.float32,0xbf800000,0xbf966cfe,2
+np.float32,0xbf35c0a8,0xbf456939,2
+np.float32,0x3f6a6266,0x3f8643e0,2
+np.float32,0x3f0cbcee,0x3f13ef6a,2
+np.float32,0x7efd1e58,0x7f800000,2
+np.float32,0xfe9a74c6,0xff800000,2
+np.float32,0x807ebe6c,0x807ebe6c,2
+np.float32,0x80656736,0x80656736,2
+np.float32,0x800e0608,0x800e0608,2
+np.float32,0xbf30e39a,0xbf3f4e00,2
+np.float32,0x802015fd,0x802015fd,2
+np.float32,0x3e3ce26d,0x3e3df519,2
+np.float32,0x7ec142ac,0x7f800000,2
+np.float32,0xbf68c9ce,0xbf851c78,2
+np.float32,0xfede8356,0xff800000,2
+np.float32,0xbf1507ce,0xbf1d978d,2
+np.float32,0x3e53914c,0x3e551374,2
+np.float32,0x7f3e1c14,0x7f800000,2
+np.float32,0x8070d2ba,0x8070d2ba,2
+np.float32,0xbf4eb793,0xbf65ecee,2
+np.float32,0x7365a6,0x7365a6,2
+np.float32,0x8045cba2,0x8045cba2,2
+np.float32,0x7e4af521,0x7f800000,2
+np.float32,0xbf228625,0xbf2da9e1,2
+np.float32,0x7ee0536c,0x7f800000,2
+np.float32,0x3e126607,0x3e12e5d5,2
+np.float32,0x80311d92,0x80311d92,2
+np.float32,0xbf386b8b,0xbf48ca54,2
+np.float32,0x7f800000,0x7f800000,2
+np.float32,0x8049ec7a,0x8049ec7a,2
+np.float32,0xbf1dfde4,0xbf2836be,2
+np.float32,0x7e719a8c,0x7f800000,2
+np.float32,0x3eb9c856,0x3ebde2e6,2
+np.float32,0xfe3efda8,0xff800000,2
+np.float32,0xbe89d60c,0xbe8b81d1,2
+np.float32,0x3eaad338,0x3eae0317,2
+np.float32,0x7f4e5217,0x7f800000,2
+np.float32,0x3e9d0f40,0x3e9f88ce,2
+np.float32,0xbe026708,0xbe02c155,2
+np.float32,0x5fc22f,0x5fc22f,2
+np.float32,0x1c4572,0x1c4572,2
+np.float32,0xbed89d96,0xbedf22c5,2
+np.float32,0xbf3debee,0xbf4fd441,2
+np.float32,0xbf465520,0xbf5ac6e5,2
+np.float32,0x3f797081,0x3f9169b3,2
+np.float32,0xbf250734,0xbf30b2aa,2
+np.float32,0x7f5068e9,0x7f800000,2
+np.float32,0x3f1b814e,0x3f253f0c,2
+np.float32,0xbf27c5d3,0xbf340b05,2
+np.float32,0x3f1b78ae,0x3f2534c8,2
+np.float32,0x8059b51a,0x8059b51a,2
+np.float32,0x8059f182,0x8059f182,2
+np.float32,0xbf1bb36e,0xbf257ab8,2
+np.float32,0x41ac35,0x41ac35,2
+np.float32,0x68f41f,0x68f41f,2
+np.float32,0xbea504dc,0xbea7e40f,2
+np.float32,0x1,0x1,2
+np.float32,0x3e96b5b0,0x3e98e542,2
+np.float32,0x7f7fffff,0x7f800000,2
+np.float32,0x3c557a80,0x3c557c0c,2
+np.float32,0x800ca3ec,0x800ca3ec,2
+np.float32,0x8077d4aa,0x8077d4aa,2
+np.float32,0x3f000af0,0x3f0572d6,2
+np.float32,0x3e0434dd,0x3e0492f8,2
+np.float32,0x7d1a710a,0x7f800000,2
+np.float32,0x3f70f996,0x3f8b15f8,2
+np.float32,0x8033391d,0x8033391d,2
+np.float32,0x11927c,0x11927c,2
+np.float32,0x7f7784be,0x7f800000,2
+np.float32,0x7acb22af,0x7f800000,2
+np.float32,0x7e8b153c,0x7f800000,2
+np.float32,0x66d402,0x66d402,2
+np.float32,0xfed6e7b0,0xff800000,2
+np.float32,0x7f6872d3,0x7f800000,2
+np.float32,0x1bd49c,0x1bd49c,2
+np.float32,0xfdc4f1b8,0xff800000,2
+np.float32,0xbed8a466,0xbedf2a33,2
+np.float32,0x7ee789,0x7ee789,2
+np.float32,0xbece94b4,0xbed43b52,2
+np.float32,0x3cf3f734,0x3cf4006f,2
+np.float32,0x7e44aa00,0x7f800000,2
+np.float32,0x7f19e99c,0x7f800000,2
+np.float32,0x806ff1bc,0x806ff1bc,2
+np.float32,0x80296934,0x80296934,2
+np.float32,0x7f463363,0x7f800000,2
+np.float32,0xbf212ac3,0xbf2c06bb,2
+np.float32,0x3dc63778,0x3dc686ba,2
+np.float32,0x7f1b4328,0x7f800000,2
+np.float32,0x6311f6,0x6311f6,2
+np.float32,0xbf6b6fb6,0xbf870751,2
+np.float32,0xbf2c44cf,0xbf399155,2
+np.float32,0x3e7a67bc,0x3e7ce887,2
+np.float32,0x7f57c5f7,0x7f800000,2
+np.float32,0x7f2bb4ff,0x7f800000,2
+np.float32,0xbe9d448e,0xbe9fc0a4,2
+np.float32,0xbf4840f0,0xbf5d4f6b,2
+np.float32,0x7f1e1176,0x7f800000,2
+np.float32,0xff76638e,0xff800000,2
+np.float32,0xff055555,0xff800000,2
+np.float32,0x3f32b82b,0x3f419834,2
+np.float32,0xff363aa8,0xff800000,2
+np.float32,0x7f737fd0,0x7f800000,2
+np.float32,0x3da5d798,0x3da60602,2
+np.float32,0x3f1cc126,0x3f26bc3e,2
+np.float32,0x7eb07541,0x7f800000,2
+np.float32,0x3f7b2ff2,0x3f92bd2a,2
+np.float32,0x474f7,0x474f7,2
+np.float32,0x7fc00000,0x7fc00000,2
+np.float32,0xff2b0a4e,0xff800000,2
+np.float32,0xfeb24f16,0xff800000,2
+np.float32,0x2cb9fc,0x2cb9fc,2
+np.float32,0x67189d,0x67189d,2
+np.float32,0x8033d854,0x8033d854,2
+np.float32,0xbe85e94c,0xbe87717a,2
+np.float32,0x80767c6c,0x80767c6c,2
+np.float32,0x7ea84d65,0x7f800000,2
+np.float32,0x3f024bc7,0x3f07fead,2
+np.float32,0xbdcb0100,0xbdcb5625,2
+np.float32,0x3f160a9e,0x3f1ec7c9,2
+np.float32,0xff1734c8,0xff800000,2
+np.float32,0x7f424d5e,0x7f800000,2
+np.float32,0xbf75b215,0xbf8e9862,2
+np.float32,0x3f262a42,0x3f3214c4,2
+np.float32,0xbf4cfb53,0xbf639927,2
+np.float32,0x3f4ac8b8,0x3f60aa7c,2
+np.float32,0x3e90e593,0x3e92d6b3,2
+np.float32,0xbf66bccf,0xbf83a2d8,2
+np.float32,0x7d3d851a,0x7f800000,2
+np.float32,0x7bac783c,0x7f800000,2
+np.float32,0x8001c626,0x8001c626,2
+np.float32,0xbdffd480,0xbe003f7b,2
+np.float32,0x7f6680bf,0x7f800000,2
+np.float32,0xbecf448e,0xbed4f9bb,2
+np.float32,0x584c7,0x584c7,2
+np.float32,0x3f3e8ea0,0x3f50a5fb,2
+np.float32,0xbf5a5f04,0xbf75d56e,2
+np.float32,0x8065ae47,0x8065ae47,2
+np.float32,0xbf48dce3,0xbf5e1dba,2
+np.float32,0xbe8dae2e,0xbe8f7ed8,2
+np.float32,0x3f7ca6ab,0x3f93dace,2
+np.float32,0x4c3e81,0x4c3e81,2
+np.float32,0x80000000,0x80000000,2
+np.float32,0x3ee1f7d9,0x3ee96033,2
+np.float32,0x80588c6f,0x80588c6f,2
+np.float32,0x5ba34e,0x5ba34e,2
+np.float32,0x80095d28,0x80095d28,2
+np.float32,0xbe7ba198,0xbe7e2bdd,2
+np.float32,0xbe0bdcb4,0xbe0c4c22,2
+np.float32,0x1776f7,0x1776f7,2
+np.float32,0x80328b2a,0x80328b2a,2
+np.float32,0x3e978d37,0x3e99c63e,2
+np.float32,0x7ed50906,0x7f800000,2
+np.float32,0x3f776a54,0x3f8fe2bd,2
+np.float32,0xbed624c4,0xbedc7120,2
+np.float32,0x7f0b6a31,0x7f800000,2
+np.float32,0x7eb13913,0x7f800000,2
+np.float32,0xbe733684,0xbe758190,2
+np.float32,0x80016474,0x80016474,2
+np.float32,0x7a51ee,0x7a51ee,2
+np.float32,0x3f6cb91e,0x3f87f729,2
+np.float32,0xbd99b050,0xbd99d540,2
+np.float32,0x7c6e3cba,0x7f800000,2
+np.float32,0xbf00179a,0xbf05811e,2
+np.float32,0x3e609b29,0x3e626954,2
+np.float32,0xff3fd71a,0xff800000,2
+np.float32,0x5d8c2,0x5d8c2,2
+np.float32,0x7ee93662,0x7f800000,2
+np.float32,0x4b0b31,0x4b0b31,2
+np.float32,0x3ec243b7,0x3ec6f594,2
+np.float32,0x804d60f1,0x804d60f1,2
+np.float32,0xbf0cb784,0xbf13e929,2
+np.float32,0x3f13b74d,0x3f1c0cee,2
+np.float32,0xfe37cb64,0xff800000,2
+np.float32,0x1a88,0x1a88,2
+np.float32,0x3e22a472,0x3e2353ba,2
+np.float32,0x7f07d6a0,0x7f800000,2
+np.float32,0x3f78f435,0x3f910bb5,2
+np.float32,0x555a4a,0x555a4a,2
+np.float32,0x3e306c1f,0x3e314be3,2
+np.float32,0x8005877c,0x8005877c,2
+np.float32,0x4df389,0x4df389,2
+np.float32,0x8069ffc7,0x8069ffc7,2
+np.float32,0x3f328f24,0x3f4164c6,2
+np.float32,0x53a31b,0x53a31b,2
+np.float32,0xbe4d6768,0xbe4ec8be,2
+np.float32,0x7fa00000,0x7fe00000,2
+np.float32,0x3f484c1b,0x3f5d5e2f,2
+np.float32,0x8038be05,0x8038be05,2
+np.float32,0x58ac0f,0x58ac0f,2
+np.float32,0x7ed7fb72,0x7f800000,2
+np.float32,0x5a22e1,0x5a22e1,2
+np.float32,0xbebb7394,0xbebfaad6,2
+np.float32,0xbda98160,0xbda9b2ef,2
+np.float32,0x7f3e5c42,0x7f800000,2
+np.float32,0xfed204ae,0xff800000,2
+np.float32,0xbf5ef782,0xbf7c3ec5,2
+np.float32,0xbef7a0a8,0xbf00b292,2
+np.float32,0xfee6e176,0xff800000,2
+np.float32,0xfe121140,0xff800000,2
+np.float32,0xfe9e13be,0xff800000,2
+np.float32,0xbf3c98b1,0xbf4e2003,2
+np.float32,0x77520d,0x77520d,2
+np.float32,0xf17b2,0xf17b2,2
+np.float32,0x724d2f,0x724d2f,2
+np.float32,0x7eb326f5,0x7f800000,2
+np.float32,0x3edd6bf2,0x3ee4636e,2
+np.float32,0x350f57,0x350f57,2
+np.float32,0xff7d4435,0xff800000,2
+np.float32,0x802b2b9d,0x802b2b9d,2
+np.float32,0xbf7fbeee,0xbf963acf,2
+np.float32,0x804f3100,0x804f3100,2
+np.float32,0x7c594a71,0x7f800000,2
+np.float32,0x3ef49340,0x3efdfbb6,2
+np.float32,0x2e0659,0x2e0659,2
+np.float32,0x8006d5fe,0x8006d5fe,2
+np.float32,0xfd2a00b0,0xff800000,2
+np.float32,0xbee1c016,0xbee922ed,2
+np.float32,0x3e3b7de8,0x3e3c8a8b,2
+np.float32,0x805e6bba,0x805e6bba,2
+np.float32,0x1a7da2,0x1a7da2,2
+np.float32,0x6caba4,0x6caba4,2
+np.float32,0x802f7eab,0x802f7eab,2
+np.float32,0xff68b16b,0xff800000,2
+np.float32,0x8064f5e5,0x8064f5e5,2
+np.float32,0x2e39b4,0x2e39b4,2
+np.float32,0x800000,0x800000,2
+np.float32,0xfd0334c0,0xff800000,2
+np.float32,0x3e952fc4,0x3e974e7e,2
+np.float32,0x80057d33,0x80057d33,2
+np.float32,0x3ed3ddc4,0x3ed9f6f1,2
+np.float32,0x3f74ce18,0x3f8dedf4,2
+np.float32,0xff6bb7c0,0xff800000,2
+np.float32,0xff43bc21,0xff800000,2
+np.float32,0x80207570,0x80207570,2
+np.float32,0x7e1dda75,0x7f800000,2
+np.float32,0x3efe335c,0x3f0462ff,2
+np.float32,0xbf252c0c,0xbf30df70,2
+np.float32,0x3ef4b8e3,0x3efe25ba,2
+np.float32,0x7c33938d,0x7f800000,2
+np.float32,0x3eb1593c,0x3eb4ea95,2
+np.float32,0xfe1d0068,0xff800000,2
+np.float32,0xbf10da9b,0xbf18b551,2
+np.float32,0xfeb65748,0xff800000,2
+np.float32,0xfe8c6014,0xff800000,2
+np.float32,0x3f0503e2,0x3f0b14e3,2
+np.float32,0xfe5e5248,0xff800000,2
+np.float32,0xbd10afa0,0xbd10b754,2
+np.float32,0xff64b609,0xff800000,2
+np.float32,0xbf674a96,0xbf84089c,2
+np.float32,0x7f5d200d,0x7f800000,2
+np.float32,0x3cf44900,0x3cf45245,2
+np.float32,0x8044445a,0x8044445a,2
+np.float32,0xff35b676,0xff800000,2
+np.float32,0x806452cd,0x806452cd,2
+np.float32,0xbf2930fb,0xbf35c7b4,2
+np.float32,0x7e500617,0x7f800000,2
+np.float32,0x543719,0x543719,2
+np.float32,0x3ed11068,0x3ed6ec1d,2
+np.float32,0xbd8db068,0xbd8dcd59,2
+np.float32,0x3ede62c8,0x3ee571d0,2
+np.float32,0xbf00a410,0xbf061f9c,2
+np.float32,0xbf44fa39,0xbf58ff5b,2
+np.float32,0x3f1c3114,0x3f261069,2
+np.float32,0xbdea6210,0xbdeae521,2
+np.float32,0x80059f6d,0x80059f6d,2
+np.float32,0xbdba15f8,0xbdba578c,2
+np.float32,0x6d8a61,0x6d8a61,2
+np.float32,0x6f5428,0x6f5428,2
+np.float32,0x18d0e,0x18d0e,2
+np.float32,0x50e131,0x50e131,2
+np.float32,0x3f2f52be,0x3f3d5a7e,2
+np.float32,0x7399d8,0x7399d8,2
+np.float32,0x106524,0x106524,2
+np.float32,0x7ebf1c53,0x7f800000,2
+np.float32,0x80276458,0x80276458,2
+np.float32,0x3ebbde67,0x3ec01ceb,2
+np.float32,0x80144d9d,0x80144d9d,2
+np.float32,0x8017ea6b,0x8017ea6b,2
+np.float32,0xff38f201,0xff800000,2
+np.float32,0x7f2daa82,0x7f800000,2
+np.float32,0x3f3cb7c7,0x3f4e47ed,2
+np.float32,0x7f08c779,0x7f800000,2
+np.float32,0xbecc907a,0xbed20cec,2
+np.float32,0x7d440002,0x7f800000,2
+np.float32,0xbd410d80,0xbd411fcd,2
+np.float32,0x3d63ae07,0x3d63cc0c,2
+np.float32,0x805a9c13,0x805a9c13,2
+np.float32,0x803bdcdc,0x803bdcdc,2
+np.float32,0xbe88b354,0xbe8a5497,2
+np.float32,0x3f4eaf43,0x3f65e1c2,2
+np.float32,0x3f15e5b8,0x3f1e9c60,2
+np.float32,0x3e8a870c,0x3e8c394e,2
+np.float32,0x7e113de9,0x7f800000,2
+np.float32,0x7ee5ba41,0x7f800000,2
+np.float32,0xbe73d178,0xbe7620eb,2
+np.float32,0xfe972e6a,0xff800000,2
+np.float32,0xbf65567d,0xbf82a25a,2
+np.float32,0x3f38247e,0x3f487010,2
+np.float32,0xbece1c62,0xbed3b918,2
+np.float32,0x442c8d,0x442c8d,2
+np.float32,0x2dc52,0x2dc52,2
+np.float32,0x802ed923,0x802ed923,2
+np.float32,0x788cf8,0x788cf8,2
+np.float32,0x8024888e,0x8024888e,2
+np.float32,0x3f789bde,0x3f90c8fc,2
+np.float32,0x3f5de620,0x3f7abf88,2
+np.float32,0x3f0ffc45,0x3f17b2a7,2
+np.float32,0xbf709678,0xbf8accd4,2
+np.float32,0x12181f,0x12181f,2
+np.float32,0xfe54bbe4,0xff800000,2
+np.float32,0x7f1daba0,0x7f800000,2
+np.float32,0xbf6226df,0xbf805e3c,2
+np.float32,0xbd120610,0xbd120dfb,2
+np.float32,0x7f75e951,0x7f800000,2
+np.float32,0x80068048,0x80068048,2
+np.float32,0x45f04a,0x45f04a,2
+np.float32,0xff4c4f58,0xff800000,2
+np.float32,0x311604,0x311604,2
+np.float32,0x805e809c,0x805e809c,2
+np.float32,0x3d1d62c0,0x3d1d6caa,2
+np.float32,0x7f14ccf9,0x7f800000,2
+np.float32,0xff10017c,0xff800000,2
+np.float32,0xbf43ec48,0xbf579df4,2
+np.float32,0xff64da57,0xff800000,2
+np.float32,0x7f0622c5,0x7f800000,2
+np.float32,0x7f5460cd,0x7f800000,2
+np.float32,0xff0ef1c6,0xff800000,2
+np.float32,0xbece1146,0xbed3ad13,2
+np.float32,0x3f4d457f,0x3f63fc70,2
+np.float32,0xbdc1da28,0xbdc2244b,2
+np.float32,0xbe46d3f4,0xbe481463,2
+np.float32,0xff36b3d6,0xff800000,2
+np.float32,0xbec2e76c,0xbec7a540,2
+np.float32,0x8078fb81,0x8078fb81,2
+np.float32,0x7ec819cb,0x7f800000,2
+np.float32,0x39c4d,0x39c4d,2
+np.float32,0xbe8cddc2,0xbe8ea670,2
+np.float32,0xbf36dffb,0xbf46d48b,2
+np.float32,0xbf2302a3,0xbf2e4065,2
+np.float32,0x3e7b34a2,0x3e7dbb9a,2
+np.float32,0x3e3d87e1,0x3e3e9d62,2
+np.float32,0x7f3c94b1,0x7f800000,2
+np.float32,0x80455a85,0x80455a85,2
+np.float32,0xfd875568,0xff800000,2
+np.float32,0xbf618103,0xbf7fd1c8,2
+np.float32,0xbe332e3c,0xbe3418ac,2
+np.float32,0x80736b79,0x80736b79,2
+np.float32,0x3f705d9a,0x3f8aa2e6,2
+np.float32,0xbf3a36d2,0xbf4b134b,2
+np.float32,0xfddc55c0,0xff800000,2
+np.float32,0x805606fd,0x805606fd,2
+np.float32,0x3f4f0bc4,0x3f665e25,2
+np.float32,0xfebe7494,0xff800000,2
+np.float32,0xff0c541b,0xff800000,2
+np.float32,0xff0b8e7f,0xff800000,2
+np.float32,0xbcc51640,0xbcc51b1e,2
+np.float32,0x7ec1c4d0,0x7f800000,2
+np.float32,0xfc5c8e00,0xff800000,2
+np.float32,0x7f48d682,0x7f800000,2
+np.float32,0x7d5c7d8d,0x7f800000,2
+np.float32,0x8052ed03,0x8052ed03,2
+np.float32,0x7d4db058,0x7f800000,2
+np.float32,0xff3a65ee,0xff800000,2
+np.float32,0x806eeb93,0x806eeb93,2
+np.float32,0x803f9733,0x803f9733,2
+np.float32,0xbf2d1388,0xbf3a90e3,2
+np.float32,0x68e260,0x68e260,2
+np.float32,0x3e47a69f,0x3e48eb0e,2
+np.float32,0x3f0c4623,0x3f136646,2
+np.float32,0x3f37a831,0x3f47d249,2
+np.float32,0xff153a0c,0xff800000,2
+np.float32,0x2e8086,0x2e8086,2
+np.float32,0xc3f5e,0xc3f5e,2
+np.float32,0x7f31dc14,0x7f800000,2
+np.float32,0xfee37d68,0xff800000,2
+np.float32,0x711d4,0x711d4,2
+np.float32,0x7ede2ce4,0x7f800000,2
+np.float32,0xbf5d76d0,0xbf7a23d0,2
+np.float32,0xbe2b9eb4,0xbe2c6cac,2
+np.float32,0x2b14d7,0x2b14d7,2
+np.float32,0x3ea1db72,0x3ea4910e,2
+np.float32,0x7f3f03f7,0x7f800000,2
+np.float32,0x92de5,0x92de5,2
+np.float32,0x80322e1b,0x80322e1b,2
+np.float32,0xbf5eb214,0xbf7bdd55,2
+np.float32,0xbf21bf87,0xbf2cba14,2
+np.float32,0xbf5d4b78,0xbf79e73a,2
+np.float32,0xbc302840,0xbc30291e,2
+np.float32,0xfee567c6,0xff800000,2
+np.float32,0x7f70ee14,0x7f800000,2
+np.float32,0x7e5c4b33,0x7f800000,2
+np.float32,0x3f1e7b64,0x3f28ccfd,2
+np.float32,0xbf6309f7,0xbf80ff3e,2
+np.float32,0x1c2fe3,0x1c2fe3,2
+np.float32,0x8e78d,0x8e78d,2
+np.float32,0x7f2fce73,0x7f800000,2
+np.float32,0x7f25f690,0x7f800000,2
+np.float32,0x8074cba5,0x8074cba5,2
+np.float32,0x16975f,0x16975f,2
+np.float32,0x8012cf5c,0x8012cf5c,2
+np.float32,0x7da72138,0x7f800000,2
+np.float32,0xbf563f35,0xbf7025be,2
+np.float32,0x3f69d3f5,0x3f85dcbe,2
+np.float32,0xbf15c148,0xbf1e7184,2
+np.float32,0xbe7a077c,0xbe7c8564,2
+np.float32,0x3ebb6ef1,0x3ebfa5e3,2
+np.float32,0xbe41fde4,0xbe43277b,2
+np.float32,0x7f10b479,0x7f800000,2
+np.float32,0x3e021ace,0x3e02747d,2
+np.float32,0x3e93d984,0x3e95e9be,2
+np.float32,0xfe17e924,0xff800000,2
+np.float32,0xfe21a7cc,0xff800000,2
+np.float32,0x8019b660,0x8019b660,2
+np.float32,0x7e954631,0x7f800000,2
+np.float32,0x7e7330d1,0x7f800000,2
+np.float32,0xbe007d98,0xbe00d3fb,2
+np.float32,0x3ef3870e,0x3efcd077,2
+np.float32,0x7f5bbde8,0x7f800000,2
+np.float32,0x14a5b3,0x14a5b3,2
+np.float32,0x3e84d23f,0x3e8650e8,2
+np.float32,0x80763017,0x80763017,2
+np.float32,0xfe871f36,0xff800000,2
+np.float32,0x7ed43150,0x7f800000,2
+np.float32,0x3cc44547,0x3cc44a16,2
+np.float32,0x3ef0c0fa,0x3ef9b97d,2
+np.float32,0xbede9944,0xbee5ad86,2
+np.float32,0xbf10f0b2,0xbf18cf0a,2
+np.float32,0x3ecdaa78,0x3ed33dd9,2
+np.float32,0x3f7cc058,0x3f93ee6b,2
+np.float32,0x2d952f,0x2d952f,2
+np.float32,0x3f2cf2de,0x3f3a687a,2
+np.float32,0x8029b33c,0x8029b33c,2
+np.float32,0xbf22c737,0xbf2df888,2
+np.float32,0xff53c84a,0xff800000,2
+np.float32,0x40a509,0x40a509,2
+np.float32,0x56abce,0x56abce,2
+np.float32,0xff7fffff,0xff800000,2
+np.float32,0xbf3e67f6,0xbf50741c,2
+np.float32,0xfde67580,0xff800000,2
+np.float32,0x3f103e9b,0x3f17ffc7,2
+np.float32,0x3f3f7232,0x3f51cbe2,2
+np.float32,0x803e6d78,0x803e6d78,2
+np.float32,0x3a61da,0x3a61da,2
+np.float32,0xbc04de80,0xbc04dedf,2
+np.float32,0x7f1e7c52,0x7f800000,2
+np.float32,0x8058ee88,0x8058ee88,2
+np.float32,0x806dd660,0x806dd660,2
+np.float32,0x7e4af9,0x7e4af9,2
+np.float32,0x80702d27,0x80702d27,2
+np.float32,0x802cdad1,0x802cdad1,2
+np.float32,0x3e9b5c23,0x3e9dc149,2
+np.float32,0x7f076e89,0x7f800000,2
+np.float32,0x7f129d68,0x7f800000,2
+np.float32,0x7f6f0b0a,0x7f800000,2
+np.float32,0x7eafafb5,0x7f800000,2
+np.float32,0xbf2ef2ca,0xbf3ce332,2
+np.float32,0xff34c000,0xff800000,2
+np.float32,0x7f559274,0x7f800000,2
+np.float32,0xfed08556,0xff800000,2
+np.float32,0xbf014621,0xbf06d6ad,2
+np.float32,0xff23086a,0xff800000,2
+np.float32,0x6cb33f,0x6cb33f,2
+np.float32,0xfe6e3ffc,0xff800000,2
+np.float32,0x3e6bbec0,0x3e6dd546,2
+np.float32,0x8036afa6,0x8036afa6,2
+np.float32,0xff800000,0xff800000,2
+np.float32,0x3e0ed05c,0x3e0f46ff,2
+np.float32,0x3ec9215c,0x3ece57e6,2
+np.float32,0xbf449fa4,0xbf5888aa,2
+np.float32,0xff2c6640,0xff800000,2
+np.float32,0x7f08f4a7,0x7f800000,2
+np.float32,0xbf4f63e5,0xbf66d4c1,2
+np.float32,0x3f800000,0x3f966cfe,2
+np.float32,0xfe86c7d2,0xff800000,2
+np.float32,0x3f63f969,0x3f81a970,2
+np.float32,0xbd7022d0,0xbd704609,2
+np.float32,0xbead906c,0xbeb0e853,2
+np.float32,0x7ef149ee,0x7f800000,2
+np.float32,0xff0b9ff7,0xff800000,2
+np.float32,0x3f38380d,0x3f4888e7,2
+np.float32,0x3ef3a3e2,0x3efcf09e,2
+np.float32,0xff616477,0xff800000,2
+np.float32,0x3f3f83e4,0x3f51e2c3,2
+np.float32,0xbf79963c,0xbf918642,2
+np.float32,0x801416f4,0x801416f4,2
+np.float32,0xff75ce6d,0xff800000,2
+np.float32,0xbdbf3588,0xbdbf7cad,2
+np.float32,0xbe6ea938,0xbe70d3dc,2
+np.float32,0x8066f977,0x8066f977,2
+np.float32,0x3f5b5362,0x3f7728aa,2
+np.float32,0xbf72052c,0xbf8bdbd8,2
+np.float32,0xbe21ed74,0xbe229a6f,2
+np.float32,0x8062d19c,0x8062d19c,2
+np.float32,0x3ed8d01f,0x3edf59e6,2
+np.float32,0x803ed42b,0x803ed42b,2
+np.float32,0xbe099a64,0xbe0a0481,2
+np.float32,0xbe173eb4,0xbe17cba2,2
+np.float32,0xbebdcf02,0xbec22faf,2
+np.float32,0x7e3ff29e,0x7f800000,2
+np.float32,0x367c92,0x367c92,2
+np.float32,0xbf5c9db8,0xbf78f4a4,2
+np.float32,0xff0b49ea,0xff800000,2
+np.float32,0x3f4f9bc4,0x3f672001,2
+np.float32,0x85d4a,0x85d4a,2
+np.float32,0x80643e33,0x80643e33,2
+np.float32,0x8013aabd,0x8013aabd,2
+np.float32,0xff6997c3,0xff800000,2
+np.float32,0x3f4dd43c,0x3f64bbb6,2
+np.float32,0xff13bbb9,0xff800000,2
+np.float32,0x3f34efa2,0x3f446187,2
+np.float32,0x3e4b2f10,0x3e4c850d,2
+np.float32,0xfef695c6,0xff800000,2
+np.float32,0x7f7e0057,0x7f800000,2
+np.float32,0x3f6e1b9c,0x3f88fa40,2
+np.float32,0x806e46cf,0x806e46cf,2
+np.float32,0x3f15a88a,0x3f1e546c,2
+np.float32,0xbd2de7d0,0xbd2df530,2
+np.float32,0xbf63cae0,0xbf818854,2
+np.float32,0xbdc3e1a0,0xbdc42e1e,2
+np.float32,0xbf11a038,0xbf199b98,2
+np.float32,0xbec13706,0xbec5d56b,2
+np.float32,0x3f1c5f54,0x3f26478d,2
+np.float32,0x3e9ea97e,0x3ea136b4,2
+np.float32,0xfeb5a508,0xff800000,2
+np.float32,0x7f4698f4,0x7f800000,2
+np.float32,0xff51ee2c,0xff800000,2
+np.float32,0xff5994df,0xff800000,2
+np.float32,0x4b9fb9,0x4b9fb9,2
+np.float32,0xfda10d98,0xff800000,2
+np.float32,0x525555,0x525555,2
+np.float32,0x7ed571ef,0x7f800000,2
+np.float32,0xbf600d18,0xbf7dc50c,2
+np.float32,0x3ec674ca,0x3ecb768b,2
+np.float32,0x3cb69115,0x3cb694f3,2
+np.float32,0x7eac75f2,0x7f800000,2
+np.float32,0x804d4d75,0x804d4d75,2
+np.float32,0xfed5292e,0xff800000,2
+np.float32,0x800ed06a,0x800ed06a,2
+np.float32,0xfec37584,0xff800000,2
+np.float32,0x3ef96ac7,0x3f01b326,2
+np.float32,0x42f743,0x42f743,2
+np.float32,0x3f56f442,0x3f711e39,2
+np.float32,0xbf7ea726,0xbf956375,2
+np.float32,0x806c7202,0x806c7202,2
+np.float32,0xbd8ee980,0xbd8f0733,2
+np.float32,0xbdf2e930,0xbdf37b18,2
+np.float32,0x3f103910,0x3f17f955,2
+np.float32,0xff123e8f,0xff800000,2
+np.float32,0x806e4b5d,0x806e4b5d,2
+np.float32,0xbf4f3bfc,0xbf669f07,2
+np.float32,0xbf070c16,0xbf0d6609,2
+np.float32,0xff00e0ba,0xff800000,2
+np.float32,0xff49d828,0xff800000,2
+np.float32,0x7e47f04a,0x7f800000,2
+np.float32,0x7e984dac,0x7f800000,2
+np.float32,0x3f77473c,0x3f8fc858,2
+np.float32,0x3f017439,0x3f070ac8,2
+np.float32,0x118417,0x118417,2
+np.float32,0xbcf7a2c0,0xbcf7ac68,2
+np.float32,0xfee46fee,0xff800000,2
+np.float32,0x3e42a648,0x3e43d2e9,2
+np.float32,0x80131916,0x80131916,2
+np.float32,0x806209d3,0x806209d3,2
+np.float32,0x807c1f12,0x807c1f12,2
+np.float32,0x2f3696,0x2f3696,2
+np.float32,0xff28722b,0xff800000,2
+np.float32,0x7f1416a1,0x7f800000,2
+np.float32,0x8054e7a1,0x8054e7a1,2
+np.float32,0xbddc39a0,0xbddca656,2
+np.float32,0x7dc60175,0x7f800000,2
+np.float64,0x7fd0ae584da15cb0,0x7ff0000000000000,2
+np.float64,0x7fd41d68e5283ad1,0x7ff0000000000000,2
+np.float64,0x7fe93073bb7260e6,0x7ff0000000000000,2
+np.float64,0x3fb4fd19d229fa34,0x3fb5031f57dbac0f,2
+np.float64,0x85609ce10ac2,0x85609ce10ac2,2
+np.float64,0xbfd7aa12ccaf5426,0xbfd8351003a320e2,2
+np.float64,0x8004487c9b4890fa,0x8004487c9b4890fa,2
+np.float64,0x7fe7584cfd2eb099,0x7ff0000000000000,2
+np.float64,0x800ea8edc6dd51dc,0x800ea8edc6dd51dc,2
+np.float64,0x3fe0924aa5a12495,0x3fe15276e271c6dc,2
+np.float64,0x3feb1abf6d36357f,0x3fee76b4d3d06964,2
+np.float64,0x3fa8c14534318280,0x3fa8c3bd5ce5923c,2
+np.float64,0x800b9f5915d73eb3,0x800b9f5915d73eb3,2
+np.float64,0xffc05aaa7820b554,0xfff0000000000000,2
+np.float64,0x800157eda8c2afdc,0x800157eda8c2afdc,2
+np.float64,0xffe8d90042b1b200,0xfff0000000000000,2
+np.float64,0x3feda02ea93b405d,0x3ff1057e61d08d59,2
+np.float64,0xffd03b7361a076e6,0xfff0000000000000,2
+np.float64,0x3fe1a8ecd7e351da,0x3fe291eda9080847,2
+np.float64,0xffc5bfdff82b7fc0,0xfff0000000000000,2
+np.float64,0xbfe6fb3d386df67a,0xbfe9022c05df0565,2
+np.float64,0x7fefffffffffffff,0x7ff0000000000000,2
+np.float64,0x7fa10c340c221867,0x7ff0000000000000,2
+np.float64,0x3fe55cbf1daab97e,0x3fe6fc1648258b75,2
+np.float64,0xbfddeb5f60bbd6be,0xbfdf056d4fb5825f,2
+np.float64,0xffddb1a8213b6350,0xfff0000000000000,2
+np.float64,0xbfb20545e4240a88,0xbfb2091579375176,2
+np.float64,0x3f735ded2026bbda,0x3f735df1dad4ee3a,2
+np.float64,0xbfd1eb91efa3d724,0xbfd227c044dead61,2
+np.float64,0xffd737c588ae6f8c,0xfff0000000000000,2
+np.float64,0x3fc46818ec28d032,0x3fc47e416c4237a6,2
+np.float64,0x0,0x0,2
+np.float64,0xffb632097a2c6410,0xfff0000000000000,2
+np.float64,0xbfcb5ae84b36b5d0,0xbfcb905613af55b8,2
+np.float64,0xbfe7b926402f724c,0xbfe9f4f0be6aacc3,2
+np.float64,0x80081840b3f03082,0x80081840b3f03082,2
+np.float64,0x3fe767a656eecf4d,0x3fe98c53b4779de7,2
+np.float64,0x8005834c088b0699,0x8005834c088b0699,2
+np.float64,0x80074e92658e9d26,0x80074e92658e9d26,2
+np.float64,0x80045d60c268bac2,0x80045d60c268bac2,2
+np.float64,0xffb9aecfe8335da0,0xfff0000000000000,2
+np.float64,0x7fcad3e1cd35a7c3,0x7ff0000000000000,2
+np.float64,0xbf881853d03030c0,0xbf8818783e28fc87,2
+np.float64,0xe18c6d23c318e,0xe18c6d23c318e,2
+np.float64,0x7fcb367b8f366cf6,0x7ff0000000000000,2
+np.float64,0x5c13436cb8269,0x5c13436cb8269,2
+np.float64,0xffe5399938aa7332,0xfff0000000000000,2
+np.float64,0xbfdc45dbc3b88bb8,0xbfdd33958222c27e,2
+np.float64,0xbfd714691bae28d2,0xbfd7954edbef810b,2
+np.float64,0xbfdf18b02b3e3160,0xbfe02ad13634c651,2
+np.float64,0x8003e6f276e7cde6,0x8003e6f276e7cde6,2
+np.float64,0x3febb6b412776d68,0x3fef4f753def31f9,2
+np.float64,0x7fe016a3b4a02d46,0x7ff0000000000000,2
+np.float64,0x3fdc899ac7b91336,0x3fdd7e1cee1cdfc8,2
+np.float64,0x800219271e24324f,0x800219271e24324f,2
+np.float64,0x1529d93e2a53c,0x1529d93e2a53c,2
+np.float64,0x800d5bc827fab790,0x800d5bc827fab790,2
+np.float64,0x3e1495107c293,0x3e1495107c293,2
+np.float64,0x3fe89da0f2b13b42,0x3feb1dc1f3015ad7,2
+np.float64,0x800ba8c17b975183,0x800ba8c17b975183,2
+np.float64,0x8002dacf0265b59f,0x8002dacf0265b59f,2
+np.float64,0xffe6d0a4cc2da149,0xfff0000000000000,2
+np.float64,0x3fdf23fe82be47fc,0x3fe03126d8e2b309,2
+np.float64,0xffe41b1f1c28363e,0xfff0000000000000,2
+np.float64,0xbfd635c634ac6b8c,0xbfd6a8966da6adaa,2
+np.float64,0x800755bc08eeab79,0x800755bc08eeab79,2
+np.float64,0x800ba4c47c374989,0x800ba4c47c374989,2
+np.float64,0x7fec9f7649793eec,0x7ff0000000000000,2
+np.float64,0x7fdbf45738b7e8ad,0x7ff0000000000000,2
+np.float64,0x3f5597f07eab4,0x3f5597f07eab4,2
+np.float64,0xbfbf4599183e8b30,0xbfbf5985d8c65097,2
+np.float64,0xbf5b200580364000,0xbf5b2006501b21ae,2
+np.float64,0x7f91868370230d06,0x7ff0000000000000,2
+np.float64,0x3838e2a67071d,0x3838e2a67071d,2
+np.float64,0xffefe3ff5d3fc7fe,0xfff0000000000000,2
+np.float64,0xffe66b26d06cd64d,0xfff0000000000000,2
+np.float64,0xbfd830a571b0614a,0xbfd8c526927c742c,2
+np.float64,0x7fe8442122f08841,0x7ff0000000000000,2
+np.float64,0x800efa8c637df519,0x800efa8c637df519,2
+np.float64,0xf0026835e004d,0xf0026835e004d,2
+np.float64,0xffb11beefe2237e0,0xfff0000000000000,2
+np.float64,0x3fef9bbb327f3776,0x3ff2809f10641c32,2
+np.float64,0x350595306a0b3,0x350595306a0b3,2
+np.float64,0xf7f6538befecb,0xf7f6538befecb,2
+np.float64,0xffe36379c4a6c6f3,0xfff0000000000000,2
+np.float64,0x28b1d82e5163c,0x28b1d82e5163c,2
+np.float64,0x70a3d804e147c,0x70a3d804e147c,2
+np.float64,0xffd96c1bc9b2d838,0xfff0000000000000,2
+np.float64,0xffce8e00893d1c00,0xfff0000000000000,2
+np.float64,0x800f2bdcb25e57b9,0x800f2bdcb25e57b9,2
+np.float64,0xbfe0d9c63361b38c,0xbfe1a3eb02192b76,2
+np.float64,0xbfdc7b8711b8f70e,0xbfdd6e9db3a01e51,2
+np.float64,0x99e22ec133c46,0x99e22ec133c46,2
+np.float64,0xffeaef6ddab5dedb,0xfff0000000000000,2
+np.float64,0x7fe89c22c0f13845,0x7ff0000000000000,2
+np.float64,0x8002d5207de5aa42,0x8002d5207de5aa42,2
+np.float64,0x3fd1b13353236267,0x3fd1eb1b9345dfca,2
+np.float64,0x800ccae0a41995c1,0x800ccae0a41995c1,2
+np.float64,0x3fdbdaba38b7b574,0x3fdcbdfcbca37ce6,2
+np.float64,0x5b06d12cb60db,0x5b06d12cb60db,2
+np.float64,0xffd52262752a44c4,0xfff0000000000000,2
+np.float64,0x5a17f050b42ff,0x5a17f050b42ff,2
+np.float64,0x3d24205e7a485,0x3d24205e7a485,2
+np.float64,0x7fbed4dec63da9bd,0x7ff0000000000000,2
+np.float64,0xbfe56e9776aadd2f,0xbfe71212863c284f,2
+np.float64,0x7fea0bc952341792,0x7ff0000000000000,2
+np.float64,0x800f692d139ed25a,0x800f692d139ed25a,2
+np.float64,0xffdb63feab36c7fe,0xfff0000000000000,2
+np.float64,0x3fe1c2297fe38452,0x3fe2af21293c9571,2
+np.float64,0x7fede384747bc708,0x7ff0000000000000,2
+np.float64,0x800440169288802e,0x800440169288802e,2
+np.float64,0xffe3241eeb26483e,0xfff0000000000000,2
+np.float64,0xffe28f3879651e70,0xfff0000000000000,2
+np.float64,0xa435cbc1486d,0xa435cbc1486d,2
+np.float64,0x7fe55e08db6abc11,0x7ff0000000000000,2
+np.float64,0x1405e624280be,0x1405e624280be,2
+np.float64,0x3fd861bdf0b0c37c,0x3fd8f9d2e33e45e5,2
+np.float64,0x3feeb67cdc3d6cfa,0x3ff1d337d81d1c14,2
+np.float64,0x3fd159a10e22b342,0x3fd1903be7c2ea0c,2
+np.float64,0x3fd84626bc308c4d,0x3fd8dc373645e65b,2
+np.float64,0xffd3da81d9a7b504,0xfff0000000000000,2
+np.float64,0xbfd4a768b8294ed2,0xbfd503aa7c240051,2
+np.float64,0x3fe3059f2a660b3e,0x3fe42983e0c6bb2e,2
+np.float64,0x3fe3b8353827706a,0x3fe4fdd635c7269b,2
+np.float64,0xbfe4af0399695e07,0xbfe6277d9002b46c,2
+np.float64,0xbfd7e18a92afc316,0xbfd87066b54c4fe6,2
+np.float64,0x800432bcab48657a,0x800432bcab48657a,2
+np.float64,0x80033d609d267ac2,0x80033d609d267ac2,2
+np.float64,0x7fef5f758e7ebeea,0x7ff0000000000000,2
+np.float64,0xbfed7833dbfaf068,0xbff0e85bf45a5ebc,2
+np.float64,0x3fe2283985a45073,0x3fe325b0a9099c74,2
+np.float64,0xe820b4b3d0417,0xe820b4b3d0417,2
+np.float64,0x8003ecb72aa7d96f,0x8003ecb72aa7d96f,2
+np.float64,0xbfeab2c755b5658f,0xbfede7c83e92a625,2
+np.float64,0xbfc7b287f72f6510,0xbfc7d53ef2ffe9dc,2
+np.float64,0xffd9a41d0f33483a,0xfff0000000000000,2
+np.float64,0x3fd3a5b6e3a74b6c,0x3fd3f516f39a4725,2
+np.float64,0x800bc72091578e42,0x800bc72091578e42,2
+np.float64,0x800ff405ce9fe80c,0x800ff405ce9fe80c,2
+np.float64,0x57918600af24,0x57918600af24,2
+np.float64,0x2a5be7fa54b7e,0x2a5be7fa54b7e,2
+np.float64,0xbfdca7886bb94f10,0xbfdd9f142b5b43e4,2
+np.float64,0xbfe216993ee42d32,0xbfe3112936590995,2
+np.float64,0xbfe06bd9cf20d7b4,0xbfe126cd353ab42f,2
+np.float64,0x8003e6c31827cd87,0x8003e6c31827cd87,2
+np.float64,0x8005f37d810be6fc,0x8005f37d810be6fc,2
+np.float64,0x800715b081ae2b62,0x800715b081ae2b62,2
+np.float64,0x3fef94c35bff2986,0x3ff27b4bed2f4051,2
+np.float64,0x6f5798e0deb0,0x6f5798e0deb0,2
+np.float64,0x3fcef1f05c3de3e1,0x3fcf3f557550598f,2
+np.float64,0xbf9a91c400352380,0xbf9a92876273b85c,2
+np.float64,0x3fc9143f7f322880,0x3fc93d678c05d26b,2
+np.float64,0x78ad847af15b1,0x78ad847af15b1,2
+np.float64,0x8000fdc088c1fb82,0x8000fdc088c1fb82,2
+np.float64,0x800200fd304401fb,0x800200fd304401fb,2
+np.float64,0x7fb8ab09dc315613,0x7ff0000000000000,2
+np.float64,0x3fe949771b7292ee,0x3fec00891c3fc5a2,2
+np.float64,0xbfc54cae0e2a995c,0xbfc565e0f3d0e3af,2
+np.float64,0xffd546161e2a8c2c,0xfff0000000000000,2
+np.float64,0x800fe1d1279fc3a2,0x800fe1d1279fc3a2,2
+np.float64,0x3fd9c45301b388a8,0x3fda77fa1f4c79bf,2
+np.float64,0x7fe10ff238221fe3,0x7ff0000000000000,2
+np.float64,0xbfbc2181ae384300,0xbfbc3002229155c4,2
+np.float64,0xbfe7bbfae4ef77f6,0xbfe9f895e91f468d,2
+np.float64,0x800d3d994f7a7b33,0x800d3d994f7a7b33,2
+np.float64,0xffe6e15a896dc2b4,0xfff0000000000000,2
+np.float64,0x800e6b6c8abcd6d9,0x800e6b6c8abcd6d9,2
+np.float64,0xbfd862c938b0c592,0xbfd8faf1cdcb09db,2
+np.float64,0xffe2411f8464823e,0xfff0000000000000,2
+np.float64,0xffd0b32efaa1665e,0xfff0000000000000,2
+np.float64,0x3ac4ace475896,0x3ac4ace475896,2
+np.float64,0xf9c3a7ebf3875,0xf9c3a7ebf3875,2
+np.float64,0xdb998ba5b7332,0xdb998ba5b7332,2
+np.float64,0xbfe438a14fe87142,0xbfe5981751e4c5cd,2
+np.float64,0xbfbcf48cbc39e918,0xbfbd045d60e65d3a,2
+np.float64,0x7fde499615bc932b,0x7ff0000000000000,2
+np.float64,0x800bba269057744e,0x800bba269057744e,2
+np.float64,0x3fc9bb1ba3337638,0x3fc9e78fdb6799c1,2
+np.float64,0xffd9f974fbb3f2ea,0xfff0000000000000,2
+np.float64,0x7fcf1ad1693e35a2,0x7ff0000000000000,2
+np.float64,0x7fe5dcedd32bb9db,0x7ff0000000000000,2
+np.float64,0xeb06500bd60ca,0xeb06500bd60ca,2
+np.float64,0x7fd73e7b592e7cf6,0x7ff0000000000000,2
+np.float64,0xbfe9d91ae873b236,0xbfecc08482849bcd,2
+np.float64,0xffc85338b730a670,0xfff0000000000000,2
+np.float64,0x7fbba41eee37483d,0x7ff0000000000000,2
+np.float64,0x3fed5624fb7aac4a,0x3ff0cf9f0de1fd54,2
+np.float64,0xffe566d80d6acdb0,0xfff0000000000000,2
+np.float64,0x3fd4477884a88ef1,0x3fd49ec7acdd25a0,2
+np.float64,0x3fcb98c5fd37318c,0x3fcbcfa20e2c2712,2
+np.float64,0xffdeba71d5bd74e4,0xfff0000000000000,2
+np.float64,0x8001edc59dc3db8c,0x8001edc59dc3db8c,2
+np.float64,0x3fe6b09e896d613e,0x3fe8a3bb541ec0e3,2
+np.float64,0x3fe8694b4970d296,0x3fead94d271d05cf,2
+np.float64,0xb52c27bf6a585,0xb52c27bf6a585,2
+np.float64,0x7fcb0a21d9361443,0x7ff0000000000000,2
+np.float64,0xbfd9efc68cb3df8e,0xbfdaa7058c0ccbd1,2
+np.float64,0x8007cd170fef9a2f,0x8007cd170fef9a2f,2
+np.float64,0x3fe83325e770664c,0x3fea92c55c9d567e,2
+np.float64,0x800bd0085537a011,0x800bd0085537a011,2
+np.float64,0xffe05b9e7820b73c,0xfff0000000000000,2
+np.float64,0x3fea4ce4347499c8,0x3fed5cea9fdc541b,2
+np.float64,0x7fe08aae1921155b,0x7ff0000000000000,2
+np.float64,0x3fe7a5e7deef4bd0,0x3fe9dc2e20cfb61c,2
+np.float64,0xbfe0ccc8e6e19992,0xbfe195175f32ee3f,2
+np.float64,0xbfe8649717f0c92e,0xbfead3298974dcf0,2
+np.float64,0x7fed6c5308bad8a5,0x7ff0000000000000,2
+np.float64,0xffdbd8c7af37b190,0xfff0000000000000,2
+np.float64,0xbfb2bc4d06257898,0xbfb2c09569912839,2
+np.float64,0x3fc62eca512c5d95,0x3fc64b4251bce8f9,2
+np.float64,0xbfcae2ddbd35c5bc,0xbfcb15971fc61312,2
+np.float64,0x18d26ce831a4f,0x18d26ce831a4f,2
+np.float64,0x7fe38b279267164e,0x7ff0000000000000,2
+np.float64,0x97e1d9ab2fc3b,0x97e1d9ab2fc3b,2
+np.float64,0xbfee8e4785fd1c8f,0xbff1b52d16807627,2
+np.float64,0xbfb189b4a6231368,0xbfb18d37e83860ee,2
+np.float64,0xffd435761ea86aec,0xfff0000000000000,2
+np.float64,0x3fe6c48ebced891e,0x3fe8bcea189c3867,2
+np.float64,0x7fdadd3678b5ba6c,0x7ff0000000000000,2
+np.float64,0x7fea8f15b7b51e2a,0x7ff0000000000000,2
+np.float64,0xbff0000000000000,0xbff2cd9fc44eb982,2
+np.float64,0x80004c071120980f,0x80004c071120980f,2
+np.float64,0x8005367adfea6cf6,0x8005367adfea6cf6,2
+np.float64,0x3fbdc9139a3b9220,0x3fbdda4aba667ce5,2
+np.float64,0x7fed5ee3ad7abdc6,0x7ff0000000000000,2
+np.float64,0x51563fb2a2ac9,0x51563fb2a2ac9,2
+np.float64,0xbfba7d26ce34fa50,0xbfba894229c50ea1,2
+np.float64,0x6c10db36d821c,0x6c10db36d821c,2
+np.float64,0xbfbdaec0d03b5d80,0xbfbdbfca6ede64f4,2
+np.float64,0x800a1cbe7414397d,0x800a1cbe7414397d,2
+np.float64,0x800ae6e7f2d5cdd0,0x800ae6e7f2d5cdd0,2
+np.float64,0x3fea63d3fef4c7a8,0x3fed7c1356688ddc,2
+np.float64,0xbfde1e3a88bc3c76,0xbfdf3dfb09cc2260,2
+np.float64,0xbfd082d75a2105ae,0xbfd0b1e28c84877b,2
+np.float64,0x7fea1e5e85f43cbc,0x7ff0000000000000,2
+np.float64,0xffe2237a1a6446f4,0xfff0000000000000,2
+np.float64,0x3fd1e2be8523c57d,0x3fd21e93dfd1bbc4,2
+np.float64,0x3fd1acd428a359a8,0x3fd1e6916a42bc3a,2
+np.float64,0x61a152f0c342b,0x61a152f0c342b,2
+np.float64,0xbfc61a6b902c34d8,0xbfc6369557690ba0,2
+np.float64,0x7fd1a84b1f235095,0x7ff0000000000000,2
+np.float64,0x1c5cc7e638b9a,0x1c5cc7e638b9a,2
+np.float64,0x8008039755f0072f,0x8008039755f0072f,2
+np.float64,0x80097532d6f2ea66,0x80097532d6f2ea66,2
+np.float64,0xbfc6d979a12db2f4,0xbfc6f89777c53f8f,2
+np.float64,0x8004293ab1085276,0x8004293ab1085276,2
+np.float64,0x3fc2af5c21255eb8,0x3fc2c05dc0652554,2
+np.float64,0xbfd9a5ab87b34b58,0xbfda56d1076abc98,2
+np.float64,0xbfebd360ba77a6c2,0xbfef779fd6595f9b,2
+np.float64,0xffd5313c43aa6278,0xfff0000000000000,2
+np.float64,0xbfe994a262b32945,0xbfec64b969852ed5,2
+np.float64,0x3fce01a52e3c034a,0x3fce48324eb29c31,2
+np.float64,0x56bd74b2ad7af,0x56bd74b2ad7af,2
+np.float64,0xb84093ff70813,0xb84093ff70813,2
+np.float64,0x7fe776df946eedbe,0x7ff0000000000000,2
+np.float64,0xbfe294ac2e652958,0xbfe3a480938afa26,2
+np.float64,0x7fe741b4d0ee8369,0x7ff0000000000000,2
+np.float64,0x800b7e8a1056fd15,0x800b7e8a1056fd15,2
+np.float64,0x7fd28f1269251e24,0x7ff0000000000000,2
+np.float64,0x8009d4492e73a893,0x8009d4492e73a893,2
+np.float64,0x3fe3f27fca67e500,0x3fe543aff825e244,2
+np.float64,0x3fd12447e5a24890,0x3fd158efe43c0452,2
+np.float64,0xbfd58df0f2ab1be2,0xbfd5f6d908e3ebce,2
+np.float64,0xffc0a8e4642151c8,0xfff0000000000000,2
+np.float64,0xbfedb197787b632f,0xbff112367ec9d3e7,2
+np.float64,0xffdde07a7f3bc0f4,0xfff0000000000000,2
+np.float64,0x3fe91f3e5b723e7d,0x3febc886a1d48364,2
+np.float64,0x3fe50415236a082a,0x3fe68f43a5468d8c,2
+np.float64,0xd9a0c875b3419,0xd9a0c875b3419,2
+np.float64,0xbfee04ccf4bc099a,0xbff14f4740a114cf,2
+np.float64,0xbfd2bcc6a125798e,0xbfd30198b1e7d7ed,2
+np.float64,0xbfeb3c16f8f6782e,0xbfeea4ce47d09f58,2
+np.float64,0xffd3ba19e4a77434,0xfff0000000000000,2
+np.float64,0x8010000000000000,0x8010000000000000,2
+np.float64,0x3fdef0a642bde14d,0x3fe0146677b3a488,2
+np.float64,0x3fdc3dd0a2b87ba0,0x3fdd2abe65651487,2
+np.float64,0x3fdbb1fd47b763fb,0x3fdc915a2fd19f4b,2
+np.float64,0x7fbaa375e63546eb,0x7ff0000000000000,2
+np.float64,0x433ef8ee867e0,0x433ef8ee867e0,2
+np.float64,0xf5345475ea68b,0xf5345475ea68b,2
+np.float64,0xa126419b424c8,0xa126419b424c8,2
+np.float64,0x3fe0057248200ae5,0x3fe0b2f488339709,2
+np.float64,0xffc5e3b82f2bc770,0xfff0000000000000,2
+np.float64,0xffb215c910242b90,0xfff0000000000000,2
+np.float64,0xbfeba4ae0837495c,0xbfef3642e4b54aac,2
+np.float64,0xffbb187ebe363100,0xfff0000000000000,2
+np.float64,0x3fe4c6a496a98d49,0x3fe64440cdf06aab,2
+np.float64,0x800767a28f6ecf46,0x800767a28f6ecf46,2
+np.float64,0x3fdbed63b1b7dac8,0x3fdcd27318c0b683,2
+np.float64,0x80006d8339e0db07,0x80006d8339e0db07,2
+np.float64,0x8000b504f0416a0b,0x8000b504f0416a0b,2
+np.float64,0xbfe88055bfb100ac,0xbfeaf767bd2767b9,2
+np.float64,0x3fefe503317fca06,0x3ff2b8d4057240c8,2
+np.float64,0x7fe307538b660ea6,0x7ff0000000000000,2
+np.float64,0x944963c12892d,0x944963c12892d,2
+np.float64,0xbfd2c20b38a58416,0xbfd30717900f8233,2
+np.float64,0x7feed04e3e3da09b,0x7ff0000000000000,2
+np.float64,0x3fe639619cac72c3,0x3fe80de7b8560a8d,2
+np.float64,0x3fde066c66bc0cd9,0x3fdf237fb759a652,2
+np.float64,0xbfc56b22b52ad644,0xbfc584c267a47ebd,2
+np.float64,0x3fc710d5b12e21ab,0x3fc730d817ba0d0c,2
+np.float64,0x3fee1dfc347c3bf8,0x3ff161d9c3e15f68,2
+np.float64,0x3fde400954bc8013,0x3fdf639e5cc9e7a9,2
+np.float64,0x56e701f8adce1,0x56e701f8adce1,2
+np.float64,0xbfe33bbc89e67779,0xbfe46996b39381fe,2
+np.float64,0x7fec89e2f87913c5,0x7ff0000000000000,2
+np.float64,0xbfdad58b40b5ab16,0xbfdba098cc0ad5d3,2
+np.float64,0x3fe99c76a13338ed,0x3fec6f31bae613e7,2
+np.float64,0x3fe4242a29a84854,0x3fe57f6b45e5c0ef,2
+np.float64,0xbfe79d3199ef3a63,0xbfe9d0fb96c846ba,2
+np.float64,0x7ff8000000000000,0x7ff8000000000000,2
+np.float64,0xbfeb35a6cf766b4e,0xbfee9be4e7e943f7,2
+np.float64,0x3e047f267c091,0x3e047f267c091,2
+np.float64,0x4bf1376a97e28,0x4bf1376a97e28,2
+np.float64,0x800ef419685de833,0x800ef419685de833,2
+np.float64,0x3fe0efa61a21df4c,0x3fe1bce98baf2f0f,2
+np.float64,0x3fcc13c4d738278a,0x3fcc4d8c778bcaf7,2
+np.float64,0x800f1d291afe3a52,0x800f1d291afe3a52,2
+np.float64,0x3fd3f10e6da7e21d,0x3fd444106761ea1d,2
+np.float64,0x800706d6d76e0dae,0x800706d6d76e0dae,2
+np.float64,0xffa1ffbc9023ff80,0xfff0000000000000,2
+np.float64,0xbfe098f26d6131e5,0xbfe15a08a5f3eac0,2
+np.float64,0x3fe984f9cc7309f4,0x3fec4fcdbdb1cb9b,2
+np.float64,0x7fd7c2f1eaaf85e3,0x7ff0000000000000,2
+np.float64,0x800a8adb64f515b7,0x800a8adb64f515b7,2
+np.float64,0x80060d3ffc8c1a81,0x80060d3ffc8c1a81,2
+np.float64,0xbfec37e4aef86fc9,0xbff0029a6a1d61e2,2
+np.float64,0x800b21bcfcf6437a,0x800b21bcfcf6437a,2
+np.float64,0xbfc08facc1211f58,0xbfc09b8380ea8032,2
+np.float64,0xffebb4b52577696a,0xfff0000000000000,2
+np.float64,0x800b08096df61013,0x800b08096df61013,2
+np.float64,0x8000000000000000,0x8000000000000000,2
+np.float64,0xffd2f0c9c8a5e194,0xfff0000000000000,2
+np.float64,0xffe78b2299af1644,0xfff0000000000000,2
+np.float64,0x7fd0444794a0888e,0x7ff0000000000000,2
+np.float64,0x307c47b460f8a,0x307c47b460f8a,2
+np.float64,0xffe6b4c851ad6990,0xfff0000000000000,2
+np.float64,0xffe1877224a30ee4,0xfff0000000000000,2
+np.float64,0x48d7b5c091af7,0x48d7b5c091af7,2
+np.float64,0xbfa1dc6b1c23b8d0,0xbfa1dd5889e1b7da,2
+np.float64,0x3fe5004737ea008e,0x3fe68a9c310b08c1,2
+np.float64,0x7fec5f0742b8be0e,0x7ff0000000000000,2
+np.float64,0x3fd0a86285a150c5,0x3fd0d8b238d557fa,2
+np.float64,0x7fed60380efac06f,0x7ff0000000000000,2
+np.float64,0xeeca74dfdd94f,0xeeca74dfdd94f,2
+np.float64,0x3fda05aaa8b40b54,0x3fdabebdbf405e84,2
+np.float64,0x800e530ceb1ca61a,0x800e530ceb1ca61a,2
+np.float64,0x800b3866379670cd,0x800b3866379670cd,2
+np.float64,0xffedb3e7fa3b67cf,0xfff0000000000000,2
+np.float64,0xffdfa4c0713f4980,0xfff0000000000000,2
+np.float64,0x7fe4679e0728cf3b,0x7ff0000000000000,2
+np.float64,0xffe978611ef2f0c2,0xfff0000000000000,2
+np.float64,0x7fc9f4601f33e8bf,0x7ff0000000000000,2
+np.float64,0x3fd4942de6a9285c,0x3fd4ef6e089357dd,2
+np.float64,0x3faafe064435fc00,0x3fab0139cd6564dc,2
+np.float64,0x800d145a519a28b5,0x800d145a519a28b5,2
+np.float64,0xbfd82636f2304c6e,0xbfd8b9f75ddd2f02,2
+np.float64,0xbfdf2e975e3e5d2e,0xbfe037174280788c,2
+np.float64,0x7fd7051d7c2e0a3a,0x7ff0000000000000,2
+np.float64,0x8007933d452f267b,0x8007933d452f267b,2
+np.float64,0xb2043beb64088,0xb2043beb64088,2
+np.float64,0x3febfd9708f7fb2e,0x3fefb2ef090f18d2,2
+np.float64,0xffd9bc6bc83378d8,0xfff0000000000000,2
+np.float64,0xc10f9fd3821f4,0xc10f9fd3821f4,2
+np.float64,0x3fe3c83413a79068,0x3fe510fa1dd8edf7,2
+np.float64,0x3fbe26ccda3c4da0,0x3fbe38a892279975,2
+np.float64,0x3fcc1873103830e6,0x3fcc5257a6ae168d,2
+np.float64,0xe7e000e9cfc00,0xe7e000e9cfc00,2
+np.float64,0xffda73852bb4e70a,0xfff0000000000000,2
+np.float64,0xbfe831be19f0637c,0xbfea90f1b34da3e5,2
+np.float64,0xbfeb568f3076ad1e,0xbfeec97eebfde862,2
+np.float64,0x510a6ad0a214e,0x510a6ad0a214e,2
+np.float64,0x3fe6ba7e35ed74fc,0x3fe8b032a9a28c6a,2
+np.float64,0xffeb5cdcff76b9b9,0xfff0000000000000,2
+np.float64,0x4f0a23e89e145,0x4f0a23e89e145,2
+np.float64,0x446ec20288dd9,0x446ec20288dd9,2
+np.float64,0x7fe2521b02e4a435,0x7ff0000000000000,2
+np.float64,0x8001cd2969e39a54,0x8001cd2969e39a54,2
+np.float64,0x3fdfe90600bfd20c,0x3fe09fdcca10001c,2
+np.float64,0x7fd660c5762cc18a,0x7ff0000000000000,2
+np.float64,0xbfb11b23aa223648,0xbfb11e661949b377,2
+np.float64,0x800e025285fc04a5,0x800e025285fc04a5,2
+np.float64,0xffb180bb18230178,0xfff0000000000000,2
+np.float64,0xaaf590df55eb2,0xaaf590df55eb2,2
+np.float64,0xbfe8637d9df0c6fb,0xbfead1ba429462ec,2
+np.float64,0x7fd2577866a4aef0,0x7ff0000000000000,2
+np.float64,0xbfcfb2ab5a3f6558,0xbfd002ee87f272b9,2
+np.float64,0x7fdd64ae2f3ac95b,0x7ff0000000000000,2
+np.float64,0xffd1a502c9234a06,0xfff0000000000000,2
+np.float64,0x7fc4be4b60297c96,0x7ff0000000000000,2
+np.float64,0xbfb46b712a28d6e0,0xbfb470fca9919172,2
+np.float64,0xffdef913033df226,0xfff0000000000000,2
+np.float64,0x3fd94a3545b2946b,0x3fd9f40431ce9f9c,2
+np.float64,0x7fef88a0b6ff1140,0x7ff0000000000000,2
+np.float64,0xbfbcc81876399030,0xbfbcd7a0ab6cb388,2
+np.float64,0x800a4acfdd9495a0,0x800a4acfdd9495a0,2
+np.float64,0xffe270b3d5e4e167,0xfff0000000000000,2
+np.float64,0xbfd23f601e247ec0,0xbfd27eeca50a49eb,2
+np.float64,0x7fec6e796a78dcf2,0x7ff0000000000000,2
+np.float64,0x3fb85e0c9630bc19,0x3fb867791ccd6c72,2
+np.float64,0x7fe49fc424a93f87,0x7ff0000000000000,2
+np.float64,0xbfe75a99fbaeb534,0xbfe97ba37663de4c,2
+np.float64,0xffe85011b630a023,0xfff0000000000000,2
+np.float64,0xffe5962e492b2c5c,0xfff0000000000000,2
+np.float64,0x6f36ed4cde6de,0x6f36ed4cde6de,2
+np.float64,0x3feb72170af6e42e,0x3feeefbe6f1a2084,2
+np.float64,0x80014d8d60629b1c,0x80014d8d60629b1c,2
+np.float64,0xbfe0eb40d321d682,0xbfe1b7e31f252bf1,2
+np.float64,0x31fe305663fc7,0x31fe305663fc7,2
+np.float64,0x3fd2cd6381a59ac7,0x3fd312edc9868a4d,2
+np.float64,0xffcf0720793e0e40,0xfff0000000000000,2
+np.float64,0xbfeef1ef133de3de,0xbff1ffd5e1a3b648,2
+np.float64,0xbfd01c787aa038f0,0xbfd0482be3158a01,2
+np.float64,0x3fda3607c5b46c10,0x3fdaf3301e217301,2
+np.float64,0xffda9a9911b53532,0xfff0000000000000,2
+np.float64,0x3fc0b37c392166f8,0x3fc0bfa076f3c43e,2
+np.float64,0xbfe06591c760cb24,0xbfe11fad179ea12c,2
+np.float64,0x8006e369c20dc6d4,0x8006e369c20dc6d4,2
+np.float64,0x3fdf2912a8be5224,0x3fe033ff74b92f4d,2
+np.float64,0xffc0feb07821fd60,0xfff0000000000000,2
+np.float64,0xa4b938c949727,0xa4b938c949727,2
+np.float64,0x8008fe676571fccf,0x8008fe676571fccf,2
+np.float64,0xbfdda68459bb4d08,0xbfdeb8faab34fcbc,2
+np.float64,0xbfda18b419343168,0xbfdad360ca52ec7c,2
+np.float64,0x3febcbae35b7975c,0x3fef6cd51c9ebc15,2
+np.float64,0x3fbec615f63d8c30,0x3fbed912ba729926,2
+np.float64,0x7f99a831c8335063,0x7ff0000000000000,2
+np.float64,0x3fe663e8826cc7d1,0x3fe84330bd9aada8,2
+np.float64,0x70a9f9e6e1540,0x70a9f9e6e1540,2
+np.float64,0x8a13a5db14275,0x8a13a5db14275,2
+np.float64,0x7fc4330a3b286613,0x7ff0000000000000,2
+np.float64,0xbfe580c6136b018c,0xbfe728806cc7a99a,2
+np.float64,0x8000000000000001,0x8000000000000001,2
+np.float64,0xffec079d5df80f3a,0xfff0000000000000,2
+np.float64,0x8e1173c31c22f,0x8e1173c31c22f,2
+np.float64,0x3fe088456d21108b,0x3fe14712ca414103,2
+np.float64,0x3fe1b76f73636edf,0x3fe2a2b658557112,2
+np.float64,0xbfd4a1dd162943ba,0xbfd4fdd45cae8fb8,2
+np.float64,0x7fd60b46c8ac168d,0x7ff0000000000000,2
+np.float64,0xffe36cc3b166d987,0xfff0000000000000,2
+np.float64,0x3fdc2ae0cfb855c0,0x3fdd15f026773151,2
+np.float64,0xbfc41aa203283544,0xbfc42fd1b145fdd5,2
+np.float64,0xffed90c55fbb218a,0xfff0000000000000,2
+np.float64,0x3fe67e3a9aecfc75,0x3fe86440db65b4f6,2
+np.float64,0x7fd12dbeaba25b7c,0x7ff0000000000000,2
+np.float64,0xbfe1267c0de24cf8,0xbfe1fbb611bdf1e9,2
+np.float64,0x22e5619645cad,0x22e5619645cad,2
+np.float64,0x7fe327c72ea64f8d,0x7ff0000000000000,2
+np.float64,0x7fd2c3f545a587ea,0x7ff0000000000000,2
+np.float64,0x7fc7b689372f6d11,0x7ff0000000000000,2
+np.float64,0xc5e140bd8bc28,0xc5e140bd8bc28,2
+np.float64,0x3fccb3627a3966c5,0x3fccf11b44fa4102,2
+np.float64,0xbfd2cf725c259ee4,0xbfd315138d0e5dca,2
+np.float64,0x10000000000000,0x10000000000000,2
+np.float64,0xbfd3dfa8b627bf52,0xbfd431d17b235477,2
+np.float64,0xbfb82124e6304248,0xbfb82a4b6d9c2663,2
+np.float64,0x3fdcd590d9b9ab22,0x3fddd1d548806347,2
+np.float64,0x7fdee0cd1b3dc199,0x7ff0000000000000,2
+np.float64,0x8004ebfc60a9d7fa,0x8004ebfc60a9d7fa,2
+np.float64,0x3fe8eb818b71d704,0x3feb842679806108,2
+np.float64,0xffdd5e8fe63abd20,0xfff0000000000000,2
+np.float64,0xbfe3efcbd9e7df98,0xbfe54071436645ee,2
+np.float64,0x3fd5102557aa204b,0x3fd57203d31a05b8,2
+np.float64,0x3fe6318af7ec6316,0x3fe8041a177cbf96,2
+np.float64,0x3fdf3cecdabe79da,0x3fe03f2084ffbc78,2
+np.float64,0x7fe0ab6673a156cc,0x7ff0000000000000,2
+np.float64,0x800037d5c6c06fac,0x800037d5c6c06fac,2
+np.float64,0xffce58b86a3cb170,0xfff0000000000000,2
+np.float64,0xbfe3455d6ce68abb,0xbfe475034cecb2b8,2
+np.float64,0x991b663d3236d,0x991b663d3236d,2
+np.float64,0x3fda82d37c3505a7,0x3fdb46973da05c12,2
+np.float64,0x3f9b736fa036e6df,0x3f9b74471c234411,2
+np.float64,0x8001c96525e392cb,0x8001c96525e392cb,2
+np.float64,0x7ff0000000000000,0x7ff0000000000000,2
+np.float64,0xbfaf59122c3eb220,0xbfaf5e15f8b272b0,2
+np.float64,0xbf9aa7d288354fa0,0xbf9aa897d2a40cb5,2
+np.float64,0x8004a43428694869,0x8004a43428694869,2
+np.float64,0x7feead476dbd5a8e,0x7ff0000000000000,2
+np.float64,0xffca150f81342a20,0xfff0000000000000,2
+np.float64,0x80047ec3bc88fd88,0x80047ec3bc88fd88,2
+np.float64,0xbfee3e5b123c7cb6,0xbff179c8b8334278,2
+np.float64,0x3fd172359f22e46b,0x3fd1a9ba6b1420a1,2
+np.float64,0x3fe8e5e242f1cbc5,0x3feb7cbcaefc4d5c,2
+np.float64,0x8007fb059a6ff60c,0x8007fb059a6ff60c,2
+np.float64,0xe3899e71c7134,0xe3899e71c7134,2
+np.float64,0x7fe3b98326a77305,0x7ff0000000000000,2
+np.float64,0x7fec4e206cb89c40,0x7ff0000000000000,2
+np.float64,0xbfa3b012c4276020,0xbfa3b150c13b3cc5,2
+np.float64,0xffefffffffffffff,0xfff0000000000000,2
+np.float64,0xffe28a5b9aa514b6,0xfff0000000000000,2
+np.float64,0xbfd76a6cc2aed4da,0xbfd7f10f4d04e7f6,2
+np.float64,0xbc2b1c0178564,0xbc2b1c0178564,2
+np.float64,0x6d9d444adb3a9,0x6d9d444adb3a9,2
+np.float64,0xbfdcadd368395ba6,0xbfdda6037b5c429c,2
+np.float64,0x3fe11891fde23124,0x3fe1ebc1c204b14b,2
+np.float64,0x3fdd66c3eebacd88,0x3fde72526b5304c4,2
+np.float64,0xbfe79d85612f3b0b,0xbfe9d1673bd1f6d6,2
+np.float64,0x3fed60abdabac158,0x3ff0d7426b3800a2,2
+np.float64,0xbfb0ffa54021ff48,0xbfb102d81073a9f0,2
+np.float64,0xd2452af5a48a6,0xd2452af5a48a6,2
+np.float64,0xf4b835c1e971,0xf4b835c1e971,2
+np.float64,0x7e269cdafc4d4,0x7e269cdafc4d4,2
+np.float64,0x800097a21d812f45,0x800097a21d812f45,2
+np.float64,0x3fdfcc85e8bf990c,0x3fe08fcf770fd456,2
+np.float64,0xd8d53155b1aa6,0xd8d53155b1aa6,2
+np.float64,0x7fb8ed658831daca,0x7ff0000000000000,2
+np.float64,0xbfec865415b90ca8,0xbff03a4584d719f9,2
+np.float64,0xffd8cda62a319b4c,0xfff0000000000000,2
+np.float64,0x273598d84e6b4,0x273598d84e6b4,2
+np.float64,0x7fd566b5c32acd6b,0x7ff0000000000000,2
+np.float64,0xff61d9d48023b400,0xfff0000000000000,2
+np.float64,0xbfec5c3bf4f8b878,0xbff01c594243337c,2
+np.float64,0x7fd1be0561a37c0a,0x7ff0000000000000,2
+np.float64,0xffeaee3271b5dc64,0xfff0000000000000,2
+np.float64,0x800c0e1931b81c33,0x800c0e1931b81c33,2
+np.float64,0xbfad1171583a22e0,0xbfad1570e5c466d2,2
+np.float64,0x7fd783b0fe2f0761,0x7ff0000000000000,2
+np.float64,0x7fc39903e6273207,0x7ff0000000000000,2
+np.float64,0xffe00003c5600007,0xfff0000000000000,2
+np.float64,0x35a7b9c06b50,0x35a7b9c06b50,2
+np.float64,0x7fee441a22bc8833,0x7ff0000000000000,2
+np.float64,0xff6e47fbc03c9000,0xfff0000000000000,2
+np.float64,0xbfd3c3c9c8a78794,0xbfd41499b1912534,2
+np.float64,0x82c9c87f05939,0x82c9c87f05939,2
+np.float64,0xbfedeb0fe4fbd620,0xbff13c573ce9d3d0,2
+np.float64,0x2b79298656f26,0x2b79298656f26,2
+np.float64,0xbf5ee44f003dc800,0xbf5ee4503353c0ba,2
+np.float64,0xbfe1dd264e63ba4c,0xbfe2ce68116c7bf6,2
+np.float64,0x3fece10b7579c217,0x3ff07b21b11799c6,2
+np.float64,0x3fba47143a348e28,0x3fba52e601adf24c,2
+np.float64,0xffe9816e7a7302dc,0xfff0000000000000,2
+np.float64,0x8009a8047fd35009,0x8009a8047fd35009,2
+np.float64,0x800ac28e4e95851d,0x800ac28e4e95851d,2
+np.float64,0x80093facf4f27f5a,0x80093facf4f27f5a,2
+np.float64,0x3ff0000000000000,0x3ff2cd9fc44eb982,2
+np.float64,0x3fe76a9857eed530,0x3fe99018a5895a4f,2
+np.float64,0xbfd13c59a3a278b4,0xbfd171e133df0b16,2
+np.float64,0x7feb43bc83368778,0x7ff0000000000000,2
+np.float64,0xbfe2970c5fa52e18,0xbfe3a74a434c6efe,2
+np.float64,0xffd091c380212388,0xfff0000000000000,2
+np.float64,0x3febb3b9d2f76774,0x3fef4b4af2bd8580,2
+np.float64,0x7fec66787ef8ccf0,0x7ff0000000000000,2
+np.float64,0xbf935e185826bc40,0xbf935e640557a354,2
+np.float64,0x979df1552f3be,0x979df1552f3be,2
+np.float64,0x7fc096ee73212ddc,0x7ff0000000000000,2
+np.float64,0xbfe9de88faf3bd12,0xbfecc7d1ae691d1b,2
+np.float64,0x7fdc733f06b8e67d,0x7ff0000000000000,2
+np.float64,0xffd71be1a0ae37c4,0xfff0000000000000,2
+np.float64,0xb50dabd36a1b6,0xb50dabd36a1b6,2
+np.float64,0x7fce3d94d63c7b29,0x7ff0000000000000,2
+np.float64,0x7fbaf95e4435f2bc,0x7ff0000000000000,2
+np.float64,0x81a32a6f03466,0x81a32a6f03466,2
+np.float64,0xa99b5b4d5336c,0xa99b5b4d5336c,2
+np.float64,0x7f97c1eeb82f83dc,0x7ff0000000000000,2
+np.float64,0x3fe761636d6ec2c6,0x3fe98451160d2ffb,2
+np.float64,0xbfe3224ef5e6449e,0xbfe44b73eeadac52,2
+np.float64,0x7fde6feb0dbcdfd5,0x7ff0000000000000,2
+np.float64,0xbfee87f9ca7d0ff4,0xbff1b079e9d7f706,2
+np.float64,0x3fe46f4c9828de99,0x3fe5da2ab9609ea5,2
+np.float64,0xffb92fe882325fd0,0xfff0000000000000,2
+np.float64,0x80054bc63cea978d,0x80054bc63cea978d,2
+np.float64,0x3d988bea7b312,0x3d988bea7b312,2
+np.float64,0x3fe6468e1d6c8d1c,0x3fe81e64d37d39a8,2
+np.float64,0x3fd68eefc22d1de0,0x3fd7074264faeead,2
+np.float64,0xffb218a074243140,0xfff0000000000000,2
+np.float64,0x3fdbcb3b6cb79678,0x3fdcad011de40b7d,2
+np.float64,0x7fe3c161772782c2,0x7ff0000000000000,2
+np.float64,0x25575c904aaec,0x25575c904aaec,2
+np.float64,0x800fa43a8f5f4875,0x800fa43a8f5f4875,2
+np.float64,0x3fe41fc9e1e83f94,0x3fe57a25dd1a37f1,2
+np.float64,0x3fd895f4a7b12be9,0x3fd931e7b721a08a,2
+np.float64,0xce31469f9c629,0xce31469f9c629,2
+np.float64,0xffea0f55ca341eab,0xfff0000000000000,2
+np.float64,0xffe831c9ba306393,0xfff0000000000000,2
+np.float64,0x7fe2056f03a40add,0x7ff0000000000000,2
+np.float64,0x7fd6b075e02d60eb,0x7ff0000000000000,2
+np.float64,0x3fdfbef4273f7de8,0x3fe0882c1f59efc0,2
+np.float64,0x8005b9e094ab73c2,0x8005b9e094ab73c2,2
+np.float64,0x3fea881ac6351036,0x3fedad7a319b887c,2
+np.float64,0xbfe2c61c7ee58c39,0xbfe3de9a99d8a9c6,2
+np.float64,0x30b0d3786161b,0x30b0d3786161b,2
+np.float64,0x3fa51d56a02a3aad,0x3fa51edee2d2ecef,2
+np.float64,0x79745732f2e8c,0x79745732f2e8c,2
+np.float64,0x800d55b4907aab69,0x800d55b4907aab69,2
+np.float64,0xbfbe8fcf0a3d1fa0,0xbfbea267fbb5bfdf,2
+np.float64,0xbfd04e2756a09c4e,0xbfd07b74d079f9a2,2
+np.float64,0x3fc65170552ca2e1,0x3fc66e6eb00c82ed,2
+np.float64,0xbfb0674b8020ce98,0xbfb06a2b4771b64c,2
+np.float64,0x2059975840b34,0x2059975840b34,2
+np.float64,0x33d1385467a28,0x33d1385467a28,2
+np.float64,0x3fea41b74ff4836f,0x3fed4dc1a09e53cc,2
+np.float64,0xbfe8e08c9d71c119,0xbfeb75b4c59a6bec,2
+np.float64,0x7fdbbf14d6377e29,0x7ff0000000000000,2
+np.float64,0x3fcd8b71513b16e0,0x3fcdcec80174f9ad,2
+np.float64,0x5c50bc94b8a18,0x5c50bc94b8a18,2
+np.float64,0x969a18f52d343,0x969a18f52d343,2
+np.float64,0x3fd7ae44462f5c89,0x3fd8398bc34e395c,2
+np.float64,0xffdd0f8617ba1f0c,0xfff0000000000000,2
+np.float64,0xfff0000000000000,0xfff0000000000000,2
+np.float64,0xbfe2f9badb65f376,0xbfe41b771320ece8,2
+np.float64,0x3fd140bc7fa29,0x3fd140bc7fa29,2
+np.float64,0xbfe14523b5628a48,0xbfe21ee850972043,2
+np.float64,0x3feedd0336bdba06,0x3ff1f01afc1f3a06,2
+np.float64,0x800de423ad7bc848,0x800de423ad7bc848,2
+np.float64,0x4cef857c99df1,0x4cef857c99df1,2
+np.float64,0xbfea55e0e374abc2,0xbfed691e41d648dd,2
+np.float64,0x3fe70d7a18ae1af4,0x3fe91955a34d8094,2
+np.float64,0xbfc62fc3032c5f88,0xbfc64c3ec25decb8,2
+np.float64,0x3fc915abb5322b58,0x3fc93edac5cc73fe,2
+np.float64,0x69aaff66d3561,0x69aaff66d3561,2
+np.float64,0x5c6a90f2b8d53,0x5c6a90f2b8d53,2
+np.float64,0x3fefe30dc1bfc61c,0x3ff2b752257bdacd,2
+np.float64,0x3fef15db15fe2bb6,0x3ff21aea05601396,2
+np.float64,0xbfe353e5ac66a7cc,0xbfe48644e6553d1a,2
+np.float64,0x3fe6d30cffada61a,0x3fe8cf3e4c61ddac,2
+np.float64,0x7fb7857eb62f0afc,0x7ff0000000000000,2
+np.float64,0xbfdd9b53d23b36a8,0xbfdeac91a7af1340,2
+np.float64,0x3fd1456357228ac7,0x3fd17b3f7d39b27a,2
+np.float64,0x3fb57d10ae2afa21,0x3fb5838702b806f4,2
+np.float64,0x800c59c96c98b393,0x800c59c96c98b393,2
+np.float64,0x7fc1f2413823e481,0x7ff0000000000000,2
+np.float64,0xbfa3983624273070,0xbfa3996fa26c419a,2
+np.float64,0x7fb28874ae2510e8,0x7ff0000000000000,2
+np.float64,0x3fe826d02a304da0,0x3fea82bec50bc0b6,2
+np.float64,0x8008d6f0d3d1ade2,0x8008d6f0d3d1ade2,2
+np.float64,0xffe7c970ca2f92e1,0xfff0000000000000,2
+np.float64,0x7fcf42bcaa3e8578,0x7ff0000000000000,2
+np.float64,0x7fda1ab517343569,0x7ff0000000000000,2
+np.float64,0xbfe7926a65ef24d5,0xbfe9c323dd890d5b,2
+np.float64,0xbfcaf6282d35ec50,0xbfcb294f36a0a33d,2
+np.float64,0x800ca49df8d9493c,0x800ca49df8d9493c,2
+np.float64,0xffea18d26af431a4,0xfff0000000000000,2
+np.float64,0x3fb72f276e2e5e50,0x3fb7374539fd1221,2
+np.float64,0xffa6b613842d6c20,0xfff0000000000000,2
+np.float64,0xbfeb3c7263f678e5,0xbfeea54cdb60b54c,2
+np.float64,0x3fc976d2ba32eda5,0x3fc9a1e83a058de4,2
+np.float64,0xbfe4acd4b0e959aa,0xbfe624d5d4f9b9a6,2
+np.float64,0x7fca410a0f348213,0x7ff0000000000000,2
+np.float64,0xbfde368f77bc6d1e,0xbfdf5910c8c8bcb0,2
+np.float64,0xbfed7412937ae825,0xbff0e55afc428453,2
+np.float64,0xffef6b7b607ed6f6,0xfff0000000000000,2
+np.float64,0xbfb936f17e326de0,0xbfb941629a53c694,2
+np.float64,0x800dbb0c469b7619,0x800dbb0c469b7619,2
+np.float64,0x800f68b0581ed161,0x800f68b0581ed161,2
+np.float64,0x3fe25b2aad64b656,0x3fe361266fa9c5eb,2
+np.float64,0xbfb87e445a30fc88,0xbfb887d676910c3f,2
+np.float64,0x6e6ba9b6dcd76,0x6e6ba9b6dcd76,2
+np.float64,0x3fad27ce583a4f9d,0x3fad2bd72782ffdb,2
+np.float64,0xbfec0bc5d638178c,0xbfefc6e8c8f9095f,2
+np.float64,0x7fcba4a296374944,0x7ff0000000000000,2
+np.float64,0x8004ca237cc99448,0x8004ca237cc99448,2
+np.float64,0xffe85b8c3270b718,0xfff0000000000000,2
+np.float64,0x7fe7ee3eddafdc7d,0x7ff0000000000000,2
+np.float64,0xffd275967ca4eb2c,0xfff0000000000000,2
+np.float64,0xbfa95bc3a032b780,0xbfa95e6b288ecf43,2
+np.float64,0x3fc9e3214b33c643,0x3fca10667e7e7ff4,2
+np.float64,0x8001b89c5d837139,0x8001b89c5d837139,2
+np.float64,0xbf8807dfc0300fc0,0xbf880803e3badfbd,2
+np.float64,0x800aca94b895952a,0x800aca94b895952a,2
+np.float64,0x7fd79534a02f2a68,0x7ff0000000000000,2
+np.float64,0x3fe1b81179e37023,0x3fe2a371d8cc26f0,2
+np.float64,0x800699539d6d32a8,0x800699539d6d32a8,2
+np.float64,0xffe51dfbb3aa3bf7,0xfff0000000000000,2
+np.float64,0xbfdfb775abbf6eec,0xbfe083f48be2f98f,2
+np.float64,0x3fe87979d7b0f2f4,0x3feaee701d959079,2
+np.float64,0x3fd8e4e6a731c9cd,0x3fd986d29f25f982,2
+np.float64,0x3fe3dadaaf67b5b6,0x3fe527520fb02920,2
+np.float64,0x8003c2262bc7844d,0x8003c2262bc7844d,2
+np.float64,0x800c930add392616,0x800c930add392616,2
+np.float64,0xffb7a152a22f42a8,0xfff0000000000000,2
+np.float64,0x80028fe03dc51fc1,0x80028fe03dc51fc1,2
+np.float64,0xffe32ae60c6655cc,0xfff0000000000000,2
+np.float64,0x3fea3527e4746a50,0x3fed3cbbf47f18eb,2
+np.float64,0x800a53059e14a60c,0x800a53059e14a60c,2
+np.float64,0xbfd79e3b202f3c76,0xbfd828672381207b,2
+np.float64,0xffeed7e2eb7dafc5,0xfff0000000000000,2
+np.float64,0x3fec51ed6778a3db,0x3ff01509e34df61d,2
+np.float64,0xbfd84bc577b0978a,0xbfd8e23ec55e42e8,2
+np.float64,0x2483aff849077,0x2483aff849077,2
+np.float64,0x6f57883adeaf2,0x6f57883adeaf2,2
+np.float64,0xffd3fd74d927faea,0xfff0000000000000,2
+np.float64,0x7fca49ec773493d8,0x7ff0000000000000,2
+np.float64,0x7fd08fe2e8211fc5,0x7ff0000000000000,2
+np.float64,0x800852086db0a411,0x800852086db0a411,2
+np.float64,0x3fe5b1f2c9eb63e6,0x3fe7654f511bafc6,2
+np.float64,0xbfe01e2a58e03c54,0xbfe0cedb68f021e6,2
+np.float64,0x800988421d331085,0x800988421d331085,2
+np.float64,0xffd5038b18aa0716,0xfff0000000000000,2
+np.float64,0x8002c9264c85924d,0x8002c9264c85924d,2
+np.float64,0x3fd21ca302243946,0x3fd25ac653a71aab,2
+np.float64,0xbfea60d6e6f4c1ae,0xbfed78031d9dfa2b,2
+np.float64,0xffef97b6263f2f6b,0xfff0000000000000,2
+np.float64,0xbfd524732faa48e6,0xbfd5876ecc415dcc,2
+np.float64,0x660387e8cc072,0x660387e8cc072,2
+np.float64,0x7fcfc108a33f8210,0x7ff0000000000000,2
+np.float64,0x7febe5b0f877cb61,0x7ff0000000000000,2
+np.float64,0xbfa55fdfac2abfc0,0xbfa56176991851a8,2
+np.float64,0x25250f4c4a4a3,0x25250f4c4a4a3,2
+np.float64,0xffe2f6a2f2a5ed46,0xfff0000000000000,2
+np.float64,0x7fa754fcc02ea9f9,0x7ff0000000000000,2
+np.float64,0x3febd19dea37a33c,0x3fef75279f75d3b8,2
+np.float64,0xc5ed55218bdab,0xc5ed55218bdab,2
+np.float64,0x3fe72ff6b3ee5fed,0x3fe945388b979882,2
+np.float64,0xbfe16b854e22d70a,0xbfe24b10fc0dff14,2
+np.float64,0xffb22cbe10245980,0xfff0000000000000,2
+np.float64,0xa54246b54a849,0xa54246b54a849,2
+np.float64,0x3fe7f4cda76fe99c,0x3fea41edc74888b6,2
+np.float64,0x1,0x1,2
+np.float64,0x800d84acce9b095a,0x800d84acce9b095a,2
+np.float64,0xb0eef04761dde,0xb0eef04761dde,2
+np.float64,0x7ff4000000000000,0x7ffc000000000000,2
+np.float64,0xffecaf1dbb795e3b,0xfff0000000000000,2
+np.float64,0x90dbab8d21b76,0x90dbab8d21b76,2
+np.float64,0x3fe79584a9ef2b09,0x3fe9c71fa9e40eb5,2
diff --git a/numpy/core/tests/data/umath-validation-set-tan.csv b/numpy/core/tests/data/umath-validation-set-tan.csv
new file mode 100644 (file)
index 0000000..083cdb2
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0xfd97ece0,0xc11186e9,4
+np.float32,0x8013bb34,0x8013bb34,4
+np.float32,0x316389,0x316389,4
+np.float32,0x7f7fffff,0xbf1c9eca,4
+np.float32,0x3f7674bb,0x3fb7e450,4
+np.float32,0x80800000,0x80800000,4
+np.float32,0x7f5995e8,0xbf94106c,4
+np.float32,0x74527,0x74527,4
+np.float32,0x7f08caea,0xbeceddb6,4
+np.float32,0x2d49b2,0x2d49b2,4
+np.float32,0x3f74e5e4,0x3fb58695,4
+np.float32,0x3f3fcd51,0x3f6e1e81,4
+np.float32,0xbf4f3608,0xbf864d3d,4
+np.float32,0xbed974a0,0xbee78c70,4
+np.float32,0xff5f483c,0x3ecf3cb2,4
+np.float32,0x7f4532f4,0xc0b96f7b,4
+np.float32,0x3f0a4f7c,0x3f198cc0,4
+np.float32,0x210193,0x210193,4
+np.float32,0xfeebad7a,0xbf92eba8,4
+np.float32,0xfed29f74,0xc134cab6,4
+np.float32,0x803433a0,0x803433a0,4
+np.float32,0x64eb46,0x64eb46,4
+np.float32,0xbf54ef22,0xbf8c757b,4
+np.float32,0x3f3d5fdd,0x3f69a17b,4
+np.float32,0x80000001,0x80000001,4
+np.float32,0x800a837a,0x800a837a,4
+np.float32,0x6ff0be,0x6ff0be,4
+np.float32,0xfe8f1186,0x3f518820,4
+np.float32,0x804963e5,0x804963e5,4
+np.float32,0xfebaa59a,0x3fa1dbb0,4
+np.float32,0x637970,0x637970,4
+np.float32,0x3e722a6b,0x3e76c89a,4
+np.float32,0xff2b0478,0xbddccb5f,4
+np.float32,0xbf7bd85b,0xbfc06821,4
+np.float32,0x3ec33600,0x3ecd4126,4
+np.float32,0x3e0a43b9,0x3e0b1c69,4
+np.float32,0x7f7511b6,0xbe427083,4
+np.float32,0x3f28c114,0x3f465a73,4
+np.float32,0x3f179e1c,0x3f2c3e7c,4
+np.float32,0x7b2963,0x7b2963,4
+np.float32,0x3f423d06,0x3f72b442,4
+np.float32,0x3f5a24c6,0x3f925508,4
+np.float32,0xff18c834,0xbf79b5c8,4
+np.float32,0x3f401ece,0x3f6eb6ac,4
+np.float32,0x7b8a3013,0xbffab968,4
+np.float32,0x80091ff0,0x80091ff0,4
+np.float32,0x3f389c51,0x3f610b47,4
+np.float32,0x5ea174,0x5ea174,4
+np.float32,0x807a9eb2,0x807a9eb2,4
+np.float32,0x806ce61e,0x806ce61e,4
+np.float32,0xbe956acc,0xbe99cefc,4
+np.float32,0x7e60e247,0xbf5e64a5,4
+np.float32,0x7f398e24,0x404d12ed,4
+np.float32,0x3d9049f8,0x3d908735,4
+np.float32,0x7db17ffc,0xbf5b3d87,4
+np.float32,0xff453f78,0xc0239c9f,4
+np.float32,0x3f024aac,0x3f0ed802,4
+np.float32,0xbe781c30,0xbe7d1508,4
+np.float32,0x3f77962a,0x3fb9a28e,4
+np.float32,0xff7fffff,0x3f1c9eca,4
+np.float32,0x3f7152e3,0x3fb03f9d,4
+np.float32,0xff7cb167,0x3f9ce831,4
+np.float32,0x3e763e30,0x3e7b1a10,4
+np.float32,0xbf126527,0xbf24c253,4
+np.float32,0x803f6660,0x803f6660,4
+np.float32,0xbf79de38,0xbfbd38b1,4
+np.float32,0x8046c2f0,0x8046c2f0,4
+np.float32,0x6dc74e,0x6dc74e,4
+np.float32,0xbec9c45e,0xbed4e768,4
+np.float32,0x3f0eedb6,0x3f1fe610,4
+np.float32,0x7e031999,0xbcc13026,4
+np.float32,0x7efc2fd7,0x41e4b284,4
+np.float32,0xbeab7454,0xbeb22a1b,4
+np.float32,0x805ee67b,0x805ee67b,4
+np.float32,0x7f76e58e,0xc2436659,4
+np.float32,0xbe62b024,0xbe667718,4
+np.float32,0x3eea0808,0x3efbd182,4
+np.float32,0xbf7fd00c,0xbfc70719,4
+np.float32,0x7f27b640,0xbf0d97e0,4
+np.float32,0x3f1b58a4,0x3f31b6f4,4
+np.float32,0x252a9f,0x252a9f,4
+np.float32,0x7f65f95a,0xbead5de3,4
+np.float32,0xfc6ea780,0x42d15801,4
+np.float32,0x7eac4c52,0xc0682424,4
+np.float32,0xbe8a3f5a,0xbe8db54d,4
+np.float32,0xbf1644e2,0xbf2a4abd,4
+np.float32,0x3fc96a,0x3fc96a,4
+np.float32,0x7f38c0e4,0x3cc04af8,4
+np.float32,0x3f623d75,0x3f9c065d,4
+np.float32,0x3ee6a51a,0x3ef7a058,4
+np.float32,0x3dd11020,0x3dd1cacf,4
+np.float32,0xb6918,0xb6918,4
+np.float32,0xfdd7a540,0x3f22f081,4
+np.float32,0x80798563,0x80798563,4
+np.float32,0x3e9a8b7a,0x3e9f6a7e,4
+np.float32,0xbea515d4,0xbeab0df5,4
+np.float32,0xbea9b9f4,0xbeb03abe,4
+np.float32,0xbf11a5fa,0xbf23b478,4
+np.float32,0xfd6cadf0,0xbfa2a878,4
+np.float32,0xbf6edd07,0xbfacbb78,4
+np.float32,0xff5c5328,0x3e2d1552,4
+np.float32,0xbea2f788,0xbea8b3f5,4
+np.float32,0x802efaeb,0x802efaeb,4
+np.float32,0xff1c85e5,0x41f8560e,4
+np.float32,0x3f53b123,0x3f8b18e1,4
+np.float32,0xff798c4a,0x4092e66f,4
+np.float32,0x7f2e6fe7,0xbdcbd58f,4
+np.float32,0xfe8a8196,0x3fd7fc56,4
+np.float32,0x5e7ad4,0x5e7ad4,4
+np.float32,0xbf23a02d,0xbf3e4533,4
+np.float32,0x3f31c55c,0x3f5531bf,4
+np.float32,0x80331be3,0x80331be3,4
+np.float32,0x8056960a,0x8056960a,4
+np.float32,0xff1c06ae,0xbfd26992,4
+np.float32,0xbe0cc4b0,0xbe0da96c,4
+np.float32,0x7e925ad5,0xbf8dba54,4
+np.float32,0x2c8cec,0x2c8cec,4
+np.float32,0x8011951e,0x8011951e,4
+np.float32,0x3f2caf84,0x3f4cb89f,4
+np.float32,0xbd32c220,0xbd32df33,4
+np.float32,0xbec358d6,0xbecd6996,4
+np.float32,0x3f6e4930,0x3fabeb92,4
+np.float32,0xbf6a3afd,0xbfa65a3a,4
+np.float32,0x80067764,0x80067764,4
+np.float32,0x3d8df1,0x3d8df1,4
+np.float32,0x7ee51cf2,0x409e4061,4
+np.float32,0x435f5d,0x435f5d,4
+np.float32,0xbf5b17f7,0xbf936ebe,4
+np.float32,0x3ecaacb5,0x3ed5f81f,4
+np.float32,0x807b0aa5,0x807b0aa5,4
+np.float32,0x52b40b,0x52b40b,4
+np.float32,0x146a97,0x146a97,4
+np.float32,0x7f42b952,0xbfdcb413,4
+np.float32,0xbf1a1af2,0xbf2fe1bb,4
+np.float32,0x3f312034,0x3f541aa2,4
+np.float32,0x3f281d60,0x3f4554f9,4
+np.float32,0x50e451,0x50e451,4
+np.float32,0xbe45838c,0xbe480016,4
+np.float32,0xff7d0aeb,0x3eb0746e,4
+np.float32,0x7f32a489,0xbf96af6d,4
+np.float32,0xbf1b4e27,0xbf31a769,4
+np.float32,0x3f242936,0x3f3f1a44,4
+np.float32,0xbf7482ff,0xbfb4f201,4
+np.float32,0x4bda38,0x4bda38,4
+np.float32,0xbf022208,0xbf0ea2bb,4
+np.float32,0x7d08ca95,0xbe904602,4
+np.float32,0x7ed2f356,0xc02b55ad,4
+np.float32,0xbf131204,0xbf25b734,4
+np.float32,0xff3464b4,0x3fb23706,4
+np.float32,0x5a97cf,0x5a97cf,4
+np.float32,0xbe52db70,0xbe55e388,4
+np.float32,0x3f52934f,0x3f89e2aa,4
+np.float32,0xfeea866a,0x40a2b33f,4
+np.float32,0x80333925,0x80333925,4
+np.float32,0xfef5d13e,0xc00139ec,4
+np.float32,0x3f4750ab,0x3f7c87ad,4
+np.float32,0x3e41bfdd,0x3e44185a,4
+np.float32,0xbf5b0572,0xbf935935,4
+np.float32,0xbe93c9da,0xbe9808d8,4
+np.float32,0x7f501f33,0xc0f9973c,4
+np.float32,0x800af035,0x800af035,4
+np.float32,0x3f29faf8,0x3f4852a8,4
+np.float32,0xbe1e4c20,0xbe1f920c,4
+np.float32,0xbf7e8616,0xbfc4d79d,4
+np.float32,0x43ffbf,0x43ffbf,4
+np.float32,0x7f28e8a9,0xbfa1ac24,4
+np.float32,0xbf1f9f92,0xbf3820bc,4
+np.float32,0x3f07e004,0x3f1641c4,4
+np.float32,0x3ef7ea7f,0x3f06a64a,4
+np.float32,0x7e013101,0x3f6080e6,4
+np.float32,0x7f122a4f,0xbf0a796f,4
+np.float32,0xfe096960,0x3ed7273a,4
+np.float32,0x3f06abf1,0x3f14a4b2,4
+np.float32,0x3e50ded3,0x3e53d0f1,4
+np.float32,0x7f50b346,0x3eabb536,4
+np.float32,0xff5adb0f,0xbd441972,4
+np.float32,0xbecefe46,0xbedb0f66,4
+np.float32,0x7da70bd4,0xbec66273,4
+np.float32,0x169811,0x169811,4
+np.float32,0xbee4dfee,0xbef5721a,4
+np.float32,0x3efbeae3,0x3f0936e6,4
+np.float32,0x8031bd61,0x8031bd61,4
+np.float32,0x8048e443,0x8048e443,4
+np.float32,0xff209aa6,0xbeb364cb,4
+np.float32,0xff477499,0x3c1b0041,4
+np.float32,0x803fe929,0x803fe929,4
+np.float32,0x3f70158b,0x3fae7725,4
+np.float32,0x7f795723,0x3e8e850a,4
+np.float32,0x3cba99,0x3cba99,4
+np.float32,0x80588d2a,0x80588d2a,4
+np.float32,0x805d1f05,0x805d1f05,4
+np.float32,0xff4ac09a,0xbefe614d,4
+np.float32,0x804af084,0x804af084,4
+np.float32,0x7c64ae63,0xc1a8b563,4
+np.float32,0x8078d793,0x8078d793,4
+np.float32,0x7f3e2436,0xbf8bf9d3,4
+np.float32,0x7ccec1,0x7ccec1,4
+np.float32,0xbf6462c7,0xbf9eb830,4
+np.float32,0x3f1002ca,0x3f216843,4
+np.float32,0xfe878ca6,0x409e73a5,4
+np.float32,0x3bd841d9,0x3bd842a7,4
+np.float32,0x7d406f41,0xbd9dcfa3,4
+np.float32,0x7c6d6,0x7c6d6,4
+np.float32,0x3f4ef360,0x3f86074b,4
+np.float32,0x805f534a,0x805f534a,4
+np.float32,0x1,0x1,4
+np.float32,0x3f739ee2,0x3fb39db2,4
+np.float32,0x3d0c2352,0x3d0c3153,4
+np.float32,0xfe8a4f2c,0x3edd8add,4
+np.float32,0x3e52eaa0,0x3e55f362,4
+np.float32,0x7bde9758,0xbf5ba5cf,4
+np.float32,0xff422654,0xbf41e487,4
+np.float32,0x385e5b,0x385e5b,4
+np.float32,0x5751dd,0x5751dd,4
+np.float32,0xff6c671c,0xc03e2d6d,4
+np.float32,0x1458be,0x1458be,4
+np.float32,0x80153d4d,0x80153d4d,4
+np.float32,0x7efd2adb,0x3e25458f,4
+np.float32,0xbe161880,0xbe172e12,4
+np.float32,0x7ecea1aa,0x40a66d79,4
+np.float32,0xbf5b02a2,0xbf9355f0,4
+np.float32,0x15d9ab,0x15d9ab,4
+np.float32,0x2dc7c7,0x2dc7c7,4
+np.float32,0xfebbf81a,0x4193f6e6,4
+np.float32,0xfe8e3594,0xc00a6695,4
+np.float32,0x185aa8,0x185aa8,4
+np.float32,0x3daea156,0x3daf0e00,4
+np.float32,0x3e071688,0x3e07e08e,4
+np.float32,0x802db9e6,0x802db9e6,4
+np.float32,0x7f7be2c4,0x3f1363dd,4
+np.float32,0x7eba3f5e,0xc13eb497,4
+np.float32,0x3de04a00,0x3de130a9,4
+np.float32,0xbf1022bc,0xbf2194eb,4
+np.float32,0xbf5b547e,0xbf93b53b,4
+np.float32,0x3e867bd6,0x3e89aa10,4
+np.float32,0xbea5eb5c,0xbeabfb73,4
+np.float32,0x7f1efae9,0x3ffca038,4
+np.float32,0xff5d0344,0xbe55dbbb,4
+np.float32,0x805167e7,0x805167e7,4
+np.float32,0xbdb3a020,0xbdb41667,4
+np.float32,0xbedea6b4,0xbeedd5fd,4
+np.float32,0x8053b45c,0x8053b45c,4
+np.float32,0x7ed370e9,0x3d90eba5,4
+np.float32,0xbefcd7da,0xbf09cf91,4
+np.float32,0x78b9ac,0x78b9ac,4
+np.float32,0xbf2f6dc0,0xbf5141ef,4
+np.float32,0x802d3a7b,0x802d3a7b,4
+np.float32,0xfd45d120,0x3fec31cc,4
+np.float32,0xbf7e7020,0xbfc4b2af,4
+np.float32,0xf04da,0xf04da,4
+np.float32,0xbe9819d4,0xbe9cbd35,4
+np.float32,0x8075ab35,0x8075ab35,4
+np.float32,0xbf052fdc,0xbf12aa2c,4
+np.float32,0x3f1530d0,0x3f28bd9f,4
+np.float32,0x80791881,0x80791881,4
+np.float32,0x67f309,0x67f309,4
+np.float32,0x3f12f16a,0x3f2588f5,4
+np.float32,0x3ecdac47,0x3ed97ff8,4
+np.float32,0xbf297fb7,0xbf478c39,4
+np.float32,0x8069fa80,0x8069fa80,4
+np.float32,0x807f940e,0x807f940e,4
+np.float32,0xbf648dc8,0xbf9eeecb,4
+np.float32,0x3de873b0,0x3de9748d,4
+np.float32,0x3f1aa645,0x3f30af1f,4
+np.float32,0xff227a62,0x3d8283cc,4
+np.float32,0xbf37187d,0xbf5e5f4c,4
+np.float32,0x803b1b1f,0x803b1b1f,4
+np.float32,0x3f58142a,0x3f8ff8da,4
+np.float32,0x8004339e,0x8004339e,4
+np.float32,0xbf0f5654,0xbf2077a4,4
+np.float32,0x3f17e509,0x3f2ca598,4
+np.float32,0x3f800000,0x3fc75923,4
+np.float32,0xfdf79980,0x42f13047,4
+np.float32,0x7f111381,0x3f13c4c9,4
+np.float32,0xbea40c70,0xbea9e724,4
+np.float32,0x110520,0x110520,4
+np.float32,0x60490d,0x60490d,4
+np.float32,0x3f6703ec,0x3fa21951,4
+np.float32,0xbf098256,0xbf187652,4
+np.float32,0x658951,0x658951,4
+np.float32,0x3f53bf16,0x3f8b2818,4
+np.float32,0xff451811,0xc0026068,4
+np.float32,0x80777ee0,0x80777ee0,4
+np.float32,0x3e4fcc19,0x3e52b286,4
+np.float32,0x7f387ee0,0x3ce93eb6,4
+np.float32,0xff51181f,0xbfca3ee4,4
+np.float32,0xbf5655ae,0xbf8e0304,4
+np.float32,0xff2f1dcd,0x40025471,4
+np.float32,0x7f6e58e5,0xbe9930d5,4
+np.float32,0x7adf11,0x7adf11,4
+np.float32,0xbe9a2bc2,0xbe9f0185,4
+np.float32,0x8065d3a0,0x8065d3a0,4
+np.float32,0x3ed6e826,0x3ee47c45,4
+np.float32,0x80598ea0,0x80598ea0,4
+np.float32,0x7f10b90a,0x40437bd0,4
+np.float32,0x27b447,0x27b447,4
+np.float32,0x7ecd861c,0x3fce250f,4
+np.float32,0x0,0x0,4
+np.float32,0xbeba82d6,0xbec3394c,4
+np.float32,0xbf4958b0,0xbf8048ea,4
+np.float32,0x7c643e,0x7c643e,4
+np.float32,0x580770,0x580770,4
+np.float32,0x805bf54a,0x805bf54a,4
+np.float32,0x7f1f3cee,0xbe1a54d6,4
+np.float32,0xfefefdea,0x3fa84576,4
+np.float32,0x7f007b7a,0x3e8a6d25,4
+np.float32,0xbf177959,0xbf2c0919,4
+np.float32,0xbf30fda0,0xbf53e058,4
+np.float32,0x3f0576be,0x3f130861,4
+np.float32,0x3f49380e,0x3f80283a,4
+np.float32,0xebc56,0xebc56,4
+np.float32,0x654e3b,0x654e3b,4
+np.float32,0x14a4d8,0x14a4d8,4
+np.float32,0xff69b3cb,0xbf822a88,4
+np.float32,0xbe9b6c1c,0xbea06109,4
+np.float32,0xbefddd7e,0xbf0a787b,4
+np.float32,0x4c4ebb,0x4c4ebb,4
+np.float32,0x7d0a74,0x7d0a74,4
+np.float32,0xbebb5f80,0xbec43635,4
+np.float32,0x7ee79723,0xc1c7f3f3,4
+np.float32,0x7f2be4c7,0xbfa6c693,4
+np.float32,0x805bc7d5,0x805bc7d5,4
+np.float32,0x8042f12c,0x8042f12c,4
+np.float32,0x3ef91be8,0x3f07697b,4
+np.float32,0x3cf37ac0,0x3cf38d1c,4
+np.float32,0x800000,0x800000,4
+np.float32,0xbe1ebf4c,0xbe200806,4
+np.float32,0x7f380862,0xbeb512e8,4
+np.float32,0xbe320064,0xbe33d0fc,4
+np.float32,0xff300b0c,0xbfadb805,4
+np.float32,0x308a06,0x308a06,4
+np.float32,0xbf084f6e,0xbf16d7b6,4
+np.float32,0xff47cab6,0x3f892b65,4
+np.float32,0xbed99f4a,0xbee7bfd5,4
+np.float32,0xff7d74c0,0x3ee88c9a,4
+np.float32,0x3c3d23,0x3c3d23,4
+np.float32,0x8074bde8,0x8074bde8,4
+np.float32,0x80042164,0x80042164,4
+np.float32,0x3e97c92a,0x3e9c6500,4
+np.float32,0x3b80e0,0x3b80e0,4
+np.float32,0xbf16646a,0xbf2a783d,4
+np.float32,0x7f3b4cb1,0xc01339be,4
+np.float32,0xbf31f36e,0xbf557fd0,4
+np.float32,0x7f540618,0xbe5f6fc1,4
+np.float32,0x7eee47d0,0x40a27e94,4
+np.float32,0x7f12f389,0xbebed654,4
+np.float32,0x56cff5,0x56cff5,4
+np.float32,0x8056032b,0x8056032b,4
+np.float32,0x3ed34e40,0x3ee02e38,4
+np.float32,0x7d51a908,0xbf19a90e,4
+np.float32,0x80000000,0x80000000,4
+np.float32,0xfdf73fd0,0xbf0f8cad,4
+np.float32,0x7ee4fe6d,0xbf1ea7e4,4
+np.float32,0x1f15ba,0x1f15ba,4
+np.float32,0xd18c3,0xd18c3,4
+np.float32,0x80797705,0x80797705,4
+np.float32,0x7ef07091,0x3f2f3b9a,4
+np.float32,0x7f552f41,0x3faf608c,4
+np.float32,0x3f779977,0x3fb9a7ad,4
+np.float32,0xfe1a7a50,0xbdadc4d1,4
+np.float32,0xbf449cf0,0xbf7740db,4
+np.float32,0xbe44e620,0xbe475cad,4
+np.float32,0x3f63a098,0x3f9dc2b5,4
+np.float32,0xfed40a12,0x4164533a,4
+np.float32,0x7a2bbb,0x7a2bbb,4
+np.float32,0xff7f7b9e,0xbeee8740,4
+np.float32,0x7ee27f8b,0x4233f53b,4
+np.float32,0xbf044c06,0xbf117c28,4
+np.float32,0xbeffde54,0xbf0bc49f,4
+np.float32,0xfeaef2e8,0x3ff258fe,4
+np.float32,0x527451,0x527451,4
+np.float32,0xbcef8d00,0xbcef9e7c,4
+np.float32,0xbf0e20c0,0xbf1ec9b2,4
+np.float32,0x8024afda,0x8024afda,4
+np.float32,0x7ef6cb3e,0x422cad0b,4
+np.float32,0x3c120,0x3c120,4
+np.float32,0xbf125c8f,0xbf24b62c,4
+np.float32,0x7e770a93,0x402c9d86,4
+np.float32,0xbd30a4e0,0xbd30c0ee,4
+np.float32,0xbf4d3388,0xbf843530,4
+np.float32,0x3f529072,0x3f89df92,4
+np.float32,0xff0270b1,0xbf81be9a,4
+np.float32,0x5e07e7,0x5e07e7,4
+np.float32,0x7bec32,0x7bec32,4
+np.float32,0x7fc00000,0x7fc00000,4
+np.float32,0x3e3ba5e0,0x3e3dc6e9,4
+np.float32,0x3ecb62d4,0x3ed6ce2c,4
+np.float32,0x3eb3dde8,0x3ebba68f,4
+np.float32,0x8063f952,0x8063f952,4
+np.float32,0x7f204aeb,0x3e88614e,4
+np.float32,0xbeae1ddc,0xbeb5278e,4
+np.float32,0x6829e9,0x6829e9,4
+np.float32,0xbf361a99,0xbf5ca354,4
+np.float32,0xbf24fbe6,0xbf406326,4
+np.float32,0x3f329d41,0x3f56a061,4
+np.float32,0xfed6d666,0x3e8f71a5,4
+np.float32,0x337f92,0x337f92,4
+np.float32,0xbe1c4970,0xbe1d8305,4
+np.float32,0xbe6b7e18,0xbe6fbbde,4
+np.float32,0x3f2267b9,0x3f3c61da,4
+np.float32,0xbee1ee94,0xbef1d628,4
+np.float32,0x7ecffc1a,0x3f02987e,4
+np.float32,0xbe9b1306,0xbe9fff3b,4
+np.float32,0xbeffacae,0xbf0ba468,4
+np.float32,0x7f800000,0xffc00000,4
+np.float32,0xfefc9aa8,0xc19de2a3,4
+np.float32,0x7d7185bb,0xbf9090ec,4
+np.float32,0x7edfbafd,0x3fe9352f,4
+np.float32,0x4ef2ec,0x4ef2ec,4
+np.float32,0x7f4cab2e,0xbff4e5dd,4
+np.float32,0xff3b1788,0x3e3c22e9,4
+np.float32,0x4e15ee,0x4e15ee,4
+np.float32,0xbf5451e6,0xbf8bc8a7,4
+np.float32,0x3f7f6d2e,0x3fc65e8b,4
+np.float32,0xbf1d9184,0xbf35071b,4
+np.float32,0xbf3a81cf,0xbf646d9b,4
+np.float32,0xbe71acc4,0xbe7643ab,4
+np.float32,0x528b7d,0x528b7d,4
+np.float32,0x2cb1d0,0x2cb1d0,4
+np.float32,0x3f324bf8,0x3f56161a,4
+np.float32,0x80709a21,0x80709a21,4
+np.float32,0x4bc448,0x4bc448,4
+np.float32,0x3e8bd600,0x3e8f6b7a,4
+np.float32,0xbeb97d30,0xbec20dd6,4
+np.float32,0x2a5669,0x2a5669,4
+np.float32,0x805f2689,0x805f2689,4
+np.float32,0xfe569f50,0x3fc51952,4
+np.float32,0x1de44c,0x1de44c,4
+np.float32,0x3ec7036c,0x3ed1ae67,4
+np.float32,0x8052b8e5,0x8052b8e5,4
+np.float32,0xff740a6b,0x3f4981a8,4
+np.float32,0xfee9bb70,0xc05e23be,4
+np.float32,0xff4e12c9,0x4002b4ad,4
+np.float32,0x803de0c2,0x803de0c2,4
+np.float32,0xbf433a07,0xbf74966f,4
+np.float32,0x803e60ca,0x803e60ca,4
+np.float32,0xbf19ee98,0xbf2fa07a,4
+np.float32,0x92929,0x92929,4
+np.float32,0x7f709c27,0x4257ba2d,4
+np.float32,0x803167c6,0x803167c6,4
+np.float32,0xbf095ead,0xbf184607,4
+np.float32,0x617060,0x617060,4
+np.float32,0x2d85b3,0x2d85b3,4
+np.float32,0x53d20b,0x53d20b,4
+np.float32,0x3e046838,0x3e052666,4
+np.float32,0xbe7c5fdc,0xbe80ce4b,4
+np.float32,0x3d18d060,0x3d18e289,4
+np.float32,0x804dc031,0x804dc031,4
+np.float32,0x3f224166,0x3f3c26cd,4
+np.float32,0x7d683e3c,0xbea24f25,4
+np.float32,0xbf3a92aa,0xbf648be4,4
+np.float32,0x8072670b,0x8072670b,4
+np.float32,0xbe281aec,0xbe29a1bc,4
+np.float32,0x7f09d918,0xc0942490,4
+np.float32,0x7ca9fd07,0x4018b990,4
+np.float32,0x7d36ac5d,0x3cf57184,4
+np.float32,0x8039b62f,0x8039b62f,4
+np.float32,0x6cad7b,0x6cad7b,4
+np.float32,0x3c0fd9ab,0x3c0fda9d,4
+np.float32,0x80299883,0x80299883,4
+np.float32,0x3c2d0e3e,0x3c2d0fe4,4
+np.float32,0x8002cf62,0x8002cf62,4
+np.float32,0x801dde97,0x801dde97,4
+np.float32,0x80411856,0x80411856,4
+np.float32,0x6ebce8,0x6ebce8,4
+np.float32,0x7b7d1a,0x7b7d1a,4
+np.float32,0x8031d3de,0x8031d3de,4
+np.float32,0x8005c4ab,0x8005c4ab,4
+np.float32,0xbf7dd803,0xbfc3b3ef,4
+np.float32,0x8017ae60,0x8017ae60,4
+np.float32,0xfe9316ce,0xbfe0544a,4
+np.float32,0x3f136bfe,0x3f2636ff,4
+np.float32,0x3df87b80,0x3df9b57d,4
+np.float32,0xff44c356,0xbf11c7ad,4
+np.float32,0x4914ae,0x4914ae,4
+np.float32,0x80524c21,0x80524c21,4
+np.float32,0x805c7dc8,0x805c7dc8,4
+np.float32,0xfed3c0aa,0xbff0c0ab,4
+np.float32,0x7eb2bfbb,0xbf4600bc,4
+np.float32,0xfec8df84,0x3f5bd350,4
+np.float32,0x3e5431a4,0x3e5748c3,4
+np.float32,0xbee6a3a0,0xbef79e86,4
+np.float32,0xbf6cc9b2,0xbfa9d61a,4
+np.float32,0x3f132bd5,0x3f25dbd9,4
+np.float32,0x7e6d2e48,0x3f9d025b,4
+np.float32,0x3edf430c,0x3eee942d,4
+np.float32,0x3f0d1b8a,0x3f1d60e1,4
+np.float32,0xbdf2f688,0xbdf41bfb,4
+np.float32,0xbe47a284,0xbe4a33ff,4
+np.float32,0x3eaa9fbc,0x3eb13be7,4
+np.float32,0xfe98d45e,0x3eb84517,4
+np.float32,0x7efc23b3,0x3dcc1c99,4
+np.float32,0x3ca36242,0x3ca367ce,4
+np.float32,0x3f76a944,0x3fb834e3,4
+np.float32,0xbf45207c,0xbf783f9b,4
+np.float32,0x3e7c1220,0x3e80a4f8,4
+np.float32,0x3f018200,0x3f0dd14e,4
+np.float32,0x3f53cdde,0x3f8b3839,4
+np.float32,0xbdbacb58,0xbdbb5063,4
+np.float32,0x804af68d,0x804af68d,4
+np.float32,0x3e2c12fc,0x3e2db65b,4
+np.float32,0x3f039433,0x3f10895a,4
+np.float32,0x7ef5193d,0x3f4115f7,4
+np.float32,0x8030afbe,0x8030afbe,4
+np.float32,0x3f06fa2a,0x3f150d5d,4
+np.float32,0x3f124442,0x3f2493d2,4
+np.float32,0xbeb5b792,0xbebdc090,4
+np.float32,0xbedc90a4,0xbeeb4de9,4
+np.float32,0x3f3ff8,0x3f3ff8,4
+np.float32,0x3ee75bc5,0x3ef881e4,4
+np.float32,0xfe80e3de,0xbf5cd535,4
+np.float32,0xf52eb,0xf52eb,4
+np.float32,0x80660ee8,0x80660ee8,4
+np.float32,0x3e173a58,0x3e185648,4
+np.float32,0xfe49520c,0xbf728d7c,4
+np.float32,0xbecbb8ec,0xbed73373,4
+np.float32,0xbf027ae0,0xbf0f173e,4
+np.float32,0xbcab6740,0xbcab6da8,4
+np.float32,0xbf2a15e2,0xbf487e11,4
+np.float32,0x3b781b,0x3b781b,4
+np.float32,0x44f559,0x44f559,4
+np.float32,0xff6a0ca6,0xc174d7c3,4
+np.float32,0x6460ef,0x6460ef,4
+np.float32,0xfe58009c,0x3ee2bb30,4
+np.float32,0xfec3c038,0x3e30d617,4
+np.float32,0x7f0687c0,0xbf62c820,4
+np.float32,0xbf44655e,0xbf76d589,4
+np.float32,0xbf42968c,0xbf735e78,4
+np.float32,0x80385503,0x80385503,4
+np.float32,0xbea7e3a2,0xbeae2d59,4
+np.float32,0x3dd0b770,0x3dd17131,4
+np.float32,0xbf4bc185,0xbf82b907,4
+np.float32,0xfefd7d64,0xbee05650,4
+np.float32,0xfaac3c00,0xbff23bc9,4
+np.float32,0xbf562f0d,0xbf8dd7f4,4
+np.float32,0x7fa00000,0x7fe00000,4
+np.float32,0x3e01bdb8,0x3e027098,4
+np.float32,0x3e2868ab,0x3e29f19e,4
+np.float32,0xfec55f2e,0x3f39f304,4
+np.float32,0xed4e,0xed4e,4
+np.float32,0x3e2b7330,0x3e2d11fa,4
+np.float32,0x7f738542,0x40cbbe16,4
+np.float32,0x3f123521,0x3f247e71,4
+np.float32,0x73572c,0x73572c,4
+np.float32,0x804936c8,0x804936c8,4
+np.float32,0x803b80d8,0x803b80d8,4
+np.float32,0x7f566c57,0xbee2855a,4
+np.float32,0xff0e3bd8,0xbff0543f,4
+np.float32,0x7d2b2fe7,0xbf94ba4c,4
+np.float32,0xbf0da470,0xbf1e1dc2,4
+np.float32,0xbd276500,0xbd277ce0,4
+np.float32,0xfcd15dc0,0x403ccc2a,4
+np.float32,0x80071e59,0x80071e59,4
+np.float32,0xbe9b0c34,0xbe9ff7be,4
+np.float32,0x3f4f9069,0x3f86ac50,4
+np.float32,0x80042a95,0x80042a95,4
+np.float32,0x7de28e39,0x3bc9b7f4,4
+np.float32,0xbf641935,0xbf9e5af8,4
+np.float32,0x8034f068,0x8034f068,4
+np.float32,0xff33a3d2,0xbf408e75,4
+np.float32,0xbcc51540,0xbcc51efc,4
+np.float32,0xff6d1ddf,0x3ef58f0e,4
+np.float32,0xbf64dfc4,0xbf9f5725,4
+np.float32,0xff068a06,0x3eea8987,4
+np.float32,0xff01c0af,0x3f24cdfe,4
+np.float32,0x3f4def7e,0x3f84f802,4
+np.float32,0xbf1b4ae7,0xbf31a299,4
+np.float32,0x8077df2d,0x8077df2d,4
+np.float32,0x3f0155c5,0x3f0d9785,4
+np.float32,0x5a54b2,0x5a54b2,4
+np.float32,0x7f271f9e,0x3efb2ef3,4
+np.float32,0xbf0ff2ec,0xbf215217,4
+np.float32,0x7f500130,0xbf8a7fdd,4
+np.float32,0xfed9891c,0xbf65c872,4
+np.float32,0xfecbfaae,0x403bdbc2,4
+np.float32,0x3f3a5aba,0x3f642772,4
+np.float32,0x7ebc681e,0xbd8df059,4
+np.float32,0xfe05e400,0xbfe35d74,4
+np.float32,0xbf295ace,0xbf4750ea,4
+np.float32,0x7ea055b2,0x3f62d6be,4
+np.float32,0xbd00b520,0xbd00bff9,4
+np.float32,0xbf7677aa,0xbfb7e8cf,4
+np.float32,0x3e83f788,0x3e86f816,4
+np.float32,0x801f6710,0x801f6710,4
+np.float32,0x801133cc,0x801133cc,4
+np.float32,0x41da2a,0x41da2a,4
+np.float32,0xff1622fd,0x3f023650,4
+np.float32,0x806c7a72,0x806c7a72,4
+np.float32,0x3f10779c,0x3f220bb4,4
+np.float32,0xbf08cf94,0xbf17848d,4
+np.float32,0xbecb55b4,0xbed6bebd,4
+np.float32,0xbf0a1528,0xbf193d7b,4
+np.float32,0x806a16bd,0x806a16bd,4
+np.float32,0xc222a,0xc222a,4
+np.float32,0x3930de,0x3930de,4
+np.float32,0x3f5c3588,0x3f94bca2,4
+np.float32,0x1215ad,0x1215ad,4
+np.float32,0x3ed15030,0x3eddcf67,4
+np.float32,0x7da83b2e,0x3fce0d39,4
+np.float32,0x32b0a8,0x32b0a8,4
+np.float32,0x805aed6b,0x805aed6b,4
+np.float32,0x3ef8e02f,0x3f074346,4
+np.float32,0xbdeb6780,0xbdec7250,4
+np.float32,0x3f6e3cec,0x3fabda61,4
+np.float32,0xfefd467a,0x3ef7821a,4
+np.float32,0xfef090fe,0x3bb752a2,4
+np.float32,0x8019c538,0x8019c538,4
+np.float32,0x3e8cf284,0x3e909e81,4
+np.float32,0xbe6c6618,0xbe70b0a2,4
+np.float32,0x7f50a539,0x3f367be1,4
+np.float32,0x8019fe2f,0x8019fe2f,4
+np.float32,0x800c3f48,0x800c3f48,4
+np.float32,0xfd054cc0,0xc0f52802,4
+np.float32,0x3d0cca20,0x3d0cd853,4
+np.float32,0xbf4a7c44,0xbf816e74,4
+np.float32,0x3f46fc40,0x3f7be153,4
+np.float32,0x807c5849,0x807c5849,4
+np.float32,0xd7e41,0xd7e41,4
+np.float32,0x70589b,0x70589b,4
+np.float32,0x80357b95,0x80357b95,4
+np.float32,0x3de239f0,0x3de326a5,4
+np.float32,0x800b08e3,0x800b08e3,4
+np.float32,0x807ec946,0x807ec946,4
+np.float32,0x3e2e4b83,0x3e2fff76,4
+np.float32,0x3f198e0f,0x3f2f12a6,4
+np.float32,0xbecb1aca,0xbed67979,4
+np.float32,0x80134082,0x80134082,4
+np.float32,0x3f3a269f,0x3f63ca05,4
+np.float32,0x3f1381e4,0x3f265622,4
+np.float32,0xff293080,0xbf10be6f,4
+np.float32,0xff800000,0xffc00000,4
+np.float32,0x37d196,0x37d196,4
+np.float32,0x7e57eea7,0x3e7d8138,4
+np.float32,0x804b1dae,0x804b1dae,4
+np.float32,0x7d9508f9,0xc1075b35,4
+np.float32,0x3f7bf468,0x3fc095e0,4
+np.float32,0x55472c,0x55472c,4
+np.float32,0x3ecdcd86,0x3ed9a738,4
+np.float32,0x3ed9be0f,0x3ee7e4e9,4
+np.float32,0x3e7e0ddb,0x3e81b2fe,4
+np.float32,0x7ee6c1d3,0x3f850634,4
+np.float32,0x800f6fad,0x800f6fad,4
+np.float32,0xfefb3bd6,0xbff68ecc,4
+np.float32,0x8013d6e2,0x8013d6e2,4
+np.float32,0x3f3a2cb6,0x3f63d4ee,4
+np.float32,0xff383c84,0x3e7854bb,4
+np.float32,0x3f21946e,0x3f3b1cea,4
+np.float32,0xff322ea2,0x3fb22f31,4
+np.float32,0x8065a024,0x8065a024,4
+np.float32,0x7f395e30,0xbefe0de1,4
+np.float32,0x5b52db,0x5b52db,4
+np.float32,0x7f7caea7,0x3dac8ded,4
+np.float32,0xbf0431f8,0xbf1159b2,4
+np.float32,0x7f15b25b,0xc02a3833,4
+np.float32,0x80131abc,0x80131abc,4
+np.float32,0x7e829d81,0xbeb2e93d,4
+np.float32,0x3f2c64d7,0x3f4c3e4d,4
+np.float32,0x7f228d48,0xc1518c74,4
+np.float32,0xfc3c6f40,0xbf00d585,4
+np.float32,0x7f754f0f,0x3e2152f5,4
+np.float32,0xff65d32b,0xbe8bd56c,4
+np.float32,0xfea6b8c0,0x41608655,4
+np.float32,0x3f7d4b05,0x3fc2c96a,4
+np.float32,0x3f463230,0x3f7a54da,4
+np.float32,0x805117bb,0x805117bb,4
+np.float32,0xbf2ad4f7,0xbf49b30e,4
+np.float32,0x3eaa01ff,0x3eb08b56,4
+np.float32,0xff7a02bb,0x3f095f73,4
+np.float32,0x759176,0x759176,4
+np.float32,0x803c18d5,0x803c18d5,4
+np.float32,0xbe0722d8,0xbe07ed16,4
+np.float32,0x3f4b4a99,0x3f823fc6,4
+np.float32,0x3f7d0451,0x3fc25463,4
+np.float32,0xfee31e40,0xbfb41091,4
+np.float32,0xbf733d2c,0xbfb30cf1,4
+np.float32,0x7ed81015,0x417c380c,4
+np.float32,0x7daafc3e,0xbe2a37ed,4
+np.float32,0x3e44f82b,0x3e476f67,4
+np.float32,0x7c8d99,0x7c8d99,4
+np.float32,0x3f7aec5a,0x3fbee991,4
+np.float32,0xff09fd55,0x3e0709d3,4
+np.float32,0xff4ba4df,0x4173c01f,4
+np.float32,0x3f43d944,0x3f75c7bd,4
+np.float32,0xff6a9106,0x40a10eff,4
+np.float32,0x3bc8341c,0x3bc834bf,4
+np.float32,0x3eea82,0x3eea82,4
+np.float32,0xfea36a3c,0x435729b2,4
+np.float32,0x7dcc1fb0,0x3e330053,4
+np.float32,0x3f616ae6,0x3f9b01ae,4
+np.float32,0x8030963f,0x8030963f,4
+np.float32,0x10d1e2,0x10d1e2,4
+np.float32,0xfeb9a8a6,0x40e6daac,4
+np.float32,0xbe1aba00,0xbe1bea3a,4
+np.float32,0x3cb6b4ea,0x3cb6bcac,4
+np.float32,0x3d8b0b64,0x3d8b422f,4
+np.float32,0x7b6894,0x7b6894,4
+np.float32,0x3e89dcde,0x3e8d4b4b,4
+np.float32,0x3f12b952,0x3f253974,4
+np.float32,0x1c316c,0x1c316c,4
+np.float32,0x7e2da535,0x3f95fe6b,4
+np.float32,0x3ae9a494,0x3ae9a4a4,4
+np.float32,0xbc5f5500,0xbc5f588b,4
+np.float32,0x3e7850fc,0x3e7d4d0e,4
+np.float32,0xbf800000,0xbfc75923,4
+np.float32,0x3e652d69,0x3e691502,4
+np.float32,0xbf6bdd26,0xbfa89129,4
+np.float32,0x3f441cfc,0x3f764a02,4
+np.float32,0x7f5445ff,0xc0906191,4
+np.float32,0x807b2ee3,0x807b2ee3,4
+np.float32,0xbeb6cab8,0xbebef9c0,4
+np.float32,0xff737277,0xbf327011,4
+np.float32,0xfc832aa0,0x402fd52e,4
+np.float32,0xbf0c7538,0xbf1c7c0f,4
+np.float32,0x7e1301c7,0xbf0ee63e,4
+np.float64,0xbfe0ef7df7a1defc,0xbfe2b76a8d8aeb35,4
+np.float64,0x7fdd9c2eae3b385c,0xbfc00d6885485039,4
+np.float64,0xbfb484c710290990,0xbfb4900e0a527555,4
+np.float64,0x7fe73e5d6cee7cba,0x3fefbf70a56b60d3,4
+np.float64,0x800a110aa8d42216,0x800a110aa8d42216,4
+np.float64,0xffedd4f3f3bba9e7,0xbff076f8c4124919,4
+np.float64,0x800093407f812682,0x800093407f812682,4
+np.float64,0x800a23150e54462a,0x800a23150e54462a,4
+np.float64,0xbfb1076864220ed0,0xbfb10dd95a74b733,4
+np.float64,0x3fed1f8b37fa3f16,0x3ff496100985211f,4
+np.float64,0x3fdf762f84beec5f,0x3fe1223eb04a17e0,4
+np.float64,0x53fd4e0aa7faa,0x53fd4e0aa7faa,4
+np.float64,0x3fdbd283bdb7a507,0x3fddb7ec9856a546,4
+np.float64,0xbfe43f449d687e89,0xbfe77724a0d3072b,4
+np.float64,0x618b73bcc316f,0x618b73bcc316f,4
+np.float64,0x67759424ceeb3,0x67759424ceeb3,4
+np.float64,0xbfe4b6f7d9a96df0,0xbfe831371f3bd7a8,4
+np.float64,0x800a531b8b74a637,0x800a531b8b74a637,4
+np.float64,0xffeeffd5c37dffab,0x3fea140cbc2c3726,4
+np.float64,0x3fe648e2002c91c4,0x3feac1b8816f972a,4
+np.float64,0x800f16242a1e2c48,0x800f16242a1e2c48,4
+np.float64,0xffeeff8e1dbdff1b,0xc000b555f117dce7,4
+np.float64,0x3fdf1cf73fbe39f0,0x3fe0e9032401135b,4
+np.float64,0x7fe19c388b633870,0x3fd5271b69317d5b,4
+np.float64,0x918f226d231e5,0x918f226d231e5,4
+np.float64,0x4cc19ab499834,0x4cc19ab499834,4
+np.float64,0xbd3121d57a624,0xbd3121d57a624,4
+np.float64,0xbfd145d334a28ba6,0xbfd1b468866124d6,4
+np.float64,0x8bdbf41517b7f,0x8bdbf41517b7f,4
+np.float64,0x3fd1b8cb3ea37198,0x3fd2306b13396cae,4
+np.float64,0xbfd632a959ac6552,0xbfd7220fcfb5ef78,4
+np.float64,0x1cdaafc639b57,0x1cdaafc639b57,4
+np.float64,0x3febdcce1577b99c,0x3ff2fe076195a2bc,4
+np.float64,0x7fca6e945934dd28,0x3ff43040df7024e8,4
+np.float64,0x3fbe08e78e3c11cf,0x3fbe2c60e6b48f75,4
+np.float64,0x7fc1ed0d0523da19,0x3ff55f8dcad9440f,4
+np.float64,0xbfdc729b8cb8e538,0xbfde7b6e15dd60c4,4
+np.float64,0x3fd219404f243281,0x3fd298d7b3546531,4
+np.float64,0x3fe715c3f56e2b88,0x3fec255b5a59456e,4
+np.float64,0x7fe8b88e74b1711c,0x3ff60efd2c81d13d,4
+np.float64,0xa1d2b9fd43a57,0xa1d2b9fd43a57,4
+np.float64,0xffc1818223230304,0xbfb85c6c1e8018e7,4
+np.float64,0x3fde38ac8b3c7159,0x3fe0580c7e228576,4
+np.float64,0x8008faf7b491f5f0,0x8008faf7b491f5f0,4
+np.float64,0xffe7a1d751af43ae,0xbf7114cd7bbcd981,4
+np.float64,0xffec2db1b4b85b62,0xbff5cae759667f83,4
+np.float64,0x7fefce1ae27f9c35,0x3ff4b8b88f4876cf,4
+np.float64,0x7fd1ff56a523feac,0xbff342ce192f14dd,4
+np.float64,0x80026b3e3f84d67d,0x80026b3e3f84d67d,4
+np.float64,0xffedee5879bbdcb0,0xc02fae11508b2be0,4
+np.float64,0x8003c0dc822781ba,0x8003c0dc822781ba,4
+np.float64,0xffe38a79eca714f4,0xc008aa23b7a63980,4
+np.float64,0xbfda70411eb4e082,0xbfdc0d7e29c89010,4
+np.float64,0x800a5e34f574bc6a,0x800a5e34f574bc6a,4
+np.float64,0x3fc19fac6e233f59,0x3fc1bc66ac0d73d4,4
+np.float64,0x3a8a61ea7514d,0x3a8a61ea7514d,4
+np.float64,0x3fb57b536e2af6a0,0x3fb588451f72f44c,4
+np.float64,0x7fd68c6d082d18d9,0xc032ac926b665c9a,4
+np.float64,0xd5b87cfdab710,0xd5b87cfdab710,4
+np.float64,0xfe80b20bfd017,0xfe80b20bfd017,4
+np.float64,0x3fef8781e37f0f04,0x3ff8215fe2c1315a,4
+np.float64,0xffedddbb9c3bbb76,0x3fd959b82258a32a,4
+np.float64,0x3fc7d41f382fa83e,0x3fc81b94c3a091ba,4
+np.float64,0xffc3275dcf264ebc,0x3fb2b3d4985c6078,4
+np.float64,0x7fe34d2b7ba69a56,0x40001f3618e3c7c9,4
+np.float64,0x3fd64ae35fac95c7,0x3fd73d77e0b730f8,4
+np.float64,0x800e53bf6b3ca77f,0x800e53bf6b3ca77f,4
+np.float64,0xbfddf7c9083bef92,0xbfe02f392744d2d1,4
+np.float64,0x1c237cc038471,0x1c237cc038471,4
+np.float64,0x3fe4172beea82e58,0x3fe739b4bf16bc7e,4
+np.float64,0xfa950523f52a1,0xfa950523f52a1,4
+np.float64,0xffc839a2c5307344,0xbff70ff8a3c9247f,4
+np.float64,0x264f828c4c9f1,0x264f828c4c9f1,4
+np.float64,0x148a650a2914e,0x148a650a2914e,4
+np.float64,0x3fe8d255c0b1a4ac,0x3fef623c3ea8d6e3,4
+np.float64,0x800f4fbb28be9f76,0x800f4fbb28be9f76,4
+np.float64,0x7fdca57bcfb94af7,0x3ff51207563fb6cb,4
+np.float64,0x3fe4944107692882,0x3fe7fad593235364,4
+np.float64,0x800119b4f1a2336b,0x800119b4f1a2336b,4
+np.float64,0xbfe734075e6e680e,0xbfec5b35381069f2,4
+np.float64,0xffeb3c00db767801,0xbfbbd7d22df7b4b3,4
+np.float64,0xbfe95c658cb2b8cb,0xbff03ad5e0bc888a,4
+np.float64,0xffeefeb58fbdfd6a,0xbfd5c9264deb0e11,4
+np.float64,0x7fccc80fde39901f,0xc012c60f914f3ca2,4
+np.float64,0x3fe5da289c2bb451,0x3fea07ad00a0ca63,4
+np.float64,0x800e364b0a5c6c96,0x800e364b0a5c6c96,4
+np.float64,0x3fcf9ea7d23f3d50,0x3fd023b72e8c9dcf,4
+np.float64,0x800a475cfc948eba,0x800a475cfc948eba,4
+np.float64,0xffd4e0d757a9c1ae,0xbfa89d573352e011,4
+np.float64,0xbfd4dbec8229b7da,0xbfd5a165f12c7c40,4
+np.float64,0xffe307ab51260f56,0x3fe6b1639da58c3f,4
+np.float64,0xbfe6955a546d2ab4,0xbfeb44ae2183fee9,4
+np.float64,0xbfca1f18f5343e30,0xbfca7d804ccccdf4,4
+np.float64,0xe9f4dfebd3e9c,0xe9f4dfebd3e9c,4
+np.float64,0xfff0000000000000,0xfff8000000000000,4
+np.float64,0x8008e69c0fb1cd38,0x8008e69c0fb1cd38,4
+np.float64,0xbfead1ccf975a39a,0xbff1c84b3db8ca93,4
+np.float64,0x25a982424b531,0x25a982424b531,4
+np.float64,0x8010000000000000,0x8010000000000000,4
+np.float64,0x80056204ea0ac40b,0x80056204ea0ac40b,4
+np.float64,0x800d1442d07a2886,0x800d1442d07a2886,4
+np.float64,0xbfaef3dadc3de7b0,0xbfaefd85ae6205f0,4
+np.float64,0x7fe969ce4b32d39c,0xbff3c4364fc6778f,4
+np.float64,0x7fe418bac0a83175,0x402167d16b1efe0b,4
+np.float64,0x3fd7c82a25af9054,0x3fd8f0c701315672,4
+np.float64,0x80013782a7826f06,0x80013782a7826f06,4
+np.float64,0x7fc031c7ee20638f,0x400747ab705e6904,4
+np.float64,0x3fe8cf327ff19e65,0x3fef5c14f8aafa89,4
+np.float64,0xbfe331a416a66348,0xbfe5e2290a098dd4,4
+np.float64,0x800607b2116c0f65,0x800607b2116c0f65,4
+np.float64,0x7fb40448f0280891,0xbfd43d4f0ffa1d64,4
+np.float64,0x7fefffffffffffff,0xbf74530cfe729484,4
+np.float64,0x3fe39b5444a736a9,0x3fe67eaa0b6acf27,4
+np.float64,0x3fee4733c4fc8e68,0x3ff631eabeef9696,4
+np.float64,0xbfec840f3b79081e,0xbff3cc8563ab2e74,4
+np.float64,0xbfc8f6854c31ed0c,0xbfc948caacb3bba0,4
+np.float64,0xffbcf754a639eea8,0xbfc88d17cad3992b,4
+np.float64,0x8000bd3163417a64,0x8000bd3163417a64,4
+np.float64,0x3fe766d0eaeecda2,0x3fecb660882f7024,4
+np.float64,0xb6cc30156d986,0xb6cc30156d986,4
+np.float64,0xffc0161f9f202c40,0x3fe19bdefe5cf8b1,4
+np.float64,0xffe1e462caa3c8c5,0x3fe392c47feea17b,4
+np.float64,0x30a36a566146e,0x30a36a566146e,4
+np.float64,0x3fa996f580332deb,0x3fa99c6b4f2abebe,4
+np.float64,0x3fba71716e34e2e0,0x3fba899f35edba1d,4
+np.float64,0xbfe8f7e5e971efcc,0xbfefac431a0e3d55,4
+np.float64,0xf48f1803e91e3,0xf48f1803e91e3,4
+np.float64,0x7fe3edc0a127db80,0xc03d1a579a5d74a8,4
+np.float64,0xffeba82056375040,0x3fdfd701308700db,4
+np.float64,0xbfeb5a924cf6b524,0xbff2640de7cd107f,4
+np.float64,0xfa4cd1a9f499a,0xfa4cd1a9f499a,4
+np.float64,0x800de1be7b9bc37d,0x800de1be7b9bc37d,4
+np.float64,0xffd44e56ad289cae,0x3fdf4b8085db9b67,4
+np.float64,0xbfe4fb3aea69f676,0xbfe89d2cc46fcc50,4
+np.float64,0xbfe596495d6b2c92,0xbfe997a589a1f632,4
+np.float64,0x6f55a2b8deab5,0x6f55a2b8deab5,4
+np.float64,0x7fe72dc4712e5b88,0x4039c4586b28c2bc,4
+np.float64,0x89348bd712692,0x89348bd712692,4
+np.float64,0xffe062156120c42a,0x4005f0580973bc77,4
+np.float64,0xbfeabc714d7578e2,0xbff1b07e2fa57dc0,4
+np.float64,0x8003a56b3e874ad7,0x8003a56b3e874ad7,4
+np.float64,0x800eeadfb85dd5c0,0x800eeadfb85dd5c0,4
+np.float64,0x46d77a4c8daf0,0x46d77a4c8daf0,4
+np.float64,0x8000c06e7dc180de,0x8000c06e7dc180de,4
+np.float64,0x3fe428d211e851a4,0x3fe754b1c00a89bc,4
+np.float64,0xc5be11818b7c2,0xc5be11818b7c2,4
+np.float64,0x7fefc244893f8488,0x401133dc54f52de5,4
+np.float64,0x3fde30eee93c61de,0x3fe0532b827543a6,4
+np.float64,0xbfd447f48b288fea,0xbfd4fd0654f90718,4
+np.float64,0xbfde98dc7b3d31b8,0xbfe094df12f84a06,4
+np.float64,0x3fed2c1a1dfa5834,0x3ff4a6c4f3470a65,4
+np.float64,0xbfe992165073242d,0xbff071ab039c9177,4
+np.float64,0x3fd0145d1b2028ba,0x3fd06d3867b703dc,4
+np.float64,0x3fe179457362f28b,0x3fe3722f1d045fda,4
+np.float64,0x800e28964fbc512d,0x800e28964fbc512d,4
+np.float64,0x8004a5d785294bb0,0x8004a5d785294bb0,4
+np.float64,0xbfd652f2272ca5e4,0xbfd7469713125120,4
+np.float64,0x7fe61f49036c3e91,0xbf9b6ccdf2d87e70,4
+np.float64,0xffb7d47dd02fa8f8,0xc004449a82320b13,4
+np.float64,0x3feb82f996b705f3,0x3ff29336c738a4c5,4
+np.float64,0x3fbb7fceea36ffa0,0x3fbb9b02c8ad7f93,4
+np.float64,0x80004519fb208a35,0x80004519fb208a35,4
+np.float64,0xbfe0539114e0a722,0xbfe1e86dc5aa039c,4
+np.float64,0x0,0x0,4
+np.float64,0xbfe99d1125f33a22,0xbff07cf8ec04300f,4
+np.float64,0xffd4fbeecc29f7de,0x3ffab76775a8455f,4
+np.float64,0xbfbf1c618e3e38c0,0xbfbf43d2764a8333,4
+np.float64,0x800cae02a9d95c06,0x800cae02a9d95c06,4
+np.float64,0x3febc47d3bf788fa,0x3ff2e0d7cf8ef509,4
+np.float64,0x3fef838f767f071f,0x3ff81aeac309bca0,4
+np.float64,0xbfd5e70716abce0e,0xbfd6ccb033ef7a35,4
+np.float64,0x3f9116fa60222df5,0x3f9117625f008e0b,4
+np.float64,0xffe02b1e5f20563c,0xbfe6b2ec293520b7,4
+np.float64,0xbf9b5aec3036b5e0,0xbf9b5c96c4c7f951,4
+np.float64,0xfdb0169bfb603,0xfdb0169bfb603,4
+np.float64,0x7fcdd1d51c3ba3a9,0x401f0e12fa0b7570,4
+np.float64,0xbfd088103fa11020,0xbfd0e8c4a333ffb2,4
+np.float64,0x3fe22df82ee45bf0,0x3fe46d03a7c14de2,4
+np.float64,0xbfd57b0c28aaf618,0xbfd65349a6191de5,4
+np.float64,0x3fe0a42f50a1485f,0x3fe252e26775d9a4,4
+np.float64,0x800fab4e363f569c,0x800fab4e363f569c,4
+np.float64,0xffe9f0ed63f3e1da,0xbfe278c341b171d5,4
+np.float64,0x7fe26c244664d848,0xbfb325269dad1996,4
+np.float64,0xffe830410bf06081,0xc00181a39f606e96,4
+np.float64,0x800c548a0c78a914,0x800c548a0c78a914,4
+np.float64,0x800f94761ebf28ec,0x800f94761ebf28ec,4
+np.float64,0x3fe5984845eb3091,0x3fe99aeb653c666d,4
+np.float64,0x7fe93e5bf8f27cb7,0xc010d159fa27396a,4
+np.float64,0xffefffffffffffff,0x3f74530cfe729484,4
+np.float64,0x4c83f1269907f,0x4c83f1269907f,4
+np.float64,0x3fde0065a8bc00cc,0x3fe034a1cdf026d4,4
+np.float64,0x800743810d6e8703,0x800743810d6e8703,4
+np.float64,0x80040662d5280cc6,0x80040662d5280cc6,4
+np.float64,0x3fed20b2c5ba4166,0x3ff497988519d7aa,4
+np.float64,0xffe8fa15e5f1f42b,0x3fff82ca76d797b4,4
+np.float64,0xbb72e22f76e5d,0xbb72e22f76e5d,4
+np.float64,0x7fc18ffa7c231ff4,0xbff4b8b4c3315026,4
+np.float64,0xbfe8d1ac44f1a358,0xbfef60efc4f821e3,4
+np.float64,0x3fd38c1fe8271840,0x3fd42dc37ff7262b,4
+np.float64,0xe577bee5caef8,0xe577bee5caef8,4
+np.float64,0xbff0000000000000,0xbff8eb245cbee3a6,4
+np.float64,0xffcb3a9dd436753c,0x3fcd1a3aff1c3fc7,4
+np.float64,0x7fe44bf2172897e3,0x3ff60bfe82a379f4,4
+np.float64,0x8009203823924071,0x8009203823924071,4
+np.float64,0x7fef8e0abc7f1c14,0x3fe90e4962d47ce5,4
+np.float64,0xffda50004434a000,0x3fb50dee03e1418b,4
+np.float64,0x7fe2ff276ea5fe4e,0xc0355b7d2a0a8d9d,4
+np.float64,0x3fd0711ba5a0e238,0x3fd0d03823d2d259,4
+np.float64,0xe7625b03cec4c,0xe7625b03cec4c,4
+np.float64,0xbfd492c8d7a92592,0xbfd55006cde8d300,4
+np.float64,0x8001fee99f23fdd4,0x8001fee99f23fdd4,4
+np.float64,0x7ff4000000000000,0x7ffc000000000000,4
+np.float64,0xfa15df97f42bc,0xfa15df97f42bc,4
+np.float64,0xbfec3fdca9787fb9,0xbff377164b13c7a9,4
+np.float64,0xbcec10e579d82,0xbcec10e579d82,4
+np.float64,0xbfc3b4e2132769c4,0xbfc3dd1fcc7150a6,4
+np.float64,0x80045b149ee8b62a,0x80045b149ee8b62a,4
+np.float64,0xffe044554c2088aa,0xbff741436d558785,4
+np.float64,0xffcc65f09f38cbe0,0xc0172b4adc2d317d,4
+np.float64,0xf68b2d3bed166,0xf68b2d3bed166,4
+np.float64,0x7fc7f44c572fe898,0x3fec69f3b1eca790,4
+np.float64,0x3fac51f61438a3ec,0x3fac595d34156002,4
+np.float64,0xbfeaa9f256f553e5,0xbff19bfdf5984326,4
+np.float64,0x800e4742149c8e84,0x800e4742149c8e84,4
+np.float64,0xbfc493df132927c0,0xbfc4c1ba4268ead9,4
+np.float64,0xbfbf0c56383e18b0,0xbfbf3389fcf50c72,4
+np.float64,0xbf978a0e082f1420,0xbf978b1dd1da3d3c,4
+np.float64,0xbfe04375356086ea,0xbfe1d34c57314dd1,4
+np.float64,0x3feaeeb29b75dd65,0x3ff1e8b772374979,4
+np.float64,0xbfe15e42c3a2bc86,0xbfe34d45d56c5c15,4
+np.float64,0x3fe507429a6a0e85,0x3fe8b058176b3225,4
+np.float64,0x3feee2b26c3dc565,0x3ff71b73203de921,4
+np.float64,0xbfd496577aa92cae,0xbfd553fa7fe15a5f,4
+np.float64,0x7fe2c10953e58212,0x3fc8ead6a0d14bbf,4
+np.float64,0x800035b77aa06b70,0x800035b77aa06b70,4
+np.float64,0x2329201e46525,0x2329201e46525,4
+np.float64,0xbfe6225c9a6c44b9,0xbfea80861590fa02,4
+np.float64,0xbfd6925030ad24a0,0xbfd78e70b1c2215d,4
+np.float64,0xbfd82225c4b0444c,0xbfd958a60f845b39,4
+np.float64,0xbb03d8a17609,0xbb03d8a17609,4
+np.float64,0x7fc33967b12672ce,0x40001e00c9af4002,4
+np.float64,0xff9373c6d026e780,0xbff308654a459d3d,4
+np.float64,0x3feab1f9c5f563f4,0x3ff1a4e0fd2f093d,4
+np.float64,0xbf993ef768327de0,0xbf994046b64e308b,4
+np.float64,0xffb87382fc30e708,0xbfde0accb83c891b,4
+np.float64,0x800bb3a118176743,0x800bb3a118176743,4
+np.float64,0x800c810250d90205,0x800c810250d90205,4
+np.float64,0xbfd2c4eb9ba589d8,0xbfd3539508b4a4a8,4
+np.float64,0xbee1f5437dc3f,0xbee1f5437dc3f,4
+np.float64,0x3fc07aeab520f5d8,0x3fc0926272f9d8e2,4
+np.float64,0xbfe23747a3246e90,0xbfe47a20a6e98687,4
+np.float64,0x3fde1296debc252c,0x3fe0401143ff6b5c,4
+np.float64,0xbfcec8c2f73d9184,0xbfcf644e25ed3b74,4
+np.float64,0xff9314f2c82629e0,0x40559a0f9099dfd1,4
+np.float64,0xbfe27487afa4e910,0xbfe4d0e01200bde6,4
+np.float64,0xffb3d6637627acc8,0x3fe326d4b1e1834f,4
+np.float64,0xffe6f84d642df09a,0x3fc73fa9f57c3acb,4
+np.float64,0xffe67cf76fecf9ee,0xc01cf48c97937ef9,4
+np.float64,0x7fdc73fc12b8e7f7,0xbfcfcecde9331104,4
+np.float64,0xffdcf8789239f0f2,0x3fe345e3b8e28776,4
+np.float64,0x800a70af5314e15f,0x800a70af5314e15f,4
+np.float64,0xffc862300730c460,0x3fc4e9ea813beca7,4
+np.float64,0xbfcc6961bd38d2c4,0xbfcce33bfa6c6bd1,4
+np.float64,0xbfc9b76bbf336ed8,0xbfca117456ac37e5,4
+np.float64,0x7fb86e829430dd04,0x400a5bd7a18e302d,4
+np.float64,0x7fb9813ef833027d,0xbfe5a6494f143625,4
+np.float64,0x8005085e2c2a10bd,0x8005085e2c2a10bd,4
+np.float64,0xffe5af099d6b5e12,0x40369bbe31e03e06,4
+np.float64,0xffde03b1fd3c0764,0x3ff061120aa1f52a,4
+np.float64,0x7fa4eb6cdc29d6d9,0x3fe9defbe9010322,4
+np.float64,0x800803f4b11007ea,0x800803f4b11007ea,4
+np.float64,0x7febd50f6df7aa1e,0xbffcf540ccf220dd,4
+np.float64,0x7fed454f08fa8a9d,0xbffc2a8b81079403,4
+np.float64,0xbfed7e8c69bafd19,0xbff5161e51ba6634,4
+np.float64,0xffef92e78eff25ce,0xbffefeecddae0ad3,4
+np.float64,0x7fe5b9b413ab7367,0xbfc681ba29704176,4
+np.float64,0x29284e805252,0x29284e805252,4
+np.float64,0xffed3955bcfa72ab,0xbfc695acb5f468de,4
+np.float64,0x3fe464ee1ca8c9dc,0x3fe7b140ce50fdca,4
+np.float64,0xffe522ae4bea455c,0x3feb957c146e66ef,4
+np.float64,0x8000000000000000,0x8000000000000000,4
+np.float64,0x3fd0c353a2a186a8,0x3fd1283aaa43a411,4
+np.float64,0x3fdb30a749b6614f,0x3fdcf40df006ed10,4
+np.float64,0x800109213cc21243,0x800109213cc21243,4
+np.float64,0xbfe72aa0c5ee5542,0xbfec4a713f513bc5,4
+np.float64,0x800865344ad0ca69,0x800865344ad0ca69,4
+np.float64,0x7feb7df60eb6fbeb,0x3fb1df06a67aa22f,4
+np.float64,0x3fe83a5dd93074bc,0x3fee3d63cda72636,4
+np.float64,0xbfde70e548bce1ca,0xbfe07b8e19c9dac6,4
+np.float64,0xbfeea38d537d471b,0xbff6bb18c230c0be,4
+np.float64,0x3fefeebbc47fdd78,0x3ff8cdaa53b7c7b4,4
+np.float64,0x7fe6512e20eca25b,0xbff623cee44a22b5,4
+np.float64,0xf8fa5ca3f1f4c,0xf8fa5ca3f1f4c,4
+np.float64,0x7fd12d00ed225a01,0xbfe90d518ea61faf,4
+np.float64,0x80027db43504fb69,0x80027db43504fb69,4
+np.float64,0xffc10a01aa221404,0x3fcc2065b3d0157b,4
+np.float64,0xbfef8286e87f050e,0xbff8193a54449b59,4
+np.float64,0xbfc73178092e62f0,0xbfc7735072ba4593,4
+np.float64,0x3fc859d70630b3ae,0x3fc8a626522af1c0,4
+np.float64,0x3fe4654c4268ca99,0x3fe7b1d2913eda1a,4
+np.float64,0xbfce93cd843d279c,0xbfcf2c2ef16a0957,4
+np.float64,0xffbcaa16d4395430,0xbfd511ced032d784,4
+np.float64,0xbfe91f980e723f30,0xbfeffb39cf8c7746,4
+np.float64,0x800556fb6f0aadf8,0x800556fb6f0aadf8,4
+np.float64,0xffd009cde520139c,0x3fe4fa83b1e93d28,4
+np.float64,0x7febc0675e3780ce,0x3feb53930c004dae,4
+np.float64,0xbfe7f975bdeff2ec,0xbfedc36e6729b010,4
+np.float64,0x45aff57c8b5ff,0x45aff57c8b5ff,4
+np.float64,0xbfec7ebd0138fd7a,0xbff3c5cab680aae0,4
+np.float64,0x8009448003b28900,0x8009448003b28900,4
+np.float64,0x3fca4b992d349732,0x3fcaabebcc86aa9c,4
+np.float64,0x3fca069161340d20,0x3fca63ecc742ff3a,4
+np.float64,0x80063bc80bec7791,0x80063bc80bec7791,4
+np.float64,0xbfe1764bffe2ec98,0xbfe36e1cb30cec94,4
+np.float64,0xffd0dba72f21b74e,0x3fb1834964d57ef6,4
+np.float64,0xbfe31848fc263092,0xbfe5bd066445cbc3,4
+np.float64,0xbfd1fb227323f644,0xbfd278334e27f02d,4
+np.float64,0xffdc59069fb8b20e,0xbfdfc363f559ea2c,4
+np.float64,0x3fdea52a52bd4a55,0x3fe09cada4e5344c,4
+np.float64,0x3f715e55a022bd00,0x3f715e5c72a2809e,4
+np.float64,0x1d1ac6023a35a,0x1d1ac6023a35a,4
+np.float64,0x7feacc71627598e2,0x400486b82121da19,4
+np.float64,0xa0287fa340510,0xa0287fa340510,4
+np.float64,0xffe352c5abe6a58b,0xc002623346060543,4
+np.float64,0x7fed577a23baaef3,0x3fda19bc8fa3b21f,4
+np.float64,0x3fde8dd5263d1baa,0x3fe08de0fedf7029,4
+np.float64,0x3feddd3be2bbba78,0x3ff599b2f3e018cc,4
+np.float64,0xc7a009f58f401,0xc7a009f58f401,4
+np.float64,0xbfef03d5a4fe07ab,0xbff74ee08681f47b,4
+np.float64,0x7fe2cf60eea59ec1,0x3fe905fb44f8cc60,4
+np.float64,0xbfe498fcab6931fa,0xbfe8023a6ff8becf,4
+np.float64,0xbfef7142acfee285,0xbff7fd196133a595,4
+np.float64,0xd214ffdba42a0,0xd214ffdba42a0,4
+np.float64,0x8006de7d78cdbcfc,0x8006de7d78cdbcfc,4
+np.float64,0xb247d34f648fb,0xb247d34f648fb,4
+np.float64,0xbfdd5bece6bab7da,0xbfdf9ba63ca2c5b2,4
+np.float64,0x7fe874650af0e8c9,0x3fe74204e122c10f,4
+np.float64,0x800768c49baed18a,0x800768c49baed18a,4
+np.float64,0x3fb4c0a192298140,0x3fb4cc4c8aa43300,4
+np.float64,0xbfa740531c2e80a0,0xbfa7446b7c74ae8e,4
+np.float64,0x7fe10d6edf221add,0x3fedbcd2eae26657,4
+np.float64,0xbfe9175d0f722eba,0xbfefeaca7f32c6e3,4
+np.float64,0x953e11d32a7c2,0x953e11d32a7c2,4
+np.float64,0x80032df90c465bf3,0x80032df90c465bf3,4
+np.float64,0xffec5b799638b6f2,0xbfe95cd2c69be12c,4
+np.float64,0xffe0c3cfa9a1879f,0x3fe20b99b0c108ce,4
+np.float64,0x3fb610d8e22c21b2,0x3fb61ee0d6c16df8,4
+np.float64,0xffe16bb39962d766,0xc016d370381b6b42,4
+np.float64,0xbfdc72edb238e5dc,0xbfde7bd2de10717a,4
+np.float64,0xffed52dee3baa5bd,0xc01994c08899129a,4
+np.float64,0xffa92aab08325550,0xbff2b881ce363cbd,4
+np.float64,0x7fe028282de0504f,0xc0157ff96c69a9c7,4
+np.float64,0xbfdb2151bf3642a4,0xbfdce196fcc35857,4
+np.float64,0x3fcffbd13c3ff7a2,0x3fd0554b5f0371ac,4
+np.float64,0x800d206bff1a40d8,0x800d206bff1a40d8,4
+np.float64,0x458f818c8b1f1,0x458f818c8b1f1,4
+np.float64,0x800a7b56a234f6ae,0x800a7b56a234f6ae,4
+np.float64,0xffe3d86161e7b0c2,0xbff58d0dbde9f188,4
+np.float64,0xe8ed82e3d1db1,0xe8ed82e3d1db1,4
+np.float64,0x3fe234e0176469c0,0x3fe476bd36b96a75,4
+np.float64,0xbfc7cb9c132f9738,0xbfc812c46e185e0b,4
+np.float64,0xbfeba116c1f7422e,0xbff2b6b7563ad854,4
+np.float64,0x7fe7041de62e083b,0x3f5d2b42aca47274,4
+np.float64,0xbfcf60f4ff3ec1e8,0xbfd002eb83406436,4
+np.float64,0xbfc06067a520c0d0,0xbfc0776e5839ecda,4
+np.float64,0x4384965a87093,0x4384965a87093,4
+np.float64,0xd2ed9d01a5db4,0xd2ed9d01a5db4,4
+np.float64,0x3fbea88cb63d5119,0x3fbece49cc34a379,4
+np.float64,0x3fe7e982ebefd306,0x3feda5bd4c435d43,4
+np.float64,0xffdb60a3e036c148,0xbfcb7ed21e7a8f49,4
+np.float64,0x7fdba9231eb75245,0xbfd750cab1536398,4
+np.float64,0x800d593534dab26b,0x800d593534dab26b,4
+np.float64,0xffdf15fb683e2bf6,0x3fb3aaea23357f06,4
+np.float64,0xbfd6f8a2e5adf146,0xbfd802e509d67c67,4
+np.float64,0x3feeaa31513d5463,0x3ff6c52147dc053c,4
+np.float64,0xf2f6dfd3e5edc,0xf2f6dfd3e5edc,4
+np.float64,0x7fd58d8279ab1b04,0x403243f23d02af2a,4
+np.float64,0x8000000000000001,0x8000000000000001,4
+np.float64,0x3fdffb8e0ebff71c,0x3fe1786cb0a6b0f3,4
+np.float64,0xc999826b93331,0xc999826b93331,4
+np.float64,0xffc4966f19292ce0,0x3ff0836c75c56cc7,4
+np.float64,0x7fef95a4b2ff2b48,0xbfbbe2c27c78154f,4
+np.float64,0xb8f1307f71e26,0xb8f1307f71e26,4
+np.float64,0x3fe807bc7eb00f79,0x3fedde19f2d3c42d,4
+np.float64,0x5e4b6580bc98,0x5e4b6580bc98,4
+np.float64,0xffe19353576326a6,0xc0278c51fee07d36,4
+np.float64,0xbfb0ca6f3e2194e0,0xbfb0d09be673fa72,4
+np.float64,0x3fea724211b4e484,0x3ff15ee06f0a0a13,4
+np.float64,0xbfda21e1c4b443c4,0xbfdbb041f3c86832,4
+np.float64,0x8008082b24901057,0x8008082b24901057,4
+np.float64,0xbfd031aa4ea06354,0xbfd08c77729634bb,4
+np.float64,0xbfc407e153280fc4,0xbfc432275711df5f,4
+np.float64,0xbb4fa4b5769f5,0xbb4fa4b5769f5,4
+np.float64,0x7fed6d1daffada3a,0xc037a14bc7b41fab,4
+np.float64,0xffeee589943dcb12,0x3ff2abfe47037778,4
+np.float64,0x301379d260270,0x301379d260270,4
+np.float64,0xbfec2fefc2b85fe0,0xbff36362c0363e06,4
+np.float64,0xbfe0b1c82e216390,0xbfe264f503f7c22c,4
+np.float64,0xbfea2bce78f4579d,0xbff112d6f07935ea,4
+np.float64,0x18508ef230a13,0x18508ef230a13,4
+np.float64,0x800667a74d6ccf4f,0x800667a74d6ccf4f,4
+np.float64,0x79ce5c8cf39cc,0x79ce5c8cf39cc,4
+np.float64,0x3feda61c8efb4c39,0x3ff54c9ade076f54,4
+np.float64,0x3fe27e06b0e4fc0d,0x3fe4de665c1dc3ca,4
+np.float64,0xbfd15fea2722bfd4,0xbfd1d081c55813b0,4
+np.float64,0xbfe5222c4cea4458,0xbfe8db62deb7d2ad,4
+np.float64,0xbfe8a16c33b142d8,0xbfef02d5831592a8,4
+np.float64,0x3fdb60e7c4b6c1d0,0x3fdd2e4265c4c3b6,4
+np.float64,0x800076d62b60edad,0x800076d62b60edad,4
+np.float64,0xbfec8f1527791e2a,0xbff3da7ed3641e8d,4
+np.float64,0x2af03bfe55e08,0x2af03bfe55e08,4
+np.float64,0xa862ee0950c5e,0xa862ee0950c5e,4
+np.float64,0x7fea5a7c1eb4b4f7,0xbffa6f07d28ef211,4
+np.float64,0x90e118fb21c23,0x90e118fb21c23,4
+np.float64,0xbfead0721bf5a0e4,0xbff1c6c7a771a128,4
+np.float64,0x3f63f4a4c027e94a,0x3f63f4a75665da67,4
+np.float64,0x3fece0efa579c1e0,0x3ff443bec52f021e,4
+np.float64,0xbfdbe743b737ce88,0xbfddd129bff89c15,4
+np.float64,0x3fd48c9b8fa91938,0x3fd5492a630a8cb5,4
+np.float64,0x3ff0000000000000,0x3ff8eb245cbee3a6,4
+np.float64,0xbfd51ea33baa3d46,0xbfd5ebd5dc710204,4
+np.float64,0x3fcfbab0183f7560,0x3fd032a054580b00,4
+np.float64,0x8007abce13cf579d,0x8007abce13cf579d,4
+np.float64,0xbfef0f4723be1e8e,0xbff760c7008e8913,4
+np.float64,0x8006340f524c681f,0x8006340f524c681f,4
+np.float64,0x87b7d7010f71,0x87b7d7010f71,4
+np.float64,0x3fe9422da9b2845b,0x3ff02052e6148c45,4
+np.float64,0x7fddd259b93ba4b2,0xc000731aa33d84b6,4
+np.float64,0x3fe0156d12202ada,0x3fe1972ba309cb29,4
+np.float64,0x8004f1264b89e24d,0x8004f1264b89e24d,4
+np.float64,0x3fececdcacb9d9b9,0x3ff4534d5861f731,4
+np.float64,0x3fd1790ab822f215,0x3fd1eb97b1bb6fb4,4
+np.float64,0xffce5d11863cba24,0xbfcb4f38c17210da,4
+np.float64,0x800a30c32a546187,0x800a30c32a546187,4
+np.float64,0x3fa58cc61c2b198c,0x3fa59008add7233e,4
+np.float64,0xbfe0ac77d62158f0,0xbfe25de3dba0bc4a,4
+np.float64,0xeb8c5753d718b,0xeb8c5753d718b,4
+np.float64,0x3fee5438dafca872,0x3ff644fef7e7adb5,4
+np.float64,0x3faad1eb2c35a3e0,0x3faad83499f94057,4
+np.float64,0x3fe39152c46722a6,0x3fe66fba0b96ab6e,4
+np.float64,0xffd6fd17712dfa2e,0xc010d697d1ab8731,4
+np.float64,0x5214a888a4296,0x5214a888a4296,4
+np.float64,0x8000127a5da024f5,0x8000127a5da024f5,4
+np.float64,0x7feb3a366cb6746c,0x3fbe49bd8d5f213a,4
+np.float64,0xca479501948f3,0xca479501948f3,4
+np.float64,0x7fe7c799ce6f8f33,0xbfd796cd98dc620c,4
+np.float64,0xffe20bcf30a4179e,0xbff8ca5453fa088f,4
+np.float64,0x3fe624638a6c48c7,0x3fea83f123832c3c,4
+np.float64,0xbfe5f1377c6be26f,0xbfea2e143a2d522c,4
+np.float64,0x7fd193f9f8a327f3,0xbfb04ee2602574d4,4
+np.float64,0xbfe7419d2fee833a,0xbfec737f140d363d,4
+np.float64,0x1,0x1,4
+np.float64,0x7fe2ac246c655848,0x3fd14fee3237727a,4
+np.float64,0xa459b42948b37,0xa459b42948b37,4
+np.float64,0x3fb26155ae24c2ab,0x3fb2696fc446d4c6,4
+np.float64,0xbfdd7b332e3af666,0xbfdfc296c21f1aa8,4
+np.float64,0xbfe00dbda4a01b7c,0xbfe18d2b060f0506,4
+np.float64,0x8003bb22d3e77646,0x8003bb22d3e77646,4
+np.float64,0x3fee21b0a57c4361,0x3ff5fb6a21dc911c,4
+np.float64,0x80ca69270194d,0x80ca69270194d,4
+np.float64,0xbfd6d80350adb006,0xbfd7ddb501edbde0,4
+np.float64,0xd2f8b801a5f2,0xd2f8b801a5f2,4
+np.float64,0xbfe856b3f170ad68,0xbfee7334fdc49296,4
+np.float64,0x3fed5c1b20bab836,0x3ff4e73ee5d5c7f3,4
+np.float64,0xbfd58085a5ab010c,0xbfd6596ddc381ffa,4
+np.float64,0x3fe4f0134b29e027,0x3fe88b70602fbd21,4
+np.float64,0xffc9098fdc321320,0x4011c334a74a92cf,4
+np.float64,0x794749bef28ea,0x794749bef28ea,4
+np.float64,0xbfc86b547f30d6a8,0xbfc8b84a4fafe0af,4
+np.float64,0x7fe1356b9da26ad6,0x3fd270bca208d899,4
+np.float64,0x7fca0ef1aa341de2,0xbff851044c0734fa,4
+np.float64,0x80064cb8b62c9972,0x80064cb8b62c9972,4
+np.float64,0xffd3a09a83a74136,0x3ffb66dae0accdf5,4
+np.float64,0x800e301aa15c6035,0x800e301aa15c6035,4
+np.float64,0x800e51f323bca3e6,0x800e51f323bca3e6,4
+np.float64,0x7ff0000000000000,0xfff8000000000000,4
+np.float64,0x800c4278c87884f2,0x800c4278c87884f2,4
+np.float64,0xbfe8481649f0902c,0xbfee576772695096,4
+np.float64,0xffe2344e3fa4689c,0x3fb10442ec0888de,4
+np.float64,0xbfeada313d75b462,0xbff1d1aee3fab3a9,4
+np.float64,0x8009ddfb1333bbf7,0x8009ddfb1333bbf7,4
+np.float64,0x7fed3314c93a6629,0x3ff7a9b12dc1cd37,4
+np.float64,0x3fd55c26da2ab84e,0x3fd630a7b8aac78a,4
+np.float64,0x800cdb5203f9b6a4,0x800cdb5203f9b6a4,4
+np.float64,0xffd04a875da0950e,0x4009a13810ab121d,4
+np.float64,0x800f1acb527e3597,0x800f1acb527e3597,4
+np.float64,0xbf9519bf282a3380,0xbf951a82e9b955ff,4
+np.float64,0x3fcd7a42fa3af486,0x3fce028f3c51072d,4
+np.float64,0xbfdd3e21b73a7c44,0xbfdf769f2ff2480b,4
+np.float64,0xffd4361e2aa86c3c,0xbfc211ce8e9f792c,4
+np.float64,0x7fccf97f6939f2fe,0xbff8464bad830f06,4
+np.float64,0x800ce47fb939c900,0x800ce47fb939c900,4
+np.float64,0xffe9e51df173ca3b,0xbfceaf990d652c4e,4
+np.float64,0x3fe05bba5b20b775,0x3fe1f326e4455442,4
+np.float64,0x800a29b4b134536a,0x800a29b4b134536a,4
+np.float64,0xe6f794b7cdef3,0xe6f794b7cdef3,4
+np.float64,0xffb5b688ce2b6d10,0x3ff924bb97ae2f6d,4
+np.float64,0x7fa74105d82e820b,0x3fd49643aaa9eee4,4
+np.float64,0x80020d15f7a41a2d,0x80020d15f7a41a2d,4
+np.float64,0x3fd6a983d5ad5308,0x3fd7a8cc8835b5b8,4
+np.float64,0x7fcd9798f03b2f31,0x3fc534c2f7bf4721,4
+np.float64,0xffdd31873a3a630e,0xbfe3171fcdffb3f7,4
+np.float64,0x80075183234ea307,0x80075183234ea307,4
+np.float64,0x82f3132505e63,0x82f3132505e63,4
+np.float64,0x3febfd9cb837fb39,0x3ff325bbf812515d,4
+np.float64,0xbfb4630fda28c620,0xbfb46e1f802ec278,4
+np.float64,0x3feeed7c89fddafa,0x3ff72c20ce5a9ee4,4
+np.float64,0x7fd3dcb3c127b967,0x40123d27ec9ec31d,4
+np.float64,0xbfe923450c72468a,0xbff00149c5742725,4
+np.float64,0x7fdef7f91abdeff1,0xbfe02ceb21f7923d,4
+np.float64,0x7fdd70d28fbae1a4,0xbfefcc5c9d10cdfd,4
+np.float64,0x800ca445a8d9488c,0x800ca445a8d9488c,4
+np.float64,0x7fec2754e1f84ea9,0x40173f6c1c97f825,4
+np.float64,0x7fcbca31f7379463,0x401e26bd2667075b,4
+np.float64,0x8003fa1d0847f43b,0x8003fa1d0847f43b,4
+np.float64,0xffe95cf85932b9f0,0xc01308e60278aa11,4
+np.float64,0x8009c53948f38a73,0x8009c53948f38a73,4
+np.float64,0x3fdcca9226b99524,0x3fdee7a008f75d41,4
+np.float64,0xbfe9ee241f33dc48,0xbff0d16bfff6c8e9,4
+np.float64,0xbfb3365058266ca0,0xbfb33f9176ebb51d,4
+np.float64,0x7fa98e10f4331c21,0x3fdee04ffd31314e,4
+np.float64,0xbfe1a11aea634236,0xbfe3a8e3d84fda38,4
+np.float64,0xbfd8df051131be0a,0xbfda342805d1948b,4
+np.float64,0x3d49a2407a935,0x3d49a2407a935,4
+np.float64,0xfc51eefff8a3e,0xfc51eefff8a3e,4
+np.float64,0xda63950bb4c73,0xda63950bb4c73,4
+np.float64,0x80050f3d4fea1e7b,0x80050f3d4fea1e7b,4
+np.float64,0x3fcdbd6e453b7ae0,0x3fce497478c28e77,4
+np.float64,0x7ebd4932fd7aa,0x7ebd4932fd7aa,4
+np.float64,0x7fa3904eac27209c,0xc0015f3125efc151,4
+np.float64,0x7fc59f956b2b3f2a,0xc00c012e7a2c281f,4
+np.float64,0xbfd436d716a86dae,0xbfd4ea13533a942b,4
+np.float64,0x9347ae3d268f6,0x9347ae3d268f6,4
+np.float64,0xffd001764d2002ec,0xbffab3462e515623,4
+np.float64,0x3fe6f406662de80d,0x3febe9bac3954999,4
+np.float64,0x3f943ecaf8287d96,0x3f943f77dee5e77f,4
+np.float64,0x3fd6250efcac4a1c,0x3fd712afa947d56f,4
+np.float64,0xbfe849ff777093ff,0xbfee5b089d03391f,4
+np.float64,0xffd3b8ef8f2771e0,0x4000463ff7f29214,4
+np.float64,0xbfc3bae9252775d4,0xbfc3e34c133f1933,4
+np.float64,0xbfea93943df52728,0xbff18355e4fc341d,4
+np.float64,0x3fc4d922ad29b245,0x3fc508d66869ef29,4
+np.float64,0x4329694a8652e,0x4329694a8652e,4
+np.float64,0x8834f1a71069e,0x8834f1a71069e,4
+np.float64,0xe0e5be8dc1cb8,0xe0e5be8dc1cb8,4
+np.float64,0x7fef4d103afe9a1f,0xc0047b88b94554fe,4
+np.float64,0x3fe9b57af4f36af6,0x3ff0963831d51c3f,4
+np.float64,0x3fe081e2fa6103c6,0x3fe22572e41be655,4
+np.float64,0x3fd78cf7b42f19ef,0x3fd8acafa1ad776a,4
+np.float64,0x7fbffd58d43ffab1,0x3fb16092c7de6036,4
+np.float64,0xbfe1e8bfae23d180,0xbfe40c1c6277dd52,4
+np.float64,0x800a9f59fb153eb4,0x800a9f59fb153eb4,4
+np.float64,0xffebe14e33b7c29c,0x3fe0ec532f4deedd,4
+np.float64,0xffc36ca00426d940,0xc000806a712d6e83,4
+np.float64,0xbfcc2be82d3857d0,0xbfcca2a7d372ec64,4
+np.float64,0x800c03b908780772,0x800c03b908780772,4
+np.float64,0xf315a64be62b5,0xf315a64be62b5,4
+np.float64,0xbfe644043cec8808,0xbfeab974d3dc6d80,4
+np.float64,0x3fedb7de3cbb6fbc,0x3ff56549a5acd324,4
+np.float64,0xbfb1a875522350e8,0xbfb1afa41dee338d,4
+np.float64,0xffee8d4a407d1a94,0x3fead1749a636ff6,4
+np.float64,0x8004061c13080c39,0x8004061c13080c39,4
+np.float64,0x3fe650ae7feca15c,0x3feacefb8bc25f64,4
+np.float64,0x3fda8340e6b50682,0x3fdc24275cab1df8,4
+np.float64,0x8009084344321087,0x8009084344321087,4
+np.float64,0x7fdd19cb823a3396,0xbfd1d8fb35d89e3f,4
+np.float64,0xbfe893172571262e,0xbfeee716b592b93c,4
+np.float64,0x8ff5acc11fec,0x8ff5acc11fec,4
+np.float64,0xbfdca0c57cb9418a,0xbfdeb42465a1b59e,4
+np.float64,0xffd77bd2a3aef7a6,0x4012cd69e85b82d8,4
+np.float64,0xbfe6ea78982dd4f1,0xbfebd8ec61fb9e1f,4
+np.float64,0x7fe14b1d80a2963a,0xc02241642102cf71,4
+np.float64,0x3fe712bf286e257e,0x3fec20012329a7fb,4
+np.float64,0x7fcb6fa4d636df49,0x400b899d14a886b3,4
+np.float64,0x3fb82cb39a305960,0x3fb83f29c5f0822e,4
+np.float64,0x7fed694c8b3ad298,0xbfe2724373c69808,4
+np.float64,0xbfcd21229f3a4244,0xbfcda497fc3e1245,4
+np.float64,0x564d3770ac9a8,0x564d3770ac9a8,4
+np.float64,0xf4409e13e8814,0xf4409e13e8814,4
+np.float64,0x80068dca9a8d1b96,0x80068dca9a8d1b96,4
+np.float64,0xbfe13f82afe27f06,0xbfe3236ddded353f,4
+np.float64,0x80023f8114647f03,0x80023f8114647f03,4
+np.float64,0xeafba7dfd5f75,0xeafba7dfd5f75,4
+np.float64,0x3feca74ddeb94e9c,0x3ff3f95dcce5a227,4
+np.float64,0x10000000000000,0x10000000000000,4
+np.float64,0xbfebdb4141f7b682,0xbff2fc29823ac64a,4
+np.float64,0xbfcd75ee2f3aebdc,0xbfcdfdfd87cc6a29,4
+np.float64,0x7fc010cda420219a,0x3fae4ca2cf1f2657,4
+np.float64,0x1a90209e35205,0x1a90209e35205,4
+np.float64,0x8008057d01900afa,0x8008057d01900afa,4
+np.float64,0x3f9cb5f280396be5,0x3f9cb7dfb4e4be4e,4
+np.float64,0xffe1bbb60b63776c,0xc00011b1ffcb2561,4
+np.float64,0xffda883f6fb5107e,0x4044238ef4e2a198,4
+np.float64,0x3fc07c0b4a20f817,0x3fc09387de9eebcf,4
+np.float64,0x8003a9ebc0c753d8,0x8003a9ebc0c753d8,4
+np.float64,0x1d7fd5923affc,0x1d7fd5923affc,4
+np.float64,0xbfe9cd8cf9b39b1a,0xbff0af43e567ba4a,4
+np.float64,0x11285cb42250c,0x11285cb42250c,4
+np.float64,0xffe81ae1ccb035c3,0xbfe038be7eb563a6,4
+np.float64,0xbfe56473b1eac8e8,0xbfe94654d8ab9e75,4
+np.float64,0x3fee904619fd208c,0x3ff69e198152fe17,4
+np.float64,0xbfeeb9a2cbfd7346,0xbff6dc8d96da78cd,4
+np.float64,0x8006cdfa59ed9bf5,0x8006cdfa59ed9bf5,4
+np.float64,0x8008f2366d31e46d,0x8008f2366d31e46d,4
+np.float64,0x8008d5f91e31abf3,0x8008d5f91e31abf3,4
+np.float64,0x3fe85886f8b0b10e,0x3fee76af16f5a126,4
+np.float64,0x3fefb9b2b73f7365,0x3ff8745128fa3e3b,4
+np.float64,0x7fdf3e721f3e7ce3,0xbfb19381541ca2a8,4
+np.float64,0x3fd2768c41a4ed18,0x3fd2fe2f85a3f3a6,4
+np.float64,0xbfcabe3c6a357c78,0xbfcb239fb88bc260,4
+np.float64,0xffdffb6a3dbff6d4,0xbff7af4759fd557c,4
+np.float64,0x800817f75f302fef,0x800817f75f302fef,4
+np.float64,0xbfe6a1d1762d43a3,0xbfeb5a399a095ef3,4
+np.float64,0x7fd6f32f912de65e,0x40016dedc51aabd0,4
+np.float64,0x3fc6cb26652d964d,0x3fc7099f047d924a,4
+np.float64,0x3fe8b975d67172ec,0x3fef31946123c0e7,4
+np.float64,0xffe44a09d1e89413,0x3fdee9e5eac6e540,4
+np.float64,0xbfece76d4cb9cedb,0xbff44c34849d07ba,4
+np.float64,0x7feb76027036ec04,0x3fe08595a5e263ac,4
+np.float64,0xffe194f591a329ea,0x3fbe5bd626400a70,4
+np.float64,0xbfc170698122e0d4,0xbfc18c3de8b63565,4
+np.float64,0x3fc82b2c0f305658,0x3fc875c3b5fbcd08,4
+np.float64,0x3fd5015634aa02ac,0x3fd5cb1df07213c3,4
+np.float64,0x7fe640884b6c8110,0xbff66255a420abb5,4
+np.float64,0x5a245206b448b,0x5a245206b448b,4
+np.float64,0xffe9d9fa2f73b3f4,0xc0272b0dd34ab9bf,4
+np.float64,0x3fd990e8aab321d0,0x3fdb04cd3a29bcc3,4
+np.float64,0xde9dda8bbd3bc,0xde9dda8bbd3bc,4
+np.float64,0xbfe81b32b4703666,0xbfee029937fa9f5a,4
+np.float64,0xbfe68116886d022d,0xbfeb21c62081cb73,4
+np.float64,0x3fb8da191231b432,0x3fb8ee28c71507d3,4
+np.float64,0x3fb111395a222273,0x3fb117b57de3dea4,4
+np.float64,0xffbafadc6a35f5b8,0x3ffcc6d2370297b9,4
+np.float64,0x8002ca475b05948f,0x8002ca475b05948f,4
+np.float64,0xbfeafef57875fdeb,0xbff1fb1315676f24,4
+np.float64,0x7fcda427d73b484f,0xbff9f70212694d17,4
+np.float64,0xffe2517b3ba4a2f6,0xc029ca6707305bf4,4
+np.float64,0x7fc5ee156b2bdc2a,0xbff8384b59e9056e,4
+np.float64,0xbfec22af3278455e,0xbff3530fe25816b4,4
+np.float64,0x6b5a8c2cd6b52,0x6b5a8c2cd6b52,4
+np.float64,0xffdaf6c4b935ed8a,0x4002f00ce58affcf,4
+np.float64,0x800a41813c748303,0x800a41813c748303,4
+np.float64,0xbfd09a1269213424,0xbfd0fc0a0c5de8eb,4
+np.float64,0x7fa2cb74d42596e9,0x3fc3d40e000fa69d,4
+np.float64,0x7ff8000000000000,0x7ff8000000000000,4
+np.float64,0x3fbfbf8ed63f7f1e,0x3fbfe97bcad9f53a,4
+np.float64,0x7fe0ebba65a1d774,0x401b0f17b28618df,4
+np.float64,0x3fd02c3a25a05874,0x3fd086aa55b19c9c,4
+np.float64,0xec628f95d8c52,0xec628f95d8c52,4
+np.float64,0x3fd319329fa63264,0x3fd3afb04e0dec63,4
+np.float64,0x180e0ade301c2,0x180e0ade301c2,4
+np.float64,0xbfe8d78324f1af06,0xbfef6c66153064ee,4
+np.float64,0xffb89fa200313f48,0xbfeb96ff2d9358dc,4
+np.float64,0x7fe6abcf86ed579e,0xc0269f4de86365ec,4
+np.float64,0x7fdff8cd65bff19a,0xbfd0f7c6b9052c9a,4
+np.float64,0xbfd2e3a53d25c74a,0xbfd37520cda5f6b2,4
+np.float64,0x7fe844b096708960,0x3ff696a6182e5a7a,4
+np.float64,0x7fdce0c7a3b9c18e,0x3fd42875d69ed379,4
+np.float64,0xffba5a91cc34b520,0x4001b571e8991951,4
+np.float64,0xffe78fe4a6ef1fc9,0x3ff4507b31f5b3bc,4
+np.float64,0xbfd7047493ae08ea,0xbfd810618a53fffb,4
+np.float64,0xc6559def8cab4,0xc6559def8cab4,4
+np.float64,0x3fe75d67a76ebacf,0x3feca56817de65e4,4
+np.float64,0xffd24adbd6a495b8,0xc012c491addf2df5,4
+np.float64,0x7fed35e28dba6bc4,0x403a0fa555ff7ec6,4
+np.float64,0x80078c4afa0f1897,0x80078c4afa0f1897,4
+np.float64,0xa6ec39114dd87,0xa6ec39114dd87,4
+np.float64,0x7fb1bd33ba237a66,0x4010092bb6810fd4,4
+np.float64,0x800ecf215edd9e43,0x800ecf215edd9e43,4
+np.float64,0x3fb7c169242f82d2,0x3fb7d2ed30c462e6,4
+np.float64,0xbf71b46d60236900,0xbf71b4749a10c112,4
+np.float64,0x800d7851787af0a3,0x800d7851787af0a3,4
+np.float64,0x3fcb4a45e7369488,0x3fcbb61701a1bcec,4
+np.float64,0x3fd4e3682429c6d0,0x3fd5a9bcb916eb94,4
+np.float64,0x800497564c292ead,0x800497564c292ead,4
+np.float64,0xbfca3737a1346e70,0xbfca96a86ae5d687,4
+np.float64,0x19aa87e03356,0x19aa87e03356,4
+np.float64,0xffb2593fe624b280,0xc05fedb99b467ced,4
+np.float64,0xbfdd8748fbbb0e92,0xbfdfd1a7df17252c,4
+np.float64,0x8004c7afc7098f60,0x8004c7afc7098f60,4
+np.float64,0x7fde48b2bf3c9164,0xbfe36ef1158ed420,4
+np.float64,0xbfec8e0eb0f91c1d,0xbff3d9319705a602,4
+np.float64,0xffea1be204f437c3,0xc0144f67298c3e6f,4
+np.float64,0x7fdb906b593720d6,0xbfce99233396eda7,4
+np.float64,0x3fef0f114ffe1e22,0x3ff76072a258a51b,4
+np.float64,0x3fe3e284c8e7c50a,0x3fe6e9b05e17c999,4
+np.float64,0xbfbda9eef23b53e0,0xbfbdcc1abb443597,4
+np.float64,0x3feb6454d4f6c8aa,0x3ff26f65a85baba4,4
+np.float64,0x3fea317439f462e8,0x3ff118e2187ef33f,4
+np.float64,0x376ad0646ed5b,0x376ad0646ed5b,4
+np.float64,0x7fdd461a1c3a8c33,0x3f7ba20fb79e785f,4
+np.float64,0xebc520a3d78a4,0xebc520a3d78a4,4
+np.float64,0x3fca90fe53352200,0x3fcaf45c7fae234d,4
+np.float64,0xbfe80dd1de701ba4,0xbfede97e12cde9de,4
+np.float64,0x3fd242b00ea48560,0x3fd2c5cf9bf69a31,4
+np.float64,0x7fe46c057828d80a,0xbfe2f76837488f94,4
+np.float64,0x3fc162bea322c580,0x3fc17e517c958867,4
+np.float64,0xffebf0452ff7e08a,0x3ffc3fd95c257b54,4
+np.float64,0xffd88043c6310088,0x4008b05598d0d95f,4
+np.float64,0x800d8c49da5b1894,0x800d8c49da5b1894,4
+np.float64,0xbfed33b487ba6769,0xbff4b0ea941f8a6a,4
+np.float64,0x16b881e22d711,0x16b881e22d711,4
+np.float64,0x288bae0051177,0x288bae0051177,4
+np.float64,0xffc83a0fe8307420,0x4006eff03da17f86,4
+np.float64,0x3fc7868b252f0d18,0x3fc7cb4954290324,4
+np.float64,0xbfe195514b232aa2,0xbfe398aae6c8ed76,4
+np.float64,0x800c001ae7f80036,0x800c001ae7f80036,4
+np.float64,0x7feb82abe7370557,0xbff1e13fe6fad23c,4
+np.float64,0xffecf609cdf9ec13,0xc0112aa1805ae59e,4
+np.float64,0xffddd654f63bacaa,0x3fe46cce899f710d,4
+np.float64,0x3fe2163138642c62,0x3fe44b9c760acd4c,4
+np.float64,0x4e570dc09cae2,0x4e570dc09cae2,4
+np.float64,0x7fe9e8d091f3d1a0,0xc000fe20f8e9a4b5,4
+np.float64,0x7fe60042952c0084,0x3fd0aa740f394c2a,4
diff --git a/numpy/core/tests/data/umath-validation-set-tanh.csv b/numpy/core/tests/data/umath-validation-set-tanh.csv
new file mode 100644 (file)
index 0000000..9e3ddc6
--- /dev/null
@@ -0,0 +1,1429 @@
+dtype,input,output,ulperrortol
+np.float32,0xbe26ebb0,0xbe25752f,2
+np.float32,0xbe22ecc0,0xbe219054,2
+np.float32,0x8010a6b3,0x8010a6b3,2
+np.float32,0x3135da,0x3135da,2
+np.float32,0xbe982afc,0xbe93d727,2
+np.float32,0x16a51f,0x16a51f,2
+np.float32,0x491e56,0x491e56,2
+np.float32,0x4bf7ca,0x4bf7ca,2
+np.float32,0x3eebc21c,0x3edc65b2,2
+np.float32,0x80155c94,0x80155c94,2
+np.float32,0x3e14f626,0x3e13eb6a,2
+np.float32,0x801a238f,0x801a238f,2
+np.float32,0xbde33a80,0xbde24cf9,2
+np.float32,0xbef8439c,0xbee67a51,2
+np.float32,0x7f60d0a5,0x3f800000,2
+np.float32,0x190ee3,0x190ee3,2
+np.float32,0x80759113,0x80759113,2
+np.float32,0x800afa9f,0x800afa9f,2
+np.float32,0x7110cf,0x7110cf,2
+np.float32,0x3cf709f0,0x3cf6f6c6,2
+np.float32,0x3ef58da4,0x3ee44fa7,2
+np.float32,0xbf220ff2,0xbf0f662c,2
+np.float32,0xfd888078,0xbf800000,2
+np.float32,0xbe324734,0xbe307f9b,2
+np.float32,0x3eb5cb4f,0x3eae8560,2
+np.float32,0xbf7e7d02,0xbf425493,2
+np.float32,0x3ddcdcf0,0x3ddc02c2,2
+np.float32,0x8026d27a,0x8026d27a,2
+np.float32,0x3d4c0fb1,0x3d4be484,2
+np.float32,0xbf27d2c9,0xbf134d7c,2
+np.float32,0x8029ff80,0x8029ff80,2
+np.float32,0x7f046d2c,0x3f800000,2
+np.float32,0x13f94b,0x13f94b,2
+np.float32,0x7f4ff922,0x3f800000,2
+np.float32,0x3f4ea2ed,0x3f2b03e4,2
+np.float32,0x3e7211f0,0x3e6da8cf,2
+np.float32,0x7f39d0cf,0x3f800000,2
+np.float32,0xfee57fc6,0xbf800000,2
+np.float32,0xff6fb326,0xbf800000,2
+np.float32,0xff800000,0xbf800000,2
+np.float32,0x3f0437a4,0x3ef32fcd,2
+np.float32,0xff546d1e,0xbf800000,2
+np.float32,0x3eb5645b,0x3eae2a5c,2
+np.float32,0x3f08a6e5,0x3ef9ff8f,2
+np.float32,0x80800000,0x80800000,2
+np.float32,0x7f3413da,0x3f800000,2
+np.float32,0xfd760140,0xbf800000,2
+np.float32,0x7f3ad24a,0x3f800000,2
+np.float32,0xbf56e812,0xbf2f7f14,2
+np.float32,0xbece0338,0xbec3920a,2
+np.float32,0xbeede54a,0xbede22ae,2
+np.float32,0x7eaeb215,0x3f800000,2
+np.float32,0x3c213c00,0x3c213aab,2
+np.float32,0x7eaac217,0x3f800000,2
+np.float32,0xbf2f740e,0xbf1851a6,2
+np.float32,0x7f6ca5b8,0x3f800000,2
+np.float32,0xff42ce95,0xbf800000,2
+np.float32,0x802e4189,0x802e4189,2
+np.float32,0x80000001,0x80000001,2
+np.float32,0xbf31f298,0xbf19ebbe,2
+np.float32,0x3dcb0e6c,0x3dca64c1,2
+np.float32,0xbf29599c,0xbf145204,2
+np.float32,0x2e33f2,0x2e33f2,2
+np.float32,0x1c11e7,0x1c11e7,2
+np.float32,0x3f3b188d,0x3f1fa302,2
+np.float32,0x113300,0x113300,2
+np.float32,0x8054589e,0x8054589e,2
+np.float32,0x2a9e69,0x2a9e69,2
+np.float32,0xff513af7,0xbf800000,2
+np.float32,0x7f2e987a,0x3f800000,2
+np.float32,0x807cd426,0x807cd426,2
+np.float32,0x7f0dc4e4,0x3f800000,2
+np.float32,0x7e7c0d56,0x3f800000,2
+np.float32,0x5cb076,0x5cb076,2
+np.float32,0x80576426,0x80576426,2
+np.float32,0xff616222,0xbf800000,2
+np.float32,0xbf7accb5,0xbf40c005,2
+np.float32,0xfe4118c8,0xbf800000,2
+np.float32,0x804b9327,0x804b9327,2
+np.float32,0x3ed2b428,0x3ec79026,2
+np.float32,0x3f4a048f,0x3f286d41,2
+np.float32,0x800000,0x800000,2
+np.float32,0x7efceb9f,0x3f800000,2
+np.float32,0xbf5fe2d3,0xbf34246f,2
+np.float32,0x807e086a,0x807e086a,2
+np.float32,0x7ef5e856,0x3f800000,2
+np.float32,0xfc546f00,0xbf800000,2
+np.float32,0x3a65b890,0x3a65b88c,2
+np.float32,0x800cfa70,0x800cfa70,2
+np.float32,0x80672ea7,0x80672ea7,2
+np.float32,0x3f2bf3f2,0x3f160a12,2
+np.float32,0xbf0ab67e,0xbefd2004,2
+np.float32,0x3f2a0bb4,0x3f14c824,2
+np.float32,0xbeff5374,0xbeec12d7,2
+np.float32,0xbf221b58,0xbf0f6dff,2
+np.float32,0x7cc1f3,0x7cc1f3,2
+np.float32,0x7f234e3c,0x3f800000,2
+np.float32,0x3f60ff10,0x3f34b37d,2
+np.float32,0xbdd957f0,0xbdd887fe,2
+np.float32,0x801ce048,0x801ce048,2
+np.float32,0x7f3a8f76,0x3f800000,2
+np.float32,0xfdd13d08,0xbf800000,2
+np.float32,0x3e9af4a4,0x3e966445,2
+np.float32,0x1e55f3,0x1e55f3,2
+np.float32,0x327905,0x327905,2
+np.float32,0xbf03cf0b,0xbef28dad,2
+np.float32,0x3f0223d3,0x3eeff4f4,2
+np.float32,0xfdd96ff8,0xbf800000,2
+np.float32,0x428db8,0x428db8,2
+np.float32,0xbd74a200,0xbd7457a5,2
+np.float32,0x2a63a3,0x2a63a3,2
+np.float32,0x7e8aa9d7,0x3f800000,2
+np.float32,0x7f50b810,0x3f800000,2
+np.float32,0xbce5ec80,0xbce5dd0d,2
+np.float32,0x54711,0x54711,2
+np.float32,0x8074212a,0x8074212a,2
+np.float32,0xbf13d0ec,0xbf0551b5,2
+np.float32,0x80217f89,0x80217f89,2
+np.float32,0x3f300824,0x3f18b12f,2
+np.float32,0x7d252462,0x3f800000,2
+np.float32,0x807a154c,0x807a154c,2
+np.float32,0x8064d4b9,0x8064d4b9,2
+np.float32,0x804543b4,0x804543b4,2
+np.float32,0x4c269e,0x4c269e,2
+np.float32,0xff39823b,0xbf800000,2
+np.float32,0x3f5040b1,0x3f2be80b,2
+np.float32,0xbf7028c1,0xbf3bfee5,2
+np.float32,0x3e94eb78,0x3e90db93,2
+np.float32,0x3ccc1b40,0x3ccc1071,2
+np.float32,0xbe8796f0,0xbe8481a1,2
+np.float32,0xfc767bc0,0xbf800000,2
+np.float32,0xbdd81ed0,0xbdd75259,2
+np.float32,0xbed31bfc,0xbec7e82d,2
+np.float32,0xbf350a9e,0xbf1be1c6,2
+np.float32,0x33d41f,0x33d41f,2
+np.float32,0x3f73e076,0x3f3db0b5,2
+np.float32,0x3f800000,0x3f42f7d6,2
+np.float32,0xfee27c14,0xbf800000,2
+np.float32,0x7f6e4388,0x3f800000,2
+np.float32,0x4ea19b,0x4ea19b,2
+np.float32,0xff2d75f2,0xbf800000,2
+np.float32,0x7ee225ca,0x3f800000,2
+np.float32,0x3f31cb4b,0x3f19d2a4,2
+np.float32,0x80554a9d,0x80554a9d,2
+np.float32,0x3f4d57fa,0x3f2a4c03,2
+np.float32,0x3eac6a88,0x3ea62e72,2
+np.float32,0x773520,0x773520,2
+np.float32,0x8079c20a,0x8079c20a,2
+np.float32,0xfeb1eb94,0xbf800000,2
+np.float32,0xfe8d81c0,0xbf800000,2
+np.float32,0xfeed6902,0xbf800000,2
+np.float32,0x8066bb65,0x8066bb65,2
+np.float32,0x7f800000,0x3f800000,2
+np.float32,0x1,0x1,2
+np.float32,0x3f2c66a4,0x3f16554a,2
+np.float32,0x3cd231,0x3cd231,2
+np.float32,0x3e932a64,0x3e8f3e0c,2
+np.float32,0xbf3ab1c3,0xbf1f6420,2
+np.float32,0xbc902b20,0xbc902751,2
+np.float32,0x7dac0a5b,0x3f800000,2
+np.float32,0x3f2b7e06,0x3f15bc93,2
+np.float32,0x75de0,0x75de0,2
+np.float32,0x8020b7bc,0x8020b7bc,2
+np.float32,0x3f257cda,0x3f11bb6b,2
+np.float32,0x807480e5,0x807480e5,2
+np.float32,0xfe00d758,0xbf800000,2
+np.float32,0xbd9b54e0,0xbd9b08cd,2
+np.float32,0x4dfbe3,0x4dfbe3,2
+np.float32,0xff645788,0xbf800000,2
+np.float32,0xbe92c80a,0xbe8ee360,2
+np.float32,0x3eb9b400,0x3eb1f77c,2
+np.float32,0xff20b69c,0xbf800000,2
+np.float32,0x623c28,0x623c28,2
+np.float32,0xff235748,0xbf800000,2
+np.float32,0xbf3bbc56,0xbf2006f3,2
+np.float32,0x7e6f78b1,0x3f800000,2
+np.float32,0x7e1584e9,0x3f800000,2
+np.float32,0xff463423,0xbf800000,2
+np.float32,0x8002861e,0x8002861e,2
+np.float32,0xbf0491d8,0xbef3bb6a,2
+np.float32,0x7ea3bc17,0x3f800000,2
+np.float32,0xbedde7ea,0xbed0fb49,2
+np.float32,0xbf4bac48,0xbf295c8b,2
+np.float32,0xff28e276,0xbf800000,2
+np.float32,0x7e8f3bf5,0x3f800000,2
+np.float32,0xbf0a4a73,0xbefc7c9d,2
+np.float32,0x7ec5bd96,0x3f800000,2
+np.float32,0xbf4c22e8,0xbf299f2c,2
+np.float32,0x3e3970a0,0x3e377064,2
+np.float32,0x3ecb1118,0x3ec10c88,2
+np.float32,0xff548a7a,0xbf800000,2
+np.float32,0xfe8ec550,0xbf800000,2
+np.float32,0x3e158985,0x3e147bb2,2
+np.float32,0x7eb79ad7,0x3f800000,2
+np.float32,0xbe811384,0xbe7cd1ab,2
+np.float32,0xbdc4b9e8,0xbdc41f94,2
+np.float32,0xe0fd5,0xe0fd5,2
+np.float32,0x3f2485f2,0x3f11142b,2
+np.float32,0xfdd3c3d8,0xbf800000,2
+np.float32,0xfe8458e6,0xbf800000,2
+np.float32,0x3f06e398,0x3ef74dd8,2
+np.float32,0xff4752cf,0xbf800000,2
+np.float32,0x6998e3,0x6998e3,2
+np.float32,0x626751,0x626751,2
+np.float32,0x806631d6,0x806631d6,2
+np.float32,0xbf0c3cf4,0xbeff6c54,2
+np.float32,0x802860f8,0x802860f8,2
+np.float32,0xff2952cb,0xbf800000,2
+np.float32,0xff31d40b,0xbf800000,2
+np.float32,0x7c389473,0x3f800000,2
+np.float32,0x3dcd2f1b,0x3dcc8010,2
+np.float32,0x3d70c29f,0x3d707bbc,2
+np.float32,0x3f6bd386,0x3f39f979,2
+np.float32,0x1efec9,0x1efec9,2
+np.float32,0x3f675518,0x3f37d338,2
+np.float32,0x5fdbe3,0x5fdbe3,2
+np.float32,0x5d684e,0x5d684e,2
+np.float32,0xbedfe748,0xbed2a4c7,2
+np.float32,0x3f0cb07a,0x3f000cdc,2
+np.float32,0xbf77151e,0xbf3f1f5d,2
+np.float32,0x7f038ea0,0x3f800000,2
+np.float32,0x3ea91be9,0x3ea3376f,2
+np.float32,0xbdf20738,0xbdf0e861,2
+np.float32,0x807ea380,0x807ea380,2
+np.float32,0x2760ca,0x2760ca,2
+np.float32,0x7f20a544,0x3f800000,2
+np.float32,0x76ed83,0x76ed83,2
+np.float32,0x15a441,0x15a441,2
+np.float32,0x74c76d,0x74c76d,2
+np.float32,0xff3d5c2a,0xbf800000,2
+np.float32,0x7f6a76a6,0x3f800000,2
+np.float32,0x3eb87067,0x3eb0dabe,2
+np.float32,0xbf515cfa,0xbf2c83af,2
+np.float32,0xbdececc0,0xbdebdf9d,2
+np.float32,0x7f51b7c2,0x3f800000,2
+np.float32,0x3eb867ac,0x3eb0d30d,2
+np.float32,0xff50fd84,0xbf800000,2
+np.float32,0x806945e9,0x806945e9,2
+np.float32,0x298eed,0x298eed,2
+np.float32,0x441f53,0x441f53,2
+np.float32,0x8066d4b0,0x8066d4b0,2
+np.float32,0x3f6a479c,0x3f393dae,2
+np.float32,0xbf6ce2a7,0xbf3a7921,2
+np.float32,0x8064c3cf,0x8064c3cf,2
+np.float32,0xbf2d8146,0xbf170dfd,2
+np.float32,0x3b0e82,0x3b0e82,2
+np.float32,0xbea97574,0xbea387dc,2
+np.float32,0x67ad15,0x67ad15,2
+np.float32,0xbf68478f,0xbf38485a,2
+np.float32,0xff6f593b,0xbf800000,2
+np.float32,0xbeda26f2,0xbecdd806,2
+np.float32,0xbd216d50,0xbd2157ee,2
+np.float32,0x7a8544db,0x3f800000,2
+np.float32,0x801df20b,0x801df20b,2
+np.float32,0xbe14ba24,0xbe13b0a8,2
+np.float32,0xfdc6d8a8,0xbf800000,2
+np.float32,0x1d6b49,0x1d6b49,2
+np.float32,0x7f5ff1b8,0x3f800000,2
+np.float32,0x3f75e032,0x3f3e9625,2
+np.float32,0x7f2c5687,0x3f800000,2
+np.float32,0x3d95fb6c,0x3d95b6ee,2
+np.float32,0xbea515e4,0xbe9f97c8,2
+np.float32,0x7f2b2cd7,0x3f800000,2
+np.float32,0x3f076f7a,0x3ef8241e,2
+np.float32,0x5178ca,0x5178ca,2
+np.float32,0xbeb5976a,0xbeae5781,2
+np.float32,0x3e3c3563,0x3e3a1e13,2
+np.float32,0xbd208530,0xbd20702a,2
+np.float32,0x3eb03b04,0x3ea995ef,2
+np.float32,0x17fb9c,0x17fb9c,2
+np.float32,0xfca68e40,0xbf800000,2
+np.float32,0xbf5e7433,0xbf336a9f,2
+np.float32,0xff5b8d3d,0xbf800000,2
+np.float32,0x8003121d,0x8003121d,2
+np.float32,0xbe6dd344,0xbe69a3b0,2
+np.float32,0x67cc4,0x67cc4,2
+np.float32,0x9b01d,0x9b01d,2
+np.float32,0x127c13,0x127c13,2
+np.float32,0xfea5e3d6,0xbf800000,2
+np.float32,0xbdf5c610,0xbdf499c1,2
+np.float32,0x3aff4c00,0x3aff4beb,2
+np.float32,0x3b00afd0,0x3b00afc5,2
+np.float32,0x479618,0x479618,2
+np.float32,0x801cbd05,0x801cbd05,2
+np.float32,0x3ec9249f,0x3ebf6579,2
+np.float32,0x3535c4,0x3535c4,2
+np.float32,0xbeb4f662,0xbeadc915,2
+np.float32,0x8006fda6,0x8006fda6,2
+np.float32,0xbf4f3097,0xbf2b5239,2
+np.float32,0xbf3cb9a8,0xbf20a0e9,2
+np.float32,0x32ced0,0x32ced0,2
+np.float32,0x7ea34e76,0x3f800000,2
+np.float32,0x80063046,0x80063046,2
+np.float32,0x80727e8b,0x80727e8b,2
+np.float32,0xfd6b5780,0xbf800000,2
+np.float32,0x80109815,0x80109815,2
+np.float32,0xfdcc8a78,0xbf800000,2
+np.float32,0x81562,0x81562,2
+np.float32,0x803dfacc,0x803dfacc,2
+np.float32,0xbe204318,0xbe1ef75f,2
+np.float32,0xbf745d34,0xbf3de8e2,2
+np.float32,0xff13fdcc,0xbf800000,2
+np.float32,0x7f75ba8c,0x3f800000,2
+np.float32,0x806c04b4,0x806c04b4,2
+np.float32,0x3ec61ca6,0x3ebcc877,2
+np.float32,0xbeaea984,0xbea8301f,2
+np.float32,0xbf4dcd0e,0xbf2a8d34,2
+np.float32,0x802a01d3,0x802a01d3,2
+np.float32,0xbf747be5,0xbf3df6ad,2
+np.float32,0xbf75cbd2,0xbf3e8d0f,2
+np.float32,0x7db86576,0x3f800000,2
+np.float32,0xff49a2c3,0xbf800000,2
+np.float32,0xbedc5314,0xbecfa978,2
+np.float32,0x8078877b,0x8078877b,2
+np.float32,0xbead4824,0xbea6f499,2
+np.float32,0xbf3926e3,0xbf1e716c,2
+np.float32,0x807f4a1c,0x807f4a1c,2
+np.float32,0x7f2cd8fd,0x3f800000,2
+np.float32,0x806cfcca,0x806cfcca,2
+np.float32,0xff1aa048,0xbf800000,2
+np.float32,0x7eb9ea08,0x3f800000,2
+np.float32,0xbf1034bc,0xbf02ab3a,2
+np.float32,0xbd087830,0xbd086b44,2
+np.float32,0x7e071034,0x3f800000,2
+np.float32,0xbefcc9de,0xbeea122f,2
+np.float32,0x80796d7a,0x80796d7a,2
+np.float32,0x33ce46,0x33ce46,2
+np.float32,0x8074a783,0x8074a783,2
+np.float32,0xbe95a56a,0xbe918691,2
+np.float32,0xbf2ff3f4,0xbf18a42d,2
+np.float32,0x1633e9,0x1633e9,2
+np.float32,0x7f0f104b,0x3f800000,2
+np.float32,0xbf800000,0xbf42f7d6,2
+np.float32,0x3d2cd6,0x3d2cd6,2
+np.float32,0xfed43e16,0xbf800000,2
+np.float32,0x3ee6faec,0x3ed87d2c,2
+np.float32,0x3f2c32d0,0x3f163352,2
+np.float32,0xff4290c0,0xbf800000,2
+np.float32,0xbf66500e,0xbf37546a,2
+np.float32,0x7dfb8fe3,0x3f800000,2
+np.float32,0x3f20ba5d,0x3f0e7b16,2
+np.float32,0xff30c7ae,0xbf800000,2
+np.float32,0x1728a4,0x1728a4,2
+np.float32,0x340d82,0x340d82,2
+np.float32,0xff7870b7,0xbf800000,2
+np.float32,0xbeac6ac4,0xbea62ea7,2
+np.float32,0xbef936fc,0xbee73c36,2
+np.float32,0x3ec7e12c,0x3ebe4ef8,2
+np.float32,0x80673488,0x80673488,2
+np.float32,0xfdf14c90,0xbf800000,2
+np.float32,0x3f182568,0x3f08726e,2
+np.float32,0x7ed7dcd0,0x3f800000,2
+np.float32,0x3de4da34,0x3de3e790,2
+np.float32,0xff7fffff,0xbf800000,2
+np.float32,0x4ff90c,0x4ff90c,2
+np.float32,0x3efb0d1c,0x3ee8b1d6,2
+np.float32,0xbf66e952,0xbf379ef4,2
+np.float32,0xba9dc,0xba9dc,2
+np.float32,0xff67c766,0xbf800000,2
+np.float32,0x7f1ffc29,0x3f800000,2
+np.float32,0x3f51c906,0x3f2cbe99,2
+np.float32,0x3f2e5792,0x3f179968,2
+np.float32,0x3ecb9750,0x3ec17fa0,2
+np.float32,0x7f3fcefc,0x3f800000,2
+np.float32,0xbe4e30fc,0xbe4b72f9,2
+np.float32,0x7e9bc4ce,0x3f800000,2
+np.float32,0x7e70aa1f,0x3f800000,2
+np.float32,0x14c6e9,0x14c6e9,2
+np.float32,0xbcf327c0,0xbcf3157a,2
+np.float32,0xff1fd204,0xbf800000,2
+np.float32,0x7d934a03,0x3f800000,2
+np.float32,0x8028bf1e,0x8028bf1e,2
+np.float32,0x7f0800b7,0x3f800000,2
+np.float32,0xfe04825c,0xbf800000,2
+np.float32,0x807210ac,0x807210ac,2
+np.float32,0x3f7faf7c,0x3f42d5fd,2
+np.float32,0x3e04a543,0x3e03e899,2
+np.float32,0x3e98ea15,0x3e94863e,2
+np.float32,0x3d2a2e48,0x3d2a153b,2
+np.float32,0x7fa00000,0x7fe00000,2
+np.float32,0x20a488,0x20a488,2
+np.float32,0x3f6ba86a,0x3f39e51a,2
+np.float32,0x0,0x0,2
+np.float32,0x3e892ddd,0x3e85fcfe,2
+np.float32,0x3e2da627,0x3e2c00e0,2
+np.float32,0xff000a50,0xbf800000,2
+np.float32,0x3eb749f4,0x3eafd739,2
+np.float32,0x8024c0ae,0x8024c0ae,2
+np.float32,0xfc8f3b40,0xbf800000,2
+np.float32,0xbf685fc7,0xbf385405,2
+np.float32,0x3f1510e6,0x3f063a4f,2
+np.float32,0x3f68e8ad,0x3f3895d8,2
+np.float32,0x3dba8608,0x3dba0271,2
+np.float32,0xbf16ea10,0xbf079017,2
+np.float32,0xb3928,0xb3928,2
+np.float32,0xfe447c00,0xbf800000,2
+np.float32,0x3db9cd57,0x3db94b45,2
+np.float32,0x803b66b0,0x803b66b0,2
+np.float32,0x805b5e02,0x805b5e02,2
+np.float32,0x7ec93f61,0x3f800000,2
+np.float32,0x8005a126,0x8005a126,2
+np.float32,0x6d8888,0x6d8888,2
+np.float32,0x3e21b7de,0x3e206314,2
+np.float32,0xbec9c31e,0xbebfedc2,2
+np.float32,0xbea88aa8,0xbea2b4e5,2
+np.float32,0x3d8fc310,0x3d8f86bb,2
+np.float32,0xbf3cc68a,0xbf20a8b8,2
+np.float32,0x432690,0x432690,2
+np.float32,0xbe51d514,0xbe4ef1a3,2
+np.float32,0xbcda6d20,0xbcda5fe1,2
+np.float32,0xfe24e458,0xbf800000,2
+np.float32,0xfedc8c14,0xbf800000,2
+np.float32,0x7f7e9bd4,0x3f800000,2
+np.float32,0x3ebcc880,0x3eb4ab44,2
+np.float32,0xbe0aa490,0xbe09cd44,2
+np.float32,0x3dc9158c,0x3dc870c3,2
+np.float32,0x3e5c319e,0x3e58dc90,2
+np.float32,0x1d4527,0x1d4527,2
+np.float32,0x2dbf5,0x2dbf5,2
+np.float32,0xbf1f121f,0xbf0d5534,2
+np.float32,0x7e3e9ab5,0x3f800000,2
+np.float32,0x7f74b5c1,0x3f800000,2
+np.float32,0xbf6321ba,0xbf35c42b,2
+np.float32,0xbe5c7488,0xbe591c79,2
+np.float32,0x7e7b02cd,0x3f800000,2
+np.float32,0xfe7cbfa4,0xbf800000,2
+np.float32,0xbeace360,0xbea69a86,2
+np.float32,0x7e149b00,0x3f800000,2
+np.float32,0xbf61a700,0xbf35079a,2
+np.float32,0x7eb592a7,0x3f800000,2
+np.float32,0x3f2105e6,0x3f0eaf30,2
+np.float32,0xfd997a88,0xbf800000,2
+np.float32,0xff5d093b,0xbf800000,2
+np.float32,0x63aede,0x63aede,2
+np.float32,0x6907ee,0x6907ee,2
+np.float32,0xbf7578ee,0xbf3e680f,2
+np.float32,0xfea971e8,0xbf800000,2
+np.float32,0x3f21d0f5,0x3f0f3aed,2
+np.float32,0x3a50e2,0x3a50e2,2
+np.float32,0x7f0f5b1e,0x3f800000,2
+np.float32,0x805b9765,0x805b9765,2
+np.float32,0xbe764ab8,0xbe71a664,2
+np.float32,0x3eafac7f,0x3ea91701,2
+np.float32,0x807f4130,0x807f4130,2
+np.float32,0x7c5f31,0x7c5f31,2
+np.float32,0xbdbe0e30,0xbdbd8300,2
+np.float32,0x7ecfe4e0,0x3f800000,2
+np.float32,0xff7cb628,0xbf800000,2
+np.float32,0xff1842bc,0xbf800000,2
+np.float32,0xfd4163c0,0xbf800000,2
+np.float32,0x800e11f7,0x800e11f7,2
+np.float32,0x7f3adec8,0x3f800000,2
+np.float32,0x7f597514,0x3f800000,2
+np.float32,0xbe986e14,0xbe9414a4,2
+np.float32,0x800fa9d7,0x800fa9d7,2
+np.float32,0xff5b79c4,0xbf800000,2
+np.float32,0x80070565,0x80070565,2
+np.float32,0xbee5628e,0xbed72d60,2
+np.float32,0x3f438ef2,0x3f24b3ca,2
+np.float32,0xcda91,0xcda91,2
+np.float32,0x7e64151a,0x3f800000,2
+np.float32,0xbe95d584,0xbe91b2c7,2
+np.float32,0x8022c2a1,0x8022c2a1,2
+np.float32,0x7e7097bf,0x3f800000,2
+np.float32,0x80139035,0x80139035,2
+np.float32,0x804de2cb,0x804de2cb,2
+np.float32,0xfde5d178,0xbf800000,2
+np.float32,0x6d238,0x6d238,2
+np.float32,0x807abedc,0x807abedc,2
+np.float32,0x3f450a12,0x3f259129,2
+np.float32,0x3ef1c120,0x3ee141f2,2
+np.float32,0xfeb64dae,0xbf800000,2
+np.float32,0x8001732c,0x8001732c,2
+np.float32,0x3f76062e,0x3f3ea711,2
+np.float32,0x3eddd550,0x3ed0ebc8,2
+np.float32,0xff5ca1d4,0xbf800000,2
+np.float32,0xbf49dc5e,0xbf285673,2
+np.float32,0x7e9e5438,0x3f800000,2
+np.float32,0x7e83625e,0x3f800000,2
+np.float32,0x3f5dc41c,0x3f3310da,2
+np.float32,0x3f583efa,0x3f30342f,2
+np.float32,0xbe26bf88,0xbe254a2d,2
+np.float32,0xff1e0beb,0xbf800000,2
+np.float32,0xbe2244c8,0xbe20ec86,2
+np.float32,0xff0b1630,0xbf800000,2
+np.float32,0xff338dd6,0xbf800000,2
+np.float32,0x3eafc22c,0x3ea92a51,2
+np.float32,0x800ea07f,0x800ea07f,2
+np.float32,0x3f46f006,0x3f26aa7e,2
+np.float32,0x3e5f57cd,0x3e5bde16,2
+np.float32,0xbf1b2d8e,0xbf0a9a93,2
+np.float32,0xfeacdbe0,0xbf800000,2
+np.float32,0x7e5ea4bc,0x3f800000,2
+np.float32,0xbf51cbe2,0xbf2cc027,2
+np.float32,0x8073644c,0x8073644c,2
+np.float32,0xff2d6bfe,0xbf800000,2
+np.float32,0x3f65f0f6,0x3f37260a,2
+np.float32,0xff4b37a6,0xbf800000,2
+np.float32,0x712df7,0x712df7,2
+np.float32,0x7f71ef17,0x3f800000,2
+np.float32,0x8042245c,0x8042245c,2
+np.float32,0x3e5dde7b,0x3e5a760d,2
+np.float32,0x8069317d,0x8069317d,2
+np.float32,0x807932dd,0x807932dd,2
+np.float32,0x802f847e,0x802f847e,2
+np.float32,0x7e9300,0x7e9300,2
+np.float32,0x8040b4ab,0x8040b4ab,2
+np.float32,0xff76ef8e,0xbf800000,2
+np.float32,0x4aae3a,0x4aae3a,2
+np.float32,0x8058de73,0x8058de73,2
+np.float32,0x7e4d58c0,0x3f800000,2
+np.float32,0x3d811b30,0x3d80ef79,2
+np.float32,0x7ec952cc,0x3f800000,2
+np.float32,0xfe162b1c,0xbf800000,2
+np.float32,0x3f0f1187,0x3f01d367,2
+np.float32,0xbf2f3458,0xbf182878,2
+np.float32,0x5ceb14,0x5ceb14,2
+np.float32,0xbec29476,0xbeb9b939,2
+np.float32,0x3e71f943,0x3e6d9176,2
+np.float32,0x3ededefc,0x3ed1c909,2
+np.float32,0x805df6ac,0x805df6ac,2
+np.float32,0x3e5ae2c8,0x3e579ca8,2
+np.float32,0x3f6ad2c3,0x3f397fdf,2
+np.float32,0x7d5f94d3,0x3f800000,2
+np.float32,0xbeec7fe4,0xbedd0037,2
+np.float32,0x3f645304,0x3f365b0d,2
+np.float32,0xbf69a087,0xbf38edef,2
+np.float32,0x8025102e,0x8025102e,2
+np.float32,0x800db486,0x800db486,2
+np.float32,0x4df6c7,0x4df6c7,2
+np.float32,0x806d8cdd,0x806d8cdd,2
+np.float32,0x7f0c78cc,0x3f800000,2
+np.float32,0x7e1cf70b,0x3f800000,2
+np.float32,0x3e0ae570,0x3e0a0cf7,2
+np.float32,0x80176ef8,0x80176ef8,2
+np.float32,0x3f38b60c,0x3f1e2bbb,2
+np.float32,0x3d3071e0,0x3d3055f5,2
+np.float32,0x3ebfcfdd,0x3eb750a9,2
+np.float32,0xfe2cdec0,0xbf800000,2
+np.float32,0x7eeb2eed,0x3f800000,2
+np.float32,0x8026c904,0x8026c904,2
+np.float32,0xbec79bde,0xbebe133a,2
+np.float32,0xbf7dfab6,0xbf421d47,2
+np.float32,0x805b3cfd,0x805b3cfd,2
+np.float32,0xfdfcfb68,0xbf800000,2
+np.float32,0xbd537ec0,0xbd534eaf,2
+np.float32,0x52ce73,0x52ce73,2
+np.float32,0xfeac6ea6,0xbf800000,2
+np.float32,0x3f2c2990,0x3f162d41,2
+np.float32,0x3e3354e0,0x3e318539,2
+np.float32,0x802db22b,0x802db22b,2
+np.float32,0x7f0faa83,0x3f800000,2
+np.float32,0x7f10e161,0x3f800000,2
+np.float32,0x7f165c60,0x3f800000,2
+np.float32,0xbf5a756f,0xbf315c82,2
+np.float32,0x7f5a4b68,0x3f800000,2
+np.float32,0xbd77fbf0,0xbd77ae7c,2
+np.float32,0x65d83c,0x65d83c,2
+np.float32,0x3e5f28,0x3e5f28,2
+np.float32,0x8040ec92,0x8040ec92,2
+np.float32,0xbf2b41a6,0xbf1594d5,2
+np.float32,0x7f2f88f1,0x3f800000,2
+np.float32,0xfdb64ab8,0xbf800000,2
+np.float32,0xbf7a3ff1,0xbf4082f5,2
+np.float32,0x1948fc,0x1948fc,2
+np.float32,0x802c1039,0x802c1039,2
+np.float32,0x80119274,0x80119274,2
+np.float32,0x7e885d7b,0x3f800000,2
+np.float32,0xfaf6a,0xfaf6a,2
+np.float32,0x3eba28c4,0x3eb25e1d,2
+np.float32,0x3e4df370,0x3e4b37da,2
+np.float32,0xbf19eff6,0xbf09b97d,2
+np.float32,0xbeddd3c6,0xbed0ea7f,2
+np.float32,0xff6fc971,0xbf800000,2
+np.float32,0x7e93de29,0x3f800000,2
+np.float32,0x3eb12332,0x3eaa6485,2
+np.float32,0x3eb7c6e4,0x3eb04563,2
+np.float32,0x4a67ee,0x4a67ee,2
+np.float32,0xff1cafde,0xbf800000,2
+np.float32,0x3f5e2812,0x3f3343da,2
+np.float32,0x3f060e04,0x3ef605d4,2
+np.float32,0x3e9027d8,0x3e8c76a6,2
+np.float32,0xe2d33,0xe2d33,2
+np.float32,0xff4c94fc,0xbf800000,2
+np.float32,0xbf574908,0xbf2fb26b,2
+np.float32,0xbf786c08,0xbf3fb68e,2
+np.float32,0x8011ecab,0x8011ecab,2
+np.float32,0xbf061c6a,0xbef61bfa,2
+np.float32,0x7eea5f9d,0x3f800000,2
+np.float32,0x3ea2e19c,0x3e9d99a5,2
+np.float32,0x8071550c,0x8071550c,2
+np.float32,0x41c70b,0x41c70b,2
+np.float32,0x80291fc8,0x80291fc8,2
+np.float32,0x43b1ec,0x43b1ec,2
+np.float32,0x32f5a,0x32f5a,2
+np.float32,0xbe9310ec,0xbe8f2692,2
+np.float32,0x7f75f6bf,0x3f800000,2
+np.float32,0x3e6642a6,0x3e6274d2,2
+np.float32,0x3ecb88e0,0x3ec1733f,2
+np.float32,0x804011b6,0x804011b6,2
+np.float32,0x80629cca,0x80629cca,2
+np.float32,0x8016b914,0x8016b914,2
+np.float32,0xbdd05fc0,0xbdcfa870,2
+np.float32,0x807b824d,0x807b824d,2
+np.float32,0xfeec2576,0xbf800000,2
+np.float32,0xbf54bf22,0xbf2e584c,2
+np.float32,0xbf185eb0,0xbf089b6b,2
+np.float32,0xfbc09480,0xbf800000,2
+np.float32,0x3f413054,0x3f234e25,2
+np.float32,0x7e9e32b8,0x3f800000,2
+np.float32,0x266296,0x266296,2
+np.float32,0x460284,0x460284,2
+np.float32,0x3eb0b056,0x3ea9fe5a,2
+np.float32,0x1a7be5,0x1a7be5,2
+np.float32,0x7f099895,0x3f800000,2
+np.float32,0x3f3614f0,0x3f1c88ef,2
+np.float32,0x7e757dc2,0x3f800000,2
+np.float32,0x801fc91e,0x801fc91e,2
+np.float32,0x3f5ce37d,0x3f329ddb,2
+np.float32,0x3e664d70,0x3e627f15,2
+np.float32,0xbf38ed78,0xbf1e4dfa,2
+np.float32,0xbf5c563d,0xbf325543,2
+np.float32,0xbe91cc54,0xbe8dfb24,2
+np.float32,0x3d767fbe,0x3d7633ac,2
+np.float32,0xbf6aeb40,0xbf398b7f,2
+np.float32,0x7f40508b,0x3f800000,2
+np.float32,0x2650df,0x2650df,2
+np.float32,0xbe8cea3c,0xbe897628,2
+np.float32,0x80515af8,0x80515af8,2
+np.float32,0x7f423986,0x3f800000,2
+np.float32,0xbdf250e8,0xbdf1310c,2
+np.float32,0xfe89288a,0xbf800000,2
+np.float32,0x397b3b,0x397b3b,2
+np.float32,0x7e5e91b0,0x3f800000,2
+np.float32,0x6866e2,0x6866e2,2
+np.float32,0x7f4d8877,0x3f800000,2
+np.float32,0x3e6c4a21,0x3e682ee3,2
+np.float32,0xfc3d5980,0xbf800000,2
+np.float32,0x7eae2cd0,0x3f800000,2
+np.float32,0xbf241222,0xbf10c579,2
+np.float32,0xfebc02de,0xbf800000,2
+np.float32,0xff6e0645,0xbf800000,2
+np.float32,0x802030b6,0x802030b6,2
+np.float32,0x7ef9a441,0x3f800000,2
+np.float32,0x3fcf9f,0x3fcf9f,2
+np.float32,0xbf0ccf13,0xbf0023cc,2
+np.float32,0xfefee688,0xbf800000,2
+np.float32,0xbf6c8e0c,0xbf3a5160,2
+np.float32,0xfe749c28,0xbf800000,2
+np.float32,0x7f7fffff,0x3f800000,2
+np.float32,0x58c1a0,0x58c1a0,2
+np.float32,0x3f2de0a1,0x3f174c17,2
+np.float32,0xbf5f7138,0xbf33eb03,2
+np.float32,0x3da15270,0x3da0fd3c,2
+np.float32,0x3da66560,0x3da607e4,2
+np.float32,0xbf306f9a,0xbf18f3c6,2
+np.float32,0x3e81a4de,0x3e7de293,2
+np.float32,0xbebb5fb8,0xbeb36f1a,2
+np.float32,0x14bf64,0x14bf64,2
+np.float32,0xbeac46c6,0xbea60e73,2
+np.float32,0xbdcdf210,0xbdcd4111,2
+np.float32,0x3f7e3cd9,0x3f42395e,2
+np.float32,0xbc4be640,0xbc4be38e,2
+np.float32,0xff5f53b4,0xbf800000,2
+np.float32,0xbf1315ae,0xbf04c90b,2
+np.float32,0x80000000,0x80000000,2
+np.float32,0xbf6a4149,0xbf393aaa,2
+np.float32,0x3f66b8ee,0x3f378772,2
+np.float32,0xff29293e,0xbf800000,2
+np.float32,0xbcc989c0,0xbcc97f58,2
+np.float32,0xbd9a1b70,0xbd99d125,2
+np.float32,0xfef353cc,0xbf800000,2
+np.float32,0xbdc30cf0,0xbdc27683,2
+np.float32,0xfdfd6768,0xbf800000,2
+np.float32,0x7ebac44c,0x3f800000,2
+np.float32,0xff453cd6,0xbf800000,2
+np.float32,0x3ef07720,0x3ee03787,2
+np.float32,0x80219c14,0x80219c14,2
+np.float32,0x805553a8,0x805553a8,2
+np.float32,0x80703928,0x80703928,2
+np.float32,0xff16d3a7,0xbf800000,2
+np.float32,0x3f1472bc,0x3f05c77b,2
+np.float32,0x3eeea37a,0x3edebcf9,2
+np.float32,0x3db801e6,0x3db7838d,2
+np.float32,0x800870d2,0x800870d2,2
+np.float32,0xbea1172c,0xbe9bfa32,2
+np.float32,0x3f1f5e7c,0x3f0d8a42,2
+np.float32,0x123cdb,0x123cdb,2
+np.float32,0x7f6e6b06,0x3f800000,2
+np.float32,0x3ed80573,0x3ecc0def,2
+np.float32,0xfea31b82,0xbf800000,2
+np.float32,0x6744e0,0x6744e0,2
+np.float32,0x695e8b,0x695e8b,2
+np.float32,0xbee3888a,0xbed5a67d,2
+np.float32,0x7f64bc2a,0x3f800000,2
+np.float32,0x7f204244,0x3f800000,2
+np.float32,0x7f647102,0x3f800000,2
+np.float32,0x3dd8ebc0,0x3dd81d03,2
+np.float32,0x801e7ab1,0x801e7ab1,2
+np.float32,0x7d034b56,0x3f800000,2
+np.float32,0x7fc00000,0x7fc00000,2
+np.float32,0x80194193,0x80194193,2
+np.float32,0xfe31c8d4,0xbf800000,2
+np.float32,0x7fc0c4,0x7fc0c4,2
+np.float32,0xd95bf,0xd95bf,2
+np.float32,0x7e4f991d,0x3f800000,2
+np.float32,0x7fc563,0x7fc563,2
+np.float32,0xbe3fcccc,0xbe3d968a,2
+np.float32,0xfdaaa1c8,0xbf800000,2
+np.float32,0xbf48e449,0xbf27c949,2
+np.float32,0x3eb6c584,0x3eaf625e,2
+np.float32,0xbea35a74,0xbe9e0702,2
+np.float32,0x3eeab47a,0x3edb89d5,2
+np.float32,0xbed99556,0xbecd5de5,2
+np.float64,0xbfb94a81e0329500,0xbfb935867ba761fe,2
+np.float64,0xbfec132f1678265e,0xbfe6900eb097abc3,2
+np.float64,0x5685ea72ad0be,0x5685ea72ad0be,2
+np.float64,0xbfd74d3169ae9a62,0xbfd652e09b9daf32,2
+np.float64,0xbfe28df53d651bea,0xbfe0b8a7f50ab433,2
+np.float64,0x0,0x0,2
+np.float64,0xbfed912738bb224e,0xbfe749e3732831ae,2
+np.float64,0x7fcc6faed838df5d,0x3ff0000000000000,2
+np.float64,0xbfe95fe9a432bfd3,0xbfe51f6349919910,2
+np.float64,0xbfc4d5900b29ab20,0xbfc4a6f496179b8b,2
+np.float64,0xbfcd6025033ac04c,0xbfccded7b34b49b0,2
+np.float64,0xbfdfa655b43f4cac,0xbfdd4ca1e5bb9db8,2
+np.float64,0xe7ea5c7fcfd4c,0xe7ea5c7fcfd4c,2
+np.float64,0xffa5449ca42a8940,0xbff0000000000000,2
+np.float64,0xffe63294c1ac6529,0xbff0000000000000,2
+np.float64,0x7feb9cbae7f73975,0x3ff0000000000000,2
+np.float64,0x800eb07c3e3d60f9,0x800eb07c3e3d60f9,2
+np.float64,0x3fc95777e932aef0,0x3fc9040391e20c00,2
+np.float64,0x800736052dee6c0b,0x800736052dee6c0b,2
+np.float64,0x3fe9ae4afd335c96,0x3fe54b569bab45c7,2
+np.float64,0x7fee4c94217c9927,0x3ff0000000000000,2
+np.float64,0x80094b594bd296b3,0x80094b594bd296b3,2
+np.float64,0xffe5adbcee6b5b7a,0xbff0000000000000,2
+np.float64,0x3fecb8eab47971d5,0x3fe6e236be6f27e9,2
+np.float64,0x44956914892ae,0x44956914892ae,2
+np.float64,0xbfe3bd18ef677a32,0xbfe190bf1e07200c,2
+np.float64,0x800104e5b46209cc,0x800104e5b46209cc,2
+np.float64,0x8008fbcecf71f79e,0x8008fbcecf71f79e,2
+np.float64,0x800f0a46a0be148d,0x800f0a46a0be148d,2
+np.float64,0x7fe657a0702caf40,0x3ff0000000000000,2
+np.float64,0xffd3ff1a9027fe36,0xbff0000000000000,2
+np.float64,0x3fe78bc87bef1790,0x3fe40d2e63aaf029,2
+np.float64,0x7feeabdc4c7d57b8,0x3ff0000000000000,2
+np.float64,0xbfabd28d8437a520,0xbfabcb8ce03a0e56,2
+np.float64,0xbfddc3a133bb8742,0xbfdbc9fdb2594451,2
+np.float64,0x7fec911565b9222a,0x3ff0000000000000,2
+np.float64,0x71302604e2605,0x71302604e2605,2
+np.float64,0xee919d2bdd234,0xee919d2bdd234,2
+np.float64,0xbfc04fcff3209fa0,0xbfc0395a739a2ce4,2
+np.float64,0xffe4668a36e8cd14,0xbff0000000000000,2
+np.float64,0xbfeeafeebefd5fde,0xbfe7cd5f3d61a3ec,2
+np.float64,0x7fddb34219bb6683,0x3ff0000000000000,2
+np.float64,0xbfd2cac6cba5958e,0xbfd24520abb2ff36,2
+np.float64,0xbfb857e49630afc8,0xbfb8452d5064dec2,2
+np.float64,0x3fd2dbf90b25b7f2,0x3fd254eaf48484c2,2
+np.float64,0x800af65c94f5ecba,0x800af65c94f5ecba,2
+np.float64,0xa0eef4bf41ddf,0xa0eef4bf41ddf,2
+np.float64,0xffd8e0a4adb1c14a,0xbff0000000000000,2
+np.float64,0xffe858f6e870b1ed,0xbff0000000000000,2
+np.float64,0x3f94c2c308298580,0x3f94c208a4bb006d,2
+np.float64,0xffb45f0d7428be18,0xbff0000000000000,2
+np.float64,0x800ed4f43dbda9e9,0x800ed4f43dbda9e9,2
+np.float64,0x8002dd697e85bad4,0x8002dd697e85bad4,2
+np.float64,0x787ceab2f0f9e,0x787ceab2f0f9e,2
+np.float64,0xbfdff5fcc2bfebfa,0xbfdd8b736b128589,2
+np.float64,0x7fdb2b4294365684,0x3ff0000000000000,2
+np.float64,0xffe711e5e92e23cc,0xbff0000000000000,2
+np.float64,0x800b1c93f1163928,0x800b1c93f1163928,2
+np.float64,0x7fc524d2f22a49a5,0x3ff0000000000000,2
+np.float64,0x7fc88013b5310026,0x3ff0000000000000,2
+np.float64,0x3fe1a910c5e35222,0x3fe00fd779ebaa2a,2
+np.float64,0xbfb57ec9ca2afd90,0xbfb571e47ecb9335,2
+np.float64,0x7fd7594b20aeb295,0x3ff0000000000000,2
+np.float64,0x7fba4641ca348c83,0x3ff0000000000000,2
+np.float64,0xffe61393706c2726,0xbff0000000000000,2
+np.float64,0x7fd54f3c7baa9e78,0x3ff0000000000000,2
+np.float64,0xffe65ffb12ecbff6,0xbff0000000000000,2
+np.float64,0xbfba3b0376347608,0xbfba239cbbbd1b11,2
+np.float64,0x800200886d640112,0x800200886d640112,2
+np.float64,0xbfecf0ba4679e174,0xbfe6fd59de44a3ec,2
+np.float64,0xffe5c57e122b8afc,0xbff0000000000000,2
+np.float64,0x7fdaad0143355a02,0x3ff0000000000000,2
+np.float64,0x46ab32c08d567,0x46ab32c08d567,2
+np.float64,0x7ff8000000000000,0x7ff8000000000000,2
+np.float64,0xbfda7980fdb4f302,0xbfd90fa9c8066109,2
+np.float64,0x3fe237703c646ee0,0x3fe07969f8d8805a,2
+np.float64,0x8000e9fcfc21d3fb,0x8000e9fcfc21d3fb,2
+np.float64,0xbfdfe6e958bfcdd2,0xbfdd7f952fe87770,2
+np.float64,0xbd7baf217af8,0xbd7baf217af8,2
+np.float64,0xbfceba9e4b3d753c,0xbfce26e54359869a,2
+np.float64,0xb95a2caf72b46,0xb95a2caf72b46,2
+np.float64,0x3fb407e25a280fc5,0x3fb3fd71e457b628,2
+np.float64,0xa1da09d943b41,0xa1da09d943b41,2
+np.float64,0xbfe9c7271cf38e4e,0xbfe559296b471738,2
+np.float64,0x3fefae6170ff5cc3,0x3fe83c70ba82f0e1,2
+np.float64,0x7fe7375348ae6ea6,0x3ff0000000000000,2
+np.float64,0xffe18c9cc6e31939,0xbff0000000000000,2
+np.float64,0x800483d13a6907a3,0x800483d13a6907a3,2
+np.float64,0x7fe772a18caee542,0x3ff0000000000000,2
+np.float64,0xffefff64e7bffec9,0xbff0000000000000,2
+np.float64,0x7fcffc31113ff861,0x3ff0000000000000,2
+np.float64,0x3fd91e067e323c0d,0x3fd7e70bf365a7b3,2
+np.float64,0xb0a6673d614cd,0xb0a6673d614cd,2
+np.float64,0xffef9a297e3f3452,0xbff0000000000000,2
+np.float64,0xffe87cc15e70f982,0xbff0000000000000,2
+np.float64,0xffefd6ad8e7fad5a,0xbff0000000000000,2
+np.float64,0x7fe3aaa3a8a75546,0x3ff0000000000000,2
+np.float64,0xddab0341bb561,0xddab0341bb561,2
+np.float64,0x3fe996d6d7332dae,0x3fe53e3ed5be2922,2
+np.float64,0x3fdbe66a18b7ccd4,0x3fda41e6053c1512,2
+np.float64,0x8914775d1228f,0x8914775d1228f,2
+np.float64,0x3fe44621d4688c44,0x3fe1ef9c7225f8bd,2
+np.float64,0xffab29a2a4365340,0xbff0000000000000,2
+np.float64,0xffc8d4a0c431a940,0xbff0000000000000,2
+np.float64,0xbfd426e085284dc2,0xbfd382e2a9617b87,2
+np.float64,0xbfd3b0a525a7614a,0xbfd3176856faccf1,2
+np.float64,0x80036dedcb06dbdc,0x80036dedcb06dbdc,2
+np.float64,0x3feb13823b762704,0x3fe60ca3facdb696,2
+np.float64,0x3fd7246b7bae48d8,0x3fd62f08afded155,2
+np.float64,0x1,0x1,2
+np.float64,0x3fe8ade4b9715bc9,0x3fe4b97cc1387d27,2
+np.float64,0x3fdf2dbec53e5b7e,0x3fdcecfeee33de95,2
+np.float64,0x3fe4292bf9685258,0x3fe1dbb5a6704090,2
+np.float64,0xbfd21acbb8243598,0xbfd1a2ff42174cae,2
+np.float64,0xdd0d2d01ba1a6,0xdd0d2d01ba1a6,2
+np.float64,0x3fa3f3d2f427e7a0,0x3fa3f13d6f101555,2
+np.float64,0x7fdabf4aceb57e95,0x3ff0000000000000,2
+np.float64,0xd4d9e39ba9b3d,0xd4d9e39ba9b3d,2
+np.float64,0xffec773396f8ee66,0xbff0000000000000,2
+np.float64,0x3fa88cc79031198f,0x3fa887f7ade722ba,2
+np.float64,0xffe63a92066c7524,0xbff0000000000000,2
+np.float64,0xbfcf514e2e3ea29c,0xbfceb510e99aaa19,2
+np.float64,0x9d78c19d3af18,0x9d78c19d3af18,2
+np.float64,0x7fdd748bfbbae917,0x3ff0000000000000,2
+np.float64,0xffb3594c4626b298,0xbff0000000000000,2
+np.float64,0x80068ce5b32d19cc,0x80068ce5b32d19cc,2
+np.float64,0x3fec63d60e78c7ac,0x3fe6b85536e44217,2
+np.float64,0x80080bad4dd0175b,0x80080bad4dd0175b,2
+np.float64,0xbfec6807baf8d010,0xbfe6ba69740f9687,2
+np.float64,0x7fedbae0bbfb75c0,0x3ff0000000000000,2
+np.float64,0x8001cb7aa3c396f6,0x8001cb7aa3c396f6,2
+np.float64,0x7fe1f1f03563e3df,0x3ff0000000000000,2
+np.float64,0x7fd83d3978307a72,0x3ff0000000000000,2
+np.float64,0xbfc05ffe9d20bffc,0xbfc049464e3f0af2,2
+np.float64,0xfe6e053ffcdc1,0xfe6e053ffcdc1,2
+np.float64,0xbfd3bdf39d277be8,0xbfd32386edf12726,2
+np.float64,0x800f41b27bde8365,0x800f41b27bde8365,2
+np.float64,0xbfe2c98390e59307,0xbfe0e3c9260fe798,2
+np.float64,0xffdd6206bcbac40e,0xbff0000000000000,2
+np.float64,0x67f35ef4cfe6c,0x67f35ef4cfe6c,2
+np.float64,0x800337e02ae66fc1,0x800337e02ae66fc1,2
+np.float64,0x3fe0ff70afe1fee1,0x3fdf1f46434330df,2
+np.float64,0x3fd7e0a1df2fc144,0x3fd6d3f82c8031e4,2
+np.float64,0x8008da5cd1b1b4ba,0x8008da5cd1b1b4ba,2
+np.float64,0x80065ec9e4ccbd95,0x80065ec9e4ccbd95,2
+np.float64,0x3fe1d1e559a3a3cb,0x3fe02e4f146aa1ab,2
+np.float64,0x7feb7d2f0836fa5d,0x3ff0000000000000,2
+np.float64,0xbfcb33ce9736679c,0xbfcaccd431b205bb,2
+np.float64,0x800e6d0adf5cda16,0x800e6d0adf5cda16,2
+np.float64,0x7fe46f272ca8de4d,0x3ff0000000000000,2
+np.float64,0x4fdfc73e9fbfa,0x4fdfc73e9fbfa,2
+np.float64,0x800958a13112b143,0x800958a13112b143,2
+np.float64,0xbfea01f877f403f1,0xbfe579a541594247,2
+np.float64,0xeefaf599ddf5f,0xeefaf599ddf5f,2
+np.float64,0x80038766c5e70ece,0x80038766c5e70ece,2
+np.float64,0x7fd31bc28ba63784,0x3ff0000000000000,2
+np.float64,0xbfe4df77eee9bef0,0xbfe257abe7083b77,2
+np.float64,0x7fe6790c78acf218,0x3ff0000000000000,2
+np.float64,0xffe7c66884af8cd0,0xbff0000000000000,2
+np.float64,0x800115e36f422bc8,0x800115e36f422bc8,2
+np.float64,0x3fc601945d2c0329,0x3fc5cab917bb20bc,2
+np.float64,0x3fd6ac9546ad592b,0x3fd5c55437ec3508,2
+np.float64,0xa7bd59294f7ab,0xa7bd59294f7ab,2
+np.float64,0x8005c26c8b8b84da,0x8005c26c8b8b84da,2
+np.float64,0x8257501704aea,0x8257501704aea,2
+np.float64,0x5b12aae0b6256,0x5b12aae0b6256,2
+np.float64,0x800232fe02c465fd,0x800232fe02c465fd,2
+np.float64,0x800dae28f85b5c52,0x800dae28f85b5c52,2
+np.float64,0x3fdade1ac135bc36,0x3fd964a2000ace25,2
+np.float64,0x3fed72ca04fae594,0x3fe73b9170d809f9,2
+np.float64,0x7fc6397e2b2c72fb,0x3ff0000000000000,2
+np.float64,0x3fe1f5296d23ea53,0x3fe048802d17621e,2
+np.float64,0xffe05544b920aa89,0xbff0000000000000,2
+np.float64,0xbfdb2e1588365c2c,0xbfd9a7e4113c713e,2
+np.float64,0xbfed6a06fa3ad40e,0xbfe7376be60535f8,2
+np.float64,0xbfe31dcaf5e63b96,0xbfe120417c46cac1,2
+np.float64,0xbfb7ed67ae2fdad0,0xbfb7dba14af33b00,2
+np.float64,0xffd32bb7eb265770,0xbff0000000000000,2
+np.float64,0x80039877b04730f0,0x80039877b04730f0,2
+np.float64,0x3f832e5630265cac,0x3f832e316f47f218,2
+np.float64,0xffe7fa7f732ff4fe,0xbff0000000000000,2
+np.float64,0x9649b87f2c937,0x9649b87f2c937,2
+np.float64,0xffaee447183dc890,0xbff0000000000000,2
+np.float64,0x7fe4e02dd869c05b,0x3ff0000000000000,2
+np.float64,0x3fe1d35e7463a6bd,0x3fe02f67bd21e86e,2
+np.float64,0xffe57f40fe2afe82,0xbff0000000000000,2
+np.float64,0xbfea1362b93426c6,0xbfe5833421dba8fc,2
+np.float64,0xffe9c689fe338d13,0xbff0000000000000,2
+np.float64,0xffc592dd102b25bc,0xbff0000000000000,2
+np.float64,0x3fd283c7aba5078f,0x3fd203d61d1398c3,2
+np.float64,0x8001d6820243ad05,0x8001d6820243ad05,2
+np.float64,0x3fe0ad5991e15ab4,0x3fdea14ef0d47fbd,2
+np.float64,0x3fe3916f2ee722de,0x3fe1722684a9ffb1,2
+np.float64,0xffef9e54e03f3ca9,0xbff0000000000000,2
+np.float64,0x7fe864faebb0c9f5,0x3ff0000000000000,2
+np.float64,0xbfed3587c3fa6b10,0xbfe71e7112df8a68,2
+np.float64,0xbfdd9efc643b3df8,0xbfdbac3a16caf208,2
+np.float64,0xbfd5ac08feab5812,0xbfd4e14575a6e41b,2
+np.float64,0xffda90fae6b521f6,0xbff0000000000000,2
+np.float64,0x8001380ecf22701e,0x8001380ecf22701e,2
+np.float64,0x7fed266fa5fa4cde,0x3ff0000000000000,2
+np.float64,0xffec6c0ac3b8d815,0xbff0000000000000,2
+np.float64,0x3fe7de43c32fbc88,0x3fe43ef62821a5a6,2
+np.float64,0x800bf4ffc357ea00,0x800bf4ffc357ea00,2
+np.float64,0x3fe125c975624b93,0x3fdf59b2de3eff5d,2
+np.float64,0x8004714c1028e299,0x8004714c1028e299,2
+np.float64,0x3fef1bfbf5fe37f8,0x3fe7fd2ba1b63c8a,2
+np.float64,0x800cae15c3195c2c,0x800cae15c3195c2c,2
+np.float64,0x7fde708e083ce11b,0x3ff0000000000000,2
+np.float64,0x7fbcee5df639dcbb,0x3ff0000000000000,2
+np.float64,0x800b1467141628cf,0x800b1467141628cf,2
+np.float64,0x3fe525e0d36a4bc2,0x3fe286b6e59e30f5,2
+np.float64,0xffe987f8b8330ff1,0xbff0000000000000,2
+np.float64,0x7e0a8284fc151,0x7e0a8284fc151,2
+np.float64,0x8006f982442df305,0x8006f982442df305,2
+np.float64,0xbfd75a3cb62eb47a,0xbfd65e54cee981c9,2
+np.float64,0x258e91104b1d3,0x258e91104b1d3,2
+np.float64,0xbfecd0056779a00b,0xbfe6ed7ae97fff1b,2
+np.float64,0x7fc3a4f9122749f1,0x3ff0000000000000,2
+np.float64,0x6e2b1024dc563,0x6e2b1024dc563,2
+np.float64,0x800d575ad4daaeb6,0x800d575ad4daaeb6,2
+np.float64,0xbfceafb1073d5f64,0xbfce1c93023d8414,2
+np.float64,0xffe895cb5f312b96,0xbff0000000000000,2
+np.float64,0x7fe7811ed4ef023d,0x3ff0000000000000,2
+np.float64,0xbfd93f952f327f2a,0xbfd803e6b5576b99,2
+np.float64,0xffdd883a3fbb1074,0xbff0000000000000,2
+np.float64,0x7fee5624eefcac49,0x3ff0000000000000,2
+np.float64,0xbfe264bb2624c976,0xbfe09a9b7cc896e7,2
+np.float64,0xffef14b417be2967,0xbff0000000000000,2
+np.float64,0xbfecbd0d94397a1b,0xbfe6e43bef852d9f,2
+np.float64,0xbfe20d9e4ba41b3c,0xbfe05a98e05846d9,2
+np.float64,0x10000000000000,0x10000000000000,2
+np.float64,0x7fefde93f7bfbd27,0x3ff0000000000000,2
+np.float64,0x80076b9e232ed73d,0x80076b9e232ed73d,2
+np.float64,0xbfe80df52c701bea,0xbfe45b754b433792,2
+np.float64,0x7fe3b5a637676b4b,0x3ff0000000000000,2
+np.float64,0x2c81d14c5903b,0x2c81d14c5903b,2
+np.float64,0x80038945c767128c,0x80038945c767128c,2
+np.float64,0xffeebaf544bd75ea,0xbff0000000000000,2
+np.float64,0xffdb1867d2b630d0,0xbff0000000000000,2
+np.float64,0x3fe3376eaee66ede,0x3fe13285579763d8,2
+np.float64,0xffddf65ca43becba,0xbff0000000000000,2
+np.float64,0xffec8e3e04791c7b,0xbff0000000000000,2
+np.float64,0x80064f4bde2c9e98,0x80064f4bde2c9e98,2
+np.float64,0x7fe534a085ea6940,0x3ff0000000000000,2
+np.float64,0xbfcbabe31d3757c8,0xbfcb3f8e70adf7e7,2
+np.float64,0xbfe45ca11e28b942,0xbfe1ff04515ef809,2
+np.float64,0x65f4df02cbe9d,0x65f4df02cbe9d,2
+np.float64,0xb08b0cbb61162,0xb08b0cbb61162,2
+np.float64,0x3feae2e8b975c5d1,0x3fe5f302b5e8eda2,2
+np.float64,0x7fcf277ff93e4eff,0x3ff0000000000000,2
+np.float64,0x80010999c4821334,0x80010999c4821334,2
+np.float64,0xbfd7f65911afecb2,0xbfd6e6e9cd098f8b,2
+np.float64,0x800e0560ec3c0ac2,0x800e0560ec3c0ac2,2
+np.float64,0x7fec4152ba3882a4,0x3ff0000000000000,2
+np.float64,0xbfb5c77cd42b8ef8,0xbfb5ba1336084908,2
+np.float64,0x457ff1b68afff,0x457ff1b68afff,2
+np.float64,0x5323ec56a647e,0x5323ec56a647e,2
+np.float64,0xbfeed16cf8bda2da,0xbfe7dc49fc9ae549,2
+np.float64,0xffe8446106b088c1,0xbff0000000000000,2
+np.float64,0xffb93cd13c3279a0,0xbff0000000000000,2
+np.float64,0x7fe515c2aeea2b84,0x3ff0000000000000,2
+np.float64,0x80099df83f933bf1,0x80099df83f933bf1,2
+np.float64,0x7fb3a375562746ea,0x3ff0000000000000,2
+np.float64,0x7fcd7efa243afdf3,0x3ff0000000000000,2
+np.float64,0xffe40cddb12819bb,0xbff0000000000000,2
+np.float64,0x8008b68eecd16d1e,0x8008b68eecd16d1e,2
+np.float64,0x2aec688055d8e,0x2aec688055d8e,2
+np.float64,0xffe23750bc646ea1,0xbff0000000000000,2
+np.float64,0x5adacf60b5b7,0x5adacf60b5b7,2
+np.float64,0x7fefb29b1cbf6535,0x3ff0000000000000,2
+np.float64,0xbfeadbf90175b7f2,0xbfe5ef55e2194794,2
+np.float64,0xeaad2885d55a5,0xeaad2885d55a5,2
+np.float64,0xffd7939fba2f2740,0xbff0000000000000,2
+np.float64,0x3fd187ea3aa30fd4,0x3fd11af023472386,2
+np.float64,0xbf6eb579c03d6b00,0xbf6eb57052f47019,2
+np.float64,0x3fefb67b3bff6cf6,0x3fe83fe4499969ac,2
+np.float64,0xbfe5183aacea3076,0xbfe27da1aa0b61a0,2
+np.float64,0xbfb83e47a2307c90,0xbfb82bcb0e12db42,2
+np.float64,0x80088849b1b11094,0x80088849b1b11094,2
+np.float64,0x800ceeed7399dddb,0x800ceeed7399dddb,2
+np.float64,0x80097cd90892f9b2,0x80097cd90892f9b2,2
+np.float64,0x7ec73feefd8e9,0x7ec73feefd8e9,2
+np.float64,0x7fe3291de5a6523b,0x3ff0000000000000,2
+np.float64,0xbfd537086daa6e10,0xbfd4787af5f60653,2
+np.float64,0x800e8ed4455d1da9,0x800e8ed4455d1da9,2
+np.float64,0x800ef8d19cbdf1a3,0x800ef8d19cbdf1a3,2
+np.float64,0x800dc4fa3a5b89f5,0x800dc4fa3a5b89f5,2
+np.float64,0xaa8b85cd55171,0xaa8b85cd55171,2
+np.float64,0xffd67a5f40acf4be,0xbff0000000000000,2
+np.float64,0xbfb7496db22e92d8,0xbfb7390a48130861,2
+np.float64,0x3fd86a8e7ab0d51d,0x3fd74bfba0f72616,2
+np.float64,0xffb7f5b7fc2feb70,0xbff0000000000000,2
+np.float64,0xbfea0960a7f412c1,0xbfe57db6d0ff4191,2
+np.float64,0x375f4fc26ebeb,0x375f4fc26ebeb,2
+np.float64,0x800c537e70b8a6fd,0x800c537e70b8a6fd,2
+np.float64,0x800b3f4506d67e8a,0x800b3f4506d67e8a,2
+np.float64,0x7fe61f2d592c3e5a,0x3ff0000000000000,2
+np.float64,0xffefffffffffffff,0xbff0000000000000,2
+np.float64,0x8005d0bb84eba178,0x8005d0bb84eba178,2
+np.float64,0x800c78b0ec18f162,0x800c78b0ec18f162,2
+np.float64,0xbfc42cccfb285998,0xbfc4027392f66b0d,2
+np.float64,0x3fd8fdc73fb1fb8e,0x3fd7cb46f928153f,2
+np.float64,0x800c71754298e2eb,0x800c71754298e2eb,2
+np.float64,0x3fe4aa7a96a954f5,0x3fe233f5d3bc1352,2
+np.float64,0x7fd53841f6aa7083,0x3ff0000000000000,2
+np.float64,0x3fd0a887b8a15110,0x3fd04ac3b9c0d1ca,2
+np.float64,0x8007b8e164cf71c4,0x8007b8e164cf71c4,2
+np.float64,0xbfddc35c66bb86b8,0xbfdbc9c5dddfb014,2
+np.float64,0x6a3756fed46eb,0x6a3756fed46eb,2
+np.float64,0xffd3dcd05527b9a0,0xbff0000000000000,2
+np.float64,0xbfd7dc75632fb8ea,0xbfd6d0538b340a98,2
+np.float64,0x17501f822ea05,0x17501f822ea05,2
+np.float64,0xbfe1f98b99a3f317,0xbfe04bbf8f8b6cb3,2
+np.float64,0x66ea65d2cdd4d,0x66ea65d2cdd4d,2
+np.float64,0xbfd12241e2224484,0xbfd0bc62f46ea5e1,2
+np.float64,0x3fed6e6fb3fadcdf,0x3fe7398249097285,2
+np.float64,0x3fe0b5ebeba16bd8,0x3fdeae84b3000a47,2
+np.float64,0x66d1bce8cda38,0x66d1bce8cda38,2
+np.float64,0x3fdd728db3bae51b,0x3fdb880f28c52713,2
+np.float64,0xffb45dbe5228bb80,0xbff0000000000000,2
+np.float64,0x1ff8990c3ff14,0x1ff8990c3ff14,2
+np.float64,0x800a68e8f294d1d2,0x800a68e8f294d1d2,2
+np.float64,0xbfe4d08b84a9a117,0xbfe24da40bff6be7,2
+np.float64,0x3fe0177f0ee02efe,0x3fddb83c5971df51,2
+np.float64,0xffc56893692ad128,0xbff0000000000000,2
+np.float64,0x51b44f6aa368b,0x51b44f6aa368b,2
+np.float64,0x2258ff4e44b21,0x2258ff4e44b21,2
+np.float64,0x3fe913649e7226c9,0x3fe4f3f119530f53,2
+np.float64,0xffe3767df766ecfc,0xbff0000000000000,2
+np.float64,0xbfe62ae12fec55c2,0xbfe33108f1f22a94,2
+np.float64,0x7fb6a6308e2d4c60,0x3ff0000000000000,2
+np.float64,0xbfe00f2085e01e41,0xbfddab19b6fc77d1,2
+np.float64,0x3fb66447dc2cc890,0x3fb655b4f46844f0,2
+np.float64,0x3fd80238f6b00470,0x3fd6f143be1617d6,2
+np.float64,0xbfd05bfeb3a0b7fe,0xbfd0031ab3455e15,2
+np.float64,0xffc3a50351274a08,0xbff0000000000000,2
+np.float64,0xffd8f4241cb1e848,0xbff0000000000000,2
+np.float64,0xbfca72a88c34e550,0xbfca13ebe85f2aca,2
+np.float64,0x3fd47d683ba8fad0,0x3fd3d13f1176ed8c,2
+np.float64,0x3fb6418e642c831d,0x3fb6333ebe479ff2,2
+np.float64,0x800fde8e023fbd1c,0x800fde8e023fbd1c,2
+np.float64,0x8001fb01e323f605,0x8001fb01e323f605,2
+np.float64,0x3febb21ff9f76440,0x3fe65ed788d52fee,2
+np.float64,0x3fe47553ffe8eaa8,0x3fe20fe01f853603,2
+np.float64,0x7fca20b3f9344167,0x3ff0000000000000,2
+np.float64,0x3fe704f4ec6e09ea,0x3fe3ba7277201805,2
+np.float64,0xf864359df0c87,0xf864359df0c87,2
+np.float64,0x4d96b01c9b2d7,0x4d96b01c9b2d7,2
+np.float64,0x3fe8a09fe9f14140,0x3fe4b1c6a2d2e095,2
+np.float64,0xffc46c61b228d8c4,0xbff0000000000000,2
+np.float64,0x3fe680a837ed0150,0x3fe3679d6eeb6485,2
+np.float64,0xbfecedc20f39db84,0xbfe6fbe9ee978bf6,2
+np.float64,0x3fb2314eae24629d,0x3fb2297ba6d55d2d,2
+np.float64,0x3fe9f0b8e7b3e172,0x3fe57026eae36db3,2
+np.float64,0x80097a132ed2f427,0x80097a132ed2f427,2
+np.float64,0x800ae5a41955cb49,0x800ae5a41955cb49,2
+np.float64,0xbfd7527279aea4e4,0xbfd6577de356e1bd,2
+np.float64,0x3fe27d3e01e4fa7c,0x3fe0ac7dd96f9179,2
+np.float64,0x7fedd8cb01bbb195,0x3ff0000000000000,2
+np.float64,0x78f8695af1f0e,0x78f8695af1f0e,2
+np.float64,0x800d2d0e927a5a1d,0x800d2d0e927a5a1d,2
+np.float64,0xffe74b46fb2e968e,0xbff0000000000000,2
+np.float64,0xbfdd12d4c8ba25aa,0xbfdb39dae49e1c10,2
+np.float64,0xbfd6c14710ad828e,0xbfd5d79ef5a8d921,2
+np.float64,0x921f4e55243ea,0x921f4e55243ea,2
+np.float64,0x800b4e4c80969c99,0x800b4e4c80969c99,2
+np.float64,0x7fe08c6ab7e118d4,0x3ff0000000000000,2
+np.float64,0xbfed290014fa5200,0xbfe71871f7e859ed,2
+np.float64,0x8008c1d5c59183ac,0x8008c1d5c59183ac,2
+np.float64,0x3fd339e68c2673cd,0x3fd2aaff3f165a9d,2
+np.float64,0xbfdd20d8113a41b0,0xbfdb4553ea2cb2fb,2
+np.float64,0x3fe52a25deea544c,0x3fe2898d5bf4442c,2
+np.float64,0x498602d4930c1,0x498602d4930c1,2
+np.float64,0x3fd8c450113188a0,0x3fd799b0b2a6c43c,2
+np.float64,0xbfd72bc2f2ae5786,0xbfd6357e15ba7f70,2
+np.float64,0xbfd076188ea0ec32,0xbfd01b8fce44d1af,2
+np.float64,0x9aace1713559c,0x9aace1713559c,2
+np.float64,0x8008a730e8914e62,0x8008a730e8914e62,2
+np.float64,0x7fe9e9a3d833d347,0x3ff0000000000000,2
+np.float64,0x800d3a0d69da741b,0x800d3a0d69da741b,2
+np.float64,0xbfe3e28a29e7c514,0xbfe1aad7643a2d19,2
+np.float64,0x7fe9894c71331298,0x3ff0000000000000,2
+np.float64,0xbfe7c6acb5ef8d5a,0xbfe430c9e258ce62,2
+np.float64,0xffb5a520a62b4a40,0xbff0000000000000,2
+np.float64,0x7fc02109ae204212,0x3ff0000000000000,2
+np.float64,0xb5c58f196b8b2,0xb5c58f196b8b2,2
+np.float64,0x3feb4ee82e769dd0,0x3fe62bae9a39d8b1,2
+np.float64,0x3fec5c3cf278b87a,0x3fe6b49000f12441,2
+np.float64,0x81f64b8103eca,0x81f64b8103eca,2
+np.float64,0xbfeab00d73f5601b,0xbfe5d7f755ab73d9,2
+np.float64,0x3fd016bf28a02d7e,0x3fcf843ea23bcd3c,2
+np.float64,0xbfa1db617423b6c0,0xbfa1d9872ddeb5a8,2
+np.float64,0x3fe83c879d70790f,0x3fe4771502d8f012,2
+np.float64,0x6b267586d64cf,0x6b267586d64cf,2
+np.float64,0x3fc91b6d3f3236d8,0x3fc8ca3eb4da25a9,2
+np.float64,0x7fd4e3f8f3a9c7f1,0x3ff0000000000000,2
+np.float64,0x800a75899214eb14,0x800a75899214eb14,2
+np.float64,0x7fdb1f2e07b63e5b,0x3ff0000000000000,2
+np.float64,0xffe7805a11ef00b4,0xbff0000000000000,2
+np.float64,0x3fc8e1b88a31c371,0x3fc892af45330818,2
+np.float64,0xbfe809fe447013fc,0xbfe45918f07da4d9,2
+np.float64,0xbfeb9d7f2ab73afe,0xbfe65446bfddc792,2
+np.float64,0x3fb47f0a5c28fe15,0x3fb473db9113e880,2
+np.float64,0x800a17ae3cb42f5d,0x800a17ae3cb42f5d,2
+np.float64,0xf5540945eaa81,0xf5540945eaa81,2
+np.float64,0xbfe577fc26aaeff8,0xbfe2bcfbf2cf69ff,2
+np.float64,0xbfb99b3e06333680,0xbfb98577b88e0515,2
+np.float64,0x7fd9290391b25206,0x3ff0000000000000,2
+np.float64,0x7fe1aa62ffa354c5,0x3ff0000000000000,2
+np.float64,0x7b0189a0f604,0x7b0189a0f604,2
+np.float64,0x3f9000ed602001db,0x3f900097fe168105,2
+np.float64,0x3fd576128d2aec25,0x3fd4b1002c92286f,2
+np.float64,0xffecc98ece79931d,0xbff0000000000000,2
+np.float64,0x800a1736c7f42e6e,0x800a1736c7f42e6e,2
+np.float64,0xbfed947548bb28eb,0xbfe74b71479ae739,2
+np.float64,0xa45c032148b9,0xa45c032148b9,2
+np.float64,0xbfc13d011c227a04,0xbfc1228447de5e9f,2
+np.float64,0xffed8baa6ebb1754,0xbff0000000000000,2
+np.float64,0x800ea2de243d45bc,0x800ea2de243d45bc,2
+np.float64,0x8001396be52272d9,0x8001396be52272d9,2
+np.float64,0xd018d1cda031a,0xd018d1cda031a,2
+np.float64,0x7fe1fece1fe3fd9b,0x3ff0000000000000,2
+np.float64,0x8009ac484c135891,0x8009ac484c135891,2
+np.float64,0x3fc560ad132ac15a,0x3fc52e5a9479f08e,2
+np.float64,0x3fd6f80ebe2df01d,0x3fd607f70ce8e3f4,2
+np.float64,0xbfd3e69e82a7cd3e,0xbfd34887c2a40699,2
+np.float64,0x3fe232d9baa465b3,0x3fe0760a822ada0c,2
+np.float64,0x3fe769bbc6eed378,0x3fe3f872680f6631,2
+np.float64,0xffe63dbd952c7b7a,0xbff0000000000000,2
+np.float64,0x4e0c00da9c181,0x4e0c00da9c181,2
+np.float64,0xffeae4d89735c9b0,0xbff0000000000000,2
+np.float64,0x3fe030bcbb606179,0x3fdddfc66660bfce,2
+np.float64,0x7fe35ca40d66b947,0x3ff0000000000000,2
+np.float64,0xbfd45bd66628b7ac,0xbfd3b2e04bfe7866,2
+np.float64,0x3fd1f0be2323e17c,0x3fd17c1c340d7a48,2
+np.float64,0x3fd7123b6cae2478,0x3fd61f0675aa9ae1,2
+np.float64,0xbfe918a377723147,0xbfe4f6efe66f5714,2
+np.float64,0x7fc400356f28006a,0x3ff0000000000000,2
+np.float64,0x7fd2dead70a5bd5a,0x3ff0000000000000,2
+np.float64,0xffe9c28f81f3851e,0xbff0000000000000,2
+np.float64,0x3fd09b1ec7a1363e,0x3fd03e3894320140,2
+np.float64,0x7fe6e80c646dd018,0x3ff0000000000000,2
+np.float64,0x7fec3760a4786ec0,0x3ff0000000000000,2
+np.float64,0x309eb6ee613d8,0x309eb6ee613d8,2
+np.float64,0x800731cb0ece6397,0x800731cb0ece6397,2
+np.float64,0xbfdb0c553db618aa,0xbfd98b8a4680ee60,2
+np.float64,0x3fd603a52eac074c,0x3fd52f6b53de7455,2
+np.float64,0x9ecb821b3d971,0x9ecb821b3d971,2
+np.float64,0x3feb7d64dc36faca,0x3fe643c2754bb7f4,2
+np.float64,0xffeb94825ef72904,0xbff0000000000000,2
+np.float64,0x24267418484cf,0x24267418484cf,2
+np.float64,0xbfa6b2fbac2d65f0,0xbfa6af2dca5bfa6f,2
+np.float64,0x8010000000000000,0x8010000000000000,2
+np.float64,0xffe6873978ed0e72,0xbff0000000000000,2
+np.float64,0x800447934ba88f27,0x800447934ba88f27,2
+np.float64,0x3fef305f09fe60be,0x3fe806156b8ca47c,2
+np.float64,0xffd441c697a8838e,0xbff0000000000000,2
+np.float64,0xbfa7684f6c2ed0a0,0xbfa764238d34830c,2
+np.float64,0xffb2c976142592f0,0xbff0000000000000,2
+np.float64,0xbfcc9d1585393a2c,0xbfcc25756bcbca1f,2
+np.float64,0xbfd477bb1ba8ef76,0xbfd3cc1d2114e77e,2
+np.float64,0xbfed1559983a2ab3,0xbfe70f03afd994ee,2
+np.float64,0xbfeb51139036a227,0xbfe62ccf56bc7fff,2
+np.float64,0x7d802890fb006,0x7d802890fb006,2
+np.float64,0x800e00af777c015f,0x800e00af777c015f,2
+np.float64,0x800647ce128c8f9d,0x800647ce128c8f9d,2
+np.float64,0x800a26da91d44db6,0x800a26da91d44db6,2
+np.float64,0x3fdc727eddb8e4fe,0x3fdab5fd9db630b3,2
+np.float64,0x7fd06def2ba0dbdd,0x3ff0000000000000,2
+np.float64,0xffe23678c4a46cf1,0xbff0000000000000,2
+np.float64,0xbfe7198e42ee331c,0xbfe3c7326c9c7553,2
+np.float64,0xffae465f3c3c8cc0,0xbff0000000000000,2
+np.float64,0xff9aea7c5035d500,0xbff0000000000000,2
+np.float64,0xbfeae49c0f35c938,0xbfe5f3e9326cb08b,2
+np.float64,0x3f9a16f300342de6,0x3f9a1581212be50f,2
+np.float64,0x8d99e2c31b33d,0x8d99e2c31b33d,2
+np.float64,0xffd58af253ab15e4,0xbff0000000000000,2
+np.float64,0xbfd205cd25a40b9a,0xbfd18f97155f8b25,2
+np.float64,0xbfebe839bbf7d074,0xbfe67a6024e8fefe,2
+np.float64,0xbfe4fb3595a9f66b,0xbfe26a42f99819ea,2
+np.float64,0x800e867c739d0cf9,0x800e867c739d0cf9,2
+np.float64,0x8bc4274f17885,0x8bc4274f17885,2
+np.float64,0xaec8914b5d912,0xaec8914b5d912,2
+np.float64,0x7fd1d64473a3ac88,0x3ff0000000000000,2
+np.float64,0xbfe6d6f69cedaded,0xbfe39dd61bc7e23e,2
+np.float64,0x7fed05039d7a0a06,0x3ff0000000000000,2
+np.float64,0xbfc40eab0f281d58,0xbfc3e50d14b79265,2
+np.float64,0x45179aec8a2f4,0x45179aec8a2f4,2
+np.float64,0xbfe717e362ee2fc7,0xbfe3c62a95b07d13,2
+np.float64,0xbfe5b8df0d6b71be,0xbfe2e76c7ec5013d,2
+np.float64,0x5c67ba6eb8cf8,0x5c67ba6eb8cf8,2
+np.float64,0xbfda72ce4cb4e59c,0xbfd909fdc7ecfe20,2
+np.float64,0x7fdf59a1e2beb343,0x3ff0000000000000,2
+np.float64,0xc4f7897f89ef1,0xc4f7897f89ef1,2
+np.float64,0x8fcd0a351f9a2,0x8fcd0a351f9a2,2
+np.float64,0x3fb161761022c2ec,0x3fb15aa31c464de2,2
+np.float64,0x8008a985be71530c,0x8008a985be71530c,2
+np.float64,0x3fca4ddb5e349bb7,0x3fc9f0a3b60e49c6,2
+np.float64,0x7fcc10a2d9382145,0x3ff0000000000000,2
+np.float64,0x78902b3af1206,0x78902b3af1206,2
+np.float64,0x7fe1e2765f23c4ec,0x3ff0000000000000,2
+np.float64,0xc1d288cf83a51,0xc1d288cf83a51,2
+np.float64,0x7fe8af692bb15ed1,0x3ff0000000000000,2
+np.float64,0x80057d90fb8afb23,0x80057d90fb8afb23,2
+np.float64,0x3fdc136b8fb826d8,0x3fda6749582b2115,2
+np.float64,0x800ec8ea477d91d5,0x800ec8ea477d91d5,2
+np.float64,0x4c0f4796981ea,0x4c0f4796981ea,2
+np.float64,0xec34c4a5d8699,0xec34c4a5d8699,2
+np.float64,0x7fce343dfb3c687b,0x3ff0000000000000,2
+np.float64,0xbfc95a98a332b530,0xbfc90705b2cc2fec,2
+np.float64,0x800d118e1dba231c,0x800d118e1dba231c,2
+np.float64,0x3fd354f310a6a9e8,0x3fd2c3bb90054154,2
+np.float64,0xbfdac0d4fab581aa,0xbfd94bf37424928e,2
+np.float64,0x3fe7f5391fefea72,0x3fe44cb49d51985b,2
+np.float64,0xd4c3c329a9879,0xd4c3c329a9879,2
+np.float64,0x3fc53977692a72f0,0x3fc50835d85c9ed1,2
+np.float64,0xbfd6989538ad312a,0xbfd5b3a2c08511fe,2
+np.float64,0xbfe329f2906653e5,0xbfe128ec1525a1c0,2
+np.float64,0x7ff0000000000000,0x3ff0000000000000,2
+np.float64,0xbfea57c90974af92,0xbfe5a87b04aa3116,2
+np.float64,0x7fdfba94043f7527,0x3ff0000000000000,2
+np.float64,0x3feedabddafdb57c,0x3fe7e06c0661978d,2
+np.float64,0x4bd9f3b697b3f,0x4bd9f3b697b3f,2
+np.float64,0x3fdd15bbfc3a2b78,0x3fdb3c3b8d070f7e,2
+np.float64,0x3fbd89ccd23b13a0,0x3fbd686b825cff80,2
+np.float64,0x7ff4000000000000,0x7ffc000000000000,2
+np.float64,0x3f9baa8928375512,0x3f9ba8d01ddd5300,2
+np.float64,0x4a3ebdf2947d8,0x4a3ebdf2947d8,2
+np.float64,0x3fe698d5c06d31ac,0x3fe376dff48312c8,2
+np.float64,0xffd5323df12a647c,0xbff0000000000000,2
+np.float64,0xffea7f111174fe22,0xbff0000000000000,2
+np.float64,0x3feb4656a9b68cad,0x3fe627392eb2156f,2
+np.float64,0x7fc1260e9c224c1c,0x3ff0000000000000,2
+np.float64,0x80056e45e5eadc8d,0x80056e45e5eadc8d,2
+np.float64,0x7fd0958ef6a12b1d,0x3ff0000000000000,2
+np.float64,0x8001f85664e3f0ae,0x8001f85664e3f0ae,2
+np.float64,0x3fe553853beaa70a,0x3fe2a4f5e7c83558,2
+np.float64,0xbfeb33ce6276679d,0xbfe61d8ec9e5ff8c,2
+np.float64,0xbfd1b24e21a3649c,0xbfd14245df6065e9,2
+np.float64,0x3fe286fc40650df9,0x3fe0b395c8059429,2
+np.float64,0xffed378058fa6f00,0xbff0000000000000,2
+np.float64,0xbfd0c4a2d7a18946,0xbfd06509a434d6a0,2
+np.float64,0xbfea31d581f463ab,0xbfe593d976139f94,2
+np.float64,0xbfe0705c85e0e0b9,0xbfde42efa978eb0c,2
+np.float64,0xe4c4c339c9899,0xe4c4c339c9899,2
+np.float64,0x3fd68befa9ad17df,0x3fd5a870b3f1f83e,2
+np.float64,0x8000000000000001,0x8000000000000001,2
+np.float64,0x3fe294256965284b,0x3fe0bd271e22d86b,2
+np.float64,0x8005327a862a64f6,0x8005327a862a64f6,2
+np.float64,0xbfdb8155ce3702ac,0xbfd9ed9ef97920f8,2
+np.float64,0xbff0000000000000,0xbfe85efab514f394,2
+np.float64,0xffe66988f1ecd312,0xbff0000000000000,2
+np.float64,0x3fb178a85e22f150,0x3fb171b9fbf95f1d,2
+np.float64,0x7f829b900025371f,0x3ff0000000000000,2
+np.float64,0x8000000000000000,0x8000000000000000,2
+np.float64,0x8006cb77f60d96f1,0x8006cb77f60d96f1,2
+np.float64,0x3fe0c5d53aa18baa,0x3fdec7012ab92b42,2
+np.float64,0x77266426ee4cd,0x77266426ee4cd,2
+np.float64,0xbfec95f468392be9,0xbfe6d11428f60136,2
+np.float64,0x3fedbf532dfb7ea6,0x3fe75f8436dd1d58,2
+np.float64,0x8002fadd3f85f5bb,0x8002fadd3f85f5bb,2
+np.float64,0xbfefebaa8d3fd755,0xbfe8566c6aa90fba,2
+np.float64,0xffc7dd2b712fba58,0xbff0000000000000,2
+np.float64,0x7fe5d3a6e8aba74d,0x3ff0000000000000,2
+np.float64,0x2da061525b40d,0x2da061525b40d,2
+np.float64,0x7fcb9b9953373732,0x3ff0000000000000,2
+np.float64,0x2ca2f6fc59460,0x2ca2f6fc59460,2
+np.float64,0xffeb84b05af70960,0xbff0000000000000,2
+np.float64,0xffe551e86c6aa3d0,0xbff0000000000000,2
+np.float64,0xbfdb311311366226,0xbfd9aa6688faafb9,2
+np.float64,0xbfd4f3875629e70e,0xbfd43bcd73534c66,2
+np.float64,0x7fe95666f932accd,0x3ff0000000000000,2
+np.float64,0x3fc73dfb482e7bf7,0x3fc6fd70c20ebf60,2
+np.float64,0x800cd9e40939b3c8,0x800cd9e40939b3c8,2
+np.float64,0x3fb0c9fa422193f0,0x3fb0c3d38879a2ac,2
+np.float64,0xffd59a38372b3470,0xbff0000000000000,2
+np.float64,0x3fa8320ef4306420,0x3fa82d739e937d35,2
+np.float64,0x3fd517f16caa2fe4,0x3fd45c8de1e93b37,2
+np.float64,0xaed921655db24,0xaed921655db24,2
+np.float64,0x93478fb9268f2,0x93478fb9268f2,2
+np.float64,0x1615e28a2c2bd,0x1615e28a2c2bd,2
+np.float64,0xbfead23010f5a460,0xbfe5ea24d5d8f820,2
+np.float64,0x774a6070ee94d,0x774a6070ee94d,2
+np.float64,0x3fdf5874bd3eb0e9,0x3fdd0ef121dd915c,2
+np.float64,0x8004b25f53a964bf,0x8004b25f53a964bf,2
+np.float64,0xbfddacdd2ebb59ba,0xbfdbb78198fab36b,2
+np.float64,0x8008a3acf271475a,0x8008a3acf271475a,2
+np.float64,0xbfdb537c8736a6fa,0xbfd9c741038bb8f0,2
+np.float64,0xbfe56a133f6ad426,0xbfe2b3d5b8d259a1,2
+np.float64,0xffda1db531343b6a,0xbff0000000000000,2
+np.float64,0x3fcbe05f3a37c0be,0x3fcb71a54a64ddfb,2
+np.float64,0x7fe1ccaa7da39954,0x3ff0000000000000,2
+np.float64,0x3faeadd8343d5bb0,0x3faea475608860e6,2
+np.float64,0x3fe662ba1c2cc574,0x3fe354a6176e90df,2
+np.float64,0xffe4d49f4e69a93e,0xbff0000000000000,2
+np.float64,0xbfeadbc424f5b788,0xbfe5ef39dbe66343,2
+np.float64,0x99cf66f1339ed,0x99cf66f1339ed,2
+np.float64,0x33af77a2675f0,0x33af77a2675f0,2
+np.float64,0x7fec7b32ecf8f665,0x3ff0000000000000,2
+np.float64,0xffef3e44993e7c88,0xbff0000000000000,2
+np.float64,0xffe8f8ceac31f19c,0xbff0000000000000,2
+np.float64,0x7fe0d15b6da1a2b6,0x3ff0000000000000,2
+np.float64,0x4ba795c2974f3,0x4ba795c2974f3,2
+np.float64,0x3fe361aa37a6c354,0x3fe15079021d6b15,2
+np.float64,0xffe709714f6e12e2,0xbff0000000000000,2
+np.float64,0xffe7ea6a872fd4d4,0xbff0000000000000,2
+np.float64,0xffdb9441c8b72884,0xbff0000000000000,2
+np.float64,0xffd5e11ae9abc236,0xbff0000000000000,2
+np.float64,0xffe092a08b612540,0xbff0000000000000,2
+np.float64,0x3fe1f27e1ca3e4fc,0x3fe04685b5131207,2
+np.float64,0xbfe71ce1bdee39c4,0xbfe3c940809a7081,2
+np.float64,0xffe8c3aa68318754,0xbff0000000000000,2
+np.float64,0x800d4e2919da9c52,0x800d4e2919da9c52,2
+np.float64,0x7fe6c8bca76d9178,0x3ff0000000000000,2
+np.float64,0x7fced8751e3db0e9,0x3ff0000000000000,2
+np.float64,0xd61d0c8bac3a2,0xd61d0c8bac3a2,2
+np.float64,0x3fec57732938aee6,0x3fe6b22f15f38352,2
+np.float64,0xff9251cc7024a3a0,0xbff0000000000000,2
+np.float64,0xf4a68cb9e94d2,0xf4a68cb9e94d2,2
+np.float64,0x3feed76703bdaece,0x3fe7def0fc9a080c,2
+np.float64,0xbfe8971ff7712e40,0xbfe4ac3eb8ebff07,2
+np.float64,0x3fe4825f682904bf,0x3fe218c1952fe67d,2
+np.float64,0xbfd60f7698ac1eee,0xbfd539f0979b4b0c,2
+np.float64,0x3fcf0845993e1088,0x3fce7032f7180144,2
+np.float64,0x7fc83443f3306887,0x3ff0000000000000,2
+np.float64,0x3fe93123ae726247,0x3fe504e4fc437e89,2
+np.float64,0x3fbf9eb8363f3d70,0x3fbf75cdfa6828d5,2
+np.float64,0xbf8b45e5d0368bc0,0xbf8b457c29dfe1a9,2
+np.float64,0x8006c2853d0d850b,0x8006c2853d0d850b,2
+np.float64,0xffef26e25ffe4dc4,0xbff0000000000000,2
+np.float64,0x7fefffffffffffff,0x3ff0000000000000,2
+np.float64,0xbfde98f2c2bd31e6,0xbfdc761bfab1c4cb,2
+np.float64,0xffb725e6222e4bd0,0xbff0000000000000,2
+np.float64,0x800c63ead5d8c7d6,0x800c63ead5d8c7d6,2
+np.float64,0x3fea087e95f410fd,0x3fe57d3ab440706c,2
+np.float64,0xbfdf9f8a603f3f14,0xbfdd4742d77dfa57,2
+np.float64,0xfff0000000000000,0xbff0000000000000,2
+np.float64,0xbfcdc0841d3b8108,0xbfcd3a401debba9a,2
+np.float64,0x800f0c8f4f7e191f,0x800f0c8f4f7e191f,2
+np.float64,0x800ba6e75fd74dcf,0x800ba6e75fd74dcf,2
+np.float64,0x7fee4927e8bc924f,0x3ff0000000000000,2
+np.float64,0x3fadf141903be283,0x3fade8878d9d3551,2
+np.float64,0x3efb1a267df64,0x3efb1a267df64,2
+np.float64,0xffebf55f22b7eabe,0xbff0000000000000,2
+np.float64,0x7fbe8045663d008a,0x3ff0000000000000,2
+np.float64,0x3fefc0129f7f8026,0x3fe843f8b7d6cf38,2
+np.float64,0xbfe846b420f08d68,0xbfe47d1709e43937,2
+np.float64,0x7fe8e87043f1d0e0,0x3ff0000000000000,2
+np.float64,0x3fcfb718453f6e31,0x3fcf14ecee7b32b4,2
+np.float64,0x7fe4306b71a860d6,0x3ff0000000000000,2
+np.float64,0x7fee08459f7c108a,0x3ff0000000000000,2
+np.float64,0x3fed705165fae0a3,0x3fe73a66369c5700,2
+np.float64,0x7fd0e63f4da1cc7e,0x3ff0000000000000,2
+np.float64,0xffd1a40c2ea34818,0xbff0000000000000,2
+np.float64,0xbfa369795c26d2f0,0xbfa36718218d46b3,2
+np.float64,0xef70b9f5dee17,0xef70b9f5dee17,2
+np.float64,0x3fb50a0a6e2a1410,0x3fb4fdf27724560a,2
+np.float64,0x7fe30a0f6166141e,0x3ff0000000000000,2
+np.float64,0xbfd7b3ca7daf6794,0xbfd6accb81032b2d,2
+np.float64,0x3fc21dceb3243b9d,0x3fc1ff15d5d277a3,2
+np.float64,0x3fe483e445a907c9,0x3fe219ca0e269552,2
+np.float64,0x3fb2b1e2a22563c0,0x3fb2a96554900eaf,2
+np.float64,0x4b1ff6409641,0x4b1ff6409641,2
+np.float64,0xbfd92eabc9b25d58,0xbfd7f55d7776d64e,2
+np.float64,0x8003b8604c8770c1,0x8003b8604c8770c1,2
+np.float64,0x800d20a9df1a4154,0x800d20a9df1a4154,2
+np.float64,0xecf8a535d9f15,0xecf8a535d9f15,2
+np.float64,0x3fe92d15bab25a2b,0x3fe50296aa15ae85,2
+np.float64,0x800239c205a47385,0x800239c205a47385,2
+np.float64,0x3fc48664a9290cc8,0x3fc459d126320ef6,2
+np.float64,0x3fe7620625eec40c,0x3fe3f3bcbee3e8c6,2
+np.float64,0x3fd242ff4ca48600,0x3fd1c81ed7a971c8,2
+np.float64,0xbfe39bafcfa73760,0xbfe17959c7a279db,2
+np.float64,0x7fdcd2567239a4ac,0x3ff0000000000000,2
+np.float64,0x3fe5f2f292ebe5e6,0x3fe30d12f05e2752,2
+np.float64,0x7fda3819d1347033,0x3ff0000000000000,2
+np.float64,0xffca5b4d4334b69c,0xbff0000000000000,2
+np.float64,0xb8a2b7cd71457,0xb8a2b7cd71457,2
+np.float64,0x3fee689603fcd12c,0x3fe7ad4ace26d6dd,2
+np.float64,0x7fe26541a564ca82,0x3ff0000000000000,2
+np.float64,0x3fe6912ee66d225e,0x3fe3720d242c4d82,2
+np.float64,0xffe6580c75ecb018,0xbff0000000000000,2
+np.float64,0x7fe01a3370603466,0x3ff0000000000000,2
+np.float64,0xffe84e3f84b09c7e,0xbff0000000000000,2
+np.float64,0x3ff0000000000000,0x3fe85efab514f394,2
+np.float64,0x3fe214d4266429a8,0x3fe05fec03a3c247,2
+np.float64,0x3fd00aec5da015d8,0x3fcf6e070ad4ad62,2
+np.float64,0x800aac8631f5590d,0x800aac8631f5590d,2
+np.float64,0xbfe7c4f5f76f89ec,0xbfe42fc1c57b4a13,2
+np.float64,0xaf146c7d5e28e,0xaf146c7d5e28e,2
+np.float64,0xbfe57188b66ae312,0xbfe2b8be4615ef75,2
+np.float64,0xffef8cb8e1ff1971,0xbff0000000000000,2
+np.float64,0x8001daf8aa63b5f2,0x8001daf8aa63b5f2,2
+np.float64,0x3fdddcc339bbb986,0x3fdbde5f3783538b,2
+np.float64,0xdd8c92c3bb193,0xdd8c92c3bb193,2
+np.float64,0xbfe861a148f0c342,0xbfe48cf1d228a336,2
+np.float64,0xffe260a32e24c146,0xbff0000000000000,2
+np.float64,0x1f7474b43ee8f,0x1f7474b43ee8f,2
+np.float64,0x3fe81dbd89703b7c,0x3fe464d78df92b7b,2
+np.float64,0x7fed0101177a0201,0x3ff0000000000000,2
+np.float64,0x7fd8b419a8316832,0x3ff0000000000000,2
+np.float64,0x3fe93debccf27bd8,0x3fe50c27727917f0,2
+np.float64,0xe5ead05bcbd5a,0xe5ead05bcbd5a,2
+np.float64,0xbfebbbc4cff7778a,0xbfe663c4ca003bbf,2
+np.float64,0xbfea343eb474687e,0xbfe59529f73ea151,2
+np.float64,0x3fbe74a5963ce94b,0x3fbe50123ed05d8d,2
+np.float64,0x3fd31d3a5d263a75,0x3fd290c026cb38a5,2
+np.float64,0xbfd79908acaf3212,0xbfd695620e31c3c6,2
+np.float64,0xbfc26a350324d46c,0xbfc249f335f3e465,2
+np.float64,0xbfac38d5583871b0,0xbfac31866d12a45e,2
+np.float64,0x3fe40cea672819d5,0x3fe1c83754e72c92,2
+np.float64,0xbfa74770642e8ee0,0xbfa74355fcf67332,2
+np.float64,0x7fc60942d32c1285,0x3ff0000000000000,2
index 51c056936fd4f145e65440a96167c4f91cfcca7c..10b87e052b385e5ee3f95e5f383f4923043c3ba3 100644 (file)
@@ -4,6 +4,7 @@ Tests of the ._exceptions module. Primarily for exercising the __str__ methods.
 
 import pickle
 
+import pytest
 import numpy as np
 
 _ArrayMemoryError = np.core._exceptions._ArrayMemoryError
@@ -39,7 +40,7 @@ class TestArrayMemoryError:
         # 1023.9999 Mib should round to 1 GiB
         assert f(int(Ki*Ki*Ki*0.9999)) == '1.00 GiB'
         assert f(Ki*Ki*Ki*Ki*Ki*Ki) == '1.00 EiB'
-        # larger than sys.maxsize, adding larger prefices isn't going to help
+        # larger than sys.maxsize, adding larger prefixes isn't going to help
         # anyway.
         assert f(Ki*Ki*Ki*Ki*Ki*Ki*123456) == '123456. EiB'
 
@@ -56,3 +57,32 @@ class TestUFuncNoLoopError:
     def test_pickling(self):
         """ Test that _UFuncNoLoopError can be pickled """
         assert isinstance(pickle.dumps(_UFuncNoLoopError), bytes)
+
+
+@pytest.mark.parametrize("args", [
+    (2, 1, None),
+    (2, 1, "test_prefix"),
+    ("test message",),
+])
+class TestAxisError:
+    def test_attr(self, args):
+        """Validate attribute types."""
+        exc = np.AxisError(*args)
+        if len(args) == 1:
+            assert exc.axis is None
+            assert exc.ndim is None
+        else:
+            axis, ndim, *_ = args
+            assert exc.axis == axis
+            assert exc.ndim == ndim
+
+    def test_pickling(self, args):
+        """Test that `AxisError` can be pickled."""
+        exc = np.AxisError(*args)
+        exc2 = pickle.loads(pickle.dumps(exc))
+
+        assert type(exc) is type(exc2)
+        for name in ("axis", "ndim", "args"):
+            attr1 = getattr(exc, name)
+            attr2 = getattr(exc2, name)
+            assert attr1 == attr2, name
index 291cdae8908fbc0fbca28a159ed9d875a588c7df..d3c7211cd1b95059b0603c4e44a11a242a3f5211 100644 (file)
@@ -598,3 +598,31 @@ def test_broadcast_arrays():
 def test_full_from_list(shape, fill_value, expected_output):
     output = np.full(shape, fill_value)
     assert_equal(output, expected_output)
+
+def test_astype_copyflag():
+    # test the various copyflag options
+    arr = np.arange(10, dtype=np.intp)
+
+    res_true = arr.astype(np.intp, copy=True)
+    assert not np.may_share_memory(arr, res_true)
+    res_always = arr.astype(np.intp, copy=np._CopyMode.ALWAYS)
+    assert not np.may_share_memory(arr, res_always)
+
+    res_false = arr.astype(np.intp, copy=False)
+    # `res_false is arr` currently, but check `may_share_memory`.
+    assert np.may_share_memory(arr, res_false)
+    res_if_needed = arr.astype(np.intp, copy=np._CopyMode.IF_NEEDED)
+    # `res_if_needed is arr` currently, but check `may_share_memory`.
+    assert np.may_share_memory(arr, res_if_needed)
+
+    res_never = arr.astype(np.intp, copy=np._CopyMode.NEVER)
+    assert np.may_share_memory(arr, res_never)
+
+    # Simple tests for when a copy is necessary:
+    res_false = arr.astype(np.float64, copy=False)
+    assert_array_equal(res_false, arr)
+    res_if_needed = arr.astype(np.float64, 
+                               copy=np._CopyMode.IF_NEEDED)
+    assert_array_equal(res_if_needed, arr)
+    assert_raises(ValueError, arr.astype, np.float64,
+                  copy=np._CopyMode.NEVER)
index 45c792ad2392a35b7cdd4373ffa5194cbec46fb4..293f5a68f8e6d8480cd086db4d25aca21ce459db 100644 (file)
@@ -342,6 +342,20 @@ class TestScalarDiscovery:
             ass[()] = scalar
             assert_array_equal(ass, cast)
 
+    @pytest.mark.parametrize("pyscalar", [10, 10.32, 10.14j, 10**100])
+    def test_pyscalar_subclasses(self, pyscalar):
+        """NumPy arrays are read/write which means that anything but invariant
+        behaviour is on thin ice.  However, we currently are happy to discover
+        subclasses of Python float, int, complex the same as the base classes.
+        This should potentially be deprecated.
+        """
+        class MyScalar(type(pyscalar)):
+            pass
+
+        res = np.array(MyScalar(pyscalar))
+        expected = np.array(pyscalar)
+        assert_array_equal(res, expected)
+
     @pytest.mark.parametrize("dtype_char", np.typecodes["All"])
     def test_default_dtype_instance(self, dtype_char):
         if dtype_char in "SU":
@@ -362,7 +376,7 @@ class TestScalarDiscovery:
     def test_scalar_to_int_coerce_does_not_cast(self, dtype):
         """
         Signed integers are currently different in that they do not cast other
-        NumPy scalar, but instead use scalar.__int__(). The harcoded
+        NumPy scalar, but instead use scalar.__int__(). The hardcoded
         exception to this rule is `np.array(scalar, dtype=integer)`.
         """
         dtype = np.dtype(dtype)
@@ -430,7 +444,7 @@ class TestTimeScalars:
         # never use casting.  This is because casting will error in this
         # case, and traditionally in most cases the behaviour is maintained
         # like this.  (`np.array(scalar, dtype="U6")` would have failed before)
-        # TODO: This discrepency _should_ be resolved, either by relaxing the
+        # TODO: This discrepancy _should_ be resolved, either by relaxing the
         #       cast, or by deprecating the first part.
         scalar = np.datetime64(val, unit)
         dtype = np.dtype(dtype)
index b1bc79b80a631129ac070f224f4d29314418ae90..49aa9f6dfcfa457d25777c1caac93f10c6906df8 100644 (file)
@@ -3,6 +3,10 @@ This file tests the generic aspects of ArrayMethod.  At the time of writing
 this is private API, but when added, public API may be added here.
 """
 
+import sys
+import types
+from typing import Any, Type
+
 import pytest
 
 import numpy as np
@@ -56,3 +60,35 @@ class TestSimpleStridedCall:
         # This is private API, which may be modified freely
         with pytest.raises(error):
             self.method._simple_strided_call(*args)
+
+
+@pytest.mark.skipif(sys.version_info < (3, 9), reason="Requires python 3.9")
+class TestClassGetItem:
+    @pytest.mark.parametrize(
+        "cls", [np.ndarray, np.recarray, np.chararray, np.matrix, np.memmap]
+    )
+    def test_class_getitem(self, cls: Type[np.ndarray]) -> None:
+        """Test `ndarray.__class_getitem__`."""
+        alias = cls[Any, Any]
+        assert isinstance(alias, types.GenericAlias)
+        assert alias.__origin__ is cls
+
+    @pytest.mark.parametrize("arg_len", range(4))
+    def test_subscript_tuple(self, arg_len: int) -> None:
+        arg_tup = (Any,) * arg_len
+        if arg_len == 2:
+            assert np.ndarray[arg_tup]
+        else:
+            with pytest.raises(TypeError):
+                np.ndarray[arg_tup]
+
+    def test_subscript_scalar(self) -> None:
+        with pytest.raises(TypeError):
+            np.ndarray[Any]
+
+
+@pytest.mark.skipif(sys.version_info >= (3, 9), reason="Requires python 3.8")
+def test_class_getitem_38() -> None:
+    match = "Type subscription requires python >= 3.9"
+    with pytest.raises(TypeError, match=match):
+        np.ndarray[Any, Any]
index 09cc79f72f074a80d7e864a9e9ed06a653784a75..25826d8eda3c2cc057b9b0a87a44875d370de217 100644 (file)
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 import sys
 import gc
 from hypothesis import given
index 8398b3cad1f05608349dbf2eb7f43b053a28ea43..cb479209030bd37c0961d09a3f4370cb73779744 100644 (file)
@@ -9,7 +9,6 @@ than integration tests.
 import pytest
 import textwrap
 import enum
-import itertools
 import random
 
 import numpy as np
@@ -127,7 +126,7 @@ CAST_TABLE = _get_cancast_table()
 
 class TestChanges:
     """
-    These test cases excercise some behaviour changes
+    These test cases exercise some behaviour changes
     """
     @pytest.mark.parametrize("string", ["S", "U"])
     @pytest.mark.parametrize("floating", ["e", "f", "d", "g"])
@@ -650,6 +649,30 @@ class TestCasting:
                     match="casting from object to the parametric DType"):
             cast._resolve_descriptors((np.dtype("O"), None))
 
+    @pytest.mark.parametrize("dtype", simple_dtype_instances())
+    def test_object_and_simple_resolution(self, dtype):
+        # Simple test to exercise the cast when no instance is specified
+        object_dtype = type(np.dtype(object))
+        cast = get_castingimpl(object_dtype, type(dtype))
+
+        safety, (_, res_dt) = cast._resolve_descriptors((np.dtype("O"), dtype))
+        assert safety == Casting.unsafe
+        assert res_dt is dtype
+
+        safety, (_, res_dt) = cast._resolve_descriptors((np.dtype("O"), None))
+        assert safety == Casting.unsafe
+        assert res_dt == dtype.newbyteorder("=")
+
+    @pytest.mark.parametrize("dtype", simple_dtype_instances())
+    def test_simple_to_object_resolution(self, dtype):
+        # Simple test to exercise the cast when no instance is specified
+        object_dtype = type(np.dtype(object))
+        cast = get_castingimpl(type(dtype), object_dtype)
+
+        safety, (_, res_dt) = cast._resolve_descriptors((dtype, None))
+        assert safety == Casting.safe
+        assert res_dt is np.dtype("O")
+
     @pytest.mark.parametrize("casting", ["no", "unsafe"])
     def test_void_and_structured_with_subarray(self, casting):
         # test case corresponding to gh-19325
@@ -671,6 +694,18 @@ class TestCasting:
             expected = arr_normal.astype(dtype)
         except TypeError:
             with pytest.raises(TypeError):
-                arr_NULLs.astype(dtype)
+                arr_NULLs.astype(dtype),
         else:
             assert_array_equal(expected, arr_NULLs.astype(dtype))
+
+    @pytest.mark.parametrize("dtype",
+            np.typecodes["AllInteger"] + np.typecodes["AllFloat"])
+    def test_nonstandard_bool_to_other(self, dtype):
+        # simple test for casting bool_ to numeric types, which should not
+        # expose the detail that NumPy bools can sometimes take values other
+        # than 0 and 1.  See also gh-19514.
+        nonstandard_bools = np.array([0, 3, -7], dtype=np.int8).view(bool)
+        res = nonstandard_bools.astype(dtype)
+        expected = [0, 1, 1]
+        assert_array_equal(res, expected)
+
index 8712dee1aa80a32d2ac6e789d04576d4e0af2ec7..2f7eac7e8e90a18e29fae06d884524d8b03c00f9 100644 (file)
@@ -4,7 +4,7 @@ from numpy.testing import assert_equal
 
 def test_dispatcher():
     """
-    Testing the utilites of the CPU dispatcher
+    Testing the utilities of the CPU dispatcher
     """
     targets = (
         "SSE2", "SSE41", "AVX2",
@@ -16,7 +16,7 @@ def test_dispatcher():
     for feature in reversed(targets):
         # skip baseline features, by the default `CCompilerOpt` do not generate separated objects
         # for the baseline,  just one object combined all of them via 'baseline' option
-        # within the configuration statments.
+        # within the configuration statements.
         if feature in __cpu_baseline__:
             continue
         # check compiler and running machine support
index 6ef8a02c0e0230bd1096cd284977576a51c5942d..2ccbff41ca63ac8e07045591b4a84939648cf304 100644 (file)
@@ -104,9 +104,12 @@ class AbstractTest:
                 )
 
 is_linux = sys.platform.startswith('linux')
+is_cygwin = sys.platform.startswith('cygwin')
 machine  = platform.machine()
 is_x86   = re.match("^(amd64|x86|i386|i686)", machine, re.IGNORECASE)
-@pytest.mark.skipif(not is_linux or not is_x86, reason="Only for Linux and x86")
+@pytest.mark.skipif(
+    not (is_linux or is_cygwin) or not is_x86, reason="Only for Linux and x86"
+)
 class Test_X86_Features(AbstractTest):
     features = [
         "MMX", "SSE", "SSE2", "SSE3", "SSSE3", "SSE41", "POPCNT", "SSE42",
diff --git a/numpy/core/tests/test_custom_dtypes.py b/numpy/core/tests/test_custom_dtypes.py
new file mode 100644 (file)
index 0000000..6bcc45d
--- /dev/null
@@ -0,0 +1,201 @@
+import pytest
+
+import numpy as np
+from numpy.testing import assert_array_equal
+from numpy.core._multiarray_umath import (
+    _discover_array_parameters as discover_array_params, _get_sfloat_dtype)
+
+
+SF = _get_sfloat_dtype()
+
+
+class TestSFloat:
+    def _get_array(self, scaling, aligned=True):
+        if not aligned:
+            a = np.empty(3*8 + 1, dtype=np.uint8)[1:]
+            a = a.view(np.float64)
+            a[:] = [1., 2., 3.]
+        else:
+            a = np.array([1., 2., 3.])
+
+        a *= 1./scaling  # the casting code also uses the reciprocal.
+        return a.view(SF(scaling))
+
+    def test_sfloat_rescaled(self):
+        sf = SF(1.)
+        sf2 = sf.scaled_by(2.)
+        assert sf2.get_scaling() == 2.
+        sf6 = sf2.scaled_by(3.)
+        assert sf6.get_scaling() == 6.
+
+    def test_class_discovery(self):
+        # This does not test much, since we always discover the scaling as 1.
+        # But most of NumPy (when writing) does not understand DType classes
+        dt, _ = discover_array_params([1., 2., 3.], dtype=SF)
+        assert dt == SF(1.)
+
+    @pytest.mark.parametrize("scaling", [1., -1., 2.])
+    def test_scaled_float_from_floats(self, scaling):
+        a = np.array([1., 2., 3.], dtype=SF(scaling))
+
+        assert a.dtype.get_scaling() == scaling
+        assert_array_equal(scaling * a.view(np.float64), [1., 2., 3.])
+
+    def test_repr(self):
+        # Check the repr, mainly to cover the code paths:
+        assert repr(SF(scaling=1.)) == "_ScaledFloatTestDType(scaling=1.0)"
+
+    @pytest.mark.parametrize("scaling", [1., -1., 2.])
+    def test_sfloat_from_float(self, scaling):
+        a = np.array([1., 2., 3.]).astype(dtype=SF(scaling))
+
+        assert a.dtype.get_scaling() == scaling
+        assert_array_equal(scaling * a.view(np.float64), [1., 2., 3.])
+
+    @pytest.mark.parametrize("aligned", [True, False])
+    @pytest.mark.parametrize("scaling", [1., -1., 2.])
+    def test_sfloat_getitem(self, aligned, scaling):
+        a = self._get_array(1., aligned)
+        assert a.tolist() == [1., 2., 3.]
+
+    @pytest.mark.parametrize("aligned", [True, False])
+    def test_sfloat_casts(self, aligned):
+        a = self._get_array(1., aligned)
+
+        assert np.can_cast(a, SF(-1.), casting="equiv")
+        assert not np.can_cast(a, SF(-1.), casting="no")
+        na = a.astype(SF(-1.))
+        assert_array_equal(-1 * na.view(np.float64), a.view(np.float64))
+
+        assert np.can_cast(a, SF(2.), casting="same_kind")
+        assert not np.can_cast(a, SF(2.), casting="safe")
+        a2 = a.astype(SF(2.))
+        assert_array_equal(2 * a2.view(np.float64), a.view(np.float64))
+
+    @pytest.mark.parametrize("aligned", [True, False])
+    def test_sfloat_cast_internal_errors(self, aligned):
+        a = self._get_array(2e300, aligned)
+
+        with pytest.raises(TypeError,
+                match="error raised inside the core-loop: non-finite factor!"):
+            a.astype(SF(2e-300))
+
+    def test_sfloat_promotion(self):
+        assert np.result_type(SF(2.), SF(3.)) == SF(3.)
+        assert np.result_type(SF(3.), SF(2.)) == SF(3.)
+        # Float64 -> SF(1.) and then promotes normally, so both of this work:
+        assert np.result_type(SF(3.), np.float64) == SF(3.)
+        assert np.result_type(np.float64, SF(0.5)) == SF(1.)
+
+        # Test an undefined promotion:
+        with pytest.raises(TypeError):
+            np.result_type(SF(1.), np.int64)
+
+    def test_basic_multiply(self):
+        a = self._get_array(2.)
+        b = self._get_array(4.)
+
+        res = a * b
+        # multiplies dtype scaling and content separately:
+        assert res.dtype.get_scaling() == 8.
+        expected_view = a.view(np.float64) * b.view(np.float64)
+        assert_array_equal(res.view(np.float64), expected_view)
+
+    def test_possible_and_impossible_reduce(self):
+        # For reductions to work, the first and last operand must have the
+        # same dtype.  For this parametric DType that is not necessarily true.
+        a = self._get_array(2.)
+        # Addition reductin works (as of writing requires to pass initial
+        # because setting a scaled-float from the default `0` fails).
+        res = np.add.reduce(a, initial=0.)
+        assert res == a.astype(np.float64).sum()
+
+        # But each multiplication changes the factor, so a reduction is not
+        # possible (the relaxed version of the old refusal to handle any
+        # flexible dtype).
+        with pytest.raises(TypeError,
+                match="the resolved dtypes are not compatible"):
+            np.multiply.reduce(a)
+
+    def test_basic_ufunc_at(self):
+        float_a = np.array([1., 2., 3.])
+        b = self._get_array(2.)
+
+        float_b = b.view(np.float64).copy()
+        np.multiply.at(float_b, [1, 1, 1], float_a)
+        np.multiply.at(b, [1, 1, 1], float_a)
+
+        assert_array_equal(b.view(np.float64), float_b)
+
+    def test_basic_multiply_promotion(self):
+        float_a = np.array([1., 2., 3.])
+        b = self._get_array(2.)
+
+        res1 = float_a * b
+        res2 = b * float_a
+
+        # one factor is one, so we get the factor of b:
+        assert res1.dtype == res2.dtype == b.dtype
+        expected_view = float_a * b.view(np.float64)
+        assert_array_equal(res1.view(np.float64), expected_view)
+        assert_array_equal(res2.view(np.float64), expected_view)
+
+        # Check that promotion works when `out` is used:
+        np.multiply(b, float_a, out=res2)
+        with pytest.raises(TypeError):
+            # The promoter accepts this (maybe it should not), but the SFloat
+            # result cannot be cast to integer:
+            np.multiply(b, float_a, out=np.arange(3))
+
+    def test_basic_addition(self):
+        a = self._get_array(2.)
+        b = self._get_array(4.)
+
+        res = a + b
+        # addition uses the type promotion rules for the result:
+        assert res.dtype == np.result_type(a.dtype, b.dtype)
+        expected_view = (a.astype(res.dtype).view(np.float64) +
+                         b.astype(res.dtype).view(np.float64))
+        assert_array_equal(res.view(np.float64), expected_view)
+
+    def test_addition_cast_safety(self):
+        """The addition method is special for the scaled float, because it
+        includes the "cast" between different factors, thus cast-safety
+        is influenced by the implementation.
+        """
+        a = self._get_array(2.)
+        b = self._get_array(-2.)
+        c = self._get_array(3.)
+
+        # sign change is "equiv":
+        np.add(a, b, casting="equiv")
+        with pytest.raises(TypeError):
+            np.add(a, b, casting="no")
+
+        # Different factor is "same_kind" (default) so check that "safe" fails
+        with pytest.raises(TypeError):
+            np.add(a, c, casting="safe")
+
+        # Check that casting the output fails also (done by the ufunc here)
+        with pytest.raises(TypeError):
+            np.add(a, a, out=c, casting="safe")
+
+    @pytest.mark.parametrize("ufunc",
+            [np.logical_and, np.logical_or, np.logical_xor])
+    def test_logical_ufuncs_casts_to_bool(self, ufunc):
+        a = self._get_array(2.)
+        a[0] = 0.  # make sure first element is considered False.
+
+        float_equiv = a.astype(float)
+        expected = ufunc(float_equiv, float_equiv)
+        res = ufunc(a, a)
+        assert_array_equal(res, expected)
+
+        # also check that the same works for reductions:
+        expected = ufunc.reduce(float_equiv)
+        res = ufunc.reduce(a)
+        assert_array_equal(res, expected)
+
+        # The output casting does not match the bool, bool -> bool loop:
+        with pytest.raises(TypeError):
+            ufunc(a, a, out=np.empty(a.shape, dtype=int), casting="equiv")
index b4146eadf3f2b5e614c6984649a6b630868193dc..5294c7b8d6d725e70aa96409661a46942a4301f6 100644 (file)
@@ -63,6 +63,7 @@ class TestDateTime:
         assert_raises(TypeError, np.dtype, 'm7')
         assert_raises(TypeError, np.dtype, 'M16')
         assert_raises(TypeError, np.dtype, 'm16')
+        assert_raises(TypeError, np.dtype, 'M8[3000000000ps]')
 
     def test_datetime_casting_rules(self):
         # Cannot cast safely/same_kind between timedelta and datetime
@@ -137,6 +138,42 @@ class TestDateTime:
         assert_(not np.can_cast('M8[h]', 'M8', casting='same_kind'))
         assert_(not np.can_cast('M8[h]', 'M8', casting='safe'))
 
+    def test_datetime_prefix_conversions(self):
+        # regression tests related to gh-19631;
+        # test metric prefixes from seconds down to
+        # attoseconds for bidirectional conversions
+        smaller_units = ['M8[7000ms]',
+                         'M8[2000us]',
+                         'M8[1000ns]',
+                         'M8[5000ns]',
+                         'M8[2000ps]',
+                         'M8[9000fs]',
+                         'M8[1000as]',
+                         'M8[2000000ps]',
+                         'M8[1000000as]',
+                         'M8[2000000000ps]',
+                         'M8[1000000000as]']
+        larger_units = ['M8[7s]',
+                        'M8[2ms]',
+                        'M8[us]',
+                        'M8[5us]',
+                        'M8[2ns]',
+                        'M8[9ps]',
+                        'M8[1fs]',
+                        'M8[2us]',
+                        'M8[1ps]',
+                        'M8[2ms]',
+                        'M8[1ns]']
+        for larger_unit, smaller_unit in zip(larger_units, smaller_units):
+            assert np.can_cast(larger_unit, smaller_unit, casting='safe')
+            assert np.can_cast(smaller_unit, larger_unit, casting='safe')
+
+    @pytest.mark.parametrize("unit", [
+        "s", "ms", "us", "ns", "ps", "fs", "as"])
+    def test_prohibit_negative_datetime(self, unit):
+        with assert_raises(TypeError):
+            np.array([1], dtype=f"M8[-1{unit}]")
+
     def test_compare_generic_nat(self):
         # regression tests for gh-6452
         assert_(np.datetime64('NaT') !=
@@ -152,7 +189,7 @@ class TestDateTime:
         expected = np.arange(size)
         arr = np.tile(np.datetime64('NaT'), size)
         assert_equal(np.argsort(arr, kind='mergesort'), expected)
-    
+
     @pytest.mark.parametrize("size", [
         3, 21, 217, 1000])
     def test_timedelta_nat_argsort_stability(self, size):
@@ -1373,13 +1410,13 @@ class TestDateTime:
             assert_equal(tda / 0.5, tdc)
             assert_equal((tda / 0.5).dtype, np.dtype('m8[h]'))
             # m8 / m8
-            assert_equal(tda / tdb, 6.0 / 9.0)
-            assert_equal(np.divide(tda, tdb), 6.0 / 9.0)
-            assert_equal(np.true_divide(tda, tdb), 6.0 / 9.0)
-            assert_equal(tdb / tda, 9.0 / 6.0)
+            assert_equal(tda / tdb, 6 / 9)
+            assert_equal(np.divide(tda, tdb), 6 / 9)
+            assert_equal(np.true_divide(tda, tdb), 6 / 9)
+            assert_equal(tdb / tda, 9 / 6)
             assert_equal((tda / tdb).dtype, np.dtype('f8'))
-            assert_equal(tda / tdd, 60.0)
-            assert_equal(tdd / tda, 1.0 / 60.0)
+            assert_equal(tda / tdd, 60)
+            assert_equal(tdd / tda, 1 / 60)
 
             # int / m8
             assert_raises(TypeError, np.divide, 2, tdb)
@@ -1992,6 +2029,27 @@ class TestDateTime:
         assert_equal(np.maximum.reduce(a),
                      np.timedelta64(7, 's'))
 
+    def test_timedelta_correct_mean(self):
+        # test mainly because it worked only via a bug in that allowed:
+        # `timedelta.sum(dtype="f8")` to ignore the dtype request.
+        a = np.arange(1000, dtype="m8[s]")
+        assert_array_equal(a.mean(), a.sum() / len(a))
+
+    def test_datetime_no_subtract_reducelike(self):
+        # subtracting two datetime64 works, but we cannot reduce it, since
+        # the result of that subtraction will have a different dtype.
+        arr = np.array(["2021-12-02", "2019-05-12"], dtype="M8[ms]")
+        msg = r"the resolved dtypes are not compatible"
+
+        with pytest.raises(TypeError, match=msg):
+            np.subtract.reduce(arr)
+
+        with pytest.raises(TypeError, match=msg):
+            np.subtract.accumulate(arr)
+
+        with pytest.raises(TypeError, match=msg):
+            np.subtract.reduceat(arr, [0])
+
     def test_datetime_busday_offset(self):
         # First Monday in June
         assert_equal(
index 29603e3cc79cc00be161c04cd0e7c4f551c6302e..94583a5ee04f1504588e0208e58867cc20d50811 100644 (file)
@@ -314,21 +314,6 @@ class TestBinaryReprInsufficientWidthParameterForRepresentation(_DeprecationTest
         self.assert_deprecated(np.binary_repr, args=args, kwargs=kwargs)
 
 
-class TestNumericStyleTypecodes(_DeprecationTestCase):
-    """
-    Most numeric style typecodes were previously deprecated (and removed)
-    in 1.20. This also deprecates the remaining ones.
-    """
-    # 2020-06-09, NumPy 1.20
-    def test_all_dtypes(self):
-        deprecated_types = ['Bytes0', 'Datetime64', 'Str0']
-        # Depending on intp size, either Uint32 or Uint64 is defined:
-        deprecated_types.append(f"U{np.dtype(np.intp).name}")
-        for dt in deprecated_types:
-            self.assert_deprecated(np.dtype, exceptions=(TypeError,),
-                                   args=(dt,))
-
-
 class TestDTypeAttributeIsDTypeDeprecation(_DeprecationTestCase):
     # Deprecated 2021-01-05, NumPy 1.21
     message = r".*`.dtype` attribute"
@@ -806,7 +791,7 @@ class TestFutureWarningArrayLikeNotIterable(_DeprecationTestCase):
         *not* define the sequence protocol.
 
         NOTE: Tests for the versions including __len__ and __getitem__ exist
-              in `test_array_coercion.py` and they can be modified or ammended
+              in `test_array_coercion.py` and they can be modified or amended
               when this deprecation expired.
         """
         blueprint = np.arange(10)
@@ -1207,3 +1192,61 @@ class TestUFuncForcedDTypeWarning(_DeprecationTestCase):
             np.maximum(arr, arr, dtype="m8[ns]")  # previously used the "ns"
         with pytest.warns(DeprecationWarning, match=self.message):
             np.maximum.reduce(arr, dtype="m8[ns]")  # never preserved the "ns"
+
+
+PARTITION_DICT = {
+    "partition method": np.arange(10).partition,
+    "argpartition method": np.arange(10).argpartition,
+    "partition function": lambda kth: np.partition(np.arange(10), kth),
+    "argpartition function": lambda kth: np.argpartition(np.arange(10), kth),
+}
+
+
+@pytest.mark.parametrize("func", PARTITION_DICT.values(), ids=PARTITION_DICT)
+class TestPartitionBoolIndex(_DeprecationTestCase):
+    # Deprecated 2021-09-29, NumPy 1.22
+    warning_cls = DeprecationWarning
+    message = "Passing booleans as partition index is deprecated"
+
+    def test_deprecated(self, func):
+        self.assert_deprecated(lambda: func(True))
+        self.assert_deprecated(lambda: func([False, True]))
+
+    def test_not_deprecated(self, func):
+        self.assert_not_deprecated(lambda: func(1))
+        self.assert_not_deprecated(lambda: func([0, 1]))
+
+
+class TestMachAr(_DeprecationTestCase):
+    # Deprecated 2021-10-19, NumPy 1.22
+    warning_cls = DeprecationWarning
+
+    def test_deprecated(self):
+        self.assert_deprecated(lambda: np.MachAr)
+
+    def test_deprecated_module(self):
+        self.assert_deprecated(lambda: getattr(np.core, "machar"))
+
+    def test_deprecated_attr(self):
+        finfo = np.finfo(float)
+        self.assert_deprecated(lambda: getattr(finfo, "machar"))
+
+
+class TestQuantileInterpolationDeprecation(_DeprecationTestCase):
+    # Deprecated 2021-11-08, NumPy 1.22
+    @pytest.mark.parametrize("func",
+        [np.percentile, np.quantile, np.nanpercentile, np.nanquantile])
+    def test_deprecated(self, func):
+        self.assert_deprecated(
+            lambda: func([0., 1.], 0., interpolation="linear"))
+        self.assert_deprecated(
+            lambda: func([0., 1.], 0., interpolation="nearest"))
+
+    @pytest.mark.parametrize("func",
+            [np.percentile, np.quantile, np.nanpercentile, np.nanquantile])
+    def test_both_passed(self, func):
+        with warnings.catch_warnings():
+            # catch the DeprecationWarning so that it does not raise:
+            warnings.simplefilter("always", DeprecationWarning)
+            with pytest.raises(TypeError):
+                func([0., 1.], 0., interpolation="nearest", method="nearest")
diff --git a/numpy/core/tests/test_dlpack.py b/numpy/core/tests/test_dlpack.py
new file mode 100644 (file)
index 0000000..f848b20
--- /dev/null
@@ -0,0 +1,109 @@
+import sys
+import pytest
+
+import numpy as np
+from numpy.testing import assert_array_equal, IS_PYPY
+
+
+class TestDLPack:
+    @pytest.mark.skipif(IS_PYPY, reason="PyPy can't get refcounts.")
+    def test_dunder_dlpack_refcount(self):
+        x = np.arange(5)
+        y = x.__dlpack__()
+        assert sys.getrefcount(x) == 3
+        del y
+        assert sys.getrefcount(x) == 2
+
+    def test_dunder_dlpack_stream(self):
+        x = np.arange(5)
+        x.__dlpack__(stream=None)
+
+        with pytest.raises(RuntimeError):
+            x.__dlpack__(stream=1)
+
+    def test_strides_not_multiple_of_itemsize(self):
+        dt = np.dtype([('int', np.int32), ('char', np.int8)])
+        y = np.zeros((5,), dtype=dt)
+        z = y['int']
+
+        with pytest.raises(RuntimeError):
+            np._from_dlpack(z)
+
+    @pytest.mark.skipif(IS_PYPY, reason="PyPy can't get refcounts.")
+    def test_from_dlpack_refcount(self):
+        x = np.arange(5)
+        y = np._from_dlpack(x)
+        assert sys.getrefcount(x) == 3
+        del y
+        assert sys.getrefcount(x) == 2
+
+    @pytest.mark.parametrize("dtype", [
+        np.int8, np.int16, np.int32, np.int64,
+        np.uint8, np.uint16, np.uint32, np.uint64,
+        np.float16, np.float32, np.float64,
+        np.complex64, np.complex128
+    ])
+    def test_dtype_passthrough(self, dtype):
+        x = np.arange(5, dtype=dtype)
+        y = np._from_dlpack(x)
+
+        assert y.dtype == x.dtype
+        assert_array_equal(x, y)
+
+    def test_invalid_dtype(self):
+        x = np.asarray(np.datetime64('2021-05-27'))
+
+        with pytest.raises(TypeError):
+            np._from_dlpack(x)
+
+    def test_invalid_byte_swapping(self):
+        dt = np.dtype('=i8').newbyteorder()
+        x = np.arange(5, dtype=dt)
+
+        with pytest.raises(TypeError):
+            np._from_dlpack(x)
+
+    def test_non_contiguous(self):
+        x = np.arange(25).reshape((5, 5))
+
+        y1 = x[0]
+        assert_array_equal(y1, np._from_dlpack(y1))
+
+        y2 = x[:, 0]
+        assert_array_equal(y2, np._from_dlpack(y2))
+
+        y3 = x[1, :]
+        assert_array_equal(y3, np._from_dlpack(y3))
+
+        y4 = x[1]
+        assert_array_equal(y4, np._from_dlpack(y4))
+
+        y5 = np.diagonal(x).copy()
+        assert_array_equal(y5, np._from_dlpack(y5))
+
+    @pytest.mark.parametrize("ndim", range(33))
+    def test_higher_dims(self, ndim):
+        shape = (1,) * ndim
+        x = np.zeros(shape, dtype=np.float64)
+
+        assert shape == np._from_dlpack(x).shape
+
+    def test_dlpack_device(self):
+        x = np.arange(5)
+        assert x.__dlpack_device__() == (1, 0)
+        assert np._from_dlpack(x).__dlpack_device__() == (1, 0)
+
+    def dlpack_deleter_exception(self):
+        x = np.arange(5)
+        _ = x.__dlpack__()
+        raise RuntimeError
+    
+    def test_dlpack_destructor_exception(self):
+        with pytest.raises(RuntimeError):
+            self.dlpack_deleter_exception()
+
+    def test_readonly(self):
+        x = np.arange(5)
+        x.flags.writeable = False
+        with pytest.raises(TypeError):
+            x.__dlpack__()
index 3cb0c2b841c88fc2bb3cda0cb1bf388cb58bff95..e49604e4db7af0b6701592b6cac0f15a142b0042 100644 (file)
@@ -3,16 +3,19 @@ import operator
 import pytest
 import ctypes
 import gc
-import warnings
+import types
+from typing import Any
 
 import numpy as np
 from numpy.core._rational_tests import rational
 from numpy.core._multiarray_tests import create_custom_field_dtype
 from numpy.testing import (
-    assert_, assert_equal, assert_array_equal, assert_raises, HAS_REFCOUNT)
+    assert_, assert_equal, assert_array_equal, assert_raises, HAS_REFCOUNT,
+    IS_PYSTON)
 from numpy.compat import pickle
 from itertools import permutations
 
+
 def assert_dtype_equal(a, b):
     assert_equal(a, b)
     assert_equal(hash(a), hash(b),
@@ -107,9 +110,12 @@ class TestBuiltin:
             operation(np.dtype(np.int32), 7)
 
     @pytest.mark.parametrize("dtype",
-             ['Bool', 'Complex32', 'Complex64', 'Float16', 'Float32', 'Float64',
-              'Int8', 'Int16', 'Int32', 'Int64', 'Object0', 'Timedelta64',
-              'UInt8', 'UInt16', 'UInt32', 'UInt64', 'Void0',
+             ['Bool', 'Bytes0', 'Complex32', 'Complex64',
+              'Datetime64', 'Float16', 'Float32', 'Float64',
+              'Int8', 'Int16', 'Int32', 'Int64',
+              'Object0', 'Str0', 'Timedelta64',
+              'UInt8', 'UInt16', 'Uint32', 'UInt32',
+              'Uint64', 'UInt64', 'Void0',
               "Float128", "Complex128"])
     def test_numeric_style_types_are_invalid(self, dtype):
         with assert_raises(TypeError):
@@ -723,26 +729,30 @@ class TestStructuredObjectRefcounting:
     def test_structured_object_indexing(self, shape, index, items_changed,
                                         dt, pat, count, singleton):
         """Structured object reference counting for advanced indexing."""
-        zero = 0
-        one = 1
+        # Use two small negative values (should be singletons, but less likely
+        # to run into race-conditions).  This failed in some threaded envs
+        # When using 0 and 1.  If it fails again, should remove all explicit
+        # checks, and rely on `pytest-leaks` reference count checker only.
+        val0 = -4
+        val1 = -5
 
-        arr = np.zeros(shape, dt)
+        arr = np.full(shape, val0, dt)
 
         gc.collect()
-        before_zero = sys.getrefcount(zero)
-        before_one = sys.getrefcount(one)
+        before_val0 = sys.getrefcount(val0)
+        before_val1 = sys.getrefcount(val1)
         # Test item getting:
         part = arr[index]
-        after_zero = sys.getrefcount(zero)
-        assert after_zero - before_zero == count * items_changed
+        after_val0 = sys.getrefcount(val0)
+        assert after_val0 - before_val0 == count * items_changed
         del part
         # Test item setting:
-        arr[index] = one
+        arr[index] = val1
         gc.collect()
-        after_zero = sys.getrefcount(zero)
-        after_one = sys.getrefcount(one)
-        assert before_zero - after_zero == count * items_changed
-        assert after_one - before_one == count * items_changed
+        after_val0 = sys.getrefcount(val0)
+        after_val1 = sys.getrefcount(val1)
+        assert before_val0 - after_val0 == count * items_changed
+        assert after_val1 - before_val1 == count * items_changed
 
     @pytest.mark.parametrize(['dt', 'pat', 'count', 'singleton'],
                              iter_struct_object_dtypes())
@@ -811,12 +821,14 @@ class TestMonsterType:
             ('yi', np.dtype((a, (3, 2))))])
         assert_dtype_equal(c, d)
 
+    @pytest.mark.skipif(IS_PYSTON, reason="Pyston disables recursion checking")
     def test_list_recursion(self):
         l = list()
         l.append(('f', l))
         with pytest.raises(RecursionError):
             np.dtype(l)
 
+    @pytest.mark.skipif(IS_PYSTON, reason="Pyston disables recursion checking")
     def test_tuple_recursion(self):
         d = np.int32
         for i in range(100000):
@@ -824,6 +836,7 @@ class TestMonsterType:
         with pytest.raises(RecursionError):
             np.dtype(d)
 
+    @pytest.mark.skipif(IS_PYSTON, reason="Pyston disables recursion checking")
     def test_dict_recursion(self):
         d = dict(names=['self'], formats=[None], offsets=[0])
         d['formats'][0] = d
@@ -874,14 +887,24 @@ class TestString:
                                    ('bright', '>f4', (8, 36))])],
                        align=True)
         assert_equal(str(dt),
-                    "{'names':['top','bottom'], "
-                     "'formats':[([('tiles', ('>f4', (64, 64)), (1,)), "
-                                  "('rtile', '>f4', (64, 36))], (3,)),"
-                                 "[('bleft', ('>f4', (8, 64)), (1,)), "
-                                  "('bright', '>f4', (8, 36))]], "
-                     "'offsets':[0,76800], "
-                     "'itemsize':80000, "
-                     "'aligned':True}")
+                    "{'names': ['top', 'bottom'],"
+                    " 'formats': [([('tiles', ('>f4', (64, 64)), (1,)), "
+                                   "('rtile', '>f4', (64, 36))], (3,)), "
+                                  "[('bleft', ('>f4', (8, 64)), (1,)), "
+                                   "('bright', '>f4', (8, 36))]],"
+                    " 'offsets': [0, 76800],"
+                    " 'itemsize': 80000,"
+                    " 'aligned': True}")
+        with np.printoptions(legacy='1.21'):
+            assert_equal(str(dt),
+                        "{'names':['top','bottom'], "
+                         "'formats':[([('tiles', ('>f4', (64, 64)), (1,)), "
+                                      "('rtile', '>f4', (64, 36))], (3,)),"
+                                     "[('bleft', ('>f4', (8, 64)), (1,)), "
+                                      "('bright', '>f4', (8, 36))]], "
+                         "'offsets':[0,76800], "
+                         "'itemsize':80000, "
+                         "'aligned':True}")
         assert_equal(np.dtype(eval(str(dt))), dt)
 
         dt = np.dtype({'names': ['r', 'g', 'b'], 'formats': ['u1', 'u1', 'u1'],
@@ -898,22 +921,22 @@ class TestString:
                        'titles': ['Color', 'Red pixel',
                                   'Green pixel', 'Blue pixel']})
         assert_equal(str(dt),
-                    "{'names':['rgba','r','g','b'],"
-                    " 'formats':['<u4','u1','u1','u1'],"
-                    " 'offsets':[0,0,1,2],"
-                    " 'titles':['Color','Red pixel',"
-                              "'Green pixel','Blue pixel'],"
-                    " 'itemsize':4}")
+                    "{'names': ['rgba', 'r', 'g', 'b'],"
+                    " 'formats': ['<u4', 'u1', 'u1', 'u1'],"
+                    " 'offsets': [0, 0, 1, 2],"
+                    " 'titles': ['Color', 'Red pixel', "
+                               "'Green pixel', 'Blue pixel'],"
+                    " 'itemsize': 4}")
 
         dt = np.dtype({'names': ['r', 'b'], 'formats': ['u1', 'u1'],
                         'offsets': [0, 2],
                         'titles': ['Red pixel', 'Blue pixel']})
         assert_equal(str(dt),
-                    "{'names':['r','b'],"
-                    " 'formats':['u1','u1'],"
-                    " 'offsets':[0,2],"
-                    " 'titles':['Red pixel','Blue pixel'],"
-                    " 'itemsize':3}")
+                    "{'names': ['r', 'b'],"
+                    " 'formats': ['u1', 'u1'],"
+                    " 'offsets': [0, 2],"
+                    " 'titles': ['Red pixel', 'Blue pixel'],"
+                    " 'itemsize': 3}")
 
         dt = np.dtype([('a', '<m8[D]'), ('b', '<M8[us]')])
         assert_equal(str(dt),
@@ -946,23 +969,23 @@ class TestString:
                        'titles': ['Color', 'Red pixel',
                                   'Green pixel', 'Blue pixel']}, align=True)
         assert_equal(repr(dt),
-                    "dtype({'names':['rgba','r','g','b'],"
-                    " 'formats':['<u4','u1','u1','u1'],"
-                    " 'offsets':[0,0,1,2],"
-                    " 'titles':['Color','Red pixel',"
-                              "'Green pixel','Blue pixel'],"
-                    " 'itemsize':4}, align=True)")
+                    "dtype({'names': ['rgba', 'r', 'g', 'b'],"
+                    " 'formats': ['<u4', 'u1', 'u1', 'u1'],"
+                    " 'offsets': [0, 0, 1, 2],"
+                    " 'titles': ['Color', 'Red pixel', "
+                                "'Green pixel', 'Blue pixel'],"
+                    " 'itemsize': 4}, align=True)")
 
         dt = np.dtype({'names': ['r', 'b'], 'formats': ['u1', 'u1'],
                         'offsets': [0, 2],
                         'titles': ['Red pixel', 'Blue pixel'],
                         'itemsize': 4})
         assert_equal(repr(dt),
-                    "dtype({'names':['r','b'], "
-                    "'formats':['u1','u1'], "
-                    "'offsets':[0,2], "
-                    "'titles':['Red pixel','Blue pixel'], "
-                    "'itemsize':4})")
+                    "dtype({'names': ['r', 'b'], "
+                    "'formats': ['u1', 'u1'], "
+                    "'offsets': [0, 2], "
+                    "'titles': ['Red pixel', 'Blue pixel'], "
+                    "'itemsize': 4})")
 
     def test_repr_structured_datetime(self):
         dt = np.dtype([('a', '<M8[D]'), ('b', '<m8[us]')])
@@ -1245,6 +1268,7 @@ class TestFromDTypeAttribute:
         assert np.dtype(dt) == np.float64
         assert np.dtype(dt()) == np.float64
 
+    @pytest.mark.skipif(IS_PYSTON, reason="Pyston disables recursion checking")
     def test_recursion(self):
         class dt:
             pass
@@ -1268,6 +1292,7 @@ class TestFromDTypeAttribute:
         np.dtype(dt)
         np.dtype(dt(1))
 
+    @pytest.mark.skipif(IS_PYSTON, reason="Pyston disables recursion checking")
     def test_void_subtype_recursion(self):
         class vdt(np.void):
             pass
@@ -1547,9 +1572,43 @@ class TestUserDType:
             create_custom_field_dtype(blueprint, mytype, 2)
 
 
+@pytest.mark.skipif(sys.version_info < (3, 9), reason="Requires python 3.9")
+class TestClassGetItem:
+    def test_dtype(self) -> None:
+        alias = np.dtype[Any]
+        assert isinstance(alias, types.GenericAlias)
+        assert alias.__origin__ is np.dtype
+
+    @pytest.mark.parametrize("code", np.typecodes["All"])
+    def test_dtype_subclass(self, code: str) -> None:
+        cls = type(np.dtype(code))
+        alias = cls[Any]
+        assert isinstance(alias, types.GenericAlias)
+        assert alias.__origin__ is cls
+
+    @pytest.mark.parametrize("arg_len", range(4))
+    def test_subscript_tuple(self, arg_len: int) -> None:
+        arg_tup = (Any,) * arg_len
+        if arg_len == 1:
+            assert np.dtype[arg_tup]
+        else:
+            with pytest.raises(TypeError):
+                np.dtype[arg_tup]
+
+    def test_subscript_scalar(self) -> None:
+        assert np.dtype[Any]
+
+
 def test_result_type_integers_and_unitless_timedelta64():
     # Regression test for gh-20077.  The following call of `result_type`
     # would cause a seg. fault.
     td = np.timedelta64(4)
     result = np.result_type(0, td)
     assert_dtype_equal(result, td.dtype)
+
+
+@pytest.mark.skipif(sys.version_info >= (3, 9), reason="Requires python 3.8")
+def test_class_getitem_38() -> None:
+    match = "Type subscription requires python >= 3.9"
+    with pytest.raises(TypeError, match=match):
+        np.dtype[Any]
index 8304a0f92241025803fc08b8d2ce6b7e42154b2e..172311624c277a581ee54146730d2139157e7fd3 100644 (file)
@@ -1073,7 +1073,7 @@ class TestEinsumPath:
         self.assert_path_equal(path, ['einsum_path', (0, 1), (0, 1, 2, 3, 4, 5)])
 
     def test_path_type_input(self):
-        # Test explicit path handeling
+        # Test explicit path handling
         path_test = self.build_operands('dcc,fce,ea,dbf->ab')
 
         path, path_str = np.einsum_path(*path_test, optimize=False)
index bcf8cf659b791e4fce2d7794a9281488bd2f2a22..c5148db2c715739cbfd895cc8a245fce9e807d2a 100644 (file)
@@ -1,6 +1,7 @@
 """ Test functions for limits module.
 
 """
+import warnings
 import numpy as np
 from numpy.core import finfo, iinfo
 from numpy import half, single, double, longdouble
@@ -45,9 +46,10 @@ class TestFinfo:
                        [np.float16, np.float32, np.float64, np.complex64,
                         np.complex128]))
         for dt1, dt2 in dts:
-            for attr in ('bits', 'eps', 'epsneg', 'iexp', 'machar', 'machep',
+            for attr in ('bits', 'eps', 'epsneg', 'iexp', 'machep',
                          'max', 'maxexp', 'min', 'minexp', 'negep', 'nexp',
-                         'nmant', 'precision', 'resolution', 'tiny'):
+                         'nmant', 'precision', 'resolution', 'tiny',
+                         'smallest_normal', 'smallest_subnormal'):
                 assert_equal(getattr(finfo(dt1), attr),
                              getattr(finfo(dt2), attr), attr)
         assert_raises(ValueError, finfo, 'i4')
@@ -112,6 +114,28 @@ def test_known_types():
         assert_ma_equal(ld_ma, _float_ma[128])
 
 
+def test_subnormal_warning():
+    """Test that the subnormal is zero warning is not being raised."""
+    with np.errstate(all='ignore'):
+        ld_ma = _discovered_machar(np.longdouble)
+    bytes = np.dtype(np.longdouble).itemsize
+    with warnings.catch_warnings(record=True) as w:
+        warnings.simplefilter('always')
+        if (ld_ma.it, ld_ma.maxexp) == (63, 16384) and bytes in (12, 16):
+            # 80-bit extended precision
+            ld_ma.smallest_subnormal
+            assert len(w) == 0
+        elif (ld_ma.it, ld_ma.maxexp) == (112, 16384) and bytes == 16:
+            # IEE 754 128-bit
+            ld_ma.smallest_subnormal
+            assert len(w) == 0
+        else:
+            # Double double
+            ld_ma.smallest_subnormal
+            # This test may fail on some platforms
+            assert len(w) == 0
+
+
 def test_plausible_finfo():
     # Assert that finfo returns reasonable results for all types
     for ftype in np.sctypes['float'] + np.sctypes['complex']:
diff --git a/numpy/core/tests/test_hashtable.py b/numpy/core/tests/test_hashtable.py
new file mode 100644 (file)
index 0000000..bace4c0
--- /dev/null
@@ -0,0 +1,30 @@
+import pytest
+
+import random
+from numpy.core._multiarray_tests import identityhash_tester
+
+
+@pytest.mark.parametrize("key_length", [1, 3, 6])
+@pytest.mark.parametrize("length", [1, 16, 2000])
+def test_identity_hashtable(key_length, length):
+    # use a 30 object pool for everything (duplicates will happen)
+    pool = [object() for i in range(20)]
+    keys_vals = []
+    for i in range(length):
+        keys = tuple(random.choices(pool, k=key_length))
+        keys_vals.append((keys, random.choice(pool)))
+
+    dictionary = dict(keys_vals)
+
+    # add a random item at the end:
+    keys_vals.append(random.choice(keys_vals))
+    # the expected one could be different with duplicates:
+    expected = dictionary[keys_vals[-1][0]]
+
+    res = identityhash_tester(key_length, keys_vals, replace=True)
+    assert res is expected
+
+    # check that ensuring one duplicate definitely raises:
+    keys_vals.insert(0, keys_vals[-2])
+    with pytest.raises(RuntimeError):
+        identityhash_tester(key_length, keys_vals)
index acef995f3f05a0c32733547a3be617b29ce2cfcc..1a54e62d8b3dfd0d22871c9e516626d185b162cb 100644 (file)
@@ -8,6 +8,7 @@ from numpy.testing import (
     )
 from numpy.core.tests._locales import CommaDecimalPointLocale
 
+
 LD_INFO = np.finfo(np.longdouble)
 longdouble_longer_than_double = (LD_INFO.eps < np.finfo(np.double).eps)
 
index 673f309f18c32866bd17ed4d92cc6c72b6301b81..3a66ec51fd5860a546b917af3b83d21ac55540ad 100644 (file)
@@ -3,7 +3,7 @@ Test machar. Given recent changes to hardcode type data, we might want to get
 rid of both MachAr and this test at some point.
 
 """
-from numpy.core.machar import MachAr
+from numpy.core._machar import MachAr
 import numpy.core.numerictypes as ntypes
 from numpy import errstate, array
 
diff --git a/numpy/core/tests/test_mem_policy.py b/numpy/core/tests/test_mem_policy.py
new file mode 100644 (file)
index 0000000..3dae36d
--- /dev/null
@@ -0,0 +1,423 @@
+import asyncio
+import gc
+import os
+import pytest
+import numpy as np
+import threading
+import warnings
+from numpy.testing import extbuild, assert_warns
+import sys
+
+
+@pytest.fixture
+def get_module(tmp_path):
+    """ Add a memory policy that returns a false pointer 64 bytes into the
+    actual allocation, and fill the prefix with some text. Then check at each
+    memory manipulation that the prefix exists, to make sure all alloc/realloc/
+    free/calloc go via the functions here.
+    """
+    if sys.platform.startswith('cygwin'):
+        pytest.skip('link fails on cygwin')
+    functions = [
+        ("get_default_policy", "METH_NOARGS", """
+             Py_INCREF(PyDataMem_DefaultHandler);
+             return PyDataMem_DefaultHandler;
+         """),
+        ("set_secret_data_policy", "METH_NOARGS", """
+             PyObject *secret_data =
+                 PyCapsule_New(&secret_data_handler, "mem_handler", NULL);
+             if (secret_data == NULL) {
+                 return NULL;
+             }
+             PyObject *old = PyDataMem_SetHandler(secret_data);
+             Py_DECREF(secret_data);
+             return old;
+         """),
+        ("set_old_policy", "METH_O", """
+             PyObject *old;
+             if (args != NULL && PyCapsule_CheckExact(args)) {
+                 old = PyDataMem_SetHandler(args);
+             }
+             else {
+                 old = PyDataMem_SetHandler(NULL);
+             }
+             return old;
+         """),
+        ("get_array", "METH_NOARGS", """
+            char *buf = (char *)malloc(20);
+            npy_intp dims[1];
+            dims[0] = 20;
+            PyArray_Descr *descr =  PyArray_DescrNewFromType(NPY_UINT8);
+            return PyArray_NewFromDescr(&PyArray_Type, descr, 1, dims, NULL,
+                                        buf, NPY_ARRAY_WRITEABLE, NULL);
+         """),
+        ("set_own", "METH_O", """
+            if (!PyArray_Check(args)) {
+                PyErr_SetString(PyExc_ValueError,
+                             "need an ndarray");
+                return NULL;
+            }
+            PyArray_ENABLEFLAGS((PyArrayObject*)args, NPY_ARRAY_OWNDATA);
+            // Maybe try this too?
+            // PyArray_BASE(PyArrayObject *)args) = NULL;
+            Py_RETURN_NONE;
+         """),
+        ("get_array_with_base", "METH_NOARGS", """
+            char *buf = (char *)malloc(20);
+            npy_intp dims[1];
+            dims[0] = 20;
+            PyArray_Descr *descr =  PyArray_DescrNewFromType(NPY_UINT8);
+            PyObject *arr = PyArray_NewFromDescr(&PyArray_Type, descr, 1, dims,
+                                                 NULL, buf,
+                                                 NPY_ARRAY_WRITEABLE, NULL);
+            if (arr == NULL) return NULL;
+            PyObject *obj = PyCapsule_New(buf, "buf capsule",
+                                          (PyCapsule_Destructor)&warn_on_free);
+            if (obj == NULL) {
+                Py_DECREF(arr);
+                return NULL;
+            }
+            if (PyArray_SetBaseObject((PyArrayObject *)arr, obj) < 0) {
+                Py_DECREF(arr);
+                Py_DECREF(obj);
+                return NULL;
+            }
+            return arr;
+
+         """),
+    ]
+    prologue = '''
+        #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
+        #include <numpy/arrayobject.h>
+        /*
+         * This struct allows the dynamic configuration of the allocator funcs
+         * of the `secret_data_allocator`. It is provided here for
+         * demonstration purposes, as a valid `ctx` use-case scenario.
+         */
+        typedef struct {
+            void *(*malloc)(size_t);
+            void *(*calloc)(size_t, size_t);
+            void *(*realloc)(void *, size_t);
+            void (*free)(void *);
+        } SecretDataAllocatorFuncs;
+
+        NPY_NO_EXPORT void *
+        shift_alloc(void *ctx, size_t sz) {
+            SecretDataAllocatorFuncs *funcs = (SecretDataAllocatorFuncs *)ctx;
+            char *real = (char *)funcs->malloc(sz + 64);
+            if (real == NULL) {
+                return NULL;
+            }
+            snprintf(real, 64, "originally allocated %ld", (unsigned long)sz);
+            return (void *)(real + 64);
+        }
+        NPY_NO_EXPORT void *
+        shift_zero(void *ctx, size_t sz, size_t cnt) {
+            SecretDataAllocatorFuncs *funcs = (SecretDataAllocatorFuncs *)ctx;
+            char *real = (char *)funcs->calloc(sz + 64, cnt);
+            if (real == NULL) {
+                return NULL;
+            }
+            snprintf(real, 64, "originally allocated %ld via zero",
+                     (unsigned long)sz);
+            return (void *)(real + 64);
+        }
+        NPY_NO_EXPORT void
+        shift_free(void *ctx, void * p, npy_uintp sz) {
+            SecretDataAllocatorFuncs *funcs = (SecretDataAllocatorFuncs *)ctx;
+            if (p == NULL) {
+                return ;
+            }
+            char *real = (char *)p - 64;
+            if (strncmp(real, "originally allocated", 20) != 0) {
+                fprintf(stdout, "uh-oh, unmatched shift_free, "
+                        "no appropriate prefix\\n");
+                /* Make C runtime crash by calling free on the wrong address */
+                funcs->free((char *)p + 10);
+                /* funcs->free(real); */
+            }
+            else {
+                npy_uintp i = (npy_uintp)atoi(real +20);
+                if (i != sz) {
+                    fprintf(stderr, "uh-oh, unmatched shift_free"
+                            "(ptr, %ld) but allocated %ld\\n", sz, i);
+                    /* This happens in some places, only print */
+                    funcs->free(real);
+                }
+                else {
+                    funcs->free(real);
+                }
+            }
+        }
+        NPY_NO_EXPORT void *
+        shift_realloc(void *ctx, void * p, npy_uintp sz) {
+            SecretDataAllocatorFuncs *funcs = (SecretDataAllocatorFuncs *)ctx;
+            if (p != NULL) {
+                char *real = (char *)p - 64;
+                if (strncmp(real, "originally allocated", 20) != 0) {
+                    fprintf(stdout, "uh-oh, unmatched shift_realloc\\n");
+                    return realloc(p, sz);
+                }
+                return (void *)((char *)funcs->realloc(real, sz + 64) + 64);
+            }
+            else {
+                char *real = (char *)funcs->realloc(p, sz + 64);
+                if (real == NULL) {
+                    return NULL;
+                }
+                snprintf(real, 64, "originally allocated "
+                         "%ld  via realloc", (unsigned long)sz);
+                return (void *)(real + 64);
+            }
+        }
+        /* As an example, we use the standard {m|c|re}alloc/free funcs. */
+        static SecretDataAllocatorFuncs secret_data_handler_ctx = {
+            malloc,
+            calloc,
+            realloc,
+            free
+        };
+        static PyDataMem_Handler secret_data_handler = {
+            "secret_data_allocator",
+            1,
+            {
+                &secret_data_handler_ctx, /* ctx */
+                shift_alloc,              /* malloc */
+                shift_zero,               /* calloc */
+                shift_realloc,            /* realloc */
+                shift_free                /* free */
+            }
+        };
+        void warn_on_free(void *capsule) {
+            PyErr_WarnEx(PyExc_UserWarning, "in warn_on_free", 1);
+            void * obj = PyCapsule_GetPointer(capsule,
+                                              PyCapsule_GetName(capsule));
+            free(obj);
+        };
+        '''
+    more_init = "import_array();"
+    try:
+        import mem_policy
+        return mem_policy
+    except ImportError:
+        pass
+    # if it does not exist, build and load it
+    return extbuild.build_and_import_extension('mem_policy',
+                                               functions,
+                                               prologue=prologue,
+                                               include_dirs=[np.get_include()],
+                                               build_dir=tmp_path,
+                                               more_init=more_init)
+
+
+def test_set_policy(get_module):
+
+    get_handler_name = np.core.multiarray.get_handler_name
+    get_handler_version = np.core.multiarray.get_handler_version
+    orig_policy_name = get_handler_name()
+
+    a = np.arange(10).reshape((2, 5))  # a doesn't own its own data
+    assert get_handler_name(a) is None
+    assert get_handler_version(a) is None
+    assert get_handler_name(a.base) == orig_policy_name
+    assert get_handler_version(a.base) == 1
+
+    orig_policy = get_module.set_secret_data_policy()
+
+    b = np.arange(10).reshape((2, 5))  # b doesn't own its own data
+    assert get_handler_name(b) is None
+    assert get_handler_version(b) is None
+    assert get_handler_name(b.base) == 'secret_data_allocator'
+    assert get_handler_version(b.base) == 1
+
+    if orig_policy_name == 'default_allocator':
+        get_module.set_old_policy(None)  # tests PyDataMem_SetHandler(NULL)
+        assert get_handler_name() == 'default_allocator'
+    else:
+        get_module.set_old_policy(orig_policy)
+        assert get_handler_name() == orig_policy_name
+
+
+def test_default_policy_singleton(get_module):
+    get_handler_name = np.core.multiarray.get_handler_name
+
+    # set the policy to default
+    orig_policy = get_module.set_old_policy(None)
+
+    assert get_handler_name() == 'default_allocator'
+
+    # re-set the policy to default
+    def_policy_1 = get_module.set_old_policy(None)
+
+    assert get_handler_name() == 'default_allocator'
+
+    # set the policy to original
+    def_policy_2 = get_module.set_old_policy(orig_policy)
+
+    # since default policy is a singleton,
+    # these should be the same object
+    assert def_policy_1 is def_policy_2 is get_module.get_default_policy()
+
+
+def test_policy_propagation(get_module):
+    # The memory policy goes hand-in-hand with flags.owndata
+
+    class MyArr(np.ndarray):
+        pass
+
+    get_handler_name = np.core.multiarray.get_handler_name
+    orig_policy_name = get_handler_name()
+    a = np.arange(10).view(MyArr).reshape((2, 5))
+    assert get_handler_name(a) is None
+    assert a.flags.owndata is False
+
+    assert get_handler_name(a.base) is None
+    assert a.base.flags.owndata is False
+
+    assert get_handler_name(a.base.base) == orig_policy_name
+    assert a.base.base.flags.owndata is True
+
+
+async def concurrent_context1(get_module, orig_policy_name, event):
+    if orig_policy_name == 'default_allocator':
+        get_module.set_secret_data_policy()
+        assert np.core.multiarray.get_handler_name() == 'secret_data_allocator'
+    else:
+        get_module.set_old_policy(None)
+        assert np.core.multiarray.get_handler_name() == 'default_allocator'
+    event.set()
+
+
+async def concurrent_context2(get_module, orig_policy_name, event):
+    await event.wait()
+    # the policy is not affected by changes in parallel contexts
+    assert np.core.multiarray.get_handler_name() == orig_policy_name
+    # change policy in the child context
+    if orig_policy_name == 'default_allocator':
+        get_module.set_secret_data_policy()
+        assert np.core.multiarray.get_handler_name() == 'secret_data_allocator'
+    else:
+        get_module.set_old_policy(None)
+        assert np.core.multiarray.get_handler_name() == 'default_allocator'
+
+
+async def async_test_context_locality(get_module):
+    orig_policy_name = np.core.multiarray.get_handler_name()
+
+    event = asyncio.Event()
+    # the child contexts inherit the parent policy
+    concurrent_task1 = asyncio.create_task(
+        concurrent_context1(get_module, orig_policy_name, event))
+    concurrent_task2 = asyncio.create_task(
+        concurrent_context2(get_module, orig_policy_name, event))
+    await concurrent_task1
+    await concurrent_task2
+
+    # the parent context is not affected by child policy changes
+    assert np.core.multiarray.get_handler_name() == orig_policy_name
+
+
+def test_context_locality(get_module):
+    if (sys.implementation.name == 'pypy'
+            and sys.pypy_version_info[:3] < (7, 3, 6)):
+        pytest.skip('no context-locality support in PyPy < 7.3.6')
+    asyncio.run(async_test_context_locality(get_module))
+
+
+def concurrent_thread1(get_module, event):
+    get_module.set_secret_data_policy()
+    assert np.core.multiarray.get_handler_name() == 'secret_data_allocator'
+    event.set()
+
+
+def concurrent_thread2(get_module, event):
+    event.wait()
+    # the policy is not affected by changes in parallel threads
+    assert np.core.multiarray.get_handler_name() == 'default_allocator'
+    # change policy in the child thread
+    get_module.set_secret_data_policy()
+
+
+def test_thread_locality(get_module):
+    orig_policy_name = np.core.multiarray.get_handler_name()
+
+    event = threading.Event()
+    # the child threads do not inherit the parent policy
+    concurrent_task1 = threading.Thread(target=concurrent_thread1,
+                                        args=(get_module, event))
+    concurrent_task2 = threading.Thread(target=concurrent_thread2,
+                                        args=(get_module, event))
+    concurrent_task1.start()
+    concurrent_task2.start()
+    concurrent_task1.join()
+    concurrent_task2.join()
+
+    # the parent thread is not affected by child policy changes
+    assert np.core.multiarray.get_handler_name() == orig_policy_name
+
+
+@pytest.mark.slow
+def test_new_policy(get_module):
+    a = np.arange(10)
+    orig_policy_name = np.core.multiarray.get_handler_name(a)
+
+    orig_policy = get_module.set_secret_data_policy()
+
+    b = np.arange(10)
+    assert np.core.multiarray.get_handler_name(b) == 'secret_data_allocator'
+
+    # test array manipulation. This is slow
+    if orig_policy_name == 'default_allocator':
+        # when the np.core.test tests recurse into this test, the
+        # policy will be set so this "if" will be false, preventing
+        # infinite recursion
+        #
+        # if needed, debug this by
+        # - running tests with -- -s (to not capture stdout/stderr
+        # - setting extra_argv=['-vv'] here
+        assert np.core.test('full', verbose=2, extra_argv=['-vv'])
+        # also try the ma tests, the pickling test is quite tricky
+        assert np.ma.test('full', verbose=2, extra_argv=['-vv'])
+
+    get_module.set_old_policy(orig_policy)
+
+    c = np.arange(10)
+    assert np.core.multiarray.get_handler_name(c) == orig_policy_name
+
+@pytest.mark.xfail(sys.implementation.name == "pypy",
+                   reason=("bad interaction between getenv and "
+                           "os.environ inside pytest"))
+@pytest.mark.parametrize("policy", ["0", "1", None])
+def test_switch_owner(get_module, policy):
+    a = get_module.get_array()
+    assert np.core.multiarray.get_handler_name(a) is None
+    get_module.set_own(a)
+    oldval = os.environ.get('NUMPY_WARN_IF_NO_MEM_POLICY', None)
+    if policy is None:
+        if 'NUMPY_WARN_IF_NO_MEM_POLICY' in os.environ:
+            os.environ.pop('NUMPY_WARN_IF_NO_MEM_POLICY')
+    else:
+        os.environ['NUMPY_WARN_IF_NO_MEM_POLICY'] = policy
+    try:
+        # The policy should be NULL, so we have to assume we can call
+        # "free".  A warning is given if the policy == "1"
+        if policy == "1":
+            with assert_warns(RuntimeWarning) as w:
+                del a
+                gc.collect()
+        else:
+            del a
+            gc.collect()
+
+    finally:
+        if oldval is None:
+            if 'NUMPY_WARN_IF_NO_MEM_POLICY' in os.environ:
+                os.environ.pop('NUMPY_WARN_IF_NO_MEM_POLICY')
+        else:
+            os.environ['NUMPY_WARN_IF_NO_MEM_POLICY'] = oldval
+
+def test_owner_is_base(get_module):
+    a = get_module.get_array_with_base()
+    with pytest.warns(UserWarning, match='warn_on_free'):
+        del a
+        gc.collect()
index f807b90a3654b52665586807717c4d94b80acc65..4413cd0d0e697496ab86ad8b58b9e596ae29bbfa 100644 (file)
@@ -25,8 +25,8 @@ from numpy.core._rational_tests import rational
 from numpy.testing import (
     assert_, assert_raises, assert_warns, assert_equal, assert_almost_equal,
     assert_array_equal, assert_raises_regex, assert_array_almost_equal,
-    assert_allclose, IS_PYPY, HAS_REFCOUNT, assert_array_less, runstring,
-    temppath, suppress_warnings, break_cycles,
+    assert_allclose, IS_PYPY, IS_PYSTON, HAS_REFCOUNT, assert_array_less,
+    runstring, temppath, suppress_warnings, break_cycles,
     )
 from numpy.testing._private.utils import _no_tracing
 from numpy.core.tests._locales import CommaDecimalPointLocale
@@ -2511,27 +2511,19 @@ class TestMethods:
         assert_(not isinstance(a.searchsorted(b, 'left', s), A))
         assert_(not isinstance(a.searchsorted(b, 'right', s), A))
 
-    def test_argpartition_out_of_range(self):
+    @pytest.mark.parametrize("dtype", np.typecodes["All"])
+    def test_argpartition_out_of_range(self, dtype):
         # Test out of range values in kth raise an error, gh-5469
-        d = np.arange(10)
+        d = np.arange(10).astype(dtype=dtype)
         assert_raises(ValueError, d.argpartition, 10)
         assert_raises(ValueError, d.argpartition, -11)
-        # Test also for generic type argpartition, which uses sorting
-        # and used to not bound check kth
-        d_obj = np.arange(10, dtype=object)
-        assert_raises(ValueError, d_obj.argpartition, 10)
-        assert_raises(ValueError, d_obj.argpartition, -11)
 
-    def test_partition_out_of_range(self):
+    @pytest.mark.parametrize("dtype", np.typecodes["All"])
+    def test_partition_out_of_range(self, dtype):
         # Test out of range values in kth raise an error, gh-5469
-        d = np.arange(10)
+        d = np.arange(10).astype(dtype=dtype)
         assert_raises(ValueError, d.partition, 10)
         assert_raises(ValueError, d.partition, -11)
-        # Test also for generic type partition, which uses sorting
-        # and used to not bound check kth
-        d_obj = np.arange(10, dtype=object)
-        assert_raises(ValueError, d_obj.partition, 10)
-        assert_raises(ValueError, d_obj.partition, -11)
 
     def test_argpartition_integer(self):
         # Test non-integer values in kth raise an error/
@@ -2551,26 +2543,30 @@ class TestMethods:
         d_obj = np.arange(10, dtype=object)
         assert_raises(TypeError, d_obj.partition, 9.)
 
-    def test_partition_empty_array(self):
+    @pytest.mark.parametrize("kth_dtype", np.typecodes["AllInteger"])
+    def test_partition_empty_array(self, kth_dtype):
         # check axis handling for multidimensional empty arrays
+        kth = np.array(0, dtype=kth_dtype)[()]
         a = np.array([])
         a.shape = (3, 2, 1, 0)
         for axis in range(-a.ndim, a.ndim):
             msg = 'test empty array partition with axis={0}'.format(axis)
-            assert_equal(np.partition(a, 0, axis=axis), a, msg)
+            assert_equal(np.partition(a, kth, axis=axis), a, msg)
         msg = 'test empty array partition with axis=None'
-        assert_equal(np.partition(a, 0, axis=None), a.ravel(), msg)
+        assert_equal(np.partition(a, kth, axis=None), a.ravel(), msg)
 
-    def test_argpartition_empty_array(self):
+    @pytest.mark.parametrize("kth_dtype", np.typecodes["AllInteger"])
+    def test_argpartition_empty_array(self, kth_dtype):
         # check axis handling for multidimensional empty arrays
+        kth = np.array(0, dtype=kth_dtype)[()]
         a = np.array([])
         a.shape = (3, 2, 1, 0)
         for axis in range(-a.ndim, a.ndim):
             msg = 'test empty array argpartition with axis={0}'.format(axis)
-            assert_equal(np.partition(a, 0, axis=axis),
+            assert_equal(np.partition(a, kth, axis=axis),
                          np.zeros_like(a, dtype=np.intp), msg)
         msg = 'test empty array argpartition with axis=None'
-        assert_equal(np.partition(a, 0, axis=None),
+        assert_equal(np.partition(a, kth, axis=None),
                      np.zeros_like(a.ravel(), dtype=np.intp), msg)
 
     def test_partition(self):
@@ -2901,10 +2897,12 @@ class TestMethods:
                 assert_array_equal(np.partition(d, kth)[kth], tgt,
                                    err_msg="data: %r\n kth: %r" % (d, kth))
 
-    def test_argpartition_gh5524(self):
+    @pytest.mark.parametrize("kth_dtype", np.typecodes["AllInteger"])
+    def test_argpartition_gh5524(self, kth_dtype):
         #  A test for functionality of argpartition on lists.
-        d = [6,7,3,2,9,0]
-        p = np.argpartition(d,1)
+        kth = np.array(1, dtype=kth_dtype)[()]
+        d = [6, 7, 3, 2, 9, 0]
+        p = np.argpartition(d, kth)
         self.assert_partitioned(np.array(d)[p],[1])
 
     def test_flatten(self):
@@ -4192,6 +4190,176 @@ class TestStringCompare:
         assert_array_equal(g1 < g2,  [g1[i] < g2[i] for i in [0, 1, 2]])
         assert_array_equal(g1 > g2,  [g1[i] > g2[i] for i in [0, 1, 2]])
 
+class TestArgmaxArgminCommon:
+
+    sizes = [(), (3,), (3, 2), (2, 3),
+             (3, 3), (2, 3, 4), (4, 3, 2),
+             (1, 2, 3, 4), (2, 3, 4, 1),
+             (3, 4, 1, 2), (4, 1, 2, 3)]
+
+    @pytest.mark.parametrize("size, axis", itertools.chain(*[[(size, axis)
+        for axis in list(range(-len(size), len(size))) + [None]]
+        for size in sizes]))
+    @pytest.mark.parametrize('method', [np.argmax, np.argmin])
+    def test_np_argmin_argmax_keepdims(self, size, axis, method):
+
+        arr = np.random.normal(size=size)
+
+        # contiguous arrays
+        if axis is None:
+            new_shape = [1 for _ in range(len(size))]
+        else:
+            new_shape = list(size)
+            new_shape[axis] = 1
+        new_shape = tuple(new_shape)
+
+        _res_orig = method(arr, axis=axis)
+        res_orig = _res_orig.reshape(new_shape)
+        res = method(arr, axis=axis, keepdims=True)
+        assert_equal(res, res_orig)
+        assert_(res.shape == new_shape)
+        outarray = np.empty(res.shape, dtype=res.dtype)
+        res1 = method(arr, axis=axis, out=outarray,
+                            keepdims=True)
+        assert_(res1 is outarray)
+        assert_equal(res, outarray)
+
+        if len(size) > 0:
+            wrong_shape = list(new_shape)
+            if axis is not None:
+                wrong_shape[axis] = 2
+            else:
+                wrong_shape[0] = 2
+            wrong_outarray = np.empty(wrong_shape, dtype=res.dtype)
+            with pytest.raises(ValueError):
+                method(arr.T, axis=axis,
+                        out=wrong_outarray, keepdims=True)
+
+        # non-contiguous arrays
+        if axis is None:
+            new_shape = [1 for _ in range(len(size))]
+        else:
+            new_shape = list(size)[::-1]
+            new_shape[axis] = 1
+        new_shape = tuple(new_shape)
+
+        _res_orig = method(arr.T, axis=axis)
+        res_orig = _res_orig.reshape(new_shape)
+        res = method(arr.T, axis=axis, keepdims=True)
+        assert_equal(res, res_orig)
+        assert_(res.shape == new_shape)
+        outarray = np.empty(new_shape[::-1], dtype=res.dtype)
+        outarray = outarray.T
+        res1 = method(arr.T, axis=axis, out=outarray,
+                            keepdims=True)
+        assert_(res1 is outarray)
+        assert_equal(res, outarray)
+
+        if len(size) > 0:
+            # one dimension lesser for non-zero sized
+            # array should raise an error
+            with pytest.raises(ValueError):
+                method(arr[0], axis=axis,
+                        out=outarray, keepdims=True)
+
+        if len(size) > 0:
+            wrong_shape = list(new_shape)
+            if axis is not None:
+                wrong_shape[axis] = 2
+            else:
+                wrong_shape[0] = 2
+            wrong_outarray = np.empty(wrong_shape, dtype=res.dtype)
+            with pytest.raises(ValueError):
+                method(arr.T, axis=axis,
+                        out=wrong_outarray, keepdims=True)
+
+    @pytest.mark.parametrize('method', ['max', 'min'])
+    def test_all(self, method):
+        a = np.random.normal(0, 1, (4, 5, 6, 7, 8))
+        arg_method = getattr(a, 'arg' + method)
+        val_method = getattr(a, method)
+        for i in range(a.ndim):
+            a_maxmin = val_method(i)
+            aarg_maxmin = arg_method(i)
+            axes = list(range(a.ndim))
+            axes.remove(i)
+            assert_(np.all(a_maxmin == aarg_maxmin.choose(
+                                        *a.transpose(i, *axes))))
+
+    @pytest.mark.parametrize('method', ['argmax', 'argmin'])
+    def test_output_shape(self, method):
+        # see also gh-616
+        a = np.ones((10, 5))
+        arg_method = getattr(a, method)
+        # Check some simple shape mismatches
+        out = np.ones(11, dtype=np.int_)
+        assert_raises(ValueError, arg_method, -1, out)
+
+        out = np.ones((2, 5), dtype=np.int_)
+        assert_raises(ValueError, arg_method, -1, out)
+
+        # these could be relaxed possibly (used to allow even the previous)
+        out = np.ones((1, 10), dtype=np.int_)
+        assert_raises(ValueError, arg_method, -1, out)
+
+        out = np.ones(10, dtype=np.int_)
+        arg_method(-1, out=out)
+        assert_equal(out, arg_method(-1))
+
+    @pytest.mark.parametrize('ndim', [0, 1])
+    @pytest.mark.parametrize('method', ['argmax', 'argmin'])
+    def test_ret_is_out(self, ndim, method):
+        a = np.ones((4,) + (3,)*ndim)
+        arg_method = getattr(a, method)
+        out = np.empty((3,)*ndim, dtype=np.intp)
+        ret = arg_method(axis=0, out=out)
+        assert ret is out
+
+    @pytest.mark.parametrize('np_array, method, idx, val',
+        [(np.zeros, 'argmax', 5942, "as"),
+         (np.ones, 'argmin', 6001, "0")])
+    def test_unicode(self, np_array, method, idx, val):
+        d = np_array(6031, dtype='<U9')
+        arg_method = getattr(d, method)
+        d[idx] = val
+        assert_equal(arg_method(), idx)
+
+    @pytest.mark.parametrize('arr_method, np_method',
+        [('argmax', np.argmax),
+         ('argmin', np.argmin)])
+    def test_np_vs_ndarray(self, arr_method, np_method):
+        # make sure both ndarray.argmax/argmin and
+        # numpy.argmax/argmin support out/axis args
+        a = np.random.normal(size=(2, 3))
+        arg_method = getattr(a, arr_method)
+
+        # check positional args
+        out1 = np.zeros(2, dtype=int)
+        out2 = np.zeros(2, dtype=int)
+        assert_equal(arg_method(1, out1), np_method(a, 1, out2))
+        assert_equal(out1, out2)
+
+        # check keyword args
+        out1 = np.zeros(3, dtype=int)
+        out2 = np.zeros(3, dtype=int)
+        assert_equal(arg_method(out=out1, axis=0),
+                     np_method(a, out=out2, axis=0))
+        assert_equal(out1, out2)
+
+    @pytest.mark.leaks_references(reason="replaces None with NULL.")
+    @pytest.mark.parametrize('method, vals',
+        [('argmax', (10, 30)),
+         ('argmin', (30, 10))])
+    def test_object_with_NULLs(self, method, vals):
+        # See gh-6032
+        a = np.empty(4, dtype='O')
+        arg_method = getattr(a, method)
+        ctypes.memset(a.ctypes.data, 0, a.nbytes)
+        assert_equal(arg_method(), 0)
+        a[3] = vals[0]
+        assert_equal(arg_method(), 3)
+        a[1] = vals[1]
+        assert_equal(arg_method(), 1)
 
 class TestArgmax:
 
@@ -4258,81 +4426,30 @@ class TestArgmax:
         ([True, False, True, False, False], 0),
     ]
 
-    def test_all(self):
-        a = np.random.normal(0, 1, (4, 5, 6, 7, 8))
-        for i in range(a.ndim):
-            amax = a.max(i)
-            aargmax = a.argmax(i)
-            axes = list(range(a.ndim))
-            axes.remove(i)
-            assert_(np.all(amax == aargmax.choose(*a.transpose(i,*axes))))
-
-    def test_combinations(self):
-        for arr, pos in self.nan_arr:
-            with suppress_warnings() as sup:
-                sup.filter(RuntimeWarning,
-                           "invalid value encountered in reduce")
-                max_val = np.max(arr)
-
-            assert_equal(np.argmax(arr), pos, err_msg="%r" % arr)
-            assert_equal(arr[np.argmax(arr)], max_val, err_msg="%r" % arr)
-
-    def test_output_shape(self):
-        # see also gh-616
-        a = np.ones((10, 5))
-        # Check some simple shape mismatches
-        out = np.ones(11, dtype=np.int_)
-        assert_raises(ValueError, a.argmax, -1, out)
-
-        out = np.ones((2, 5), dtype=np.int_)
-        assert_raises(ValueError, a.argmax, -1, out)
-
-        # these could be relaxed possibly (used to allow even the previous)
-        out = np.ones((1, 10), dtype=np.int_)
-        assert_raises(ValueError, a.argmax, -1, out)
-
-        out = np.ones(10, dtype=np.int_)
-        a.argmax(-1, out=out)
-        assert_equal(out, a.argmax(-1))
+    @pytest.mark.parametrize('data', nan_arr)
+    def test_combinations(self, data):
+        arr, pos = data
+        with suppress_warnings() as sup:
+            sup.filter(RuntimeWarning,
+                        "invalid value encountered in reduce")
+            val = np.max(arr)
 
-    @pytest.mark.parametrize('ndim', [0, 1])
-    def test_ret_is_out(self, ndim):
-        a = np.ones((4,) + (3,)*ndim)
-        out = np.empty((3,)*ndim, dtype=np.intp)
-        ret = a.argmax(axis=0, out=out)
-        assert ret is out
+        assert_equal(np.argmax(arr), pos, err_msg="%r" % arr)
+        assert_equal(arr[np.argmax(arr)], val, err_msg="%r" % arr)
 
-    def test_argmax_unicode(self):
-        d = np.zeros(6031, dtype='<U9')
-        d[5942] = "as"
-        assert_equal(d.argmax(), 5942)
+    def test_maximum_signed_integers(self):
 
-    def test_np_vs_ndarray(self):
-        # make sure both ndarray.argmax and numpy.argmax support out/axis args
-        a = np.random.normal(size=(2,3))
+        a = np.array([1, 2**7 - 1, -2**7], dtype=np.int8)
+        assert_equal(np.argmax(a), 1)
 
-        # check positional args
-        out1 = np.zeros(2, dtype=int)
-        out2 = np.zeros(2, dtype=int)
-        assert_equal(a.argmax(1, out1), np.argmax(a, 1, out2))
-        assert_equal(out1, out2)
+        a = np.array([1, 2**15 - 1, -2**15], dtype=np.int16)
+        assert_equal(np.argmax(a), 1)
 
-        # check keyword args
-        out1 = np.zeros(3, dtype=int)
-        out2 = np.zeros(3, dtype=int)
-        assert_equal(a.argmax(out=out1, axis=0), np.argmax(a, out=out2, axis=0))
-        assert_equal(out1, out2)
+        a = np.array([1, 2**31 - 1, -2**31], dtype=np.int32)
+        assert_equal(np.argmax(a), 1)
 
-    @pytest.mark.leaks_references(reason="replaces None with NULL.")
-    def test_object_argmax_with_NULLs(self):
-        # See gh-6032
-        a = np.empty(4, dtype='O')
-        ctypes.memset(a.ctypes.data, 0, a.nbytes)
-        assert_equal(a.argmax(), 0)
-        a[3] = 10
-        assert_equal(a.argmax(), 3)
-        a[1] = 30
-        assert_equal(a.argmax(), 1)
+        a = np.array([1, 2**63 - 1, -2**63], dtype=np.int64)
+        assert_equal(np.argmax(a), 1)
 
 
 class TestArgmin:
@@ -4400,15 +4517,6 @@ class TestArgmin:
         ([False, True, False, True, True], 0),
     ]
 
-    def test_all(self):
-        a = np.random.normal(0, 1, (4, 5, 6, 7, 8))
-        for i in range(a.ndim):
-            amin = a.min(i)
-            aargmin = a.argmin(i)
-            axes = list(range(a.ndim))
-            axes.remove(i)
-            assert_(np.all(amin == aargmin.choose(*a.transpose(i,*axes))))
-
     def test_combinations(self):
         for arr, pos in self.nan_arr:
             with suppress_warnings() as sup:
@@ -4421,75 +4529,18 @@ class TestArgmin:
 
     def test_minimum_signed_integers(self):
 
-        a = np.array([1, -2**7, -2**7 + 1], dtype=np.int8)
+        a = np.array([1, -2**7, -2**7 + 1, 2**7 - 1], dtype=np.int8)
         assert_equal(np.argmin(a), 1)
 
-        a = np.array([1, -2**15, -2**15 + 1], dtype=np.int16)
+        a = np.array([1, -2**15, -2**15 + 1, 2**15 - 1], dtype=np.int16)
         assert_equal(np.argmin(a), 1)
 
-        a = np.array([1, -2**31, -2**31 + 1], dtype=np.int32)
+        a = np.array([1, -2**31, -2**31 + 1, 2**31 - 1], dtype=np.int32)
         assert_equal(np.argmin(a), 1)
 
-        a = np.array([1, -2**63, -2**63 + 1], dtype=np.int64)
+        a = np.array([1, -2**63, -2**63 + 1, 2**63 - 1], dtype=np.int64)
         assert_equal(np.argmin(a), 1)
 
-    def test_output_shape(self):
-        # see also gh-616
-        a = np.ones((10, 5))
-        # Check some simple shape mismatches
-        out = np.ones(11, dtype=np.int_)
-        assert_raises(ValueError, a.argmin, -1, out)
-
-        out = np.ones((2, 5), dtype=np.int_)
-        assert_raises(ValueError, a.argmin, -1, out)
-
-        # these could be relaxed possibly (used to allow even the previous)
-        out = np.ones((1, 10), dtype=np.int_)
-        assert_raises(ValueError, a.argmin, -1, out)
-
-        out = np.ones(10, dtype=np.int_)
-        a.argmin(-1, out=out)
-        assert_equal(out, a.argmin(-1))
-
-    @pytest.mark.parametrize('ndim', [0, 1])
-    def test_ret_is_out(self, ndim):
-        a = np.ones((4,) + (3,)*ndim)
-        out = np.empty((3,)*ndim, dtype=np.intp)
-        ret = a.argmin(axis=0, out=out)
-        assert ret is out
-
-    def test_argmin_unicode(self):
-        d = np.ones(6031, dtype='<U9')
-        d[6001] = "0"
-        assert_equal(d.argmin(), 6001)
-
-    def test_np_vs_ndarray(self):
-        # make sure both ndarray.argmin and numpy.argmin support out/axis args
-        a = np.random.normal(size=(2, 3))
-
-        # check positional args
-        out1 = np.zeros(2, dtype=int)
-        out2 = np.ones(2, dtype=int)
-        assert_equal(a.argmin(1, out1), np.argmin(a, 1, out2))
-        assert_equal(out1, out2)
-
-        # check keyword args
-        out1 = np.zeros(3, dtype=int)
-        out2 = np.ones(3, dtype=int)
-        assert_equal(a.argmin(out=out1, axis=0), np.argmin(a, out=out2, axis=0))
-        assert_equal(out1, out2)
-
-    @pytest.mark.leaks_references(reason="replaces None with NULL.")
-    def test_object_argmin_with_NULLs(self):
-        # See gh-6032
-        a = np.empty(4, dtype='O')
-        ctypes.memset(a.ctypes.data, 0, a.nbytes)
-        assert_equal(a.argmin(), 0)
-        a[3] = 30
-        assert_equal(a.argmin(), 3)
-        a[1] = 10
-        assert_equal(a.argmin(), 1)
-
 
 class TestMinMax:
 
@@ -4832,9 +4883,9 @@ class TestIO:
         # this should probably be supported as a file
         # but for now test for proper errors
         b = io.BytesIO()
-        assert_raises(IOError, np.fromfile, b, np.uint8, 80)
+        assert_raises(OSError, np.fromfile, b, np.uint8, 80)
         d = np.ones(7)
-        assert_raises(IOError, lambda x: x.tofile(b), d)
+        assert_raises(OSError, lambda x: x.tofile(b), d)
 
     def test_bool_fromstring(self):
         v = np.array([True, False, True, False], dtype=np.bool_)
@@ -4917,12 +4968,12 @@ class TestIO:
         x.tofile(tmp_filename)
 
         def fail(*args, **kwargs):
-            raise IOError('Can not tell or seek')
+            raise OSError('Can not tell or seek')
 
         with io.open(tmp_filename, 'rb', buffering=0) as f:
             f.seek = fail
             f.tell = fail
-            assert_raises(IOError, np.fromfile, f, dtype=x.dtype)
+            assert_raises(OSError, np.fromfile, f, dtype=x.dtype)
 
     def test_io_open_unbuffered_fromfile(self, x, tmp_filename):
         # gh-6632
@@ -5231,12 +5282,12 @@ class TestIO:
     def test_tofile_cleanup(self, tmp_filename):
         x = np.zeros((10), dtype=object)
         with open(tmp_filename, 'wb') as f:
-            assert_raises(IOError, lambda: x.tofile(f, sep=''))
+            assert_raises(OSError, lambda: x.tofile(f, sep=''))
         # Dup-ed file handle should be closed or remove will fail on Windows OS
         os.remove(tmp_filename)
 
         # Also make sure that we close the Python handle
-        assert_raises(IOError, lambda: x.tofile(tmp_filename))
+        assert_raises(OSError, lambda: x.tofile(tmp_filename))
         os.remove(tmp_filename)
 
     def test_fromfile_subarray_binary(self, tmp_filename):
@@ -6734,7 +6785,7 @@ class TestMatmulOperator(MatmulCommon):
     def test_matmul_raises(self):
         assert_raises(TypeError, self.matmul, np.int8(5), np.int8(5))
         assert_raises(TypeError, self.matmul, np.void(b'abc'), np.void(b'abc'))
-        assert_raises(ValueError, self.matmul, np.arange(10), np.void(b'abc'))
+        assert_raises(TypeError, self.matmul, np.arange(10), np.void(b'abc'))
 
 def test_matmul_inplace():
     # It would be nice to support in-place matmul eventually, but for now
@@ -6958,6 +7009,13 @@ class TestNeighborhoodIter:
                 x, [-1, 0, -1, 1], 4, NEIGH_MODE['constant'])
         assert_array_equal(l, r)
 
+        # Test with start in the middle
+        r = [np.array([[4, 0, 1], [4, 2, 3]], dtype=dt),
+             np.array([[0, 1, 4], [2, 3, 4]], dtype=dt)]
+        l = _multiarray_tests.test_neighborhood_iterator(
+                x, [-1, 0, -1, 1], 4, NEIGH_MODE['constant'], 2)
+        assert_array_equal(l, r)
+
     def test_mirror2d(self, dt):
         x = np.array([[0, 1], [2, 3]], dtype=dt)
         r = [np.array([[0, 0, 1], [0, 0, 1]], dtype=dt),
@@ -7756,6 +7814,216 @@ class TestNewBufferProtocol:
         _multiarray_tests.corrupt_or_fix_bufferinfo(obj)
 
 
+class TestArrayCreationCopyArgument(object):
+
+    class RaiseOnBool:
+
+        def __bool__(self):
+            raise ValueError
+
+    true_vals = [True, np._CopyMode.ALWAYS, np.True_]
+    false_vals = [False, np._CopyMode.IF_NEEDED, np.False_]
+
+    def test_scalars(self):
+        # Test both numpy and python scalars
+        for dtype in np.typecodes["All"]:
+            arr = np.zeros((), dtype=dtype)
+            scalar = arr[()]
+            pyscalar = arr.item(0)
+
+            # Test never-copy raises error:
+            assert_raises(ValueError, np.array, scalar, 
+                            copy=np._CopyMode.NEVER)
+            assert_raises(ValueError, np.array, pyscalar, 
+                            copy=np._CopyMode.NEVER)
+            assert_raises(ValueError, np.array, pyscalar,
+                            copy=self.RaiseOnBool())
+            assert_raises(ValueError, _multiarray_tests.npy_ensurenocopy,
+                            [1])
+            # Casting with a dtype (to unsigned integers) can be special:
+            with pytest.raises(ValueError):
+                np.array(pyscalar, dtype=np.int64, copy=np._CopyMode.NEVER)
+
+    def test_compatible_cast(self):
+
+        # Some types are compatible even though they are different, no
+        # copy is necessary for them. This is mostly true for some integers
+        def int_types(byteswap=False):
+            int_types = (np.typecodes["Integer"] +
+                         np.typecodes["UnsignedInteger"])
+            for int_type in int_types:
+                yield np.dtype(int_type)
+                if byteswap:
+                    yield np.dtype(int_type).newbyteorder()
+
+        for int1 in int_types():
+            for int2 in int_types(True):
+                arr = np.arange(10, dtype=int1)
+
+                for copy in self.true_vals:
+                    res = np.array(arr, copy=copy, dtype=int2)
+                    assert res is not arr and res.flags.owndata
+                    assert_array_equal(res, arr)
+
+                if int1 == int2:
+                    # Casting is not necessary, base check is sufficient here
+                    for copy in self.false_vals:
+                        res = np.array(arr, copy=copy, dtype=int2)
+                        assert res is arr or res.base is arr
+
+                    res = np.array(arr,
+                                   copy=np._CopyMode.NEVER,
+                                   dtype=int2)
+                    assert res is arr or res.base is arr
+
+                else:
+                    # Casting is necessary, assert copy works:
+                    for copy in self.false_vals:
+                        res = np.array(arr, copy=copy, dtype=int2)
+                        assert res is not arr and res.flags.owndata
+                        assert_array_equal(res, arr)
+
+                    assert_raises(ValueError, np.array,
+                                  arr, copy=np._CopyMode.NEVER,
+                                  dtype=int2)
+                    assert_raises(ValueError, np.array,
+                                  arr, copy=None,
+                                  dtype=int2)
+
+    def test_buffer_interface(self):
+
+        # Buffer interface gives direct memory access (no copy)
+        arr = np.arange(10)
+        view = memoryview(arr)
+
+        # Checking bases is a bit tricky since numpy creates another
+        # memoryview, so use may_share_memory.
+        for copy in self.true_vals:
+            res = np.array(view, copy=copy)
+            assert not np.may_share_memory(arr, res)
+        for copy in self.false_vals:
+            res = np.array(view, copy=copy)
+            assert np.may_share_memory(arr, res)
+        res = np.array(view, copy=np._CopyMode.NEVER)
+        assert np.may_share_memory(arr, res)
+
+    def test_array_interfaces(self):
+        # Array interface gives direct memory access (much like a memoryview)
+        base_arr = np.arange(10)
+
+        class ArrayLike:
+            __array_interface__ = base_arr.__array_interface__
+
+        arr = ArrayLike()
+
+        for copy, val in [(True, None), (np._CopyMode.ALWAYS, None),
+                          (False, arr), (np._CopyMode.IF_NEEDED, arr),
+                          (np._CopyMode.NEVER, arr)]:
+            res = np.array(arr, copy=copy)
+            assert res.base is val
+
+    def test___array__(self):
+        base_arr = np.arange(10)
+
+        class ArrayLike:
+            def __array__(self):
+                # __array__ should return a copy, numpy cannot know this
+                # however.
+                return base_arr
+
+        arr = ArrayLike()
+
+        for copy in self.true_vals:
+            res = np.array(arr, copy=copy)
+            assert_array_equal(res, base_arr)
+            # An additional copy is currently forced by numpy in this case,
+            # you could argue, numpy does not trust the ArrayLike. This
+            # may be open for change:
+            assert res is not base_arr
+
+        for copy in self.false_vals:
+            res = np.array(arr, copy=False)
+            assert_array_equal(res, base_arr)
+            assert res is base_arr  # numpy trusts the ArrayLike
+
+        with pytest.raises(ValueError):
+            np.array(arr, copy=np._CopyMode.NEVER)
+
+    @pytest.mark.parametrize(
+            "arr", [np.ones(()), np.arange(81).reshape((9, 9))])
+    @pytest.mark.parametrize("order1", ["C", "F", None])
+    @pytest.mark.parametrize("order2", ["C", "F", "A", "K"])
+    def test_order_mismatch(self, arr, order1, order2):
+        # The order is the main (python side) reason that can cause
+        # a never-copy to fail.
+        # Prepare C-order, F-order and non-contiguous arrays:
+        arr = arr.copy(order1)
+        if order1 == "C":
+            assert arr.flags.c_contiguous
+        elif order1 == "F":
+            assert arr.flags.f_contiguous
+        elif arr.ndim != 0:
+            # Make array non-contiguous
+            arr = arr[::2, ::2]
+            assert not arr.flags.forc
+
+        # Whether a copy is necessary depends on the order of arr:
+        if order2 == "C":
+            no_copy_necessary = arr.flags.c_contiguous
+        elif order2 == "F":
+            no_copy_necessary = arr.flags.f_contiguous
+        else:
+            # Keeporder and Anyorder are OK with non-contiguous output.
+            # This is not consistent with the `astype` behaviour which
+            # enforces contiguity for "A". It is probably historic from when
+            # "K" did not exist.
+            no_copy_necessary = True
+
+        # Test it for both the array and a memoryview
+        for view in [arr, memoryview(arr)]:
+            for copy in self.true_vals:
+                res = np.array(view, copy=copy, order=order2)
+                assert res is not arr and res.flags.owndata
+                assert_array_equal(arr, res)
+
+            if no_copy_necessary:
+                for copy in self.false_vals:
+                    res = np.array(view, copy=copy, order=order2)
+                    # res.base.obj refers to the memoryview
+                    if not IS_PYPY:
+                        assert res is arr or res.base.obj is arr
+
+                res = np.array(view, copy=np._CopyMode.NEVER,
+                               order=order2)
+                if not IS_PYPY:
+                    assert res is arr or res.base.obj is arr
+            else:
+                for copy in self.false_vals:
+                    res = np.array(arr, copy=copy, order=order2)
+                    assert_array_equal(arr, res)
+                assert_raises(ValueError, np.array,
+                              view, copy=np._CopyMode.NEVER,
+                              order=order2)
+                assert_raises(ValueError, np.array,
+                              view, copy=None,
+                              order=order2)
+
+    def test_striding_not_ok(self):
+        arr = np.array([[1, 2, 4], [3, 4, 5]])
+        assert_raises(ValueError, np.array,
+                      arr.T, copy=np._CopyMode.NEVER,
+                      order='C')
+        assert_raises(ValueError, np.array,
+                      arr.T, copy=np._CopyMode.NEVER,
+                      order='C', dtype=np.int64)
+        assert_raises(ValueError, np.array,
+                      arr, copy=np._CopyMode.NEVER,
+                      order='F')
+        assert_raises(ValueError, np.array,
+                      arr, copy=np._CopyMode.NEVER,
+                      order='F', dtype=np.int64)
+
+
 class TestArrayAttributeDeletion:
 
     def test_multiarray_writable_attributes_deletion(self):
@@ -8024,6 +8292,8 @@ class TestConversion:
 
         assert_raises(NotImplementedError, bool, np.array(NotConvertible()))
         assert_raises(NotImplementedError, bool, np.array([NotConvertible()]))
+        if IS_PYSTON:
+            pytest.skip("Pyston disables recursion checking")
 
         self_containing = np.array([None])
         self_containing[0] = self_containing
index 6b743ab27301e7c7fe68f16f5a3d213cc483c5bc..ed775cac628d92b6ac2bf7815d7e0b3ca62a1887 100644 (file)
@@ -9,7 +9,7 @@ import numpy.core._multiarray_tests as _multiarray_tests
 from numpy import array, arange, nditer, all
 from numpy.testing import (
     assert_, assert_equal, assert_array_equal, assert_raises,
-    HAS_REFCOUNT, suppress_warnings
+    HAS_REFCOUNT, suppress_warnings, break_cycles
     )
 
 
@@ -2819,7 +2819,7 @@ def test_iter_writemasked_decref():
     for buf, mask_buf in it:
         buf[...] = (3, singleton)
 
-    del buf, mask_buf, it   # delete everything to ensure corrrect cleanup
+    del buf, mask_buf, it   # delete everything to ensure correct cleanup
 
     if HAS_REFCOUNT:
         # The buffer would have included additional items, they must be
@@ -3128,6 +3128,8 @@ def test_warn_noclose():
         assert len(sup.log) == 1
 
 
+@pytest.mark.skipif(sys.version_info[:2] == (3, 9) and sys.platform == "win32",
+                    reason="Errors with Python 3.9 on Windows")
 @pytest.mark.skipif(not HAS_REFCOUNT, reason="Python lacks refcounts")
 @pytest.mark.parametrize(["in_dtype", "buf_dtype"],
         [("i", "O"), ("O", "i"),  # most simple cases
@@ -3148,6 +3150,8 @@ def test_partial_iteration_cleanup(in_dtype, buf_dtype, steps):
 
     # Note that resetting does not free references
     del it
+    break_cycles()
+    break_cycles()
     assert count == sys.getrefcount(value)
 
     # Repeat the test with `iternext`
@@ -3157,6 +3161,8 @@ def test_partial_iteration_cleanup(in_dtype, buf_dtype, steps):
         it.iternext()
 
     del it  # should ensure cleanup
+    break_cycles()
+    break_cycles()
     assert count == sys.getrefcount(value)
 
 
@@ -3202,7 +3208,7 @@ def test_debug_print(capfd):
     Currently uses a subprocess to avoid dealing with the C level `printf`s.
     """
     # the expected output with all addresses and sizes stripped (they vary
-    # and/or are platform dependend).
+    # and/or are platform dependent).
     expected = """
     ------ BEGIN ITERATOR DUMP ------
     | Iterator Address:
index af311066a65b282c0fecfbded942e71c96a8ac8c..ad94379115a8532e8e5654364351013326d283ba 100644 (file)
@@ -16,7 +16,7 @@ from numpy.testing import (
     )
 from numpy.core._rational_tests import rational
 
-from hypothesis import assume, given, strategies as st
+from hypothesis import given, strategies as st
 from hypothesis.extra import numpy as hynp
 
 
@@ -637,59 +637,65 @@ class TestFloatExceptions:
         self.assert_raises_fpe(fpeerr, flop, sc1, sc2[()])
         self.assert_raises_fpe(fpeerr, flop, sc1[()], sc2[()])
 
-    def test_floating_exceptions(self):
+    # Test for all real and complex float types
+    @pytest.mark.parametrize("typecode", np.typecodes["AllFloat"])
+    def test_floating_exceptions(self, typecode):
         # Test basic arithmetic function errors
         with np.errstate(all='raise'):
-            # Test for all real and complex float types
-            for typecode in np.typecodes['AllFloat']:
-                ftype = np.obj2sctype(typecode)
-                if np.dtype(ftype).kind == 'f':
-                    # Get some extreme values for the type
-                    fi = np.finfo(ftype)
-                    ft_tiny = fi.tiny
-                    ft_max = fi.max
-                    ft_eps = fi.eps
-                    underflow = 'underflow'
-                    divbyzero = 'divide by zero'
-                else:
-                    # 'c', complex, corresponding real dtype
-                    rtype = type(ftype(0).real)
-                    fi = np.finfo(rtype)
-                    ft_tiny = ftype(fi.tiny)
-                    ft_max = ftype(fi.max)
-                    ft_eps = ftype(fi.eps)
-                    # The complex types raise different exceptions
-                    underflow = ''
-                    divbyzero = ''
-                overflow = 'overflow'
-                invalid = 'invalid'
-
+            ftype = np.obj2sctype(typecode)
+            if np.dtype(ftype).kind == 'f':
+                # Get some extreme values for the type
+                fi = np.finfo(ftype)
+                ft_tiny = fi._machar.tiny
+                ft_max = fi.max
+                ft_eps = fi.eps
+                underflow = 'underflow'
+                divbyzero = 'divide by zero'
+            else:
+                # 'c', complex, corresponding real dtype
+                rtype = type(ftype(0).real)
+                fi = np.finfo(rtype)
+                ft_tiny = ftype(fi._machar.tiny)
+                ft_max = ftype(fi.max)
+                ft_eps = ftype(fi.eps)
+                # The complex types raise different exceptions
+                underflow = ''
+                divbyzero = ''
+            overflow = 'overflow'
+            invalid = 'invalid'
+
+            # The value of tiny for double double is NaN, so we need to
+            # pass the assert
+            if not np.isnan(ft_tiny):
                 self.assert_raises_fpe(underflow,
-                                       lambda a, b: a/b, ft_tiny, ft_max)
+                                    lambda a, b: a/b, ft_tiny, ft_max)
                 self.assert_raises_fpe(underflow,
-                                       lambda a, b: a*b, ft_tiny, ft_tiny)
-                self.assert_raises_fpe(overflow,
-                                       lambda a, b: a*b, ft_max, ftype(2))
-                self.assert_raises_fpe(overflow,
-                                       lambda a, b: a/b, ft_max, ftype(0.5))
-                self.assert_raises_fpe(overflow,
-                                       lambda a, b: a+b, ft_max, ft_max*ft_eps)
-                self.assert_raises_fpe(overflow,
-                                       lambda a, b: a-b, -ft_max, ft_max*ft_eps)
-                self.assert_raises_fpe(overflow,
-                                       np.power, ftype(2), ftype(2**fi.nexp))
-                self.assert_raises_fpe(divbyzero,
-                                       lambda a, b: a/b, ftype(1), ftype(0))
-                self.assert_raises_fpe(invalid,
-                                       lambda a, b: a/b, ftype(np.inf), ftype(np.inf))
-                self.assert_raises_fpe(invalid,
-                                       lambda a, b: a/b, ftype(0), ftype(0))
-                self.assert_raises_fpe(invalid,
-                                       lambda a, b: a-b, ftype(np.inf), ftype(np.inf))
-                self.assert_raises_fpe(invalid,
-                                       lambda a, b: a+b, ftype(np.inf), ftype(-np.inf))
-                self.assert_raises_fpe(invalid,
-                                       lambda a, b: a*b, ftype(0), ftype(np.inf))
+                                    lambda a, b: a*b, ft_tiny, ft_tiny)
+            self.assert_raises_fpe(overflow,
+                                   lambda a, b: a*b, ft_max, ftype(2))
+            self.assert_raises_fpe(overflow,
+                                   lambda a, b: a/b, ft_max, ftype(0.5))
+            self.assert_raises_fpe(overflow,
+                                   lambda a, b: a+b, ft_max, ft_max*ft_eps)
+            self.assert_raises_fpe(overflow,
+                                   lambda a, b: a-b, -ft_max, ft_max*ft_eps)
+            self.assert_raises_fpe(overflow,
+                                   np.power, ftype(2), ftype(2**fi.nexp))
+            self.assert_raises_fpe(divbyzero,
+                                   lambda a, b: a/b, ftype(1), ftype(0))
+            self.assert_raises_fpe(
+                invalid, lambda a, b: a/b, ftype(np.inf), ftype(np.inf)
+            )
+            self.assert_raises_fpe(invalid,
+                                   lambda a, b: a/b, ftype(0), ftype(0))
+            self.assert_raises_fpe(
+                invalid, lambda a, b: a-b, ftype(np.inf), ftype(np.inf)
+            )
+            self.assert_raises_fpe(
+                invalid, lambda a, b: a+b, ftype(np.inf), ftype(-np.inf)
+            )
+            self.assert_raises_fpe(invalid,
+                                   lambda a, b: a*b, ftype(0), ftype(np.inf))
 
     def test_warnings(self):
         # test warning code path
@@ -898,7 +904,7 @@ class TestTypes:
             promote_types = np.promote_types
 
         S = string_dtype
-        
+
         # Promote numeric with unsized string:
         assert_equal(promote_types('bool', S), np.dtype(S+'5'))
         assert_equal(promote_types('b', S), np.dtype(S+'4'))
@@ -926,25 +932,6 @@ class TestTypes:
         # Promote with object:
         assert_equal(promote_types('O', S+'30'), np.dtype('O'))
 
-    @pytest.mark.parametrize(["dtype1", "dtype2"],
-            [[np.dtype("V6"), np.dtype("V10")],
-             [np.dtype([("name1", "i8")]), np.dtype([("name2", "i8")])],
-             [np.dtype("i8,i8"), np.dtype("i4,i4")],
-            ])
-    def test_invalid_void_promotion(self, dtype1, dtype2):
-        # Mainly test structured void promotion, which currently allows
-        # byte-swapping, but nothing else:
-        with pytest.raises(TypeError):
-            np.promote_types(dtype1, dtype2)
-
-    @pytest.mark.parametrize(["dtype1", "dtype2"],
-            [[np.dtype("V10"), np.dtype("V10")],
-             [np.dtype([("name1", "<i8")]), np.dtype([("name1", ">i8")])],
-             [np.dtype("i8,i8"), np.dtype("i8,>i8")],
-            ])
-    def test_valid_void_promotion(self, dtype1, dtype2):
-        assert np.promote_types(dtype1, dtype2) is dtype1
-
     @pytest.mark.parametrize("dtype",
            list(np.typecodes["All"]) +
            ["i,i", "S3", "S100", "U3", "U100", rational])
@@ -2346,8 +2333,14 @@ class TestClip:
         actual = np.clip(arr, amin, amax)
         assert_equal(actual, expected)
 
-    @given(data=st.data(), shape=hynp.array_shapes())
-    def test_clip_property(self, data, shape):
+    @given(
+        data=st.data(),
+        arr=hynp.arrays(
+            dtype=hynp.integer_dtypes() | hynp.floating_dtypes(),
+            shape=hynp.array_shapes()
+        )
+    )
+    def test_clip_property(self, data, arr):
         """A property-based test using Hypothesis.
 
         This aims for maximum generality: it could in principle generate *any*
@@ -2363,49 +2356,30 @@ class TestClip:
         That accounts for most of the function; the actual test is just three
         lines to calculate and compare actual vs expected results!
         """
-        # Our base array and bounds should not need to be of the same type as
-        # long as they are all compatible - so we allow any int or float type.
-        dtype_strategy = hynp.integer_dtypes() | hynp.floating_dtypes()
-
-        # The following line is a total hack to disable the varied-dtypes
-        # component of this test, because result != expected if dtypes can vary.
-        dtype_strategy = st.just(data.draw(dtype_strategy))
-
-        # Generate an arbitrary array of the chosen shape and dtype
-        # This is the value that we clip.
-        arr = data.draw(hynp.arrays(dtype=dtype_strategy, shape=shape))
-
+        numeric_dtypes = hynp.integer_dtypes() | hynp.floating_dtypes()
         # Generate shapes for the bounds which can be broadcast with each other
         # and with the base shape.  Below, we might decide to use scalar bounds,
         # but it's clearer to generate these shapes unconditionally in advance.
         in_shapes, result_shape = data.draw(
             hynp.mutually_broadcastable_shapes(
-                num_shapes=2,
-                base_shape=shape,
-                # Commenting out the min_dims line allows zero-dimensional arrays,
-                # and zero-dimensional arrays containing NaN make the test fail.
-                min_dims=1
-  
+                num_shapes=2, base_shape=arr.shape
             )
         )
-        amin = data.draw(
-            dtype_strategy.flatmap(hynp.from_dtype)
-            | hynp.arrays(dtype=dtype_strategy, shape=in_shapes[0])
-        )
-        amax = data.draw(
-            dtype_strategy.flatmap(hynp.from_dtype)
-            | hynp.arrays(dtype=dtype_strategy, shape=in_shapes[1])
-        )
-        # If we allow either bound to be a scalar `nan`, the test will fail -
-        # so we just "assume" that away (if it is, this raises a special
-        # exception and Hypothesis will try again with different inputs)
-        assume(not np.isscalar(amin) or not np.isnan(amin))
-        assume(not np.isscalar(amax) or not np.isnan(amax))
+        # Scalar `nan` is deprecated due to the differing behaviour it shows.
+        s = numeric_dtypes.flatmap(
+            lambda x: hynp.from_dtype(x, allow_nan=False))
+        amin = data.draw(s | hynp.arrays(dtype=numeric_dtypes,
+            shape=in_shapes[0], elements={"allow_nan": False}))
+        amax = data.draw(s | hynp.arrays(dtype=numeric_dtypes,
+            shape=in_shapes[1], elements={"allow_nan": False}))
 
         # Then calculate our result and expected result and check that they're
-        # equal!  See gh-12519 for discussion deciding on this property.
+        # equal!  See gh-12519 and gh-19457 for discussion deciding on this
+        # property and the result_type argument.
         result = np.clip(arr, amin, amax)
-        expected = np.minimum(amax, np.maximum(arr, amin))
+        t = np.result_type(arr, amin, amax)
+        expected = np.minimum(amax, np.maximum(arr, amin, dtype=t), dtype=t)
+        assert result.dtype == t
         assert_array_equal(result, expected)
 
 
@@ -2656,15 +2630,15 @@ class TestStdVar:
 
     def test_ddof1(self):
         assert_almost_equal(np.var(self.A, ddof=1),
-                            self.real_var*len(self.A)/float(len(self.A)-1))
+                            self.real_var * len(self.A) / (len(self.A) - 1))
         assert_almost_equal(np.std(self.A, ddof=1)**2,
-                            self.real_var*len(self.A)/float(len(self.A)-1))
+                            self.real_var*len(self.A) / (len(self.A) - 1))
 
     def test_ddof2(self):
         assert_almost_equal(np.var(self.A, ddof=2),
-                            self.real_var*len(self.A)/float(len(self.A)-2))
+                            self.real_var * len(self.A) / (len(self.A) - 2))
         assert_almost_equal(np.std(self.A, ddof=2)**2,
-                            self.real_var*len(self.A)/float(len(self.A)-2))
+                            self.real_var * len(self.A) / (len(self.A) - 2))
 
     def test_out_scalar(self):
         d = np.arange(10)
@@ -2912,6 +2886,21 @@ class TestLikeFuncs:
         self.check_like_function(np.full_like, 123.456, True)
         self.check_like_function(np.full_like, np.inf, True)
 
+    @pytest.mark.parametrize('likefunc', [np.empty_like, np.full_like,
+                                          np.zeros_like, np.ones_like])
+    @pytest.mark.parametrize('dtype', [str, bytes])
+    def test_dtype_str_bytes(self, likefunc, dtype):
+        # Regression test for gh-19860
+        a = np.arange(16).reshape(2, 8)
+        b = a[:, ::2]  # Ensure b is not contiguous.
+        kwargs = {'fill_value': ''} if likefunc == np.full_like else {}
+        result = likefunc(b, dtype=dtype, **kwargs)
+        if dtype == str:
+            assert result.strides == (16, 4)
+        else:
+            # dtype is bytes
+            assert result.strides == (4, 1)
+
 
 class TestCorrelate:
     def _setup(self, dt):
@@ -3515,6 +3504,12 @@ class TestBroadcast:
 
         assert_raises(ValueError, np.broadcast, 1, **{'x': 1})
 
+    def test_shape_mismatch_error_message(self):
+        with pytest.raises(ValueError, match=r"arg 0 with shape \(1, 3\) and "
+                                             r"arg 2 with shape \(2,\)"):
+            np.broadcast([[1, 2, 3]], [[4], [5]], [6, 7])
+
+
 class TestKeepdims:
 
     class sub_array(np.ndarray):
index 312d0683de0e0dd7c00f067f23e1f1f075c74e0a..21cc8c1595f6a7295825cd92276702d68b62d681 100644 (file)
@@ -12,7 +12,7 @@ from numpy.testing import (
         assert_, assert_equal, IS_PYPY, assert_almost_equal,
         assert_array_equal, assert_array_almost_equal, assert_raises,
         assert_raises_regex, assert_warns, suppress_warnings,
-        _assert_valid_refcount, HAS_REFCOUNT,
+        _assert_valid_refcount, HAS_REFCOUNT, IS_PYSTON
         )
 from numpy.testing._private.utils import _no_tracing, requires_memory
 from numpy.compat import asbytes, asunicode, pickle
@@ -22,6 +22,8 @@ try:
 except NameError:
     RecursionError = RuntimeError  # python < 3.5
 
+
+
 class TestRegression:
     def test_invalid_round(self):
         # Ticket #3
@@ -1796,6 +1798,7 @@ class TestRegression:
         assert_(a.flags.f_contiguous)
         assert_(b.flags.c_contiguous)
 
+    @pytest.mark.skipif(IS_PYSTON, reason="Pyston disables recursion checking")
     def test_object_array_self_reference(self):
         # Object arrays with references to themselves can cause problems
         a = np.array(0, dtype=object)
@@ -1804,6 +1807,7 @@ class TestRegression:
         assert_raises(RecursionError, float, a)
         a[()] = None
 
+    @pytest.mark.skipif(IS_PYSTON, reason="Pyston disables recursion checking")
     def test_object_array_circular_reference(self):
         # Test the same for a circular reference.
         a = np.array(0, dtype=object)
index 3693bba59ce6b9636f8cfb333cf06bac7da0b878..eef4c14339109a6522146782b8fa72d309425905 100644 (file)
@@ -1,8 +1,11 @@
 """
 Test the scalar constructors, which also do type-coercion
 """
+import sys
 import fractions
 import platform
+import types
+from typing import Any, Type
 
 import pytest
 import numpy as np
@@ -102,3 +105,99 @@ class TestAsIntegerRatio:
                 pytest.skip("longdouble too small on this platform")
 
             assert_equal(nf / df, f, "{}/{}".format(n, d))
+
+
+class TestIsInteger:
+    @pytest.mark.parametrize("str_value", ["inf", "nan"])
+    @pytest.mark.parametrize("code", np.typecodes["Float"])
+    def test_special(self, code: str, str_value: str) -> None:
+        cls = np.dtype(code).type
+        value = cls(str_value)
+        assert not value.is_integer()
+
+    @pytest.mark.parametrize(
+        "code", np.typecodes["Float"] + np.typecodes["AllInteger"]
+    )
+    def test_true(self, code: str) -> None:
+        float_array = np.arange(-5, 5).astype(code)
+        for value in float_array:
+            assert value.is_integer()
+
+    @pytest.mark.parametrize("code", np.typecodes["Float"])
+    def test_false(self, code: str) -> None:
+        float_array = np.arange(-5, 5).astype(code)
+        float_array *= 1.1
+        for value in float_array:
+            if value == 0:
+                continue
+            assert not value.is_integer()
+
+
+@pytest.mark.skipif(sys.version_info < (3, 9), reason="Requires python 3.9")
+class TestClassGetItem:
+    @pytest.mark.parametrize("cls", [
+        np.number,
+        np.integer,
+        np.inexact,
+        np.unsignedinteger,
+        np.signedinteger,
+        np.floating,
+    ])
+    def test_abc(self, cls: Type[np.number]) -> None:
+        alias = cls[Any]
+        assert isinstance(alias, types.GenericAlias)
+        assert alias.__origin__ is cls
+
+    def test_abc_complexfloating(self) -> None:
+        alias = np.complexfloating[Any, Any]
+        assert isinstance(alias, types.GenericAlias)
+        assert alias.__origin__ is np.complexfloating
+
+    @pytest.mark.parametrize("cls", [np.generic, np.flexible, np.character])
+    def test_abc_non_numeric(self, cls: Type[np.generic]) -> None:
+        with pytest.raises(TypeError):
+            cls[Any]
+
+    @pytest.mark.parametrize("code", np.typecodes["All"])
+    def test_concrete(self, code: str) -> None:
+        cls = np.dtype(code).type
+        with pytest.raises(TypeError):
+            cls[Any]
+
+    @pytest.mark.parametrize("arg_len", range(4))
+    def test_subscript_tuple(self, arg_len: int) -> None:
+        arg_tup = (Any,) * arg_len
+        if arg_len == 1:
+            assert np.number[arg_tup]
+        else:
+            with pytest.raises(TypeError):
+                np.number[arg_tup]
+
+    def test_subscript_scalar(self) -> None:
+        assert np.number[Any]
+
+
+@pytest.mark.skipif(sys.version_info >= (3, 9), reason="Requires python 3.8")
+@pytest.mark.parametrize("cls", [np.number, np.complexfloating, np.int64])
+def test_class_getitem_38(cls: Type[np.number]) -> None:
+    match = "Type subscription requires python >= 3.9"
+    with pytest.raises(TypeError, match=match):
+        cls[Any]
+
+
+class TestBitCount:
+    # derived in part from the cpython test "test_bit_count"
+
+    @pytest.mark.parametrize("itype", np.sctypes['int']+np.sctypes['uint'])
+    def test_small(self, itype):
+        for a in range(max(np.iinfo(itype).min, 0), 128):
+            msg = f"Smoke test for {itype}({a}).bit_count()"
+            assert itype(a).bit_count() == bin(a).count("1"), msg
+
+    def test_bit_count(self):
+        for exp in [10, 17, 63]:
+            a = 2**exp
+            assert np.uint64(a).bit_count() == 1
+            assert np.uint64(a - 1).bit_count() == exp
+            assert np.uint64(a ^ 63).bit_count() == 7
+            assert np.uint64((a - 1) ^ 510).bit_count() == exp - 8
index cc53eb24432fbd855da1777e9d57e43eab4fd664..98d7f7cdef7feaf6a6516f0ab80551c5e6d5eaa2 100644 (file)
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """ Test printing of scalar types.
 
 """
index 09a734284a76e806e4b71ce9a83d06e05a29a5e7..90078a2ea3cefd1e9af11fde3fa26db840ed4292 100644 (file)
@@ -5,14 +5,14 @@ import itertools
 import operator
 import platform
 import pytest
-from hypothesis import given, settings, Verbosity, assume
+from hypothesis import given, settings, Verbosity
 from hypothesis.strategies import sampled_from
 
 import numpy as np
 from numpy.testing import (
     assert_, assert_equal, assert_raises, assert_almost_equal,
     assert_array_equal, IS_PYPY, suppress_warnings, _gen_alignment_data,
-    assert_warns, assert_raises_regex,
+    assert_warns,
     )
 
 types = [np.bool_, np.byte, np.ubyte, np.short, np.ushort, np.intc, np.uintc,
@@ -307,8 +307,8 @@ class TestModulus:
         # promotes to float which does not fit
         a = np.array([1, 2], np.int64)
         b = np.array([1, 2], np.uint64)
-        pattern = 'could not be coerced to provided output parameter'
-        with assert_raises_regex(TypeError, pattern):
+        with pytest.raises(TypeError,
+                match=r"Cannot cast ufunc 'floor_divide' output from"):
             a //= b
 
 
@@ -670,18 +670,28 @@ class TestAbs:
         x = test_dtype(np.finfo(test_dtype).max)
         assert_equal(absfunc(x), x.real)
 
-        x = test_dtype(np.finfo(test_dtype).tiny)
-        assert_equal(absfunc(x), x.real)
+        with suppress_warnings() as sup:
+            sup.filter(UserWarning)
+            x = test_dtype(np.finfo(test_dtype).tiny)
+            assert_equal(absfunc(x), x.real)
 
         x = test_dtype(np.finfo(test_dtype).min)
         assert_equal(absfunc(x), -x.real)
 
     @pytest.mark.parametrize("dtype", floating_types + complex_floating_types)
     def test_builtin_abs(self, dtype):
+        if sys.platform == "cygwin" and dtype == np.clongdouble:
+            pytest.xfail(
+                reason="absl is computed in double precision on cygwin"
+            )
         self._test_abs_func(abs, dtype)
 
     @pytest.mark.parametrize("dtype", floating_types + complex_floating_types)
     def test_numpy_abs(self, dtype):
+        if sys.platform == "cygwin" and dtype == np.clongdouble:
+            pytest.xfail(
+                reason="absl is computed in double precision on cygwin"
+            )
         self._test_abs_func(np.abs, dtype)
 
 class TestBitShifts:
index 2f1c3bc5e3095c95b24dc473ee4b9aafb2b7d54e..ee21d4aa5e0d68376d41690038e55f459c933af5 100644 (file)
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """ Test printing of scalar types.
 
 """
index 0270ad901662effbfaa40566971fa8ec77fef955..12a67c44dde5fba30dc168531b2a7d71afb6afb1 100644 (file)
@@ -330,6 +330,37 @@ class _SIMD_FP(_Test_Utility):
         square = self.square(vdata)
         assert square == data_square
 
+    @pytest.mark.parametrize("intrin, func", [("self.ceil", math.ceil),
+    ("self.trunc", math.trunc)])
+    def test_rounding(self, intrin, func):
+        """
+        Test intrinsics:
+            npyv_ceil_##SFX
+            npyv_trunc_##SFX
+        """
+        intrin_name = intrin
+        intrin = eval(intrin)
+        pinf, ninf, nan = self._pinfinity(), self._ninfinity(), self._nan()
+        # special cases
+        round_cases = ((nan, nan), (pinf, pinf), (ninf, ninf))
+        for case, desired in round_cases:
+            data_round = [desired]*self.nlanes
+            _round = intrin(self.setall(case))
+            assert _round == pytest.approx(data_round, nan_ok=True)
+        for x in range(0, 2**20, 256**2):
+            for w in (-1.05, -1.10, -1.15, 1.05, 1.10, 1.15):
+                data = [x*w+a for a in range(self.nlanes)]
+                vdata = self.load(data)
+                data_round = [func(x) for x in data]
+                _round = intrin(vdata)
+                assert _round == data_round
+        # signed zero
+        if "ceil" in intrin_name or "trunc" in intrin_name:
+            for w in (-0.25, -0.30, -0.45):
+                _round = self._to_unsigned(intrin(self.setall(w)))
+                data_round = self._to_unsigned(self.setall(-0.0))
+                assert _round == data_round
+    
     def test_max(self):
         """
         Test intrinsics:
index 091b47619a4639c02befef5838c1551041c78008..76e4cdcfd94aa3bf1304e4bd0242af58c7a7aceb 100644 (file)
@@ -12,7 +12,7 @@ import numpy.core._rational_tests as _rational_tests
 from numpy.testing import (
     assert_, assert_equal, assert_raises, assert_array_equal,
     assert_almost_equal, assert_array_almost_equal, assert_no_warnings,
-    assert_allclose, HAS_REFCOUNT,
+    assert_allclose, HAS_REFCOUNT, suppress_warnings
     )
 from numpy.compat import pickle
 
@@ -164,8 +164,9 @@ class TestUfuncGenericLoops:
                 except AttributeError:
                     return lambda: getattr(np.core.umath, attr)(val)
 
-        num_arr = np.array([val], dtype=np.float64)
-        obj_arr = np.array([MyFloat(val)], dtype="O")
+        # Use 0-D arrays, to ensure the same element call
+        num_arr = np.array(val, dtype=np.float64)
+        obj_arr = np.array(MyFloat(val), dtype="O")
 
         with np.errstate(all="raise"):
             try:
@@ -387,6 +388,24 @@ class TestUfunc:
         assert_equal(ixs, (0, 0, 0, 1, 2))
         assert_equal(flags, (self.can_ignore, self.size_inferred, 0))
         assert_equal(sizes, (3, -1, 9))
+    
+    def test_signature9(self):
+        enabled, num_dims, ixs, flags, sizes = umt.test_signature(
+            1, 1, "(  3)  -> ( )")
+        assert_equal(enabled, 1)
+        assert_equal(num_dims, (1, 0))
+        assert_equal(ixs, (0,))
+        assert_equal(flags, (0,))
+        assert_equal(sizes, (3,))
+
+    def test_signature10(self):
+        enabled, num_dims, ixs, flags, sizes = umt.test_signature(
+            3, 1, "( 3? ) , (3? ,  3?) ,(n )-> ( 9)")
+        assert_equal(enabled, 1)
+        assert_equal(num_dims, (1, 2, 1, 1))
+        assert_equal(ixs, (0, 0, 0, 1, 2))
+        assert_equal(flags, (self.can_ignore, self.size_inferred, 0))
+        assert_equal(sizes, (3, -1, 9))
 
     def test_signature_failure_extra_parenthesis(self):
         with assert_raises(ValueError):
@@ -517,6 +536,37 @@ class TestUfunc:
         np.add(arr, arr, dtype="m")
         np.maximum(arr, arr, dtype="m")
 
+    @pytest.mark.parametrize("ufunc", [np.add, np.sqrt])
+    def test_cast_safety(self, ufunc):
+        """Basic test for the safest casts, because ufuncs inner loops can
+        indicate a cast-safety as well (which is normally always "no").
+        """
+        def call_ufunc(arr, **kwargs):
+            return ufunc(*(arr,) * ufunc.nin, **kwargs)
+
+        arr = np.array([1., 2., 3.], dtype=np.float32)
+        arr_bs = arr.astype(arr.dtype.newbyteorder())
+        expected = call_ufunc(arr)
+        # Normally, a "no" cast:
+        res = call_ufunc(arr, casting="no")
+        assert_array_equal(expected, res)
+        # Byte-swapping is not allowed with "no" though:
+        with pytest.raises(TypeError):
+            call_ufunc(arr_bs, casting="no")
+
+        # But is allowed with "equiv":
+        res = call_ufunc(arr_bs, casting="equiv")
+        assert_array_equal(expected, res)
+
+        # Casting to float64 is safe, but not equiv:
+        with pytest.raises(TypeError):
+            call_ufunc(arr_bs, dtype=np.float64, casting="equiv")
+
+        # but it is safe cast:
+        res = call_ufunc(arr_bs, dtype=np.float64, casting="safe")
+        expected = call_ufunc(arr.astype(np.float64))  # upcast
+        assert_array_equal(expected, res)
+
     def test_true_divide(self):
         a = np.array(10)
         b = np.array(20)
@@ -562,7 +612,13 @@ class TestUfunc:
                     else:
                         tgt = float(x)/float(y)
                         rtol = max(np.finfo(dtout).resolution, 1e-15)
-                        atol = max(np.finfo(dtout).tiny, 3e-308)
+                        # The value of tiny for double double is NaN
+                        with suppress_warnings() as sup:
+                            sup.filter(UserWarning)
+                            if not np.isnan(np.finfo(dtout).tiny):
+                                atol = max(np.finfo(dtout).tiny, 3e-308)
+                            else:
+                                atol = 3e-308
                         # Some test values result in invalid for float16.
                         with np.errstate(invalid='ignore'):
                             res = np.true_divide(x, y, dtype=dtout)
@@ -575,7 +631,13 @@ class TestUfunc:
                     dtout = np.dtype(tcout)
                     tgt = complex(x)/complex(y)
                     rtol = max(np.finfo(dtout).resolution, 1e-15)
-                    atol = max(np.finfo(dtout).tiny, 3e-308)
+                    # The value of tiny for double double is NaN
+                    with suppress_warnings() as sup:
+                        sup.filter(UserWarning)
+                        if not np.isnan(np.finfo(dtout).tiny):
+                            atol = max(np.finfo(dtout).tiny, 3e-308)
+                        else:
+                            atol = 3e-308
                     res = np.true_divide(x, y, dtype=dtout)
                     if not np.isfinite(res):
                         continue
@@ -1300,6 +1362,14 @@ class TestUfunc:
                            np.array([[2]*i for i in [1, 3, 6, 10]], dtype=object),
                           )
 
+    def test_object_array_accumulate_failure(self):
+        # Typical accumulation on object works as expected:
+        res = np.add.accumulate(np.array([1, 0, 2], dtype=object))
+        assert_array_equal(res, np.array([1, 1, 3], dtype=object))
+        # But errors are propagated from the inner-loop if they occur:
+        with pytest.raises(TypeError):
+            np.add.accumulate([1, None, 2])
+
     def test_object_array_reduceat_inplace(self):
         # Checks that in-place reduceats work, see also gh-7465
         arr = np.empty(4, dtype=object)
@@ -1319,6 +1389,15 @@ class TestUfunc:
         np.add.reduceat(arr, np.arange(4), out=arr, axis=-1)
         assert_array_equal(arr, out)
 
+    def test_object_array_reduceat_failure(self):
+        # Reduceat works as expected when no invalid operation occurs (None is
+        # not involved in an operation here)
+        res = np.add.reduceat(np.array([1, None, 2], dtype=object), [1, 2])
+        assert_array_equal(res, np.array([None, 2], dtype=object))
+        # But errors when None would be involved in an operation:
+        with pytest.raises(TypeError):
+            np.add.reduceat([1, None, 2], [0, 2])
+
     def test_zerosize_reduction(self):
         # Test with default dtype and object dtype
         for a in [[], np.array([], dtype=object)]:
@@ -1678,9 +1757,20 @@ class TestUfunc:
         target = np.array([0, 2, 4], dtype=_rational_tests.rational)
         assert_equal(result, target)
 
-        # no output type should raise TypeError
+        # The new resolution means that we can (usually) find custom loops
+        # as long as they match exactly:
+        result = _rational_tests.test_add(a, b)
+        assert_equal(result, target)
+
+        # This works even more generally, so long the default common-dtype
+        # promoter works out:
+        result = _rational_tests.test_add(a, b.astype(np.uint16), out=c)
+        assert_equal(result, target)
+
+        # But, it can be fooled, e.g. (use scalars, which forces legacy
+        # type resolution to kick in, which then fails):
         with assert_raises(TypeError):
-            _rational_tests.test_add(a, b)
+            _rational_tests.test_add(a, np.uint16(2))
 
     def test_operand_flags(self):
         a = np.arange(16, dtype='l').reshape(4, 4)
@@ -1996,8 +2086,7 @@ class TestUfunc:
             np.true_divide, np.floor_divide, np.bitwise_and, np.bitwise_or,
             np.bitwise_xor, np.left_shift, np.right_shift, np.fmax,
             np.fmin, np.fmod, np.hypot, np.logaddexp, np.logaddexp2,
-            np.logical_and, np.logical_or, np.logical_xor, np.maximum,
-            np.minimum, np.mod,
+            np.maximum, np.minimum, np.mod,
             np.greater, np.greater_equal, np.less, np.less_equal,
             np.equal, np.not_equal]
 
@@ -2029,6 +2118,79 @@ class TestUfunc:
         with pytest.raises(TypeError):
             ufunc(a, a, signature=signature)
 
+    @pytest.mark.parametrize("ufunc",
+            [np.logical_and, np.logical_or, np.logical_xor])
+    def test_logical_ufuncs_support_anything(self, ufunc):
+        # The logical ufuncs support even input that can't be promoted:
+        a = np.array('1')
+        c = np.array([1., 2.])
+        assert_array_equal(ufunc(a, c), ufunc([True, True], True))
+        assert ufunc.reduce(a) == True
+        # check that the output has no effect:
+        out = np.zeros(2, dtype=np.int32)
+        expected = ufunc([True, True], True).astype(out.dtype)
+        assert_array_equal(ufunc(a, c, out=out), expected)
+        out = np.zeros((), dtype=np.int32)
+        assert ufunc.reduce(a, out=out) == True
+        # Last check, test reduction when out and a match (the complexity here
+        # is that the "i,i->?" may seem right, but should not match.
+        a = np.array([3], dtype="i")
+        out = np.zeros((), dtype=a.dtype)
+        assert ufunc.reduce(a, out=out) == 1
+
+    @pytest.mark.parametrize("ufunc",
+             [np.logical_and, np.logical_or, np.logical_xor])
+    def test_logical_ufuncs_out_cast_check(self, ufunc):
+        a = np.array('1')
+        c = np.array([1., 2.])
+        out = a.copy()
+        with pytest.raises(TypeError):
+            # It would be safe, but not equiv casting:
+            ufunc(a, c, out=out, casting="equiv")
+
+    def test_reducelike_out_promotes(self):
+        # Check that the out argument to reductions is considered for
+        # promotion.  See also gh-20455.
+        # Note that these paths could prefer `initial=` in the future and
+        # do not up-cast to the default integer for add and prod
+        arr = np.ones(1000, dtype=np.uint8)
+        out = np.zeros((), dtype=np.uint16)
+        assert np.add.reduce(arr, out=out) == 1000
+        arr[:10] = 2
+        assert np.multiply.reduce(arr, out=out) == 2**10
+
+        # For legacy dtypes, the signature currently has to be forced if `out=`
+        # is passed.  The two paths below should differ, without `dtype=` the
+        # expected result should be: `np.prod(arr.astype("f8")).astype("f4")`!
+        arr = np.full(5, 2**25-1, dtype=np.int64)
+
+        # float32 and int64 promote to float64:
+        res = np.zeros((), dtype=np.float32)
+        # If `dtype=` is passed, the calculation is forced to float32:
+        single_res = np.zeros((), dtype=np.float32)
+        np.multiply.reduce(arr, out=single_res, dtype=np.float32)
+        assert single_res != res
+
+    def test_reducelike_output_needs_identical_cast(self):
+        # Checks the case where the we have a simple byte-swap works, maily
+        # tests that this is not rejected directly.
+        # (interesting because we require descriptor identity in reducelikes).
+        arr = np.ones(20, dtype="f8")
+        out = np.empty((), dtype=arr.dtype.newbyteorder())
+        expected = np.add.reduce(arr)
+        np.add.reduce(arr, out=out)
+        assert_array_equal(expected, out)
+        # Check reduceat:
+        out = np.empty(2, dtype=arr.dtype.newbyteorder())
+        expected = np.add.reduceat(arr, [0, 1])
+        np.add.reduceat(arr, [0, 1], out=out)
+        assert_array_equal(expected, out)
+        # And accumulate:
+        out = np.empty(arr.shape, dtype=arr.dtype.newbyteorder())
+        expected = np.add.accumulate(arr)
+        np.add.accumulate(arr, out=out)
+        assert_array_equal(expected, out)
+
     def test_reduce_noncontig_output(self):
         # Check that reduction deals with non-contiguous output arrays
         # appropriately.
@@ -2050,6 +2212,22 @@ class TestUfunc:
         assert_equal(y_base[1,:], y_base_copy[1,:])
         assert_equal(y_base[3,:], y_base_copy[3,:])
 
+    @pytest.mark.parametrize("with_cast", [True, False])
+    def test_reduceat_and_accumulate_out_shape_mismatch(self, with_cast):
+        # Should raise an error mentioning "shape" or "size"
+        arr = np.arange(5)
+        out = np.arange(3)  # definitely wrong shape
+        if with_cast:
+            # If a cast is necessary on the output, we can be sure to use
+            # the generic NpyIter (non-fast) path.
+            out = out.astype(np.float64)
+
+        with pytest.raises(ValueError, match="(shape|size)"):
+            np.add.reduceat(arr, [0, 3], out=out)
+
+        with pytest.raises(ValueError, match="(shape|size)"):
+            np.add.accumulate(arr, out=out)
+
     @pytest.mark.parametrize('out_shape',
                              [(), (1,), (3,), (1, 1), (1, 3), (4, 3)])
     @pytest.mark.parametrize('keepdims', [True, False])
@@ -2239,6 +2417,14 @@ def test_ufunc_casterrors():
     assert out[-1] == 1
 
 
+def test_trivial_loop_invalid_cast():
+    # This tests the fast-path "invalid cast", see gh-19904.
+    with pytest.raises(TypeError,
+            match="cast ufunc 'add' input 0"):
+        # the void dtype definitely cannot cast to double:
+        np.add(np.array(1, "i,i"), 3, signature="dd->d")
+
+
 @pytest.mark.skipif(not HAS_REFCOUNT, reason="Python lacks refcounts")
 @pytest.mark.parametrize("offset",
         [0, np.BUFSIZE//2, int(1.5*np.BUFSIZE)])
@@ -2254,8 +2440,9 @@ def test_reduce_casterrors(offset):
     out = np.array(-1, dtype=np.intp)
 
     count = sys.getrefcount(value)
-    with pytest.raises(ValueError):
-        # This is an unsafe cast, but we currently always allow that:
+    with pytest.raises(ValueError, match="invalid literal"):
+        # This is an unsafe cast, but we currently always allow that.
+        # Note that the double loop is picked, but the cast fails.
         np.add.reduce(arr, dtype=np.intp, out=out)
     assert count == sys.getrefcount(value)
     # If an error occurred during casting, the operation is done at most until
@@ -2263,3 +2450,20 @@ def test_reduce_casterrors(offset):
     # if the error happened immediately.
     # This does not define behaviour, the output is invalid and thus undefined
     assert out[()] < value * offset
+
+
+@pytest.mark.parametrize("method",
+        [np.add.accumulate, np.add.reduce,
+         pytest.param(lambda x: np.add.reduceat(x, [0]), id="reduceat"),
+         pytest.param(lambda x: np.log.at(x, [2]), id="at")])
+def test_ufunc_methods_floaterrors(method):
+    # adding inf and -inf (or log(-inf) creates an invalid float and warns
+    arr = np.array([np.inf, 0, -np.inf])
+    with np.errstate(all="warn"):
+        with pytest.warns(RuntimeWarning, match="invalid value"):
+            method(arr)
+
+    arr = np.array([np.inf, 0, -np.inf])
+    with np.errstate(all="raise"):
+        with pytest.raises(FloatingPointError):
+            method(arr)
index 2378b11e95a42de489495962117bd927d9788996..c0b26e75b2c8402758c81e80e89a2ac1b1f1f315 100644 (file)
@@ -15,7 +15,7 @@ from numpy.testing import (
     assert_, assert_equal, assert_raises, assert_raises_regex,
     assert_array_equal, assert_almost_equal, assert_array_almost_equal,
     assert_array_max_ulp, assert_allclose, assert_no_warnings, suppress_warnings,
-    _gen_alignment_data, assert_array_almost_equal_nulp, assert_warns
+    _gen_alignment_data, assert_array_almost_equal_nulp
     )
 
 def get_glibc_version():
@@ -28,9 +28,7 @@ def get_glibc_version():
 
 
 glibcver = get_glibc_version()
-glibc_newerthan_2_17 = pytest.mark.xfail(
-        glibcver != '0.0' and glibcver < '2.17',
-        reason="Older glibc versions may not raise appropriate FP exceptions")
+glibc_older_than = lambda x: (glibcver != '0.0' and glibcver < x)
 
 def on_powerpc():
     """ True if we are running on a Power PC platform."""
@@ -50,14 +48,6 @@ def bad_arcsinh():
     # The eps for float128 is 1-e33, so this is way bigger
     return abs((v1 / v2) - 1.0) > 1e-23
 
-if platform.machine() == 'aarch64' and bad_arcsinh():
-    skip_longcomplex_msg = ('Trig functions of np.longcomplex values known to be '
-                            'inaccurate on aarch64 for some compilation '
-                            'configurations, should be fixed by building on a '
-                            'platform using glibc>2.17')
-else:
-    skip_longcomplex_msg = ''
-
 
 class _FilterInvalids:
     def setup(self):
@@ -433,16 +423,14 @@ class TestDivision:
             assert_(np.isnan(y)[0])
 
     def test_floor_division_complex(self):
-        # check that implementation is correct
-        msg = "Complex floor division implementation check"
+        # check that floor division, divmod and remainder raises type errors
         x = np.array([.9 + 1j, -.1 + 1j, .9 + .5*1j, .9 + 2.*1j], dtype=np.complex128)
-        y = np.array([0., -1., 0., 0.], dtype=np.complex128)
-        assert_equal(np.floor_divide(x**2, x), y, err_msg=msg)
-        # check overflow, underflow
-        msg = "Complex floor division overflow/underflow check"
-        x = np.array([1.e+110, 1.e-110], dtype=np.complex128)
-        y = np.floor_divide(x**2, x)
-        assert_equal(y, [1.e+110, 0], err_msg=msg)
+        with pytest.raises(TypeError):
+            x // 7
+        with pytest.raises(TypeError):
+            np.divmod(x, 7)
+        with pytest.raises(TypeError):
+            np.remainder(x, 7)
 
     def test_floor_division_signed_zero(self):
         # Check that the sign bit is correctly set when dividing positive and
@@ -460,10 +448,15 @@ class TestDivision:
         # divide by zero error check
         with np.errstate(divide='raise', invalid='ignore'):
             assert_raises(FloatingPointError, np.floor_divide, fone, fzer)
-        with np.errstate(invalid='raise'):
-            assert_raises(FloatingPointError, np.floor_divide, fnan, fone)
-            assert_raises(FloatingPointError, np.floor_divide, fone, fnan)
-            assert_raises(FloatingPointError, np.floor_divide, fnan, fzer)
+        with np.errstate(divide='ignore', invalid='raise'):
+            np.floor_divide(fone, fzer)
+
+        # The following already contain a NaN and should not warn
+        with np.errstate(all='raise'):
+            np.floor_divide(fnan, fone)
+            np.floor_divide(fone, fnan)
+            np.floor_divide(fnan, fzer)
+            np.floor_divide(fzer, fnan)
 
     @pytest.mark.parametrize('dtype', np.typecodes['Float'])
     def test_floor_division_corner_cases(self, dtype):
@@ -560,6 +553,9 @@ class TestRemainder:
                     else:
                         assert_(b > rem >= 0, msg)
 
+    @pytest.mark.xfail(sys.platform.startswith("darwin"),
+            reason="MacOS seems to not give the correct 'invalid' warning for "
+                   "`fmod`.  Hopefully, others always do.")
     @pytest.mark.parametrize('dtype', np.typecodes['Float'])
     def test_float_divmod_errors(self, dtype):
         # Check valid errors raised for divmod and remainder
@@ -580,8 +576,12 @@ class TestRemainder:
         with np.errstate(divide='ignore', invalid='raise'):
             assert_raises(FloatingPointError, np.divmod, finf, fzero)
         with np.errstate(divide='raise', invalid='ignore'):
-            assert_raises(FloatingPointError, np.divmod, finf, fzero)
+            # inf / 0 does not set any flags, only the modulo creates a NaN
+            np.divmod(finf, fzero)
 
+    @pytest.mark.xfail(sys.platform.startswith("darwin"),
+           reason="MacOS seems to not give the correct 'invalid' warning for "
+                  "`fmod`.  Hopefully, others always do.")
     @pytest.mark.parametrize('dtype', np.typecodes['Float'])
     @pytest.mark.parametrize('fn', [np.fmod, np.remainder])
     def test_float_remainder_errors(self, dtype, fn):
@@ -589,11 +589,16 @@ class TestRemainder:
         fone = np.array(1.0, dtype=dtype)
         finf = np.array(np.inf, dtype=dtype)
         fnan = np.array(np.nan, dtype=dtype)
-        with np.errstate(invalid='raise'):
-            assert_raises(FloatingPointError, fn, fone, fzero)
-            assert_raises(FloatingPointError, fn, fnan, fzero)
-            assert_raises(FloatingPointError, fn, fone, fnan)
-            assert_raises(FloatingPointError, fn, fnan, fone)
+
+        # The following already contain a NaN and should not warn.
+        with np.errstate(all='raise'):
+            with pytest.raises(FloatingPointError,
+                    match="invalid value"):
+                fn(fone, fzero)
+            fn(fnan, fzero)
+            fn(fzero, fnan)
+            fn(fone, fnan)
+            fn(fnan, fone)
 
     def test_float_remainder_overflow(self):
         a = np.finfo(np.float64).tiny
@@ -855,20 +860,20 @@ class TestFloat_power:
 
 
 class TestLog2:
-    def test_log2_values(self):
+    @pytest.mark.parametrize('dt', ['f', 'd', 'g'])
+    def test_log2_values(self, dt):
         x = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
         y = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
-        for dt in ['f', 'd', 'g']:
-            xf = np.array(x, dtype=dt)
-            yf = np.array(y, dtype=dt)
-            assert_almost_equal(np.log2(xf), yf)
+        xf = np.array(x, dtype=dt)
+        yf = np.array(y, dtype=dt)
+        assert_almost_equal(np.log2(xf), yf)
 
-    def test_log2_ints(self):
+    @pytest.mark.parametrize("i", range(1, 65))
+    def test_log2_ints(self, i):
         # a good log2 implementation should provide this,
         # might fail on OS with bad libm
-        for i in range(1, 65):
-            v = np.log2(2.**i)
-            assert_equal(v, float(i), err_msg='at exponent %d' % i)
+        v = np.log2(2.**i)
+        assert_equal(v, float(i), err_msg='at exponent %d' % i)
 
     def test_log2_special(self):
         assert_equal(np.log2(1.), 0.)
@@ -958,6 +963,12 @@ class TestLog:
         xf = np.log(x)
         assert_almost_equal(np.log(x, out=x), xf)
 
+        # test log() of max for dtype does not raise
+        for dt in ['f', 'd', 'g']:
+            with np.errstate(all='raise'):
+                x = np.finfo(dt).max
+                np.log(x)
+
     def test_log_strides(self):
         np.random.seed(42)
         strides = np.array([-4,-3,-2,-1,1,2,3,4])
@@ -1001,9 +1012,11 @@ class TestSpecialFloats:
             yf = np.array(y, dtype=dt)
             assert_equal(np.exp(yf), xf)
 
-    # Older version of glibc may not raise the correct FP exceptions
     # See: https://github.com/numpy/numpy/issues/19192
-    @glibc_newerthan_2_17
+    @pytest.mark.xfail(
+        glibc_older_than("2.17"),
+        reason="Older glibc versions may not raise appropriate FP exceptions"
+    )
     def test_exp_exceptions(self):
         with np.errstate(over='raise'):
             assert_raises(FloatingPointError, np.exp, np.float32(100.))
@@ -1019,19 +1032,47 @@ class TestSpecialFloats:
 
     def test_log_values(self):
         with np.errstate(all='ignore'):
-            x = [np.nan,  np.nan, np.inf, np.nan, -np.inf, np.nan]
-            y = [np.nan, -np.nan, np.inf, -np.inf, 0., -1.0]
+            x = [np.nan, np.nan, np.inf, np.nan, -np.inf, np.nan]
+            y = [np.nan, -np.nan, np.inf, -np.inf, 0.0, -1.0]
+            y1p = [np.nan, -np.nan, np.inf, -np.inf, -1.0, -2.0]
             for dt in ['f', 'd', 'g']:
                 xf = np.array(x, dtype=dt)
                 yf = np.array(y, dtype=dt)
+                yf1p = np.array(y1p, dtype=dt)
                 assert_equal(np.log(yf), xf)
+                assert_equal(np.log2(yf), xf)
+                assert_equal(np.log10(yf), xf)
+                assert_equal(np.log1p(yf1p), xf)
 
         with np.errstate(divide='raise'):
-            assert_raises(FloatingPointError, np.log, np.float32(0.))
+            for dt in ['f', 'd']:
+                assert_raises(FloatingPointError, np.log,
+                              np.array(0.0, dtype=dt))
+                assert_raises(FloatingPointError, np.log2,
+                              np.array(0.0, dtype=dt))
+                assert_raises(FloatingPointError, np.log10,
+                              np.array(0.0, dtype=dt))
+                assert_raises(FloatingPointError, np.log1p,
+                              np.array(-1.0, dtype=dt))
 
         with np.errstate(invalid='raise'):
-            assert_raises(FloatingPointError, np.log, np.float32(-np.inf))
-            assert_raises(FloatingPointError, np.log, np.float32(-1.0))
+            for dt in ['f', 'd']:
+                assert_raises(FloatingPointError, np.log,
+                              np.array(-np.inf, dtype=dt))
+                assert_raises(FloatingPointError, np.log,
+                              np.array(-1.0, dtype=dt))
+                assert_raises(FloatingPointError, np.log2,
+                              np.array(-np.inf, dtype=dt))
+                assert_raises(FloatingPointError, np.log2,
+                              np.array(-1.0, dtype=dt))
+                assert_raises(FloatingPointError, np.log10,
+                              np.array(-np.inf, dtype=dt))
+                assert_raises(FloatingPointError, np.log10,
+                              np.array(-1.0, dtype=dt))
+                assert_raises(FloatingPointError, np.log1p,
+                              np.array(-np.inf, dtype=dt))
+                assert_raises(FloatingPointError, np.log1p,
+                              np.array(-2.0, dtype=dt))
 
         # See https://github.com/numpy/numpy/issues/18005
         with assert_no_warnings():
@@ -1040,7 +1081,7 @@ class TestSpecialFloats:
 
     def test_sincos_values(self):
         with np.errstate(all='ignore'):
-            x = [np.nan,  np.nan, np.nan, np.nan]
+            x = [np.nan, np.nan, np.nan, np.nan]
             y = [np.nan, -np.nan, np.inf, -np.inf]
             for dt in ['f', 'd', 'g']:
                 xf = np.array(x, dtype=dt)
@@ -1054,18 +1095,19 @@ class TestSpecialFloats:
             assert_raises(FloatingPointError, np.cos, np.float32(-np.inf))
             assert_raises(FloatingPointError, np.cos, np.float32(np.inf))
 
-    def test_sqrt_values(self):
+    @pytest.mark.parametrize('dt', ['f', 'd', 'g'])
+    def test_sqrt_values(self, dt):
         with np.errstate(all='ignore'):
-            x = [np.nan,  np.nan, np.inf, np.nan, 0.]
+            x = [np.nan, np.nan, np.inf, np.nan, 0.]
             y = [np.nan, -np.nan, np.inf, -np.inf, 0.]
-            for dt in ['f', 'd', 'g']:
-                xf = np.array(x, dtype=dt)
-                yf = np.array(y, dtype=dt)
-                assert_equal(np.sqrt(yf), xf)
+            xf = np.array(x, dtype=dt)
+            yf = np.array(y, dtype=dt)
+            assert_equal(np.sqrt(yf), xf)
 
-        #with np.errstate(invalid='raise'):
-        #    for dt in ['f', 'd', 'g']:
-        #        assert_raises(FloatingPointError, np.sqrt, np.array(-100., dtype=dt))
+        # with np.errstate(invalid='raise'):
+        #     assert_raises(
+        #         FloatingPointError, np.sqrt, np.array(-100., dtype=dt)
+        #     )
 
     def test_abs_values(self):
         x = [np.nan,  np.nan, np.inf, np.inf, 0., 0., 1.0, 1.0]
@@ -1085,8 +1127,10 @@ class TestSpecialFloats:
                 assert_equal(np.square(yf), xf)
 
         with np.errstate(over='raise'):
-            assert_raises(FloatingPointError, np.square, np.array(1E32,  dtype='f'))
-            assert_raises(FloatingPointError, np.square, np.array(1E200, dtype='d'))
+            assert_raises(FloatingPointError, np.square,
+                          np.array(1E32, dtype='f'))
+            assert_raises(FloatingPointError, np.square,
+                          np.array(1E200, dtype='d'))
 
     def test_reciprocal_values(self):
         with np.errstate(all='ignore'):
@@ -1099,7 +1143,153 @@ class TestSpecialFloats:
 
         with np.errstate(divide='raise'):
             for dt in ['f', 'd', 'g']:
-                assert_raises(FloatingPointError, np.reciprocal, np.array(-0.0, dtype=dt))
+                assert_raises(FloatingPointError, np.reciprocal,
+                              np.array(-0.0, dtype=dt))
+
+    def test_tan(self):
+        with np.errstate(all='ignore'):
+            in_ = [np.nan, -np.nan, 0.0, -0.0, np.inf, -np.inf]
+            out = [np.nan, np.nan, 0.0, -0.0, np.nan, np.nan]
+            for dt in ['f', 'd']:
+                in_arr = np.array(in_, dtype=dt)
+                out_arr = np.array(out, dtype=dt)
+                assert_equal(np.tan(in_arr), out_arr)
+
+        with np.errstate(invalid='raise'):
+            for dt in ['f', 'd']:
+                assert_raises(FloatingPointError, np.tan,
+                              np.array(np.inf, dtype=dt))
+                assert_raises(FloatingPointError, np.tan,
+                              np.array(-np.inf, dtype=dt))
+
+    def test_arcsincos(self):
+        with np.errstate(all='ignore'):
+            in_ = [np.nan, -np.nan, np.inf, -np.inf]
+            out = [np.nan, np.nan, np.nan, np.nan]
+            for dt in ['f', 'd']:
+                in_arr = np.array(in_, dtype=dt)
+                out_arr = np.array(out, dtype=dt)
+                assert_equal(np.arcsin(in_arr), out_arr)
+                assert_equal(np.arccos(in_arr), out_arr)
+
+        for callable in [np.arcsin, np.arccos]:
+            for value in [np.inf, -np.inf, 2.0, -2.0]:
+                for dt in ['f', 'd']:
+                    with np.errstate(invalid='raise'):
+                        assert_raises(FloatingPointError, callable,
+                                      np.array(value, dtype=dt))
+
+    def test_arctan(self):
+        with np.errstate(all='ignore'):
+            in_ = [np.nan, -np.nan]
+            out = [np.nan, np.nan]
+            for dt in ['f', 'd']:
+                in_arr = np.array(in_, dtype=dt)
+                out_arr = np.array(out, dtype=dt)
+                assert_equal(np.arctan(in_arr), out_arr)
+
+    def test_sinh(self):
+        in_ = [np.nan, -np.nan, np.inf, -np.inf]
+        out = [np.nan, np.nan, np.inf, -np.inf]
+        for dt in ['f', 'd']:
+            in_arr = np.array(in_, dtype=dt)
+            out_arr = np.array(out, dtype=dt)
+            assert_equal(np.sinh(in_arr), out_arr)
+
+        with np.errstate(over='raise'):
+            assert_raises(FloatingPointError, np.sinh,
+                          np.array(120.0, dtype='f'))
+            assert_raises(FloatingPointError, np.sinh,
+                          np.array(1200.0, dtype='d'))
+
+    def test_cosh(self):
+        in_ = [np.nan, -np.nan, np.inf, -np.inf]
+        out = [np.nan, np.nan, np.inf, np.inf]
+        for dt in ['f', 'd']:
+            in_arr = np.array(in_, dtype=dt)
+            out_arr = np.array(out, dtype=dt)
+            assert_equal(np.cosh(in_arr), out_arr)
+
+        with np.errstate(over='raise'):
+            assert_raises(FloatingPointError, np.cosh,
+                          np.array(120.0, dtype='f'))
+            assert_raises(FloatingPointError, np.cosh,
+                          np.array(1200.0, dtype='d'))
+
+    def test_tanh(self):
+        in_ = [np.nan, -np.nan, np.inf, -np.inf]
+        out = [np.nan, np.nan, 1.0, -1.0]
+        for dt in ['f', 'd']:
+            in_arr = np.array(in_, dtype=dt)
+            out_arr = np.array(out, dtype=dt)
+            assert_equal(np.tanh(in_arr), out_arr)
+
+    def test_arcsinh(self):
+        in_ = [np.nan, -np.nan, np.inf, -np.inf]
+        out = [np.nan, np.nan, np.inf, -np.inf]
+        for dt in ['f', 'd']:
+            in_arr = np.array(in_, dtype=dt)
+            out_arr = np.array(out, dtype=dt)
+            assert_equal(np.arcsinh(in_arr), out_arr)
+
+    def test_arccosh(self):
+        with np.errstate(all='ignore'):
+            in_ = [np.nan, -np.nan, np.inf, -np.inf, 1.0, 0.0]
+            out = [np.nan, np.nan, np.inf, np.nan, 0.0, np.nan]
+            for dt in ['f', 'd']:
+                in_arr = np.array(in_, dtype=dt)
+                out_arr = np.array(out, dtype=dt)
+                assert_equal(np.arccosh(in_arr), out_arr)
+
+        for value in [0.0, -np.inf]:
+            with np.errstate(invalid='raise'):
+                for dt in ['f', 'd']:
+                    assert_raises(FloatingPointError, np.arccosh,
+                                  np.array(value, dtype=dt))
+
+    def test_arctanh(self):
+        with np.errstate(all='ignore'):
+            in_ = [np.nan, -np.nan, np.inf, -np.inf, 1.0, -1.0, 2.0]
+            out = [np.nan, np.nan, np.nan, np.nan, np.inf, -np.inf, np.nan]
+            for dt in ['f', 'd']:
+                in_arr = np.array(in_, dtype=dt)
+                out_arr = np.array(out, dtype=dt)
+                assert_equal(np.arctanh(in_arr), out_arr)
+
+        for value in [1.01, np.inf, -np.inf, 1.0, -1.0]:
+            with np.errstate(invalid='raise', divide='raise'):
+                for dt in ['f', 'd']:
+                    assert_raises(FloatingPointError, np.arctanh,
+                                  np.array(value, dtype=dt))
+
+    def test_exp2(self):
+        with np.errstate(all='ignore'):
+            in_ = [np.nan, -np.nan, np.inf, -np.inf]
+            out = [np.nan, np.nan, np.inf, 0.0]
+            for dt in ['f', 'd']:
+                in_arr = np.array(in_, dtype=dt)
+                out_arr = np.array(out, dtype=dt)
+                assert_equal(np.exp2(in_arr), out_arr)
+
+        for value in [2000.0, -2000.0]:
+            with np.errstate(over='raise', under='raise'):
+                for dt in ['f', 'd']:
+                    assert_raises(FloatingPointError, np.exp2,
+                                  np.array(value, dtype=dt))
+
+    def test_expm1(self):
+        with np.errstate(all='ignore'):
+            in_ = [np.nan, -np.nan, np.inf, -np.inf]
+            out = [np.nan, np.nan, np.inf, -1.0]
+            for dt in ['f', 'd']:
+                in_arr = np.array(in_, dtype=dt)
+                out_arr = np.array(out, dtype=dt)
+                assert_equal(np.expm1(in_arr), out_arr)
+
+        for value in [200.0, 2000.0]:
+            with np.errstate(over='raise'):
+                assert_raises(FloatingPointError, np.expm1,
+                              np.array(value, dtype='f'))
 
 class TestFPClass:
     @pytest.mark.parametrize("stride", [-4,-2,-1,1,2,4])
@@ -1207,8 +1397,10 @@ class TestAVXFloat32Transcendental:
         M = np.int_(N/20)
         index = np.random.randint(low=0, high=N, size=M)
         x_f32 = np.float32(np.random.uniform(low=-100.,high=100.,size=N))
-        # test coverage for elements > 117435.992f for which glibc is used
-        x_f32[index] = np.float32(10E+10*np.random.rand(M))
+        if not glibc_older_than("2.17"):
+            # test coverage for elements > 117435.992f for which glibc is used
+            # this is known to be problematic on old glibc, so skip it there
+            x_f32[index] = np.float32(10E+10*np.random.rand(M))
         x_f64 = np.float64(x_f32)
         assert_array_max_ulp(np.sin(x_f32), np.float32(np.sin(x_f64)), maxulp=2)
         assert_array_max_ulp(np.cos(x_f32), np.float32(np.cos(x_f64)), maxulp=2)
@@ -2102,6 +2294,10 @@ class TestSpecialMethods:
         do_test(lambda a: np.add(0, 0, out=a),       lambda a: (0, 0, a))
         do_test(lambda a: np.add(0, 0, out=(a,)),    lambda a: (0, 0, a))
 
+        # Also check the where mask handling:
+        do_test(lambda a: np.add(a, 0, where=False), lambda a: (a, 0))
+        do_test(lambda a: np.add(0, 0, a, where=False), lambda a: (0, 0, a))
+
     def test_wrap_with_iterable(self):
         # test fix for bug #1026:
 
@@ -2251,7 +2447,8 @@ class TestSpecialMethods:
         assert_equal(x, np.zeros(1))
         assert_equal(type(x), np.ndarray)
 
-    def test_prepare(self):
+    @pytest.mark.parametrize("use_where", [True, False])
+    def test_prepare(self, use_where):
 
         class with_prepare(np.ndarray):
             __array_priority__ = 10
@@ -2261,11 +2458,15 @@ class TestSpecialMethods:
                 return np.array(arr).view(type=with_prepare)
 
         a = np.array(1).view(type=with_prepare)
-        x = np.add(a, a)
+        if use_where:
+            x = np.add(a, a, where=np.array(True))
+        else:
+            x = np.add(a, a)
         assert_equal(x, np.array(2))
         assert_equal(type(x), with_prepare)
 
-    def test_prepare_out(self):
+    @pytest.mark.parametrize("use_where", [True, False])
+    def test_prepare_out(self, use_where):
 
         class with_prepare(np.ndarray):
             __array_priority__ = 10
@@ -2274,7 +2475,10 @@ class TestSpecialMethods:
                 return np.array(arr).view(type=with_prepare)
 
         a = np.array([1]).view(type=with_prepare)
-        x = np.add(a, a, a)
+        if use_where:
+            x = np.add(a, a, a, where=[True])
+        else:
+            x = np.add(a, a, a)
         # Returned array is new, because of the strange
         # __array_prepare__ above
         assert_(not np.shares_memory(x, a))
@@ -2292,6 +2496,7 @@ class TestSpecialMethods:
 
         a = A()
         assert_raises(RuntimeError, ncu.maximum, a, a)
+        assert_raises(RuntimeError, ncu.maximum, a, a, where=False)
 
     def test_array_too_many_args(self):
 
@@ -3229,12 +3434,13 @@ class TestComplexFunctions:
         x_basic = np.logspace(-2.999, 0, 10, endpoint=False)
 
         if dtype is np.longcomplex:
+            if (platform.machine() == 'aarch64' and bad_arcsinh()):
+                pytest.skip("Trig functions of np.longcomplex values known "
+                            "to be inaccurate on aarch64 for some compilation "
+                            "configurations.")
             # It's not guaranteed that the system-provided arc functions
             # are accurate down to a few epsilons. (Eg. on Linux 64-bit)
             # So, give more leeway for long complex tests here:
-            # Can use 2.1 for > Ubuntu LTS Trusty (2014), glibc = 2.19.
-            if skip_longcomplex_msg:
-                pytest.skip(skip_longcomplex_msg)
             check(x_series, 50.0*eps)
         else:
             check(x_series, 2.1*eps)
@@ -3435,8 +3641,14 @@ def test_nextafterl():
 
 def test_nextafter_0():
     for t, direction in itertools.product(np.sctypes['float'], (1, -1)):
-        tiny = np.finfo(t).tiny
-        assert_(0. < direction * np.nextafter(t(0), t(direction)) < tiny)
+        # The value of tiny for double double is NaN, so we need to pass the
+        # assert
+        with suppress_warnings() as sup:
+            sup.filter(UserWarning)
+            if not np.isnan(np.finfo(t).tiny):
+                tiny = np.finfo(t).tiny
+                assert_(
+                    0. < direction * np.nextafter(t(0), t(direction)) < tiny)
         assert_equal(np.nextafter(t(0), t(direction)) / t(2.1), direction * 0.0)
 
 def _test_spacing(t):
@@ -3641,3 +3853,39 @@ def test_outer_exceeds_maxdims():
     with assert_raises(ValueError):
         np.add.outer(deep, deep)
 
+def test_bad_legacy_ufunc_silent_errors():
+    # legacy ufuncs can't report errors and NumPy can't check if the GIL
+    # is released.  So NumPy has to check after the GIL is released just to
+    # cover all bases.  `np.power` uses/used to use this.
+    arr = np.arange(3).astype(np.float64)
+
+    with pytest.raises(RuntimeError, match=r"How unexpected :\)!"):
+        ncu_tests.always_error(arr, arr)
+
+    with pytest.raises(RuntimeError, match=r"How unexpected :\)!"):
+        # not contiguous means the fast-path cannot be taken
+        non_contig = arr.repeat(20).reshape(-1, 6)[:, ::2]
+        ncu_tests.always_error(non_contig, arr)
+
+    with pytest.raises(RuntimeError, match=r"How unexpected :\)!"):
+        ncu_tests.always_error.outer(arr, arr)
+
+    with pytest.raises(RuntimeError, match=r"How unexpected :\)!"):
+        ncu_tests.always_error.reduce(arr)
+
+    with pytest.raises(RuntimeError, match=r"How unexpected :\)!"):
+        ncu_tests.always_error.reduceat(arr, [0, 1])
+
+    with pytest.raises(RuntimeError, match=r"How unexpected :\)!"):
+        ncu_tests.always_error.accumulate(arr)
+
+    with pytest.raises(RuntimeError, match=r"How unexpected :\)!"):
+        ncu_tests.always_error.at(arr, [0, 1, 2], arr)
+
+
+@pytest.mark.parametrize('x1', [np.arange(3.0), [0.0, 1.0, 2.0]])
+def test_bad_legacy_gufunc_silent_errors(x1):
+    # Verify that an exception raised in a gufunc loop propagates correctly.
+    # The signature of always_error_gufunc is '(i),()->()'.
+    with pytest.raises(RuntimeError, match=r"How unexpected :\)!"):
+        ncu_tests.always_error_gufunc(x1, 0.0)
index 8e04d2875bad2b7b263e77ca2f165782f4abe31c..32e2dca66151aa60a623653a7e2e59b9cdba5fcd 100644 (file)
@@ -1,5 +1,5 @@
 import numpy as np
-import platform
+import os
 from os import path
 import sys
 import pytest
@@ -28,17 +28,15 @@ def convert(s, datatype="np.float32"):
     return fp.contents.value         # dereference the pointer, get the float
 
 str_to_float = np.vectorize(convert)
-files = ['umath-validation-set-exp.csv',
-         'umath-validation-set-log.csv',
-         'umath-validation-set-sin.csv',
-         'umath-validation-set-cos.csv']
 
 class TestAccuracy:
     @platform_skip
     def test_validate_transcendentals(self):
         with np.errstate(all='ignore'):
+            data_dir = path.join(path.dirname(__file__), 'data')
+            files = os.listdir(data_dir)
+            files = list(filter(lambda f: f.endswith('.csv'), files))
             for filename in files:
-                data_dir = path.join(path.dirname(__file__), 'data')
                 filepath = path.join(data_dir, filename)
                 with open(filepath) as fid:
                     file_without_comments = (r for r in fid if not r[0] in ('$', '#'))
index ad09830d4c656b99e876f416a3305ed682a4c365..af5bbe59e698cb95488c58b72627e6bee1e7f7ee 100644 (file)
@@ -134,8 +134,7 @@ class TestClog:
         x = np.array([1+0j, 1+2j])
         y_r = np.log(np.abs(x)) + 1j * np.angle(x)
         y = np.log(x)
-        for i in range(len(x)):
-            assert_almost_equal(y[i], y_r[i])
+        assert_almost_equal(y, y_r)
 
     @platform_skip
     @pytest.mark.skipif(platform.machine() == "armv5tel", reason="See gh-413.")
@@ -365,8 +364,7 @@ class TestCpow:
         x = np.array([1+1j, 0+2j, 1+2j, np.inf, np.nan])
         y_r = x ** 2
         y = np.power(x, 2)
-        for i in range(len(x)):
-            assert_almost_equal(y[i], y_r[i])
+        assert_almost_equal(y, y_r)
 
     def test_scalar(self):
         x = np.array([1, 1j,         2,  2.5+.37j, np.inf, np.nan])
@@ -419,8 +417,7 @@ class TestCabs:
         x = np.array([1+1j, 0+2j, 1+2j, np.inf, np.nan])
         y_r = np.array([np.sqrt(2.), 2, np.sqrt(5), np.inf, np.nan])
         y = np.abs(x)
-        for i in range(len(x)):
-            assert_almost_equal(y[i], y_r[i])
+        assert_almost_equal(y, y_r)
 
     def test_fabs(self):
         # Test that np.abs(x +- 0j) == np.abs(x) (as mandated by C99 for cabs)
@@ -466,9 +463,10 @@ class TestCabs:
             return np.abs(complex(a, b))
 
         xa = np.array(x, dtype=complex)
-        for i in range(len(xa)):
-            ref = g(x[i], y[i])
-            check_real_value(f, x[i], y[i], ref)
+        assert len(xa) == len(x) == len(y)
+        for xi, yi in zip(x, y):
+            ref = g(xi, yi)
+            check_real_value(f, xi, yi, ref)
 
 class TestCarg:
     def test_simple(self):
index 8ba6f15e5a6d2d5e2b210c37b8d5da411d81e77c..8d105a248f17fc1c6e73c22e3cbd64def49ada30 100644 (file)
@@ -90,18 +90,23 @@ else:
     def load_library(libname, loader_path):
         """
         It is possible to load a library using
+
         >>> lib = ctypes.cdll[<full_path_name>] # doctest: +SKIP
 
         But there are cross-platform considerations, such as library file extensions,
         plus the fact Windows will just load the first library it finds with that name.
         NumPy supplies the load_library function as a convenience.
 
+        .. versionchanged:: 1.20.0
+            Allow libname and loader_path to take any
+            :term:`python:path-like object`.
+
         Parameters
         ----------
-        libname : str
+        libname : path-like
             Name of the library, which can have 'lib' as a prefix,
             but without an extension.
-        loader_path : str
+        loader_path : path-like
             Where the library can be found.
 
         Returns
@@ -120,6 +125,10 @@ else:
             warnings.warn("All features of ctypes interface may not work "
                           "with ctypes < 1.0.1", stacklevel=2)
 
+        # Convert path-like objects into strings
+        libname = os.fsdecode(libname)
+        loader_path = os.fsdecode(loader_path)
+
         ext = os.path.splitext(libname)[1]
         if not ext:
             # Try to load library with platform-specific name, otherwise
index 689ea416408ba844b6de6c1e135a53ed22836752..1c396d240173df74e226b2d6f3b37f6facebad12 100644 (file)
-from typing import List, Type
-from ctypes import _SimpleCData
+# NOTE: Numpy's mypy plugin is used for importing the correct
+# platform-specific `ctypes._SimpleCData[int]` sub-type
+from ctypes import c_int64 as _c_intp
+
+import os
+import sys
+import ctypes
+from typing import (
+    Literal as L,
+    Any,
+    List,
+    Union,
+    TypeVar,
+    Type,
+    Generic,
+    Optional,
+    overload,
+    Iterable,
+    ClassVar,
+    Tuple,
+    Sequence,
+    Dict,
+)
+
+from numpy import (
+    ndarray,
+    dtype,
+    generic,
+    bool_,
+    byte,
+    short,
+    intc,
+    int_,
+    longlong,
+    ubyte,
+    ushort,
+    uintc,
+    uint,
+    ulonglong,
+    single,
+    double,
+    float_,
+    longdouble,
+    void,
+)
+from numpy.core._internal import _ctypes
+from numpy.core.multiarray import flagsobj
+from numpy.typing import (
+    # Arrays
+    ArrayLike,
+    NDArray,
+    _FiniteNestedSequence,
+    _SupportsArray,
+
+    # Shapes
+    _ShapeLike,
+
+    # DTypes
+    DTypeLike,
+    _SupportsDType,
+    _VoidDTypeLike,
+    _BoolCodes,
+    _UByteCodes,
+    _UShortCodes,
+    _UIntCCodes,
+    _UIntCodes,
+    _ULongLongCodes,
+    _ByteCodes,
+    _ShortCodes,
+    _IntCCodes,
+    _IntCodes,
+    _LongLongCodes,
+    _SingleCodes,
+    _DoubleCodes,
+    _LongDoubleCodes,
+)
+
+# TODO: Add a proper `_Shape` bound once we've got variadic typevars
+_DType = TypeVar("_DType", bound=dtype[Any])
+_DTypeOptional = TypeVar("_DTypeOptional", bound=Optional[dtype[Any]])
+_SCT = TypeVar("_SCT", bound=generic)
+
+_DTypeLike = Union[
+    dtype[_SCT],
+    Type[_SCT],
+    _SupportsDType[dtype[_SCT]],
+]
+_ArrayLike = _FiniteNestedSequence[_SupportsArray[dtype[_SCT]]]
+
+_FlagsKind = L[
+    'C_CONTIGUOUS', 'CONTIGUOUS', 'C',
+    'F_CONTIGUOUS', 'FORTRAN', 'F',
+    'ALIGNED', 'A',
+    'WRITEABLE', 'W',
+    'OWNDATA', 'O',
+    'UPDATEIFCOPY', 'U',
+    'WRITEBACKIFCOPY', 'X',
+]
+
+# TODO: Add a shape typevar once we have variadic typevars (PEP 646)
+class _ndptr(ctypes.c_void_p, Generic[_DTypeOptional]):
+    # In practice these 4 classvars are defined in the dynamic class
+    # returned by `ndpointer`
+    _dtype_: ClassVar[_DTypeOptional]
+    _shape_: ClassVar[None]
+    _ndim_: ClassVar[None | int]
+    _flags_: ClassVar[None | List[_FlagsKind]]
+
+    @overload
+    @classmethod
+    def from_param(cls: Type[_ndptr[None]], obj: ndarray[Any, Any]) -> _ctypes: ...
+    @overload
+    @classmethod
+    def from_param(cls: Type[_ndptr[_DType]], obj: ndarray[Any, _DType]) -> _ctypes: ...
+
+class _concrete_ndptr(_ndptr[_DType]):
+    _dtype_: ClassVar[_DType]
+    _shape_: ClassVar[Tuple[int, ...]]
+    @property
+    def contents(self) -> ndarray[Any, _DType]: ...
+
+def load_library(
+    libname: str | bytes | os.PathLike[str] | os.PathLike[bytes],
+    loader_path: str | bytes | os.PathLike[str] | os.PathLike[bytes],
+) -> ctypes.CDLL: ...
 
 __all__: List[str]
 
-# TODO: Update the `npt.mypy_plugin` such that it substitutes `c_intp` for
-# a specific `_SimpleCData[int]` subclass (e.g. `ctypes.c_long`)
-c_intp: Type[_SimpleCData[int]]
+c_intp = _c_intp
+
+@overload
+def ndpointer(
+    dtype: None = ...,
+    ndim: int = ...,
+    shape: None | _ShapeLike = ...,
+    flags: None | _FlagsKind | Iterable[_FlagsKind] | int | flagsobj = ...,
+) -> Type[_ndptr[None]]: ...
+@overload
+def ndpointer(
+    dtype: _DTypeLike[_SCT],
+    ndim: int = ...,
+    *,
+    shape: _ShapeLike,
+    flags: None | _FlagsKind | Iterable[_FlagsKind] | int | flagsobj = ...,
+) -> Type[_concrete_ndptr[dtype[_SCT]]]: ...
+@overload
+def ndpointer(
+    dtype: DTypeLike,
+    ndim: int = ...,
+    *,
+    shape: _ShapeLike,
+    flags: None | _FlagsKind | Iterable[_FlagsKind] | int | flagsobj = ...,
+) -> Type[_concrete_ndptr[dtype[Any]]]: ...
+@overload
+def ndpointer(
+    dtype: _DTypeLike[_SCT],
+    ndim: int = ...,
+    shape: None = ...,
+    flags: None | _FlagsKind | Iterable[_FlagsKind] | int | flagsobj = ...,
+) -> Type[_ndptr[dtype[_SCT]]]: ...
+@overload
+def ndpointer(
+    dtype: DTypeLike,
+    ndim: int = ...,
+    shape: None = ...,
+    flags: None | _FlagsKind | Iterable[_FlagsKind] | int | flagsobj = ...,
+) -> Type[_ndptr[dtype[Any]]]: ...
+
+@overload
+def as_ctypes_type(dtype: _BoolCodes | _DTypeLike[bool_] | Type[ctypes.c_bool]) -> Type[ctypes.c_bool]: ...
+@overload
+def as_ctypes_type(dtype: _ByteCodes | _DTypeLike[byte] | Type[ctypes.c_byte]) -> Type[ctypes.c_byte]: ...
+@overload
+def as_ctypes_type(dtype: _ShortCodes | _DTypeLike[short] | Type[ctypes.c_short]) -> Type[ctypes.c_short]: ...
+@overload
+def as_ctypes_type(dtype: _IntCCodes | _DTypeLike[intc] | Type[ctypes.c_int]) -> Type[ctypes.c_int]: ...
+@overload
+def as_ctypes_type(dtype: _IntCodes | _DTypeLike[int_] | Type[int | ctypes.c_long]) -> Type[ctypes.c_long]: ...
+@overload
+def as_ctypes_type(dtype: _LongLongCodes | _DTypeLike[longlong] | Type[ctypes.c_longlong]) -> Type[ctypes.c_longlong]: ...
+@overload
+def as_ctypes_type(dtype: _UByteCodes | _DTypeLike[ubyte] | Type[ctypes.c_ubyte]) -> Type[ctypes.c_ubyte]: ...
+@overload
+def as_ctypes_type(dtype: _UShortCodes | _DTypeLike[ushort] | Type[ctypes.c_ushort]) -> Type[ctypes.c_ushort]: ...
+@overload
+def as_ctypes_type(dtype: _UIntCCodes | _DTypeLike[uintc] | Type[ctypes.c_uint]) -> Type[ctypes.c_uint]: ...
+@overload
+def as_ctypes_type(dtype: _UIntCodes | _DTypeLike[uint] | Type[ctypes.c_ulong]) -> Type[ctypes.c_ulong]: ...
+@overload
+def as_ctypes_type(dtype: _ULongLongCodes | _DTypeLike[ulonglong] | Type[ctypes.c_ulonglong]) -> Type[ctypes.c_ulonglong]: ...
+@overload
+def as_ctypes_type(dtype: _SingleCodes | _DTypeLike[single] | Type[ctypes.c_float]) -> Type[ctypes.c_float]: ...
+@overload
+def as_ctypes_type(dtype: _DoubleCodes | _DTypeLike[double] | Type[float | ctypes.c_double]) -> Type[ctypes.c_double]: ...
+@overload
+def as_ctypes_type(dtype: _LongDoubleCodes | _DTypeLike[longdouble] | Type[ctypes.c_longdouble]) -> Type[ctypes.c_longdouble]: ...
+@overload
+def as_ctypes_type(dtype: _VoidDTypeLike) -> Type[Any]: ...  # `ctypes.Union` or `ctypes.Structure`
+@overload
+def as_ctypes_type(dtype: str) -> Type[Any]: ...
+
+@overload
+def as_array(obj: ctypes._PointerLike, shape: Sequence[int]) -> NDArray[Any]: ...
+@overload
+def as_array(obj: _ArrayLike[_SCT], shape: None | _ShapeLike = ...) -> NDArray[_SCT]: ...
+@overload
+def as_array(obj: object, shape: None | _ShapeLike = ...) -> NDArray[Any]: ...
 
-def load_library(libname, loader_path): ...
-def ndpointer(dtype=..., ndim=..., shape=..., flags=...): ...
-def as_ctypes(obj): ...
-def as_array(obj, shape=...): ...
-def as_ctypes_type(dtype): ...
+@overload
+def as_ctypes(obj: bool_) -> ctypes.c_bool: ...
+@overload
+def as_ctypes(obj: byte) -> ctypes.c_byte: ...
+@overload
+def as_ctypes(obj: short) -> ctypes.c_short: ...
+@overload
+def as_ctypes(obj: intc) -> ctypes.c_int: ...
+@overload
+def as_ctypes(obj: int_) -> ctypes.c_long: ...
+@overload
+def as_ctypes(obj: longlong) -> ctypes.c_longlong: ...
+@overload
+def as_ctypes(obj: ubyte) -> ctypes.c_ubyte: ...
+@overload
+def as_ctypes(obj: ushort) -> ctypes.c_ushort: ...
+@overload
+def as_ctypes(obj: uintc) -> ctypes.c_uint: ...
+@overload
+def as_ctypes(obj: uint) -> ctypes.c_ulong: ...
+@overload
+def as_ctypes(obj: ulonglong) -> ctypes.c_ulonglong: ...
+@overload
+def as_ctypes(obj: single) -> ctypes.c_float: ...
+@overload
+def as_ctypes(obj: double) -> ctypes.c_double: ...
+@overload
+def as_ctypes(obj: longdouble) -> ctypes.c_longdouble: ...
+@overload
+def as_ctypes(obj: void) -> Any: ...  # `ctypes.Union` or `ctypes.Structure`
+@overload
+def as_ctypes(obj: NDArray[bool_]) -> ctypes.Array[ctypes.c_bool]: ...
+@overload
+def as_ctypes(obj: NDArray[byte]) -> ctypes.Array[ctypes.c_byte]: ...
+@overload
+def as_ctypes(obj: NDArray[short]) -> ctypes.Array[ctypes.c_short]: ...
+@overload
+def as_ctypes(obj: NDArray[intc]) -> ctypes.Array[ctypes.c_int]: ...
+@overload
+def as_ctypes(obj: NDArray[int_]) -> ctypes.Array[ctypes.c_long]: ...
+@overload
+def as_ctypes(obj: NDArray[longlong]) -> ctypes.Array[ctypes.c_longlong]: ...
+@overload
+def as_ctypes(obj: NDArray[ubyte]) -> ctypes.Array[ctypes.c_ubyte]: ...
+@overload
+def as_ctypes(obj: NDArray[ushort]) -> ctypes.Array[ctypes.c_ushort]: ...
+@overload
+def as_ctypes(obj: NDArray[uintc]) -> ctypes.Array[ctypes.c_uint]: ...
+@overload
+def as_ctypes(obj: NDArray[uint]) -> ctypes.Array[ctypes.c_ulong]: ...
+@overload
+def as_ctypes(obj: NDArray[ulonglong]) -> ctypes.Array[ctypes.c_ulonglong]: ...
+@overload
+def as_ctypes(obj: NDArray[single]) -> ctypes.Array[ctypes.c_float]: ...
+@overload
+def as_ctypes(obj: NDArray[double]) -> ctypes.Array[ctypes.c_double]: ...
+@overload
+def as_ctypes(obj: NDArray[longdouble]) -> ctypes.Array[ctypes.c_longdouble]: ...
+@overload
+def as_ctypes(obj: NDArray[void]) -> ctypes.Array[Any]: ...  # `ctypes.Union` or `ctypes.Structure`
diff --git a/numpy/distutils/armccompiler.py b/numpy/distutils/armccompiler.py
new file mode 100644 (file)
index 0000000..968504c
--- /dev/null
@@ -0,0 +1,28 @@
+from __future__ import division, absolute_import, print_function               
+
+from distutils.unixccompiler import UnixCCompiler                              
+
+class ArmCCompiler(UnixCCompiler):
+
+    """
+    Arm compiler.
+    """
+
+    compiler_type = 'arm'
+    cc_exe = 'armclang'
+    cxx_exe = 'armclang++'
+
+    def __init__(self, verbose=0, dry_run=0, force=0):
+        UnixCCompiler.__init__(self, verbose, dry_run, force)
+        cc_compiler = self.cc_exe
+        cxx_compiler = self.cxx_exe
+        self.set_executables(compiler=cc_compiler +
+                                      ' -O3 -fPIC',
+                             compiler_so=cc_compiler +
+                                         ' -O3 -fPIC',
+                             compiler_cxx=cxx_compiler +
+                                          ' -O3 -fPIC',
+                             linker_exe=cc_compiler +
+                                        ' -lamath',
+                             linker_so=cc_compiler +
+                                       ' -lamath -shared')
index ffdc4eb4764725e40c76fe90fdb6846e39c99e61..16f00d8edf173b745b9671a3817c9d048e90e6d4 100644 (file)
@@ -21,10 +21,10 @@ from numpy.distutils import log
 from numpy.distutils.exec_command import (
     filepath_from_subprocess_output, forward_bytes_to_stdout
 )
-from numpy.distutils.misc_util import (
-        cyg2win32, is_sequence, mingw32, get_num_build_jobs,
-        _commandline_dep_string, sanitize_cxx_flags
-)
+from numpy.distutils.misc_util import cyg2win32, is_sequence, mingw32, \
+                                      get_num_build_jobs, \
+                                      _commandline_dep_string, \
+                                      sanitize_cxx_flags
 
 # globals for parallel build management
 import threading
@@ -109,7 +109,7 @@ replace_method(CCompiler, 'find_executables', CCompiler_find_executables)
 
 
 # Using customized CCompiler.spawn.
-def CCompiler_spawn(self, cmd, display=None):
+def CCompiler_spawn(self, cmd, display=None, env=None):
     """
     Execute a command in a sub-process.
 
@@ -120,6 +120,7 @@ def CCompiler_spawn(self, cmd, display=None):
     display : str or sequence of str, optional
         The text to add to the log file kept by `numpy.distutils`.
         If not given, `display` is equal to `cmd`.
+    env: a dictionary for environment variables, optional
 
     Returns
     -------
@@ -131,6 +132,7 @@ def CCompiler_spawn(self, cmd, display=None):
         If the command failed, i.e. the exit status was not 0.
 
     """
+    env = env if env is not None else dict(os.environ)
     if display is None:
         display = cmd
         if is_sequence(display):
@@ -138,9 +140,9 @@ def CCompiler_spawn(self, cmd, display=None):
     log.info(display)
     try:
         if self.verbose:
-            subprocess.check_output(cmd)
+            subprocess.check_output(cmd, env=env)
         else:
-            subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+            subprocess.check_output(cmd, stderr=subprocess.STDOUT, env=env)
     except subprocess.CalledProcessError as exc:
         o = exc.output
         s = exc.returncode
@@ -265,9 +267,6 @@ def CCompiler_compile(self, sources, output_dir=None, macros=None,
         If compilation fails.
 
     """
-    # This method is effective only with Python >=2.3 distutils.
-    # Any changes here should be applied also to fcompiler.compile
-    # method to support pre Python 2.3 distutils.
     global _job_semaphore
 
     jobs = get_num_build_jobs()
@@ -395,7 +394,8 @@ def CCompiler_customize_cmd(self, cmd, ignore=()):
     if hasattr(self, 'compiler') and 'clang' in self.compiler[0]:
         # clang defaults to a non-strict floating error point model.
         # Since NumPy and most Python libs give warnings for these, override:
-        self.compiler.append('-ffp-exception-behavior=strict')
+        self.compiler.append('-ftrapping-math')
+        self.compiler_so.append('-ftrapping-math')
 
     def allow(attr):
         return getattr(cmd, attr, None) is not None and attr not in ignore
@@ -686,7 +686,6 @@ def CCompiler_cxx_compiler(self):
     cxx.compiler_cxx = cxx.compiler_cxx
     cxx.compiler_so = [cxx.compiler_cxx[0]] + \
                       sanitize_cxx_flags(cxx.compiler_so[1:])
-    #cxx.compiler_so = [cxx.compiler_cxx[0]] + cxx.compiler_so[1:]
     if sys.platform.startswith('aix') and 'ld_so_aix' in cxx.linker_so[0]:
         # AIX needs the ld_so_aix script included with Python
         cxx.linker_so = [cxx.linker_so[0], cxx.compiler_cxx[0]] \
@@ -709,6 +708,9 @@ compiler_class['intelemw'] = ('intelccompiler', 'IntelEM64TCCompilerW',
                               "Intel C Compiler for 64-bit applications on Windows")
 compiler_class['pathcc'] = ('pathccompiler', 'PathScaleCCompiler',
                             "PathScale Compiler for SiCortex-based applications")
+compiler_class['arm'] = ('armccompiler', 'ArmCCompiler',
+                            "Arm C Compiler")
+
 ccompiler._default_compilers += (('linux.*', 'intel'),
                                  ('linux.*', 'intele'),
                                  ('linux.*', 'intelem'),
index b60f72dc246381c762bc36f63185f44473867f8e..b38e47c13a94c356302a72b3024d1703f8d44d0c 100644 (file)
@@ -8,7 +8,14 @@ the sources with proper compiler's flags.
 instead only focuses on the compiler side, but it creates abstract C headers
 that can be used later for the final runtime dispatching process."""
 
-import sys, io, os, re, textwrap, pprint, inspect, atexit, subprocess
+import atexit
+import inspect
+import os
+import pprint
+import re
+import subprocess
+import textwrap
+
 
 class _Config:
     """An abstract class holds all configurable attributes of `CCompilerOpt`,
@@ -188,7 +195,7 @@ class _Config:
             # native usually works only with x86
             native = '-march=native',
             opt = '-O3',
-            werror = '-Werror'
+            werror = '-Werror',
         ),
         clang = dict(
             native = '-march=native',
@@ -198,22 +205,22 @@ class _Config:
             # cases `-Werror` gets skipped during the availability test due to
             # "unused arguments" warnings.
             # see https://github.com/numpy/numpy/issues/19624
-            werror = '-Werror-implicit-function-declaration -Werror'
+            werror = '-Werror=switch -Werror',
         ),
         icc = dict(
             native = '-xHost',
             opt = '-O3',
-            werror = '-Werror'
+            werror = '-Werror',
         ),
         iccw = dict(
             native = '/QxHost',
             opt = '/O3',
-            werror = '/Werror'
+            werror = '/Werror',
         ),
         msvc = dict(
             native = None,
             opt = '/O2',
-            werror = '/WX'
+            werror = '/WX',
         )
     )
     conf_min_features = dict(
@@ -406,8 +413,8 @@ class _Config:
             AVX512_ICL = dict(flags="/Qx:ICELAKE-CLIENT")
         )
         if on_x86 and self.cc_is_msvc: return dict(
-            SSE    = dict(flags="/arch:SSE"),
-            SSE2   = dict(flags="/arch:SSE2"),
+            SSE = dict(flags="/arch:SSE") if self.cc_on_x86 else {},
+            SSE2 = dict(flags="/arch:SSE2") if self.cc_on_x86 else {},
             SSE3   = {},
             SSSE3  = {},
             SSE41  = {},
@@ -516,12 +523,13 @@ class _Config:
 
     def __init__(self):
         if self.conf_tmp_path is None:
-            import tempfile, shutil
+            import shutil
+            import tempfile
             tmp = tempfile.mkdtemp()
             def rm_temp():
                 try:
                     shutil.rmtree(tmp)
-                except IOError:
+                except OSError:
                     pass
             atexit.register(rm_temp)
             self.conf_tmp_path = tmp
@@ -555,6 +563,7 @@ class _Distutils:
         flags = kwargs.pop("extra_postargs", []) + flags
         if not ccompiler:
             ccompiler = self._ccompiler
+
         return ccompiler.compile(sources, extra_postargs=flags, **kwargs)
 
     def dist_test(self, source, flags, macros=[]):
@@ -696,7 +705,6 @@ class _Distutils:
     )
     @staticmethod
     def _dist_test_spawn(cmd, display=None):
-        from distutils.errors import CompileError
         try:
             o = subprocess.check_output(cmd, stderr=subprocess.STDOUT,
                                         universal_newlines=True)
@@ -2500,7 +2508,7 @@ class CCompilerOpt(_Config, _Distutils, _Cache, _CCompiler, _Feature, _Parse):
                 last_hash = f.readline().split("cache_hash:")
                 if len(last_hash) == 2 and int(last_hash[1]) == cache_hash:
                     return True
-        except IOError:
+        except OSError:
             pass
 
         self.dist_log("generate dispatched config -> ", config_path)
index 0e31a7dee5be6b2818d576899a6b85af09e0a1b3..45201f98f85242927d53384b8498a5d7973fff4f 100644 (file)
@@ -185,6 +185,30 @@ class build_clib(old_build_clib):
         for (lib_name, build_info) in libraries:
             self.build_a_library(build_info, lib_name, libraries)
 
+    def assemble_flags(self, in_flags):
+        """ Assemble flags from flag list
+
+        Parameters
+        ----------
+        in_flags : None or sequence
+            None corresponds to empty list.  Sequence elements can be strings
+            or callables that return lists of strings. Callable takes `self` as
+            single parameter.
+
+        Returns
+        -------
+        out_flags : list
+        """
+        if in_flags is None:
+            return []
+        out_flags = []
+        for in_flag in in_flags:
+            if callable(in_flag):
+                out_flags += in_flag(self)
+            else:
+                out_flags.append(in_flag)
+        return out_flags
+
     def build_a_library(self, build_info, lib_name, libraries):
         # default compilers
         compiler = self.compiler
@@ -263,7 +287,13 @@ class build_clib(old_build_clib):
         include_dirs = build_info.get('include_dirs')
         if include_dirs is None:
             include_dirs = []
-        extra_postargs = build_info.get('extra_compiler_args') or []
+        # Flags can be strings, or callables that return a list of strings.
+        extra_postargs = self.assemble_flags(
+            build_info.get('extra_compiler_args'))
+        extra_cflags = self.assemble_flags(
+            build_info.get('extra_cflags'))
+        extra_cxxflags = self.assemble_flags(
+            build_info.get('extra_cxxflags'))
 
         include_dirs.extend(get_numpy_include_dirs())
         # where compiled F90 module files are:
@@ -315,38 +345,45 @@ class build_clib(old_build_clib):
                 macros=macros + copt_macros,
                 include_dirs=include_dirs,
                 debug=self.debug,
-                extra_postargs=extra_postargs,
+                extra_postargs=extra_postargs + extra_cxxflags,
                 ccompiler=cxx_compiler
             )
 
         if copt_c_sources:
             log.info("compiling C dispatch-able sources")
-            objects += self.compiler_opt.try_dispatch(copt_c_sources,
-                                                      output_dir=self.build_temp,
-                                                      src_dir=copt_build_src,
-                                                      macros=macros + copt_macros,
-                                                      include_dirs=include_dirs,
-                                                      debug=self.debug,
-                                                      extra_postargs=extra_postargs)
+            objects += self.compiler_opt.try_dispatch(
+                copt_c_sources,
+                output_dir=self.build_temp,
+                src_dir=copt_build_src,
+                macros=macros + copt_macros,
+                include_dirs=include_dirs,
+                debug=self.debug,
+                extra_postargs=extra_postargs + extra_cflags)
 
         if c_sources:
             log.info("compiling C sources")
-            objects += compiler.compile(c_sources,
-                                        output_dir=self.build_temp,
-                                        macros=macros + copt_macros,
-                                        include_dirs=include_dirs,
-                                        debug=self.debug,
-                                        extra_postargs=extra_postargs + copt_baseline_flags)
+            objects += compiler.compile(
+                c_sources,
+                output_dir=self.build_temp,
+                macros=macros + copt_macros,
+                include_dirs=include_dirs,
+                debug=self.debug,
+                extra_postargs=(extra_postargs +
+                                copt_baseline_flags +
+                                extra_cflags))
 
         if cxx_sources:
             log.info("compiling C++ sources")
             cxx_compiler = compiler.cxx_compiler()
-            cxx_objects = cxx_compiler.compile(cxx_sources,
-                                               output_dir=self.build_temp,
-                                               macros=macros + copt_macros,
-                                               include_dirs=include_dirs,
-                                               debug=self.debug,
-                                               extra_postargs=extra_postargs + copt_baseline_flags)
+            cxx_objects = cxx_compiler.compile(
+                cxx_sources,
+                output_dir=self.build_temp,
+                macros=macros + copt_macros,
+                include_dirs=include_dirs,
+                debug=self.debug,
+                extra_postargs=(extra_postargs +
+                                copt_baseline_flags +
+                                extra_cxxflags))
             objects.extend(cxx_objects)
 
         if f_sources or fmodule_sources:
index 84ec8aa2cb46bc448c5c94d92a437a0f6c586f64..7040a241167c2f7276d67dba34c8ec30716e9d6e 100644 (file)
@@ -243,7 +243,8 @@ class build_ext (old_build_ext):
             if l and l != ext_language and ext.language:
                 log.warn('resetting extension %r language from %r to %r.' %
                          (ext.name, l, ext_language))
-            ext.language = ext_language
+            if not ext.language:
+                ext.language = ext_language
             # global language
             all_languages.update(ext_languages)
 
@@ -376,6 +377,9 @@ class build_ext (old_build_ext):
             log.info("building '%s' extension", ext.name)
 
         extra_args = ext.extra_compile_args or []
+        extra_cflags = ext.extra_c_compile_args or []
+        extra_cxxflags = ext.extra_cxx_compile_args or []
+
         macros = ext.define_macros[:]
         for undef in ext.undef_macros:
             macros.append((undef,))
@@ -462,38 +466,43 @@ class build_ext (old_build_ext):
                 macros=macros + copt_macros,
                 include_dirs=include_dirs,
                 debug=self.debug,
-                extra_postargs=extra_args,
+                extra_postargs=extra_args + extra_cxxflags,
                 ccompiler=cxx_compiler,
                 **kws
             )
         if copt_c_sources:
             log.info("compiling C dispatch-able sources")
-            c_objects += self.compiler_opt.try_dispatch(copt_c_sources,
-                                                        output_dir=output_dir,
-                                                        src_dir=copt_build_src,
-                                                        macros=macros + copt_macros,
-                                                        include_dirs=include_dirs,
-                                                        debug=self.debug,
-                                                        extra_postargs=extra_args,
-                                                        **kws)
+            c_objects += self.compiler_opt.try_dispatch(
+                copt_c_sources,
+                output_dir=output_dir,
+                src_dir=copt_build_src,
+                macros=macros + copt_macros,
+                include_dirs=include_dirs,
+                debug=self.debug,
+                extra_postargs=extra_args + extra_cflags,
+                **kws)
         if c_sources:
             log.info("compiling C sources")
-            c_objects += self.compiler.compile(c_sources,
-                                               output_dir=output_dir,
-                                               macros=macros + copt_macros,
-                                               include_dirs=include_dirs,
-                                               debug=self.debug,
-                                               extra_postargs=extra_args + copt_baseline_flags,
-                                               **kws)
+            c_objects += self.compiler.compile(
+                c_sources,
+                output_dir=output_dir,
+                macros=macros + copt_macros,
+                include_dirs=include_dirs,
+                debug=self.debug,
+                extra_postargs=(extra_args + copt_baseline_flags +
+                                extra_cflags),
+                **kws)
         if cxx_sources:
             log.info("compiling C++ sources")
-            c_objects += cxx_compiler.compile(cxx_sources,
-                                              output_dir=output_dir,
-                                              macros=macros + copt_macros,
-                                              include_dirs=include_dirs,
-                                              debug=self.debug,
-                                              extra_postargs=extra_args + copt_baseline_flags,
-                                              **kws)
+            c_objects += cxx_compiler.compile(
+                cxx_sources,
+                output_dir=output_dir,
+                macros=macros + copt_macros,
+                include_dirs=include_dirs,
+                debug=self.debug,
+                extra_postargs=(extra_args + copt_baseline_flags +
+                                extra_cxxflags),
+                **kws)
 
         extra_postargs = []
         f_objects = []
@@ -602,7 +611,7 @@ class build_ext (old_build_ext):
         # Expand possible fake static libraries to objects;
         # make sure to iterate over a copy of the list as
         # "fake" libraries will be removed as they are
-        # enountered
+        # encountered
         for lib in libraries[:]:
             for libdir in library_dirs:
                 fake_lib = os.path.join(libdir, lib + '.fobjects')
index d5551f3490d155f0c253ff530fede5a89e2483b8..c4a14e59901f90afe1fc65dfb9679bd307e8f66e 100644 (file)
@@ -19,7 +19,7 @@ import warnings
 import distutils.core
 import distutils.dist
 
-from numpy.distutils.extension import Extension
+from numpy.distutils.extension import Extension  # noqa: F401
 from numpy.distutils.numpy_distribution import NumpyDistribution
 from numpy.distutils.command import config, config_compiler, \
      build, build_py, build_ext, build_clib, build_src, build_scripts, \
index 51ce3c1291b44592f76047ecaa0d5651090b898b..77620210981dd1e97d87a078344b3735c3cc6e1d 100644 (file)
@@ -27,7 +27,7 @@ from subprocess import getstatusoutput
 def getoutput(cmd, successful_status=(0,), stacklevel=1):
     try:
         status, output = getstatusoutput(cmd)
-    except EnvironmentError as e:
+    except OSError as e:
         warnings.warn(str(e), UserWarning, stacklevel=stacklevel)
         return False, ""
     if os.WIFEXITED(status) and os.WEXITSTATUS(status) in successful_status:
@@ -109,7 +109,7 @@ class LinuxCPUInfo(CPUInfoBase):
             info[0]['uname_m'] = output.strip()
         try:
             fo = open('/proc/cpuinfo')
-        except EnvironmentError as e:
+        except OSError as e:
             warnings.warn(str(e), UserWarning, stacklevel=2)
         else:
             for line in fo:
index fb10d247069bc9a195a39697d590b0948b066d52..79998cf5d478bd69fdfb0d2984734c580ba2eb70 100644 (file)
@@ -284,7 +284,7 @@ def _exec_command(command, use_shell=None, use_tee = None, **env):
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.STDOUT,
                                 universal_newlines=False)
-    except EnvironmentError:
+    except OSError:
         # Return 127, as os.spawn*() and /bin/sh do
         return 127, ''
 
index c90b5d725389b6ca23b652813bbc18af7f673946..3ede013e0f3c6f2ed20690a7b2a260c2592ab3f4 100644 (file)
@@ -47,6 +47,8 @@ class Extension(old_Extension):
             language=None,
             f2py_options=None,
             module_dirs=None,
+            extra_c_compile_args=None,
+            extra_cxx_compile_args=None,
             extra_f77_compile_args=None,
             extra_f90_compile_args=None,):
 
@@ -83,6 +85,8 @@ class Extension(old_Extension):
         # numpy_distutils features
         self.f2py_options = f2py_options or []
         self.module_dirs = module_dirs or []
+        self.extra_c_compile_args = extra_c_compile_args or []
+        self.extra_cxx_compile_args = extra_cxx_compile_args or []
         self.extra_f77_compile_args = extra_f77_compile_args or []
         self.extra_f90_compile_args = extra_f90_compile_args or []
 
index d7579e976801bd85360180c4e67957553fdc5666..d8dcfa8994e1eeb43cf151d73d5f600119edd631 100644 (file)
@@ -743,9 +743,11 @@ _default_compilers = (
     ('win32', ('gnu', 'intelv', 'absoft', 'compaqv', 'intelev', 'gnu95', 'g95',
                'intelvem', 'intelem', 'flang')),
     ('cygwin.*', ('gnu', 'intelv', 'absoft', 'compaqv', 'intelev', 'gnu95', 'g95')),
-    ('linux.*', ('gnu95', 'intel', 'lahey', 'pg', 'nv', 'absoft', 'nag', 'vast', 'compaq',
-                 'intele', 'intelem', 'gnu', 'g95', 'pathf95', 'nagfor', 'fujitsu')),
-    ('darwin.*', ('gnu95', 'nag', 'absoft', 'ibm', 'intel', 'gnu', 'g95', 'pg')),
+    ('linux.*', ('arm', 'gnu95', 'intel', 'lahey', 'pg', 'nv', 'absoft', 'nag',
+                 'vast', 'compaq', 'intele', 'intelem', 'gnu', 'g95', 
+                 'pathf95', 'nagfor', 'fujitsu')),
+    ('darwin.*', ('gnu95', 'nag', 'nagfor', 'absoft', 'ibm', 'intel', 'gnu',
+                 'g95', 'pg')),
     ('sunos.*', ('sun', 'gnu', 'gnu95', 'g95')),
     ('irix.*', ('mips', 'gnu', 'gnu95',)),
     ('aix.*', ('ibm', 'gnu', 'gnu95',)),
diff --git a/numpy/distutils/fcompiler/arm.py b/numpy/distutils/fcompiler/arm.py
new file mode 100644 (file)
index 0000000..bc491d9
--- /dev/null
@@ -0,0 +1,73 @@
+from __future__ import division, absolute_import, print_function
+                                                                               
+import sys                                                                     
+                                                                               
+from numpy.distutils.fcompiler import FCompiler, dummy_fortran_file
+from sys import platform                                                       
+from os.path import join, dirname, normpath
+
+compilers = ['ArmFlangCompiler']
+
+import functools
+
+class ArmFlangCompiler(FCompiler):
+    compiler_type = 'arm'
+    description = 'Arm Compiler'
+    version_pattern = r'\s*Arm.*version (?P<version>[\d.-]+).*'
+
+    ar_exe = 'lib.exe'
+    possible_executables = ['armflang']
+
+    executables = {
+        'version_cmd': ["", "--version"],
+        'compiler_f77': ["armflang", "-fPIC"],
+        'compiler_fix': ["armflang", "-fPIC", "-ffixed-form"],
+        'compiler_f90': ["armflang", "-fPIC"],
+        'linker_so': ["armflang", "-fPIC", "-shared"],
+        'archiver': ["ar", "-cr"],
+        'ranlib':  None
+    }
+
+    pic_flags = ["-fPIC", "-DPIC"]
+    c_compiler = 'arm'
+    module_dir_switch = '-module '  # Don't remove ending space!
+
+    def get_libraries(self):
+        opt = FCompiler.get_libraries(self)
+        opt.extend(['flang', 'flangrti', 'ompstub'])
+        return opt
+
+    @functools.lru_cache(maxsize=128)
+    def get_library_dirs(self):
+        """List of compiler library directories."""
+        opt = FCompiler.get_library_dirs(self)
+        flang_dir = dirname(self.executables['compiler_f77'][0])
+        opt.append(normpath(join(flang_dir, '..', 'lib')))
+
+        return opt
+
+    def get_flags(self):
+        return []
+
+    def get_flags_free(self):
+        return []
+
+    def get_flags_debug(self):
+        return ['-g']
+
+    def get_flags_opt(self):
+        return ['-O3']
+
+    def get_flags_arch(self):
+        return []
+
+    def runtime_library_dir_option(self, dir):
+        return '-Wl,-rpath=%s' % dir
+
+
+if __name__ == '__main__':
+    from distutils import log
+    log.set_verbosity(2)
+    from numpy.distutils import customized_fcompiler
+    print(customized_fcompiler(compiler='armflang').get_version())
+
index 351a43dd7618099363230b76558cd1737e7b3e67..01314c136acff7171298dc2819db4b50d7eec091 100644 (file)
@@ -84,9 +84,9 @@ class CompaqVisualFCompiler(FCompiler):
                 print('Ignoring "%s" (I think it is msvccompiler.py bug)' % (e))
             else:
                 raise
-        except IOError as e:
+        except OSError as e:
             if not "vcvarsall.bat" in str(e):
-                print("Unexpected IOError in", __file__)
+                print("Unexpected OSError in", __file__)
                 raise
         except ValueError as e:
             if not "'path'" in str(e):
index eac4cbb4779b40d07eb90bedc23107d14c9f063f..39178071d511b1b9af298f77534a7f0eb78d3eaa 100644 (file)
@@ -113,7 +113,7 @@ class GnuFCompiler(FCompiler):
             # If MACOSX_DEPLOYMENT_TARGET is set, we simply trust the value
             # and leave it alone.  But, distutils will complain if the
             # environment's value is different from the one in the Python
-            # Makefile used to build Python.  We let disutils handle this
+            # Makefile used to build Python.  We let distutils handle this
             # error checking.
             if not target:
                 # If MACOSX_DEPLOYMENT_TARGET is not set in the environment,
@@ -247,7 +247,7 @@ class GnuFCompiler(FCompiler):
         return []
 
     def runtime_library_dir_option(self, dir):
-        if sys.platform == 'win32':
+        if sys.platform == 'win32' or sys.platform == 'cygwin':
             # Linux/Solaris/Unix support RPATH, Windows does not
             raise NotImplementedError
 
@@ -535,7 +535,6 @@ def _can_target(cmd, arch):
                 os.remove(output)
     finally:
         os.remove(filename)
-    return False
 
 
 if __name__ == '__main__':
index 7df8ffe2ce303737b32533988a8f9132d48e546c..939201f44e024de7b9f3d3858284a1dfce1d1a11 100644 (file)
@@ -64,6 +64,11 @@ class NAGFORCompiler(BaseNAGFCompiler):
         'ranlib'       : ["ranlib"]
         }
 
+    def get_flags_linker_so(self):
+        if sys.platform == 'darwin':
+            return ['-unsharedrts',
+                    '-Wl,-bundle,-flat_namespace,-undefined,suppress']
+        return BaseNAGFCompiler.get_flags_linker_so(self)
     def get_flags_debug(self):
         version = self.get_version()
         if version and version > '6.1':
index 8e9f1683558aab5f81f7f4d4268973a177e02628..212f34806fc491f5c9ef3ff5148331bea92041c4 100644 (file)
@@ -1,5 +1,3 @@
-import sys
-
 from numpy.distutils.fcompiler import FCompiler
 
 compilers = ['NVHPCFCompiler']
index a8113b9c6e1a9b37b763dc24420bd780caa40bb1..3347f56d6fe95ebe5388de8d740ef4ddf8db317d 100644 (file)
@@ -87,3 +87,25 @@ _global_color_map = {
 
 # don't use INFO,.. flags in set_verbosity, these flags are for set_threshold.
 set_verbosity(0, force=True)
+
+
+_error = error
+_warn = warn
+_info = info
+_debug = debug
+
+
+def error(msg, *a, **kw):
+    _error(f"ERROR: {msg}", *a, **kw)
+
+
+def warn(msg, *a, **kw):
+    _warn(f"WARN: {msg}", *a, **kw)
+
+
+def info(msg, *a, **kw):
+    _info(f"INFO: {msg}", *a, **kw)
+
+
+def debug(msg, *a, **kw):
+    _debug(f"DEBUG: {msg}", *a, **kw)
index c3a0cb4181ddd9fd8b3059da6aa0276758ee1d40..fbe3655c965c5cf3a184b2a8a5557ac311482a58 100644 (file)
@@ -24,7 +24,6 @@ from numpy.distutils import log
 # 3. Force windows to use g77
 
 import distutils.cygwinccompiler
-from distutils.version import StrictVersion
 from distutils.unixccompiler import UnixCCompiler
 from distutils.msvccompiler import get_build_version as get_build_msvc_version
 from distutils.errors import UnknownFileError
@@ -62,35 +61,6 @@ class Mingw32CCompiler(distutils.cygwinccompiler.CygwinCCompiler):
         distutils.cygwinccompiler.CygwinCCompiler.__init__ (self, verbose,
                                                             dry_run, force)
 
-        # we need to support 3.2 which doesn't match the standard
-        # get_versions methods regex
-        if self.gcc_version is None:
-            try:
-                out_string  = subprocess.check_output(['gcc', '-dumpversion'])
-            except (OSError, CalledProcessError):
-                out_string = ""  # ignore failures to match old behavior
-            result = re.search(r'(\d+\.\d+)', out_string)
-            if result:
-                self.gcc_version = StrictVersion(result.group(1))
-
-        # A real mingw32 doesn't need to specify a different entry point,
-        # but cygwin 2.91.57 in no-cygwin-mode needs it.
-        if self.gcc_version <= "2.91.57":
-            entry_point = '--entry _DllMain@12'
-        else:
-            entry_point = ''
-
-        if self.linker_dll == 'dllwrap':
-            # Commented out '--driver-name g++' part that fixes weird
-            #   g++.exe: g++: No such file or directory
-            # error (mingw 1.0 in Enthon24 tree, gcc-3.4.5).
-            # If the --driver-name part is required for some environment
-            # then make the inclusion of this part specific to that
-            # environment.
-            self.linker = 'dllwrap' #  --driver-name g++'
-        elif self.linker_dll == 'gcc':
-            self.linker = 'g++'
-
         # **changes: eric jones 4/11/01
         # 1. Check for import library on Windows.  Build if it doesn't exist.
 
@@ -113,42 +83,18 @@ class Mingw32CCompiler(distutils.cygwinccompiler.CygwinCCompiler):
         # kind of bad consequences, like using Py_ModuleInit4 instead of
         # Py_ModuleInit4_64, etc... So we add it here
         if get_build_architecture() == 'AMD64':
-            if self.gcc_version < "4.0":
-                self.set_executables(
-                    compiler='gcc -g -DDEBUG -DMS_WIN64 -mno-cygwin -O0 -Wall',
-                    compiler_so='gcc -g -DDEBUG -DMS_WIN64 -mno-cygwin -O0'
-                                ' -Wall -Wstrict-prototypes',
-                    linker_exe='gcc -g -mno-cygwin',
-                    linker_so='gcc -g -mno-cygwin -shared')
-            else:
-                # gcc-4 series releases do not support -mno-cygwin option
-                self.set_executables(
-                    compiler='gcc -g -DDEBUG -DMS_WIN64 -O0 -Wall',
-                    compiler_so='gcc -g -DDEBUG -DMS_WIN64 -O0 -Wall -Wstrict-prototypes',
-                    linker_exe='gcc -g',
-                    linker_so='gcc -g -shared')
+            self.set_executables(
+                compiler='gcc -g -DDEBUG -DMS_WIN64 -O0 -Wall',
+                compiler_so='gcc -g -DDEBUG -DMS_WIN64 -O0 -Wall '
+                            '-Wstrict-prototypes',
+                linker_exe='gcc -g',
+                linker_so='gcc -g -shared')
         else:
-            if self.gcc_version <= "3.0.0":
-                self.set_executables(
-                    compiler='gcc -mno-cygwin -O2 -w',
-                    compiler_so='gcc -mno-cygwin -mdll -O2 -w'
-                                ' -Wstrict-prototypes',
-                    linker_exe='g++ -mno-cygwin',
-                    linker_so='%s -mno-cygwin -mdll -static %s' %
-                              (self.linker, entry_point))
-            elif self.gcc_version < "4.0":
-                self.set_executables(
-                    compiler='gcc -mno-cygwin -O2 -Wall',
-                    compiler_so='gcc -mno-cygwin -O2 -Wall'
-                                ' -Wstrict-prototypes',
-                    linker_exe='g++ -mno-cygwin',
-                    linker_so='g++ -mno-cygwin -shared')
-            else:
-                # gcc-4 series releases do not support -mno-cygwin option
-                self.set_executables(compiler='gcc -O2 -Wall',
-                                     compiler_so='gcc -O2 -Wall -Wstrict-prototypes',
-                                     linker_exe='g++ ',
-                                     linker_so='g++ -shared')
+            self.set_executables(
+                compiler='gcc -O2 -Wall',
+                compiler_so='gcc -O2 -Wall -Wstrict-prototypes',
+                linker_exe='g++ ',
+                linker_so='g++ -shared')
         # added for python2.3 support
         # we can't pass it through set_executables because pre 2.2 would fail
         self.compiler_cxx = ['g++']
@@ -198,10 +144,7 @@ class Mingw32CCompiler(distutils.cygwinccompiler.CygwinCCompiler):
                 extra_postargs,
                 build_temp,
                 target_lang)
-        if self.gcc_version < "3.0.0":
-            func = distutils.cygwinccompiler.CygwinCCompiler.link
-        else:
-            func = UnixCCompiler.link
+        func = UnixCCompiler.link
         func(*args[:func.__code__.co_argcount])
         return
 
@@ -547,12 +490,12 @@ if sys.platform == 'win32':
         # Value from msvcrt.CRT_ASSEMBLY_VERSION under Python 3.3.0
         # on Windows XP:
         _MSVCRVER_TO_FULLVER['100'] = "10.0.30319.460"
-        # Python 3.7 uses 1415, but get_build_version returns 140 ??
-        _MSVCRVER_TO_FULLVER['140'] = "14.15.26726.0"
-        if hasattr(msvcrt, "CRT_ASSEMBLY_VERSION"):
-            major, minor, rest = msvcrt.CRT_ASSEMBLY_VERSION.split(".", 2)
-            _MSVCRVER_TO_FULLVER[major + minor] = msvcrt.CRT_ASSEMBLY_VERSION
-            del major, minor, rest
+        crt_ver = getattr(msvcrt, 'CRT_ASSEMBLY_VERSION', None)
+        if crt_ver is not None:  # Available at least back to Python 3.3
+            maj, min = re.match(r'(\d+)\.(\d)', crt_ver).groups()
+            _MSVCRVER_TO_FULLVER[maj + min] = crt_ver
+            del maj, min
+        del crt_ver
     except ImportError:
         # If we are here, means python was not built with MSVC. Not sure what
         # to do in that case: manifest building will fail, but it should not be
index 778f1dccc44c4530bd174b0c0c63582538c911f6..513be75db2c56d67fbae96ece8468cc7afea0ba6 100644 (file)
@@ -11,6 +11,7 @@ import multiprocessing
 import textwrap
 import importlib.util
 from threading import local as tlocal
+from functools import reduce
 
 import distutils
 from distutils.errors import DistutilsError
@@ -40,7 +41,7 @@ __all__ = ['Configuration', 'get_numpy_include_dirs', 'default_config_dict',
            'get_script_files', 'get_lib_source_files', 'get_data_files',
            'dot_join', 'get_frame', 'minrelpath', 'njoin',
            'is_sequence', 'is_string', 'as_list', 'gpaths', 'get_language',
-           'quote_args', 'get_build_architecture', 'get_info', 'get_pkg_info',
+           'get_build_architecture', 'get_info', 'get_pkg_info',
            'get_num_build_jobs', 'sanitize_cxx_flags',
            'exec_mod_from_location']
 
@@ -109,6 +110,13 @@ def get_num_build_jobs():
         return max(x for x in cmdattr if x is not None)
 
 def quote_args(args):
+    """Quote list of arguments.
+
+    .. deprecated:: 1.22.
+    """
+    import warnings
+    warnings.warn('"quote_args" is deprecated.',
+                  DeprecationWarning, stacklevel=2)
     # don't used _nt_quote_args as it does not check if
     # args items already have quotes or not.
     args = list(args)
@@ -120,8 +128,8 @@ def quote_args(args):
 
 def allpath(name):
     "Convert a /-separated pathname to one using the OS's path separator."
-    splitted = name.split('/')
-    return os.path.join(*splitted)
+    split = name.split('/')
+    return os.path.join(*split)
 
 def rel_path(path, parent_path):
     """Return path relative to parent_path."""
@@ -375,10 +383,42 @@ def blue_text(s):
 
 #########################
 
-def cyg2win32(path):
-    if sys.platform=='cygwin' and path.startswith('/cygdrive'):
-        path = path[10] + ':' + os.path.normcase(path[11:])
-    return path
+def cyg2win32(path: str) -> str:
+    """Convert a path from Cygwin-native to Windows-native.
+
+    Uses the cygpath utility (part of the Base install) to do the
+    actual conversion.  Falls back to returning the original path if
+    this fails.
+
+    Handles the default ``/cygdrive`` mount prefix as well as the
+    ``/proc/cygdrive`` portable prefix, custom cygdrive prefixes such
+    as ``/`` or ``/mnt``, and absolute paths such as ``/usr/src/`` or
+    ``/home/username``
+
+    Parameters
+    ----------
+    path : str
+       The path to convert
+
+    Returns
+    -------
+    converted_path : str
+        The converted path
+
+    Notes
+    -----
+    Documentation for cygpath utility:
+    https://cygwin.com/cygwin-ug-net/cygpath.html
+    Documentation for the C function it wraps:
+    https://cygwin.com/cygwin-api/func-cygwin-conv-path.html
+
+    """
+    if sys.platform != "cygwin":
+        return path
+    return subprocess.check_output(
+        ["/usr/bin/cygpath", "--windows", path], universal_newlines=True
+    )
+
 
 def mingw32():
     """Return true when using mingw32 environment.
@@ -2342,23 +2382,47 @@ def generate_config_py(target):
 
                 Notes
                 -----
-                Classes specifying the information to be printed are defined
-                in the `numpy.distutils.system_info` module.
-
-                Information may include:
-
-                * ``language``: language used to write the libraries (mostly
-                  C or f77)
-                * ``libraries``: names of libraries found in the system
-                * ``library_dirs``: directories containing the libraries
-                * ``include_dirs``: directories containing library header files
-                * ``src_dirs``: directories containing library source files
-                * ``define_macros``: preprocessor macros used by
-                  ``distutils.setup``
-                * ``baseline``: minimum CPU features required
-                * ``found``: dispatched features supported in the system
-                * ``not found``: dispatched features that are not supported
-                  in the system
+                1. Classes specifying the information to be printed are defined
+                   in the `numpy.distutils.system_info` module.
+
+                   Information may include:
+
+                   * ``language``: language used to write the libraries (mostly
+                     C or f77)
+                   * ``libraries``: names of libraries found in the system
+                   * ``library_dirs``: directories containing the libraries
+                   * ``include_dirs``: directories containing library header files
+                   * ``src_dirs``: directories containing library source files
+                   * ``define_macros``: preprocessor macros used by
+                     ``distutils.setup``
+                   * ``baseline``: minimum CPU features required
+                   * ``found``: dispatched features supported in the system
+                   * ``not found``: dispatched features that are not supported
+                     in the system
+
+                2. NumPy BLAS/LAPACK Installation Notes
+
+                   Installing a numpy wheel (``pip install numpy`` or force it
+                   via ``pip install numpy --only-binary :numpy: numpy``) includes
+                   an OpenBLAS implementation of the BLAS and LAPACK linear algebra
+                   APIs. In this case, ``library_dirs`` reports the original build
+                   time configuration as compiled with gcc/gfortran; at run time
+                   the OpenBLAS library is in
+                   ``site-packages/numpy.libs/`` (linux), or
+                   ``site-packages/numpy/.dylibs/`` (macOS), or
+                   ``site-packages/numpy/.libs/`` (windows).
+
+                   Installing numpy from source
+                   (``pip install numpy --no-binary numpy``) searches for BLAS and
+                   LAPACK dynamic link libraries at build time as influenced by
+                   environment variables NPY_BLAS_LIBS, NPY_CBLAS_LIBS, and
+                   NPY_LAPACK_LIBS; or NPY_BLAS_ORDER and NPY_LAPACK_ORDER;
+                   or the optional file ``~/.numpy-site.cfg``.
+                   NumPy remembers those locations and expects to load the same
+                   libraries at run-time.
+                   In NumPy 1.21+ on macOS, 'accelerate' (Apple's Accelerate BLAS
+                   library) is in the default build-time search order after
+                   'openblas'.
 
                 Examples
                 --------
index 951ce5fb8c125892a8e127a6f8358b2415b7df90..f6e3ad3974ca63115e1f8124e743235bb300f1a1 100644 (file)
@@ -9,7 +9,7 @@ __all__ = ['FormatError', 'PkgNotFound', 'LibraryInfo', 'VariableSet',
 
 _VAR = re.compile(r'\$\{([a-zA-Z0-9_-]+)\}')
 
-class FormatError(IOError):
+class FormatError(OSError):
     """
     Exception thrown when there is a problem parsing a configuration file.
 
@@ -20,7 +20,7 @@ class FormatError(IOError):
     def __str__(self):
         return self.msg
 
-class PkgNotFound(IOError):
+class PkgNotFound(OSError):
     """Exception raised when a package can not be located."""
     def __init__(self, msg):
         self.msg = msg
index 59de69d77f8bd4bd0b22da4b875d30a721477f47..d5a1687da32247949501dae8b95c9dad884ee8b6 100644 (file)
@@ -387,11 +387,10 @@ def get_standard_file(fname):
         f = __file__
     except NameError:
         f = sys.argv[0]
-    else:
-        sysfile = os.path.join(os.path.split(os.path.abspath(f))[0],
-                               fname)
-        if os.path.isfile(sysfile):
-            filenames.append(sysfile)
+    sysfile = os.path.join(os.path.split(os.path.abspath(f))[0],
+                           fname)
+    if os.path.isfile(sysfile):
+        filenames.append(sysfile)
 
     # Home directory
     # And look for the user config file
@@ -414,7 +413,8 @@ def get_standard_file(fname):
 def _parse_env_order(base_order, env):
     """ Parse an environment variable `env` by splitting with "," and only returning elements from `base_order`
 
-    This method will sequence the environment variable and check for their invidual elements in `base_order`.
+    This method will sequence the environment variable and check for their
+    individual elements in `base_order`.
 
     The items in the environment variable may be negated via '^item' or '!itema,itemb'.
     It must start with ^/! to negate all options.
@@ -501,7 +501,11 @@ def get_info(name, notfound_action=0):
       1 - display warning message
       2 - raise error
     """
-    cl = {'atlas': atlas_info,  # use lapack_opt or blas_opt instead
+    cl = {'armpl': armpl_info,
+          'blas_armpl': blas_armpl_info,
+          'lapack_armpl': lapack_armpl_info,
+          'fftw3_armpl': fftw3_armpl_info,
+          'atlas': atlas_info,  # use lapack_opt or blas_opt instead
           'atlas_threads': atlas_threads_info,                # ditto
           'atlas_blas': atlas_blas_info,
           'atlas_blas_threads': atlas_blas_threads_info,
@@ -1152,6 +1156,16 @@ class fftw3_info(fftw_info):
                     'macros':[('SCIPY_FFTW3_H', None)]},
                   ]
 
+    
+class fftw3_armpl_info(fftw_info):
+    section = 'fftw3'
+    dir_env_var = 'ARMPL_DIR'
+    notfounderror = FFTWNotFoundError
+    ver_info = [{'name': 'fftw3',
+                    'libs': ['armpl_lp64_mp'],
+                    'includes': ['fftw3.h'],
+                    'macros': [('SCIPY_FFTW3_H', None)]}]
+
 
 class dfftw_info(fftw_info):
     section = 'fftw'
@@ -1311,6 +1325,31 @@ class blas_mkl_info(mkl_info):
     pass
 
 
+class armpl_info(system_info):
+    section = 'armpl'
+    dir_env_var = 'ARMPL_DIR'
+    _lib_armpl = ['armpl_lp64_mp']
+
+    def calc_info(self):
+        lib_dirs = self.get_lib_dirs()
+        incl_dirs = self.get_include_dirs()
+        armpl_libs = self.get_libs('armpl_libs', self._lib_armpl)
+        info = self.check_libs2(lib_dirs, armpl_libs)
+        if info is None:
+            return
+        dict_append(info,
+                    define_macros=[('SCIPY_MKL_H', None),
+                                   ('HAVE_CBLAS', None)],
+                    include_dirs=incl_dirs)
+        self.set_info(**info)
+
+class lapack_armpl_info(armpl_info):
+    pass
+
+class blas_armpl_info(armpl_info):
+    pass
+
+
 class atlas_info(system_info):
     section = 'atlas'
     dir_env_var = 'ATLAS'
@@ -1342,8 +1381,6 @@ class atlas_info(system_info):
         lapack = None
         atlas_1 = None
         for d in lib_dirs:
-            # FIXME: lapack_atlas is unused
-            lapack_atlas = self.check_libs2(d, ['lapack_atlas'], [])
             atlas = self.check_libs2(d, atlas_libs, [])
             if atlas is not None:
                 lib_dirs2 = [d] + self.combine_paths(d, ['atlas*', 'ATLAS*'])
@@ -1750,9 +1787,16 @@ class lapack_opt_info(system_info):
     notfounderror = LapackNotFoundError
 
     # List of all known LAPACK libraries, in the default order
-    lapack_order = ['mkl', 'openblas', 'flame',
+    lapack_order = ['armpl', 'mkl', 'openblas', 'flame',
                     'accelerate', 'atlas', 'lapack']
     order_env_var_name = 'NPY_LAPACK_ORDER'
+    
+    def _calc_info_armpl(self):
+        info = get_info('lapack_armpl')
+        if info:
+            self.set_info(**info)
+            return True
+        return False
 
     def _calc_info_mkl(self):
         info = get_info('lapack_mkl')
@@ -1927,9 +1971,16 @@ class blas_opt_info(system_info):
     notfounderror = BlasNotFoundError
     # List of all known BLAS libraries, in the default order
 
-    blas_order = ['mkl', 'blis', 'openblas',
+    blas_order = ['armpl', 'mkl', 'blis', 'openblas',
                   'accelerate', 'atlas', 'blas']
     order_env_var_name = 'NPY_BLAS_ORDER'
+    
+    def _calc_info_armpl(self):
+        info = get_info('blas_armpl')
+        if info:
+            self.set_info(**info)
+            return True
+        return False
 
     def _calc_info_mkl(self):
         info = get_info('blas_mkl')
@@ -3111,8 +3162,9 @@ def show_all(argv=None):
             del show_only[show_only.index(name)]
         conf = c()
         conf.verbosity = 2
-        # FIXME: r not used
-        r = conf.get_info()
+        # we don't need the result, but we want
+        # the side effect of printing diagnostics
+        conf.get_info()
     if show_only:
         log.info('Info classes not defined: %s', ','.join(show_only))
 
index 9c54ed66bbd92fcc598cbdb2fe6d7f7fe5d56d27..1b27ab07c393db0b794e48e6a66e4c92086ea6ad 100644 (file)
@@ -434,7 +434,8 @@ class _Test_CCompilerOpt:
         self.expect_flags(
             "sse sse2 vsx vsx2 neon neon_fp16",
             x86_gcc="-msse -msse2", x86_icc="-msse -msse2",
-            x86_iccw="/arch:SSE2", x86_msvc="/arch:SSE2",
+            x86_iccw="/arch:SSE2",
+            x86_msvc="/arch:SSE2" if self.march() == "x86" else "",
             ppc64_gcc= "-mcpu=power8",
             ppc64_clang="-maltivec -mvsx -mpower8-vector",
             armhf_gcc="-mfpu=neon-fp16 -mfp16-format=ieee",
@@ -636,7 +637,8 @@ class _Test_CCompilerOpt:
             x86_gcc="avx512f avx2 sse42 sse41 sse2",
             x86_icc="avx512f avx2 sse42 sse41 sse2",
             x86_iccw="avx512f avx2 sse42 sse41 sse2",
-            x86_msvc="avx512f avx2 sse2",
+            x86_msvc="avx512f avx2 sse2"
+                     if self.march() == 'x86' else "avx512f avx2",
             ppc64="vsx3 vsx2",
             armhf="asimddp asimd neon_vfpv4 neon",
             # neon, neon_vfpv4, asimd implies each other
diff --git a/numpy/distutils/tests/test_log.py b/numpy/distutils/tests/test_log.py
new file mode 100644 (file)
index 0000000..36f49f5
--- /dev/null
@@ -0,0 +1,32 @@
+import io
+import re
+from contextlib import redirect_stdout
+
+import pytest
+
+from numpy.distutils import log
+
+
+def setup_module():
+    log.set_verbosity(2, force=True)  # i.e. DEBUG
+
+
+def teardown_module():
+    log.set_verbosity(0, force=True)  # the default
+
+
+r_ansi = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])")
+
+
+@pytest.mark.parametrize("func_name", ["error", "warn", "info", "debug"])
+def test_log_prefix(func_name):
+    func = getattr(log, func_name)
+    msg = f"{func_name} message"
+    f = io.StringIO()
+    with redirect_stdout(f):
+        func(msg)
+    out = f.getvalue()
+    assert out  # sanity check
+    clean_out = r_ansi.sub("", out)
+    line = next(line for line in clean_out.splitlines())
+    assert line == f"{func_name.upper()}: {msg}"
index b722281ad5316e70d381782cded25482ac0e5d78..8c26271af782ea01bd2a70b2ed79d24764ee0f18 100644 (file)
@@ -254,6 +254,10 @@ class TestSystemInfoReading:
         finally:
             os.chdir(previousDir)
 
+    HAS_MKL = "mkl_rt" in mkl_info().calc_libraries_info().get("libraries", [])
+
+    @pytest.mark.xfail(HAS_MKL, reason=("`[DEFAULT]` override doesn't work if "
+                                        "numpy is built with MKL support"))
     def test_overrides(self):
         previousDir = os.getcwd()
         cfg = os.path.join(self._dir1, 'site.cfg')
index fb91f178935f71c262c34750561043209eabf0af..4884960fdf227497df644b71b129ce561e3b49e0 100644 (file)
@@ -5,6 +5,7 @@ unixccompiler - can handle very long argument lists for ar.
 import os
 import sys
 import subprocess
+import shlex
 
 from distutils.errors import CompileError, DistutilsExecError, LibError
 from distutils.unixccompiler import UnixCCompiler
@@ -30,15 +31,15 @@ def UnixCCompiler__compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts
     if 'OPT' in os.environ:
         # XXX who uses this?
         from sysconfig import get_config_vars
-        opt = " ".join(os.environ['OPT'].split())
-        gcv_opt = " ".join(get_config_vars('OPT')[0].split())
-        ccomp_s = " ".join(self.compiler_so)
+        opt = shlex.join(shlex.split(os.environ['OPT']))
+        gcv_opt = shlex.join(shlex.split(get_config_vars('OPT')[0]))
+        ccomp_s = shlex.join(self.compiler_so)
         if opt not in ccomp_s:
             ccomp_s = ccomp_s.replace(gcv_opt, opt)
-            self.compiler_so = ccomp_s.split()
-        llink_s = " ".join(self.linker_so)
+            self.compiler_so = shlex.split(ccomp_s)
+        llink_s = shlex.join(self.linker_so)
         if opt not in llink_s:
-            self.linker_so = llink_s.split() + opt.split()
+            self.linker_so = self.linker_so + shlex.split(opt)
 
     display = '%s: %s' % (os.path.basename(self.compiler_so[0]), src)
 
@@ -105,7 +106,7 @@ def UnixCCompiler_create_static_lib(self, objects, output_libname,
             # and recreate.
             # Also, ar on OS X doesn't handle updating universal archives
             os.unlink(output_filename)
-        except (IOError, OSError):
+        except OSError:
             pass
         self.mkpath(os.path.dirname(output_filename))
         tmp_objects = objects + self.objects
index 128493d90ed6705b963cee3e04086311c073a966..4db5c639047fc3de2c519b2ca1f6b8d525469900 100644 (file)
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """
 =========
 Constants
index 4f6938ed2b4e6bb2c85f6ff24c246ab8bcae9b1f..f147f1b970a3c799fbfd37f3ea13734fb1fa0f47 100644 (file)
@@ -2,7 +2,7 @@
 """Fortran to Python Interface Generator.
 
 """
-__all__ = ['run_main', 'compile', 'get_include', 'f2py_testing']
+__all__ = ['run_main', 'compile', 'get_include']
 
 import sys
 import subprocess
@@ -71,8 +71,8 @@ def compile(source,
 
     Examples
     --------
-    .. include:: compile_session.dat
-        :literal:
+    .. literalinclude:: ../../source/f2py/code/results/compile_session.dat
+        :language: python
 
     """
     import tempfile
index 3f7231fed1d062db8436c96cf5ca21b8253b93f0..e52e12bbd156758838f1ebc9aece1cc7ce19917c 100644 (file)
@@ -1,18 +1,42 @@
-from typing import Any, List
+import os
+import subprocess
+from typing import Literal as L, Any, List, Iterable, Dict, overload, TypedDict
 
-from numpy.f2py import (
-    f2py_testing as f2py_testing,
-)
+from numpy._pytesttester import PytestTester
+
+class _F2PyDictBase(TypedDict):
+    csrc: List[str]
+    h: List[str]
+
+class _F2PyDict(_F2PyDictBase, total=False):
+    fsrc: List[str]
+    ltx: List[str]
 
 __all__: List[str]
+__path__: List[str]
+test: PytestTester
 
-def run_main(comline_list): ...
+def run_main(comline_list: Iterable[str]) -> Dict[str, _F2PyDict]: ...
+
+@overload
+def compile(  # type: ignore[misc]
+    source: str | bytes,
+    modulename: str = ...,
+    extra_args: str | List[str] = ...,
+    verbose: bool = ...,
+    source_fn: None | str | bytes | os.PathLike[Any] = ...,
+    extension: L[".f", ".f90"] = ...,
+    full_output: L[False] = ...,
+) -> int: ...
+@overload
 def compile(
-    source,
-    modulename=...,
-    extra_args=...,
-    verbose=...,
-    source_fn=...,
-    extension=...,
-    full_output=...,
-): ...
+    source: str | bytes,
+    modulename: str = ...,
+    extra_args: str | List[str] = ...,
+    verbose: bool = ...,
+    source_fn: None | str | bytes | os.PathLike[Any] = ...,
+    extension: L[".f", ".f90"] = ...,
+    full_output: L[True] = ...,
+) -> subprocess.CompletedProcess[bytes]: ...
+
+def get_include() -> str: ...
index c6115070e4cc9943d5e2d368342f98491a6e0291..936a753a2796896667aa782277be41b40af061d3 100644 (file)
@@ -1,4 +1,5 @@
-# See http://cens.ioc.ee/projects/f2py2e/
+# See:
+# https://web.archive.org/web/20140822061353/http://cens.ioc.ee/projects/f2py2e
 from numpy.f2py.f2py2e import main
 
 main()
index 5250fea84031373dd3cf6afdd6ef5dbde2639c57..c8f2067c9351b0c864ab90efbd8fb263211d43d6 100644 (file)
@@ -347,9 +347,9 @@ def iscomplexfunction_warn(rout):
     **************************************************************
         Warning: code with a function returning complex value
         may not work correctly with your Fortran compiler.
-        Run the following test before using it in your applications:
-        $(f2py install dir)/test-site/{b/runme_scalar,e/runme}
-        When using GNU gcc/g77 compilers, codes should work correctly.
+        When using GNU gcc/g77 compilers, codes should work
+        correctly for callbacks with:
+        f2py -c -DF2PY_CB_RETURNCOMPLEX
     **************************************************************\n""")
         return 1
     return 0
index fe0d4a52bd160064d792c5a9493a4f07b54cdea1..581f946e5a2177c22f888aa7aafecea2c6fe5804 100644 (file)
@@ -48,7 +48,7 @@ c2py_map = {'double': 'float',
             'unsigned_char': 'int',                    # forced casting
             'short': 'int',                            # forced casting
             'unsigned_short': 'int',                   # forced casting
-            'int': 'int',                              # (forced casting)
+            'int': 'int',                              # forced casting
             'long': 'int',
             'long_long': 'long',
             'unsigned': 'int',                         # forced casting
@@ -95,8 +95,8 @@ if using_newcore:
                   'complex_double': 'NPY_CDOUBLE',
                   'complex_long_double': 'NPY_CDOUBLE',
                   'string':'NPY_STRING'
-
                   }
+
 c2pycode_map = {'double': 'd',
                 'float': 'f',
                 'long_double': 'd',                       # forced casting
@@ -114,6 +114,7 @@ c2pycode_map = {'double': 'd',
                 'complex_long_double': 'D',               # forced casting
                 'string': 'c'
                 }
+
 if using_newcore:
     c2pycode_map = {'double': 'd',
                     'float': 'f',
@@ -133,6 +134,7 @@ if using_newcore:
                     'complex_double': 'D',
                     'complex_long_double': 'G',
                     'string': 'S'}
+
 c2buildvalue_map = {'double': 'd',
                     'float': 'f',
                     'char': 'b',
@@ -146,10 +148,6 @@ c2buildvalue_map = {'double': 'd',
                     'complex_long_double': 'N',
                     'string': 'y'}
 
-if using_newcore:
-    # c2buildvalue_map=???
-    pass
-
 f2cmap_all = {'real': {'': 'float', '4': 'float', '8': 'double',
                        '12': 'long_double', '16': 'long_double'},
               'integer': {'': 'int', '1': 'signed_char', '2': 'short',
@@ -185,22 +183,22 @@ def load_f2cmap_file(f2cmap_file):
             return
 
     # User defined additions to f2cmap_all.
-    # f2cmap_file must contain a dictionary of dictionaries, only.  For
+    # f2cmap_file must contain a dictionary of dictionaries, only. For
     # example, {'real':{'low':'float'}} means that Fortran 'real(low)' is
-    # interpreted as C 'float'.  This feature is useful for F90/95 users if
-    # they use PARAMETERSs in type specifications.
+    # interpreted as C 'float'. This feature is useful for F90/95 users if
+    # they use PARAMETERS in type specifications.
     try:
         outmess('Reading f2cmap from {!r} ...\n'.format(f2cmap_file))
         with open(f2cmap_file, 'r') as f:
             d = eval(f.read(), {}, {})
-        for k, d1 in list(d.items()):
-            for k1 in list(d1.keys()):
+        for k, d1 in d.items():
+            for k1 in d1.keys():
                 d1[k1.lower()] = d1[k1]
             d[k.lower()] = d[k]
-        for k in list(d.keys()):
+        for k in d.keys():
             if k not in f2cmap_all:
                 f2cmap_all[k] = {}
-            for k1 in list(d[k].keys()):
+            for k1 in d[k].keys():
                 if d[k][k1] in c2py_map:
                     if k1 in f2cmap_all[k]:
                         outmess(
@@ -279,11 +277,9 @@ def getctype(var):
                         errmess('getctype: "%s(kind=%s)" is mapped to C "%s" (to override define dict(%s = dict(%s="<C typespec>")) in %s/.f2py_f2cmap file).\n'
                                 % (typespec, var['kindselector']['kind'], ctype,
                                    typespec, var['kindselector']['kind'], os.getcwd()))
-
     else:
         if not isexternal(var):
-            errmess(
-                'getctype: No C-type found in "%s", assuming void.\n' % var)
+            errmess('getctype: No C-type found in "%s", assuming void.\n' % var)
     return ctype
 
 
@@ -446,7 +442,7 @@ def getpydocsign(a, var):
         sigout = sig
     else:
         errmess(
-            'getpydocsign: Could not resolve docsignature for "%s".\\n' % a)
+            'getpydocsign: Could not resolve docsignature for "%s".\n' % a)
     return sig, sigout
 
 
@@ -523,7 +519,7 @@ def sign2map(a, var):
         if f(var):
             intent_flags.append('F2PY_%s' % s)
     if intent_flags:
-        # XXX: Evaluate intent_flags here.
+        # TODO: Evaluate intent_flags here.
         ret['intent'] = '|'.join(intent_flags)
     else:
         ret['intent'] = 'F2PY_INTENT_IN'
index 62aa2fca9e5661a1ed116a9388a81d201bba6d42..4848233d43a54f2e691c4f0640837af279732a94 100644 (file)
@@ -110,6 +110,7 @@ f2py_cb_start_clock();
         capi_tmp = PyObject_GetAttrString(#modulename#_module,\"#argname#_extra_args\");
         if (capi_tmp) {
             capi_arglist = (PyTupleObject *)PySequence_Tuple(capi_tmp);
+            Py_DECREF(capi_tmp);
             if (capi_arglist==NULL) {
                 PyErr_SetString(#modulename#_error,\"Failed to convert #modulename#.#argname#_extra_args to tuple.\\n\");
                 goto capi_fail;
@@ -190,7 +191,7 @@ capi_return_pt:
     'maxnofargs': '#maxnofargs#',
     'nofoptargs': '#nofoptargs#',
     'docstr': """\
-\tdef #argname#(#docsignature#): return #docreturn#\\n\\
+    def #argname#(#docsignature#): return #docreturn#\\n\\
 #docstrsigns#""",
     'latexdocstr': """
 {{}\\verb@def #argname#(#latexdocsignature#): return #docreturn#@{}}
@@ -218,10 +219,10 @@ cb_rout_rules = [
         'noargs': '',
         'setdims': '/*setdims*/',
         'docstrsigns': '', 'latexdocstrsigns': '',
-        'docstrreq': '\tRequired arguments:',
-        'docstropt': '\tOptional arguments:',
-        'docstrout': '\tReturn objects:',
-        'docstrcbs': '\tCall-back functions:',
+        'docstrreq': '    Required arguments:',
+        'docstropt': '    Optional arguments:',
+        'docstrout': '    Return objects:',
+        'docstrcbs': '    Call-back functions:',
         'docreturn': '', 'docsign': '', 'docsignopt': '',
         'latexdocstrreq': '\\noindent Required arguments:',
         'latexdocstropt': '\\noindent Optional arguments:',
@@ -305,7 +306,7 @@ return_value
                  'string.h', 'GETSCALARFROMPYTUPLE', '#ctype#'],
         '_check': iscomplexfunction
     },
-    {'docstrout': '\t\t#pydocsignout#',
+    {'docstrout': '        #pydocsignout#',
      'latexdocstrout': ['\\item[]{{}\\verb@#pydocsignout#@{}}',
                         {hasnote: '--- #note#'}],
      'docreturn': '#rname#,',
@@ -315,9 +316,9 @@ return_value
 
 cb_arg_rules = [
     {  # Doc
-        'docstropt': {l_and(isoptional, isintent_nothide): '\t\t#pydocsign#'},
-        'docstrreq': {l_and(isrequired, isintent_nothide): '\t\t#pydocsign#'},
-        'docstrout': {isintent_out: '\t\t#pydocsignout#'},
+        'docstropt': {l_and(isoptional, isintent_nothide): '        #pydocsign#'},
+        'docstrreq': {l_and(isrequired, isintent_nothide): '        #pydocsign#'},
+        'docstrout': {isintent_out: '        #pydocsignout#'},
         'latexdocstropt': {l_and(isoptional, isintent_nothide): ['\\item[]{{}\\verb@#pydocsign#@{}}',
                                                                  {hasnote: '--- #note#'}]},
         'latexdocstrreq': {l_and(isrequired, isintent_nothide): ['\\item[]{{}\\verb@#pydocsign#@{}}',
@@ -491,7 +492,7 @@ def buildcallbacks(m):
 def buildcallback(rout, um):
     from . import capi_maps
 
-    outmess('\tConstructing call-back function "cb_%s_in_%s"\n' %
+    outmess('    Constructing call-back function "cb_%s_in_%s"\n' %
             (rout['name'], um))
     args, depargs = getargs(rout)
     capi_maps.depargs = depargs
@@ -611,6 +612,6 @@ def buildcallback(rout, um):
                                       'latexdocstr': ar['latexdocstr'],
                                       'argname': rd['argname']
                                       }
-    outmess('\t  %s\n' % (ar['docstrshort']))
+    outmess('      %s\n' % (ar['docstrshort']))
     return
 ################## Build call-back function #############
index 4e53344ec74251da6a3b21ede9630920b1bafe68..528c4adeee77ac1db2928f27001662218f6aeb49 100644 (file)
@@ -51,7 +51,7 @@ includes0['math.h'] = '#include <math.h>'
 includes0['string.h'] = '#include <string.h>'
 includes0['setjmp.h'] = '#include <setjmp.h>'
 
-includes['Python.h'] = '#include "Python.h"'
+includes['Python.h'] = '#include <Python.h>'
 needs['arrayobject.h'] = ['Python.h']
 includes['arrayobject.h'] = '''#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API
 #include "arrayobject.h"'''
@@ -338,16 +338,16 @@ cppmacros['TRYPYARRAYTEMPLATE'] = """\
         if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\"TRYPYARRAYTEMPLATE:\");PRINTPYOBJERR(obj);return 0;}\\
         if (PyArray_DESCR(arr)->type==typecode)  {*(ctype *)(PyArray_DATA(arr))=*v; return 1;}\\
         switch (PyArray_TYPE(arr)) {\\
-                case NPY_DOUBLE: *(double *)(PyArray_DATA(arr))=*v; break;\\
-                case NPY_INT: *(int *)(PyArray_DATA(arr))=*v; break;\\
-                case NPY_LONG: *(long *)(PyArray_DATA(arr))=*v; break;\\
-                case NPY_FLOAT: *(float *)(PyArray_DATA(arr))=*v; break;\\
-                case NPY_CDOUBLE: *(double *)(PyArray_DATA(arr))=*v; break;\\
-                case NPY_CFLOAT: *(float *)(PyArray_DATA(arr))=*v; break;\\
+                case NPY_DOUBLE: *(npy_double *)(PyArray_DATA(arr))=*v; break;\\
+                case NPY_INT: *(npy_int *)(PyArray_DATA(arr))=*v; break;\\
+                case NPY_LONG: *(npy_long *)(PyArray_DATA(arr))=*v; break;\\
+                case NPY_FLOAT: *(npy_float *)(PyArray_DATA(arr))=*v; break;\\
+                case NPY_CDOUBLE: *(npy_double *)(PyArray_DATA(arr))=*v; break;\\
+                case NPY_CFLOAT: *(npy_float *)(PyArray_DATA(arr))=*v; break;\\
                 case NPY_BOOL: *(npy_bool *)(PyArray_DATA(arr))=(*v!=0); break;\\
-                case NPY_UBYTE: *(unsigned char *)(PyArray_DATA(arr))=*v; break;\\
-                case NPY_BYTE: *(signed char *)(PyArray_DATA(arr))=*v; break;\\
-                case NPY_SHORT: *(short *)(PyArray_DATA(arr))=*v; break;\\
+                case NPY_UBYTE: *(npy_ubyte *)(PyArray_DATA(arr))=*v; break;\\
+                case NPY_BYTE: *(npy_byte *)(PyArray_DATA(arr))=*v; break;\\
+                case NPY_SHORT: *(npy_short *)(PyArray_DATA(arr))=*v; break;\\
                 case NPY_USHORT: *(npy_ushort *)(PyArray_DATA(arr))=*v; break;\\
                 case NPY_UINT: *(npy_uint *)(PyArray_DATA(arr))=*v; break;\\
                 case NPY_ULONG: *(npy_ulong *)(PyArray_DATA(arr))=*v; break;\\
@@ -375,15 +375,19 @@ cppmacros['TRYCOMPLEXPYARRAYTEMPLATE'] = """\
             return 1;\\
         }\\
         switch (PyArray_TYPE(arr)) {\\
-                case NPY_CDOUBLE: *(double *)(PyArray_DATA(arr))=(*v).r;*(double *)(PyArray_DATA(arr)+sizeof(double))=(*v).i;break;\\
-                case NPY_CFLOAT: *(float *)(PyArray_DATA(arr))=(*v).r;*(float *)(PyArray_DATA(arr)+sizeof(float))=(*v).i;break;\\
-                case NPY_DOUBLE: *(double *)(PyArray_DATA(arr))=(*v).r; break;\\
-                case NPY_LONG: *(long *)(PyArray_DATA(arr))=(*v).r; break;\\
-                case NPY_FLOAT: *(float *)(PyArray_DATA(arr))=(*v).r; break;\\
-                case NPY_INT: *(int *)(PyArray_DATA(arr))=(*v).r; break;\\
-                case NPY_SHORT: *(short *)(PyArray_DATA(arr))=(*v).r; break;\\
-                case NPY_UBYTE: *(unsigned char *)(PyArray_DATA(arr))=(*v).r; break;\\
-                case NPY_BYTE: *(signed char *)(PyArray_DATA(arr))=(*v).r; break;\\
+                case NPY_CDOUBLE: *(npy_double *)(PyArray_DATA(arr))=(*v).r;\\
+                                  *(npy_double *)(PyArray_DATA(arr)+sizeof(npy_double))=(*v).i;\\
+                                  break;\\
+                case NPY_CFLOAT: *(npy_float *)(PyArray_DATA(arr))=(*v).r;\\
+                                 *(npy_float *)(PyArray_DATA(arr)+sizeof(npy_float))=(*v).i;\\
+                                 break;\\
+                case NPY_DOUBLE: *(npy_double *)(PyArray_DATA(arr))=(*v).r; break;\\
+                case NPY_LONG: *(npy_long *)(PyArray_DATA(arr))=(*v).r; break;\\
+                case NPY_FLOAT: *(npy_float *)(PyArray_DATA(arr))=(*v).r; break;\\
+                case NPY_INT: *(npy_int *)(PyArray_DATA(arr))=(*v).r; break;\\
+                case NPY_SHORT: *(npy_short *)(PyArray_DATA(arr))=(*v).r; break;\\
+                case NPY_UBYTE: *(npy_ubyte *)(PyArray_DATA(arr))=(*v).r; break;\\
+                case NPY_BYTE: *(npy_byte *)(PyArray_DATA(arr))=(*v).r; break;\\
                 case NPY_BOOL: *(npy_bool *)(PyArray_DATA(arr))=((*v).r!=0 && (*v).i!=0); break;\\
                 case NPY_USHORT: *(npy_ushort *)(PyArray_DATA(arr))=(*v).r; break;\\
                 case NPY_UINT: *(npy_uint *)(PyArray_DATA(arr))=(*v).r; break;\\
@@ -391,7 +395,9 @@ cppmacros['TRYCOMPLEXPYARRAYTEMPLATE'] = """\
                 case NPY_LONGLONG: *(npy_longlong *)(PyArray_DATA(arr))=(*v).r; break;\\
                 case NPY_ULONGLONG: *(npy_ulonglong *)(PyArray_DATA(arr))=(*v).r; break;\\
                 case NPY_LONGDOUBLE: *(npy_longdouble *)(PyArray_DATA(arr))=(*v).r; break;\\
-                case NPY_CLONGDOUBLE: *(npy_longdouble *)(PyArray_DATA(arr))=(*v).r;*(npy_longdouble *)(PyArray_DATA(arr)+sizeof(npy_longdouble))=(*v).i;break;\\
+                case NPY_CLONGDOUBLE: *(npy_longdouble *)(PyArray_DATA(arr))=(*v).r;\\
+                                      *(npy_longdouble *)(PyArray_DATA(arr)+sizeof(npy_longdouble))=(*v).i;\\
+                                      break;\\
                 case NPY_OBJECT: PyArray_SETITEM(arr, PyArray_DATA(arr), pyobj_from_complex_ ## ctype ## 1((*v))); break;\\
                 default: return -2;\\
         };\\
@@ -469,7 +475,7 @@ cppmacros['MEMCOPY'] = """\
 """
 cppmacros['STRINGMALLOC'] = """\
 #define STRINGMALLOC(str,len)\\
-    if ((str = (string)malloc(sizeof(char)*(len+1))) == NULL) {\\
+    if ((str = (string)malloc(len+1)) == NULL) {\\
         PyErr_SetString(PyExc_MemoryError, \"out of memory\");\\
         goto capi_fail;\\
     } else {\\
@@ -479,20 +485,41 @@ cppmacros['STRINGMALLOC'] = """\
 cppmacros['STRINGFREE'] = """\
 #define STRINGFREE(str) do {if (!(str == NULL)) free(str);} while (0)
 """
+needs['STRINGPADN'] = ['string.h']
+cppmacros['STRINGPADN'] = """\
+/*
+STRINGPADN replaces null values with padding values from the right.
+
+`to` must have size of at least N bytes.
+
+If the `to[N-1]` has null value, then replace it and all the
+preceding, nulls with the given padding.
+
+STRINGPADN(to, N, PADDING, NULLVALUE) is an inverse operation.
+*/
+#define STRINGPADN(to, N, NULLVALUE, PADDING)                   \\
+    do {                                                        \\
+        int _m = (N);                                           \\
+        char *_to = (to);                                       \\
+        for (_m -= 1; _m >= 0 && _to[_m] == NULLVALUE; _m--) {  \\
+             _to[_m] = PADDING;                                 \\
+        }                                                       \\
+    } while (0)
+"""
 needs['STRINGCOPYN'] = ['string.h', 'FAILNULL']
 cppmacros['STRINGCOPYN'] = """\
-#define STRINGCOPYN(to,from,buf_size)                           \\
+/*
+STRINGCOPYN copies N bytes.
+
+`to` and `from` buffers must have sizes of at least N bytes.
+*/
+#define STRINGCOPYN(to,from,N)                                  \\
     do {                                                        \\
-        int _m = (buf_size);                                    \\
+        int _m = (N);                                           \\
         char *_to = (to);                                       \\
         char *_from = (from);                                   \\
         FAILNULL(_to); FAILNULL(_from);                         \\
-        (void)strncpy(_to, _from, sizeof(char)*_m);             \\
-        _to[_m-1] = '\\0';                                      \\
-        /* Padding with spaces instead of nulls */              \\
-        for (_m -= 2; _m >= 0 && _to[_m] == '\\0'; _m--) {      \\
-            _to[_m] = ' ';                                      \\
-        }                                                       \\
+        (void)strncpy(_to, _from, _m);             \\
     } while (0)
 """
 needs['STRINGCOPY'] = ['string.h', 'FAILNULL']
@@ -623,71 +650,127 @@ static int *nextforcomb(void) {
 }"""
 needs['try_pyarr_from_string'] = ['STRINGCOPYN', 'PRINTPYOBJERR', 'string']
 cfuncs['try_pyarr_from_string'] = """\
-static int try_pyarr_from_string(PyObject *obj,const string str) {
-    PyArrayObject *arr = NULL;
-    if (PyArray_Check(obj) && (!((arr = (PyArrayObject *)obj) == NULL)))
-        { STRINGCOPYN(PyArray_DATA(arr),str,PyArray_NBYTES(arr)); }
-    return 1;
+/*
+  try_pyarr_from_string copies str[:len(obj)] to the data of an `ndarray`.
+
+  If obj is an `ndarray`, it is assumed to be contiguous.
+
+  If the specified len==-1, str must be null-terminated.
+*/
+static int try_pyarr_from_string(PyObject *obj,
+                                 const string str, const int len) {
+#ifdef DEBUGCFUNCS
+fprintf(stderr, "try_pyarr_from_string(str='%s', len=%d, obj=%p)\\n",
+        (char*)str,len, obj);
+#endif
+    if (PyArray_Check(obj)) {
+        PyArrayObject *arr = (PyArrayObject *)obj;
+        assert(ISCONTIGUOUS(arr));
+        string buf = PyArray_DATA(arr);
+        npy_intp n = len;
+        if (n == -1) {
+            /* Assuming null-terminated str. */
+            n = strlen(str);
+        }
+        if (n > PyArray_NBYTES(arr)) {
+            n = PyArray_NBYTES(arr);
+        }
+        STRINGCOPYN(buf, str, n);
+        return 1;
+    }
 capi_fail:
     PRINTPYOBJERR(obj);
-    PyErr_SetString(#modulename#_error,\"try_pyarr_from_string failed\");
+    PyErr_SetString(#modulename#_error, \"try_pyarr_from_string failed\");
     return 0;
 }
 """
 needs['string_from_pyobj'] = ['string', 'STRINGMALLOC', 'STRINGCOPYN']
 cfuncs['string_from_pyobj'] = """\
+/*
+  Create a new string buffer `str` of at most length `len` from a
+  Python string-like object `obj`.
+
+  The string buffer has given size (len) or the size of inistr when len==-1.
+
+  The string buffer is padded with blanks: in Fortran, trailing blanks
+  are insignificant contrary to C nulls.
+ */
 static int
-string_from_pyobj(string *str,int *len,const string inistr,PyObject *obj,const char *errmess)
+string_from_pyobj(string *str, int *len, const string inistr, PyObject *obj,
+                  const char *errmess)
 {
-    PyArrayObject *arr = NULL;
     PyObject *tmp = NULL;
+    string buf = NULL;
+    npy_intp n = -1;
 #ifdef DEBUGCFUNCS
-fprintf(stderr,\"string_from_pyobj(str='%s',len=%d,inistr='%s',obj=%p)\\n\",(char*)str,*len,(char *)inistr,obj);
+fprintf(stderr,\"string_from_pyobj(str='%s',len=%d,inistr='%s',obj=%p)\\n\",
+               (char*)str, *len, (char *)inistr, obj);
 #endif
     if (obj == Py_None) {
-        if (*len == -1)
-            *len = strlen(inistr); /* Will this cause problems? */
-        STRINGMALLOC(*str,*len);
-        STRINGCOPYN(*str,inistr,*len+1);
-        return 1;
+        n = strlen(inistr);
+        buf = inistr;
     }
-    if (PyArray_Check(obj)) {
-        if ((arr = (PyArrayObject *)obj) == NULL)
-            goto capi_fail;
+    else if (PyArray_Check(obj)) {
+        PyArrayObject *arr = (PyArrayObject *)obj;
         if (!ISCONTIGUOUS(arr)) {
-            PyErr_SetString(PyExc_ValueError,\"array object is non-contiguous.\");
+            PyErr_SetString(PyExc_ValueError,
+                            \"array object is non-contiguous.\");
             goto capi_fail;
         }
-        if (*len == -1)
-            *len = (PyArray_ITEMSIZE(arr))*PyArray_SIZE(arr);
-        STRINGMALLOC(*str,*len);
-        STRINGCOPYN(*str,PyArray_DATA(arr),*len+1);
-        return 1;
-    }
-    if (PyBytes_Check(obj)) {
-        tmp = obj;
-        Py_INCREF(tmp);
-    }
-    else if (PyUnicode_Check(obj)) {
-        tmp = PyUnicode_AsASCIIString(obj);
+        n = PyArray_NBYTES(arr);
+        buf = PyArray_DATA(arr);
+        n = strnlen(buf, n);
     }
     else {
-        PyObject *tmp2;
-        tmp2 = PyObject_Str(obj);
-        if (tmp2) {
-            tmp = PyUnicode_AsASCIIString(tmp2);
-            Py_DECREF(tmp2);
+        if (PyBytes_Check(obj)) {
+            tmp = obj;
+            Py_INCREF(tmp);
+        }
+        else if (PyUnicode_Check(obj)) {
+            tmp = PyUnicode_AsASCIIString(obj);
         }
         else {
-            tmp = NULL;
+            PyObject *tmp2;
+            tmp2 = PyObject_Str(obj);
+            if (tmp2) {
+                tmp = PyUnicode_AsASCIIString(tmp2);
+                Py_DECREF(tmp2);
+            }
+            else {
+                tmp = NULL;
+            }
+        }
+        if (tmp == NULL) goto capi_fail;
+        n = PyBytes_GET_SIZE(tmp);
+        buf = PyBytes_AS_STRING(tmp);
+    }
+    if (*len == -1) {
+        /* TODO: change the type of `len` so that we can remove this */
+        if (n > NPY_MAX_INT) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "object too large for a 32-bit int");
+            goto capi_fail;
         }
+        *len = n;
     }
-    if (tmp == NULL) goto capi_fail;
-    if (*len == -1)
-        *len = PyBytes_GET_SIZE(tmp);
-    STRINGMALLOC(*str,*len);
-    STRINGCOPYN(*str,PyBytes_AS_STRING(tmp),*len+1);
-    Py_DECREF(tmp);
+    else if (*len < n) {
+        /* discard the last (len-n) bytes of input buf */
+        n = *len;
+    }
+    if (n < 0 || *len < 0 || buf == NULL) {
+        goto capi_fail;
+    }
+    STRINGMALLOC(*str, *len);  // *str is allocated with size (*len + 1)
+    if (n < *len) {
+        /*
+          Pad fixed-width string with nulls. The caller will replace
+          nulls with blanks when the corresponding argument is not
+          intent(c).
+        */
+        memset(*str + n, '\\0', *len - n);
+    }
+    STRINGCOPYN(*str, buf, n);
+    Py_XDECREF(tmp);
     return 1;
 capi_fail:
     Py_XDECREF(tmp);
@@ -702,7 +785,6 @@ capi_fail:
 }
 """
 
-
 needs['char_from_pyobj'] = ['int_from_pyobj']
 cfuncs['char_from_pyobj'] = """\
 static int
index 6453bbecb1597ea6e6ea3a77e43e19c4027a85fb..b02eb68b7fb3f06cb45d2e75a4976d30f31af58a 100755 (executable)
@@ -139,7 +139,6 @@ TODO:
     The above may be solved by creating appropriate preprocessor program, for example.
 
 """
-import io
 import sys
 import string
 import fileinput
@@ -154,7 +153,7 @@ from . import __version__
 # As the needed functions cannot be determined by static inspection of the
 # code, it is safest to use import * pending a major refactoring of f2py.
 from .auxfuncs import *
-
+from . import symbolic
 
 f2py_version = __version__.version
 
@@ -246,7 +245,6 @@ for c in "abcdefghopqrstuvwxyz$_":
     defaultimplicitrules[c] = {'typespec': 'real'}
 for c in "ijklmn":
     defaultimplicitrules[c] = {'typespec': 'integer'}
-del c
 badnames = {}
 invbadnames = {}
 for n in ['int', 'double', 'float', 'char', 'short', 'long', 'void', 'case', 'while',
@@ -876,10 +874,11 @@ def appenddecl(decl, decl2, force=1):
                 decl[k] = decl2[k]
         elif k == 'note':
             pass
-        elif k in ['intent', 'check', 'dimension', 'optional', 'required']:
+        elif k in ['intent', 'check', 'dimension', 'optional',
+                   'required', 'depend']:
             errmess('appenddecl: "%s" not implemented.\n' % k)
         else:
-            raise Exception('appenddecl: Unknown variable definition key:' +
+            raise Exception('appenddecl: Unknown variable definition key: ' +
                             str(k))
     return decl
 
@@ -1171,10 +1170,10 @@ def analyzeline(m, case, line):
                                 groupcache[groupcounter]['args'].append(k)
                         else:
                             errmess(
-                                'analyzeline: intent(callback) %s is ignored' % (k))
+                                'analyzeline: intent(callback) %s is ignored\n' % (k))
                     else:
                         errmess('analyzeline: intent(callback) %s is already'
-                                ' in argument list' % (k))
+                                ' in argument list\n' % (k))
             if case in ['optional', 'required', 'public', 'external', 'private', 'intrinsic']:
                 ap = case
             if 'attrspec' in edecl[k]:
@@ -1527,27 +1526,40 @@ def removespaces(expr):
 
 
 def markinnerspaces(line):
-    l = ''
-    f = 0
-    cc = '\''
-    cb = ''
+    """
+    The function replace all spaces in the input variable line which are 
+    surrounded with quotation marks, with the triplet "@_@".
+
+    For instance, for the input "a 'b c'" the function returns "a 'b@_@c'"
+
+    Parameters
+    ----------
+    line : str
+
+    Returns
+    -------
+    str
+
+    """  
+    fragment = ''
+    inside = False
+    current_quote = None
+    escaped = ''
     for c in line:
-        if cb == '\\' and c in ['\\', '\'', '"']:
-            l = l + c
-            cb = c
+        if escaped == '\\' and c in ['\\', '\'', '"']:
+            fragment += c
+            escaped = c
             continue
-        if f == 0 and c in ['\'', '"']:
-            cc = c
-        if c == cc:
-            f = f + 1
-        elif c == cc:
-            f = f - 1
-        elif c == ' ' and f == 1:
-            l = l + '@_@'
+        if not inside and c in ['\'', '"']:
+            current_quote = c
+        if c == current_quote:
+            inside = not inside
+        elif c == ' ' and inside:
+            fragment += '@_@'
             continue
-        l = l + c
-        cb = c
-    return l
+        fragment += c
+        escaped = c  # reset to non-backslash
+    return fragment
 
 
 def updatevars(typespec, selector, attrspec, entitydecl):
@@ -1856,11 +1868,11 @@ def get_useparameters(block, param_map=None):
             continue
         # XXX: apply mapping
         if mapping:
-            errmess('get_useparameters: mapping for %s not impl.' % (mapping))
+            errmess('get_useparameters: mapping for %s not impl.\n' % (mapping))
         for k, v in list(params.items()):
             if k in param_map:
                 outmess('get_useparameters: overriding parameter %s with'
-                        ' value from module %s' % (repr(k), repr(usename)))
+                        ' value from module %s\n' % (repr(k), repr(usename)))
             param_map[k] = v
 
     return param_map
@@ -2205,188 +2217,6 @@ def getlincoef(e, xset):  # e = a*x+b ; x in xset
             break
     return None, None, None
 
-_varname_match = re.compile(r'\A[a-z]\w*\Z').match
-
-
-def getarrlen(dl, args, star='*'):
-    """
-    Parameters
-    ----------
-    dl : sequence of two str objects
-        dimensions of the array
-    args : Iterable[str]
-        symbols used in the expression
-    star : Any
-        unused
-
-    Returns
-    -------
-    expr : str
-        Some numeric expression as a string
-    arg : Optional[str]
-        If understood, the argument from `args` present in `expr`
-    expr2 : Optional[str]
-        If understood, an expression fragment that should be used as
-        ``"(%s%s".format(something, expr2)``.
-
-    Examples
-    --------
-    >>> getarrlen(['10*x + 20', '40*x'], {'x'})
-    ('30 * x - 19', 'x', '+19)/(30)')
-    >>> getarrlen(['1', '10*x + 20'], {'x'})
-    ('10 * x + 20', 'x', '-20)/(10)')
-    >>> getarrlen(['10*x + 20', '1'], {'x'})
-    ('-10 * x - 18', 'x', '+18)/(-10)')
-    >>> getarrlen(['20', '1'], {'x'})
-    ('-18', None, None)
-    """
-    edl = []
-    try:
-        edl.append(myeval(dl[0], {}, {}))
-    except Exception:
-        edl.append(dl[0])
-    try:
-        edl.append(myeval(dl[1], {}, {}))
-    except Exception:
-        edl.append(dl[1])
-    if isinstance(edl[0], int):
-        p1 = 1 - edl[0]
-        if p1 == 0:
-            d = str(dl[1])
-        elif p1 < 0:
-            d = '%s-%s' % (dl[1], -p1)
-        else:
-            d = '%s+%s' % (dl[1], p1)
-    elif isinstance(edl[1], int):
-        p1 = 1 + edl[1]
-        if p1 == 0:
-            d = '-(%s)' % (dl[0])
-        else:
-            d = '%s-(%s)' % (p1, dl[0])
-    else:
-        d = '%s-(%s)+1' % (dl[1], dl[0])
-    try:
-        return repr(myeval(d, {}, {})), None, None
-    except Exception:
-        pass
-    d1, d2 = getlincoef(dl[0], args), getlincoef(dl[1], args)
-    if None not in [d1[0], d2[0]]:
-        if (d1[0], d2[0]) == (0, 0):
-            return repr(d2[1] - d1[1] + 1), None, None
-        b = d2[1] - d1[1] + 1
-        d1 = (d1[0], 0, d1[2])
-        d2 = (d2[0], b, d2[2])
-        if d1[0] == 0 and d2[2] in args:
-            if b < 0:
-                return '%s * %s - %s' % (d2[0], d2[2], -b), d2[2], '+%s)/(%s)' % (-b, d2[0])
-            elif b:
-                return '%s * %s + %s' % (d2[0], d2[2], b), d2[2], '-%s)/(%s)' % (b, d2[0])
-            else:
-                return '%s * %s' % (d2[0], d2[2]), d2[2], ')/(%s)' % (d2[0])
-        if d2[0] == 0 and d1[2] in args:
-
-            if b < 0:
-                return '%s * %s - %s' % (-d1[0], d1[2], -b), d1[2], '+%s)/(%s)' % (-b, -d1[0])
-            elif b:
-                return '%s * %s + %s' % (-d1[0], d1[2], b), d1[2], '-%s)/(%s)' % (b, -d1[0])
-            else:
-                return '%s * %s' % (-d1[0], d1[2]), d1[2], ')/(%s)' % (-d1[0])
-        if d1[2] == d2[2] and d1[2] in args:
-            a = d2[0] - d1[0]
-            if not a:
-                return repr(b), None, None
-            if b < 0:
-                return '%s * %s - %s' % (a, d1[2], -b), d2[2], '+%s)/(%s)' % (-b, a)
-            elif b:
-                return '%s * %s + %s' % (a, d1[2], b), d2[2], '-%s)/(%s)' % (b, a)
-            else:
-                return '%s * %s' % (a, d1[2]), d2[2], ')/(%s)' % (a)
-        if d1[0] == d2[0] == 1:
-            c = str(d1[2])
-            if c not in args:
-                if _varname_match(c):
-                    outmess('\tgetarrlen:variable "%s" undefined\n' % (c))
-                c = '(%s)' % c
-            if b == 0:
-                d = '%s-%s' % (d2[2], c)
-            elif b < 0:
-                d = '%s-%s-%s' % (d2[2], c, -b)
-            else:
-                d = '%s-%s+%s' % (d2[2], c, b)
-        elif d1[0] == 0:
-            c2 = str(d2[2])
-            if c2 not in args:
-                if _varname_match(c2):
-                    outmess('\tgetarrlen:variable "%s" undefined\n' % (c2))
-                c2 = '(%s)' % c2
-            if d2[0] == 1:
-                pass
-            elif d2[0] == -1:
-                c2 = '-%s' % c2
-            else:
-                c2 = '%s*%s' % (d2[0], c2)
-
-            if b == 0:
-                d = c2
-            elif b < 0:
-                d = '%s-%s' % (c2, -b)
-            else:
-                d = '%s+%s' % (c2, b)
-        elif d2[0] == 0:
-            c1 = str(d1[2])
-            if c1 not in args:
-                if _varname_match(c1):
-                    outmess('\tgetarrlen:variable "%s" undefined\n' % (c1))
-                c1 = '(%s)' % c1
-            if d1[0] == 1:
-                c1 = '-%s' % c1
-            elif d1[0] == -1:
-                c1 = '+%s' % c1
-            elif d1[0] < 0:
-                c1 = '+%s*%s' % (-d1[0], c1)
-            else:
-                c1 = '-%s*%s' % (d1[0], c1)
-
-            if b == 0:
-                d = c1
-            elif b < 0:
-                d = '%s-%s' % (c1, -b)
-            else:
-                d = '%s+%s' % (c1, b)
-        else:
-            c1 = str(d1[2])
-            if c1 not in args:
-                if _varname_match(c1):
-                    outmess('\tgetarrlen:variable "%s" undefined\n' % (c1))
-                c1 = '(%s)' % c1
-            if d1[0] == 1:
-                c1 = '-%s' % c1
-            elif d1[0] == -1:
-                c1 = '+%s' % c1
-            elif d1[0] < 0:
-                c1 = '+%s*%s' % (-d1[0], c1)
-            else:
-                c1 = '-%s*%s' % (d1[0], c1)
-
-            c2 = str(d2[2])
-            if c2 not in args:
-                if _varname_match(c2):
-                    outmess('\tgetarrlen:variable "%s" undefined\n' % (c2))
-                c2 = '(%s)' % c2
-            if d2[0] == 1:
-                pass
-            elif d2[0] == -1:
-                c2 = '-%s' % c2
-            else:
-                c2 = '%s*%s' % (d2[0], c2)
-
-            if b == 0:
-                d = '%s%s' % (c2, c1)
-            elif b < 0:
-                d = '%s%s-%s' % (c2, c1, -b)
-            else:
-                d = '%s%s+%s' % (c2, c1, b)
-    return d, None, None
 
 word_pattern = re.compile(r'\b[a-z][\w$]*\b', re.I)
 
@@ -2397,7 +2227,9 @@ def _get_depend_dict(name, vars, deps):
 
         if '=' in vars[name] and not isstring(vars[name]):
             for word in word_pattern.findall(vars[name]['=']):
-                if word not in words and word in vars:
+                # The word_pattern may return values that are not
+                # only variables, they can be string content for instance
+                if word not in words and word in vars and word != name:
                     words.append(word)
         for word in words[:]:
             for w in deps.get(word, []) \
@@ -2552,10 +2384,8 @@ def get_parameters(vars, global_params={}):
                 v = ''.join(tt)
 
             elif iscomplex(vars[n]):
-                # FIXME complex numbers may also have exponents
-                if v[0] == '(' and v[-1] == ')':
-                    # FIXME, unused l looks like potential bug
-                    l = markoutercomma(v[1:-1]).split('@,@')
+                outmess(f'get_parameters[TODO]: '
+                        f'implement evaluation of complex expression {v}\n')
 
             try:
                 params[n] = eval(v, g_params, params)
@@ -2586,7 +2416,8 @@ def _eval_scalar(value, params):
     if _is_kind_number(value):
         value = value.split('_')[0]
     try:
-        value = str(eval(value, {}, params))
+        value = eval(value, {}, params)
+        value = (repr if isinstance(value, str) else str)(value)
     except (NameError, SyntaxError, TypeError):
         return value
     except Exception as msg:
@@ -2673,7 +2504,7 @@ def analyzevars(block):
                     pass
                 vars[n]['kindselector']['kind'] = l
 
-        savelindims = {}
+        dimension_exprs = {}
         if 'attrspec' in vars[n]:
             attr = vars[n]['attrspec']
             attr.reverse()
@@ -2726,18 +2557,18 @@ def analyzevars(block):
             if dim and 'dimension' not in vars[n]:
                 vars[n]['dimension'] = []
                 for d in rmbadname([x.strip() for x in markoutercomma(dim).split('@,@')]):
-                    star = '*'
-                    if d == ':':
-                        star = ':'
+                    star = ':' if d == ':' else '*'
+                    # Evaluate `d` with respect to params
                     if d in params:
                         d = str(params[d])
-                    for p in list(params.keys()):
+                    for p in params:
                         re_1 = re.compile(r'(?P<before>.*?)\b' + p + r'\b(?P<after>.*)', re.I)
                         m = re_1.match(d)
                         while m:
                             d = m.group('before') + \
                                 str(params[p]) + m.group('after')
                             m = re_1.match(d)
+
                     if d == star:
                         dl = [star]
                     else:
@@ -2745,22 +2576,46 @@ def analyzevars(block):
                     if len(dl) == 2 and '*' in dl:  # e.g. dimension(5:*)
                         dl = ['*']
                         d = '*'
-                    if len(dl) == 1 and not dl[0] == star:
+                    if len(dl) == 1 and dl[0] != star:
                         dl = ['1', dl[0]]
                     if len(dl) == 2:
-                        d, v, di = getarrlen(dl, list(block['vars'].keys()))
-                        if d[:4] == '1 * ':
-                            d = d[4:]
-                        if di and di[-4:] == '/(1)':
-                            di = di[:-4]
-                        if v:
-                            savelindims[d] = v, di
+                        d1, d2 = map(symbolic.Expr.parse, dl)
+                        dsize = d2 - d1 + 1
+                        d = dsize.tostring(language=symbolic.Language.C)
+                        # find variables v that define d as a linear
+                        # function, `d == a * v + b`, and store
+                        # coefficients a and b for further analysis.
+                        solver_and_deps = {}
+                        for v in block['vars']:
+                            s = symbolic.as_symbol(v)
+                            if dsize.contains(s):
+                                try:
+                                    a, b = dsize.linear_solve(s)
+                                    solve_v = lambda s: (s - b) / a
+                                    all_symbols = set(a.symbols())
+                                    all_symbols.update(b.symbols())
+                                except RuntimeError as msg:
+                                    # d is not a linear function of v,
+                                    # however, if v can be determined
+                                    # from d using other means,
+                                    # implement the corresponding
+                                    # solve_v function here.
+                                    solve_v = None
+                                    all_symbols = set(dsize.symbols())
+                                v_deps = set(
+                                    s.data for s in all_symbols
+                                    if s.data in vars)
+                                solver_and_deps[v] = solve_v, list(v_deps)
+                        # Note that dsize may contain symbols that are
+                        # not defined in block['vars']. Here we assume
+                        # these correspond to Fortran/C intrinsic
+                        # functions or that are defined by other
+                        # means. We'll let the compiler validate the
+                        # definiteness of such symbols.
+                        dimension_exprs[d] = solver_and_deps
                     vars[n]['dimension'].append(d)
+
         if 'dimension' in vars[n]:
-            if isintent_c(vars[n]):
-                shape_macro = 'shape'
-            else:
-                shape_macro = 'shape'  # 'fshape'
             if isstringarray(vars[n]):
                 if 'charselector' in vars[n]:
                     d = vars[n]['charselector']
@@ -2778,70 +2633,88 @@ def analyzevars(block):
                             vars[n]['intent'].append('c')
                     else:
                         errmess(
-                            "analyzevars: charselector=%r unhandled." % (d))
+                            "analyzevars: charselector=%r unhandled.\n" % (d))
+
         if 'check' not in vars[n] and 'args' in block and n in block['args']:
-            flag = 'depend' not in vars[n]
-            if flag:
-                vars[n]['depend'] = []
-            vars[n]['check'] = []
-            if 'dimension' in vars[n]:
-                #/----< no check
-                i = -1
-                ni = len(vars[n]['dimension'])
-                for d in vars[n]['dimension']:
-                    ddeps = []  # dependencies of 'd'
-                    ad = ''
-                    pd = ''
-                    if d not in vars:
-                        if d in savelindims:
-                            pd, ad = '(', savelindims[d][1]
-                            d = savelindims[d][0]
-                        else:
-                            for r in block['args']:
-                                if r not in vars:
-                                    continue
-                                if re.match(r'.*?\b' + r + r'\b', d, re.I):
-                                    ddeps.append(r)
-                    if d in vars:
-                        if 'attrspec' in vars[d]:
-                            for aa in vars[d]['attrspec']:
-                                if aa[:6] == 'depend':
-                                    ddeps += aa[6:].strip()[1:-1].split(',')
-                        if 'depend' in vars[d]:
-                            ddeps = ddeps + vars[d]['depend']
-                    i = i + 1
-                    if d in vars and ('depend' not in vars[d]) \
-                       and ('=' not in vars[d]) and (d not in vars[n]['depend']) \
-                       and l_or(isintent_in, isintent_inout, isintent_inplace)(vars[n]):
-                        vars[d]['depend'] = [n]
-                        if ni > 1:
-                            vars[d]['='] = '%s%s(%s,%s)%s' % (
-                                pd, shape_macro, n, i, ad)
-                        else:
-                            vars[d]['='] = '%slen(%s)%s' % (pd, n, ad)
-                        #  /---< no check
-                        if 1 and 'check' not in vars[d]:
-                            if ni > 1:
-                                vars[d]['check'] = ['%s%s(%s,%i)%s==%s'
-                                                    % (pd, shape_macro, n, i, ad, d)]
+            # n is an argument that has no checks defined. Here we
+            # generate some consistency checks for n, and when n is an
+            # array, generate checks for its dimensions and construct
+            # initialization expressions.
+            n_deps = vars[n].get('depend', [])
+            n_checks = []
+            n_is_input = l_or(isintent_in, isintent_inout,
+                              isintent_inplace)(vars[n])
+            if 'dimension' in vars[n]:  # n is array
+                for i, d in enumerate(vars[n]['dimension']):
+                    coeffs_and_deps = dimension_exprs.get(d)
+                    if coeffs_and_deps is None:
+                        # d is `:` or `*` or a constant expression
+                        pass
+                    elif n_is_input:
+                        # n is an input array argument and its shape
+                        # may define variables used in dimension
+                        # specifications.
+                        for v, (solver, deps) in coeffs_and_deps.items():
+                            if ((v in n_deps
+                                 or '=' in vars[v]
+                                 or 'depend' in vars[v])):
+                                # Skip a variable that
+                                # - n depends on
+                                # - has user-defined initialization expression
+                                # - has user-defined dependecies
+                                continue
+                            if solver is not None:
+                                # v can be solved from d, hence, we
+                                # make it an optional argument with
+                                # initialization expression:
+                                is_required = False
+                                init = solver(symbolic.as_symbol(
+                                    f'shape({n}, {i})'))
+                                init = init.tostring(
+                                    language=symbolic.Language.C)
+                                vars[v]['='] = init
+                                # n needs to be initialized before v. So,
+                                # making v dependent on n and on any
+                                # variables in solver or d.
+                                vars[v]['depend'] = [n] + deps
+                                if 'check' not in vars[v]:
+                                    # add check only when no
+                                    # user-specified checks exist
+                                    vars[v]['check'] = [
+                                        f'shape({n}, {i}) == {d}']
                             else:
-                                vars[d]['check'] = [
-                                    '%slen(%s)%s>=%s' % (pd, n, ad, d)]
-                        if 'attrspec' not in vars[d]:
-                            vars[d]['attrspec'] = ['optional']
-                        if ('optional' not in vars[d]['attrspec']) and\
-                           ('required' not in vars[d]['attrspec']):
-                            vars[d]['attrspec'].append('optional')
-                    elif d not in ['*', ':']:
-                        #/----< no check
-                        if flag:
-                            if d in vars:
-                                if n not in ddeps:
-                                    vars[n]['depend'].append(d)
-                            else:
-                                vars[n]['depend'] = vars[n]['depend'] + ddeps
+                                # d is a non-linear function on v,
+                                # hence, v must be a required input
+                                # argument that n will depend on
+                                is_required = True
+                                if 'intent' not in vars[v]:
+                                    vars[v]['intent'] = []
+                                if 'in' not in vars[v]['intent']:
+                                    vars[v]['intent'].append('in')
+                                # v needs to be initialized before n
+                                n_deps.append(v)
+                                n_checks.append(
+                                    f'shape({n}, {i}) == {d}')
+                            v_attr = vars[v].get('attrspec', [])
+                            if not ('optional' in v_attr
+                                    or 'required' in v_attr):
+                                v_attr.append(
+                                    'required' if is_required else 'optional')
+                            if v_attr:
+                                vars[v]['attrspec'] = v_attr
+                    if coeffs_and_deps is not None:
+                        # extend v dependencies with ones specified in attrspec
+                        for v, (solver, deps) in coeffs_and_deps.items():
+                            v_deps = vars[v].get('depend', [])
+                            for aa in vars[v].get('attrspec', []):
+                                if aa.startswith('depend'):
+                                    aa = ''.join(aa.split())
+                                    v_deps.extend(aa[7:-1].split(','))
+                            if v_deps:
+                                vars[v]['depend'] = list(set(v_deps))
+                            if n not in v_deps:
+                                n_deps.append(v)
             elif isstring(vars[n]):
-                length = '1'
                 if 'charselector' in vars[n]:
                     if '*' in vars[n]['charselector']:
                         length = _eval_length(vars[n]['charselector']['*'],
@@ -2852,11 +2725,11 @@ def analyzevars(block):
                                               params)
                         del vars[n]['charselector']['len']
                         vars[n]['charselector']['*'] = length
+            if n_checks:
+                vars[n]['check'] = n_checks
+            if n_deps:
+                vars[n]['depend'] = list(set(n_deps))
 
-            if not vars[n]['check']:
-                del vars[n]['check']
-            if flag and not vars[n]['depend']:
-                del vars[n]['depend']
         if '=' in vars[n]:
             if 'attrspec' not in vars[n]:
                 vars[n]['attrspec'] = []
@@ -2882,8 +2755,6 @@ def analyzevars(block):
                     vars[n] = appenddecl(vars[n], vars[block['result']])
                 if 'prefix' in block:
                     pr = block['prefix']
-                    ispure = 0
-                    isrec = 1
                     pr1 = pr.replace('pure', '')
                     ispure = (not pr == pr1)
                     pr = pr1.replace('recursive', '')
@@ -2986,7 +2857,7 @@ def expr2name(a, block, args=[]):
 
 def analyzeargs(block):
     setmesstext(block)
-    implicitrules, attrrules = buildimplicitrules(block)
+    implicitrules, _ = buildimplicitrules(block)
     if 'args' not in block:
         block['args'] = []
     args = []
@@ -3347,7 +3218,8 @@ def crack2fortran(block):
 """
     footer = """
 ! This file was auto-generated with f2py (version:%s).
-! See http://cens.ioc.ee/projects/f2py2e/
+! See:
+! https://web.archive.org/web/20140822061353/http://cens.ioc.ee/projects/f2py2e
 """ % (f2py_version)
     return header + pyf + footer
 
@@ -3404,8 +3276,8 @@ if __name__ == "__main__":
             try:
                 open(l).close()
                 files.append(l)
-            except IOError as detail:
-                errmess('IOError: %s\n' % str(detail))
+            except OSError as detail:
+                errmess(f'OSError: {detail!s}\n')
         else:
             funcs.append(l)
     if not strictf77 and f77modulename and not skipemptyends:
index a14f068f15dde2a0250f07a58c361ee78ef04fb2..4d79c304ae919fa2255e5cd8ee8602288fd3bf8c 100755 (executable)
@@ -168,7 +168,7 @@ numpy Version: {numpy_version}
 Requires:    Python 3.5 or higher.
 License:     NumPy license (see LICENSE.txt in the NumPy source code)
 Copyright 1999 - 2011 Pearu Peterson all rights reserved.
-http://cens.ioc.ee/projects/f2py2e/"""
+https://web.archive.org/web/20140822061353/http://cens.ioc.ee/projects/f2py2e"""
 
 
 def scaninputline(inputline):
@@ -275,9 +275,8 @@ def scaninputline(inputline):
                 with open(l):
                     pass
                 files.append(l)
-            except IOError as detail:
-                errmess('IOError: %s. Skipping file "%s".\n' %
-                        (str(detail), l))
+            except OSError as detail:
+                errmess(f'OSError: {detail!s}. Skipping file "{l!s}".\n')
         elif f == -1:
             skipfuncs.append(l)
         elif f == 0:
@@ -287,7 +286,7 @@ def scaninputline(inputline):
         sys.exit()
     if not os.path.isdir(buildpath):
         if not verbose:
-            outmess('Creating build directory %s' % (buildpath))
+            outmess('Creating build directory %s\n' % (buildpath))
         os.mkdir(buildpath)
     if signsfile:
         signsfile = os.path.join(buildpath, signsfile)
@@ -359,33 +358,34 @@ def buildmodules(lst):
     cfuncs.buildcfuncs()
     outmess('Building modules...\n')
     modules, mnames, isusedby = [], [], {}
-    for i in range(len(lst)):
-        if '__user__' in lst[i]['name']:
-            cb_rules.buildcallbacks(lst[i])
+    for item in lst:
+        if '__user__' in item['name']:
+            cb_rules.buildcallbacks(item)
         else:
-            if 'use' in lst[i]:
-                for u in lst[i]['use'].keys():
+            if 'use' in item:
+                for u in item['use'].keys():
                     if u not in isusedby:
                         isusedby[u] = []
-                    isusedby[u].append(lst[i]['name'])
-            modules.append(lst[i])
-            mnames.append(lst[i]['name'])
+                    isusedby[u].append(item['name'])
+            modules.append(item)
+            mnames.append(item['name'])
     ret = {}
-    for i in range(len(mnames)):
-        if mnames[i] in isusedby:
+    for module, name in zip(modules, mnames):
+        if name in isusedby:
             outmess('\tSkipping module "%s" which is used by %s.\n' % (
-                mnames[i], ','.join(['"%s"' % s for s in isusedby[mnames[i]]])))
+                name, ','.join('"%s"' % s for s in isusedby[name])))
         else:
             um = []
-            if 'use' in modules[i]:
-                for u in modules[i]['use'].keys():
+            if 'use' in module:
+                for u in module['use'].keys():
                     if u in isusedby and u in mnames:
                         um.append(modules[mnames.index(u)])
                     else:
                         outmess(
-                            '\tModule "%s" uses nonexisting "%s" which will be ignored.\n' % (mnames[i], u))
-            ret[mnames[i]] = {}
-            dict_append(ret[mnames[i]], rules.buildmodule(modules[i], um))
+                            f'\tModule "{name}" uses nonexisting "{u}" '
+                            'which will be ignored.\n')
+            ret[name] = {}
+            dict_append(ret[name], rules.buildmodule(module, um))
     return ret
 
 
@@ -416,8 +416,8 @@ def run_main(comline_list):
 
     Examples
     --------
-    .. include:: run_main_session.dat
-        :literal:
+    .. literalinclude:: ../../source/f2py/code/results/run_main_session.dat
+        :language: python
 
     """
     crackfortran.reset_global_f2py_vars()
@@ -429,18 +429,20 @@ def run_main(comline_list):
     capi_maps.load_f2cmap_file(options['f2cmap_file'])
     postlist = callcrackfortran(files, options)
     isusedby = {}
-    for i in range(len(postlist)):
-        if 'use' in postlist[i]:
-            for u in postlist[i]['use'].keys():
+    for plist in postlist:
+        if 'use' in plist:
+            for u in plist['use'].keys():
                 if u not in isusedby:
                     isusedby[u] = []
-                isusedby[u].append(postlist[i]['name'])
-    for i in range(len(postlist)):
-        if postlist[i]['block'] == 'python module' and '__user__' in postlist[i]['name']:
-            if postlist[i]['name'] in isusedby:
+                isusedby[u].append(plist['name'])
+    for plist in postlist:
+        if plist['block'] == 'python module' and '__user__' in plist['name']:
+            if plist['name'] in isusedby:
                 # if not quiet:
-                outmess('Skipping Makefile build for module "%s" which is used by %s\n' % (
-                    postlist[i]['name'], ','.join(['"%s"' % s for s in isusedby[postlist[i]['name']]])))
+                outmess(
+                    f'Skipping Makefile build for module "{plist["name"]}" '
+                    'which is used by {}\n'.format(
+                        ','.join(f'"{s}"' for s in isusedby[plist['name']])))
     if 'signsfile' in options:
         if options['verbose'] > 1:
             outmess(
@@ -448,8 +450,8 @@ def run_main(comline_list):
             outmess('%s %s\n' %
                     (os.path.basename(sys.argv[0]), options['signsfile']))
         return
-    for i in range(len(postlist)):
-        if postlist[i]['block'] != 'python module':
+    for plist in postlist:
+        if plist['block'] != 'python module':
             if 'python module' not in options:
                 errmess(
                     'Tip: If your original code is Fortran source then you must use -m option.\n')
@@ -544,30 +546,29 @@ def run_compile():
     fc_flags = [_m for _m in sys.argv[1:] if _reg4.match(_m)]
     sys.argv = [_m for _m in sys.argv if _m not in fc_flags]
 
-    if 1:
-        del_list = []
-        for s in flib_flags:
-            v = '--fcompiler='
-            if s[:len(v)] == v:
-                from numpy.distutils import fcompiler
-                fcompiler.load_all_fcompiler_classes()
-                allowed_keys = list(fcompiler.fcompiler_class.keys())
-                nv = ov = s[len(v):].lower()
-                if ov not in allowed_keys:
-                    vmap = {}  # XXX
-                    try:
-                        nv = vmap[ov]
-                    except KeyError:
-                        if ov not in vmap.values():
-                            print('Unknown vendor: "%s"' % (s[len(v):]))
-                    nv = ov
-                i = flib_flags.index(s)
-                flib_flags[i] = '--fcompiler=' + nv
-                continue
-        for s in del_list:
+    del_list = []
+    for s in flib_flags:
+        v = '--fcompiler='
+        if s[:len(v)] == v:
+            from numpy.distutils import fcompiler
+            fcompiler.load_all_fcompiler_classes()
+            allowed_keys = list(fcompiler.fcompiler_class.keys())
+            nv = ov = s[len(v):].lower()
+            if ov not in allowed_keys:
+                vmap = {}  # XXX
+                try:
+                    nv = vmap[ov]
+                except KeyError:
+                    if ov not in vmap.values():
+                        print('Unknown vendor: "%s"' % (s[len(v):]))
+                nv = ov
             i = flib_flags.index(s)
-            del flib_flags[i]
-        assert len(flib_flags) <= 2, repr(flib_flags)
+            flib_flags[i] = '--fcompiler=' + nv
+            continue
+    for s in del_list:
+        i = flib_flags.index(s)
+        del flib_flags[i]
+    assert len(flib_flags) <= 2, repr(flib_flags)
 
     _reg5 = re.compile(r'--(verbose)')
     setup_flags = [_m for _m in sys.argv[1:] if _reg5.match(_m)]
index 63e47baa20edc56b0ada0500febdb464aed6f8bb..78810a0a74a9f4d5ae80000c548952e0dc7090bc 100755 (executable)
@@ -120,6 +120,10 @@ module_rules = {
 extern \"C\" {
 #endif
 
+#ifndef PY_SSIZE_T_CLEAN
+#define PY_SSIZE_T_CLEAN
+#endif /* PY_SSIZE_T_CLEAN */
+
 """ + gentitle("See f2py2e/cfuncs.py: includes") + """
 #includes#
 #includes0#
@@ -170,67 +174,67 @@ static PyObject *#modulename#_module;
 
 static FortranDataDef f2py_routine_defs[] = {
 #routine_defs#
-\t{NULL}
+    {NULL}
 };
 
 static PyMethodDef f2py_module_methods[] = {
 #pymethoddef#
-\t{NULL,NULL}
+    {NULL,NULL}
 };
 
 static struct PyModuleDef moduledef = {
-\tPyModuleDef_HEAD_INIT,
-\t"#modulename#",
-\tNULL,
-\t-1,
-\tf2py_module_methods,
-\tNULL,
-\tNULL,
-\tNULL,
-\tNULL
+    PyModuleDef_HEAD_INIT,
+    "#modulename#",
+    NULL,
+    -1,
+    f2py_module_methods,
+    NULL,
+    NULL,
+    NULL,
+    NULL
 };
 
 PyMODINIT_FUNC PyInit_#modulename#(void) {
-\tint i;
-\tPyObject *m,*d, *s, *tmp;
-\tm = #modulename#_module = PyModule_Create(&moduledef);
-\tPy_SET_TYPE(&PyFortran_Type, &PyType_Type);
-\timport_array();
-\tif (PyErr_Occurred())
-\t\t{PyErr_SetString(PyExc_ImportError, \"can't initialize module #modulename# (failed to import numpy)\"); return m;}
-\td = PyModule_GetDict(m);
-\ts = PyUnicode_FromString(\"#f2py_version#\");
-\tPyDict_SetItemString(d, \"__version__\", s);
-\tPy_DECREF(s);
-\ts = PyUnicode_FromString(
-\t\t\"This module '#modulename#' is auto-generated with f2py (version:#f2py_version#).\\nFunctions:\\n\"\n#docs#\".\");
-\tPyDict_SetItemString(d, \"__doc__\", s);
-\tPy_DECREF(s);
-\ts = PyUnicode_FromString(\"""" + numpy_version + """\");
-\tPyDict_SetItemString(d, \"__f2py_numpy_version__\", s);
-\tPy_DECREF(s);
-\t#modulename#_error = PyErr_NewException (\"#modulename#.error\", NULL, NULL);
-\t/*
-\t * Store the error object inside the dict, so that it could get deallocated.
-\t * (in practice, this is a module, so it likely will not and cannot.)
-\t */
-\tPyDict_SetItemString(d, \"_#modulename#_error\", #modulename#_error);
-\tPy_DECREF(#modulename#_error);
-\tfor(i=0;f2py_routine_defs[i].name!=NULL;i++) {
-\t\ttmp = PyFortranObject_NewAsAttr(&f2py_routine_defs[i]);
-\t\tPyDict_SetItemString(d, f2py_routine_defs[i].name, tmp);
-\t\tPy_DECREF(tmp);
-\t}
+    int i;
+    PyObject *m,*d, *s, *tmp;
+    m = #modulename#_module = PyModule_Create(&moduledef);
+    Py_SET_TYPE(&PyFortran_Type, &PyType_Type);
+    import_array();
+    if (PyErr_Occurred())
+        {PyErr_SetString(PyExc_ImportError, \"can't initialize module #modulename# (failed to import numpy)\"); return m;}
+    d = PyModule_GetDict(m);
+    s = PyUnicode_FromString(\"#f2py_version#\");
+    PyDict_SetItemString(d, \"__version__\", s);
+    Py_DECREF(s);
+    s = PyUnicode_FromString(
+        \"This module '#modulename#' is auto-generated with f2py (version:#f2py_version#).\\nFunctions:\\n\"\n#docs#\".\");
+    PyDict_SetItemString(d, \"__doc__\", s);
+    Py_DECREF(s);
+    s = PyUnicode_FromString(\"""" + numpy_version + """\");
+    PyDict_SetItemString(d, \"__f2py_numpy_version__\", s);
+    Py_DECREF(s);
+    #modulename#_error = PyErr_NewException (\"#modulename#.error\", NULL, NULL);
+    /*
+     * Store the error object inside the dict, so that it could get deallocated.
+     * (in practice, this is a module, so it likely will not and cannot.)
+     */
+    PyDict_SetItemString(d, \"_#modulename#_error\", #modulename#_error);
+    Py_DECREF(#modulename#_error);
+    for(i=0;f2py_routine_defs[i].name!=NULL;i++) {
+        tmp = PyFortranObject_NewAsAttr(&f2py_routine_defs[i]);
+        PyDict_SetItemString(d, f2py_routine_defs[i].name, tmp);
+        Py_DECREF(tmp);
+    }
 #initf2pywraphooks#
 #initf90modhooks#
 #initcommonhooks#
 #interface_usercode#
 
 #ifdef F2PY_REPORT_ATEXIT
-\tif (! PyErr_Occurred())
-\t\ton_exit(f2py_report_on_exit,(void*)\"#modulename#\");
+    if (! PyErr_Occurred())
+        on_exit(f2py_report_on_exit,(void*)\"#modulename#\");
 #endif
-\treturn m;
+    return m;
 }
 #ifdef __cplusplus
 }
@@ -322,7 +326,7 @@ f2py_stop_clock();
     'externroutines': '#declfortranroutine#',
     'doc': '#docreturn##name#(#docsignature#)',
     'docshort': '#docreturn##name#(#docsignatureshort#)',
-    'docs': '"\t#docreturn##name#(#docsignature#)\\n"\n',
+    'docs': '"    #docreturn##name#(#docsignature#)\\n"\n',
     'need': ['arrayobject.h', 'CFUNCSMESS', 'MINMAX'],
     'cppmacros': {debugcapi: '#define DEBUGCFUNCS'},
     'latexdoc': ['\\subsection{Wrapper function \\texttt{#texname#}}\n',
@@ -396,25 +400,25 @@ rout_rules = [
                                ismoduleroutine: '',
                                isdummyroutine: ''
                                },
-        'routine_def': {l_not(l_or(ismoduleroutine, isintent_c, isdummyroutine)): '\t{\"#name#\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
-                        l_and(l_not(ismoduleroutine), isintent_c, l_not(isdummyroutine)): '\t{\"#name#\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',
-                        l_and(l_not(ismoduleroutine), isdummyroutine): '\t{\"#name#\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',
+        'routine_def': {l_not(l_or(ismoduleroutine, isintent_c, isdummyroutine)): '    {\"#name#\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
+                        l_and(l_not(ismoduleroutine), isintent_c, l_not(isdummyroutine)): '    {\"#name#\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',
+                        l_and(l_not(ismoduleroutine), isdummyroutine): '    {\"#name#\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',
                         },
         'need': {l_and(l_not(l_or(ismoduleroutine, isintent_c)), l_not(isdummyroutine)): 'F_FUNC'},
         'callfortranroutine': [
             {debugcapi: [
-                """\tfprintf(stderr,\"debug-capi:Fortran subroutine `#fortranname#(#callfortran#)\'\\n\");"""]},
+                """    fprintf(stderr,\"debug-capi:Fortran subroutine `#fortranname#(#callfortran#)\'\\n\");"""]},
             {hasexternals: """\
-\t\tif (#setjmpbuf#) {
-\t\t\tf2py_success = 0;
-\t\t} else {"""},
-            {isthreadsafe: '\t\t\tPy_BEGIN_ALLOW_THREADS'},
-            {hascallstatement: '''\t\t\t\t#callstatement#;
-\t\t\t\t/*(*f2py_func)(#callfortran#);*/'''},
+        if (#setjmpbuf#) {
+            f2py_success = 0;
+        } else {"""},
+            {isthreadsafe: '            Py_BEGIN_ALLOW_THREADS'},
+            {hascallstatement: '''                #callstatement#;
+                /*(*f2py_func)(#callfortran#);*/'''},
             {l_not(l_or(hascallstatement, isdummyroutine))
-                   : '\t\t\t\t(*f2py_func)(#callfortran#);'},
-            {isthreadsafe: '\t\t\tPy_END_ALLOW_THREADS'},
-            {hasexternals: """\t\t}"""}
+                   : '                (*f2py_func)(#callfortran#);'},
+            {isthreadsafe: '            Py_END_ALLOW_THREADS'},
+            {hasexternals: """        }"""}
         ],
         '_check': l_and(issubroutine, l_not(issubroutine_wrap)),
     }, {  # Wrapped function
@@ -423,8 +427,8 @@ rout_rules = [
                                isdummyroutine: '',
                                },
 
-        'routine_def': {l_not(l_or(ismoduleroutine, isdummyroutine)): '\t{\"#name#\",-1,{{-1}},0,(char *)#F_WRAPPEDFUNC#(#name_lower#,#NAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
-                        isdummyroutine: '\t{\"#name#\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',
+        'routine_def': {l_not(l_or(ismoduleroutine, isdummyroutine)): '    {\"#name#\",-1,{{-1}},0,(char *)#F_WRAPPEDFUNC#(#name_lower#,#NAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
+                        isdummyroutine: '    {\"#name#\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',
                         },
         'initf2pywraphook': {l_not(l_or(ismoduleroutine, isdummyroutine)): '''
     {
@@ -441,18 +445,18 @@ rout_rules = [
         'need': {l_not(l_or(ismoduleroutine, isdummyroutine)): ['F_WRAPPEDFUNC', 'F_FUNC']},
         'callfortranroutine': [
             {debugcapi: [
-                """\tfprintf(stderr,\"debug-capi:Fortran subroutine `f2pywrap#name_lower#(#callfortran#)\'\\n\");"""]},
+                """    fprintf(stderr,\"debug-capi:Fortran subroutine `f2pywrap#name_lower#(#callfortran#)\'\\n\");"""]},
             {hasexternals: """\
-\tif (#setjmpbuf#) {
-\t\tf2py_success = 0;
-\t} else {"""},
-            {isthreadsafe: '\tPy_BEGIN_ALLOW_THREADS'},
+    if (#setjmpbuf#) {
+        f2py_success = 0;
+    } else {"""},
+            {isthreadsafe: '    Py_BEGIN_ALLOW_THREADS'},
             {l_not(l_or(hascallstatement, isdummyroutine))
-                   : '\t(*f2py_func)(#callfortran#);'},
+                   : '    (*f2py_func)(#callfortran#);'},
             {hascallstatement:
-                '\t#callstatement#;\n\t/*(*f2py_func)(#callfortran#);*/'},
-            {isthreadsafe: '\tPy_END_ALLOW_THREADS'},
-            {hasexternals: '\t}'}
+                '    #callstatement#;\n    /*(*f2py_func)(#callfortran#);*/'},
+            {isthreadsafe: '    Py_END_ALLOW_THREADS'},
+            {hasexternals: '    }'}
         ],
         '_check': isfunction_wrap,
     }, {  # Wrapped subroutine
@@ -461,8 +465,8 @@ rout_rules = [
                                isdummyroutine: '',
                                },
 
-        'routine_def': {l_not(l_or(ismoduleroutine, isdummyroutine)): '\t{\"#name#\",-1,{{-1}},0,(char *)#F_WRAPPEDFUNC#(#name_lower#,#NAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
-                        isdummyroutine: '\t{\"#name#\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',
+        'routine_def': {l_not(l_or(ismoduleroutine, isdummyroutine)): '    {\"#name#\",-1,{{-1}},0,(char *)#F_WRAPPEDFUNC#(#name_lower#,#NAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
+                        isdummyroutine: '    {\"#name#\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',
                         },
         'initf2pywraphook': {l_not(l_or(ismoduleroutine, isdummyroutine)): '''
     {
@@ -479,18 +483,18 @@ rout_rules = [
         'need': {l_not(l_or(ismoduleroutine, isdummyroutine)): ['F_WRAPPEDFUNC', 'F_FUNC']},
         'callfortranroutine': [
             {debugcapi: [
-                """\tfprintf(stderr,\"debug-capi:Fortran subroutine `f2pywrap#name_lower#(#callfortran#)\'\\n\");"""]},
+                """    fprintf(stderr,\"debug-capi:Fortran subroutine `f2pywrap#name_lower#(#callfortran#)\'\\n\");"""]},
             {hasexternals: """\
-\tif (#setjmpbuf#) {
-\t\tf2py_success = 0;
-\t} else {"""},
-            {isthreadsafe: '\tPy_BEGIN_ALLOW_THREADS'},
+    if (#setjmpbuf#) {
+        f2py_success = 0;
+    } else {"""},
+            {isthreadsafe: '    Py_BEGIN_ALLOW_THREADS'},
             {l_not(l_or(hascallstatement, isdummyroutine))
-                   : '\t(*f2py_func)(#callfortran#);'},
+                   : '    (*f2py_func)(#callfortran#);'},
             {hascallstatement:
-                '\t#callstatement#;\n\t/*(*f2py_func)(#callfortran#);*/'},
-            {isthreadsafe: '\tPy_END_ALLOW_THREADS'},
-            {hasexternals: '\t}'}
+                '    #callstatement#;\n    /*(*f2py_func)(#callfortran#);*/'},
+            {isthreadsafe: '    Py_END_ALLOW_THREADS'},
+            {hasexternals: '    }'}
         ],
         '_check': issubroutine_wrap,
     }, {  # Function
@@ -501,13 +505,13 @@ rout_rules = [
                            {hasresultnote: '--- #resultnote#'}],
         'callfortranroutine': [{l_and(debugcapi, isstringfunction): """\
 #ifdef USESCOMPAQFORTRAN
-\tfprintf(stderr,\"debug-capi:Fortran function #ctype# #fortranname#(#callcompaqfortran#)\\n\");
+    fprintf(stderr,\"debug-capi:Fortran function #ctype# #fortranname#(#callcompaqfortran#)\\n\");
 #else
-\tfprintf(stderr,\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\n\");
+    fprintf(stderr,\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\n\");
 #endif
 """},
                                {l_and(debugcapi, l_not(isstringfunction)): """\
-\tfprintf(stderr,\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\n\");
+    fprintf(stderr,\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\n\");
 """}
                                ],
         '_check': l_and(isfunction, l_not(isfunction_wrap))
@@ -516,32 +520,32 @@ rout_rules = [
                                l_and(l_not(ismoduleroutine), isintent_c, l_not(isdummyroutine)): 'extern #ctype# #fortranname#(#callprotoargument#);',
                                isdummyroutine: ''
                                },
-        'routine_def': {l_and(l_not(l_or(ismoduleroutine, isintent_c)), l_not(isdummyroutine)): '\t{\"#name#\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
-                        l_and(l_not(ismoduleroutine), isintent_c, l_not(isdummyroutine)): '\t{\"#name#\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',
-                        isdummyroutine: '\t{\"#name#\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',
+        'routine_def': {l_and(l_not(l_or(ismoduleroutine, isintent_c)), l_not(isdummyroutine)): '    {\"#name#\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
+                        l_and(l_not(ismoduleroutine), isintent_c, l_not(isdummyroutine)): '    {\"#name#\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',
+                        isdummyroutine: '    {\"#name#\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',
                         },
-        'decl': [{iscomplexfunction_warn: '\t#ctype# #name#_return_value={0,0};',
-                  l_not(iscomplexfunction): '\t#ctype# #name#_return_value=0;'},
+        'decl': [{iscomplexfunction_warn: '    #ctype# #name#_return_value={0,0};',
+                  l_not(iscomplexfunction): '    #ctype# #name#_return_value=0;'},
                  {iscomplexfunction:
-                  '\tPyObject *#name#_return_value_capi = Py_None;'}
+                  '    PyObject *#name#_return_value_capi = Py_None;'}
                  ],
         'callfortranroutine': [
             {hasexternals: """\
-\tif (#setjmpbuf#) {
-\t\tf2py_success = 0;
-\t} else {"""},
-            {isthreadsafe: '\tPy_BEGIN_ALLOW_THREADS'},
-            {hascallstatement: '''\t#callstatement#;
-/*\t#name#_return_value = (*f2py_func)(#callfortran#);*/
+    if (#setjmpbuf#) {
+        f2py_success = 0;
+    } else {"""},
+            {isthreadsafe: '    Py_BEGIN_ALLOW_THREADS'},
+            {hascallstatement: '''    #callstatement#;
+/*    #name#_return_value = (*f2py_func)(#callfortran#);*/
 '''},
             {l_not(l_or(hascallstatement, isdummyroutine))
-                   : '\t#name#_return_value = (*f2py_func)(#callfortran#);'},
-            {isthreadsafe: '\tPy_END_ALLOW_THREADS'},
-            {hasexternals: '\t}'},
+                   : '    #name#_return_value = (*f2py_func)(#callfortran#);'},
+            {isthreadsafe: '    Py_END_ALLOW_THREADS'},
+            {hasexternals: '    }'},
             {l_and(debugcapi, iscomplexfunction)
-                   : '\tfprintf(stderr,"#routdebugshowvalue#\\n",#name#_return_value.r,#name#_return_value.i);'},
-            {l_and(debugcapi, l_not(iscomplexfunction)): '\tfprintf(stderr,"#routdebugshowvalue#\\n",#name#_return_value);'}],
-        'pyobjfrom': {iscomplexfunction: '\t#name#_return_value_capi = pyobj_from_#ctype#1(#name#_return_value);'},
+                   : '    fprintf(stderr,"#routdebugshowvalue#\\n",#name#_return_value.r,#name#_return_value.i);'},
+            {l_and(debugcapi, l_not(iscomplexfunction)): '    fprintf(stderr,"#routdebugshowvalue#\\n",#name#_return_value);'}],
+        'pyobjfrom': {iscomplexfunction: '    #name#_return_value_capi = pyobj_from_#ctype#1(#name#_return_value);'},
         'need': [{l_not(isdummyroutine): 'F_FUNC'},
                  {iscomplexfunction: 'pyobj_from_#ctype#1'},
                  {islong_longfunction: 'long_long'},
@@ -553,49 +557,50 @@ rout_rules = [
     }, {  # String function # in use for --no-wrap
         'declfortranroutine': 'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',
         'routine_def': {l_not(l_or(ismoduleroutine, isintent_c)):
-                        '\t{\"#name#\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
+                        '    {\"#name#\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
                         l_and(l_not(ismoduleroutine), isintent_c):
-                        '\t{\"#name#\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},'
+                        '    {\"#name#\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},'
                         },
-        'decl': ['\t#ctype# #name#_return_value = NULL;',
-                 '\tint #name#_return_value_len = 0;'],
+        'decl': ['    #ctype# #name#_return_value = NULL;',
+                 '    int #name#_return_value_len = 0;'],
         'callfortran':'#name#_return_value,#name#_return_value_len,',
-        'callfortranroutine':['\t#name#_return_value_len = #rlength#;',
-                              '\tif ((#name#_return_value = (string)malloc(sizeof(char)*(#name#_return_value_len+1))) == NULL) {',
-                              '\t\tPyErr_SetString(PyExc_MemoryError, \"out of memory\");',
-                              '\t\tf2py_success = 0;',
-                              '\t} else {',
-                              "\t\t(#name#_return_value)[#name#_return_value_len] = '\\0';",
-                              '\t}',
-                              '\tif (f2py_success) {',
+        'callfortranroutine':['    #name#_return_value_len = #rlength#;',
+                              '    if ((#name#_return_value = (string)malloc('
+                              + '#name#_return_value_len+1) == NULL) {',
+                              '        PyErr_SetString(PyExc_MemoryError, \"out of memory\");',
+                              '        f2py_success = 0;',
+                              '    } else {',
+                              "        (#name#_return_value)[#name#_return_value_len] = '\\0';",
+                              '    }',
+                              '    if (f2py_success) {',
                               {hasexternals: """\
-\t\tif (#setjmpbuf#) {
-\t\t\tf2py_success = 0;
-\t\t} else {"""},
-                              {isthreadsafe: '\t\tPy_BEGIN_ALLOW_THREADS'},
+        if (#setjmpbuf#) {
+            f2py_success = 0;
+        } else {"""},
+                              {isthreadsafe: '        Py_BEGIN_ALLOW_THREADS'},
                               """\
 #ifdef USESCOMPAQFORTRAN
-\t\t(*f2py_func)(#callcompaqfortran#);
+        (*f2py_func)(#callcompaqfortran#);
 #else
-\t\t(*f2py_func)(#callfortran#);
+        (*f2py_func)(#callfortran#);
 #endif
 """,
-                              {isthreadsafe: '\t\tPy_END_ALLOW_THREADS'},
-                              {hasexternals: '\t\t}'},
+                              {isthreadsafe: '        Py_END_ALLOW_THREADS'},
+                              {hasexternals: '        }'},
                               {debugcapi:
-                                  '\t\tfprintf(stderr,"#routdebugshowvalue#\\n",#name#_return_value_len,#name#_return_value);'},
-                              '\t} /* if (f2py_success) after (string)malloc */',
+                                  '        fprintf(stderr,"#routdebugshowvalue#\\n",#name#_return_value_len,#name#_return_value);'},
+                              '    } /* if (f2py_success) after (string)malloc */',
                               ],
         'returnformat': '#rformat#',
         'return': ',#name#_return_value',
-        'freemem': '\tSTRINGFREE(#name#_return_value);',
+        'freemem': '    STRINGFREE(#name#_return_value);',
         'need': ['F_FUNC', '#ctype#', 'STRINGFREE'],
         '_check':l_and(isstringfunction, l_not(isfunction_wrap))  # ???obsolete
     },
     {  # Debugging
-        'routdebugenter': '\tfprintf(stderr,"debug-capi:Python C/API function #modulename#.#name#(#docsignature#)\\n");',
-        'routdebugleave': '\tfprintf(stderr,"debug-capi:Python C/API function #modulename#.#name#: successful.\\n");',
-        'routdebugfailure': '\tfprintf(stderr,"debug-capi:Python C/API function #modulename#.#name#: failure.\\n");',
+        'routdebugenter': '    fprintf(stderr,"debug-capi:Python C/API function #modulename#.#name#(#docsignature#)\\n");',
+        'routdebugleave': '    fprintf(stderr,"debug-capi:Python C/API function #modulename#.#name#: successful.\\n");',
+        'routdebugfailure': '    fprintf(stderr,"debug-capi:Python C/API function #modulename#.#name#: failure.\\n");',
         '_check': debugcapi
     }
 ]
@@ -620,16 +625,16 @@ aux_rules = [
         'separatorsfor': sepdict
     },
     {  # Common
-        'frompyobj': ['\t/* Processing auxiliary variable #varname# */',
-                      {debugcapi: '\tfprintf(stderr,"#vardebuginfo#\\n");'}, ],
-        'cleanupfrompyobj': '\t/* End of cleaning variable #varname# */',
+        'frompyobj': ['    /* Processing auxiliary variable #varname# */',
+                      {debugcapi: '    fprintf(stderr,"#vardebuginfo#\\n");'}, ],
+        'cleanupfrompyobj': '    /* End of cleaning variable #varname# */',
         'need': typedef_need_dict,
     },
     # Scalars (not complex)
     {  # Common
-        'decl': '\t#ctype# #varname# = 0;',
+        'decl': '    #ctype# #varname# = 0;',
         'need': {hasinitvalue: 'math.h'},
-        'frompyobj': {hasinitvalue: '\t#varname# = #init#;'},
+        'frompyobj': {hasinitvalue: '    #varname# = #init#;'},
         '_check': l_and(isscalar, l_not(iscomplex)),
     },
     {
@@ -641,23 +646,23 @@ aux_rules = [
     },
     # Complex scalars
     {  # Common
-        'decl': '\t#ctype# #varname#;',
-        'frompyobj': {hasinitvalue: '\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},
+        'decl': '    #ctype# #varname#;',
+        'frompyobj': {hasinitvalue: '    #varname#.r = #init.r#, #varname#.i = #init.i#;'},
         '_check': iscomplex
     },
     # String
     {  # Common
-        'decl': ['\t#ctype# #varname# = NULL;',
-                 '\tint slen(#varname#);',
+        'decl': ['    #ctype# #varname# = NULL;',
+                 '    int slen(#varname#);',
                  ],
         'need':['len..'],
         '_check':isstring
     },
     # Array
     {  # Common
-        'decl': ['\t#ctype# *#varname# = NULL;',
-                 '\tnpy_intp #varname#_Dims[#rank#] = {#rank*[-1]#};',
-                 '\tconst int #varname#_Rank = #rank#;',
+        'decl': ['    #ctype# *#varname# = NULL;',
+                 '    npy_intp #varname#_Dims[#rank#] = {#rank*[-1]#};',
+                 '    const int #varname#_Rank = #rank#;',
                  ],
         'need':['len..', {hasinitvalue: 'forcomb'}, {hasinitvalue: 'CFUNCSMESS'}],
         '_check': isarray
@@ -706,9 +711,9 @@ arg_rules = [
         'separatorsfor': sepdict
     },
     {  # Common
-        'frompyobj': ['\t/* Processing variable #varname# */',
-                      {debugcapi: '\tfprintf(stderr,"#vardebuginfo#\\n");'}, ],
-        'cleanupfrompyobj': '\t/* End of cleaning variable #varname# */',
+        'frompyobj': ['    /* Processing variable #varname# */',
+                      {debugcapi: '    fprintf(stderr,"#vardebuginfo#\\n");'}, ],
+        'cleanupfrompyobj': '    /* End of cleaning variable #varname# */',
         '_depend': '',
         'need': typedef_need_dict,
     },
@@ -827,8 +832,8 @@ if (#varname#_cb.capi==Py_None) {
     },
     # Scalars (not complex)
     {  # Common
-        'decl': '\t#ctype# #varname# = 0;',
-        'pyobjfrom': {debugcapi: '\tfprintf(stderr,"#vardebugshowvalue#\\n",#varname#);'},
+        'decl': '    #ctype# #varname# = 0;',
+        'pyobjfrom': {debugcapi: '    fprintf(stderr,"#vardebugshowvalue#\\n",#varname#);'},
         'callfortran': {isintent_c: '#varname#,', l_not(isintent_c): '&#varname#,'},
         'return': {isintent_out: ',#varname#'},
         '_check': l_and(isscalar, l_not(iscomplex))
@@ -836,15 +841,15 @@ if (#varname#_cb.capi==Py_None) {
         'need': {hasinitvalue: 'math.h'},
         '_check': l_and(isscalar, l_not(iscomplex)),
     }, {  # Not hidden
-        'decl': '\tPyObject *#varname#_capi = Py_None;',
+        'decl': '    PyObject *#varname#_capi = Py_None;',
         'argformat': {isrequired: 'O'},
         'keyformat': {isoptional: 'O'},
         'args_capi': {isrequired: ',&#varname#_capi'},
         'keys_capi': {isoptional: ',&#varname#_capi'},
         'pyobjfrom': {isintent_inout: """\
-\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);
-\tif (f2py_success) {"""},
-        'closepyobjfrom': {isintent_inout: "\t} /*if (f2py_success) of #varname# pyobjfrom*/"},
+    f2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);
+    if (f2py_success) {"""},
+        'closepyobjfrom': {isintent_inout: "    } /*if (f2py_success) of #varname# pyobjfrom*/"},
         'need': {isintent_inout: 'try_pyarr_from_#ctype#'},
         '_check': l_and(isscalar, l_not(iscomplex), isintent_nothide)
     }, {
@@ -864,97 +869,113 @@ if (#varname#_cb.capi==Py_None) {
             # ...
             #   from_pyobj(varname)
             #
-            {hasinitvalue: '\tif (#varname#_capi == Py_None) #varname# = #init#; else',
+            {hasinitvalue: '    if (#varname#_capi == Py_None) #varname# = #init#; else',
              '_depend': ''},
-            {l_and(isoptional, l_not(hasinitvalue)): '\tif (#varname#_capi != Py_None)',
+            {l_and(isoptional, l_not(hasinitvalue)): '    if (#varname#_capi != Py_None)',
              '_depend': ''},
             {l_not(islogical): '''\
-\t\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,"#pyname#() #nth# (#varname#) can\'t be converted to #ctype#");
-\tif (f2py_success) {'''},
+        f2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,"#pyname#() #nth# (#varname#) can\'t be converted to #ctype#");
+    if (f2py_success) {'''},
             {islogical: '''\
-\t\t#varname# = (#ctype#)PyObject_IsTrue(#varname#_capi);
-\t\tf2py_success = 1;
-\tif (f2py_success) {'''},
+        #varname# = (#ctype#)PyObject_IsTrue(#varname#_capi);
+        f2py_success = 1;
+    if (f2py_success) {'''},
         ],
-        'cleanupfrompyobj': '\t} /*if (f2py_success) of #varname#*/',
+        'cleanupfrompyobj': '    } /*if (f2py_success) of #varname#*/',
         'need': {l_not(islogical): '#ctype#_from_pyobj'},
         '_check': l_and(isscalar, l_not(iscomplex), isintent_nothide),
         '_depend': ''
     }, {  # Hidden
-        'frompyobj': {hasinitvalue: '\t#varname# = #init#;'},
+        'frompyobj': {hasinitvalue: '    #varname# = #init#;'},
         'need': typedef_need_dict,
         '_check': l_and(isscalar, l_not(iscomplex), isintent_hide),
         '_depend': ''
     }, {  # Common
-        'frompyobj': {debugcapi: '\tfprintf(stderr,"#vardebugshowvalue#\\n",#varname#);'},
+        'frompyobj': {debugcapi: '    fprintf(stderr,"#vardebugshowvalue#\\n",#varname#);'},
         '_check': l_and(isscalar, l_not(iscomplex)),
         '_depend': ''
     },
     # Complex scalars
     {  # Common
-        'decl': '\t#ctype# #varname#;',
+        'decl': '    #ctype# #varname#;',
         'callfortran': {isintent_c: '#varname#,', l_not(isintent_c): '&#varname#,'},
-        'pyobjfrom': {debugcapi: '\tfprintf(stderr,"#vardebugshowvalue#\\n",#varname#.r,#varname#.i);'},
+        'pyobjfrom': {debugcapi: '    fprintf(stderr,"#vardebugshowvalue#\\n",#varname#.r,#varname#.i);'},
         'return': {isintent_out: ',#varname#_capi'},
         '_check': iscomplex
     }, {  # Not hidden
-        'decl': '\tPyObject *#varname#_capi = Py_None;',
+        'decl': '    PyObject *#varname#_capi = Py_None;',
         'argformat': {isrequired: 'O'},
         'keyformat': {isoptional: 'O'},
         'args_capi': {isrequired: ',&#varname#_capi'},
         'keys_capi': {isoptional: ',&#varname#_capi'},
         'need': {isintent_inout: 'try_pyarr_from_#ctype#'},
         'pyobjfrom': {isintent_inout: """\
-\t\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);
-\t\tif (f2py_success) {"""},
-        'closepyobjfrom': {isintent_inout: "\t\t} /*if (f2py_success) of #varname# pyobjfrom*/"},
+        f2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);
+        if (f2py_success) {"""},
+        'closepyobjfrom': {isintent_inout: "        } /*if (f2py_success) of #varname# pyobjfrom*/"},
         '_check': l_and(iscomplex, isintent_nothide)
     }, {
-        'frompyobj': [{hasinitvalue: '\tif (#varname#_capi==Py_None) {#varname#.r = #init.r#, #varname#.i = #init.i#;} else'},
+        'frompyobj': [{hasinitvalue: '    if (#varname#_capi==Py_None) {#varname#.r = #init.r#, #varname#.i = #init.i#;} else'},
                       {l_and(isoptional, l_not(hasinitvalue))
-                             : '\tif (#varname#_capi != Py_None)'},
-                      '\t\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,"#pyname#() #nth# (#varname#) can\'t be converted to #ctype#");'
-                      '\n\tif (f2py_success) {'],
-        'cleanupfrompyobj': '\t}  /*if (f2py_success) of #varname# frompyobj*/',
+                             : '    if (#varname#_capi != Py_None)'},
+                      '        f2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,"#pyname#() #nth# (#varname#) can\'t be converted to #ctype#");'
+                      '\n    if (f2py_success) {'],
+        'cleanupfrompyobj': '    }  /*if (f2py_success) of #varname# frompyobj*/',
         'need': ['#ctype#_from_pyobj'],
         '_check': l_and(iscomplex, isintent_nothide),
         '_depend': ''
     }, {  # Hidden
-        'decl': {isintent_out: '\tPyObject *#varname#_capi = Py_None;'},
+        'decl': {isintent_out: '    PyObject *#varname#_capi = Py_None;'},
         '_check': l_and(iscomplex, isintent_hide)
     }, {
-        'frompyobj': {hasinitvalue: '\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},
+        'frompyobj': {hasinitvalue: '    #varname#.r = #init.r#, #varname#.i = #init.i#;'},
         '_check': l_and(iscomplex, isintent_hide),
         '_depend': ''
     }, {  # Common
-        'pyobjfrom': {isintent_out: '\t#varname#_capi = pyobj_from_#ctype#1(#varname#);'},
+        'pyobjfrom': {isintent_out: '    #varname#_capi = pyobj_from_#ctype#1(#varname#);'},
         'need': ['pyobj_from_#ctype#1'],
         '_check': iscomplex
     }, {
-        'frompyobj': {debugcapi: '\tfprintf(stderr,"#vardebugshowvalue#\\n",#varname#.r,#varname#.i);'},
+        'frompyobj': {debugcapi: '    fprintf(stderr,"#vardebugshowvalue#\\n",#varname#.r,#varname#.i);'},
         '_check': iscomplex,
         '_depend': ''
     },
     # String
     {  # Common
-        'decl': ['\t#ctype# #varname# = NULL;',
-                 '\tint slen(#varname#);',
-                 '\tPyObject *#varname#_capi = Py_None;'],
+        'decl': ['    #ctype# #varname# = NULL;',
+                 '    int slen(#varname#);',
+                 '    PyObject *#varname#_capi = Py_None;'],
         'callfortran':'#varname#,',
         'callfortranappend':'slen(#varname#),',
-        'pyobjfrom':{debugcapi: '\tfprintf(stderr,"#vardebugshowvalue#\\n",slen(#varname#),#varname#);'},
+        'pyobjfrom':[
+            {debugcapi:
+             '    fprintf(stderr,'
+             '"#vardebugshowvalue#\\n",slen(#varname#),#varname#);'},
+            # The trailing null value for Fortran is blank.
+            {l_and(isintent_out, l_not(isintent_c)):
+             "        STRINGPADN(#varname#, slen(#varname#), ' ', '\\0');"},
+        ],
         'return': {isintent_out: ',#varname#'},
-        'need': ['len..'],  # 'STRINGFREE'],
+        'need': ['len..',
+                 {l_and(isintent_out, l_not(isintent_c)): 'STRINGPADN'}],
         '_check':isstring
     }, {  # Common
-        'frompyobj': """\
-\tslen(#varname#) = #length#;
-\tf2py_success = #ctype#_from_pyobj(&#varname#,&slen(#varname#),#init#,#varname#_capi,\"#ctype#_from_pyobj failed in converting #nth# `#varname#\' of #pyname# to C #ctype#\");
-\tif (f2py_success) {""",
+        'frompyobj': [
+            """\
+    slen(#varname#) = #length#;
+    f2py_success = #ctype#_from_pyobj(&#varname#,&slen(#varname#),#init#,"""
+"""#varname#_capi,\"#ctype#_from_pyobj failed in converting #nth#"""
+"""`#varname#\' of #pyname# to C #ctype#\");
+    if (f2py_success) {""",
+            # The trailing null value for Fortran is blank.
+            {l_not(isintent_c):
+             "        STRINGPADN(#varname#, slen(#varname#), '\\0', ' ');"},
+        ],
         'cleanupfrompyobj': """\
-\t\tSTRINGFREE(#varname#);
-\t}  /*if (f2py_success) of #varname#*/""",
-        'need': ['#ctype#_from_pyobj', 'len..', 'STRINGFREE'],
+        STRINGFREE(#varname#);
+    }  /*if (f2py_success) of #varname#*/""",
+        'need': ['#ctype#_from_pyobj', 'len..', 'STRINGFREE',
+                 {l_not(isintent_c): 'STRINGPADN'}],
         '_check':isstring,
         '_depend':''
     }, {  # Not hidden
@@ -962,33 +983,38 @@ if (#varname#_cb.capi==Py_None) {
         'keyformat': {isoptional: 'O'},
         'args_capi': {isrequired: ',&#varname#_capi'},
         'keys_capi': {isoptional: ',&#varname#_capi'},
-        'pyobjfrom': {isintent_inout: '''\
-\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,#varname#);
-\tif (f2py_success) {'''},
-        'closepyobjfrom': {isintent_inout: '\t} /*if (f2py_success) of #varname# pyobjfrom*/'},
-        'need': {isintent_inout: 'try_pyarr_from_#ctype#'},
+        'pyobjfrom': [
+            {l_and(isintent_inout, l_not(isintent_c)):
+             "        STRINGPADN(#varname#, slen(#varname#), ' ', '\\0');"},
+            {isintent_inout: '''\
+    f2py_success = try_pyarr_from_#ctype#(#varname#_capi, #varname#,
+                                          slen(#varname#));
+    if (f2py_success) {'''}],
+        'closepyobjfrom': {isintent_inout: '    } /*if (f2py_success) of #varname# pyobjfrom*/'},
+        'need': {isintent_inout: 'try_pyarr_from_#ctype#',
+                 l_and(isintent_inout, l_not(isintent_c)): 'STRINGPADN'},
         '_check': l_and(isstring, isintent_nothide)
     }, {  # Hidden
         '_check': l_and(isstring, isintent_hide)
     }, {
-        'frompyobj': {debugcapi: '\tfprintf(stderr,"#vardebugshowvalue#\\n",slen(#varname#),#varname#);'},
+        'frompyobj': {debugcapi: '    fprintf(stderr,"#vardebugshowvalue#\\n",slen(#varname#),#varname#);'},
         '_check': isstring,
         '_depend': ''
     },
     # Array
     {  # Common
-        'decl': ['\t#ctype# *#varname# = NULL;',
-                 '\tnpy_intp #varname#_Dims[#rank#] = {#rank*[-1]#};',
-                 '\tconst int #varname#_Rank = #rank#;',
-                 '\tPyArrayObject *capi_#varname#_tmp = NULL;',
-                 '\tint capi_#varname#_intent = 0;',
+        'decl': ['    #ctype# *#varname# = NULL;',
+                 '    npy_intp #varname#_Dims[#rank#] = {#rank*[-1]#};',
+                 '    const int #varname#_Rank = #rank#;',
+                 '    PyArrayObject *capi_#varname#_tmp = NULL;',
+                 '    int capi_#varname#_intent = 0;',
                  ],
         'callfortran':'#varname#,',
         'return':{isintent_out: ',capi_#varname#_tmp'},
         'need': 'len..',
         '_check': isarray
     }, {  # intent(overwrite) array
-        'decl': '\tint capi_overwrite_#varname# = 1;',
+        'decl': '    int capi_overwrite_#varname# = 1;',
         'kwlistxa': '"overwrite_#varname#",',
         'xaformat': 'i',
         'keys_xa': ',&capi_overwrite_#varname#',
@@ -997,12 +1023,12 @@ if (#varname#_cb.capi==Py_None) {
         'docstropt': 'overwrite_#varname# : input int, optional\\n    Default: 1',
         '_check': l_and(isarray, isintent_overwrite),
     }, {
-        'frompyobj': '\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',
+        'frompyobj': '    capi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',
         '_check': l_and(isarray, isintent_overwrite),
         '_depend': '',
     },
     {  # intent(copy) array
-        'decl': '\tint capi_overwrite_#varname# = 0;',
+        'decl': '    int capi_overwrite_#varname# = 0;',
         'kwlistxa': '"overwrite_#varname#",',
         'xaformat': 'i',
         'keys_xa': ',&capi_overwrite_#varname#',
@@ -1011,7 +1037,7 @@ if (#varname#_cb.capi==Py_None) {
         'docstropt': 'overwrite_#varname# : input int, optional\\n    Default: 0',
         '_check': l_and(isarray, isintent_copy),
     }, {
-        'frompyobj': '\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',
+        'frompyobj': '    capi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',
         '_check': l_and(isarray, isintent_copy),
         '_depend': '',
     }, {
@@ -1019,57 +1045,57 @@ if (#varname#_cb.capi==Py_None) {
         '_check': isarray,
         '_depend': ''
     }, {  # Not hidden
-        'decl': '\tPyObject *#varname#_capi = Py_None;',
+        'decl': '    PyObject *#varname#_capi = Py_None;',
         'argformat': {isrequired: 'O'},
         'keyformat': {isoptional: 'O'},
         'args_capi': {isrequired: ',&#varname#_capi'},
         'keys_capi': {isoptional: ',&#varname#_capi'},
         '_check': l_and(isarray, isintent_nothide)
     }, {
-        'frompyobj': ['\t#setdims#;',
-                      '\tcapi_#varname#_intent |= #intent#;',
+        'frompyobj': ['    #setdims#;',
+                      '    capi_#varname#_intent |= #intent#;',
                       {isintent_hide:
-                       '\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,Py_None);'},
+                       '    capi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,Py_None);'},
                       {isintent_nothide:
-                       '\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,#varname#_capi);'},
+                       '    capi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,#varname#_capi);'},
                       """\
-\tif (capi_#varname#_tmp == NULL) {
-\t\tPyObject *exc, *val, *tb;
-\t\tPyErr_Fetch(&exc, &val, &tb);
-\t\tPyErr_SetString(exc ? exc : #modulename#_error,\"failed in converting #nth# `#varname#\' of #pyname# to C/Fortran array\" );
-\t\tnpy_PyErr_ChainExceptionsCause(exc, val, tb);
-\t} else {
-\t\t#varname# = (#ctype# *)(PyArray_DATA(capi_#varname#_tmp));
+    if (capi_#varname#_tmp == NULL) {
+        PyObject *exc, *val, *tb;
+        PyErr_Fetch(&exc, &val, &tb);
+        PyErr_SetString(exc ? exc : #modulename#_error,\"failed in converting #nth# `#varname#\' of #pyname# to C/Fortran array\" );
+        npy_PyErr_ChainExceptionsCause(exc, val, tb);
+    } else {
+        #varname# = (#ctype# *)(PyArray_DATA(capi_#varname#_tmp));
 """,
                       {hasinitvalue: [
                           {isintent_nothide:
-                              '\tif (#varname#_capi == Py_None) {'},
-                          {isintent_hide: '\t{'},
-                          {iscomplexarray: '\t\t#ctype# capi_c;'},
+                              '    if (#varname#_capi == Py_None) {'},
+                          {isintent_hide: '    {'},
+                          {iscomplexarray: '        #ctype# capi_c;'},
                           """\
-\t\tint *_i,capi_i=0;
-\t\tCFUNCSMESS(\"#name#: Initializing #varname#=#init#\\n\");
-\t\tif (initforcomb(PyArray_DIMS(capi_#varname#_tmp),PyArray_NDIM(capi_#varname#_tmp),1)) {
-\t\t\twhile ((_i = nextforcomb()))
-\t\t\t\t#varname#[capi_i++] = #init#; /* fortran way */
-\t\t} else {
-\t\t\tPyObject *exc, *val, *tb;
-\t\t\tPyErr_Fetch(&exc, &val, &tb);
-\t\t\tPyErr_SetString(exc ? exc : #modulename#_error,\"Initialization of #nth# #varname# failed (initforcomb).\");
-\t\t\tnpy_PyErr_ChainExceptionsCause(exc, val, tb);
-\t\t\tf2py_success = 0;
-\t\t}
-\t}
-\tif (f2py_success) {"""]},
+        int *_i,capi_i=0;
+        CFUNCSMESS(\"#name#: Initializing #varname#=#init#\\n\");
+        if (initforcomb(PyArray_DIMS(capi_#varname#_tmp),PyArray_NDIM(capi_#varname#_tmp),1)) {
+            while ((_i = nextforcomb()))
+                #varname#[capi_i++] = #init#; /* fortran way */
+        } else {
+            PyObject *exc, *val, *tb;
+            PyErr_Fetch(&exc, &val, &tb);
+            PyErr_SetString(exc ? exc : #modulename#_error,\"Initialization of #nth# #varname# failed (initforcomb).\");
+            npy_PyErr_ChainExceptionsCause(exc, val, tb);
+            f2py_success = 0;
+        }
+    }
+    if (f2py_success) {"""]},
                       ],
         'cleanupfrompyobj': [  # note that this list will be reversed
-            '\t}  /*if (capi_#varname#_tmp == NULL) ... else of #varname#*/',
+            '    }  /*if (capi_#varname#_tmp == NULL) ... else of #varname#*/',
             {l_not(l_or(isintent_out, isintent_hide)): """\
-\tif((PyObject *)capi_#varname#_tmp!=#varname#_capi) {
-\t\tPy_XDECREF(capi_#varname#_tmp); }"""},
+    if((PyObject *)capi_#varname#_tmp!=#varname#_capi) {
+        Py_XDECREF(capi_#varname#_tmp); }"""},
             {l_and(isintent_hide, l_not(isintent_out))
-                   : """\t\tPy_XDECREF(capi_#varname#_tmp);"""},
-            {hasinitvalue: '\t}  /*if (f2py_success) of #varname# init*/'},
+                   : """        Py_XDECREF(capi_#varname#_tmp);"""},
+            {hasinitvalue: '    }  /*if (f2py_success) of #varname# init*/'},
         ],
         '_check': isarray,
         '_depend': ''
@@ -1117,30 +1143,30 @@ if (#varname#_cb.capi==Py_None) {
 
 check_rules = [
     {
-        'frompyobj': {debugcapi: '\tfprintf(stderr,\"debug-capi:Checking `#check#\'\\n\");'},
+        'frompyobj': {debugcapi: '    fprintf(stderr,\"debug-capi:Checking `#check#\'\\n\");'},
         'need': 'len..'
     }, {
-        'frompyobj': '\tCHECKSCALAR(#check#,\"#check#\",\"#nth# #varname#\",\"#varshowvalue#\",#varname#) {',
-        'cleanupfrompyobj': '\t} /*CHECKSCALAR(#check#)*/',
+        'frompyobj': '    CHECKSCALAR(#check#,\"#check#\",\"#nth# #varname#\",\"#varshowvalue#\",#varname#) {',
+        'cleanupfrompyobj': '    } /*CHECKSCALAR(#check#)*/',
         'need': 'CHECKSCALAR',
         '_check': l_and(isscalar, l_not(iscomplex)),
         '_break': ''
     }, {
-        'frompyobj': '\tCHECKSTRING(#check#,\"#check#\",\"#nth# #varname#\",\"#varshowvalue#\",#varname#) {',
-        'cleanupfrompyobj': '\t} /*CHECKSTRING(#check#)*/',
+        'frompyobj': '    CHECKSTRING(#check#,\"#check#\",\"#nth# #varname#\",\"#varshowvalue#\",#varname#) {',
+        'cleanupfrompyobj': '    } /*CHECKSTRING(#check#)*/',
         'need': 'CHECKSTRING',
         '_check': isstring,
         '_break': ''
     }, {
         'need': 'CHECKARRAY',
-        'frompyobj': '\tCHECKARRAY(#check#,\"#check#\",\"#nth# #varname#\") {',
-        'cleanupfrompyobj': '\t} /*CHECKARRAY(#check#)*/',
+        'frompyobj': '    CHECKARRAY(#check#,\"#check#\",\"#nth# #varname#\") {',
+        'cleanupfrompyobj': '    } /*CHECKARRAY(#check#)*/',
         '_check': isarray,
         '_break': ''
     }, {
         'need': 'CHECKGENERIC',
-        'frompyobj': '\tCHECKGENERIC(#check#,\"#check#\",\"#nth# #varname#\") {',
-        'cleanupfrompyobj': '\t} /*CHECKGENERIC(#check#)*/',
+        'frompyobj': '    CHECKGENERIC(#check#,\"#check#\",\"#nth# #varname#\") {',
+        'cleanupfrompyobj': '    } /*CHECKGENERIC(#check#)*/',
     }
 ]
 
@@ -1153,7 +1179,7 @@ def buildmodule(m, um):
     """
     Return
     """
-    outmess('\tBuilding module "%s"...\n' % (m['name']))
+    outmess('    Building module "%s"...\n' % (m['name']))
     ret = {}
     mod_rules = defmod_rules[:]
     vrd = capi_maps.modsign2map(m)
@@ -1255,7 +1281,7 @@ def buildmodule(m, um):
     ret['csrc'] = fn
     with open(fn, 'w') as f:
         f.write(ar['modulebody'].replace('\t', 2 * ' '))
-    outmess('\tWrote C/API module "%s" to file "%s"\n' % (m['name'], fn))
+    outmess('    Wrote C/API module "%s" to file "%s"\n' % (m['name'], fn))
 
     if options['dorestdoc']:
         fn = os.path.join(
@@ -1263,7 +1289,7 @@ def buildmodule(m, um):
         with open(fn, 'w') as f:
             f.write('.. -*- rest -*-\n')
             f.write('\n'.join(ar['restdoc']))
-        outmess('\tReST Documentation is saved to file "%s/%smodule.rest"\n' %
+        outmess('    ReST Documentation is saved to file "%s/%smodule.rest"\n' %
                 (options['buildpath'], vrd['modulename']))
     if options['dolatexdoc']:
         fn = os.path.join(
@@ -1278,7 +1304,7 @@ def buildmodule(m, um):
                 f.write('\n'.join(ar['latexdoc']))
             if 'shortlatex' not in options:
                 f.write('\\end{document}')
-        outmess('\tDocumentation is saved to file "%s/%smodule.tex"\n' %
+        outmess('    Documentation is saved to file "%s/%smodule.tex"\n' %
                 (options['buildpath'], vrd['modulename']))
     if funcwrappers:
         wn = os.path.join(options['buildpath'], vrd['f2py_wrapper_output'])
@@ -1303,7 +1329,7 @@ def buildmodule(m, um):
                     lines.append(l + '\n')
             lines = ''.join(lines).replace('\n     &\n', '\n')
             f.write(lines)
-        outmess('\tFortran 77 wrappers are saved to "%s"\n' % (wn))
+        outmess('    Fortran 77 wrappers are saved to "%s"\n' % (wn))
     if funcwrappers2:
         wn = os.path.join(
             options['buildpath'], '%s-f2pywrappers2.f90' % (vrd['modulename']))
@@ -1330,7 +1356,7 @@ def buildmodule(m, um):
                     lines.append(l + '\n')
             lines = ''.join(lines).replace('\n     &\n', '\n')
             f.write(lines)
-        outmess('\tFortran 90 wrappers are saved to "%s"\n' % (wn))
+        outmess('    Fortran 90 wrappers are saved to "%s"\n' % (wn))
     return ret
 
 ################## Build C/API function #############
@@ -1346,10 +1372,10 @@ def buildapi(rout):
     var = rout['vars']
 
     if ismoduleroutine(rout):
-        outmess('\t\t\tConstructing wrapper function "%s.%s"...\n' %
+        outmess('            Constructing wrapper function "%s.%s"...\n' %
                 (rout['modulename'], rout['name']))
     else:
-        outmess('\t\tConstructing wrapper function "%s"...\n' % (rout['name']))
+        outmess('        Constructing wrapper function "%s"...\n' % (rout['name']))
     # Routine
     vrd = capi_maps.routsign2map(rout)
     rd = dictappend({}, vrd)
@@ -1451,9 +1477,9 @@ def buildapi(rout):
 
     ar = applyrules(routine_rules, rd)
     if ismoduleroutine(rout):
-        outmess('\t\t\t  %s\n' % (ar['docshort']))
+        outmess('              %s\n' % (ar['docshort']))
     else:
-        outmess('\t\t  %s\n' % (ar['docshort']))
+        outmess('          %s\n' % (ar['docshort']))
     return ar, wrap
 
 
index 0a35db477494b6dd19da7cfb085082cf7cd89d5e..499609f96600ff5ba4dc3573a8f02effaf1adaa8 100644 (file)
@@ -39,8 +39,6 @@ if __name__ == "__main__":
     config = configuration(top_path='')
     config = config.todict()
 
-    config['download_url'] = "http://cens.ioc.ee/projects/f2py2e/2.x"\
-                             "/F2PY-2-latest.tar.gz"
     config['classifiers'] = [
         'Development Status :: 5 - Production/Stable',
         'Intended Audience :: Developers',
@@ -68,6 +66,6 @@ command line tool (f2py) for generating Python C/API modules for
 wrapping Fortran 77/90/95 subroutines, accessing common blocks from
 Python, and calling Python functions from Fortran (call-backs).
 Interfacing subroutines/data from Fortran 90/95 modules is supported.""",
-          url="http://cens.ioc.ee/projects/f2py2e/",
+          url="https://numpy.org/doc/stable/f2py/",
           keywords=['Fortran', 'f2py'],
           **config)
index b9ef18701ce3466a26ac5874670f221ca7fb722d..c963781704cf0ae5f3557ca1b0ea5fd59034cbf9 100644 (file)
@@ -19,7 +19,7 @@ extern "C" {
 int
 F2PyDict_SetItemString(PyObject *dict, char *name, PyObject *obj)
 {
-    if (obj==NULL) {
+    if (obj == NULL) {
         fprintf(stderr, "Error loading %s\n", name);
         if (PyErr_Occurred()) {
             PyErr_Print();
@@ -33,21 +33,25 @@ F2PyDict_SetItemString(PyObject *dict, char *name, PyObject *obj)
 /*
  * Python-only fallback for thread-local callback pointers
  */
-void *F2PySwapThreadLocalCallbackPtr(char *key, void *ptr)
+void *
+F2PySwapThreadLocalCallbackPtr(char *key, void *ptr)
 {
     PyObject *local_dict, *value;
     void *prev;
 
     local_dict = PyThreadState_GetDict();
     if (local_dict == NULL) {
-        Py_FatalError("F2PySwapThreadLocalCallbackPtr: PyThreadState_GetDict failed");
+        Py_FatalError(
+                "F2PySwapThreadLocalCallbackPtr: PyThreadState_GetDict "
+                "failed");
     }
 
     value = PyDict_GetItemString(local_dict, key);
     if (value != NULL) {
         prev = PyLong_AsVoidPtr(value);
         if (PyErr_Occurred()) {
-           Py_FatalError("F2PySwapThreadLocalCallbackPtr: PyLong_AsVoidPtr failed");
+            Py_FatalError(
+                    "F2PySwapThreadLocalCallbackPtr: PyLong_AsVoidPtr failed");
         }
     }
     else {
@@ -56,11 +60,13 @@ void *F2PySwapThreadLocalCallbackPtr(char *key, void *ptr)
 
     value = PyLong_FromVoidPtr((void *)ptr);
     if (value == NULL) {
-        Py_FatalError("F2PySwapThreadLocalCallbackPtr: PyLong_FromVoidPtr failed");
+        Py_FatalError(
+                "F2PySwapThreadLocalCallbackPtr: PyLong_FromVoidPtr failed");
     }
 
     if (PyDict_SetItemString(local_dict, key, value) != 0) {
-        Py_FatalError("F2PySwapThreadLocalCallbackPtr: PyDict_SetItemString failed");
+        Py_FatalError(
+                "F2PySwapThreadLocalCallbackPtr: PyDict_SetItemString failed");
     }
 
     Py_DECREF(value);
@@ -68,21 +74,24 @@ void *F2PySwapThreadLocalCallbackPtr(char *key, void *ptr)
     return prev;
 }
 
-void *F2PyGetThreadLocalCallbackPtr(char *key)
+void *
+F2PyGetThreadLocalCallbackPtr(char *key)
 {
     PyObject *local_dict, *value;
     void *prev;
 
     local_dict = PyThreadState_GetDict();
     if (local_dict == NULL) {
-        Py_FatalError("F2PyGetThreadLocalCallbackPtr: PyThreadState_GetDict failed");
+        Py_FatalError(
+                "F2PyGetThreadLocalCallbackPtr: PyThreadState_GetDict failed");
     }
 
     value = PyDict_GetItemString(local_dict, key);
     if (value != NULL) {
         prev = PyLong_AsVoidPtr(value);
         if (PyErr_Occurred()) {
-           Py_FatalError("F2PyGetThreadLocalCallbackPtr: PyLong_AsVoidPtr failed");
+            Py_FatalError(
+                    "F2PyGetThreadLocalCallbackPtr: PyLong_AsVoidPtr failed");
         }
     }
     else {
@@ -94,14 +103,15 @@ void *F2PyGetThreadLocalCallbackPtr(char *key)
 
 /************************* FortranObject *******************************/
 
-typedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);
+typedef PyObject *(*fortranfunc)(PyObject *, PyObject *, PyObject *, void *);
 
 PyObject *
-PyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {
+PyFortranObject_New(FortranDataDef *defs, f2py_void_func init)
+{
     int i;
     PyFortranObject *fp = NULL;
     PyObject *v = NULL;
-    if (init!=NULL) {                        /* Initialize F90 module objects */
+    if (init != NULL) { /* Initialize F90 module objects */
         (*(init))();
     }
     fp = PyObject_New(PyFortranObject, &PyFortran_Type);
@@ -120,46 +130,49 @@ PyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {
         goto fail;
     }
     fp->defs = defs;
-    for (i=0;i<fp->len;i++) {
-        if (fp->defs[i].rank == -1) {                      /* Is Fortran routine */
+    for (i = 0; i < fp->len; i++) {
+        if (fp->defs[i].rank == -1) { /* Is Fortran routine */
             v = PyFortranObject_NewAsAttr(&(fp->defs[i]));
-            if (v==NULL) {
+            if (v == NULL) {
                 goto fail;
             }
-            PyDict_SetItemString(fp->dict,fp->defs[i].name,v);
+            PyDict_SetItemString(fp->dict, fp->defs[i].name, v);
             Py_XDECREF(v);
-        } else
-            if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */
-                if (fp->defs[i].type == NPY_STRING) {
-                    int n = fp->defs[i].rank-1;
-                    v = PyArray_New(&PyArray_Type, n, fp->defs[i].dims.d,
-                                    NPY_STRING, NULL, fp->defs[i].data, fp->defs[i].dims.d[n],
-                                    NPY_ARRAY_FARRAY, NULL);
-                }
-                else {
-                    v = PyArray_New(&PyArray_Type, fp->defs[i].rank, fp->defs[i].dims.d,
-                                    fp->defs[i].type, NULL, fp->defs[i].data, 0, NPY_ARRAY_FARRAY,
-                                    NULL);
-                }
-                if (v==NULL) {
-                    goto fail;
-                }
-                PyDict_SetItemString(fp->dict,fp->defs[i].name,v);
-                Py_XDECREF(v);
+        }
+        else if ((fp->defs[i].data) !=
+                 NULL) { /* Is Fortran variable or array (not allocatable) */
+            if (fp->defs[i].type == NPY_STRING) {
+                npy_intp n = fp->defs[i].rank - 1;
+                v = PyArray_New(&PyArray_Type, n, fp->defs[i].dims.d,
+                                NPY_STRING, NULL, fp->defs[i].data,
+                                fp->defs[i].dims.d[n], NPY_ARRAY_FARRAY, NULL);
+            }
+            else {
+                v = PyArray_New(&PyArray_Type, fp->defs[i].rank,
+                                fp->defs[i].dims.d, fp->defs[i].type, NULL,
+                                fp->defs[i].data, 0, NPY_ARRAY_FARRAY, NULL);
+            }
+            if (v == NULL) {
+                goto fail;
             }
+            PyDict_SetItemString(fp->dict, fp->defs[i].name, v);
+            Py_XDECREF(v);
+        }
     }
     return (PyObject *)fp;
- fail:
+fail:
     Py_XDECREF(fp);
     return NULL;
 }
 
 PyObject *
-PyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */
+PyFortranObject_NewAsAttr(FortranDataDef *defs)
+{ /* used for calling F90 module routines */
     PyFortranObject *fp = NULL;
     fp = PyObject_New(PyFortranObject, &PyFortran_Type);
-    if (fp == NULL) return NULL;
-    if ((fp->dict = PyDict_New())==NULL) {
+    if (fp == NULL)
+        return NULL;
+    if ((fp->dict = PyDict_New()) == NULL) {
         PyObject_Del(fp);
         return NULL;
     }
@@ -171,18 +184,19 @@ PyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module
 /* Fortran methods */
 
 static void
-fortran_dealloc(PyFortranObject *fp) {
+fortran_dealloc(PyFortranObject *fp)
+{
     Py_XDECREF(fp->dict);
     PyObject_Del(fp);
 }
 
-
 /* Returns number of bytes consumed from buf, or -1 on error. */
 static Py_ssize_t
 format_def(char *buf, Py_ssize_t size, FortranDataDef def)
 {
     char *p = buf;
-    int i, n;
+    int i;
+    npy_intp n;
 
     n = PyOS_snprintf(p, size, "array(%" NPY_INTP_FMT, def.dims.d[0]);
     if (n < 0 || n >= size) {
@@ -209,7 +223,7 @@ format_def(char *buf, Py_ssize_t size, FortranDataDef def)
 
     if (def.data == NULL) {
         static const char notalloc[] = ", not allocated";
-        if ((size_t) size < sizeof(notalloc)) {
+        if ((size_t)size < sizeof(notalloc)) {
             return -1;
         }
         memcpy(p, notalloc, sizeof(notalloc));
@@ -290,7 +304,6 @@ fortran_doc(FortranDataDef def)
             p += n;
             size -= n;
         }
-        
     }
     if (size <= 1) {
         goto fail;
@@ -304,17 +317,20 @@ fortran_doc(FortranDataDef def)
     PyMem_Free(buf);
     return s;
 
- fail:
-    fprintf(stderr, "fortranobject.c: fortran_doc: len(p)=%zd>%zd=size:"
-                    " too long docstring required, increase size\n",
+fail:
+    fprintf(stderr,
+            "fortranobject.c: fortran_doc: len(p)=%zd>%zd=size:"
+            " too long docstring required, increase size\n",
             p - buf, origsize);
     PyMem_Free(buf);
     return NULL;
 }
 
 static FortranDataDef *save_def; /* save pointer of an allocatable array */
-static void set_data(char *d,npy_intp *f) {  /* callback from Fortran */
-    if (*f)                                  /* In fortran f=allocated(d) */
+static void
+set_data(char *d, npy_intp *f)
+{           /* callback from Fortran */
+    if (*f) /* In fortran f=allocated(d) */
         save_def->data = d;
     else
         save_def->data = NULL;
@@ -322,8 +338,9 @@ static void set_data(char *d,npy_intp *f) {  /* callback from Fortran */
 }
 
 static PyObject *
-fortran_getattr(PyFortranObject *fp, char *name) {
-    int i,j,k,flag;
+fortran_getattr(PyFortranObject *fp, char *name)
+{
+    int i, j, k, flag;
     if (fp->dict != NULL) {
         PyObject *v = _PyDict_GetItemStringWithError(fp->dict, name);
         if (v == NULL && PyErr_Occurred()) {
@@ -334,36 +351,41 @@ fortran_getattr(PyFortranObject *fp, char *name) {
             return v;
         }
     }
-    for (i=0,j=1;i<fp->len && (j=strcmp(name,fp->defs[i].name));i++);
-    if (j==0)
-        if (fp->defs[i].rank!=-1) {                   /* F90 allocatable array */
-            if (fp->defs[i].func==NULL) return NULL;
-            for(k=0;k<fp->defs[i].rank;++k)
-                fp->defs[i].dims.d[k]=-1;
+    for (i = 0, j = 1; i < fp->len && (j = strcmp(name, fp->defs[i].name));
+         i++)
+        ;
+    if (j == 0)
+        if (fp->defs[i].rank != -1) { /* F90 allocatable array */
+            if (fp->defs[i].func == NULL)
+                return NULL;
+            for (k = 0; k < fp->defs[i].rank; ++k) fp->defs[i].dims.d[k] = -1;
             save_def = &fp->defs[i];
-            (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);
-            if (flag==2)
+            (*(fp->defs[i].func))(&fp->defs[i].rank, fp->defs[i].dims.d,
+                                  set_data, &flag);
+            if (flag == 2)
                 k = fp->defs[i].rank + 1;
             else
                 k = fp->defs[i].rank;
-            if (fp->defs[i].data !=NULL) {              /* array is allocated */
-                PyObject *v = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,
-                                          fp->defs[i].type, NULL, fp->defs[i].data, 0, NPY_ARRAY_FARRAY,
-                                          NULL);
-                if (v==NULL) return NULL;
+            if (fp->defs[i].data != NULL) { /* array is allocated */
+                PyObject *v = PyArray_New(
+                        &PyArray_Type, k, fp->defs[i].dims.d, fp->defs[i].type,
+                        NULL, fp->defs[i].data, 0, NPY_ARRAY_FARRAY, NULL);
+                if (v == NULL)
+                    return NULL;
                 /* Py_INCREF(v); */
                 return v;
-            } else {                                    /* array is not allocated */
+            }
+            else { /* array is not allocated */
                 Py_RETURN_NONE;
             }
         }
-    if (strcmp(name,"__dict__")==0) {
+    if (strcmp(name, "__dict__") == 0) {
         Py_INCREF(fp->dict);
         return fp->dict;
     }
-    if (strcmp(name,"__doc__")==0) {
+    if (strcmp(name, "__doc__") == 0) {
         PyObject *s = PyUnicode_FromString(""), *s2, *s3;
-        for (i=0;i<fp->len;i++) {
+        for (i = 0; i < fp->len; i++) {
             s2 = fortran_doc(fp->defs[i]);
             s3 = PyUnicode_Concat(s, s2);
             Py_DECREF(s2);
@@ -374,8 +396,9 @@ fortran_getattr(PyFortranObject *fp, char *name) {
             return NULL;
         return s;
     }
-    if ((strcmp(name,"_cpointer")==0) && (fp->len==1)) {
-        PyObject *cobj = F2PyCapsule_FromVoidPtr((void *)(fp->defs[0].data),NULL);
+    if ((strcmp(name, "_cpointer") == 0) && (fp->len == 1)) {
+        PyObject *cobj =
+                F2PyCapsule_FromVoidPtr((void *)(fp->defs[0].data), NULL);
         if (PyDict_SetItemString(fp->dict, name, cobj))
             return NULL;
         return cobj;
@@ -388,51 +411,68 @@ fortran_getattr(PyFortranObject *fp, char *name) {
 }
 
 static int
-fortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {
-    int i,j,flag;
+fortran_setattr(PyFortranObject *fp, char *name, PyObject *v)
+{
+    int i, j, flag;
     PyArrayObject *arr = NULL;
-    for (i=0,j=1;i<fp->len && (j=strcmp(name,fp->defs[i].name));i++);
-    if (j==0) {
-        if (fp->defs[i].rank==-1) {
-            PyErr_SetString(PyExc_AttributeError,"over-writing fortran routine");
+    for (i = 0, j = 1; i < fp->len && (j = strcmp(name, fp->defs[i].name));
+         i++)
+        ;
+    if (j == 0) {
+        if (fp->defs[i].rank == -1) {
+            PyErr_SetString(PyExc_AttributeError,
+                            "over-writing fortran routine");
             return -1;
         }
-        if (fp->defs[i].func!=NULL) { /* is allocatable array */
+        if (fp->defs[i].func != NULL) { /* is allocatable array */
             npy_intp dims[F2PY_MAX_DIMS];
             int k;
             save_def = &fp->defs[i];
-            if (v!=Py_None) {     /* set new value (reallocate if needed --
-                                     see f2py generated code for more
-                                     details ) */
-                for(k=0;k<fp->defs[i].rank;k++) dims[k]=-1;
-                if ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)
+            if (v != Py_None) { /* set new value (reallocate if needed --
+                                   see f2py generated code for more
+                                   details ) */
+                for (k = 0; k < fp->defs[i].rank; k++) dims[k] = -1;
+                if ((arr = array_from_pyobj(fp->defs[i].type, dims,
+                                            fp->defs[i].rank, F2PY_INTENT_IN,
+                                            v)) == NULL)
                     return -1;
-                (*(fp->defs[i].func))(&fp->defs[i].rank,PyArray_DIMS(arr),set_data,&flag);
-            } else {             /* deallocate */
-                for(k=0;k<fp->defs[i].rank;k++) dims[k]=0;
-                (*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);
-                for(k=0;k<fp->defs[i].rank;k++) dims[k]=-1;
+                (*(fp->defs[i].func))(&fp->defs[i].rank, PyArray_DIMS(arr),
+                                      set_data, &flag);
+            }
+            else { /* deallocate */
+                for (k = 0; k < fp->defs[i].rank; k++) dims[k] = 0;
+                (*(fp->defs[i].func))(&fp->defs[i].rank, dims, set_data,
+                                      &flag);
+                for (k = 0; k < fp->defs[i].rank; k++) dims[k] = -1;
             }
-            memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(npy_intp));
-        } else {                     /* not allocatable array */
-            if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)
+            memcpy(fp->defs[i].dims.d, dims,
+                   fp->defs[i].rank * sizeof(npy_intp));
+        }
+        else { /* not allocatable array */
+            if ((arr = array_from_pyobj(fp->defs[i].type, fp->defs[i].dims.d,
+                                        fp->defs[i].rank, F2PY_INTENT_IN,
+                                        v)) == NULL)
                 return -1;
         }
-        if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */
-            npy_intp s = PyArray_MultiplyList(fp->defs[i].dims.d,PyArray_NDIM(arr));
-            if (s==-1)
-                s = PyArray_MultiplyList(PyArray_DIMS(arr),PyArray_NDIM(arr));
-            if (s<0 ||
-                (memcpy(fp->defs[i].data,PyArray_DATA(arr),s*PyArray_ITEMSIZE(arr)))==NULL) {
-                if ((PyObject*)arr!=v) {
+        if (fp->defs[i].data !=
+            NULL) { /* copy Python object to Fortran array */
+            npy_intp s = PyArray_MultiplyList(fp->defs[i].dims.d,
+                                              PyArray_NDIM(arr));
+            if (s == -1)
+                s = PyArray_MultiplyList(PyArray_DIMS(arr), PyArray_NDIM(arr));
+            if (s < 0 || (memcpy(fp->defs[i].data, PyArray_DATA(arr),
+                                 s * PyArray_ITEMSIZE(arr))) == NULL) {
+                if ((PyObject *)arr != v) {
                     Py_DECREF(arr);
                 }
                 return -1;
             }
-            if ((PyObject*)arr!=v) {
+            if ((PyObject *)arr != v) {
                 Py_DECREF(arr);
             }
-        } else return (fp->defs[i].func==NULL?-1:0);
+        }
+        else
+            return (fp->defs[i].func == NULL ? -1 : 0);
         return 0; /* successful */
     }
     if (fp->dict == NULL) {
@@ -443,30 +483,33 @@ fortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {
     if (v == NULL) {
         int rv = PyDict_DelItemString(fp->dict, name);
         if (rv < 0)
-            PyErr_SetString(PyExc_AttributeError,"delete non-existing fortran attribute");
+            PyErr_SetString(PyExc_AttributeError,
+                            "delete non-existing fortran attribute");
         return rv;
     }
     else
         return PyDict_SetItemString(fp->dict, name, v);
 }
 
-static PyObject*
-fortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {
+static PyObject *
+fortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw)
+{
     int i = 0;
     /*  printf("fortran call
         name=%s,func=%p,data=%p,%p\n",fp->defs[i].name,
         fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */
-    if (fp->defs[i].rank==-1) {/* is Fortran routine */
-        if (fp->defs[i].func==NULL) {
+    if (fp->defs[i].rank == -1) { /* is Fortran routine */
+        if (fp->defs[i].func == NULL) {
             PyErr_Format(PyExc_RuntimeError, "no function to call");
             return NULL;
         }
-        else if (fp->defs[i].data==NULL)
+        else if (fp->defs[i].data == NULL)
             /* dummy routine */
-            return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);
+            return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp, arg,
+                                                        kw, NULL);
         else
-            return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,
-                                                        (void *)fp->defs[i].data);
+            return (*((fortranfunc)(fp->defs[i].func)))(
+                    (PyObject *)fp, arg, kw, (void *)fp->defs[i].data);
     }
     PyErr_Format(PyExc_TypeError, "this fortran object is not callable");
     return NULL;
@@ -488,16 +531,14 @@ fortran_repr(PyFortranObject *fp)
     return repr;
 }
 
-
 PyTypeObject PyFortran_Type = {
-    PyVarObject_HEAD_INIT(NULL, 0)
-    .tp_name ="fortran",
-    .tp_basicsize = sizeof(PyFortranObject),
-    .tp_dealloc = (destructor)fortran_dealloc,
-    .tp_getattr = (getattrfunc)fortran_getattr,
-    .tp_setattr = (setattrfunc)fortran_setattr,
-    .tp_repr = (reprfunc)fortran_repr,
-    .tp_call = (ternaryfunc)fortran_call,
+        PyVarObject_HEAD_INIT(NULL, 0).tp_name = "fortran",
+        .tp_basicsize = sizeof(PyFortranObject),
+        .tp_dealloc = (destructor)fortran_dealloc,
+        .tp_getattr = (getattrfunc)fortran_getattr,
+        .tp_setattr = (setattrfunc)fortran_setattr,
+        .tp_repr = (reprfunc)fortran_repr,
+        .tp_call = (ternaryfunc)fortran_call,
 };
 
 /************************* f2py_report_atexit *******************************/
@@ -518,99 +559,123 @@ static struct timeb cb_stop_time;
 static struct timeb cb_start_call_time;
 static struct timeb cb_stop_call_time;
 
-extern void f2py_start_clock(void) { ftime(&start_time); }
-extern
-void f2py_start_call_clock(void) {
+extern void
+f2py_start_clock(void)
+{
+    ftime(&start_time);
+}
+extern void
+f2py_start_call_clock(void)
+{
     f2py_stop_clock();
     ftime(&start_call_time);
 }
-extern
-void f2py_stop_clock(void) {
+extern void
+f2py_stop_clock(void)
+{
     ftime(&stop_time);
-    passed_time += 1000*(stop_time.time - start_time.time);
+    passed_time += 1000 * (stop_time.time - start_time.time);
     passed_time += stop_time.millitm - start_time.millitm;
 }
-extern
-void f2py_stop_call_clock(void) {
+extern void
+f2py_stop_call_clock(void)
+{
     ftime(&stop_call_time);
-    passed_call_time += 1000*(stop_call_time.time - start_call_time.time);
+    passed_call_time += 1000 * (stop_call_time.time - start_call_time.time);
     passed_call_time += stop_call_time.millitm - start_call_time.millitm;
     passed_counter += 1;
     f2py_start_clock();
 }
 
-extern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }
-extern
-void f2py_cb_start_call_clock(void) {
+extern void
+f2py_cb_start_clock(void)
+{
+    ftime(&cb_start_time);
+}
+extern void
+f2py_cb_start_call_clock(void)
+{
     f2py_cb_stop_clock();
     ftime(&cb_start_call_time);
 }
-extern
-void f2py_cb_stop_clock(void) {
+extern void
+f2py_cb_stop_clock(void)
+{
     ftime(&cb_stop_time);
-    cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);
+    cb_passed_time += 1000 * (cb_stop_time.time - cb_start_time.time);
     cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;
 }
-extern
-void f2py_cb_stop_call_clock(void) {
+extern void
+f2py_cb_stop_call_clock(void)
+{
     ftime(&cb_stop_call_time);
-    cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);
-    cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;
+    cb_passed_call_time +=
+            1000 * (cb_stop_call_time.time - cb_start_call_time.time);
+    cb_passed_call_time +=
+            cb_stop_call_time.millitm - cb_start_call_time.millitm;
     cb_passed_counter += 1;
     f2py_cb_start_clock();
 }
 
 static int f2py_report_on_exit_been_here = 0;
-extern
-void f2py_report_on_exit(int exit_flag,void *name) {
+extern void
+f2py_report_on_exit(int exit_flag, void *name)
+{
     if (f2py_report_on_exit_been_here) {
-        fprintf(stderr,"             %s\n",(char*)name);
+        fprintf(stderr, "             %s\n", (char *)name);
         return;
     }
     f2py_report_on_exit_been_here = 1;
-    fprintf(stderr,"                      /-----------------------\\\n");
-    fprintf(stderr,"                     < F2PY performance report >\n");
-    fprintf(stderr,"                      \\-----------------------/\n");
-    fprintf(stderr,"Overall time spent in ...\n");
-    fprintf(stderr,"(a) wrapped (Fortran/C) functions           : %8d msec\n",
+    fprintf(stderr, "                      /-----------------------\\\n");
+    fprintf(stderr, "                     < F2PY performance report >\n");
+    fprintf(stderr, "                      \\-----------------------/\n");
+    fprintf(stderr, "Overall time spent in ...\n");
+    fprintf(stderr, "(a) wrapped (Fortran/C) functions           : %8d msec\n",
             passed_call_time);
-    fprintf(stderr,"(b) f2py interface,           %6d calls  : %8d msec\n",
-            passed_counter,passed_time);
-    fprintf(stderr,"(c) call-back (Python) functions            : %8d msec\n",
+    fprintf(stderr, "(b) f2py interface,           %6d calls  : %8d msec\n",
+            passed_counter, passed_time);
+    fprintf(stderr, "(c) call-back (Python) functions            : %8d msec\n",
             cb_passed_call_time);
-    fprintf(stderr,"(d) f2py call-back interface, %6d calls  : %8d msec\n",
-            cb_passed_counter,cb_passed_time);
-
-    fprintf(stderr,"(e) wrapped (Fortran/C) functions (actual) : %8d msec\n\n",
-            passed_call_time-cb_passed_call_time-cb_passed_time);
-    fprintf(stderr,"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\n");
-    fprintf(stderr,"Exit status: %d\n",exit_flag);
-    fprintf(stderr,"Modules    : %s\n",(char*)name);
+    fprintf(stderr, "(d) f2py call-back interface, %6d calls  : %8d msec\n",
+            cb_passed_counter, cb_passed_time);
+
+    fprintf(stderr,
+            "(e) wrapped (Fortran/C) functions (actual) : %8d msec\n\n",
+            passed_call_time - cb_passed_call_time - cb_passed_time);
+    fprintf(stderr,
+            "Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\n");
+    fprintf(stderr, "Exit status: %d\n", exit_flag);
+    fprintf(stderr, "Modules    : %s\n", (char *)name);
 }
 #endif
 
 /********************** report on array copy ****************************/
 
 #ifdef F2PY_REPORT_ON_ARRAY_COPY
-static void f2py_report_on_array_copy(PyArrayObject* arr) {
+static void
+f2py_report_on_array_copy(PyArrayObject *arr)
+{
     const npy_intp arr_size = PyArray_Size((PyObject *)arr);
-    if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {
-        fprintf(stderr,"copied an array: size=%ld, elsize=%"NPY_INTP_FMT"\n",
+    if (arr_size > F2PY_REPORT_ON_ARRAY_COPY) {
+        fprintf(stderr,
+                "copied an array: size=%ld, elsize=%" NPY_INTP_FMT "\n",
                 arr_size, (npy_intp)PyArray_ITEMSIZE(arr));
     }
 }
-static void f2py_report_on_array_copy_fromany(void) {
-    fprintf(stderr,"created an array from object\n");
+static void
+f2py_report_on_array_copy_fromany(void)
+{
+    fprintf(stderr, "created an array from object\n");
 }
 
-#define F2PY_REPORT_ON_ARRAY_COPY_FROMARR f2py_report_on_array_copy((PyArrayObject *)arr)
+#define F2PY_REPORT_ON_ARRAY_COPY_FROMARR \
+    f2py_report_on_array_copy((PyArrayObject *)arr)
 #define F2PY_REPORT_ON_ARRAY_COPY_FROMANY f2py_report_on_array_copy_fromany()
 #else
 #define F2PY_REPORT_ON_ARRAY_COPY_FROMARR
 #define F2PY_REPORT_ON_ARRAY_COPY_FROMANY
 #endif
 
-
 /************************* array_from_obj *******************************/
 
 /*
@@ -632,72 +697,81 @@ static void f2py_report_on_array_copy_fromany(void) {
  * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $
  */
 
-static int check_and_fix_dimensions(const PyArrayObject* arr,
-                                    const int rank,
-                                    npy_intp *dims);
+static int
+check_and_fix_dimensions(const PyArrayObject *arr, const int rank,
+                         npy_intp *dims);
 
 static int
-count_negative_dimensions(const int rank,
-                          const npy_intp *dims) {
-    int i=0,r=0;
-    while (i<rank) {
-        if (dims[i] < 0) ++r;
-        ++i;
+find_first_negative_dimension(const int rank, const npy_intp *dims)
+{
+    for (int i = 0; i < rank; ++i) {
+        if (dims[i] < 0) {
+            return i;
+        }
     }
-    return r;
+    return -1;
 }
 
 #ifdef DEBUG_COPY_ND_ARRAY
-void dump_dims(int rank, npy_intp const* dims) {
+void
+dump_dims(int rank, npy_intp const *dims)
+{
     int i;
     printf("[");
-    for(i=0;i<rank;++i) {
+    for (i = 0; i < rank; ++i) {
         printf("%3" NPY_INTP_FMT, dims[i]);
     }
     printf("]\n");
 }
-void dump_attrs(const PyArrayObject* obj) {
-    const PyArrayObject_fields *arr = (const PyArrayObject_fields*) obj;
+void
+dump_attrs(const PyArrayObject *obj)
+{
+    const PyArrayObject_fields *arr = (const PyArrayObject_fields *)obj;
     int rank = PyArray_NDIM(arr);
     npy_intp size = PyArray_Size((PyObject *)arr);
-    printf("\trank = %d, flags = %d, size = %" NPY_INTP_FMT  "\n",
-           rank,arr->flags,size);
+    printf("\trank = %d, flags = %d, size = %" NPY_INTP_FMT "\n", rank,
+           arr->flags, size);
     printf("\tstrides = ");
-    dump_dims(rank,arr->strides);
+    dump_dims(rank, arr->strides);
     printf("\tdimensions = ");
-    dump_dims(rank,arr->dimensions);
+    dump_dims(rank, arr->dimensions);
 }
 #endif
 
-#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }
-
-static int swap_arrays(PyArrayObject* obj1, PyArrayObject* obj2) {
-    PyArrayObject_fields *arr1 = (PyArrayObject_fields*) obj1,
-                         *arr2 = (PyArrayObject_fields*) obj2;
-    SWAPTYPE(arr1->data,arr2->data,char*);
-    SWAPTYPE(arr1->nd,arr2->nd,int);
-    SWAPTYPE(arr1->dimensions,arr2->dimensions,npy_intp*);
-    SWAPTYPE(arr1->strides,arr2->strides,npy_intp*);
-    SWAPTYPE(arr1->base,arr2->base,PyObject*);
-    SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);
-    SWAPTYPE(arr1->flags,arr2->flags,int);
+#define SWAPTYPE(a, b, t) \
+    {                     \
+        t c;              \
+        c = (a);          \
+        (a) = (b);        \
+        (b) = c;          \
+    }
+
+static int
+swap_arrays(PyArrayObject *obj1, PyArrayObject *obj2)
+{
+    PyArrayObject_fields *arr1 = (PyArrayObject_fields *)obj1,
+                         *arr2 = (PyArrayObject_fields *)obj2;
+    SWAPTYPE(arr1->data, arr2->data, char *);
+    SWAPTYPE(arr1->nd, arr2->nd, int);
+    SWAPTYPE(arr1->dimensions, arr2->dimensions, npy_intp *);
+    SWAPTYPE(arr1->strides, arr2->strides, npy_intp *);
+    SWAPTYPE(arr1->base, arr2->base, PyObject *);
+    SWAPTYPE(arr1->descr, arr2->descr, PyArray_Descr *);
+    SWAPTYPE(arr1->flags, arr2->flags, int);
     /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */
     return 0;
 }
 
-#define ARRAY_ISCOMPATIBLE(arr,type_num)                                \
-    (  (PyArray_ISINTEGER(arr) && PyTypeNum_ISINTEGER(type_num))        \
-       ||(PyArray_ISFLOAT(arr) && PyTypeNum_ISFLOAT(type_num))          \
-       ||(PyArray_ISCOMPLEX(arr) && PyTypeNum_ISCOMPLEX(type_num))      \
-       ||(PyArray_ISBOOL(arr) && PyTypeNum_ISBOOL(type_num))            \
-       )
-
-extern
-PyArrayObject* array_from_pyobj(const int type_num,
-                                npy_intp *dims,
-                                const int rank,
-                                const int intent,
-                                PyObject *obj) {
+#define ARRAY_ISCOMPATIBLE(arr, type_num)                         \
+    ((PyArray_ISINTEGER(arr) && PyTypeNum_ISINTEGER(type_num)) || \
+     (PyArray_ISFLOAT(arr) && PyTypeNum_ISFLOAT(type_num)) ||     \
+     (PyArray_ISCOMPLEX(arr) && PyTypeNum_ISCOMPLEX(type_num)) || \
+     (PyArray_ISBOOL(arr) && PyTypeNum_ISBOOL(type_num)))
+
+extern PyArrayObject *
+array_from_pyobj(const int type_num, npy_intp *dims, const int rank,
+                 const int intent, PyObject *obj)
+{
     /*
      * Note about reference counting
      *  -----------------------------
@@ -716,27 +790,23 @@ PyArrayObject* array_from_pyobj(const int type_num,
     char typechar;
     int elsize;
 
-    if ((intent & F2PY_INTENT_HIDE)
-        || ((intent & F2PY_INTENT_CACHE) && (obj==Py_None))
-        || ((intent & F2PY_OPTIONAL) && (obj==Py_None))
-        ) {
+    if ((intent & F2PY_INTENT_HIDE) ||
+        ((intent & F2PY_INTENT_CACHE) && (obj == Py_None)) ||
+        ((intent & F2PY_OPTIONAL) && (obj == Py_None))) {
         /* intent(cache), optional, intent(hide) */
-        if (count_negative_dimensions(rank,dims) > 0) {
-            int i;
-            strcpy(mess, "failed to create intent(cache|hide)|optional array"
-                   "-- must have defined dimensions but got (");
-            for(i=0;i<rank;++i)
-                sprintf(mess+strlen(mess),"%" NPY_INTP_FMT ",",dims[i]);
-            strcat(mess, ")");
-            PyErr_SetString(PyExc_ValueError,mess);
+        int i = find_first_negative_dimension(rank, dims);
+        if (i >= 0) {
+            PyErr_Format(PyExc_ValueError,
+                         "failed to create intent(cache|hide)|optional array"
+                         " -- must have defined dimensions, but dims[%d] = %"
+                         NPY_INTP_FMT, i, dims[i]);
             return NULL;
         }
-        arr = (PyArrayObject *)
-            PyArray_New(&PyArray_Type, rank, dims, type_num,
-                        NULL,NULL,1,
-                        !(intent&F2PY_INTENT_C),
-                        NULL);
-        if (arr==NULL) return NULL;
+        arr = (PyArrayObject *)PyArray_New(&PyArray_Type, rank, dims, type_num,
+                                           NULL, NULL, 1,
+                                           !(intent & F2PY_INTENT_C), NULL);
+        if (arr == NULL)
+            return NULL;
         if (!(intent & F2PY_INTENT_CACHE))
             PyArray_FILLWBYTE(arr, 0);
         return arr;
@@ -760,8 +830,7 @@ PyArrayObject* array_from_pyobj(const int type_num,
 
         if (intent & F2PY_INTENT_CACHE) {
             /* intent(cache) */
-            if (PyArray_ISONESEGMENT(arr)
-                && PyArray_ITEMSIZE(arr)>=elsize) {
+            if (PyArray_ISONESEGMENT(arr) && PyArray_ITEMSIZE(arr) >= elsize) {
                 if (check_and_fix_dimensions(arr, rank, dims)) {
                     return NULL;
                 }
@@ -772,17 +841,17 @@ PyArrayObject* array_from_pyobj(const int type_num,
             strcpy(mess, "failed to initialize intent(cache) array");
             if (!PyArray_ISONESEGMENT(arr))
                 strcat(mess, " -- input must be in one segment");
-            if (PyArray_ITEMSIZE(arr)<elsize)
-                sprintf(mess+strlen(mess),
-                        " -- expected at least elsize=%d but got %" NPY_INTP_FMT,
-                        elsize,
-                        (npy_intp)PyArray_ITEMSIZE(arr)
-                        );
-            PyErr_SetString(PyExc_ValueError,mess);
+            if (PyArray_ITEMSIZE(arr) < elsize)
+                sprintf(mess + strlen(mess),
+                        " -- expected at least elsize=%d but got "
+                        "%" NPY_INTP_FMT,
+                        elsize, (npy_intp)PyArray_ITEMSIZE(arr));
+            PyErr_SetString(PyExc_ValueError, mess);
             return NULL;
         }
 
-        /* here we have always intent(in) or intent(inout) or intent(inplace) */
+        /* here we have always intent(in) or intent(inout) or intent(inplace)
+         */
 
         if (check_and_fix_dimensions(arr, rank, dims)) {
             return NULL;
@@ -794,12 +863,12 @@ PyArrayObject* array_from_pyobj(const int type_num,
         for (i=1;i<=16;i++)
           printf("i=%d isaligned=%d\n", i, ARRAY_ISALIGNED(arr, i));
         */
-        if ((! (intent & F2PY_INTENT_COPY))
-            && PyArray_ITEMSIZE(arr)==elsize
-            && ARRAY_ISCOMPATIBLE(arr,type_num)
-            && F2PY_CHECK_ALIGNMENT(arr, intent)
-            ) {
-            if ((intent & F2PY_INTENT_C)?PyArray_ISCARRAY_RO(arr):PyArray_ISFARRAY_RO(arr)) {
+        if ((!(intent & F2PY_INTENT_COPY)) &&
+            PyArray_ITEMSIZE(arr) == elsize &&
+            ARRAY_ISCOMPATIBLE(arr, type_num) &&
+            F2PY_CHECK_ALIGNMENT(arr, intent)) {
+            if ((intent & F2PY_INTENT_C) ? PyArray_ISCARRAY_RO(arr)
+                                         : PyArray_ISFARRAY_RO(arr)) {
                 if ((intent & F2PY_INTENT_OUT)) {
                     Py_INCREF(arr);
                 }
@@ -809,36 +878,35 @@ PyArrayObject* array_from_pyobj(const int type_num,
         }
         if (intent & F2PY_INTENT_INOUT) {
             strcpy(mess, "failed to initialize intent(inout) array");
-            /* Must use PyArray_IS*ARRAY because intent(inout) requires writable input */
+            /* Must use PyArray_IS*ARRAY because intent(inout) requires
+             * writable input */
             if ((intent & F2PY_INTENT_C) && !PyArray_ISCARRAY(arr))
                 strcat(mess, " -- input not contiguous");
             if (!(intent & F2PY_INTENT_C) && !PyArray_ISFARRAY(arr))
                 strcat(mess, " -- input not fortran contiguous");
-            if (PyArray_ITEMSIZE(arr)!=elsize)
-                sprintf(mess+strlen(mess),
+            if (PyArray_ITEMSIZE(arr) != elsize)
+                sprintf(mess + strlen(mess),
                         " -- expected elsize=%d but got %" NPY_INTP_FMT,
-                        elsize,
-                        (npy_intp)PyArray_ITEMSIZE(arr)
-                        );
-            if (!(ARRAY_ISCOMPATIBLE(arr,type_num)))
-                sprintf(mess+strlen(mess)," -- input '%c' not compatible to '%c'",
-                        PyArray_DESCR(arr)->type,typechar);
+                        elsize, (npy_intp)PyArray_ITEMSIZE(arr));
+            if (!(ARRAY_ISCOMPATIBLE(arr, type_num)))
+                sprintf(mess + strlen(mess),
+                        " -- input '%c' not compatible to '%c'",
+                        PyArray_DESCR(arr)->type, typechar);
             if (!(F2PY_CHECK_ALIGNMENT(arr, intent)))
-              sprintf(mess+strlen(mess)," -- input not %d-aligned", F2PY_GET_ALIGNMENT(intent));
-            PyErr_SetString(PyExc_ValueError,mess);
+                sprintf(mess + strlen(mess), " -- input not %d-aligned",
+                        F2PY_GET_ALIGNMENT(intent));
+            PyErr_SetString(PyExc_ValueError, mess);
             return NULL;
         }
 
         /* here we have always intent(in) or intent(inplace) */
 
         {
-            PyArrayObject * retarr;
-            retarr = (PyArrayObject *) \
-                PyArray_New(&PyArray_Type, PyArray_NDIM(arr), PyArray_DIMS(arr), type_num,
-                            NULL,NULL,1,
-                            !(intent&F2PY_INTENT_C),
-                            NULL);
-            if (retarr==NULL)
+            PyArrayObject *retarr;
+            retarr = (PyArrayObject *)PyArray_New(
+                    &PyArray_Type, PyArray_NDIM(arr), PyArray_DIMS(arr),
+                    type_num, NULL, NULL, 1, !(intent & F2PY_INTENT_C), NULL);
+            if (retarr == NULL)
                 return NULL;
             F2PY_REPORT_ON_ARRAY_COPY_FROMARR;
             if (PyArray_CopyInto(retarr, arr)) {
@@ -846,21 +914,21 @@ PyArrayObject* array_from_pyobj(const int type_num,
                 return NULL;
             }
             if (intent & F2PY_INTENT_INPLACE) {
-                if (swap_arrays(arr,retarr))
+                if (swap_arrays(arr, retarr))
                     return NULL; /* XXX: set exception */
                 Py_XDECREF(retarr);
                 if (intent & F2PY_INTENT_OUT)
                     Py_INCREF(arr);
-            } else {
+            }
+            else {
                 arr = retarr;
             }
         }
         return arr;
     }
 
-    if ((intent & F2PY_INTENT_INOUT) ||
-            (intent & F2PY_INTENT_INPLACE) ||
-            (intent & F2PY_INTENT_CACHE)) {
+    if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE) ||
+        (intent & F2PY_INTENT_CACHE)) {
         PyErr_Format(PyExc_TypeError,
                      "failed to initialize intent(inout|inplace|cache) "
                      "array, input '%s' object is not an array",
@@ -869,7 +937,7 @@ PyArrayObject* array_from_pyobj(const int type_num,
     }
 
     {
-        PyArray_Descr * descr = PyArray_DescrFromType(type_num);
+        PyArray_Descr *descr = PyArray_DescrFromType(type_num);
         /* compatibility with NPY_CHAR */
         if (type_num == NPY_STRING) {
             PyArray_DESCR_REPLACE(descr);
@@ -880,26 +948,28 @@ PyArrayObject* array_from_pyobj(const int type_num,
             descr->type = NPY_CHARLTR;
         }
         F2PY_REPORT_ON_ARRAY_COPY_FROMANY;
-        arr = (PyArrayObject *) \
-            PyArray_FromAny(obj, descr, 0,0,
-                            ((intent & F2PY_INTENT_C)?NPY_ARRAY_CARRAY:NPY_ARRAY_FARRAY) \
-                            | NPY_ARRAY_FORCECAST, NULL);
-        if (arr==NULL)
+        arr = (PyArrayObject *)PyArray_FromAny(
+                obj, descr, 0, 0,
+                ((intent & F2PY_INTENT_C) ? NPY_ARRAY_CARRAY
+                                          : NPY_ARRAY_FARRAY) |
+                        NPY_ARRAY_FORCECAST,
+                NULL);
+        if (arr == NULL)
             return NULL;
         if (check_and_fix_dimensions(arr, rank, dims)) {
             return NULL;
         }
         return arr;
     }
-
 }
 
 /*****************************************/
 /* Helper functions for array_from_pyobj */
 /*****************************************/
 
-static
-int check_and_fix_dimensions(const PyArrayObject* arr, const int rank, npy_intp *dims)
+static int
+check_and_fix_dimensions(const PyArrayObject *arr, const int rank,
+                         npy_intp *dims)
 {
     /*
      * This function fills in blanks (that are -1's) in dims list using
@@ -908,13 +978,15 @@ int check_and_fix_dimensions(const PyArrayObject* arr, const int rank, npy_intp
      *
      * Returns 0 if the function is successful.
      *
-     * If an error condition is detected, an exception is set and 1 is returned.
+     * If an error condition is detected, an exception is set and 1 is
+     * returned.
      */
-    const npy_intp arr_size = (PyArray_NDIM(arr))?PyArray_Size((PyObject *)arr):1;
+    const npy_intp arr_size =
+            (PyArray_NDIM(arr)) ? PyArray_Size((PyObject *)arr) : 1;
 #ifdef DEBUG_COPY_ND_ARRAY
     dump_attrs(arr);
     printf("check_and_fix_dimensions:init: dims=");
-    dump_dims(rank,dims);
+    dump_dims(rank, dims);
 #endif
     if (rank > PyArray_NDIM(arr)) { /* [1,2] -> [[1],[2]]; 1 -> [[1]]  */
         npy_intp new_size = 1;
@@ -922,35 +994,39 @@ int check_and_fix_dimensions(const PyArrayObject* arr, const int rank, npy_intp
         int i;
         npy_intp d;
         /* Fill dims where -1 or 0; check dimensions; calc new_size; */
-        for(i=0;i<PyArray_NDIM(arr);++i) {
-            d = PyArray_DIM(arr,i);
+        for (i = 0; i < PyArray_NDIM(arr); ++i) {
+            d = PyArray_DIM(arr, i);
             if (dims[i] >= 0) {
-                if (d>1 && dims[i]!=d) {
-                    PyErr_Format(PyExc_ValueError,
-                                 "%d-th dimension must be fixed to %"
-                                 NPY_INTP_FMT " but got %" NPY_INTP_FMT "\n",
-                                 i, dims[i], d);
+                if (d > 1 && dims[i] != d) {
+                    PyErr_Format(
+                            PyExc_ValueError,
+                            "%d-th dimension must be fixed to %" NPY_INTP_FMT
+                            " but got %" NPY_INTP_FMT "\n",
+                            i, dims[i], d);
                     return 1;
                 }
-                if (!dims[i]) dims[i] = 1;
-            } else {
+                if (!dims[i])
+                    dims[i] = 1;
+            }
+            else {
                 dims[i] = d ? d : 1;
             }
             new_size *= dims[i];
         }
-        for(i=PyArray_NDIM(arr);i<rank;++i)
-            if (dims[i]>1) {
+        for (i = PyArray_NDIM(arr); i < rank; ++i)
+            if (dims[i] > 1) {
                 PyErr_Format(PyExc_ValueError,
                              "%d-th dimension must be %" NPY_INTP_FMT
                              " but got 0 (not defined).\n",
                              i, dims[i]);
                 return 1;
-            } else if (free_axe<0)
+            }
+            else if (free_axe < 0)
                 free_axe = i;
             else
                 dims[i] = 1;
-        if (free_axe>=0) {
-            dims[free_axe] = arr_size/new_size;
+        if (free_axe >= 0) {
+            dims[free_axe] = arr_size / new_size;
             new_size *= dims[free_axe];
         }
         if (new_size != arr_size) {
@@ -961,22 +1037,27 @@ int check_and_fix_dimensions(const PyArrayObject* arr, const int rank, npy_intp
                          new_size, arr_size);
             return 1;
         }
-    } else if (rank==PyArray_NDIM(arr)) {
+    }
+    else if (rank == PyArray_NDIM(arr)) {
         npy_intp new_size = 1;
         int i;
         npy_intp d;
-        for (i=0; i<rank; ++i) {
-            d = PyArray_DIM(arr,i);
-            if (dims[i]>=0) {
-                if (d > 1 && d!=dims[i]) {
-                    PyErr_Format(PyExc_ValueError,
-                                 "%d-th dimension must be fixed to %"
-                                 NPY_INTP_FMT " but got %" NPY_INTP_FMT "\n",
-                                 i, dims[i], d);
+        for (i = 0; i < rank; ++i) {
+            d = PyArray_DIM(arr, i);
+            if (dims[i] >= 0) {
+                if (d > 1 && d != dims[i]) {
+                    PyErr_Format(
+                            PyExc_ValueError,
+                            "%d-th dimension must be fixed to %" NPY_INTP_FMT
+                            " but got %" NPY_INTP_FMT "\n",
+                            i, dims[i], d);
                     return 1;
                 }
-                if (!dims[i]) dims[i] = 1;
-            } else dims[i] = d;
+                if (!dims[i])
+                    dims[i] = 1;
+            }
+            else
+                dims[i] = d;
             new_size *= dims[i];
         }
         if (new_size != arr_size) {
@@ -986,15 +1067,17 @@ int check_and_fix_dimensions(const PyArrayObject* arr, const int rank, npy_intp
                          new_size, arr_size);
             return 1;
         }
-    } else { /* [[1,2]] -> [[1],[2]] */
-        int i,j;
+    }
+    else { /* [[1,2]] -> [[1],[2]] */
+        int i, j;
         npy_intp d;
         int effrank;
         npy_intp size;
-        for (i=0,effrank=0;i<PyArray_NDIM(arr);++i)
-            if (PyArray_DIM(arr,i)>1) ++effrank;
-        if (dims[rank-1]>=0)
-            if (effrank>rank) {
+        for (i = 0, effrank = 0; i < PyArray_NDIM(arr); ++i)
+            if (PyArray_DIM(arr, i) > 1)
+                ++effrank;
+        if (dims[rank - 1] >= 0)
+            if (effrank > rank) {
                 PyErr_Format(PyExc_ValueError,
                              "too many axes: %d (effrank=%d), "
                              "expected rank=%d\n",
@@ -1002,31 +1085,38 @@ int check_and_fix_dimensions(const PyArrayObject* arr, const int rank, npy_intp
                 return 1;
             }
 
-        for (i=0,j=0;i<rank;++i) {
-            while (j<PyArray_NDIM(arr) && PyArray_DIM(arr,j)<2) ++j;
-            if (j>=PyArray_NDIM(arr)) d = 1;
-            else d = PyArray_DIM(arr,j++);
-            if (dims[i]>=0) {
-                if (d>1 && d!=dims[i]) {
-                    PyErr_Format(PyExc_ValueError,
-                                 "%d-th dimension must be fixed to %"
-                                 NPY_INTP_FMT " but got %" NPY_INTP_FMT
-                                 " (real index=%d)\n",
-                                 i, dims[i], d, j-1);
+        for (i = 0, j = 0; i < rank; ++i) {
+            while (j < PyArray_NDIM(arr) && PyArray_DIM(arr, j) < 2) ++j;
+            if (j >= PyArray_NDIM(arr))
+                d = 1;
+            else
+                d = PyArray_DIM(arr, j++);
+            if (dims[i] >= 0) {
+                if (d > 1 && d != dims[i]) {
+                    PyErr_Format(
+                            PyExc_ValueError,
+                            "%d-th dimension must be fixed to %" NPY_INTP_FMT
+                            " but got %" NPY_INTP_FMT " (real index=%d)\n",
+                            i, dims[i], d, j - 1);
                     return 1;
                 }
-                if (!dims[i]) dims[i] = 1;
-            } else
+                if (!dims[i])
+                    dims[i] = 1;
+            }
+            else
                 dims[i] = d;
         }
 
-        for (i=rank;i<PyArray_NDIM(arr);++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */
-            while (j<PyArray_NDIM(arr) && PyArray_DIM(arr,j)<2) ++j;
-            if (j>=PyArray_NDIM(arr)) d = 1;
-            else d = PyArray_DIM(arr,j++);
-            dims[rank-1] *= d;
+        for (i = rank; i < PyArray_NDIM(arr);
+             ++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */
+            while (j < PyArray_NDIM(arr) && PyArray_DIM(arr, j) < 2) ++j;
+            if (j >= PyArray_NDIM(arr))
+                d = 1;
+            else
+                d = PyArray_DIM(arr, j++);
+            dims[rank - 1] *= d;
         }
-        for (i=0,size=1;i<rank;++i) size *= dims[i];
+        for (i = 0, size = 1; i < rank; ++i) size *= dims[i];
         if (size != arr_size) {
             char msg[200];
             int len;
@@ -1037,15 +1127,15 @@ int check_and_fix_dimensions(const PyArrayObject* arr, const int rank, npy_intp
                      size, arr_size, rank, effrank, PyArray_NDIM(arr));
             for (i = 0; i < rank; ++i) {
                 len = strlen(msg);
-                snprintf(msg + len, sizeof(msg) - len,
-                         " %" NPY_INTP_FMT, dims[i]);
+                snprintf(msg + len, sizeof(msg) - len, " %" NPY_INTP_FMT,
+                         dims[i]);
             }
             len = strlen(msg);
             snprintf(msg + len, sizeof(msg) - len, " ], arr.dims=[");
             for (i = 0; i < PyArray_NDIM(arr); ++i) {
                 len = strlen(msg);
-                snprintf(msg + len, sizeof(msg) - len,
-                         " %" NPY_INTP_FMT, PyArray_DIM(arr, i));
+                snprintf(msg + len, sizeof(msg) - len, " %" NPY_INTP_FMT,
+                         PyArray_DIM(arr, i));
             }
             len = strlen(msg);
             snprintf(msg + len, sizeof(msg) - len, " ]\n");
@@ -1055,7 +1145,7 @@ int check_and_fix_dimensions(const PyArrayObject* arr, const int rank, npy_intp
     }
 #ifdef DEBUG_COPY_ND_ARRAY
     printf("check_and_fix_dimensions:end: dims=");
-    dump_dims(rank,dims);
+    dump_dims(rank, dims);
 #endif
     return 0;
 }
@@ -1064,8 +1154,8 @@ int check_and_fix_dimensions(const PyArrayObject* arr, const int rank, npy_intp
 
 /************************* copy_ND_array *******************************/
 
-extern
-int copy_ND_array(const PyArrayObject *arr, PyArrayObject *out)
+extern int
+copy_ND_array(const PyArrayObject *arr, PyArrayObject *out)
 {
     F2PY_REPORT_ON_ARRAY_COPY_FROMARR;
     return PyArray_CopyInto(out, (PyArrayObject *)arr);
index d4cc10243d4f451bb80344989e46937b6f86cc1a..a1e9fdbdfbac7a5ff74f78e7db0fd528880052b1 100644 (file)
@@ -4,7 +4,7 @@
 extern "C" {
 #endif
 
-#include "Python.h"
+#include <Python.h>
 
 #ifdef FORTRANOBJECT_C
 #define NO_IMPORT_ARRAY
@@ -13,18 +13,19 @@ extern "C" {
 #include "numpy/arrayobject.h"
 #include "numpy/npy_3kcompat.h"
 
-
 #ifdef F2PY_REPORT_ATEXIT
 #include <sys/timeb.h>
-  extern void f2py_start_clock(void);
-  extern void f2py_stop_clock(void);
-  extern void f2py_start_call_clock(void);
-  extern void f2py_stop_call_clock(void);
-  extern void f2py_cb_start_clock(void);
-  extern void f2py_cb_stop_clock(void);
-  extern void f2py_cb_start_call_clock(void);
-  extern void f2py_cb_stop_call_clock(void);
-  extern void f2py_report_on_exit(int,void*);
+// clang-format off
+extern void f2py_start_clock(void);
+extern void f2py_stop_clock(void);
+extern void f2py_start_call_clock(void);
+extern void f2py_stop_call_clock(void);
+extern void f2py_cb_start_clock(void);
+extern void f2py_cb_stop_clock(void);
+extern void f2py_cb_start_call_clock(void);
+extern void f2py_cb_stop_call_clock(void);
+extern void f2py_report_on_exit(int, void *);
+// clang-format on
 #endif
 
 #ifdef DMALLOC
@@ -44,50 +45,60 @@ Author: Pearu Peterson <pearu@cens.ioc.ee>
 
 #define F2PY_MAX_DIMS 40
 
-typedef void (*f2py_set_data_func)(char*,npy_intp*);
+typedef void (*f2py_set_data_func)(char *, npy_intp *);
 typedef void (*f2py_void_func)(void);
-typedef void (*f2py_init_func)(int*,npy_intp*,f2py_set_data_func,int*);
+typedef void (*f2py_init_func)(int *, npy_intp *, f2py_set_data_func, int *);
 
-  /*typedef void* (*f2py_c_func)(void*,...);*/
+/*typedef void* (*f2py_c_func)(void*,...);*/
 
 typedef void *(*f2pycfunc)(void);
 
 typedef struct {
-  char *name;                /* attribute (array||routine) name */
-  int rank;                  /* array rank, 0 for scalar, max is F2PY_MAX_DIMS,
-                                || rank=-1 for Fortran routine */
-  struct {npy_intp d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */
-  int type;                  /* PyArray_<type> || not used */
-  char *data;                /* pointer to array || Fortran routine */
-  f2py_init_func func;       /* initialization function for
-                                allocatable arrays:
-                                func(&rank,dims,set_ptr_func,name,len(name))
-                                || C/API wrapper for Fortran routine */
-  char *doc;                 /* documentation string; only recommended
-                                for routines. */
+    char *name; /* attribute (array||routine) name */
+    int rank;   /* array rank, 0 for scalar, max is F2PY_MAX_DIMS,
+                   || rank=-1 for Fortran routine */
+    struct {
+        npy_intp d[F2PY_MAX_DIMS];
+    } dims;              /* dimensions of the array, || not used */
+    int type;            /* PyArray_<type> || not used */
+    char *data;          /* pointer to array || Fortran routine */
+    f2py_init_func func; /* initialization function for
+                            allocatable arrays:
+                            func(&rank,dims,set_ptr_func,name,len(name))
+                            || C/API wrapper for Fortran routine */
+    char *doc;           /* documentation string; only recommended
+                            for routines. */
 } FortranDataDef;
 
 typedef struct {
-  PyObject_HEAD
-  int len;                   /* Number of attributes */
-  FortranDataDef *defs;      /* An array of FortranDataDef's */
-  PyObject       *dict;      /* Fortran object attribute dictionary */
+    PyObject_HEAD
+    int len;              /* Number of attributes */
+    FortranDataDef *defs; /* An array of FortranDataDef's */
+    PyObject *dict;       /* Fortran object attribute dictionary */
 } PyFortranObject;
 
 #define PyFortran_Check(op) (Py_TYPE(op) == &PyFortran_Type)
-#define PyFortran_Check1(op) (0==strcmp(Py_TYPE(op)->tp_name,"fortran"))
-
-  extern PyTypeObject PyFortran_Type;
-  extern int F2PyDict_SetItemString(PyObject* dict, char *name, PyObject *obj);
-  extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init);
-  extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs);
-
-PyObject * F2PyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *));
-void * F2PyCapsule_AsVoidPtr(PyObject *obj);
-int F2PyCapsule_Check(PyObject *ptr);
-
-extern void *F2PySwapThreadLocalCallbackPtr(char *key, void *ptr);
-extern void *F2PyGetThreadLocalCallbackPtr(char *key);
+#define PyFortran_Check1(op) (0 == strcmp(Py_TYPE(op)->tp_name, "fortran"))
+
+extern PyTypeObject PyFortran_Type;
+extern int
+F2PyDict_SetItemString(PyObject *dict, char *name, PyObject *obj);
+extern PyObject *
+PyFortranObject_New(FortranDataDef *defs, f2py_void_func init);
+extern PyObject *
+PyFortranObject_NewAsAttr(FortranDataDef *defs);
+
+PyObject *
+F2PyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *));
+void *
+F2PyCapsule_AsVoidPtr(PyObject *obj);
+int
+F2PyCapsule_Check(PyObject *ptr);
+
+extern void *
+F2PySwapThreadLocalCallbackPtr(char *key, void *ptr);
+extern void *
+F2PyGetThreadLocalCallbackPtr(char *key);
 
 #define ISCONTIGUOUS(m) (PyArray_FLAGS(m) & NPY_ARRAY_C_CONTIGUOUS)
 #define F2PY_INTENT_IN 1
@@ -109,23 +120,23 @@ extern void *F2PyGetThreadLocalCallbackPtr(char *key);
 #define F2PY_ALIGN16(intent) (intent & F2PY_INTENT_ALIGNED16)
 
 #define F2PY_GET_ALIGNMENT(intent) \
-        (F2PY_ALIGN4(intent) ? 4 : \
-         (F2PY_ALIGN8(intent) ? 8 : \
-          (F2PY_ALIGN16(intent) ? 16 : 1) ))
-#define F2PY_CHECK_ALIGNMENT(arr, intent) ARRAY_ISALIGNED(arr, F2PY_GET_ALIGNMENT(intent))
-
-  extern PyArrayObject* array_from_pyobj(const int type_num,
-                                         npy_intp *dims,
-                                         const int rank,
-                                         const int intent,
-                                         PyObject *obj);
-  extern int copy_ND_array(const PyArrayObject *in, PyArrayObject *out);
+    (F2PY_ALIGN4(intent)           \
+             ? 4                   \
+             : (F2PY_ALIGN8(intent) ? 8 : (F2PY_ALIGN16(intent) ? 16 : 1)))
+#define F2PY_CHECK_ALIGNMENT(arr, intent) \
+    ARRAY_ISALIGNED(arr, F2PY_GET_ALIGNMENT(intent))
+
+extern PyArrayObject *
+array_from_pyobj(const int type_num, npy_intp *dims, const int rank,
+                 const int intent, PyObject *obj);
+extern int
+copy_ND_array(const PyArrayObject *in, PyArrayObject *out);
 
 #ifdef DEBUG_COPY_ND_ARRAY
-  extern void dump_attrs(const PyArrayObject* arr);
+extern void
+dump_attrs(const PyArrayObject *arr);
 #endif
 
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/numpy/f2py/src/test/Makefile b/numpy/f2py/src/test/Makefile
deleted file mode 100644 (file)
index 0f8869f..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- makefile -*-
-# File: Makefile-foo
-# Usage:
-#     make -f Makefile-foo [MODE=opt|debug]
-# Notes:
-# 1) You must use GNU make; try `gmake ..' if `make' fails.
-# 2) This file is auto-generated with f2py (version 2.264).
-#    f2py is a Fortran to Python Interface Generator (FPIG), Second Edition,
-#    written by Pearu Peterson <pearu@ioc.ee>.
-#    See http://cens.ioc.ee/projects/f2py2e/
-#    Generation date: Wed Sep 13 16:22:55 2000
-#    $Revision: 1.2 $
-#    $Date: 2000/09/17 16:10:27 $
-
-# Recommendation notes produced by f2py2e/buildmakefile.py:
-# *** 
-
-PYINC =  -I/numeric/include/python1.5/Numeric -I/numeric/include/python1.5
-INCLUDES = -I..
-LIBS =  -L$(shell gcc -v 2>&1 | grep specs | sed -e 's/Reading specs from //g' | sed -e 's/\/specs//g') -lg2c 
-LIBS=-L$$ABSOFT/lib -lfio -lf77math -lf90math
-LIBS=-L/numeric/bin -lvast90 -L/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2 -lg2c
-
-# Wrapper generator:
-F2PY = /home/pearu/bin/f2py-cvs
-
-# Fortran compiler: Absoft f95 
-FC = f95
-FC = f90
-FOPT = 
-FDEBUG = 
-FFLAGS = -B108 -YCFRL=1 -YCOM_NAMES=LCS -YCOM_PFX -YCOM_SFX=_ -YEXT_PFX -YEXT_NAMES=LCS
-FFLAGS = 
-# C compiler: cc ('gcc 2.x.x' 2.95.2)
-CC = cc
-COPT = 
-CDEBUG = 
-CFLAGS =  -fpic 
-
-# Linker: ld ('GNU ld' 2.9.5)
-LD = ld
-LDFLAGS = -shared -s 
-SO = .so
-
-ifeq '$(MODE)' 'debug'
-FFLAGS += $(FDEBUG)
-CFLAGS += $(CDEBUG)
-endif
-ifeq '$(MODE)' 'opt'
-FFLAGS += $(FOPT)
-CFLAGS += $(COPT)
-endif
-FFLAGS += $(INCLUDES)
-CFLAGS += $(PYINC) $(INCLUDES)
-
-SRCC = ../fortranobject.c
-SRCF = mod.f90 bar.f foo90.f90 wrap.f
-SRCS = $(SRCC) $(SRCF)
-OBJC = $(filter %.o,$(SRCC:.c=.o) $(SRCC:.cc=.o) $(SRCC:.C=.o))
-OBJF = $(filter %.o,$(SRCF:.f90=.o) $(SRCF:.f=.o) $(SRCF:.F=.o) $(SRCF:.for=.o))
-OBJS = $(OBJC) $(OBJF)
-
-INSTALLNAME = f2py2e-apps
-INSTALLDIRECTORY = /numeric/lib/python1.5/site-packages/$(INSTALLNAME)
-INSTALLDIR = install -d -c
-INSTALLEXEC = install -m 755 -c
-
-all: foo
-
-foo: foomodule$(SO)
-foomodule$(SO) : foomodule.o $(OBJS)
-       $(LD) $(LDFLAGS) -o $@ $< $(OBJS) $(LIBS)
-
-foomodule.o: foomodule.c
-
-
-$(OBJS) : $(SRCS)
-%.o : %.f ; $(FC) -c $(FFLAGS) $< 
-%.o : %.f90 ; $(FC) -c $(FFLAGS) $< 
-
-test: foomodule$(SO)
-       python -c 'import foo;print foo.__doc__'
-install: foomodule$(SO)
-       $(INSTALLDIR) $(INSTALLDIRECTORY)
-       $(INSTALLEXEC) foomodule$(SO) $(INSTALLDIRECTORY)
-       cd $(INSTALLDIRECTORY) && echo "$(INSTALLNAME)" > ../$(INSTALLNAME).pth
-
-.PHONY: clean distclean debug test install foo
-debug:
-       echo "OBJS=$(OBJS)"
-       echo "SRCS=$(SRCS)"
-clean:
-       $(RM) *.o *.mod core foomodule.{dvi,log} $(OBJS)
-distclean: clean
-       $(RM) *.so *.sl foomodule.{tex,so}
-       $(RM) .f2py_get_compiler_*
diff --git a/numpy/f2py/src/test/bar.f b/numpy/f2py/src/test/bar.f
deleted file mode 100644 (file)
index 5354cea..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-      subroutine bar()
-      integer a
-      real*8 b,c(3)
-      common /foodata/ a,b,c
-      a = 4
-      b = 6.7
-      c(2) = 3.0
-      write(*,*) "bar:a=",a
-      write(*,*) "bar:b=",b
-      write(*,*) "bar:c=",c
-      end
diff --git a/numpy/f2py/src/test/foo.f b/numpy/f2py/src/test/foo.f
deleted file mode 100644 (file)
index 5354cea..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-      subroutine bar()
-      integer a
-      real*8 b,c(3)
-      common /foodata/ a,b,c
-      a = 4
-      b = 6.7
-      c(2) = 3.0
-      write(*,*) "bar:a=",a
-      write(*,*) "bar:b=",b
-      write(*,*) "bar:c=",c
-      end
diff --git a/numpy/f2py/src/test/foo90.f90 b/numpy/f2py/src/test/foo90.f90
deleted file mode 100644 (file)
index dbca7e9..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-subroutine foo()
-  integer a
-  real*8 b,c(3)
-  common /foodata/ a,b,c
-  print*, "   F: in foo"
-  a = 5
-  b = 6.3
-  c(2) = 9.1
-end subroutine foo
-
-
-
-
diff --git a/numpy/f2py/src/test/foomodule.c b/numpy/f2py/src/test/foomodule.c
deleted file mode 100644 (file)
index 88ec624..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/* File: foomodule.c
- * Example of FortranObject usage. See also wrap.f foo.f foo90.f90.
- * Author: Pearu Peterson <pearu@ioc.ee>.
- * http://cens.ioc.ee/projects/f2py2e/
- * $Revision: 1.2 $
- * $Date: 2000/09/17 16:10:27 $
- */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "Python.h"
-#include "fortranobject.h"
-
-static PyObject *foo_error;
-
-#if defined(NO_APPEND_FORTRAN)
-#if defined(UPPERCASE_FORTRAN)
-#define F_FUNC(f,F) F
-#else
-#define F_FUNC(f,F) f
-#endif
-#else
-#if defined(UPPERCASE_FORTRAN)
-#define F_FUNC(f,F) F##_
-#else
-#define F_FUNC(f,F) f##_
-#endif
-#endif
-
-/************* foo_bar *************/
-static char doc_foo_bar[] = "\
-Function signature:\n\
-  bar()\n\
-";
-static PyObject *foo_bar(PyObject *capi_self, PyObject *capi_args,
-                         PyObject *capi_keywds, void (*f2py_func)()) {
-    PyObject *capi_buildvalue = NULL;
-    static char *capi_kwlist[] = {NULL};
-    if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\
-                                     "|:foo.bar",\
-                                     capi_kwlist))
-        goto capi_fail;
-    (*f2py_func)();
-    capi_buildvalue = Py_BuildValue("");
- capi_fail:
-    return capi_buildvalue;
-}
-/************ mod_init **************/
-static PyObject *mod_init(PyObject *capi_self, PyObject *capi_args,
-                          PyObject *capi_keywds, void (*f2py_func)()) {
-    PyObject *capi_buildvalue = NULL;
-    static char *capi_kwlist[] = {NULL};
-    if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\
-                                     "|:mod.init",\
-                                     capi_kwlist))
-        goto capi_fail;
-    (*f2py_func)();
-    capi_buildvalue = Py_BuildValue("");
- capi_fail:
-    return capi_buildvalue;
-}
-
-/* F90 module */
-static FortranDataDef f2py_mod_def[] = {
-    {"a",0, {}, NPY_INT},
-    {"b",0, {}, NPY_DOUBLE},
-    {"c",1, {3}, NPY_DOUBLE},
-    {"d",1, {-1}, NPY_DOUBLE},
-    {"init",-1,{},0,NULL,(void *)mod_init},
-    {NULL}
-};
-static void f2py_setup_mod(char *a,char *b,char *c,void (*d)(),char *init) {
-    f2py_mod_def[0].data = a;
-    f2py_mod_def[1].data = b;
-    f2py_mod_def[2].data = c;
-    f2py_mod_def[3].func = d;
-    f2py_mod_def[4].data = init;
-}
-extern void F_FUNC(f2pyinitmod,F2PYINITMOD)();
-                                           static void f2py_init_mod() {
-                                               F_FUNC(f2pyinitmod,F2PYINITMOD)(f2py_setup_mod);
-                                           }
-
-/* COMMON block */
-static FortranDataDef f2py_foodata_def[] = {
-    {"a",0, {}, NPY_INT},
-    {"b",0, {}, NPY_DOUBLE},
-    {"c",1, {3}, NPY_DOUBLE},
-    {NULL}
-};
-static void f2py_setup_foodata(char *a,char *b,char *c) {
-    f2py_foodata_def[0].data = a;
-    f2py_foodata_def[1].data = b;
-    f2py_foodata_def[2].data = c;
-}
-extern void F_FUNC(f2pyinitfoodata,F2PYINITFOODATA)();
-                                                   static void f2py_init_foodata() {
-                                                       F_FUNC(f2pyinitfoodata,F2PYINITFOODATA)(f2py_setup_foodata);
-                                                   }
-
-/* Fortran routines (needs no initialization/setup function) */
-extern void F_FUNC(bar,BAR)();
-                           extern void F_FUNC(foo,FOO)();
-                                                      static FortranDataDef f2py_routines_def[] = {
-                                                          {"bar",-1, {}, 0, (char *)F_FUNC(bar,BAR),(void *)foo_bar,doc_foo_bar},
-                                                          {"foo",-1, {}, 0, (char *)F_FUNC(foo,FOO),(void *)foo_bar,doc_foo_bar},
-                                                          {NULL}
-                                                      };
-
-static PyMethodDef foo_module_methods[] = {
-    /*eof method*/
-    {NULL,NULL}
-};
-
-void initfoo() {
-    int i;
-    PyObject *m, *d, *s, *tmp;
-    import_array();
-
-    m = Py_InitModule("foo", foo_module_methods);
-
-    d = PyModule_GetDict(m);
-    s = PyUnicode_FromString("This module 'foo' demonstrates the usage of fortranobject.");
-    PyDict_SetItemString(d, "__doc__", s);
-
-    /* Fortran objects: */
-    tmp = PyFortranObject_New(f2py_mod_def,f2py_init_mod);
-    PyDict_SetItemString(d, "mod", tmp);
-    Py_DECREF(tmp);
-    tmp = PyFortranObject_New(f2py_foodata_def,f2py_init_foodata);
-    PyDict_SetItemString(d, "foodata", tmp);
-    Py_DECREF(tmp);
-    for(i=0;f2py_routines_def[i].name!=NULL;i++) {
-        tmp = PyFortranObject_NewAsAttr(&f2py_routines_def[i]);
-        PyDict_SetItemString(d, f2py_routines_def[i].name, tmp);
-        Py_DECREF(tmp);
-    }
-
-    Py_DECREF(s);
-
-    if (PyErr_Occurred())
-        Py_FatalError("can't initialize module foo");
-}
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/numpy/f2py/src/test/wrap.f b/numpy/f2py/src/test/wrap.f
deleted file mode 100644 (file)
index 9414eb9..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-      subroutine f2py_mod_get_dims(f2py_r,f2py_s,f2py_set,f2py_n)
-      use mod
-      external f2py_set
-      logical f2py_ns
-      integer f2py_s(*),f2py_r,f2py_i,f2py_j
-      character*(*) f2py_n
-      if ("d".eq.f2py_n) then
-         f2py_ns = .FALSE.
-         if (allocated(d)) then
-            do f2py_i=1,f2py_r
-               if ((size(d,f2py_r-f2py_i+1).ne.f2py_s(f2py_i)).and.
-     c          (f2py_s(f2py_i).ge.0)) then
-                  f2py_ns = .TRUE.
-               end if
-            end do
-            if (f2py_ns) then
-               deallocate(d)
-            end if
-         end if
-         if (.not.allocated(d)) then
-            allocate(d(f2py_s(1)))
-         end if
-         if (allocated(d)) then
-            do f2py_i=1,f2py_r
-               f2py_s(f2py_i) = size(d,f2py_r-f2py_i+1)
-            end do
-            call f2py_set(d)
-         end if
-      end if
-      end subroutine f2py_mod_get_dims
-      subroutine f2py_mod_get_dims_d(r,s,set_data)
-      use mod, only: d => d
-      external set_data
-      logical ns
-      integer s(*),r,i,j
-      ns = .FALSE.
-      if (allocated(d)) then
-         do i=1,r
-            if ((size(d,r-i+1).ne.s(i)).and.(s(i).ge.0)) then
-               ns = .TRUE.
-            end if
-         end do
-         if (ns) then 
-            deallocate(d) 
-         end if
-      end if
-      if (.not.allocated(d).and.(s(1).ge.1)) then
-         allocate(d(s(1)))
-      end if
-      if (allocated(d)) then
-         do i=1,r
-            s(i) = size(d,r-i+1)
-         end do
-      end if
-      call set_data(d,allocated(d))
-      end subroutine f2py_mod_get_dims_d
-
-      subroutine f2pyinitmod(setupfunc)
-      use mod
-      external setupfunc,f2py_mod_get_dims_d,init
-      call setupfunc(a,b,c,f2py_mod_get_dims_d,init)
-      end subroutine f2pyinitmod
-
-      subroutine f2pyinitfoodata(setupfunc)
-      external setupfunc
-      integer a
-      real*8 b,c(3)
-      common /foodata/ a,b,c
-      call setupfunc(a,b,c)
-      end subroutine f2pyinitfoodata
diff --git a/numpy/f2py/symbolic.py b/numpy/f2py/symbolic.py
new file mode 100644 (file)
index 0000000..1b7b354
--- /dev/null
@@ -0,0 +1,1510 @@
+"""Fortran/C symbolic expressions
+
+References:
+- J3/21-007: Draft Fortran 202x. https://j3-fortran.org/doc/year/21/21-007.pdf
+"""
+
+# To analyze Fortran expressions to solve dimensions specifications,
+# for instances, we implement a minimal symbolic engine for parsing
+# expressions into a tree of expression instances. As a first
+# instance, we care only about arithmetic expressions involving
+# integers and operations like addition (+), subtraction (-),
+# multiplication (*), division (Fortran / is Python //, Fortran // is
+# concatenate), and exponentiation (**).  In addition, .pyf files may
+# contain C expressions that support here is implemented as well.
+#
+# TODO: support logical constants (Op.BOOLEAN)
+# TODO: support logical operators (.AND., ...)
+# TODO: support defined operators (.MYOP., ...)
+#
+__all__ = ['Expr']
+
+
+import re
+import warnings
+from enum import Enum
+from math import gcd
+
+
+class Language(Enum):
+    """
+    Used as Expr.tostring language argument.
+    """
+    Python = 0
+    Fortran = 1
+    C = 2
+
+
+class Op(Enum):
+    """
+    Used as Expr op attribute.
+    """
+    INTEGER = 10
+    REAL = 12
+    COMPLEX = 15
+    STRING = 20
+    ARRAY = 30
+    SYMBOL = 40
+    TERNARY = 100
+    APPLY = 200
+    INDEXING = 210
+    CONCAT = 220
+    RELATIONAL = 300
+    TERMS = 1000
+    FACTORS = 2000
+    REF = 3000
+    DEREF = 3001
+
+
+class RelOp(Enum):
+    """
+    Used in Op.RELATIONAL expression to specify the function part.
+    """
+    EQ = 1
+    NE = 2
+    LT = 3
+    LE = 4
+    GT = 5
+    GE = 6
+
+    @classmethod
+    def fromstring(cls, s, language=Language.C):
+        if language is Language.Fortran:
+            return {'.eq.': RelOp.EQ, '.ne.': RelOp.NE,
+                    '.lt.': RelOp.LT, '.le.': RelOp.LE,
+                    '.gt.': RelOp.GT, '.ge.': RelOp.GE}[s.lower()]
+        return {'==': RelOp.EQ, '!=': RelOp.NE, '<': RelOp.LT,
+                '<=': RelOp.LE, '>': RelOp.GT, '>=': RelOp.GE}[s]
+
+    def tostring(self, language=Language.C):
+        if language is Language.Fortran:
+            return {RelOp.EQ: '.eq.', RelOp.NE: '.ne.',
+                    RelOp.LT: '.lt.', RelOp.LE: '.le.',
+                    RelOp.GT: '.gt.', RelOp.GE: '.ge.'}[self]
+        return {RelOp.EQ: '==', RelOp.NE: '!=',
+                RelOp.LT: '<', RelOp.LE: '<=',
+                RelOp.GT: '>', RelOp.GE: '>='}[self]
+
+
+class ArithOp(Enum):
+    """
+    Used in Op.APPLY expression to specify the function part.
+    """
+    POS = 1
+    NEG = 2
+    ADD = 3
+    SUB = 4
+    MUL = 5
+    DIV = 6
+    POW = 7
+
+
+class OpError(Exception):
+    pass
+
+
+class Precedence(Enum):
+    """
+    Used as Expr.tostring precedence argument.
+    """
+    ATOM = 0
+    POWER = 1
+    UNARY = 2
+    PRODUCT = 3
+    SUM = 4
+    LT = 6
+    EQ = 7
+    LAND = 11
+    LOR = 12
+    TERNARY = 13
+    ASSIGN = 14
+    TUPLE = 15
+    NONE = 100
+
+
+integer_types = (int,)
+number_types = (int, float)
+
+
+def _pairs_add(d, k, v):
+    # Internal utility method for updating terms and factors data.
+    c = d.get(k)
+    if c is None:
+        d[k] = v
+    else:
+        c = c + v
+        if c:
+            d[k] = c
+        else:
+            del d[k]
+
+
+class ExprWarning(UserWarning):
+    pass
+
+
+def ewarn(message):
+    warnings.warn(message, ExprWarning, stacklevel=2)
+
+
+class Expr:
+    """Represents a Fortran expression as a op-data pair.
+
+    Expr instances are hashable and sortable.
+    """
+
+    @staticmethod
+    def parse(s, language=Language.C):
+        """Parse a Fortran expression to a Expr.
+        """
+        return fromstring(s, language=language)
+
+    def __init__(self, op, data):
+        assert isinstance(op, Op)
+
+        # sanity checks
+        if op is Op.INTEGER:
+            # data is a 2-tuple of numeric object and a kind value
+            # (default is 4)
+            assert isinstance(data, tuple) and len(data) == 2
+            assert isinstance(data[0], int)
+            assert isinstance(data[1], (int, str)), data
+        elif op is Op.REAL:
+            # data is a 2-tuple of numeric object and a kind value
+            # (default is 4)
+            assert isinstance(data, tuple) and len(data) == 2
+            assert isinstance(data[0], float)
+            assert isinstance(data[1], (int, str)), data
+        elif op is Op.COMPLEX:
+            # data is a 2-tuple of constant expressions
+            assert isinstance(data, tuple) and len(data) == 2
+        elif op is Op.STRING:
+            # data is a 2-tuple of quoted string and a kind value
+            # (default is 1)
+            assert isinstance(data, tuple) and len(data) == 2
+            assert (isinstance(data[0], str)
+                    and data[0][::len(data[0])-1] in ('""', "''", '@@'))
+            assert isinstance(data[1], (int, str)), data
+        elif op is Op.SYMBOL:
+            # data is any hashable object
+            assert hash(data) is not None
+        elif op in (Op.ARRAY, Op.CONCAT):
+            # data is a tuple of expressions
+            assert isinstance(data, tuple)
+            assert all(isinstance(item, Expr) for item in data), data
+        elif op in (Op.TERMS, Op.FACTORS):
+            # data is {<term|base>:<coeff|exponent>} where dict values
+            # are nonzero Python integers
+            assert isinstance(data, dict)
+        elif op is Op.APPLY:
+            # data is (<function>, <operands>, <kwoperands>) where
+            # operands are Expr instances
+            assert isinstance(data, tuple) and len(data) == 3
+            # function is any hashable object
+            assert hash(data[0]) is not None
+            assert isinstance(data[1], tuple)
+            assert isinstance(data[2], dict)
+        elif op is Op.INDEXING:
+            # data is (<object>, <indices>)
+            assert isinstance(data, tuple) and len(data) == 2
+            # function is any hashable object
+            assert hash(data[0]) is not None
+        elif op is Op.TERNARY:
+            # data is (<cond>, <expr1>, <expr2>)
+            assert isinstance(data, tuple) and len(data) == 3
+        elif op in (Op.REF, Op.DEREF):
+            # data is Expr instance
+            assert isinstance(data, Expr)
+        elif op is Op.RELATIONAL:
+            # data is (<relop>, <left>, <right>)
+            assert isinstance(data, tuple) and len(data) == 3
+        else:
+            raise NotImplementedError(
+                f'unknown op or missing sanity check: {op}')
+
+        self.op = op
+        self.data = data
+
+    def __eq__(self, other):
+        return (isinstance(other, Expr)
+                and self.op is other.op
+                and self.data == other.data)
+
+    def __hash__(self):
+        if self.op in (Op.TERMS, Op.FACTORS):
+            data = tuple(sorted(self.data.items()))
+        elif self.op is Op.APPLY:
+            data = self.data[:2] + tuple(sorted(self.data[2].items()))
+        else:
+            data = self.data
+        return hash((self.op, data))
+
+    def __lt__(self, other):
+        if isinstance(other, Expr):
+            if self.op is not other.op:
+                return self.op.value < other.op.value
+            if self.op in (Op.TERMS, Op.FACTORS):
+                return (tuple(sorted(self.data.items()))
+                        < tuple(sorted(other.data.items())))
+            if self.op is Op.APPLY:
+                if self.data[:2] != other.data[:2]:
+                    return self.data[:2] < other.data[:2]
+                return tuple(sorted(self.data[2].items())) < tuple(
+                    sorted(other.data[2].items()))
+            return self.data < other.data
+        return NotImplemented
+
+    def __le__(self, other): return self == other or self < other
+
+    def __gt__(self, other): return not (self <= other)
+
+    def __ge__(self, other): return not (self < other)
+
+    def __repr__(self):
+        return f'{type(self).__name__}({self.op}, {self.data!r})'
+
+    def __str__(self):
+        return self.tostring()
+
+    def tostring(self, parent_precedence=Precedence.NONE,
+                 language=Language.Fortran):
+        """Return a string representation of Expr.
+        """
+        if self.op in (Op.INTEGER, Op.REAL):
+            precedence = (Precedence.SUM if self.data[0] < 0
+                          else Precedence.ATOM)
+            r = str(self.data[0]) + (f'_{self.data[1]}'
+                                     if self.data[1] != 4 else '')
+        elif self.op is Op.COMPLEX:
+            r = ', '.join(item.tostring(Precedence.TUPLE, language=language)
+                          for item in self.data)
+            r = '(' + r + ')'
+            precedence = Precedence.ATOM
+        elif self.op is Op.SYMBOL:
+            precedence = Precedence.ATOM
+            r = str(self.data)
+        elif self.op is Op.STRING:
+            r = self.data[0]
+            if self.data[1] != 1:
+                r = self.data[1] + '_' + r
+            precedence = Precedence.ATOM
+        elif self.op is Op.ARRAY:
+            r = ', '.join(item.tostring(Precedence.TUPLE, language=language)
+                          for item in self.data)
+            r = '[' + r + ']'
+            precedence = Precedence.ATOM
+        elif self.op is Op.TERMS:
+            terms = []
+            for term, coeff in sorted(self.data.items()):
+                if coeff < 0:
+                    op = ' - '
+                    coeff = -coeff
+                else:
+                    op = ' + '
+                if coeff == 1:
+                    term = term.tostring(Precedence.SUM, language=language)
+                else:
+                    if term == as_number(1):
+                        term = str(coeff)
+                    else:
+                        term = f'{coeff} * ' + term.tostring(
+                            Precedence.PRODUCT, language=language)
+                if terms:
+                    terms.append(op)
+                elif op == ' - ':
+                    terms.append('-')
+                terms.append(term)
+            r = ''.join(terms) or '0'
+            precedence = Precedence.SUM if terms else Precedence.ATOM
+        elif self.op is Op.FACTORS:
+            factors = []
+            tail = []
+            for base, exp in sorted(self.data.items()):
+                op = ' * '
+                if exp == 1:
+                    factor = base.tostring(Precedence.PRODUCT,
+                                           language=language)
+                elif language is Language.C:
+                    if exp in range(2, 10):
+                        factor = base.tostring(Precedence.PRODUCT,
+                                               language=language)
+                        factor = ' * '.join([factor] * exp)
+                    elif exp in range(-10, 0):
+                        factor = base.tostring(Precedence.PRODUCT,
+                                               language=language)
+                        tail += [factor] * -exp
+                        continue
+                    else:
+                        factor = base.tostring(Precedence.TUPLE,
+                                               language=language)
+                        factor = f'pow({factor}, {exp})'
+                else:
+                    factor = base.tostring(Precedence.POWER,
+                                           language=language) + f' ** {exp}'
+                if factors:
+                    factors.append(op)
+                factors.append(factor)
+            if tail:
+                if not factors:
+                    factors += ['1']
+                factors += ['/', '(', ' * '.join(tail), ')']
+            r = ''.join(factors) or '1'
+            precedence = Precedence.PRODUCT if factors else Precedence.ATOM
+        elif self.op is Op.APPLY:
+            name, args, kwargs = self.data
+            if name is ArithOp.DIV and language is Language.C:
+                numer, denom = [arg.tostring(Precedence.PRODUCT,
+                                             language=language)
+                                for arg in args]
+                r = f'{numer} / {denom}'
+                precedence = Precedence.PRODUCT
+            else:
+                args = [arg.tostring(Precedence.TUPLE, language=language)
+                        for arg in args]
+                args += [k + '=' + v.tostring(Precedence.NONE)
+                         for k, v in kwargs.items()]
+                r = f'{name}({", ".join(args)})'
+                precedence = Precedence.ATOM
+        elif self.op is Op.INDEXING:
+            name = self.data[0]
+            args = [arg.tostring(Precedence.TUPLE, language=language)
+                    for arg in self.data[1:]]
+            r = f'{name}[{", ".join(args)}]'
+            precedence = Precedence.ATOM
+        elif self.op is Op.CONCAT:
+            args = [arg.tostring(Precedence.PRODUCT, language=language)
+                    for arg in self.data]
+            r = " // ".join(args)
+            precedence = Precedence.PRODUCT
+        elif self.op is Op.TERNARY:
+            cond, expr1, expr2 = [a.tostring(Precedence.TUPLE,
+                                             language=language)
+                                  for a in self.data]
+            if language is Language.C:
+                r = f'({cond} ? {expr1} : {expr2})'
+            elif language is Language.Python:
+                r = f'({expr1} if {cond} else {expr2})'
+            elif language is Language.Fortran:
+                r = f'merge({expr1}, {expr2}, {cond})'
+            else:
+                raise NotImplementedError(
+                    f'tostring for {self.op} and {language}')
+            precedence = Precedence.ATOM
+        elif self.op is Op.REF:
+            r = '&' + self.data.tostring(Precedence.UNARY, language=language)
+            precedence = Precedence.UNARY
+        elif self.op is Op.DEREF:
+            r = '*' + self.data.tostring(Precedence.UNARY, language=language)
+            precedence = Precedence.UNARY
+        elif self.op is Op.RELATIONAL:
+            rop, left, right = self.data
+            precedence = (Precedence.EQ if rop in (RelOp.EQ, RelOp.NE)
+                          else Precedence.LT)
+            left = left.tostring(precedence, language=language)
+            right = right.tostring(precedence, language=language)
+            rop = rop.tostring(language=language)
+            r = f'{left} {rop} {right}'
+        else:
+            raise NotImplementedError(f'tostring for op {self.op}')
+        if parent_precedence.value < precedence.value:
+            # If parent precedence is higher than operand precedence,
+            # operand will be enclosed in parenthesis.
+            return '(' + r + ')'
+        return r
+
+    def __pos__(self):
+        return self
+
+    def __neg__(self):
+        return self * -1
+
+    def __add__(self, other):
+        other = as_expr(other)
+        if isinstance(other, Expr):
+            if self.op is other.op:
+                if self.op in (Op.INTEGER, Op.REAL):
+                    return as_number(
+                        self.data[0] + other.data[0],
+                        max(self.data[1], other.data[1]))
+                if self.op is Op.COMPLEX:
+                    r1, i1 = self.data
+                    r2, i2 = other.data
+                    return as_complex(r1 + r2, i1 + i2)
+                if self.op is Op.TERMS:
+                    r = Expr(self.op, dict(self.data))
+                    for k, v in other.data.items():
+                        _pairs_add(r.data, k, v)
+                    return normalize(r)
+            if self.op is Op.COMPLEX and other.op in (Op.INTEGER, Op.REAL):
+                return self + as_complex(other)
+            elif self.op in (Op.INTEGER, Op.REAL) and other.op is Op.COMPLEX:
+                return as_complex(self) + other
+            elif self.op is Op.REAL and other.op is Op.INTEGER:
+                return self + as_real(other, kind=self.data[1])
+            elif self.op is Op.INTEGER and other.op is Op.REAL:
+                return as_real(self, kind=other.data[1]) + other
+            return as_terms(self) + as_terms(other)
+        return NotImplemented
+
+    def __radd__(self, other):
+        if isinstance(other, number_types):
+            return as_number(other) + self
+        return NotImplemented
+
+    def __sub__(self, other):
+        return self + (-other)
+
+    def __rsub__(self, other):
+        if isinstance(other, number_types):
+            return as_number(other) - self
+        return NotImplemented
+
+    def __mul__(self, other):
+        other = as_expr(other)
+        if isinstance(other, Expr):
+            if self.op is other.op:
+                if self.op in (Op.INTEGER, Op.REAL):
+                    return as_number(self.data[0] * other.data[0],
+                                     max(self.data[1], other.data[1]))
+                elif self.op is Op.COMPLEX:
+                    r1, i1 = self.data
+                    r2, i2 = other.data
+                    return as_complex(r1 * r2 - i1 * i2, r1 * i2 + r2 * i1)
+
+                if self.op is Op.FACTORS:
+                    r = Expr(self.op, dict(self.data))
+                    for k, v in other.data.items():
+                        _pairs_add(r.data, k, v)
+                    return normalize(r)
+                elif self.op is Op.TERMS:
+                    r = Expr(self.op, {})
+                    for t1, c1 in self.data.items():
+                        for t2, c2 in other.data.items():
+                            _pairs_add(r.data, t1 * t2, c1 * c2)
+                    return normalize(r)
+
+            if self.op is Op.COMPLEX and other.op in (Op.INTEGER, Op.REAL):
+                return self * as_complex(other)
+            elif other.op is Op.COMPLEX and self.op in (Op.INTEGER, Op.REAL):
+                return as_complex(self) * other
+            elif self.op is Op.REAL and other.op is Op.INTEGER:
+                return self * as_real(other, kind=self.data[1])
+            elif self.op is Op.INTEGER and other.op is Op.REAL:
+                return as_real(self, kind=other.data[1]) * other
+
+            if self.op is Op.TERMS:
+                return self * as_terms(other)
+            elif other.op is Op.TERMS:
+                return as_terms(self) * other
+
+            return as_factors(self) * as_factors(other)
+        return NotImplemented
+
+    def __rmul__(self, other):
+        if isinstance(other, number_types):
+            return as_number(other) * self
+        return NotImplemented
+
+    def __pow__(self, other):
+        other = as_expr(other)
+        if isinstance(other, Expr):
+            if other.op is Op.INTEGER:
+                exponent = other.data[0]
+                # TODO: other kind not used
+                if exponent == 0:
+                    return as_number(1)
+                if exponent == 1:
+                    return self
+                if exponent > 0:
+                    if self.op is Op.FACTORS:
+                        r = Expr(self.op, {})
+                        for k, v in self.data.items():
+                            r.data[k] = v * exponent
+                        return normalize(r)
+                    return self * (self ** (exponent - 1))
+                elif exponent != -1:
+                    return (self ** (-exponent)) ** -1
+                return Expr(Op.FACTORS, {self: exponent})
+            return as_apply(ArithOp.POW, self, other)
+        return NotImplemented
+
+    def __truediv__(self, other):
+        other = as_expr(other)
+        if isinstance(other, Expr):
+            # Fortran / is different from Python /:
+            # - `/` is a truncate operation for integer operands
+            return normalize(as_apply(ArithOp.DIV, self, other))
+        return NotImplemented
+
+    def __rtruediv__(self, other):
+        other = as_expr(other)
+        if isinstance(other, Expr):
+            return other / self
+        return NotImplemented
+
+    def __floordiv__(self, other):
+        other = as_expr(other)
+        if isinstance(other, Expr):
+            # Fortran // is different from Python //:
+            # - `//` is a concatenate operation for string operands
+            return normalize(Expr(Op.CONCAT, (self, other)))
+        return NotImplemented
+
+    def __rfloordiv__(self, other):
+        other = as_expr(other)
+        if isinstance(other, Expr):
+            return other // self
+        return NotImplemented
+
+    def __call__(self, *args, **kwargs):
+        # In Fortran, parenthesis () are use for both function call as
+        # well as indexing operations.
+        #
+        # TODO: implement a method for deciding when __call__ should
+        # return an INDEXING expression.
+        return as_apply(self, *map(as_expr, args),
+                        **dict((k, as_expr(v)) for k, v in kwargs.items()))
+
+    def __getitem__(self, index):
+        # Provided to support C indexing operations that .pyf files
+        # may contain.
+        index = as_expr(index)
+        if not isinstance(index, tuple):
+            index = index,
+        if len(index) > 1:
+            ewarn(f'C-index should be a single expression but got `{index}`')
+        return Expr(Op.INDEXING, (self,) + index)
+
+    def substitute(self, symbols_map):
+        """Recursively substitute symbols with values in symbols map.
+
+        Symbols map is a dictionary of symbol-expression pairs.
+        """
+        if self.op is Op.SYMBOL:
+            value = symbols_map.get(self)
+            if value is None:
+                return self
+            m = re.match(r'\A(@__f2py_PARENTHESIS_(\w+)_\d+@)\Z', self.data)
+            if m:
+                # complement to fromstring method
+                items, paren = m.groups()
+                if paren in ['ROUNDDIV', 'SQUARE']:
+                    return as_array(value)
+                assert paren == 'ROUND', (paren, value)
+            return value
+        if self.op in (Op.INTEGER, Op.REAL, Op.STRING):
+            return self
+        if self.op in (Op.ARRAY, Op.COMPLEX):
+            return Expr(self.op, tuple(item.substitute(symbols_map)
+                                       for item in self.data))
+        if self.op is Op.CONCAT:
+            return normalize(Expr(self.op, tuple(item.substitute(symbols_map)
+                                                 for item in self.data)))
+        if self.op is Op.TERMS:
+            r = None
+            for term, coeff in self.data.items():
+                if r is None:
+                    r = term.substitute(symbols_map) * coeff
+                else:
+                    r += term.substitute(symbols_map) * coeff
+            if r is None:
+                ewarn('substitute: empty TERMS expression interpreted as'
+                      ' int-literal 0')
+                return as_number(0)
+            return r
+        if self.op is Op.FACTORS:
+            r = None
+            for base, exponent in self.data.items():
+                if r is None:
+                    r = base.substitute(symbols_map) ** exponent
+                else:
+                    r *= base.substitute(symbols_map) ** exponent
+            if r is None:
+                ewarn('substitute: empty FACTORS expression interpreted'
+                      ' as int-literal 1')
+                return as_number(1)
+            return r
+        if self.op is Op.APPLY:
+            target, args, kwargs = self.data
+            if isinstance(target, Expr):
+                target = target.substitute(symbols_map)
+            args = tuple(a.substitute(symbols_map) for a in args)
+            kwargs = dict((k, v.substitute(symbols_map))
+                          for k, v in kwargs.items())
+            return normalize(Expr(self.op, (target, args, kwargs)))
+        if self.op is Op.INDEXING:
+            func = self.data[0]
+            if isinstance(func, Expr):
+                func = func.substitute(symbols_map)
+            args = tuple(a.substitute(symbols_map) for a in self.data[1:])
+            return normalize(Expr(self.op, (func,) + args))
+        if self.op is Op.TERNARY:
+            operands = tuple(a.substitute(symbols_map) for a in self.data)
+            return normalize(Expr(self.op, operands))
+        if self.op in (Op.REF, Op.DEREF):
+            return normalize(Expr(self.op, self.data.substitute(symbols_map)))
+        if self.op is Op.RELATIONAL:
+            rop, left, right = self.data
+            left = left.substitute(symbols_map)
+            right = right.substitute(symbols_map)
+            return normalize(Expr(self.op, (rop, left, right)))
+        raise NotImplementedError(f'substitute method for {self.op}: {self!r}')
+
+    def traverse(self, visit, *args, **kwargs):
+        """Traverse expression tree with visit function.
+
+        The visit function is applied to an expression with given args
+        and kwargs.
+
+        Traverse call returns an expression returned by visit when not
+        None, otherwise return a new normalized expression with
+        traverse-visit sub-expressions.
+        """
+        result = visit(self, *args, **kwargs)
+        if result is not None:
+            return result
+
+        if self.op in (Op.INTEGER, Op.REAL, Op.STRING, Op.SYMBOL):
+            return self
+        elif self.op in (Op.COMPLEX, Op.ARRAY, Op.CONCAT, Op.TERNARY):
+            return normalize(Expr(self.op, tuple(
+                item.traverse(visit, *args, **kwargs)
+                for item in self.data)))
+        elif self.op in (Op.TERMS, Op.FACTORS):
+            data = {}
+            for k, v in self.data.items():
+                k = k.traverse(visit, *args, **kwargs)
+                v = (v.traverse(visit, *args, **kwargs)
+                     if isinstance(v, Expr) else v)
+                if k in data:
+                    v = data[k] + v
+                data[k] = v
+            return normalize(Expr(self.op, data))
+        elif self.op is Op.APPLY:
+            obj = self.data[0]
+            func = (obj.traverse(visit, *args, **kwargs)
+                    if isinstance(obj, Expr) else obj)
+            operands = tuple(operand.traverse(visit, *args, **kwargs)
+                             for operand in self.data[1])
+            kwoperands = dict((k, v.traverse(visit, *args, **kwargs))
+                              for k, v in self.data[2].items())
+            return normalize(Expr(self.op, (func, operands, kwoperands)))
+        elif self.op is Op.INDEXING:
+            obj = self.data[0]
+            obj = (obj.traverse(visit, *args, **kwargs)
+                   if isinstance(obj, Expr) else obj)
+            indices = tuple(index.traverse(visit, *args, **kwargs)
+                            for index in self.data[1:])
+            return normalize(Expr(self.op, (obj,) + indices))
+        elif self.op in (Op.REF, Op.DEREF):
+            return normalize(Expr(self.op,
+                                  self.data.traverse(visit, *args, **kwargs)))
+        elif self.op is Op.RELATIONAL:
+            rop, left, right = self.data
+            left = left.traverse(visit, *args, **kwargs)
+            right = right.traverse(visit, *args, **kwargs)
+            return normalize(Expr(self.op, (rop, left, right)))
+        raise NotImplementedError(f'traverse method for {self.op}')
+
+    def contains(self, other):
+        """Check if self contains other.
+        """
+        found = []
+
+        def visit(expr, found=found):
+            if found:
+                return expr
+            elif expr == other:
+                found.append(1)
+                return expr
+
+        self.traverse(visit)
+
+        return len(found) != 0
+
+    def symbols(self):
+        """Return a set of symbols contained in self.
+        """
+        found = set()
+
+        def visit(expr, found=found):
+            if expr.op is Op.SYMBOL:
+                found.add(expr)
+
+        self.traverse(visit)
+
+        return found
+
+    def polynomial_atoms(self):
+        """Return a set of expressions used as atoms in polynomial self.
+        """
+        found = set()
+
+        def visit(expr, found=found):
+            if expr.op is Op.FACTORS:
+                for b in expr.data:
+                    b.traverse(visit)
+                return expr
+            if expr.op in (Op.TERMS, Op.COMPLEX):
+                return
+            if expr.op is Op.APPLY and isinstance(expr.data[0], ArithOp):
+                if expr.data[0] is ArithOp.POW:
+                    expr.data[1][0].traverse(visit)
+                    return expr
+                return
+            if expr.op in (Op.INTEGER, Op.REAL):
+                return expr
+
+            found.add(expr)
+
+            if expr.op in (Op.INDEXING, Op.APPLY):
+                return expr
+
+        self.traverse(visit)
+
+        return found
+
+    def linear_solve(self, symbol):
+        """Return a, b such that a * symbol + b == self.
+
+        If self is not linear with respect to symbol, raise RuntimeError.
+        """
+        b = self.substitute({symbol: as_number(0)})
+        ax = self - b
+        a = ax.substitute({symbol: as_number(1)})
+
+        zero, _ = as_numer_denom(a * symbol - ax)
+
+        if zero != as_number(0):
+            raise RuntimeError(f'not a {symbol}-linear equation:'
+                               f' {a} * {symbol} + {b} == {self}')
+        return a, b
+
+
+def normalize(obj):
+    """Normalize Expr and apply basic evaluation methods.
+    """
+    if not isinstance(obj, Expr):
+        return obj
+
+    if obj.op is Op.TERMS:
+        d = {}
+        for t, c in obj.data.items():
+            if c == 0:
+                continue
+            if t.op is Op.COMPLEX and c != 1:
+                t = t * c
+                c = 1
+            if t.op is Op.TERMS:
+                for t1, c1 in t.data.items():
+                    _pairs_add(d, t1, c1 * c)
+            else:
+                _pairs_add(d, t, c)
+        if len(d) == 0:
+            # TODO: deterimine correct kind
+            return as_number(0)
+        elif len(d) == 1:
+            (t, c), = d.items()
+            if c == 1:
+                return t
+        return Expr(Op.TERMS, d)
+
+    if obj.op is Op.FACTORS:
+        coeff = 1
+        d = {}
+        for b, e in obj.data.items():
+            if e == 0:
+                continue
+            if b.op is Op.TERMS and isinstance(e, integer_types) and e > 1:
+                # expand integer powers of sums
+                b = b * (b ** (e - 1))
+                e = 1
+
+            if b.op in (Op.INTEGER, Op.REAL):
+                if e == 1:
+                    coeff *= b.data[0]
+                elif e > 0:
+                    coeff *= b.data[0] ** e
+                else:
+                    _pairs_add(d, b, e)
+            elif b.op is Op.FACTORS:
+                if e > 0 and isinstance(e, integer_types):
+                    for b1, e1 in b.data.items():
+                        _pairs_add(d, b1, e1 * e)
+                else:
+                    _pairs_add(d, b, e)
+            else:
+                _pairs_add(d, b, e)
+        if len(d) == 0 or coeff == 0:
+            # TODO: deterimine correct kind
+            assert isinstance(coeff, number_types)
+            return as_number(coeff)
+        elif len(d) == 1:
+            (b, e), = d.items()
+            if e == 1:
+                t = b
+            else:
+                t = Expr(Op.FACTORS, d)
+            if coeff == 1:
+                return t
+            return Expr(Op.TERMS, {t: coeff})
+        elif coeff == 1:
+            return Expr(Op.FACTORS, d)
+        else:
+            return Expr(Op.TERMS, {Expr(Op.FACTORS, d): coeff})
+
+    if obj.op is Op.APPLY and obj.data[0] is ArithOp.DIV:
+        dividend, divisor = obj.data[1]
+        t1, c1 = as_term_coeff(dividend)
+        t2, c2 = as_term_coeff(divisor)
+        if isinstance(c1, integer_types) and isinstance(c2, integer_types):
+            g = gcd(c1, c2)
+            c1, c2 = c1//g, c2//g
+        else:
+            c1, c2 = c1/c2, 1
+
+        if t1.op is Op.APPLY and t1.data[0] is ArithOp.DIV:
+            numer = t1.data[1][0] * c1
+            denom = t1.data[1][1] * t2 * c2
+            return as_apply(ArithOp.DIV, numer, denom)
+
+        if t2.op is Op.APPLY and t2.data[0] is ArithOp.DIV:
+            numer = t2.data[1][1] * t1 * c1
+            denom = t2.data[1][0] * c2
+            return as_apply(ArithOp.DIV, numer, denom)
+
+        d = dict(as_factors(t1).data)
+        for b, e in as_factors(t2).data.items():
+            _pairs_add(d, b, -e)
+        numer, denom = {}, {}
+        for b, e in d.items():
+            if e > 0:
+                numer[b] = e
+            else:
+                denom[b] = -e
+        numer = normalize(Expr(Op.FACTORS, numer)) * c1
+        denom = normalize(Expr(Op.FACTORS, denom)) * c2
+
+        if denom.op in (Op.INTEGER, Op.REAL) and denom.data[0] == 1:
+            # TODO: denom kind not used
+            return numer
+        return as_apply(ArithOp.DIV, numer, denom)
+
+    if obj.op is Op.CONCAT:
+        lst = [obj.data[0]]
+        for s in obj.data[1:]:
+            last = lst[-1]
+            if (
+                    last.op is Op.STRING
+                    and s.op is Op.STRING
+                    and last.data[0][0] in '"\''
+                    and s.data[0][0] == last.data[0][-1]
+            ):
+                new_last = as_string(last.data[0][:-1] + s.data[0][1:],
+                                     max(last.data[1], s.data[1]))
+                lst[-1] = new_last
+            else:
+                lst.append(s)
+        if len(lst) == 1:
+            return lst[0]
+        return Expr(Op.CONCAT, tuple(lst))
+
+    if obj.op is Op.TERNARY:
+        cond, expr1, expr2 = map(normalize, obj.data)
+        if cond.op is Op.INTEGER:
+            return expr1 if cond.data[0] else expr2
+        return Expr(Op.TERNARY, (cond, expr1, expr2))
+
+    return obj
+
+
+def as_expr(obj):
+    """Convert non-Expr objects to Expr objects.
+    """
+    if isinstance(obj, complex):
+        return as_complex(obj.real, obj.imag)
+    if isinstance(obj, number_types):
+        return as_number(obj)
+    if isinstance(obj, str):
+        # STRING expression holds string with boundary quotes, hence
+        # applying repr:
+        return as_string(repr(obj))
+    if isinstance(obj, tuple):
+        return tuple(map(as_expr, obj))
+    return obj
+
+
+def as_symbol(obj):
+    """Return object as SYMBOL expression (variable or unparsed expression).
+    """
+    return Expr(Op.SYMBOL, obj)
+
+
+def as_number(obj, kind=4):
+    """Return object as INTEGER or REAL constant.
+    """
+    if isinstance(obj, int):
+        return Expr(Op.INTEGER, (obj, kind))
+    if isinstance(obj, float):
+        return Expr(Op.REAL, (obj, kind))
+    if isinstance(obj, Expr):
+        if obj.op in (Op.INTEGER, Op.REAL):
+            return obj
+    raise OpError(f'cannot convert {obj} to INTEGER or REAL constant')
+
+
+def as_integer(obj, kind=4):
+    """Return object as INTEGER constant.
+    """
+    if isinstance(obj, int):
+        return Expr(Op.INTEGER, (obj, kind))
+    if isinstance(obj, Expr):
+        if obj.op is Op.INTEGER:
+            return obj
+    raise OpError(f'cannot convert {obj} to INTEGER constant')
+
+
+def as_real(obj, kind=4):
+    """Return object as REAL constant.
+    """
+    if isinstance(obj, int):
+        return Expr(Op.REAL, (float(obj), kind))
+    if isinstance(obj, float):
+        return Expr(Op.REAL, (obj, kind))
+    if isinstance(obj, Expr):
+        if obj.op is Op.REAL:
+            return obj
+        elif obj.op is Op.INTEGER:
+            return Expr(Op.REAL, (float(obj.data[0]), kind))
+    raise OpError(f'cannot convert {obj} to REAL constant')
+
+
+def as_string(obj, kind=1):
+    """Return object as STRING expression (string literal constant).
+    """
+    return Expr(Op.STRING, (obj, kind))
+
+
+def as_array(obj):
+    """Return object as ARRAY expression (array constant).
+    """
+    if isinstance(obj, Expr):
+        obj = obj,
+    return Expr(Op.ARRAY, obj)
+
+
+def as_complex(real, imag=0):
+    """Return object as COMPLEX expression (complex literal constant).
+    """
+    return Expr(Op.COMPLEX, (as_expr(real), as_expr(imag)))
+
+
+def as_apply(func, *args, **kwargs):
+    """Return object as APPLY expression (function call, constructor, etc.)
+    """
+    return Expr(Op.APPLY,
+                (func, tuple(map(as_expr, args)),
+                 dict((k, as_expr(v)) for k, v in kwargs.items())))
+
+
+def as_ternary(cond, expr1, expr2):
+    """Return object as TERNARY expression (cond?expr1:expr2).
+    """
+    return Expr(Op.TERNARY, (cond, expr1, expr2))
+
+
+def as_ref(expr):
+    """Return object as referencing expression.
+    """
+    return Expr(Op.REF, expr)
+
+
+def as_deref(expr):
+    """Return object as dereferencing expression.
+    """
+    return Expr(Op.DEREF, expr)
+
+
+def as_eq(left, right):
+    return Expr(Op.RELATIONAL, (RelOp.EQ, left, right))
+
+
+def as_ne(left, right):
+    return Expr(Op.RELATIONAL, (RelOp.NE, left, right))
+
+
+def as_lt(left, right):
+    return Expr(Op.RELATIONAL, (RelOp.LT, left, right))
+
+
+def as_le(left, right):
+    return Expr(Op.RELATIONAL, (RelOp.LE, left, right))
+
+
+def as_gt(left, right):
+    return Expr(Op.RELATIONAL, (RelOp.GT, left, right))
+
+
+def as_ge(left, right):
+    return Expr(Op.RELATIONAL, (RelOp.GE, left, right))
+
+
+def as_terms(obj):
+    """Return expression as TERMS expression.
+    """
+    if isinstance(obj, Expr):
+        obj = normalize(obj)
+        if obj.op is Op.TERMS:
+            return obj
+        if obj.op is Op.INTEGER:
+            return Expr(Op.TERMS, {as_integer(1, obj.data[1]): obj.data[0]})
+        if obj.op is Op.REAL:
+            return Expr(Op.TERMS, {as_real(1, obj.data[1]): obj.data[0]})
+        return Expr(Op.TERMS, {obj: 1})
+    raise OpError(f'cannot convert {type(obj)} to terms Expr')
+
+
+def as_factors(obj):
+    """Return expression as FACTORS expression.
+    """
+    if isinstance(obj, Expr):
+        obj = normalize(obj)
+        if obj.op is Op.FACTORS:
+            return obj
+        if obj.op is Op.TERMS:
+            if len(obj.data) == 1:
+                (term, coeff), = obj.data.items()
+                if coeff == 1:
+                    return Expr(Op.FACTORS, {term: 1})
+                return Expr(Op.FACTORS, {term: 1, Expr.number(coeff): 1})
+        if ((obj.op is Op.APPLY
+             and obj.data[0] is ArithOp.DIV
+             and not obj.data[2])):
+            return Expr(Op.FACTORS, {obj.data[1][0]: 1, obj.data[1][1]: -1})
+        return Expr(Op.FACTORS, {obj: 1})
+    raise OpError(f'cannot convert {type(obj)} to terms Expr')
+
+
+def as_term_coeff(obj):
+    """Return expression as term-coefficient pair.
+    """
+    if isinstance(obj, Expr):
+        obj = normalize(obj)
+        if obj.op is Op.INTEGER:
+            return as_integer(1, obj.data[1]), obj.data[0]
+        if obj.op is Op.REAL:
+            return as_real(1, obj.data[1]), obj.data[0]
+        if obj.op is Op.TERMS:
+            if len(obj.data) == 1:
+                (term, coeff), = obj.data.items()
+                return term, coeff
+            # TODO: find common divisor of coefficients
+        if obj.op is Op.APPLY and obj.data[0] is ArithOp.DIV:
+            t, c = as_term_coeff(obj.data[1][0])
+            return as_apply(ArithOp.DIV, t, obj.data[1][1]), c
+        return obj, 1
+    raise OpError(f'cannot convert {type(obj)} to term and coeff')
+
+
+def as_numer_denom(obj):
+    """Return expression as numer-denom pair.
+    """
+    if isinstance(obj, Expr):
+        obj = normalize(obj)
+        if obj.op in (Op.INTEGER, Op.REAL, Op.COMPLEX, Op.SYMBOL,
+                      Op.INDEXING, Op.TERNARY):
+            return obj, as_number(1)
+        elif obj.op is Op.APPLY:
+            if obj.data[0] is ArithOp.DIV and not obj.data[2]:
+                numers, denoms = map(as_numer_denom, obj.data[1])
+                return numers[0] * denoms[1], numers[1] * denoms[0]
+            return obj, as_number(1)
+        elif obj.op is Op.TERMS:
+            numers, denoms = [], []
+            for term, coeff in obj.data.items():
+                n, d = as_numer_denom(term)
+                n = n * coeff
+                numers.append(n)
+                denoms.append(d)
+            numer, denom = as_number(0), as_number(1)
+            for i in range(len(numers)):
+                n = numers[i]
+                for j in range(len(numers)):
+                    if i != j:
+                        n *= denoms[j]
+                numer += n
+                denom *= denoms[i]
+            if denom.op in (Op.INTEGER, Op.REAL) and denom.data[0] < 0:
+                numer, denom = -numer, -denom
+            return numer, denom
+        elif obj.op is Op.FACTORS:
+            numer, denom = as_number(1), as_number(1)
+            for b, e in obj.data.items():
+                bnumer, bdenom = as_numer_denom(b)
+                if e > 0:
+                    numer *= bnumer ** e
+                    denom *= bdenom ** e
+                elif e < 0:
+                    numer *= bdenom ** (-e)
+                    denom *= bnumer ** (-e)
+            return numer, denom
+    raise OpError(f'cannot convert {type(obj)} to numer and denom')
+
+
+def _counter():
+    # Used internally to generate unique dummy symbols
+    counter = 0
+    while True:
+        counter += 1
+        yield counter
+
+
+COUNTER = _counter()
+
+
+def eliminate_quotes(s):
+    """Replace quoted substrings of input string.
+
+    Return a new string and a mapping of replacements.
+    """
+    d = {}
+
+    def repl(m):
+        kind, value = m.groups()[:2]
+        if kind:
+            # remove trailing underscore
+            kind = kind[:-1]
+        p = {"'": "SINGLE", '"': "DOUBLE"}[value[0]]
+        k = f'{kind}@__f2py_QUOTES_{p}_{COUNTER.__next__()}@'
+        d[k] = value
+        return k
+
+    new_s = re.sub(r'({kind}_|)({single_quoted}|{double_quoted})'.format(
+        kind=r'\w[\w\d_]*',
+        single_quoted=r"('([^'\\]|(\\.))*')",
+        double_quoted=r'("([^"\\]|(\\.))*")'),
+        repl, s)
+
+    assert '"' not in new_s
+    assert "'" not in new_s
+
+    return new_s, d
+
+
+def insert_quotes(s, d):
+    """Inverse of eliminate_quotes.
+    """
+    for k, v in d.items():
+        kind = k[:k.find('@')]
+        if kind:
+            kind += '_'
+        s = s.replace(k, kind + v)
+    return s
+
+
+def replace_parenthesis(s):
+    """Replace substrings of input that are enclosed in parenthesis.
+
+    Return a new string and a mapping of replacements.
+    """
+    # Find a parenthesis pair that appears first.
+
+    # Fortran deliminator are `(`, `)`, `[`, `]`, `(/', '/)`, `/`.
+    # We don't handle `/` deliminator because it is not a part of an
+    # expression.
+    left, right = None, None
+    mn_i = len(s)
+    for left_, right_ in (('(/', '/)'),
+                          '()',
+                          '{}',  # to support C literal structs
+                          '[]'):
+        i = s.find(left_)
+        if i == -1:
+            continue
+        if i < mn_i:
+            mn_i = i
+            left, right = left_, right_
+
+    if left is None:
+        return s, {}
+
+    i = mn_i
+    j = s.find(right, i)
+
+    while s.count(left, i + 1, j) != s.count(right, i + 1, j):
+        j = s.find(right, j + 1)
+        if j == -1:
+            raise ValueError(f'Mismatch of {left+right} parenthesis in {s!r}')
+
+    p = {'(': 'ROUND', '[': 'SQUARE', '{': 'CURLY', '(/': 'ROUNDDIV'}[left]
+
+    k = f'@__f2py_PARENTHESIS_{p}_{COUNTER.__next__()}@'
+    v = s[i+len(left):j]
+    r, d = replace_parenthesis(s[j+len(right):])
+    d[k] = v
+    return s[:i] + k + r, d
+
+
+def _get_parenthesis_kind(s):
+    assert s.startswith('@__f2py_PARENTHESIS_'), s
+    return s.split('_')[4]
+
+
+def unreplace_parenthesis(s, d):
+    """Inverse of replace_parenthesis.
+    """
+    for k, v in d.items():
+        p = _get_parenthesis_kind(k)
+        left = dict(ROUND='(', SQUARE='[', CURLY='{', ROUNDDIV='(/')[p]
+        right = dict(ROUND=')', SQUARE=']', CURLY='}', ROUNDDIV='/)')[p]
+        s = s.replace(k, left + v + right)
+    return s
+
+
+def fromstring(s, language=Language.C):
+    """Create an expression from a string.
+
+    This is a "lazy" parser, that is, only arithmetic operations are
+    resolved, non-arithmetic operations are treated as symbols.
+    """
+    r = _FromStringWorker(language=language).parse(s)
+    if isinstance(r, Expr):
+        return r
+    raise ValueError(f'failed to parse `{s}` to Expr instance: got `{r}`')
+
+
+class _Pair:
+    # Internal class to represent a pair of expressions
+
+    def __init__(self, left, right):
+        self.left = left
+        self.right = right
+
+    def substitute(self, symbols_map):
+        left, right = self.left, self.right
+        if isinstance(left, Expr):
+            left = left.substitute(symbols_map)
+        if isinstance(right, Expr):
+            right = right.substitute(symbols_map)
+        return _Pair(left, right)
+
+    def __repr__(self):
+        return f'{type(self).__name__}({self.left}, {self.right})'
+
+
+class _FromStringWorker:
+
+    def __init__(self, language=Language.C):
+        self.original = None
+        self.quotes_map = None
+        self.language = language
+
+    def finalize_string(self, s):
+        return insert_quotes(s, self.quotes_map)
+
+    def parse(self, inp):
+        self.original = inp
+        unquoted, self.quotes_map = eliminate_quotes(inp)
+        return self.process(unquoted)
+
+    def process(self, s, context='expr'):
+        """Parse string within the given context.
+
+        The context may define the result in case of ambiguous
+        expressions. For instance, consider expressions `f(x, y)` and
+        `(x, y) + (a, b)` where `f` is a function and pair `(x, y)`
+        denotes complex number. Specifying context as "args" or
+        "expr", the subexpression `(x, y)` will be parse to an
+        argument list or to a complex number, respectively.
+        """
+        if isinstance(s, (list, tuple)):
+            return type(s)(self.process(s_, context) for s_ in s)
+
+        assert isinstance(s, str), (type(s), s)
+
+        # replace subexpressions in parenthesis with f2py @-names
+        r, raw_symbols_map = replace_parenthesis(s)
+        r = r.strip()
+
+        def restore(r):
+            # restores subexpressions marked with f2py @-names
+            if isinstance(r, (list, tuple)):
+                return type(r)(map(restore, r))
+            return unreplace_parenthesis(r, raw_symbols_map)
+
+        # comma-separated tuple
+        if ',' in r:
+            operands = restore(r.split(','))
+            if context == 'args':
+                return tuple(self.process(operands))
+            if context == 'expr':
+                if len(operands) == 2:
+                    # complex number literal
+                    return as_complex(*self.process(operands))
+            raise NotImplementedError(
+                f'parsing comma-separated list (context={context}): {r}')
+
+        # ternary operation
+        m = re.match(r'\A([^?]+)[?]([^:]+)[:](.+)\Z', r)
+        if m:
+            assert context == 'expr', context
+            oper, expr1, expr2 = restore(m.groups())
+            oper = self.process(oper)
+            expr1 = self.process(expr1)
+            expr2 = self.process(expr2)
+            return as_ternary(oper, expr1, expr2)
+
+        # relational expression
+        if self.language is Language.Fortran:
+            m = re.match(
+                r'\A(.+)\s*[.](eq|ne|lt|le|gt|ge)[.]\s*(.+)\Z', r, re.I)
+        else:
+            m = re.match(
+                r'\A(.+)\s*([=][=]|[!][=]|[<][=]|[<]|[>][=]|[>])\s*(.+)\Z', r)
+        if m:
+            left, rop, right = m.groups()
+            if self.language is Language.Fortran:
+                rop = '.' + rop + '.'
+            left, right = self.process(restore((left, right)))
+            rop = RelOp.fromstring(rop, language=self.language)
+            return Expr(Op.RELATIONAL, (rop, left, right))
+
+        # keyword argument
+        m = re.match(r'\A(\w[\w\d_]*)\s*[=](.*)\Z', r)
+        if m:
+            keyname, value = m.groups()
+            value = restore(value)
+            return _Pair(keyname, self.process(value))
+
+        # addition/subtraction operations
+        operands = re.split(r'((?<!\d[edED])[+-])', r)
+        if len(operands) > 1:
+            result = self.process(restore(operands[0] or '0'))
+            for op, operand in zip(operands[1::2], operands[2::2]):
+                operand = self.process(restore(operand))
+                op = op.strip()
+                if op == '+':
+                    result += operand
+                else:
+                    assert op == '-'
+                    result -= operand
+            return result
+
+        # string concatenate operation
+        if self.language is Language.Fortran and '//' in r:
+            operands = restore(r.split('//'))
+            return Expr(Op.CONCAT,
+                        tuple(self.process(operands)))
+
+        # multiplication/division operations
+        operands = re.split(r'(?<=[@\w\d_])\s*([*]|/)',
+                            (r if self.language is Language.C
+                             else r.replace('**', '@__f2py_DOUBLE_STAR@')))
+        if len(operands) > 1:
+            operands = restore(operands)
+            if self.language is not Language.C:
+                operands = [operand.replace('@__f2py_DOUBLE_STAR@', '**')
+                            for operand in operands]
+            # Expression is an arithmetic product
+            result = self.process(operands[0])
+            for op, operand in zip(operands[1::2], operands[2::2]):
+                operand = self.process(operand)
+                op = op.strip()
+                if op == '*':
+                    result *= operand
+                else:
+                    assert op == '/'
+                    result /= operand
+            return result
+
+        # referencing/dereferencing
+        if r.startswith('*') or r.startswith('&'):
+            op = {'*': Op.DEREF, '&': Op.REF}[r[0]]
+            operand = self.process(restore(r[1:]))
+            return Expr(op, operand)
+
+        # exponentiation operations
+        if self.language is not Language.C and '**' in r:
+            operands = list(reversed(restore(r.split('**'))))
+            result = self.process(operands[0])
+            for operand in operands[1:]:
+                operand = self.process(operand)
+                result = operand ** result
+            return result
+
+        # int-literal-constant
+        m = re.match(r'\A({digit_string})({kind}|)\Z'.format(
+            digit_string=r'\d+',
+            kind=r'_(\d+|\w[\w\d_]*)'), r)
+        if m:
+            value, _, kind = m.groups()
+            if kind and kind.isdigit():
+                kind = int(kind)
+            return as_integer(int(value), kind or 4)
+
+        # real-literal-constant
+        m = re.match(r'\A({significant}({exponent}|)|\d+{exponent})({kind}|)\Z'
+                     .format(
+                         significant=r'[.]\d+|\d+[.]\d*',
+                         exponent=r'[edED][+-]?\d+',
+                         kind=r'_(\d+|\w[\w\d_]*)'), r)
+        if m:
+            value, _, _, kind = m.groups()
+            if kind and kind.isdigit():
+                kind = int(kind)
+            value = value.lower()
+            if 'd' in value:
+                return as_real(float(value.replace('d', 'e')), kind or 8)
+            return as_real(float(value), kind or 4)
+
+        # string-literal-constant with kind parameter specification
+        if r in self.quotes_map:
+            kind = r[:r.find('@')]
+            return as_string(self.quotes_map[r], kind or 1)
+
+        # array constructor or literal complex constant or
+        # parenthesized expression
+        if r in raw_symbols_map:
+            paren = _get_parenthesis_kind(r)
+            items = self.process(restore(raw_symbols_map[r]),
+                                 'expr' if paren == 'ROUND' else 'args')
+            if paren == 'ROUND':
+                if isinstance(items, Expr):
+                    return items
+            if paren in ['ROUNDDIV', 'SQUARE']:
+                # Expression is a array constructor
+                if isinstance(items, Expr):
+                    items = (items,)
+                return as_array(items)
+
+        # function call/indexing
+        m = re.match(r'\A(.+)\s*(@__f2py_PARENTHESIS_(ROUND|SQUARE)_\d+@)\Z',
+                     r)
+        if m:
+            target, args, paren = m.groups()
+            target = self.process(restore(target))
+            args = self.process(restore(args)[1:-1], 'args')
+            if not isinstance(args, tuple):
+                args = args,
+            if paren == 'ROUND':
+                kwargs = dict((a.left, a.right) for a in args
+                              if isinstance(a, _Pair))
+                args = tuple(a for a in args if not isinstance(a, _Pair))
+                # Warning: this could also be Fortran indexing operation..
+                return as_apply(target, *args, **kwargs)
+            else:
+                # Expression is a C/Python indexing operation
+                # (e.g. used in .pyf files)
+                assert paren == 'SQUARE'
+                return target[args]
+
+        # Fortran standard conforming identifier
+        m = re.match(r'\A\w[\w\d_]*\Z', r)
+        if m:
+            return as_symbol(r)
+
+        # fall-back to symbol
+        r = self.finalize_string(restore(r))
+        ewarn(
+            f'fromstring: treating {r!r} as symbol (original={self.original})')
+        return as_symbol(r)
index 0411b62e020f497e4a1ba1f1abbb053e5df7ec48..ea47e05558b7db6550d589492c24cabffddee243 100644 (file)
@@ -9,7 +9,9 @@ extern "C" {
 #endif
 
 /*********************** See f2py2e/cfuncs.py: includes ***********************/
-#include "Python.h"
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
 #include "fortranobject.h"
 #include <math.h>
 
@@ -93,7 +95,7 @@ static PyObject *f2py_rout_wrap_attrs(PyObject *capi_self,
   PyObject *strides = NULL;
   char s[100];
   int i;
-  memset(s,0,100*sizeof(char));
+  memset(s,0,100);
   if (!PyArg_ParseTuple(capi_args,"O!|:wrap.attrs",
                         &PyArray_Type,&arr_capi))
     return NULL;
index 2cb429ec21d5ee8e7a8c2fd2fd316d53249f504a..5d2aab94df9a949dd6cb1dee131e756b5fee8542 100644 (file)
@@ -5,7 +5,6 @@ import pytest
 import threading
 import traceback
 import time
-import random
 
 import numpy as np
 from numpy.testing import assert_, assert_equal, IS_PYPY
@@ -107,9 +106,9 @@ cf2py  intent(out) r
         -----
         Call-back functions::
 
-          def fun(): return a
-          Return objects:
-            a : int
+            def fun(): return a
+            Return objects:
+                a : int
         """)
         assert_equal(self.module.t.__doc__, expected)
 
index d26917f0c23f5b061ecf22a6a92d9d00c8e715f7..039e085b48f822a9323a28691eeabf4f9b83ce25 100644 (file)
@@ -1,8 +1,9 @@
+import pytest
 import numpy as np
-from numpy.testing import assert_array_equal
+from numpy.testing import assert_array_equal, assert_equal
+from numpy.f2py.crackfortran import markinnerspaces
 from . import util
 from numpy.f2py import crackfortran
-import tempfile
 import textwrap
 
 
@@ -37,7 +38,9 @@ class TestNoSpace(util.F2PyTest):
         assert_array_equal(k, w + 1)
         assert self.module.t0(23) == b'2'
 
+
 class TestPublicPrivate():
+
     def test_defaultPrivate(self, tmp_path):
         f_path = tmp_path / "mod.f90"
         with f_path.open('w') as ff:
@@ -87,6 +90,7 @@ class TestPublicPrivate():
         assert 'private' not in mod['vars']['seta']['attrspec']
         assert 'public' in mod['vars']['seta']['attrspec']
 
+
 class TestExternal(util.F2PyTest):
     # issue gh-17859: add external attribute support
     code = """
@@ -116,6 +120,7 @@ class TestExternal(util.F2PyTest):
         r = self.module.external_as_attribute(incr)
         assert r == 123
 
+
 class TestCrackFortran(util.F2PyTest):
 
     suffix = '.f90'
@@ -139,3 +144,140 @@ class TestCrackFortran(util.F2PyTest):
     def test_gh2848(self):
         r = self.module.gh2848(1, 2)
         assert r == (1, 2)
+
+
+class TestMarkinnerspaces():
+    # issue #14118: markinnerspaces does not handle multiple quotations
+
+    def test_do_not_touch_normal_spaces(self):
+        test_list = ["a ", " a", "a b c", "'abcdefghij'"]
+        for i in test_list:
+            assert_equal(markinnerspaces(i), i)
+
+    def test_one_relevant_space(self):
+        assert_equal(markinnerspaces("a 'b c' \\\' \\\'"), "a 'b@_@c' \\' \\'")
+        assert_equal(markinnerspaces(r'a "b c" \" \"'), r'a "b@_@c" \" \"')
+
+    def test_ignore_inner_quotes(self):
+        assert_equal(markinnerspaces('a \'b c" " d\' e'),
+                     "a 'b@_@c\"@_@\"@_@d' e")
+        assert_equal(markinnerspaces('a "b c\' \' d" e'),
+                     "a \"b@_@c'@_@'@_@d\" e")
+
+    def test_multiple_relevant_spaces(self):
+        assert_equal(markinnerspaces("a 'b c' 'd e'"), "a 'b@_@c' 'd@_@e'")
+        assert_equal(markinnerspaces(r'a "b c" "d e"'), r'a "b@_@c" "d@_@e"')
+
+
+class TestDimSpec(util.F2PyTest):
+    """This test suite tests various expressions that are used as dimension
+    specifications.
+
+    There exists two usage cases where analyzing dimensions
+    specifications are important.
+
+    In the first case, the size of output arrays must be defined based
+    on the inputs to a Fortran function. Because Fortran supports
+    arbitrary bases for indexing, for instance, `arr(lower:upper)`,
+    f2py has to evaluate an expression `upper - lower + 1` where
+    `lower` and `upper` are arbitrary expressions of input parameters.
+    The evaluation is performed in C, so f2py has to translate Fortran
+    expressions to valid C expressions (an alternative approach is
+    that a developer specifies the corresponding C expressions in a
+    .pyf file).
+
+    In the second case, when user provides an input array with a given
+    size but some hidden parameters used in dimensions specifications
+    need to be determined based on the input array size. This is a
+    harder problem because f2py has to solve the inverse problem: find
+    a parameter `p` such that `upper(p) - lower(p) + 1` equals to the
+    size of input array. In the case when this equation cannot be
+    solved (e.g. because the input array size is wrong), raise an
+    error before calling the Fortran function (that otherwise would
+    likely crash Python process when the size of input arrays is
+    wrong). f2py currently supports this case only when the equation
+    is linear with respect to unknown parameter.
+
+    """
+
+    suffix = '.f90'
+
+    code_template = textwrap.dedent("""
+      function get_arr_size_{count}(a, n) result (length)
+        integer, intent(in) :: n
+        integer, dimension({dimspec}), intent(out) :: a
+        integer length
+        length = size(a)
+      end function
+
+      subroutine get_inv_arr_size_{count}(a, n)
+        integer :: n
+        ! the value of n is computed in f2py wrapper
+        !f2py intent(out) n
+        integer, dimension({dimspec}), intent(in) :: a
+        if (a({first}).gt.0) then
+          print*, "a=", a
+        endif
+      end subroutine
+    """)
+
+    linear_dimspecs = ['n', '2*n', '2:n', 'n/2', '5 - n/2', '3*n:20',
+                       'n*(n+1):n*(n+5)']
+    nonlinear_dimspecs = ['2*n:3*n*n+2*n']
+    all_dimspecs = linear_dimspecs + nonlinear_dimspecs
+
+    code = ''
+    for count, dimspec in enumerate(all_dimspecs):
+        code += code_template.format(
+            count=count, dimspec=dimspec,
+            first=dimspec.split(':')[0] if ':' in dimspec else '1')
+
+    @pytest.mark.parametrize('dimspec', all_dimspecs)
+    def test_array_size(self, dimspec):
+
+        count = self.all_dimspecs.index(dimspec)
+        get_arr_size = getattr(self.module, f'get_arr_size_{count}')
+
+        for n in [1, 2, 3, 4, 5]:
+            sz, a = get_arr_size(n)
+            assert len(a) == sz
+
+    @pytest.mark.parametrize('dimspec', all_dimspecs)
+    def test_inv_array_size(self, dimspec):
+
+        count = self.all_dimspecs.index(dimspec)
+        get_arr_size = getattr(self.module, f'get_arr_size_{count}')
+        get_inv_arr_size = getattr(self.module, f'get_inv_arr_size_{count}')
+
+        for n in [1, 2, 3, 4, 5]:
+            sz, a = get_arr_size(n)
+            if dimspec in self.nonlinear_dimspecs:
+                # one must specify n as input, the call we'll ensure
+                # that a and n are compatible:
+                n1 = get_inv_arr_size(a, n)
+            else:
+                # in case of linear dependence, n can be determined
+                # from the shape of a:
+                n1 = get_inv_arr_size(a)
+            # n1 may be different from n (for instance, when `a` size
+            # is a function of some `n` fraction) but it must produce
+            # the same sized array
+            sz1, _ = get_arr_size(n1)
+            assert sz == sz1, (n, n1, sz, sz1)
+
+
+class TestModuleDeclaration():
+    def test_dependencies(self, tmp_path):
+        f_path = tmp_path / "mod.f90"
+        with f_path.open('w') as ff:
+            ff.write(textwrap.dedent("""\
+            module foo
+              type bar
+                character(len = 4) :: text
+              end type bar
+              type(bar), parameter :: abar = bar('abar')
+            end module foo
+            """))
+        mod = crackfortran.crackfortran([str(f_path)])
+        assert len(mod) == 1
+        assert mod[0]['vars']['abar']['='] == "bar('abar')"
index 429e69bb4a24ae6c5c4e3ce77172927f0b6372f8..2c999ed0b071c1ed0718bb860b43f3cb0dbc9dcc 100644 (file)
@@ -21,11 +21,11 @@ class TestReturnCharacter(util.F2PyTest):
             #assert_(_raises(ValueError, t, array([77,87])))
             #assert_(_raises(ValueError, t, array(77)))
         elif tname in ['ts', 'ss']:
-            assert_(t(23) == b'23        ', repr(t(23)))
+            assert_(t(23) == b'23', repr(t(23)))
             assert_(t('123456789abcdef') == b'123456789a')
         elif tname in ['t5', 's5']:
-            assert_(t(23) == b'23   ', repr(t(23)))
-            assert_(t('ab') == b'ab   ', repr(t('ab')))
+            assert_(t(23) == b'23', repr(t(23)))
+            assert_(t('ab') == b'ab', repr(t('ab')))
             assert_(t('123456789abcdef') == b'12345')
         else:
             raise NotImplementedError
@@ -80,7 +80,7 @@ cf2py    intent(out) ts
        end
     """
 
-    @pytest.mark.xfail(IS_S390X, reason="calback returns ' '")
+    @pytest.mark.xfail(IS_S390X, reason="callback returns ' '")
     @pytest.mark.parametrize('name', 't0,t1,t5,s0,s1,s5,ss'.split(','))
     def test_all(self, name):
         self.check_function(getattr(self.module, name), name)
@@ -139,7 +139,7 @@ module f90_return_char
 end module f90_return_char
     """
 
-    @pytest.mark.xfail(IS_S390X, reason="calback returns ' '")
+    @pytest.mark.xfail(IS_S390X, reason="callback returns ' '")
     @pytest.mark.parametrize('name', 't0,t1,t5,ts,s0,s1,s5,ss'.split(','))
     def test_all(self, name):
         self.check_function(getattr(self.module.f90_return_char, name), name)
index e3ec96af9ff41743d222ddd15e3d082d997bdd6c..7b27f8786ed6fb1a01f61c2d74ff2f241c5100b1 100644 (file)
@@ -1,6 +1,6 @@
 import os
 import pytest
-
+import textwrap
 from numpy.testing import assert_array_equal
 import numpy as np
 from . import util
@@ -9,14 +9,158 @@ from . import util
 def _path(*a):
     return os.path.join(*((os.path.dirname(__file__),) + a))
 
+
 class TestString(util.F2PyTest):
     sources = [_path('src', 'string', 'char.f90')]
 
     @pytest.mark.slow
     def test_char(self):
         strings = np.array(['ab', 'cd', 'ef'], dtype='c').T
-        inp, out = self.module.char_test.change_strings(strings, strings.shape[1])
+        inp, out = self.module.char_test.change_strings(strings,
+                                                        strings.shape[1])
         assert_array_equal(inp, strings)
         expected = strings.copy()
         expected[1, :] = 'AAA'
         assert_array_equal(out, expected)
+
+
+class TestDocStringArguments(util.F2PyTest):
+    suffix = '.f'
+
+    code = """
+C FILE: STRING.F
+      SUBROUTINE FOO(A,B,C,D)
+      CHARACTER*5 A, B
+      CHARACTER*(*) C,D
+Cf2py intent(in) a,c
+Cf2py intent(inout) b,d
+      PRINT*, "A=",A
+      PRINT*, "B=",B
+      PRINT*, "C=",C
+      PRINT*, "D=",D
+      PRINT*, "CHANGE A,B,C,D"
+      A(1:1) = 'A'
+      B(1:1) = 'B'
+      C(1:1) = 'C'
+      D(1:1) = 'D'
+      PRINT*, "A=",A
+      PRINT*, "B=",B
+      PRINT*, "C=",C
+      PRINT*, "D=",D
+      END
+C END OF FILE STRING.F
+        """
+
+    def test_example(self):
+        a = np.array(b'123\0\0')
+        b = np.array(b'123\0\0')
+        c = np.array(b'123')
+        d = np.array(b'123')
+
+        self.module.foo(a, b, c, d)
+
+        assert a.tobytes() == b'123\0\0'
+        assert b.tobytes() == b'B23\0\0', (b.tobytes(),)
+        assert c.tobytes() == b'123'
+        assert d.tobytes() == b'D23'
+
+
+class TestFixedString(util.F2PyTest):
+    suffix = '.f90'
+
+    code = textwrap.dedent("""
+       function sint(s) result(i)
+          implicit none
+          character(len=*) :: s
+          integer :: j, i
+          i = 0
+          do j=len(s), 1, -1
+           if (.not.((i.eq.0).and.(s(j:j).eq.' '))) then
+             i = i + ichar(s(j:j)) * 10 ** (j - 1)
+           endif
+          end do
+          return
+        end function sint
+
+        function test_in_bytes4(a) result (i)
+          implicit none
+          integer :: sint
+          character(len=4) :: a
+          integer :: i
+          i = sint(a)
+          a(1:1) = 'A'
+          return
+        end function test_in_bytes4
+
+        function test_inout_bytes4(a) result (i)
+          implicit none
+          integer :: sint
+          character(len=4), intent(inout) :: a
+          integer :: i
+          if (a(1:1).ne.' ') then
+            a(1:1) = 'E'
+          endif
+          i = sint(a)
+          return
+        end function test_inout_bytes4
+        """)
+
+    @staticmethod
+    def _sint(s, start=0, end=None):
+        """Return the content of a string buffer as integer value.
+
+        For example:
+          _sint('1234') -> 4321
+          _sint('123A') -> 17321
+        """
+        if isinstance(s, np.ndarray):
+            s = s.tobytes()
+        elif isinstance(s, str):
+            s = s.encode()
+        assert isinstance(s, bytes)
+        if end is None:
+            end = len(s)
+        i = 0
+        for j in range(start, min(end, len(s))):
+            i += s[j] * 10 ** j
+        return i
+
+    def _get_input(self, intent='in'):
+        if intent in ['in']:
+            yield ''
+            yield '1'
+            yield '1234'
+            yield '12345'
+            yield b''
+            yield b'\0'
+            yield b'1'
+            yield b'\01'
+            yield b'1\0'
+            yield b'1234'
+            yield b'12345'
+        yield np.ndarray((), np.bytes_, buffer=b'')  # array(b'', dtype='|S0')
+        yield np.array(b'')                          # array(b'', dtype='|S1')
+        yield np.array(b'\0')
+        yield np.array(b'1')
+        yield np.array(b'1\0')
+        yield np.array(b'\01')
+        yield np.array(b'1234')
+        yield np.array(b'123\0')
+        yield np.array(b'12345')
+
+    def test_intent_in(self):
+        for s in self._get_input():
+            r = self.module.test_in_bytes4(s)
+            # also checks that s is not changed inplace
+            expected = self._sint(s, end=4)
+            assert r == expected, (s)
+
+    def test_intent_inout(self):
+        for s in self._get_input(intent='inout'):
+            rest = self._sint(s, start=4)
+            r = self.module.test_inout_bytes4(s)
+            expected = self._sint(s, end=4)
+            assert r == expected
+
+            # check that the rest of input string is preserved
+            assert rest == self._sint(s, start=4)
diff --git a/numpy/f2py/tests/test_symbolic.py b/numpy/f2py/tests/test_symbolic.py
new file mode 100644 (file)
index 0000000..52cabac
--- /dev/null
@@ -0,0 +1,462 @@
+from numpy.testing import assert_raises
+from numpy.f2py.symbolic import (
+    Expr, Op, ArithOp, Language,
+    as_symbol, as_number, as_string, as_array, as_complex,
+    as_terms, as_factors, eliminate_quotes, insert_quotes,
+    fromstring, as_expr, as_apply,
+    as_numer_denom, as_ternary, as_ref, as_deref,
+    normalize, as_eq, as_ne, as_lt, as_gt, as_le, as_ge
+    )
+from . import util
+
+
+class TestSymbolic(util.F2PyTest):
+
+    def test_eliminate_quotes(self):
+        def worker(s):
+            r, d = eliminate_quotes(s)
+            s1 = insert_quotes(r, d)
+            assert s1 == s
+
+        for kind in ['', 'mykind_']:
+            worker(kind + '"1234" // "ABCD"')
+            worker(kind + '"1234" // ' + kind + '"ABCD"')
+            worker(kind + '"1234" // \'ABCD\'')
+            worker(kind + '"1234" // ' + kind + '\'ABCD\'')
+            worker(kind + '"1\\"2\'AB\'34"')
+            worker('a = ' + kind + "'1\\'2\"AB\"34'")
+
+    def test_sanity(self):
+        x = as_symbol('x')
+        y = as_symbol('y')
+        z = as_symbol('z')
+
+        assert x.op == Op.SYMBOL
+        assert repr(x) == "Expr(Op.SYMBOL, 'x')"
+        assert x == x
+        assert x != y
+        assert hash(x) is not None
+
+        n = as_number(123)
+        m = as_number(456)
+        assert n.op == Op.INTEGER
+        assert repr(n) == "Expr(Op.INTEGER, (123, 4))"
+        assert n == n
+        assert n != m
+        assert hash(n) is not None
+
+        fn = as_number(12.3)
+        fm = as_number(45.6)
+        assert fn.op == Op.REAL
+        assert repr(fn) == "Expr(Op.REAL, (12.3, 4))"
+        assert fn == fn
+        assert fn != fm
+        assert hash(fn) is not None
+
+        c = as_complex(1, 2)
+        c2 = as_complex(3, 4)
+        assert c.op == Op.COMPLEX
+        assert repr(c) == ("Expr(Op.COMPLEX, (Expr(Op.INTEGER, (1, 4)),"
+                           " Expr(Op.INTEGER, (2, 4))))")
+        assert c == c
+        assert c != c2
+        assert hash(c) is not None
+
+        s = as_string("'123'")
+        s2 = as_string('"ABC"')
+        assert s.op == Op.STRING
+        assert repr(s) == "Expr(Op.STRING, (\"'123'\", 1))", repr(s)
+        assert s == s
+        assert s != s2
+
+        a = as_array((n, m))
+        b = as_array((n,))
+        assert a.op == Op.ARRAY
+        assert repr(a) == ("Expr(Op.ARRAY, (Expr(Op.INTEGER, (123, 4)),"
+                           " Expr(Op.INTEGER, (456, 4))))")
+        assert a == a
+        assert a != b
+
+        t = as_terms(x)
+        u = as_terms(y)
+        assert t.op == Op.TERMS
+        assert repr(t) == "Expr(Op.TERMS, {Expr(Op.SYMBOL, 'x'): 1})"
+        assert t == t
+        assert t != u
+        assert hash(t) is not None
+
+        v = as_factors(x)
+        w = as_factors(y)
+        assert v.op == Op.FACTORS
+        assert repr(v) == "Expr(Op.FACTORS, {Expr(Op.SYMBOL, 'x'): 1})"
+        assert v == v
+        assert w != v
+        assert hash(v) is not None
+
+        t = as_ternary(x, y, z)
+        u = as_ternary(x, z, y)
+        assert t.op == Op.TERNARY
+        assert t == t
+        assert t != u
+        assert hash(t) is not None
+
+        e = as_eq(x, y)
+        f = as_lt(x, y)
+        assert e.op == Op.RELATIONAL
+        assert e == e
+        assert e != f
+        assert hash(e) is not None
+
+    def test_tostring_fortran(self):
+        x = as_symbol('x')
+        y = as_symbol('y')
+        z = as_symbol('z')
+        n = as_number(123)
+        m = as_number(456)
+        a = as_array((n, m))
+        c = as_complex(n, m)
+
+        assert str(x) == 'x'
+        assert str(n) == '123'
+        assert str(a) == '[123, 456]'
+        assert str(c) == '(123, 456)'
+
+        assert str(Expr(Op.TERMS, {x: 1})) == 'x'
+        assert str(Expr(Op.TERMS, {x: 2})) == '2 * x'
+        assert str(Expr(Op.TERMS, {x: -1})) == '-x'
+        assert str(Expr(Op.TERMS, {x: -2})) == '-2 * x'
+        assert str(Expr(Op.TERMS, {x: 1, y: 1})) == 'x + y'
+        assert str(Expr(Op.TERMS, {x: -1, y: -1})) == '-x - y'
+        assert str(Expr(Op.TERMS, {x: 2, y: 3})) == '2 * x + 3 * y'
+        assert str(Expr(Op.TERMS, {x: -2, y: 3})) == '-2 * x + 3 * y'
+        assert str(Expr(Op.TERMS, {x: 2, y: -3})) == '2 * x - 3 * y'
+
+        assert str(Expr(Op.FACTORS, {x: 1})) == 'x'
+        assert str(Expr(Op.FACTORS, {x: 2})) == 'x ** 2'
+        assert str(Expr(Op.FACTORS, {x: -1})) == 'x ** -1'
+        assert str(Expr(Op.FACTORS, {x: -2})) == 'x ** -2'
+        assert str(Expr(Op.FACTORS, {x: 1, y: 1})) == 'x * y'
+        assert str(Expr(Op.FACTORS, {x: 2, y: 3})) == 'x ** 2 * y ** 3'
+
+        v = Expr(Op.FACTORS, {x: 2, Expr(Op.TERMS, {x: 1, y: 1}): 3})
+        assert str(v) == 'x ** 2 * (x + y) ** 3', str(v)
+        v = Expr(Op.FACTORS, {x: 2, Expr(Op.FACTORS, {x: 1, y: 1}): 3})
+        assert str(v) == 'x ** 2 * (x * y) ** 3', str(v)
+
+        assert str(Expr(Op.APPLY, ('f', (), {}))) == 'f()'
+        assert str(Expr(Op.APPLY, ('f', (x,), {}))) == 'f(x)'
+        assert str(Expr(Op.APPLY, ('f', (x, y), {}))) == 'f(x, y)'
+        assert str(Expr(Op.INDEXING, ('f', x))) == 'f[x]'
+
+        assert str(as_ternary(x, y, z)) == 'merge(y, z, x)'
+        assert str(as_eq(x, y)) == 'x .eq. y'
+        assert str(as_ne(x, y)) == 'x .ne. y'
+        assert str(as_lt(x, y)) == 'x .lt. y'
+        assert str(as_le(x, y)) == 'x .le. y'
+        assert str(as_gt(x, y)) == 'x .gt. y'
+        assert str(as_ge(x, y)) == 'x .ge. y'
+
+    def test_tostring_c(self):
+        language = Language.C
+        x = as_symbol('x')
+        y = as_symbol('y')
+        z = as_symbol('z')
+        n = as_number(123)
+
+        assert Expr(Op.FACTORS, {x: 2}).tostring(language=language) == 'x * x'
+        assert Expr(Op.FACTORS, {x + y: 2}).tostring(
+            language=language) == '(x + y) * (x + y)'
+        assert Expr(Op.FACTORS, {x: 12}).tostring(
+            language=language) == 'pow(x, 12)'
+
+        assert as_apply(ArithOp.DIV, x, y).tostring(
+            language=language) == 'x / y'
+        assert as_apply(ArithOp.DIV, x, x + y).tostring(
+            language=language) == 'x / (x + y)'
+        assert as_apply(ArithOp.DIV, x - y, x + y).tostring(
+            language=language) == '(x - y) / (x + y)'
+        assert (x + (x - y) / (x + y) + n).tostring(
+            language=language) == '123 + x + (x - y) / (x + y)'
+
+        assert as_ternary(x, y, z).tostring(language=language) == '(x ? y : z)'
+        assert as_eq(x, y).tostring(language=language) == 'x == y'
+        assert as_ne(x, y).tostring(language=language) == 'x != y'
+        assert as_lt(x, y).tostring(language=language) == 'x < y'
+        assert as_le(x, y).tostring(language=language) == 'x <= y'
+        assert as_gt(x, y).tostring(language=language) == 'x > y'
+        assert as_ge(x, y).tostring(language=language) == 'x >= y'
+
+    def test_operations(self):
+        x = as_symbol('x')
+        y = as_symbol('y')
+        z = as_symbol('z')
+
+        assert x + x == Expr(Op.TERMS, {x: 2})
+        assert x - x == Expr(Op.INTEGER, (0, 4))
+        assert x + y == Expr(Op.TERMS, {x: 1, y: 1})
+        assert x - y == Expr(Op.TERMS, {x: 1, y: -1})
+        assert x * x == Expr(Op.FACTORS, {x: 2})
+        assert x * y == Expr(Op.FACTORS, {x: 1, y: 1})
+
+        assert +x == x
+        assert -x == Expr(Op.TERMS, {x: -1}), repr(-x)
+        assert 2 * x == Expr(Op.TERMS, {x: 2})
+        assert 2 + x == Expr(Op.TERMS, {x: 1, as_number(1): 2})
+        assert 2 * x + 3 * y == Expr(Op.TERMS, {x: 2, y: 3})
+        assert (x + y) * 2 == Expr(Op.TERMS, {x: 2, y: 2})
+
+        assert x ** 2 == Expr(Op.FACTORS, {x: 2})
+        assert (x + y) ** 2 == Expr(Op.TERMS,
+                                    {Expr(Op.FACTORS, {x: 2}): 1,
+                                     Expr(Op.FACTORS, {y: 2}): 1,
+                                     Expr(Op.FACTORS, {x: 1, y: 1}): 2})
+        assert (x + y) * x == x ** 2 + x * y
+        assert (x + y) ** 2 == x ** 2 + 2 * x * y + y ** 2
+        assert (x + y) ** 2 + (x - y) ** 2 == 2 * x ** 2 + 2 * y ** 2
+        assert (x + y) * z == x * z + y * z
+        assert z * (x + y) == x * z + y * z
+
+        assert (x / 2) == as_apply(ArithOp.DIV, x, as_number(2))
+        assert (2 * x / 2) == x
+        assert (3 * x / 2) == as_apply(ArithOp.DIV, 3*x, as_number(2))
+        assert (4 * x / 2) == 2 * x
+        assert (5 * x / 2) == as_apply(ArithOp.DIV, 5*x, as_number(2))
+        assert (6 * x / 2) == 3 * x
+        assert ((3*5) * x / 6) == as_apply(ArithOp.DIV, 5*x, as_number(2))
+        assert (30*x**2*y**4 / (24*x**3*y**3)) == as_apply(ArithOp.DIV,
+                                                           5*y, 4*x)
+        assert ((15 * x / 6) / 5) == as_apply(
+            ArithOp.DIV, x, as_number(2)), ((15 * x / 6) / 5)
+        assert (x / (5 / x)) == as_apply(ArithOp.DIV, x**2, as_number(5))
+
+        assert (x / 2.0) == Expr(Op.TERMS, {x: 0.5})
+
+        s = as_string('"ABC"')
+        t = as_string('"123"')
+
+        assert s // t == Expr(Op.STRING, ('"ABC123"', 1))
+        assert s // x == Expr(Op.CONCAT, (s, x))
+        assert x // s == Expr(Op.CONCAT, (x, s))
+
+        c = as_complex(1., 2.)
+        assert -c == as_complex(-1., -2.)
+        assert c + c == as_expr((1+2j)*2)
+        assert c * c == as_expr((1+2j)**2)
+
+    def test_substitute(self):
+        x = as_symbol('x')
+        y = as_symbol('y')
+        z = as_symbol('z')
+        a = as_array((x, y))
+
+        assert x.substitute({x: y}) == y
+        assert (x + y).substitute({x: z}) == y + z
+        assert (x * y).substitute({x: z}) == y * z
+        assert (x ** 4).substitute({x: z}) == z ** 4
+        assert (x / y).substitute({x: z}) == z / y
+        assert x.substitute({x: y + z}) == y + z
+        assert a.substitute({x: y + z}) == as_array((y + z, y))
+
+        assert as_ternary(x, y, z).substitute(
+            {x: y + z}) == as_ternary(y + z, y, z)
+        assert as_eq(x, y).substitute(
+            {x: y + z}) == as_eq(y + z, y)
+
+    def test_fromstring(self):
+
+        x = as_symbol('x')
+        y = as_symbol('y')
+        z = as_symbol('z')
+        f = as_symbol('f')
+        s = as_string('"ABC"')
+        t = as_string('"123"')
+        a = as_array((x, y))
+
+        assert fromstring('x') == x
+        assert fromstring('+ x') == x
+        assert fromstring('-  x') == -x
+        assert fromstring('x + y') == x + y
+        assert fromstring('x + 1') == x + 1
+        assert fromstring('x * y') == x * y
+        assert fromstring('x * 2') == x * 2
+        assert fromstring('x / y') == x / y
+        assert fromstring('x ** 2',
+                          language=Language.Python) == x ** 2
+        assert fromstring('x ** 2 ** 3',
+                          language=Language.Python) == x ** 2 ** 3
+        assert fromstring('(x + y) * z') == (x + y) * z
+
+        assert fromstring('f(x)') == f(x)
+        assert fromstring('f(x,y)') == f(x, y)
+        assert fromstring('f[x]') == f[x]
+        assert fromstring('f[x][y]') == f[x][y]
+
+        assert fromstring('"ABC"') == s
+        assert normalize(fromstring('"ABC" // "123" ',
+                                    language=Language.Fortran)) == s // t
+        assert fromstring('f("ABC")') == f(s)
+        assert fromstring('MYSTRKIND_"ABC"') == as_string('"ABC"', 'MYSTRKIND')
+
+        assert fromstring('(/x, y/)') == a, fromstring('(/x, y/)')
+        assert fromstring('f((/x, y/))') == f(a)
+        assert fromstring('(/(x+y)*z/)') == as_array(((x+y)*z,))
+
+        assert fromstring('123') == as_number(123)
+        assert fromstring('123_2') == as_number(123, 2)
+        assert fromstring('123_myintkind') == as_number(123, 'myintkind')
+
+        assert fromstring('123.0') == as_number(123.0, 4)
+        assert fromstring('123.0_4') == as_number(123.0, 4)
+        assert fromstring('123.0_8') == as_number(123.0, 8)
+        assert fromstring('123.0e0') == as_number(123.0, 4)
+        assert fromstring('123.0d0') == as_number(123.0, 8)
+        assert fromstring('123d0') == as_number(123.0, 8)
+        assert fromstring('123e-0') == as_number(123.0, 4)
+        assert fromstring('123d+0') == as_number(123.0, 8)
+        assert fromstring('123.0_myrealkind') == as_number(123.0, 'myrealkind')
+        assert fromstring('3E4') == as_number(30000.0, 4)
+
+        assert fromstring('(1, 2)') == as_complex(1, 2)
+        assert fromstring('(1e2, PI)') == as_complex(
+            as_number(100.0), as_symbol('PI'))
+
+        assert fromstring('[1, 2]') == as_array((as_number(1), as_number(2)))
+
+        assert fromstring('POINT(x, y=1)') == as_apply(
+            as_symbol('POINT'), x, y=as_number(1))
+        assert (fromstring('PERSON(name="John", age=50, shape=(/34, 23/))')
+                == as_apply(as_symbol('PERSON'),
+                            name=as_string('"John"'),
+                            age=as_number(50),
+                            shape=as_array((as_number(34), as_number(23)))))
+
+        assert fromstring('x?y:z') == as_ternary(x, y, z)
+
+        assert fromstring('*x') == as_deref(x)
+        assert fromstring('**x') == as_deref(as_deref(x))
+        assert fromstring('&x') == as_ref(x)
+        assert fromstring('(*x) * (*y)') == as_deref(x) * as_deref(y)
+        assert fromstring('(*x) * *y') == as_deref(x) * as_deref(y)
+        assert fromstring('*x * *y') == as_deref(x) * as_deref(y)
+        assert fromstring('*x**y') == as_deref(x) * as_deref(y)
+
+        assert fromstring('x == y') == as_eq(x, y)
+        assert fromstring('x != y') == as_ne(x, y)
+        assert fromstring('x < y') == as_lt(x, y)
+        assert fromstring('x > y') == as_gt(x, y)
+        assert fromstring('x <= y') == as_le(x, y)
+        assert fromstring('x >= y') == as_ge(x, y)
+
+        assert fromstring('x .eq. y', language=Language.Fortran) == as_eq(x, y)
+        assert fromstring('x .ne. y', language=Language.Fortran) == as_ne(x, y)
+        assert fromstring('x .lt. y', language=Language.Fortran) == as_lt(x, y)
+        assert fromstring('x .gt. y', language=Language.Fortran) == as_gt(x, y)
+        assert fromstring('x .le. y', language=Language.Fortran) == as_le(x, y)
+        assert fromstring('x .ge. y', language=Language.Fortran) == as_ge(x, y)
+
+    def test_traverse(self):
+        x = as_symbol('x')
+        y = as_symbol('y')
+        z = as_symbol('z')
+        f = as_symbol('f')
+
+        # Use traverse to substitute a symbol
+        def replace_visit(s, r=z):
+            if s == x:
+                return r
+
+        assert x.traverse(replace_visit) == z
+        assert y.traverse(replace_visit) == y
+        assert z.traverse(replace_visit) == z
+        assert (f(y)).traverse(replace_visit) == f(y)
+        assert (f(x)).traverse(replace_visit) == f(z)
+        assert (f[y]).traverse(replace_visit) == f[y]
+        assert (f[z]).traverse(replace_visit) == f[z]
+        assert (x + y + z).traverse(replace_visit) == (2 * z + y)
+        assert (x + f(y, x - z)).traverse(
+            replace_visit) == (z + f(y, as_number(0)))
+        assert as_eq(x, y).traverse(replace_visit) == as_eq(z, y)
+
+        # Use traverse to collect symbols, method 1
+        function_symbols = set()
+        symbols = set()
+
+        def collect_symbols(s):
+            if s.op is Op.APPLY:
+                oper = s.data[0]
+                function_symbols.add(oper)
+                if oper in symbols:
+                    symbols.remove(oper)
+            elif s.op is Op.SYMBOL and s not in function_symbols:
+                symbols.add(s)
+
+        (x + f(y, x - z)).traverse(collect_symbols)
+        assert function_symbols == {f}
+        assert symbols == {x, y, z}
+
+        # Use traverse to collect symbols, method 2
+        def collect_symbols2(expr, symbols):
+            if expr.op is Op.SYMBOL:
+                symbols.add(expr)
+
+        symbols = set()
+        (x + f(y, x - z)).traverse(collect_symbols2, symbols)
+        assert symbols == {x, y, z, f}
+
+        # Use traverse to partially collect symbols
+        def collect_symbols3(expr, symbols):
+            if expr.op is Op.APPLY:
+                # skip traversing function calls
+                return expr
+            if expr.op is Op.SYMBOL:
+                symbols.add(expr)
+
+        symbols = set()
+        (x + f(y, x - z)).traverse(collect_symbols3, symbols)
+        assert symbols == {x}
+
+    def test_linear_solve(self):
+        x = as_symbol('x')
+        y = as_symbol('y')
+        z = as_symbol('z')
+
+        assert x.linear_solve(x) == (as_number(1), as_number(0))
+        assert (x+1).linear_solve(x) == (as_number(1), as_number(1))
+        assert (2*x).linear_solve(x) == (as_number(2), as_number(0))
+        assert (2*x+3).linear_solve(x) == (as_number(2), as_number(3))
+        assert as_number(3).linear_solve(x) == (as_number(0), as_number(3))
+        assert y.linear_solve(x) == (as_number(0), y)
+        assert (y*z).linear_solve(x) == (as_number(0), y * z)
+
+        assert (x+y).linear_solve(x) == (as_number(1), y)
+        assert (z*x+y).linear_solve(x) == (z, y)
+        assert ((z+y)*x+y).linear_solve(x) == (z + y, y)
+        assert (z*y*x+y).linear_solve(x) == (z * y, y)
+
+        assert_raises(RuntimeError, lambda: (x*x).linear_solve(x))
+
+    def test_as_numer_denom(self):
+        x = as_symbol('x')
+        y = as_symbol('y')
+        n = as_number(123)
+
+        assert as_numer_denom(x) == (x, as_number(1))
+        assert as_numer_denom(x / n) == (x, n)
+        assert as_numer_denom(n / x) == (n, x)
+        assert as_numer_denom(x / y) == (x, y)
+        assert as_numer_denom(x * y) == (x * y, as_number(1))
+        assert as_numer_denom(n + x / y) == (x + n * y, y)
+        assert as_numer_denom(n + x / (y - x / n)) == (y * n ** 2, y * n - x)
+
+    def test_polynomial_atoms(self):
+        x = as_symbol('x')
+        y = as_symbol('y')
+        n = as_number(123)
+
+        assert x.polynomial_atoms() == {x}
+        assert n.polynomial_atoms() == set()
+        assert (y[x]).polynomial_atoms() == {y[x]}
+        assert (y(x)).polynomial_atoms() == {y(x)}
+        assert (y(x) + x).polynomial_atoms() == {y(x), x}
+        assert (y(x) * x[y]).polynomial_atoms() == {y(x), x[y]}
+        assert (y(x) ** x).polynomial_atoms() == {y(x)}
index d5fa76fedf2761f3a7fd87b0f9989766199df68f..1a6805e751cd56ae6e5c329ecd8c9591232d9356 100644 (file)
@@ -36,7 +36,7 @@ def _cleanup():
             pass
         try:
             shutil.rmtree(_module_dir)
-        except (IOError, OSError):
+        except OSError:
             pass
         _module_dir = None
 
@@ -242,9 +242,6 @@ def build_module_distutils(source_files, config_code, module_name, **kw):
     Build a module via distutils and import it.
 
     """
-    from numpy.distutils.misc_util import Configuration
-    from numpy.distutils.core import setup
-
     d = get_module_dir()
 
     # Copy files
index 3c191a35f8f2ff1bbcc0be4ecca03fe32a847672..510e576d38062368821445d97cd903ddf93ff161 100644 (file)
@@ -1,22 +1,31 @@
 from typing import Any, List
 
-__all__: List[str]
+from numpy._pytesttester import PytestTester
+
+from numpy.fft._pocketfft import (
+    fft as fft,
+    ifft as ifft,
+    rfft as rfft,
+    irfft as irfft,
+    hfft as hfft,
+    ihfft as ihfft,
+    rfftn as rfftn,
+    irfftn as irfftn,
+    rfft2 as rfft2,
+    irfft2 as irfft2,
+    fft2 as fft2,
+    ifft2 as ifft2,
+    fftn as fftn,
+    ifftn as ifftn,
+)
 
-def fft(a, n=..., axis=..., norm=...): ...
-def ifft(a, n=..., axis=..., norm=...): ...
-def rfft(a, n=..., axis=..., norm=...): ...
-def irfft(a, n=..., axis=..., norm=...): ...
-def hfft(a, n=..., axis=..., norm=...): ...
-def ihfft(a, n=..., axis=..., norm=...): ...
-def fftn(a, s=..., axes=..., norm=...): ...
-def ifftn(a, s=..., axes=..., norm=...): ...
-def rfftn(a, s=..., axes=..., norm=...): ...
-def irfftn(a, s=..., axes=..., norm=...): ...
-def fft2(a, s=..., axes=..., norm=...): ...
-def ifft2(a, s=..., axes=..., norm=...): ...
-def rfft2(a, s=..., axes=..., norm=...): ...
-def irfft2(a, s=..., axes=..., norm=...): ...
-def fftshift(x, axes=...): ...
-def ifftshift(x, axes=...): ...
-def fftfreq(n, d=...): ...
-def rfftfreq(n, d=...): ...
+from numpy.fft.helper import (
+    fftshift as fftshift,
+    ifftshift as ifftshift,
+    fftfreq as fftfreq,
+    rfftfreq as rfftfreq,
+)
+
+__all__: List[str]
+__path__: List[str]
+test: PytestTester
index ba9995f9725485f909a405dba3e82c14f7913c08..1eb2eba18c4676276296dc3b22474732868a95b4 100644 (file)
@@ -9,17 +9,19 @@
  *  Copyright (C) 2004-2018 Max-Planck-Society
  *  \author Martin Reinecke
  */
-
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 
-#include "Python.h"
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
 #include "numpy/arrayobject.h"
 
+#include "npy_config.h"
+
 #include <math.h>
 #include <string.h>
 #include <stdlib.h>
 
-#include "npy_config.h"
 #define restrict NPY_RESTRICT
 
 #define RALLOC(type,num) \
diff --git a/numpy/fft/_pocketfft.pyi b/numpy/fft/_pocketfft.pyi
new file mode 100644 (file)
index 0000000..86cf6a6
--- /dev/null
@@ -0,0 +1,111 @@
+from typing import (
+    Literal as L,
+    List,
+    Sequence,
+)
+
+from numpy import complex128, float64
+from numpy.typing import ArrayLike, NDArray, _ArrayLikeNumber_co
+
+_NormKind = L[None, "backward", "ortho", "forward"]
+
+__all__: List[str]
+
+def fft(
+    a: ArrayLike,
+    n: None | int = ...,
+    axis: int = ...,
+    norm: _NormKind = ...,
+) -> NDArray[complex128]: ...
+
+def ifft(
+    a: ArrayLike,
+    n: None | int = ...,
+    axis: int = ...,
+    norm: _NormKind = ...,
+) -> NDArray[complex128]: ...
+
+def rfft(
+    a: ArrayLike,
+    n: None | int = ...,
+    axis: int = ...,
+    norm: _NormKind = ...,
+) -> NDArray[complex128]: ...
+
+def irfft(
+    a: ArrayLike,
+    n: None | int = ...,
+    axis: int = ...,
+    norm: _NormKind = ...,
+) -> NDArray[float64]: ...
+
+# Input array must be compatible with `np.conjugate`
+def hfft(
+    a: _ArrayLikeNumber_co,
+    n: None | int = ...,
+    axis: int = ...,
+    norm: _NormKind = ...,
+) -> NDArray[float64]: ...
+
+def ihfft(
+    a: ArrayLike,
+    n: None | int = ...,
+    axis: int = ...,
+    norm: _NormKind = ...,
+) -> NDArray[complex128]: ...
+
+def fftn(
+    a: ArrayLike,
+    s: None | Sequence[int] = ...,
+    axes: None | Sequence[int] = ...,
+    norm: _NormKind = ...,
+) -> NDArray[complex128]: ...
+
+def ifftn(
+    a: ArrayLike,
+    s: None | Sequence[int] = ...,
+    axes: None | Sequence[int] = ...,
+    norm: _NormKind = ...,
+) -> NDArray[complex128]: ...
+
+def rfftn(
+    a: ArrayLike,
+    s: None | Sequence[int] = ...,
+    axes: None | Sequence[int] = ...,
+    norm: _NormKind = ...,
+) -> NDArray[complex128]: ...
+
+def irfftn(
+    a: ArrayLike,
+    s: None | Sequence[int] = ...,
+    axes: None | Sequence[int] = ...,
+    norm: _NormKind = ...,
+) -> NDArray[float64]: ...
+
+def fft2(
+    a: ArrayLike,
+    s: None | Sequence[int] = ...,
+    axes: None | Sequence[int] = ...,
+    norm: _NormKind = ...,
+) -> NDArray[complex128]: ...
+
+def ifft2(
+    a: ArrayLike,
+    s: None | Sequence[int] = ...,
+    axes: None | Sequence[int] = ...,
+    norm: _NormKind = ...,
+) -> NDArray[complex128]: ...
+
+def rfft2(
+    a: ArrayLike,
+    s: None | Sequence[int] = ...,
+    axes: None | Sequence[int] = ...,
+    norm: _NormKind = ...,
+) -> NDArray[complex128]: ...
+
+def irfft2(
+    a: ArrayLike,
+    s: None | Sequence[int] = ...,
+    axes: None | Sequence[int] = ...,
+    norm: _NormKind = ...,
+) -> NDArray[float64]: ...
diff --git a/numpy/fft/helper.pyi b/numpy/fft/helper.pyi
new file mode 100644 (file)
index 0000000..d75826f
--- /dev/null
@@ -0,0 +1,50 @@
+from typing import List, Any, TypeVar, overload
+
+from numpy import generic, dtype, integer, floating, complexfloating
+from numpy.typing import (
+    NDArray,
+    ArrayLike,
+    _ShapeLike,
+    _SupportsArray,
+    _FiniteNestedSequence,
+    _ArrayLikeFloat_co,
+    _ArrayLikeComplex_co,
+)
+
+_SCT = TypeVar("_SCT", bound=generic)
+
+_ArrayLike = _FiniteNestedSequence[_SupportsArray[dtype[_SCT]]]
+
+__all__: List[str]
+
+@overload
+def fftshift(x: _ArrayLike[_SCT], axes: None | _ShapeLike = ...) -> NDArray[_SCT]: ...
+@overload
+def fftshift(x: ArrayLike, axes: None | _ShapeLike = ...) -> NDArray[Any]: ...
+
+@overload
+def ifftshift(x: _ArrayLike[_SCT], axes: None | _ShapeLike = ...) -> NDArray[_SCT]: ...
+@overload
+def ifftshift(x: ArrayLike, axes: None | _ShapeLike = ...) -> NDArray[Any]: ...
+
+@overload
+def fftfreq(
+    n: int | integer[Any],
+    d: _ArrayLikeFloat_co,
+) -> NDArray[floating[Any]]: ...
+@overload
+def fftfreq(
+    n: int | integer[Any],
+    d: _ArrayLikeComplex_co,
+) -> NDArray[complexfloating[Any, Any]]: ...
+
+@overload
+def rfftfreq(
+    n: int | integer[Any],
+    d: _ArrayLikeFloat_co,
+) -> NDArray[floating[Any]]: ...
+@overload
+def rfftfreq(
+    n: int | integer[Any],
+    d: _ArrayLikeComplex_co,
+) -> NDArray[complexfloating[Any, Any]]: ...
index 604ac8fde3b566bea2997895f8dd2709d40ec7e2..392644237e0bb3a1500b5e40e00f85cf520a4e9f 100644 (file)
@@ -10,7 +10,7 @@ import queue
 
 def fft1(x):
     L = len(x)
-    phase = -2j*np.pi*(np.arange(L)/float(L))
+    phase = -2j * np.pi * (np.arange(L) / L)
     phase = np.arange(L).reshape(-1, 1) * phase
     return np.sum(x*np.exp(phase), axis=1)
 
index 2904b6a844ddcd88430e4e3363976ef903b71466..ae23b2ec4980c2e7fdfba426843018d0029e08ef 100644 (file)
@@ -1,6 +1,8 @@
 import math as math
 from typing import Any, List
 
+from numpy._pytesttester import PytestTester
+
 from numpy import (
     ndenumerate as ndenumerate,
     ndindex as ndindex,
@@ -83,6 +85,12 @@ from numpy.lib.function_base import (
     quantile as quantile,
 )
 
+from numpy.lib.histograms import (
+    histogram_bin_edges as histogram_bin_edges,
+    histogram as histogram,
+    histogramdd as histogramdd,
+)
+
 from numpy.lib.index_tricks import (
     ravel_multi_index as ravel_multi_index,
     unravel_index as unravel_index,
@@ -122,7 +130,6 @@ from numpy.lib.npyio import (
     recfromtxt as recfromtxt,
     recfromcsv as recfromcsv,
     load as load,
-    loads as loads,
     save as save,
     savez as savez,
     savez_compressed as savez_compressed,
@@ -226,8 +233,13 @@ from numpy.lib.utils import (
     safe_eval as safe_eval,
 )
 
+from numpy.core.multiarray import (
+    tracemalloc_domain as tracemalloc_domain,
+)
+
 __all__: List[str]
+__path__: List[str]
+test: PytestTester
 
 __version__ = version
 emath = scimath
-tracemalloc_domain: int
index c790a6462a28cbe178d4ed3cb82d639a315b24b2..8201d3772887c24f0b8b26d0fc263f70b8bf834a 100644 (file)
@@ -324,7 +324,6 @@ class DataSource:
         # a significant fraction of numpy's total import time.
         import shutil
         from urllib.request import urlopen
-        from urllib.error import URLError
 
         upath = self.abspath(path)
 
@@ -530,7 +529,7 @@ class DataSource:
             return _file_openers[ext](found, mode=mode,
                                       encoding=encoding, newline=newline)
         else:
-            raise IOError("%s not found." % path)
+            raise FileNotFoundError(f"{path} not found.")
 
 
 class Repository (DataSource):
index a576925d646b67c291a2082bfc6cedce4e3b8772..4a5ac1285fa8ff3abd75018a8436ae4819753ab9 100644 (file)
@@ -23,8 +23,7 @@ def _decode_line(line, encoding=None):
 
     Returns
     -------
-    decoded_line : unicode
-         Unicode in Python 2, a str (unicode) in Python 3.
+    decoded_line : str
 
     """
     if type(line) is bytes:
index 64e3e133117ab28717d223f1dcade8900d79145c..d7c5f48445fa0399810fdb0fd921c4b4c2aa0c44 100644 (file)
@@ -1,5 +1,91 @@
-from typing import List
+from typing import (
+    Literal as L,
+    Any,
+    Dict,
+    List,
+    overload,
+    Tuple,
+    TypeVar,
+    Protocol,
+)
+
+from numpy import ndarray, dtype, generic
+
+from numpy.typing import (
+    ArrayLike,
+    NDArray,
+    _ArrayLikeInt,
+    _FiniteNestedSequence,
+    _SupportsArray,
+)
+
+_SCT = TypeVar("_SCT", bound=generic)
+
+class _ModeFunc(Protocol):
+    def __call__(
+        self,
+        vector: NDArray[Any],
+        iaxis_pad_width: Tuple[int, int],
+        iaxis: int,
+        kwargs: Dict[str, Any],
+        /,
+    ) -> None: ...
+
+_ModeKind = L[
+    "constant",
+    "edge",
+    "linear_ramp",
+    "maximum",
+    "mean",
+    "median",
+    "minimum",
+    "reflect",
+    "symmetric",
+    "wrap",
+    "empty",
+]
+
+_ArrayLike = _FiniteNestedSequence[_SupportsArray[dtype[_SCT]]]
 
 __all__: List[str]
 
-def pad(array, pad_width, mode=..., **kwargs): ...
+# TODO: In practice each keyword argument is exclusive to one or more
+# specific modes. Consider adding more overloads to express this in the future.
+
+# Expand `**kwargs` into explicit keyword-only arguments
+@overload
+def pad(
+    array: _ArrayLike[_SCT],
+    pad_width: _ArrayLikeInt,
+    mode: _ModeKind = ...,
+    *,
+    stat_length: None | _ArrayLikeInt = ...,
+    constant_values: ArrayLike = ...,
+    end_values: ArrayLike = ...,
+    reflect_type: L["odd", "even"] = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def pad(
+    array: ArrayLike,
+    pad_width: _ArrayLikeInt,
+    mode: _ModeKind = ...,
+    *,
+    stat_length: None | _ArrayLikeInt = ...,
+    constant_values: ArrayLike = ...,
+    end_values: ArrayLike = ...,
+    reflect_type: L["odd", "even"] = ...,
+) -> NDArray[Any]: ...
+@overload
+def pad(
+    array: _ArrayLike[_SCT],
+    pad_width: _ArrayLikeInt,
+    mode: _ModeFunc,
+    **kwargs: Any,
+) -> NDArray[_SCT]: ...
+@overload
+def pad(
+    array: ArrayLike,
+    pad_width: _ArrayLikeInt,
+    mode: _ModeFunc,
+    **kwargs: Any,
+) -> NDArray[Any]: ...
index 029aa147492fdb87c377b2ee3dab3806dabe4e58..6f13ec74b82a3e28ed349af9c9cc4457138fd376 100644 (file)
-from typing import List
+from typing import (
+    Literal as L,
+    Any,
+    List,
+    Union,
+    TypeVar,
+    Tuple,
+    overload,
+    SupportsIndex,
+)
+
+from numpy import (
+    dtype,
+    generic,
+    number,
+    bool_,
+    ushort,
+    ubyte,
+    uintc,
+    uint,
+    ulonglong,
+    short,
+    int8,
+    byte,
+    intc,
+    int_,
+    intp,
+    longlong,
+    half,
+    single,
+    double,
+    longdouble,
+    csingle,
+    cdouble,
+    clongdouble,
+    timedelta64,
+    datetime64,
+    object_,
+    str_,
+    bytes_,
+    void,
+)
+
+from numpy.typing import (
+    ArrayLike,
+    NDArray,
+    _FiniteNestedSequence,
+    _SupportsArray,
+    _ArrayLikeBool_co,
+    _ArrayLikeDT64_co,
+    _ArrayLikeTD64_co,
+    _ArrayLikeObject_co,
+    _ArrayLikeNumber_co,
+)
+
+_SCT = TypeVar("_SCT", bound=generic)
+_NumberType = TypeVar("_NumberType", bound=number[Any])
+
+# Explicitly set all allowed values to prevent accidental castings to
+# abstract dtypes (their common super-type).
+#
+# Only relevant if two or more arguments are parametrized, (e.g. `setdiff1d`)
+# which could result in, for example, `int64` and `float64`producing a
+# `number[_64Bit]` array
+_SCTNoCast = TypeVar(
+    "_SCTNoCast",
+    bool_,
+    ushort,
+    ubyte,
+    uintc,
+    uint,
+    ulonglong,
+    short,
+    byte,
+    intc,
+    int_,
+    longlong,
+    half,
+    single,
+    double,
+    longdouble,
+    csingle,
+    cdouble,
+    clongdouble,
+    timedelta64,
+    datetime64,
+    object_,
+    str_,
+    bytes_,
+    void,
+)
+
+_ArrayLike = _FiniteNestedSequence[_SupportsArray[dtype[_SCT]]]
 
 __all__: List[str]
 
-def ediff1d(ary, to_end=..., to_begin=...): ...
-def unique(ar, return_index=..., return_inverse=..., return_counts=..., axis=...): ...
-def intersect1d(ar1, ar2, assume_unique=..., return_indices=...): ...
-def setxor1d(ar1, ar2, assume_unique=...): ...
-def in1d(ar1, ar2, assume_unique=..., invert=...): ...
-def isin(element, test_elements, assume_unique=..., invert=...): ...
-def union1d(ar1, ar2): ...
-def setdiff1d(ar1, ar2, assume_unique=...): ...
+@overload
+def ediff1d(
+    ary: _ArrayLikeBool_co,
+    to_end: None | ArrayLike = ...,
+    to_begin: None | ArrayLike = ...,
+) -> NDArray[int8]: ...
+@overload
+def ediff1d(
+    ary: _ArrayLike[_NumberType],
+    to_end: None | ArrayLike = ...,
+    to_begin: None | ArrayLike = ...,
+) -> NDArray[_NumberType]: ...
+@overload
+def ediff1d(
+    ary: _ArrayLikeNumber_co,
+    to_end: None | ArrayLike = ...,
+    to_begin: None | ArrayLike = ...,
+) -> NDArray[Any]: ...
+@overload
+def ediff1d(
+    ary: _ArrayLikeDT64_co | _ArrayLikeTD64_co,
+    to_end: None | ArrayLike = ...,
+    to_begin: None | ArrayLike = ...,
+) -> NDArray[timedelta64]: ...
+@overload
+def ediff1d(
+    ary: _ArrayLikeObject_co,
+    to_end: None | ArrayLike = ...,
+    to_begin: None | ArrayLike = ...,
+) -> NDArray[object_]: ...
+
+@overload
+def unique(
+    ar: _ArrayLike[_SCT],
+    return_index: L[False] = ...,
+    return_inverse: L[False] = ...,
+    return_counts: L[False] = ...,
+    axis: None | SupportsIndex = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def unique(
+    ar: ArrayLike,
+    return_index: L[False] = ...,
+    return_inverse: L[False] = ...,
+    return_counts: L[False] = ...,
+    axis: None | SupportsIndex = ...,
+) -> NDArray[Any]: ...
+@overload
+def unique(
+    ar: _ArrayLike[_SCT],
+    return_index: L[True] = ...,
+    return_inverse: L[False] = ...,
+    return_counts: L[False] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[_SCT], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: ArrayLike,
+    return_index: L[True] = ...,
+    return_inverse: L[False] = ...,
+    return_counts: L[False] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[Any], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: _ArrayLike[_SCT],
+    return_index: L[False] = ...,
+    return_inverse: L[True] = ...,
+    return_counts: L[False] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[_SCT], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: ArrayLike,
+    return_index: L[False] = ...,
+    return_inverse: L[True] = ...,
+    return_counts: L[False] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[Any], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: _ArrayLike[_SCT],
+    return_index: L[False] = ...,
+    return_inverse: L[False] = ...,
+    return_counts: L[True] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[_SCT], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: ArrayLike,
+    return_index: L[False] = ...,
+    return_inverse: L[False] = ...,
+    return_counts: L[True] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[Any], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: _ArrayLike[_SCT],
+    return_index: L[True] = ...,
+    return_inverse: L[True] = ...,
+    return_counts: L[False] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[_SCT], NDArray[intp], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: ArrayLike,
+    return_index: L[True] = ...,
+    return_inverse: L[True] = ...,
+    return_counts: L[False] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[Any], NDArray[intp], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: _ArrayLike[_SCT],
+    return_index: L[True] = ...,
+    return_inverse: L[False] = ...,
+    return_counts: L[True] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[_SCT], NDArray[intp], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: ArrayLike,
+    return_index: L[True] = ...,
+    return_inverse: L[False] = ...,
+    return_counts: L[True] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[Any], NDArray[intp], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: _ArrayLike[_SCT],
+    return_index: L[False] = ...,
+    return_inverse: L[True] = ...,
+    return_counts: L[True] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[_SCT], NDArray[intp], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: ArrayLike,
+    return_index: L[False] = ...,
+    return_inverse: L[True] = ...,
+    return_counts: L[True] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[Any], NDArray[intp], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: _ArrayLike[_SCT],
+    return_index: L[True] = ...,
+    return_inverse: L[True] = ...,
+    return_counts: L[True] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[_SCT], NDArray[intp], NDArray[intp], NDArray[intp]]: ...
+@overload
+def unique(
+    ar: ArrayLike,
+    return_index: L[True] = ...,
+    return_inverse: L[True] = ...,
+    return_counts: L[True] = ...,
+    axis: None | SupportsIndex = ...,
+) -> Tuple[NDArray[Any], NDArray[intp], NDArray[intp], NDArray[intp]]: ...
+
+@overload
+def intersect1d(
+    ar1: _ArrayLike[_SCTNoCast],
+    ar2: _ArrayLike[_SCTNoCast],
+    assume_unique: bool = ...,
+    return_indices: L[False] = ...,
+) -> NDArray[_SCTNoCast]: ...
+@overload
+def intersect1d(
+    ar1: ArrayLike,
+    ar2: ArrayLike,
+    assume_unique: bool = ...,
+    return_indices: L[False] = ...,
+) -> NDArray[Any]: ...
+@overload
+def intersect1d(
+    ar1: _ArrayLike[_SCTNoCast],
+    ar2: _ArrayLike[_SCTNoCast],
+    assume_unique: bool = ...,
+    return_indices: L[True] = ...,
+) -> Tuple[NDArray[_SCTNoCast], NDArray[intp], NDArray[intp]]: ...
+@overload
+def intersect1d(
+    ar1: ArrayLike,
+    ar2: ArrayLike,
+    assume_unique: bool = ...,
+    return_indices: L[True] = ...,
+) -> Tuple[NDArray[Any], NDArray[intp], NDArray[intp]]: ...
+
+@overload
+def setxor1d(
+    ar1: _ArrayLike[_SCTNoCast],
+    ar2: _ArrayLike[_SCTNoCast],
+    assume_unique: bool = ...,
+) -> NDArray[_SCTNoCast]: ...
+@overload
+def setxor1d(
+    ar1: ArrayLike,
+    ar2: ArrayLike,
+    assume_unique: bool = ...,
+) -> NDArray[Any]: ...
+
+def in1d(
+    ar1: ArrayLike,
+    ar2: ArrayLike,
+    assume_unique: bool = ...,
+    invert: bool = ...,
+) -> NDArray[bool_]: ...
+
+def isin(
+    element: ArrayLike,
+    test_elements: ArrayLike,
+    assume_unique: bool = ...,
+    invert: bool = ...,
+) -> NDArray[bool_]: ...
+
+@overload
+def union1d(
+    ar1: _ArrayLike[_SCTNoCast],
+    ar2: _ArrayLike[_SCTNoCast],
+) -> NDArray[_SCTNoCast]: ...
+@overload
+def union1d(
+    ar1: ArrayLike,
+    ar2: ArrayLike,
+) -> NDArray[Any]: ...
+
+@overload
+def setdiff1d(
+    ar1: _ArrayLike[_SCTNoCast],
+    ar2: _ArrayLike[_SCTNoCast],
+    assume_unique: bool = ...,
+) -> NDArray[_SCTNoCast]: ...
+@overload
+def setdiff1d(
+    ar1: ArrayLike,
+    ar2: ArrayLike,
+    assume_unique: bool = ...,
+) -> NDArray[Any]: ...
index 39d6fd84354e5f9eff7071c1b0375b114c84a181..82c66920640f4302d1b371c2a60a7e5f21ec5152 100644 (file)
@@ -1,4 +1,3 @@
-import sys
 from typing import (
     List,
     Any,
index ead6a042025116e466a5a36dcb9f713aa13ec5ef..3967b43eefc2761d210a22d4d508d2741df984ba 100644 (file)
@@ -44,7 +44,7 @@ Capabilities
   read most ``.npy`` files that they have been given without much
   documentation.
 
-- Allows memory-mapping of the data. See `open_memmep`.
+- Allows memory-mapping of the data. See `open_memmap`.
 
 - Can be read from a filelike stream object instead of an actual file.
 
@@ -162,7 +162,6 @@ evolved with time and this document is more current.
 
 """
 import numpy
-import io
 import warnings
 from numpy.lib.utils import safe_eval
 from numpy.compat import (
@@ -292,7 +291,7 @@ def descr_to_dtype(descr):
     Parameters
     ----------
     descr : object
-        The object retreived by dtype.descr. Can be passed to
+        The object retrieved by dtype.descr. Can be passed to
         `numpy.dtype()` in order to replicate the input dtype.
 
     Returns
@@ -606,7 +605,7 @@ def _read_array_header(fp, version):
     if EXPECTED_KEYS != d.keys():
         keys = sorted(d.keys())
         msg = "Header does not contain the correct keys: {!r}"
-        raise ValueError(msg.format(d.keys()))
+        raise ValueError(msg.format(keys))
 
     # Sanity-check the values.
     if (not isinstance(d['shape'], tuple) or
@@ -831,7 +830,7 @@ def open_memmap(filename, mode='r+', dtype=None, shape=None,
     ------
     ValueError
         If the data or the mode is invalid.
-    IOError
+    OSError
         If the file is not found or cannot be opened correctly.
 
     See Also
@@ -909,7 +908,7 @@ def _read_bytes(fp, size, error_template="ran out of data"):
             data += r
             if len(r) == 0 or len(data) == size:
                 break
-        except io.BlockingIOError:
+        except BlockingIOError:
             pass
     if len(data) != size:
         msg = "EOF: reading %s, expected %d bytes got %d"
index 4c44d57bf8272b2f72b166a2b4823e836398d1ac..092245daf01f030d15ce978b083f21f7a926ee00 100644 (file)
@@ -1,10 +1,4 @@
-import sys
-from typing import Any, List, Set
-
-if sys.version_info >= (3, 8):
-    from typing import Literal, Final
-else:
-    from typing_extensions import Literal, Final
+from typing import Any, List, Set, Literal, Final
 
 __all__: List[str]
 
index 783d45c2fbfc0564b8f7439ebde1637d736a8411..a215f63d30406155fcf38753eaabc7765c13a802 100644 (file)
@@ -9,8 +9,7 @@ import numpy.core.numeric as _nx
 from numpy.core import transpose
 from numpy.core.numeric import (
     ones, zeros_like, arange, concatenate, array, asarray, asanyarray, empty,
-    ndarray, around, floor, ceil, take, dot, where, intp,
-    integer, isscalar, absolute
+    ndarray, take, dot, where, intp, integer, isscalar, absolute
     )
 from numpy.core.umath import (
     pi, add, arctan2, frompyfunc, cos, less_equal, sqrt, sin,
@@ -33,7 +32,7 @@ from numpy.core.umath import _add_newdoc_ufunc as add_newdoc_ufunc
 import builtins
 
 # needed in this module for compatibility
-from numpy.lib.histograms import histogram, histogramdd
+from numpy.lib.histograms import histogram, histogramdd  # noqa: F401
 
 
 array_function_dispatch = functools.partial(
@@ -51,6 +50,106 @@ __all__ = [
     'quantile'
     ]
 
+# _QuantileMethods is a dictionary listing all the supported methods to
+# compute quantile/percentile.
+#
+# Below virtual_index refer to the index of the element where the percentile
+# would be found in the sorted sample.
+# When the sample contains exactly the percentile wanted, the virtual_index is
+# an integer to the index of this element.
+# When the percentile wanted is in between two elements, the virtual_index
+# is made of a integer part (a.k.a 'i' or 'left') and a fractional part
+# (a.k.a 'g' or 'gamma')
+#
+# Each method in _QuantileMethods has two properties
+# get_virtual_index : Callable
+#   The function used to compute the virtual_index.
+# fix_gamma : Callable
+#   A function used for discret methods to force the index to a specific value.
+_QuantileMethods = dict(
+    # --- HYNDMAN and FAN METHODS
+    # Discrete methods
+    inverted_cdf=dict(
+        get_virtual_index=lambda n, quantiles: _inverted_cdf(n, quantiles),
+        fix_gamma=lambda gamma, _: gamma,  # should never be called
+    ),
+    averaged_inverted_cdf=dict(
+        get_virtual_index=lambda n, quantiles: (n * quantiles) - 1,
+        fix_gamma=lambda gamma, _: _get_gamma_mask(
+            shape=gamma.shape,
+            default_value=1.,
+            conditioned_value=0.5,
+            where=gamma == 0),
+    ),
+    closest_observation=dict(
+        get_virtual_index=lambda n, quantiles: _closest_observation(n,
+                                                                    quantiles),
+        fix_gamma=lambda gamma, _: gamma,  # should never be called
+    ),
+    # Continuous methods
+    interpolated_inverted_cdf=dict(
+        get_virtual_index=lambda n, quantiles:
+        _compute_virtual_index(n, quantiles, 0, 1),
+        fix_gamma=lambda gamma, _: gamma,
+    ),
+    hazen=dict(
+        get_virtual_index=lambda n, quantiles:
+        _compute_virtual_index(n, quantiles, 0.5, 0.5),
+        fix_gamma=lambda gamma, _: gamma,
+    ),
+    weibull=dict(
+        get_virtual_index=lambda n, quantiles:
+        _compute_virtual_index(n, quantiles, 0, 0),
+        fix_gamma=lambda gamma, _: gamma,
+    ),
+    # Default method.
+    # To avoid some rounding issues, `(n-1) * quantiles` is preferred to
+    # `_compute_virtual_index(n, quantiles, 1, 1)`.
+    # They are mathematically equivalent.
+    linear=dict(
+        get_virtual_index=lambda n, quantiles: (n - 1) * quantiles,
+        fix_gamma=lambda gamma, _: gamma,
+    ),
+    median_unbiased=dict(
+        get_virtual_index=lambda n, quantiles:
+        _compute_virtual_index(n, quantiles, 1 / 3.0, 1 / 3.0),
+        fix_gamma=lambda gamma, _: gamma,
+    ),
+    normal_unbiased=dict(
+        get_virtual_index=lambda n, quantiles:
+        _compute_virtual_index(n, quantiles, 3 / 8.0, 3 / 8.0),
+        fix_gamma=lambda gamma, _: gamma,
+    ),
+    # --- OTHER METHODS
+    lower=dict(
+        get_virtual_index=lambda n, quantiles: np.floor(
+            (n - 1) * quantiles).astype(np.intp),
+        fix_gamma=lambda gamma, _: gamma,
+        # should never be called, index dtype is int
+    ),
+    higher=dict(
+        get_virtual_index=lambda n, quantiles: np.ceil(
+            (n - 1) * quantiles).astype(np.intp),
+        fix_gamma=lambda gamma, _: gamma,
+        # should never be called, index dtype is int
+    ),
+    midpoint=dict(
+        get_virtual_index=lambda n, quantiles: 0.5 * (
+                np.floor((n - 1) * quantiles)
+                + np.ceil((n - 1) * quantiles)),
+        fix_gamma=lambda gamma, index: _get_gamma_mask(
+            shape=gamma.shape,
+            default_value=0.5,
+            conditioned_value=0.,
+            where=index % 1 == 0),
+    ),
+    nearest=dict(
+        get_virtual_index=lambda n, quantiles: np.around(
+            (n - 1) * quantiles).astype(np.intp),
+        fix_gamma=lambda gamma, _: gamma,
+        # should never be called, index dtype is int
+    ))
+
 
 def _rot90_dispatcher(m, k=None, axes=None):
     return (m,)
@@ -88,8 +187,11 @@ def rot90(m, k=1, axes=(0, 1)):
 
     Notes
     -----
-    rot90(m, k=1, axes=(1,0)) is the reverse of rot90(m, k=1, axes=(0,1))
-    rot90(m, k=1, axes=(1,0)) is equivalent to rot90(m, k=-1, axes=(0,1))
+    ``rot90(m, k=1, axes=(1,0))``  is the reverse of
+    ``rot90(m, k=1, axes=(0,1))``
+
+    ``rot90(m, k=1, axes=(1,0))`` is equivalent to
+    ``rot90(m, k=-1, axes=(0,1))``
 
     Examples
     --------
@@ -265,6 +367,19 @@ def iterable(y):
     >>> np.iterable(2)
     False
 
+    Notes
+    -----
+    In most cases, the results of ``np.iterable(obj)`` are consistent with
+    ``isinstance(obj, collections.abc.Iterable)``. One notable exception is
+    the treatment of 0-dimensional arrays::
+
+        >>> from collections.abc import Iterable
+        >>> a = np.array(1.0)  # 0-dimensional numpy array
+        >>> isinstance(a, Iterable)
+        True
+        >>> np.iterable(a)
+        False
+
     """
     try:
         iter(y)
@@ -654,11 +769,16 @@ def select(condlist, choicelist, default=0):
 
     Examples
     --------
-    >>> x = np.arange(10)
-    >>> condlist = [x<3, x>5]
+    >>> x = np.arange(6)
+    >>> condlist = [x<3, x>3]
+    >>> choicelist = [x, x**2]
+    >>> np.select(condlist, choicelist, 42)
+    array([ 0,  1,  2, 42, 16, 25])
+
+    >>> condlist = [x<=4, x>3]
     >>> choicelist = [x, x**2]
-    >>> np.select(condlist, choicelist)
-    array([ 0,  1,  2, ..., 49, 64, 81])
+    >>> np.select(condlist, choicelist, 55)
+    array([ 0,  1,  2,  3,  4, 25])
 
     """
     # Check the size of condlist and choicelist are the same, or abort.
@@ -776,6 +896,17 @@ def copy(a, order='K', subok=False):
     >>> x[0] == z[0]
     False
 
+    Note that, np.copy clears previously set WRITEABLE=False flag.
+
+    >>> a = np.array([1, 2, 3])
+    >>> a.flags["WRITEABLE"] = False
+    >>> b = np.copy(a)
+    >>> b.flags["WRITEABLE"]
+    True
+    >>> b[0] = 3
+    >>> b
+    array([3, 2, 3])
+    
     Note that np.copy is a shallow copy and will not copy object
     elements within arrays. This is mainly important for arrays
     containing Python objects. The new array will contain the
@@ -1509,7 +1640,7 @@ def unwrap(p, discont=None, axis=-1, *, period=2*pi):
     difference from their predecessor of more than ``max(discont, period/2)``
     to their `period`-complementary values.
 
-    For the default case where `period` is :math:`2\pi` and is `discont` is
+    For the default case where `period` is :math:`2\pi` and `discont` is
     :math:`\pi`, this unwraps a radian phase `p` such that adjacent differences
     are never greater than :math:`\pi` by adding :math:`2k\pi` for some
     integer :math:`k`.
@@ -1519,7 +1650,7 @@ def unwrap(p, discont=None, axis=-1, *, period=2*pi):
     p : array_like
         Input array.
     discont : float, optional
-        Maximum discontinuity between values, default is ``period/2``. 
+        Maximum discontinuity between values, default is ``period/2``.
         Values below ``period/2`` are treated as if they were ``period/2``.
         To have an effect different from the default, `discont` should be
         larger than ``period/2``.
@@ -1528,7 +1659,7 @@ def unwrap(p, discont=None, axis=-1, *, period=2*pi):
     period: float, optional
         Size of the range over which the input wraps. By default, it is
         ``2 pi``.
-        
+
         .. versionadded:: 1.21.0
 
     Returns
@@ -1542,8 +1673,8 @@ def unwrap(p, discont=None, axis=-1, *, period=2*pi):
 
     Notes
     -----
-    If the discontinuity in `p` is smaller than ``period/2``, 
-    but larger than `discont`, no unwrapping is done because taking 
+    If the discontinuity in `p` is smaller than ``period/2``,
+    but larger than `discont`, no unwrapping is done because taking
     the complement would only make the discontinuity larger.
 
     Examples
@@ -1576,7 +1707,7 @@ def unwrap(p, discont=None, axis=-1, *, period=2*pi):
     slice1 = tuple(slice1)
     dtype = np.result_type(dd, period)
     if _nx.issubdtype(dtype, _nx.integer):
-        interval_high, rem = divmod(period, 2) 
+        interval_high, rem = divmod(period, 2)
         boundary_ambiguous = rem == 0
     else:
         interval_high = period / 2
@@ -1863,6 +1994,8 @@ def _parse_gufunc_signature(signature):
     Tuple of input and output core dimensions parsed from the signature, each
     of the form List[Tuple[str, ...]].
     """
+    signature = re.sub(r'\s+', '', signature)
+
     if not re.match(_SIGNATURE, signature):
         raise ValueError(
             'not a valid gufunc signature: {}'.format(signature))
@@ -1940,11 +2073,19 @@ def _calculate_shapes(broadcast_shape, dim_sizes, list_of_core_dims):
             for core_dims in list_of_core_dims]
 
 
-def _create_arrays(broadcast_shape, dim_sizes, list_of_core_dims, dtypes):
+def _create_arrays(broadcast_shape, dim_sizes, list_of_core_dims, dtypes,
+                   results=None):
     """Helper for creating output arrays in vectorize."""
     shapes = _calculate_shapes(broadcast_shape, dim_sizes, list_of_core_dims)
-    arrays = tuple(np.empty(shape, dtype=dtype)
-                   for shape, dtype in zip(shapes, dtypes))
+    if dtypes is None:
+        dtypes = [None] * len(shapes)
+    if results is None:
+        arrays = tuple(np.empty(shape=shape, dtype=dtype)
+                       for shape, dtype in zip(shapes, dtypes))
+    else:
+        arrays = tuple(np.empty_like(result, shape=shape, dtype=dtype)
+                       for result, shape, dtype
+                       in zip(results, shapes, dtypes))
     return arrays
 
 
@@ -2290,11 +2431,8 @@ class vectorize:
                 for result, core_dims in zip(results, output_core_dims):
                     _update_dim_sizes(dim_sizes, result, core_dims)
 
-                if otypes is None:
-                    otypes = [asarray(result).dtype for result in results]
-
                 outputs = _create_arrays(broadcast_shape, dim_sizes,
-                                         output_core_dims, otypes)
+                                         output_core_dims, otypes, results)
 
             for output, result in zip(outputs, results):
                 output[index] = result
@@ -2794,9 +2932,9 @@ def blackman(M):
 
     """
     if M < 1:
-        return array([])
+        return array([], dtype=np.result_type(M, 0.0))
     if M == 1:
-        return ones(1, float)
+        return ones(1, dtype=np.result_type(M, 0.0))
     n = arange(1-M, M, 2)
     return 0.42 + 0.5*cos(pi*n/(M-1)) + 0.08*cos(2.0*pi*n/(M-1))
 
@@ -2903,9 +3041,9 @@ def bartlett(M):
 
     """
     if M < 1:
-        return array([])
+        return array([], dtype=np.result_type(M, 0.0))
     if M == 1:
-        return ones(1, float)
+        return ones(1, dtype=np.result_type(M, 0.0))
     n = arange(1-M, M, 2)
     return where(less_equal(n, 0), 1 + n/(M-1), 1 - n/(M-1))
 
@@ -3007,9 +3145,9 @@ def hanning(M):
 
     """
     if M < 1:
-        return array([])
+        return array([], dtype=np.result_type(M, 0.0))
     if M == 1:
-        return ones(1, float)
+        return ones(1, dtype=np.result_type(M, 0.0))
     n = arange(1-M, M, 2)
     return 0.5 + 0.5*cos(pi*n/(M-1))
 
@@ -3107,9 +3245,9 @@ def hamming(M):
 
     """
     if M < 1:
-        return array([])
+        return array([], dtype=np.result_type(M, 0.0))
     if M == 1:
-        return ones(1, float)
+        return ones(1, dtype=np.result_type(M, 0.0))
     n = arange(1-M, M, 2)
     return 0.54 + 0.46*cos(pi*n/(M-1))
 
@@ -3242,7 +3380,7 @@ def i0(x):
            Her Majesty's Stationery Office, 1962.
     .. [2] M. Abramowitz and I. A. Stegun, *Handbook of Mathematical
            Functions*, 10th printing, New York: Dover, 1964, pp. 379.
-           http://www.math.sfu.ca/~cbm/aands/page_379.htm
+           https://personal.math.ubc.ca/~cbm/aands/page_379.htm
     .. [3] https://metacpan.org/pod/distribution/Math-Cephes/lib/Math/Cephes.pod#i0:-Modified-Bessel-function-of-order-zero
 
     Examples
@@ -3386,7 +3524,7 @@ def kaiser(M, beta):
 
     """
     if M == 1:
-        return np.array([1.])
+        return np.ones(1, dtype=np.result_type(M, 0.0))
     n = arange(0, M)
     alpha = (M-1)/2.0
     return i0(beta * sqrt(1-((n-alpha)/alpha)**2.0))/i0(float(beta))
@@ -3704,26 +3842,32 @@ def _median(a, axis=None, out=None, overwrite_input=False):
         indexer[axis] = slice(index-1, index+1)
     indexer = tuple(indexer)
 
+    # Use mean in both odd and even case to coerce data type,
+    # using out array if needed.
+    rout = mean(part[indexer], axis=axis, out=out)
     # Check if the array contains any nan's
     if np.issubdtype(a.dtype, np.inexact) and sz > 0:
-        # warn and return nans like mean would
-        rout = mean(part[indexer], axis=axis, out=out)
-        return np.lib.utils._median_nancheck(part, rout, axis, out)
-    else:
-        # if there are no nans
-        # Use mean in odd and even case to coerce data type
-        # and check, use out array.
-        return mean(part[indexer], axis=axis, out=out)
+        # If nans are possible, warn and replace by nans like mean would.
+        rout = np.lib.utils._median_nancheck(part, rout, axis)
+
+    return rout
 
 
 def _percentile_dispatcher(a, q, axis=None, out=None, overwrite_input=None,
-                           interpolation=None, keepdims=None):
+                           method=None, keepdims=None, *, interpolation=None):
     return (a, q, out)
 
 
 @array_function_dispatch(_percentile_dispatcher)
-def percentile(a, q, axis=None, out=None,
-               overwrite_input=False, interpolation='linear', keepdims=False):
+def percentile(a,
+               q,
+               axis=None,
+               out=None,
+               overwrite_input=False,
+               method="linear",
+               keepdims=False,
+               *,
+               interpolation=None):
     """
     Compute the q-th percentile of the data along the specified axis.
 
@@ -3751,21 +3895,34 @@ def percentile(a, q, axis=None, out=None,
         If True, then allow the input array `a` to be modified by intermediate
         calculations, to save memory. In this case, the contents of the input
         `a` after this function completes is undefined.
+    method : str, optional
+        This parameter specifies the method to use for estimating the
+        percentile.  There are many different methods, some unique to NumPy.
+        See the notes for explanation.  The options sorted by their R type
+        as summarized in the H&F paper [1]_ are:
+
+        1. 'inverted_cdf'
+        2. 'averaged_inverted_cdf'
+        3. 'closest_observation'
+        4. 'interpolated_inverted_cdf'
+        5. 'hazen'
+        6. 'weibull'
+        7. 'linear'  (default)
+        8. 'median_unbiased'
+        9. 'normal_unbiased'
+
+        The first three methods are discontiuous.  NumPy further defines the
+        following discontinuous variations of the default 'linear' (7.) option:
+
+        * 'lower'
+        * 'higher',
+        * 'midpoint'
+        * 'nearest'
+
+        .. versionchanged:: 1.22.0
+            This argument was previously called "interpolation" and only
+            offered the "linear" default and last four options.
 
-    interpolation : {'linear', 'lower', 'higher', 'midpoint', 'nearest'}
-        This optional parameter specifies the interpolation method to
-        use when the desired percentile lies between two data points
-        ``i < j``:
-
-        * 'linear': ``i + (j - i) * fraction``, where ``fraction``
-          is the fractional part of the index surrounded by ``i``
-          and ``j``.
-        * 'lower': ``i``.
-        * 'higher': ``j``.
-        * 'nearest': ``i`` or ``j``, whichever is nearest.
-        * 'midpoint': ``(i + j) / 2``.
-
-        .. versionadded:: 1.9.0
     keepdims : bool, optional
         If this is set to True, the axes which are reduced are left in
         the result as dimensions with size one. With this option, the
@@ -3773,6 +3930,11 @@ def percentile(a, q, axis=None, out=None,
 
         .. versionadded:: 1.9.0
 
+    interpolation : str, optional
+        Deprecated name for the method keyword argument.
+
+        .. deprecated:: 1.22.0
+
     Returns
     -------
     percentile : scalar or ndarray
@@ -3790,18 +3952,109 @@ def percentile(a, q, axis=None, out=None,
     mean
     median : equivalent to ``percentile(..., 50)``
     nanpercentile
-    quantile : equivalent to percentile, except with q in the range [0, 1].
+    quantile : equivalent to percentile, except q in the range [0, 1].
 
     Notes
     -----
-    Given a vector ``V`` of length ``N``, the q-th percentile of
-    ``V`` is the value ``q/100`` of the way from the minimum to the
-    maximum in a sorted copy of ``V``. The values and distances of
-    the two nearest neighbors as well as the `interpolation` parameter
-    will determine the percentile if the normalized ranking does not
-    match the location of ``q`` exactly. This function is the same as
-    the median if ``q=50``, the same as the minimum if ``q=0`` and the
-    same as the maximum if ``q=100``.
+    Given a vector ``V`` of length ``N``, the q-th percentile of ``V`` is
+    the value ``q/100`` of the way from the minimum to the maximum in a
+    sorted copy of ``V``. The values and distances of the two nearest
+    neighbors as well as the `method` parameter will determine the
+    percentile if the normalized ranking does not match the location of
+    ``q`` exactly. This function is the same as the median if ``q=50``, the
+    same as the minimum if ``q=0`` and the same as the maximum if
+    ``q=100``.
+
+    This optional `method` parameter specifies the method to use when the
+    desired quantile lies between two data points ``i < j``.
+    If ``g`` is the fractional part of the index surrounded by ``i`` and
+    alpha and beta are correction constants modifying i and j.
+
+    Below, 'q' is the quantile value, 'n' is the sample size and
+    alpha and beta are constants.
+    The following formula gives an interpolation "i + g" of where the quantile
+    would be in the sorted sample.
+    With 'i' being the floor and 'g' the fractional part of the result.
+
+    .. math::
+        i + g = (q - alpha) / ( n - alpha - beta + 1 )
+
+    The different methods then work as follows
+
+    inverted_cdf:
+        method 1 of H&F [1]_.
+        This method gives discontinuous results:
+        * if g > 0 ; then take j
+        * if g = 0 ; then take i
+
+    averaged_inverted_cdf:
+        method 2 of H&F [1]_.
+        This method give discontinuous results:
+        * if g > 0 ; then take j
+        * if g = 0 ; then average between bounds
+
+    closest_observation:
+        method 3 of H&F [1]_.
+        This method give discontinuous results:
+        * if g > 0 ; then take j
+        * if g = 0 and index is odd ; then take j
+        * if g = 0 and index is even ; then take i
+
+    interpolated_inverted_cdf:
+        method 4 of H&F [1]_.
+        This method give continuous results using:
+        * alpha = 0
+        * beta = 1
+
+    hazen:
+        method 5 of H&F [1]_.
+        This method give continuous results using:
+        * alpha = 1/2
+        * beta = 1/2
+
+    weibull:
+        method 6 of H&F [1]_.
+        This method give continuous results using:
+        * alpha = 0
+        * beta = 0
+
+    linear:
+        method 7 of H&F [1]_.
+        This method give continuous results using:
+        * alpha = 1
+        * beta = 1
+
+    median_unbiased:
+        method 8 of H&F [1]_.
+        This method is probably the best method if the sample
+        distribution function is unknown (see reference).
+        This method give continuous results using:
+        * alpha = 1/3
+        * beta = 1/3
+
+    normal_unbiased:
+        method 9 of H&F [1]_.
+        This method is probably the best method if the sample
+        distribution function is known to be normal.
+        This method give continuous results using:
+        * alpha = 3/8
+        * beta = 3/8
+
+    lower:
+        NumPy method kept for backwards compatibility.
+        Takes ``i`` as the interpolation point.
+
+    higher:
+        NumPy method kept for backwards compatibility.
+        Takes ``j`` as the interpolation point.
+
+    nearest:
+        NumPy method kept for backwards compatibility.
+        Takes ``i`` or ``j``, whichever is nearest.
+
+    midpoint:
+        NumPy method kept for backwards compatibility.
+        Uses ``(i + j) / 2``.
 
     Examples
     --------
@@ -3831,7 +4084,7 @@ def percentile(a, q, axis=None, out=None,
     array([7.,  2.])
     >>> assert not np.all(a == b)
 
-    The different types of interpolation can be visualized graphically:
+    The different methods can be visualized graphically:
 
     .. plot::
 
@@ -3841,41 +4094,62 @@ def percentile(a, q, axis=None, out=None,
         p = np.linspace(0, 100, 6001)
         ax = plt.gca()
         lines = [
-            ('linear', None),
-            ('higher', '--'),
-            ('lower', '--'),
-            ('nearest', '-.'),
-            ('midpoint', '-.'),
-        ]
-        for interpolation, style in lines:
+            ('linear', '-', 'C0'),
+            ('inverted_cdf', ':', 'C1'),
+            # Almost the same as `inverted_cdf`:
+            ('averaged_inverted_cdf', '-.', 'C1'),
+            ('closest_observation', ':', 'C2'),
+            ('interpolated_inverted_cdf', '--', 'C1'),
+            ('hazen', '--', 'C3'),
+            ('weibull', '-.', 'C4'),
+            ('median_unbiased', '--', 'C5'),
+            ('normal_unbiased', '-.', 'C6'),
+            ]
+        for method, style, color in lines:
             ax.plot(
-                p, np.percentile(a, p, interpolation=interpolation),
-                label=interpolation, linestyle=style)
+                p, np.percentile(a, p, method=method),
+                label=method, linestyle=style, color=color)
         ax.set(
-            title='Interpolation methods for list: ' + str(a),
+            title='Percentiles for different methods and data: ' + str(a),
             xlabel='Percentile',
-            ylabel='List item returned',
+            ylabel='Estimated percentile value',
             yticks=a)
         ax.legend()
         plt.show()
 
+    References
+    ----------
+    .. [1] R. J. Hyndman and Y. Fan,
+       "Sample quantiles in statistical packages,"
+       The American Statistician, 50(4), pp. 361-365, 1996
+
     """
+    if interpolation is not None:
+        method = _check_interpolation_as_method(
+            method, interpolation, "percentile")
     q = np.true_divide(q, 100)
     q = asanyarray(q)  # undo any decay that the ufunc performed (see gh-13105)
     if not _quantile_is_valid(q):
         raise ValueError("Percentiles must be in the range [0, 100]")
     return _quantile_unchecked(
-        a, q, axis, out, overwrite_input, interpolation, keepdims)
+        a, q, axis, out, overwrite_input, method, keepdims)
 
 
 def _quantile_dispatcher(a, q, axis=None, out=None, overwrite_input=None,
-                         interpolation=None, keepdims=None):
+                         method=None, keepdims=None, *, interpolation=None):
     return (a, q, out)
 
 
 @array_function_dispatch(_quantile_dispatcher)
-def quantile(a, q, axis=None, out=None,
-             overwrite_input=False, interpolation='linear', keepdims=False):
+def quantile(a,
+             q,
+             axis=None,
+             out=None,
+             overwrite_input=False,
+             method="linear",
+             keepdims=False,
+             *,
+             interpolation=None):
     """
     Compute the q-th quantile of the data along the specified axis.
 
@@ -3889,34 +4163,55 @@ def quantile(a, q, axis=None, out=None,
         Quantile or sequence of quantiles to compute, which must be between
         0 and 1 inclusive.
     axis : {int, tuple of int, None}, optional
-        Axis or axes along which the quantiles are computed. The
-        default is to compute the quantile(s) along a flattened
-        version of the array.
+        Axis or axes along which the quantiles are computed. The default is
+        to compute the quantile(s) along a flattened version of the array.
     out : ndarray, optional
-        Alternative output array in which to place the result. It must
-        have the same shape and buffer length as the expected output,
-        but the type (of the output) will be cast if necessary.
+        Alternative output array in which to place the result. It must have
+        the same shape and buffer length as the expected output, but the
+        type (of the output) will be cast if necessary.
     overwrite_input : bool, optional
-        If True, then allow the input array `a` to be modified by intermediate
-        calculations, to save memory. In this case, the contents of the input
-        `a` after this function completes is undefined.
-    interpolation : {'linear', 'lower', 'higher', 'midpoint', 'nearest'}
-        This optional parameter specifies the interpolation method to
-        use when the desired quantile lies between two data points
-        ``i < j``:
-
-            * linear: ``i + (j - i) * fraction``, where ``fraction``
-              is the fractional part of the index surrounded by ``i``
-              and ``j``.
-            * lower: ``i``.
-            * higher: ``j``.
-            * nearest: ``i`` or ``j``, whichever is nearest.
-            * midpoint: ``(i + j) / 2``.
+        If True, then allow the input array `a` to be modified by
+        intermediate calculations, to save memory. In this case, the
+        contents of the input `a` after this function completes is
+        undefined.
+    method : str, optional
+        This parameter specifies the method to use for estimating the
+        quantile.  There are many different methods, some unique to NumPy.
+        See the notes for explanation.  The options sorted by their R type
+        as summarized in the H&F paper [1]_ are:
+
+        1. 'inverted_cdf'
+        2. 'averaged_inverted_cdf'
+        3. 'closest_observation'
+        4. 'interpolated_inverted_cdf'
+        5. 'hazen'
+        6. 'weibull'
+        7. 'linear'  (default)
+        8. 'median_unbiased'
+        9. 'normal_unbiased'
+
+        The first three methods are discontiuous.  NumPy further defines the
+        following discontinuous variations of the default 'linear' (7.) option:
+
+        * 'lower'
+        * 'higher',
+        * 'midpoint'
+        * 'nearest'
+
+        .. versionchanged:: 1.22.0
+            This argument was previously called "interpolation" and only
+            offered the "linear" default and last four options.
+
     keepdims : bool, optional
         If this is set to True, the axes which are reduced are left in
         the result as dimensions with size one. With this option, the
         result will broadcast correctly against the original array `a`.
 
+    interpolation : str, optional
+        Deprecated name for the method keyword argument.
+
+        .. deprecated:: 1.22.0
+
     Returns
     -------
     quantile : scalar or ndarray
@@ -3938,14 +4233,98 @@ def quantile(a, q, axis=None, out=None,
 
     Notes
     -----
-    Given a vector ``V`` of length ``N``, the q-th quantile of
-    ``V`` is the value ``q`` of the way from the minimum to the
-    maximum in a sorted copy of ``V``. The values and distances of
-    the two nearest neighbors as well as the `interpolation` parameter
-    will determine the quantile if the normalized ranking does not
-    match the location of ``q`` exactly. This function is the same as
-    the median if ``q=0.5``, the same as the minimum if ``q=0.0`` and the
-    same as the maximum if ``q=1.0``.
+    Given a vector ``V`` of length ``N``, the q-th quantile of ``V`` is the
+    value ``q`` of the way from the minimum to the maximum in a sorted copy of
+    ``V``. The values and distances of the two nearest neighbors as well as the
+    `method` parameter will determine the quantile if the normalized
+    ranking does not match the location of ``q`` exactly. This function is the
+    same as the median if ``q=0.5``, the same as the minimum if ``q=0.0`` and
+    the same as the maximum if ``q=1.0``.
+
+    This optional `method` parameter specifies the method to use when the
+    desired quantile lies between two data points ``i < j``.
+    If ``g`` is the fractional part of the index surrounded by ``i`` and
+    alpha and beta are correction constants modifying i and j.
+
+    .. math::
+        i + g = (q - alpha) / ( n - alpha - beta + 1 )
+
+    The different methods then work as follows
+
+    inverted_cdf:
+        method 1 of H&F [1]_.
+        This method gives discontinuous results:
+        * if g > 0 ; then take j
+        * if g = 0 ; then take i
+
+    averaged_inverted_cdf:
+        method 2 of H&F [1]_.
+        This method give discontinuous results:
+        * if g > 0 ; then take j
+        * if g = 0 ; then average between bounds
+
+    closest_observation:
+        method 3 of H&F [1]_.
+        This method give discontinuous results:
+        * if g > 0 ; then take j
+        * if g = 0 and index is odd ; then take j
+        * if g = 0 and index is even ; then take i
+
+    interpolated_inverted_cdf:
+        method 4 of H&F [1]_.
+        This method give continuous results using:
+        * alpha = 0
+        * beta = 1
+
+    hazen:
+        method 5 of H&F [1]_.
+        This method give continuous results using:
+        * alpha = 1/2
+        * beta = 1/2
+
+    weibull:
+        method 6 of H&F [1]_.
+        This method give continuous results using:
+        * alpha = 0
+        * beta = 0
+
+    linear:
+        method 7 of H&F [1]_.
+        This method give continuous results using:
+        * alpha = 1
+        * beta = 1
+
+    median_unbiased:
+        method 8 of H&F [1]_.
+        This method is probably the best method if the sample
+        distribution function is unknown (see reference).
+        This method give continuous results using:
+        * alpha = 1/3
+        * beta = 1/3
+
+    normal_unbiased:
+        method 9 of H&F [1]_.
+        This method is probably the best method if the sample
+        distribution function is known to be normal.
+        This method give continuous results using:
+        * alpha = 3/8
+        * beta = 3/8
+
+    lower:
+        NumPy method kept for backwards compatibility.
+        Takes ``i`` as the interpolation point.
+
+    higher:
+        NumPy method kept for backwards compatibility.
+        Takes ``j`` as the interpolation point.
+
+    nearest:
+        NumPy method kept for backwards compatibility.
+        Takes ``i`` or ``j``, whichever is nearest.
+
+    midpoint:
+        NumPy method kept for backwards compatibility.
+        Uses ``(i + j) / 2``.
 
     Examples
     --------
@@ -3972,20 +4351,42 @@ def quantile(a, q, axis=None, out=None,
     >>> np.quantile(b, 0.5, axis=1, overwrite_input=True)
     array([7.,  2.])
     >>> assert not np.all(a == b)
+
+    See also `numpy.percentile` for a visualization of most methods.
+
+    References
+    ----------
+    .. [1] R. J. Hyndman and Y. Fan,
+       "Sample quantiles in statistical packages,"
+       The American Statistician, 50(4), pp. 361-365, 1996
+
     """
+    if interpolation is not None:
+        method = _check_interpolation_as_method(
+            method, interpolation, "quantile")
+
     q = np.asanyarray(q)
     if not _quantile_is_valid(q):
         raise ValueError("Quantiles must be in the range [0, 1]")
     return _quantile_unchecked(
-        a, q, axis, out, overwrite_input, interpolation, keepdims)
+        a, q, axis, out, overwrite_input, method, keepdims)
 
 
-def _quantile_unchecked(a, q, axis=None, out=None, overwrite_input=False,
-                        interpolation='linear', keepdims=False):
+def _quantile_unchecked(a,
+                        q,
+                        axis=None,
+                        out=None,
+                        overwrite_input=False,
+                        method="linear",
+                        keepdims=False):
     """Assumes that q is in [0, 1], and is an ndarray"""
-    r, k = _ureduce(a, func=_quantile_ureduce_func, q=q, axis=axis, out=out,
+    r, k = _ureduce(a,
+                    func=_quantile_ureduce_func,
+                    q=q,
+                    axis=axis,
+                    out=out,
                     overwrite_input=overwrite_input,
-                    interpolation=interpolation)
+                    method=method)
     if keepdims:
         return r.reshape(q.shape + k)
     else:
@@ -4004,122 +4405,278 @@ def _quantile_is_valid(q):
     return True
 
 
+def _check_interpolation_as_method(method, interpolation, fname):
+    # Deprecated NumPy 1.22, 2021-11-08
+    warnings.warn(
+        f"the `interpolation=` argument to {fname} was renamed to "
+        "`method=`, which has additional options.\n"
+        "Users of the modes 'nearest', 'lower', 'higher', or "
+        "'midpoint' are encouraged to review the method they. "
+        "(Deprecated NumPy 1.22)",
+        DeprecationWarning, stacklevel=4)
+    if method != "linear":
+        # sanity check, we assume this basically never happens
+        raise TypeError(
+            "You shall not pass both `method` and `interpolation`!\n"
+            "(`interpolation` is Deprecated in favor of `method`)")
+    return interpolation
+
+
+def _compute_virtual_index(n, quantiles, alpha: float, beta: float):
+    """
+    Compute the floating point indexes of an array for the linear
+    interpolation of quantiles.
+    n : array_like
+        The sample sizes.
+    quantiles : array_like
+        The quantiles values.
+    alpha : float
+        A constant used to correct the index computed.
+    beta : float
+        A constant used to correct the index computed.
+
+    alpha and beta values depend on the chosen method
+    (see quantile documentation)
+
+    Reference:
+    Hyndman&Fan paper "Sample Quantiles in Statistical Packages",
+    DOI: 10.1080/00031305.1996.10473566
+    """
+    return n * quantiles + (
+            alpha + quantiles * (1 - alpha - beta)
+    ) - 1
+
+
+def _get_gamma(virtual_indexes, previous_indexes, method):
+    """
+    Compute gamma (a.k.a 'm' or 'weight') for the linear interpolation
+    of quantiles.
+
+    virtual_indexes : array_like
+        The indexes where the percentile is supposed to be found in the sorted
+        sample.
+    previous_indexes : array_like
+        The floor values of virtual_indexes.
+    interpolation : dict
+        The interpolation method chosen, which may have a specific rule
+        modifying gamma.
+
+    gamma is usually the fractional part of virtual_indexes but can be modified
+    by the interpolation method.
+    """
+    gamma = np.asanyarray(virtual_indexes - previous_indexes)
+    gamma = method["fix_gamma"](gamma, virtual_indexes)
+    return np.asanyarray(gamma)
+
+
 def _lerp(a, b, t, out=None):
-    """ Linearly interpolate from a to b by a factor of t """
+    """
+    Compute the linear interpolation weighted by gamma on each point of
+    two same shape array.
+
+    a : array_like
+        Left bound.
+    b : array_like
+        Right bound.
+    t : array_like
+        The interpolation weight.
+    out : array_like
+        Output array.
+    """
     diff_b_a = subtract(b, a)
     # asanyarray is a stop-gap until gh-13105
-    lerp_interpolation = asanyarray(add(a, diff_b_a*t, out=out))
-    subtract(b, diff_b_a * (1 - t), out=lerp_interpolation, where=t>=0.5)
+    lerp_interpolation = asanyarray(add(a, diff_b_a * t, out=out))
+    subtract(b, diff_b_a * (1 - t), out=lerp_interpolation, where=t >= 0.5)
     if lerp_interpolation.ndim == 0 and out is None:
         lerp_interpolation = lerp_interpolation[()]  # unpack 0d arrays
     return lerp_interpolation
 
 
-def _quantile_ureduce_func(a, q, axis=None, out=None, overwrite_input=False,
-                           interpolation='linear', keepdims=False):
-    a = asarray(a)
+def _get_gamma_mask(shape, default_value, conditioned_value, where):
+    out = np.full(shape, default_value)
+    np.copyto(out, conditioned_value, where=where, casting="unsafe")
+    return out
 
-    # ufuncs cause 0d array results to decay to scalars (see gh-13105), which
-    # makes them problematic for __setitem__ and attribute access. As a
-    # workaround, we call this on the result of every ufunc on a possibly-0d
-    # array.
-    not_scalar = np.asanyarray
 
-    # prepare a for partitioning
-    if overwrite_input:
-        if axis is None:
-            ap = a.ravel()
-        else:
-            ap = a
-    else:
-        if axis is None:
-            ap = a.flatten()
-        else:
-            ap = a.copy()
+def _discret_interpolation_to_boundaries(index, gamma_condition_fun):
+    previous = np.floor(index)
+    next = previous + 1
+    gamma = index - previous
+    res = _get_gamma_mask(shape=index.shape,
+                          default_value=next,
+                          conditioned_value=previous,
+                          where=gamma_condition_fun(gamma, index)
+                          ).astype(np.intp)
+    # Some methods can lead to out-of-bound integers, clip them:
+    res[res < 0] = 0
+    return res
 
-    if axis is None:
-        axis = 0
 
+def _closest_observation(n, quantiles):
+    gamma_fun = lambda gamma, index: (gamma == 0) & (np.floor(index) % 2 == 0)
+    return _discret_interpolation_to_boundaries((n * quantiles) - 1 - 0.5,
+                                                gamma_fun)
+
+
+def _inverted_cdf(n, quantiles):
+    gamma_fun = lambda gamma, _: (gamma == 0)
+    return _discret_interpolation_to_boundaries((n * quantiles) - 1,
+                                                gamma_fun)
+
+
+def _quantile_ureduce_func(
+        a: np.array,
+        q: np.array,
+        axis: int = None,
+        out=None,
+        overwrite_input: bool = False,
+        method="linear",
+) -> np.array:
     if q.ndim > 2:
         # The code below works fine for nd, but it might not have useful
         # semantics. For now, keep the supported dimensions the same as it was
         # before.
         raise ValueError("q must be a scalar or 1d")
-
-    Nx = ap.shape[axis]
-    indices = not_scalar(q * (Nx - 1))
-    # round fractional indices according to interpolation method
-    if interpolation == 'lower':
-        indices = floor(indices).astype(intp)
-    elif interpolation == 'higher':
-        indices = ceil(indices).astype(intp)
-    elif interpolation == 'midpoint':
-        indices = 0.5 * (floor(indices) + ceil(indices))
-    elif interpolation == 'nearest':
-        indices = around(indices).astype(intp)
-    elif interpolation == 'linear':
-        pass  # keep index as fraction and interpolate
+    if overwrite_input:
+        if axis is None:
+            axis = 0
+            arr = a.ravel()
+        else:
+            arr = a
     else:
-        raise ValueError(
-            "interpolation can only be 'linear', 'lower' 'higher', "
-            "'midpoint', or 'nearest'")
+        if axis is None:
+            axis = 0
+            arr = a.flatten()
+        else:
+            arr = a.copy()
+    result = _quantile(arr,
+                       quantiles=q,
+                       axis=axis,
+                       method=method,
+                       out=out)
+    return result
 
-    # The dimensions of `q` are prepended to the output shape, so we need the
-    # axis being sampled from `ap` to be first.
-    ap = np.moveaxis(ap, axis, 0)
-    del axis
 
-    if np.issubdtype(indices.dtype, np.integer):
-        # take the points along axis
+def _get_indexes(arr, virtual_indexes, valid_values_count):
+    """
+    Get the valid indexes of arr neighbouring virtual_indexes.
+    Note
+    This is a companion function to linear interpolation of
+    Quantiles
 
-        if np.issubdtype(a.dtype, np.inexact):
+    Returns
+    -------
+    (previous_indexes, next_indexes): Tuple
+        A Tuple of virtual_indexes neighbouring indexes
+    """
+    previous_indexes = np.asanyarray(np.floor(virtual_indexes))
+    next_indexes = np.asanyarray(previous_indexes + 1)
+    indexes_above_bounds = virtual_indexes >= valid_values_count - 1
+    # When indexes is above max index, take the max value of the array
+    if indexes_above_bounds.any():
+        previous_indexes[indexes_above_bounds] = -1
+        next_indexes[indexes_above_bounds] = -1
+    # When indexes is below min index, take the min value of the array
+    indexes_below_bounds = virtual_indexes < 0
+    if indexes_below_bounds.any():
+        previous_indexes[indexes_below_bounds] = 0
+        next_indexes[indexes_below_bounds] = 0
+    if np.issubdtype(arr.dtype, np.inexact):
+        # After the sort, slices having NaNs will have for last element a NaN
+        virtual_indexes_nans = np.isnan(virtual_indexes)
+        if virtual_indexes_nans.any():
+            previous_indexes[virtual_indexes_nans] = -1
+            next_indexes[virtual_indexes_nans] = -1
+    previous_indexes = previous_indexes.astype(np.intp)
+    next_indexes = next_indexes.astype(np.intp)
+    return previous_indexes, next_indexes
+
+
+def _quantile(
+        arr: np.array,
+        quantiles: np.array,
+        axis: int = -1,
+        method="linear",
+        out=None,
+):
+    """
+    Private function that doesn't support extended axis or keepdims.
+    These methods are extended to this function using _ureduce
+    See nanpercentile for parameter usage
+    It computes the quantiles of the array for the given axis.
+    A linear interpolation is performed based on the `interpolation`.
+
+    By default, the method is "linear" where alpha == beta == 1 which
+    performs the 7th method of Hyndman&Fan.
+    With "median_unbiased" we get alpha == beta == 1/3
+    thus the 8th method of Hyndman&Fan.
+    """
+    # --- Setup
+    arr = np.asanyarray(arr)
+    values_count = arr.shape[axis]
+    # The dimensions of `q` are prepended to the output shape, so we need the
+    # axis being sampled from `arr` to be last.
+    DATA_AXIS = 0
+    if axis != DATA_AXIS:  # But moveaxis is slow, so only call it if axis!=0.
+        arr = np.moveaxis(arr, axis, destination=DATA_AXIS)
+    # --- Computation of indexes
+    # Index where to find the value in the sorted array.
+    # Virtual because it is a floating point value, not an valid index.
+    # The nearest neighbours are used for interpolation
+    try:
+        method = _QuantileMethods[method]
+    except KeyError:
+        raise ValueError(
+            f"{method!r} is not a valid method. Use one of: "
+            f"{_QuantileMethods.keys()}") from None
+    virtual_indexes = method["get_virtual_index"](values_count, quantiles)
+    virtual_indexes = np.asanyarray(virtual_indexes)
+    if np.issubdtype(virtual_indexes.dtype, np.integer):
+        # No interpolation needed, take the points along axis
+        if np.issubdtype(arr.dtype, np.inexact):
             # may contain nan, which would sort to the end
-            ap.partition(concatenate((indices.ravel(), [-1])), axis=0)
-            n = np.isnan(ap[-1])
+            arr.partition(concatenate((virtual_indexes.ravel(), [-1])), axis=0)
+            slices_having_nans = np.isnan(arr[-1])
         else:
             # cannot contain nan
-            ap.partition(indices.ravel(), axis=0)
-            n = np.array(False, dtype=bool)
-
-        r = take(ap, indices, axis=0, out=out)
-
+            arr.partition(virtual_indexes.ravel(), axis=0)
+            slices_having_nans = np.array(False, dtype=bool)
+        result = take(arr, virtual_indexes, axis=0, out=out)
     else:
-        # weight the points above and below the indices
-
-        indices_below = not_scalar(floor(indices)).astype(intp)
-        indices_above = not_scalar(indices_below + 1)
-        indices_above[indices_above > Nx - 1] = Nx - 1
-
-        if np.issubdtype(a.dtype, np.inexact):
-            # may contain nan, which would sort to the end
-            ap.partition(concatenate((
-                indices_below.ravel(), indices_above.ravel(), [-1]
-            )), axis=0)
-            n = np.isnan(ap[-1])
+        previous_indexes, next_indexes = _get_indexes(arr,
+                                                      virtual_indexes,
+                                                      values_count)
+        # --- Sorting
+        arr.partition(
+            np.unique(np.concatenate(([0, -1],
+                                      previous_indexes.ravel(),
+                                      next_indexes.ravel(),
+                                      ))),
+            axis=DATA_AXIS)
+        if np.issubdtype(arr.dtype, np.inexact):
+            slices_having_nans = np.isnan(
+                take(arr, indices=-1, axis=DATA_AXIS)
+            )
         else:
-            # cannot contain nan
-            ap.partition(concatenate((
-                indices_below.ravel(), indices_above.ravel()
-            )), axis=0)
-            n = np.array(False, dtype=bool)
-
-        weights_shape = indices.shape + (1,) * (ap.ndim - 1)
-        weights_above = not_scalar(indices - indices_below).reshape(weights_shape)
-
-        x_below = take(ap, indices_below, axis=0)
-        x_above = take(ap, indices_above, axis=0)
-
-        r = _lerp(x_below, x_above, weights_above, out=out)
-
-    # if any slice contained a nan, then all results on that slice are also nan
-    if np.any(n):
-        if r.ndim == 0 and out is None:
+            slices_having_nans = None
+        # --- Get values from indexes
+        previous = np.take(arr, previous_indexes, axis=DATA_AXIS)
+        next = np.take(arr, next_indexes, axis=DATA_AXIS)
+        # --- Linear interpolation
+        gamma = _get_gamma(virtual_indexes, previous_indexes, method)
+        result_shape = virtual_indexes.shape + (1,) * (arr.ndim - 1)
+        gamma = gamma.reshape(result_shape)
+        result = _lerp(previous,
+                       next,
+                       gamma,
+                       out=out)
+    if np.any(slices_having_nans):
+        if result.ndim == 0 and out is None:
             # can't write to a scalar
-            r = a.dtype.type(np.nan)
+            result = arr.dtype.type(np.nan)
         else:
-            r[..., n] = a.dtype.type(np.nan)
-
-    return r
+            result[..., slices_having_nans] = np.nan
+    return result
 
 
 def _trapz_dispatcher(y, x=None, dx=None, axis=None):
@@ -4133,13 +4690,13 @@ def trapz(y, x=None, dx=1.0, axis=-1):
 
     If `x` is provided, the integration happens in sequence along its
     elements - they are not sorted.
-    
+
     Integrate `y` (`x`) along each 1d slice on the given axis, compute
     :math:`\int y(x) dx`.
     When `x` is specified, this integrates along the parametric curve,
     computing :math:`\int_t y(t) dt =
     \int_t y(t) \left.\frac{dx}{dt}\right|_{x=x(t)} dt`.
-    
+
     Parameters
     ----------
     y : array_like
@@ -4160,7 +4717,7 @@ def trapz(y, x=None, dx=1.0, axis=-1):
         a single axis by the trapezoidal rule. If 'y' is a 1-dimensional array,
         then the result is a float. If 'n' is greater than 1, then the result
         is an 'n-1' dimensional array.
-        
+
     See Also
     --------
     sum, cumsum
@@ -4189,16 +4746,16 @@ def trapz(y, x=None, dx=1.0, axis=-1):
     8.0
     >>> np.trapz([1,2,3], dx=2)
     8.0
-    
+
     Using a decreasing `x` corresponds to integrating in reverse:
-    
-    >>> np.trapz([1,2,3], x=[8,6,4])  
+
+    >>> np.trapz([1,2,3], x=[8,6,4])
     -8.0
-    
+
     More generally `x` is used to integrate along a parametric curve.
     This finds the area of a circle, noting we repeat the sample which closes
     the curve:
-    
+
     >>> theta = np.linspace(0, 2 * np.pi, num=1000, endpoint=True)
     >>> np.trapz(np.cos(theta), x=np.sin(theta))
     3.141571941375841
@@ -4267,7 +4824,13 @@ def meshgrid(*xi, copy=True, sparse=False, indexing='xy'):
 
         .. versionadded:: 1.7.0
     sparse : bool, optional
-        If True a sparse grid is returned in order to conserve memory.
+        If True the shape of the returned coordinate array for dimension *i*
+        is reduced from ``(N1, ..., Ni, ... Nn)`` to
+        ``(1, ..., 1, Ni, 1, ..., 1)``.  These sparse coordinate grids are
+        intended to be use with :ref:`basics.broadcasting`.  When all
+        coordinates are used in an expression, broadcasting still leads to a
+        fully-dimensonal result array.
+
         Default is False.
 
         .. versionadded:: 1.7.0
@@ -4301,12 +4864,12 @@ def meshgrid(*xi, copy=True, sparse=False, indexing='xy'):
     'xy' indexing and (M, N, P) for 'ij' indexing.  The difference is
     illustrated by the following code snippet::
 
-        xv, yv = np.meshgrid(x, y, sparse=False, indexing='ij')
+        xv, yv = np.meshgrid(x, y, indexing='ij')
         for i in range(nx):
             for j in range(ny):
                 # treat xv[i,j], yv[i,j]
 
-        xv, yv = np.meshgrid(x, y, sparse=False, indexing='xy')
+        xv, yv = np.meshgrid(x, y, indexing='xy')
         for i in range(nx):
             for j in range(ny):
                 # treat xv[j,i], yv[j,i]
@@ -4338,17 +4901,30 @@ def meshgrid(*xi, copy=True, sparse=False, indexing='xy'):
     array([[0.],
            [1.]])
 
-    `meshgrid` is very useful to evaluate functions on a grid.
+    `meshgrid` is very useful to evaluate functions on a grid.  If the
+    function depends on all coordinates, you can use the parameter
+    ``sparse=True`` to save memory and computation time.
+
+    >>> x = np.linspace(-5, 5, 101)
+    >>> y = np.linspace(-5, 5, 101)
+    >>> # full coorindate arrays
+    >>> xx, yy = np.meshgrid(x, y)
+    >>> zz = np.sqrt(xx**2 + yy**2)
+    >>> xx.shape, yy.shape, zz.shape
+    ((101, 101), (101, 101), (101, 101))
+    >>> # sparse coordinate arrays
+    >>> xs, ys = np.meshgrid(x, y, sparse=True)
+    >>> zs = np.sqrt(xs**2 + ys**2)
+    >>> xs.shape, ys.shape, zs.shape
+    ((1, 101), (101, 1), (101, 101))
+    >>> np.array_equal(zz, zs)
+    True
 
     >>> import matplotlib.pyplot as plt
-    >>> x = np.arange(-5, 5, 0.1)
-    >>> y = np.arange(-5, 5, 0.1)
-    >>> xx, yy = np.meshgrid(x, y, sparse=True)
-    >>> z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
-    >>> h = plt.contourf(x, y, z)
+    >>> h = plt.contourf(x, y, zs)
     >>> plt.axis('scaled')
+    >>> plt.colorbar()
     >>> plt.show()
-
     """
     ndim = len(xi)
 
@@ -4701,9 +5277,8 @@ def insert(arr, obj, values, axis=None):
     if indices.size == 1:
         index = indices.item()
         if index < -N or index > N:
-            raise IndexError(
-                "index %i is out of bounds for axis %i with "
-                "size %i" % (obj, axis, N))
+            raise IndexError(f"index {obj} is out of bounds for axis {axis} "
+                             f"with size {N}")
         if (index < 0):
             index += N
 
index 69c615c9c603defe4cc63ae70712a5ec5a82ddb5..7e227f9da52d44d1b78d22ccf7ca8274831e2e64 100644 (file)
@@ -1,7 +1,60 @@
-from typing import List
+import sys
+from typing import (
+    Literal as L,
+    List,
+    Type,
+    Sequence,
+    Tuple,
+    Union,
+    Any,
+    TypeVar,
+    Iterator,
+    overload,
+    Callable,
+    Protocol,
+    SupportsIndex,
+    Iterable,
+    SupportsInt,
+)
+
+if sys.version_info >= (3, 10):
+    from typing import TypeGuard
+else:
+    from typing_extensions import TypeGuard
 
 from numpy import (
     vectorize as vectorize,
+    ufunc,
+    dtype,
+    generic,
+    floating,
+    complexfloating,
+    intp,
+    float64,
+    complex128,
+    timedelta64,
+    datetime64,
+    object_,
+    _OrderKACF,
+)
+
+from numpy.typing import (
+    NDArray,
+    ArrayLike,
+    DTypeLike,
+    _ShapeLike,
+    _ScalarLike_co,
+    _SupportsDType,
+    _FiniteNestedSequence,
+    _SupportsArray,
+    _ArrayLikeInt_co,
+    _ArrayLikeFloat_co,
+    _ArrayLikeComplex_co,
+    _ArrayLikeTD64_co,
+    _ArrayLikeDT64_co,
+    _ArrayLikeObject_co,
+    _FloatLike_co,
+    _ComplexLike_co,
 )
 
 from numpy.core.function_base import (
@@ -12,46 +65,640 @@ from numpy.core.multiarray import (
     add_docstring as add_docstring,
     bincount as bincount,
 )
+
 from numpy.core.umath import _add_newdoc_ufunc
 
+_T = TypeVar("_T")
+_T_co = TypeVar("_T_co", covariant=True)
+_SCT = TypeVar("_SCT", bound=generic)
+_ArrayType = TypeVar("_ArrayType", bound=NDArray[Any])
+
+_2Tuple = Tuple[_T, _T]
+_ArrayLike = _FiniteNestedSequence[_SupportsArray[dtype[_SCT]]]
+_DTypeLike = Union[
+    dtype[_SCT],
+    Type[_SCT],
+    _SupportsDType[dtype[_SCT]],
+]
+
+class _TrimZerosSequence(Protocol[_T_co]):
+    def __len__(self) -> int: ...
+    def __getitem__(self, key: slice, /) -> _T_co: ...
+    def __iter__(self) -> Iterator[Any]: ...
+
+class _SupportsWriteFlush(Protocol):
+    def write(self, s: str, /) -> object: ...
+    def flush(self) -> object: ...
+
 __all__: List[str]
 
-add_newdoc_ufunc = _add_newdoc_ufunc
-
-def rot90(m, k=..., axes = ...): ...
-def flip(m, axis=...): ...
-def iterable(y): ...
-def average(a, axis=..., weights=..., returned=...): ...
-def asarray_chkfinite(a, dtype=..., order=...): ...
-def piecewise(x, condlist, funclist, *args, **kw): ...
-def select(condlist, choicelist, default=...): ...
-def copy(a, order=..., subok=...): ...
-def gradient(f, *varargs, axis=..., edge_order=...): ...
-def diff(a, n=..., axis=..., prepend = ..., append = ...): ...
-def interp(x, xp, fp, left=..., right=..., period=...): ...
-def angle(z, deg=...): ...
-def unwrap(p, discont = ..., axis=..., *, period=...): ...
-def sort_complex(a): ...
-def trim_zeros(filt, trim=...): ...
-def extract(condition, arr): ...
-def place(arr, mask, vals): ...
-def disp(mesg, device=..., linefeed=...): ...
-def cov(m, y=..., rowvar=..., bias=..., ddof=..., fweights=..., aweights=..., *, dtype=...): ...
-def corrcoef(x, y=..., rowvar=..., bias = ..., ddof = ..., *, dtype=...): ...
-def blackman(M): ...
-def bartlett(M): ...
-def hanning(M): ...
-def hamming(M): ...
-def i0(x): ...
-def kaiser(M, beta): ...
-def sinc(x): ...
-def msort(a): ...
-def median(a, axis=..., out=..., overwrite_input=..., keepdims=...): ...
-def percentile(a, q, axis=..., out=..., overwrite_input=..., interpolation=..., keepdims=...): ...
-def quantile(a, q, axis=..., out=..., overwrite_input=..., interpolation=..., keepdims=...): ...
-def trapz(y, x=..., dx=..., axis=...): ...
-def meshgrid(*xi, copy=..., sparse=..., indexing=...): ...
-def delete(arr, obj, axis=...): ...
-def insert(arr, obj, values, axis=...): ...
-def append(arr, values, axis=...): ...
-def digitize(x, bins, right=...): ...
+# NOTE: This is in reality a re-export of `np.core.umath._add_newdoc_ufunc`
+def add_newdoc_ufunc(ufunc: ufunc, new_docstring: str, /) -> None: ...
+
+@overload
+def rot90(
+    m: _ArrayLike[_SCT],
+    k: int = ...,
+    axes: Tuple[int, int] = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def rot90(
+    m: ArrayLike,
+    k: int = ...,
+    axes: Tuple[int, int] = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def flip(m: _SCT, axis: None = ...) -> _SCT: ...
+@overload
+def flip(m: _ScalarLike_co, axis: None = ...) -> Any: ...
+@overload
+def flip(m: _ArrayLike[_SCT], axis: None | _ShapeLike = ...) -> NDArray[_SCT]: ...
+@overload
+def flip(m: ArrayLike, axis: None | _ShapeLike = ...) -> NDArray[Any]: ...
+
+def iterable(y: object) -> TypeGuard[Iterable[Any]]: ...
+
+@overload
+def average(
+    a: _ArrayLikeFloat_co,
+    axis: None = ...,
+    weights: None | _ArrayLikeFloat_co= ...,
+    returned: L[False] = ...,
+) -> floating[Any]: ...
+@overload
+def average(
+    a: _ArrayLikeComplex_co,
+    axis: None = ...,
+    weights: None | _ArrayLikeComplex_co = ...,
+    returned: L[False] = ...,
+) -> complexfloating[Any, Any]: ...
+@overload
+def average(
+    a: _ArrayLikeObject_co,
+    axis: None = ...,
+    weights: None | Any = ...,
+    returned: L[False] = ...,
+) -> Any: ...
+@overload
+def average(
+    a: _ArrayLikeFloat_co,
+    axis: None = ...,
+    weights: None | _ArrayLikeFloat_co= ...,
+    returned: L[True] = ...,
+) -> _2Tuple[floating[Any]]: ...
+@overload
+def average(
+    a: _ArrayLikeComplex_co,
+    axis: None = ...,
+    weights: None | _ArrayLikeComplex_co = ...,
+    returned: L[True] = ...,
+) -> _2Tuple[complexfloating[Any, Any]]: ...
+@overload
+def average(
+    a: _ArrayLikeObject_co,
+    axis: None = ...,
+    weights: None | Any = ...,
+    returned: L[True] = ...,
+) -> _2Tuple[Any]: ...
+@overload
+def average(
+    a: _ArrayLikeComplex_co | _ArrayLikeObject_co,
+    axis: None | _ShapeLike = ...,
+    weights: None | Any = ...,
+    returned: L[False] = ...,
+) -> Any: ...
+@overload
+def average(
+    a: _ArrayLikeComplex_co | _ArrayLikeObject_co,
+    axis: None | _ShapeLike = ...,
+    weights: None | Any = ...,
+    returned: L[True] = ...,
+) -> _2Tuple[Any]: ...
+
+@overload
+def asarray_chkfinite(
+    a: _ArrayLike[_SCT],
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def asarray_chkfinite(
+    a: object,
+    dtype: None = ...,
+    order: _OrderKACF = ...,
+) -> NDArray[Any]: ...
+@overload
+def asarray_chkfinite(
+    a: Any,
+    dtype: _DTypeLike[_SCT],
+    order: _OrderKACF = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def asarray_chkfinite(
+    a: Any,
+    dtype: DTypeLike,
+    order: _OrderKACF = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def piecewise(
+    x: _ArrayLike[_SCT],
+    condlist: ArrayLike,
+    funclist: Sequence[Any | Callable[..., Any]],
+    *args: Any,
+    **kw: Any,
+) -> NDArray[_SCT]: ...
+@overload
+def piecewise(
+    x: ArrayLike,
+    condlist: ArrayLike,
+    funclist: Sequence[Any | Callable[..., Any]],
+    *args: Any,
+    **kw: Any,
+) -> NDArray[Any]: ...
+
+def select(
+    condlist: Sequence[ArrayLike],
+    choicelist: Sequence[ArrayLike],
+    default: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def copy(
+    a: _ArrayType,
+    order: _OrderKACF,
+    subok: L[True],
+) -> _ArrayType: ...
+@overload
+def copy(
+    a: _ArrayType,
+    order: _OrderKACF = ...,
+    *,
+    subok: L[True],
+) -> _ArrayType: ...
+@overload
+def copy(
+    a: _ArrayLike[_SCT],
+    order: _OrderKACF = ...,
+    subok: L[False] = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def copy(
+    a: ArrayLike,
+    order: _OrderKACF = ...,
+    subok: L[False] = ...,
+) -> NDArray[Any]: ...
+
+def gradient(
+    f: ArrayLike,
+    *varargs: ArrayLike,
+    axis: None | _ShapeLike = ...,
+    edge_order: L[1, 2] = ...,
+) -> Any: ...
+
+@overload
+def diff(
+    a: _T,
+    n: L[0],
+    axis: SupportsIndex = ...,
+    prepend: ArrayLike = ...,
+    append: ArrayLike = ...,
+) -> _T: ...
+@overload
+def diff(
+    a: ArrayLike,
+    n: int = ...,
+    axis: SupportsIndex = ...,
+    prepend: ArrayLike = ...,
+    append: ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def interp(
+    x: _ArrayLikeFloat_co,
+    xp: _ArrayLikeFloat_co,
+    fp: _ArrayLikeFloat_co,
+    left: None | _FloatLike_co = ...,
+    right: None | _FloatLike_co = ...,
+    period: None | _FloatLike_co = ...,
+) -> NDArray[float64]: ...
+@overload
+def interp(
+    x: _ArrayLikeFloat_co,
+    xp: _ArrayLikeFloat_co,
+    fp: _ArrayLikeComplex_co,
+    left: None | _ComplexLike_co = ...,
+    right: None | _ComplexLike_co = ...,
+    period: None | _FloatLike_co = ...,
+) -> NDArray[complex128]: ...
+
+@overload
+def angle(z: _ArrayLikeFloat_co, deg: bool = ...) -> floating[Any]: ...
+@overload
+def angle(z: _ArrayLikeComplex_co, deg: bool = ...) -> complexfloating[Any, Any]: ...
+@overload
+def angle(z: _ArrayLikeObject_co, deg: bool = ...) -> Any: ...
+
+@overload
+def unwrap(
+    p: _ArrayLikeFloat_co,
+    discont: None | float = ...,
+    axis: int = ...,
+    *,
+    period: float = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def unwrap(
+    p: _ArrayLikeObject_co,
+    discont: None | float = ...,
+    axis: int = ...,
+    *,
+    period: float = ...,
+) -> NDArray[object_]: ...
+
+def sort_complex(a: ArrayLike) -> NDArray[complexfloating[Any, Any]]: ...
+
+def trim_zeros(
+    filt: _TrimZerosSequence[_T],
+    trim: L["f", "b", "fb", "bf"] = ...,
+) -> _T: ...
+
+@overload
+def extract(condition: ArrayLike, arr: _ArrayLike[_SCT]) -> NDArray[_SCT]: ...
+@overload
+def extract(condition: ArrayLike, arr: ArrayLike) -> NDArray[Any]: ...
+
+def place(arr: NDArray[Any], mask: ArrayLike, vals: Any) -> None: ...
+
+def disp(
+    mesg: object,
+    device: None | _SupportsWriteFlush = ...,
+    linefeed: bool = ...,
+) -> None: ...
+
+@overload
+def cov(
+    m: _ArrayLikeFloat_co,
+    y: None | _ArrayLikeFloat_co = ...,
+    rowvar: bool = ...,
+    bias: bool = ...,
+    ddof: None | SupportsIndex | SupportsInt = ...,
+    fweights: None | ArrayLike = ...,
+    aweights: None | ArrayLike = ...,
+    *,
+    dtype: None = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def cov(
+    m: _ArrayLikeComplex_co,
+    y: None | _ArrayLikeComplex_co = ...,
+    rowvar: bool = ...,
+    bias: bool = ...,
+    ddof: None | SupportsIndex | SupportsInt = ...,
+    fweights: None | ArrayLike = ...,
+    aweights: None | ArrayLike = ...,
+    *,
+    dtype: None = ...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def cov(
+    m: _ArrayLikeComplex_co,
+    y: None | _ArrayLikeComplex_co = ...,
+    rowvar: bool = ...,
+    bias: bool = ...,
+    ddof: None | SupportsIndex | SupportsInt = ...,
+    fweights: None | ArrayLike = ...,
+    aweights: None | ArrayLike = ...,
+    *,
+    dtype: _DTypeLike[_SCT],
+) -> NDArray[_SCT]: ...
+@overload
+def cov(
+    m: _ArrayLikeComplex_co,
+    y: None | _ArrayLikeComplex_co = ...,
+    rowvar: bool = ...,
+    bias: bool = ...,
+    ddof: None | SupportsIndex | SupportsInt = ...,
+    fweights: None | ArrayLike = ...,
+    aweights: None | ArrayLike = ...,
+    *,
+    dtype: DTypeLike,
+) -> NDArray[Any]: ...
+
+# NOTE `bias` and `ddof` have been deprecated
+@overload
+def corrcoef(
+    m: _ArrayLikeFloat_co,
+    y: None | _ArrayLikeFloat_co = ...,
+    rowvar: bool = ...,
+    *,
+    dtype: None = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def corrcoef(
+    m: _ArrayLikeComplex_co,
+    y: None | _ArrayLikeComplex_co = ...,
+    rowvar: bool = ...,
+    *,
+    dtype: None = ...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def corrcoef(
+    m: _ArrayLikeComplex_co,
+    y: None | _ArrayLikeComplex_co = ...,
+    rowvar: bool = ...,
+    *,
+    dtype: _DTypeLike[_SCT],
+) -> NDArray[_SCT]: ...
+@overload
+def corrcoef(
+    m: _ArrayLikeComplex_co,
+    y: None | _ArrayLikeComplex_co = ...,
+    rowvar: bool = ...,
+    *,
+    dtype: DTypeLike,
+) -> NDArray[Any]: ...
+
+def blackman(M: _FloatLike_co) -> NDArray[floating[Any]]: ...
+
+def bartlett(M: _FloatLike_co) -> NDArray[floating[Any]]: ...
+
+def hanning(M: _FloatLike_co) -> NDArray[floating[Any]]: ...
+
+def hamming(M: _FloatLike_co) -> NDArray[floating[Any]]: ...
+
+def i0(x: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: ...
+
+def kaiser(
+    M: _FloatLike_co,
+    beta: _FloatLike_co,
+) -> NDArray[floating[Any]]: ...
+
+@overload
+def sinc(x: _FloatLike_co) -> floating[Any]: ...
+@overload
+def sinc(x: _ComplexLike_co) -> complexfloating[Any, Any]: ...
+@overload
+def sinc(x: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: ...
+@overload
+def sinc(x: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: ...
+
+@overload
+def msort(a: _ArrayType) -> _ArrayType: ...
+@overload
+def msort(a: _ArrayLike[_SCT]) -> NDArray[_SCT]: ...
+@overload
+def msort(a: ArrayLike) -> NDArray[Any]: ...
+
+@overload
+def median(
+    a: _ArrayLikeFloat_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    keepdims: L[False] = ...,
+) -> floating[Any]: ...
+@overload
+def median(
+    a: _ArrayLikeComplex_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    keepdims: L[False] = ...,
+) -> complexfloating[Any, Any]: ...
+@overload
+def median(
+    a: _ArrayLikeTD64_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    keepdims: L[False] = ...,
+) -> timedelta64: ...
+@overload
+def median(
+    a: _ArrayLikeObject_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    keepdims: L[False] = ...,
+) -> Any: ...
+@overload
+def median(
+    a: _ArrayLikeFloat_co | _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeObject_co,
+    axis: None | _ShapeLike = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    keepdims: bool = ...,
+) -> Any: ...
+@overload
+def median(
+    a: _ArrayLikeFloat_co | _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeObject_co,
+    axis: None | _ShapeLike = ...,
+    out: _ArrayType = ...,
+    overwrite_input: bool = ...,
+    keepdims: bool = ...,
+) -> _ArrayType: ...
+
+_MethodKind = L[
+    "inverted_cdf",
+    "averaged_inverted_cdf",
+    "closest_observation",
+    "interpolated_inverted_cdf",
+    "hazen",
+    "weibull",
+    "linear",
+    "median_unbiased",
+    "normal_unbiased",
+    "lower",
+    "higher",
+    "midpoint",
+    "nearest",
+]
+
+@overload
+def percentile(
+    a: _ArrayLikeFloat_co,
+    q: _FloatLike_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    method: _MethodKind = ...,
+    keepdims: L[False] = ...,
+) -> floating[Any]: ...
+@overload
+def percentile(
+    a: _ArrayLikeComplex_co,
+    q: _FloatLike_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    method: _MethodKind = ...,
+    keepdims: L[False] = ...,
+) -> complexfloating[Any, Any]: ...
+@overload
+def percentile(
+    a: _ArrayLikeTD64_co,
+    q: _FloatLike_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    method: _MethodKind = ...,
+    keepdims: L[False] = ...,
+) -> timedelta64: ...
+@overload
+def percentile(
+    a: _ArrayLikeDT64_co,
+    q: _FloatLike_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    method: _MethodKind = ...,
+    keepdims: L[False] = ...,
+) -> datetime64: ...
+@overload
+def percentile(
+    a: _ArrayLikeObject_co,
+    q: _FloatLike_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    method: _MethodKind = ...,
+    keepdims: L[False] = ...,
+) -> Any: ...
+@overload
+def percentile(
+    a: _ArrayLikeFloat_co,
+    q: _ArrayLikeFloat_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    method: _MethodKind = ...,
+    keepdims: L[False] = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def percentile(
+    a: _ArrayLikeComplex_co,
+    q: _ArrayLikeFloat_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    method: _MethodKind = ...,
+    keepdims: L[False] = ...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def percentile(
+    a: _ArrayLikeTD64_co,
+    q: _ArrayLikeFloat_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    method: _MethodKind = ...,
+    keepdims: L[False] = ...,
+) -> NDArray[timedelta64]: ...
+@overload
+def percentile(
+    a: _ArrayLikeDT64_co,
+    q: _ArrayLikeFloat_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    method: _MethodKind = ...,
+    keepdims: L[False] = ...,
+) -> NDArray[datetime64]: ...
+@overload
+def percentile(
+    a: _ArrayLikeObject_co,
+    q: _ArrayLikeFloat_co,
+    axis: None = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    method: _MethodKind = ...,
+    keepdims: L[False] = ...,
+) -> NDArray[object_]: ...
+@overload
+def percentile(
+    a: _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeTD64_co | _ArrayLikeObject_co,
+    q: _ArrayLikeFloat_co,
+    axis: None | _ShapeLike = ...,
+    out: None = ...,
+    overwrite_input: bool = ...,
+    method: _MethodKind = ...,
+    keepdims: bool = ...,
+) -> Any: ...
+@overload
+def percentile(
+    a: _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeTD64_co | _ArrayLikeObject_co,
+    q: _ArrayLikeFloat_co,
+    axis: None | _ShapeLike = ...,
+    out: _ArrayType = ...,
+    overwrite_input: bool = ...,
+    method: _MethodKind = ...,
+    keepdims: bool = ...,
+) -> _ArrayType: ...
+
+# NOTE: Not an alias, but they do have identical signatures
+# (that we can reuse)
+quantile = percentile
+
+# TODO: Returns a scalar for <= 1D array-likes; returns an ndarray otherwise
+def trapz(
+    y: _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeObject_co,
+    x: None | _ArrayLikeComplex_co | _ArrayLikeTD64_co | _ArrayLikeObject_co = ...,
+    dx: float = ...,
+    axis: SupportsIndex = ...,
+) -> Any: ...
+
+def meshgrid(
+    *xi: ArrayLike,
+    copy: bool = ...,
+    sparse: bool = ...,
+    indexing: L["xy", "ij"] = ...,
+) -> List[NDArray[Any]]: ...
+
+@overload
+def delete(
+    arr: _ArrayLike[_SCT],
+    obj: slice | _ArrayLikeInt_co,
+    axis: None | SupportsIndex = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def delete(
+    arr: ArrayLike,
+    obj: slice | _ArrayLikeInt_co,
+    axis: None | SupportsIndex = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def insert(
+    arr: _ArrayLike[_SCT],
+    obj: slice | _ArrayLikeInt_co,
+    values: ArrayLike,
+    axis: None | SupportsIndex = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def insert(
+    arr: ArrayLike,
+    obj: slice | _ArrayLikeInt_co,
+    values: ArrayLike,
+    axis: None | SupportsIndex = ...,
+) -> NDArray[Any]: ...
+
+def append(
+    arr: ArrayLike,
+    values: ArrayLike,
+    axis: None | SupportsIndex = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def digitize(
+    x: _FloatLike_co,
+    bins: _ArrayLikeFloat_co,
+    right: bool = ...,
+) -> intp: ...
+@overload
+def digitize(
+    x: _ArrayLikeFloat_co,
+    bins: _ArrayLikeFloat_co,
+    right: bool = ...,
+) -> NDArray[intp]: ...
index 25a33e3aea90dbc51e55bb2ee7f69a00de947a59..2ceb60793c7ecced4f54473f0b5e2037fce4181e 100644 (file)
@@ -1,7 +1,51 @@
-from typing import List
+from typing import (
+    Literal as L,
+    List,
+    Tuple,
+    Any,
+    SupportsIndex,
+    Sequence,
+)
+
+from numpy.typing import (
+    NDArray,
+    ArrayLike,
+)
+
+_BinKind = L[
+    "stone",
+    "auto",
+    "doane",
+    "fd",
+    "rice",
+    "scott",
+    "sqrt",
+    "sturges",
+]
 
 __all__: List[str]
 
-def histogram_bin_edges(a, bins=..., range=..., weights=...): ...
-def histogram(a, bins=..., range=..., normed=..., weights=..., density=...): ...
-def histogramdd(sample, bins=..., range=..., normed=..., weights=..., density=...): ...
+def histogram_bin_edges(
+    a: ArrayLike,
+    bins: _BinKind | SupportsIndex | ArrayLike = ...,
+    range: None | Tuple[float, float] = ...,
+    weights: None | ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+def histogram(
+    a: ArrayLike,
+    bins: _BinKind | SupportsIndex | ArrayLike = ...,
+    range: None | Tuple[float, float] = ...,
+    normed: None = ...,
+    weights: None | ArrayLike = ...,
+    density: bool = ...,
+) -> Tuple[NDArray[Any], NDArray[Any]]: ...
+
+def histogramdd(
+    sample: ArrayLike,
+    bins: SupportsIndex | ArrayLike = ...,
+    range: Sequence[Tuple[float, float]] = ...,
+    normed: None | bool = ...,
+    weights: None | ArrayLike = ...,
+    density: None | bool = ...,
+) -> Tuple[NDArray[Any], List[NDArray[Any]]]: ...
index 72d8e9de4f75036506905b0bd491a773ae44b39f..2a4402c89e48df7b71030c7a93d5cbef2c36611c 100644 (file)
@@ -149,9 +149,9 @@ class nd_grid:
         try:
             size = []
             typ = int
-            for k in range(len(key)):
-                step = key[k].step
-                start = key[k].start
+            for kk in key:
+                step = kk.step
+                start = kk.start
                 if start is None:
                     start = 0
                 if step is None:
@@ -161,19 +161,19 @@ class nd_grid:
                     typ = float
                 else:
                     size.append(
-                        int(math.ceil((key[k].stop - start)/(step*1.0))))
+                        int(math.ceil((kk.stop - start) / (step * 1.0))))
                 if (isinstance(step, (_nx.floating, float)) or
                         isinstance(start, (_nx.floating, float)) or
-                        isinstance(key[k].stop, (_nx.floating, float))):
+                        isinstance(kk.stop, (_nx.floating, float))):
                     typ = float
             if self.sparse:
                 nn = [_nx.arange(_x, dtype=_t)
                       for _x, _t in zip(size, (typ,)*len(size))]
             else:
                 nn = _nx.indices(size, typ)
-            for k in range(len(size)):
-                step = key[k].step
-                start = key[k].start
+            for k, kk in enumerate(key):
+                step = kk.step
+                start = kk.start
                 if start is None:
                     start = 0
                 if step is None:
@@ -181,7 +181,7 @@ class nd_grid:
                 if isinstance(step, (_nx.complexfloating, complex)):
                     step = int(abs(step))
                     if step != 1:
-                        step = (key[k].stop - start)/float(step-1)
+                        step = (kk.stop - start) / float(step - 1)
                 nn[k] = (nn[k]*step+start)
             if self.sparse:
                 slobj = [_nx.newaxis]*len(size)
@@ -201,7 +201,6 @@ class nd_grid:
                 length = int(step)
                 if step != 1:
                     step = (key.stop-start)/float(step-1)
-                stop = key.stop + step
                 return _nx.arange(0, length, 1, float)*step + start
             else:
                 return _nx.arange(start, stop, step)
@@ -631,7 +630,8 @@ class ndindex:
 
     Examples
     --------
-    # dimensions as individual arguments
+    Dimensions as individual arguments
+    
     >>> for index in np.ndindex(3, 2, 1):
     ...     print(index)
     (0, 0, 0)
@@ -641,7 +641,8 @@ class ndindex:
     (2, 0, 0)
     (2, 1, 0)
 
-    # same dimensions - but in a tuple (3, 2, 1)
+    Same dimensions - but in a tuple ``(3, 2, 1)``
+    
     >>> for index in np.ndindex((3, 2, 1)):
     ...     print(index)
     (0, 0, 0)
index a3bfef6b6406e0639dc8db90792b819837f58f3b..d16faf81a0bbb426e3a43d0b9d0f61039227d2ea 100644 (file)
@@ -1,4 +1,3 @@
-import sys
 from typing import (
     Any,
     Tuple,
@@ -8,6 +7,8 @@ from typing import (
     List,
     Union,
     Sequence,
+    Literal,
+    SupportsIndex,
 )
 
 from numpy import (
@@ -32,7 +33,7 @@ from numpy.typing import (
     # Arrays
     ArrayLike,
     _NestedSequence,
-    _RecursiveSequence,
+    _FiniteNestedSequence,
     NDArray,
     _ArrayLikeInt,
 
@@ -44,10 +45,10 @@ from numpy.typing import (
     _ShapeLike,
 )
 
-if sys.version_info >= (3, 8):
-    from typing import Literal, SupportsIndex
-else:
-    from typing_extensions import Literal, SupportsIndex
+from numpy.core.multiarray import (
+    unravel_index as unravel_index,
+    ravel_multi_index as ravel_multi_index,
+)
 
 _T = TypeVar("_T")
 _DType = TypeVar("_DType", bound=dtype[Any])
@@ -58,49 +59,19 @@ _ArrayType = TypeVar("_ArrayType", bound=ndarray[Any, Any])
 __all__: List[str]
 
 @overload
-def unravel_index(  # type: ignore[misc]
-    indices: Union[int, integer[Any]],
-    shape: _ShapeLike,
-    order: _OrderCF = ...
-) -> Tuple[intp, ...]: ...
-@overload
-def unravel_index(
-    indices: _ArrayLikeInt,
-    shape: _ShapeLike,
-    order: _OrderCF = ...
-) -> Tuple[NDArray[intp], ...]: ...
-
-@overload
-def ravel_multi_index(  # type: ignore[misc]
-    multi_index: Sequence[Union[int, integer[Any]]],
-    dims: _ShapeLike,
-    mode: Union[_ModeKind, Tuple[_ModeKind, ...]] = ...,
-    order: _OrderCF = ...
-) -> intp: ...
-@overload
-def ravel_multi_index(
-    multi_index: Sequence[_ArrayLikeInt],
-    dims: _ShapeLike,
-    mode: Union[_ModeKind, Tuple[_ModeKind, ...]] = ...,
-    order: _OrderCF = ...
-) -> NDArray[intp]: ...
-
-@overload
-def ix_(*args: _NestedSequence[_SupportsDType[_DType]]) -> Tuple[ndarray[Any, _DType], ...]: ...
-@overload
-def ix_(*args: _NestedSequence[str]) -> Tuple[NDArray[str_], ...]: ...
+def ix_(*args: _FiniteNestedSequence[_SupportsDType[_DType]]) -> Tuple[ndarray[Any, _DType], ...]: ...
 @overload
-def ix_(*args: _NestedSequence[bytes]) -> Tuple[NDArray[bytes_], ...]: ...
+def ix_(*args: str | _NestedSequence[str]) -> Tuple[NDArray[str_], ...]: ...
 @overload
-def ix_(*args: _NestedSequence[bool]) -> Tuple[NDArray[bool_], ...]: ...
+def ix_(*args: bytes | _NestedSequence[bytes]) -> Tuple[NDArray[bytes_], ...]: ...
 @overload
-def ix_(*args: _NestedSequence[int]) -> Tuple[NDArray[int_], ...]: ...
+def ix_(*args: bool | _NestedSequence[bool]) -> Tuple[NDArray[bool_], ...]: ...
 @overload
-def ix_(*args: _NestedSequence[float]) -> Tuple[NDArray[float_], ...]: ...
+def ix_(*args: int | _NestedSequence[int]) -> Tuple[NDArray[int_], ...]: ...
 @overload
-def ix_(*args: _NestedSequence[complex]) -> Tuple[NDArray[complex_], ...]: ...
+def ix_(*args: float | _NestedSequence[float]) -> Tuple[NDArray[float_], ...]: ...
 @overload
-def ix_(*args: _RecursiveSequence) -> Tuple[NDArray[Any], ...]: ...
+def ix_(*args: complex | _NestedSequence[complex]) -> Tuple[NDArray[complex_], ...]: ...
 
 class nd_grid(Generic[_BoolType]):
     sparse: _BoolType
index 2c2c3435bc1f1789bda2d45a3d62f122e6c3916e..d7ea1ca65b7d8ffdd17f37bd4b0d52ef521b03a2 100644 (file)
@@ -160,8 +160,12 @@ def _remove_nan_1d(arr1d, overwrite_input=False):
         True if `res` can be modified in place, given the constraint on the
         input
     """
+    if arr1d.dtype == object:
+        # object arrays do not support `isnan` (gh-9009), so make a guess
+        c = np.not_equal(arr1d, arr1d, dtype=bool)
+    else:
+        c = np.isnan(arr1d)
 
-    c = np.isnan(arr1d)
     s = np.nonzero(c)[0]
     if s.size == arr1d.size:
         warnings.warn("All-NaN slice encountered", RuntimeWarning,
@@ -214,19 +218,25 @@ def _divide_by_count(a, b, out=None):
                 return np.divide(a, b, out=out, casting='unsafe')
         else:
             if out is None:
-                return a.dtype.type(a / b)
+                # Precaution against reduced object arrays
+                try:
+                    return a.dtype.type(a / b)
+                except AttributeError:
+                    return a / b
             else:
                 # This is questionable, but currently a numpy scalar can
                 # be output to a zero dimensional array.
                 return np.divide(a, b, out=out, casting='unsafe')
 
 
-def _nanmin_dispatcher(a, axis=None, out=None, keepdims=None):
+def _nanmin_dispatcher(a, axis=None, out=None, keepdims=None,
+                       initial=None, where=None):
     return (a, out)
 
 
 @array_function_dispatch(_nanmin_dispatcher)
-def nanmin(a, axis=None, out=None, keepdims=np._NoValue):
+def nanmin(a, axis=None, out=None, keepdims=np._NoValue, initial=np._NoValue,
+           where=np._NoValue):
     """
     Return minimum of an array or minimum along an axis, ignoring any NaNs.
     When all-NaN slices are encountered a ``RuntimeWarning`` is raised and
@@ -258,6 +268,16 @@ def nanmin(a, axis=None, out=None, keepdims=np._NoValue):
         does not implement `keepdims` any exceptions will be raised.
 
         .. versionadded:: 1.8.0
+    initial : scalar, optional
+        The maximum value of an output element. Must be present to allow
+        computation on empty slice. See `~numpy.ufunc.reduce` for details.
+
+        .. versionadded:: 1.22.0
+    where : array_like of bool, optional
+        Elements to compare for the minimum. See `~numpy.ufunc.reduce`
+        for details.
+
+        .. versionadded:: 1.22.0
 
     Returns
     -------
@@ -313,6 +333,11 @@ def nanmin(a, axis=None, out=None, keepdims=np._NoValue):
     kwargs = {}
     if keepdims is not np._NoValue:
         kwargs['keepdims'] = keepdims
+    if initial is not np._NoValue:
+        kwargs['initial'] = initial
+    if where is not np._NoValue:
+        kwargs['where'] = where
+
     if type(a) is np.ndarray and a.dtype != np.object_:
         # Fast, but not safe for subclasses of ndarray, or object arrays,
         # which do not implement isnan (gh-9009), or fmin correctly (gh-8975)
@@ -328,6 +353,7 @@ def nanmin(a, axis=None, out=None, keepdims=np._NoValue):
             return res
 
         # Check for all-NaN axis
+        kwargs.pop("initial", None)
         mask = np.all(mask, axis=axis, **kwargs)
         if np.any(mask):
             res = _copyto(res, np.nan, mask)
@@ -336,12 +362,14 @@ def nanmin(a, axis=None, out=None, keepdims=np._NoValue):
     return res
 
 
-def _nanmax_dispatcher(a, axis=None, out=None, keepdims=None):
+def _nanmax_dispatcher(a, axis=None, out=None, keepdims=None,
+                       initial=None, where=None):
     return (a, out)
 
 
 @array_function_dispatch(_nanmax_dispatcher)
-def nanmax(a, axis=None, out=None, keepdims=np._NoValue):
+def nanmax(a, axis=None, out=None, keepdims=np._NoValue, initial=np._NoValue,
+           where=np._NoValue):
     """
     Return the maximum of an array or maximum along an axis, ignoring any
     NaNs.  When all-NaN slices are encountered a ``RuntimeWarning`` is
@@ -373,6 +401,16 @@ def nanmax(a, axis=None, out=None, keepdims=np._NoValue):
         does not implement `keepdims` any exceptions will be raised.
 
         .. versionadded:: 1.8.0
+    initial : scalar, optional
+        The minimum value of an output element. Must be present to allow
+        computation on empty slice. See `~numpy.ufunc.reduce` for details.
+
+        .. versionadded:: 1.22.0
+    where : array_like of bool, optional
+        Elements to compare for the maximum. See `~numpy.ufunc.reduce`
+        for details.
+
+        .. versionadded:: 1.22.0
 
     Returns
     -------
@@ -428,6 +466,11 @@ def nanmax(a, axis=None, out=None, keepdims=np._NoValue):
     kwargs = {}
     if keepdims is not np._NoValue:
         kwargs['keepdims'] = keepdims
+    if initial is not np._NoValue:
+        kwargs['initial'] = initial
+    if where is not np._NoValue:
+        kwargs['where'] = where
+
     if type(a) is np.ndarray and a.dtype != np.object_:
         # Fast, but not safe for subclasses of ndarray, or object arrays,
         # which do not implement isnan (gh-9009), or fmax correctly (gh-8975)
@@ -443,6 +486,7 @@ def nanmax(a, axis=None, out=None, keepdims=np._NoValue):
             return res
 
         # Check for all-NaN axis
+        kwargs.pop("initial", None)
         mask = np.all(mask, axis=axis, **kwargs)
         if np.any(mask):
             res = _copyto(res, np.nan, mask)
@@ -451,12 +495,12 @@ def nanmax(a, axis=None, out=None, keepdims=np._NoValue):
     return res
 
 
-def _nanargmin_dispatcher(a, axis=None):
+def _nanargmin_dispatcher(a, axis=None, out=None, *, keepdims=None):
     return (a,)
 
 
 @array_function_dispatch(_nanargmin_dispatcher)
-def nanargmin(a, axis=None):
+def nanargmin(a, axis=None, out=None, *, keepdims=np._NoValue):
     """
     Return the indices of the minimum values in the specified axis ignoring
     NaNs. For all-NaN slices ``ValueError`` is raised. Warning: the results
@@ -468,6 +512,17 @@ def nanargmin(a, axis=None):
         Input data.
     axis : int, optional
         Axis along which to operate.  By default flattened input is used.
+    out : array, optional
+        If provided, the result will be inserted into this array. It should
+        be of the appropriate shape and dtype.
+
+        .. versionadded:: 1.22.0
+    keepdims : bool, optional
+        If this is set to True, the axes which are reduced are left
+        in the result as dimensions with size one. With this option,
+        the result will broadcast correctly against the array.
+
+        .. versionadded:: 1.22.0
 
     Returns
     -------
@@ -492,20 +547,20 @@ def nanargmin(a, axis=None):
 
     """
     a, mask = _replace_nan(a, np.inf)
-    res = np.argmin(a, axis=axis)
     if mask is not None:
         mask = np.all(mask, axis=axis)
         if np.any(mask):
             raise ValueError("All-NaN slice encountered")
+    res = np.argmin(a, axis=axis, out=out, keepdims=keepdims)
     return res
 
 
-def _nanargmax_dispatcher(a, axis=None):
+def _nanargmax_dispatcher(a, axis=None, out=None, *, keepdims=None):
     return (a,)
 
 
 @array_function_dispatch(_nanargmax_dispatcher)
-def nanargmax(a, axis=None):
+def nanargmax(a, axis=None, out=None, *, keepdims=np._NoValue):
     """
     Return the indices of the maximum values in the specified axis ignoring
     NaNs. For all-NaN slices ``ValueError`` is raised. Warning: the
@@ -518,6 +573,17 @@ def nanargmax(a, axis=None):
         Input data.
     axis : int, optional
         Axis along which to operate.  By default flattened input is used.
+    out : array, optional
+        If provided, the result will be inserted into this array. It should
+        be of the appropriate shape and dtype.
+
+        .. versionadded:: 1.22.0
+    keepdims : bool, optional
+        If this is set to True, the axes which are reduced are left
+        in the result as dimensions with size one. With this option,
+        the result will broadcast correctly against the array.
+
+        .. versionadded:: 1.22.0
 
     Returns
     -------
@@ -542,20 +608,22 @@ def nanargmax(a, axis=None):
 
     """
     a, mask = _replace_nan(a, -np.inf)
-    res = np.argmax(a, axis=axis)
     if mask is not None:
         mask = np.all(mask, axis=axis)
         if np.any(mask):
             raise ValueError("All-NaN slice encountered")
+    res = np.argmax(a, axis=axis, out=out, keepdims=keepdims)
     return res
 
 
-def _nansum_dispatcher(a, axis=None, dtype=None, out=None, keepdims=None):
+def _nansum_dispatcher(a, axis=None, dtype=None, out=None, keepdims=None,
+                       initial=None, where=None):
     return (a, out)
 
 
 @array_function_dispatch(_nansum_dispatcher)
-def nansum(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):
+def nansum(a, axis=None, dtype=None, out=None, keepdims=np._NoValue,
+           initial=np._NoValue, where=np._NoValue):
     """
     Return the sum of array elements over a given axis treating Not a
     Numbers (NaNs) as zero.
@@ -600,6 +668,14 @@ def nansum(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):
         does not implement `keepdims` any exceptions will be raised.
 
         .. versionadded:: 1.8.0
+    initial : scalar, optional
+        Starting value for the sum. See `~numpy.ufunc.reduce` for details.
+
+        .. versionadded:: 1.22.0
+    where : array_like of bool, optional
+        Elements to include in the sum. See `~numpy.ufunc.reduce` for details.
+
+        .. versionadded:: 1.22.0
 
     Returns
     -------
@@ -645,15 +721,18 @@ def nansum(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):
 
     """
     a, mask = _replace_nan(a, 0)
-    return np.sum(a, axis=axis, dtype=dtype, out=out, keepdims=keepdims)
+    return np.sum(a, axis=axis, dtype=dtype, out=out, keepdims=keepdims,
+                  initial=initial, where=where)
 
 
-def _nanprod_dispatcher(a, axis=None, dtype=None, out=None, keepdims=None):
+def _nanprod_dispatcher(a, axis=None, dtype=None, out=None, keepdims=None,
+                        initial=None, where=None):
     return (a, out)
 
 
 @array_function_dispatch(_nanprod_dispatcher)
-def nanprod(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):
+def nanprod(a, axis=None, dtype=None, out=None, keepdims=np._NoValue,
+            initial=np._NoValue, where=np._NoValue):
     """
     Return the product of array elements over a given axis treating Not a
     Numbers (NaNs) as ones.
@@ -687,6 +766,16 @@ def nanprod(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):
         If True, the axes which are reduced are left in the result as
         dimensions with size one. With this option, the result will
         broadcast correctly against the original `arr`.
+    initial : scalar, optional
+        The starting value for this product. See `~numpy.ufunc.reduce`
+        for details.
+
+        .. versionadded:: 1.22.0
+    where : array_like of bool, optional
+        Elements to include in the product. See `~numpy.ufunc.reduce`
+        for details.
+
+        .. versionadded:: 1.22.0
 
     Returns
     -------
@@ -715,7 +804,8 @@ def nanprod(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):
 
     """
     a, mask = _replace_nan(a, 1)
-    return np.prod(a, axis=axis, dtype=dtype, out=out, keepdims=keepdims)
+    return np.prod(a, axis=axis, dtype=dtype, out=out, keepdims=keepdims,
+                   initial=initial, where=where)
 
 
 def _nancumsum_dispatcher(a, axis=None, dtype=None, out=None):
@@ -855,12 +945,14 @@ def nancumprod(a, axis=None, dtype=None, out=None):
     return np.cumprod(a, axis=axis, dtype=dtype, out=out)
 
 
-def _nanmean_dispatcher(a, axis=None, dtype=None, out=None, keepdims=None):
+def _nanmean_dispatcher(a, axis=None, dtype=None, out=None, keepdims=None,
+                        *, where=None):
     return (a, out)
 
 
 @array_function_dispatch(_nanmean_dispatcher)
-def nanmean(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):
+def nanmean(a, axis=None, dtype=None, out=None, keepdims=np._NoValue,
+            *, where=np._NoValue):
     """
     Compute the arithmetic mean along the specified axis, ignoring NaNs.
 
@@ -898,6 +990,10 @@ def nanmean(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):
         `keepdims` will be passed through to the `mean` or `sum` methods
         of sub-classes of `ndarray`.  If the sub-classes methods
         does not implement `keepdims` any exceptions will be raised.
+    where : array_like of bool, optional
+        Elements to include in the mean. See `~numpy.ufunc.reduce` for details.
+
+        .. versionadded:: 1.22.0
 
     Returns
     -------
@@ -936,7 +1032,8 @@ def nanmean(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):
     """
     arr, mask = _replace_nan(a, 0)
     if mask is None:
-        return np.mean(arr, axis=axis, dtype=dtype, out=out, keepdims=keepdims)
+        return np.mean(arr, axis=axis, dtype=dtype, out=out, keepdims=keepdims,
+                       where=where)
 
     if dtype is not None:
         dtype = np.dtype(dtype)
@@ -945,8 +1042,10 @@ def nanmean(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):
     if out is not None and not issubclass(out.dtype.type, np.inexact):
         raise TypeError("If a is inexact, then out must be inexact")
 
-    cnt = np.sum(~mask, axis=axis, dtype=np.intp, keepdims=keepdims)
-    tot = np.sum(arr, axis=axis, dtype=dtype, out=out, keepdims=keepdims)
+    cnt = np.sum(~mask, axis=axis, dtype=np.intp, keepdims=keepdims,
+                 where=where)
+    tot = np.sum(arr, axis=axis, dtype=dtype, out=out, keepdims=keepdims,
+                 where=where)
     avg = _divide_by_count(tot, cnt, out=out)
 
     isbad = (cnt == 0)
@@ -967,7 +1066,7 @@ def _nanmedian1d(arr1d, overwrite_input=False):
     )
 
     if arr1d_parsed.size == 0:
-        # Ensure that a nan-esque scalar of the appropiate type (and unit)
+        # Ensure that a nan-esque scalar of the appropriate type (and unit)
         # is returned for `timedelta64` and `complexfloating`
         return arr1d[-1]
 
@@ -1124,14 +1223,24 @@ def nanmedian(a, axis=None, out=None, overwrite_input=False, keepdims=np._NoValu
         return r
 
 
-def _nanpercentile_dispatcher(a, q, axis=None, out=None, overwrite_input=None,
-                              interpolation=None, keepdims=None):
+def _nanpercentile_dispatcher(
+        a, q, axis=None, out=None, overwrite_input=None,
+        method=None, keepdims=None, *, interpolation=None):
     return (a, q, out)
 
 
 @array_function_dispatch(_nanpercentile_dispatcher)
-def nanpercentile(a, q, axis=None, out=None, overwrite_input=False,
-                  interpolation='linear', keepdims=np._NoValue):
+def nanpercentile(
+        a,
+        q,
+        axis=None,
+        out=None,
+        overwrite_input=False,
+        method="linear",
+        keepdims=np._NoValue,
+        *,
+        interpolation=None,
+):
     """
     Compute the qth percentile of the data along the specified axis,
     while ignoring nan values.
@@ -1146,32 +1255,49 @@ def nanpercentile(a, q, axis=None, out=None, overwrite_input=False,
         Input array or object that can be converted to an array, containing
         nan values to be ignored.
     q : array_like of float
-        Percentile or sequence of percentiles to compute, which must be between
-        0 and 100 inclusive.
+        Percentile or sequence of percentiles to compute, which must be
+        between 0 and 100 inclusive.
     axis : {int, tuple of int, None}, optional
-        Axis or axes along which the percentiles are computed. The
-        default is to compute the percentile(s) along a flattened
-        version of the array.
+        Axis or axes along which the percentiles are computed. The default
+        is to compute the percentile(s) along a flattened version of the
+        array.
     out : ndarray, optional
-        Alternative output array in which to place the result. It must
-        have the same shape and buffer length as the expected output,
-        but the type (of the output) will be cast if necessary.
+        Alternative output array in which to place the result. It must have
+        the same shape and buffer length as the expected output, but the
+        type (of the output) will be cast if necessary.
     overwrite_input : bool, optional
-        If True, then allow the input array `a` to be modified by intermediate
-        calculations, to save memory. In this case, the contents of the input
-        `a` after this function completes is undefined.
-    interpolation : {'linear', 'lower', 'higher', 'midpoint', 'nearest'}
-        This optional parameter specifies the interpolation method to
-        use when the desired percentile lies between two data points
-        ``i < j``:
-
-        * 'linear': ``i + (j - i) * fraction``, where ``fraction``
-          is the fractional part of the index surrounded by ``i``
-          and ``j``.
-        * 'lower': ``i``.
-        * 'higher': ``j``.
-        * 'nearest': ``i`` or ``j``, whichever is nearest.
-        * 'midpoint': ``(i + j) / 2``.
+        If True, then allow the input array `a` to be modified by
+        intermediate calculations, to save memory. In this case, the
+        contents of the input `a` after this function completes is
+        undefined.
+    method : str, optional
+        This parameter specifies the method to use for estimating the
+        percentile.  There are many different methods, some unique to NumPy.
+        See the notes for explanation.  The options sorted by their R type
+        as summarized in the H&F paper [1]_ are:
+
+        1. 'inverted_cdf'
+        2. 'averaged_inverted_cdf'
+        3. 'closest_observation'
+        4. 'interpolated_inverted_cdf'
+        5. 'hazen'
+        6. 'weibull'
+        7. 'linear'  (default)
+        8. 'median_unbiased'
+        9. 'normal_unbiased'
+
+        The first three methods are discontiuous.  NumPy further defines the
+        following discontinuous variations of the default 'linear' (7.) option:
+
+        * 'lower'
+        * 'higher',
+        * 'midpoint'
+        * 'nearest'
+
+        .. versionchanged:: 1.22.0
+            This argument was previously called "interpolation" and only
+            offered the "linear" default and last four options.
+
     keepdims : bool, optional
         If this is set to True, the axes which are reduced are left in
         the result as dimensions with size one. With this option, the
@@ -1183,6 +1309,11 @@ def nanpercentile(a, q, axis=None, out=None, overwrite_input=False,
         a sub-class and `mean` does not have the kwarg `keepdims` this
         will raise a RuntimeError.
 
+    interpolation : str, optional
+        Deprecated name for the method keyword argument.
+
+        .. deprecated:: 1.22.0
+
     Returns
     -------
     percentile : scalar or ndarray
@@ -1200,18 +1331,11 @@ def nanpercentile(a, q, axis=None, out=None, overwrite_input=False,
     nanmean
     nanmedian : equivalent to ``nanpercentile(..., 50)``
     percentile, median, mean
-    nanquantile : equivalent to nanpercentile, but with q in the range [0, 1].
+    nanquantile : equivalent to nanpercentile, except q in range [0, 1].
 
     Notes
     -----
-    Given a vector ``V`` of length ``N``, the ``q``-th percentile of
-    ``V`` is the value ``q/100`` of the way from the minimum to the
-    maximum in a sorted copy of ``V``. The values and distances of
-    the two nearest neighbors as well as the `interpolation` parameter
-    will determine the percentile if the normalized ranking does not
-    match the location of ``q`` exactly. This function is the same as
-    the median if ``q=50``, the same as the minimum if ``q=0`` and the
-    same as the maximum if ``q=100``.
+    For more information please see `numpy.percentile`
 
     Examples
     --------
@@ -1241,23 +1365,44 @@ def nanpercentile(a, q, axis=None, out=None, overwrite_input=False,
     array([7., 2.])
     >>> assert not np.all(a==b)
 
+    References
+    ----------
+    .. [1] R. J. Hyndman and Y. Fan,
+       "Sample quantiles in statistical packages,"
+       The American Statistician, 50(4), pp. 361-365, 1996
+
     """
+    if interpolation is not None:
+        method = function_base._check_interpolation_as_method(
+            method, interpolation, "nanpercentile")
+
     a = np.asanyarray(a)
-    q = np.true_divide(q, 100.0)  # handles the asarray for us too
+    q = np.true_divide(q, 100.0)
+    # undo any decay that the ufunc performed (see gh-13105)
+    q = np.asanyarray(q)
     if not function_base._quantile_is_valid(q):
         raise ValueError("Percentiles must be in the range [0, 100]")
     return _nanquantile_unchecked(
-        a, q, axis, out, overwrite_input, interpolation, keepdims)
+        a, q, axis, out, overwrite_input, method, keepdims)
 
 
 def _nanquantile_dispatcher(a, q, axis=None, out=None, overwrite_input=None,
-                            interpolation=None, keepdims=None):
+                            method=None, keepdims=None, *, interpolation=None):
     return (a, q, out)
 
 
 @array_function_dispatch(_nanquantile_dispatcher)
-def nanquantile(a, q, axis=None, out=None, overwrite_input=False,
-                interpolation='linear', keepdims=np._NoValue):
+def nanquantile(
+        a,
+        q,
+        axis=None,
+        out=None,
+        overwrite_input=False,
+        method="linear",
+        keepdims=np._NoValue,
+        *,
+        interpolation=None,
+):
     """
     Compute the qth quantile of the data along the specified axis,
     while ignoring nan values.
@@ -1285,18 +1430,33 @@ def nanquantile(a, q, axis=None, out=None, overwrite_input=False,
         If True, then allow the input array `a` to be modified by intermediate
         calculations, to save memory. In this case, the contents of the input
         `a` after this function completes is undefined.
-    interpolation : {'linear', 'lower', 'higher', 'midpoint', 'nearest'}
-        This optional parameter specifies the interpolation method to
-        use when the desired quantile lies between two data points
-        ``i < j``:
-
-        * linear: ``i + (j - i) * fraction``, where ``fraction``
-          is the fractional part of the index surrounded by ``i``
-          and ``j``.
-        * lower: ``i``.
-        * higher: ``j``.
-        * nearest: ``i`` or ``j``, whichever is nearest.
-        * midpoint: ``(i + j) / 2``.
+    method : str, optional
+        This parameter specifies the method to use for estimating the
+        quantile.  There are many different methods, some unique to NumPy.
+        See the notes for explanation.  The options sorted by their R type
+        as summarized in the H&F paper [1]_ are:
+
+        1. 'inverted_cdf'
+        2. 'averaged_inverted_cdf'
+        3. 'closest_observation'
+        4. 'interpolated_inverted_cdf'
+        5. 'hazen'
+        6. 'weibull'
+        7. 'linear'  (default)
+        8. 'median_unbiased'
+        9. 'normal_unbiased'
+
+        The first three methods are discontiuous.  NumPy further defines the
+        following discontinuous variations of the default 'linear' (7.) option:
+
+        * 'lower'
+        * 'higher',
+        * 'midpoint'
+        * 'nearest'
+
+        .. versionchanged:: 1.22.0
+            This argument was previously called "interpolation" and only
+            offered the "linear" default and last four options.
 
     keepdims : bool, optional
         If this is set to True, the axes which are reduced are left in
@@ -1309,6 +1469,11 @@ def nanquantile(a, q, axis=None, out=None, overwrite_input=False,
         a sub-class and `mean` does not have the kwarg `keepdims` this
         will raise a RuntimeError.
 
+    interpolation : str, optional
+        Deprecated name for the method keyword argument.
+
+        .. deprecated:: 1.22.0
+
     Returns
     -------
     quantile : scalar or ndarray
@@ -1328,6 +1493,10 @@ def nanquantile(a, q, axis=None, out=None, overwrite_input=False,
     nanmedian : equivalent to ``nanquantile(..., 0.5)``
     nanpercentile : same as nanquantile, but with q in the range [0, 100].
 
+    Notes
+    -----
+    For more information please see `numpy.quantile`
+
     Examples
     --------
     >>> a = np.array([[10., 7., 4.], [3., 2., 1.]])
@@ -1354,27 +1523,47 @@ def nanquantile(a, q, axis=None, out=None, overwrite_input=False,
     >>> np.nanquantile(b, 0.5, axis=1, overwrite_input=True)
     array([7., 2.])
     >>> assert not np.all(a==b)
+
+    References
+    ----------
+    .. [1] R. J. Hyndman and Y. Fan,
+       "Sample quantiles in statistical packages,"
+       The American Statistician, 50(4), pp. 361-365, 1996
+
     """
+    if interpolation is not None:
+        method = function_base._check_interpolation_as_method(
+            method, interpolation, "nanquantile")
+
     a = np.asanyarray(a)
     q = np.asanyarray(q)
     if not function_base._quantile_is_valid(q):
         raise ValueError("Quantiles must be in the range [0, 1]")
     return _nanquantile_unchecked(
-        a, q, axis, out, overwrite_input, interpolation, keepdims)
-
-
-def _nanquantile_unchecked(a, q, axis=None, out=None, overwrite_input=False,
-                           interpolation='linear', keepdims=np._NoValue):
+        a, q, axis, out, overwrite_input, method, keepdims)
+
+
+def _nanquantile_unchecked(
+        a,
+        q,
+        axis=None,
+        out=None,
+        overwrite_input=False,
+        method="linear",
+        keepdims=np._NoValue,
+):
     """Assumes that q is in [0, 1], and is an ndarray"""
     # apply_along_axis in _nanpercentile doesn't handle empty arrays well,
     # so deal them upfront
     if a.size == 0:
         return np.nanmean(a, axis, out=out, keepdims=keepdims)
-
-    r, k = function_base._ureduce(
-        a, func=_nanquantile_ureduce_func, q=q, axis=axis, out=out,
-        overwrite_input=overwrite_input, interpolation=interpolation
-    )
+    r, k = function_base._ureduce(a,
+                                  func=_nanquantile_ureduce_func,
+                                  q=q,
+                                  axis=axis,
+                                  out=out,
+                                  overwrite_input=overwrite_input,
+                                  method=method)
     if keepdims and keepdims is not np._NoValue:
         return r.reshape(q.shape + k)
     else:
@@ -1382,7 +1571,7 @@ def _nanquantile_unchecked(a, q, axis=None, out=None, overwrite_input=False,
 
 
 def _nanquantile_ureduce_func(a, q, axis=None, out=None, overwrite_input=False,
-                              interpolation='linear'):
+                              method="linear"):
     """
     Private function that doesn't support extended axis or keepdims.
     These methods are extended to this function using _ureduce
@@ -1390,10 +1579,10 @@ def _nanquantile_ureduce_func(a, q, axis=None, out=None, overwrite_input=False,
     """
     if axis is None or a.ndim == 1:
         part = a.ravel()
-        result = _nanquantile_1d(part, q, overwrite_input, interpolation)
+        result = _nanquantile_1d(part, q, overwrite_input, method)
     else:
         result = np.apply_along_axis(_nanquantile_1d, axis, a, q,
-                                     overwrite_input, interpolation)
+                                     overwrite_input, method)
         # apply_along_axis fills in collapsed axis with results.
         # Move that axis to the beginning to match percentile's
         # convention.
@@ -1405,7 +1594,7 @@ def _nanquantile_ureduce_func(a, q, axis=None, out=None, overwrite_input=False,
     return result
 
 
-def _nanquantile_1d(arr1d, q, overwrite_input=False, interpolation='linear'):
+def _nanquantile_1d(arr1d, q, overwrite_input=False, method="linear"):
     """
     Private function for rank 1 arrays. Compute quantile ignoring NaNs.
     See nanpercentile for parameter usage
@@ -1413,19 +1602,21 @@ def _nanquantile_1d(arr1d, q, overwrite_input=False, interpolation='linear'):
     arr1d, overwrite_input = _remove_nan_1d(arr1d,
         overwrite_input=overwrite_input)
     if arr1d.size == 0:
-        return np.full(q.shape, np.nan)[()]  # convert to scalar
+        # convert to scalar
+        return np.full(q.shape, np.nan, dtype=arr1d.dtype)[()]
 
     return function_base._quantile_unchecked(
-        arr1d, q, overwrite_input=overwrite_input, interpolation=interpolation)
+        arr1d, q, overwrite_input=overwrite_input, method=method)
 
 
-def _nanvar_dispatcher(
-        a, axis=None, dtype=None, out=None, ddof=None, keepdims=None):
+def _nanvar_dispatcher(a, axis=None, dtype=None, out=None, ddof=None,
+                       keepdims=None, *, where=None):
     return (a, out)
 
 
 @array_function_dispatch(_nanvar_dispatcher)
-def nanvar(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue):
+def nanvar(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue,
+           *, where=np._NoValue):
     """
     Compute the variance along the specified axis, while ignoring NaNs.
 
@@ -1462,7 +1653,11 @@ def nanvar(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue):
         If this is set to True, the axes which are reduced are left
         in the result as dimensions with size one. With this option,
         the result will broadcast correctly against the original `a`.
+    where : array_like of bool, optional
+        Elements to include in the variance. See `~numpy.ufunc.reduce` for
+        details.
 
+        .. versionadded:: 1.22.0
 
     Returns
     -------
@@ -1518,7 +1713,7 @@ def nanvar(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue):
     arr, mask = _replace_nan(a, 0)
     if mask is None:
         return np.var(arr, axis=axis, dtype=dtype, out=out, ddof=ddof,
-                      keepdims=keepdims)
+                      keepdims=keepdims, where=where)
 
     if dtype is not None:
         dtype = np.dtype(dtype)
@@ -1537,21 +1732,29 @@ def nanvar(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue):
     # keepdims=True, however matrix now raises an error in this case, but
     # the reason that it drops the keepdims kwarg is to force keepdims=True
     # so this used to work by serendipity.
-    cnt = np.sum(~mask, axis=axis, dtype=np.intp, keepdims=_keepdims)
-    avg = np.sum(arr, axis=axis, dtype=dtype, keepdims=_keepdims)
+    cnt = np.sum(~mask, axis=axis, dtype=np.intp, keepdims=_keepdims,
+                 where=where)
+    avg = np.sum(arr, axis=axis, dtype=dtype, keepdims=_keepdims, where=where)
     avg = _divide_by_count(avg, cnt)
 
     # Compute squared deviation from mean.
-    np.subtract(arr, avg, out=arr, casting='unsafe')
+    np.subtract(arr, avg, out=arr, casting='unsafe', where=where)
     arr = _copyto(arr, 0, mask)
     if issubclass(arr.dtype.type, np.complexfloating):
-        sqr = np.multiply(arr, arr.conj(), out=arr).real
+        sqr = np.multiply(arr, arr.conj(), out=arr, where=where).real
     else:
-        sqr = np.multiply(arr, arr, out=arr)
+        sqr = np.multiply(arr, arr, out=arr, where=where)
 
     # Compute variance.
-    var = np.sum(sqr, axis=axis, dtype=dtype, out=out, keepdims=keepdims)
-    if var.ndim < cnt.ndim:
+    var = np.sum(sqr, axis=axis, dtype=dtype, out=out, keepdims=keepdims,
+                 where=where)
+
+    # Precaution against reduced object arrays
+    try:
+        var_ndim = var.ndim
+    except AttributeError:
+        var_ndim = np.ndim(var)
+    if var_ndim < cnt.ndim:
         # Subclasses of ndarray may ignore keepdims, so check here.
         cnt = cnt.squeeze(axis)
     dof = cnt - ddof
@@ -1567,13 +1770,14 @@ def nanvar(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue):
     return var
 
 
-def _nanstd_dispatcher(
-        a, axis=None, dtype=None, out=None, ddof=None, keepdims=None):
+def _nanstd_dispatcher(a, axis=None, dtype=None, out=None, ddof=None,
+                       keepdims=None, *, where=None):
     return (a, out)
 
 
 @array_function_dispatch(_nanstd_dispatcher)
-def nanstd(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue):
+def nanstd(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue,
+           *, where=np._NoValue):
     """
     Compute the standard deviation along the specified axis, while
     ignoring NaNs.
@@ -1617,6 +1821,11 @@ def nanstd(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue):
         as-is to the relevant functions of the sub-classes.  If these
         functions do not have a `keepdims` kwarg, a RuntimeError will
         be raised.
+    where : array_like of bool, optional
+        Elements to include in the standard deviation.
+        See `~numpy.ufunc.reduce` for details.
+
+        .. versionadded:: 1.22.0
 
     Returns
     -------
@@ -1668,9 +1877,11 @@ def nanstd(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue):
 
     """
     var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,
-                 keepdims=keepdims)
+                 keepdims=keepdims, where=where)
     if isinstance(var, np.ndarray):
         std = np.sqrt(var, out=var)
-    else:
+    elif hasattr(var, 'dtype'):
         std = var.dtype.type(np.sqrt(var))
+    else:
+        std = np.sqrt(var)
     return std
index 447770a544942d330a33dff5a2d52d83a2ddd480..54b4a7e260a73116fa74a1f65ea4f53e07338aad 100644 (file)
@@ -1,54 +1,40 @@
 from typing import List
 
+from numpy.core.fromnumeric import (
+    amin,
+    amax,
+    argmin,
+    argmax,
+    sum,
+    prod,
+    cumsum,
+    cumprod,
+    mean,
+    var,
+    std
+)
+
+from numpy.lib.function_base import (
+    median,
+    percentile,
+    quantile,
+)
+
 __all__: List[str]
 
-def nanmin(a, axis=..., out=..., keepdims=...): ...
-def nanmax(a, axis=..., out=..., keepdims=...): ...
-def nanargmin(a, axis=...): ...
-def nanargmax(a, axis=...): ...
-def nansum(a, axis=..., dtype=..., out=..., keepdims=...): ...
-def nanprod(a, axis=..., dtype=..., out=..., keepdims=...): ...
-def nancumsum(a, axis=..., dtype=..., out=...): ...
-def nancumprod(a, axis=..., dtype=..., out=...): ...
-def nanmean(a, axis=..., dtype=..., out=..., keepdims=...): ...
-def nanmedian(
-    a,
-    axis=...,
-    out=...,
-    overwrite_input=...,
-    keepdims=...,
-): ...
-def nanpercentile(
-    a,
-    q,
-    axis=...,
-    out=...,
-    overwrite_input=...,
-    interpolation=...,
-    keepdims=...,
-): ...
-def nanquantile(
-    a,
-    q,
-    axis=...,
-    out=...,
-    overwrite_input=...,
-    interpolation=...,
-    keepdims=...,
-): ...
-def nanvar(
-    a,
-    axis=...,
-    dtype=...,
-    out=...,
-    ddof=...,
-    keepdims=...,
-): ...
-def nanstd(
-    a,
-    axis=...,
-    dtype=...,
-    out=...,
-    ddof=...,
-    keepdims=...,
-): ...
+# NOTE: In reaility these functions are not aliases but distinct functions
+# with identical signatures.
+nanmin = amin
+nanmax = amax
+nanargmin = argmin
+nanargmax = argmax
+nansum = sum
+nanprod = prod
+nancumsum = cumsum
+nancumprod = cumprod
+nanmean = mean
+nanvar = var
+nanstd = std
+nanmedian = median
+nanpercentile = percentile
+nanquantile = quantile
index 9552579cf4e63b6d891bb59801b7dc2b9936742c..6c34e95fef9aee719b419bb5a918b7230743dc8a 100644 (file)
@@ -1,4 +1,3 @@
-import sys
 import os
 import re
 import functools
@@ -6,7 +5,7 @@ import itertools
 import warnings
 import weakref
 import contextlib
-from operator import itemgetter, index as opindex
+from operator import itemgetter, index as opindex, methodcaller
 from collections.abc import Mapping
 
 import numpy as np
@@ -15,7 +14,6 @@ from ._datasource import DataSource
 from numpy.core import overrides
 from numpy.core.multiarray import packbits, unpackbits
 from numpy.core.overrides import set_array_function_like_doc, set_module
-from numpy.core._internal import recursive
 from ._iotools import (
     LineSplitter, NameValidator, StringConverter, ConverterError,
     ConverterLockError, ConversionWarning, _is_string_like,
@@ -28,18 +26,9 @@ from numpy.compat import (
     )
 
 
-@set_module('numpy')
-def loads(*args, **kwargs):
-    # NumPy 1.15.0, 2017-12-10
-    warnings.warn(
-        "np.loads is deprecated, use pickle.loads instead",
-        DeprecationWarning, stacklevel=2)
-    return pickle.loads(*args, **kwargs)
-
-
 __all__ = [
-    'savetxt', 'loadtxt', 'genfromtxt', 'ndfromtxt', 'mafromtxt',
-    'recfromtxt', 'recfromcsv', 'load', 'loads', 'save', 'savez',
+    'savetxt', 'loadtxt', 'genfromtxt',
+    'recfromtxt', 'recfromcsv', 'load', 'save', 'savez',
     'savez_compressed', 'packbits', 'unpackbits', 'fromregex', 'DataSource'
     ]
 
@@ -259,7 +248,6 @@ class NpzFile(Mapping):
         else:
             raise KeyError("%s is not a file in the archive" % key)
 
-
     # deprecate the python 2 dict apis that we supported by accident in
     # python 3. We forgot to implement itervalues() at all in earlier
     # versions of numpy, so no need to deprecated it here.
@@ -335,10 +323,12 @@ def load(file, mmap_mode=None, allow_pickle=False, fix_imports=True,
 
     Raises
     ------
-    IOError
+    OSError
         If the input file does not exist or cannot be read.
+    UnpicklingError
+        If ``allow_pickle=True``, but the file cannot be loaded as a pickle.
     ValueError
-        The file contains an object array, but allow_pickle=False given.
+        The file contains an object array, but ``allow_pickle=False`` given.
 
     See Also
     --------
@@ -447,8 +437,8 @@ def load(file, mmap_mode=None, allow_pickle=False, fix_imports=True,
             try:
                 return pickle.load(fid, **pickle_kwargs)
             except Exception as e:
-                raise IOError(
-                    "Failed to interpret file %s as a pickle" % repr(file)) from e
+                raise pickle.UnpicklingError(
+                    f"Failed to interpret file {file!r} as a pickle") from e
 
 
 def _save_dispatcher(file, arr, allow_pickle=None, fix_imports=None):
@@ -582,9 +572,13 @@ def savez(file, *args, **kwds):
     its list of arrays (with the ``.files`` attribute), and for the arrays
     themselves.
 
-    When saving dictionaries, the dictionary keys become filenames
-    inside the ZIP archive. Therefore, keys should be valid filenames.
-    E.g., avoid keys that begin with ``/`` or contain ``.``.
+    Keys passed in `kwds` are used as filenames inside the ZIP archive.
+    Therefore, keys should be valid filenames; e.g., avoid keys that begin with
+    ``/`` or contain ``.``.
+
+    When naming variables with keyword arguments, it is not possible to name a
+    variable ``file``, as this would cause the ``file`` argument to be defined
+    twice in the call to ``savez``.
 
     Examples
     --------
@@ -726,36 +720,100 @@ def _savez(file, args, kwds, compress, allow_pickle=True, pickle_kwargs=None):
     zipf.close()
 
 
+def _floatconv(x):
+    try:
+        return float(x)  # The fastest path.
+    except ValueError:
+        if '0x' in x:  # Don't accidentally convert "a" ("0xa") to 10.
+            try:
+                return float.fromhex(x)
+            except ValueError:
+                pass
+        raise  # Raise the original exception, which makes more sense.
+
+
+_CONVERTERS = [  # These converters only ever get strs (not bytes) as input.
+    (np.bool_, lambda x: bool(int(x))),
+    (np.uint64, np.uint64),
+    (np.int64, np.int64),
+    (np.integer, lambda x: int(float(x))),
+    (np.longdouble, np.longdouble),
+    (np.floating, _floatconv),
+    (complex, lambda x: complex(x.replace('+-', '-'))),
+    (np.bytes_, methodcaller('encode', 'latin-1')),
+    (np.unicode_, str),
+]
+
+
 def _getconv(dtype):
-    """ Find the correct dtype converter. Adapted from matplotlib """
-
-    def floatconv(x):
-        x.lower()
-        if '0x' in x:
-            return float.fromhex(x)
-        return float(x)
-
-    typ = dtype.type
-    if issubclass(typ, np.bool_):
-        return lambda x: bool(int(x))
-    if issubclass(typ, np.uint64):
-        return np.uint64
-    if issubclass(typ, np.int64):
-        return np.int64
-    if issubclass(typ, np.integer):
-        return lambda x: int(float(x))
-    elif issubclass(typ, np.longdouble):
-        return np.longdouble
-    elif issubclass(typ, np.floating):
-        return floatconv
-    elif issubclass(typ, complex):
-        return lambda x: complex(asstr(x).replace('+-', '-'))
-    elif issubclass(typ, np.bytes_):
-        return asbytes
-    elif issubclass(typ, np.unicode_):
-        return asunicode
+    """
+    Find the correct dtype converter. Adapted from matplotlib.
+
+    Even when a lambda is returned, it is defined at the toplevel, to allow
+    testing for equality and enabling optimization for single-type data.
+    """
+    for base, conv in _CONVERTERS:
+        if issubclass(dtype.type, base):
+            return conv
+    return str
+
+
+# _loadtxt_flatten_dtype_internal and _loadtxt_pack_items are loadtxt helpers
+# lifted to the toplevel because recursive inner functions cause either
+# GC-dependent reference loops (because they are closures over loadtxt's
+# internal variables) or large overheads if using a manual trampoline to hide
+# the recursive calls.
+
+
+# not to be confused with the flatten_dtype we import...
+def _loadtxt_flatten_dtype_internal(dt):
+    """Unpack a structured data-type, and produce a packer function."""
+    if dt.names is None:
+        # If the dtype is flattened, return.
+        # If the dtype has a shape, the dtype occurs
+        # in the list more than once.
+        shape = dt.shape
+        if len(shape) == 0:
+            return ([dt.base], None)
+        else:
+            packing = [(shape[-1], list)]
+            if len(shape) > 1:
+                for dim in dt.shape[-2::-1]:
+                    packing = [(dim*packing[0][0], packing*dim)]
+            return ([dt.base] * int(np.prod(dt.shape)),
+                    functools.partial(_loadtxt_pack_items, packing))
+    else:
+        types = []
+        packing = []
+        for field in dt.names:
+            tp, bytes = dt.fields[field]
+            flat_dt, flat_packer = _loadtxt_flatten_dtype_internal(tp)
+            types.extend(flat_dt)
+            flat_packing = flat_packer.args[0] if flat_packer else None
+            # Avoid extra nesting for subarrays
+            if tp.ndim > 0:
+                packing.extend(flat_packing)
+            else:
+                packing.append((len(flat_dt), flat_packing))
+        return (types, functools.partial(_loadtxt_pack_items, packing))
+
+
+def _loadtxt_pack_items(packing, items):
+    """Pack items into nested lists based on re-packing info."""
+    if packing is None:
+        return items[0]
+    elif packing is tuple:
+        return tuple(items)
+    elif packing is list:
+        return list(items)
     else:
-        return asstr
+        start = 0
+        ret = []
+        for length, subpacking in packing:
+            ret.append(
+                _loadtxt_pack_items(subpacking, items[start:start+length]))
+            start += length
+        return tuple(ret)
 
 
 # amount of lines loadtxt reads in one chunk, can be overridden for testing
@@ -780,10 +838,11 @@ def loadtxt(fname, dtype=float, comments='#', delimiter=None,
 
     Parameters
     ----------
-    fname : file, str, or pathlib.Path
-        File, filename, or generator to read.  If the filename extension is
-        ``.gz`` or ``.bz2``, the file is first decompressed. Note that
-        generators should return byte strings.
+    fname : file, str, pathlib.Path, list of str, generator
+        File, filename, list, or generator to read.  If the filename
+        extension is ``.gz`` or ``.bz2``, the file is first decompressed. Note
+        that generators must return bytes or strings. The strings
+        in a list or produced by a generator are treated as lines.
     dtype : data-type, optional
         Data-type of the resulting array; default: float.  If this is a
         structured data-type, the resulting array will be 1-dimensional, and
@@ -912,101 +971,13 @@ def loadtxt(fname, dtype=float, comments='#', delimiter=None,
     # Nested functions used by loadtxt.
     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
-    # not to be confused with the flatten_dtype we import...
-    @recursive
-    def flatten_dtype_internal(self, dt):
-        """Unpack a structured data-type, and produce re-packing info."""
-        if dt.names is None:
-            # If the dtype is flattened, return.
-            # If the dtype has a shape, the dtype occurs
-            # in the list more than once.
-            shape = dt.shape
-            if len(shape) == 0:
-                return ([dt.base], None)
-            else:
-                packing = [(shape[-1], list)]
-                if len(shape) > 1:
-                    for dim in dt.shape[-2::-1]:
-                        packing = [(dim*packing[0][0], packing*dim)]
-                return ([dt.base] * int(np.prod(dt.shape)), packing)
-        else:
-            types = []
-            packing = []
-            for field in dt.names:
-                tp, bytes = dt.fields[field]
-                flat_dt, flat_packing = self(tp)
-                types.extend(flat_dt)
-                # Avoid extra nesting for subarrays
-                if tp.ndim > 0:
-                    packing.extend(flat_packing)
-                else:
-                    packing.append((len(flat_dt), flat_packing))
-            return (types, packing)
-
-    @recursive
-    def pack_items(self, items, packing):
-        """Pack items into nested lists based on re-packing info."""
-        if packing is None:
-            return items[0]
-        elif packing is tuple:
-            return tuple(items)
-        elif packing is list:
-            return list(items)
-        else:
-            start = 0
-            ret = []
-            for length, subpacking in packing:
-                ret.append(self(items[start:start+length], subpacking))
-                start += length
-            return tuple(ret)
-
-    def split_line(line):
-        """Chop off comments, strip, and split at delimiter. """
-        line = _decode_line(line, encoding=encoding)
-
-        if comments is not None:
-            line = regex_comments.split(line, maxsplit=1)[0]
+    def split_line(line: str):
+        """Chop off comments, strip, and split at delimiter."""
+        for comment in comments:  # Much faster than using a single regex.
+            line = line.split(comment, 1)[0]
         line = line.strip('\r\n')
         return line.split(delimiter) if line else []
 
-    def read_data(chunk_size):
-        """Parse each line, including the first.
-
-        The file read, `fh`, is a global defined above.
-
-        Parameters
-        ----------
-        chunk_size : int
-            At most `chunk_size` lines are read at a time, with iteration
-            until all lines are read.
-
-        """
-        X = []
-        line_iter = itertools.chain([first_line], fh)
-        line_iter = itertools.islice(line_iter, max_rows)
-        for i, line in enumerate(line_iter):
-            vals = split_line(line)
-            if len(vals) == 0:
-                continue
-            if usecols:
-                vals = [vals[j] for j in usecols]
-            if len(vals) != N:
-                line_num = i + skiprows + 1
-                raise ValueError("Wrong number of columns at line %d"
-                                 % line_num)
-
-            # Convert each value according to its column and store
-            items = [conv(val) for (conv, val) in zip(converters, vals)]
-
-            # Then pack it according to the dtype's nesting
-            items = pack_items(items, packing)
-            X.append(items)
-            if len(X) > chunk_size:
-                yield X
-                X = []
-        if X:
-            yield X
-
     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     # Main body of loadtxt.
     # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -1020,9 +991,8 @@ def loadtxt(fname, dtype=float, comments='#', delimiter=None,
         if isinstance(comments, (str, bytes)):
             comments = [comments]
         comments = [_decode_line(x) for x in comments]
-        # Compile regex for comments beforehand
-        comments = (re.escape(comment) for comment in comments)
-        regex_comments = re.compile('|'.join(comments))
+    else:
+        comments = []
 
     if delimiter is not None:
         delimiter = _decode_line(delimiter)
@@ -1035,14 +1005,14 @@ def loadtxt(fname, dtype=float, comments='#', delimiter=None,
         byte_converters = True
 
     if usecols is not None:
-        # Allow usecols to be a single int or a sequence of ints
+        # Copy usecols, allowing it to be a single int or a sequence of ints.
         try:
-            usecols_as_list = list(usecols)
+            usecols = list(usecols)
         except TypeError:
-            usecols_as_list = [usecols]
-        for col_idx in usecols_as_list:
+            usecols = [usecols]
+        for i, col_idx in enumerate(usecols):
             try:
-                opindex(col_idx)
+                usecols[i] = opindex(col_idx)  # Cast to builtin int now.
             except TypeError as e:
                 e.args = (
                     "usecols must be an int or a sequence of ints but "
@@ -1050,72 +1020,98 @@ def loadtxt(fname, dtype=float, comments='#', delimiter=None,
                     type(col_idx),
                     )
                 raise
-        # Fall back to existing code
-        usecols = usecols_as_list
+        if len(usecols) > 1:
+            usecols_getter = itemgetter(*usecols)
+        else:
+            # Get an iterable back, even if using a single column.
+            usecols_getter = lambda obj, c=usecols[0]: [obj[c]]
+    else:
+        usecols_getter = None
 
     # Make sure we're dealing with a proper dtype
     dtype = np.dtype(dtype)
     defconv = _getconv(dtype)
 
-    dtype_types, packing = flatten_dtype_internal(dtype)
+    dtype_types, packer = _loadtxt_flatten_dtype_internal(dtype)
 
-    fown = False
+    fh_closing_ctx = contextlib.nullcontext()
     try:
         if isinstance(fname, os_PathLike):
             fname = os_fspath(fname)
         if _is_string_like(fname):
             fh = np.lib._datasource.open(fname, 'rt', encoding=encoding)
             fencoding = getattr(fh, 'encoding', 'latin1')
-            fh = iter(fh)
-            fown = True
+            line_iter = iter(fh)
+            fh_closing_ctx = contextlib.closing(fh)
         else:
-            fh = iter(fname)
+            line_iter = iter(fname)
             fencoding = getattr(fname, 'encoding', 'latin1')
+            try:
+                first_line = next(line_iter)
+            except StopIteration:
+                pass  # Nothing matters if line_iter is empty.
+            else:
+                # Put first_line back.
+                line_iter = itertools.chain([first_line], line_iter)
+                if isinstance(first_line, bytes):
+                    # Using latin1 matches _decode_line's behavior.
+                    decoder = methodcaller(
+                        "decode",
+                        encoding if encoding is not None else "latin1")
+                    line_iter = map(decoder, line_iter)
     except TypeError as e:
         raise ValueError(
-            'fname must be a string, file handle, or generator'
+            f"fname must be a string, filehandle, list of strings,\n"
+            f"or generator. Got {type(fname)} instead."
         ) from e
 
-    # input may be a python2 io stream
-    if encoding is not None:
-        fencoding = encoding
-    # we must assume local encoding
-    # TODO emit portability warning?
-    elif fencoding is None:
-        import locale
-        fencoding = locale.getpreferredencoding()
+    with fh_closing_ctx:
+
+        # input may be a python2 io stream
+        if encoding is not None:
+            fencoding = encoding
+        # we must assume local encoding
+        # TODO emit portability warning?
+        elif fencoding is None:
+            import locale
+            fencoding = locale.getpreferredencoding()
 
-    try:
         # Skip the first `skiprows` lines
         for i in range(skiprows):
-            next(fh)
-
-        # Read until we find a line with some values, and use
-        # it to estimate the number of columns, N.
-        first_vals = None
-        try:
-            while not first_vals:
-                first_line = next(fh)
-                first_vals = split_line(first_line)
-        except StopIteration:
-            # End of lines reached
-            first_line = ''
-            first_vals = []
+            next(line_iter)
+
+        # Read until we find a line with some values, and use it to determine
+        # the need for decoding and estimate the number of columns.
+        for first_line in line_iter:
+            ncols = len(usecols or split_line(first_line))
+            if ncols:
+                # Put first_line back.
+                line_iter = itertools.chain([first_line], line_iter)
+                break
+        else:  # End of lines reached
+            ncols = len(usecols or [])
             warnings.warn('loadtxt: Empty input file: "%s"' % fname,
                           stacklevel=2)
-        N = len(usecols or first_vals)
 
-        # Now that we know N, create the default converters list, and
+        line_iter = itertools.islice(line_iter, max_rows)
+        lineno_words_iter = filter(
+            itemgetter(1),  # item[1] is words; filter skips empty lines.
+            enumerate(map(split_line, line_iter), 1 + skiprows))
+
+        # Now that we know ncols, create the default converters list, and
         # set packing, if necessary.
         if len(dtype_types) > 1:
             # We're dealing with a structured array, each field of
             # the dtype matches a column
             converters = [_getconv(dt) for dt in dtype_types]
         else:
-            # All fields have the same dtype
-            converters = [defconv for i in range(N)]
-            if N > 1:
-                packing = [(N, tuple)]
+            # All fields have the same dtype; use specialized packers which are
+            # much faster than those using _loadtxt_pack_items.
+            converters = [defconv for i in range(ncols)]
+            if ncols == 1:
+                packer = itemgetter(0)
+            else:
+                def packer(row): return row
 
         # By preference, use the converters specified by the user
         for i, conv in (user_converters or {}).items():
@@ -1127,36 +1123,55 @@ def loadtxt(fname, dtype=float, comments='#', delimiter=None,
                     continue
             if byte_converters:
                 # converters may use decode to workaround numpy's old
-                # behaviour, so encode the string again before passing to
-                # the user converter
-                def tobytes_first(x, conv):
-                    if type(x) is bytes:
-                        return conv(x)
+                # behaviour, so encode the string again (converters are only
+                # called with strings) before passing to the user converter.
+                def tobytes_first(conv, x):
                     return conv(x.encode("latin1"))
-                converters[i] = functools.partial(tobytes_first, conv=conv)
+                converters[i] = functools.partial(tobytes_first, conv)
             else:
                 converters[i] = conv
 
-        converters = [conv if conv is not bytes else
-                      lambda x: x.encode(fencoding) for conv in converters]
+        fencode = methodcaller("encode", fencoding)
+        converters = [conv if conv is not bytes else fencode
+                      for conv in converters]
+        if len(set(converters)) == 1:
+            # Optimize single-type data. Note that this is only reached if
+            # `_getconv` returns equal callables (i.e. not local lambdas) on
+            # equal dtypes.
+            def convert_row(vals, _conv=converters[0]):
+                return [*map(_conv, vals)]
+        else:
+            def convert_row(vals):
+                return [conv(val) for conv, val in zip(converters, vals)]
 
         # read data in chunks and fill it into an array via resize
         # over-allocating and shrinking the array later may be faster but is
         # probably not relevant compared to the cost of actually reading and
         # converting the data
         X = None
-        for x in read_data(_loadtxt_chunksize):
+        while True:
+            chunk = []
+            for lineno, words in itertools.islice(
+                    lineno_words_iter, _loadtxt_chunksize):
+                if usecols_getter is not None:
+                    words = usecols_getter(words)
+                elif len(words) != ncols:
+                    raise ValueError(
+                        f"Wrong number of columns at line {lineno}")
+                # Convert each value according to its column, then pack it
+                # according to the dtype's nesting, and store it.
+                chunk.append(packer(convert_row(words)))
+            if not chunk:  # The islice is empty, i.e. we're done.
+                break
+
             if X is None:
-                X = np.array(x, dtype)
+                X = np.array(chunk, dtype)
             else:
                 nshape = list(X.shape)
                 pos = nshape[0]
-                nshape[0] += len(x)
+                nshape[0] += len(chunk)
                 X.resize(nshape, refcheck=False)
-                X[pos:, ...] = x
-    finally:
-        if fown:
-            fh.close()
+                X[pos:, ...] = chunk
 
     if X is None:
         X = np.array([], dtype)
@@ -1449,7 +1464,7 @@ def savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='',
 
 @set_module('numpy')
 def fromregex(file, regexp, dtype, encoding=None):
-    """
+    r"""
     Construct an array from a text file, using regular expression parsing.
 
     The returned array is always a structured array, and is constructed from
@@ -1458,13 +1473,16 @@ def fromregex(file, regexp, dtype, encoding=None):
 
     Parameters
     ----------
-    file : str or file
+    file : path or file
         Filename or file object to read.
+
+        .. versionchanged:: 1.22.0
+            Now accepts `os.PathLike` implementations.
     regexp : str or regexp
         Regular expression used to parse the file.
         Groups in the regular expression correspond to fields in the dtype.
     dtype : dtype or list of dtypes
-        Dtype for the structured array.
+        Dtype for the structured array; must be a structured datatype.
     encoding : str, optional
         Encoding used to decode the inputfile. Does not apply to input streams.
 
@@ -1493,12 +1511,11 @@ def fromregex(file, regexp, dtype, encoding=None):
 
     Examples
     --------
-    >>> f = open('test.dat', 'w')
-    >>> _ = f.write("1312 foo\\n1534  bar\\n444   qux")
-    >>> f.close()
+    >>> from io import StringIO
+    >>> text = StringIO("1312 foo\n1534  bar\n444   qux")
 
-    >>> regexp = r"(\\d+)\\s+(...)"  # match [digits, whitespace, anything]
-    >>> output = np.fromregex('test.dat', regexp,
+    >>> regexp = r"(\d+)\s+(...)"  # match [digits, whitespace, anything]
+    >>> output = np.fromregex(text, regexp,
     ...                       [('num', np.int64), ('key', 'S3')])
     >>> output
     array([(1312, b'foo'), (1534, b'bar'), ( 444, b'qux')],
@@ -1509,17 +1526,20 @@ def fromregex(file, regexp, dtype, encoding=None):
     """
     own_fh = False
     if not hasattr(file, "read"):
+        file = os.fspath(file)
         file = np.lib._datasource.open(file, 'rt', encoding=encoding)
         own_fh = True
 
     try:
         if not isinstance(dtype, np.dtype):
             dtype = np.dtype(dtype)
+        if dtype.names is None:
+            raise TypeError('dtype must be a structured datatype.')
 
         content = file.read()
-        if isinstance(content, bytes) and isinstance(regexp, np.compat.unicode):
+        if isinstance(content, bytes) and isinstance(regexp, str):
             regexp = asbytes(regexp)
-        elif isinstance(content, np.compat.unicode) and isinstance(regexp, bytes):
+        elif isinstance(content, str) and isinstance(regexp, bytes):
             regexp = asstr(regexp)
 
         if not hasattr(regexp, 'match'):
@@ -1578,8 +1598,8 @@ def genfromtxt(fname, dtype=float, comments='#', delimiter=None,
     ----------
     fname : file, str, pathlib.Path, list of str, generator
         File, filename, list, or generator to read.  If the filename
-        extension is `.gz` or `.bz2`, the file is first decompressed. Note
-        that generators must return byte strings. The strings
+        extension is ``.gz`` or ``.bz2``, the file is first decompressed. Note
+        that generators must return bytes or strings. The strings
         in a list or produced by a generator are treated as lines.
     dtype : dtype, optional
         Data type of the resulting array.
@@ -1614,7 +1634,7 @@ def genfromtxt(fname, dtype=float, comments='#', delimiter=None,
         ``usecols = (1, 4, 5)`` will extract the 2nd, 5th and 6th columns.
     names : {None, True, str, sequence}, optional
         If `names` is True, the field names are read from the first line after
-        the first `skip_header` lines. This line can optionally be preceeded
+        the first `skip_header` lines. This line can optionally be preceded
         by a comment delimiter. If `names` is a sequence or a single-string of
         comma-separated names, the names will be used to define the field names
         in a structured dtype. If `names` is None, the names of the dtype
@@ -1798,8 +1818,9 @@ def genfromtxt(fname, dtype=float, comments='#', delimiter=None,
         fhd = iter(fid)
     except TypeError as e:
         raise TypeError(
-            "fname must be a string, filehandle, list of strings, "
-            "or generator. Got %s instead." % type(fname)) from e
+            f"fname must be a string, filehandle, list of strings,\n"
+            f"or generator. Got {type(fname)} instead."
+        ) from e
 
     with fid_ctx:
         split_line = LineSplitter(delimiter=delimiter, comments=comments,
@@ -2289,62 +2310,6 @@ _genfromtxt_with_like = array_function_dispatch(
 )(genfromtxt)
 
 
-def ndfromtxt(fname, **kwargs):
-    """
-    Load ASCII data stored in a file and return it as a single array.
-
-    .. deprecated:: 1.17
-        ndfromtxt` is a deprecated alias of `genfromtxt` which
-        overwrites the ``usemask`` argument with `False` even when
-        explicitly called as ``ndfromtxt(..., usemask=True)``.
-        Use `genfromtxt` instead.
-
-    Parameters
-    ----------
-    fname, kwargs : For a description of input parameters, see `genfromtxt`.
-
-    See Also
-    --------
-    numpy.genfromtxt : generic function.
-
-    """
-    kwargs['usemask'] = False
-    # Numpy 1.17
-    warnings.warn(
-        "np.ndfromtxt is a deprecated alias of np.genfromtxt, "
-        "prefer the latter.",
-        DeprecationWarning, stacklevel=2)
-    return genfromtxt(fname, **kwargs)
-
-
-def mafromtxt(fname, **kwargs):
-    """
-    Load ASCII data stored in a text file and return a masked array.
-
-    .. deprecated:: 1.17
-        np.mafromtxt is a deprecated alias of `genfromtxt` which
-        overwrites the ``usemask`` argument with `True` even when
-        explicitly called as ``mafromtxt(..., usemask=False)``.
-        Use `genfromtxt` instead.
-
-    Parameters
-    ----------
-    fname, kwargs : For a description of input parameters, see `genfromtxt`.
-
-    See Also
-    --------
-    numpy.genfromtxt : generic function to load ASCII data.
-
-    """
-    kwargs['usemask'] = True
-    # Numpy 1.17
-    warnings.warn(
-        "np.mafromtxt is a deprecated alias of np.genfromtxt, "
-        "prefer the latter.",
-        DeprecationWarning, stacklevel=2)
-    return genfromtxt(fname, **kwargs)
-
-
 def recfromtxt(fname, **kwargs):
     """
     Load ASCII data from a file and return it in a record array.
index 508357927b72606648862b7f516900071dd4dc73..75d06e9e33dd620abeab57126f69059b6751d371 100644 (file)
-from typing import Mapping, List, Any
+import os
+import sys
+import zipfile
+import types
+from typing import (
+    Literal as L,
+    Any,
+    Mapping,
+    TypeVar,
+    Generic,
+    List,
+    Type,
+    Iterator,
+    Union,
+    IO,
+    overload,
+    Sequence,
+    Callable,
+    Pattern,
+    Protocol,
+    Iterable,
+)
 
 from numpy import (
     DataSource as DataSource,
+    ndarray,
+    recarray,
+    dtype,
+    generic,
+    float64,
+    void,
+    record,
 )
 
+from numpy.ma.mrecords import MaskedRecords
+from numpy.typing import ArrayLike, DTypeLike, NDArray, _SupportsDType
+
 from numpy.core.multiarray import (
     packbits as packbits,
     unpackbits as unpackbits,
 )
 
+_T = TypeVar("_T")
+_T_contra = TypeVar("_T_contra", contravariant=True)
+_T_co = TypeVar("_T_co", covariant=True)
+_SCT = TypeVar("_SCT", bound=generic)
+_CharType_co = TypeVar("_CharType_co", str, bytes, covariant=True)
+_CharType_contra = TypeVar("_CharType_contra", str, bytes, contravariant=True)
+
+_DTypeLike = Union[
+    Type[_SCT],
+    dtype[_SCT],
+    _SupportsDType[dtype[_SCT]],
+]
+
+class _SupportsGetItem(Protocol[_T_contra, _T_co]):
+    def __getitem__(self, key: _T_contra, /) -> _T_co: ...
+
+class _SupportsRead(Protocol[_CharType_co]):
+    def read(self) -> _CharType_co: ...
+
+class _SupportsReadSeek(Protocol[_CharType_co]):
+    def read(self, n: int, /) -> _CharType_co: ...
+    def seek(self, offset: int, whence: int, /) -> object: ...
+
+class _SupportsWrite(Protocol[_CharType_contra]):
+    def write(self, s: _CharType_contra, /) -> object: ...
+
 __all__: List[str]
 
-def loads(*args, **kwargs): ...
-
-class BagObj:
-    def __init__(self, obj): ...
-    def __getattribute__(self, key): ...
-    def __dir__(self): ...
-
-def zipfile_factory(file, *args, **kwargs): ...
-
-class NpzFile(Mapping[Any, Any]):
-    zip: Any
-    fid: Any
-    files: Any
-    allow_pickle: Any
-    pickle_kwargs: Any
-    f: Any
-    def __init__(self, fid, own_fid=..., allow_pickle=..., pickle_kwargs=...): ...
-    def __enter__(self): ...
-    def __exit__(self, exc_type, exc_value, traceback): ...
-    def close(self): ...
-    def __del__(self): ...
-    def __iter__(self): ...
-    def __len__(self): ...
-    def __getitem__(self, key): ...
-    def iteritems(self): ...
-    def iterkeys(self): ...
-
-def load(file, mmap_mode=..., allow_pickle=..., fix_imports=..., encoding=...): ...
-def save(file, arr, allow_pickle=..., fix_imports=...): ...
-def savez(file, *args, **kwds): ...
-def savez_compressed(file, *args, **kwds): ...
+class BagObj(Generic[_T_co]):
+    def __init__(self, obj: _SupportsGetItem[str, _T_co]) -> None: ...
+    def __getattribute__(self, key: str) -> _T_co: ...
+    def __dir__(self) -> List[str]: ...
+
+class NpzFile(Mapping[str, NDArray[Any]]):
+    zip: zipfile.ZipFile
+    fid: None | IO[str]
+    files: List[str]
+    allow_pickle: bool
+    pickle_kwargs: None | Mapping[str, Any]
+    # Represent `f` as a mutable property so we can access the type of `self`
+    @property
+    def f(self: _T) -> BagObj[_T]: ...
+    @f.setter
+    def f(self: _T, value: BagObj[_T]) -> None: ...
+    def __init__(
+        self,
+        fid: IO[str],
+        own_fid: bool = ...,
+        allow_pickle: bool = ...,
+        pickle_kwargs: None | Mapping[str, Any] = ...,
+    ) -> None: ...
+    def __enter__(self: _T) -> _T: ...
+    def __exit__(
+        self,
+        exc_type: None | Type[BaseException],
+        exc_value: None | BaseException,
+        traceback: None | types.TracebackType,
+        /,
+    ) -> None: ...
+    def close(self) -> None: ...
+    def __del__(self) -> None: ...
+    def __iter__(self) -> Iterator[str]: ...
+    def __len__(self) -> int: ...
+    def __getitem__(self, key: str) -> NDArray[Any]: ...
+
+# NOTE: Returns a `NpzFile` if file is a zip file;
+# returns an `ndarray`/`memmap` otherwise
+def load(
+    file: str | bytes | os.PathLike[Any] | _SupportsReadSeek[bytes],
+    mmap_mode: L[None, "r+", "r", "w+", "c"] = ...,
+    allow_pickle: bool = ...,
+    fix_imports: bool = ...,
+    encoding: L["ASCII", "latin1", "bytes"] = ...,
+) -> Any: ...
+
+def save(
+    file: str | os.PathLike[str] | _SupportsWrite[bytes],
+    arr: ArrayLike,
+    allow_pickle: bool = ...,
+    fix_imports: bool = ...,
+) -> None: ...
+
+def savez(
+    file: str | os.PathLike[str] | _SupportsWrite[bytes],
+    *args: ArrayLike,
+    **kwds: ArrayLike,
+) -> None: ...
+
+def savez_compressed(
+    file: str | os.PathLike[str] | _SupportsWrite[bytes],
+    *args: ArrayLike,
+    **kwds: ArrayLike,
+) -> None: ...
+
+# File-like objects only have to implement `__iter__` and,
+# optionally, `encoding`
+@overload
 def loadtxt(
-    fname,
-    dtype=...,
-    comments=...,
-    delimiter=...,
-    converters=...,
-    skiprows=...,
-    usecols=...,
-    unpack=...,
-    ndmin=...,
-    encoding=...,
-    max_rows=...,
+    fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes],
+    dtype: None = ...,
+    comments: None | str | Sequence[str] = ...,
+    delimiter: None | str = ...,
+    converters: None | Mapping[int | str, Callable[[str], Any]] = ...,
+    skiprows: int = ...,
+    usecols: int | Sequence[int] = ...,
+    unpack: bool = ...,
+    ndmin: L[0, 1, 2] = ...,
+    encoding: None | str = ...,
+    max_rows: None | int = ...,
     *,
-    like=...,
-): ...
+    like: None | ArrayLike = ...
+) -> NDArray[float64]: ...
+@overload
+def loadtxt(
+    fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes],
+    dtype: _DTypeLike[_SCT],
+    comments: None | str | Sequence[str] = ...,
+    delimiter: None | str = ...,
+    converters: None | Mapping[int | str, Callable[[str], Any]] = ...,
+    skiprows: int = ...,
+    usecols: int | Sequence[int] = ...,
+    unpack: bool = ...,
+    ndmin: L[0, 1, 2] = ...,
+    encoding: None | str = ...,
+    max_rows: None | int = ...,
+    *,
+    like: None | ArrayLike = ...
+) -> NDArray[_SCT]: ...
+@overload
+def loadtxt(
+    fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes],
+    dtype: DTypeLike,
+    comments: None | str | Sequence[str] = ...,
+    delimiter: None | str = ...,
+    converters: None | Mapping[int | str, Callable[[str], Any]] = ...,
+    skiprows: int = ...,
+    usecols: int | Sequence[int] = ...,
+    unpack: bool = ...,
+    ndmin: L[0, 1, 2] = ...,
+    encoding: None | str = ...,
+    max_rows: None | int = ...,
+    *,
+    like: None | ArrayLike = ...
+) -> NDArray[Any]: ...
+
 def savetxt(
-    fname,
-    X,
-    fmt=...,
-    delimiter=...,
-    newline=...,
-    header=...,
-    footer=...,
-    comments=...,
-    encoding=...,
-): ...
-def fromregex(file, regexp, dtype, encoding=...): ...
+    fname: str | os.PathLike[str] | _SupportsWrite[str] | _SupportsWrite[bytes],
+    X: ArrayLike,
+    fmt: str | Sequence[str] = ...,
+    delimiter: str = ...,
+    newline: str = ...,
+    header: str = ...,
+    footer: str = ...,
+    comments: str = ...,
+    encoding: None | str = ...,
+) -> None: ...
+
+@overload
+def fromregex(
+    file: str | os.PathLike[str] | _SupportsRead[str] | _SupportsRead[bytes],
+    regexp: str | bytes | Pattern[Any],
+    dtype: _DTypeLike[_SCT],
+    encoding: None | str = ...
+) -> NDArray[_SCT]: ...
+@overload
+def fromregex(
+    file: str | os.PathLike[str] | _SupportsRead[str] | _SupportsRead[bytes],
+    regexp: str | bytes | Pattern[Any],
+    dtype: DTypeLike,
+    encoding: None | str = ...
+) -> NDArray[Any]: ...
+
+# TODO: Sort out arguments
+@overload
 def genfromtxt(
-    fname,
-    dtype=...,
-    comments=...,
-    delimiter=...,
-    skip_header=...,
-    skip_footer=...,
-    converters=...,
-    missing_values=...,
-    filling_values=...,
-    usecols=...,
-    names=...,
-    excludelist=...,
-    deletechars=...,
-    replace_space=...,
-    autostrip=...,
-    case_sensitive=...,
-    defaultfmt=...,
-    unpack=...,
-    usemask=...,
-    loose=...,
-    invalid_raise=...,
-    max_rows=...,
-    encoding=...,
+    fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes],
+    dtype: None = ...,
+    *args: Any,
+    **kwargs: Any,
+) -> NDArray[float64]: ...
+@overload
+def genfromtxt(
+    fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes],
+    dtype: _DTypeLike[_SCT],
+    *args: Any,
+    **kwargs: Any,
+) -> NDArray[_SCT]: ...
+@overload
+def genfromtxt(
+    fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes],
+    dtype: DTypeLike,
+    *args: Any,
+    **kwargs: Any,
+) -> NDArray[Any]: ...
+
+@overload
+def recfromtxt(
+    fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes],
+    *,
+    usemask: L[False] = ...,
+    **kwargs: Any,
+) -> recarray[Any, dtype[record]]: ...
+@overload
+def recfromtxt(
+    fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes],
+    *,
+    usemask: L[True],
+    **kwargs: Any,
+) -> MaskedRecords[Any, dtype[void]]: ...
+
+@overload
+def recfromcsv(
+    fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes],
+    *,
+    usemask: L[False] = ...,
+    **kwargs: Any,
+) -> recarray[Any, dtype[record]]: ...
+@overload
+def recfromcsv(
+    fname: str | os.PathLike[str] | Iterable[str] | Iterable[bytes],
     *,
-    like=...,
-): ...
-def recfromtxt(fname, **kwargs): ...
-def recfromcsv(fname, **kwargs): ...
-
-# NOTE: Deprecated
-# def ndfromtxt(fname, **kwargs): ...
-# def mafromtxt(fname, **kwargs): ...
+    usemask: L[True],
+    **kwargs: Any,
+) -> MaskedRecords[Any, dtype[void]]: ...
index e9df783b4b7615ae8e0d9127e3500aada114a8b6..f824c4c5e2c1ee435feca9b0605f962af3531f29 100644 (file)
@@ -152,9 +152,8 @@ def poly(seq_of_zeros):
         return 1.0
     dt = seq_of_zeros.dtype
     a = ones((1,), dtype=dt)
-    for k in range(len(seq_of_zeros)):
-        a = NX.convolve(a, array([1, -seq_of_zeros[k]], dtype=dt),
-                        mode='full')
+    for zero in seq_of_zeros:
+        a = NX.convolve(a, array([1, -zero], dtype=dt), mode='full')
 
     if issubclass(a.dtype.type, NX.complexfloating):
         # if complex roots are all complex conjugates, the roots are real.
@@ -489,16 +488,19 @@ def polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False):
         default) just the coefficients are returned, when True diagnostic
         information from the singular value decomposition is also returned.
     w : array_like, shape (M,), optional
-        Weights to apply to the y-coordinates of the sample points. For
-        gaussian uncertainties, use 1/sigma (not 1/sigma**2).
+        Weights. If not None, the weight ``w[i]`` applies to the unsquared
+        residual ``y[i] - y_hat[i]`` at ``x[i]``. Ideally the weights are
+        chosen so that the errors of the products ``w[i]*y[i]`` all have the
+        same variance.  When using inverse-variance weighting, use
+        ``w[i] = 1/sigma(y[i])``.  The default value is None.
     cov : bool or str, optional
         If given and not `False`, return not just the estimate but also its
         covariance matrix. By default, the covariance are scaled by
-        chi2/dof, where dof = M - (deg + 1), i.e., the weights are presumed 
-        to be unreliable except in a relative sense and everything is scaled 
-        such that the reduced chi2 is unity. This scaling is omitted if 
-        ``cov='unscaled'``, as is relevant for the case that the weights are 
-        1/sigma**2, with sigma known to be a reliable estimate of the 
+        chi2/dof, where dof = M - (deg + 1), i.e., the weights are presumed
+        to be unreliable except in a relative sense and everything is scaled
+        such that the reduced chi2 is unity. This scaling is omitted if
+        ``cov='unscaled'``, as is relevant for the case that the weights are
+        w = 1/sigma, with sigma known to be a reliable estimate of the
         uncertainty.
 
     Returns
@@ -508,13 +510,19 @@ def polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False):
         coefficients for `k`-th data set are in ``p[:,k]``.
 
     residuals, rank, singular_values, rcond
-        Present only if `full` = True.  Residuals is sum of squared residuals
-        of the least-squares fit, the effective rank of the scaled Vandermonde
-        coefficient matrix, its singular values, and the specified value of
-        `rcond`. For more details, see `linalg.lstsq`.
+        These values are only returned if ``full == True``
+
+        - residuals -- sum of squared residuals of the least squares fit
+        - rank -- the effective rank of the scaled Vandermonde
+           coefficient matrix
+        - singular_values -- singular values of the scaled Vandermonde
+           coefficient matrix
+        - rcond -- value of `rcond`.
+
+        For more details, see `numpy.linalg.lstsq`.
 
     V : ndarray, shape (M,M) or (M,M,K)
-        Present only if `full` = False and `cov`=True.  The covariance
+        Present only if ``full == False`` and ``cov == True``.  The covariance
         matrix of the polynomial coefficient estimates.  The diagonal of
         this matrix are the variance estimates for each coefficient.  If y
         is a 2-D array, then the covariance matrix for the `k`-th data set
@@ -525,7 +533,7 @@ def polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False):
     -----
     RankWarning
         The rank of the coefficient matrix in the least-squares fit is
-        deficient. The warning is only raised if `full` = False.
+        deficient. The warning is only raised if ``full == False``.
 
         The warnings can be turned off by
 
@@ -542,7 +550,7 @@ def polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False):
     -----
     The solution minimizes the squared error
 
-    .. math ::
+    .. math::
         E = \\sum_{j=0}^k |p(x_j) - y_j|^2
 
     in the equations::
@@ -767,8 +775,8 @@ def polyval(p, x):
     else:
         x = NX.asanyarray(x)
         y = NX.zeros_like(x)
-    for i in range(len(p)):
-        y = y * x + p[i]
+    for pv in p:
+        y = y * x + pv
     return y
 
 
@@ -1270,14 +1278,14 @@ class poly1d:
                 s = s[:-5]
             return s
 
-        for k in range(len(coeffs)):
-            if not iscomplex(coeffs[k]):
-                coefstr = fmt_float(real(coeffs[k]))
-            elif real(coeffs[k]) == 0:
-                coefstr = '%sj' % fmt_float(imag(coeffs[k]))
+        for k, coeff in enumerate(coeffs):
+            if not iscomplex(coeff):
+                coefstr = fmt_float(real(coeff))
+            elif real(coeff) == 0:
+                coefstr = '%sj' % fmt_float(imag(coeff))
             else:
-                coefstr = '(%s + %sj)' % (fmt_float(real(coeffs[k])),
-                                          fmt_float(imag(coeffs[k])))
+                coefstr = '(%s + %sj)' % (fmt_float(real(coeff)),
+                                          fmt_float(imag(coeff)))
 
             power = (N-k)
             if power == 0:
@@ -1394,9 +1402,9 @@ class poly1d:
     def __getitem__(self, val):
         ind = self.order - val
         if val > self.order:
-            return 0
+            return self.coeffs.dtype.type(0)
         if val < 0:
-            return 0
+            return self.coeffs.dtype.type(0)
         return self.coeffs[ind]
 
     def __setitem__(self, key, val):
index 7d38658d0202272f7da2cd98e1bd155aa029257f..00065f53b227972e362a0d393a967aa1b3f6f527 100644 (file)
-from typing import List
+from typing import (
+    Literal as L,
+    List,
+    overload,
+    Any,
+    SupportsInt,
+    SupportsIndex,
+    TypeVar,
+    Tuple,
+    NoReturn,
+)
 
 from numpy import (
     RankWarning as RankWarning,
     poly1d as poly1d,
+    unsignedinteger,
+    signedinteger,
+    floating,
+    complexfloating,
+    bool_,
+    int32,
+    int64,
+    float64,
+    complex128,
+    object_,
+)
+
+from numpy.typing import (
+    NDArray,
+    ArrayLike,
+    _ArrayLikeBool_co,
+    _ArrayLikeUInt_co,
+    _ArrayLikeInt_co,
+    _ArrayLikeFloat_co,
+    _ArrayLikeComplex_co,
+    _ArrayLikeObject_co,
 )
 
+_T = TypeVar("_T")
+
+_2Tup = Tuple[_T, _T]
+_5Tup = Tuple[
+    _T,
+    NDArray[float64],
+    NDArray[int32],
+    NDArray[float64],
+    NDArray[float64],
+]
+
 __all__: List[str]
 
-def poly(seq_of_zeros): ...
-def roots(p): ...
-def polyint(p, m=..., k=...): ...
-def polyder(p, m=...): ...
-def polyfit(x, y, deg, rcond=..., full=..., w=..., cov=...): ...
-def polyval(p, x): ...
-def polyadd(a1, a2): ...
-def polysub(a1, a2): ...
-def polymul(a1, a2): ...
-def polydiv(u, v): ...
+def poly(seq_of_zeros: ArrayLike) -> NDArray[floating[Any]]: ...
+
+# Returns either a float or complex array depending on the input values.
+# See `np.linalg.eigvals`.
+def roots(p: ArrayLike) -> NDArray[complexfloating[Any, Any]] | NDArray[floating[Any]]: ...
+
+@overload
+def polyint(
+    p: poly1d,
+    m: SupportsInt | SupportsIndex = ...,
+    k: None | _ArrayLikeComplex_co | _ArrayLikeObject_co = ...,
+) -> poly1d: ...
+@overload
+def polyint(
+    p: _ArrayLikeFloat_co,
+    m: SupportsInt | SupportsIndex = ...,
+    k: None | _ArrayLikeFloat_co = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def polyint(
+    p: _ArrayLikeComplex_co,
+    m: SupportsInt | SupportsIndex = ...,
+    k: None | _ArrayLikeComplex_co = ...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def polyint(
+    p: _ArrayLikeObject_co,
+    m: SupportsInt | SupportsIndex = ...,
+    k: None | _ArrayLikeObject_co = ...,
+) -> NDArray[object_]: ...
+
+@overload
+def polyder(
+    p: poly1d,
+    m: SupportsInt | SupportsIndex = ...,
+) -> poly1d: ...
+@overload
+def polyder(
+    p: _ArrayLikeFloat_co,
+    m: SupportsInt | SupportsIndex = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def polyder(
+    p: _ArrayLikeComplex_co,
+    m: SupportsInt | SupportsIndex = ...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def polyder(
+    p: _ArrayLikeObject_co,
+    m: SupportsInt | SupportsIndex = ...,
+) -> NDArray[object_]: ...
+
+@overload
+def polyfit(
+    x: _ArrayLikeFloat_co,
+    y: _ArrayLikeFloat_co,
+    deg: SupportsIndex | SupportsInt,
+    rcond: None | float = ...,
+    full: L[False] = ...,
+    w: None | _ArrayLikeFloat_co = ...,
+    cov: L[False] = ...,
+) -> NDArray[float64]: ...
+@overload
+def polyfit(
+    x: _ArrayLikeComplex_co,
+    y: _ArrayLikeComplex_co,
+    deg: SupportsIndex | SupportsInt,
+    rcond: None | float = ...,
+    full: L[False] = ...,
+    w: None | _ArrayLikeFloat_co = ...,
+    cov: L[False] = ...,
+) -> NDArray[complex128]: ...
+@overload
+def polyfit(
+    x: _ArrayLikeFloat_co,
+    y: _ArrayLikeFloat_co,
+    deg: SupportsIndex | SupportsInt,
+    rcond: None | float = ...,
+    full: L[False] = ...,
+    w: None | _ArrayLikeFloat_co = ...,
+    cov: L[True, "unscaled"] = ...,
+) -> _2Tup[NDArray[float64]]: ...
+@overload
+def polyfit(
+    x: _ArrayLikeComplex_co,
+    y: _ArrayLikeComplex_co,
+    deg: SupportsIndex | SupportsInt,
+    rcond: None | float = ...,
+    full: L[False] = ...,
+    w: None | _ArrayLikeFloat_co = ...,
+    cov: L[True, "unscaled"] = ...,
+) -> _2Tup[NDArray[complex128]]: ...
+@overload
+def polyfit(
+    x: _ArrayLikeFloat_co,
+    y: _ArrayLikeFloat_co,
+    deg: SupportsIndex | SupportsInt,
+    rcond: None | float = ...,
+    full: L[True] = ...,
+    w: None | _ArrayLikeFloat_co = ...,
+    cov: bool | L["unscaled"] = ...,
+) -> _5Tup[NDArray[float64]]: ...
+@overload
+def polyfit(
+    x: _ArrayLikeComplex_co,
+    y: _ArrayLikeComplex_co,
+    deg: SupportsIndex | SupportsInt,
+    rcond: None | float = ...,
+    full: L[True] = ...,
+    w: None | _ArrayLikeFloat_co = ...,
+    cov: bool | L["unscaled"] = ...,
+) -> _5Tup[NDArray[complex128]]: ...
+
+@overload
+def polyval(
+    p: _ArrayLikeBool_co,
+    x: _ArrayLikeBool_co,
+) -> NDArray[int64]: ...
+@overload
+def polyval(
+    p: _ArrayLikeUInt_co,
+    x: _ArrayLikeUInt_co,
+) -> NDArray[unsignedinteger[Any]]: ...
+@overload
+def polyval(
+    p: _ArrayLikeInt_co,
+    x: _ArrayLikeInt_co,
+) -> NDArray[signedinteger[Any]]: ...
+@overload
+def polyval(
+    p: _ArrayLikeFloat_co,
+    x: _ArrayLikeFloat_co,
+) -> NDArray[floating[Any]]: ...
+@overload
+def polyval(
+    p: _ArrayLikeComplex_co,
+    x: _ArrayLikeComplex_co,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def polyval(
+    p: _ArrayLikeObject_co,
+    x: _ArrayLikeObject_co,
+) -> NDArray[object_]: ...
+
+@overload
+def polyadd(
+    a1: poly1d,
+    a2: _ArrayLikeComplex_co | _ArrayLikeObject_co,
+) -> poly1d: ...
+@overload
+def polyadd(
+    a1: _ArrayLikeComplex_co | _ArrayLikeObject_co,
+    a2: poly1d,
+) -> poly1d: ...
+@overload
+def polyadd(
+    a1: _ArrayLikeBool_co,
+    a2: _ArrayLikeBool_co,
+) -> NDArray[bool_]: ...
+@overload
+def polyadd(
+    a1: _ArrayLikeUInt_co,
+    a2: _ArrayLikeUInt_co,
+) -> NDArray[unsignedinteger[Any]]: ...
+@overload
+def polyadd(
+    a1: _ArrayLikeInt_co,
+    a2: _ArrayLikeInt_co,
+) -> NDArray[signedinteger[Any]]: ...
+@overload
+def polyadd(
+    a1: _ArrayLikeFloat_co,
+    a2: _ArrayLikeFloat_co,
+) -> NDArray[floating[Any]]: ...
+@overload
+def polyadd(
+    a1: _ArrayLikeComplex_co,
+    a2: _ArrayLikeComplex_co,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def polyadd(
+    a1: _ArrayLikeObject_co,
+    a2: _ArrayLikeObject_co,
+) -> NDArray[object_]: ...
+
+@overload
+def polysub(
+    a1: poly1d,
+    a2: _ArrayLikeComplex_co | _ArrayLikeObject_co,
+) -> poly1d: ...
+@overload
+def polysub(
+    a1: _ArrayLikeComplex_co | _ArrayLikeObject_co,
+    a2: poly1d,
+) -> poly1d: ...
+@overload
+def polysub(
+    a1: _ArrayLikeBool_co,
+    a2: _ArrayLikeBool_co,
+) -> NoReturn: ...
+@overload
+def polysub(
+    a1: _ArrayLikeUInt_co,
+    a2: _ArrayLikeUInt_co,
+) -> NDArray[unsignedinteger[Any]]: ...
+@overload
+def polysub(
+    a1: _ArrayLikeInt_co,
+    a2: _ArrayLikeInt_co,
+) -> NDArray[signedinteger[Any]]: ...
+@overload
+def polysub(
+    a1: _ArrayLikeFloat_co,
+    a2: _ArrayLikeFloat_co,
+) -> NDArray[floating[Any]]: ...
+@overload
+def polysub(
+    a1: _ArrayLikeComplex_co,
+    a2: _ArrayLikeComplex_co,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def polysub(
+    a1: _ArrayLikeObject_co,
+    a2: _ArrayLikeObject_co,
+) -> NDArray[object_]: ...
+
+# NOTE: Not an alias, but they do have the same signature (that we can reuse)
+polymul = polyadd
+
+@overload
+def polydiv(
+    u: poly1d,
+    v: _ArrayLikeComplex_co | _ArrayLikeObject_co,
+) -> _2Tup[poly1d]: ...
+@overload
+def polydiv(
+    u: _ArrayLikeComplex_co | _ArrayLikeObject_co,
+    v: poly1d,
+) -> _2Tup[poly1d]: ...
+@overload
+def polydiv(
+    u: _ArrayLikeFloat_co,
+    v: _ArrayLikeFloat_co,
+) -> _2Tup[NDArray[floating[Any]]]: ...
+@overload
+def polydiv(
+    u: _ArrayLikeComplex_co,
+    v: _ArrayLikeComplex_co,
+) -> _2Tup[NDArray[complexfloating[Any, Any]]]: ...
+@overload
+def polydiv(
+    u: _ArrayLikeObject_co,
+    v: _ArrayLikeObject_co,
+) -> _2Tup[NDArray[Any]]: ...
index fbfbca73d442b116e382a70a00beb6913aca8b66..a491f612e07532a673faf3b2aee22772391659e7 100644 (file)
@@ -819,7 +819,8 @@ def repack_fields(a, align=False, recurse=False):
     ...
     >>> dt = np.dtype('u1, <i8, <f8', align=True)
     >>> dt
-    dtype({'names':['f0','f1','f2'], 'formats':['u1','<i8','<f8'], 'offsets':[0,8,16], 'itemsize':24}, align=True)
+    dtype({'names': ['f0', 'f1', 'f2'], 'formats': ['u1', '<i8', '<f8'], \
+'offsets': [0, 8, 16], 'itemsize': 24}, align=True)
     >>> print_offsets(dt)
     offsets: [0, 8, 16]
     itemsize: 24
index ed9ffd295b90664d71508de276e620b6f29f928a..308f1328bb3511cc0872b58aa37baff62612206d 100644 (file)
@@ -7,8 +7,7 @@ For example, for functions like `log` with branch cuts, the versions in this
 module provide the mathematically valid answers in the complex plane::
 
   >>> import math
-  >>> from numpy.lib import scimath
-  >>> scimath.log(-math.exp(1)) == (1+1j*math.pi)
+  >>> np.emath.log(-math.exp(1)) == (1+1j*math.pi)
   True
 
 Similarly, `sqrt`, other base logarithms, `power` and trig functions are
@@ -223,16 +222,16 @@ def sqrt(x):
     --------
     For real, non-negative inputs this works just like `numpy.sqrt`:
 
-    >>> np.lib.scimath.sqrt(1)
+    >>> np.emath.sqrt(1)
     1.0
-    >>> np.lib.scimath.sqrt([1, 4])
+    >>> np.emath.sqrt([1, 4])
     array([1.,  2.])
 
     But it automatically handles negative inputs:
 
-    >>> np.lib.scimath.sqrt(-1)
+    >>> np.emath.sqrt(-1)
     1j
-    >>> np.lib.scimath.sqrt([-1,4])
+    >>> np.emath.sqrt([-1,4])
     array([0.+1.j, 2.+0.j])
 
     """
@@ -367,9 +366,9 @@ def logn(n, x):
     --------
     >>> np.set_printoptions(precision=4)
 
-    >>> np.lib.scimath.logn(2, [4, 8])
+    >>> np.emath.logn(2, [4, 8])
     array([2., 3.])
-    >>> np.lib.scimath.logn(2, [-4, -8, 8])
+    >>> np.emath.logn(2, [-4, -8, 8])
     array([2.+4.5324j, 3.+4.5324j, 3.+0.j    ])
 
     """
@@ -462,11 +461,11 @@ def power(x, p):
     --------
     >>> np.set_printoptions(precision=4)
 
-    >>> np.lib.scimath.power([2, 4], 2)
+    >>> np.emath.power([2, 4], 2)
     array([ 4, 16])
-    >>> np.lib.scimath.power([2, 4], -2)
+    >>> np.emath.power([2, 4], -2)
     array([0.25  ,  0.0625])
-    >>> np.lib.scimath.power([-2, 4], 2)
+    >>> np.emath.power([-2, 4], 2)
     array([ 4.-0.j, 16.+0.j])
 
     """
index 09edbcb6cab48c5af7345e2ae2ce99fd603231cd..17016c99928be09d7773d2685092fe5f77040c46 100644 (file)
-from typing import List
+from typing import List, TypeVar, Callable, Sequence, Any, overload, Tuple, SupportsIndex, Protocol
+
+from numpy import (
+    generic,
+    integer,
+    dtype,
+    ufunc,
+    bool_,
+    unsignedinteger,
+    signedinteger,
+    floating,
+    complexfloating,
+    object_,
+)
+
+from numpy.typing import (
+    ArrayLike,
+    NDArray,
+    _ShapeLike,
+     _FiniteNestedSequence,
+     _SupportsArray,
+     _ArrayLikeBool_co,
+     _ArrayLikeUInt_co,
+     _ArrayLikeInt_co,
+     _ArrayLikeFloat_co,
+     _ArrayLikeComplex_co,
+     _ArrayLikeObject_co,
+)
 
 from numpy.core.shape_base import vstack
 
+_SCT = TypeVar("_SCT", bound=generic)
+
+_ArrayLike = _FiniteNestedSequence[_SupportsArray[dtype[_SCT]]]
+
+# The signatures of `__array_wrap__` and `__array_prepare__` are the same;
+# give them unique names for the sake of clarity
+class _ArrayWrap(Protocol):
+    def __call__(
+        self,
+        array: NDArray[Any],
+        context: None | Tuple[ufunc, Tuple[Any, ...], int] = ...,
+        /,
+    ) -> Any: ...
+
+class _ArrayPrepare(Protocol):
+    def __call__(
+        self,
+        array: NDArray[Any],
+        context: None | Tuple[ufunc, Tuple[Any, ...], int] = ...,
+        /,
+    ) -> Any: ...
+
+class _SupportsArrayWrap(Protocol):
+    @property
+    def __array_wrap__(self) -> _ArrayWrap: ...
+
+class _SupportsArrayPrepare(Protocol):
+    @property
+    def __array_prepare__(self) -> _ArrayPrepare: ...
+
 __all__: List[str]
 
 row_stack = vstack
 
-def take_along_axis(arr, indices, axis): ...
-def put_along_axis(arr, indices, values, axis): ...
-def apply_along_axis(func1d, axis, arr, *args, **kwargs): ...
-def apply_over_axes(func, a, axes): ...
-def expand_dims(a, axis): ...
-def column_stack(tup): ...
-def dstack(tup): ...
-def array_split(ary, indices_or_sections, axis=...): ...
-def split(ary, indices_or_sections, axis=...): ...
-def hsplit(ary, indices_or_sections): ...
-def vsplit(ary, indices_or_sections): ...
-def dsplit(ary, indices_or_sections): ...
-def get_array_prepare(*args): ...
-def get_array_wrap(*args): ...
-def kron(a, b): ...
-def tile(A, reps): ...
+def take_along_axis(
+    arr: _SCT | NDArray[_SCT],
+    indices: NDArray[integer[Any]],
+    axis: None | int,
+) -> NDArray[_SCT]: ...
+
+def put_along_axis(
+    arr: NDArray[_SCT],
+    indices: NDArray[integer[Any]],
+    values: ArrayLike,
+    axis: None | int,
+) -> None: ...
+
+@overload
+def apply_along_axis(
+    func1d: Callable[..., _ArrayLike[_SCT]],
+    axis: SupportsIndex,
+    arr: ArrayLike,
+    *args: Any,
+    **kwargs: Any,
+) -> NDArray[_SCT]: ...
+@overload
+def apply_along_axis(
+    func1d: Callable[..., ArrayLike],
+    axis: SupportsIndex,
+    arr: ArrayLike,
+    *args: Any,
+    **kwargs: Any,
+) -> NDArray[Any]: ...
+
+def apply_over_axes(
+    func: Callable[[NDArray[Any], int], NDArray[_SCT]],
+    a: ArrayLike,
+    axes: int | Sequence[int],
+) -> NDArray[_SCT]: ...
+
+@overload
+def expand_dims(
+    a: _ArrayLike[_SCT],
+    axis: _ShapeLike,
+) -> NDArray[_SCT]: ...
+@overload
+def expand_dims(
+    a: ArrayLike,
+    axis: _ShapeLike,
+) -> NDArray[Any]: ...
+
+@overload
+def column_stack(tup: Sequence[_ArrayLike[_SCT]]) -> NDArray[_SCT]: ...
+@overload
+def column_stack(tup: Sequence[ArrayLike]) -> NDArray[Any]: ...
+
+@overload
+def dstack(tup: Sequence[_ArrayLike[_SCT]]) -> NDArray[_SCT]: ...
+@overload
+def dstack(tup: Sequence[ArrayLike]) -> NDArray[Any]: ...
+
+@overload
+def array_split(
+    ary: _ArrayLike[_SCT],
+    indices_or_sections: _ShapeLike,
+    axis: SupportsIndex = ...,
+) -> List[NDArray[_SCT]]: ...
+@overload
+def array_split(
+    ary: ArrayLike,
+    indices_or_sections: _ShapeLike,
+    axis: SupportsIndex = ...,
+) -> List[NDArray[Any]]: ...
+
+@overload
+def split(
+    ary: _ArrayLike[_SCT],
+    indices_or_sections: _ShapeLike,
+    axis: SupportsIndex = ...,
+) -> List[NDArray[_SCT]]: ...
+@overload
+def split(
+    ary: ArrayLike,
+    indices_or_sections: _ShapeLike,
+    axis: SupportsIndex = ...,
+) -> List[NDArray[Any]]: ...
+
+@overload
+def hsplit(
+    ary: _ArrayLike[_SCT],
+    indices_or_sections: _ShapeLike,
+) -> List[NDArray[_SCT]]: ...
+@overload
+def hsplit(
+    ary: ArrayLike,
+    indices_or_sections: _ShapeLike,
+) -> List[NDArray[Any]]: ...
+
+@overload
+def vsplit(
+    ary: _ArrayLike[_SCT],
+    indices_or_sections: _ShapeLike,
+) -> List[NDArray[_SCT]]: ...
+@overload
+def vsplit(
+    ary: ArrayLike,
+    indices_or_sections: _ShapeLike,
+) -> List[NDArray[Any]]: ...
+
+@overload
+def dsplit(
+    ary: _ArrayLike[_SCT],
+    indices_or_sections: _ShapeLike,
+) -> List[NDArray[_SCT]]: ...
+@overload
+def dsplit(
+    ary: ArrayLike,
+    indices_or_sections: _ShapeLike,
+) -> List[NDArray[Any]]: ...
+
+@overload
+def get_array_prepare(*args: _SupportsArrayPrepare) -> _ArrayPrepare: ...
+@overload
+def get_array_prepare(*args: object) -> None | _ArrayPrepare: ...
+
+@overload
+def get_array_wrap(*args: _SupportsArrayWrap) -> _ArrayWrap: ...
+@overload
+def get_array_wrap(*args: object) -> None | _ArrayWrap: ...
+
+@overload
+def kron(a: _ArrayLikeBool_co, b: _ArrayLikeBool_co) -> NDArray[bool_]: ...  # type: ignore[misc]
+@overload
+def kron(a: _ArrayLikeUInt_co, b: _ArrayLikeUInt_co) -> NDArray[unsignedinteger[Any]]: ...  # type: ignore[misc]
+@overload
+def kron(a: _ArrayLikeInt_co, b: _ArrayLikeInt_co) -> NDArray[signedinteger[Any]]: ...  # type: ignore[misc]
+@overload
+def kron(a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: ...  # type: ignore[misc]
+@overload
+def kron(a: _ArrayLikeComplex_co, b: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def kron(a: _ArrayLikeObject_co, b: Any) -> NDArray[object_]: ...
+@overload
+def kron(a: Any, b: _ArrayLikeObject_co) -> NDArray[object_]: ...
+
+@overload
+def tile(
+    A: _ArrayLike[_SCT],
+    reps: int | Sequence[int],
+) -> NDArray[_SCT]: ...
+@overload
+def tile(
+    A: ArrayLike,
+    reps: int | Sequence[int],
+) -> NDArray[Any]: ...
index 82c8a57c884b8ebbb7585e53dd15a20ec7e60840..5093993a9e925d38aa9eb3356ea6e7dd72c59b0d 100644 (file)
@@ -371,8 +371,9 @@ def broadcast_to(array, shape, subok=False):
     ----------
     array : array_like
         The array to broadcast.
-    shape : tuple
-        The shape of the desired array.
+    shape : tuple or int
+        The shape of the desired array. A single integer ``i`` is interpreted
+        as ``(i,)``.
     subok : bool, optional
         If True, then sub-classes will be passed-through, otherwise
         the returned array will be forced to be a base-class array (default).
index d2e744b5a7b110da966c1ff7883f09e26510f76b..aad404107433f0e4ea9d7539a21e158274717270 100644 (file)
@@ -1,16 +1,81 @@
-from typing import Any, List
+from typing import Any, List, Dict, Iterable, TypeVar, overload, SupportsIndex
 
-from numpy.typing import _ShapeLike, _Shape
+from numpy import dtype, generic
+from numpy.typing import (
+    NDArray,
+    ArrayLike,
+    _ShapeLike,
+    _Shape,
+    _FiniteNestedSequence,
+    _SupportsArray,
+)
+
+_SCT = TypeVar("_SCT", bound=generic)
+_ArrayLike = _FiniteNestedSequence[_SupportsArray[dtype[_SCT]]]
 
 __all__: List[str]
 
 class DummyArray:
-    __array_interface__: Any
-    base: Any
-    def __init__(self, interface, base=...): ...
+    __array_interface__: Dict[str, Any]
+    base: None | NDArray[Any]
+    def __init__(
+        self,
+        interface: Dict[str, Any],
+        base: None | NDArray[Any] = ...,
+    ) -> None: ...
+
+@overload
+def as_strided(
+    x: _ArrayLike[_SCT],
+    shape: None | Iterable[int] = ...,
+    strides: None | Iterable[int] = ...,
+    subok: bool = ...,
+    writeable: bool = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def as_strided(
+    x: ArrayLike,
+    shape: None | Iterable[int] = ...,
+    strides: None | Iterable[int] = ...,
+    subok: bool = ...,
+    writeable: bool = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def sliding_window_view(
+    x: _ArrayLike[_SCT],
+    window_shape: int | Iterable[int],
+    axis: None | SupportsIndex = ...,
+    *,
+    subok: bool = ...,
+    writeable: bool = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def sliding_window_view(
+    x: ArrayLike,
+    window_shape: int | Iterable[int],
+    axis: None | SupportsIndex = ...,
+    *,
+    subok: bool = ...,
+    writeable: bool = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def broadcast_to(
+    array: _ArrayLike[_SCT],
+    shape: int | Iterable[int],
+    subok: bool = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def broadcast_to(
+    array: ArrayLike,
+    shape: int | Iterable[int],
+    subok: bool = ...,
+) -> NDArray[Any]: ...
 
-def as_strided(x, shape=..., strides=..., subok=..., writeable=...): ...
-def sliding_window_view(x, window_shape, axis=..., *, subok=..., writeable=...): ...
-def broadcast_to(array, shape, subok=...): ...
 def broadcast_shapes(*args: _ShapeLike) -> _Shape: ...
-def broadcast_arrays(*args, subok=...): ...
+
+def broadcast_arrays(
+    *args: ArrayLike,
+    subok: bool = ...,
+) -> List[NDArray[Any]]: ...
index 1ed7815d9c0c5b2816c2e5bf5c9e6cad0945b6a5..2738d41c4fbc29f88383de64eaab27ed0e8bc089 100644 (file)
@@ -102,10 +102,10 @@ class TestDataSourceOpen:
 
     def test_InvalidHTTP(self):
         url = invalid_httpurl()
-        assert_raises(IOError, self.ds.open, url)
+        assert_raises(OSError, self.ds.open, url)
         try:
             self.ds.open(url)
-        except IOError as e:
+        except OSError as e:
             # Regression test for bug fixed in r4342.
             assert_(e.errno is None)
 
@@ -120,7 +120,7 @@ class TestDataSourceOpen:
 
     def test_InvalidFile(self):
         invalid_file = invalid_textfile(self.tmpdir)
-        assert_raises(IOError, self.ds.open, invalid_file)
+        assert_raises(OSError, self.ds.open, invalid_file)
 
     def test_ValidGzipFile(self):
         try:
index 10656a23322b4c5718463b02ed5ce1a5799fec44..78e67a89b5a30e17be2077b801b1fb5d75cff941 100644 (file)
@@ -276,8 +276,6 @@ Test the header writing.
 '''
 import sys
 import os
-import shutil
-import tempfile
 import warnings
 import pytest
 from io import BytesIO
index a4f49a78b09dddc90c655e3ed08fc3e47381d46b..b67a31b1850ea536dc47137b5e3efef3609a4f35 100644 (file)
@@ -553,6 +553,11 @@ class TestInsert:
         with pytest.raises(IndexError):
             np.insert([0, 1, 2], np.array([], dtype=float), [])
 
+    @pytest.mark.parametrize('idx', [4, -4])
+    def test_index_out_of_bounds(self, idx):
+        with pytest.raises(IndexError, match='out of bounds'):
+            np.insert([0, 1, 2], [idx], [3, 4])
+
 
 class TestAmax:
 
@@ -1528,6 +1533,21 @@ class TestVectorize:
                      ([('x',)], [('y',), ()]))
         assert_equal(nfb._parse_gufunc_signature('(),(a,b,c),(d)->(d,e)'),
                      ([(), ('a', 'b', 'c'), ('d',)], [('d', 'e')]))
+
+        # Tests to check if whitespaces are ignored
+        assert_equal(nfb._parse_gufunc_signature('(x )->()'), ([('x',)], [()]))
+        assert_equal(nfb._parse_gufunc_signature('( x , y )->(  )'),
+                     ([('x', 'y')], [()]))
+        assert_equal(nfb._parse_gufunc_signature('(x),( y) ->()'),
+                     ([('x',), ('y',)], [()]))
+        assert_equal(nfb._parse_gufunc_signature('(  x)-> (y )  '),
+                     ([('x',)], [('y',)]))
+        assert_equal(nfb._parse_gufunc_signature(' (x)->( y),( )'),
+                     ([('x',)], [('y',), ()]))
+        assert_equal(nfb._parse_gufunc_signature(
+                     '(  ), ( a,  b,c )  ,(  d)   ->   (d  ,  e)'),
+                     ([(), ('a', 'b', 'c'), ('d',)], [('d', 'e')]))
+
         with assert_raises(ValueError):
             nfb._parse_gufunc_signature('(x)(y)->()')
         with assert_raises(ValueError):
@@ -1665,6 +1685,26 @@ class TestVectorize:
         with assert_raises_regex(ValueError, 'new output dimensions'):
             f(x)
 
+    def test_subclasses(self):
+        class subclass(np.ndarray):
+            pass
+
+        m = np.array([[1., 0., 0.],
+                      [0., 0., 1.],
+                      [0., 1., 0.]]).view(subclass)
+        v = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]]).view(subclass)
+        # generalized (gufunc)
+        matvec = np.vectorize(np.matmul, signature='(m,m),(m)->(m)')
+        r = matvec(m, v)
+        assert_equal(type(r), subclass)
+        assert_equal(r, [[1., 3., 2.], [4., 6., 5.], [7., 9., 8.]])
+
+        # element-wise (ufunc)
+        mult = np.vectorize(lambda x, y: x*y)
+        r = mult(m, v)
+        assert_equal(type(r), subclass)
+        assert_equal(r, m * v)
+
 
 class TestLeaks:
     class A:
@@ -1798,7 +1838,7 @@ class TestUnwrap:
         assert_array_equal(unwrap([1, 1 + 2 * np.pi]), [1, 1])
         # check that unwrap maintains continuity
         assert_(np.all(diff(unwrap(rand(10) * 100)) < np.pi))
-    
+
     def test_period(self):
         # check that unwrap removes jumps greater that 255
         assert_array_equal(unwrap([1, 1 + 256], period=255), [1, 2])
@@ -1818,35 +1858,116 @@ class TestUnwrap:
         assert sm_discont.dtype == wrap_uneven.dtype
 
 
+@pytest.mark.parametrize(
+    "dtype", "O" + np.typecodes["AllInteger"] + np.typecodes["Float"]
+)
+@pytest.mark.parametrize("M", [0, 1, 10])
 class TestFilterwindows:
 
-    def test_hanning(self):
+    def test_hanning(self, dtype: str, M: int) -> None:
+        scalar = np.array(M, dtype=dtype)[()]
+
+        w = hanning(scalar)
+        if dtype == "O":
+            ref_dtype = np.float64
+        else:
+            ref_dtype = np.result_type(scalar.dtype, np.float64)
+        assert w.dtype == ref_dtype
+
         # check symmetry
-        w = hanning(10)
         assert_equal(w, flipud(w))
+
         # check known value
-        assert_almost_equal(np.sum(w, axis=0), 4.500, 4)
+        if scalar < 1:
+            assert_array_equal(w, np.array([]))
+        elif scalar == 1:
+            assert_array_equal(w, np.ones(1))
+        else:
+            assert_almost_equal(np.sum(w, axis=0), 4.500, 4)
+
+    def test_hamming(self, dtype: str, M: int) -> None:
+        scalar = np.array(M, dtype=dtype)[()]
+
+        w = hamming(scalar)
+        if dtype == "O":
+            ref_dtype = np.float64
+        else:
+            ref_dtype = np.result_type(scalar.dtype, np.float64)
+        assert w.dtype == ref_dtype
 
-    def test_hamming(self):
         # check symmetry
-        w = hamming(10)
         assert_equal(w, flipud(w))
+
         # check known value
-        assert_almost_equal(np.sum(w, axis=0), 4.9400, 4)
+        if scalar < 1:
+            assert_array_equal(w, np.array([]))
+        elif scalar == 1:
+            assert_array_equal(w, np.ones(1))
+        else:
+            assert_almost_equal(np.sum(w, axis=0), 4.9400, 4)
+
+    def test_bartlett(self, dtype: str, M: int) -> None:
+        scalar = np.array(M, dtype=dtype)[()]
+
+        w = bartlett(scalar)
+        if dtype == "O":
+            ref_dtype = np.float64
+        else:
+            ref_dtype = np.result_type(scalar.dtype, np.float64)
+        assert w.dtype == ref_dtype
 
-    def test_bartlett(self):
         # check symmetry
-        w = bartlett(10)
         assert_equal(w, flipud(w))
+
         # check known value
-        assert_almost_equal(np.sum(w, axis=0), 4.4444, 4)
+        if scalar < 1:
+            assert_array_equal(w, np.array([]))
+        elif scalar == 1:
+            assert_array_equal(w, np.ones(1))
+        else:
+            assert_almost_equal(np.sum(w, axis=0), 4.4444, 4)
+
+    def test_blackman(self, dtype: str, M: int) -> None:
+        scalar = np.array(M, dtype=dtype)[()]
+
+        w = blackman(scalar)
+        if dtype == "O":
+            ref_dtype = np.float64
+        else:
+            ref_dtype = np.result_type(scalar.dtype, np.float64)
+        assert w.dtype == ref_dtype
+
+        # check symmetry
+        assert_equal(w, flipud(w))
+
+        # check known value
+        if scalar < 1:
+            assert_array_equal(w, np.array([]))
+        elif scalar == 1:
+            assert_array_equal(w, np.ones(1))
+        else:
+            assert_almost_equal(np.sum(w, axis=0), 3.7800, 4)
+
+    def test_kaiser(self, dtype: str, M: int) -> None:
+        scalar = np.array(M, dtype=dtype)[()]
+
+        w = kaiser(scalar, 0)
+        if dtype == "O":
+            ref_dtype = np.float64
+        else:
+            ref_dtype = np.result_type(scalar.dtype, np.float64)
+        assert w.dtype == ref_dtype
 
-    def test_blackman(self):
         # check symmetry
-        w = blackman(10)
         assert_equal(w, flipud(w))
+
         # check known value
-        assert_almost_equal(np.sum(w, axis=0), 3.7800, 4)
+        if scalar < 1:
+            assert_array_equal(w, np.array([]))
+        elif scalar == 1:
+            assert_array_equal(w, np.ones(1))
+        else:
+            assert_almost_equal(np.sum(w, axis=0), 10, 15)
 
 
 class TestTrapz:
@@ -2737,11 +2858,6 @@ class TestInterp:
         assert_almost_equal(np.interp(x, xp, fp, period=360), y)
 
 
-def compare_results(res, desired):
-    for i in range(len(desired)):
-        assert_array_equal(res[i], desired[i])
-
-
 class TestPercentile:
 
     def test_basic(self):
@@ -2751,7 +2867,7 @@ class TestPercentile:
         assert_equal(np.percentile(x, 50), 1.75)
         x[1] = np.nan
         assert_equal(np.percentile(x, 0), np.nan)
-        assert_equal(np.percentile(x, 0, interpolation='nearest'), np.nan)
+        assert_equal(np.percentile(x, 0, method='nearest'), np.nan)
 
     def test_fraction(self):
         x = [Fraction(i, 2) for i in range(8)]
@@ -2787,36 +2903,95 @@ class TestPercentile:
                       [1, 1, 1]])
         assert_array_equal(np.percentile(x, 50, axis=0), [1, 1, 1])
 
-    def test_linear(self):
-
-        # Test defaults
-        assert_equal(np.percentile(range(10), 50), 4.5)
-
-        # explicitly specify interpolation_method 'linear' (the default)
-        assert_equal(np.percentile(range(10), 50,
-                                   interpolation='linear'), 4.5)
-
-    def test_lower_higher(self):
-
-        # interpolation_method 'lower'/'higher'
-        assert_equal(np.percentile(range(10), 50,
-                                   interpolation='lower'), 4)
-        assert_equal(np.percentile(range(10), 50,
-                                   interpolation='higher'), 5)
-
-    def test_midpoint(self):
-        assert_equal(np.percentile(range(10), 51,
-                                   interpolation='midpoint'), 4.5)
-        assert_equal(np.percentile(range(11), 51,
-                                   interpolation='midpoint'), 5.5)
-        assert_equal(np.percentile(range(11), 50,
-                                   interpolation='midpoint'), 5)
-
-    def test_nearest(self):
-        assert_equal(np.percentile(range(10), 51,
-                                   interpolation='nearest'), 5)
-        assert_equal(np.percentile(range(10), 49,
-                                   interpolation='nearest'), 4)
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    def test_linear_nan_1D(self, dtype):
+        # METHOD 1 of H&F
+        arr = np.asarray([15.0, np.NAN, 35.0, 40.0, 50.0], dtype=dtype)
+        res = np.percentile(
+            arr,
+            40.0,
+            method="linear")
+        np.testing.assert_equal(res, np.NAN)
+        np.testing.assert_equal(res.dtype, arr.dtype)
+
+    H_F_TYPE_CODES = [(int_type, np.float64)
+                      for int_type in np.typecodes["AllInteger"]
+                      ] + [(np.float16, np.float64),
+                           (np.float32, np.float64),
+                           (np.float64, np.float64),
+                           (np.longdouble, np.longdouble),
+                           (np.complex64, np.complex128),
+                           (np.complex128, np.complex128),
+                           (np.clongdouble, np.clongdouble),
+                           (np.dtype("O"), np.float64)]
+
+    @pytest.mark.parametrize(["input_dtype", "expected_dtype"], H_F_TYPE_CODES)
+    @pytest.mark.parametrize(["method", "expected"],
+                             [("inverted_cdf", 20),
+                              ("averaged_inverted_cdf", 27.5),
+                              ("closest_observation", 20),
+                              ("interpolated_inverted_cdf", 20),
+                              ("hazen", 27.5),
+                              ("weibull", 26),
+                              ("linear", 29),
+                              ("median_unbiased", 27),
+                              ("normal_unbiased", 27.125),
+                              ])
+    def test_linear_interpolation(self,
+                                  method,
+                                  expected,
+                                  input_dtype,
+                                  expected_dtype):
+        arr = np.asarray([15.0, 20.0, 35.0, 40.0, 50.0], dtype=input_dtype)
+        actual = np.percentile(arr, 40.0, method=method)
+
+        np.testing.assert_almost_equal(actual, expected, 14)
+
+        if method in ["inverted_cdf", "closest_observation"]:
+            if input_dtype == "O":
+                np.testing.assert_equal(np.asarray(actual).dtype, np.float64)
+            else:
+                np.testing.assert_equal(np.asarray(actual).dtype,
+                                        np.dtype(input_dtype))
+        else:
+            np.testing.assert_equal(np.asarray(actual).dtype,
+                                    np.dtype(expected_dtype))
+
+    TYPE_CODES = np.typecodes["AllInteger"] + np.typecodes["AllFloat"] + "O"
+
+    @pytest.mark.parametrize("dtype", TYPE_CODES)
+    def test_lower_higher(self, dtype):
+        assert_equal(np.percentile(np.arange(10, dtype=dtype), 50,
+                                   method='lower'), 4)
+        assert_equal(np.percentile(np.arange(10, dtype=dtype), 50,
+                                   method='higher'), 5)
+
+    @pytest.mark.parametrize("dtype", TYPE_CODES)
+    def test_midpoint(self, dtype):
+        assert_equal(np.percentile(np.arange(10, dtype=dtype), 51,
+                                   method='midpoint'), 4.5)
+        assert_equal(np.percentile(np.arange(9, dtype=dtype) + 1, 50,
+                                   method='midpoint'), 5)
+        assert_equal(np.percentile(np.arange(11, dtype=dtype), 51,
+                                   method='midpoint'), 5.5)
+        assert_equal(np.percentile(np.arange(11, dtype=dtype), 50,
+                                   method='midpoint'), 5)
+
+    @pytest.mark.parametrize("dtype", TYPE_CODES)
+    def test_nearest(self, dtype):
+        assert_equal(np.percentile(np.arange(10, dtype=dtype), 51,
+                                   method='nearest'), 5)
+        assert_equal(np.percentile(np.arange(10, dtype=dtype), 49,
+                                   method='nearest'), 4)
+
+    def test_linear_interpolation_extrapolation(self):
+        arr = np.random.rand(5)
+
+        actual = np.percentile(arr, 100)
+        np.testing.assert_equal(actual, arr.max())
+
+        actual = np.percentile(arr, 0)
+        np.testing.assert_equal(actual, arr.min())
 
     def test_sequence(self):
         x = np.arange(8) * 0.5
@@ -2844,19 +3019,19 @@ class TestPercentile:
         assert_equal(
             np.percentile(x, (25, 50, 75), axis=1).shape, (3, 3, 5, 6))
         assert_equal(np.percentile(x, (25, 50),
-                                   interpolation="higher").shape, (2,))
+                                   method="higher").shape, (2,))
         assert_equal(np.percentile(x, (25, 50, 75),
-                                   interpolation="higher").shape, (3,))
+                                   method="higher").shape, (3,))
         assert_equal(np.percentile(x, (25, 50), axis=0,
-                                   interpolation="higher").shape, (2, 4, 5, 6))
+                                   method="higher").shape, (2, 4, 5, 6))
         assert_equal(np.percentile(x, (25, 50), axis=1,
-                                   interpolation="higher").shape, (2, 3, 5, 6))
+                                   method="higher").shape, (2, 3, 5, 6))
         assert_equal(np.percentile(x, (25, 50), axis=2,
-                                   interpolation="higher").shape, (2, 3, 4, 6))
+                                   method="higher").shape, (2, 3, 4, 6))
         assert_equal(np.percentile(x, (25, 50), axis=3,
-                                   interpolation="higher").shape, (2, 3, 4, 5))
+                                   method="higher").shape, (2, 3, 4, 5))
         assert_equal(np.percentile(x, (25, 50, 75), axis=1,
-                                   interpolation="higher").shape, (3, 3, 5, 6))
+                                   method="higher").shape, (3, 3, 5, 6))
 
     def test_scalar_q(self):
         # test for no empty dimensions for compatibility with old percentile
@@ -2882,33 +3057,33 @@ class TestPercentile:
 
         # test for no empty dimensions for compatibility with old percentile
         x = np.arange(12).reshape(3, 4)
-        assert_equal(np.percentile(x, 50, interpolation='lower'), 5.)
+        assert_equal(np.percentile(x, 50, method='lower'), 5.)
         assert_(np.isscalar(np.percentile(x, 50)))
         r0 = np.array([4.,  5.,  6.,  7.])
-        c0 = np.percentile(x, 50, interpolation='lower', axis=0)
+        c0 = np.percentile(x, 50, method='lower', axis=0)
         assert_equal(c0, r0)
         assert_equal(c0.shape, r0.shape)
         r1 = np.array([1.,  5.,  9.])
-        c1 = np.percentile(x, 50, interpolation='lower', axis=1)
+        c1 = np.percentile(x, 50, method='lower', axis=1)
         assert_almost_equal(c1, r1)
         assert_equal(c1.shape, r1.shape)
 
         out = np.empty((), dtype=x.dtype)
-        c = np.percentile(x, 50, interpolation='lower', out=out)
+        c = np.percentile(x, 50, method='lower', out=out)
         assert_equal(c, 5)
         assert_equal(out, 5)
         out = np.empty(4, dtype=x.dtype)
-        c = np.percentile(x, 50, interpolation='lower', axis=0, out=out)
+        c = np.percentile(x, 50, method='lower', axis=0, out=out)
         assert_equal(c, r0)
         assert_equal(out, r0)
         out = np.empty(3, dtype=x.dtype)
-        c = np.percentile(x, 50, interpolation='lower', axis=1, out=out)
+        c = np.percentile(x, 50, method='lower', axis=1, out=out)
         assert_equal(c, r1)
         assert_equal(out, r1)
 
     def test_exception(self):
         assert_raises(ValueError, np.percentile, [1, 2], 56,
-                      interpolation='foobar')
+                      method='foobar')
         assert_raises(ValueError, np.percentile, [1], 101)
         assert_raises(ValueError, np.percentile, [1], -1)
         assert_raises(ValueError, np.percentile, [1], list(range(50)) + [101])
@@ -2922,18 +3097,18 @@ class TestPercentile:
         y = np.zeros((3,))
         p = (1, 2, 3)
         np.percentile(x, p, out=y)
-        assert_equal(y, np.percentile(x, p))
+        assert_equal(np.percentile(x, p), y)
 
         x = np.array([[1, 2, 3],
                       [4, 5, 6]])
 
         y = np.zeros((3, 3))
         np.percentile(x, p, axis=0, out=y)
-        assert_equal(y, np.percentile(x, p, axis=0))
+        assert_equal(np.percentile(x, p, axis=0), y)
 
         y = np.zeros((3, 2))
         np.percentile(x, p, axis=1, out=y)
-        assert_equal(y, np.percentile(x, p, axis=1))
+        assert_equal(np.percentile(x, p, axis=1), y)
 
         x = np.arange(12).reshape(3, 4)
         # q.dim > 1, float
@@ -2949,12 +3124,12 @@ class TestPercentile:
         # q.dim > 1, int
         r0 = np.array([[0,  1,  2, 3], [4, 5, 6, 7]])
         out = np.empty((2, 4), dtype=x.dtype)
-        c = np.percentile(x, (25, 50), interpolation='lower', axis=0, out=out)
+        c = np.percentile(x, (25, 50), method='lower', axis=0, out=out)
         assert_equal(c, r0)
         assert_equal(out, r0)
         r1 = np.array([[0,  4,  8], [1,  5,  9]])
         out = np.empty((2, 3), dtype=x.dtype)
-        c = np.percentile(x, (25, 50), interpolation='lower', axis=1, out=out)
+        c = np.percentile(x, (25, 50), method='lower', axis=1, out=out)
         assert_equal(c, r1)
         assert_equal(out, r1)
 
@@ -2971,10 +3146,10 @@ class TestPercentile:
         assert_array_equal(np.percentile(d, 50, axis=-4).shape, (1, 2, 1))
 
         assert_array_equal(np.percentile(d, 50, axis=2,
-                                         interpolation='midpoint').shape,
+                                         method='midpoint').shape,
                            (11, 1, 1))
         assert_array_equal(np.percentile(d, 50, axis=-2,
-                                         interpolation='midpoint').shape,
+                                         method='midpoint').shape,
                            (11, 1, 1))
 
         assert_array_equal(np.array(np.percentile(d, [10, 50], axis=0)).shape,
@@ -2997,10 +3172,10 @@ class TestPercentile:
 
     def test_no_p_overwrite(self):
         p = np.linspace(0., 100., num=5)
-        np.percentile(np.arange(100.), p, interpolation="midpoint")
+        np.percentile(np.arange(100.), p, method="midpoint")
         assert_array_equal(p, np.linspace(0., 100., num=5))
         p = np.linspace(0., 100., num=5).tolist()
-        np.percentile(np.arange(100.), p, interpolation="midpoint")
+        np.percentile(np.arange(100.), p, method="midpoint")
         assert_array_equal(p, np.linspace(0., 100., num=5).tolist())
 
     def test_percentile_overwrite(self):
@@ -3078,14 +3253,14 @@ class TestPercentile:
         o = np.zeros((4,))
         d = np.ones((3, 4))
         assert_equal(np.percentile(d, 0, 0, out=o), o)
-        assert_equal(np.percentile(d, 0, 0, interpolation='nearest', out=o), o)
+        assert_equal(np.percentile(d, 0, 0, method='nearest', out=o), o)
         o = np.zeros((3,))
         assert_equal(np.percentile(d, 1, 1, out=o), o)
-        assert_equal(np.percentile(d, 1, 1, interpolation='nearest', out=o), o)
+        assert_equal(np.percentile(d, 1, 1, method='nearest', out=o), o)
 
         o = np.zeros(())
         assert_equal(np.percentile(d, 2, out=o), o)
-        assert_equal(np.percentile(d, 2, interpolation='nearest', out=o), o)
+        assert_equal(np.percentile(d, 2, method='nearest', out=o), o)
 
     def test_out_nan(self):
         with warnings.catch_warnings(record=True):
@@ -3095,15 +3270,15 @@ class TestPercentile:
             d[2, 1] = np.nan
             assert_equal(np.percentile(d, 0, 0, out=o), o)
             assert_equal(
-                np.percentile(d, 0, 0, interpolation='nearest', out=o), o)
+                np.percentile(d, 0, 0, method='nearest', out=o), o)
             o = np.zeros((3,))
             assert_equal(np.percentile(d, 1, 1, out=o), o)
             assert_equal(
-                np.percentile(d, 1, 1, interpolation='nearest', out=o), o)
+                np.percentile(d, 1, 1, method='nearest', out=o), o)
             o = np.zeros(())
             assert_equal(np.percentile(d, 1, out=o), o)
             assert_equal(
-                np.percentile(d, 1, interpolation='nearest', out=o), o)
+                np.percentile(d, 1, method='nearest', out=o), o)
 
     def test_nan_behavior(self):
         a = np.arange(24, dtype=float)
@@ -3158,13 +3333,13 @@ class TestPercentile:
         b[:, 1] = np.nan
         b[:, 2] = np.nan
         assert_equal(np.percentile(a, [0.3, 0.6], (0, 2)), b)
-        # axis02 not zerod with nearest interpolation
+        # axis02 not zerod with method='nearest'
         b = np.percentile(np.arange(24, dtype=float).reshape(2, 3, 4),
-                          [0.3, 0.6], (0, 2), interpolation='nearest')
+                          [0.3, 0.6], (0, 2), method='nearest')
         b[:, 1] = np.nan
         b[:, 2] = np.nan
         assert_equal(np.percentile(
-            a, [0.3, 0.6], (0, 2), interpolation='nearest'), b)
+            a, [0.3, 0.6], (0, 2), method='nearest'), b)
 
     def test_nan_q(self):
         # GH18830
@@ -3177,15 +3352,25 @@ class TestPercentile:
         with pytest.raises(ValueError, match="Percentiles must be in"):
             np.percentile([1, 2, 3, 4.0], q)
 
+
 class TestQuantile:
     # most of this is already tested by TestPercentile
 
+    def test_max_ulp(self):
+        x = [0.0, 0.2, 0.4]
+        a = np.quantile(x, 0.45)
+        # The default linear method would result in 0 + 0.2 * (0.45/2) = 0.18.
+        # 0.18 is not exactly representable and the formula leads to a 1 ULP
+        # different result. Ensure it is this exact within 1 ULP, see gh-20331.
+        np.testing.assert_array_max_ulp(a, 0.18, maxulp=1)
+
     def test_basic(self):
         x = np.arange(8) * 0.5
         assert_equal(np.quantile(x, 0), 0.)
         assert_equal(np.quantile(x, 1), 3.5)
         assert_equal(np.quantile(x, 0.5), 1.75)
 
+    @pytest.mark.xfail(reason="See gh-19154")
     def test_correct_quantile_value(self):
         a = np.array([True])
         tf_quant = np.quantile(True, False)
@@ -3194,12 +3379,11 @@ class TestQuantile:
         a = np.array([False, True, True])
         quant_res = np.quantile(a, a)
         assert_array_equal(quant_res, a)
-        assert_equal(a.dtype, quant_res.dtype)
+        assert_equal(quant_res.dtype, a.dtype)
 
     def test_fraction(self):
         # fractional input, integral quantile
         x = [Fraction(i, 2) for i in range(8)]
-
         q = np.quantile(x, 0)
         assert_equal(q, 0)
         assert_equal(type(q), Fraction)
@@ -3228,20 +3412,36 @@ class TestQuantile:
         # this is worth retesting, because quantile does not make a copy
         p0 = np.array([0, 0.75, 0.25, 0.5, 1.0])
         p = p0.copy()
-        np.quantile(np.arange(100.), p, interpolation="midpoint")
+        np.quantile(np.arange(100.), p, method="midpoint")
         assert_array_equal(p, p0)
 
         p0 = p0.tolist()
         p = p.tolist()
-        np.quantile(np.arange(100.), p, interpolation="midpoint")
+        np.quantile(np.arange(100.), p, method="midpoint")
         assert_array_equal(p, p0)
 
-    def test_quantile_monotonic(self):
+    @pytest.mark.parametrize("dtype", np.typecodes["AllInteger"])
+    def test_quantile_preserve_int_type(self, dtype):
+        res = np.quantile(np.array([1, 2], dtype=dtype), [0.5],
+                          method="nearest")
+        assert res.dtype == dtype
+
+    @pytest.mark.parametrize("method",
+             ['inverted_cdf', 'averaged_inverted_cdf', 'closest_observation',
+              'interpolated_inverted_cdf', 'hazen', 'weibull', 'linear',
+              'median_unbiased', 'normal_unbiased',
+              'nearest', 'lower', 'higher', 'midpoint'])
+    def test_quantile_monotonic(self, method):
         # GH 14685
         # test that the return value of quantile is monotonic if p0 is ordered
-        p0 = np.arange(0, 1, 0.01)
+        # Also tests that the boundary values are not mishandled.
+        p0 = np.linspace(0, 1, 101)
         quantile = np.quantile(np.array([0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 1, 1, 9, 9, 9,
-                                         8, 8, 7]) * 0.1, p0)
+                                         8, 8, 7]) * 0.1, p0, method=method)
+        assert_equal(np.sort(quantile), quantile)
+
+        # Also test one where the number of data points is clearly divisible:
+        quantile = np.quantile([0., 1., 2., 3.], p0, method=method)
         assert_equal(np.sort(quantile), quantile)
 
     @hypothesis.given(
@@ -3254,6 +3454,12 @@ class TestQuantile:
         quantile = np.quantile(arr, p0)
         assert_equal(np.sort(quantile), quantile)
 
+    def test_quantile_scalar_nan(self):
+        a = np.array([[10., 7., 4.], [3., 2., 1.]])
+        a[0][1] = np.nan
+        actual = np.quantile(a, 0.5)
+        assert np.isscalar(actual)
+        assert_equal(np.quantile(a, 0.5), np.nan)
 
 class TestLerp:
     @hypothesis.given(t0=st.floats(allow_nan=False, allow_infinity=False,
@@ -3264,9 +3470,9 @@ class TestLerp:
                                     min_value=-1e300, max_value=1e300),
                       b = st.floats(allow_nan=False, allow_infinity=False,
                                     min_value=-1e300, max_value=1e300))
-    def test_lerp_monotonic(self, t0, t1, a, b):
-        l0 = np.lib.function_base._lerp(a, b, t0)
-        l1 = np.lib.function_base._lerp(a, b, t1)
+    def test_linear_interpolation_formula_monotonic(self, t0, t1, a, b):
+        l0 = nfb._lerp(a, b, t0)
+        l1 = nfb._lerp(a, b, t1)
         if t0 == t1 or a == b:
             assert l0 == l1  # uninteresting
         elif (t0 < t1) == (a < b):
@@ -3280,11 +3486,11 @@ class TestLerp:
                                   min_value=-1e300, max_value=1e300),
                       b=st.floats(allow_nan=False, allow_infinity=False,
                                   min_value=-1e300, max_value=1e300))
-    def test_lerp_bounded(self, t, a, b):
+    def test_linear_interpolation_formula_bounded(self, t, a, b):
         if a <= b:
-            assert a <= np.lib.function_base._lerp(a, b, t) <= b
+            assert a <= nfb._lerp(a, b, t) <= b
         else:
-            assert b <= np.lib.function_base._lerp(a, b, t) <= a
+            assert b <= nfb._lerp(a, b, t) <= a
 
     @hypothesis.given(t=st.floats(allow_nan=False, allow_infinity=False,
                                   min_value=0, max_value=1),
@@ -3292,17 +3498,17 @@ class TestLerp:
                                   min_value=-1e300, max_value=1e300),
                       b=st.floats(allow_nan=False, allow_infinity=False,
                                   min_value=-1e300, max_value=1e300))
-    def test_lerp_symmetric(self, t, a, b):
+    def test_linear_interpolation_formula_symmetric(self, t, a, b):
         # double subtraction is needed to remove the extra precision of t < 0.5
-        left = np.lib.function_base._lerp(a, b, 1 - (1 - t))
-        right = np.lib.function_base._lerp(b, a, 1 - t)
+        left = nfb._lerp(a, b, 1 - (1 - t))
+        right = nfb._lerp(b, a, 1 - t)
         assert left == right
 
-    def test_lerp_0d_inputs(self):
+    def test_linear_interpolation_formula_0d_inputs(self):
         a = np.array(2)
         b = np.array(5)
         t = np.array(0.2)
-        assert np.lib.function_base._lerp(a, b, t) == 2.6
+        assert nfb._lerp(a, b, t) == 2.6
 
 
 class TestMedian:
@@ -3402,6 +3608,16 @@ class TestMedian:
         a = MySubClass([1, 2, 3])
         assert_equal(np.median(a), -7)
 
+    @pytest.mark.parametrize('arr',
+                             ([1., 2., 3.], [1., np.nan, 3.], np.nan, 0.))
+    def test_subclass2(self, arr):
+        """Check that we return subclasses, even if a NaN scalar."""
+        class MySubclass(np.ndarray):
+            pass
+
+        m = np.median(np.array(arr).view(MySubclass))
+        assert isinstance(m, MySubclass)
+
     def test_out(self):
         o = np.zeros((4,))
         d = np.ones((3, 4))
index c21aefd1a66bac398896eeea4408622487d6bc36..26a34be7e729dcaa68effd03dca1e4cb83b6a878 100644 (file)
@@ -4,7 +4,6 @@ import numpy as np
 from numpy.testing import (
     assert_, assert_equal, assert_array_equal, assert_almost_equal,
     assert_array_almost_equal, assert_raises, assert_raises_regex,
-    assert_warns
     )
 from numpy.lib.index_tricks import (
     mgrid, ogrid, ndenumerate, fill_diagonal, diag_indices, diag_indices_from,
index 534ab683c58493186a7490f1ccfb6997032ffab7..5201b8e6e33f635ffd2afb1243e77dacdab47bab 100644 (file)
@@ -984,6 +984,28 @@ class TestLoadTxt(LoadTxtBase):
             res = np.loadtxt(c, dtype=dt)
             assert_equal(res, tgt, err_msg="%s" % dt)
 
+    def test_default_float_converter_no_default_hex_conversion(self):
+        """
+        Ensure that fromhex is only used for values with the correct prefix and
+        is not called by default. Regression test related to gh-19598.
+        """
+        c = TextIO("a b c")
+        with pytest.raises(
+            ValueError, match="could not convert string to float"
+        ):
+            np.loadtxt(c)
+
+    def test_default_float_converter_exception(self):
+        """
+        Ensure that the exception message raised during failed floating point
+        conversion is correct. Regression test related to gh-19598.
+        """
+        c = TextIO("qrs tuv")  # Invalid values for default float converter
+        with pytest.raises(
+            ValueError, match="could not convert string to float"
+        ):
+            np.loadtxt(c)
+
     def test_from_complex(self):
         tgt = (complex(1, 1), complex(1, -1))
         c = TextIO()
@@ -1174,6 +1196,7 @@ class TestLoadTxt(LoadTxtBase):
         a = np.array([[1, 2, 3, 5], [4, 5, 7, 8], [2, 1, 4, 5]], int)
         assert_array_equal(x, a)
 
+
 class Testfromregex:
     def test_record(self):
         c = TextIO()
@@ -1207,9 +1230,11 @@ class Testfromregex:
         a = np.array([(1312,), (1534,), (4444,)], dtype=dt)
         assert_array_equal(x, a)
 
-    def test_record_unicode(self):
+    @pytest.mark.parametrize("path_type", [str, Path])
+    def test_record_unicode(self, path_type):
         utf8 = b'\xcf\x96'
-        with temppath() as path:
+        with temppath() as str_path:
+            path = path_type(str_path)
             with open(path, 'wb') as f:
                 f.write(b'1.312 foo' + utf8 + b' \n1.534 bar\n4.444 qux')
 
@@ -1231,6 +1256,13 @@ class Testfromregex:
         x = np.fromregex(c, regexp, dt)
         assert_array_equal(x, a)
 
+    def test_bad_dtype_not_structured(self):
+        regexp = re.compile(b'(\\d)')
+        c = BytesIO(b'123')
+        with pytest.raises(TypeError, match='structured datatype'):
+            np.fromregex(c, regexp, dtype=np.float64)
+
+
 #####--------------------------------------------------------------------------
 
 
@@ -2481,28 +2513,6 @@ class TestPathUsage:
             data = np.genfromtxt(path)
             assert_array_equal(a, data)
 
-    def test_ndfromtxt(self):
-        # Test outputting a standard ndarray
-        with temppath(suffix='.txt') as path:
-            path = Path(path)
-            with path.open('w') as f:
-                f.write(u'1 2\n3 4')
-
-            control = np.array([[1, 2], [3, 4]], dtype=int)
-            test = np.genfromtxt(path, dtype=int)
-            assert_array_equal(test, control)
-
-    def test_mafromtxt(self):
-        # From `test_fancy_dtype_alt` above
-        with temppath(suffix='.txt') as path:
-            path = Path(path)
-            with path.open('w') as f:
-                f.write(u'1,2,3.0\n4,5,6.0\n')
-
-            test = np.genfromtxt(path, delimiter=',', usemask=True)
-            control = ma.array([(1.0, 2.0, 3.0), (4.0, 5.0, 6.0)])
-            assert_equal(test, control)
-
     def test_recfromtxt(self):
         with temppath(suffix='.txt') as path:
             path = Path(path)
index 1f1f5601b19c7422246dceb2537358d87e7f71e9..733a077ea1fcfbb9330bd8711e7f5a7d1cd81d41 100644 (file)
@@ -1,11 +1,12 @@
 import warnings
 import pytest
+import inspect
 
 import numpy as np
 from numpy.lib.nanfunctions import _nan_mask, _replace_nan
 from numpy.testing import (
-    assert_, assert_equal, assert_almost_equal, assert_no_warnings,
-    assert_raises, assert_array_equal, suppress_warnings
+    assert_, assert_equal, assert_almost_equal, assert_raises,
+    assert_array_equal, suppress_warnings
     )
 
 
@@ -35,6 +36,53 @@ _ndat_zeros = np.array([[0.6244, 0.0, 0.2692, 0.0116, 0.0, 0.1170],
                         [0.1610, 0.0, 0.0, 0.1859, 0.3146, 0.0]])
 
 
+class TestSignatureMatch:
+    NANFUNCS = {
+        np.nanmin: np.amin,
+        np.nanmax: np.amax,
+        np.nanargmin: np.argmin,
+        np.nanargmax: np.argmax,
+        np.nansum: np.sum,
+        np.nanprod: np.prod,
+        np.nancumsum: np.cumsum,
+        np.nancumprod: np.cumprod,
+        np.nanmean: np.mean,
+        np.nanmedian: np.median,
+        np.nanpercentile: np.percentile,
+        np.nanquantile: np.quantile,
+        np.nanvar: np.var,
+        np.nanstd: np.std,
+    }
+    IDS = [k.__name__ for k in NANFUNCS]
+
+    @staticmethod
+    def get_signature(func, default="..."):
+        """Construct a signature and replace all default parameter-values."""
+        prm_list = []
+        signature = inspect.signature(func)
+        for prm in signature.parameters.values():
+            if prm.default is inspect.Parameter.empty:
+                prm_list.append(prm)
+            else:
+                prm_list.append(prm.replace(default=default))
+        return inspect.Signature(prm_list)
+
+    @pytest.mark.parametrize("nan_func,func", NANFUNCS.items(), ids=IDS)
+    def test_signature_match(self, nan_func, func):
+        # Ignore the default parameter-values as they can sometimes differ
+        # between the two functions (*e.g.* one has `False` while the other
+        # has `np._NoValue`)
+        signature = self.get_signature(func)
+        nan_signature = self.get_signature(nan_func)
+        np.testing.assert_equal(signature, nan_signature)
+
+    def test_exhaustiveness(self):
+        """Validate that all nan functions are actually tested."""
+        np.testing.assert_equal(
+            set(self.IDS), set(np.lib.nanfunctions.__all__)
+        )
+
+
 class TestNanFunctions_MinMax:
 
     nanfuncs = [np.nanmin, np.nanmax]
@@ -83,21 +131,23 @@ class TestNanFunctions_MinMax:
             res = nf(_ndat, axis=1)
             assert_almost_equal(res, tgt)
 
-    def test_allnans(self):
-        mat = np.array([np.nan]*9).reshape(3, 3)
-        for f in self.nanfuncs:
-            for axis in [None, 0, 1]:
-                with warnings.catch_warnings(record=True) as w:
-                    warnings.simplefilter('always')
-                    assert_(np.isnan(f(mat, axis=axis)).all())
-                    assert_(len(w) == 1, 'no warning raised')
-                    assert_(issubclass(w[0].category, RuntimeWarning))
-            # Check scalars
-            with warnings.catch_warnings(record=True) as w:
-                warnings.simplefilter('always')
-                assert_(np.isnan(f(np.nan)))
-                assert_(len(w) == 1, 'no warning raised')
-                assert_(issubclass(w[0].category, RuntimeWarning))
+    @pytest.mark.parametrize("axis", [None, 0, 1])
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    @pytest.mark.parametrize("array", [
+        np.array(np.nan),
+        np.full((3, 3), np.nan),
+    ], ids=["0d", "2d"])
+    def test_allnans(self, axis, dtype, array):
+        if axis is not None and array.ndim == 0:
+            pytest.skip(f"`axis != None` not supported for 0d arrays")
+
+        array = array.astype(dtype)
+        match = "All-NaN slice encountered"
+        for func in self.nanfuncs:
+            with pytest.warns(RuntimeWarning, match=match):
+                out = func(array, axis=axis)
+            assert np.isnan(out).all()
+            assert out.dtype == array.dtype
 
     def test_masked(self):
         mat = np.ma.fix_invalid(_ndat)
@@ -168,6 +218,46 @@ class TestNanFunctions_MinMax:
             assert_(len(w) == 1, 'no warning raised')
             assert_(issubclass(w[0].category, RuntimeWarning))
 
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    def test_initial(self, dtype):
+        class MyNDArray(np.ndarray):
+            pass
+
+        ar = np.arange(9).astype(dtype)
+        ar[:5] = np.nan
+
+        for f in self.nanfuncs:
+            initial = 100 if f is np.nanmax else 0
+
+            ret1 = f(ar, initial=initial)
+            assert ret1.dtype == dtype
+            assert ret1 == initial
+
+            ret2 = f(ar.view(MyNDArray), initial=initial)
+            assert ret2.dtype == dtype
+            assert ret2 == initial
+
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    def test_where(self, dtype):
+        class MyNDArray(np.ndarray):
+            pass
+
+        ar = np.arange(9).reshape(3, 3).astype(dtype)
+        ar[0, :] = np.nan
+        where = np.ones_like(ar, dtype=np.bool_)
+        where[:, 0] = False
+
+        for f in self.nanfuncs:
+            reference = 4 if f is np.nanmin else 8
+
+            ret1 = f(ar, where=where, initial=5)
+            assert ret1.dtype == dtype
+            assert ret1 == reference
+
+            ret2 = f(ar.view(MyNDArray), where=where, initial=5)
+            assert ret2.dtype == dtype
+            assert ret2 == reference
+
 
 class TestNanFunctions_ArgminArgmax:
 
@@ -193,12 +283,20 @@ class TestNanFunctions_ArgminArgmax:
                     assert_(not fcmp(val, row).any())
                     assert_(not np.equal(val, row[:ind]).any())
 
-    def test_allnans(self):
-        mat = np.array([np.nan]*9).reshape(3, 3)
-        for f in self.nanfuncs:
-            for axis in [None, 0, 1]:
-                assert_raises(ValueError, f, mat, axis=axis)
-            assert_raises(ValueError, f, np.nan)
+    @pytest.mark.parametrize("axis", [None, 0, 1])
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    @pytest.mark.parametrize("array", [
+        np.array(np.nan),
+        np.full((3, 3), np.nan),
+    ], ids=["0d", "2d"])
+    def test_allnans(self, axis, dtype, array):
+        if axis is not None and array.ndim == 0:
+            pytest.skip(f"`axis != None` not supported for 0d arrays")
+
+        array = array.astype(dtype)
+        for func in self.nanfuncs:
+            with pytest.raises(ValueError, match="All-NaN slice encountered"):
+                func(array, axis=axis)
 
     def test_empty(self):
         mat = np.zeros((0, 3))
@@ -230,80 +328,105 @@ class TestNanFunctions_ArgminArgmax:
             res = f(mine)
             assert_(res.shape == ())
 
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    def test_keepdims(self, dtype):
+        ar = np.arange(9).astype(dtype)
+        ar[:5] = np.nan
 
-class TestNanFunctions_IntTypes:
-
-    int_types = (np.int8, np.int16, np.int32, np.int64, np.uint8,
-                 np.uint16, np.uint32, np.uint64)
-
-    mat = np.array([127, 39, 93, 87, 46])
-
-    def integer_arrays(self):
-        for dtype in self.int_types:
-            yield self.mat.astype(dtype)
-
-    def test_nanmin(self):
-        tgt = np.min(self.mat)
-        for mat in self.integer_arrays():
-            assert_equal(np.nanmin(mat), tgt)
-
-    def test_nanmax(self):
-        tgt = np.max(self.mat)
-        for mat in self.integer_arrays():
-            assert_equal(np.nanmax(mat), tgt)
-
-    def test_nanargmin(self):
-        tgt = np.argmin(self.mat)
-        for mat in self.integer_arrays():
-            assert_equal(np.nanargmin(mat), tgt)
-
-    def test_nanargmax(self):
-        tgt = np.argmax(self.mat)
-        for mat in self.integer_arrays():
-            assert_equal(np.nanargmax(mat), tgt)
-
-    def test_nansum(self):
-        tgt = np.sum(self.mat)
-        for mat in self.integer_arrays():
-            assert_equal(np.nansum(mat), tgt)
+        for f in self.nanfuncs:
+            reference = 5 if f is np.nanargmin else 8
+            ret = f(ar, keepdims=True)
+            assert ret.ndim == ar.ndim
+            assert ret == reference
 
-    def test_nanprod(self):
-        tgt = np.prod(self.mat)
-        for mat in self.integer_arrays():
-            assert_equal(np.nanprod(mat), tgt)
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    def test_out(self, dtype):
+        ar = np.arange(9).astype(dtype)
+        ar[:5] = np.nan
 
-    def test_nancumsum(self):
-        tgt = np.cumsum(self.mat)
-        for mat in self.integer_arrays():
-            assert_equal(np.nancumsum(mat), tgt)
+        for f in self.nanfuncs:
+            out = np.zeros((), dtype=np.intp)
+            reference = 5 if f is np.nanargmin else 8
+            ret = f(ar, out=out)
+            assert ret is out
+            assert ret == reference
 
-    def test_nancumprod(self):
-        tgt = np.cumprod(self.mat)
-        for mat in self.integer_arrays():
-            assert_equal(np.nancumprod(mat), tgt)
 
-    def test_nanmean(self):
-        tgt = np.mean(self.mat)
-        for mat in self.integer_arrays():
-            assert_equal(np.nanmean(mat), tgt)
 
-    def test_nanvar(self):
-        tgt = np.var(self.mat)
-        for mat in self.integer_arrays():
-            assert_equal(np.nanvar(mat), tgt)
+_TEST_ARRAYS = {
+    "0d": np.array(5),
+    "1d": np.array([127, 39, 93, 87, 46])
+}
+for _v in _TEST_ARRAYS.values():
+    _v.setflags(write=False)
 
-        tgt = np.var(mat, ddof=1)
-        for mat in self.integer_arrays():
-            assert_equal(np.nanvar(mat, ddof=1), tgt)
 
-    def test_nanstd(self):
-        tgt = np.std(self.mat)
-        for mat in self.integer_arrays():
-            assert_equal(np.nanstd(mat), tgt)
+@pytest.mark.parametrize(
+    "dtype",
+    np.typecodes["AllInteger"] + np.typecodes["AllFloat"] + "O",
+)
+@pytest.mark.parametrize("mat", _TEST_ARRAYS.values(), ids=_TEST_ARRAYS.keys())
+class TestNanFunctions_NumberTypes:
+    nanfuncs = {
+        np.nanmin: np.min,
+        np.nanmax: np.max,
+        np.nanargmin: np.argmin,
+        np.nanargmax: np.argmax,
+        np.nansum: np.sum,
+        np.nanprod: np.prod,
+        np.nancumsum: np.cumsum,
+        np.nancumprod: np.cumprod,
+        np.nanmean: np.mean,
+        np.nanmedian: np.median,
+        np.nanvar: np.var,
+        np.nanstd: np.std,
+    }
+    nanfunc_ids = [i.__name__ for i in nanfuncs]
+
+    @pytest.mark.parametrize("nanfunc,func", nanfuncs.items(), ids=nanfunc_ids)
+    @np.errstate(over="ignore")
+    def test_nanfunc(self, mat, dtype, nanfunc, func):
+        mat = mat.astype(dtype)
+        tgt = func(mat)
+        out = nanfunc(mat)
+
+        assert_almost_equal(out, tgt)
+        if dtype == "O":
+            assert type(out) is type(tgt)
+        else:
+            assert out.dtype == tgt.dtype
+
+    @pytest.mark.parametrize(
+        "nanfunc,func",
+        [(np.nanquantile, np.quantile), (np.nanpercentile, np.percentile)],
+        ids=["nanquantile", "nanpercentile"],
+    )
+    def test_nanfunc_q(self, mat, dtype, nanfunc, func):
+        mat = mat.astype(dtype)
+        tgt = func(mat, q=1)
+        out = nanfunc(mat, q=1)
+
+        assert_almost_equal(out, tgt)
+        if dtype == "O":
+            assert type(out) is type(tgt)
+        else:
+            assert out.dtype == tgt.dtype
+
+    @pytest.mark.parametrize(
+        "nanfunc,func",
+        [(np.nanvar, np.var), (np.nanstd, np.std)],
+        ids=["nanvar", "nanstd"],
+    )
+    def test_nanfunc_ddof(self, mat, dtype, nanfunc, func):
+        mat = mat.astype(dtype)
+        tgt = func(mat, ddof=0.5)
+        out = nanfunc(mat, ddof=0.5)
 
-        tgt = np.std(self.mat, ddof=1)
-        for mat in self.integer_arrays():
-            assert_equal(np.nanstd(mat, ddof=1), tgt)
+        assert_almost_equal(out, tgt)
+        if dtype == "O":
+            assert type(out) is type(tgt)
+        else:
+            assert out.dtype == tgt.dtype
 
 
 class SharedNanFunctionsTestsMixin:
@@ -416,20 +539,21 @@ class TestNanFunctions_SumProd(SharedNanFunctionsTestsMixin):
     nanfuncs = [np.nansum, np.nanprod]
     stdfuncs = [np.sum, np.prod]
 
-    def test_allnans(self):
-        # Check for FutureWarning
-        with warnings.catch_warnings(record=True) as w:
-            warnings.simplefilter('always')
-            res = np.nansum([np.nan]*3, axis=None)
-            assert_(res == 0, 'result is not 0')
-            assert_(len(w) == 0, 'warning raised')
-            # Check scalar
-            res = np.nansum(np.nan)
-            assert_(res == 0, 'result is not 0')
-            assert_(len(w) == 0, 'warning raised')
-            # Check there is no warning for not all-nan
-            np.nansum([0]*3, axis=None)
-            assert_(len(w) == 0, 'unwanted warning raised')
+    @pytest.mark.parametrize("axis", [None, 0, 1])
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    @pytest.mark.parametrize("array", [
+        np.array(np.nan),
+        np.full((3, 3), np.nan),
+    ], ids=["0d", "2d"])
+    def test_allnans(self, axis, dtype, array):
+        if axis is not None and array.ndim == 0:
+            pytest.skip(f"`axis != None` not supported for 0d arrays")
+
+        array = array.astype(dtype)
+        for func, identity in zip(self.nanfuncs, [0, 1]):
+            out = func(array, axis=axis)
+            assert np.all(out == identity)
+            assert out.dtype == array.dtype
 
     def test_empty(self):
         for f, tgt_value in zip([np.nansum, np.nanprod], [0, 1]):
@@ -444,25 +568,51 @@ class TestNanFunctions_SumProd(SharedNanFunctionsTestsMixin):
             res = f(mat, axis=None)
             assert_equal(res, tgt)
 
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    def test_initial(self, dtype):
+        ar = np.arange(9).astype(dtype)
+        ar[:5] = np.nan
+
+        for f in self.nanfuncs:
+            reference = 28 if f is np.nansum else 3360
+            ret = f(ar, initial=2)
+            assert ret.dtype == dtype
+            assert ret == reference
+
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    def test_where(self, dtype):
+        ar = np.arange(9).reshape(3, 3).astype(dtype)
+        ar[0, :] = np.nan
+        where = np.ones_like(ar, dtype=np.bool_)
+        where[:, 0] = False
+
+        for f in self.nanfuncs:
+            reference = 26 if f is np.nansum else 2240
+            ret = f(ar, where=where, initial=2)
+            assert ret.dtype == dtype
+            assert ret == reference
+
 
 class TestNanFunctions_CumSumProd(SharedNanFunctionsTestsMixin):
 
     nanfuncs = [np.nancumsum, np.nancumprod]
     stdfuncs = [np.cumsum, np.cumprod]
 
-    def test_allnans(self):
-        for f, tgt_value in zip(self.nanfuncs, [0, 1]):
-            # Unlike other nan-functions, sum/prod/cumsum/cumprod don't warn on all nan input
-            with assert_no_warnings():
-                res = f([np.nan]*3, axis=None)
-                tgt = tgt_value*np.ones((3))
-                assert_(np.array_equal(res, tgt), 'result is not %s * np.ones((3))' % (tgt_value))
-                # Check scalar
-                res = f(np.nan)
-                tgt = tgt_value*np.ones((1))
-                assert_(np.array_equal(res, tgt), 'result is not %s * np.ones((1))' % (tgt_value))
-                # Check there is no warning for not all-nan
-                f([0]*3, axis=None)
+    @pytest.mark.parametrize("axis", [None, 0, 1])
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    @pytest.mark.parametrize("array", [
+        np.array(np.nan),
+        np.full((3, 3), np.nan)
+    ], ids=["0d", "2d"])
+    def test_allnans(self, axis, dtype, array):
+        if axis is not None and array.ndim == 0:
+            pytest.skip(f"`axis != None` not supported for 0d arrays")
+
+        array = array.astype(dtype)
+        for func, identity in zip(self.nanfuncs, [0, 1]):
+            out = func(array)
+            assert np.all(out == identity)
+            assert out.dtype == array.dtype
 
     def test_empty(self):
         for f, tgt_value in zip(self.nanfuncs, [0, 1]):
@@ -558,19 +708,29 @@ class TestNanFunctions_MeanVarStd(SharedNanFunctionsTestsMixin):
                     else:
                         assert_(len(sup.log) == 0)
 
-    def test_allnans(self):
-        mat = np.array([np.nan]*9).reshape(3, 3)
-        for f in self.nanfuncs:
-            for axis in [None, 0, 1]:
-                with warnings.catch_warnings(record=True) as w:
-                    warnings.simplefilter('always')
-                    assert_(np.isnan(f(mat, axis=axis)).all())
-                    assert_(len(w) == 1)
-                    assert_(issubclass(w[0].category, RuntimeWarning))
-                    # Check scalar
-                    assert_(np.isnan(f(np.nan)))
-                    assert_(len(w) == 2)
-                    assert_(issubclass(w[0].category, RuntimeWarning))
+    @pytest.mark.parametrize("axis", [None, 0, 1])
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    @pytest.mark.parametrize("array", [
+        np.array(np.nan),
+        np.full((3, 3), np.nan),
+    ], ids=["0d", "2d"])
+    def test_allnans(self, axis, dtype, array):
+        if axis is not None and array.ndim == 0:
+            pytest.skip(f"`axis != None` not supported for 0d arrays")
+
+        array = array.astype(dtype)
+        match = "(Degrees of freedom <= 0 for slice.)|(Mean of empty slice)"
+        for func in self.nanfuncs:
+            with pytest.warns(RuntimeWarning, match=match):
+                out = func(array, axis=axis)
+            assert np.isnan(out).all()
+
+            # `nanvar` and `nanstd` convert complex inputs to their
+            # corresponding floating dtype
+            if func is np.nanmean:
+                assert out.dtype == array.dtype
+            else:
+                assert out.dtype == np.abs(array).dtype
 
     def test_empty(self):
         mat = np.zeros((0, 3))
@@ -587,6 +747,21 @@ class TestNanFunctions_MeanVarStd(SharedNanFunctionsTestsMixin):
                     assert_equal(f(mat, axis=axis), np.zeros([]))
                     assert_(len(w) == 0)
 
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    def test_where(self, dtype):
+        ar = np.arange(9).reshape(3, 3).astype(dtype)
+        ar[0, :] = np.nan
+        where = np.ones_like(ar, dtype=np.bool_)
+        where[:, 0] = False
+
+        for f, f_std in zip(self.nanfuncs, self.stdfuncs):
+            reference = f_std(ar[where][2:])
+            dtype_reference = dtype if f is np.nanmean else ar.real.dtype
+
+            ret = f(ar, where=where)
+            assert ret.dtype == dtype_reference
+            np.testing.assert_allclose(ret, reference)
+
 
 _TIME_UNITS = (
     "Y", "M", "W", "D", "h", "m", "s", "ms", "us", "ns", "ps", "fs", "as"
@@ -834,24 +1009,21 @@ class TestNanFunctions_Percentile:
         res = np.nanpercentile(_ndat, (28, 98), axis=1)
         assert_almost_equal(res, tgt)
 
-    def test_allnans(self):
-        mat = np.array([np.nan]*9).reshape(3, 3)
-        for axis in [None, 0, 1]:
-            with warnings.catch_warnings(record=True) as w:
-                warnings.simplefilter('always')
-                assert_(np.isnan(np.nanpercentile(mat, 60, axis=axis)).all())
-                if axis is None:
-                    assert_(len(w) == 1)
-                else:
-                    assert_(len(w) == 3)
-                assert_(issubclass(w[0].category, RuntimeWarning))
-                # Check scalar
-                assert_(np.isnan(np.nanpercentile(np.nan, 60)))
-                if axis is None:
-                    assert_(len(w) == 2)
-                else:
-                    assert_(len(w) == 4)
-                assert_(issubclass(w[0].category, RuntimeWarning))
+    @pytest.mark.parametrize("axis", [None, 0, 1])
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    @pytest.mark.parametrize("array", [
+        np.array(np.nan),
+        np.full((3, 3), np.nan),
+    ], ids=["0d", "2d"])
+    def test_allnans(self, axis, dtype, array):
+        if axis is not None and array.ndim == 0:
+            pytest.skip(f"`axis != None` not supported for 0d arrays")
+
+        array = array.astype(dtype)
+        with pytest.warns(RuntimeWarning, match="All-NaN slice encountered"):
+            out = np.nanpercentile(array, 60, axis=axis)
+        assert np.isnan(out).all()
+        assert out.dtype == array.dtype
 
     def test_empty(self):
         mat = np.zeros((0, 3))
@@ -936,14 +1108,30 @@ class TestNanFunctions_Quantile:
         # this is worth retesting, because quantile does not make a copy
         p0 = np.array([0, 0.75, 0.25, 0.5, 1.0])
         p = p0.copy()
-        np.nanquantile(np.arange(100.), p, interpolation="midpoint")
+        np.nanquantile(np.arange(100.), p, method="midpoint")
         assert_array_equal(p, p0)
 
         p0 = p0.tolist()
         p = p.tolist()
-        np.nanquantile(np.arange(100.), p, interpolation="midpoint")
+        np.nanquantile(np.arange(100.), p, method="midpoint")
         assert_array_equal(p, p0)
 
+    @pytest.mark.parametrize("axis", [None, 0, 1])
+    @pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
+    @pytest.mark.parametrize("array", [
+        np.array(np.nan),
+        np.full((3, 3), np.nan),
+    ], ids=["0d", "2d"])
+    def test_allnans(self, axis, dtype, array):
+        if axis is not None and array.ndim == 0:
+            pytest.skip(f"`axis != None` not supported for 0d arrays")
+
+        array = array.astype(dtype)
+        with pytest.warns(RuntimeWarning, match="All-NaN slice encountered"):
+            out = np.nanquantile(array, 1, axis=axis)
+        assert np.isnan(out).all()
+        assert out.dtype == array.dtype
+
 @pytest.mark.parametrize("arr, expected", [
     # array of floats with some nans
     (np.array([np.nan, 5.0, np.nan, np.inf]),
index 6c3e4fa02212f9ff65579d0c3526fc4d22719005..3734344d2a85c23a762edbd104a4dac20806c5a0 100644 (file)
@@ -4,6 +4,12 @@ from numpy.testing import (
     assert_array_almost_equal, assert_raises, assert_allclose
     )
 
+import pytest
+
+# `poly1d` has some support for `bool_` and `timedelta64`,
+# but it is limited and they are therefore excluded here
+TYPE_CODES = np.typecodes["AllInteger"] + np.typecodes["AllFloat"] + "O"
+
 
 class TestPolynomial:
     def test_poly1d_str_and_repr(self):
@@ -57,11 +63,26 @@ class TestPolynomial:
         assert_equal(np.polydiv(np.poly1d([1, 0, -1]), np.poly1d([1, 1])),
                      (np.poly1d([1., -1.]), np.poly1d([0.])))
 
-    def test_poly1d_misc(self):
-        p = np.poly1d([1., 2, 3])
-        assert_equal(np.asarray(p), np.array([1., 2., 3.]))
+    @pytest.mark.parametrize("type_code", TYPE_CODES)
+    def test_poly1d_misc(self, type_code: str) -> None:
+        dtype = np.dtype(type_code)
+        ar = np.array([1, 2, 3], dtype=dtype)
+        p = np.poly1d(ar)
+
+        # `__eq__`
+        assert_equal(np.asarray(p), ar)
+        assert_equal(np.asarray(p).dtype, dtype)
         assert_equal(len(p), 2)
-        assert_equal((p[0], p[1], p[2], p[3]), (3.0, 2.0, 1.0, 0))
+
+        # `__getitem__`
+        comparison_dct = {-1: 0, 0: 3, 1: 2, 2: 1, 3: 0}
+        for index, ref in comparison_dct.items():
+            scalar = p[index]
+            assert_equal(scalar, ref)
+            if dtype == np.object_:
+                assert isinstance(scalar, int)
+            else:
+                assert_equal(scalar.dtype, dtype)
 
     def test_poly1d_variable_arg(self):
         q = np.poly1d([1., 2, 3], variable='y')
@@ -257,7 +278,7 @@ class TestPolynomial:
         assert_equal(q.coeffs.dtype, np.complex128)
         assert_equal(r.coeffs.dtype, np.complex128)
         assert_equal(q*a + r, b)
-        
+
         c = [1, 2, 3]
         d = np.poly1d([1, 2, 3])
         s, t = np.polydiv(c, d)
index 373226277acdb1a0aa9fc4e0e4158ebf3459e09a..55df2a6752c2629a12dc96ae4a0d267a9e228cf4 100644 (file)
@@ -1,5 +1,3 @@
-import pytest
-
 import os
 
 import numpy as np
index fb7ba78749ebc3877386816a15e795e822e9af4a..a148e53da68a331905351dc7c7b9f0f792f00ee6 100644 (file)
@@ -392,7 +392,7 @@ class TestArraySplit:
         assert_(a.dtype.type is res[-1].dtype.type)
 
         # Same thing for manual splits:
-        res = array_split(a, [0, 1, 2], axis=0)
+        res = array_split(a, [0, 1], axis=0)
         tgt = [np.zeros((0, 10)), np.array([np.arange(10)]),
                np.array([np.arange(10)])]
         compare_results(res, tgt)
@@ -713,5 +713,9 @@ class TestMayShareMemory:
 
 # Utility
 def compare_results(res, desired):
-    for i in range(len(desired)):
-        assert_array_equal(res[i], desired[i])
+    """Compare lists of arrays."""
+    if len(res) != len(desired):
+        raise ValueError("Iterables have different lengths")
+    # See also PEP 618 for Python 3.10
+    for x, y in zip(res, desired):
+        assert_array_equal(x, y)
index cce683bfeda3e990e94aee7ffde1f8fcfa9051d0..c1c5a1615d78bd66887061fc5e4240416a553063 100644 (file)
@@ -18,6 +18,9 @@ import numpy as np
 from numpy.core.tests.test_overrides import requires_array_function
 
 
+import pytest
+
+
 def get_mat(n):
     data = arange(n)
     data = add.outer(data, data)
@@ -295,6 +298,13 @@ class TestHistogram2d:
         r = histogram2d(xy, xy, weights=s_d)
         assert_(r, ((ShouldDispatch,), (xy, xy), dict(weights=s_d)))
 
+    @pytest.mark.parametrize(("x_len", "y_len"), [(10, 11), (20, 19)])
+    def test_bad_length(self, x_len, y_len):
+        x, y = np.ones(x_len), np.ones(y_len)
+        with pytest.raises(ValueError,
+                           match='x and y must have the same length.'):
+            histogram2d(x, y)
+
 
 class TestTri:
     def test_dtype(self):
index fd8c7357329082711aa31373b9188565b4bc19fc..3e5ad31ff0d52f30b6fb083815ef62b34ba25c82 100644 (file)
@@ -67,7 +67,7 @@ def fliplr(m):
     See Also
     --------
     flipud : Flip array in the up/down direction.
-    flip : Flip array in one or more dimesions.
+    flip : Flip array in one or more dimensions.
     rot90 : Rotate array counterclockwise.
 
     Notes
@@ -120,7 +120,7 @@ def flipud(m):
     See Also
     --------
     fliplr : Flip array in the left/right direction.
-    flip : Flip array in one or more dimesions.
+    flip : Flip array in one or more dimensions.
     rot90 : Rotate array counterclockwise.
 
     Notes
@@ -439,10 +439,12 @@ def tril(m, k=0):
     Lower triangle of an array.
 
     Return a copy of an array with elements above the `k`-th diagonal zeroed.
+    For arrays with ``ndim`` exceeding 2, `tril` will apply to the final two
+    axes.
 
     Parameters
     ----------
-    m : array_like, shape (M, N)
+    m : array_like, shape (..., M, N)
         Input array.
     k : int, optional
         Diagonal above which to zero elements.  `k = 0` (the default) is the
@@ -450,7 +452,7 @@ def tril(m, k=0):
 
     Returns
     -------
-    tril : ndarray, shape (M, N)
+    tril : ndarray, shape (..., M, N)
         Lower triangle of `m`, of same shape and data-type as `m`.
 
     See Also
@@ -465,6 +467,20 @@ def tril(m, k=0):
            [ 7,  8,  0],
            [10, 11, 12]])
 
+    >>> np.tril(np.arange(3*4*5).reshape(3, 4, 5))
+    array([[[ 0,  0,  0,  0,  0],
+            [ 5,  6,  0,  0,  0],
+            [10, 11, 12,  0,  0],
+            [15, 16, 17, 18,  0]],
+           [[20,  0,  0,  0,  0],
+            [25, 26,  0,  0,  0],
+            [30, 31, 32,  0,  0],
+            [35, 36, 37, 38,  0]],
+           [[40,  0,  0,  0,  0],
+            [45, 46,  0,  0,  0],
+            [50, 51, 52,  0,  0],
+            [55, 56, 57, 58,  0]]])
+
     """
     m = asanyarray(m)
     mask = tri(*m.shape[-2:], k=k, dtype=bool)
@@ -478,7 +494,8 @@ def triu(m, k=0):
     Upper triangle of an array.
 
     Return a copy of an array with the elements below the `k`-th diagonal
-    zeroed.
+    zeroed. For arrays with ``ndim`` exceeding 2, `triu` will apply to the final
+    two axes.
 
     Please refer to the documentation for `tril` for further details.
 
@@ -494,6 +511,20 @@ def triu(m, k=0):
            [ 0,  8,  9],
            [ 0,  0, 12]])
 
+    >>> np.triu(np.arange(3*4*5).reshape(3, 4, 5))
+    array([[[ 0,  1,  2,  3,  4],
+            [ 0,  6,  7,  8,  9],
+            [ 0,  0, 12, 13, 14],
+            [ 0,  0,  0, 18, 19]],
+           [[20, 21, 22, 23, 24],
+            [ 0, 26, 27, 28, 29],
+            [ 0,  0, 32, 33, 34],
+            [ 0,  0,  0, 38, 39]],
+           [[40, 41, 42, 43, 44],
+            [ 0, 46, 47, 48, 49],
+            [ 0,  0, 52, 53, 54],
+            [ 0,  0,  0, 58, 59]]])
+
     """
     m = asanyarray(m)
     mask = tri(*m.shape[-2:], k=k-1, dtype=bool)
@@ -737,8 +768,45 @@ def histogram2d(x, y, bins=10, range=None, normed=None, weights=None,
     >>> ax.images.append(im)
     >>> plt.show()
 
+    It is also possible to construct a 2-D histogram without specifying bin
+    edges:
+
+    >>> # Generate non-symmetric test data
+    >>> n = 10000
+    >>> x = np.linspace(1, 100, n)
+    >>> y = 2*np.log(x) + np.random.rand(n) - 0.5
+    >>> # Compute 2d histogram. Note the order of x/y and xedges/yedges
+    >>> H, yedges, xedges = np.histogram2d(y, x, bins=20)
+
+    Now we can plot the histogram using
+    :func:`pcolormesh <matplotlib.pyplot.pcolormesh>`, and a
+    :func:`hexbin <matplotlib.pyplot.hexbin>` for comparison.
+
+    >>> # Plot histogram using pcolormesh
+    >>> fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True)
+    >>> ax1.pcolormesh(xedges, yedges, H, cmap='rainbow')
+    >>> ax1.plot(x, 2*np.log(x), 'k-')
+    >>> ax1.set_xlim(x.min(), x.max())
+    >>> ax1.set_ylim(y.min(), y.max())
+    >>> ax1.set_xlabel('x')
+    >>> ax1.set_ylabel('y')
+    >>> ax1.set_title('histogram2d')
+    >>> ax1.grid()
+
+    >>> # Create hexbin plot for comparison
+    >>> ax2.hexbin(x, y, gridsize=20, cmap='rainbow')
+    >>> ax2.plot(x, 2*np.log(x), 'k-')
+    >>> ax2.set_title('hexbin')
+    >>> ax2.set_xlim(x.min(), x.max())
+    >>> ax2.set_xlabel('x')
+    >>> ax2.grid()
+
+    >>> plt.show()
     """
     from numpy import histogramdd
+    
+    if len(x) != len(y):
+        raise ValueError('x and y must have the same length.')
 
     try:
         N = len(bins)
index 79b9511b88ab9ee112261bdeeb210a525b6b335f..cba503ca355843213c6be3c474a6ea333b054801 100644 (file)
-from typing import List, Optional, Any
+from typing import (
+    Any,
+    Callable,
+    List,
+    Sequence,
+    overload,
+    Tuple,
+    Type,
+    TypeVar,
+    Union,
+)
 
-from numpy import ndarray, _OrderCF
-from numpy.typing import ArrayLike, DTypeLike
+from numpy import (
+    ndarray,
+    dtype,
+    generic,
+    number,
+    bool_,
+    timedelta64,
+    datetime64,
+    int_,
+    intp,
+    float64,
+    signedinteger,
+    floating,
+    complexfloating,
+    object_,
+    _OrderCF,
+)
+
+from numpy.typing import (
+    DTypeLike,
+    _SupportsDType,
+    ArrayLike,
+    NDArray,
+    _FiniteNestedSequence,
+    _SupportsArray,
+    _ArrayLikeInt_co,
+    _ArrayLikeFloat_co,
+    _ArrayLikeComplex_co,
+    _ArrayLikeObject_co,
+)
+
+_T = TypeVar("_T")
+_SCT = TypeVar("_SCT", bound=generic)
+
+# The returned arrays dtype must be compatible with `np.equal`
+_MaskFunc = Callable[
+    [NDArray[int_], _T],
+    NDArray[Union[number[Any], bool_, timedelta64, datetime64, object_]],
+]
+
+_DTypeLike = Union[
+    Type[_SCT],
+    dtype[_SCT],
+    _SupportsDType[dtype[_SCT]],
+]
+_ArrayLike = _FiniteNestedSequence[_SupportsArray[dtype[_SCT]]]
 
 __all__: List[str]
 
-def fliplr(m): ...
-def flipud(m): ...
+@overload
+def fliplr(m: _ArrayLike[_SCT]) -> NDArray[_SCT]: ...
+@overload
+def fliplr(m: ArrayLike) -> NDArray[Any]: ...
+
+@overload
+def flipud(m: _ArrayLike[_SCT]) -> NDArray[_SCT]: ...
+@overload
+def flipud(m: ArrayLike) -> NDArray[Any]: ...
 
+@overload
 def eye(
     N: int,
-    M: Optional[int] = ...,
+    M: None | int = ...,
+    k: int = ...,
+    dtype: None = ...,
+    order: _OrderCF = ...,
+    *,
+    like: None | ArrayLike = ...,
+) -> NDArray[float64]: ...
+@overload
+def eye(
+    N: int,
+    M: None | int = ...,
+    k: int = ...,
+    dtype: _DTypeLike[_SCT] = ...,
+    order: _OrderCF = ...,
+    *,
+    like: None | ArrayLike = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def eye(
+    N: int,
+    M: None | int = ...,
     k: int = ...,
     dtype: DTypeLike = ...,
     order: _OrderCF = ...,
     *,
-    like: Optional[ArrayLike] = ...
-) -> ndarray[Any, Any]: ...
-
-def diag(v, k=...): ...
-def diagflat(v, k=...): ...
-def tri(N, M=..., k=..., dtype = ..., *, like=...): ...
-def tril(m, k=...): ...
-def triu(m, k=...): ...
-def vander(x, N=..., increasing=...): ...
-def histogram2d(x, y, bins=..., range=..., normed=..., weights=..., density=...): ...
-def mask_indices(n, mask_func, k=...): ...
-def tril_indices(n, k=..., m=...): ...
-def tril_indices_from(arr, k=...): ...
-def triu_indices(n, k=..., m=...): ...
-def triu_indices_from(arr, k=...): ...
+    like: None | ArrayLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def diag(v: _ArrayLike[_SCT], k: int = ...) -> NDArray[_SCT]: ...
+@overload
+def diag(v: ArrayLike, k: int = ...) -> NDArray[Any]: ...
+
+@overload
+def diagflat(v: _ArrayLike[_SCT], k: int = ...) -> NDArray[_SCT]: ...
+@overload
+def diagflat(v: ArrayLike, k: int = ...) -> NDArray[Any]: ...
+
+@overload
+def tri(
+    N: int,
+    M: None | int = ...,
+    k: int = ...,
+    dtype: None = ...,
+    *,
+    like: None | ArrayLike = ...
+) -> NDArray[float64]: ...
+@overload
+def tri(
+    N: int,
+    M: None | int = ...,
+    k: int = ...,
+    dtype: _DTypeLike[_SCT] = ...,
+    *,
+    like: None | ArrayLike = ...
+) -> NDArray[_SCT]: ...
+@overload
+def tri(
+    N: int,
+    M: None | int = ...,
+    k: int = ...,
+    dtype: DTypeLike = ...,
+    *,
+    like: None | ArrayLike = ...
+) -> NDArray[Any]: ...
+
+@overload
+def tril(v: _ArrayLike[_SCT], k: int = ...) -> NDArray[_SCT]: ...
+@overload
+def tril(v: ArrayLike, k: int = ...) -> NDArray[Any]: ...
+
+@overload
+def triu(v: _ArrayLike[_SCT], k: int = ...) -> NDArray[_SCT]: ...
+@overload
+def triu(v: ArrayLike, k: int = ...) -> NDArray[Any]: ...
+
+@overload
+def vander(  # type: ignore[misc]
+    x: _ArrayLikeInt_co,
+    N: None | int = ...,
+    increasing: bool = ...,
+) -> NDArray[signedinteger[Any]]: ...
+@overload
+def vander(  # type: ignore[misc]
+    x: _ArrayLikeFloat_co,
+    N: None | int = ...,
+    increasing: bool = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def vander(
+    x: _ArrayLikeComplex_co,
+    N: None | int = ...,
+    increasing: bool = ...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def vander(
+    x: _ArrayLikeObject_co,
+    N: None | int = ...,
+    increasing: bool = ...,
+) -> NDArray[object_]: ...
+
+@overload
+def histogram2d(  # type: ignore[misc]
+    x: _ArrayLikeFloat_co,
+    y: _ArrayLikeFloat_co,
+    bins: int | Sequence[int] = ...,
+    range: None | _ArrayLikeFloat_co = ...,
+    normed: None | bool = ...,
+    weights: None | _ArrayLikeFloat_co = ...,
+    density: None | bool = ...,
+) -> Tuple[
+    NDArray[float64],
+    NDArray[floating[Any]],
+    NDArray[floating[Any]],
+]: ...
+@overload
+def histogram2d(
+    x: _ArrayLikeComplex_co,
+    y: _ArrayLikeComplex_co,
+    bins: int | Sequence[int] = ...,
+    range: None | _ArrayLikeFloat_co = ...,
+    normed: None | bool = ...,
+    weights: None | _ArrayLikeFloat_co = ...,
+    density: None | bool = ...,
+) -> Tuple[
+    NDArray[float64],
+    NDArray[complexfloating[Any, Any]],
+    NDArray[complexfloating[Any, Any]],
+]: ...
+@overload  # TODO: Sort out `bins`
+def histogram2d(
+    x: _ArrayLikeComplex_co,
+    y: _ArrayLikeComplex_co,
+    bins: Sequence[_ArrayLikeInt_co],
+    range: None | _ArrayLikeFloat_co = ...,
+    normed: None | bool = ...,
+    weights: None | _ArrayLikeFloat_co = ...,
+    density: None | bool = ...,
+) -> Tuple[
+    NDArray[float64],
+    NDArray[Any],
+    NDArray[Any],
+]: ...
+
+# NOTE: we're assuming/demanding here the `mask_func` returns
+# an ndarray of shape `(n, n)`; otherwise there is the possibility
+# of the output tuple having more or less than 2 elements
+@overload
+def mask_indices(
+    n: int,
+    mask_func: _MaskFunc[int],
+    k: int = ...,
+) -> Tuple[NDArray[intp], NDArray[intp]]: ...
+@overload
+def mask_indices(
+    n: int,
+    mask_func: _MaskFunc[_T],
+    k: _T,
+) -> Tuple[NDArray[intp], NDArray[intp]]: ...
+
+def tril_indices(
+    n: int,
+    k: int = ...,
+    m: None | int = ...,
+) -> Tuple[NDArray[int_], NDArray[int_]]: ...
+
+def tril_indices_from(
+    arr: NDArray[Any],
+    k: int = ...,
+) -> Tuple[NDArray[int_], NDArray[int_]]: ...
+
+def triu_indices(
+    n: int,
+    k: int = ...,
+    m: None | int = ...,
+) -> Tuple[NDArray[int_], NDArray[int_]]: ...
+
+def triu_indices_from(
+    arr: NDArray[Any],
+    k: int = ...,
+) -> Tuple[NDArray[int_], NDArray[int_]]: ...
index 7da02bb9f196edc70b23c267e74ec5e5f34589e0..0a55dbf21347757d86032d1bf72e389fd6266ebd 100644 (file)
-from typing import List
+from typing import (
+    Literal as L,
+    Any,
+    Container,
+    Iterable,
+    List,
+    overload,
+    Type,
+    TypeVar,
+    Protocol,
+)
+
+from numpy import (
+    dtype,
+    generic,
+    bool_,
+    floating,
+    float64,
+    complexfloating,
+    integer,
+)
+
+from numpy.typing import (
+    ArrayLike,
+    DTypeLike,
+    NBitBase,
+    NDArray,
+    _64Bit,
+    _SupportsDType,
+    _ScalarLike_co,
+    _FiniteNestedSequence,
+    _SupportsArray,
+    _DTypeLikeComplex,
+)
+
+_T = TypeVar("_T")
+_T_co = TypeVar("_T_co", covariant=True)
+_SCT = TypeVar("_SCT", bound=generic)
+_NBit1 = TypeVar("_NBit1", bound=NBitBase)
+_NBit2 = TypeVar("_NBit2", bound=NBitBase)
+
+_ArrayLike = _FiniteNestedSequence[_SupportsArray[dtype[_SCT]]]
+
+class _SupportsReal(Protocol[_T_co]):
+    @property
+    def real(self) -> _T_co: ...
+
+class _SupportsImag(Protocol[_T_co]):
+    @property
+    def imag(self) -> _T_co: ...
 
 __all__: List[str]
 
-def mintypecode(typechars, typeset=..., default=...): ...
-def asfarray(a, dtype = ...): ...
-def real(val): ...
-def imag(val): ...
-def iscomplex(x): ...
-def isreal(x): ...
-def iscomplexobj(x): ...
-def isrealobj(x): ...
-def nan_to_num(x, copy=..., nan=..., posinf=..., neginf=...): ...
-def real_if_close(a, tol=...): ...
-def typename(char): ...
-def common_type(*arrays): ...
-
-# NOTE: Deprecated
+def mintypecode(
+    typechars: Iterable[str | ArrayLike],
+    typeset: Container[str] = ...,
+    default: str = ...,
+) -> str: ...
+
+# `asfarray` ignores dtypes if they're not inexact
+
+@overload
+def asfarray(
+    a: object,
+    dtype: None | Type[float] = ...,
+) -> NDArray[float64]: ...
+@overload
+def asfarray(  # type: ignore[misc]
+    a: Any,
+    dtype: _DTypeLikeComplex,
+) -> NDArray[complexfloating[Any, Any]]: ...
+@overload
+def asfarray(
+    a: Any,
+    dtype: DTypeLike,
+) -> NDArray[floating[Any]]: ...
+
+@overload
+def real(val: _SupportsReal[_T]) -> _T: ...
+@overload
+def real(val: ArrayLike) -> NDArray[Any]: ...
+
+@overload
+def imag(val: _SupportsImag[_T]) -> _T: ...
+@overload
+def imag(val: ArrayLike) -> NDArray[Any]: ...
+
+@overload
+def iscomplex(x: _ScalarLike_co) -> bool_: ...  # type: ignore[misc]
+@overload
+def iscomplex(x: ArrayLike) -> NDArray[bool_]: ...
+
+@overload
+def isreal(x: _ScalarLike_co) -> bool_: ...  # type: ignore[misc]
+@overload
+def isreal(x: ArrayLike) -> NDArray[bool_]: ...
+
+def iscomplexobj(x: _SupportsDType[dtype[Any]] | ArrayLike) -> bool: ...
+
+def isrealobj(x: _SupportsDType[dtype[Any]] | ArrayLike) -> bool: ...
+
+@overload
+def nan_to_num(  # type: ignore[misc]
+    x: _SCT,
+    copy: bool = ...,
+    nan: float = ...,
+    posinf: None | float = ...,
+    neginf: None | float = ...,
+) -> _SCT: ...
+@overload
+def nan_to_num(
+    x: _ScalarLike_co,
+    copy: bool = ...,
+    nan: float = ...,
+    posinf: None | float = ...,
+    neginf: None | float = ...,
+) -> Any: ...
+@overload
+def nan_to_num(
+    x: _ArrayLike[_SCT],
+    copy: bool = ...,
+    nan: float = ...,
+    posinf: None | float = ...,
+    neginf: None | float = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def nan_to_num(
+    x: ArrayLike,
+    copy: bool = ...,
+    nan: float = ...,
+    posinf: None | float = ...,
+    neginf: None | float = ...,
+) -> NDArray[Any]: ...
+
+# If one passes a complex array to `real_if_close`, then one is reasonably
+# expected to verify the output dtype (so we can return an unsafe union here)
+
+@overload
+def real_if_close(  # type: ignore[misc]
+    a: _ArrayLike[complexfloating[_NBit1, _NBit1]],
+    tol: float = ...,
+) -> NDArray[floating[_NBit1]] | NDArray[complexfloating[_NBit1, _NBit1]]: ...
+@overload
+def real_if_close(
+    a: _ArrayLike[_SCT],
+    tol: float = ...,
+) -> NDArray[_SCT]: ...
+@overload
+def real_if_close(
+    a: ArrayLike,
+    tol: float = ...,
+) -> NDArray[Any]: ...
+
+# NOTE: deprecated
 # def asscalar(a): ...
+
+@overload
+def typename(char: L['S1']) -> L['character']: ...
+@overload
+def typename(char: L['?']) -> L['bool']: ...
+@overload
+def typename(char: L['b']) -> L['signed char']: ...
+@overload
+def typename(char: L['B']) -> L['unsigned char']: ...
+@overload
+def typename(char: L['h']) -> L['short']: ...
+@overload
+def typename(char: L['H']) -> L['unsigned short']: ...
+@overload
+def typename(char: L['i']) -> L['integer']: ...
+@overload
+def typename(char: L['I']) -> L['unsigned integer']: ...
+@overload
+def typename(char: L['l']) -> L['long integer']: ...
+@overload
+def typename(char: L['L']) -> L['unsigned long integer']: ...
+@overload
+def typename(char: L['q']) -> L['long long integer']: ...
+@overload
+def typename(char: L['Q']) -> L['unsigned long long integer']: ...
+@overload
+def typename(char: L['f']) -> L['single precision']: ...
+@overload
+def typename(char: L['d']) -> L['double precision']: ...
+@overload
+def typename(char: L['g']) -> L['long precision']: ...
+@overload
+def typename(char: L['F']) -> L['complex single precision']: ...
+@overload
+def typename(char: L['D']) -> L['complex double precision']: ...
+@overload
+def typename(char: L['G']) -> L['complex long double precision']: ...
+@overload
+def typename(char: L['S']) -> L['string']: ...
+@overload
+def typename(char: L['U']) -> L['unicode']: ...
+@overload
+def typename(char: L['V']) -> L['void']: ...
+@overload
+def typename(char: L['O']) -> L['object']: ...
+
+@overload
+def common_type(  # type: ignore[misc]
+    *arrays: _SupportsDType[dtype[
+        integer[Any]
+    ]]
+) -> Type[floating[_64Bit]]: ...
+@overload
+def common_type(  # type: ignore[misc]
+    *arrays: _SupportsDType[dtype[
+        floating[_NBit1]
+    ]]
+) -> Type[floating[_NBit1]]: ...
+@overload
+def common_type(  # type: ignore[misc]
+    *arrays: _SupportsDType[dtype[
+        integer[Any] | floating[_NBit1]
+    ]]
+) -> Type[floating[_NBit1 | _64Bit]]: ...
+@overload
+def common_type(  # type: ignore[misc]
+    *arrays: _SupportsDType[dtype[
+        floating[_NBit1] | complexfloating[_NBit2, _NBit2]
+    ]]
+) -> Type[complexfloating[_NBit1 | _NBit2, _NBit1 | _NBit2]]: ...
+@overload
+def common_type(
+    *arrays: _SupportsDType[dtype[
+        integer[Any] | floating[_NBit1] | complexfloating[_NBit2, _NBit2]
+    ]]
+) -> Type[complexfloating[_64Bit | _NBit1 | _NBit2, _64Bit | _NBit1 | _NBit2]]: ...
index 12a7cacdce87bc73ba666475c6b36986c3369907..1df2ab09b29d25a7f39ddb0ff2ac97032fb897fd 100644 (file)
@@ -351,8 +351,7 @@ def who(vardict=None):
     maxshape = 0
     maxbyte = 0
     totalbytes = 0
-    for k in range(len(sta)):
-        val = sta[k]
+    for val in sta:
         if maxname < len(val[0]):
             maxname = len(val[0])
         if maxshape < len(val[1]):
@@ -369,8 +368,7 @@ def who(vardict=None):
         prval = "Name %s Shape %s Bytes %s Type" % (sp1*' ', sp2*' ', sp3*' ')
         print(prval + "\n" + "="*(len(prval)+5) + "\n")
 
-    for k in range(len(sta)):
-        val = sta[k]
+    for val in sta:
         print("%s %s %s %s %s %s %s" % (val[0], ' '*(sp1-len(val[0])+4),
                                         val[1], ' '*(sp2-len(val[1])+5),
                                         val[2], ' '*(sp3-len(val[2])+5),
@@ -904,7 +902,7 @@ def _lookfor_generate_cache(module, import_modules, regenerate):
                                 sys.stdout = old_stdout
                                 sys.stderr = old_stderr
                         # Catch SystemExit, too
-                        except BaseException:
+                        except (Exception, SystemExit):
                             continue
 
             for n, v in _getmembers(item):
@@ -1004,7 +1002,7 @@ def safe_eval(source):
     return ast.literal_eval(source)
 
 
-def _median_nancheck(data, result, axis, out):
+def _median_nancheck(data, result, axis):
     """
     Utility function to check median result from data for NaN values at the end
     and return NaN in that case. Input result can also be a MaskedArray.
@@ -1012,18 +1010,18 @@ def _median_nancheck(data, result, axis, out):
     Parameters
     ----------
     data : array
-        Input data to median function
+        Sorted input data to median function
     result : Array or MaskedArray
-        Result of median function
+        Result of median function.
     axis : int
         Axis along which the median was computed.
-    out : ndarray, optional
-        Output array in which to place the result.
 
     Returns
     -------
-    median : scalar or ndarray
-        Median or NaN in axes which contained NaN in the input.
+    result : scalar or ndarray
+        Median or NaN in axes which contained NaN in the input.  If the input
+        was an array, NaN will be inserted in-place.  If a scalar, either the
+        input itself or a scalar NaN.
     """
     if data.size == 0:
         return result
@@ -1031,14 +1029,12 @@ def _median_nancheck(data, result, axis, out):
     # masked NaN values are ok
     if np.ma.isMaskedArray(n):
         n = n.filled(False)
-    if result.ndim == 0:
-        if n == True:
-            if out is not None:
-                out[...] = data.dtype.type(np.nan)
-                result = out
-            else:
-                result = data.dtype.type(np.nan)
-    elif np.count_nonzero(n.ravel()) > 0:
+    if np.count_nonzero(n.ravel()) > 0:
+        # Without given output, it is possible that the current result is a
+        # numpy scalar, which is not writeable.  If so, just return nan.
+        if isinstance(result, np.generic):
+            return data.dtype.type(np.nan)
+
         result[n] = np.nan
     return result
 
index 0518655c6ce587ff1d7a14a336b6c83747664ea9..f0a8797ad61eba37485edef9011da7f303f485ca 100644 (file)
@@ -1,4 +1,3 @@
-import sys
 from ast import AST
 from typing import (
     Any,
@@ -11,6 +10,7 @@ from typing import (
     Tuple,
     TypeVar,
     Union,
+    Protocol,
 )
 
 from numpy import ndarray, generic
@@ -21,17 +21,12 @@ from numpy.core.numerictypes import (
     issubsctype as issubsctype,
 )
 
-if sys.version_info >= (3, 8):
-    from typing import Protocol
-else:
-    from typing_extensions import Protocol
-
 _T_contra = TypeVar("_T_contra", contravariant=True)
 _FuncType = TypeVar("_FuncType", bound=Callable[..., Any])
 
 # A file-like object opened in `w` mode
 class _SupportsWrite(Protocol[_T_contra]):
-    def write(self, __s: _T_contra) -> Any: ...
+    def write(self, s: _T_contra, /) -> Any: ...
 
 __all__: List[str]
 
@@ -60,7 +55,8 @@ def deprecate(
 ) -> _Deprecate: ...
 @overload
 def deprecate(
-    __func: _FuncType,
+    func: _FuncType,
+    /,
     old_name: Optional[str] = ...,
     new_name: Optional[str] = ...,
     message: Optional[str] = ...,
index 5080019f4de49551549c8452f1f82e9c9385062f..d457f153a02efe36f46348376bcc76be1e9c4fad 100644 (file)
@@ -1,26 +1,32 @@
 from typing import Any, List
 
+from numpy.linalg.linalg import (
+    matrix_power as matrix_power,
+    solve as solve,
+    tensorsolve as tensorsolve,
+    tensorinv as tensorinv,
+    inv as inv,
+    cholesky as cholesky,
+    eigvals as eigvals,
+    eigvalsh as eigvalsh,
+    pinv as pinv,
+    slogdet as slogdet,
+    det as det,
+    svd as svd,
+    eig as eig,
+    eigh as eigh,
+    lstsq as lstsq,
+    norm as norm,
+    qr as qr,
+    cond as cond,
+    matrix_rank as matrix_rank,
+    multi_dot as multi_dot,
+)
+
+from numpy._pytesttester import PytestTester
+
 __all__: List[str]
+__path__: List[str]
+test: PytestTester
 
 class LinAlgError(Exception): ...
-
-def tensorsolve(a, b, axes=...): ...
-def solve(a, b): ...
-def tensorinv(a, ind=...): ...
-def inv(a): ...
-def matrix_power(a, n): ...
-def cholesky(a): ...
-def qr(a, mode=...): ...
-def eigvals(a): ...
-def eigvalsh(a, UPLO=...): ...
-def eig(a): ...
-def eigh(a, UPLO=...): ...
-def svd(a, full_matrices=..., compute_uv=..., hermitian=...): ...
-def cond(x, p=...): ...
-def matrix_rank(M, tol=..., hermitian=...): ...
-def pinv(a, rcond=..., hermitian=...): ...
-def slogdet(a): ...
-def det(a): ...
-def lstsq(a, b, rcond=...): ...
-def norm(x, ord=..., axis=..., keepdims=...): ...
-def multi_dot(arrays, *, out=...): ...
index ed738ab86d75c8c6eceea0cf735c781e57d6921d..8baa1d8ff600f560f060a55c4c2cb04ab6169155 100644 (file)
@@ -12,15 +12,18 @@ automatically from a directory of LAPACK source files.
 You'll need `plex 2.0.0dev`_, available from PyPI, installed to do the
 appropriate scrubbing. As of writing, **this is only available for python 2.7**,
 and is unlikely to ever be ported to python 3.
+As a result, all the Python scripts in this directory must remain compatible
+with Python 2.7, even though NumPy itself no longer supports this version,
+until these scripts are rewritten to use something other than ``plex``.
 
 .. _plex 2.0.0dev: https://pypi.python.org/pypi/plex/
 
 The routines that ``lapack_litemodule.c`` wraps are listed in
 ``wrapped_routines``, along with a few exceptions that aren't picked up
 properly. Assuming that you have an unpacked LAPACK source tree in
-``~/LAPACK``, you generate the new routines in this directory with::
+``/tmp/lapack-3.x.x``, you generate the new routines in this directory with::
 
-$ python ./make_lite.py wrapped_routines ~/LAPACK
+$ ./make_lite.py wrapped_routines /tmp/lapack-3.x.x
 
 This will grab the right routines, with dependencies, put them into the
 appropriate ``f2c_*.f`` files, run ``f2c`` over them, then do some scrubbing
index 738fad7fe1eefdec6f04ce8b6f6a3c6c68721966..fffd709104817cda50ef4cd72a3dbf1b96f29e90 100644 (file)
@@ -1,12 +1,17 @@
-#!/usr/bin/env python3
+#!/usr/bin/env python2.7
+# WARNING! This a Python 2 script. Read README.rst for rationale.
 import os
 import re
 import sys
-from io import StringIO
 
 from plex import Scanner, Str, Lexicon, Opt, Bol, State, AnyChar, TEXT, IGNORE
 from plex.traditional import re as Re
 
+try:
+    from io import BytesIO as UStringIO  # Python 2
+except ImportError:
+    from io import StringIO as UStringIO  # Python 3
+
 
 class MyScanner(Scanner):
     def __init__(self, info, name='<default>'):
@@ -22,8 +27,8 @@ def sep_seq(sequence, sep):
     return pat
 
 def runScanner(data, scanner_class, lexicon=None):
-    info = StringIO(data)
-    outfo = StringIO()
+    info = UStringIO(data)
+    outfo = UStringIO()
     if lexicon is not None:
         scanner = scanner_class(lexicon, info)
     else:
@@ -190,7 +195,7 @@ def cleanComments(source):
             return SourceLines
 
     state = SourceLines
-    for line in StringIO(source):
+    for line in UStringIO(source):
         state = state(line)
     comments.flushTo(lines)
     return lines.getValue()
@@ -218,20 +223,23 @@ def removeHeader(source):
         return OutOfHeader
 
     state = LookingForHeader
-    for line in StringIO(source):
+    for line in UStringIO(source):
         state = state(line)
     return lines.getValue()
 
 def removeSubroutinePrototypes(source):
-    expression = re.compile(
-        r'/\* Subroutine \*/^\s*(?:(?:inline|static)\s+){0,2}(?!else|typedef|return)\w+\s+\*?\s*(\w+)\s*\([^0]+\)\s*;?'
-    )
-    lines = LineQueue()
-    for line in StringIO(source):
-        if not expression.match(line):
-            lines.add(line)
-
-    return lines.getValue()
+    # This function has never worked as advertised by its name:
+    # - "/* Subroutine */" declarations may span multiple lines and
+    #   cannot be matched by a line by line approach.
+    # - The caret in the initial regex would prevent any match, even
+    #   of single line "/* Subroutine */" declarations.
+    #
+    # While we could "fix" this function to do what the name implies
+    # it should do, we have no hint of what it should really do.
+    #
+    # Therefore we keep the existing (non-)functionaity, documenting
+    # this function as doing nothing at all.
+    return source
 
 def removeBuiltinFunctions(source):
     lines = LineQueue()
@@ -249,7 +257,7 @@ def removeBuiltinFunctions(source):
             return InBuiltInFunctions
 
     state = LookingForBuiltinFunctions
-    for line in StringIO(source):
+    for line in UStringIO(source):
         state = state(line)
     return lines.getValue()
 
@@ -299,6 +307,5 @@ if __name__ == '__main__':
 
     source = scrub_source(source, nsteps, verbose=True)
 
-    writefo = open(outfilename, 'w')
-    writefo.write(source)
-    writefo.close()
+    with open(outfilename, 'w') as writefo:
+        writefo.write(source)
index 3aaefb92f14c5446bc05ebff2d7c99f7f7e0bfd2..2a5c9c05ee23a9961dd7ae6799e48d8e0747395c 100644 (file)
@@ -1,3 +1,4 @@
+# WARNING! This a Python 2 script. Read README.rst for rationale.
 import re
 import itertools
 
@@ -44,6 +45,8 @@ class LineIterator:
         line = line.rstrip()
         return line
 
+    next = __next__
+
 
 class PushbackIterator:
     """PushbackIterator(iterable)
@@ -69,6 +72,8 @@ class PushbackIterator:
     def pushback(self, item):
         self.buffer.append(item)
 
+    next = __next__
+
 
 def fortranSourceLines(fo):
     """Return an iterator over statement lines of a Fortran source file.
@@ -110,7 +115,7 @@ def getDependencies(filename):
         for lineno, line in fortranSourceLines(fo):
             m = external_pat.match(line)
             if m:
-                names = line = line[m.end():].strip().split(',')
+                names = line[m.end():].strip().split(',')
                 names = [n.strip().lower() for n in names]
                 names = [n for n in names if n]
                 routines.extend(names)
index b145f6c4f8b53f2533f30bdee25202e48cb1c245..ca8d4c62cc578d0b273f8aa06b141c351311ff32 100755 (executable)
@@ -1,4 +1,5 @@
-#!/usr/bin/env python3
+#!/usr/bin/env python2.7
+# WARNING! This a Python 2 script. Read README.rst for rationale.
 """
 Usage: make_lite.py <wrapped_routines_file> <lapack_dir>
 
@@ -20,7 +21,10 @@ import shutil
 import fortran
 import clapack_scrub
 
-from shutil import which
+try:
+    from distutils.spawn import find_executable as which  # Python 2
+except ImportError:
+    from shutil import which  # Python 3
 
 # Arguments to pass to f2c. You'll always want -A for ANSI C prototypes
 # Others of interest: -a to not make variables static by default
@@ -81,7 +85,8 @@ class FortranRoutine:
         return self._dependencies
 
     def __repr__(self):
-        return f'FortranRoutine({self.name!r}, filename={self.filename!r})'
+        return "FortranRoutine({!r}, filename={!r})".format(self.name,
+                                                            self.filename)
 
 class UnknownFortranRoutine(FortranRoutine):
     """Wrapper for a Fortran routine for which the corresponding file
@@ -193,7 +198,7 @@ class LapackLibrary(FortranLibrary):
 def printRoutineNames(desc, routines):
     print(desc)
     for r in routines:
-        print(f'\t{r.name}')
+        print('\t%s' % r.name)
 
 def getLapackRoutines(wrapped_routines, ignores, lapack_dir):
     blas_src_dir = os.path.join(lapack_dir, 'BLAS', 'SRC')
@@ -243,7 +248,7 @@ def dumpRoutineNames(library, output_dir):
         with open(filename, 'w') as fo:
             for r in routines:
                 deps = r.dependencies()
-                fo.write(f"{r.name}: {' '.join(deps)}\n")
+                fo.write('%s: %s\n' % (r.name, ' '.join(deps)))
 
 def concatenateRoutines(routines, output_file):
     with open(output_file, 'w') as output_fo:
@@ -261,8 +266,8 @@ def runF2C(fortran_filename, output_dir):
         subprocess.check_call(
             ["f2c"] + F2C_ARGS + ['-d', output_dir, fortran_filename]
         )
-    except subprocess.CalledProcessError as e:
-        raise F2CError from e
+    except subprocess.CalledProcessError:
+        raise F2CError
 
 def scrubF2CSource(c_file):
     with open(c_file) as fo:
@@ -275,7 +280,7 @@ def scrubF2CSource(c_file):
 def ensure_executable(name):
     try:
         which(name)
-    except:
+    except Exception:
         raise SystemExit(name + ' not found')
 
 def create_name_header(output_dir):
@@ -316,13 +321,13 @@ def create_name_header(output_dir):
 
         # Rename BLAS/LAPACK symbols
         for name in sorted(symbols):
-            f.write(f'#define {name}_ BLAS_FUNC({name})\n')
+            f.write("#define %s_ BLAS_FUNC(%s)\n" % (name, name))
 
         # Rename also symbols that f2c exports itself
         f.write("\n"
                 "/* Symbols exported by f2c.c */\n")
         for name in sorted(f2c_symbols):
-            f.write(f'#define {name} numpy_lapack_lite_{name}\n')
+            f.write("#define %s numpy_lapack_lite_%s\n" % (name, name))
 
 def main():
     if len(sys.argv) != 3:
@@ -336,10 +341,7 @@ def main():
     lapack_src_dir = sys.argv[2]
     output_dir = os.path.join(os.path.dirname(__file__), 'build')
 
-    try:
-        shutil.rmtree(output_dir)
-    except:
-        pass
+    shutil.rmtree(output_dir, ignore_errors=True)
     os.makedirs(output_dir)
 
     wrapped_routines, ignores = getWrappedRoutineNames(wrapped_routines_file)
@@ -348,9 +350,9 @@ def main():
     dumpRoutineNames(library, output_dir)
 
     for typename in types:
-        fortran_file = os.path.join(output_dir, f'f2c_{typename}.f')
+        fortran_file = os.path.join(output_dir, 'f2c_%s.f' % typename)
         c_file = fortran_file[:-2] + '.c'
-        print(f'creating {c_file} ...')
+        print('creating %s ...' % c_file)
         routines = library.allRoutinesByType(typename)
         concatenateRoutines(routines, fortran_file)
 
@@ -358,11 +360,11 @@ def main():
         patch_file = os.path.basename(fortran_file) + '.patch'
         if os.path.exists(patch_file):
             subprocess.check_call(['patch', '-u', fortran_file, patch_file])
-            print(f'Patched {fortran_file}')
+            print("Patched {}".format(fortran_file))
         try:
             runF2C(fortran_file, output_dir)
         except F2CError:
-            print(f'f2c failed on {fortran_file}')
+            print('f2c failed on %s' % fortran_file)
             break
         scrubF2CSource(c_file)
 
index fe2f718b2e58765030b444dc4c7346370f54d789..37a41408be222e47668df60b7b22a0ee5c044fab 100644 (file)
@@ -1,4 +1,6 @@
-#include "Python.h"
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
 #include "numpy/npy_common.h"
 #include "npy_cblas.h"
 
index 362a593a61b9c3496b4a400dfc7d9658ece1bd39..2fed0f2b04787b74510400ff54e132c060b3359f 100644 (file)
@@ -4,11 +4,12 @@ More modifications by Jeff Whitaker
 */
 #define NPY_NO_DEPRECATED_API NPY_API_VERSION
 
-#include "Python.h"
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
 #include "numpy/arrayobject.h"
 #include "npy_cblas.h"
 
-
 #define FNAME(name) BLAS_FUNC(name)
 
 typedef CBLAS_INT        fortran_int;
index 46fb2502e5ccbd9e7b441fbd764c120c5eeac52f..0c27e063175a7edf151cca37d6c7611e532277b0 100644 (file)
@@ -30,7 +30,7 @@ from numpy.core.multiarray import normalize_axis_index
 from numpy.core.overrides import set_module
 from numpy.core import overrides
 from numpy.lib.twodim_base import triu, eye
-from numpy.linalg import lapack_lite, _umath_linalg
+from numpy.linalg import _umath_linalg
 
 
 array_function_dispatch = functools.partial(
@@ -99,6 +99,10 @@ def _raise_linalgerror_svd_nonconvergence(err, flag):
 def _raise_linalgerror_lstsq(err, flag):
     raise LinAlgError("SVD did not converge in Linear Least Squares")
 
+def _raise_linalgerror_qr(err, flag):
+    raise LinAlgError("Incorrect argument found while performing "
+                      "QR factorization")
+
 def get_linalg_error_extobj(callback):
     extobj = list(_linalg_error_extobj)  # make a copy
     extobj[2] = callback
@@ -128,10 +132,6 @@ def _realType(t, default=double):
 def _complexType(t, default=cdouble):
     return _complex_types_map.get(t, default)
 
-def _linalgRealType(t):
-    """Cast the type t to either double or cdouble."""
-    return double
-
 def _commonType(*arrays):
     # in lite version, use higher precision (always double or cdouble)
     result_type = single
@@ -780,15 +780,16 @@ def qr(a, mode='reduced'):
 
     Parameters
     ----------
-    a : array_like, shape (M, N)
-        Matrix to be factored.
+    a : array_like, shape (..., M, N)
+        An array-like object with the dimensionality of at least 2.
     mode : {'reduced', 'complete', 'r', 'raw'}, optional
         If K = min(M, N), then
 
-        * 'reduced'  : returns q, r with dimensions (M, K), (K, N) (default)
-        * 'complete' : returns q, r with dimensions (M, M), (M, N)
-        * 'r'        : returns r only with dimensions (K, N)
-        * 'raw'      : returns h, tau with dimensions (N, M), (K,)
+        * 'reduced'  : returns q, r with dimensions
+                       (..., M, K), (..., K, N) (default)
+        * 'complete' : returns q, r with dimensions (..., M, M), (..., M, N)
+        * 'r'        : returns r only with dimensions (..., K, N)
+        * 'raw'      : returns h, tau with dimensions (..., N, M), (..., K,)
 
         The options 'reduced', 'complete, and 'raw' are new in numpy 1.8,
         see the notes for more information. The default is 'reduced', and to
@@ -807,9 +808,13 @@ def qr(a, mode='reduced'):
         A matrix with orthonormal columns. When mode = 'complete' the
         result is an orthogonal/unitary matrix depending on whether or not
         a is real/complex. The determinant may be either +/- 1 in that
-        case.
+        case. In case the number of dimensions in the input array is
+        greater than 2 then a stack of the matrices with above properties
+        is returned.
     r : ndarray of float or complex, optional
-        The upper-triangular matrix.
+        The upper-triangular matrix or a stack of upper-triangular
+        matrices if the number of dimensions in the input array is greater
+        than 2.
     (h, tau) : ndarrays of np.double or np.cdouble, optional
         The array h contains the Householder reflectors that generate q
         along with r. The tau array contains scaling factors for the
@@ -857,6 +862,14 @@ def qr(a, mode='reduced'):
     >>> r2 = np.linalg.qr(a, mode='r')
     >>> np.allclose(r, r2)  # mode='r' returns the same r as mode='full'
     True
+    >>> a = np.random.normal(size=(3, 2, 2)) # Stack of 2 x 2 matrices as input
+    >>> q, r = np.linalg.qr(a)
+    >>> q.shape
+    (3, 2, 2)
+    >>> r.shape
+    (3, 2, 2)
+    >>> np.allclose(a, np.matmul(q, r))
+    True
 
     Example illustrating a common use of `qr`: solving of least squares
     problems
@@ -904,83 +917,58 @@ def qr(a, mode='reduced'):
             raise ValueError(f"Unrecognized mode '{mode}'")
 
     a, wrap = _makearray(a)
-    _assert_2d(a)
-    m, n = a.shape
+    _assert_stacked_2d(a)
+    m, n = a.shape[-2:]
     t, result_t = _commonType(a)
-    a = _fastCopyAndTranspose(t, a)
+    a = a.astype(t, copy=True)
     a = _to_native_byte_order(a)
     mn = min(m, n)
-    tau = zeros((mn,), t)
 
-    if isComplexType(t):
-        lapack_routine = lapack_lite.zgeqrf
-        routine_name = 'zgeqrf'
+    if m <= n:
+        gufunc = _umath_linalg.qr_r_raw_m
     else:
-        lapack_routine = lapack_lite.dgeqrf
-        routine_name = 'dgeqrf'
-
-    # calculate optimal size of work data 'work'
-    lwork = 1
-    work = zeros((lwork,), t)
-    results = lapack_routine(m, n, a, max(1, m), tau, work, -1, 0)
-    if results['info'] != 0:
-        raise LinAlgError('%s returns %d' % (routine_name, results['info']))
-
-    # do qr decomposition
-    lwork = max(1, n, int(abs(work[0])))
-    work = zeros((lwork,), t)
-    results = lapack_routine(m, n, a, max(1, m), tau, work, lwork, 0)
-    if results['info'] != 0:
-        raise LinAlgError('%s returns %d' % (routine_name, results['info']))
+        gufunc = _umath_linalg.qr_r_raw_n
+
+    signature = 'D->D' if isComplexType(t) else 'd->d'
+    extobj = get_linalg_error_extobj(_raise_linalgerror_qr)
+    tau = gufunc(a, signature=signature, extobj=extobj)
 
     # handle modes that don't return q
     if mode == 'r':
-        r = _fastCopyAndTranspose(result_t, a[:, :mn])
-        return wrap(triu(r))
+        r = triu(a[..., :mn, :])
+        r = r.astype(result_t, copy=False)
+        return wrap(r)
 
     if mode == 'raw':
-        return a, tau
+        q = transpose(a)
+        q = q.astype(result_t, copy=False)
+        tau = tau.astype(result_t, copy=False)
+        return wrap(q), tau
 
     if mode == 'economic':
-        if t != result_t :
-            a = a.astype(result_t, copy=False)
-        return wrap(a.T)
+        a = a.astype(result_t, copy=False)
+        return wrap(a)
 
-    #  generate q from a
+    # mc is the number of columns in the resulting q
+    # matrix. If the mode is complete then it is 
+    # same as number of rows, and if the mode is reduced,
+    # then it is the minimum of number of rows and columns.
     if mode == 'complete' and m > n:
         mc = m
-        q = empty((m, m), t)
+        gufunc = _umath_linalg.qr_complete
     else:
         mc = mn
-        q = empty((n, m), t)
-    q[:n] = a
-
-    if isComplexType(t):
-        lapack_routine = lapack_lite.zungqr
-        routine_name = 'zungqr'
-    else:
-        lapack_routine = lapack_lite.dorgqr
-        routine_name = 'dorgqr'
+        gufunc = _umath_linalg.qr_reduced
 
-    # determine optimal lwork
-    lwork = 1
-    work = zeros((lwork,), t)
-    results = lapack_routine(m, mc, mn, q, max(1, m), tau, work, -1, 0)
-    if results['info'] != 0:
-        raise LinAlgError('%s returns %d' % (routine_name, results['info']))
-
-    # compute q
-    lwork = max(1, n, int(abs(work[0])))
-    work = zeros((lwork,), t)
-    results = lapack_routine(m, mc, mn, q, max(1, m), tau, work, lwork, 0)
-    if results['info'] != 0:
-        raise LinAlgError('%s returns %d' % (routine_name, results['info']))
-
-    q = _fastCopyAndTranspose(result_t, q[:mc])
-    r = _fastCopyAndTranspose(result_t, a[:, :mc])
+    signature = 'DD->D' if isComplexType(t) else 'dd->d'
+    extobj = get_linalg_error_extobj(_raise_linalgerror_qr)
+    q = gufunc(a, tau, signature=signature, extobj=extobj)
+    r = triu(a[..., :mc, :])
 
-    return wrap(q), wrap(triu(r))
+    q = q.astype(result_t, copy=False)
+    r = r.astype(result_t, copy=False)
 
+    return wrap(q), wrap(r)
 
 # Eigenvalues
 
@@ -1692,7 +1680,7 @@ def cond(x, p=None):
     x : (..., M, N) array_like
         The matrix whose condition number is sought.
     p : {None, 1, -1, 2, -2, inf, -inf, 'fro'}, optional
-        Order of the norm:
+        Order of the norm used in the condition number computation:
 
         =====  ============================
         p      norm for matrices
@@ -1707,7 +1695,7 @@ def cond(x, p=None):
         -2     smallest singular value
         =====  ============================
 
-        inf means the numpy.inf object, and the Frobenius norm is
+        inf means the `numpy.inf` object, and the Frobenius norm is
         the root-of-sum-of-squares norm.
 
     Returns
@@ -1797,12 +1785,12 @@ def cond(x, p=None):
     return r
 
 
-def _matrix_rank_dispatcher(M, tol=None, hermitian=None):
-    return (M,)
+def _matrix_rank_dispatcher(A, tol=None, hermitian=None):
+    return (A,)
 
 
 @array_function_dispatch(_matrix_rank_dispatcher)
-def matrix_rank(M, tol=None, hermitian=False):
+def matrix_rank(A, tol=None, hermitian=False):
     """
     Return matrix rank of array using SVD method
 
@@ -1814,18 +1802,18 @@ def matrix_rank(M, tol=None, hermitian=False):
 
     Parameters
     ----------
-    M : {(M,), (..., M, N)} array_like
+    A : {(M,), (..., M, N)} array_like
         Input vector or stack of matrices.
     tol : (...) array_like, float, optional
         Threshold below which SVD values are considered zero. If `tol` is
         None, and ``S`` is an array with singular values for `M`, and
         ``eps`` is the epsilon value for datatype of ``S``, then `tol` is
-        set to ``S.max() * max(M.shape) * eps``.
+        set to ``S.max() * max(M, N) * eps``.
 
         .. versionchanged:: 1.14
            Broadcasted against the stack of matrices
     hermitian : bool, optional
-        If True, `M` is assumed to be Hermitian (symmetric if real-valued),
+        If True, `A` is assumed to be Hermitian (symmetric if real-valued),
         enabling a more efficient method for finding singular values.
         Defaults to False.
 
@@ -1834,39 +1822,39 @@ def matrix_rank(M, tol=None, hermitian=False):
     Returns
     -------
     rank : (...) array_like
-        Rank of M.
+        Rank of A.
 
     Notes
     -----
     The default threshold to detect rank deficiency is a test on the magnitude
-    of the singular values of `M`.  By default, we identify singular values less
-    than ``S.max() * max(M.shape) * eps`` as indicating rank deficiency (with
+    of the singular values of `A`.  By default, we identify singular values less
+    than ``S.max() * max(M, N) * eps`` as indicating rank deficiency (with
     the symbols defined above). This is the algorithm MATLAB uses [1].  It also
     appears in *Numerical recipes* in the discussion of SVD solutions for linear
     least squares [2].
 
     This default threshold is designed to detect rank deficiency accounting for
     the numerical errors of the SVD computation.  Imagine that there is a column
-    in `M` that is an exact (in floating point) linear combination of other
-    columns in `M`. Computing the SVD on `M` will not produce a singular value
+    in `A` that is an exact (in floating point) linear combination of other
+    columns in `A`. Computing the SVD on `A` will not produce a singular value
     exactly equal to 0 in general: any difference of the smallest SVD value from
     0 will be caused by numerical imprecision in the calculation of the SVD.
     Our threshold for small SVD values takes this numerical imprecision into
     account, and the default threshold will detect such numerical rank
-    deficiency.  The threshold may declare a matrix `M` rank deficient even if
-    the linear combination of some columns of `M` is not exactly equal to
-    another column of `M` but only numerically very close to another column of
-    `M`.
+    deficiency.  The threshold may declare a matrix `A` rank deficient even if
+    the linear combination of some columns of `A` is not exactly equal to
+    another column of `A` but only numerically very close to another column of
+    `A`.
 
     We chose our default threshold because it is in wide use.  Other thresholds
     are possible.  For example, elsewhere in the 2007 edition of *Numerical
     recipes* there is an alternative threshold of ``S.max() *
-    np.finfo(M.dtype).eps / 2. * np.sqrt(m + n + 1.)``. The authors describe
+    np.finfo(A.dtype).eps / 2. * np.sqrt(m + n + 1.)``. The authors describe
     this threshold as being based on "expected roundoff error" (p 71).
 
     The thresholds above deal with floating point roundoff error in the
     calculation of the SVD.  However, you may have more information about the
-    sources of error in `M` that would make you consider other tolerance values
+    sources of error in `A` that would make you consider other tolerance values
     to detect *effective* rank deficiency.  The most useful measure of the
     tolerance depends on the operations you intend to use on your matrix.  For
     example, if your data come from uncertain measurements with uncertainties
@@ -1876,7 +1864,7 @@ def matrix_rank(M, tol=None, hermitian=False):
 
     References
     ----------
-    .. [1] MATLAB reference documention, "Rank"
+    .. [1] MATLAB reference documentation, "Rank"
            https://www.mathworks.com/help/techdoc/ref/rank.html
     .. [2] W. H. Press, S. A. Teukolsky, W. T. Vetterling and B. P. Flannery,
            "Numerical Recipes (3rd edition)", Cambridge University Press, 2007,
@@ -1895,12 +1883,12 @@ def matrix_rank(M, tol=None, hermitian=False):
     >>> matrix_rank(np.zeros((4,)))
     0
     """
-    M = asarray(M)
-    if M.ndim < 2:
-        return int(not all(M==0))
-    S = svd(M, compute_uv=False, hermitian=hermitian)
+    A = asarray(A)
+    if A.ndim < 2:
+        return int(not all(A==0))
+    S = svd(A, compute_uv=False, hermitian=hermitian)
     if tol is None:
-        tol = S.max(axis=-1, keepdims=True) * max(M.shape[-2:]) * finfo(S.dtype).eps
+        tol = S.max(axis=-1, keepdims=True) * max(A.shape[-2:]) * finfo(S.dtype).eps
     else:
         tol = asarray(tol)[..., newaxis]
     return count_nonzero(S > tol, axis=-1)
@@ -2171,13 +2159,13 @@ def lstsq(a, b, rcond="warn"):
     r"""
     Return the least-squares solution to a linear matrix equation.
 
-    Computes the vector `x` that approximatively solves the equation
+    Computes the vector `x` that approximately solves the equation
     ``a @ x = b``. The equation may be under-, well-, or over-determined
     (i.e., the number of linearly independent rows of `a` can be less than,
     equal to, or greater than its number of linearly independent columns).
     If `a` is square and of full rank, then `x` (but for round-off error)
     is the "exact" solution of the equation. Else, `x` minimizes the
-    Euclidean 2-norm :math:`||b - ax||`. If there are multiple minimizing 
+    Euclidean 2-norm :math:`||b - ax||`. If there are multiple minimizing
     solutions, the one with the smallest 2-norm :math:`||x||` is returned.
 
     Parameters
@@ -2275,8 +2263,6 @@ def lstsq(a, b, rcond="warn"):
         raise LinAlgError('Incompatible dimensions')
 
     t, result_t = _commonType(a, b)
-    # FIXME: real_t is unused
-    real_t = _linalgRealType(t)
     result_real_t = _realType(result_t)
 
     # Determine default rcond value
diff --git a/numpy/linalg/linalg.pyi b/numpy/linalg/linalg.pyi
new file mode 100644 (file)
index 0000000..a60b953
--- /dev/null
@@ -0,0 +1,284 @@
+from typing import (
+    Literal as L,
+    List,
+    Iterable,
+    overload,
+    TypeVar,
+    Any,
+    SupportsIndex,
+    SupportsInt,
+    Tuple,
+)
+
+from numpy import (
+    generic,
+    floating,
+    complexfloating,
+    int32,
+    float64,
+    complex128,
+)
+
+from numpy.linalg import LinAlgError as LinAlgError
+
+from numpy.typing import (
+    NDArray,
+    ArrayLike,
+    _ArrayLikeInt_co,
+    _ArrayLikeFloat_co,
+    _ArrayLikeComplex_co,
+    _ArrayLikeTD64_co,
+    _ArrayLikeObject_co,
+)
+
+_T = TypeVar("_T")
+_ArrayType = TypeVar("_ArrayType", bound=NDArray[Any])
+
+_2Tuple = Tuple[_T, _T]
+_ModeKind = L["reduced", "complete", "r", "raw"]
+
+__all__: List[str]
+
+@overload
+def tensorsolve(
+    a: _ArrayLikeInt_co,
+    b: _ArrayLikeInt_co,
+    axes: None | Iterable[int] =...,
+) -> NDArray[float64]: ...
+@overload
+def tensorsolve(
+    a: _ArrayLikeFloat_co,
+    b: _ArrayLikeFloat_co,
+    axes: None | Iterable[int] =...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def tensorsolve(
+    a: _ArrayLikeComplex_co,
+    b: _ArrayLikeComplex_co,
+    axes: None | Iterable[int] =...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+
+@overload
+def solve(
+    a: _ArrayLikeInt_co,
+    b: _ArrayLikeInt_co,
+) -> NDArray[float64]: ...
+@overload
+def solve(
+    a: _ArrayLikeFloat_co,
+    b: _ArrayLikeFloat_co,
+) -> NDArray[floating[Any]]: ...
+@overload
+def solve(
+    a: _ArrayLikeComplex_co,
+    b: _ArrayLikeComplex_co,
+) -> NDArray[complexfloating[Any, Any]]: ...
+
+@overload
+def tensorinv(
+    a: _ArrayLikeInt_co,
+    ind: int = ...,
+) -> NDArray[float64]: ...
+@overload
+def tensorinv(
+    a: _ArrayLikeFloat_co,
+    ind: int = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def tensorinv(
+    a: _ArrayLikeComplex_co,
+    ind: int = ...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+
+@overload
+def inv(a: _ArrayLikeInt_co) -> NDArray[float64]: ...
+@overload
+def inv(a: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: ...
+@overload
+def inv(a: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: ...
+
+# TODO: The supported input and output dtypes are dependent on the value of `n`.
+# For example: `n < 0` always casts integer types to float64
+def matrix_power(
+    a: _ArrayLikeComplex_co | _ArrayLikeObject_co,
+    n: SupportsIndex,
+) -> NDArray[Any]: ...
+
+@overload
+def cholesky(a: _ArrayLikeInt_co) -> NDArray[float64]: ...
+@overload
+def cholesky(a: _ArrayLikeFloat_co) -> NDArray[floating[Any]]: ...
+@overload
+def cholesky(a: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: ...
+
+@overload
+def qr(a: _ArrayLikeInt_co, mode: _ModeKind = ...) -> _2Tuple[NDArray[float64]]: ...
+@overload
+def qr(a: _ArrayLikeFloat_co, mode: _ModeKind = ...) -> _2Tuple[NDArray[floating[Any]]]: ...
+@overload
+def qr(a: _ArrayLikeComplex_co, mode: _ModeKind = ...) -> _2Tuple[NDArray[complexfloating[Any, Any]]]: ...
+
+@overload
+def eigvals(a: _ArrayLikeInt_co) -> NDArray[float64] | NDArray[complex128]: ...
+@overload
+def eigvals(a: _ArrayLikeFloat_co) -> NDArray[floating[Any]] | NDArray[complexfloating[Any, Any]]: ...
+@overload
+def eigvals(a: _ArrayLikeComplex_co) -> NDArray[complexfloating[Any, Any]]: ...
+
+@overload
+def eigvalsh(a: _ArrayLikeInt_co, UPLO: L["L", "U", "l", "u"] = ...) -> NDArray[float64]: ...
+@overload
+def eigvalsh(a: _ArrayLikeComplex_co, UPLO: L["L", "U", "l", "u"] = ...) -> NDArray[floating[Any]]: ...
+
+@overload
+def eig(a: _ArrayLikeInt_co) -> _2Tuple[NDArray[float64]] | _2Tuple[NDArray[complex128]]: ...
+@overload
+def eig(a: _ArrayLikeFloat_co) -> _2Tuple[NDArray[floating[Any]]] | _2Tuple[NDArray[complexfloating[Any, Any]]]: ...
+@overload
+def eig(a: _ArrayLikeComplex_co) -> _2Tuple[NDArray[complexfloating[Any, Any]]]: ...
+
+@overload
+def eigh(
+    a: _ArrayLikeInt_co,
+    UPLO: L["L", "U", "l", "u"] = ...,
+) -> Tuple[NDArray[float64], NDArray[float64]]: ...
+@overload
+def eigh(
+    a: _ArrayLikeFloat_co,
+    UPLO: L["L", "U", "l", "u"] = ...,
+) -> Tuple[NDArray[floating[Any]], NDArray[floating[Any]]]: ...
+@overload
+def eigh(
+    a: _ArrayLikeComplex_co,
+    UPLO: L["L", "U", "l", "u"] = ...,
+) -> Tuple[NDArray[floating[Any]], NDArray[complexfloating[Any, Any]]]: ...
+
+@overload
+def svd(
+    a: _ArrayLikeInt_co,
+    full_matrices: bool = ...,
+    compute_uv: L[True] = ...,
+    hermitian: bool = ...,
+) -> Tuple[
+    NDArray[float64],
+    NDArray[float64],
+    NDArray[float64],
+]: ...
+@overload
+def svd(
+    a: _ArrayLikeFloat_co,
+    full_matrices: bool = ...,
+    compute_uv: L[True] = ...,
+    hermitian: bool = ...,
+) -> Tuple[
+    NDArray[floating[Any]],
+    NDArray[floating[Any]],
+    NDArray[floating[Any]],
+]: ...
+@overload
+def svd(
+    a: _ArrayLikeComplex_co,
+    full_matrices: bool = ...,
+    compute_uv: L[True] = ...,
+    hermitian: bool = ...,
+) -> Tuple[
+    NDArray[complexfloating[Any, Any]],
+    NDArray[floating[Any]],
+    NDArray[complexfloating[Any, Any]],
+]: ...
+@overload
+def svd(
+    a: _ArrayLikeInt_co,
+    full_matrices: bool = ...,
+    compute_uv: L[False] = ...,
+    hermitian: bool = ...,
+) -> NDArray[float64]: ...
+@overload
+def svd(
+    a: _ArrayLikeComplex_co,
+    full_matrices: bool = ...,
+    compute_uv: L[False] = ...,
+    hermitian: bool = ...,
+) -> NDArray[floating[Any]]: ...
+
+# TODO: Returns a scalar for 2D arrays and
+# a `(x.ndim - 2)`` dimensionl array otherwise
+def cond(x: _ArrayLikeComplex_co, p: None | float | L["fro", "nuc"] = ...) -> Any: ...
+
+# TODO: Returns `int` for <2D arrays and `intp` otherwise
+def matrix_rank(
+    A: _ArrayLikeComplex_co,
+    tol: None | _ArrayLikeFloat_co = ...,
+    hermitian: bool = ...,
+) -> Any: ...
+
+@overload
+def pinv(
+    a: _ArrayLikeInt_co,
+    rcond: _ArrayLikeFloat_co = ...,
+    hermitian: bool = ...,
+) -> NDArray[float64]: ...
+@overload
+def pinv(
+    a: _ArrayLikeFloat_co,
+    rcond: _ArrayLikeFloat_co = ...,
+    hermitian: bool = ...,
+) -> NDArray[floating[Any]]: ...
+@overload
+def pinv(
+    a: _ArrayLikeComplex_co,
+    rcond: _ArrayLikeFloat_co = ...,
+    hermitian: bool = ...,
+) -> NDArray[complexfloating[Any, Any]]: ...
+
+# TODO: Returns a 2-tuple of scalars for 2D arrays and
+# a 2-tuple of `(a.ndim - 2)`` dimensionl arrays otherwise
+def slogdet(a: _ArrayLikeComplex_co) -> _2Tuple[Any]: ...
+
+# TODO: Returns a 2-tuple of scalars for 2D arrays and
+# a 2-tuple of `(a.ndim - 2)`` dimensionl arrays otherwise
+def det(a: _ArrayLikeComplex_co) -> Any: ...
+
+@overload
+def lstsq(a: _ArrayLikeInt_co, b: _ArrayLikeInt_co, rcond: None | float = ...) -> Tuple[
+    NDArray[float64],
+    NDArray[float64],
+    int32,
+    NDArray[float64],
+]: ...
+@overload
+def lstsq(a: _ArrayLikeFloat_co, b: _ArrayLikeFloat_co, rcond: None | float = ...) -> Tuple[
+    NDArray[floating[Any]],
+    NDArray[floating[Any]],
+    int32,
+    NDArray[floating[Any]],
+]: ...
+@overload
+def lstsq(a: _ArrayLikeComplex_co, b: _ArrayLikeComplex_co, rcond: None | float = ...) -> Tuple[
+    NDArray[complexfloating[Any, Any]],
+    NDArray[floating[Any]],
+    int32,
+    NDArray[floating[Any]],
+]: ...
+
+@overload
+def norm(
+    x: ArrayLike,
+    ord: None | float | L["fro", "nuc"] = ...,
+    axis: None = ...,
+    keepdims: bool = ...,
+) -> floating[Any]: ...
+@overload
+def norm(
+    x: ArrayLike,
+    ord: None | float | L["fro", "nuc"] = ...,
+    axis: SupportsInt | SupportsIndex | Tuple[int, ...] = ...,
+    keepdims: bool = ...,
+) -> Any: ...
+
+# TODO: Returns a scalar or array
+def multi_dot(
+    arrays: Iterable[_ArrayLikeComplex_co | _ArrayLikeObject_co | _ArrayLikeTD64_co],
+    *,
+    out: None | NDArray[Any] = ...,
+) -> Any: ...
index e2944f38c33d1c98a65a0f4dd72127a028e70fd6..94536bb2c05572e95706fd1e20099e4f2ccfb08a 100644 (file)
@@ -3,8 +3,7 @@ import sys
 
 def configuration(parent_package='', top_path=None):
     from numpy.distutils.misc_util import Configuration
-    from numpy.distutils.system_info import (
-            get_info, system_info, lapack_opt_info, blas_opt_info)
+    from numpy.distutils.system_info import get_info, system_info
     config = Configuration('linalg', parent_package, top_path)
 
     config.add_subpackage('tests')
diff --git a/numpy/linalg/tests/test_build.py b/numpy/linalg/tests/test_build.py
deleted file mode 100644 (file)
index 868341f..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-from subprocess import PIPE, Popen
-import sys
-import re
-import pytest
-
-from numpy.linalg import lapack_lite
-from numpy.testing import assert_
-
-
-class FindDependenciesLdd:
-
-    def __init__(self):
-        self.cmd = ['ldd']
-
-        try:
-            p = Popen(self.cmd, stdout=PIPE, stderr=PIPE)
-            stdout, stderr = p.communicate()
-        except OSError as e:
-            raise RuntimeError(f'command {self.cmd} cannot be run') from e
-
-    def get_dependencies(self, lfile):
-        p = Popen(self.cmd + [lfile], stdout=PIPE, stderr=PIPE)
-        stdout, stderr = p.communicate()
-        if not (p.returncode == 0):
-            raise RuntimeError(f'failed dependencies check for {lfile}')
-
-        return stdout
-
-    def grep_dependencies(self, lfile, deps):
-        stdout = self.get_dependencies(lfile)
-
-        rdeps = dict([(dep, re.compile(dep)) for dep in deps])
-        founds = []
-        for l in stdout.splitlines():
-            for k, v in rdeps.items():
-                if v.search(l):
-                    founds.append(k)
-
-        return founds
-
-
-class TestF77Mismatch:
-
-    @pytest.mark.skipif(not(sys.platform[:5] == 'linux'),
-                        reason="no fortran compiler on non-Linux platform")
-    def test_lapack(self):
-        f = FindDependenciesLdd()
-        deps = f.grep_dependencies(lapack_lite.__file__,
-                                   [b'libg2c', b'libgfortran'])
-        assert_(len(deps) <= 1,
-                         """Both g77 and gfortran runtimes linked in lapack_lite ! This is likely to
-cause random crashes and wrong results. See numpy INSTALL.txt for more
-information.""")
index c6e8cdd039f130addc5bde904c798871ca74ff05..c1ba84a8e674edcde50a03d2c7ac8b593c081c25 100644 (file)
@@ -11,6 +11,7 @@ import pytest
 
 import numpy as np
 from numpy import array, single, double, csingle, cdouble, dot, identity, matmul
+from numpy.core import swapaxes
 from numpy import multiply, atleast_2d, inf, asarray
 from numpy import linalg
 from numpy.linalg import matrix_power, norm, matrix_rank, multi_dot, LinAlgError
@@ -20,7 +21,6 @@ from numpy.testing import (
     assert_almost_equal, assert_allclose, suppress_warnings,
     assert_raises_regex, HAS_LAPACK64,
     )
-from numpy.testing._private.utils import requires_memory
 
 
 def consistent_subclass(out, in_):
@@ -1070,7 +1070,6 @@ class TestMatrixPower:
         assert_raises(LinAlgError, matrix_power, mat, -1)
 
 
-
 class TestEigvalshCases(HermitianTestCase, HermitianGeneralizedTestCase):
 
     def do(self, a, b, tags):
@@ -1710,6 +1709,66 @@ class TestQR:
             self.check_qr(m2)
             self.check_qr(m2.T)
 
+    def check_qr_stacked(self, a):
+        # This test expects the argument `a` to be an ndarray or
+        # a subclass of an ndarray of inexact type.
+        a_type = type(a)
+        a_dtype = a.dtype
+        m, n = a.shape[-2:]
+        k = min(m, n)
+
+        # mode == 'complete'
+        q, r = linalg.qr(a, mode='complete')
+        assert_(q.dtype == a_dtype)
+        assert_(r.dtype == a_dtype)
+        assert_(isinstance(q, a_type))
+        assert_(isinstance(r, a_type))
+        assert_(q.shape[-2:] == (m, m))
+        assert_(r.shape[-2:] == (m, n))
+        assert_almost_equal(matmul(q, r), a)
+        I_mat = np.identity(q.shape[-1])
+        stack_I_mat = np.broadcast_to(I_mat, 
+                        q.shape[:-2] + (q.shape[-1],)*2)
+        assert_almost_equal(matmul(swapaxes(q, -1, -2).conj(), q), stack_I_mat)
+        assert_almost_equal(np.triu(r[..., :, :]), r)
+
+        # mode == 'reduced'
+        q1, r1 = linalg.qr(a, mode='reduced')
+        assert_(q1.dtype == a_dtype)
+        assert_(r1.dtype == a_dtype)
+        assert_(isinstance(q1, a_type))
+        assert_(isinstance(r1, a_type))
+        assert_(q1.shape[-2:] == (m, k))
+        assert_(r1.shape[-2:] == (k, n))
+        assert_almost_equal(matmul(q1, r1), a)
+        I_mat = np.identity(q1.shape[-1])
+        stack_I_mat = np.broadcast_to(I_mat, 
+                        q1.shape[:-2] + (q1.shape[-1],)*2)
+        assert_almost_equal(matmul(swapaxes(q1, -1, -2).conj(), q1), 
+                            stack_I_mat)
+        assert_almost_equal(np.triu(r1[..., :, :]), r1)
+
+        # mode == 'r'
+        r2 = linalg.qr(a, mode='r')
+        assert_(r2.dtype == a_dtype)
+        assert_(isinstance(r2, a_type))
+        assert_almost_equal(r2, r1)
+
+    @pytest.mark.parametrize("size", [
+        (3, 4), (4, 3), (4, 4), 
+        (3, 0), (0, 3)])
+    @pytest.mark.parametrize("outer_size", [
+        (2, 2), (2,), (2, 3, 4)])
+    @pytest.mark.parametrize("dt", [
+        np.single, np.double, 
+        np.csingle, np.cdouble])
+    def test_stacked_inputs(self, outer_size, size, dt):
+
+        A = np.random.normal(size=outer_size + size).astype(dt)
+        B = np.random.normal(size=outer_size + size).astype(dt)
+        self.check_qr_stacked(A)
+        self.check_qr_stacked(A + 1.j*B)
+
 
 class TestCholesky:
     # TODO: are there no other tests for cholesky?
@@ -1894,8 +1953,8 @@ class TestMultiDot:
         assert_almost_equal(multi_dot([A, B]), A.dot(B))
         assert_almost_equal(multi_dot([A, B]), np.dot(A, B))
 
-    def test_basic_function_with_dynamic_programing_optimization(self):
-        # multi_dot with four or more arguments uses the dynamic programing
+    def test_basic_function_with_dynamic_programming_optimization(self):
+        # multi_dot with four or more arguments uses the dynamic programming
         # optimization and therefore deserve a separate
         A = np.random.random((6, 2))
         B = np.random.random((2, 6))
@@ -1956,8 +2015,8 @@ class TestMultiDot:
         assert_almost_equal(out, A.dot(B))
         assert_almost_equal(out, np.dot(A, B))
 
-    def test_dynamic_programing_optimization_and_out(self):
-        # multi_dot with four or more arguments uses the dynamic programing
+    def test_dynamic_programming_optimization_and_out(self):
+        # multi_dot with four or more arguments uses the dynamic programming
         # optimization and therefore deserve a separate test
         A = np.random.random((6, 2))
         B = np.random.random((2, 6))
@@ -2051,10 +2110,11 @@ def test_unsupported_commontype():
         linalg.cholesky(arr)
 
 
-@pytest.mark.slow
-@pytest.mark.xfail(not HAS_LAPACK64, run=False,
-                   reason="Numpy not compiled with 64-bit BLAS/LAPACK")
-@requires_memory(free_bytes=16e9)
+#@pytest.mark.slow
+#@pytest.mark.xfail(not HAS_LAPACK64, run=False,
+#                   reason="Numpy not compiled with 64-bit BLAS/LAPACK")
+#@requires_memory(free_bytes=16e9)
+@pytest.mark.skip(reason="Bad memory reports lead to OOM in ci testing")
 def test_blas64_dot():
     n = 2**32
     a = np.zeros([1, n], dtype=np.float32)
index 1807aadcf584bbae2b8d67aee2160adedb41457a..f8a15444547d970500a0a3c51a870134982146c8 100644 (file)
@@ -5,9 +5,10 @@
  **                            INCLUDES                                     **
  *****************************************************************************
  */
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
 
-#include "Python.h"
+#define NPY_NO_DEPRECATED_API NPY_API_VERSION
 #include "numpy/arrayobject.h"
 #include "numpy/ufuncobject.h"
 
@@ -162,6 +163,24 @@ FNAME(zgelsd)(fortran_int *m, fortran_int *n, fortran_int *nrhs,
               double rwork[], fortran_int iwork[],
               fortran_int *info);
 
+extern fortran_int
+FNAME(dgeqrf)(fortran_int *m, fortran_int *n, double a[], fortran_int *lda,
+              double tau[], double work[],
+              fortran_int *lwork, fortran_int *info);
+extern fortran_int
+FNAME(zgeqrf)(fortran_int *m, fortran_int *n, f2c_doublecomplex a[], fortran_int *lda,
+              f2c_doublecomplex tau[], f2c_doublecomplex work[],
+              fortran_int *lwork, fortran_int *info);
+
+extern fortran_int
+FNAME(dorgqr)(fortran_int *m, fortran_int *n, fortran_int *k, double a[], fortran_int *lda,
+              double tau[], double work[],
+              fortran_int *lwork, fortran_int *info);
+extern fortran_int
+FNAME(zungqr)(fortran_int *m, fortran_int *n, fortran_int *k, f2c_doublecomplex a[],
+              fortran_int *lda, f2c_doublecomplex tau[],
+              f2c_doublecomplex work[], fortran_int *lwork, fortran_int *info);
+
 extern fortran_int
 FNAME(sgesv)(fortran_int *n, fortran_int *nrhs,
              float a[], fortran_int *lda,
@@ -2834,170 +2853,131 @@ static void
 
 /**end repeat**/
 
-
 /* -------------------------------------------------------------------------- */
-                 /* least squares */
+                 /* qr (modes - r, raw) */
 
-typedef struct gelsd_params_struct
+typedef struct geqfr_params_struct
 {
     fortran_int M;
     fortran_int N;
-    fortran_int NRHS;
     void *A;
     fortran_int LDA;
-    void *B;
-    fortran_int LDB;
-    void *S;
-    void *RCOND;
-    fortran_int RANK;
+    void* TAU;
     void *WORK;
     fortran_int LWORK;
-    void *RWORK;
-    void *IWORK;
-} GELSD_PARAMS_t;
+} GEQRF_PARAMS_t;
 
 
 static inline void
-dump_gelsd_params(const char *name,
-                  GELSD_PARAMS_t *params)
+dump_geqrf_params(const char *name,
+                  GEQRF_PARAMS_t *params)
 {
     TRACE_TXT("\n%s:\n"\
 
               "%14s: %18p\n"\
               "%14s: %18p\n"\
               "%14s: %18p\n"\
-              "%14s: %18p\n"\
-              "%14s: %18p\n"\
-              "%14s: %18p\n"\
-
-              "%14s: %18d\n"\
-              "%14s: %18d\n"\
               "%14s: %18d\n"\
               "%14s: %18d\n"\
               "%14s: %18d\n"\
-              "%14s: %18d\n"\
-              "%14s: %18d\n"\
-
-              "%14s: %18p\n",
+              "%14s: %18d\n",
 
               name,
 
               "A", params->A,
-              "B", params->B,
-              "S", params->S,
+              "TAU", params->TAU,
               "WORK", params->WORK,
-              "RWORK", params->RWORK,
-              "IWORK", params->IWORK,
 
               "M", (int)params->M,
               "N", (int)params->N,
-              "NRHS", (int)params->NRHS,
               "LDA", (int)params->LDA,
-              "LDB", (int)params->LDB,
-              "LWORK", (int)params->LWORK,
-              "RANK", (int)params->RANK,
-
-              "RCOND", params->RCOND);
+              "LWORK", (int)params->LWORK);
 }
 
-
 /**begin repeat
-   #TYPE=FLOAT,DOUBLE#
-   #lapack_func=sgelsd,dgelsd#
-   #ftyp=fortran_real,fortran_doublereal#
+   #lapack_func=dgeqrf,zgeqrf#
  */
 
 static inline fortran_int
-call_@lapack_func@(GELSD_PARAMS_t *params)
+call_@lapack_func@(GEQRF_PARAMS_t *params)
 {
     fortran_int rv;
-    LAPACK(@lapack_func@)(&params->M, &params->N, &params->NRHS,
+    LAPACK(@lapack_func@)(&params->M, &params->N,
                           params->A, &params->LDA,
-                          params->B, &params->LDB,
-                          params->S,
-                          params->RCOND, &params->RANK,
+                          params->TAU,
                           params->WORK, &params->LWORK,
-                          params->IWORK,
                           &rv);
     return rv;
 }
 
+/**end repeat**/
+
+/**begin repeat
+   #TYPE=DOUBLE#
+   #lapack_func=dgeqrf#
+   #ftyp=fortran_doublereal#
+ */
 static inline int
-init_@lapack_func@(GELSD_PARAMS_t *params,
+init_@lapack_func@(GEQRF_PARAMS_t *params,
                    fortran_int m,
-                   fortran_int n,
-                   fortran_int nrhs)
+                   fortran_int n)
 {
     npy_uint8 *mem_buff = NULL;
     npy_uint8 *mem_buff2 = NULL;
-    npy_uint8 *a, *b, *s, *work, *iwork;
+    npy_uint8 *a, *tau, *work;
     fortran_int min_m_n = fortran_int_min(m, n);
-    fortran_int max_m_n = fortran_int_max(m, n);
     size_t safe_min_m_n = min_m_n;
-    size_t safe_max_m_n = max_m_n;
     size_t safe_m = m;
     size_t safe_n = n;
-    size_t safe_nrhs = nrhs;
 
     size_t a_size = safe_m * safe_n * sizeof(@ftyp@);
-    size_t b_size = safe_max_m_n * safe_nrhs * sizeof(@ftyp@);
-    size_t s_size = safe_min_m_n * sizeof(@ftyp@);
+    size_t tau_size = safe_min_m_n * sizeof(@ftyp@);
 
     fortran_int work_count;
     size_t work_size;
-    size_t iwork_size;
     fortran_int lda = fortran_int_max(1, m);
-    fortran_int ldb = fortran_int_max(1, fortran_int_max(m,n));
 
-    mem_buff = malloc(a_size + b_size + s_size);
+    mem_buff = malloc(a_size + tau_size);
 
     if (!mem_buff)
         goto error;
 
     a = mem_buff;
-    b = a + a_size;
-    s = b + b_size;
+    tau = a + a_size;
+    memset(tau, 0, tau_size);
 
 
     params->M = m;
     params->N = n;
-    params->NRHS = nrhs;
     params->A = a;
-    params->B = b;
-    params->S = s;
+    params->TAU = tau;
     params->LDA = lda;
-    params->LDB = ldb;
 
     {
         /* compute optimal work size */
+
         @ftyp@ work_size_query;
-        fortran_int iwork_size_query;
 
         params->WORK = &work_size_query;
-        params->IWORK = &iwork_size_query;
-        params->RWORK = NULL;
         params->LWORK = -1;
 
         if (call_@lapack_func@(params) != 0)
             goto error;
 
-        work_count = (fortran_int)work_size_query;
+        work_count = (fortran_int) *(@ftyp@*) params->WORK;
 
-        work_size  = (size_t) work_size_query * sizeof(@ftyp@);
-        iwork_size = (size_t)iwork_size_query * sizeof(fortran_int);
     }
 
-    mem_buff2 = malloc(work_size + iwork_size);
+    params->LWORK = fortran_int_max(fortran_int_max(1, n), work_count);
+
+    work_size = (size_t) params->LWORK * sizeof(@ftyp@);
+    mem_buff2 = malloc(work_size);
     if (!mem_buff2)
         goto error;
 
     work = mem_buff2;
-    iwork = work + work_size;
 
     params->WORK = work;
-    params->RWORK = NULL;
-    params->IWORK = iwork;
-    params->LWORK = work_count;
 
     return 1;
  error:
@@ -3012,106 +2992,73 @@ init_@lapack_func@(GELSD_PARAMS_t *params,
 /**end repeat**/
 
 /**begin repeat
-   #TYPE=CFLOAT,CDOUBLE#
-   #ftyp=fortran_complex,fortran_doublecomplex#
-   #frealtyp=fortran_real,fortran_doublereal#
-   #typ=COMPLEX_t,DOUBLECOMPLEX_t#
-   #lapack_func=cgelsd,zgelsd#
+   #TYPE=CDOUBLE#
+   #lapack_func=zgeqrf#
+   #ftyp=fortran_doublecomplex#
  */
-
-static inline fortran_int
-call_@lapack_func@(GELSD_PARAMS_t *params)
-{
-    fortran_int rv;
-    LAPACK(@lapack_func@)(&params->M, &params->N, &params->NRHS,
-                          params->A, &params->LDA,
-                          params->B, &params->LDB,
-                          params->S,
-                          params->RCOND, &params->RANK,
-                          params->WORK, &params->LWORK,
-                          params->RWORK, params->IWORK,
-                          &rv);
-    return rv;
-}
-
 static inline int
-init_@lapack_func@(GELSD_PARAMS_t *params,
+init_@lapack_func@(GEQRF_PARAMS_t *params,
                    fortran_int m,
-                   fortran_int n,
-                   fortran_int nrhs)
+                   fortran_int n)
 {
     npy_uint8 *mem_buff = NULL;
     npy_uint8 *mem_buff2 = NULL;
-    npy_uint8 *a, *b, *s, *work, *iwork, *rwork;
+    npy_uint8 *a, *tau, *work;
     fortran_int min_m_n = fortran_int_min(m, n);
-    fortran_int max_m_n = fortran_int_max(m, n);
     size_t safe_min_m_n = min_m_n;
-    size_t safe_max_m_n = max_m_n;
     size_t safe_m = m;
     size_t safe_n = n;
-    size_t safe_nrhs = nrhs;
 
     size_t a_size = safe_m * safe_n * sizeof(@ftyp@);
-    size_t b_size = safe_max_m_n * safe_nrhs * sizeof(@ftyp@);
-    size_t s_size = safe_min_m_n * sizeof(@frealtyp@);
+    size_t tau_size = safe_min_m_n * sizeof(@ftyp@);
 
     fortran_int work_count;
-    size_t work_size, rwork_size, iwork_size;
+    size_t work_size;
     fortran_int lda = fortran_int_max(1, m);
-    fortran_int ldb = fortran_int_max(1, fortran_int_max(m,n));
 
-    mem_buff = malloc(a_size + b_size + s_size);
+    mem_buff = malloc(a_size + tau_size);
 
     if (!mem_buff)
         goto error;
 
     a = mem_buff;
-    b = a + a_size;
-    s = b + b_size;
+    tau = a + a_size;
+    memset(tau, 0, tau_size);
 
 
     params->M = m;
     params->N = n;
-    params->NRHS = nrhs;
     params->A = a;
-    params->B = b;
-    params->S = s;
+    params->TAU = tau;
     params->LDA = lda;
-    params->LDB = ldb;
 
     {
         /* compute optimal work size */
+
         @ftyp@ work_size_query;
-        @frealtyp@ rwork_size_query;
-        fortran_int iwork_size_query;
 
         params->WORK = &work_size_query;
-        params->IWORK = &iwork_size_query;
-        params->RWORK = &rwork_size_query;
         params->LWORK = -1;
 
         if (call_@lapack_func@(params) != 0)
             goto error;
 
-        work_count = (fortran_int)work_size_query.r;
+        work_count = (fortran_int) ((@ftyp@*)params->WORK)->r;
 
-        work_size  = (size_t )work_size_query.r * sizeof(@ftyp@);
-        rwork_size = (size_t)rwork_size_query * sizeof(@frealtyp@);
-        iwork_size = (size_t)iwork_size_query * sizeof(fortran_int);
     }
 
-    mem_buff2 = malloc(work_size + rwork_size + iwork_size);
+    params->LWORK = fortran_int_max(fortran_int_max(1, n),
+                                    work_count);
+
+    work_size = (size_t) params->LWORK * sizeof(@ftyp@);
+
+    mem_buff2 = malloc(work_size);
     if (!mem_buff2)
         goto error;
 
     work = mem_buff2;
-    rwork = work + work_size;
-    iwork = rwork + rwork_size;
 
     params->WORK = work;
-    params->RWORK = rwork;
-    params->IWORK = iwork;
-    params->LWORK = work_count;
 
     return 1;
  error:
@@ -3125,20 +3072,11 @@ init_@lapack_func@(GELSD_PARAMS_t *params,
 
 /**end repeat**/
 
-
 /**begin repeat
-   #TYPE=FLOAT,DOUBLE,CFLOAT,CDOUBLE#
-   #REALTYPE=FLOAT,DOUBLE,FLOAT,DOUBLE#
-   #lapack_func=sgelsd,dgelsd,cgelsd,zgelsd#
-   #dot_func=sdot,ddot,cdotc,zdotc#
-   #typ     = npy_float, npy_double, npy_cfloat, npy_cdouble#
-   #basetyp = npy_float, npy_double, npy_float,  npy_double#
-   #ftyp = fortran_real, fortran_doublereal,
-           fortran_complex, fortran_doublecomplex#
-   #cmplx = 0, 0, 1, 1#
+   #lapack_func=dgeqrf,zgeqrf#
  */
 static inline void
-release_@lapack_func@(GELSD_PARAMS_t* params)
+release_@lapack_func@(GEQRF_PARAMS_t* params)
 {
     /* A and WORK contain allocated blocks */
     free(params->A);
@@ -3146,84 +3084,46 @@ release_@lapack_func@(GELSD_PARAMS_t* params)
     memset(params, 0, sizeof(*params));
 }
 
-/** Compute the squared l2 norm of a contiguous vector */
-static @basetyp@
-@TYPE@_abs2(@typ@ *p, npy_intp n) {
-    npy_intp i;
-    @basetyp@ res = 0;
-    for (i = 0; i < n; i++) {
-        @typ@ el = p[i];
-#if @cmplx@
-        res += el.real*el.real + el.imag*el.imag;
-#else
-        res += el*el;
-#endif
-    }
-    return res;
-}
+/**end repeat**/
 
+/**begin repeat
+   #TYPE=DOUBLE,CDOUBLE#
+   #REALTYPE=DOUBLE,DOUBLE#
+   #lapack_func=dgeqrf,zgeqrf#
+   #typ     = npy_double,npy_cdouble#
+   #basetyp = npy_double,npy_double#
+   #ftyp = fortran_doublereal,fortran_doublecomplex#
+   #cmplx = 0, 1#
+ */
 static void
-@TYPE@_lstsq(char **args, npy_intp const *dimensions, npy_intp const *steps,
-             void *NPY_UNUSED(func))
+@TYPE@_qr_r_raw(char **args, npy_intp const *dimensions, npy_intp const *steps,
+          void *NPY_UNUSED(func))
 {
-    GELSD_PARAMS_t params;
+    GEQRF_PARAMS_t params;
     int error_occurred = get_fp_invalid_and_clear();
-    fortran_int n, m, nrhs;
-    fortran_int excess;
+    fortran_int n, m;
 
-    INIT_OUTER_LOOP_7
+    INIT_OUTER_LOOP_2
 
     m = (fortran_int)dimensions[0];
     n = (fortran_int)dimensions[1];
-    nrhs = (fortran_int)dimensions[2];
-    excess = m - n;
 
-    if (init_@lapack_func@(&params, m, n, nrhs)) {
-        LINEARIZE_DATA_t a_in, b_in, x_out, s_out, r_out;
+    if (init_@lapack_func@(&params, m, n)) {
+        LINEARIZE_DATA_t a_in, tau_out;
 
         init_linearize_data(&a_in, n, m, steps[1], steps[0]);
-        init_linearize_data_ex(&b_in, nrhs, m, steps[3], steps[2], fortran_int_max(n, m));
-        init_linearize_data_ex(&x_out, nrhs, n, steps[5], steps[4], fortran_int_max(n, m));
-        init_linearize_data(&r_out, 1, nrhs, 1, steps[6]);
-        init_linearize_data(&s_out, 1, fortran_int_min(n, m), 1, steps[7]);
+        init_linearize_data(&tau_out, 1, fortran_int_min(m, n), 1, steps[2]);
 
-        BEGIN_OUTER_LOOP_7
+        BEGIN_OUTER_LOOP_2
             int not_ok;
             linearize_@TYPE@_matrix(params.A, args[0], &a_in);
-            linearize_@TYPE@_matrix(params.B, args[1], &b_in);
-            params.RCOND = args[2];
             not_ok = call_@lapack_func@(&params);
             if (!not_ok) {
-                delinearize_@TYPE@_matrix(args[3], params.B, &x_out);
-                *(npy_int*) args[5] = params.RANK;
-                delinearize_@REALTYPE@_matrix(args[6], params.S, &s_out);
-
-                /* Note that linalg.lstsq discards this when excess == 0 */
-                if (excess >= 0 && params.RANK == n) {
-                    /* Compute the residuals as the square sum of each column */
-                    int i;
-                    char *resid = args[4];
-                    @ftyp@ *components = (@ftyp@ *)params.B + n;
-                    for (i = 0; i < nrhs; i++) {
-                        @ftyp@ *vector = components + i*m;
-                        /* Numpy and fortran floating types are the same size,
-                         * so this cast is safe */
-                        @basetyp@ abs2 = @TYPE@_abs2((@typ@ *)vector, excess);
-                        memcpy(
-                            resid + i*r_out.column_strides,
-                            &abs2, sizeof(abs2));
-                    }
-                }
-                else {
-                    /* Note that this is always discarded by linalg.lstsq */
-                    nan_@REALTYPE@_matrix(args[4], &r_out);
-                }
+                delinearize_@TYPE@_matrix(args[0], params.A, &a_in);
+                delinearize_@TYPE@_matrix(args[1], params.TAU, &tau_out);
             } else {
                 error_occurred = 1;
-                nan_@TYPE@_matrix(args[3], &x_out);
-                nan_@REALTYPE@_matrix(args[4], &r_out);
-                *(npy_int*) args[5] = -1;
-                nan_@REALTYPE@_matrix(args[6], &s_out);
+                nan_@TYPE@_matrix(args[1], &tau_out);
             }
         END_OUTER_LOOP
 
@@ -3235,30 +3135,813 @@ static void
 
 /**end repeat**/
 
-#pragma GCC diagnostic pop
-
 /* -------------------------------------------------------------------------- */
-              /* gufunc registration  */
+                 /* qr common code (modes - reduced and complete) */ 
 
-static void *array_of_nulls[] = {
-    (void *)NULL,
-    (void *)NULL,
-    (void *)NULL,
-    (void *)NULL,
+typedef struct gqr_params_struct
+{
+    fortran_int M;
+    fortran_int MC;
+    fortran_int MN;
+    void* A;
+    void *Q;
+    fortran_int LDA;
+    void* TAU;
+    void *WORK;
+    fortran_int LWORK;
+} GQR_PARAMS_t;
 
-    (void *)NULL,
-    (void *)NULL,
-    (void *)NULL,
-    (void *)NULL,
+/**begin repeat
+   #lapack_func=dorgqr,zungqr#
+ */
 
-    (void *)NULL,
-    (void *)NULL,
-    (void *)NULL,
-    (void *)NULL,
+static inline fortran_int
+call_@lapack_func@(GQR_PARAMS_t *params)
+{
+    fortran_int rv;
+    LAPACK(@lapack_func@)(&params->M, &params->MC, &params->MN,
+                          params->Q, &params->LDA,
+                          params->TAU,
+                          params->WORK, &params->LWORK,
+                          &rv);
+    return rv;
+}
 
+/**end repeat**/
+
+/**begin repeat
+   #lapack_func=dorgqr#
+   #ftyp=fortran_doublereal#
+ */
+static inline int
+init_@lapack_func@_common(GQR_PARAMS_t *params,
+                          fortran_int m,
+                          fortran_int n,
+                          fortran_int mc)
+{
+    npy_uint8 *mem_buff = NULL;
+    npy_uint8 *mem_buff2 = NULL;
+    npy_uint8 *a, *q, *tau, *work;
+    fortran_int min_m_n = fortran_int_min(m, n);
+    size_t safe_mc = mc;
+    size_t safe_min_m_n = min_m_n;
+    size_t safe_m = m;
+    size_t safe_n = n;
+    size_t a_size = safe_m * safe_n * sizeof(@ftyp@);
+    size_t q_size = safe_m * safe_mc * sizeof(@ftyp@);
+    size_t tau_size = safe_min_m_n * sizeof(@ftyp@);
+
+    fortran_int work_count;
+    size_t work_size;
+    fortran_int lda = fortran_int_max(1, m);
+
+    mem_buff = malloc(q_size + tau_size + a_size);
+
+    if (!mem_buff)
+        goto error;
+
+    q = mem_buff;
+    tau = q + q_size;
+    a = tau + tau_size;
+
+
+    params->M = m;
+    params->MC = mc;
+    params->MN = min_m_n;
+    params->A = a;
+    params->Q = q;
+    params->TAU = tau;
+    params->LDA = lda;
+
+    {
+        /* compute optimal work size */
+        @ftyp@ work_size_query;
+
+        params->WORK = &work_size_query;
+        params->LWORK = -1;
+
+        if (call_@lapack_func@(params) != 0)
+            goto error;
+
+        work_count = (fortran_int) *(@ftyp@*) params->WORK;
+
+    }
+
+    params->LWORK = fortran_int_max(fortran_int_max(1, n), work_count);
+
+    work_size = (size_t) params->LWORK * sizeof(@ftyp@);
+
+    mem_buff2 = malloc(work_size);
+    if (!mem_buff2)
+        goto error;
+
+    work = mem_buff2;
+
+    params->WORK = work;
+
+    return 1;
+ error:
+    TRACE_TXT("%s failed init\n", __FUNCTION__);
+    free(mem_buff);
+    free(mem_buff2);
+    memset(params, 0, sizeof(*params));
+
+    return 0;
+}
+
+/**end repeat**/
+
+/**begin repeat
+   #lapack_func=zungqr#
+   #ftyp=fortran_doublecomplex#
+ */
+static inline int
+init_@lapack_func@_common(GQR_PARAMS_t *params,
+                          fortran_int m,
+                          fortran_int n,
+                          fortran_int mc)
+{
+    npy_uint8 *mem_buff = NULL;
+    npy_uint8 *mem_buff2 = NULL;
+    npy_uint8 *a, *q, *tau, *work;
+    fortran_int min_m_n = fortran_int_min(m, n);
+    size_t safe_mc = mc;
+    size_t safe_min_m_n = min_m_n;
+    size_t safe_m = m;
+    size_t safe_n = n;
+
+    size_t a_size = safe_m * safe_n * sizeof(@ftyp@);
+    size_t q_size = safe_m * safe_mc * sizeof(@ftyp@);
+    size_t tau_size = safe_min_m_n * sizeof(@ftyp@);
+
+    fortran_int work_count;
+    size_t work_size;
+    fortran_int lda = fortran_int_max(1, m);
+
+    mem_buff = malloc(q_size + tau_size + a_size);
+
+    if (!mem_buff)
+        goto error;
+
+    q = mem_buff;
+    tau = q + q_size;
+    a = tau + tau_size;
+
+
+    params->M = m;
+    params->MC = mc;
+    params->MN = min_m_n;
+    params->A = a;
+    params->Q = q;
+    params->TAU = tau;
+    params->LDA = lda;
+
+    {
+        /* compute optimal work size */
+        @ftyp@ work_size_query;
+
+        params->WORK = &work_size_query;
+        params->LWORK = -1;
+
+        if (call_@lapack_func@(params) != 0)
+            goto error;
+
+        work_count = (fortran_int) ((@ftyp@*)params->WORK)->r;
+
+    }
+
+    params->LWORK = fortran_int_max(fortran_int_max(1, n),
+                                    work_count);
+
+    work_size = (size_t) params->LWORK * sizeof(@ftyp@);
+
+    mem_buff2 = malloc(work_size);
+    if (!mem_buff2)
+        goto error;
+
+    work = mem_buff2;
+
+    params->WORK = work;
+    params->LWORK = work_count;
+
+    return 1;
+ error:
+    TRACE_TXT("%s failed init\n", __FUNCTION__);
+    free(mem_buff);
+    free(mem_buff2);
+    memset(params, 0, sizeof(*params));
+
+    return 0;
+}
+
+/**end repeat**/
+
+/* -------------------------------------------------------------------------- */
+                 /* qr (modes - reduced) */
+
+
+static inline void
+dump_gqr_params(const char *name,
+                GQR_PARAMS_t *params)
+{
+    TRACE_TXT("\n%s:\n"\
+
+              "%14s: %18p\n"\
+              "%14s: %18p\n"\
+              "%14s: %18p\n"\
+              "%14s: %18d\n"\
+              "%14s: %18d\n"\
+              "%14s: %18d\n"\
+              "%14s: %18d\n"\
+              "%14s: %18d\n",
+
+              name,
+
+              "Q", params->Q,
+              "TAU", params->TAU,
+              "WORK", params->WORK,
+
+              "M", (int)params->M,
+              "MC", (int)params->MC,
+              "MN", (int)params->MN,
+              "LDA", (int)params->LDA,
+              "LWORK", (int)params->LWORK);
+}
+
+/**begin repeat
+   #lapack_func=dorgqr,zungqr#
+   #ftyp=fortran_doublereal,fortran_doublecomplex#
+ */
+static inline int
+init_@lapack_func@(GQR_PARAMS_t *params,
+                   fortran_int m,
+                   fortran_int n)
+{
+    return init_@lapack_func@_common(
+        params, m, n, 
+        fortran_int_min(m, n));
+}
+
+/**end repeat**/
+
+/**begin repeat
+   #lapack_func=dorgqr,zungqr#
+ */
+static inline void
+release_@lapack_func@(GQR_PARAMS_t* params)
+{
+    /* A and WORK contain allocated blocks */
+    free(params->Q);
+    free(params->WORK);
+    memset(params, 0, sizeof(*params));
+}
+
+/**end repeat**/
+
+/**begin repeat
+   #TYPE=DOUBLE,CDOUBLE#
+   #REALTYPE=DOUBLE,DOUBLE#
+   #lapack_func=dorgqr,zungqr#
+   #typ     = npy_double, npy_cdouble#
+   #basetyp = npy_double, npy_double#
+   #ftyp = fortran_doublereal,fortran_doublecomplex#
+   #cmplx = 0, 1#
+ */
+static void
+@TYPE@_qr_reduced(char **args, npy_intp const *dimensions, npy_intp const *steps,
+                  void *NPY_UNUSED(func))
+{
+    GQR_PARAMS_t params;
+    int error_occurred = get_fp_invalid_and_clear();
+    fortran_int n, m;
+
+    INIT_OUTER_LOOP_3
+
+    m = (fortran_int)dimensions[0];
+    n = (fortran_int)dimensions[1];
+
+    if (init_@lapack_func@(&params, m, n)) {
+        LINEARIZE_DATA_t a_in, tau_in, q_out;
+
+        init_linearize_data(&a_in, n, m, steps[1], steps[0]);
+        init_linearize_data(&tau_in, 1, fortran_int_min(m, n), 1, steps[2]);
+        init_linearize_data(&q_out, fortran_int_min(m, n), m, steps[4], steps[3]);
+
+        BEGIN_OUTER_LOOP_3
+            int not_ok;
+            linearize_@TYPE@_matrix(params.A, args[0], &a_in);
+            linearize_@TYPE@_matrix(params.Q, args[0], &a_in);
+            linearize_@TYPE@_matrix(params.TAU, args[1], &tau_in);
+            not_ok = call_@lapack_func@(&params);
+            if (!not_ok) {
+                delinearize_@TYPE@_matrix(args[2], params.Q, &q_out);
+            } else {
+                error_occurred = 1;
+                nan_@TYPE@_matrix(args[2], &q_out);
+            }
+        END_OUTER_LOOP
+
+        release_@lapack_func@(&params);
+    }
+
+    set_fp_invalid_or_clear(error_occurred);
+}
+
+/**end repeat**/
+
+/* -------------------------------------------------------------------------- */
+                 /* qr (modes - complete) */
+
+/**begin repeat
+   #lapack_func=dorgqr,zungqr#
+   #ftyp=fortran_doublereal,fortran_doublecomplex#
+ */
+static inline int
+init_@lapack_func@_complete(GQR_PARAMS_t *params,
+                            fortran_int m,
+                            fortran_int n)
+{
+    return init_@lapack_func@_common(params, m, n, m);
+}
+
+/**end repeat**/
+
+/**begin repeat
+   #TYPE=DOUBLE,CDOUBLE#
+   #REALTYPE=DOUBLE,DOUBLE#
+   #lapack_func=dorgqr,zungqr#
+   #typ     = npy_double,npy_cdouble#
+   #basetyp = npy_double,npy_double#
+   #ftyp = fortran_doublereal,fortran_doublecomplex#
+   #cmplx = 0, 1#
+ */
+static void
+@TYPE@_qr_complete(char **args, npy_intp const *dimensions, npy_intp const *steps,
+                  void *NPY_UNUSED(func))
+{
+    GQR_PARAMS_t params;
+    int error_occurred = get_fp_invalid_and_clear();
+    fortran_int n, m;
+
+    INIT_OUTER_LOOP_3
+
+    m = (fortran_int)dimensions[0];
+    n = (fortran_int)dimensions[1];
+
+
+    if (init_@lapack_func@_complete(&params, m, n)) {
+        LINEARIZE_DATA_t a_in, tau_in, q_out;
+
+        init_linearize_data(&a_in, n, m, steps[1], steps[0]);
+        init_linearize_data(&tau_in, 1, fortran_int_min(m, n), 1, steps[2]);
+        init_linearize_data(&q_out, m, m, steps[4], steps[3]);
+
+        BEGIN_OUTER_LOOP_3
+            int not_ok;
+            linearize_@TYPE@_matrix(params.A, args[0], &a_in);
+            linearize_@TYPE@_matrix(params.Q, args[0], &a_in);
+            linearize_@TYPE@_matrix(params.TAU, args[1], &tau_in);
+            not_ok = call_@lapack_func@(&params);
+            if (!not_ok) {
+                delinearize_@TYPE@_matrix(args[2], params.Q, &q_out);
+            } else {
+                error_occurred = 1;
+                nan_@TYPE@_matrix(args[2], &q_out);
+            }
+        END_OUTER_LOOP
+
+        release_@lapack_func@(&params);
+    }
+
+    set_fp_invalid_or_clear(error_occurred);
+}
+
+/**end repeat**/
+
+/* -------------------------------------------------------------------------- */
+                 /* least squares */
+
+typedef struct gelsd_params_struct
+{
+    fortran_int M;
+    fortran_int N;
+    fortran_int NRHS;
+    void *A;
+    fortran_int LDA;
+    void *B;
+    fortran_int LDB;
+    void *S;
+    void *RCOND;
+    fortran_int RANK;
+    void *WORK;
+    fortran_int LWORK;
+    void *RWORK;
+    void *IWORK;
+} GELSD_PARAMS_t;
+
+
+static inline void
+dump_gelsd_params(const char *name,
+                  GELSD_PARAMS_t *params)
+{
+    TRACE_TXT("\n%s:\n"\
+
+              "%14s: %18p\n"\
+              "%14s: %18p\n"\
+              "%14s: %18p\n"\
+              "%14s: %18p\n"\
+              "%14s: %18p\n"\
+              "%14s: %18p\n"\
+
+              "%14s: %18d\n"\
+              "%14s: %18d\n"\
+              "%14s: %18d\n"\
+              "%14s: %18d\n"\
+              "%14s: %18d\n"\
+              "%14s: %18d\n"\
+              "%14s: %18d\n"\
+
+              "%14s: %18p\n",
+
+              name,
+
+              "A", params->A,
+              "B", params->B,
+              "S", params->S,
+              "WORK", params->WORK,
+              "RWORK", params->RWORK,
+              "IWORK", params->IWORK,
+
+              "M", (int)params->M,
+              "N", (int)params->N,
+              "NRHS", (int)params->NRHS,
+              "LDA", (int)params->LDA,
+              "LDB", (int)params->LDB,
+              "LWORK", (int)params->LWORK,
+              "RANK", (int)params->RANK,
+
+              "RCOND", params->RCOND);
+}
+
+
+/**begin repeat
+   #TYPE=FLOAT,DOUBLE#
+   #lapack_func=sgelsd,dgelsd#
+   #ftyp=fortran_real,fortran_doublereal#
+ */
+
+static inline fortran_int
+call_@lapack_func@(GELSD_PARAMS_t *params)
+{
+    fortran_int rv;
+    LAPACK(@lapack_func@)(&params->M, &params->N, &params->NRHS,
+                          params->A, &params->LDA,
+                          params->B, &params->LDB,
+                          params->S,
+                          params->RCOND, &params->RANK,
+                          params->WORK, &params->LWORK,
+                          params->IWORK,
+                          &rv);
+    return rv;
+}
+
+static inline int
+init_@lapack_func@(GELSD_PARAMS_t *params,
+                   fortran_int m,
+                   fortran_int n,
+                   fortran_int nrhs)
+{
+    npy_uint8 *mem_buff = NULL;
+    npy_uint8 *mem_buff2 = NULL;
+    npy_uint8 *a, *b, *s, *work, *iwork;
+    fortran_int min_m_n = fortran_int_min(m, n);
+    fortran_int max_m_n = fortran_int_max(m, n);
+    size_t safe_min_m_n = min_m_n;
+    size_t safe_max_m_n = max_m_n;
+    size_t safe_m = m;
+    size_t safe_n = n;
+    size_t safe_nrhs = nrhs;
+
+    size_t a_size = safe_m * safe_n * sizeof(@ftyp@);
+    size_t b_size = safe_max_m_n * safe_nrhs * sizeof(@ftyp@);
+    size_t s_size = safe_min_m_n * sizeof(@ftyp@);
+
+    fortran_int work_count;
+    size_t work_size;
+    size_t iwork_size;
+    fortran_int lda = fortran_int_max(1, m);
+    fortran_int ldb = fortran_int_max(1, fortran_int_max(m,n));
+
+    mem_buff = malloc(a_size + b_size + s_size);
+
+    if (!mem_buff)
+        goto error;
+
+    a = mem_buff;
+    b = a + a_size;
+    s = b + b_size;
+
+
+    params->M = m;
+    params->N = n;
+    params->NRHS = nrhs;
+    params->A = a;
+    params->B = b;
+    params->S = s;
+    params->LDA = lda;
+    params->LDB = ldb;
+
+    {
+        /* compute optimal work size */
+        @ftyp@ work_size_query;
+        fortran_int iwork_size_query;
+
+        params->WORK = &work_size_query;
+        params->IWORK = &iwork_size_query;
+        params->RWORK = NULL;
+        params->LWORK = -1;
+
+        if (call_@lapack_func@(params) != 0)
+            goto error;
+
+        work_count = (fortran_int)work_size_query;
+
+        work_size  = (size_t) work_size_query * sizeof(@ftyp@);
+        iwork_size = (size_t)iwork_size_query * sizeof(fortran_int);
+    }
+
+    mem_buff2 = malloc(work_size + iwork_size);
+    if (!mem_buff2)
+        goto error;
+
+    work = mem_buff2;
+    iwork = work + work_size;
+
+    params->WORK = work;
+    params->RWORK = NULL;
+    params->IWORK = iwork;
+    params->LWORK = work_count;
+
+    return 1;
+ error:
+    TRACE_TXT("%s failed init\n", __FUNCTION__);
+    free(mem_buff);
+    free(mem_buff2);
+    memset(params, 0, sizeof(*params));
+
+    return 0;
+}
+
+/**end repeat**/
+
+/**begin repeat
+   #TYPE=CFLOAT,CDOUBLE#
+   #ftyp=fortran_complex,fortran_doublecomplex#
+   #frealtyp=fortran_real,fortran_doublereal#
+   #typ=COMPLEX_t,DOUBLECOMPLEX_t#
+   #lapack_func=cgelsd,zgelsd#
+ */
+
+static inline fortran_int
+call_@lapack_func@(GELSD_PARAMS_t *params)
+{
+    fortran_int rv;
+    LAPACK(@lapack_func@)(&params->M, &params->N, &params->NRHS,
+                          params->A, &params->LDA,
+                          params->B, &params->LDB,
+                          params->S,
+                          params->RCOND, &params->RANK,
+                          params->WORK, &params->LWORK,
+                          params->RWORK, params->IWORK,
+                          &rv);
+    return rv;
+}
+
+static inline int
+init_@lapack_func@(GELSD_PARAMS_t *params,
+                   fortran_int m,
+                   fortran_int n,
+                   fortran_int nrhs)
+{
+    npy_uint8 *mem_buff = NULL;
+    npy_uint8 *mem_buff2 = NULL;
+    npy_uint8 *a, *b, *s, *work, *iwork, *rwork;
+    fortran_int min_m_n = fortran_int_min(m, n);
+    fortran_int max_m_n = fortran_int_max(m, n);
+    size_t safe_min_m_n = min_m_n;
+    size_t safe_max_m_n = max_m_n;
+    size_t safe_m = m;
+    size_t safe_n = n;
+    size_t safe_nrhs = nrhs;
+
+    size_t a_size = safe_m * safe_n * sizeof(@ftyp@);
+    size_t b_size = safe_max_m_n * safe_nrhs * sizeof(@ftyp@);
+    size_t s_size = safe_min_m_n * sizeof(@frealtyp@);
+
+    fortran_int work_count;
+    size_t work_size, rwork_size, iwork_size;
+    fortran_int lda = fortran_int_max(1, m);
+    fortran_int ldb = fortran_int_max(1, fortran_int_max(m,n));
+
+    mem_buff = malloc(a_size + b_size + s_size);
+
+    if (!mem_buff)
+        goto error;
+
+    a = mem_buff;
+    b = a + a_size;
+    s = b + b_size;
+
+
+    params->M = m;
+    params->N = n;
+    params->NRHS = nrhs;
+    params->A = a;
+    params->B = b;
+    params->S = s;
+    params->LDA = lda;
+    params->LDB = ldb;
+
+    {
+        /* compute optimal work size */
+        @ftyp@ work_size_query;
+        @frealtyp@ rwork_size_query;
+        fortran_int iwork_size_query;
+
+        params->WORK = &work_size_query;
+        params->IWORK = &iwork_size_query;
+        params->RWORK = &rwork_size_query;
+        params->LWORK = -1;
+
+        if (call_@lapack_func@(params) != 0)
+            goto error;
+
+        work_count = (fortran_int)work_size_query.r;
+
+        work_size  = (size_t )work_size_query.r * sizeof(@ftyp@);
+        rwork_size = (size_t)rwork_size_query * sizeof(@frealtyp@);
+        iwork_size = (size_t)iwork_size_query * sizeof(fortran_int);
+    }
+
+    mem_buff2 = malloc(work_size + rwork_size + iwork_size);
+    if (!mem_buff2)
+        goto error;
+
+    work = mem_buff2;
+    rwork = work + work_size;
+    iwork = rwork + rwork_size;
+
+    params->WORK = work;
+    params->RWORK = rwork;
+    params->IWORK = iwork;
+    params->LWORK = work_count;
+
+    return 1;
+ error:
+    TRACE_TXT("%s failed init\n", __FUNCTION__);
+    free(mem_buff);
+    free(mem_buff2);
+    memset(params, 0, sizeof(*params));
+
+    return 0;
+}
+
+/**end repeat**/
+
+
+/**begin repeat
+   #TYPE=FLOAT,DOUBLE,CFLOAT,CDOUBLE#
+   #REALTYPE=FLOAT,DOUBLE,FLOAT,DOUBLE#
+   #lapack_func=sgelsd,dgelsd,cgelsd,zgelsd#
+   #dot_func=sdot,ddot,cdotc,zdotc#
+   #typ     = npy_float, npy_double, npy_cfloat, npy_cdouble#
+   #basetyp = npy_float, npy_double, npy_float,  npy_double#
+   #ftyp = fortran_real, fortran_doublereal,
+           fortran_complex, fortran_doublecomplex#
+   #cmplx = 0, 0, 1, 1#
+ */
+static inline void
+release_@lapack_func@(GELSD_PARAMS_t* params)
+{
+    /* A and WORK contain allocated blocks */
+    free(params->A);
+    free(params->WORK);
+    memset(params, 0, sizeof(*params));
+}
+
+/** Compute the squared l2 norm of a contiguous vector */
+static @basetyp@
+@TYPE@_abs2(@typ@ *p, npy_intp n) {
+    npy_intp i;
+    @basetyp@ res = 0;
+    for (i = 0; i < n; i++) {
+        @typ@ el = p[i];
+#if @cmplx@
+        res += el.real*el.real + el.imag*el.imag;
+#else
+        res += el*el;
+#endif
+    }
+    return res;
+}
+
+static void
+@TYPE@_lstsq(char **args, npy_intp const *dimensions, npy_intp const *steps,
+             void *NPY_UNUSED(func))
+{
+    GELSD_PARAMS_t params;
+    int error_occurred = get_fp_invalid_and_clear();
+    fortran_int n, m, nrhs;
+    fortran_int excess;
+
+    INIT_OUTER_LOOP_7
+
+    m = (fortran_int)dimensions[0];
+    n = (fortran_int)dimensions[1];
+    nrhs = (fortran_int)dimensions[2];
+    excess = m - n;
+
+    if (init_@lapack_func@(&params, m, n, nrhs)) {
+        LINEARIZE_DATA_t a_in, b_in, x_out, s_out, r_out;
+
+        init_linearize_data(&a_in, n, m, steps[1], steps[0]);
+        init_linearize_data_ex(&b_in, nrhs, m, steps[3], steps[2], fortran_int_max(n, m));
+        init_linearize_data_ex(&x_out, nrhs, n, steps[5], steps[4], fortran_int_max(n, m));
+        init_linearize_data(&r_out, 1, nrhs, 1, steps[6]);
+        init_linearize_data(&s_out, 1, fortran_int_min(n, m), 1, steps[7]);
+
+        BEGIN_OUTER_LOOP_7
+            int not_ok;
+            linearize_@TYPE@_matrix(params.A, args[0], &a_in);
+            linearize_@TYPE@_matrix(params.B, args[1], &b_in);
+            params.RCOND = args[2];
+            not_ok = call_@lapack_func@(&params);
+            if (!not_ok) {
+                delinearize_@TYPE@_matrix(args[3], params.B, &x_out);
+                *(npy_int*) args[5] = params.RANK;
+                delinearize_@REALTYPE@_matrix(args[6], params.S, &s_out);
+
+                /* Note that linalg.lstsq discards this when excess == 0 */
+                if (excess >= 0 && params.RANK == n) {
+                    /* Compute the residuals as the square sum of each column */
+                    int i;
+                    char *resid = args[4];
+                    @ftyp@ *components = (@ftyp@ *)params.B + n;
+                    for (i = 0; i < nrhs; i++) {
+                        @ftyp@ *vector = components + i*m;
+                        /* Numpy and fortran floating types are the same size,
+                         * so this cast is safe */
+                        @basetyp@ abs2 = @TYPE@_abs2((@typ@ *)vector, excess);
+                        memcpy(
+                            resid + i*r_out.column_strides,
+                            &abs2, sizeof(abs2));
+                    }
+                }
+                else {
+                    /* Note that this is always discarded by linalg.lstsq */
+                    nan_@REALTYPE@_matrix(args[4], &r_out);
+                }
+            } else {
+                error_occurred = 1;
+                nan_@TYPE@_matrix(args[3], &x_out);
+                nan_@REALTYPE@_matrix(args[4], &r_out);
+                *(npy_int*) args[5] = -1;
+                nan_@REALTYPE@_matrix(args[6], &s_out);
+            }
+        END_OUTER_LOOP
+
+        release_@lapack_func@(&params);
+    }
+
+    set_fp_invalid_or_clear(error_occurred);
+}
+
+/**end repeat**/
+
+#pragma GCC diagnostic pop
+
+/* -------------------------------------------------------------------------- */
+              /* gufunc registration  */
+
+static void *array_of_nulls[] = {
+    (void *)NULL,
+    (void *)NULL,
+    (void *)NULL,
+    (void *)NULL,
+
+    (void *)NULL,
+    (void *)NULL,
+    (void *)NULL,
+    (void *)NULL,
+
+    (void *)NULL,
+    (void *)NULL,
+    (void *)NULL,
+    (void *)NULL,
+
+    (void *)NULL,
+    (void *)NULL,
     (void *)NULL,
-    (void *)NULL,
-    (void *)NULL,
     (void *)NULL
 };
 
@@ -3291,6 +3974,17 @@ static void *array_of_nulls[] = {
         CDOUBLE_ ## NAME                                \
     }
 
+/* The single precision functions are not used at all,
+ * due to input data being promoted to double precision
+ * in Python, so they are not implemented here.
+ */
+#define GUFUNC_FUNC_ARRAY_QR(NAME)                      \
+    static PyUFuncGenericFunction                       \
+    FUNC_ARRAY_NAME(NAME)[] = {                         \
+        DOUBLE_ ## NAME,                                \
+        CDOUBLE_ ## NAME                                \
+    }
+
 
 GUFUNC_FUNC_ARRAY_REAL_COMPLEX(slogdet);
 GUFUNC_FUNC_ARRAY_REAL_COMPLEX(det);
@@ -3305,6 +3999,9 @@ GUFUNC_FUNC_ARRAY_REAL_COMPLEX(cholesky_lo);
 GUFUNC_FUNC_ARRAY_REAL_COMPLEX(svd_N);
 GUFUNC_FUNC_ARRAY_REAL_COMPLEX(svd_S);
 GUFUNC_FUNC_ARRAY_REAL_COMPLEX(svd_A);
+GUFUNC_FUNC_ARRAY_QR(qr_r_raw);
+GUFUNC_FUNC_ARRAY_QR(qr_reduced);
+GUFUNC_FUNC_ARRAY_QR(qr_complete);
 GUFUNC_FUNC_ARRAY_REAL_COMPLEX(lstsq);
 GUFUNC_FUNC_ARRAY_EIG(eig);
 GUFUNC_FUNC_ARRAY_EIG(eigvals);
@@ -3371,6 +4068,24 @@ static char svd_1_3_types[] = {
     NPY_CDOUBLE, NPY_CDOUBLE, NPY_DOUBLE, NPY_CDOUBLE
 };
 
+/* A, tau */
+static char qr_r_raw_types[] = {
+    NPY_DOUBLE,  NPY_DOUBLE,
+    NPY_CDOUBLE, NPY_CDOUBLE,
+};
+
+/* A, tau, q */
+static char qr_reduced_types[] = {
+    NPY_DOUBLE,  NPY_DOUBLE,  NPY_DOUBLE,
+    NPY_CDOUBLE, NPY_CDOUBLE, NPY_CDOUBLE,
+};
+
+/* A, tau, q */
+static char qr_complete_types[] = {
+    NPY_DOUBLE,  NPY_DOUBLE,  NPY_DOUBLE,
+    NPY_CDOUBLE, NPY_CDOUBLE, NPY_CDOUBLE,
+};
+
 /*  A,           b,           rcond,      x,           resid,      rank,    s,        */
 static char lstsq_types[] = {
     NPY_FLOAT,   NPY_FLOAT,   NPY_FLOAT,  NPY_FLOAT,   NPY_FLOAT,  NPY_INT, NPY_FLOAT,
@@ -3570,6 +4285,42 @@ GUFUNC_DESCRIPTOR_t gufunc_descriptors [] = {
         FUNC_ARRAY_NAME(eigvals),
         eigvals_types
     },
+    {
+        "qr_r_raw_m",
+        "(m,n)->(m)",
+        "Compute TAU vector for the last two dimensions \n"\
+        "and broadcast to the rest. For m <= n. \n",
+        2, 1, 1,
+        FUNC_ARRAY_NAME(qr_r_raw),
+        qr_r_raw_types
+    },
+    {
+        "qr_r_raw_n",
+        "(m,n)->(n)",
+        "Compute TAU vector for the last two dimensions \n"\
+        "and broadcast to the rest. For m > n. \n",
+        2, 1, 1,
+        FUNC_ARRAY_NAME(qr_r_raw),
+        qr_r_raw_types
+    },
+    {
+        "qr_reduced",
+        "(m,n),(k)->(m,k)",
+        "Compute Q matrix for the last two dimensions \n"\
+        "and broadcast to the rest. \n",
+        2, 2, 1,
+        FUNC_ARRAY_NAME(qr_reduced),
+        qr_reduced_types
+    },
+    {
+        "qr_complete",
+        "(m,n),(n)->(m,m)",
+        "Compute Q matrix for the last two dimensions \n"\
+        "and broadcast to the rest. For m > n. \n",
+        2, 2, 1,
+        FUNC_ARRAY_NAME(qr_complete),
+        qr_complete_types
+    },
     {
         "lstsq_m",
         "(m,n),(m,nrhs),()->(n,nrhs),(nrhs),(),(m)",
@@ -3645,7 +4396,7 @@ static struct PyModuleDef moduledef = {
         NULL
 };
 
-PyObject *PyInit__umath_linalg(void)
+PyMODINIT_FUNC PyInit__umath_linalg(void)
 {
     PyObject *m;
     PyObject *d;
index a9a833e520f27020e6da78d966881039272233f3..26d44b508c47fa99bd5f16e3b38c80dcc16584a6 100644 (file)
@@ -1,5 +1,7 @@
 from typing import Any, List
 
+from numpy._pytesttester import PytestTester
+
 from numpy.ma import extras as extras
 
 from numpy.ma.core import (
@@ -230,3 +232,5 @@ from numpy.ma.extras import (
 )
 
 __all__: List[str]
+__path__: List[str]
+test: PytestTester
index e29d54365c330d4fe46bac72606e11d80375265c..56865683d9cb2e2ffb065d6238622466350aa865 100644 (file)
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
 
 import timeit
 import numpy
index 63d42eccad08bd4ec79cdebcc4958f867727fbb4..491c2c60550f4c778898ca00da2f11c62f12bd18 100644 (file)
@@ -39,8 +39,6 @@ from numpy.compat import (
     )
 from numpy import expand_dims
 from numpy.core.numeric import normalize_axis_tuple
-from numpy.core._internal import recursive
-from numpy.compat import pickle
 
 
 __all__ = [
@@ -70,13 +68,13 @@ __all__ = [
     'masked_singleton', 'masked_values', 'masked_where', 'max', 'maximum',
     'maximum_fill_value', 'mean', 'min', 'minimum', 'minimum_fill_value',
     'mod', 'multiply', 'mvoid', 'ndim', 'negative', 'nomask', 'nonzero',
-    'not_equal', 'ones', 'outer', 'outerproduct', 'power', 'prod',
+    'not_equal', 'ones', 'ones_like', 'outer', 'outerproduct', 'power', 'prod',
     'product', 'ptp', 'put', 'putmask', 'ravel', 'remainder',
     'repeat', 'reshape', 'resize', 'right_shift', 'round', 'round_',
     'set_fill_value', 'shape', 'sin', 'sinh', 'size', 'soften_mask',
     'sometrue', 'sort', 'sqrt', 'squeeze', 'std', 'subtract', 'sum',
     'swapaxes', 'take', 'tan', 'tanh', 'trace', 'transpose', 'true_divide',
-    'var', 'where', 'zeros',
+    'var', 'where', 'zeros', 'zeros_like',
     ]
 
 MaskType = np.bool_
@@ -1067,7 +1065,7 @@ class _MaskedBinaryOperation(_MaskedUFunc):
             tr = self.f.reduce(t, axis)
             mr = nomask
         else:
-            tr = self.f.reduce(t, axis, dtype=dtype or t.dtype)
+            tr = self.f.reduce(t, axis, dtype=dtype)
             mr = umath.logical_and.reduce(m, axis)
 
         if not tr.shape:
@@ -1686,6 +1684,16 @@ def make_mask_none(newshape, dtype=None):
     return result
 
 
+def _recursive_mask_or(m1, m2, newmask):
+    names = m1.dtype.names
+    for name in names:
+        current1 = m1[name]
+        if current1.dtype.names is not None:
+            _recursive_mask_or(current1, m2[name], newmask[name])
+        else:
+            umath.logical_or(current1, m2[name], newmask[name])
+
+
 def mask_or(m1, m2, copy=False, shrink=True):
     """
     Combine two masks with the ``logical_or`` operator.
@@ -1723,17 +1731,6 @@ def mask_or(m1, m2, copy=False, shrink=True):
 
     """
 
-    @recursive
-    def _recursive_mask_or(self, m1, m2, newmask):
-        names = m1.dtype.names
-        for name in names:
-            current1 = m1[name]
-            if current1.dtype.names is not None:
-                self(current1, m2[name], newmask[name])
-            else:
-                umath.logical_or(current1, m2[name], newmask[name])
-        return
-
     if (m1 is nomask) or (m1 is False):
         dtype = getattr(m2, 'dtype', MaskType)
         return make_mask(m2, copy=copy, shrink=shrink, dtype=dtype)
@@ -2840,11 +2837,12 @@ class MaskedArray(ndarray):
             _data = ndarray.view(_data, type(data))
         else:
             _data = ndarray.view(_data, cls)
-        # Backwards compatibility w/ numpy.core.ma.
+
+        # Handle the case where data is not a subclass of ndarray, but
+        # still has the _mask attribute like MaskedArrays
         if hasattr(data, '_mask') and not isinstance(data, ndarray):
             _data._mask = data._mask
-            # FIXME _sharedmask is never used.
-            _sharedmask = True
+            # FIXME: should we set `_data._sharedmask = True`? 
         # Process mask.
         # Type of the mask
         mdtype = make_mask_descr(_data.dtype)
@@ -3382,8 +3380,12 @@ class MaskedArray(ndarray):
                 _mask[indx] = mval
         elif not self._hardmask:
             # Set the data, then the mask
-            _data[indx] = dval
-            _mask[indx] = mval
+            if (isinstance(indx, masked_array) and
+                    not isinstance(value, masked_array)):
+                _data[indx.data] = dval
+            else:
+                _data[indx] = dval
+                _mask[indx] = mval
         elif hasattr(indx, 'dtype') and (indx.dtype == MaskType):
             indx = indx * umath.logical_not(_mask)
             _data[indx] = dval
@@ -3953,7 +3955,7 @@ class MaskedArray(ndarray):
 
 
         # 2016-11-19: Demoted to legacy format
-        if np.get_printoptions()['legacy'] == '1.13':
+        if np.core.arrayprint._get_legacy_print_mode() <= 113:
             is_long = self.ndim > 1
             parameters = dict(
                 name=name,
@@ -5291,9 +5293,6 @@ class MaskedArray(ndarray):
 
         """
         m = self.mean(axis, dtype)
-        if m is masked:
-            return m
-
         if not axis:
             return self - m
         else:
@@ -5492,7 +5491,8 @@ class MaskedArray(ndarray):
         filled = self.filled(fill_value)
         return filled.argsort(axis=axis, kind=kind, order=order)
 
-    def argmin(self, axis=None, fill_value=None, out=None):
+    def argmin(self, axis=None, fill_value=None, out=None, *,
+                keepdims=np._NoValue):
         """
         Return array of indices to the minimum values along the given axis.
 
@@ -5535,9 +5535,11 @@ class MaskedArray(ndarray):
         if fill_value is None:
             fill_value = minimum_fill_value(self)
         d = self.filled(fill_value).view(ndarray)
-        return d.argmin(axis, out=out)
+        keepdims = False if keepdims is np._NoValue else bool(keepdims)
+        return d.argmin(axis, out=out, keepdims=keepdims)
 
-    def argmax(self, axis=None, fill_value=None, out=None):
+    def argmax(self, axis=None, fill_value=None, out=None, *,
+                keepdims=np._NoValue):
         """
         Returns array of indices of the maximum values along the given axis.
         Masked values are treated as if they had the value fill_value.
@@ -5572,7 +5574,8 @@ class MaskedArray(ndarray):
         if fill_value is None:
             fill_value = maximum_fill_value(self._data)
         d = self.filled(fill_value).view(ndarray)
-        return d.argmax(axis, out=out)
+        keepdims = False if keepdims is np._NoValue else bool(keepdims)
+        return d.argmax(axis, out=out, keepdims=keepdims)
 
     def sort(self, axis=-1, kind=None, order=None,
              endwith=True, fill_value=None):
@@ -8095,22 +8098,51 @@ class _convert2ma:
     """
     __doc__ = None
 
-    def __init__(self, funcname, params=None):
+    def __init__(self, funcname, np_ret, np_ma_ret, params=None):
         self._func = getattr(np, funcname)
-        self.__doc__ = self.getdoc()
+        self.__doc__ = self.getdoc(np_ret, np_ma_ret)
         self._extras = params or {}
 
-    def getdoc(self):
+    def getdoc(self, np_ret, np_ma_ret):
         "Return the doc of the function (from the doc of the method)."
         doc = getattr(self._func, '__doc__', None)
         sig = get_object_signature(self._func)
         if doc:
+            doc = self._replace_return_type(doc, np_ret, np_ma_ret)
             # Add the signature of the function at the beginning of the doc
             if sig:
                 sig = "%s%s\n" % (self._func.__name__, sig)
             doc = sig + doc
         return doc
 
+    def _replace_return_type(self, doc, np_ret, np_ma_ret):
+        """
+        Replace documentation of ``np`` function's return type.
+
+        Replaces it with the proper type for the ``np.ma`` function.
+
+        Parameters
+        ----------
+        doc : str
+            The documentation of the ``np`` method.
+        np_ret : str
+            The return type string of the ``np`` method that we want to
+            replace. (e.g. "out : ndarray")
+        np_ma_ret : str
+            The return type string of the ``np.ma`` method.
+            (e.g. "out : MaskedArray")
+        """
+        if np_ret not in doc:
+            raise RuntimeError(
+                f"Failed to replace `{np_ret}` with `{np_ma_ret}`. "
+                f"The documentation string for return type, {np_ret}, is not "
+                f"found in the docstring for `np.{self._func.__name__}`. "
+                f"Fix the docstring for `np.{self._func.__name__}` or "
+                "update the expected string for return type."
+            )
+
+        return doc.replace(np_ret, np_ma_ret)
+
     def __call__(self, *args, **params):
         # Find the common parameters to the call and the definition
         _extras = self._extras
@@ -8126,21 +8158,86 @@ class _convert2ma:
             result._hardmask = bool(_extras.get("hard_mask", False))
         return result
 
-arange = _convert2ma('arange', params=dict(fill_value=None, hardmask=False))
-clip = np.clip
-diff = np.diff
-empty = _convert2ma('empty', params=dict(fill_value=None, hardmask=False))
-empty_like = _convert2ma('empty_like')
-frombuffer = _convert2ma('frombuffer')
-fromfunction = _convert2ma('fromfunction')
+
+arange = _convert2ma(
+    'arange', 
+    params=dict(fill_value=None, hardmask=False),
+    np_ret='arange : ndarray',
+    np_ma_ret='arange : MaskedArray',
+)
+clip = _convert2ma(
+    'clip',
+    params=dict(fill_value=None, hardmask=False),
+    np_ret='clipped_array : ndarray',
+    np_ma_ret='clipped_array : MaskedArray',
+)
+diff = _convert2ma(
+    'diff',
+    params=dict(fill_value=None, hardmask=False),
+    np_ret='diff : ndarray',
+    np_ma_ret='diff : MaskedArray',
+)
+empty = _convert2ma(
+    'empty', 
+    params=dict(fill_value=None, hardmask=False),
+    np_ret='out : ndarray',
+    np_ma_ret='out : MaskedArray',
+)
+empty_like = _convert2ma(
+    'empty_like',
+    np_ret='out : ndarray',
+    np_ma_ret='out : MaskedArray',
+)
+frombuffer = _convert2ma(
+    'frombuffer',
+    np_ret='out : ndarray',
+    np_ma_ret='out: MaskedArray',
+)
+fromfunction = _convert2ma(
+   'fromfunction',
+   np_ret='fromfunction : any',
+   np_ma_ret='fromfunction: MaskedArray',
+)
 identity = _convert2ma(
-    'identity', params=dict(fill_value=None, hardmask=False))
-indices = np.indices
-ones = _convert2ma('ones', params=dict(fill_value=None, hardmask=False))
-ones_like = np.ones_like
-squeeze = np.squeeze
-zeros = _convert2ma('zeros', params=dict(fill_value=None, hardmask=False))
-zeros_like = np.zeros_like
+    'identity', 
+    params=dict(fill_value=None, hardmask=False),
+    np_ret='out : ndarray',
+    np_ma_ret='out : MaskedArray',
+)
+indices = _convert2ma(
+    'indices',
+    params=dict(fill_value=None, hardmask=False),
+    np_ret='grid : one ndarray or tuple of ndarrays',
+    np_ma_ret='grid : one MaskedArray or tuple of MaskedArrays',
+)
+ones = _convert2ma(
+    'ones',
+    params=dict(fill_value=None, hardmask=False),
+    np_ret='out : ndarray',
+    np_ma_ret='out : MaskedArray',
+)
+ones_like = _convert2ma(
+    'ones_like',
+    np_ret='out : ndarray',
+    np_ma_ret='out : MaskedArray',
+)
+squeeze = _convert2ma(
+    'squeeze',
+    params=dict(fill_value=None, hardmask=False),
+    np_ret='squeezed : ndarray',
+    np_ma_ret='squeezed : MaskedArray',
+)
+zeros = _convert2ma(
+    'zeros',
+    params=dict(fill_value=None, hardmask=False),
+    np_ret='out : ndarray',
+    np_ma_ret='out : MaskedArray',
+)
+zeros_like = _convert2ma(
+    'zeros_like',
+    np_ret='out : ndarray',
+    np_ma_ret='out : MaskedArray',
+)
 
 
 def append(a, b, axis=None):
index e7e3f1f36818b53b08d0dd11cac26e6fadb6e5dc..bc1f45a8d5adc61e6023700a729e2747b8a5702a 100644 (file)
@@ -270,8 +270,8 @@ class MaskedArray(ndarray[_ShapeType, _DType_co]):
     def std(self, axis=..., dtype=..., out=..., ddof=..., keepdims=...): ...
     def round(self, decimals=..., out=...): ...
     def argsort(self, axis=..., kind=..., order=..., endwith=..., fill_value=...): ...
-    def argmin(self, axis=..., fill_value=..., out=...): ...
-    def argmax(self, axis=..., fill_value=..., out=...): ...
+    def argmin(self, axis=..., fill_value=..., out=..., *, keepdims=...): ...
+    def argmax(self, axis=..., fill_value=..., out=..., *, keepdims=...): ...
     def sort(self, axis=..., kind=..., order=..., endwith=..., fill_value=...): ...
     def min(self, axis=..., out=..., fill_value=..., keepdims=...): ...
     # NOTE: deprecated
index bd5fc2ca3bb2b6099e0d028e66749cb3fd9318dc..38bf1f0e83952746ae58e914ece2890321b43ddf 100644 (file)
@@ -33,7 +33,6 @@ from .core import (
 
 import numpy as np
 from numpy import ndarray, array as nxarray
-import numpy.core.umath as umath
 from numpy.core.multiarray import normalize_axis_index
 from numpy.core.numeric import normalize_axis_tuple
 from numpy.lib.function_base import _ureduce
@@ -744,7 +743,6 @@ def _median(a, axis=None, out=None, overwrite_input=False):
         return np.ma.mean(asorted[indexer], axis=axis, out=out)
 
     if asorted.ndim == 1:
-        counts = count(asorted)
         idx, odd = divmod(count(asorted), 2)
         mid = asorted[idx + odd - 1:idx + 1]
         if np.issubdtype(asorted.dtype, np.inexact) and asorted.size > 0:
@@ -752,7 +750,7 @@ def _median(a, axis=None, out=None, overwrite_input=False):
             s = mid.sum(out=out)
             if not odd:
                 s = np.true_divide(s, 2., casting='safe', out=out)
-            s = np.lib.utils._median_nancheck(asorted, s, axis, out)
+            s = np.lib.utils._median_nancheck(asorted, s, axis)
         else:
             s = mid.mean(out=out)
 
@@ -792,7 +790,7 @@ def _median(a, axis=None, out=None, overwrite_input=False):
         s = np.ma.sum(low_high, axis=axis, out=out)
         np.true_divide(s.data, 2., casting='unsafe', out=s.data)
 
-        s = np.lib.utils._median_nancheck(asorted, s, axis, out)
+        s = np.lib.utils._median_nancheck(asorted, s, axis)
     else:
         s = np.ma.mean(low_high, axis=axis, out=out)
 
index 9ea4e4e3627ddeb5a0be7d24bda8c320d08cd3f8..1e8103bcf63271a51122dd90fd1ba6f4c722502c 100644 (file)
@@ -129,7 +129,6 @@ class MaskedRecords(MaskedArray):
                     msg = "Mask and data not compatible: data size is %i, " + \
                           "mask size is %i."
                     raise MAError(msg % (nd, nm))
-                copy = True
             if not keep_mask:
                 self.__setmask__(mask)
                 self._sharedmask = True
@@ -376,7 +375,6 @@ class MaskedRecords(MaskedArray):
             try:
                 if issubclass(dtype, ndarray):
                     output = ndarray.view(self, dtype)
-                    dtype = None
                 else:
                     output = ndarray.view(self, dtype)
             # OK, there's the change
@@ -495,7 +493,6 @@ def _mrreconstruct(subtype, baseclass, baseshape, basetype,):
     _mask = ndarray.__new__(ndarray, baseshape, 'b1')
     return subtype.__new__(subtype, _data, mask=_mask, dtype=basetype,)
 
-
 mrecarray = MaskedRecords
 
 
@@ -660,8 +657,8 @@ def openfile(fname):
     # Try to open the file and guess its type
     try:
         f = open(fname)
-    except IOError as e:
-        raise IOError(f"No such file: '{fname}'") from e
+    except FileNotFoundError as e:
+        raise FileNotFoundError(f"No such file: '{fname}'") from e
     if f.readline()[:2] != "\\x":
         f.seek(0, 0)
         return f
@@ -669,8 +666,9 @@ def openfile(fname):
     raise NotImplementedError("Wow, binary file")
 
 
-def fromtextfile(fname, delimitor=None, commentchar='#', missingchar='',
-                 varnames=None, vartypes=None):
+def fromtextfile(fname, delimiter=None, commentchar='#', missingchar='',
+                 varnames=None, vartypes=None,
+                 *, delimitor=np._NoValue):  # backwards compatibility
     """
     Creates a mrecarray from data stored in the file `filename`.
 
@@ -678,7 +676,7 @@ def fromtextfile(fname, delimitor=None, commentchar='#', missingchar='',
     ----------
     fname : {file name/handle}
         Handle of an opened file.
-    delimitor : {None, string}, optional
+    delimiter : {None, string}, optional
         Alphanumeric character used to separate columns in the file.
         If None, any (group of) white spacestring(s) will be used.
     commentchar : {'#', string}, optional
@@ -694,6 +692,17 @@ def fromtextfile(fname, delimitor=None, commentchar='#', missingchar='',
 
 
     Ultra simple: the varnames are in the header, one line"""
+    if delimitor is not np._NoValue:
+        if delimiter is not None:
+            raise TypeError("fromtextfile() got multiple values for argument "
+                            "'delimiter'")
+        # NumPy 1.22.0, 2021-09-23
+        warnings.warn("The 'delimitor' keyword argument of "
+                      "numpy.ma.mrecords.fromtextfile() is deprecated "
+                      "since NumPy 1.22.0, use 'delimiter' instead.",
+                      DeprecationWarning, stacklevel=2)
+        delimiter = delimitor
+
     # Try to open the file.
     ftext = openfile(fname)
 
@@ -701,14 +710,14 @@ def fromtextfile(fname, delimitor=None, commentchar='#', missingchar='',
     while True:
         line = ftext.readline()
         firstline = line[:line.find(commentchar)].strip()
-        _varnames = firstline.split(delimitor)
+        _varnames = firstline.split(delimiter)
         if len(_varnames) > 1:
             break
     if varnames is None:
         varnames = _varnames
 
     # Get the data.
-    _variables = masked_array([line.strip().split(delimitor) for line in ftext
+    _variables = masked_array([line.strip().split(delimiter) for line in ftext
                                if line[0] != commentchar and len(line) > 1])
     (_, nfields) = _variables.shape
     ftext.close()
index 92d5afb897e2741ec65452269daf18390e51666b..7bd8678cf12de57ae4f7c73379f17f4ef544ded3 100644 (file)
@@ -78,11 +78,13 @@ def fromrecords(
 
 def fromtextfile(
     fname,
-    delimitor=...,
+    delimiter=...,
     commentchar=...,
     missingchar=...,
     varnames=...,
     vartypes=...,
+    # NOTE: deprecated: NumPy 1.22.0, 2021-09-23
+    # delimitor=..., 
 ): ...
 
 def addfield(mrecord, newfield, newfieldname=...): ...
index b71fa9069f60fae4340436f6fcdb39fd10ac4d43..c8f7f42692d4199ed0e561e6eb5164b8027f2d74 100644 (file)
@@ -43,9 +43,9 @@ from numpy.ma.core import (
     masked_less, masked_less_equal, masked_not_equal, masked_outside,
     masked_print_option, masked_values, masked_where, max, maximum,
     maximum_fill_value, min, minimum, minimum_fill_value, mod, multiply,
-    mvoid, nomask, not_equal, ones, outer, power, product, put, putmask,
-    ravel, repeat, reshape, resize, shape, sin, sinh, sometrue, sort, sqrt,
-    subtract, sum, take, tan, tanh, transpose, where, zeros,
+    mvoid, nomask, not_equal, ones, ones_like, outer, power, product, put,
+    putmask, ravel, repeat, reshape, resize, shape, sin, sinh, sometrue, sort,
+    sqrt, subtract, sum, take, tan, tanh, transpose, where, zeros, zeros_like,
     )
 from numpy.compat import pickle
 
@@ -1071,7 +1071,7 @@ class TestMaskedArrayArithmetic:
         assert_equal(z.mask, [[1, 1, 1], [0, 0, 0]])
 
     def test_mixed_arithmetic(self):
-        # Tests mixed arithmetics.
+        # Tests mixed arithmetic.
         na = np.array([1])
         ma = array([1])
         assert_(isinstance(na + ma, MaskedArray))
@@ -1084,7 +1084,7 @@ class TestMaskedArrayArithmetic:
         assert_equal(getmaskarray(2 / a), [1, 0, 1])
 
     def test_masked_singleton_arithmetic(self):
-        # Tests some scalar arithmetics on MaskedArrays.
+        # Tests some scalar arithmetic on MaskedArrays.
         # Masked singleton should remain masked no matter what
         xm = array(0, mask=1)
         assert_((1 / array(0)).mask)
@@ -1317,7 +1317,7 @@ class TestMaskedArrayArithmetic:
                               dtype=float_dtype)
             assert_equal(zm.min(), float_dtype(-np.inf-1j))
             assert_equal(zm.max(), float_dtype(np.inf+2j))
-            
+
             cmax = np.inf - 1j * np.finfo(np.float64).max
             assert masked_array([-cmax, 0], mask=[0, 1]).max() == -cmax
             assert masked_array([cmax, 0], mask=[0, 1]).min() == cmax
@@ -1804,7 +1804,7 @@ class TestMaskedArrayArithmetic:
             assert_equal(test.mask, [[False, True],
                                      [False, True]])
 
-    def test_numpyarithmetics(self):
+    def test_numpyarithmetic(self):
         # Check that the mask is not back-propagated when using numpy functions
         a = masked_array([-1, 0, 1, 2, 3], mask=[0, 0, 0, 0, 1])
         control = masked_array([np.nan, np.nan, 0, np.log(2), -1],
@@ -2479,8 +2479,8 @@ class TestUfuncs:
             # also check that allclose uses ma ufuncs, to avoid warning
             allclose(m, 0.5)
 
-class TestMaskedArrayInPlaceArithmetics:
-    # Test MaskedArray Arithmetics
+class TestMaskedArrayInPlaceArithmetic:
+    # Test MaskedArray Arithmetic
 
     def setup(self):
         x = arange(10)
@@ -2853,6 +2853,8 @@ class TestMaskedArrayInPlaceArithmetics:
 
     def test_inplace_floor_division_scalar_type(self):
         # Test of inplace division
+        # Check for TypeError in case of unsupported types
+        unsupported = {np.dtype(t).type for t in np.typecodes["Complex"]}
         for t in self.othertypes:
             with warnings.catch_warnings(record=True) as w:
                 warnings.filterwarnings("always")
@@ -2860,15 +2862,21 @@ class TestMaskedArrayInPlaceArithmetics:
                 x = arange(10, dtype=t) * t(2)
                 xm = arange(10, dtype=t) * t(2)
                 xm[2] = masked
-                x //= t(2)
-                xm //= t(2)
-                assert_equal(x, y)
-                assert_equal(xm, y)
+                try:
+                    x //= t(2)
+                    xm //= t(2)
+                    assert_equal(x, y)
+                    assert_equal(xm, y)
 
-                assert_equal(len(w), 0, "Failed on type=%s." % t)
+                    assert_equal(len(w), 0, "Failed on type=%s." % t)
+                except TypeError:
+                    msg = f"Supported type {t} throwing TypeError"
+                    assert t in unsupported, msg
 
     def test_inplace_floor_division_array_type(self):
         # Test of inplace division
+        # Check for TypeError in case of unsupported types
+        unsupported = {np.dtype(t).type for t in np.typecodes["Complex"]}
         for t in self.othertypes:
             with warnings.catch_warnings(record=True) as w:
                 warnings.filterwarnings("always")
@@ -2876,16 +2884,20 @@ class TestMaskedArrayInPlaceArithmetics:
                 m = xm.mask
                 a = arange(10, dtype=t)
                 a[-1] = masked
-                x //= a
-                xm //= a
-                assert_equal(x, y // a)
-                assert_equal(xm, y // a)
-                assert_equal(
-                    xm.mask,
-                    mask_or(mask_or(m, a.mask), (a == t(0)))
-                )
+                try:
+                    x //= a
+                    xm //= a
+                    assert_equal(x, y // a)
+                    assert_equal(xm, y // a)
+                    assert_equal(
+                        xm.mask,
+                        mask_or(mask_or(m, a.mask), (a == t(0)))
+                    )
 
-                assert_equal(len(w), 0, f'Failed on type={t}.')
+                    assert_equal(len(w), 0, f'Failed on type={t}.')
+                except TypeError:
+                    msg = f"Supported type {t} throwing TypeError"
+                    assert t in unsupported, msg
 
     def test_inplace_division_scalar_type(self):
         # Test of inplace division
@@ -3217,6 +3229,50 @@ class TestMaskedArrayMethods:
         b = a.view(masked_array)
         assert_(np.may_share_memory(a.mask, b.mask))
 
+    def test_zeros(self):
+        # Tests zeros/like
+        datatype = [('a', int), ('b', float), ('c', '|S8')]
+        a = masked_array([(1, 1.1, '1.1'), (2, 2.2, '2.2'), (3, 3.3, '3.3')],
+                         dtype=datatype)
+        assert_equal(len(a.fill_value.item()), len(datatype))
+
+        b = zeros(len(a), dtype=datatype)
+        assert_equal(b.shape, a.shape)
+        assert_equal(b.fill_value, a.fill_value)
+
+        b = zeros_like(a)
+        assert_equal(b.shape, a.shape)
+        assert_equal(b.fill_value, a.fill_value)
+
+        # check zeros_like mask handling
+        a = masked_array([1, 2, 3], mask=[False, True, False])
+        b = zeros_like(a)
+        assert_(not np.may_share_memory(a.mask, b.mask))
+        b = a.view()
+        assert_(np.may_share_memory(a.mask, b.mask))
+
+    def test_ones(self):
+        # Tests ones/like
+        datatype = [('a', int), ('b', float), ('c', '|S8')]
+        a = masked_array([(1, 1.1, '1.1'), (2, 2.2, '2.2'), (3, 3.3, '3.3')],
+                         dtype=datatype)
+        assert_equal(len(a.fill_value.item()), len(datatype))
+
+        b = ones(len(a), dtype=datatype)
+        assert_equal(b.shape, a.shape)
+        assert_equal(b.fill_value, a.fill_value)
+
+        b = ones_like(a)
+        assert_equal(b.shape, a.shape)
+        assert_equal(b.fill_value, a.fill_value)
+
+        # check ones_like mask handling
+        a = masked_array([1, 2, 3], mask=[False, True, False])
+        b = ones_like(a)
+        assert_(not np.may_share_memory(a.mask, b.mask))
+        b = a.view()
+        assert_(np.may_share_memory(a.mask, b.mask))
+
     @suppress_copy_mask_on_assignment
     def test_put(self):
         # Tests put.
@@ -3366,6 +3422,10 @@ class TestMaskedArrayMethods:
         assert_equal(sortedx._data, [1, 2, -2, -1, 0])
         assert_equal(sortedx._mask, [1, 1, 0, 0, 0])
 
+        x = array([0, -1], dtype=np.int8)
+        sortedx = sort(x, kind="stable")
+        assert_equal(sortedx, array([-1, 0], dtype=np.int8))
+
     def test_stable_sort(self):
         x = array([1, 2, 3, 1, 2, 3], dtype=np.uint8)
         expected = array([0, 3, 1, 4, 2, 5])
@@ -3452,7 +3512,7 @@ class TestMaskedArrayMethods:
         # Test sort on dtype with subarray (gh-8069)
         # Just check that the sort does not error, structured array subarrays
         # are treated as byte strings and that leads to differing behavior
-        # depending on endianess and `endwith`.
+        # depending on endianness and `endwith`.
         dt = np.dtype([('v', int, 2)])
         a = a.view(dt)
         test = sort(a)
@@ -3803,6 +3863,30 @@ class TestMaskedArrayMathMethods:
         assert_equal(a.mean(), 2)
         assert_equal(a.anom(), [-1, 0, 1])
 
+    def test_anom_shape(self):
+        a = masked_array([1, 2, 3])
+        assert_equal(a.anom().shape, a.shape)
+        a.mask = True
+        assert_equal(a.anom().shape, a.shape)
+        assert_(np.ma.is_masked(a.anom()))
+
+    def test_anom(self):
+        a = masked_array(np.arange(1, 7).reshape(2, 3))
+        assert_almost_equal(a.anom(),
+                            [[-2.5, -1.5, -0.5], [0.5, 1.5, 2.5]])
+        assert_almost_equal(a.anom(axis=0),
+                            [[-1.5, -1.5, -1.5], [1.5, 1.5, 1.5]])
+        assert_almost_equal(a.anom(axis=1),
+                            [[-1., 0., 1.], [-1., 0., 1.]])
+        a.mask = [[0, 0, 1], [0, 1, 0]]
+        mval = -99
+        assert_almost_equal(a.anom().filled(mval),
+                            [[-2.25, -1.25, mval], [0.75, mval, 2.75]])
+        assert_almost_equal(a.anom(axis=0).filled(mval),
+                            [[-1.5, 0.0, mval], [1.5, mval, 0.0]])
+        assert_almost_equal(a.anom(axis=1).filled(mval),
+                            [[-0.5, 0.5, mval], [-1.0, mval, 1.0]])
+
     def test_trace(self):
         # Tests trace on MaskedArrays.
         (x, X, XX, m, mx, mX, mXX, m2x, m2X, m2XX) = self.d
index 14f69737583f4655357d654bf55fbc3a580b594b..3e0e09fdd1c8832326acf85861d02b37e23f8b3a 100644 (file)
@@ -1,10 +1,13 @@
 """Test deprecation and future warnings.
 
 """
+import pytest
 import numpy as np
 from numpy.testing import assert_warns
 from numpy.ma.testutils import assert_equal
 from numpy.ma.core import MaskedArrayFutureWarning
+import io
+import textwrap
 
 class TestArgsort:
     """ gh-8701 """
@@ -66,3 +69,21 @@ class TestMinimumMaximum:
         result = ma_max(data1d)
         assert_equal(result, ma_max(data1d, axis=None))
         assert_equal(result, ma_max(data1d, axis=0))
+
+
+class TestFromtextfile:
+    def test_fromtextfile_delimitor(self):
+        # NumPy 1.22.0, 2021-09-23
+
+        textfile = io.StringIO(textwrap.dedent(
+            """
+            A,B,C,D
+            'string 1';1;1.0;'mixed column'
+            'string 2';2;2.0;
+            'string 3';3;3.0;123
+            'string 4';4;4.0;3.14
+            """
+        ))
+
+        with pytest.warns(DeprecationWarning):
+            result = np.ma.mrecords.fromtextfile(textfile, delimitor=';')
index 27df519d266a3f175b3b229c4ecd53af174f2ce2..4b2c01df9947306d8c5b2ac369e55f930a412b0b 100644 (file)
@@ -468,7 +468,7 @@ class TestMRecordsImport:
         with temppath() as path:
             with open(path, 'w') as f:
                 f.write(fcontent)
-            mrectxt = fromtextfile(path, delimitor=',', varnames='ABCDEFG')
+            mrectxt = fromtextfile(path, delimiter=',', varnames='ABCDEFG')
         assert_(isinstance(mrectxt, MaskedRecords))
         assert_equal(mrectxt.F, [1, 1, 1, 1])
         assert_equal(mrectxt.E._mask, [1, 1, 1, 1])
index ab003b94e584b2df5f286dbaee69ba2b6a43f6e1..2b3034f9cb2be642dd23ea65fa7aded55a702daa 100644 (file)
@@ -697,6 +697,22 @@ class TestMa:
         assert_equal(b[0].shape, ())
         assert_equal(b[1].shape, ())
 
+    def test_assignment_by_condition(self):
+        # Test for gh-18951
+        a = array([1, 2, 3, 4], mask=[1, 0, 1, 0])
+        c = a >= 3
+        a[c] = 5
+        assert_(a[2] is masked)
+
+    def test_assignment_by_condition_2(self):
+        # gh-19721
+        a = masked_array([0, 1], mask=[False, False])
+        b = masked_array([0, 1], mask=[True, True])
+        mask = a < 1
+        b[mask] = a[mask]
+        expected_mask = [False, True]
+        assert_equal(b.mask, expected_mask)
+
 
 class TestUfuncs:
     def setup(self):
index 1af5396252e9ad56ba79e18fde7f7172f1060557..83a9b2f5187ce3881aa8ac102c02f8303516a602 100644 (file)
@@ -343,3 +343,45 @@ class TestSubclassing:
         diff2 = arr1 - arr2
         assert_('info' in diff2._optinfo)
         assert_(diff2._optinfo['info'] == 'test')
+
+
+class ArrayNoInheritance:
+    """Quantity-like class that does not inherit from ndarray"""
+    def __init__(self, data, units):
+        self.magnitude = data
+        self.units = units
+
+    def __getattr__(self, attr):
+        return getattr(self.magnitude, attr)
+
+
+def test_array_no_inheritance():
+    data_masked = np.ma.array([1, 2, 3], mask=[True, False, True])
+    data_masked_units = ArrayNoInheritance(data_masked, 'meters')
+
+    # Get the masked representation of the Quantity-like class
+    new_array = np.ma.array(data_masked_units)
+    assert_equal(data_masked.data, new_array.data)
+    assert_equal(data_masked.mask, new_array.mask)
+    # Test sharing the mask
+    data_masked.mask = [True, False, False]
+    assert_equal(data_masked.mask, new_array.mask)
+    assert_(new_array.sharedmask)
+
+    # Get the masked representation of the Quantity-like class
+    new_array = np.ma.array(data_masked_units, copy=True)
+    assert_equal(data_masked.data, new_array.data)
+    assert_equal(data_masked.mask, new_array.mask)
+    # Test that the mask is not shared when copy=True
+    data_masked.mask = [True, False, True]
+    assert_equal([True, False, False], new_array.mask)
+    assert_(not new_array.sharedmask)
+
+    # Get the masked representation of the Quantity-like class
+    new_array = np.ma.array(data_masked_units, keep_mask=False)
+    assert_equal(data_masked.data, new_array.data)
+    # The change did not affect the original mask
+    assert_equal(data_masked.mask, [True, False, True])
+    # Test that the mask is False and not shared when keep_mask=False
+    assert_(not new_array.mask)
+    assert_(not new_array.sharedmask)
index e4b5c19a2bd052367728aae5444d64d5059a64b8..c1b82d2ecdb778aa233c5972a8271d684f037578 100644 (file)
@@ -1,11 +1,17 @@
-from typing import Any, List
+from typing import List
+
+from numpy._pytesttester import PytestTester
 
 from numpy import (
     matrix as matrix,
 )
 
-__all__: List[str]
+from numpy.matrixlib.defmatrix import (
+    bmat as bmat,
+    mat as mat,
+    asmatrix as asmatrix,
+)
 
-def bmat(obj, ldict=..., gdict=...): ...
-def asmatrix(data, dtype=...): ...
-mat = asmatrix
+__all__: List[str]
+__path__: List[str]
+test: PytestTester
diff --git a/numpy/matrixlib/defmatrix.pyi b/numpy/matrixlib/defmatrix.pyi
new file mode 100644 (file)
index 0000000..6c86ea1
--- /dev/null
@@ -0,0 +1,15 @@
+from typing import List, Any, Sequence, Mapping
+from numpy import matrix as matrix
+from numpy.typing import ArrayLike, DTypeLike, NDArray
+
+__all__: List[str]
+
+def bmat(
+    obj: str | Sequence[ArrayLike] | NDArray[Any],
+    ldict: None | Mapping[str, Any] = ...,
+    gdict: None | Mapping[str, Any] = ...,
+) -> matrix[Any, Any]: ...
+
+def asmatrix(data: ArrayLike, dtype: DTypeLike = ...) -> matrix[Any, Any]: ...
+
+mat = asmatrix
index 4b4361163b2e2f2592fa8e774c31bc2a73133c92..5a3addf4cd3d426e4221b26e7f69607b66384f8c 100644 (file)
@@ -164,7 +164,7 @@ def set_default_printstyle(style):
     1.0 + 2.0 x**1 + 3.0 x**2
     >>> print(c)
     1.0 + 2.0 T_1(x) + 3.0 T_2(x)
-    >>> # Formatting supercedes all class/package-level defaults
+    >>> # Formatting supersedes all class/package-level defaults
     >>> print(f"{p:unicode}")
     1.0 + 2.0·x¹ + 3.0·x²
     """
index bebedb3a69902c9b64ac3291ba8be303c9ab415f..e0cfedd7aae7791a009409474dad7cd67d5188e7 100644 (file)
@@ -1,5 +1,7 @@
 from typing import List
 
+from numpy._pytesttester import PytestTester
+
 from numpy.polynomial import (
     chebyshev as chebyshev,
     hermite as hermite,
@@ -16,5 +18,7 @@ from numpy.polynomial.legendre import Legendre as Legendre
 from numpy.polynomial.polynomial import Polynomial as Polynomial
 
 __all__: List[str]
+__path__: List[str]
+test: PytestTester
 
 def set_default_printstyle(style): ...
index b04b8e66b09c995b4d040905c165ee8384bc3ccb..155d7280591bad20090078721b9db32d6a18a601 100644 (file)
@@ -344,7 +344,7 @@ class ABCPolyBase(abc.ABC):
             # Polynomial coefficient
             # The coefficient array can be an object array with elements that
             # will raise a TypeError with >= 0 (e.g. strings or Python
-            # complex). In this case, represent the coeficient as-is.
+            # complex). In this case, represent the coefficient as-is.
             try:
                 if coef >= 0:
                     next_term = f"+ {coef}"
@@ -936,11 +936,11 @@ class ABCPolyBase(abc.ABC):
             diagnostic information from the singular value decomposition is
             also returned.
         w : array_like, shape (M,), optional
-            Weights. If not None the contribution of each point
-            ``(x[i],y[i])`` to the fit is weighted by ``w[i]``. Ideally the
-            weights are chosen so that the errors of the products
-            ``w[i]*y[i]`` all have the same variance.  The default value is
-            None.
+            Weights. If not None, the weight ``w[i]`` applies to the unsquared
+            residual ``y[i] - y_hat[i]`` at ``x[i]``. Ideally the weights are
+            chosen so that the errors of the products ``w[i]*y[i]`` all have
+            the same variance.  When using inverse-variance weighting, use
+            ``w[i] = 1/sigma(y[i])``.  The default value is None.
 
             .. versionadded:: 1.5.0
         window : {[beg, end]}, optional
@@ -958,12 +958,12 @@ class ABCPolyBase(abc.ABC):
             of interest, do ``new_series.convert().coef``.
 
         [resid, rank, sv, rcond] : list
-            These values are only returned if `full` = True
+            These values are only returned if ``full == True``
 
-            resid -- sum of squared residuals of the least squares fit
-            rank -- the numerical rank of the scaled Vandermonde matrix
-            sv -- singular values of the scaled Vandermonde matrix
-            rcond -- value of `rcond`.
+            resid -- sum of squared residuals of the least squares fit
+            rank -- the numerical rank of the scaled Vandermonde matrix
+            sv -- singular values of the scaled Vandermonde matrix
+            rcond -- value of `rcond`.
 
             For more details, see `linalg.lstsq`.
 
index d24fc738fcf472840810b486ecead2accf732e59..89ce815d571e815f7ada7141f05ad27920e0980d 100644 (file)
@@ -88,13 +88,13 @@ Notes
 The implementations of multiplication, division, integration, and
 differentiation use the algebraic identities [1]_:
 
-.. math ::
+.. math::
     T_n(x) = \\frac{z^n + z^{-n}}{2} \\\\
     z\\frac{dx}{dz} = \\frac{z - z^{-1}}{2}.
 
 where
 
-.. math :: x = \\frac{z + z^{-1}}{2}.
+.. math:: x = \\frac{z + z^{-1}}{2}.
 
 These identities allow a Chebyshev series to be expressed as a finite,
 symmetric Laurent series.  In this module, this sort of Laurent series
@@ -131,9 +131,9 @@ chebtrim = pu.trimcoef
 #
 
 def _cseries_to_zseries(c):
-    """Covert Chebyshev series to z-series.
+    """Convert Chebyshev series to z-series.
 
-    Covert a Chebyshev series to the equivalent z-series. The result is
+    Convert a Chebyshev series to the equivalent z-series. The result is
     never an empty array. The dtype of the return is the same as that of
     the input. No checks are run on the arguments as this routine is for
     internal use.
@@ -156,9 +156,9 @@ def _cseries_to_zseries(c):
 
 
 def _zseries_to_cseries(zs):
-    """Covert z-series to a Chebyshev series.
+    """Convert z-series to a Chebyshev series.
 
-    Covert a z series to the equivalent Chebyshev series. The result is
+    Convert a z series to the equivalent Chebyshev series. The result is
     never an empty array. The dtype of the return is the same as that of
     the input. No checks are run on the arguments as this routine is for
     internal use.
@@ -1582,10 +1582,11 @@ def chebfit(x, y, deg, rcond=None, full=False, w=None):
         default) just the coefficients are returned, when True diagnostic
         information from the singular value decomposition is also returned.
     w : array_like, shape (`M`,), optional
-        Weights. If not None, the contribution of each point
-        ``(x[i],y[i])`` to the fit is weighted by ``w[i]``. Ideally the
-        weights are chosen so that the errors of the products ``w[i]*y[i]``
-        all have the same variance.  The default value is None.
+        Weights. If not None, the weight ``w[i]`` applies to the unsquared
+        residual ``y[i] - y_hat[i]`` at ``x[i]``. Ideally the weights are
+        chosen so that the errors of the products ``w[i]*y[i]`` all have the
+        same variance.  When using inverse-variance weighting, use
+        ``w[i] = 1/sigma(y[i])``.  The default value is None.
 
         .. versionadded:: 1.5.0
 
@@ -1597,12 +1598,12 @@ def chebfit(x, y, deg, rcond=None, full=False, w=None):
         `k`.
 
     [residuals, rank, singular_values, rcond] : list
-        These values are only returned if `full` = True
+        These values are only returned if ``full == True``
 
-        resid -- sum of squared residuals of the least squares fit
-        rank -- the numerical rank of the scaled Vandermonde matrix
-        sv -- singular values of the scaled Vandermonde matrix
-        rcond -- value of `rcond`.
+        - residuals -- sum of squared residuals of the least squares fit
+        rank -- the numerical rank of the scaled Vandermonde matrix
+        - singular_values -- singular values of the scaled Vandermonde matrix
+        rcond -- value of `rcond`.
 
         For more details, see `numpy.linalg.lstsq`.
 
@@ -1610,7 +1611,7 @@ def chebfit(x, y, deg, rcond=None, full=False, w=None):
     -----
     RankWarning
         The rank of the coefficient matrix in the least-squares fit is
-        deficient. The warning is only raised if `full` = False.  The
+        deficient. The warning is only raised if ``full == False``.  The
         warnings can be turned off by
 
         >>> import warnings
index eef5c25b225ef63ca37c146a1057296c0c00dc30..9b0735a9aad34ed14877e95bb94703d45e12e70d 100644 (file)
@@ -419,7 +419,7 @@ def hermmulx(c):
 
     .. math::
 
-    xP_i(x) = (P_{i + 1}(x)/2 + i*P_{i - 1}(x))
+        xP_i(x) = (P_{i + 1}(x)/2 + i*P_{i - 1}(x))
 
     Examples
     --------
@@ -1310,10 +1310,11 @@ def hermfit(x, y, deg, rcond=None, full=False, w=None):
         default) just the coefficients are returned, when True diagnostic
         information from the singular value decomposition is also returned.
     w : array_like, shape (`M`,), optional
-        Weights. If not None, the contribution of each point
-        ``(x[i],y[i])`` to the fit is weighted by ``w[i]``. Ideally the
-        weights are chosen so that the errors of the products ``w[i]*y[i]``
-        all have the same variance.  The default value is None.
+        Weights. If not None, the weight ``w[i]`` applies to the unsquared
+        residual ``y[i] - y_hat[i]`` at ``x[i]``. Ideally the weights are
+        chosen so that the errors of the products ``w[i]*y[i]`` all have the
+        same variance.  When using inverse-variance weighting, use
+        ``w[i] = 1/sigma(y[i])``.  The default value is None.
 
     Returns
     -------
@@ -1323,12 +1324,12 @@ def hermfit(x, y, deg, rcond=None, full=False, w=None):
         `k`.
 
     [residuals, rank, singular_values, rcond] : list
-        These values are only returned if `full` = True
+        These values are only returned if ``full == True``
 
-        resid -- sum of squared residuals of the least squares fit
-        rank -- the numerical rank of the scaled Vandermonde matrix
-        sv -- singular values of the scaled Vandermonde matrix
-        rcond -- value of `rcond`.
+        - residuals -- sum of squared residuals of the least squares fit
+        rank -- the numerical rank of the scaled Vandermonde matrix
+        - singular_values -- singular values of the scaled Vandermonde matrix
+        rcond -- value of `rcond`.
 
         For more details, see `numpy.linalg.lstsq`.
 
@@ -1336,7 +1337,7 @@ def hermfit(x, y, deg, rcond=None, full=False, w=None):
     -----
     RankWarning
         The rank of the coefficient matrix in the least-squares fit is
-        deficient. The warning is only raised if `full` = False.  The
+        deficient. The warning is only raised if ``full == False``.  The
         warnings can be turned off by
 
         >>> import warnings
index 05d1337b0b335238463b3555692cdf7ea78254c1..182c562c296295aa7c8731bdfbc3a81de18a54e8 100644 (file)
@@ -414,7 +414,7 @@ def hermemulx(c):
 
     .. math::
 
-    xP_i(x) = (P_{i + 1}(x) + iP_{i - 1}(x)))
+        xP_i(x) = (P_{i + 1}(x) + iP_{i - 1}(x)))
 
     Examples
     --------
@@ -1301,10 +1301,11 @@ def hermefit(x, y, deg, rcond=None, full=False, w=None):
         default) just the coefficients are returned, when True diagnostic
         information from the singular value decomposition is also returned.
     w : array_like, shape (`M`,), optional
-        Weights. If not None, the contribution of each point
-        ``(x[i],y[i])`` to the fit is weighted by ``w[i]``. Ideally the
-        weights are chosen so that the errors of the products ``w[i]*y[i]``
-        all have the same variance.  The default value is None.
+        Weights. If not None, the weight ``w[i]`` applies to the unsquared
+        residual ``y[i] - y_hat[i]`` at ``x[i]``. Ideally the weights are
+        chosen so that the errors of the products ``w[i]*y[i]`` all have the
+        same variance.  When using inverse-variance weighting, use
+        ``w[i] = 1/sigma(y[i])``.  The default value is None.
 
     Returns
     -------
@@ -1314,12 +1315,12 @@ def hermefit(x, y, deg, rcond=None, full=False, w=None):
         `k`.
 
     [residuals, rank, singular_values, rcond] : list
-        These values are only returned if `full` = True
+        These values are only returned if ``full == True``
 
-        resid -- sum of squared residuals of the least squares fit
-        rank -- the numerical rank of the scaled Vandermonde matrix
-        sv -- singular values of the scaled Vandermonde matrix
-        rcond -- value of `rcond`.
+        - residuals -- sum of squared residuals of the least squares fit
+        rank -- the numerical rank of the scaled Vandermonde matrix
+        - singular_values -- singular values of the scaled Vandermonde matrix
+        rcond -- value of `rcond`.
 
         For more details, see `numpy.linalg.lstsq`.
 
@@ -1327,7 +1328,7 @@ def hermefit(x, y, deg, rcond=None, full=False, w=None):
     -----
     RankWarning
         The rank of the coefficient matrix in the least-squares fit is
-        deficient. The warning is only raised if `full` = False.  The
+        deficient. The warning is only raised if ``full = False``.  The
         warnings can be turned off by
 
         >>> import warnings
index 69d55751087d2fb08d2bc12e88007312ae17e3a7..d9ca373ddd5cdc3800302898ecb8e26515700850 100644 (file)
@@ -414,7 +414,7 @@ def lagmulx(c):
 
     .. math::
 
-    xP_i(x) = (-(i + 1)*P_{i + 1}(x) + (2i + 1)P_{i}(x) - iP_{i - 1}(x))
+        xP_i(x) = (-(i + 1)*P_{i + 1}(x) + (2i + 1)P_{i}(x) - iP_{i - 1}(x))
 
     Examples
     --------
@@ -1030,7 +1030,7 @@ def lagval3d(x, y, z, c):
     Returns
     -------
     values : ndarray, compatible object
-        The values of the multidimension polynomial on points formed with
+        The values of the multidimensional polynomial on points formed with
         triples of corresponding values from `x`, `y`, and `z`.
 
     See Also
@@ -1307,10 +1307,11 @@ def lagfit(x, y, deg, rcond=None, full=False, w=None):
         default) just the coefficients are returned, when True diagnostic
         information from the singular value decomposition is also returned.
     w : array_like, shape (`M`,), optional
-        Weights. If not None, the contribution of each point
-        ``(x[i],y[i])`` to the fit is weighted by ``w[i]``. Ideally the
-        weights are chosen so that the errors of the products ``w[i]*y[i]``
-        all have the same variance.  The default value is None.
+        Weights. If not None, the weight ``w[i]`` applies to the unsquared
+        residual ``y[i] - y_hat[i]`` at ``x[i]``. Ideally the weights are
+        chosen so that the errors of the products ``w[i]*y[i]`` all have the
+        same variance.  When using inverse-variance weighting, use
+        ``w[i] = 1/sigma(y[i])``.  The default value is None.
 
     Returns
     -------
@@ -1320,12 +1321,12 @@ def lagfit(x, y, deg, rcond=None, full=False, w=None):
         `k`.
 
     [residuals, rank, singular_values, rcond] : list
-        These values are only returned if `full` = True
+        These values are only returned if ``full == True``
 
-        resid -- sum of squared residuals of the least squares fit
-        rank -- the numerical rank of the scaled Vandermonde matrix
-        sv -- singular values of the scaled Vandermonde matrix
-        rcond -- value of `rcond`.
+        - residuals -- sum of squared residuals of the least squares fit
+        rank -- the numerical rank of the scaled Vandermonde matrix
+        - singular_values -- singular values of the scaled Vandermonde matrix
+        rcond -- value of `rcond`.
 
         For more details, see `numpy.linalg.lstsq`.
 
@@ -1333,7 +1334,7 @@ def lagfit(x, y, deg, rcond=None, full=False, w=None):
     -----
     RankWarning
         The rank of the coefficient matrix in the least-squares fit is
-        deficient. The warning is only raised if `full` = False.  The
+        deficient. The warning is only raised if ``full == False``.  The
         warnings can be turned off by
 
         >>> import warnings
index cd4da2a79e75b4690cb9c7c43a78f6c954d08c87..2e8052e7c00767182aaae48a7961e6b00202210a 100644 (file)
@@ -425,7 +425,7 @@ def legmulx(c):
 
     See Also
     --------
-    legadd, legmul, legmul, legdiv, legpow
+    legadd, legmul, legdiv, legpow
 
     Notes
     -----
@@ -1321,10 +1321,11 @@ def legfit(x, y, deg, rcond=None, full=False, w=None):
         default) just the coefficients are returned, when True diagnostic
         information from the singular value decomposition is also returned.
     w : array_like, shape (`M`,), optional
-        Weights. If not None, the contribution of each point
-        ``(x[i],y[i])`` to the fit is weighted by ``w[i]``. Ideally the
-        weights are chosen so that the errors of the products ``w[i]*y[i]``
-        all have the same variance.  The default value is None.
+        Weights. If not None, the weight ``w[i]`` applies to the unsquared
+        residual ``y[i] - y_hat[i]`` at ``x[i]``. Ideally the weights are
+        chosen so that the errors of the products ``w[i]*y[i]`` all have the
+        same variance.  When using inverse-variance weighting, use
+        ``w[i] = 1/sigma(y[i])``.  The default value is None.
 
         .. versionadded:: 1.5.0
 
@@ -1338,12 +1339,12 @@ def legfit(x, y, deg, rcond=None, full=False, w=None):
         returned `coef`.
 
     [residuals, rank, singular_values, rcond] : list
-        These values are only returned if `full` = True
+        These values are only returned if ``full == True``
 
-        resid -- sum of squared residuals of the least squares fit
-        rank -- the numerical rank of the scaled Vandermonde matrix
-        sv -- singular values of the scaled Vandermonde matrix
-        rcond -- value of `rcond`.
+        - residuals -- sum of squared residuals of the least squares fit
+        rank -- the numerical rank of the scaled Vandermonde matrix
+        - singular_values -- singular values of the scaled Vandermonde matrix
+        rcond -- value of `rcond`.
 
         For more details, see `numpy.linalg.lstsq`.
 
@@ -1351,7 +1352,7 @@ def legfit(x, y, deg, rcond=None, full=False, w=None):
     -----
     RankWarning
         The rank of the coefficient matrix in the least-squares fit is
-        deficient. The warning is only raised if `full` = False.  The
+        deficient. The warning is only raised if ``full == False``.  The
         warnings can be turned off by
 
         >>> import warnings
index 940eed5e38d515c90efc2a288eda6e7a43f09eef..3c2663b6cc9587fd9551f636cf3a40396be06058 100644 (file)
@@ -1252,10 +1252,11 @@ def polyfit(x, y, deg, rcond=None, full=False, w=None):
         diagnostic information from the singular value decomposition (used
         to solve the fit's matrix equation) is also returned.
     w : array_like, shape (`M`,), optional
-        Weights. If not None, the contribution of each point
-        ``(x[i],y[i])`` to the fit is weighted by ``w[i]``. Ideally the
-        weights are chosen so that the errors of the products ``w[i]*y[i]``
-        all have the same variance.  The default value is None.
+        Weights. If not None, the weight ``w[i]`` applies to the unsquared
+        residual ``y[i] - y_hat[i]`` at ``x[i]``. Ideally the weights are
+        chosen so that the errors of the products ``w[i]*y[i]`` all have the
+        same variance.  When using inverse-variance weighting, use
+        ``w[i] = 1/sigma(y[i])``.  The default value is None.
 
         .. versionadded:: 1.5.0
 
@@ -1267,12 +1268,12 @@ def polyfit(x, y, deg, rcond=None, full=False, w=None):
         fit to the data in `y`'s `k`-th column.
 
     [residuals, rank, singular_values, rcond] : list
-        These values are only returned if `full` = True
+        These values are only returned if ``full == True``
 
-        resid -- sum of squared residuals of the least squares fit
-        rank -- the numerical rank of the scaled Vandermonde matrix
-        sv -- singular values of the scaled Vandermonde matrix
-        rcond -- value of `rcond`.
+        - residuals -- sum of squared residuals of the least squares fit
+        rank -- the numerical rank of the scaled Vandermonde matrix
+        - singular_values -- singular values of the scaled Vandermonde matrix
+        rcond -- value of `rcond`.
 
         For more details, see `numpy.linalg.lstsq`.
 
@@ -1280,7 +1281,7 @@ def polyfit(x, y, deg, rcond=None, full=False, w=None):
     ------
     RankWarning
         Raised if the matrix in the least-squares fit is rank deficient.
-        The warning is only raised if `full` == False.  The warnings can
+        The warning is only raised if ``full == False``.  The warnings can
         be turned off by:
 
         >>> import warnings
@@ -1303,12 +1304,12 @@ def polyfit(x, y, deg, rcond=None, full=False, w=None):
     The solution is the coefficients of the polynomial `p` that minimizes
     the sum of the weighted squared errors
 
-    .. math :: E = \\sum_j w_j^2 * |y_j - p(x_j)|^2,
+    .. math:: E = \\sum_j w_j^2 * |y_j - p(x_j)|^2,
 
     where the :math:`w_j` are the weights. This problem is solved by
     setting up the (typically) over-determined matrix equation:
 
-    .. math :: V(x) * c = w * y,
+    .. math:: V(x) * c = w * y,
 
     where `V` is the weighted pseudo Vandermonde matrix of `x`, `c` are the
     coefficients to be solved for, `w` are the weights, and `y` are the
index 3b0f0a9e57ee6a69c3b65f25c7b8cc1d28d80690..a2bc75a4d33125c2d0b7910f5823e029644dceec 100644 (file)
@@ -330,12 +330,12 @@ def mapdomain(x, old, new):
     -----
     Effectively, this implements:
 
-    .. math ::
+    .. math::
         x\\_out = new[0] + m(x - old[0])
 
     where
 
-    .. math ::
+    .. math::
         m = \\frac{new[1]-new[0]}{old[1]-old[0]}
 
     Examples
index 8e71a19459bca2074c7e60af33aef6561aad6929..6322062f29ece2f52754ac7aedf2591b3a983709 100644 (file)
@@ -597,4 +597,4 @@ class TestInterpolate:
         for deg in range(0, 10):
             for t in range(0, deg + 1):
                 p = Chebyshev.interpolate(powx, deg, domain=[0, 2], args=(t,))
-                assert_almost_equal(p(x), powx(x, t), decimal=12)
+                assert_almost_equal(p(x), powx(x, t), decimal=11)
index 48b620c48b928c29b0a56948f7fa04ea346c384d..bf6147697b2d286a55c2236d3e747d797850579a 100644 (file)
@@ -1,5 +1,7 @@
 from typing import List
 
+from numpy._pytesttester import PytestTester
+
 from numpy.random._generator import Generator as Generator
 from numpy.random._generator import default_rng as default_rng
 from numpy.random._mt19937 import MT19937 as MT19937
@@ -66,3 +68,5 @@ from numpy.random.mtrand import (
 )
 
 __all__: List[str]
+__path__: List[str]
+test: PytestTester
index 7e0dd3e057a66c5a9573f689f4950e8ff0a7be4f..f41150fdb2fee073b2270b8a9e75193fc57ee111 100644 (file)
@@ -4,6 +4,7 @@ Build the Cython demonstrations of low-level access to NumPy random
 
 Usage: python setup.py build_ext -i
 """
+import setuptools  # triggers monkeypatching distutils
 from distutils.core import setup
 from os.path import dirname, join, abspath
 
index 14dc5513174d36a192e2b7b26c98f6acc9a5e27e..c574bef9a5cbdc51aa0295b6a8c03c906c184d77 100644 (file)
@@ -1,5 +1,4 @@
-import sys
-from typing import Any, Callable, Dict, Optional, Tuple, Type, Union, overload, TypeVar
+from typing import Any, Callable, Dict, Optional, Tuple, Type, Union, overload, TypeVar, Literal
 
 from numpy import (
     bool_,
@@ -44,11 +43,6 @@ from numpy.typing import (
     _UIntCodes,
 )
 
-if sys.version_info >= (3, 8):
-    from typing import Literal
-else:
-    from typing_extensions import Literal
-
 _ArrayType = TypeVar("_ArrayType", bound=ndarray[Any, Any])
 
 _DTypeLikeFloat32 = Union[
@@ -629,7 +623,9 @@ class Generator:
         method: Literal["svd", "eigh", "cholesky"] = ...,
     ) -> ndarray[Any, dtype[float64]]: ...
     def multinomial(
-        self, n: _ArrayLikeInt_co, pvals: _ArrayLikeFloat_co, size: Optional[_ShapeLike] = ...
+        self, n: _ArrayLikeInt_co,
+            pvals: _ArrayLikeFloat_co,
+            size: Optional[_ShapeLike] = ...
     ) -> ndarray[Any, dtype[int64]]: ...
     def multivariate_hypergeometric(
         self,
index e2430d139a42b1c3d3cc956193cd68828b81c594..391987a1ecd34b15b38a9d38b3b20f9e1e07b140 100644 (file)
@@ -561,7 +561,7 @@ cdef class Generator:
             raise TypeError('Unsupported dtype %r for integers' % _dtype)
 
 
-        if size is None and dtype in (bool, int, np.compat.long):
+        if size is None and dtype in (bool, int):
             if np.array(ret).shape == ():
                 return dtype(ret)
         return ret
@@ -876,8 +876,10 @@ cdef class Generator:
             greater than or equal to low.  The default value is 0.
         high : float or array_like of floats
             Upper boundary of the output interval.  All values generated will be
-            less than high.  high - low must be non-negative.  The default value
-            is 1.0.
+            less than high.  The high limit may be included in the returned array of 
+            floats due to floating-point rounding in the equation 
+            ``low + (high-low) * random_sample()``.  high - low must be 
+            non-negative.  The default value is 1.0.
         size : int or tuple of ints, optional
             Output shape.  If the given shape is, e.g., ``(m, n, k)``, then
             ``m * n * k`` samples are drawn.  If size is ``None`` (default),
@@ -2095,7 +2097,7 @@ cdef class Generator:
         Raises
         ------
         ValueError
-            If a < 1.
+            If a <= 0.
 
         Notes
         -----
@@ -3105,7 +3107,7 @@ cdef class Generator:
         `a` > 1.
 
         The Zipf distribution (also known as the zeta distribution) is a
-        continuous probability distribution that satisfies Zipf's law: the
+        discrete probability distribution that satisfies Zipf's law: the
         frequency of an item is inversely proportional to its rank in a
         frequency table.
 
@@ -3133,9 +3135,10 @@ cdef class Generator:
         -----
         The probability density for the Zipf distribution is
 
-        .. math:: p(x) = \\frac{x^{-a}}{\\zeta(a)},
+        .. math:: p(k) = \\frac{k^{-a}}{\\zeta(a)},
 
-        where :math:`\\zeta` is the Riemann Zeta function.
+        for integers :math:`k \geq 1`, where :math:`\\zeta` is the Riemann Zeta
+        function.
 
         It is named for the American linguist George Kingsley Zipf, who noted
         that the frequency of any word in a sample of a language is inversely
@@ -3151,22 +3154,29 @@ cdef class Generator:
         --------
         Draw samples from the distribution:
 
-        >>> a = 2. # parameter
-        >>> s = np.random.default_rng().zipf(a, 1000)
+        >>> a = 4.0
+        >>> n = 20000
+        >>> s = np.random.default_rng().zipf(a, size=n)
 
         Display the histogram of the samples, along with
-        the probability density function:
+        the expected histogram based on the probability
+        density function:
 
         >>> import matplotlib.pyplot as plt
-        >>> from scipy import special  # doctest: +SKIP
+        >>> from scipy.special import zeta  # doctest: +SKIP
+
+        `bincount` provides a fast histogram for small integers.
 
-        Truncate s values at 50 so plot is interesting:
+        >>> count = np.bincount(s)
+        >>> k = np.arange(1, s.max() + 1)
 
-        >>> count, bins, ignored = plt.hist(s[s<50],
-        ...         50, density=True)
-        >>> x = np.arange(1., 50.)
-        >>> y = x**(-a) / special.zetac(a)  # doctest: +SKIP
-        >>> plt.plot(x, y/max(y), linewidth=2, color='r')  # doctest: +SKIP
+        >>> plt.bar(k, count[1:], alpha=0.5, label='sample count')
+        >>> plt.plot(k, n*(k**-a)/zeta(a), 'k.-', alpha=0.5,
+        ...          label='expected count')   # doctest: +SKIP
+        >>> plt.semilogy()
+        >>> plt.grid(alpha=0.4)
+        >>> plt.legend()
+        >>> plt.title(f'Zipf sample, a={a}, size={n}')
         >>> plt.show()
 
         """
@@ -3557,6 +3567,7 @@ cdef class Generator:
         (3, 3, 2)
 
         We can use a different method other than the default to factorize cov:
+
         >>> y = rng.multivariate_normal(mean, cov, (3, 3), method='cholesky')
         >>> y.shape
         (3, 3, 2)
@@ -3624,7 +3635,7 @@ cdef class Generator:
             from numpy.linalg import cholesky
             l = cholesky(cov)
 
-        # make sure check_valid is ignored whe method == 'cholesky'
+        # make sure check_valid is ignored when method == 'cholesky'
         # since the decomposition will have failed if cov is not valid.
         if check_valid != 'ignore' and method != 'cholesky':
             if check_valid != 'warn' and check_valid != 'raise':
@@ -3673,24 +3684,35 @@ cdef class Generator:
         ----------
         n : int or array-like of ints
             Number of experiments.
-        pvals : sequence of floats, length p
-            Probabilities of each of the ``p`` different outcomes.  These
-            must sum to 1 (however, the last element is always assumed to
-            account for the remaining probability, as long as
-            ``sum(pvals[:-1]) <= 1)``.
+        pvals : array-like of floats
+            Probabilities of each of the ``p`` different outcomes with shape
+            ``(k0, k1, ..., kn, p)``. Each element ``pvals[i,j,...,:]`` must
+            sum to 1 (however, the last element is always assumed to account
+            for the remaining probability, as long as
+            ``sum(pvals[..., :-1], axis=-1) <= 1.0``. Must have at least 1
+            dimension where pvals.shape[-1] > 0.
         size : int or tuple of ints, optional
             Output shape.  If the given shape is, e.g., ``(m, n, k)``, then
-            ``m * n * k`` samples are drawn.  Default is None, in which case a
-            single value is returned.
+            ``m * n * k`` samples are drawn each with ``p`` elements. Default
+            is None where the output size is determined by the broadcast shape
+            of ``n`` and all by the final dimension of ``pvals``, which is
+            denoted as ``b=(b0, b1, ..., bq)``. If size is not None, then it
+            must be compatible with the broadcast shape ``b``. Specifically,
+            size must have ``q`` or more elements and size[-(q-j):] must equal
+            ``bj``.
 
         Returns
         -------
         out : ndarray
-            The drawn samples, of shape *size*, if that was provided.  If not,
-            the shape is ``(N,)``.
+            The drawn samples, of shape size, if provided. When size is
+            provided, the output shape is size + (p,)  If not specified,
+            the shape is determined by the broadcast shape of ``n`` and
+            ``pvals``, ``(b0, b1, ..., bq)`` augmented with the dimension of
+            the multinomial, ``p``, so that that output shape is
+            ``(b0, b1, ..., bq, p)``.
 
-            In other words, each entry ``out[i,j,...,:]`` is an N-dimensional
-            value drawn from the distribution.
+            Each entry ``out[i,j,...,:]`` is a ``p``-dimensional value drawn
+            from the distribution.
 
         Examples
         --------
@@ -3728,6 +3750,38 @@ cdef class Generator:
         >>> rng.multinomial(100, [1/7.]*5 + [2/7.])
         array([11, 16, 14, 17, 16, 26])  # random
 
+        Simulate 10 throws of a 4-sided die and 20 throws of a 6-sided die
+
+        >>> rng.multinomial([10, 20],[[1/4]*4 + [0]*2, [1/6]*6])
+        array([[2, 1, 4, 3, 0, 0],
+               [3, 3, 3, 6, 1, 4]], dtype=int64)  # random
+
+        Generate categorical random variates from two categories where the
+        first has 3 outcomes and the second has 2.
+
+        >>> rng.multinomial(1, [[.1, .5, .4 ], [.3, .7, .0]])
+        array([[0, 0, 1],
+               [0, 1, 0]], dtype=int64)  # random
+
+        ``argmax(axis=-1)`` is then used to return the categories.
+
+        >>> pvals = [[.1, .5, .4 ], [.3, .7, .0]]
+        >>> rvs = rng.multinomial(1, pvals, size=(4,2))
+        >>> rvs.argmax(axis=-1)
+        array([[0, 1],
+               [2, 0],
+               [2, 1],
+               [2, 0]], dtype=int64)  # random
+
+        The same output dimension can be produced using broadcasting.
+
+        >>> rvs = rng.multinomial([[1]] * 4, pvals)
+        >>> rvs.argmax(axis=-1)
+        array([[0, 1],
+               [2, 0],
+               [2, 1],
+               [2, 0]], dtype=int64)  # random
+
         The probability inputs should be normalized. As an implementation
         detail, the value of the last entry is ignored and assumed to take
         up any leftover probability mass, but this should not be relied on.
@@ -3742,47 +3796,82 @@ cdef class Generator:
         >>> rng.multinomial(100, [1.0, 2.0])  # WRONG
         Traceback (most recent call last):
         ValueError: pvals < 0, pvals > 1 or pvals contains NaNs
-
         """
 
-        cdef np.npy_intp d, i, sz, offset
+        cdef np.npy_intp d, i, sz, offset, pi
         cdef np.ndarray parr, mnarr, on, temp_arr
         cdef double *pix
+        cdef int ndim
         cdef int64_t *mnix
         cdef int64_t ni
         cdef np.broadcast it
+        on = <np.ndarray>np.PyArray_FROM_OTF(n,
+                                             np.NPY_INT64,
+                                             np.NPY_ARRAY_ALIGNED |
+                                             np.NPY_ARRAY_C_CONTIGUOUS)
+        parr = <np.ndarray>np.PyArray_FROM_OTF(pvals,
+                                               np.NPY_DOUBLE,
+                                               np.NPY_ARRAY_ALIGNED |
+                                               np.NPY_ARRAY_C_CONTIGUOUS)
+        ndim = parr.ndim
+        d = parr.shape[ndim - 1] if ndim >= 1 else 0
+        if d == 0:
+            raise ValueError(
+                "pvals must have at least 1 dimension and the last dimension "
+                "of pvals must be greater than 0."
+            )
 
-        d = len(pvals)
-        on = <np.ndarray>np.PyArray_FROM_OTF(n, np.NPY_INT64, np.NPY_ALIGNED)
-        parr = <np.ndarray>np.PyArray_FROMANY(
-            pvals, np.NPY_DOUBLE, 1, 1, np.NPY_ARRAY_ALIGNED | np.NPY_ARRAY_C_CONTIGUOUS)
-        pix = <double*>np.PyArray_DATA(parr)
         check_array_constraint(parr, 'pvals', CONS_BOUNDED_0_1)
-        if kahan_sum(pix, d-1) > (1.0 + 1e-12):
-            # When floating, but not float dtype, and close, improve the error
-            # 1.0001 works for float16 and float32
-            if (isinstance(pvals, np.ndarray)
-                    and np.issubdtype(pvals.dtype, np.floating)
-                    and pvals.dtype != float
-                    and pvals.sum() < 1.0001):
-                msg = ("sum(pvals[:-1].astype(np.float64)) > 1.0. The pvals "
-                       "array is cast to 64-bit floating point prior to "
-                       "checking the sum. Precision changes when casting may "
-                       "cause problems even if the sum of the original pvals "
-                       "is valid.")
-            else:
-                msg = "sum(pvals[:-1]) > 1.0"
-            raise ValueError(msg)
+        pix = <double*>np.PyArray_DATA(parr)
+        sz = np.PyArray_SIZE(parr)
+        # Cython 0.29.20 would not correctly translate the range-based for
+        # loop to a C for loop
+        # for offset in range(<np.npy_intp>0, sz, d):
+        offset = 0
+        while offset < sz:
+            if kahan_sum(pix + offset, d-1) > (1.0 + 1e-12):
+                # When floating, but not float dtype, and close, improve the error
+                # 1.0001 works for float16 and float32
+                slice_repr = "[:-1]" if ndim == 1 else "[...,:-1]"
+                if (isinstance(pvals, np.ndarray)
+                        and np.issubdtype(pvals.dtype, np.floating)
+                        and pvals.dtype != float
+                        and pvals.sum() < 1.0001):
+                    msg = (f"sum(pvals{slice_repr}.astype(np.float64)) > 1.0."
+                           " The pvals array is cast to 64-bit floating"
+                           " point prior to checking the sum. Precision "
+                           "changes when casting may cause problems even "
+                           "if the sum of the original pvals is valid.")
+                else:
+                    msg = f"sum(pvals{slice_repr}) > 1.0"
+                raise ValueError(msg)
+            offset += d
 
-        if np.PyArray_NDIM(on) != 0: # vector
+        if np.PyArray_NDIM(on) != 0 or ndim > 1: # vector
             check_array_constraint(on, 'n', CONS_NON_NEGATIVE)
+            # This provides the offsets to use in the C-contig parr when
+            # broadcasting
+            offsets = <np.ndarray>np.arange(
+                0, np.PyArray_SIZE(parr), d, dtype=np.intp
+            ).reshape((<object>parr).shape[:ndim - 1])
             if size is None:
-                it = np.PyArray_MultiIterNew1(on)
+                it = np.PyArray_MultiIterNew2(on, offsets)
             else:
                 temp = np.empty(size, dtype=np.int8)
                 temp_arr = <np.ndarray>temp
-                it = np.PyArray_MultiIterNew2(on, temp_arr)
-                validate_output_shape(it.shape, temp_arr)
+                it = np.PyArray_MultiIterNew3(on, offsets, temp_arr)
+                # Validate size and the broadcast shape
+                try:
+                    size = (operator.index(size),)
+                except:
+                    size = tuple(size)
+                # This test verifies that an axis with dim 1 in size has not
+                # been increased by broadcasting with the input
+                if it.shape != size:
+                    raise ValueError(
+                        f"Output size {size} is not compatible with "
+                        f"broadcast dimensions of inputs {it.shape}."
+                    )
             shape = it.shape + (d,)
             multin = np.zeros(shape, dtype=np.int64)
             mnarr = <np.ndarray>multin
@@ -3792,7 +3881,8 @@ cdef class Generator:
             with self.lock, nogil:
                 for i in range(sz):
                     ni = (<int64_t*>np.PyArray_MultiIter_DATA(it, 0))[0]
-                    random_multinomial(&self._bitgen, ni, &mnix[offset], pix, d, &self._binomial)
+                    pi = (<np.npy_intp*>np.PyArray_MultiIter_DATA(it, 1))[0]
+                    random_multinomial(&self._bitgen, ni, &mnix[offset], &pix[pi], d, &self._binomial)
                     offset += d
                     np.PyArray_MultiIter_NEXT(it)
             return multin
@@ -4441,7 +4531,7 @@ cdef class Generator:
             # Fast, statically typed path: shuffle the underlying buffer.
             # Only for non-empty, 1d objects of class ndarray (subclasses such
             # as MaskedArrays may not support this approach).
-            x_ptr = <char*><size_t>np.PyArray_DATA(x)
+            x_ptr = np.PyArray_BYTES(x)
             stride = x.strides[0]
             itemsize = x.dtype.itemsize
             # As the array x could contain python objects we use a buffer
@@ -4449,7 +4539,7 @@ cdef class Generator:
             # within the buffer and erroneously decrementing it's refcount
             # when the function exits.
             buf = np.empty(itemsize, dtype=np.int8)  # GC'd at function exit
-            buf_ptr = <char*><size_t>np.PyArray_DATA(buf)
+            buf_ptr = np.PyArray_BYTES(buf)
             if x.dtype.hasobject:
                 with self.lock:
                     _shuffle_raw_wrap(&self._bitgen, n, 1, itemsize, stride,
index 1b8bacdae4ebe8e6f9d00f7956776a1597266195..820f27392f0f10dea80fe5d2f529f3a2da5f6fcb 100644 (file)
@@ -1,15 +1,9 @@
-import sys
-from typing import Any, Union
+from typing import Any, Union, TypedDict
 
 from numpy import dtype, ndarray, uint32
 from numpy.random.bit_generator import BitGenerator, SeedSequence
 from numpy.typing import _ArrayLikeInt_co
 
-if sys.version_info >= (3, 8):
-    from typing import TypedDict
-else:
-    from typing_extensions import TypedDict
-
 class _MT19937Internal(TypedDict):
     key: ndarray[Any, dtype[uint32]]
     pos: int
index 25e2fdde602d935537ed5ab7daac140dd9752ca6..4881a987e2a79e90a79653e95eedd55d424b3db8 100644 (file)
@@ -1,14 +1,8 @@
-import sys
-from typing import Union
+from typing import Union, TypedDict
 
 from numpy.random.bit_generator import BitGenerator, SeedSequence
 from numpy.typing import _ArrayLikeInt_co
 
-if sys.version_info >= (3, 8):
-    from typing import TypedDict
-else:
-    from typing_extensions import TypedDict
-
 class _PCG64Internal(TypedDict):
     state: int
     inc: int
index 8a00dc265f232b480106183b483a4661917ef613..c0a10a812525d676b5b02059d9a94ac15a0d6a4b 100644 (file)
@@ -102,7 +102,7 @@ cdef class PCG64(BitGenerator):
 
     **Compatibility Guarantee**
 
-    ``PCG64`` makes a guarantee that a fixed seed and will always produce
+    ``PCG64`` makes a guarantee that a fixed seed will always produce
     the same random integer stream.
 
     References
@@ -338,7 +338,7 @@ cdef class PCG64DXSM(BitGenerator):
 
     **Compatibility Guarantee**
 
-    ``PCG64DXSM`` makes a guarantee that a fixed seed and will always produce
+    ``PCG64DXSM`` makes a guarantee that a fixed seed will always produce
     the same random integer stream.
 
     References
index f6a5b9b9b3c8678296915dcd6d6284463b5b0653..dd1c5e6e9bab97441453ff78827a9f9687f2e8c2 100644 (file)
@@ -1,15 +1,9 @@
-import sys
-from typing import Any, Union
+from typing import Any, Union, TypedDict
 
 from numpy import dtype, ndarray, uint64
 from numpy.random.bit_generator import BitGenerator, SeedSequence
 from numpy.typing import _ArrayLikeInt_co
 
-if sys.version_info >= (3, 8):
-    from typing import TypedDict
-else:
-    from typing_extensions import TypedDict
-
 class _PhiloxInternal(TypedDict):
     counter: ndarray[Any, dtype[uint64]]
     key: ndarray[Any, dtype[uint64]]
index 72a271c9243e97bbd61812b079a86185d4a8550f..94d11a210fe67ce1640a982a512e169a84a5c685 100644 (file)
@@ -1,5 +1,4 @@
-import sys
-from typing import Any, Union
+from typing import Any, Union, TypedDict
 
 from numpy import dtype as dtype
 from numpy import ndarray as ndarray
@@ -7,11 +6,6 @@ from numpy import uint64
 from numpy.random.bit_generator import BitGenerator, SeedSequence
 from numpy.typing import _ArrayLikeInt_co
 
-if sys.version_info >= (3, 8):
-    from typing import TypedDict
-else:
-    from typing_extensions import TypedDict
-
 class _SFC64Internal(TypedDict):
     state: ndarray[Any, dtype[uint64]]
 
index 5b68dde6ccbfd35c1ba55b884ebaebfc6d4c7a4d..fa2f1ab12c90a1d81f029547d37faf36a109838a 100644 (file)
@@ -1,5 +1,4 @@
 import abc
-import sys
 from threading import Lock
 from typing import (
     Any,
@@ -16,16 +15,12 @@ from typing import (
     TypeVar,
     Union,
     overload,
+    Literal,
 )
 
 from numpy import dtype, ndarray, uint32, uint64
 from numpy.typing import _ArrayLikeInt_co, _ShapeLike, _SupportsDType, _UInt32Codes, _UInt64Codes
 
-if sys.version_info >= (3, 8):
-    from typing import Literal
-else:
-    from typing_extensions import Literal
-
 _T = TypeVar("_T")
 
 _DTypeLikeUint32 = Union[
index ea24f6d230524935437e326c969f4a4eb7f76837..43f68253d13706478b080929358052fccb1defc2 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef _RANDOMDGEN__ALIGNED_MALLOC_H_
 #define _RANDOMDGEN__ALIGNED_MALLOC_H_
 
-#include "Python.h"
+#include <Python.h>
 #include "numpy/npy_common.h"
 
 #define NPY_MEMALIGN 16 /* 16 for SSE2, 32 for AVX, 64 for Xeon Phi */
index 3137b0a955ad8160951cb72281126e82e7a2938a..cbe87a29984205124e63ad93a6eb9988995eed2b 100644 (file)
@@ -1,5 +1,4 @@
-import sys
-from typing import Any, Callable, Dict, Optional, Tuple, Type, Union, overload
+from typing import Any, Callable, Dict, Optional, Tuple, Type, Union, overload, Literal
 
 from numpy import (
     bool_,
@@ -44,11 +43,6 @@ from numpy.typing import (
     _UIntCodes,
 )
 
-if sys.version_info >= (3, 8):
-    from typing import Literal
-else:
-    from typing_extensions import Literal
-
 _DTypeLikeFloat32 = Union[
     dtype[float32],
     _SupportsDType[dtype[float32]],
index 4f5862faa1d993c4a006c442f4baf0b2601f56bd..ce09a041c94ea6e0e1d61f21a6b14b9a2d242b57 100644 (file)
@@ -763,7 +763,7 @@ cdef class RandomState:
         else:
             raise TypeError('Unsupported dtype %r for randint' % _dtype)
 
-        if size is None and dtype in (bool, int, np.compat.long):
+        if size is None and dtype in (bool, int):
             if np.array(ret).shape == ():
                 return dtype(ret)
         return ret
@@ -1033,7 +1033,10 @@ cdef class RandomState:
             greater than or equal to low.  The default value is 0.
         high : float or array_like of floats
             Upper boundary of the output interval.  All values generated will be
-            less than or equal to high.  The default value is 1.0.
+            less than or equal to high.  The high limit may be included in the 
+            returned array of floats due to floating-point rounding in the 
+            equation ``low + (high-low) * random_sample()``.  The default value 
+            is 1.0.
         size : int or tuple of ints, optional
             Output shape.  If the given shape is, e.g., ``(m, n, k)``, then
             ``m * n * k`` samples are drawn.  If size is ``None`` (default),
@@ -2524,7 +2527,7 @@ cdef class RandomState:
         Raises
         ------
         ValueError
-            If a < 1.
+            If a <= 0.
 
         See Also
         --------
@@ -3606,7 +3609,7 @@ cdef class RandomState:
         `a` > 1.
 
         The Zipf distribution (also known as the zeta distribution) is a
-        continuous probability distribution that satisfies Zipf's law: the
+        discrete probability distribution that satisfies Zipf's law: the
         frequency of an item is inversely proportional to its rank in a
         frequency table.
 
@@ -3639,9 +3642,10 @@ cdef class RandomState:
         -----
         The probability density for the Zipf distribution is
 
-        .. math:: p(x) = \\frac{x^{-a}}{\\zeta(a)},
+        .. math:: p(k) = \\frac{k^{-a}}{\\zeta(a)},
 
-        where :math:`\\zeta` is the Riemann Zeta function.
+        for integers :math:`k \geq 1`, where :math:`\\zeta` is the Riemann Zeta
+        function.
 
         It is named for the American linguist George Kingsley Zipf, who noted
         that the frequency of any word in a sample of a language is inversely
@@ -3657,21 +3661,29 @@ cdef class RandomState:
         --------
         Draw samples from the distribution:
 
-        >>> a = 2. # parameter
-        >>> s = np.random.zipf(a, 1000)
+        >>> a = 4.0
+        >>> n = 20000
+        >>> s = np.random.zipf(a, n)
 
         Display the histogram of the samples, along with
-        the probability density function:
+        the expected histogram based on the probability
+        density function:
 
         >>> import matplotlib.pyplot as plt
-        >>> from scipy import special  # doctest: +SKIP
+        >>> from scipy.special import zeta  # doctest: +SKIP
 
-        Truncate s values at 50 so plot is interesting:
+        `bincount` provides a fast histogram for small integers.
 
-        >>> count, bins, ignored = plt.hist(s[s<50], 50, density=True)
-        >>> x = np.arange(1., 50.)
-        >>> y = x**(-a) / special.zetac(a)  # doctest: +SKIP
-        >>> plt.plot(x, y/max(y), linewidth=2, color='r')  # doctest: +SKIP
+        >>> count = np.bincount(s)
+        >>> k = np.arange(1, s.max() + 1)
+
+        >>> plt.bar(k, count[1:], alpha=0.5, label='sample count')
+        >>> plt.plot(k, n*(k**-a)/zeta(a), 'k.-', alpha=0.5,
+        ...          label='expected count')   # doctest: +SKIP
+        >>> plt.semilogy()
+        >>> plt.grid(alpha=0.4)
+        >>> plt.legend()
+        >>> plt.title(f'Zipf sample, a={a}, size={n}')
         >>> plt.show()
 
         """
@@ -4222,18 +4234,21 @@ cdef class RandomState:
         ValueError: pvals < 0, pvals > 1 or pvals contains NaNs
 
         """
-        cdef np.npy_intp d, i, sz, offset
+        cdef np.npy_intp d, i, sz, offset, niter
         cdef np.ndarray parr, mnarr
         cdef double *pix
         cdef long *mnix
         cdef long ni
 
-        d = len(pvals)
         parr = <np.ndarray>np.PyArray_FROMANY(
-            pvals, np.NPY_DOUBLE, 1, 1, np.NPY_ARRAY_ALIGNED | np.NPY_ARRAY_C_CONTIGUOUS)
+            pvals, np.NPY_DOUBLE, 0, 1, np.NPY_ARRAY_ALIGNED | np.NPY_ARRAY_C_CONTIGUOUS)
+        if np.PyArray_NDIM(parr) == 0:
+            raise TypeError("pvals must be a 1-d sequence")
+        d = np.PyArray_SIZE(parr)
         pix = <double*>np.PyArray_DATA(parr)
         check_array_constraint(parr, 'pvals', CONS_BOUNDED_0_1)
-        if kahan_sum(pix, d-1) > (1.0 + 1e-12):
+        # Only check if pvals is non-empty due no checks in kahan_sum
+        if d and kahan_sum(pix, d-1) > (1.0 + 1e-12):
             # When floating, but not float dtype, and close, improve the error
             # 1.0001 works for float16 and float32
             if (isinstance(pvals, np.ndarray)
@@ -4248,7 +4263,6 @@ cdef class RandomState:
             else:
                 msg = "sum(pvals[:-1]) > 1.0"
             raise ValueError(msg)
-
         if size is None:
             shape = (d,)
         else:
@@ -4256,7 +4270,6 @@ cdef class RandomState:
                 shape = (operator.index(size), d)
             except:
                 shape = tuple(size) + (d,)
-
         multin = np.zeros(shape, dtype=int)
         mnarr = <np.ndarray>multin
         mnix = <long*>np.PyArray_DATA(mnarr)
@@ -4264,8 +4277,10 @@ cdef class RandomState:
         ni = n
         check_constraint(ni, 'n', CONS_NON_NEGATIVE)
         offset = 0
+        # gh-20483: Avoids divide by 0
+        niter = sz // d if d else 0
         with self.lock, nogil:
-            for i in range(sz // d):
+            for i in range(niter):
                 legacy_random_multinomial(&self._bitgen, ni, &mnix[offset], pix, d, &self._binomial)
                 offset += d
 
@@ -4472,7 +4487,7 @@ cdef class RandomState:
             # Fast, statically typed path: shuffle the underlying buffer.
             # Only for non-empty, 1d objects of class ndarray (subclasses such
             # as MaskedArrays may not support this approach).
-            x_ptr = <char*><size_t>np.PyArray_DATA(x)
+            x_ptr = np.PyArray_BYTES(x)
             stride = x.strides[0]
             itemsize = x.dtype.itemsize
             # As the array x could contain python objects we use a buffer
@@ -4480,7 +4495,7 @@ cdef class RandomState:
             # within the buffer and erroneously decrementing it's refcount
             # when the function exits.
             buf = np.empty(itemsize, dtype=np.int8)  # GC'd at function exit
-            buf_ptr = <char*><size_t>np.PyArray_DATA(buf)
+            buf_ptr = np.PyArray_BYTES(buf)
             with self.lock:
                 # We trick gcc into providing a specialized implementation for
                 # the most common case, yielding a ~33% performance improvement.
index dce9a101ebce2b96cb32cf56cc47228037a0513f..866c0cb2f0ab56dd40e62c080fd9cd757ffc36ab 100644 (file)
@@ -65,12 +65,26 @@ def configuration(parent_package='', top_path=None):
         'src/distributions/random_mvhg_marginals.c',
         'src/distributions/random_hypergeometric.c',
     ]
+
+    def gl_if_msvc(build_cmd):
+        """ Add flag if we are using MSVC compiler
+
+        We can't see this in our scope, because we have not initialized the
+        distutils build command, so use this deferred calculation to run when
+        we are building the library.
+        """
+        # Keep in sync with numpy/core/setup.py
+        if build_cmd.compiler.compiler_type == 'msvc':
+            # explicitly disable whole-program optimization
+            return ['/GL-']
+        return []
+
     config.add_installed_library('npyrandom',
         sources=npyrandom_sources,
         install_dir='lib',
         build_info={
             'include_dirs' : [],  # empty list required for creating npyrandom.h
-            'extra_compiler_args' : (['/GL-'] if is_msvc else []),
+            'extra_compiler_args': [gl_if_msvc],
         })
 
     for gen in ['mt19937']:
index 9bdfa9bead82a0c9c8904b42ebd69bd71653c26d..bd1e1faa483575ff09f4cd62d58709139e2df5ed 100644 (file)
@@ -17,7 +17,7 @@ static NPY_INLINE uint64_t next_uint64(bitgen_t *bitgen_state) {
 }
 
 static NPY_INLINE float next_float(bitgen_t *bitgen_state) {
-  return (next_uint32(bitgen_state) >> 9) * (1.0f / 8388608.0f);
+  return (next_uint32(bitgen_state) >> 8) * (1.0f / 16777216.0f);
 }
 
 /* Random generators for external use */
@@ -452,7 +452,7 @@ double random_standard_cauchy(bitgen_t *bitgen_state) {
 }
 
 double random_pareto(bitgen_t *bitgen_state, double a) {
-  return exp(random_standard_exponential(bitgen_state) / a) - 1;
+  return expm1(random_standard_exponential(bitgen_state) / a);
 }
 
 double random_weibull(bitgen_t *bitgen_state, double a) {
@@ -463,7 +463,7 @@ double random_weibull(bitgen_t *bitgen_state, double a) {
 }
 
 double random_power(bitgen_t *bitgen_state, double a) {
-  return pow(1 - exp(-random_standard_exponential(bitgen_state)), 1. / a);
+  return pow(-expm1(-random_standard_exponential(bitgen_state)), 1. / a);
 }
 
 double random_laplace(bitgen_t *bitgen_state, double loc, double scale) {
@@ -918,7 +918,7 @@ int64_t random_logseries(bitgen_t *bitgen_state, double p) {
       return 1;
     }
     U = next_double(bitgen_state);
-    q = 1.0 - exp(r * U);
+    q = -expm1(r * U);
     if (V <= q * q) {
       result = (int64_t)floor(1 + log(V) / log(q));
       if ((result < 1) || (V == 0.0)) {
index 0da49bd62ad0386f6e79fdfa18740db6dcf9ed3f..d8510bfca9bbf913e95e634b525657fe0a3847ad 100644 (file)
@@ -155,7 +155,7 @@ static int64_t hypergeometric_hrua(bitgen_t *bitgen_state,
     c = sqrt(var + 0.5);
 
     /*
-     *  h is 2*s_hat (See Stadlober's theses (1989), Eq. (5.17); or
+     *  h is 2*s_hat (See Stadlober's thesis (1989), Eq. (5.17); or
      *  Stadlober (1990), Eq. 8).  s_hat is the scale of the "table mountain"
      *  function that dominates the scaled hypergeometric PMF ("scaled" means
      *  normalized to have a maximum value of 1).
index ea1ebacb63c836134bb751c5651ffc26c4b5b4f2..58d966adff2154f8a6dd71577b106e9a45440e09 100644 (file)
@@ -46,25 +46,27 @@ def assert_state_equal(actual, target):
             assert actual[key] == target[key]
 
 
+def uint32_to_float32(u):
+    return ((u >> np.uint32(8)) * (1.0 / 2**24)).astype(np.float32)
+
+
 def uniform32_from_uint64(x):
     x = np.uint64(x)
     upper = np.array(x >> np.uint64(32), dtype=np.uint32)
     lower = np.uint64(0xffffffff)
     lower = np.array(x & lower, dtype=np.uint32)
     joined = np.column_stack([lower, upper]).ravel()
-    out = (joined >> np.uint32(9)) * (1.0 / 2 ** 23)
-    return out.astype(np.float32)
+    return uint32_to_float32(joined)
 
 
 def uniform32_from_uint53(x):
     x = np.uint64(x) >> np.uint64(16)
     x = np.uint32(x & np.uint64(0xffffffff))
-    out = (x >> np.uint32(9)) * (1.0 / 2 ** 23)
-    return out.astype(np.float32)
+    return uint32_to_float32(x)
 
 
 def uniform32_from_uint32(x):
-    return (x >> np.uint32(9)) * (1.0 / 2 ** 23)
+    return uint32_to_float32(x)
 
 
 def uniform32_from_uint(x, bits):
@@ -126,6 +128,7 @@ def gauss_from_uint(x, n, bits):
 
     return gauss[:n]
 
+
 def test_seedsequence():
     from numpy.random.bit_generator import (ISeedSequence,
                                             ISpawnableSeedSequence,
index 4abcf6fe469451513f5c228ef4dd8bf271226849..e5411b8ef569b6d0a3fe030bdbdbb28f5eb3816a 100644 (file)
@@ -136,12 +136,6 @@ class TestMultinomial:
         contig = random.multinomial(100, pvals=np.ascontiguousarray(pvals))
         assert_array_equal(non_contig, contig)
 
-    def test_multidimensional_pvals(self):
-        assert_raises(ValueError, random.multinomial, 10, [[0, 1]])
-        assert_raises(ValueError, random.multinomial, 10, [[0], [1]])
-        assert_raises(ValueError, random.multinomial, 10, [[[0], [1]], [[1], [0]]])
-        assert_raises(ValueError, random.multinomial, 10, np.array([[0, 1], [1, 0]]))
-
     def test_multinomial_pvals_float32(self):
         x = np.array([9.9e-01, 9.9e-01, 1.0e-09, 1.0e-09, 1.0e-09, 1.0e-09,
                       1.0e-09, 1.0e-09, 1.0e-09, 1.0e-09], dtype=np.float32)
@@ -774,6 +768,18 @@ class TestRandomDist:
         desired = 0.0969992
         assert_array_almost_equal(actual, desired, decimal=7)
 
+    @pytest.mark.parametrize('dtype, uint_view_type',
+                             [(np.float32, np.uint32),
+                              (np.float64, np.uint64)])
+    def test_random_distribution_of_lsb(self, dtype, uint_view_type):
+        random = Generator(MT19937(self.seed))
+        sample = random.random(100000, dtype=dtype)
+        num_ones_in_lsb = np.count_nonzero(sample.view(uint_view_type) & 1)
+        # The probability of a 1 in the least significant bit is 0.25.
+        # With a sample size of 100000, the probability that num_ones_in_lsb
+        # is outside the following range is less than 5e-11.
+        assert 24100 < num_ones_in_lsb < 25900
+
     def test_random_unsupported_type(self):
         assert_raises(TypeError, random.random, dtype='int32')
 
@@ -1760,6 +1766,7 @@ class TestRandomDist:
     @pytest.mark.parametrize("mu", [-7., -np.pi, -3.1, np.pi, 3.2])
     @pytest.mark.parametrize("kappa", [1e-9, 1e-6, 1, 1e3, 1e15])
     def test_vonmises_large_kappa_range(self, mu, kappa):
+        random = Generator(MT19937(self.seed))
         r = random.vonmises(mu, kappa, 50)
         assert_(np.all(r > -np.pi) and np.all(r <= np.pi))
 
@@ -2348,6 +2355,64 @@ class TestBroadcast:
                             [2, 3, 6, 4, 2, 3]], dtype=np.int64)
         assert_array_equal(actual, desired)
 
+        random = Generator(MT19937(self.seed))
+        actual = random.multinomial([5, 20], [[1 / 6.] * 6] * 2)
+        desired = np.array([[0, 0, 2, 1, 2, 0],
+                            [2, 3, 6, 4, 2, 3]], dtype=np.int64)
+        assert_array_equal(actual, desired)
+
+        random = Generator(MT19937(self.seed))
+        actual = random.multinomial([[5], [20]], [[1 / 6.] * 6] * 2)
+        desired = np.array([[[0, 0, 2, 1, 2, 0],
+                             [0, 0, 2, 1, 1, 1]],
+                            [[4, 2, 3, 3, 5, 3],
+                             [7, 2, 2, 1, 4, 4]]], dtype=np.int64)
+        assert_array_equal(actual, desired)
+
+    @pytest.mark.parametrize("n", [10,
+                                   np.array([10, 10]),
+                                   np.array([[[10]], [[10]]])
+                                   ]
+                             )
+    def test_multinomial_pval_broadcast(self, n):
+        random = Generator(MT19937(self.seed))
+        pvals = np.array([1 / 4] * 4)
+        actual = random.multinomial(n, pvals)
+        n_shape = tuple() if isinstance(n, int) else n.shape
+        expected_shape = n_shape + (4,)
+        assert actual.shape == expected_shape
+        pvals = np.vstack([pvals, pvals])
+        actual = random.multinomial(n, pvals)
+        expected_shape = np.broadcast_shapes(n_shape, pvals.shape[:-1]) + (4,)
+        assert actual.shape == expected_shape
+
+        pvals = np.vstack([[pvals], [pvals]])
+        actual = random.multinomial(n, pvals)
+        expected_shape = np.broadcast_shapes(n_shape, pvals.shape[:-1])
+        assert actual.shape == expected_shape + (4,)
+        actual = random.multinomial(n, pvals, size=(3, 2) + expected_shape)
+        assert actual.shape == (3, 2) + expected_shape + (4,)
+
+        with pytest.raises(ValueError):
+            # Ensure that size is not broadcast
+            actual = random.multinomial(n, pvals, size=(1,) * 6)
+
+    def test_invalid_pvals_broadcast(self):
+        random = Generator(MT19937(self.seed))
+        pvals = [[1 / 6] * 6, [1 / 4] * 6]
+        assert_raises(ValueError, random.multinomial, 1, pvals)
+        assert_raises(ValueError, random.multinomial, 6, 0.5)
+
+    def test_empty_outputs(self):
+        random = Generator(MT19937(self.seed))
+        actual = random.multinomial(np.empty((10, 0, 6), "i8"), [1 / 6] * 6)
+        assert actual.shape == (10, 0, 6, 6)
+        actual = random.multinomial(12, np.empty((10, 0, 10)))
+        assert actual.shape == (10, 0, 10)
+        actual = random.multinomial(np.empty((3, 0, 7), "i8"),
+                                    np.empty((3, 0, 7, 4)))
+        assert actual.shape == (3, 0, 7, 4)
+
 
 class TestThread:
     # make sure each state produces the same sequence even in threads
index 9f6dcdc6bae88ad0985abed4b025c54080e6dd9d..0227d6502c88248488c0907223294613623efb56 100644 (file)
@@ -1,7 +1,7 @@
 from numpy.testing import (assert_, assert_array_equal)
 import numpy as np
 import pytest
-from numpy.random import Generator, MT19937, RandomState
+from numpy.random import Generator, MT19937
 
 mt19937 = Generator(MT19937())
 
@@ -32,11 +32,11 @@ class TestRegression:
         # these two frequency counts should be close to theoretical
         # numbers with this large sample
         # theoretical large N result is 0.49706795
-        freq = np.sum(rvsn == 1) / float(N)
+        freq = np.sum(rvsn == 1) / N
         msg = f'Frequency was {freq:f}, should be > 0.45'
         assert_(freq > 0.45, msg)
         # theoretical large N result is 0.19882718
-        freq = np.sum(rvsn == 2) / float(N)
+        freq = np.sum(rvsn == 2) / N
         msg = f'Frequency was {freq:f}, should be < 0.23'
         assert_(freq < 0.23, msg)
 
index 0bf361e5eb46fe54a436ac43d4724de1bb88e4fc..7ad19ab5562b87305a0391c80c602259816a984e 100644 (file)
@@ -43,11 +43,11 @@ class TestRegression:
         # these two frequency counts should be close to theoretical
         # numbers with this large sample
         # theoretical large N result is 0.49706795
-        freq = np.sum(rvsn == 1) / float(N)
+        freq = np.sum(rvsn == 1) / N
         msg = f'Frequency was {freq:f}, should be > 0.45'
         assert_(freq > 0.45, msg)
         # theoretical large N result is 0.19882718
-        freq = np.sum(rvsn == 2) / float(N)
+        freq = np.sum(rvsn == 2) / N
         msg = f'Frequency was {freq:f}, should be < 0.23'
         assert_(freq < 0.23, msg)
 
@@ -201,3 +201,16 @@ class TestRegression:
                              [3, 4, 2, 3, 3, 1, 5, 3, 1, 3]])
         assert_array_equal(random.binomial([[0], [10]], 0.25, size=(2, 10)),
                            expected)
+
+
+def test_multinomial_empty():
+    # gh-20483
+    # Ensure that empty p-vals are correctly handled
+    assert random.multinomial(10, []).shape == (0,)
+    assert random.multinomial(3, [], size=(7, 5, 3)).shape == (7, 5, 3, 0)
+
+
+def test_multinomial_1d_pval():
+    # gh-20483
+    with pytest.raises(TypeError, match="pvals must be a 1-d"):
+        random.multinomial(10, 0.3)
index 54d5a3efbdba7b39258ec93aaa34a207029272c2..8bf419875b3f37cd4cc121030d65be9fc77999a3 100644 (file)
@@ -39,11 +39,11 @@ class TestRegression:
         # these two frequency counts should be close to theoretical
         # numbers with this large sample
         # theoretical large N result is 0.49706795
-        freq = np.sum(rvsn == 1) / float(N)
+        freq = np.sum(rvsn == 1) / N
         msg = f'Frequency was {freq:f}, should be > 0.45'
         assert_(freq > 0.45, msg)
         # theoretical large N result is 0.19882718
-        freq = np.sum(rvsn == 2) / float(N)
+        freq = np.sum(rvsn == 2) / N
         msg = f'Frequency was {freq:f}, should be < 0.23'
         assert_(freq < 0.23, msg)
 
diff --git a/numpy/rec.pyi b/numpy/rec.pyi
deleted file mode 100644 (file)
index 1986360..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-from typing import List
-
-from numpy import (
-    format_parser as format_parser,
-    record as record,
-    recarray as recarray,
-)
-
-__all__: List[str]
-
-def fromarrays(
-    arrayList,
-    dtype=...,
-    shape=...,
-    formats=...,
-    names=...,
-    titles=...,
-    aligned=...,
-    byteorder=...,
-): ...
-def fromrecords(
-    recList,
-    dtype=...,
-    shape=...,
-    formats=...,
-    names=...,
-    titles=...,
-    aligned=...,
-    byteorder=...,
-): ...
-def fromstring(
-    datastring,
-    dtype=...,
-    shape=...,
-    offset=...,
-    formats=...,
-    names=...,
-    titles=...,
-    aligned=...,
-    byteorder=...,
-): ...
-def fromfile(
-    fd,
-    dtype=...,
-    shape=...,
-    offset=...,
-    formats=...,
-    names=...,
-    titles=...,
-    aligned=...,
-    byteorder=...,
-): ...
-def array(
-    obj,
-    dtype=...,
-    shape=...,
-    offset=...,
-    strides=...,
-    formats=...,
-    names=...,
-    titles=...,
-    aligned=...,
-    byteorder=...,
-    copy=...,
-): ...
index cbf633504db308dfc526ef423678e8543aff3f1f..a0ca99919b3a11a39598b7ccbe9a19b96652af56 100644 (file)
@@ -4,6 +4,7 @@ def configuration(parent_package='',top_path=None):
     from numpy.distutils.misc_util import Configuration
     config = Configuration('numpy', parent_package, top_path)
 
+    config.add_subpackage('array_api')
     config.add_subpackage('compat')
     config.add_subpackage('core')
     config.add_subpackage('distutils')
index e1f87621f9e7f16a6636a272f575b34e950bdf73..6e06c5b49af186bb2ba7bd16b386cf2eece84fc3 100644 (file)
@@ -8,7 +8,8 @@ away.
 from unittest import TestCase
 
 from ._private.utils import *
-from ._private import decorators as dec
+from ._private.utils import (_assert_valid_refcount, _gen_alignment_data)
+from ._private import extbuild, decorators as dec
 from ._private.nosetester import (
     run_module_suite, NoseTester as Tester
     )
index 395626f6bb5aff07805ca0d76340a7d3063c4d86..def0f9f583210bf13f40c5f6097145dd996aeba4 100644 (file)
-import sys
-import warnings
-from typing import Any, List, ClassVar, Tuple, Set
+from typing import List
 
-if sys.version_info >= (3, 8):
-    from typing import Final
-else:
-    from typing_extensions import Final
+from numpy._pytesttester import PytestTester
 
 from unittest import (
     TestCase as TestCase,
 )
 
-from unittest.case import (
+from numpy.testing._private.utils import (
+    assert_equal as assert_equal,
+    assert_almost_equal as assert_almost_equal,
+    assert_approx_equal as assert_approx_equal,
+    assert_array_equal as assert_array_equal,
+    assert_array_less as assert_array_less,
+    assert_string_equal as assert_string_equal,
+    assert_array_almost_equal as assert_array_almost_equal,
+    assert_raises as assert_raises,
+    build_err_msg as build_err_msg,
+    decorate_methods as decorate_methods,
+    jiffies as jiffies,
+    memusage as memusage,
+    print_assert_equal as print_assert_equal,
+    raises as raises,
+    rundocs as rundocs,
+    runstring as runstring,
+    verbose as verbose,
+    measure as measure,
+    assert_ as assert_,
+    assert_array_almost_equal_nulp as assert_array_almost_equal_nulp,
+    assert_raises_regex as assert_raises_regex,
+    assert_array_max_ulp as assert_array_max_ulp,
+    assert_warns as assert_warns,
+    assert_no_warnings as assert_no_warnings,
+    assert_allclose as assert_allclose,
+    IgnoreException as IgnoreException,
+    clear_and_catch_warnings as clear_and_catch_warnings,
     SkipTest as SkipTest,
+    KnownFailureException as KnownFailureException,
+    temppath as temppath,
+    tempdir as tempdir,
+    IS_PYPY as IS_PYPY,
+    IS_PYSTON as IS_PYSTON,
+    HAS_REFCOUNT as HAS_REFCOUNT,
+    suppress_warnings as suppress_warnings,
+    assert_array_compare as assert_array_compare,
+    assert_no_gc_cycles as assert_no_gc_cycles,
+    break_cycles as break_cycles,
+    HAS_LAPACK64 as HAS_LAPACK64,
 )
 
 __all__: List[str]
+__path__: List[str]
+test: PytestTester
 
-def run_module_suite(file_to_run=..., argv=...): ...
-
-class KnownFailureException(Exception): ...
-class IgnoreException(Exception): ...
-
-class clear_and_catch_warnings(warnings.catch_warnings):
-    class_modules: ClassVar[Tuple[str, ...]]
-    modules: Set[str]
-    def __init__(self, record=..., modules=...): ...
-    def __enter__(self): ...
-    def __exit__(self, *exc_info): ...
-
-class suppress_warnings:
-    log: List[warnings.WarningMessage]
-    def __init__(self, forwarding_rule=...): ...
-    def filter(self, category=..., message=..., module=...): ...
-    def record(self, category=..., message=..., module=...): ...
-    def __enter__(self): ...
-    def __exit__(self, *exc_info): ...
-    def __call__(self, func): ...
-
-verbose: int
-IS_PYPY: Final[bool]
-HAS_REFCOUNT: Final[bool]
-HAS_LAPACK64: Final[bool]
-
-def assert_(val, msg=...): ...
-def memusage(processName=..., instance=...): ...
-def jiffies(_proc_pid_stat=..., _load_time=...): ...
-def build_err_msg(
-    arrays,
-    err_msg,
-    header=...,
-    verbose=...,
-    names=...,
-    precision=...,
-): ...
-def assert_equal(actual, desired, err_msg=..., verbose=...): ...
-def print_assert_equal(test_string, actual, desired): ...
-def assert_almost_equal(
-    actual,
-    desired,
-    decimal=...,
-    err_msg=...,
-    verbose=...,
-): ...
-def assert_approx_equal(
-    actual,
-    desired,
-    significant=...,
-    err_msg=...,
-    verbose=...,
-): ...
-def assert_array_compare(
-    comparison,
-    x,
-    y,
-    err_msg=...,
-    verbose=...,
-    header=...,
-    precision=...,
-    equal_nan=...,
-    equal_inf=...,
-): ...
-def assert_array_equal(x, y, err_msg=..., verbose=...): ...
-def assert_array_almost_equal(x, y, decimal=..., err_msg=..., verbose=...): ...
-def assert_array_less(x, y, err_msg=..., verbose=...): ...
-def runstring(astr, dict): ...
-def assert_string_equal(actual, desired): ...
-def rundocs(filename=..., raise_on_error=...): ...
-def raises(*args): ...
-def assert_raises(*args, **kwargs): ...
-def assert_raises_regex(exception_class, expected_regexp, *args, **kwargs): ...
-def decorate_methods(cls, decorator, testmatch=...): ...
-def measure(code_str, times=..., label=...): ...
-def assert_allclose(
-    actual,
-    desired,
-    rtol=...,
-    atol=...,
-    equal_nan=...,
-    err_msg=...,
-    verbose=...,
-): ...
-def assert_array_almost_equal_nulp(x, y, nulp=...): ...
-def assert_array_max_ulp(a, b, maxulp=..., dtype=...): ...
-def assert_warns(warning_class, *args, **kwargs): ...
-def assert_no_warnings(*args, **kwargs): ...
-def tempdir(*args, **kwargs): ...
-def temppath(*args, **kwargs): ...
-def assert_no_gc_cycles(*args, **kwargs): ...
-def break_cycles(): ...
-def _assert_valid_refcount(op): ...
-def _gen_alignment_data(dtype=..., type=..., max_size=...): ...
+def run_module_suite(
+    file_to_run: None | str = ...,
+    argv: None | List[str] = ...,
+) -> None: ...
diff --git a/numpy/testing/_private/extbuild.py b/numpy/testing/_private/extbuild.py
new file mode 100644 (file)
index 0000000..20bf3dc
--- /dev/null
@@ -0,0 +1,251 @@
+"""
+Build a c-extension module on-the-fly in tests.
+See build_and_import_extensions for usage hints
+
+"""
+
+import os
+import pathlib
+import sys
+import sysconfig
+from numpy.distutils.ccompiler import new_compiler
+from distutils.errors import CompileError
+
+__all__ = ['build_and_import_extension', 'compile_extension_module']
+
+
+def build_and_import_extension(
+        modname, functions, *, prologue="", build_dir=None,
+        include_dirs=[], more_init=""):
+    """
+    Build and imports a c-extension module `modname` from a list of function
+    fragments `functions`.
+
+
+    Parameters
+    ----------
+    functions : list of fragments
+        Each fragment is a sequence of func_name, calling convention, snippet.
+    prologue : string
+        Code to preceed the rest, usually extra ``#include`` or ``#define``
+        macros.
+    build_dir : pathlib.Path
+        Where to build the module, usually a temporary directory
+    include_dirs : list
+        Extra directories to find include files when compiling
+    more_init : string
+        Code to appear in the module PyMODINIT_FUNC
+
+    Returns
+    -------
+    out: module
+        The module will have been loaded and is ready for use
+
+    Examples
+    --------
+    >>> functions = [("test_bytes", "METH_O", \"\"\"
+        if ( !PyBytesCheck(args)) {
+            Py_RETURN_FALSE;
+        }
+        Py_RETURN_TRUE;
+    \"\"\")]
+    >>> mod = build_and_import_extension("testme", functions)
+    >>> assert not mod.test_bytes(u'abc')
+    >>> assert mod.test_bytes(b'abc')
+    """
+
+    body = prologue + _make_methods(functions, modname)
+    init = """PyObject *mod = PyModule_Create(&moduledef);
+           """
+    if not build_dir:
+        build_dir = pathlib.Path('.')
+    if more_init:
+        init += """#define INITERROR return NULL
+                """
+        init += more_init
+    init += "\nreturn mod;"
+    source_string = _make_source(modname, init, body)
+    try:
+        mod_so = compile_extension_module(
+            modname, build_dir, include_dirs, source_string)
+    except CompileError as e:
+        # shorten the exception chain
+        raise RuntimeError(f"could not compile in {build_dir}:") from e
+    import importlib.util
+    spec = importlib.util.spec_from_file_location(modname, mod_so)
+    foo = importlib.util.module_from_spec(spec)
+    spec.loader.exec_module(foo)
+    return foo
+
+
+def compile_extension_module(
+        name, builddir, include_dirs,
+        source_string, libraries=[], library_dirs=[]):
+    """
+    Build an extension module and return the filename of the resulting
+    native code file.
+
+    Parameters
+    ----------
+    name : string
+        name of the module, possibly including dots if it is a module inside a
+        package.
+    builddir : pathlib.Path
+        Where to build the module, usually a temporary directory
+    include_dirs : list
+        Extra directories to find include files when compiling
+    libraries : list
+        Libraries to link into the extension module
+    library_dirs: list
+        Where to find the libraries, ``-L`` passed to the linker
+    """
+    modname = name.split('.')[-1]
+    dirname = builddir / name
+    dirname.mkdir(exist_ok=True)
+    cfile = _convert_str_to_file(source_string, dirname)
+    include_dirs = [sysconfig.get_config_var('INCLUDEPY')] + include_dirs
+
+    return _c_compile(
+        cfile, outputfilename=dirname / modname,
+        include_dirs=include_dirs, libraries=[], library_dirs=[],
+        )
+
+
+def _convert_str_to_file(source, dirname):
+    """Helper function to create a file ``source.c`` in `dirname` that contains
+    the string in `source`. Returns the file name
+    """
+    filename = dirname / 'source.c'
+    with filename.open('w') as f:
+        f.write(str(source))
+    return filename
+
+
+def _make_methods(functions, modname):
+    """ Turns the name, signature, code in functions into complete functions
+    and lists them in a methods_table. Then turns the methods_table into a
+    ``PyMethodDef`` structure and returns the resulting code fragment ready
+    for compilation
+    """
+    methods_table = []
+    codes = []
+    for funcname, flags, code in functions:
+        cfuncname = "%s_%s" % (modname, funcname)
+        if 'METH_KEYWORDS' in flags:
+            signature = '(PyObject *self, PyObject *args, PyObject *kwargs)'
+        else:
+            signature = '(PyObject *self, PyObject *args)'
+        methods_table.append(
+            "{\"%s\", (PyCFunction)%s, %s}," % (funcname, cfuncname, flags))
+        func_code = """
+        static PyObject* {cfuncname}{signature}
+        {{
+        {code}
+        }}
+        """.format(cfuncname=cfuncname, signature=signature, code=code)
+        codes.append(func_code)
+
+    body = "\n".join(codes) + """
+    static PyMethodDef methods[] = {
+    %(methods)s
+    { NULL }
+    };
+    static struct PyModuleDef moduledef = {
+        PyModuleDef_HEAD_INIT,
+        "%(modname)s",  /* m_name */
+        NULL,           /* m_doc */
+        -1,             /* m_size */
+        methods,        /* m_methods */
+    };
+    """ % dict(methods='\n'.join(methods_table), modname=modname)
+    return body
+
+
+def _make_source(name, init, body):
+    """ Combines the code fragments into source code ready to be compiled
+    """
+    code = """
+    #include <Python.h>
+
+    %(body)s
+
+    PyMODINIT_FUNC
+    PyInit_%(name)s(void) {
+    %(init)s
+    }
+    """ % dict(
+        name=name, init=init, body=body,
+    )
+    return code
+
+
+def _c_compile(cfile, outputfilename, include_dirs=[], libraries=[],
+               library_dirs=[]):
+    if sys.platform == 'win32':
+        compile_extra = ["/we4013"]
+        link_extra = ["/LIBPATH:" + os.path.join(sys.base_prefix, 'libs')]
+    elif sys.platform.startswith('linux'):
+        compile_extra = [
+            "-O0", "-g", "-Werror=implicit-function-declaration", "-fPIC"]
+        link_extra = None
+    else:
+        compile_extra = link_extra = None
+        pass
+    if sys.platform == 'win32':
+        link_extra = link_extra + ['/DEBUG']  # generate .pdb file
+    if sys.platform == 'darwin':
+        # support Fink & Darwinports
+        for s in ('/sw/', '/opt/local/'):
+            if (s + 'include' not in include_dirs
+                    and os.path.exists(s + 'include')):
+                include_dirs.append(s + 'include')
+            if s + 'lib' not in library_dirs and os.path.exists(s + 'lib'):
+                library_dirs.append(s + 'lib')
+
+    outputfilename = outputfilename.with_suffix(get_so_suffix())
+    saved_environ = os.environ.copy()
+    try:
+        build(
+            cfile, outputfilename,
+            compile_extra, link_extra,
+            include_dirs, libraries, library_dirs)
+    finally:
+        # workaround for a distutils bugs where some env vars can
+        # become longer and longer every time it is used
+        for key, value in saved_environ.items():
+            if os.environ.get(key) != value:
+                os.environ[key] = value
+    return outputfilename
+
+
+def build(cfile, outputfilename, compile_extra, link_extra,
+          include_dirs, libraries, library_dirs):
+    "cd into the directory where the cfile is, use distutils to build"
+
+    compiler = new_compiler(force=1, verbose=2)
+    compiler.customize('')
+    objects = []
+
+    old = os.getcwd()
+    os.chdir(cfile.parent)
+    try:
+        res = compiler.compile(
+            [str(cfile.name)],
+            include_dirs=include_dirs,
+            extra_preargs=compile_extra
+            )
+        objects += [str(cfile.parent / r) for r in res]
+    finally:
+        os.chdir(old)
+
+    compiler.link_shared_object(
+        objects, str(outputfilename),
+        libraries=libraries,
+        extra_preargs=link_extra,
+        library_dirs=library_dirs)
+
+
+def get_so_suffix():
+    ret = sysconfig.get_config_var('EXT_SUFFIX')
+    assert ret
+    return ret
index 917fa157e087319c2be6b56115b6343d7981b9ef..0eb945d15cc7b7eacca3482e20fd98ae9e4e3a71 100644 (file)
@@ -35,8 +35,7 @@ __all__ = [
         'assert_allclose', 'IgnoreException', 'clear_and_catch_warnings',
         'SkipTest', 'KnownFailureException', 'temppath', 'tempdir', 'IS_PYPY',
         'HAS_REFCOUNT', 'suppress_warnings', 'assert_array_compare',
-        '_assert_valid_refcount', '_gen_alignment_data', 'assert_no_gc_cycles',
-        'break_cycles', 'HAS_LAPACK64'
+        'assert_no_gc_cycles', 'break_cycles', 'HAS_LAPACK64', 'IS_PYSTON',
         ]
 
 
@@ -49,7 +48,8 @@ KnownFailureTest = KnownFailureException  # backwards compat
 verbose = 0
 
 IS_PYPY = platform.python_implementation() == 'PyPy'
-HAS_REFCOUNT = getattr(sys, 'getrefcount', None) is not None
+IS_PYSTON = hasattr(sys, "pyston_version_info")
+HAS_REFCOUNT = getattr(sys, 'getrefcount', None) is not None and not IS_PYSTON
 HAS_LAPACK64 = numpy.linalg.lapack_lite._ilp64
 
 
@@ -2402,9 +2402,9 @@ def break_cycles():
 
     gc.collect()
     if IS_PYPY:
-        # interpreter runs now, to call deleted objects' __del__ methods
+        # a few more, just to make sure all the finalizers are called
+        gc.collect()
         gc.collect()
-        # two more, just to make sure
         gc.collect()
         gc.collect()
 
@@ -2518,4 +2518,3 @@ def _no_tracing(func):
             finally:
                 sys.settrace(original_trace)
         return wrapper
-
diff --git a/numpy/testing/_private/utils.pyi b/numpy/testing/_private/utils.pyi
new file mode 100644 (file)
index 0000000..4ba5d82
--- /dev/null
@@ -0,0 +1,400 @@
+import os
+import sys
+import ast
+import types
+import warnings
+import unittest
+import contextlib
+from typing import (
+    Literal as L,
+    Any,
+    AnyStr,
+    Callable,
+    ClassVar,
+    Dict,
+    Iterable,
+    List,
+    NoReturn,
+    overload,
+    Pattern,
+    Sequence,
+    Set,
+    Tuple,
+    Type,
+    type_check_only,
+    TypeVar,
+    Union,
+    Final,
+    SupportsIndex,
+)
+
+from numpy import generic, dtype, number, object_, bool_, _FloatValue
+from numpy.typing import (
+    NDArray,
+    ArrayLike,
+    DTypeLike,
+    _ArrayLikeNumber_co,
+    _ArrayLikeObject_co,
+    _ArrayLikeTD64_co,
+    _ArrayLikeDT64_co,
+)
+
+from unittest.case import (
+    SkipTest as SkipTest,
+)
+
+_T = TypeVar("_T")
+_ET = TypeVar("_ET", bound=BaseException)
+_FT = TypeVar("_FT", bound=Callable[..., Any])
+
+# Must return a bool or an ndarray/generic type
+# that is supported by `np.logical_and.reduce`
+_ComparisonFunc = Callable[
+    [NDArray[Any], NDArray[Any]],
+    Union[
+        bool,
+        bool_,
+        number[Any],
+        NDArray[Union[bool_, number[Any], object_]],
+    ],
+]
+
+__all__: List[str]
+
+class KnownFailureException(Exception): ...
+class IgnoreException(Exception): ...
+
+class clear_and_catch_warnings(warnings.catch_warnings):
+    class_modules: ClassVar[Tuple[types.ModuleType, ...]]
+    modules: Set[types.ModuleType]
+    @overload
+    def __new__(
+        cls,
+        record: L[False] = ...,
+        modules: Iterable[types.ModuleType] = ...,
+    ) -> _clear_and_catch_warnings_without_records: ...
+    @overload
+    def __new__(
+        cls,
+        record: L[True],
+        modules: Iterable[types.ModuleType] = ...,
+    ) -> _clear_and_catch_warnings_with_records: ...
+    @overload
+    def __new__(
+        cls,
+        record: bool,
+        modules: Iterable[types.ModuleType] = ...,
+    ) -> clear_and_catch_warnings: ...
+    def __enter__(self) -> None | List[warnings.WarningMessage]: ...
+    def __exit__(
+        self,
+        __exc_type: None | Type[BaseException] = ...,
+        __exc_val: None | BaseException = ...,
+        __exc_tb: None | types.TracebackType = ...,
+    ) -> None: ...
+
+# Type-check only `clear_and_catch_warnings` subclasses for both values of the
+# `record` parameter. Copied from the stdlib `warnings` stubs.
+
+@type_check_only
+class _clear_and_catch_warnings_with_records(clear_and_catch_warnings):
+    def __enter__(self) -> List[warnings.WarningMessage]: ...
+
+@type_check_only
+class _clear_and_catch_warnings_without_records(clear_and_catch_warnings):
+    def __enter__(self) -> None: ...
+
+class suppress_warnings:
+    log: List[warnings.WarningMessage]
+    def __init__(
+        self,
+        forwarding_rule: L["always", "module", "once", "location"] = ...,
+    ) -> None: ...
+    def filter(
+        self,
+        category: Type[Warning] = ...,
+        message: str = ...,
+        module: None | types.ModuleType = ...,
+    ) -> None: ...
+    def record(
+        self,
+        category: Type[Warning] = ...,
+        message: str = ...,
+        module: None | types.ModuleType = ...,
+    ) -> List[warnings.WarningMessage]: ...
+    def __enter__(self: _T) -> _T: ...
+    def __exit__(
+        self,
+        __exc_type: None | Type[BaseException] = ...,
+        __exc_val: None | BaseException = ...,
+        __exc_tb: None | types.TracebackType = ...,
+    ) -> None: ...
+    def __call__(self, func: _FT) -> _FT: ...
+
+verbose: int
+IS_PYPY: Final[bool]
+IS_PYSTON: Final[bool]
+HAS_REFCOUNT: Final[bool]
+HAS_LAPACK64: Final[bool]
+
+def assert_(val: object, msg: str | Callable[[], str] = ...) -> None: ...
+
+# Contrary to runtime we can't do `os.name` checks while type checking,
+# only `sys.platform` checks
+if sys.platform == "win32" or sys.platform == "cygwin":
+    def memusage(processName: str = ..., instance: int = ...) -> int: ...
+elif sys.platform == "linux":
+    def memusage(_proc_pid_stat: str | bytes | os.PathLike[Any] = ...) -> None | int: ...
+else:
+    def memusage() -> NoReturn: ...
+
+if sys.platform == "linux":
+    def jiffies(
+        _proc_pid_stat: str | bytes | os.PathLike[Any] = ...,
+        _load_time: List[float] = ...,
+    ) -> int: ...
+else:
+    def jiffies(_load_time: List[float] = ...) -> int: ...
+
+def build_err_msg(
+    arrays: Iterable[object],
+    err_msg: str,
+    header: str = ...,
+    verbose: bool = ...,
+    names: Sequence[str] = ...,
+    precision: None | SupportsIndex = ...,
+) -> str: ...
+
+def assert_equal(
+    actual: object,
+    desired: object,
+    err_msg: str = ...,
+    verbose: bool = ...,
+) -> None: ...
+
+def print_assert_equal(
+    test_string: str,
+    actual: object,
+    desired: object,
+) -> None: ...
+
+def assert_almost_equal(
+    actual: _ArrayLikeNumber_co | _ArrayLikeObject_co,
+    desired: _ArrayLikeNumber_co | _ArrayLikeObject_co,
+    decimal: int = ...,
+    err_msg: str = ...,
+    verbose: bool = ...,
+) -> None: ...
+
+# Anything that can be coerced into `builtins.float`
+def assert_approx_equal(
+    actual: _FloatValue,
+    desired: _FloatValue,
+    significant: int = ...,
+    err_msg: str = ...,
+    verbose: bool = ...,
+) -> None: ...
+
+def assert_array_compare(
+    comparison: _ComparisonFunc,
+    x: ArrayLike,
+    y: ArrayLike,
+    err_msg: str = ...,
+    verbose: bool = ...,
+    header: str = ...,
+    precision: SupportsIndex = ...,
+    equal_nan: bool = ...,
+    equal_inf: bool = ...,
+) -> None: ...
+
+def assert_array_equal(
+    x: ArrayLike,
+    y: ArrayLike,
+    err_msg: str = ...,
+    verbose: bool = ...,
+) -> None: ...
+
+def assert_array_almost_equal(
+    x: _ArrayLikeNumber_co | _ArrayLikeObject_co,
+    y: _ArrayLikeNumber_co | _ArrayLikeObject_co,
+    decimal: float = ...,
+    err_msg: str = ...,
+    verbose: bool = ...,
+) -> None: ...
+
+@overload
+def assert_array_less(
+    x: _ArrayLikeNumber_co | _ArrayLikeObject_co,
+    y: _ArrayLikeNumber_co | _ArrayLikeObject_co,
+    err_msg: str = ...,
+    verbose: bool = ...,
+) -> None: ...
+@overload
+def assert_array_less(
+    x: _ArrayLikeTD64_co,
+    y: _ArrayLikeTD64_co,
+    err_msg: str = ...,
+    verbose: bool = ...,
+) -> None: ...
+@overload
+def assert_array_less(
+    x: _ArrayLikeDT64_co,
+    y: _ArrayLikeDT64_co,
+    err_msg: str = ...,
+    verbose: bool = ...,
+) -> None: ...
+
+def runstring(
+    astr: str | bytes | types.CodeType,
+    dict: None | Dict[str, Any],
+) -> Any: ...
+
+def assert_string_equal(actual: str, desired: str) -> None: ...
+
+def rundocs(
+    filename: None | str | os.PathLike[str] = ...,
+    raise_on_error: bool = ...,
+) -> None: ...
+
+def raises(*args: Type[BaseException]) -> Callable[[_FT], _FT]: ...
+
+@overload
+def assert_raises(  # type: ignore
+    expected_exception: Type[BaseException] | Tuple[Type[BaseException], ...],
+    callable: Callable[..., Any],
+    /,
+    *args: Any,
+    **kwargs: Any,
+) -> None: ...
+@overload
+def assert_raises(
+    expected_exception: Type[_ET] | Tuple[Type[_ET], ...],
+    *,
+    msg: None | str = ...,
+) -> unittest.case._AssertRaisesContext[_ET]: ...
+
+@overload
+def assert_raises_regex(
+    expected_exception: Type[BaseException] | Tuple[Type[BaseException], ...],
+    expected_regex: str | bytes | Pattern[Any],
+    callable: Callable[..., Any],
+    /,
+    *args: Any,
+    **kwargs: Any,
+) -> None: ...
+@overload
+def assert_raises_regex(
+    expected_exception: Type[_ET] | Tuple[Type[_ET], ...],
+    expected_regex: str | bytes | Pattern[Any],
+    *,
+    msg: None | str = ...,
+) -> unittest.case._AssertRaisesContext[_ET]: ...
+
+def decorate_methods(
+    cls: Type[Any],
+    decorator: Callable[[Callable[..., Any]], Any],
+    testmatch: None | str | bytes | Pattern[Any] = ...,
+) -> None: ...
+
+def measure(
+    code_str: str | bytes | ast.mod | ast.AST,
+    times: int = ...,
+    label: None | str = ...,
+) -> float: ...
+
+@overload
+def assert_allclose(
+    actual: _ArrayLikeNumber_co | _ArrayLikeObject_co,
+    desired: _ArrayLikeNumber_co | _ArrayLikeObject_co,
+    rtol: float = ...,
+    atol: float = ...,
+    equal_nan: bool = ...,
+    err_msg: str = ...,
+    verbose: bool = ...,
+) -> None: ...
+@overload
+def assert_allclose(
+    actual: _ArrayLikeTD64_co,
+    desired: _ArrayLikeTD64_co,
+    rtol: float = ...,
+    atol: float = ...,
+    equal_nan: bool = ...,
+    err_msg: str = ...,
+    verbose: bool = ...,
+) -> None: ...
+
+def assert_array_almost_equal_nulp(
+    x: _ArrayLikeNumber_co,
+    y: _ArrayLikeNumber_co,
+    nulp: float = ...,
+) -> None: ...
+
+def assert_array_max_ulp(
+    a: _ArrayLikeNumber_co,
+    b: _ArrayLikeNumber_co,
+    maxulp: float = ...,
+    dtype: DTypeLike = ...,
+) -> NDArray[Any]: ...
+
+@overload
+def assert_warns(
+    warning_class: Type[Warning],
+) -> contextlib._GeneratorContextManager[None]: ...
+@overload
+def assert_warns(
+    warning_class: Type[Warning],
+    func: Callable[..., _T],
+    /,
+    *args: Any,
+    **kwargs: Any,
+) -> _T: ...
+
+@overload
+def assert_no_warnings() -> contextlib._GeneratorContextManager[None]: ...
+@overload
+def assert_no_warnings(
+    func: Callable[..., _T],
+    /,
+    *args: Any,
+    **kwargs: Any,
+) -> _T: ...
+
+@overload
+def tempdir(
+    suffix: None = ...,
+    prefix: None = ...,
+    dir: None = ...,
+) -> contextlib._GeneratorContextManager[str]: ...
+@overload
+def tempdir(
+    suffix: None | AnyStr = ...,
+    prefix: None | AnyStr = ...,
+    dir: None | AnyStr | os.PathLike[AnyStr] = ...,
+) -> contextlib._GeneratorContextManager[AnyStr]: ...
+
+@overload
+def temppath(
+    suffix: None = ...,
+    prefix: None = ...,
+    dir: None = ...,
+    text: bool = ...,
+) -> contextlib._GeneratorContextManager[str]: ...
+@overload
+def temppath(
+    suffix: None | AnyStr = ...,
+    prefix: None | AnyStr = ...,
+    dir: None | AnyStr | os.PathLike[AnyStr] = ...,
+    text: bool = ...,
+) -> contextlib._GeneratorContextManager[AnyStr]: ...
+
+@overload
+def assert_no_gc_cycles() -> contextlib._GeneratorContextManager[None]: ...
+@overload
+def assert_no_gc_cycles(
+    func: Callable[..., Any],
+    /,
+    *args: Any,
+    **kwargs: Any,
+) -> None: ...
+
+def break_cycles() -> None: ...
index 7652a94a2660c2e64919295fa88dfd7699385cbe..6f203e87271109763f2f947b711bd4124cd1138a 100755 (executable)
@@ -7,6 +7,7 @@ def configuration(parent_package='',top_path=None):
     config.add_subpackage('_private')
     config.add_subpackage('tests')
     config.add_data_files('*.pyi')
+    config.add_data_files('_private/*.pyi')
     return config
 
 if __name__ == '__main__':
index 753258c1368385cfdc4bc908006a62f954561701..20a88330434235e82dab33e1f641db545a8b9e17 100644 (file)
@@ -12,6 +12,7 @@ warnings.warn("Importing from numpy.testing.utils is deprecated "
               DeprecationWarning, stacklevel=2)
 
 from ._private.utils import *
+from ._private.utils import _assert_valid_refcount, _gen_alignment_data
 
 __all__ = [
         'assert_equal', 'assert_almost_equal', 'assert_approx_equal',
@@ -24,5 +25,5 @@ __all__ = [
         'assert_allclose', 'IgnoreException', 'clear_and_catch_warnings',
         'SkipTest', 'KnownFailureException', 'temppath', 'tempdir', 'IS_PYPY',
         'HAS_REFCOUNT', 'suppress_warnings', 'assert_array_compare',
-        '_assert_valid_refcount', '_gen_alignment_data', 'assert_no_gc_cycles'
+        'assert_no_gc_cycles'
         ]
diff --git a/numpy/tests/test__all__.py b/numpy/tests/test__all__.py
new file mode 100644 (file)
index 0000000..e44bda3
--- /dev/null
@@ -0,0 +1,9 @@
+
+import collections
+import numpy as np
+
+
+def test_no_duplicates_in_np__all__():
+    # Regression test for gh-10198.
+    dups = {k: v for k, v in collections.Counter(np.__all__).items() if v > 1}
+    assert len(dups) == 0
index af3730df1cc9aeb067f20081cae5866eb6f1c992..1ea0837008b75608c9cf9aa61aae3e9edf7c2720 100644 (file)
@@ -1,6 +1,7 @@
 import sys
 import pytest
 import weakref
+from pathlib import Path
 
 import numpy as np
 from numpy.ctypeslib import ndpointer, load_library, as_array
@@ -37,13 +38,15 @@ else:
                     reason="Known to fail on cygwin")
 class TestLoadLibrary:
     def test_basic(self):
-        try:
-            # Should succeed
-            load_library('_multiarray_umath', np.core._multiarray_umath.__file__)
-        except ImportError as e:
-            msg = ("ctypes is not available on this python: skipping the test"
-                   " (import error was: %s)" % str(e))
-            print(msg)
+        loader_path = np.core._multiarray_umath.__file__
+
+        out1 = load_library('_multiarray_umath', loader_path)
+        out2 = load_library(Path('_multiarray_umath'), loader_path)
+        out3 = load_library('_multiarray_umath', Path(loader_path))
+        out4 = load_library(b'_multiarray_umath', loader_path)
+
+        assert isinstance(out1, ctypes.CDLL)
+        assert out1 is out2 is out3 is out4
 
     def test_basic2(self):
         # Regression for #801: load_library with a full library name
index 6e4a8dee0a7c5f2ef737fd3f04cedb72cba9b728..bb15e10e8241e8bfdf5f34387ad2cd10b38b017f 100644 (file)
@@ -1,4 +1,5 @@
 import sys
+import sysconfig
 import subprocess
 import pkgutil
 import types
@@ -45,8 +46,6 @@ def test_numpy_namespace():
         'fastCopyAndTranspose': 'numpy.core._multiarray_umath._fastCopyAndTranspose',
         'get_array_wrap': 'numpy.lib.shape_base.get_array_wrap',
         'get_include': 'numpy.lib.utils.get_include',
-        'mafromtxt': 'numpy.lib.npyio.mafromtxt',
-        'ndfromtxt': 'numpy.lib.npyio.ndfromtxt',
         'recfromcsv': 'numpy.lib.npyio.recfromcsv',
         'recfromtxt': 'numpy.lib.npyio.recfromtxt',
         'safe_eval': 'numpy.lib.utils.safe_eval',
@@ -54,22 +53,8 @@ def test_numpy_namespace():
         'show_config': 'numpy.__config__.show',
         'who': 'numpy.lib.utils.who',
     }
-    if sys.version_info < (3, 7):
-        # These built-in types are re-exported by numpy.
-        builtins = {
-            'bool': 'builtins.bool',
-            'complex': 'builtins.complex',
-            'float': 'builtins.float',
-            'int': 'builtins.int',
-            'long': 'builtins.int',
-            'object': 'builtins.object',
-            'str': 'builtins.str',
-            'unicode': 'builtins.str',
-        }
-        allowlist = dict(undocumented, **builtins)
-    else:
-        # after 3.7, we override dir to not show these members
-        allowlist = undocumented
+    # We override dir to not show these members
+    allowlist = undocumented
     bad_results = check_dir(np)
     # pytest gives better error messages with the builtin assert than with
     # assert_equal
@@ -137,6 +122,8 @@ def test_NPY_NO_EXPORT():
 # current status is fine.  For others it may make sense to work on making them
 # private, to clean up our public API and avoid confusion.
 PUBLIC_MODULES = ['numpy.' + s for s in [
+    "array_api",
+    "array_api.linalg",
     "ctypeslib",
     "distutils",
     "distutils.cpuinfo",
@@ -193,7 +180,6 @@ PRIVATE_BUT_PRESENT_MODULES = ['numpy.' + s for s in [
     "core.fromnumeric",
     "core.function_base",
     "core.getlimits",
-    "core.machar",
     "core.memmap",
     "core.multiarray",
     "core.numeric",
@@ -203,6 +189,7 @@ PRIVATE_BUT_PRESENT_MODULES = ['numpy.' + s for s in [
     "core.shape_base",
     "core.umath",
     "core.umath_tests",
+    "distutils.armccompiler",
     "distutils.ccompiler",
     'distutils.ccompiler_opt',
     "distutils.command",
@@ -228,6 +215,7 @@ PRIVATE_BUT_PRESENT_MODULES = ['numpy.' + s for s in [
     "distutils.extension",
     "distutils.fcompiler",
     "distutils.fcompiler.absoft",
+    "distutils.fcompiler.arm",
     "distutils.fcompiler.compaq",
     "distutils.fcompiler.environment",
     "distutils.fcompiler.g95",
@@ -268,6 +256,7 @@ PRIVATE_BUT_PRESENT_MODULES = ['numpy.' + s for s in [
     "f2py.f90mod_rules",
     "f2py.func2subr",
     "f2py.rules",
+    "f2py.symbolic",
     "f2py.use_rules",
     "fft.helper",
     "lib.arraypad",
@@ -473,3 +462,40 @@ def test_api_importable():
         raise AssertionError("Modules that are not really public but looked "
                              "public and can not be imported: "
                              "{}".format(module_names))
+
+
+@pytest.mark.xfail(
+    sysconfig.get_config_var("Py_DEBUG") is not None,
+    reason=(
+        "NumPy possibly built with `USE_DEBUG=True ./tools/travis-test.sh`, "
+        "which does not expose the `array_api` entry point. "
+        "See https://github.com/numpy/numpy/pull/19800"
+    ),
+)
+def test_array_api_entry_point():
+    """
+    Entry point for Array API implementation can be found with importlib and
+    returns the numpy.array_api namespace.
+    """
+    eps = importlib.metadata.entry_points()
+    try:
+        xp_eps = eps.select(group="array_api")
+    except AttributeError:
+        # The select interface for entry_points was introduced in py3.10,
+        # deprecating its dict interface. We fallback to dict keys for finding
+        # Array API entry points so that running this test in <=3.9 will
+        # still work - see https://github.com/numpy/numpy/pull/19800.
+        xp_eps = eps.get("array_api", [])
+    assert len(xp_eps) > 0, "No entry points for 'array_api' found"
+
+    try:
+        ep = next(ep for ep in xp_eps if ep.name == "numpy")
+    except StopIteration:
+        raise AssertionError("'numpy' not in array_api entry points") from None
+
+    xp = ep.load()
+    msg = (
+        f"numpy entry point value '{ep.value}' "
+        "does not point to our Array API implementation"
+    )
+    assert xp is numpy.array_api, msg
index 5c4309f4ab8859bbd92e501feb5b306e013b1dba..8d8c8aa34be8cc90d783139224604c4f9c6f955f 100644 (file)
@@ -57,5 +57,8 @@ def test_full_reimport():
         with warns(UserWarning):
             import numpy as np
         """)
-    p = subprocess.run([sys.executable, '-c', code])
-
+    p = subprocess.run([sys.executable, '-c', code], capture_output=True)
+    if p.returncode:
+        raise AssertionError(
+            f"Non-zero return code: {p.returncode!r}\n\n{p.stderr.decode()}"
+        )
index 0cf534bc01b6ccf59dd689ad3d97e5821c522671..d5cfbf5acc45b9c9d4efb53eaf599c73325b4875 100644 (file)
@@ -3,12 +3,7 @@
 Typing (:mod:`numpy.typing`)
 ============================
 
-.. warning::
-
-  Some of the types in this module rely on features only present in
-  the standard library in Python 3.8 and greater. If you want to use
-  these types in earlier versions of Python, you should install the
-  typing-extensions_ package.
+.. versionadded:: 1.20
 
 Large parts of the NumPy API have PEP-484-style type annotations. In
 addition a number of type aliases are available to users, most prominently
@@ -22,29 +17,11 @@ the two below:
 Mypy plugin
 -----------
 
-A mypy_ plugin is distributed in `numpy.typing` for managing a number of
-platform-specific annotations. Its function can be split into to parts:
-
-* Assigning the (platform-dependent) precisions of certain `~numpy.number` subclasses,
-  including the likes of `~numpy.int_`, `~numpy.intp` and `~numpy.longlong`.
-  See the documentation on :ref:`scalar types <arrays.scalars.built-in>` for a
-  comprehensive overview of the affected classes. without the plugin the precision
-  of all relevant classes will be inferred as `~typing.Any`.
-* Removing all extended-precision `~numpy.number` subclasses that are unavailable
-  for the platform in question. Most notable this includes the likes of
-  `~numpy.float128` and `~numpy.complex256`. Without the plugin *all*
-  extended-precision types will, as far as mypy is concerned, be available
-  to all platforms.
-
-To enable the plugin, one must add it to their mypy `configuration file`_:
+.. versionadded:: 1.21
 
-.. code-block:: ini
+.. automodule:: numpy.typing.mypy_plugin
 
-    [mypy]
-    plugins = numpy.typing.mypy_plugin
-
-.. _mypy: http://mypy-lang.org/
-.. _configuration file: https://mypy.readthedocs.io/en/stable/config_file.html
+.. currentmodule:: numpy.typing
 
 Differences from the runtime NumPy API
 --------------------------------------
@@ -137,8 +114,9 @@ runtime, they're not necessarily considered as sub-classes.
 Timedelta64
 ~~~~~~~~~~~
 
-The `~numpy.timedelta64` class is not considered a subclass of `~numpy.signedinteger`,
-the former only inheriting from `~numpy.generic` while static type checking.
+The `~numpy.timedelta64` class is not considered a subclass of
+`~numpy.signedinteger`, the former only inheriting from `~numpy.generic`
+while static type checking.
 
 0D arrays
 ~~~~~~~~~
@@ -154,6 +132,22 @@ If it is known in advance that an operation _will_ perform a
 0D-array -> scalar cast, then one can consider manually remedying the
 situation with either `typing.cast` or a ``# type: ignore`` comment.
 
+Record array dtypes
+~~~~~~~~~~~~~~~~~~~
+
+The dtype of `numpy.recarray`, and the `numpy.rec` functions in general,
+can be specified in one of two ways:
+
+* Directly via the ``dtype`` argument.
+* With up to five helper arguments that operate via `numpy.format_parser`:
+  ``formats``, ``names``, ``titles``, ``aligned`` and ``byteorder``.
+
+These two approaches are currently typed as being mutually exclusive,
+*i.e.* if ``dtype`` is specified than one may not specify ``formats``.
+While this mutual exclusivity is not (strictly) enforced during runtime,
+combining both dtype specifiers can lead to unexpected or even downright
+buggy behavior.
+
 API
 ---
 
@@ -161,17 +155,10 @@ API
 # NOTE: The API section will be appended with additional entries
 # further down in this file
 
-from numpy import ufunc
-from typing import TYPE_CHECKING, List
+from __future__ import annotations
 
-if TYPE_CHECKING:
-    import sys
-    if sys.version_info >= (3, 8):
-        from typing import final
-    else:
-        from typing_extensions import final
-else:
-    def final(f): return f
+from numpy import ufunc
+from typing import TYPE_CHECKING, final
 
 if not TYPE_CHECKING:
     __all__ = ["ArrayLike", "DTypeLike", "NBitBase", "NDArray"]
@@ -182,37 +169,40 @@ else:
     #
     # Declare to mypy that `__all__` is a list of strings without assigning
     # an explicit value
-    __all__: List[str]
+    __all__: list[str]
+    __path__: list[str]
 
 
-@final  # Dissallow the creation of arbitrary `NBitBase` subclasses
+@final  # Disallow the creation of arbitrary `NBitBase` subclasses
 class NBitBase:
     """
-    An object representing `numpy.number` precision during static type checking.
+    A type representing `numpy.number` precision during static type checking.
 
     Used exclusively for the purpose static type checking, `NBitBase`
     represents the base of a hierarchical set of subclasses.
     Each subsequent subclass is herein used for representing a lower level
     of precision, *e.g.* ``64Bit > 32Bit > 16Bit``.
 
+    .. versionadded:: 1.20
+
     Examples
     --------
-    Below is a typical usage example: `NBitBase` is herein used for annotating a
-    function that takes a float and integer of arbitrary precision as arguments
-    and returns a new float of whichever precision is largest
+    Below is a typical usage example: `NBitBase` is herein used for annotating
+    a function that takes a float and integer of arbitrary precision
+    as arguments and returns a new float of whichever precision is largest
     (*e.g.* ``np.float16 + np.int64 -> np.float64``).
 
     .. code-block:: python
 
         >>> from __future__ import annotations
-        >>> from typing import TypeVar, Union, TYPE_CHECKING
+        >>> from typing import TypeVar, TYPE_CHECKING
         >>> import numpy as np
         >>> import numpy.typing as npt
 
         >>> T1 = TypeVar("T1", bound=npt.NBitBase)
         >>> T2 = TypeVar("T2", bound=npt.NBitBase)
 
-        >>> def add(a: np.floating[T1], b: np.integer[T2]) -> np.floating[Union[T1, T2]]:
+        >>> def add(a: np.floating[T1], b: np.integer[T2]) -> np.floating[T1 | T2]:
         ...     return a + b
 
         >>> a = np.float16()
@@ -239,15 +229,32 @@ class NBitBase:
 
 
 # Silence errors about subclassing a `@final`-decorated class
-class _256Bit(NBitBase): ...  # type: ignore[misc]
-class _128Bit(_256Bit): ...  # type: ignore[misc]
-class _96Bit(_128Bit): ...  # type: ignore[misc]
-class _80Bit(_96Bit): ...  # type: ignore[misc]
-class _64Bit(_80Bit): ...  # type: ignore[misc]
-class _32Bit(_64Bit): ...  # type: ignore[misc]
-class _16Bit(_32Bit): ...  # type: ignore[misc]
-class _8Bit(_16Bit): ...  # type: ignore[misc]
+class _256Bit(NBitBase):  # type: ignore[misc]
+    pass
+
+class _128Bit(_256Bit):  # type: ignore[misc]
+    pass
+
+class _96Bit(_128Bit):  # type: ignore[misc]
+    pass
+
+class _80Bit(_96Bit):  # type: ignore[misc]
+    pass
+
+class _64Bit(_80Bit):  # type: ignore[misc]
+    pass
+
+class _32Bit(_64Bit):  # type: ignore[misc]
+    pass
+
+class _16Bit(_32Bit):  # type: ignore[misc]
+    pass
+
+class _8Bit(_16Bit):  # type: ignore[misc]
+    pass
+
 
+from ._nested_sequence import _NestedSequence
 from ._nbit import (
     _NBitByte,
     _NBitShort,
@@ -334,8 +341,7 @@ from ._dtype_like import (
 from ._array_like import (
     ArrayLike as ArrayLike,
     _ArrayLike,
-    _NestedSequence,
-    _RecursiveSequence,
+    _FiniteNestedSequence,
     _SupportsArray,
     _ArrayLikeInt,
     _ArrayLikeBool_co,
@@ -353,6 +359,7 @@ from ._array_like import (
 )
 from ._generic_alias import (
     NDArray as NDArray,
+    _DType,
     _GenericAlias,
 )
 
@@ -374,7 +381,7 @@ else:
     _GUFunc_Nin2_Nout1 = ufunc
 
 # Clean up the namespace
-del TYPE_CHECKING, final, List, ufunc
+del TYPE_CHECKING, final, ufunc
 
 if __doc__ is not None:
     from ._add_docstring import _docstrings
index 56ef41cfdb3cf4cf6ede5832f72f23a5627d804d..10d77f5161d35cae18d6546900882a064e22fed3 100644 (file)
@@ -50,16 +50,17 @@ def _parse_docstrings() -> str:
                 new_lines.append("")
             else:
                 new_lines.append(f"{indent}{line}")
-        s = "\n".join(new_lines)
 
-        # Done.
-        type_list_ret.append(f""".. data:: {name}\n    :value: {value}\n    {s}""")
+        s = "\n".join(new_lines)
+        s_block = f""".. data:: {name}\n    :value: {value}\n    {s}"""
+        type_list_ret.append(s_block)
     return "\n".join(type_list_ret)
 
 
 add_newdoc('ArrayLike', 'typing.Union[...]',
     """
-    A `~typing.Union` representing objects that can be coerced into an `~numpy.ndarray`.
+    A `~typing.Union` representing objects that can be coerced
+    into an `~numpy.ndarray`.
 
     Among others this includes the likes of:
 
@@ -67,6 +68,8 @@ add_newdoc('ArrayLike', 'typing.Union[...]',
     * (Nested) sequences.
     * Objects implementing the `~class.__array__` protocol.
 
+    .. versionadded:: 1.20
+
     See Also
     --------
     :term:`array_like`:
@@ -86,7 +89,8 @@ add_newdoc('ArrayLike', 'typing.Union[...]',
 
 add_newdoc('DTypeLike', 'typing.Union[...]',
     """
-    A `~typing.Union` representing objects that can be coerced into a `~numpy.dtype`.
+    A `~typing.Union` representing objects that can be coerced
+    into a `~numpy.dtype`.
 
     Among others this includes the likes of:
 
@@ -94,10 +98,13 @@ add_newdoc('DTypeLike', 'typing.Union[...]',
     * Character codes or the names of :class:`type` objects.
     * Objects with the ``.dtype`` attribute.
 
+    .. versionadded:: 1.20
+
     See Also
     --------
     :ref:`Specifying and constructing data types <arrays.dtypes.constructing>`
-        A comprehensive overview of all objects that can be coerced into data types.
+        A comprehensive overview of all objects that can be coerced
+        into data types.
 
     Examples
     --------
@@ -119,6 +126,8 @@ add_newdoc('NDArray', repr(NDArray),
     Can be used during runtime for typing arrays with a given dtype
     and unspecified shape.
 
+    .. versionadded:: 1.21
+
     Examples
     --------
     .. code-block:: python
index a1642f9d03e59081bc48cddacc10a71fe6f7c02c..02e5ee573fc7e0489cd35f4355a781249a7bf547 100644 (file)
@@ -1,16 +1,6 @@
 from __future__ import annotations
 
-import sys
-from typing import (
-    Any,
-    overload,
-    Sequence,
-    TYPE_CHECKING,
-    Union,
-    TypeVar,
-    Generic,
-)
-
+from typing import Any, Sequence, Protocol, Union, TypeVar
 from numpy import (
     ndarray,
     dtype,
@@ -28,51 +18,38 @@ from numpy import (
     str_,
     bytes_,
 )
-from ._dtype_like import DTypeLike
-
-if sys.version_info >= (3, 8):
-    from typing import Protocol
-    HAVE_PROTOCOL = True
-else:
-    try:
-        from typing_extensions import Protocol
-    except ImportError:
-        HAVE_PROTOCOL = False
-    else:
-        HAVE_PROTOCOL = True
+from ._nested_sequence import _NestedSequence
 
 _T = TypeVar("_T")
 _ScalarType = TypeVar("_ScalarType", bound=generic)
 _DType = TypeVar("_DType", bound="dtype[Any]")
 _DType_co = TypeVar("_DType_co", covariant=True, bound="dtype[Any]")
 
-if TYPE_CHECKING or HAVE_PROTOCOL:
-    # The `_SupportsArray` protocol only cares about the default dtype
-    # (i.e. `dtype=None` or no `dtype` parameter at all) of the to-be returned
-    # array.
-    # Concrete implementations of the protocol are responsible for adding
-    # any and all remaining overloads
-    class _SupportsArray(Protocol[_DType_co]):
-        def __array__(self) -> ndarray[Any, _DType_co]: ...
-else:
-    class _SupportsArray(Generic[_DType_co]):
-        pass
+# The `_SupportsArray` protocol only cares about the default dtype
+# (i.e. `dtype=None` or no `dtype` parameter at all) of the to-be returned
+# array.
+# Concrete implementations of the protocol are responsible for adding
+# any and all remaining overloads
+class _SupportsArray(Protocol[_DType_co]):
+    def __array__(self) -> ndarray[Any, _DType_co]: ...
 
-# TODO: Wait for support for recursive types
-_NestedSequence = Union[
+
+# TODO: Wait until mypy supports recursive objects in combination with typevars
+_FiniteNestedSequence = Union[
     _T,
     Sequence[_T],
     Sequence[Sequence[_T]],
     Sequence[Sequence[Sequence[_T]]],
     Sequence[Sequence[Sequence[Sequence[_T]]]],
 ]
-_RecursiveSequence = Sequence[Sequence[Sequence[Sequence[Sequence[Any]]]]]
 
 # A union representing array-like objects; consists of two typevars:
 # One representing types that can be parametrized w.r.t. `np.dtype`
 # and another one for the rest
 _ArrayLike = Union[
+    _SupportsArray[_DType],
     _NestedSequence[_SupportsArray[_DType]],
+    _T,
     _NestedSequence[_T],
 ]
 
@@ -83,12 +60,9 @@ _ArrayLike = Union[
 # is resolved. See also the mypy issue:
 #
 # https://github.com/python/typing/issues/593
-ArrayLike = Union[
-    _RecursiveSequence,
-    _ArrayLike[
-        dtype,
-        Union[bool, int, float, complex, str, bytes]
-    ],
+ArrayLike = _ArrayLike[
+    dtype,
+    Union[bool, int, float, complex, str, bytes],
 ]
 
 # `ArrayLike<X>_co`: array-like objects that can be coerced into `X`
@@ -121,10 +95,19 @@ _ArrayLikeTD64_co = _ArrayLike[
     "dtype[Union[bool_, integer[Any], timedelta64]]",
     Union[bool, int],
 ]
-_ArrayLikeDT64_co = _NestedSequence[_SupportsArray["dtype[datetime64]"]]
-_ArrayLikeObject_co = _NestedSequence[_SupportsArray["dtype[object_]"]]
+_ArrayLikeDT64_co = Union[
+    _SupportsArray["dtype[datetime64]"],
+    _NestedSequence[_SupportsArray["dtype[datetime64]"]],
+]
+_ArrayLikeObject_co = Union[
+    _SupportsArray["dtype[object_]"],
+    _NestedSequence[_SupportsArray["dtype[object_]"]],
+]
 
-_ArrayLikeVoid_co = _NestedSequence[_SupportsArray["dtype[void]"]]
+_ArrayLikeVoid_co = Union[
+    _SupportsArray["dtype[void]"],
+    _NestedSequence[_SupportsArray["dtype[void]"]],
+]
 _ArrayLikeStr_co = _ArrayLike[
     "dtype[str_]",
     str,
diff --git a/numpy/typing/_callable.py b/numpy/typing/_callable.py
deleted file mode 100644 (file)
index d9cb0f1..0000000
+++ /dev/null
@@ -1,364 +0,0 @@
-"""
-A module with various ``typing.Protocol`` subclasses that implement
-the ``__call__`` magic method.
-
-See the `Mypy documentation`_ on protocols for more details.
-
-.. _`Mypy documentation`: https://mypy.readthedocs.io/en/stable/protocols.html#callback-protocols
-
-"""
-
-from __future__ import annotations
-
-import sys
-from typing import (
-    Union,
-    TypeVar,
-    overload,
-    Any,
-    Tuple,
-    NoReturn,
-    TYPE_CHECKING,
-)
-
-from numpy import (
-    ndarray,
-    dtype,
-    generic,
-    bool_,
-    timedelta64,
-    number,
-    integer,
-    unsignedinteger,
-    signedinteger,
-    int8,
-    int_,
-    floating,
-    float64,
-    complexfloating,
-    complex128,
-)
-from ._nbit import _NBitInt, _NBitDouble
-from ._scalars import (
-    _BoolLike_co,
-    _IntLike_co,
-    _FloatLike_co,
-    _ComplexLike_co,
-    _NumberLike_co,
-)
-from . import NBitBase
-from ._array_like import ArrayLike
-from ._generic_alias import NDArray
-
-if sys.version_info >= (3, 8):
-    from typing import Protocol
-    HAVE_PROTOCOL = True
-else:
-    try:
-        from typing_extensions import Protocol
-    except ImportError:
-        HAVE_PROTOCOL = False
-    else:
-        HAVE_PROTOCOL = True
-
-if TYPE_CHECKING or HAVE_PROTOCOL:
-    _T1 = TypeVar("_T1")
-    _T2 = TypeVar("_T2")
-    _2Tuple = Tuple[_T1, _T1]
-
-    _NBit1 = TypeVar("_NBit1", bound=NBitBase)
-    _NBit2 = TypeVar("_NBit2", bound=NBitBase)
-
-    _IntType = TypeVar("_IntType", bound=integer)
-    _FloatType = TypeVar("_FloatType", bound=floating)
-    _NumberType = TypeVar("_NumberType", bound=number)
-    _NumberType_co = TypeVar("_NumberType_co", covariant=True, bound=number)
-    _GenericType_co = TypeVar("_GenericType_co", covariant=True, bound=generic)
-
-    class _BoolOp(Protocol[_GenericType_co]):
-        @overload
-        def __call__(self, __other: _BoolLike_co) -> _GenericType_co: ...
-        @overload  # platform dependent
-        def __call__(self, __other: int) -> int_: ...
-        @overload
-        def __call__(self, __other: float) -> float64: ...
-        @overload
-        def __call__(self, __other: complex) -> complex128: ...
-        @overload
-        def __call__(self, __other: _NumberType) -> _NumberType: ...
-
-    class _BoolBitOp(Protocol[_GenericType_co]):
-        @overload
-        def __call__(self, __other: _BoolLike_co) -> _GenericType_co: ...
-        @overload  # platform dependent
-        def __call__(self, __other: int) -> int_: ...
-        @overload
-        def __call__(self, __other: _IntType) -> _IntType: ...
-
-    class _BoolSub(Protocol):
-        # Note that `__other: bool_` is absent here
-        @overload
-        def __call__(self, __other: bool) -> NoReturn: ...
-        @overload  # platform dependent
-        def __call__(self, __other: int) -> int_: ...
-        @overload
-        def __call__(self, __other: float) -> float64: ...
-        @overload
-        def __call__(self, __other: complex) -> complex128: ...
-        @overload
-        def __call__(self, __other: _NumberType) -> _NumberType: ...
-
-    class _BoolTrueDiv(Protocol):
-        @overload
-        def __call__(self, __other: Union[float, _IntLike_co]) -> float64: ...
-        @overload
-        def __call__(self, __other: complex) -> complex128: ...
-        @overload
-        def __call__(self, __other: _NumberType) -> _NumberType: ...
-
-    class _BoolMod(Protocol):
-        @overload
-        def __call__(self, __other: _BoolLike_co) -> int8: ...
-        @overload  # platform dependent
-        def __call__(self, __other: int) -> int_: ...
-        @overload
-        def __call__(self, __other: float) -> float64: ...
-        @overload
-        def __call__(self, __other: _IntType) -> _IntType: ...
-        @overload
-        def __call__(self, __other: _FloatType) -> _FloatType: ...
-
-    class _BoolDivMod(Protocol):
-        @overload
-        def __call__(self, __other: _BoolLike_co) -> _2Tuple[int8]: ...
-        @overload  # platform dependent
-        def __call__(self, __other: int) -> _2Tuple[int_]: ...
-        @overload
-        def __call__(self, __other: float) -> _2Tuple[floating[Union[_NBit1, _NBitDouble]]]: ...
-        @overload
-        def __call__(self, __other: _IntType) -> _2Tuple[_IntType]: ...
-        @overload
-        def __call__(self, __other: _FloatType) -> _2Tuple[_FloatType]: ...
-
-    class _TD64Div(Protocol[_NumberType_co]):
-        @overload
-        def __call__(self, __other: timedelta64) -> _NumberType_co: ...
-        @overload
-        def __call__(self, __other: _BoolLike_co) -> NoReturn: ...
-        @overload
-        def __call__(self, __other: _FloatLike_co) -> timedelta64: ...
-
-    class _IntTrueDiv(Protocol[_NBit1]):
-        @overload
-        def __call__(self, __other: bool) -> floating[_NBit1]: ...
-        @overload
-        def __call__(self, __other: int) -> floating[Union[_NBit1, _NBitInt]]: ...
-        @overload
-        def __call__(self, __other: float) -> floating[Union[_NBit1, _NBitDouble]]: ...
-        @overload
-        def __call__(
-            self, __other: complex
-        ) -> complexfloating[Union[_NBit1, _NBitDouble], Union[_NBit1, _NBitDouble]]: ...
-        @overload
-        def __call__(self, __other: integer[_NBit2]) -> floating[Union[_NBit1, _NBit2]]: ...
-
-    class _UnsignedIntOp(Protocol[_NBit1]):
-        # NOTE: `uint64 + signedinteger -> float64`
-        @overload
-        def __call__(self, __other: bool) -> unsignedinteger[_NBit1]: ...
-        @overload
-        def __call__(
-            self, __other: Union[int, signedinteger[Any]]
-        ) -> Any: ...
-        @overload
-        def __call__(self, __other: float) -> floating[Union[_NBit1, _NBitDouble]]: ...
-        @overload
-        def __call__(
-            self, __other: complex
-        ) -> complexfloating[Union[_NBit1, _NBitDouble], Union[_NBit1, _NBitDouble]]: ...
-        @overload
-        def __call__(
-            self, __other: unsignedinteger[_NBit2]
-        ) -> unsignedinteger[Union[_NBit1, _NBit2]]: ...
-
-    class _UnsignedIntBitOp(Protocol[_NBit1]):
-        @overload
-        def __call__(self, __other: bool) -> unsignedinteger[_NBit1]: ...
-        @overload
-        def __call__(self, __other: int) -> signedinteger[Any]: ...
-        @overload
-        def __call__(self, __other: signedinteger[Any]) -> signedinteger[Any]: ...
-        @overload
-        def __call__(
-            self, __other: unsignedinteger[_NBit2]
-        ) -> unsignedinteger[Union[_NBit1, _NBit2]]: ...
-
-    class _UnsignedIntMod(Protocol[_NBit1]):
-        @overload
-        def __call__(self, __other: bool) -> unsignedinteger[_NBit1]: ...
-        @overload
-        def __call__(
-            self, __other: Union[int, signedinteger[Any]]
-        ) -> Any: ...
-        @overload
-        def __call__(self, __other: float) -> floating[Union[_NBit1, _NBitDouble]]: ...
-        @overload
-        def __call__(
-            self, __other: unsignedinteger[_NBit2]
-        ) -> unsignedinteger[Union[_NBit1, _NBit2]]: ...
-
-    class _UnsignedIntDivMod(Protocol[_NBit1]):
-        @overload
-        def __call__(self, __other: bool) -> _2Tuple[signedinteger[_NBit1]]: ...
-        @overload
-        def __call__(
-            self, __other: Union[int, signedinteger[Any]]
-        ) -> _2Tuple[Any]: ...
-        @overload
-        def __call__(self, __other: float) -> _2Tuple[floating[Union[_NBit1, _NBitDouble]]]: ...
-        @overload
-        def __call__(
-            self, __other: unsignedinteger[_NBit2]
-        ) -> _2Tuple[unsignedinteger[Union[_NBit1, _NBit2]]]: ...
-
-    class _SignedIntOp(Protocol[_NBit1]):
-        @overload
-        def __call__(self, __other: bool) -> signedinteger[_NBit1]: ...
-        @overload
-        def __call__(self, __other: int) -> signedinteger[Union[_NBit1, _NBitInt]]: ...
-        @overload
-        def __call__(self, __other: float) -> floating[Union[_NBit1, _NBitDouble]]: ...
-        @overload
-        def __call__(
-            self, __other: complex
-        ) -> complexfloating[Union[_NBit1, _NBitDouble], Union[_NBit1, _NBitDouble]]: ...
-        @overload
-        def __call__(
-            self, __other: signedinteger[_NBit2]
-        ) -> signedinteger[Union[_NBit1, _NBit2]]: ...
-
-    class _SignedIntBitOp(Protocol[_NBit1]):
-        @overload
-        def __call__(self, __other: bool) -> signedinteger[_NBit1]: ...
-        @overload
-        def __call__(self, __other: int) -> signedinteger[Union[_NBit1, _NBitInt]]: ...
-        @overload
-        def __call__(
-            self, __other: signedinteger[_NBit2]
-        ) -> signedinteger[Union[_NBit1, _NBit2]]: ...
-
-    class _SignedIntMod(Protocol[_NBit1]):
-        @overload
-        def __call__(self, __other: bool) -> signedinteger[_NBit1]: ...
-        @overload
-        def __call__(self, __other: int) -> signedinteger[Union[_NBit1, _NBitInt]]: ...
-        @overload
-        def __call__(self, __other: float) -> floating[Union[_NBit1, _NBitDouble]]: ...
-        @overload
-        def __call__(
-            self, __other: signedinteger[_NBit2]
-        ) -> signedinteger[Union[_NBit1, _NBit2]]: ...
-
-    class _SignedIntDivMod(Protocol[_NBit1]):
-        @overload
-        def __call__(self, __other: bool) -> _2Tuple[signedinteger[_NBit1]]: ...
-        @overload
-        def __call__(self, __other: int) -> _2Tuple[signedinteger[Union[_NBit1, _NBitInt]]]: ...
-        @overload
-        def __call__(self, __other: float) -> _2Tuple[floating[Union[_NBit1, _NBitDouble]]]: ...
-        @overload
-        def __call__(
-            self, __other: signedinteger[_NBit2]
-        ) -> _2Tuple[signedinteger[Union[_NBit1, _NBit2]]]: ...
-
-    class _FloatOp(Protocol[_NBit1]):
-        @overload
-        def __call__(self, __other: bool) -> floating[_NBit1]: ...
-        @overload
-        def __call__(self, __other: int) -> floating[Union[_NBit1, _NBitInt]]: ...
-        @overload
-        def __call__(self, __other: float) -> floating[Union[_NBit1, _NBitDouble]]: ...
-        @overload
-        def __call__(
-            self, __other: complex
-        ) -> complexfloating[Union[_NBit1, _NBitDouble], Union[_NBit1, _NBitDouble]]: ...
-        @overload
-        def __call__(
-            self, __other: Union[integer[_NBit2], floating[_NBit2]]
-        ) -> floating[Union[_NBit1, _NBit2]]: ...
-
-    class _FloatMod(Protocol[_NBit1]):
-        @overload
-        def __call__(self, __other: bool) -> floating[_NBit1]: ...
-        @overload
-        def __call__(self, __other: int) -> floating[Union[_NBit1, _NBitInt]]: ...
-        @overload
-        def __call__(self, __other: float) -> floating[Union[_NBit1, _NBitDouble]]: ...
-        @overload
-        def __call__(
-            self, __other: Union[integer[_NBit2], floating[_NBit2]]
-        ) -> floating[Union[_NBit1, _NBit2]]: ...
-
-    class _FloatDivMod(Protocol[_NBit1]):
-        @overload
-        def __call__(self, __other: bool) -> _2Tuple[floating[_NBit1]]: ...
-        @overload
-        def __call__(self, __other: int) -> _2Tuple[floating[Union[_NBit1, _NBitInt]]]: ...
-        @overload
-        def __call__(self, __other: float) -> _2Tuple[floating[Union[_NBit1, _NBitDouble]]]: ...
-        @overload
-        def __call__(
-            self, __other: Union[integer[_NBit2], floating[_NBit2]]
-        ) -> _2Tuple[floating[Union[_NBit1, _NBit2]]]: ...
-
-    class _ComplexOp(Protocol[_NBit1]):
-        @overload
-        def __call__(self, __other: bool) -> complexfloating[_NBit1, _NBit1]: ...
-        @overload
-        def __call__(self, __other: int) -> complexfloating[Union[_NBit1, _NBitInt], Union[_NBit1, _NBitInt]]: ...
-        @overload
-        def __call__(
-            self, __other: Union[float, complex]
-        ) -> complexfloating[Union[_NBit1, _NBitDouble], Union[_NBit1, _NBitDouble]]: ...
-        @overload
-        def __call__(
-            self,
-            __other: Union[
-                integer[_NBit2],
-                floating[_NBit2],
-                complexfloating[_NBit2, _NBit2],
-            ]
-        ) -> complexfloating[Union[_NBit1, _NBit2], Union[_NBit1, _NBit2]]: ...
-
-    class _NumberOp(Protocol):
-        def __call__(self, __other: _NumberLike_co) -> Any: ...
-
-    class _ComparisonOp(Protocol[_T1, _T2]):
-        @overload
-        def __call__(self, __other: _T1) -> bool_: ...
-        @overload
-        def __call__(self, __other: _T2) -> NDArray[bool_]: ...
-
-else:
-    _BoolOp = Any
-    _BoolBitOp = Any
-    _BoolSub = Any
-    _BoolTrueDiv = Any
-    _BoolMod = Any
-    _BoolDivMod = Any
-    _TD64Div = Any
-    _IntTrueDiv = Any
-    _UnsignedIntOp = Any
-    _UnsignedIntBitOp = Any
-    _UnsignedIntMod = Any
-    _UnsignedIntDivMod = Any
-    _SignedIntOp = Any
-    _SignedIntBitOp = Any
-    _SignedIntMod = Any
-    _SignedIntDivMod = Any
-    _FloatOp = Any
-    _FloatMod = Any
-    _FloatDivMod = Any
-    _ComplexOp = Any
-    _NumberOp = Any
-    _ComparisonOp = Any
diff --git a/numpy/typing/_callable.pyi b/numpy/typing/_callable.pyi
new file mode 100644 (file)
index 0000000..e1149f2
--- /dev/null
@@ -0,0 +1,327 @@
+"""
+A module with various ``typing.Protocol`` subclasses that implement
+the ``__call__`` magic method.
+
+See the `Mypy documentation`_ on protocols for more details.
+
+.. _`Mypy documentation`: https://mypy.readthedocs.io/en/stable/protocols.html#callback-protocols
+
+"""
+
+from __future__ import annotations
+
+from typing import (
+    Union,
+    TypeVar,
+    overload,
+    Any,
+    Tuple,
+    NoReturn,
+    Protocol,
+)
+
+from numpy import (
+    ndarray,
+    dtype,
+    generic,
+    bool_,
+    timedelta64,
+    number,
+    integer,
+    unsignedinteger,
+    signedinteger,
+    int8,
+    int_,
+    floating,
+    float64,
+    complexfloating,
+    complex128,
+)
+from ._nbit import _NBitInt, _NBitDouble
+from ._scalars import (
+    _BoolLike_co,
+    _IntLike_co,
+    _FloatLike_co,
+    _NumberLike_co,
+)
+from . import NBitBase
+from ._generic_alias import NDArray
+
+_T1 = TypeVar("_T1")
+_T2 = TypeVar("_T2")
+_T1_contra = TypeVar("_T1_contra", contravariant=True)
+_T2_contra = TypeVar("_T2_contra", contravariant=True)
+_2Tuple = Tuple[_T1, _T1]
+
+_NBit1 = TypeVar("_NBit1", bound=NBitBase)
+_NBit2 = TypeVar("_NBit2", bound=NBitBase)
+
+_IntType = TypeVar("_IntType", bound=integer)
+_FloatType = TypeVar("_FloatType", bound=floating)
+_NumberType = TypeVar("_NumberType", bound=number)
+_NumberType_co = TypeVar("_NumberType_co", covariant=True, bound=number)
+_GenericType_co = TypeVar("_GenericType_co", covariant=True, bound=generic)
+
+class _BoolOp(Protocol[_GenericType_co]):
+    @overload
+    def __call__(self, other: _BoolLike_co, /) -> _GenericType_co: ...
+    @overload  # platform dependent
+    def __call__(self, other: int, /) -> int_: ...
+    @overload
+    def __call__(self, other: float, /) -> float64: ...
+    @overload
+    def __call__(self, other: complex, /) -> complex128: ...
+    @overload
+    def __call__(self, other: _NumberType, /) -> _NumberType: ...
+
+class _BoolBitOp(Protocol[_GenericType_co]):
+    @overload
+    def __call__(self, other: _BoolLike_co, /) -> _GenericType_co: ...
+    @overload  # platform dependent
+    def __call__(self, other: int, /) -> int_: ...
+    @overload
+    def __call__(self, other: _IntType, /) -> _IntType: ...
+
+class _BoolSub(Protocol):
+    # Note that `other: bool_` is absent here
+    @overload
+    def __call__(self, other: bool, /) -> NoReturn: ...
+    @overload  # platform dependent
+    def __call__(self, other: int, /) -> int_: ...
+    @overload
+    def __call__(self, other: float, /) -> float64: ...
+    @overload
+    def __call__(self, other: complex, /) -> complex128: ...
+    @overload
+    def __call__(self, other: _NumberType, /) -> _NumberType: ...
+
+class _BoolTrueDiv(Protocol):
+    @overload
+    def __call__(self, other: float | _IntLike_co, /) -> float64: ...
+    @overload
+    def __call__(self, other: complex, /) -> complex128: ...
+    @overload
+    def __call__(self, other: _NumberType, /) -> _NumberType: ...
+
+class _BoolMod(Protocol):
+    @overload
+    def __call__(self, other: _BoolLike_co, /) -> int8: ...
+    @overload  # platform dependent
+    def __call__(self, other: int, /) -> int_: ...
+    @overload
+    def __call__(self, other: float, /) -> float64: ...
+    @overload
+    def __call__(self, other: _IntType, /) -> _IntType: ...
+    @overload
+    def __call__(self, other: _FloatType, /) -> _FloatType: ...
+
+class _BoolDivMod(Protocol):
+    @overload
+    def __call__(self, other: _BoolLike_co, /) -> _2Tuple[int8]: ...
+    @overload  # platform dependent
+    def __call__(self, other: int, /) -> _2Tuple[int_]: ...
+    @overload
+    def __call__(self, other: float, /) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: ...
+    @overload
+    def __call__(self, other: _IntType, /) -> _2Tuple[_IntType]: ...
+    @overload
+    def __call__(self, other: _FloatType, /) -> _2Tuple[_FloatType]: ...
+
+class _TD64Div(Protocol[_NumberType_co]):
+    @overload
+    def __call__(self, other: timedelta64, /) -> _NumberType_co: ...
+    @overload
+    def __call__(self, other: _BoolLike_co, /) -> NoReturn: ...
+    @overload
+    def __call__(self, other: _FloatLike_co, /) -> timedelta64: ...
+
+class _IntTrueDiv(Protocol[_NBit1]):
+    @overload
+    def __call__(self, other: bool, /) -> floating[_NBit1]: ...
+    @overload
+    def __call__(self, other: int, /) -> floating[_NBit1 | _NBitInt]: ...
+    @overload
+    def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: ...
+    @overload
+    def __call__(
+        self, other: complex, /,
+    ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ...
+    @overload
+    def __call__(self, other: integer[_NBit2], /) -> floating[_NBit1 | _NBit2]: ...
+
+class _UnsignedIntOp(Protocol[_NBit1]):
+    # NOTE: `uint64 + signedinteger -> float64`
+    @overload
+    def __call__(self, other: bool, /) -> unsignedinteger[_NBit1]: ...
+    @overload
+    def __call__(
+        self, other: int | signedinteger[Any], /
+    ) -> Any: ...
+    @overload
+    def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: ...
+    @overload
+    def __call__(
+        self, other: complex, /,
+    ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ...
+    @overload
+    def __call__(
+        self, other: unsignedinteger[_NBit2], /
+    ) -> unsignedinteger[_NBit1 | _NBit2]: ...
+
+class _UnsignedIntBitOp(Protocol[_NBit1]):
+    @overload
+    def __call__(self, other: bool, /) -> unsignedinteger[_NBit1]: ...
+    @overload
+    def __call__(self, other: int, /) -> signedinteger[Any]: ...
+    @overload
+    def __call__(self, other: signedinteger[Any], /) -> signedinteger[Any]: ...
+    @overload
+    def __call__(
+        self, other: unsignedinteger[_NBit2], /
+    ) -> unsignedinteger[_NBit1 | _NBit2]: ...
+
+class _UnsignedIntMod(Protocol[_NBit1]):
+    @overload
+    def __call__(self, other: bool, /) -> unsignedinteger[_NBit1]: ...
+    @overload
+    def __call__(
+        self, other: int | signedinteger[Any], /
+    ) -> Any: ...
+    @overload
+    def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: ...
+    @overload
+    def __call__(
+        self, other: unsignedinteger[_NBit2], /
+    ) -> unsignedinteger[_NBit1 | _NBit2]: ...
+
+class _UnsignedIntDivMod(Protocol[_NBit1]):
+    @overload
+    def __call__(self, other: bool, /) -> _2Tuple[signedinteger[_NBit1]]: ...
+    @overload
+    def __call__(
+        self, other: int | signedinteger[Any], /
+    ) -> _2Tuple[Any]: ...
+    @overload
+    def __call__(self, other: float, /) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: ...
+    @overload
+    def __call__(
+        self, other: unsignedinteger[_NBit2], /
+    ) -> _2Tuple[unsignedinteger[_NBit1 | _NBit2]]: ...
+
+class _SignedIntOp(Protocol[_NBit1]):
+    @overload
+    def __call__(self, other: bool, /) -> signedinteger[_NBit1]: ...
+    @overload
+    def __call__(self, other: int, /) -> signedinteger[_NBit1 | _NBitInt]: ...
+    @overload
+    def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: ...
+    @overload
+    def __call__(
+        self, other: complex, /,
+    ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ...
+    @overload
+    def __call__(
+        self, other: signedinteger[_NBit2], /,
+    ) -> signedinteger[_NBit1 | _NBit2]: ...
+
+class _SignedIntBitOp(Protocol[_NBit1]):
+    @overload
+    def __call__(self, other: bool, /) -> signedinteger[_NBit1]: ...
+    @overload
+    def __call__(self, other: int, /) -> signedinteger[_NBit1 | _NBitInt]: ...
+    @overload
+    def __call__(
+        self, other: signedinteger[_NBit2], /,
+    ) -> signedinteger[_NBit1 | _NBit2]: ...
+
+class _SignedIntMod(Protocol[_NBit1]):
+    @overload
+    def __call__(self, other: bool, /) -> signedinteger[_NBit1]: ...
+    @overload
+    def __call__(self, other: int, /) -> signedinteger[_NBit1 | _NBitInt]: ...
+    @overload
+    def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: ...
+    @overload
+    def __call__(
+        self, other: signedinteger[_NBit2], /,
+    ) -> signedinteger[_NBit1 | _NBit2]: ...
+
+class _SignedIntDivMod(Protocol[_NBit1]):
+    @overload
+    def __call__(self, other: bool, /) -> _2Tuple[signedinteger[_NBit1]]: ...
+    @overload
+    def __call__(self, other: int, /) -> _2Tuple[signedinteger[_NBit1 | _NBitInt]]: ...
+    @overload
+    def __call__(self, other: float, /) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: ...
+    @overload
+    def __call__(
+        self, other: signedinteger[_NBit2], /,
+    ) -> _2Tuple[signedinteger[_NBit1 | _NBit2]]: ...
+
+class _FloatOp(Protocol[_NBit1]):
+    @overload
+    def __call__(self, other: bool, /) -> floating[_NBit1]: ...
+    @overload
+    def __call__(self, other: int, /) -> floating[_NBit1 | _NBitInt]: ...
+    @overload
+    def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: ...
+    @overload
+    def __call__(
+        self, other: complex, /,
+    ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ...
+    @overload
+    def __call__(
+        self, other: integer[_NBit2] | floating[_NBit2], /
+    ) -> floating[_NBit1 | _NBit2]: ...
+
+class _FloatMod(Protocol[_NBit1]):
+    @overload
+    def __call__(self, other: bool, /) -> floating[_NBit1]: ...
+    @overload
+    def __call__(self, other: int, /) -> floating[_NBit1 | _NBitInt]: ...
+    @overload
+    def __call__(self, other: float, /) -> floating[_NBit1 | _NBitDouble]: ...
+    @overload
+    def __call__(
+        self, other: integer[_NBit2] | floating[_NBit2], /
+    ) -> floating[_NBit1 | _NBit2]: ...
+
+class _FloatDivMod(Protocol[_NBit1]):
+    @overload
+    def __call__(self, other: bool, /) -> _2Tuple[floating[_NBit1]]: ...
+    @overload
+    def __call__(self, other: int, /) -> _2Tuple[floating[_NBit1 | _NBitInt]]: ...
+    @overload
+    def __call__(self, other: float, /) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: ...
+    @overload
+    def __call__(
+        self, other: integer[_NBit2] | floating[_NBit2], /
+    ) -> _2Tuple[floating[_NBit1 | _NBit2]]: ...
+
+class _ComplexOp(Protocol[_NBit1]):
+    @overload
+    def __call__(self, other: bool, /) -> complexfloating[_NBit1, _NBit1]: ...
+    @overload
+    def __call__(self, other: int, /) -> complexfloating[_NBit1 | _NBitInt, _NBit1 | _NBitInt]: ...
+    @overload
+    def __call__(
+        self, other: complex, /,
+    ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ...
+    @overload
+    def __call__(
+        self,
+        other: Union[
+            integer[_NBit2],
+            floating[_NBit2],
+            complexfloating[_NBit2, _NBit2],
+        ], /,
+    ) -> complexfloating[_NBit1 | _NBit2, _NBit1 | _NBit2]: ...
+
+class _NumberOp(Protocol):
+    def __call__(self, other: _NumberLike_co, /) -> Any: ...
+
+class _ComparisonOp(Protocol[_T1_contra, _T2_contra]):
+    @overload
+    def __call__(self, other: _T1_contra, /) -> bool_: ...
+    @overload
+    def __call__(self, other: _T2_contra, /) -> NDArray[bool_]: ...
index 6b6f7ae88946540efc207b0fc53cdcf39a98042c..1394710841feea44c27572c44967c68e1a64f315 100644 (file)
-import sys
-from typing import Any, TYPE_CHECKING
-
-if sys.version_info >= (3, 8):
-    from typing import Literal
-    HAVE_LITERAL = True
-else:
-    try:
-        from typing_extensions import Literal
-    except ImportError:
-        HAVE_LITERAL = False
-    else:
-        HAVE_LITERAL = True
-
-if TYPE_CHECKING or HAVE_LITERAL:
-    _BoolCodes = Literal["?", "=?", "<?", ">?", "bool", "bool_", "bool8"]
-
-    _UInt8Codes = Literal["uint8", "u1", "=u1", "<u1", ">u1"]
-    _UInt16Codes = Literal["uint16", "u2", "=u2", "<u2", ">u2"]
-    _UInt32Codes = Literal["uint32", "u4", "=u4", "<u4", ">u4"]
-    _UInt64Codes = Literal["uint64", "u8", "=u8", "<u8", ">u8"]
-
-    _Int8Codes = Literal["int8", "i1", "=i1", "<i1", ">i1"]
-    _Int16Codes = Literal["int16", "i2", "=i2", "<i2", ">i2"]
-    _Int32Codes = Literal["int32", "i4", "=i4", "<i4", ">i4"]
-    _Int64Codes = Literal["int64", "i8", "=i8", "<i8", ">i8"]
-
-    _Float16Codes = Literal["float16", "f2", "=f2", "<f2", ">f2"]
-    _Float32Codes = Literal["float32", "f4", "=f4", "<f4", ">f4"]
-    _Float64Codes = Literal["float64", "f8", "=f8", "<f8", ">f8"]
-
-    _Complex64Codes = Literal["complex64", "c8", "=c8", "<c8", ">c8"]
-    _Complex128Codes = Literal["complex128", "c16", "=c16", "<c16", ">c16"]
-
-    _ByteCodes = Literal["byte", "b", "=b", "<b", ">b"]
-    _ShortCodes = Literal["short", "h", "=h", "<h", ">h"]
-    _IntCCodes = Literal["intc", "i", "=i", "<i", ">i"]
-    _IntPCodes = Literal["intp", "int0", "p", "=p", "<p", ">p"]
-    _IntCodes = Literal["long", "int", "int_", "l", "=l", "<l", ">l"]
-    _LongLongCodes = Literal["longlong", "q", "=q", "<q", ">q"]
-
-    _UByteCodes = Literal["ubyte", "B", "=B", "<B", ">B"]
-    _UShortCodes = Literal["ushort", "H", "=H", "<H", ">H"]
-    _UIntCCodes = Literal["uintc", "I", "=I", "<I", ">I"]
-    _UIntPCodes = Literal["uintp", "uint0", "P", "=P", "<P", ">P"]
-    _UIntCodes = Literal["uint", "L", "=L", "<L", ">L"]
-    _ULongLongCodes = Literal["ulonglong", "Q", "=Q", "<Q", ">Q"]
-
-    _HalfCodes = Literal["half", "e", "=e", "<e", ">e"]
-    _SingleCodes = Literal["single", "f", "=f", "<f", ">f"]
-    _DoubleCodes = Literal["double", "float", "float_", "d", "=d", "<d", ">d"]
-    _LongDoubleCodes = Literal["longdouble", "longfloat", "g", "=g", "<g", ">g"]
-
-    _CSingleCodes = Literal["csingle", "singlecomplex", "F", "=F", "<F", ">F"]
-    _CDoubleCodes = Literal["cdouble", "complex", "complex_", "cfloat", "D", "=D", "<D", ">D"]
-    _CLongDoubleCodes = Literal["clongdouble", "clongfloat", "longcomplex", "G", "=G", "<G", ">G"]
-
-    _StrCodes = Literal["str", "str_", "str0", "unicode", "unicode_", "U", "=U", "<U", ">U"]
-    _BytesCodes = Literal["bytes", "bytes_", "bytes0", "S", "=S", "<S", ">S"]
-    _VoidCodes = Literal["void", "void0", "V", "=V", "<V", ">V"]
-    _ObjectCodes = Literal["object", "object_", "O", "=O", "<O", ">O"]
-
-    _DT64Codes = Literal[
-        "datetime64", "=datetime64", "<datetime64", ">datetime64",
-        "datetime64[Y]", "=datetime64[Y]", "<datetime64[Y]", ">datetime64[Y]",
-        "datetime64[M]", "=datetime64[M]", "<datetime64[M]", ">datetime64[M]",
-        "datetime64[W]", "=datetime64[W]", "<datetime64[W]", ">datetime64[W]",
-        "datetime64[D]", "=datetime64[D]", "<datetime64[D]", ">datetime64[D]",
-        "datetime64[h]", "=datetime64[h]", "<datetime64[h]", ">datetime64[h]",
-        "datetime64[m]", "=datetime64[m]", "<datetime64[m]", ">datetime64[m]",
-        "datetime64[s]", "=datetime64[s]", "<datetime64[s]", ">datetime64[s]",
-        "datetime64[ms]", "=datetime64[ms]", "<datetime64[ms]", ">datetime64[ms]",
-        "datetime64[us]", "=datetime64[us]", "<datetime64[us]", ">datetime64[us]",
-        "datetime64[ns]", "=datetime64[ns]", "<datetime64[ns]", ">datetime64[ns]",
-        "datetime64[ps]", "=datetime64[ps]", "<datetime64[ps]", ">datetime64[ps]",
-        "datetime64[fs]", "=datetime64[fs]", "<datetime64[fs]", ">datetime64[fs]",
-        "datetime64[as]", "=datetime64[as]", "<datetime64[as]", ">datetime64[as]",
-        "M", "=M", "<M", ">M",
-        "M8", "=M8", "<M8", ">M8",
-        "M8[Y]", "=M8[Y]", "<M8[Y]", ">M8[Y]",
-        "M8[M]", "=M8[M]", "<M8[M]", ">M8[M]",
-        "M8[W]", "=M8[W]", "<M8[W]", ">M8[W]",
-        "M8[D]", "=M8[D]", "<M8[D]", ">M8[D]",
-        "M8[h]", "=M8[h]", "<M8[h]", ">M8[h]",
-        "M8[m]", "=M8[m]", "<M8[m]", ">M8[m]",
-        "M8[s]", "=M8[s]", "<M8[s]", ">M8[s]",
-        "M8[ms]", "=M8[ms]", "<M8[ms]", ">M8[ms]",
-        "M8[us]", "=M8[us]", "<M8[us]", ">M8[us]",
-        "M8[ns]", "=M8[ns]", "<M8[ns]", ">M8[ns]",
-        "M8[ps]", "=M8[ps]", "<M8[ps]", ">M8[ps]",
-        "M8[fs]", "=M8[fs]", "<M8[fs]", ">M8[fs]",
-        "M8[as]", "=M8[as]", "<M8[as]", ">M8[as]",
-    ]
-    _TD64Codes = Literal[
-        "timedelta64", "=timedelta64", "<timedelta64", ">timedelta64",
-        "timedelta64[Y]", "=timedelta64[Y]", "<timedelta64[Y]", ">timedelta64[Y]",
-        "timedelta64[M]", "=timedelta64[M]", "<timedelta64[M]", ">timedelta64[M]",
-        "timedelta64[W]", "=timedelta64[W]", "<timedelta64[W]", ">timedelta64[W]",
-        "timedelta64[D]", "=timedelta64[D]", "<timedelta64[D]", ">timedelta64[D]",
-        "timedelta64[h]", "=timedelta64[h]", "<timedelta64[h]", ">timedelta64[h]",
-        "timedelta64[m]", "=timedelta64[m]", "<timedelta64[m]", ">timedelta64[m]",
-        "timedelta64[s]", "=timedelta64[s]", "<timedelta64[s]", ">timedelta64[s]",
-        "timedelta64[ms]", "=timedelta64[ms]", "<timedelta64[ms]", ">timedelta64[ms]",
-        "timedelta64[us]", "=timedelta64[us]", "<timedelta64[us]", ">timedelta64[us]",
-        "timedelta64[ns]", "=timedelta64[ns]", "<timedelta64[ns]", ">timedelta64[ns]",
-        "timedelta64[ps]", "=timedelta64[ps]", "<timedelta64[ps]", ">timedelta64[ps]",
-        "timedelta64[fs]", "=timedelta64[fs]", "<timedelta64[fs]", ">timedelta64[fs]",
-        "timedelta64[as]", "=timedelta64[as]", "<timedelta64[as]", ">timedelta64[as]",
-        "m", "=m", "<m", ">m",
-        "m8", "=m8", "<m8", ">m8",
-        "m8[Y]", "=m8[Y]", "<m8[Y]", ">m8[Y]",
-        "m8[M]", "=m8[M]", "<m8[M]", ">m8[M]",
-        "m8[W]", "=m8[W]", "<m8[W]", ">m8[W]",
-        "m8[D]", "=m8[D]", "<m8[D]", ">m8[D]",
-        "m8[h]", "=m8[h]", "<m8[h]", ">m8[h]",
-        "m8[m]", "=m8[m]", "<m8[m]", ">m8[m]",
-        "m8[s]", "=m8[s]", "<m8[s]", ">m8[s]",
-        "m8[ms]", "=m8[ms]", "<m8[ms]", ">m8[ms]",
-        "m8[us]", "=m8[us]", "<m8[us]", ">m8[us]",
-        "m8[ns]", "=m8[ns]", "<m8[ns]", ">m8[ns]",
-        "m8[ps]", "=m8[ps]", "<m8[ps]", ">m8[ps]",
-        "m8[fs]", "=m8[fs]", "<m8[fs]", ">m8[fs]",
-        "m8[as]", "=m8[as]", "<m8[as]", ">m8[as]",
-    ]
-
-else:
-    _BoolCodes = Any
-
-    _UInt8Codes = Any
-    _UInt16Codes = Any
-    _UInt32Codes = Any
-    _UInt64Codes = Any
-
-    _Int8Codes = Any
-    _Int16Codes = Any
-    _Int32Codes = Any
-    _Int64Codes = Any
-
-    _Float16Codes = Any
-    _Float32Codes = Any
-    _Float64Codes = Any
-
-    _Complex64Codes = Any
-    _Complex128Codes = Any
-
-    _ByteCodes = Any
-    _ShortCodes = Any
-    _IntCCodes = Any
-    _IntPCodes = Any
-    _IntCodes = Any
-    _LongLongCodes = Any
-
-    _UByteCodes = Any
-    _UShortCodes = Any
-    _UIntCCodes = Any
-    _UIntPCodes = Any
-    _UIntCodes = Any
-    _ULongLongCodes = Any
-
-    _HalfCodes = Any
-    _SingleCodes = Any
-    _DoubleCodes = Any
-    _LongDoubleCodes = Any
-
-    _CSingleCodes = Any
-    _CDoubleCodes = Any
-    _CLongDoubleCodes = Any
-
-    _StrCodes = Any
-    _BytesCodes = Any
-    _VoidCodes = Any
-    _ObjectCodes = Any
-
-    _DT64Codes = Any
-    _TD64Codes = Any
+from typing import Literal
+
+_BoolCodes = Literal["?", "=?", "<?", ">?", "bool", "bool_", "bool8"]
+
+_UInt8Codes = Literal["uint8", "u1", "=u1", "<u1", ">u1"]
+_UInt16Codes = Literal["uint16", "u2", "=u2", "<u2", ">u2"]
+_UInt32Codes = Literal["uint32", "u4", "=u4", "<u4", ">u4"]
+_UInt64Codes = Literal["uint64", "u8", "=u8", "<u8", ">u8"]
+
+_Int8Codes = Literal["int8", "i1", "=i1", "<i1", ">i1"]
+_Int16Codes = Literal["int16", "i2", "=i2", "<i2", ">i2"]
+_Int32Codes = Literal["int32", "i4", "=i4", "<i4", ">i4"]
+_Int64Codes = Literal["int64", "i8", "=i8", "<i8", ">i8"]
+
+_Float16Codes = Literal["float16", "f2", "=f2", "<f2", ">f2"]
+_Float32Codes = Literal["float32", "f4", "=f4", "<f4", ">f4"]
+_Float64Codes = Literal["float64", "f8", "=f8", "<f8", ">f8"]
+
+_Complex64Codes = Literal["complex64", "c8", "=c8", "<c8", ">c8"]
+_Complex128Codes = Literal["complex128", "c16", "=c16", "<c16", ">c16"]
+
+_ByteCodes = Literal["byte", "b", "=b", "<b", ">b"]
+_ShortCodes = Literal["short", "h", "=h", "<h", ">h"]
+_IntCCodes = Literal["intc", "i", "=i", "<i", ">i"]
+_IntPCodes = Literal["intp", "int0", "p", "=p", "<p", ">p"]
+_IntCodes = Literal["long", "int", "int_", "l", "=l", "<l", ">l"]
+_LongLongCodes = Literal["longlong", "q", "=q", "<q", ">q"]
+
+_UByteCodes = Literal["ubyte", "B", "=B", "<B", ">B"]
+_UShortCodes = Literal["ushort", "H", "=H", "<H", ">H"]
+_UIntCCodes = Literal["uintc", "I", "=I", "<I", ">I"]
+_UIntPCodes = Literal["uintp", "uint0", "P", "=P", "<P", ">P"]
+_UIntCodes = Literal["uint", "L", "=L", "<L", ">L"]
+_ULongLongCodes = Literal["ulonglong", "Q", "=Q", "<Q", ">Q"]
+
+_HalfCodes = Literal["half", "e", "=e", "<e", ">e"]
+_SingleCodes = Literal["single", "f", "=f", "<f", ">f"]
+_DoubleCodes = Literal["double", "float", "float_", "d", "=d", "<d", ">d"]
+_LongDoubleCodes = Literal["longdouble", "longfloat", "g", "=g", "<g", ">g"]
+
+_CSingleCodes = Literal["csingle", "singlecomplex", "F", "=F", "<F", ">F"]
+_CDoubleCodes = Literal["cdouble", "complex", "complex_", "cfloat", "D", "=D", "<D", ">D"]
+_CLongDoubleCodes = Literal["clongdouble", "clongfloat", "longcomplex", "G", "=G", "<G", ">G"]
+
+_StrCodes = Literal["str", "str_", "str0", "unicode", "unicode_", "U", "=U", "<U", ">U"]
+_BytesCodes = Literal["bytes", "bytes_", "bytes0", "S", "=S", "<S", ">S"]
+_VoidCodes = Literal["void", "void0", "V", "=V", "<V", ">V"]
+_ObjectCodes = Literal["object", "object_", "O", "=O", "<O", ">O"]
+
+_DT64Codes = Literal[
+    "datetime64", "=datetime64", "<datetime64", ">datetime64",
+    "datetime64[Y]", "=datetime64[Y]", "<datetime64[Y]", ">datetime64[Y]",
+    "datetime64[M]", "=datetime64[M]", "<datetime64[M]", ">datetime64[M]",
+    "datetime64[W]", "=datetime64[W]", "<datetime64[W]", ">datetime64[W]",
+    "datetime64[D]", "=datetime64[D]", "<datetime64[D]", ">datetime64[D]",
+    "datetime64[h]", "=datetime64[h]", "<datetime64[h]", ">datetime64[h]",
+    "datetime64[m]", "=datetime64[m]", "<datetime64[m]", ">datetime64[m]",
+    "datetime64[s]", "=datetime64[s]", "<datetime64[s]", ">datetime64[s]",
+    "datetime64[ms]", "=datetime64[ms]", "<datetime64[ms]", ">datetime64[ms]",
+    "datetime64[us]", "=datetime64[us]", "<datetime64[us]", ">datetime64[us]",
+    "datetime64[ns]", "=datetime64[ns]", "<datetime64[ns]", ">datetime64[ns]",
+    "datetime64[ps]", "=datetime64[ps]", "<datetime64[ps]", ">datetime64[ps]",
+    "datetime64[fs]", "=datetime64[fs]", "<datetime64[fs]", ">datetime64[fs]",
+    "datetime64[as]", "=datetime64[as]", "<datetime64[as]", ">datetime64[as]",
+    "M", "=M", "<M", ">M",
+    "M8", "=M8", "<M8", ">M8",
+    "M8[Y]", "=M8[Y]", "<M8[Y]", ">M8[Y]",
+    "M8[M]", "=M8[M]", "<M8[M]", ">M8[M]",
+    "M8[W]", "=M8[W]", "<M8[W]", ">M8[W]",
+    "M8[D]", "=M8[D]", "<M8[D]", ">M8[D]",
+    "M8[h]", "=M8[h]", "<M8[h]", ">M8[h]",
+    "M8[m]", "=M8[m]", "<M8[m]", ">M8[m]",
+    "M8[s]", "=M8[s]", "<M8[s]", ">M8[s]",
+    "M8[ms]", "=M8[ms]", "<M8[ms]", ">M8[ms]",
+    "M8[us]", "=M8[us]", "<M8[us]", ">M8[us]",
+    "M8[ns]", "=M8[ns]", "<M8[ns]", ">M8[ns]",
+    "M8[ps]", "=M8[ps]", "<M8[ps]", ">M8[ps]",
+    "M8[fs]", "=M8[fs]", "<M8[fs]", ">M8[fs]",
+    "M8[as]", "=M8[as]", "<M8[as]", ">M8[as]",
+]
+_TD64Codes = Literal[
+    "timedelta64", "=timedelta64", "<timedelta64", ">timedelta64",
+    "timedelta64[Y]", "=timedelta64[Y]", "<timedelta64[Y]", ">timedelta64[Y]",
+    "timedelta64[M]", "=timedelta64[M]", "<timedelta64[M]", ">timedelta64[M]",
+    "timedelta64[W]", "=timedelta64[W]", "<timedelta64[W]", ">timedelta64[W]",
+    "timedelta64[D]", "=timedelta64[D]", "<timedelta64[D]", ">timedelta64[D]",
+    "timedelta64[h]", "=timedelta64[h]", "<timedelta64[h]", ">timedelta64[h]",
+    "timedelta64[m]", "=timedelta64[m]", "<timedelta64[m]", ">timedelta64[m]",
+    "timedelta64[s]", "=timedelta64[s]", "<timedelta64[s]", ">timedelta64[s]",
+    "timedelta64[ms]", "=timedelta64[ms]", "<timedelta64[ms]", ">timedelta64[ms]",
+    "timedelta64[us]", "=timedelta64[us]", "<timedelta64[us]", ">timedelta64[us]",
+    "timedelta64[ns]", "=timedelta64[ns]", "<timedelta64[ns]", ">timedelta64[ns]",
+    "timedelta64[ps]", "=timedelta64[ps]", "<timedelta64[ps]", ">timedelta64[ps]",
+    "timedelta64[fs]", "=timedelta64[fs]", "<timedelta64[fs]", ">timedelta64[fs]",
+    "timedelta64[as]", "=timedelta64[as]", "<timedelta64[as]", ">timedelta64[as]",
+    "m", "=m", "<m", ">m",
+    "m8", "=m8", "<m8", ">m8",
+    "m8[Y]", "=m8[Y]", "<m8[Y]", ">m8[Y]",
+    "m8[M]", "=m8[M]", "<m8[M]", ">m8[M]",
+    "m8[W]", "=m8[W]", "<m8[W]", ">m8[W]",
+    "m8[D]", "=m8[D]", "<m8[D]", ">m8[D]",
+    "m8[h]", "=m8[h]", "<m8[h]", ">m8[h]",
+    "m8[m]", "=m8[m]", "<m8[m]", ">m8[m]",
+    "m8[s]", "=m8[s]", "<m8[s]", ">m8[s]",
+    "m8[ms]", "=m8[ms]", "<m8[ms]", ">m8[ms]",
+    "m8[us]", "=m8[us]", "<m8[us]", ">m8[us]",
+    "m8[ns]", "=m8[ns]", "<m8[ns]", ">m8[ns]",
+    "m8[ps]", "=m8[ps]", "<m8[ps]", ">m8[ps]",
+    "m8[fs]", "=m8[fs]", "<m8[fs]", ">m8[fs]",
+    "m8[as]", "=m8[as]", "<m8[as]", ">m8[as]",
+]
index 9864f46d5e1fe3d6b1e56754a1c50e9e41140db5..c9bf1a137cb648f556f50d3ed79a556187c67c7b 100644 (file)
@@ -1,4 +1,3 @@
-import sys
 from typing import (
     Any,
     List,
@@ -7,23 +6,14 @@ from typing import (
     Union,
     Type,
     TypeVar,
-    Generic,
-    TYPE_CHECKING,
+    Protocol,
+    TypedDict,
 )
 
 import numpy as np
-from ._shape import _ShapeLike
 
-if sys.version_info >= (3, 8):
-    from typing import Protocol, TypedDict
-    HAVE_PROTOCOL = True
-else:
-    try:
-        from typing_extensions import Protocol, TypedDict
-    except ImportError:
-        HAVE_PROTOCOL = False
-    else:
-        HAVE_PROTOCOL = True
+from ._shape import _ShapeLike
+from ._generic_alias import _DType as DType
 
 from ._char_codes import (
     _BoolCodes,
@@ -67,34 +57,29 @@ from ._char_codes import (
     _ObjectCodes,
 )
 
-_DType_co = TypeVar("_DType_co", covariant=True, bound=np.dtype)
-
 _DTypeLikeNested = Any  # TODO: wait for support for recursive types
+_DType_co = TypeVar("_DType_co", covariant=True, bound=DType[Any])
 
-if TYPE_CHECKING or HAVE_PROTOCOL:
-    # Mandatory keys
-    class _DTypeDictBase(TypedDict):
-        names: Sequence[str]
-        formats: Sequence[_DTypeLikeNested]
-
-    # Mandatory + optional keys
-    class _DTypeDict(_DTypeDictBase, total=False):
-        offsets: Sequence[int]
-        titles: Sequence[Any]  # Only `str` elements are usable as indexing aliases, but all objects are legal
-        itemsize: int
-        aligned: bool
+# Mandatory keys
+class _DTypeDictBase(TypedDict):
+    names: Sequence[str]
+    formats: Sequence[_DTypeLikeNested]
 
 
-    # A protocol for anything with the dtype attribute
-    class _SupportsDType(Protocol[_DType_co]):
-        @property
-        def dtype(self) -> _DType_co: ...
+# Mandatory + optional keys
+class _DTypeDict(_DTypeDictBase, total=False):
+    # Only `str` elements are usable as indexing aliases,
+    # but `titles` can in principle accept any object
+    offsets: Sequence[int]
+    titles: Sequence[Any]
+    itemsize: int
+    aligned: bool
 
-else:
-    _DTypeDict = Any
 
-    class _SupportsDType(Generic[_DType_co]):
-        pass
+# A protocol for anything with the dtype attribute
+class _SupportsDType(Protocol[_DType_co]):
+    @property
+    def dtype(self) -> _DType_co: ...
 
 
 # Would create a dtype[np.void]
@@ -119,13 +104,13 @@ _VoidDTypeLike = Union[
 # Anything that can be coerced into numpy.dtype.
 # Reference: https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html
 DTypeLike = Union[
-    np.dtype,
+    DType[Any],
     # default data type (float64)
     None,
     # array-scalar types and generic types
-    type,  # TODO: enumerate these when we add type hints for numpy scalars
+    Type[Any],  # NOTE: We're stuck with `Type[Any]` due to object dtypes
     # anything with a dtype attribute
-    _SupportsDType[np.dtype],
+    _SupportsDType[DType[Any]],
     # character codes, type strings or comma-separated fields, e.g., 'float64'
     str,
     _VoidDTypeLike,
@@ -143,14 +128,14 @@ DTypeLike = Union[
 _DTypeLikeBool = Union[
     Type[bool],
     Type[np.bool_],
-    "np.dtype[np.bool_]",
-    "_SupportsDType[np.dtype[np.bool_]]",
+    DType[np.bool_],
+    _SupportsDType[DType[np.bool_]],
     _BoolCodes,
 ]
 _DTypeLikeUInt = Union[
     Type[np.unsignedinteger],
-    "np.dtype[np.unsignedinteger]",
-    "_SupportsDType[np.dtype[np.unsignedinteger]]",
+    DType[np.unsignedinteger],
+    _SupportsDType[DType[np.unsignedinteger]],
     _UInt8Codes,
     _UInt16Codes,
     _UInt32Codes,
@@ -165,8 +150,8 @@ _DTypeLikeUInt = Union[
 _DTypeLikeInt = Union[
     Type[int],
     Type[np.signedinteger],
-    "np.dtype[np.signedinteger]",
-    "_SupportsDType[np.dtype[np.signedinteger]]",
+    DType[np.signedinteger],
+    _SupportsDType[DType[np.signedinteger]],
     _Int8Codes,
     _Int16Codes,
     _Int32Codes,
@@ -181,8 +166,8 @@ _DTypeLikeInt = Union[
 _DTypeLikeFloat = Union[
     Type[float],
     Type[np.floating],
-    "np.dtype[np.floating]",
-    "_SupportsDType[np.dtype[np.floating]]",
+    DType[np.floating],
+    _SupportsDType[DType[np.floating]],
     _Float16Codes,
     _Float32Codes,
     _Float64Codes,
@@ -194,8 +179,8 @@ _DTypeLikeFloat = Union[
 _DTypeLikeComplex = Union[
     Type[complex],
     Type[np.complexfloating],
-    "np.dtype[np.complexfloating]",
-    "_SupportsDType[np.dtype[np.complexfloating]]",
+    DType[np.complexfloating],
+    _SupportsDType[DType[np.complexfloating]],
     _Complex64Codes,
     _Complex128Codes,
     _CSingleCodes,
@@ -204,41 +189,41 @@ _DTypeLikeComplex = Union[
 ]
 _DTypeLikeDT64 = Union[
     Type[np.timedelta64],
-    "np.dtype[np.timedelta64]",
-    "_SupportsDType[np.dtype[np.timedelta64]]",
+    DType[np.timedelta64],
+    _SupportsDType[DType[np.timedelta64]],
     _TD64Codes,
 ]
 _DTypeLikeTD64 = Union[
     Type[np.datetime64],
-    "np.dtype[np.datetime64]",
-    "_SupportsDType[np.dtype[np.datetime64]]",
+    DType[np.datetime64],
+    _SupportsDType[DType[np.datetime64]],
     _DT64Codes,
 ]
 _DTypeLikeStr = Union[
     Type[str],
     Type[np.str_],
-    "np.dtype[np.str_]",
-    "_SupportsDType[np.dtype[np.str_]]",
+    DType[np.str_],
+    _SupportsDType[DType[np.str_]],
     _StrCodes,
 ]
 _DTypeLikeBytes = Union[
     Type[bytes],
     Type[np.bytes_],
-    "np.dtype[np.bytes_]",
-    "_SupportsDType[np.dtype[np.bytes_]]",
+    DType[np.bytes_],
+    _SupportsDType[DType[np.bytes_]],
     _BytesCodes,
 ]
 _DTypeLikeVoid = Union[
     Type[np.void],
-    "np.dtype[np.void]",
-    "_SupportsDType[np.dtype[np.void]]",
+    DType[np.void],
+    _SupportsDType[DType[np.void]],
     _VoidCodes,
     _VoidDTypeLike,
 ]
 _DTypeLikeObject = Union[
     type,
-    "np.dtype[np.object_]",
-    "_SupportsDType[np.dtype[np.object_]]",
+    DType[np.object_],
+    _SupportsDType[DType[np.object_]],
     _ObjectCodes,
 ]
 
index bad20b048e9f07afd7f3b694311dcaa983c0e869..edc1778ce16feda35aae1fcc71a5127506c46b10 100644 (file)
@@ -1,10 +1,11 @@
-"""A module with platform-specific extended precision `numpy.number` subclasses.
+"""A module with platform-specific extended precision
+`numpy.number` subclasses.
 
 The subclasses are defined here (instead of ``__init__.pyi``) such
 that they can be imported conditionally via the numpy's mypy plugin.
 """
 
-from typing import TYPE_CHECKING, Any
+from typing import TYPE_CHECKING
 
 import numpy as np
 from . import (
index 4195cd93edc920ca8c927017b9ce43ed9e00eddc..1eb2c8c05f0245442f5683bfb670c183fda8cb84 100644 (file)
@@ -51,7 +51,7 @@ def _parse_parameters(args: Iterable[Any]) -> Generator[TypeVar, None, None]:
 
 
 def _reconstruct_alias(alias: _T, parameters: Iterator[TypeVar]) -> _T:
-    """Recursivelly replace all typevars with those from `parameters`.
+    """Recursively replace all typevars with those from `parameters`.
 
     Helper function for `_GenericAlias.__getitem__`.
 
@@ -93,7 +93,7 @@ class _GenericAlias:
         return super().__getattribute__("_origin")
 
     @property
-    def __args__(self) -> Tuple[Any, ...]:
+    def __args__(self) -> Tuple[object, ...]:
         return super().__getattribute__("_args")
 
     @property
@@ -101,16 +101,23 @@ class _GenericAlias:
         """Type variables in the ``GenericAlias``."""
         return super().__getattribute__("_parameters")
 
-    def __init__(self, origin: type, args: Any) -> None:
+    def __init__(
+        self,
+        origin: type,
+        args: object | Tuple[object, ...],
+    ) -> None:
         self._origin = origin
         self._args = args if isinstance(args, tuple) else (args,)
-        self._parameters = tuple(_parse_parameters(args))
+        self._parameters = tuple(_parse_parameters(self.__args__))
 
     @property
     def __call__(self) -> type:
         return self.__origin__
 
-    def __reduce__(self: _T) -> Tuple[Type[_T], Tuple[type, Tuple[Any, ...]]]:
+    def __reduce__(self: _T) -> Tuple[
+        Type[_T],
+        Tuple[type, Tuple[object, ...]],
+    ]:
         cls = type(self)
         return cls, (self.__origin__, self.__args__)
 
@@ -148,7 +155,7 @@ class _GenericAlias:
         origin = _to_str(self.__origin__)
         return f"{origin}[{args}]"
 
-    def __getitem__(self: _T, key: Any) -> _T:
+    def __getitem__(self: _T, key: object | Tuple[object, ...]) -> _T:
         """Return ``self[key]``."""
         key_tup = key if isinstance(key, tuple) else (key,)
 
@@ -200,11 +207,9 @@ else:
 
 ScalarType = TypeVar("ScalarType", bound=np.generic, covariant=True)
 
-if TYPE_CHECKING:
+if TYPE_CHECKING or sys.version_info >= (3, 9):
+    _DType = np.dtype[ScalarType]
     NDArray = np.ndarray[Any, np.dtype[ScalarType]]
-elif sys.version_info >= (3, 9):
-    _DType = types.GenericAlias(np.dtype, (ScalarType,))
-    NDArray = types.GenericAlias(np.ndarray, (Any, _DType))
 else:
     _DType = _GenericAlias(np.dtype, (ScalarType,))
     NDArray = _GenericAlias(np.ndarray, (Any, _DType))
diff --git a/numpy/typing/_nested_sequence.py b/numpy/typing/_nested_sequence.py
new file mode 100644 (file)
index 0000000..a853303
--- /dev/null
@@ -0,0 +1,90 @@
+"""A module containing the `_NestedSequence` protocol."""
+
+from __future__ import annotations
+
+from typing import (
+    Any,
+    Iterator,
+    overload,
+    TypeVar,
+    Protocol,
+)
+
+__all__ = ["_NestedSequence"]
+
+_T_co = TypeVar("_T_co", covariant=True)
+
+
+class _NestedSequence(Protocol[_T_co]):
+    """A protocol for representing nested sequences.
+
+    Warning
+    -------
+    `_NestedSequence` currently does not work in combination with typevars,
+    *e.g.* ``def func(a: _NestedSequnce[T]) -> T: ...``.
+
+    See Also
+    --------
+    `collections.abc.Sequence`
+        ABCs for read-only and mutable :term:`sequences`.
+
+    Examples
+    --------
+    .. code-block:: python
+
+        >>> from __future__ import annotations
+
+        >>> from typing import TYPE_CHECKING
+        >>> import numpy as np
+        >>> from numpy.typing import _NestedSequnce
+
+        >>> def get_dtype(seq: _NestedSequnce[float]) -> np.dtype[np.float64]:
+        ...     return np.asarray(seq).dtype
+
+        >>> a = get_dtype([1.0])
+        >>> b = get_dtype([[1.0]])
+        >>> c = get_dtype([[[1.0]]])
+        >>> d = get_dtype([[[[1.0]]]])
+
+        >>> if TYPE_CHECKING:
+        ...     reveal_locals()
+        ...     # note: Revealed local types are:
+        ...     # note:     a: numpy.dtype[numpy.floating[numpy.typing._64Bit]]
+        ...     # note:     b: numpy.dtype[numpy.floating[numpy.typing._64Bit]]
+        ...     # note:     c: numpy.dtype[numpy.floating[numpy.typing._64Bit]]
+        ...     # note:     d: numpy.dtype[numpy.floating[numpy.typing._64Bit]]
+
+    """
+
+    def __len__(self, /) -> int:
+        """Implement ``len(self)``."""
+        raise NotImplementedError
+
+    @overload
+    def __getitem__(self, index: int, /) -> _T_co | _NestedSequence[_T_co]: ...
+    @overload
+    def __getitem__(self, index: slice, /) -> _NestedSequence[_T_co]: ...
+
+    def __getitem__(self, index, /):
+        """Implement ``self[x]``."""
+        raise NotImplementedError
+
+    def __contains__(self, x: object, /) -> bool:
+        """Implement ``x in self``."""
+        raise NotImplementedError
+
+    def __iter__(self, /) -> Iterator[_T_co | _NestedSequence[_T_co]]:
+        """Implement ``iter(self)``."""
+        raise NotImplementedError
+
+    def __reversed__(self, /) -> Iterator[_T_co | _NestedSequence[_T_co]]:
+        """Implement ``reversed(self)``."""
+        raise NotImplementedError
+
+    def count(self, value: Any, /) -> int:
+        """Return the number of occurrences of `value`."""
+        raise NotImplementedError
+
+    def index(self, value: Any, /) -> int:
+        """Return the first index of `value`."""
+        raise NotImplementedError
index cac121026407b5307fe960488d2317ee790e13e0..c28859b19bae50f22ede88e846c1a9a49966c685 100644 (file)
@@ -1,13 +1,4 @@
-import sys
-from typing import Sequence, Tuple, Union, Any
-
-if sys.version_info >= (3, 8):
-    from typing import SupportsIndex
-else:
-    try:
-        from typing_extensions import SupportsIndex
-    except ImportError:
-        SupportsIndex = Any
+from typing import Sequence, Tuple, Union, SupportsIndex
 
 _Shape = Tuple[int, ...]
 
index b3b9fa95ed39c9b47344bf8f5782c8a96c254c65..1be3500c127e74dc9004eaac23a59e0a265a1af1 100644 (file)
@@ -11,14 +11,14 @@ from typing import (
     Any,
     Generic,
     List,
-    Optional,
     overload,
     Tuple,
     TypeVar,
-    Union,
+    Literal,
+    SupportsIndex,
 )
 
-from numpy import ufunc, _Casting, _OrderKACF
+from numpy import ufunc, _CastingKind, _OrderKACF
 from numpy.typing import NDArray
 
 from ._shape import _ShapeLike
@@ -26,8 +26,6 @@ from ._scalars import _ScalarLike_co
 from ._array_like import ArrayLike, _ArrayLikeBool_co, _ArrayLikeInt_co
 from ._dtype_like import DTypeLike
 
-from typing_extensions import Literal, SupportsIndex
-
 _T = TypeVar("_T")
 _2Tuple = Tuple[_T, _T]
 _3Tuple = Tuple[_T, _T, _T]
@@ -82,33 +80,34 @@ class _UFunc_Nin1_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]):
         __x1: _ScalarLike_co,
         out: None = ...,
         *,
-        where: Optional[_ArrayLikeBool_co] = ...,
-        casting: _Casting = ...,
+        where: None | _ArrayLikeBool_co = ...,
+        casting: _CastingKind = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
-        signature: Union[str, _2Tuple[Optional[str]]] = ...,
+        signature: str | _2Tuple[None | str] = ...,
         extobj: List[Any] = ...,
     ) -> Any: ...
     @overload
     def __call__(
         self,
         __x1: ArrayLike,
-        out: Union[None, NDArray[Any], Tuple[NDArray[Any]]] = ...,
+        out: None | NDArray[Any] | Tuple[NDArray[Any]] = ...,
         *,
-        where: Optional[_ArrayLikeBool_co] = ...,
-        casting: _Casting = ...,
+        where: None | _ArrayLikeBool_co = ...,
+        casting: _CastingKind = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
-        signature: Union[str, _2Tuple[Optional[str]]] = ...,
+        signature: str | _2Tuple[None | str] = ...,
         extobj: List[Any] = ...,
     ) -> NDArray[Any]: ...
 
     def at(
         self,
-        __a: NDArray[Any],
-        __indices: _ArrayLikeInt_co,
+        a: NDArray[Any],
+        indices: _ArrayLikeInt_co,
+        /,
     ) -> None: ...
 
 class _UFunc_Nin2_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]):
@@ -134,12 +133,12 @@ class _UFunc_Nin2_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]):
         __x2: _ScalarLike_co,
         out: None = ...,
         *,
-        where: Optional[_ArrayLikeBool_co] = ...,
-        casting: _Casting = ...,
+        where: None | _ArrayLikeBool_co = ...,
+        casting: _CastingKind = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
-        signature: Union[str, _3Tuple[Optional[str]]] = ...,
+        signature: str | _3Tuple[None | str] = ...,
         extobj: List[Any] = ...,
     ) -> Any: ...
     @overload
@@ -147,30 +146,31 @@ class _UFunc_Nin2_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]):
         self,
         __x1: ArrayLike,
         __x2: ArrayLike,
-        out: Union[None, NDArray[Any], Tuple[NDArray[Any]]] = ...,
+        out: None | NDArray[Any] | Tuple[NDArray[Any]] = ...,
         *,
-        where: Optional[_ArrayLikeBool_co] = ...,
-        casting: _Casting = ...,
+        where: None | _ArrayLikeBool_co = ...,
+        casting: _CastingKind = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
-        signature: Union[str, _3Tuple[Optional[str]]] = ...,
+        signature: str | _3Tuple[None | str] = ...,
         extobj: List[Any] = ...,
     ) -> NDArray[Any]: ...
 
     def at(
         self,
-        __a: NDArray[Any],
-        __indices: _ArrayLikeInt_co,
-        __b: ArrayLike,
+        a: NDArray[Any],
+        indices: _ArrayLikeInt_co,
+        b: ArrayLike,
+        /,
     ) -> None: ...
 
     def reduce(
         self,
         array: ArrayLike,
-        axis: Optional[_ShapeLike] = ...,
+        axis: None | _ShapeLike = ...,
         dtype: DTypeLike = ...,
-        out: Optional[NDArray[Any]] = ...,
+        out: None | NDArray[Any] = ...,
         keepdims: bool = ...,
         initial: Any = ...,
         where: _ArrayLikeBool_co = ...,
@@ -181,7 +181,7 @@ class _UFunc_Nin2_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]):
         array: ArrayLike,
         axis: SupportsIndex = ...,
         dtype: DTypeLike = ...,
-        out: Optional[NDArray[Any]] = ...,
+        out: None | NDArray[Any] = ...,
     ) -> NDArray[Any]: ...
 
     def reduceat(
@@ -190,38 +190,38 @@ class _UFunc_Nin2_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]):
         indices: _ArrayLikeInt_co,
         axis: SupportsIndex = ...,
         dtype: DTypeLike = ...,
-        out: Optional[NDArray[Any]] = ...,
+        out: None | NDArray[Any] = ...,
     ) -> NDArray[Any]: ...
 
     # Expand `**kwargs` into explicit keyword-only arguments
     @overload
     def outer(
         self,
-        __A: _ScalarLike_co,
-        __B: _ScalarLike_co,
-        *,
+        A: _ScalarLike_co,
+        B: _ScalarLike_co,
+        /, *,
         out: None = ...,
-        where: Optional[_ArrayLikeBool_co] = ...,
-        casting: _Casting = ...,
+        where: None | _ArrayLikeBool_co = ...,
+        casting: _CastingKind = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
-        signature: Union[str, _3Tuple[Optional[str]]] = ...,
+        signature: str | _3Tuple[None | str] = ...,
         extobj: List[Any] = ...,
     ) -> Any: ...
     @overload
     def outer(  # type: ignore[misc]
         self,
-        __A: ArrayLike,
-        __B: ArrayLike,
-        *,
-        out: Union[None, NDArray[Any], Tuple[NDArray[Any]]] = ...,
-        where: Optional[_ArrayLikeBool_co] = ...,
-        casting: _Casting = ...,
+        A: ArrayLike,
+        B: ArrayLike,
+        /, *,
+        out: None | NDArray[Any] | Tuple[NDArray[Any]] = ...,
+        where: None | _ArrayLikeBool_co = ...,
+        casting: _CastingKind = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
-        signature: Union[str, _3Tuple[Optional[str]]] = ...,
+        signature: str | _3Tuple[None | str] = ...,
         extobj: List[Any] = ...,
     ) -> NDArray[Any]: ...
 
@@ -258,28 +258,28 @@ class _UFunc_Nin1_Nout2(ufunc, Generic[_NameType, _NTypes, _IDType]):
         __out1: None = ...,
         __out2: None = ...,
         *,
-        where: Optional[_ArrayLikeBool_co] = ...,
-        casting: _Casting = ...,
+        where: None | _ArrayLikeBool_co = ...,
+        casting: _CastingKind = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
-        signature: Union[str, _3Tuple[Optional[str]]] = ...,
+        signature: str | _3Tuple[None | str] = ...,
         extobj: List[Any] = ...,
     ) -> _2Tuple[Any]: ...
     @overload
     def __call__(
         self,
         __x1: ArrayLike,
-        __out1: Optional[NDArray[Any]] = ...,
-        __out2: Optional[NDArray[Any]] = ...,
+        __out1: None | NDArray[Any] = ...,
+        __out2: None | NDArray[Any] = ...,
         *,
         out: _2Tuple[NDArray[Any]] = ...,
-        where: Optional[_ArrayLikeBool_co] = ...,
-        casting: _Casting = ...,
+        where: None | _ArrayLikeBool_co = ...,
+        casting: _CastingKind = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
-        signature: Union[str, _3Tuple[Optional[str]]] = ...,
+        signature: str | _3Tuple[None | str] = ...,
         extobj: List[Any] = ...,
     ) -> _2Tuple[NDArray[Any]]: ...
 
@@ -317,12 +317,12 @@ class _UFunc_Nin2_Nout2(ufunc, Generic[_NameType, _NTypes, _IDType]):
         __out1: None = ...,
         __out2: None = ...,
         *,
-        where: Optional[_ArrayLikeBool_co] = ...,
-        casting: _Casting = ...,
+        where: None | _ArrayLikeBool_co = ...,
+        casting: _CastingKind = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
-        signature: Union[str, _4Tuple[Optional[str]]] = ...,
+        signature: str | _4Tuple[None | str] = ...,
         extobj: List[Any] = ...,
     ) -> _2Tuple[Any]: ...
     @overload
@@ -330,16 +330,16 @@ class _UFunc_Nin2_Nout2(ufunc, Generic[_NameType, _NTypes, _IDType]):
         self,
         __x1: ArrayLike,
         __x2: ArrayLike,
-        __out1: Optional[NDArray[Any]] = ...,
-        __out2: Optional[NDArray[Any]] = ...,
+        __out1: None | NDArray[Any] = ...,
+        __out2: None | NDArray[Any] = ...,
         *,
         out: _2Tuple[NDArray[Any]] = ...,
-        where: Optional[_ArrayLikeBool_co] = ...,
-        casting: _Casting = ...,
+        where: None | _ArrayLikeBool_co = ...,
+        casting: _CastingKind = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
-        signature: Union[str, _4Tuple[Optional[str]]] = ...,
+        signature: str | _4Tuple[None | str] = ...,
         extobj: List[Any] = ...,
     ) -> _2Tuple[NDArray[Any]]: ...
 
@@ -380,11 +380,11 @@ class _GUFunc_Nin2_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]):
         __x2: ArrayLike,
         out: None = ...,
         *,
-        casting: _Casting = ...,
+        casting: _CastingKind = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
-        signature: Union[str, _3Tuple[Optional[str]]] = ...,
+        signature: str | _3Tuple[None | str] = ...,
         extobj: List[Any] = ...,
         axes: List[_2Tuple[SupportsIndex]] = ...,
     ) -> Any: ...
@@ -393,13 +393,13 @@ class _GUFunc_Nin2_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]):
         self,
         __x1: ArrayLike,
         __x2: ArrayLike,
-        out: Union[NDArray[Any], Tuple[NDArray[Any]]],
+        out: NDArray[Any] | Tuple[NDArray[Any]],
         *,
-        casting: _Casting = ...,
+        casting: _CastingKind = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
-        signature: Union[str, _3Tuple[Optional[str]]] = ...,
+        signature: str | _3Tuple[None | str] = ...,
         extobj: List[Any] = ...,
         axes: List[_2Tuple[SupportsIndex]] = ...,
     ) -> NDArray[Any]: ...
index 901bf4fb121e0f5609ebf05428c2301ce6a7aa90..5ac75f94da93c6f9e81f20cf6b23964204c3ff0a 100644 (file)
@@ -1,8 +1,40 @@
-"""A module containing `numpy`-specific plugins for mypy."""
+"""A mypy_ plugin for managing a number of platform-specific annotations.
+Its functionality can be split into three distinct parts:
+
+* Assigning the (platform-dependent) precisions of certain `~numpy.number`
+  subclasses, including the likes of `~numpy.int_`, `~numpy.intp` and
+  `~numpy.longlong`. See the documentation on
+  :ref:`scalar types <arrays.scalars.built-in>` for a comprehensive overview
+  of the affected classes. Without the plugin the precision of all relevant
+  classes will be inferred as `~typing.Any`.
+* Removing all extended-precision `~numpy.number` subclasses that are
+  unavailable for the platform in question. Most notably this includes the
+  likes of `~numpy.float128` and `~numpy.complex256`. Without the plugin *all*
+  extended-precision types will, as far as mypy is concerned, be available
+  to all platforms.
+* Assigning the (platform-dependent) precision of `~numpy.ctypeslib.c_intp`.
+  Without the plugin the type will default to `ctypes.c_int64`.
+
+  .. versionadded:: 1.22
+
+Examples
+--------
+To enable the plugin, one must add it to their mypy `configuration file`_:
+
+.. code-block:: ini
+
+    [mypy]
+    plugins = numpy.typing.mypy_plugin
+
+.. _mypy: http://mypy-lang.org/
+.. _configuration file: https://mypy.readthedocs.io/en/stable/config_file.html
+
+"""
 
 from __future__ import annotations
 
-import typing as t
+from collections.abc import Iterable
+from typing import Final, TYPE_CHECKING, Callable
 
 import numpy as np
 
@@ -13,15 +45,15 @@ try:
     from mypy.nodes import MypyFile, ImportFrom, Statement
     from mypy.build import PRI_MED
 
-    _HookFunc = t.Callable[[AnalyzeTypeContext], Type]
-    MYPY_EX: t.Optional[ModuleNotFoundError] = None
+    _HookFunc = Callable[[AnalyzeTypeContext], Type]
+    MYPY_EX: None | ModuleNotFoundError = None
 except ModuleNotFoundError as ex:
     MYPY_EX = ex
 
-__all__: t.List[str] = []
+__all__: list[str] = []
 
 
-def _get_precision_dict() -> t.Dict[str, str]:
+def _get_precision_dict() -> dict[str, str]:
     names = [
         ("_NBitByte", np.byte),
         ("_NBitShort", np.short),
@@ -42,7 +74,7 @@ def _get_precision_dict() -> t.Dict[str, str]:
     return ret
 
 
-def _get_extended_precision_list() -> t.List[str]:
+def _get_extended_precision_list() -> list[str]:
     extended_types = [np.ulonglong, np.longlong, np.longdouble, np.clongdouble]
     extended_names = {
         "uint128",
@@ -61,12 +93,28 @@ def _get_extended_precision_list() -> t.List[str]:
     return [i.__name__ for i in extended_types if i.__name__ in extended_names]
 
 
+def _get_c_intp_name() -> str:
+    # Adapted from `np.core._internal._getintp_ctype`
+    char = np.dtype('p').char
+    if char == 'i':
+        return "c_int"
+    elif char == 'l':
+        return "c_long"
+    elif char == 'q':
+        return "c_longlong"
+    else:
+        return "c_long"
+
+
 #: A dictionary mapping type-aliases in `numpy.typing._nbit` to
 #: concrete `numpy.typing.NBitBase` subclasses.
-_PRECISION_DICT: t.Final = _get_precision_dict()
+_PRECISION_DICT: Final = _get_precision_dict()
 
 #: A list with the names of all extended precision `np.number` subclasses.
-_EXTENDED_PRECISION_LIST: t.Final = _get_extended_precision_list()
+_EXTENDED_PRECISION_LIST: Final = _get_extended_precision_list()
+
+#: The name of the ctypes quivalent of `np.intp`
+_C_INTP: Final = _get_c_intp_name()
 
 
 def _hook(ctx: AnalyzeTypeContext) -> Type:
@@ -77,21 +125,36 @@ def _hook(ctx: AnalyzeTypeContext) -> Type:
     return api.named_type(name_new)
 
 
-if t.TYPE_CHECKING or MYPY_EX is None:
-    def _index(iterable: t.Iterable[Statement], id: str) -> int:
+if TYPE_CHECKING or MYPY_EX is None:
+    def _index(iterable: Iterable[Statement], id: str) -> int:
         """Identify the first ``ImportFrom`` instance the specified `id`."""
         for i, value in enumerate(iterable):
             if getattr(value, "id", None) == id:
                 return i
-        else:
-            raise ValueError("Failed to identify a `ImportFrom` instance "
-                             f"with the following id: {id!r}")
+        raise ValueError("Failed to identify a `ImportFrom` instance "
+                         f"with the following id: {id!r}")
+
+    def _override_imports(
+        file: MypyFile,
+        module: str,
+        imports: list[tuple[str, None | str]],
+    ) -> None:
+        """Override the first `module`-based import with new `imports`."""
+        # Construct a new `from module import y` statement
+        import_obj = ImportFrom(module, 0, names=imports)
+        import_obj.is_top_level = True
+
+        # Replace the first `module`-based import statement with `import_obj`
+        for lst in [file.defs, file.imports]:  # type: list[Statement]
+            i = _index(lst, module)
+            lst[i] = import_obj
 
     class _NumpyPlugin(Plugin):
-        """A plugin for assigning platform-specific `numpy.number` precisions."""
+        """A mypy plugin for handling versus numpy-specific typing tasks."""
 
-        def get_type_analyze_hook(self, fullname: str) -> t.Optional[_HookFunc]:
-            """Set the precision of platform-specific `numpy.number` subclasses.
+        def get_type_analyze_hook(self, fullname: str) -> None | _HookFunc:
+            """Set the precision of platform-specific `numpy.number`
+            subclasses.
 
             For example: `numpy.int_`, `numpy.longlong` and `numpy.longdouble`.
             """
@@ -99,33 +162,36 @@ if t.TYPE_CHECKING or MYPY_EX is None:
                 return _hook
             return None
 
-        def get_additional_deps(self, file: MypyFile) -> t.List[t.Tuple[int, str, int]]:
-            """Import platform-specific extended-precision `numpy.number` subclasses.
+        def get_additional_deps(
+            self, file: MypyFile
+        ) -> list[tuple[int, str, int]]:
+            """Handle all import-based overrides.
+
+            * Import platform-specific extended-precision `numpy.number`
+              subclasses (*e.g.* `numpy.float96`, `numpy.float128` and
+              `numpy.complex256`).
+            * Import the appropriate `ctypes` equivalent to `numpy.intp`.
 
-            For example: `numpy.float96`, `numpy.float128` and `numpy.complex256`.
             """
             ret = [(PRI_MED, file.fullname, -1)]
+
             if file.fullname == "numpy":
-                # Import ONLY the extended precision types available to the
-                # platform in question
-                imports = ImportFrom(
-                    "numpy.typing._extended_precision", 0,
-                    names=[(v, v) for v in _EXTENDED_PRECISION_LIST],
+                _override_imports(
+                    file, "numpy.typing._extended_precision",
+                    imports=[(v, v) for v in _EXTENDED_PRECISION_LIST],
+                )
+            elif file.fullname == "numpy.ctypeslib":
+                _override_imports(
+                    file, "ctypes",
+                    imports=[(_C_INTP, "_c_intp")],
                 )
-                imports.is_top_level = True
-
-                # Replace the much broader extended-precision import
-                # (defined in `numpy/__init__.pyi`) with a more specific one
-                for lst in [file.defs, file.imports]:  # type: t.List[Statement]
-                    i = _index(lst, "numpy.typing._extended_precision")
-                    lst[i] = imports
             return ret
 
-    def plugin(version: str) -> t.Type[_NumpyPlugin]:
+    def plugin(version: str) -> type[_NumpyPlugin]:
         """An entry-point for mypy."""
         return _NumpyPlugin
 
 else:
-    def plugin(version: str) -> t.Type[_NumpyPlugin]:
+    def plugin(version: str) -> type[_NumpyPlugin]:
         """An entry-point for mypy."""
         raise MYPY_EX
diff --git a/numpy/typing/tests/data/fail/arithmetic.py b/numpy/typing/tests/data/fail/arithmetic.py
deleted file mode 100644 (file)
index 02bbffa..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-from typing import List, Any
-import numpy as np
-
-b_ = np.bool_()
-dt = np.datetime64(0, "D")
-td = np.timedelta64(0, "D")
-
-AR_b: np.ndarray[Any, np.dtype[np.bool_]]
-AR_u: np.ndarray[Any, np.dtype[np.uint32]]
-AR_i: np.ndarray[Any, np.dtype[np.int64]]
-AR_f: np.ndarray[Any, np.dtype[np.float64]]
-AR_c: np.ndarray[Any, np.dtype[np.complex128]]
-AR_m: np.ndarray[Any, np.dtype[np.timedelta64]]
-AR_M: np.ndarray[Any, np.dtype[np.datetime64]]
-
-ANY: Any
-
-AR_LIKE_b: List[bool]
-AR_LIKE_u: List[np.uint32]
-AR_LIKE_i: List[int]
-AR_LIKE_f: List[float]
-AR_LIKE_c: List[complex]
-AR_LIKE_m: List[np.timedelta64]
-AR_LIKE_M: List[np.datetime64]
-
-# Array subtraction
-
-# NOTE: mypys `NoReturn` errors are, unfortunately, not that great
-_1 = AR_b - AR_LIKE_b  # E: Need type annotation
-_2 = AR_LIKE_b - AR_b  # E: Need type annotation
-
-AR_f - AR_LIKE_m  # E: Unsupported operand types
-AR_f - AR_LIKE_M  # E: Unsupported operand types
-AR_c - AR_LIKE_m  # E: Unsupported operand types
-AR_c - AR_LIKE_M  # E: Unsupported operand types
-
-AR_m - AR_LIKE_f  # E: Unsupported operand types
-AR_M - AR_LIKE_f  # E: Unsupported operand types
-AR_m - AR_LIKE_c  # E: Unsupported operand types
-AR_M - AR_LIKE_c  # E: Unsupported operand types
-
-AR_m - AR_LIKE_M  # E: Unsupported operand types
-AR_LIKE_m - AR_M  # E: Unsupported operand types
-
-# array floor division
-
-AR_M // AR_LIKE_b  # E: Unsupported operand types
-AR_M // AR_LIKE_u  # E: Unsupported operand types
-AR_M // AR_LIKE_i  # E: Unsupported operand types
-AR_M // AR_LIKE_f  # E: Unsupported operand types
-AR_M // AR_LIKE_c  # E: Unsupported operand types
-AR_M // AR_LIKE_m  # E: Unsupported operand types
-AR_M // AR_LIKE_M  # E: Unsupported operand types
-
-AR_b // AR_LIKE_M  # E: Unsupported operand types
-AR_u // AR_LIKE_M  # E: Unsupported operand types
-AR_i // AR_LIKE_M  # E: Unsupported operand types
-AR_f // AR_LIKE_M  # E: Unsupported operand types
-AR_c // AR_LIKE_M  # E: Unsupported operand types
-AR_m // AR_LIKE_M  # E: Unsupported operand types
-AR_M // AR_LIKE_M  # E: Unsupported operand types
-
-_3 = AR_m // AR_LIKE_b  # E: Need type annotation
-AR_m // AR_LIKE_c  # E: Unsupported operand types
-
-AR_b // AR_LIKE_m  # E: Unsupported operand types
-AR_u // AR_LIKE_m  # E: Unsupported operand types
-AR_i // AR_LIKE_m  # E: Unsupported operand types
-AR_f // AR_LIKE_m  # E: Unsupported operand types
-AR_c // AR_LIKE_m  # E: Unsupported operand types
-
-# Array multiplication
-
-AR_b *= AR_LIKE_u  # E: incompatible type
-AR_b *= AR_LIKE_i  # E: incompatible type
-AR_b *= AR_LIKE_f  # E: incompatible type
-AR_b *= AR_LIKE_c  # E: incompatible type
-AR_b *= AR_LIKE_m  # E: incompatible type
-
-AR_u *= AR_LIKE_i  # E: incompatible type
-AR_u *= AR_LIKE_f  # E: incompatible type
-AR_u *= AR_LIKE_c  # E: incompatible type
-AR_u *= AR_LIKE_m  # E: incompatible type
-
-AR_i *= AR_LIKE_f  # E: incompatible type
-AR_i *= AR_LIKE_c  # E: incompatible type
-AR_i *= AR_LIKE_m  # E: incompatible type
-
-AR_f *= AR_LIKE_c  # E: incompatible type
-AR_f *= AR_LIKE_m  # E: incompatible type
-
-# Array power
-
-AR_b **= AR_LIKE_b  # E: incompatible type
-AR_b **= AR_LIKE_u  # E: incompatible type
-AR_b **= AR_LIKE_i  # E: incompatible type
-AR_b **= AR_LIKE_f  # E: incompatible type
-AR_b **= AR_LIKE_c  # E: incompatible type
-
-AR_u **= AR_LIKE_i  # E: incompatible type
-AR_u **= AR_LIKE_f  # E: incompatible type
-AR_u **= AR_LIKE_c  # E: incompatible type
-
-AR_i **= AR_LIKE_f  # E: incompatible type
-AR_i **= AR_LIKE_c  # E: incompatible type
-
-AR_f **= AR_LIKE_c  # E: incompatible type
-
-# Scalars
-
-b_ - b_  # E: No overload variant
-
-dt + dt  # E: Unsupported operand types
-td - dt  # E: Unsupported operand types
-td % 1  # E: Unsupported operand types
-td / dt  # E: No overload
-td % dt  # E: Unsupported operand types
-
--b_  # E: Unsupported operand type
-+b_  # E: Unsupported operand type
diff --git a/numpy/typing/tests/data/fail/arithmetic.pyi b/numpy/typing/tests/data/fail/arithmetic.pyi
new file mode 100644 (file)
index 0000000..b99b24c
--- /dev/null
@@ -0,0 +1,121 @@
+from typing import List, Any
+import numpy as np
+
+b_ = np.bool_()
+dt = np.datetime64(0, "D")
+td = np.timedelta64(0, "D")
+
+AR_b: np.ndarray[Any, np.dtype[np.bool_]]
+AR_u: np.ndarray[Any, np.dtype[np.uint32]]
+AR_i: np.ndarray[Any, np.dtype[np.int64]]
+AR_f: np.ndarray[Any, np.dtype[np.float64]]
+AR_c: np.ndarray[Any, np.dtype[np.complex128]]
+AR_m: np.ndarray[Any, np.dtype[np.timedelta64]]
+AR_M: np.ndarray[Any, np.dtype[np.datetime64]]
+
+ANY: Any
+
+AR_LIKE_b: List[bool]
+AR_LIKE_u: List[np.uint32]
+AR_LIKE_i: List[int]
+AR_LIKE_f: List[float]
+AR_LIKE_c: List[complex]
+AR_LIKE_m: List[np.timedelta64]
+AR_LIKE_M: List[np.datetime64]
+
+# Array subtraction
+
+# NOTE: mypys `NoReturn` errors are, unfortunately, not that great
+_1 = AR_b - AR_LIKE_b  # E: Need type annotation
+_2 = AR_LIKE_b - AR_b  # E: Need type annotation
+AR_i - bytes()  # E: No overload variant
+
+AR_f - AR_LIKE_m  # E: Unsupported operand types
+AR_f - AR_LIKE_M  # E: Unsupported operand types
+AR_c - AR_LIKE_m  # E: Unsupported operand types
+AR_c - AR_LIKE_M  # E: Unsupported operand types
+
+AR_m - AR_LIKE_f  # E: Unsupported operand types
+AR_M - AR_LIKE_f  # E: Unsupported operand types
+AR_m - AR_LIKE_c  # E: Unsupported operand types
+AR_M - AR_LIKE_c  # E: Unsupported operand types
+
+AR_m - AR_LIKE_M  # E: Unsupported operand types
+AR_LIKE_m - AR_M  # E: Unsupported operand types
+
+# array floor division
+
+AR_M // AR_LIKE_b  # E: Unsupported operand types
+AR_M // AR_LIKE_u  # E: Unsupported operand types
+AR_M // AR_LIKE_i  # E: Unsupported operand types
+AR_M // AR_LIKE_f  # E: Unsupported operand types
+AR_M // AR_LIKE_c  # E: Unsupported operand types
+AR_M // AR_LIKE_m  # E: Unsupported operand types
+AR_M // AR_LIKE_M  # E: Unsupported operand types
+
+AR_b // AR_LIKE_M  # E: Unsupported operand types
+AR_u // AR_LIKE_M  # E: Unsupported operand types
+AR_i // AR_LIKE_M  # E: Unsupported operand types
+AR_f // AR_LIKE_M  # E: Unsupported operand types
+AR_c // AR_LIKE_M  # E: Unsupported operand types
+AR_m // AR_LIKE_M  # E: Unsupported operand types
+AR_M // AR_LIKE_M  # E: Unsupported operand types
+
+_3 = AR_m // AR_LIKE_b  # E: Need type annotation
+AR_m // AR_LIKE_c  # E: Unsupported operand types
+
+AR_b // AR_LIKE_m  # E: Unsupported operand types
+AR_u // AR_LIKE_m  # E: Unsupported operand types
+AR_i // AR_LIKE_m  # E: Unsupported operand types
+AR_f // AR_LIKE_m  # E: Unsupported operand types
+AR_c // AR_LIKE_m  # E: Unsupported operand types
+
+# Array multiplication
+
+AR_b *= AR_LIKE_u  # E: incompatible type
+AR_b *= AR_LIKE_i  # E: incompatible type
+AR_b *= AR_LIKE_f  # E: incompatible type
+AR_b *= AR_LIKE_c  # E: incompatible type
+AR_b *= AR_LIKE_m  # E: incompatible type
+
+AR_u *= AR_LIKE_i  # E: incompatible type
+AR_u *= AR_LIKE_f  # E: incompatible type
+AR_u *= AR_LIKE_c  # E: incompatible type
+AR_u *= AR_LIKE_m  # E: incompatible type
+
+AR_i *= AR_LIKE_f  # E: incompatible type
+AR_i *= AR_LIKE_c  # E: incompatible type
+AR_i *= AR_LIKE_m  # E: incompatible type
+
+AR_f *= AR_LIKE_c  # E: incompatible type
+AR_f *= AR_LIKE_m  # E: incompatible type
+
+# Array power
+
+AR_b **= AR_LIKE_b  # E: Invalid self argument
+AR_b **= AR_LIKE_u  # E: Invalid self argument
+AR_b **= AR_LIKE_i  # E: Invalid self argument
+AR_b **= AR_LIKE_f  # E: Invalid self argument
+AR_b **= AR_LIKE_c  # E: Invalid self argument
+
+AR_u **= AR_LIKE_i  # E: incompatible type
+AR_u **= AR_LIKE_f  # E: incompatible type
+AR_u **= AR_LIKE_c  # E: incompatible type
+
+AR_i **= AR_LIKE_f  # E: incompatible type
+AR_i **= AR_LIKE_c  # E: incompatible type
+
+AR_f **= AR_LIKE_c  # E: incompatible type
+
+# Scalars
+
+b_ - b_  # E: No overload variant
+
+dt + dt  # E: Unsupported operand types
+td - dt  # E: Unsupported operand types
+td % 1  # E: Unsupported operand types
+td / dt  # E: No overload
+td % dt  # E: Unsupported operand types
+
+-b_  # E: Unsupported operand type
++b_  # E: Unsupported operand type
diff --git a/numpy/typing/tests/data/fail/array_constructors.py b/numpy/typing/tests/data/fail/array_constructors.py
deleted file mode 100644 (file)
index f13fdac..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-import numpy as np
-
-a: np.ndarray
-generator = (i for i in range(10))
-
-np.require(a, requirements=1)  # E: No overload variant
-np.require(a, requirements="TEST")  # E: incompatible type
-
-np.zeros("test")  # E: incompatible type
-np.zeros()  # E: Missing positional argument
-
-np.ones("test")  # E: incompatible type
-np.ones()  # E: Missing positional argument
-
-np.array(0, float, True)  # E: Too many positional
-
-np.linspace(None, 'bob')  # E: No overload variant
-np.linspace(0, 2, num=10.0)  # E: No overload variant
-np.linspace(0, 2, endpoint='True')  # E: No overload variant
-np.linspace(0, 2, retstep=b'False')  # E: No overload variant
-np.linspace(0, 2, dtype=0)  # E: No overload variant
-np.linspace(0, 2, axis=None)  # E: No overload variant
-
-np.logspace(None, 'bob')  # E: Argument 1
-np.logspace(0, 2, base=None)  # E: Argument "base"
-
-np.geomspace(None, 'bob')  # E: Argument 1
-
-np.stack(generator)  # E: No overload variant
-np.hstack({1, 2})  # E: incompatible type
-np.vstack(1)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/array_constructors.pyi b/numpy/typing/tests/data/fail/array_constructors.pyi
new file mode 100644 (file)
index 0000000..4f0a60b
--- /dev/null
@@ -0,0 +1,31 @@
+import numpy as np
+
+a: np.ndarray
+generator = (i for i in range(10))
+
+np.require(a, requirements=1)  # E: No overload variant
+np.require(a, requirements="TEST")  # E: incompatible type
+
+np.zeros("test")  # E: incompatible type
+np.zeros()  # E: require at least one argument
+
+np.ones("test")  # E: incompatible type
+np.ones()  # E: require at least one argument
+
+np.array(0, float, True)  # E: No overload variant
+
+np.linspace(None, 'bob')  # E: No overload variant
+np.linspace(0, 2, num=10.0)  # E: No overload variant
+np.linspace(0, 2, endpoint='True')  # E: No overload variant
+np.linspace(0, 2, retstep=b'False')  # E: No overload variant
+np.linspace(0, 2, dtype=0)  # E: No overload variant
+np.linspace(0, 2, axis=None)  # E: No overload variant
+
+np.logspace(None, 'bob')  # E: Argument 1
+np.logspace(0, 2, base=None)  # E: Argument "base"
+
+np.geomspace(None, 'bob')  # E: Argument 1
+
+np.stack(generator)  # E: No overload variant
+np.hstack({1, 2})  # E: No overload variant
+np.vstack(1)  # E: No overload variant
diff --git a/numpy/typing/tests/data/fail/array_like.py b/numpy/typing/tests/data/fail/array_like.py
deleted file mode 100644 (file)
index 3bbd290..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-import numpy as np
-from numpy.typing import ArrayLike
-
-
-class A:
-    pass
-
-
-x1: ArrayLike = (i for i in range(10))  # E: Incompatible types in assignment
-x2: ArrayLike = A()  # E: Incompatible types in assignment
-x3: ArrayLike = {1: "foo", 2: "bar"}  # E: Incompatible types in assignment
-
-scalar = np.int64(1)
-scalar.__array__(dtype=np.float64)  # E: No overload variant
-array = np.array([1])
-array.__array__(dtype=np.float64)  # E: No overload variant
diff --git a/numpy/typing/tests/data/fail/array_like.pyi b/numpy/typing/tests/data/fail/array_like.pyi
new file mode 100644 (file)
index 0000000..3bbd290
--- /dev/null
@@ -0,0 +1,16 @@
+import numpy as np
+from numpy.typing import ArrayLike
+
+
+class A:
+    pass
+
+
+x1: ArrayLike = (i for i in range(10))  # E: Incompatible types in assignment
+x2: ArrayLike = A()  # E: Incompatible types in assignment
+x3: ArrayLike = {1: "foo", 2: "bar"}  # E: Incompatible types in assignment
+
+scalar = np.int64(1)
+scalar.__array__(dtype=np.float64)  # E: No overload variant
+array = np.array([1])
+array.__array__(dtype=np.float64)  # E: No overload variant
diff --git a/numpy/typing/tests/data/fail/array_pad.pyi b/numpy/typing/tests/data/fail/array_pad.pyi
new file mode 100644 (file)
index 0000000..2be51a8
--- /dev/null
@@ -0,0 +1,6 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_i8: npt.NDArray[np.int64]
+
+np.pad(AR_i8, 2, mode="bob")  # E: No overload variant
diff --git a/numpy/typing/tests/data/fail/arrayprint.py b/numpy/typing/tests/data/fail/arrayprint.py
deleted file mode 100644 (file)
index 86297a0..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-from typing import Callable, Any
-import numpy as np
-
-AR: np.ndarray
-func1: Callable[[Any], str]
-func2: Callable[[np.integer[Any]], str]
-
-np.array2string(AR, style=None)  # E: Unexpected keyword argument
-np.array2string(AR, legacy="1.14")  # E: incompatible type
-np.array2string(AR, sign="*")  # E: incompatible type
-np.array2string(AR, floatmode="default")  # E: incompatible type
-np.array2string(AR, formatter={"A": func1})  # E: incompatible type
-np.array2string(AR, formatter={"float": func2})  # E: Incompatible types
diff --git a/numpy/typing/tests/data/fail/arrayprint.pyi b/numpy/typing/tests/data/fail/arrayprint.pyi
new file mode 100644 (file)
index 0000000..86297a0
--- /dev/null
@@ -0,0 +1,13 @@
+from typing import Callable, Any
+import numpy as np
+
+AR: np.ndarray
+func1: Callable[[Any], str]
+func2: Callable[[np.integer[Any]], str]
+
+np.array2string(AR, style=None)  # E: Unexpected keyword argument
+np.array2string(AR, legacy="1.14")  # E: incompatible type
+np.array2string(AR, sign="*")  # E: incompatible type
+np.array2string(AR, floatmode="default")  # E: incompatible type
+np.array2string(AR, formatter={"A": func1})  # E: incompatible type
+np.array2string(AR, formatter={"float": func2})  # E: Incompatible types
diff --git a/numpy/typing/tests/data/fail/arrayterator.py b/numpy/typing/tests/data/fail/arrayterator.py
deleted file mode 100644 (file)
index c50fb2e..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-from typing import Any
-import numpy as np
-
-AR_i8: np.ndarray[Any, np.dtype[np.int64]]
-ar_iter = np.lib.Arrayterator(AR_i8)
-
-np.lib.Arrayterator(np.int64())  # E: incompatible type
-ar_iter.shape = (10, 5)  # E: is read-only
-ar_iter[None]  # E: Invalid index type
-ar_iter[None, 1]  # E: Invalid index type
-ar_iter[np.intp()]  # E: Invalid index type
-ar_iter[np.intp(), ...]  # E: Invalid index type
-ar_iter[AR_i8]  # E: Invalid index type
-ar_iter[AR_i8, :]  # E: Invalid index type
diff --git a/numpy/typing/tests/data/fail/arrayterator.pyi b/numpy/typing/tests/data/fail/arrayterator.pyi
new file mode 100644 (file)
index 0000000..c50fb2e
--- /dev/null
@@ -0,0 +1,14 @@
+from typing import Any
+import numpy as np
+
+AR_i8: np.ndarray[Any, np.dtype[np.int64]]
+ar_iter = np.lib.Arrayterator(AR_i8)
+
+np.lib.Arrayterator(np.int64())  # E: incompatible type
+ar_iter.shape = (10, 5)  # E: is read-only
+ar_iter[None]  # E: Invalid index type
+ar_iter[None, 1]  # E: Invalid index type
+ar_iter[np.intp()]  # E: Invalid index type
+ar_iter[np.intp(), ...]  # E: Invalid index type
+ar_iter[AR_i8]  # E: Invalid index type
+ar_iter[AR_i8, :]  # E: Invalid index type
diff --git a/numpy/typing/tests/data/fail/bitwise_ops.py b/numpy/typing/tests/data/fail/bitwise_ops.py
deleted file mode 100644 (file)
index 8a8f897..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-import numpy as np
-
-i8 = np.int64()
-i4 = np.int32()
-u8 = np.uint64()
-b_ = np.bool_()
-i = int()
-
-f8 = np.float64()
-
-b_ >> f8  # E: No overload variant
-i8 << f8  # E: No overload variant
-i | f8  # E: Unsupported operand types
-i8 ^ f8  # E: No overload variant
-u8 & f8  # E: No overload variant
-~f8  # E: Unsupported operand type
-
-# mypys' error message for `NoReturn` is unfortunately pretty bad
-# TODO: Reenable this once we add support for numerical precision for `number`s
-# a = u8 | 0  # E: Need type annotation
diff --git a/numpy/typing/tests/data/fail/bitwise_ops.pyi b/numpy/typing/tests/data/fail/bitwise_ops.pyi
new file mode 100644 (file)
index 0000000..ee90900
--- /dev/null
@@ -0,0 +1,20 @@
+import numpy as np
+
+i8 = np.int64()
+i4 = np.int32()
+u8 = np.uint64()
+b_ = np.bool_()
+i = int()
+
+f8 = np.float64()
+
+b_ >> f8  # E: No overload variant
+i8 << f8  # E: No overload variant
+i | f8  # E: Unsupported operand types
+i8 ^ f8  # E: No overload variant
+u8 & f8  # E: No overload variant
+~f8  # E: Unsupported operand type
+
+# mypys' error message for `NoReturn` is unfortunately pretty bad
+# TODO: Re-enable this once we add support for numerical precision for `number`s
+# a = u8 | 0  # E: Need type annotation
diff --git a/numpy/typing/tests/data/fail/char.pyi b/numpy/typing/tests/data/fail/char.pyi
new file mode 100644 (file)
index 0000000..320f05d
--- /dev/null
@@ -0,0 +1,66 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_U: npt.NDArray[np.str_]
+AR_S: npt.NDArray[np.bytes_]
+
+np.char.equal(AR_U, AR_S)  # E: incompatible type
+
+np.char.not_equal(AR_U, AR_S)  # E: incompatible type
+
+np.char.greater_equal(AR_U, AR_S)  # E: incompatible type
+
+np.char.less_equal(AR_U, AR_S)  # E: incompatible type
+
+np.char.greater(AR_U, AR_S)  # E: incompatible type
+
+np.char.less(AR_U, AR_S)  # E: incompatible type
+
+np.char.encode(AR_S)  # E: incompatible type
+np.char.decode(AR_U)  # E: incompatible type
+
+np.char.join(AR_U, b"_")  # E: incompatible type
+np.char.join(AR_S, "_")  # E: incompatible type
+
+np.char.ljust(AR_U, 5, fillchar=b"a")  # E: incompatible type
+np.char.ljust(AR_S, 5, fillchar="a")  # E: incompatible type
+np.char.rjust(AR_U, 5, fillchar=b"a")  # E: incompatible type
+np.char.rjust(AR_S, 5, fillchar="a")  # E: incompatible type
+
+np.char.lstrip(AR_U, chars=b"a")  # E: incompatible type
+np.char.lstrip(AR_S, chars="a")  # E: incompatible type
+np.char.strip(AR_U, chars=b"a")  # E: incompatible type
+np.char.strip(AR_S, chars="a")  # E: incompatible type
+np.char.rstrip(AR_U, chars=b"a")  # E: incompatible type
+np.char.rstrip(AR_S, chars="a")  # E: incompatible type
+
+np.char.partition(AR_U, b"a")  # E: incompatible type
+np.char.partition(AR_S, "a")  # E: incompatible type
+np.char.rpartition(AR_U, b"a")  # E: incompatible type
+np.char.rpartition(AR_S, "a")  # E: incompatible type
+
+np.char.replace(AR_U, b"_", b"-")  # E: incompatible type
+np.char.replace(AR_S, "_", "-")  # E: incompatible type
+
+np.char.split(AR_U, b"_")  # E: incompatible type
+np.char.split(AR_S, "_")  # E: incompatible type
+np.char.rsplit(AR_U, b"_")  # E: incompatible type
+np.char.rsplit(AR_S, "_")  # E: incompatible type
+
+np.char.count(AR_U, b"a", start=[1, 2, 3])  # E: incompatible type
+np.char.count(AR_S, "a", end=9)  # E: incompatible type
+
+np.char.endswith(AR_U, b"a", start=[1, 2, 3])  # E: incompatible type
+np.char.endswith(AR_S, "a", end=9)  # E: incompatible type
+np.char.startswith(AR_U, b"a", start=[1, 2, 3])  # E: incompatible type
+np.char.startswith(AR_S, "a", end=9)  # E: incompatible type
+
+np.char.find(AR_U, b"a", start=[1, 2, 3])  # E: incompatible type
+np.char.find(AR_S, "a", end=9)  # E: incompatible type
+np.char.rfind(AR_U, b"a", start=[1, 2, 3])  # E: incompatible type
+np.char.rfind(AR_S, "a", end=9)  # E: incompatible type
+
+np.char.index(AR_U, b"a", start=[1, 2, 3])  # E: incompatible type
+np.char.index(AR_S, "a", end=9)  # E: incompatible type
+np.char.rindex(AR_U, b"a", start=[1, 2, 3])  # E: incompatible type
+np.char.rindex(AR_S, "a", end=9)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/chararray.pyi b/numpy/typing/tests/data/fail/chararray.pyi
new file mode 100644 (file)
index 0000000..ebc182e
--- /dev/null
@@ -0,0 +1,62 @@
+import numpy as np
+from typing import Any
+
+AR_U: np.chararray[Any, np.dtype[np.str_]]
+AR_S: np.chararray[Any, np.dtype[np.bytes_]]
+
+AR_S.encode()  # E: Invalid self argument
+AR_U.decode()  # E: Invalid self argument
+
+AR_U.join(b"_")  # E: incompatible type
+AR_S.join("_")  # E: incompatible type
+
+AR_U.ljust(5, fillchar=b"a")  # E: incompatible type
+AR_S.ljust(5, fillchar="a")  # E: incompatible type
+AR_U.rjust(5, fillchar=b"a")  # E: incompatible type
+AR_S.rjust(5, fillchar="a")  # E: incompatible type
+
+AR_U.lstrip(chars=b"a")  # E: incompatible type
+AR_S.lstrip(chars="a")  # E: incompatible type
+AR_U.strip(chars=b"a")  # E: incompatible type
+AR_S.strip(chars="a")  # E: incompatible type
+AR_U.rstrip(chars=b"a")  # E: incompatible type
+AR_S.rstrip(chars="a")  # E: incompatible type
+
+AR_U.partition(b"a")  # E: incompatible type
+AR_S.partition("a")  # E: incompatible type
+AR_U.rpartition(b"a")  # E: incompatible type
+AR_S.rpartition("a")  # E: incompatible type
+
+AR_U.replace(b"_", b"-")  # E: incompatible type
+AR_S.replace("_", "-")  # E: incompatible type
+
+AR_U.split(b"_")  # E: incompatible type
+AR_S.split("_")  # E: incompatible type
+AR_S.split(1)  # E: incompatible type
+AR_U.rsplit(b"_")  # E: incompatible type
+AR_S.rsplit("_")  # E: incompatible type
+
+AR_U.count(b"a", start=[1, 2, 3])  # E: incompatible type
+AR_S.count("a", end=9)  # E: incompatible type
+
+AR_U.endswith(b"a", start=[1, 2, 3])  # E: incompatible type
+AR_S.endswith("a", end=9)  # E: incompatible type
+AR_U.startswith(b"a", start=[1, 2, 3])  # E: incompatible type
+AR_S.startswith("a", end=9)  # E: incompatible type
+
+AR_U.find(b"a", start=[1, 2, 3])  # E: incompatible type
+AR_S.find("a", end=9)  # E: incompatible type
+AR_U.rfind(b"a", start=[1, 2, 3])  # E: incompatible type
+AR_S.rfind("a", end=9)  # E: incompatible type
+
+AR_U.index(b"a", start=[1, 2, 3])  # E: incompatible type
+AR_S.index("a", end=9)  # E: incompatible type
+AR_U.rindex(b"a", start=[1, 2, 3])  # E: incompatible type
+AR_S.rindex("a", end=9)  # E: incompatible type
+
+AR_U == AR_S  # E: Unsupported operand types
+AR_U != AR_S  # E: Unsupported operand types
+AR_U >= AR_S  # E: Unsupported operand types
+AR_U <= AR_S  # E: Unsupported operand types
+AR_U > AR_S  # E: Unsupported operand types
+AR_U < AR_S  # E: Unsupported operand types
diff --git a/numpy/typing/tests/data/fail/comparisons.py b/numpy/typing/tests/data/fail/comparisons.py
deleted file mode 100644 (file)
index cad1c65..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-from typing import Any
-import numpy as np
-
-AR_i: np.ndarray[Any, np.dtype[np.int64]]
-AR_f: np.ndarray[Any, np.dtype[np.float64]]
-AR_c: np.ndarray[Any, np.dtype[np.complex128]]
-AR_m: np.ndarray[Any, np.dtype[np.timedelta64]]
-AR_M: np.ndarray[Any, np.dtype[np.datetime64]]
-
-AR_f > AR_m  # E: Unsupported operand types
-AR_c > AR_m  # E: Unsupported operand types
-
-AR_m > AR_f  # E: Unsupported operand types
-AR_m > AR_c  # E: Unsupported operand types
-
-AR_i > AR_M  # E: Unsupported operand types
-AR_f > AR_M  # E: Unsupported operand types
-AR_m > AR_M  # E: Unsupported operand types
-
-AR_M > AR_i  # E: Unsupported operand types
-AR_M > AR_f  # E: Unsupported operand types
-AR_M > AR_m  # E: Unsupported operand types
-
-# Unfortunately `NoReturn` errors are not the most descriptive
-_1 = AR_i > str()  # E: Need type annotation
-_2 = AR_i > bytes()  # E: Need type annotation
-_3 = str() > AR_M  # E: Need type annotation
-_4 = bytes() > AR_M  # E: Need type annotation
diff --git a/numpy/typing/tests/data/fail/comparisons.pyi b/numpy/typing/tests/data/fail/comparisons.pyi
new file mode 100644 (file)
index 0000000..febd0a1
--- /dev/null
@@ -0,0 +1,27 @@
+from typing import Any
+import numpy as np
+
+AR_i: np.ndarray[Any, np.dtype[np.int64]]
+AR_f: np.ndarray[Any, np.dtype[np.float64]]
+AR_c: np.ndarray[Any, np.dtype[np.complex128]]
+AR_m: np.ndarray[Any, np.dtype[np.timedelta64]]
+AR_M: np.ndarray[Any, np.dtype[np.datetime64]]
+
+AR_f > AR_m  # E: Unsupported operand types
+AR_c > AR_m  # E: Unsupported operand types
+
+AR_m > AR_f  # E: Unsupported operand types
+AR_m > AR_c  # E: Unsupported operand types
+
+AR_i > AR_M  # E: Unsupported operand types
+AR_f > AR_M  # E: Unsupported operand types
+AR_m > AR_M  # E: Unsupported operand types
+
+AR_M > AR_i  # E: Unsupported operand types
+AR_M > AR_f  # E: Unsupported operand types
+AR_M > AR_m  # E: Unsupported operand types
+
+AR_i > str()  # E: No overload variant
+AR_i > bytes()  # E: No overload variant
+str() > AR_M  # E: Unsupported operand types
+bytes() > AR_M  # E: Unsupported operand types
diff --git a/numpy/typing/tests/data/fail/constants.py b/numpy/typing/tests/data/fail/constants.py
deleted file mode 100644 (file)
index 67ee0e0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-import numpy as np
-
-np.Inf = np.Inf  # E: Cannot assign to final
-np.ALLOW_THREADS = np.ALLOW_THREADS  # E: Cannot assign to final
-np.little_endian = np.little_endian  # E: Cannot assign to final
-np.UFUNC_PYVALS_NAME = np.UFUNC_PYVALS_NAME  # E: Cannot assign to final
diff --git a/numpy/typing/tests/data/fail/constants.pyi b/numpy/typing/tests/data/fail/constants.pyi
new file mode 100644 (file)
index 0000000..324cbe9
--- /dev/null
@@ -0,0 +1,7 @@
+import numpy as np
+
+np.Inf = np.Inf  # E: Cannot assign to final
+np.ALLOW_THREADS = np.ALLOW_THREADS  # E: Cannot assign to final
+np.little_endian = np.little_endian  # E: Cannot assign to final
+np.UFUNC_PYVALS_NAME = "bob"  # E: Incompatible types
+np.CLIP = 2  # E: Incompatible types
diff --git a/numpy/typing/tests/data/fail/datasource.py b/numpy/typing/tests/data/fail/datasource.py
deleted file mode 100644 (file)
index 345277d..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-from pathlib import Path
-import numpy as np
-
-path: Path
-d1: np.DataSource
-
-d1.abspath(path)  # E: incompatible type
-d1.abspath(b"...")  # E: incompatible type
-
-d1.exists(path)  # E: incompatible type
-d1.exists(b"...")  # E: incompatible type
-
-d1.open(path, "r")  # E: incompatible type
-d1.open(b"...", encoding="utf8")  # E: incompatible type
-d1.open(None, newline="/n")  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/datasource.pyi b/numpy/typing/tests/data/fail/datasource.pyi
new file mode 100644 (file)
index 0000000..345277d
--- /dev/null
@@ -0,0 +1,15 @@
+from pathlib import Path
+import numpy as np
+
+path: Path
+d1: np.DataSource
+
+d1.abspath(path)  # E: incompatible type
+d1.abspath(b"...")  # E: incompatible type
+
+d1.exists(path)  # E: incompatible type
+d1.exists(b"...")  # E: incompatible type
+
+d1.open(path, "r")  # E: incompatible type
+d1.open(b"...", encoding="utf8")  # E: incompatible type
+d1.open(None, newline="/n")  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/dtype.py b/numpy/typing/tests/data/fail/dtype.py
deleted file mode 100644 (file)
index 0f3810f..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-import numpy as np
-
-
-class Test1:
-    not_dtype = np.dtype(float)
-
-
-class Test2:
-    dtype = float
-
-
-np.dtype(Test1())  # E: No overload variant of "dtype" matches
-np.dtype(Test2())  # E: incompatible type
-
-np.dtype(  # E: No overload variant of "dtype" matches
-    {
-        "field1": (float, 1),
-        "field2": (int, 3),
-    }
-)
diff --git a/numpy/typing/tests/data/fail/dtype.pyi b/numpy/typing/tests/data/fail/dtype.pyi
new file mode 100644 (file)
index 0000000..0f3810f
--- /dev/null
@@ -0,0 +1,20 @@
+import numpy as np
+
+
+class Test1:
+    not_dtype = np.dtype(float)
+
+
+class Test2:
+    dtype = float
+
+
+np.dtype(Test1())  # E: No overload variant of "dtype" matches
+np.dtype(Test2())  # E: incompatible type
+
+np.dtype(  # E: No overload variant of "dtype" matches
+    {
+        "field1": (float, 1),
+        "field2": (int, 3),
+    }
+)
diff --git a/numpy/typing/tests/data/fail/einsumfunc.py b/numpy/typing/tests/data/fail/einsumfunc.py
deleted file mode 100644 (file)
index 33722f8..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-from typing import List, Any
-import numpy as np
-
-AR_i: np.ndarray[Any, np.dtype[np.int64]]
-AR_f: np.ndarray[Any, np.dtype[np.float64]]
-AR_m: np.ndarray[Any, np.dtype[np.timedelta64]]
-AR_O: np.ndarray[Any, np.dtype[np.object_]]
-AR_U: np.ndarray[Any, np.dtype[np.str_]]
-
-np.einsum("i,i->i", AR_i, AR_m)  # E: incompatible type
-np.einsum("i,i->i", AR_O, AR_O)  # E: incompatible type
-np.einsum("i,i->i", AR_f, AR_f, dtype=np.int32)  # E: incompatible type
-np.einsum("i,i->i", AR_i, AR_i, dtype=np.timedelta64, casting="unsafe")  # E: No overload variant
-np.einsum("i,i->i", AR_i, AR_i, out=AR_U)  # E: Value of type variable "_ArrayType" of "einsum" cannot be
-np.einsum("i,i->i", AR_i, AR_i, out=AR_U, casting="unsafe")  # E: No overload variant
diff --git a/numpy/typing/tests/data/fail/einsumfunc.pyi b/numpy/typing/tests/data/fail/einsumfunc.pyi
new file mode 100644 (file)
index 0000000..33722f8
--- /dev/null
@@ -0,0 +1,15 @@
+from typing import List, Any
+import numpy as np
+
+AR_i: np.ndarray[Any, np.dtype[np.int64]]
+AR_f: np.ndarray[Any, np.dtype[np.float64]]
+AR_m: np.ndarray[Any, np.dtype[np.timedelta64]]
+AR_O: np.ndarray[Any, np.dtype[np.object_]]
+AR_U: np.ndarray[Any, np.dtype[np.str_]]
+
+np.einsum("i,i->i", AR_i, AR_m)  # E: incompatible type
+np.einsum("i,i->i", AR_O, AR_O)  # E: incompatible type
+np.einsum("i,i->i", AR_f, AR_f, dtype=np.int32)  # E: incompatible type
+np.einsum("i,i->i", AR_i, AR_i, dtype=np.timedelta64, casting="unsafe")  # E: No overload variant
+np.einsum("i,i->i", AR_i, AR_i, out=AR_U)  # E: Value of type variable "_ArrayType" of "einsum" cannot be
+np.einsum("i,i->i", AR_i, AR_i, out=AR_U, casting="unsafe")  # E: No overload variant
diff --git a/numpy/typing/tests/data/fail/flatiter.py b/numpy/typing/tests/data/fail/flatiter.py
deleted file mode 100644 (file)
index 544ffbe..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-from typing import Any
-
-import numpy as np
-from numpy.typing import _SupportsArray
-
-
-class Index:
-    def __index__(self) -> int:
-        ...
-
-
-a: "np.flatiter[np.ndarray]"
-supports_array: _SupportsArray
-
-a.base = Any  # E: Property "base" defined in "flatiter" is read-only
-a.coords = Any  # E: Property "coords" defined in "flatiter" is read-only
-a.index = Any  # E: Property "index" defined in "flatiter" is read-only
-a.copy(order='C')  # E: Unexpected keyword argument
-
-# NOTE: Contrary to `ndarray.__getitem__` its counterpart in `flatiter`
-# does not accept objects with the `__array__` or `__index__` protocols;
-# boolean indexing is just plain broken (gh-17175)
-a[np.bool_()]  # E: No overload variant of "__getitem__"
-a[Index()]  # E: No overload variant of "__getitem__"
-a[supports_array]  # E: No overload variant of "__getitem__"
diff --git a/numpy/typing/tests/data/fail/flatiter.pyi b/numpy/typing/tests/data/fail/flatiter.pyi
new file mode 100644 (file)
index 0000000..544ffbe
--- /dev/null
@@ -0,0 +1,25 @@
+from typing import Any
+
+import numpy as np
+from numpy.typing import _SupportsArray
+
+
+class Index:
+    def __index__(self) -> int:
+        ...
+
+
+a: "np.flatiter[np.ndarray]"
+supports_array: _SupportsArray
+
+a.base = Any  # E: Property "base" defined in "flatiter" is read-only
+a.coords = Any  # E: Property "coords" defined in "flatiter" is read-only
+a.index = Any  # E: Property "index" defined in "flatiter" is read-only
+a.copy(order='C')  # E: Unexpected keyword argument
+
+# NOTE: Contrary to `ndarray.__getitem__` its counterpart in `flatiter`
+# does not accept objects with the `__array__` or `__index__` protocols;
+# boolean indexing is just plain broken (gh-17175)
+a[np.bool_()]  # E: No overload variant of "__getitem__"
+a[Index()]  # E: No overload variant of "__getitem__"
+a[supports_array]  # E: No overload variant of "__getitem__"
diff --git a/numpy/typing/tests/data/fail/fromnumeric.py b/numpy/typing/tests/data/fail/fromnumeric.py
deleted file mode 100644 (file)
index 8fafed1..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-"""Tests for :mod:`numpy.core.fromnumeric`."""
-
-import numpy as np
-
-A = np.array(True, ndmin=2, dtype=bool)
-A.setflags(write=False)
-
-a = np.bool_(True)
-
-np.take(a, None)  # E: incompatible type
-np.take(a, axis=1.0)  # E: incompatible type
-np.take(A, out=1)  # E: incompatible type
-np.take(A, mode="bob")  # E: incompatible type
-
-np.reshape(a, None)  # E: Argument 2 to "reshape" has incompatible type
-np.reshape(A, 1, order="bob")  # E: Argument "order" to "reshape" has incompatible type
-
-np.choose(a, None)  # E: incompatible type
-np.choose(a, out=1.0)  # E: incompatible type
-np.choose(A, mode="bob")  # E: incompatible type
-
-np.repeat(a, None)  # E: Argument 2 to "repeat" has incompatible type
-np.repeat(A, 1, axis=1.0)  # E: Argument "axis" to "repeat" has incompatible type
-
-np.swapaxes(A, None, 1)  # E: Argument 2 to "swapaxes" has incompatible type
-np.swapaxes(A, 1, [0])  # E: Argument 3 to "swapaxes" has incompatible type
-
-np.transpose(A, axes=1.0)  # E: Argument "axes" to "transpose" has incompatible type
-
-np.partition(a, None)  # E: Argument 2 to "partition" has incompatible type
-np.partition(
-    a, 0, axis="bob"  # E: Argument "axis" to "partition" has incompatible type
-)
-np.partition(
-    A, 0, kind="bob"  # E: Argument "kind" to "partition" has incompatible type
-)
-np.partition(
-    A, 0, order=range(5)  # E: Argument "order" to "partition" has incompatible type
-)
-
-np.argpartition(
-    a, None  # E: incompatible type
-)
-np.argpartition(
-    a, 0, axis="bob"  # E: incompatible type
-)
-np.argpartition(
-    A, 0, kind="bob"  # E: incompatible type
-)
-np.argpartition(
-    A, 0, order=range(5)  # E: Argument "order" to "argpartition" has incompatible type
-)
-
-np.sort(A, axis="bob")  # E: Argument "axis" to "sort" has incompatible type
-np.sort(A, kind="bob")  # E: Argument "kind" to "sort" has incompatible type
-np.sort(A, order=range(5))  # E: Argument "order" to "sort" has incompatible type
-
-np.argsort(A, axis="bob")  # E: Argument "axis" to "argsort" has incompatible type
-np.argsort(A, kind="bob")  # E: Argument "kind" to "argsort" has incompatible type
-np.argsort(A, order=range(5))  # E: Argument "order" to "argsort" has incompatible type
-
-np.argmax(A, axis="bob")  # E: No overload variant of "argmax" matches argument type
-np.argmax(A, kind="bob")  # E: No overload variant of "argmax" matches argument type
-
-np.argmin(A, axis="bob")  # E: No overload variant of "argmin" matches argument type
-np.argmin(A, kind="bob")  # E: No overload variant of "argmin" matches argument type
-
-np.searchsorted(  # E: No overload variant of "searchsorted" matches argument type
-    A[0], 0, side="bob"
-)
-np.searchsorted(  # E: No overload variant of "searchsorted" matches argument type
-    A[0], 0, sorter=1.0
-)
-
-np.resize(A, 1.0)  # E: Argument 2 to "resize" has incompatible type
-
-np.squeeze(A, 1.0)  # E: No overload variant of "squeeze" matches argument type
-
-np.diagonal(A, offset=None)  # E: Argument "offset" to "diagonal" has incompatible type
-np.diagonal(A, axis1="bob")  # E: Argument "axis1" to "diagonal" has incompatible type
-np.diagonal(A, axis2=[])  # E: Argument "axis2" to "diagonal" has incompatible type
-
-np.trace(A, offset=None)  # E: Argument "offset" to "trace" has incompatible type
-np.trace(A, axis1="bob")  # E: Argument "axis1" to "trace" has incompatible type
-np.trace(A, axis2=[])  # E: Argument "axis2" to "trace" has incompatible type
-
-np.ravel(a, order="bob")  # E: Argument "order" to "ravel" has incompatible type
-
-np.compress(
-    [True], A, axis=1.0  # E: Argument "axis" to "compress" has incompatible type
-)
-
-np.clip(a, 1, 2, out=1)  # E: No overload variant of "clip" matches argument type
-np.clip(1, None, None)  # E: No overload variant of "clip" matches argument type
-
-np.sum(a, axis=1.0)  # E: incompatible type
-np.sum(a, keepdims=1.0)  # E: incompatible type
-np.sum(a, initial=[1])  # E: incompatible type
-
-np.all(a, axis=1.0)  # E: No overload variant
-np.all(a, keepdims=1.0)  # E: No overload variant
-np.all(a, out=1.0)  # E: No overload variant
-
-np.any(a, axis=1.0)  # E: No overload variant
-np.any(a, keepdims=1.0)  # E: No overload variant
-np.any(a, out=1.0)  # E: No overload variant
-
-np.cumsum(a, axis=1.0)  # E: incompatible type
-np.cumsum(a, dtype=1.0)  # E: incompatible type
-np.cumsum(a, out=1.0)  # E: incompatible type
-
-np.ptp(a, axis=1.0)  # E: incompatible type
-np.ptp(a, keepdims=1.0)  # E: incompatible type
-np.ptp(a, out=1.0)  # E: incompatible type
-
-np.amax(a, axis=1.0)  # E: incompatible type
-np.amax(a, keepdims=1.0)  # E: incompatible type
-np.amax(a, out=1.0)  # E: incompatible type
-np.amax(a, initial=[1.0])  # E: incompatible type
-np.amax(a, where=[1.0])  # E: incompatible type
-
-np.amin(a, axis=1.0)  # E: incompatible type
-np.amin(a, keepdims=1.0)  # E: incompatible type
-np.amin(a, out=1.0)  # E: incompatible type
-np.amin(a, initial=[1.0])  # E: incompatible type
-np.amin(a, where=[1.0])  # E: incompatible type
-
-np.prod(a, axis=1.0)  # E: incompatible type
-np.prod(a, out=False)  # E: incompatible type
-np.prod(a, keepdims=1.0)  # E: incompatible type
-np.prod(a, initial=int)  # E: incompatible type
-np.prod(a, where=1.0)  # E: incompatible type
-
-np.cumprod(a, axis=1.0)  # E: Argument "axis" to "cumprod" has incompatible type
-np.cumprod(a, out=False)  # E: Argument "out" to "cumprod" has incompatible type
-
-np.size(a, axis=1.0)  # E: Argument "axis" to "size" has incompatible type
-
-np.around(a, decimals=1.0)  # E: incompatible type
-np.around(a, out=type)  # E: incompatible type
-
-np.mean(a, axis=1.0)  # E: incompatible type
-np.mean(a, out=False)  # E: incompatible type
-np.mean(a, keepdims=1.0)  # E: incompatible type
-
-np.std(a, axis=1.0)  # E: incompatible type
-np.std(a, out=False)  # E: incompatible type
-np.std(a, ddof='test')  # E: incompatible type
-np.std(a, keepdims=1.0)  # E: incompatible type
-
-np.var(a, axis=1.0)  # E: incompatible type
-np.var(a, out=False)  # E: incompatible type
-np.var(a, ddof='test')  # E: incompatible type
-np.var(a, keepdims=1.0)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/fromnumeric.pyi b/numpy/typing/tests/data/fail/fromnumeric.pyi
new file mode 100644 (file)
index 0000000..8fafed1
--- /dev/null
@@ -0,0 +1,154 @@
+"""Tests for :mod:`numpy.core.fromnumeric`."""
+
+import numpy as np
+
+A = np.array(True, ndmin=2, dtype=bool)
+A.setflags(write=False)
+
+a = np.bool_(True)
+
+np.take(a, None)  # E: incompatible type
+np.take(a, axis=1.0)  # E: incompatible type
+np.take(A, out=1)  # E: incompatible type
+np.take(A, mode="bob")  # E: incompatible type
+
+np.reshape(a, None)  # E: Argument 2 to "reshape" has incompatible type
+np.reshape(A, 1, order="bob")  # E: Argument "order" to "reshape" has incompatible type
+
+np.choose(a, None)  # E: incompatible type
+np.choose(a, out=1.0)  # E: incompatible type
+np.choose(A, mode="bob")  # E: incompatible type
+
+np.repeat(a, None)  # E: Argument 2 to "repeat" has incompatible type
+np.repeat(A, 1, axis=1.0)  # E: Argument "axis" to "repeat" has incompatible type
+
+np.swapaxes(A, None, 1)  # E: Argument 2 to "swapaxes" has incompatible type
+np.swapaxes(A, 1, [0])  # E: Argument 3 to "swapaxes" has incompatible type
+
+np.transpose(A, axes=1.0)  # E: Argument "axes" to "transpose" has incompatible type
+
+np.partition(a, None)  # E: Argument 2 to "partition" has incompatible type
+np.partition(
+    a, 0, axis="bob"  # E: Argument "axis" to "partition" has incompatible type
+)
+np.partition(
+    A, 0, kind="bob"  # E: Argument "kind" to "partition" has incompatible type
+)
+np.partition(
+    A, 0, order=range(5)  # E: Argument "order" to "partition" has incompatible type
+)
+
+np.argpartition(
+    a, None  # E: incompatible type
+)
+np.argpartition(
+    a, 0, axis="bob"  # E: incompatible type
+)
+np.argpartition(
+    A, 0, kind="bob"  # E: incompatible type
+)
+np.argpartition(
+    A, 0, order=range(5)  # E: Argument "order" to "argpartition" has incompatible type
+)
+
+np.sort(A, axis="bob")  # E: Argument "axis" to "sort" has incompatible type
+np.sort(A, kind="bob")  # E: Argument "kind" to "sort" has incompatible type
+np.sort(A, order=range(5))  # E: Argument "order" to "sort" has incompatible type
+
+np.argsort(A, axis="bob")  # E: Argument "axis" to "argsort" has incompatible type
+np.argsort(A, kind="bob")  # E: Argument "kind" to "argsort" has incompatible type
+np.argsort(A, order=range(5))  # E: Argument "order" to "argsort" has incompatible type
+
+np.argmax(A, axis="bob")  # E: No overload variant of "argmax" matches argument type
+np.argmax(A, kind="bob")  # E: No overload variant of "argmax" matches argument type
+
+np.argmin(A, axis="bob")  # E: No overload variant of "argmin" matches argument type
+np.argmin(A, kind="bob")  # E: No overload variant of "argmin" matches argument type
+
+np.searchsorted(  # E: No overload variant of "searchsorted" matches argument type
+    A[0], 0, side="bob"
+)
+np.searchsorted(  # E: No overload variant of "searchsorted" matches argument type
+    A[0], 0, sorter=1.0
+)
+
+np.resize(A, 1.0)  # E: Argument 2 to "resize" has incompatible type
+
+np.squeeze(A, 1.0)  # E: No overload variant of "squeeze" matches argument type
+
+np.diagonal(A, offset=None)  # E: Argument "offset" to "diagonal" has incompatible type
+np.diagonal(A, axis1="bob")  # E: Argument "axis1" to "diagonal" has incompatible type
+np.diagonal(A, axis2=[])  # E: Argument "axis2" to "diagonal" has incompatible type
+
+np.trace(A, offset=None)  # E: Argument "offset" to "trace" has incompatible type
+np.trace(A, axis1="bob")  # E: Argument "axis1" to "trace" has incompatible type
+np.trace(A, axis2=[])  # E: Argument "axis2" to "trace" has incompatible type
+
+np.ravel(a, order="bob")  # E: Argument "order" to "ravel" has incompatible type
+
+np.compress(
+    [True], A, axis=1.0  # E: Argument "axis" to "compress" has incompatible type
+)
+
+np.clip(a, 1, 2, out=1)  # E: No overload variant of "clip" matches argument type
+np.clip(1, None, None)  # E: No overload variant of "clip" matches argument type
+
+np.sum(a, axis=1.0)  # E: incompatible type
+np.sum(a, keepdims=1.0)  # E: incompatible type
+np.sum(a, initial=[1])  # E: incompatible type
+
+np.all(a, axis=1.0)  # E: No overload variant
+np.all(a, keepdims=1.0)  # E: No overload variant
+np.all(a, out=1.0)  # E: No overload variant
+
+np.any(a, axis=1.0)  # E: No overload variant
+np.any(a, keepdims=1.0)  # E: No overload variant
+np.any(a, out=1.0)  # E: No overload variant
+
+np.cumsum(a, axis=1.0)  # E: incompatible type
+np.cumsum(a, dtype=1.0)  # E: incompatible type
+np.cumsum(a, out=1.0)  # E: incompatible type
+
+np.ptp(a, axis=1.0)  # E: incompatible type
+np.ptp(a, keepdims=1.0)  # E: incompatible type
+np.ptp(a, out=1.0)  # E: incompatible type
+
+np.amax(a, axis=1.0)  # E: incompatible type
+np.amax(a, keepdims=1.0)  # E: incompatible type
+np.amax(a, out=1.0)  # E: incompatible type
+np.amax(a, initial=[1.0])  # E: incompatible type
+np.amax(a, where=[1.0])  # E: incompatible type
+
+np.amin(a, axis=1.0)  # E: incompatible type
+np.amin(a, keepdims=1.0)  # E: incompatible type
+np.amin(a, out=1.0)  # E: incompatible type
+np.amin(a, initial=[1.0])  # E: incompatible type
+np.amin(a, where=[1.0])  # E: incompatible type
+
+np.prod(a, axis=1.0)  # E: incompatible type
+np.prod(a, out=False)  # E: incompatible type
+np.prod(a, keepdims=1.0)  # E: incompatible type
+np.prod(a, initial=int)  # E: incompatible type
+np.prod(a, where=1.0)  # E: incompatible type
+
+np.cumprod(a, axis=1.0)  # E: Argument "axis" to "cumprod" has incompatible type
+np.cumprod(a, out=False)  # E: Argument "out" to "cumprod" has incompatible type
+
+np.size(a, axis=1.0)  # E: Argument "axis" to "size" has incompatible type
+
+np.around(a, decimals=1.0)  # E: incompatible type
+np.around(a, out=type)  # E: incompatible type
+
+np.mean(a, axis=1.0)  # E: incompatible type
+np.mean(a, out=False)  # E: incompatible type
+np.mean(a, keepdims=1.0)  # E: incompatible type
+
+np.std(a, axis=1.0)  # E: incompatible type
+np.std(a, out=False)  # E: incompatible type
+np.std(a, ddof='test')  # E: incompatible type
+np.std(a, keepdims=1.0)  # E: incompatible type
+
+np.var(a, axis=1.0)  # E: incompatible type
+np.var(a, out=False)  # E: incompatible type
+np.var(a, ddof='test')  # E: incompatible type
+np.var(a, keepdims=1.0)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/histograms.pyi b/numpy/typing/tests/data/fail/histograms.pyi
new file mode 100644 (file)
index 0000000..ad15148
--- /dev/null
@@ -0,0 +1,13 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_i8: npt.NDArray[np.int64]
+AR_f8: npt.NDArray[np.float64]
+
+np.histogram_bin_edges(AR_i8, range=(0, 1, 2))  # E: incompatible type
+
+np.histogram(AR_i8, range=(0, 1, 2))  # E: incompatible type
+np.histogram(AR_i8, normed=True)  # E: incompatible type
+
+np.histogramdd(AR_i8, range=(0, 1))  # E: incompatible type
+np.histogramdd(AR_i8, range=[(0, 1, 2)])  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/index_tricks.py b/numpy/typing/tests/data/fail/index_tricks.py
deleted file mode 100644 (file)
index c508bf3..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-from typing import List
-import numpy as np
-
-AR_LIKE_i: List[int]
-AR_LIKE_f: List[float]
-
-np.unravel_index(AR_LIKE_f, (1, 2, 3))  # E: incompatible type
-np.ravel_multi_index(AR_LIKE_i, (1, 2, 3), mode="bob")  # E: No overload variant
-np.mgrid[1]  # E: Invalid index type
-np.mgrid[...]  # E: Invalid index type
-np.ogrid[1]  # E: Invalid index type
-np.ogrid[...]  # E: Invalid index type
-np.fill_diagonal(AR_LIKE_f, 2)  # E: incompatible type
-np.diag_indices(1.0)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/index_tricks.pyi b/numpy/typing/tests/data/fail/index_tricks.pyi
new file mode 100644 (file)
index 0000000..c508bf3
--- /dev/null
@@ -0,0 +1,14 @@
+from typing import List
+import numpy as np
+
+AR_LIKE_i: List[int]
+AR_LIKE_f: List[float]
+
+np.unravel_index(AR_LIKE_f, (1, 2, 3))  # E: incompatible type
+np.ravel_multi_index(AR_LIKE_i, (1, 2, 3), mode="bob")  # E: No overload variant
+np.mgrid[1]  # E: Invalid index type
+np.mgrid[...]  # E: Invalid index type
+np.ogrid[1]  # E: Invalid index type
+np.ogrid[...]  # E: Invalid index type
+np.fill_diagonal(AR_LIKE_f, 2)  # E: incompatible type
+np.diag_indices(1.0)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/lib_function_base.pyi b/numpy/typing/tests/data/fail/lib_function_base.pyi
new file mode 100644 (file)
index 0000000..9cad2da
--- /dev/null
@@ -0,0 +1,53 @@
+from typing import Any
+
+import numpy as np
+import numpy.typing as npt
+
+AR_f8: npt.NDArray[np.float64]
+AR_c16: npt.NDArray[np.complex128]
+AR_m: npt.NDArray[np.timedelta64]
+AR_M: npt.NDArray[np.datetime64]
+AR_O: npt.NDArray[np.object_]
+
+def func(a: int) -> None: ...
+
+np.average(AR_m)  # E: incompatible type
+np.select(1, [AR_f8])  # E: incompatible type
+np.angle(AR_m)  # E: incompatible type
+np.unwrap(AR_m)  # E: incompatible type
+np.unwrap(AR_c16)  # E: incompatible type
+np.trim_zeros(1)  # E: incompatible type
+np.place(1, [True], 1.5)  # E: incompatible type
+np.vectorize(1)  # E: incompatible type
+np.add_newdoc("__main__", 1.5, "docstring")  # E: incompatible type
+np.place(AR_f8, slice(None), 5)  # E: incompatible type
+
+np.interp(AR_f8, AR_c16, AR_f8)  # E: incompatible type
+np.interp(AR_c16, AR_f8, AR_f8)  # E: incompatible type
+np.interp(AR_f8, AR_f8, AR_f8, period=AR_c16)  # E: No overload variant
+np.interp(AR_f8, AR_f8, AR_O)  # E: incompatible type
+
+np.cov(AR_m)  # E: incompatible type
+np.cov(AR_O)  # E: incompatible type
+np.corrcoef(AR_m)  # E: incompatible type
+np.corrcoef(AR_O)  # E: incompatible type
+np.corrcoef(AR_f8, bias=True)  # E: No overload variant
+np.corrcoef(AR_f8, ddof=2)  # E: No overload variant
+np.blackman(1j)  # E: incompatible type
+np.bartlett(1j)  # E: incompatible type
+np.hanning(1j)  # E: incompatible type
+np.hamming(1j)  # E: incompatible type
+np.hamming(AR_c16)  # E: incompatible type
+np.kaiser(1j, 1)  # E: incompatible type
+np.sinc(AR_O)  # E: incompatible type
+np.median(AR_M)  # E: incompatible type
+
+np.add_newdoc_ufunc(func, "docstring")  # E: incompatible type
+np.percentile(AR_f8, 50j)  # E: No overload variant
+np.percentile(AR_f8, 50, interpolation="bob")  # E: No overload variant
+np.quantile(AR_f8, 0.5j)  # E: No overload variant
+np.quantile(AR_f8, 0.5, interpolation="bob")  # E: No overload variant
+np.meshgrid(AR_f8, AR_f8, indexing="bob")  # E: incompatible type
+np.delete(AR_f8, AR_f8)  # E: incompatible type
+np.insert(AR_f8, AR_f8, 1.5)  # E: incompatible type
+np.digitize(AR_f8, 1j)  # E: No overload variant
diff --git a/numpy/typing/tests/data/fail/lib_polynomial.pyi b/numpy/typing/tests/data/fail/lib_polynomial.pyi
new file mode 100644 (file)
index 0000000..ca02d7b
--- /dev/null
@@ -0,0 +1,29 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_f8: npt.NDArray[np.float64]
+AR_c16: npt.NDArray[np.complex128]
+AR_O: npt.NDArray[np.object_]
+AR_U: npt.NDArray[np.str_]
+
+poly_obj: np.poly1d
+
+np.polyint(AR_U)  # E: incompatible type
+np.polyint(AR_f8, m=1j)  # E: No overload variant
+
+np.polyder(AR_U)  # E: incompatible type
+np.polyder(AR_f8, m=1j)  # E: No overload variant
+
+np.polyfit(AR_O, AR_f8, 1)  # E: incompatible type
+np.polyfit(AR_f8, AR_f8, 1, rcond=1j)  # E: No overload variant
+np.polyfit(AR_f8, AR_f8, 1, w=AR_c16)  # E: incompatible type
+np.polyfit(AR_f8, AR_f8, 1, cov="bob")  # E: No overload variant
+
+np.polyval(AR_f8, AR_U)  # E: incompatible type
+np.polyadd(AR_f8, AR_U)  # E: incompatible type
+np.polysub(AR_f8, AR_U)  # E: incompatible type
+np.polymul(AR_f8, AR_U)  # E: incompatible type
+np.polydiv(AR_f8, AR_U)  # E: incompatible type
+
+5**poly_obj  # E: No overload variant
+hash(poly_obj)
diff --git a/numpy/typing/tests/data/fail/lib_utils.py b/numpy/typing/tests/data/fail/lib_utils.py
deleted file mode 100644 (file)
index e16c926..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-import numpy as np
-
-np.deprecate(1)  # E: No overload variant
-
-np.deprecate_with_doc(1)  # E: incompatible type
-
-np.byte_bounds(1)  # E: incompatible type
-
-np.who(1)  # E: incompatible type
-
-np.lookfor(None)  # E: incompatible type
-
-np.safe_eval(None)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/lib_utils.pyi b/numpy/typing/tests/data/fail/lib_utils.pyi
new file mode 100644 (file)
index 0000000..e16c926
--- /dev/null
@@ -0,0 +1,13 @@
+import numpy as np
+
+np.deprecate(1)  # E: No overload variant
+
+np.deprecate_with_doc(1)  # E: incompatible type
+
+np.byte_bounds(1)  # E: incompatible type
+
+np.who(1)  # E: incompatible type
+
+np.lookfor(None)  # E: incompatible type
+
+np.safe_eval(None)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/lib_version.py b/numpy/typing/tests/data/fail/lib_version.py
deleted file mode 100644 (file)
index 2758cfe..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-from numpy.lib import NumpyVersion
-
-version: NumpyVersion
-
-NumpyVersion(b"1.8.0")  # E: incompatible type
-version >= b"1.8.0"  # E: Unsupported operand types
diff --git a/numpy/typing/tests/data/fail/lib_version.pyi b/numpy/typing/tests/data/fail/lib_version.pyi
new file mode 100644 (file)
index 0000000..2758cfe
--- /dev/null
@@ -0,0 +1,6 @@
+from numpy.lib import NumpyVersion
+
+version: NumpyVersion
+
+NumpyVersion(b"1.8.0")  # E: incompatible type
+version >= b"1.8.0"  # E: Unsupported operand types
diff --git a/numpy/typing/tests/data/fail/linalg.pyi b/numpy/typing/tests/data/fail/linalg.pyi
new file mode 100644 (file)
index 0000000..da93903
--- /dev/null
@@ -0,0 +1,48 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_f8: npt.NDArray[np.float64]
+AR_O: npt.NDArray[np.object_]
+AR_M: npt.NDArray[np.datetime64]
+
+np.linalg.tensorsolve(AR_O, AR_O)  # E: incompatible type
+
+np.linalg.solve(AR_O, AR_O)  # E: incompatible type
+
+np.linalg.tensorinv(AR_O)  # E: incompatible type
+
+np.linalg.inv(AR_O)  # E: incompatible type
+
+np.linalg.matrix_power(AR_M, 5)  # E: incompatible type
+
+np.linalg.cholesky(AR_O)  # E: incompatible type
+
+np.linalg.qr(AR_O)  # E: incompatible type
+np.linalg.qr(AR_f8, mode="bob")  # E: No overload variant
+
+np.linalg.eigvals(AR_O)  # E: incompatible type
+
+np.linalg.eigvalsh(AR_O)  # E: incompatible type
+np.linalg.eigvalsh(AR_O, UPLO="bob")  # E: No overload variant
+
+np.linalg.eig(AR_O)  # E: incompatible type
+
+np.linalg.eigh(AR_O)  # E: incompatible type
+np.linalg.eigh(AR_O, UPLO="bob")  # E: No overload variant
+
+np.linalg.svd(AR_O)  # E: incompatible type
+
+np.linalg.cond(AR_O)  # E: incompatible type
+np.linalg.cond(AR_f8, p="bob")  # E: incompatible type
+
+np.linalg.matrix_rank(AR_O)  # E: incompatible type
+
+np.linalg.pinv(AR_O)  # E: incompatible type
+
+np.linalg.slogdet(AR_O)  # E: incompatible type
+
+np.linalg.det(AR_O)  # E: incompatible type
+
+np.linalg.norm(AR_f8, ord="bob")  # E: No overload variant
+
+np.linalg.multi_dot([AR_M])  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/memmap.pyi b/numpy/typing/tests/data/fail/memmap.pyi
new file mode 100644 (file)
index 0000000..434870b
--- /dev/null
@@ -0,0 +1,5 @@
+import numpy as np
+
+with open("file.txt", "r") as f:
+    np.memmap(f)  # E: No overload variant
+np.memmap("test.txt", shape=[10, 5])  # E: No overload variant
diff --git a/numpy/typing/tests/data/fail/modules.py b/numpy/typing/tests/data/fail/modules.py
deleted file mode 100644 (file)
index 7b93093..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-import numpy as np
-
-np.testing.bob  # E: Module has no attribute
-np.bob  # E: Module has no attribute
-
-# Stdlib modules in the namespace by accident
-np.warnings  # E: Module has no attribute
-np.sys  # E: Module has no attribute
-np.os  # E: Module has no attribute
-np.math  # E: Module has no attribute
-
-# Public sub-modules that are not imported to their parent module by default;
-# e.g. one must first execute `import numpy.lib.recfunctions`
-np.lib.recfunctions  # E: Module has no attribute
-np.ma.mrecords  # E: Module has no attribute
-
-np.__NUMPY_SETUP__  # E: Module has no attribute
-np.__deprecated_attrs__  # E: Module has no attribute
-np.__expired_functions__  # E: Module has no attribute
diff --git a/numpy/typing/tests/data/fail/modules.pyi b/numpy/typing/tests/data/fail/modules.pyi
new file mode 100644 (file)
index 0000000..59e724f
--- /dev/null
@@ -0,0 +1,18 @@
+import numpy as np
+
+np.testing.bob  # E: Module has no attribute
+np.bob  # E: Module has no attribute
+
+# Stdlib modules in the namespace by accident
+np.warnings  # E: Module has no attribute
+np.sys  # E: Module has no attribute
+np.os  # E: Module has no attribute
+np.math  # E: Module has no attribute
+
+# Public sub-modules that are not imported to their parent module by default;
+# e.g. one must first execute `import numpy.lib.recfunctions`
+np.lib.recfunctions  # E: Module has no attribute
+
+np.__NUMPY_SETUP__  # E: Module has no attribute
+np.__deprecated_attrs__  # E: Module has no attribute
+np.__expired_functions__  # E: Module has no attribute
diff --git a/numpy/typing/tests/data/fail/multiarray.pyi b/numpy/typing/tests/data/fail/multiarray.pyi
new file mode 100644 (file)
index 0000000..22bcf8c
--- /dev/null
@@ -0,0 +1,56 @@
+from typing import List
+import numpy as np
+import numpy.typing as npt
+
+i8: np.int64
+
+AR_b: npt.NDArray[np.bool_]
+AR_u1: npt.NDArray[np.uint8]
+AR_i8: npt.NDArray[np.int64]
+AR_f8: npt.NDArray[np.float64]
+AR_M: npt.NDArray[np.datetime64]
+
+M: np.datetime64
+
+AR_LIKE_f: List[float]
+
+def func(a: int) -> None: ...
+
+np.where(AR_b, 1)  # E: No overload variant
+
+np.can_cast(AR_f8, 1)  # E: incompatible type
+
+np.vdot(AR_M, AR_M)  # E: incompatible type
+
+np.copyto(AR_LIKE_f, AR_f8)  # E: incompatible type
+
+np.putmask(AR_LIKE_f, [True, True, False], 1.5)  # E: incompatible type
+
+np.packbits(AR_f8)  # E: incompatible type
+np.packbits(AR_u1, bitorder=">")  # E: incompatible type
+
+np.unpackbits(AR_i8)  # E: incompatible type
+np.unpackbits(AR_u1, bitorder=">")  # E: incompatible type
+
+np.shares_memory(1, 1, max_work=i8)  # E: incompatible type
+np.may_share_memory(1, 1, max_work=i8)  # E: incompatible type
+
+np.arange(M)  # E: No overload variant
+np.arange(stop=10)  # E: No overload variant
+
+np.datetime_data(int)  # E: incompatible type
+
+np.busday_offset("2012", 10)  # E: incompatible type
+
+np.datetime_as_string("2012")  # E: No overload variant
+
+np.compare_chararrays("a", b"a", "==", False)  # E: No overload variant
+
+np.add_docstring(func, None)  # E: incompatible type
+
+np.nested_iters([AR_i8, AR_i8])  # E: Missing positional argument
+np.nested_iters([AR_i8, AR_i8], 0)  # E: incompatible type
+np.nested_iters([AR_i8, AR_i8], [0])  # E: incompatible type
+np.nested_iters([AR_i8, AR_i8], [[0], [1]], flags=["test"])  # E: incompatible type
+np.nested_iters([AR_i8, AR_i8], [[0], [1]], op_flags=[["test"]])  # E: incompatible type
+np.nested_iters([AR_i8, AR_i8], [[0], [1]], buffersize=1.0)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/ndarray.py b/numpy/typing/tests/data/fail/ndarray.py
deleted file mode 100644 (file)
index 5a5130d..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-import numpy as np
-
-# Ban setting dtype since mutating the type of the array in place
-# makes having ndarray be generic over dtype impossible. Generally
-# users should use `ndarray.view` in this situation anyway. See
-#
-# https://github.com/numpy/numpy-stubs/issues/7
-#
-# for more context.
-float_array = np.array([1.0])
-float_array.dtype = np.bool_  # E: Property "dtype" defined in "ndarray" is read-only
diff --git a/numpy/typing/tests/data/fail/ndarray.pyi b/numpy/typing/tests/data/fail/ndarray.pyi
new file mode 100644 (file)
index 0000000..5a5130d
--- /dev/null
@@ -0,0 +1,11 @@
+import numpy as np
+
+# Ban setting dtype since mutating the type of the array in place
+# makes having ndarray be generic over dtype impossible. Generally
+# users should use `ndarray.view` in this situation anyway. See
+#
+# https://github.com/numpy/numpy-stubs/issues/7
+#
+# for more context.
+float_array = np.array([1.0])
+float_array.dtype = np.bool_  # E: Property "dtype" defined in "ndarray" is read-only
diff --git a/numpy/typing/tests/data/fail/ndarray_misc.py b/numpy/typing/tests/data/fail/ndarray_misc.py
deleted file mode 100644 (file)
index cf3fedc..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-"""
-Tests for miscellaneous (non-magic) ``np.ndarray``/``np.generic`` methods.
-
-More extensive tests are performed for the methods'
-function-based counterpart in `../from_numeric.py`.
-
-"""
-
-from typing import Any
-import numpy as np
-
-f8: np.float64
-AR_f8: np.ndarray[Any, np.dtype[np.float64]]
-AR_M: np.ndarray[Any, np.dtype[np.datetime64]]
-AR_b: np.ndarray[Any, np.dtype[np.bool_]]
-
-ctypes_obj = AR_f8.ctypes
-
-reveal_type(ctypes_obj.get_data())  # E: has no attribute
-reveal_type(ctypes_obj.get_shape())  # E: has no attribute
-reveal_type(ctypes_obj.get_strides())  # E: has no attribute
-reveal_type(ctypes_obj.get_as_parameter())  # E: has no attribute
-
-f8.argpartition(0)  # E: has no attribute
-f8.diagonal()  # E: has no attribute
-f8.dot(1)  # E: has no attribute
-f8.nonzero()  # E: has no attribute
-f8.partition(0)  # E: has no attribute
-f8.put(0, 2)  # E: has no attribute
-f8.setfield(2, np.float64)  # E: has no attribute
-f8.sort()  # E: has no attribute
-f8.trace()  # E: has no attribute
-
-AR_M.__int__()  # E: Invalid self argument
-AR_M.__float__()  # E: Invalid self argument
-AR_M.__complex__()  # E: Invalid self argument
-AR_b.__index__()  # E: Invalid self argument
diff --git a/numpy/typing/tests/data/fail/ndarray_misc.pyi b/numpy/typing/tests/data/fail/ndarray_misc.pyi
new file mode 100644 (file)
index 0000000..8320a44
--- /dev/null
@@ -0,0 +1,41 @@
+"""
+Tests for miscellaneous (non-magic) ``np.ndarray``/``np.generic`` methods.
+
+More extensive tests are performed for the methods'
+function-based counterpart in `../from_numeric.py`.
+
+"""
+
+from typing import Any
+import numpy as np
+
+f8: np.float64
+AR_f8: np.ndarray[Any, np.dtype[np.float64]]
+AR_M: np.ndarray[Any, np.dtype[np.datetime64]]
+AR_b: np.ndarray[Any, np.dtype[np.bool_]]
+
+ctypes_obj = AR_f8.ctypes
+
+reveal_type(ctypes_obj.get_data())  # E: has no attribute
+reveal_type(ctypes_obj.get_shape())  # E: has no attribute
+reveal_type(ctypes_obj.get_strides())  # E: has no attribute
+reveal_type(ctypes_obj.get_as_parameter())  # E: has no attribute
+
+f8.argpartition(0)  # E: has no attribute
+f8.diagonal()  # E: has no attribute
+f8.dot(1)  # E: has no attribute
+f8.nonzero()  # E: has no attribute
+f8.partition(0)  # E: has no attribute
+f8.put(0, 2)  # E: has no attribute
+f8.setfield(2, np.float64)  # E: has no attribute
+f8.sort()  # E: has no attribute
+f8.trace()  # E: has no attribute
+
+AR_M.__int__()  # E: Invalid self argument
+AR_M.__float__()  # E: Invalid self argument
+AR_M.__complex__()  # E: Invalid self argument
+AR_b.__index__()  # E: Invalid self argument
+
+AR_f8[1.5]  # E: No overload variant
+AR_f8["field_a"]  # E: No overload variant
+AR_f8[["field_a", "field_b"]]  # E: Invalid index type
diff --git a/numpy/typing/tests/data/fail/nditer.pyi b/numpy/typing/tests/data/fail/nditer.pyi
new file mode 100644 (file)
index 0000000..1e8e37e
--- /dev/null
@@ -0,0 +1,8 @@
+import numpy as np
+
+class Test(np.nditer): ...  # E: Cannot inherit from final class
+
+np.nditer([0, 1], flags=["test"])  # E: incompatible type
+np.nditer([0, 1], op_flags=[["test"]])  # E: incompatible type
+np.nditer([0, 1], itershape=(1.0,))  # E: incompatible type
+np.nditer([0, 1], buffersize=1.0)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/nested_sequence.pyi b/numpy/typing/tests/data/fail/nested_sequence.pyi
new file mode 100644 (file)
index 0000000..e28661a
--- /dev/null
@@ -0,0 +1,17 @@
+from typing import Sequence, Tuple, List
+import numpy.typing as npt
+
+a: Sequence[float]
+b: List[complex]
+c: Tuple[str, ...]
+d: int
+e: str
+
+def func(a: npt._NestedSequence[int]) -> None:
+    ...
+
+reveal_type(func(a))  # E: incompatible type
+reveal_type(func(b))  # E: incompatible type
+reveal_type(func(c))  # E: incompatible type
+reveal_type(func(d))  # E: incompatible type
+reveal_type(func(e))  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/npyio.pyi b/numpy/typing/tests/data/fail/npyio.pyi
new file mode 100644 (file)
index 0000000..c91b4c9
--- /dev/null
@@ -0,0 +1,30 @@
+import pathlib
+from typing import IO
+
+import numpy.typing as npt
+import numpy as np
+
+str_path: str
+bytes_path: bytes
+pathlib_path: pathlib.Path
+str_file: IO[str]
+AR_i8: npt.NDArray[np.int64]
+
+np.load(str_file)  # E: incompatible type
+
+np.save(bytes_path, AR_i8)  # E: incompatible type
+np.save(str_file, AR_i8)  # E: incompatible type
+
+np.savez(bytes_path, AR_i8)  # E: incompatible type
+np.savez(str_file, AR_i8)  # E: incompatible type
+
+np.savez_compressed(bytes_path, AR_i8)  # E: incompatible type
+np.savez_compressed(str_file, AR_i8)  # E: incompatible type
+
+np.loadtxt(bytes_path)  # E: incompatible type
+
+np.fromregex(bytes_path, ".", np.int64)  # E: No overload variant
+
+np.recfromtxt(bytes_path)  # E: incompatible type
+
+np.recfromcsv(bytes_path)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/numerictypes.py b/numpy/typing/tests/data/fail/numerictypes.py
deleted file mode 100644 (file)
index 94537a2..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-import numpy as np
-
-# Techincally this works, but probably shouldn't. See
-#
-# https://github.com/numpy/numpy/issues/16366
-#
-np.maximum_sctype(1)  # E: incompatible type "int"
-
-np.issubsctype(1, np.int64)  # E: incompatible type "int"
-
-np.issubdtype(1, np.int64)  # E: incompatible type "int"
-
-np.find_common_type(np.int64, np.int64)  # E: incompatible type "Type[signedinteger[Any]]"
diff --git a/numpy/typing/tests/data/fail/numerictypes.pyi b/numpy/typing/tests/data/fail/numerictypes.pyi
new file mode 100644 (file)
index 0000000..a5c2814
--- /dev/null
@@ -0,0 +1,13 @@
+import numpy as np
+
+# Technically this works, but probably shouldn't. See
+#
+# https://github.com/numpy/numpy/issues/16366
+#
+np.maximum_sctype(1)  # E: No overload variant
+
+np.issubsctype(1, np.int64)  # E: incompatible type
+
+np.issubdtype(1, np.int64)  # E: incompatible type
+
+np.find_common_type(np.int64, np.int64)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/random.py b/numpy/typing/tests/data/fail/random.py
deleted file mode 100644 (file)
index c4d1e3e..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-import numpy as np
-from typing import Any, List
-
-SEED_FLOAT: float = 457.3
-SEED_ARR_FLOAT: np.ndarray[Any, np.dtype[np.float64]] = np.array([1.0, 2, 3, 4])
-SEED_ARRLIKE_FLOAT: List[float] = [1.0, 2.0, 3.0, 4.0]
-SEED_SEED_SEQ: np.random.SeedSequence = np.random.SeedSequence(0)
-SEED_STR: str = "String seeding not allowed"
-# default rng
-np.random.default_rng(SEED_FLOAT)  # E: incompatible type
-np.random.default_rng(SEED_ARR_FLOAT)  # E: incompatible type
-np.random.default_rng(SEED_ARRLIKE_FLOAT)  # E: incompatible type
-np.random.default_rng(SEED_STR)  # E: incompatible type
-
-# Seed Sequence
-np.random.SeedSequence(SEED_FLOAT)  # E: incompatible type
-np.random.SeedSequence(SEED_ARR_FLOAT)  # E: incompatible type
-np.random.SeedSequence(SEED_ARRLIKE_FLOAT)  # E: incompatible type
-np.random.SeedSequence(SEED_SEED_SEQ)  # E: incompatible type
-np.random.SeedSequence(SEED_STR)  # E: incompatible type
-
-seed_seq: np.random.bit_generator.SeedSequence = np.random.SeedSequence()
-seed_seq.spawn(11.5)  # E: incompatible type
-seed_seq.generate_state(3.14)  # E: incompatible type
-seed_seq.generate_state(3, np.uint8)  # E: incompatible type
-seed_seq.generate_state(3, "uint8")  # E: incompatible type
-seed_seq.generate_state(3, "u1")  # E: incompatible type
-seed_seq.generate_state(3, np.uint16)  # E: incompatible type
-seed_seq.generate_state(3, "uint16")  # E: incompatible type
-seed_seq.generate_state(3, "u2")  # E: incompatible type
-seed_seq.generate_state(3, np.int32)  # E: incompatible type
-seed_seq.generate_state(3, "int32")  # E: incompatible type
-seed_seq.generate_state(3, "i4")  # E: incompatible type
-
-# Bit Generators
-np.random.MT19937(SEED_FLOAT)  # E: incompatible type
-np.random.MT19937(SEED_ARR_FLOAT)  # E: incompatible type
-np.random.MT19937(SEED_ARRLIKE_FLOAT)  # E: incompatible type
-np.random.MT19937(SEED_STR)  # E: incompatible type
-
-np.random.PCG64(SEED_FLOAT)  # E: incompatible type
-np.random.PCG64(SEED_ARR_FLOAT)  # E: incompatible type
-np.random.PCG64(SEED_ARRLIKE_FLOAT)  # E: incompatible type
-np.random.PCG64(SEED_STR)  # E: incompatible type
-
-np.random.Philox(SEED_FLOAT)  # E: incompatible type
-np.random.Philox(SEED_ARR_FLOAT)  # E: incompatible type
-np.random.Philox(SEED_ARRLIKE_FLOAT)  # E: incompatible type
-np.random.Philox(SEED_STR)  # E: incompatible type
-
-np.random.SFC64(SEED_FLOAT)  # E: incompatible type
-np.random.SFC64(SEED_ARR_FLOAT)  # E: incompatible type
-np.random.SFC64(SEED_ARRLIKE_FLOAT)  # E: incompatible type
-np.random.SFC64(SEED_STR)  # E: incompatible type
-
-# Generator
-np.random.Generator(None)  # E: incompatible type
-np.random.Generator(12333283902830213)  # E: incompatible type
-np.random.Generator("OxFEEDF00D")  # E: incompatible type
-np.random.Generator([123, 234])  # E: incompatible type
-np.random.Generator(np.array([123, 234], dtype="u4"))  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/random.pyi b/numpy/typing/tests/data/fail/random.pyi
new file mode 100644 (file)
index 0000000..c4d1e3e
--- /dev/null
@@ -0,0 +1,61 @@
+import numpy as np
+from typing import Any, List
+
+SEED_FLOAT: float = 457.3
+SEED_ARR_FLOAT: np.ndarray[Any, np.dtype[np.float64]] = np.array([1.0, 2, 3, 4])
+SEED_ARRLIKE_FLOAT: List[float] = [1.0, 2.0, 3.0, 4.0]
+SEED_SEED_SEQ: np.random.SeedSequence = np.random.SeedSequence(0)
+SEED_STR: str = "String seeding not allowed"
+# default rng
+np.random.default_rng(SEED_FLOAT)  # E: incompatible type
+np.random.default_rng(SEED_ARR_FLOAT)  # E: incompatible type
+np.random.default_rng(SEED_ARRLIKE_FLOAT)  # E: incompatible type
+np.random.default_rng(SEED_STR)  # E: incompatible type
+
+# Seed Sequence
+np.random.SeedSequence(SEED_FLOAT)  # E: incompatible type
+np.random.SeedSequence(SEED_ARR_FLOAT)  # E: incompatible type
+np.random.SeedSequence(SEED_ARRLIKE_FLOAT)  # E: incompatible type
+np.random.SeedSequence(SEED_SEED_SEQ)  # E: incompatible type
+np.random.SeedSequence(SEED_STR)  # E: incompatible type
+
+seed_seq: np.random.bit_generator.SeedSequence = np.random.SeedSequence()
+seed_seq.spawn(11.5)  # E: incompatible type
+seed_seq.generate_state(3.14)  # E: incompatible type
+seed_seq.generate_state(3, np.uint8)  # E: incompatible type
+seed_seq.generate_state(3, "uint8")  # E: incompatible type
+seed_seq.generate_state(3, "u1")  # E: incompatible type
+seed_seq.generate_state(3, np.uint16)  # E: incompatible type
+seed_seq.generate_state(3, "uint16")  # E: incompatible type
+seed_seq.generate_state(3, "u2")  # E: incompatible type
+seed_seq.generate_state(3, np.int32)  # E: incompatible type
+seed_seq.generate_state(3, "int32")  # E: incompatible type
+seed_seq.generate_state(3, "i4")  # E: incompatible type
+
+# Bit Generators
+np.random.MT19937(SEED_FLOAT)  # E: incompatible type
+np.random.MT19937(SEED_ARR_FLOAT)  # E: incompatible type
+np.random.MT19937(SEED_ARRLIKE_FLOAT)  # E: incompatible type
+np.random.MT19937(SEED_STR)  # E: incompatible type
+
+np.random.PCG64(SEED_FLOAT)  # E: incompatible type
+np.random.PCG64(SEED_ARR_FLOAT)  # E: incompatible type
+np.random.PCG64(SEED_ARRLIKE_FLOAT)  # E: incompatible type
+np.random.PCG64(SEED_STR)  # E: incompatible type
+
+np.random.Philox(SEED_FLOAT)  # E: incompatible type
+np.random.Philox(SEED_ARR_FLOAT)  # E: incompatible type
+np.random.Philox(SEED_ARRLIKE_FLOAT)  # E: incompatible type
+np.random.Philox(SEED_STR)  # E: incompatible type
+
+np.random.SFC64(SEED_FLOAT)  # E: incompatible type
+np.random.SFC64(SEED_ARR_FLOAT)  # E: incompatible type
+np.random.SFC64(SEED_ARRLIKE_FLOAT)  # E: incompatible type
+np.random.SFC64(SEED_STR)  # E: incompatible type
+
+# Generator
+np.random.Generator(None)  # E: incompatible type
+np.random.Generator(12333283902830213)  # E: incompatible type
+np.random.Generator("OxFEEDF00D")  # E: incompatible type
+np.random.Generator([123, 234])  # E: incompatible type
+np.random.Generator(np.array([123, 234], dtype="u4"))  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/rec.pyi b/numpy/typing/tests/data/fail/rec.pyi
new file mode 100644 (file)
index 0000000..a57f1ba
--- /dev/null
@@ -0,0 +1,17 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_i8: npt.NDArray[np.int64]
+
+np.rec.fromarrays(1)  # E: No overload variant
+np.rec.fromarrays([1, 2, 3], dtype=[("f8", "f8")], formats=["f8", "f8"])  # E: No overload variant
+
+np.rec.fromrecords(AR_i8)  # E: incompatible type
+np.rec.fromrecords([(1.5,)], dtype=[("f8", "f8")], formats=["f8", "f8"])  # E: No overload variant
+
+np.rec.fromstring("string", dtype=[("f8", "f8")])  # E: No overload variant
+np.rec.fromstring(b"bytes")  # E: No overload variant
+np.rec.fromstring(b"(1.5,)", dtype=[("f8", "f8")], formats=["f8", "f8"])  # E: No overload variant
+
+with open("test", "r") as f:
+    np.rec.fromfile(f, dtype=[("f8", "f8")])  # E: No overload variant
diff --git a/numpy/typing/tests/data/fail/scalars.py b/numpy/typing/tests/data/fail/scalars.py
deleted file mode 100644 (file)
index 099418e..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-import sys
-import numpy as np
-
-f2: np.float16
-f8: np.float64
-c8: np.complex64
-
-# Construction
-
-np.float32(3j)  # E: incompatible type
-
-# Technically the following examples are valid NumPy code. But they
-# are not considered a best practice, and people who wish to use the
-# stubs should instead do
-#
-# np.array([1.0, 0.0, 0.0], dtype=np.float32)
-# np.array([], dtype=np.complex64)
-#
-# See e.g. the discussion on the mailing list
-#
-# https://mail.python.org/pipermail/numpy-discussion/2020-April/080566.html
-#
-# and the issue
-#
-# https://github.com/numpy/numpy-stubs/issues/41
-#
-# for more context.
-np.float32([1.0, 0.0, 0.0])  # E: incompatible type
-np.complex64([])  # E: incompatible type
-
-np.complex64(1, 2)  # E: Too many arguments
-# TODO: protocols (can't check for non-existent protocols w/ __getattr__)
-
-np.datetime64(0)  # E: non-matching overload
-
-class A:
-    def __float__(self):
-        return 1.0
-
-
-np.int8(A())  # E: incompatible type
-np.int16(A())  # E: incompatible type
-np.int32(A())  # E: incompatible type
-np.int64(A())  # E: incompatible type
-np.uint8(A())  # E: incompatible type
-np.uint16(A())  # E: incompatible type
-np.uint32(A())  # E: incompatible type
-np.uint64(A())  # E: incompatible type
-
-np.void("test")  # E: incompatible type
-
-np.generic(1)  # E: Cannot instantiate abstract class
-np.number(1)  # E: Cannot instantiate abstract class
-np.integer(1)  # E: Cannot instantiate abstract class
-np.inexact(1)  # E: Cannot instantiate abstract class
-np.character("test")  # E: Cannot instantiate abstract class
-np.flexible(b"test")  # E: Cannot instantiate abstract class
-
-np.float64(value=0.0)  # E: Unexpected keyword argument
-np.int64(value=0)  # E: Unexpected keyword argument
-np.uint64(value=0)  # E: Unexpected keyword argument
-np.complex128(value=0.0j)  # E: Unexpected keyword argument
-np.str_(value='bob')  # E: No overload variant
-np.bytes_(value=b'test')  # E: No overload variant
-np.void(value=b'test')  # E: Unexpected keyword argument
-np.bool_(value=True)  # E: Unexpected keyword argument
-np.datetime64(value="2019")  # E: No overload variant
-np.timedelta64(value=0)  # E: Unexpected keyword argument
-
-np.bytes_(b"hello", encoding='utf-8')  # E: No overload variant
-np.str_("hello", encoding='utf-8')  # E: No overload variant
-
-complex(np.bytes_("1"))  # E: No overload variant
-
-f8.item(1)  # E: incompatible type
-f8.item((0, 1))  # E: incompatible type
-f8.squeeze(axis=1)  # E: incompatible type
-f8.squeeze(axis=(0, 1))  # E: incompatible type
-f8.transpose(1)  # E: incompatible type
-
-def func(a: np.float32) -> None: ...
-
-func(f2)  # E: incompatible type
-func(f8)  # E: incompatible type
-
-round(c8)  # E: No overload variant
-
-c8.__getnewargs__()  # E: Invalid self argument
-f2.__getnewargs__()  # E: Invalid self argument
-f2.is_integer()  # E: Invalid self argument
-f2.hex()  # E: Invalid self argument
-np.float16.fromhex("0x0.0p+0")  # E: Invalid self argument
-f2.__trunc__()  # E: Invalid self argument
-f2.__getformat__("float")  # E: Invalid self argument
diff --git a/numpy/typing/tests/data/fail/scalars.pyi b/numpy/typing/tests/data/fail/scalars.pyi
new file mode 100644 (file)
index 0000000..9644705
--- /dev/null
@@ -0,0 +1,93 @@
+import sys
+import numpy as np
+
+f2: np.float16
+f8: np.float64
+c8: np.complex64
+
+# Construction
+
+np.float32(3j)  # E: incompatible type
+
+# Technically the following examples are valid NumPy code. But they
+# are not considered a best practice, and people who wish to use the
+# stubs should instead do
+#
+# np.array([1.0, 0.0, 0.0], dtype=np.float32)
+# np.array([], dtype=np.complex64)
+#
+# See e.g. the discussion on the mailing list
+#
+# https://mail.python.org/pipermail/numpy-discussion/2020-April/080566.html
+#
+# and the issue
+#
+# https://github.com/numpy/numpy-stubs/issues/41
+#
+# for more context.
+np.float32([1.0, 0.0, 0.0])  # E: incompatible type
+np.complex64([])  # E: incompatible type
+
+np.complex64(1, 2)  # E: Too many arguments
+# TODO: protocols (can't check for non-existent protocols w/ __getattr__)
+
+np.datetime64(0)  # E: No overload variant
+
+class A:
+    def __float__(self):
+        return 1.0
+
+
+np.int8(A())  # E: incompatible type
+np.int16(A())  # E: incompatible type
+np.int32(A())  # E: incompatible type
+np.int64(A())  # E: incompatible type
+np.uint8(A())  # E: incompatible type
+np.uint16(A())  # E: incompatible type
+np.uint32(A())  # E: incompatible type
+np.uint64(A())  # E: incompatible type
+
+np.void("test")  # E: incompatible type
+
+np.generic(1)  # E: Cannot instantiate abstract class
+np.number(1)  # E: Cannot instantiate abstract class
+np.integer(1)  # E: Cannot instantiate abstract class
+np.inexact(1)  # E: Cannot instantiate abstract class
+np.character("test")  # E: Cannot instantiate abstract class
+np.flexible(b"test")  # E: Cannot instantiate abstract class
+
+np.float64(value=0.0)  # E: Unexpected keyword argument
+np.int64(value=0)  # E: Unexpected keyword argument
+np.uint64(value=0)  # E: Unexpected keyword argument
+np.complex128(value=0.0j)  # E: Unexpected keyword argument
+np.str_(value='bob')  # E: No overload variant
+np.bytes_(value=b'test')  # E: No overload variant
+np.void(value=b'test')  # E: Unexpected keyword argument
+np.bool_(value=True)  # E: Unexpected keyword argument
+np.datetime64(value="2019")  # E: No overload variant
+np.timedelta64(value=0)  # E: Unexpected keyword argument
+
+np.bytes_(b"hello", encoding='utf-8')  # E: No overload variant
+np.str_("hello", encoding='utf-8')  # E: No overload variant
+
+complex(np.bytes_("1"))  # E: No overload variant
+
+f8.item(1)  # E: incompatible type
+f8.item((0, 1))  # E: incompatible type
+f8.squeeze(axis=1)  # E: incompatible type
+f8.squeeze(axis=(0, 1))  # E: incompatible type
+f8.transpose(1)  # E: incompatible type
+
+def func(a: np.float32) -> None: ...
+
+func(f2)  # E: incompatible type
+func(f8)  # E: incompatible type
+
+round(c8)  # E: No overload variant
+
+c8.__getnewargs__()  # E: Invalid self argument
+f2.__getnewargs__()  # E: Invalid self argument
+f2.hex()  # E: Invalid self argument
+np.float16.fromhex("0x0.0p+0")  # E: Invalid self argument
+f2.__trunc__()  # E: Invalid self argument
+f2.__getformat__("float")  # E: Invalid self argument
diff --git a/numpy/typing/tests/data/fail/shape_base.pyi b/numpy/typing/tests/data/fail/shape_base.pyi
new file mode 100644 (file)
index 0000000..e709741
--- /dev/null
@@ -0,0 +1,8 @@
+import numpy as np
+
+class DTypeLike:
+    dtype: np.dtype[np.int_]
+
+dtype_like: DTypeLike
+
+np.expand_dims(dtype_like, (5, 10))  # E: No overload variant
diff --git a/numpy/typing/tests/data/fail/stride_tricks.pyi b/numpy/typing/tests/data/fail/stride_tricks.pyi
new file mode 100644 (file)
index 0000000..f2bfba7
--- /dev/null
@@ -0,0 +1,9 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_f8: npt.NDArray[np.float64]
+
+np.lib.stride_tricks.as_strided(AR_f8, shape=8)  # E: No overload variant
+np.lib.stride_tricks.as_strided(AR_f8, strides=8)  # E: No overload variant
+
+np.lib.stride_tricks.sliding_window_view(AR_f8, axis=(1,))  # E: No overload variant
diff --git a/numpy/typing/tests/data/fail/testing.pyi b/numpy/typing/tests/data/fail/testing.pyi
new file mode 100644 (file)
index 0000000..e753a98
--- /dev/null
@@ -0,0 +1,26 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_U: npt.NDArray[np.str_]
+
+def func() -> bool: ...
+
+np.testing.assert_(True, msg=1)  # E: incompatible type
+np.testing.build_err_msg(1, "test")  # E: incompatible type
+np.testing.assert_almost_equal(AR_U, AR_U)  # E: incompatible type
+np.testing.assert_approx_equal([1, 2, 3], [1, 2, 3])  # E: incompatible type
+np.testing.assert_array_almost_equal(AR_U, AR_U)  # E: incompatible type
+np.testing.assert_array_less(AR_U, AR_U)  # E: incompatible type
+np.testing.assert_string_equal(b"a", b"a")  # E: incompatible type
+
+np.testing.assert_raises(expected_exception=TypeError, callable=func)  # E: No overload variant
+np.testing.assert_raises_regex(expected_exception=TypeError, expected_regex="T", callable=func)  # E: No overload variant
+
+np.testing.assert_allclose(AR_U, AR_U)  # E: incompatible type
+np.testing.assert_array_almost_equal_nulp(AR_U, AR_U)  # E: incompatible type
+np.testing.assert_array_max_ulp(AR_U, AR_U)  # E: incompatible type
+
+np.testing.assert_warns(warning_class=RuntimeWarning, func=func)  # E: No overload variant
+np.testing.assert_no_warnings(func=func)  # E: No overload variant
+
+np.testing.assert_no_gc_cycles(func=func)  # E: No overload variant
diff --git a/numpy/typing/tests/data/fail/twodim_base.pyi b/numpy/typing/tests/data/fail/twodim_base.pyi
new file mode 100644 (file)
index 0000000..ab34a37
--- /dev/null
@@ -0,0 +1,37 @@
+from typing import Any, List, TypeVar
+
+import numpy as np
+import numpy.typing as npt
+
+
+def func1(ar: npt.NDArray[Any], a: int) -> npt.NDArray[np.str_]:
+    pass
+
+
+def func2(ar: npt.NDArray[Any], a: float) -> float:
+    pass
+
+
+AR_b: npt.NDArray[np.bool_]
+AR_m: npt.NDArray[np.timedelta64]
+
+AR_LIKE_b: List[bool]
+
+np.eye(10, M=20.0)  # E: No overload variant
+np.eye(10, k=2.5, dtype=int)  # E: No overload variant
+
+np.diag(AR_b, k=0.5)  # E: No overload variant
+np.diagflat(AR_b, k=0.5)  # E: No overload variant
+
+np.tri(10, M=20.0)  # E: No overload variant
+np.tri(10, k=2.5, dtype=int)  # E: No overload variant
+
+np.tril(AR_b, k=0.5)  # E: No overload variant
+np.triu(AR_b, k=0.5)  # E: No overload variant
+
+np.vander(AR_m)  # E: incompatible type
+
+np.histogram2d(AR_m)  # E: No overload variant
+
+np.mask_indices(10, func1)  # E: incompatible type
+np.mask_indices(10, func2, 10.5)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/type_check.pyi b/numpy/typing/tests/data/fail/type_check.pyi
new file mode 100644 (file)
index 0000000..95f52bf
--- /dev/null
@@ -0,0 +1,13 @@
+import numpy as np
+import numpy.typing as npt
+
+DTYPE_i8: np.dtype[np.int64]
+
+np.mintypecode(DTYPE_i8)  # E: incompatible type
+np.iscomplexobj(DTYPE_i8)  # E: incompatible type
+np.isrealobj(DTYPE_i8)  # E: incompatible type
+
+np.typename(DTYPE_i8)  # E: No overload variant
+np.typename("invalid")  # E: No overload variant
+
+np.common_type(np.timedelta64())  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/ufunc_config.py b/numpy/typing/tests/data/fail/ufunc_config.py
deleted file mode 100644 (file)
index f547fbb..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-"""Typing tests for `numpy.core._ufunc_config`."""
-
-import numpy as np
-
-def func1(a: str, b: int, c: float) -> None: ...
-def func2(a: str, *, b: int) -> None: ...
-
-class Write1:
-    def write1(self, a: str) -> None: ...
-
-class Write2:
-    def write(self, a: str, b: str) -> None: ...
-
-class Write3:
-    def write(self, *, a: str) -> None: ...
-
-np.seterrcall(func1)  # E: Argument 1 to "seterrcall" has incompatible type
-np.seterrcall(func2)  # E: Argument 1 to "seterrcall" has incompatible type
-np.seterrcall(Write1())  # E: Argument 1 to "seterrcall" has incompatible type
-np.seterrcall(Write2())  # E: Argument 1 to "seterrcall" has incompatible type
-np.seterrcall(Write3())  # E: Argument 1 to "seterrcall" has incompatible type
diff --git a/numpy/typing/tests/data/fail/ufunc_config.pyi b/numpy/typing/tests/data/fail/ufunc_config.pyi
new file mode 100644 (file)
index 0000000..f547fbb
--- /dev/null
@@ -0,0 +1,21 @@
+"""Typing tests for `numpy.core._ufunc_config`."""
+
+import numpy as np
+
+def func1(a: str, b: int, c: float) -> None: ...
+def func2(a: str, *, b: int) -> None: ...
+
+class Write1:
+    def write1(self, a: str) -> None: ...
+
+class Write2:
+    def write(self, a: str, b: str) -> None: ...
+
+class Write3:
+    def write(self, *, a: str) -> None: ...
+
+np.seterrcall(func1)  # E: Argument 1 to "seterrcall" has incompatible type
+np.seterrcall(func2)  # E: Argument 1 to "seterrcall" has incompatible type
+np.seterrcall(Write1())  # E: Argument 1 to "seterrcall" has incompatible type
+np.seterrcall(Write2())  # E: Argument 1 to "seterrcall" has incompatible type
+np.seterrcall(Write3())  # E: Argument 1 to "seterrcall" has incompatible type
diff --git a/numpy/typing/tests/data/fail/ufunclike.py b/numpy/typing/tests/data/fail/ufunclike.py
deleted file mode 100644 (file)
index 82a5f3a..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-from typing import List, Any
-import numpy as np
-
-AR_c: np.ndarray[Any, np.dtype[np.complex128]]
-AR_m: np.ndarray[Any, np.dtype[np.timedelta64]]
-AR_M: np.ndarray[Any, np.dtype[np.datetime64]]
-AR_O: np.ndarray[Any, np.dtype[np.object_]]
-
-np.fix(AR_c)  # E: incompatible type
-np.fix(AR_m)  # E: incompatible type
-np.fix(AR_M)  # E: incompatible type
-
-np.isposinf(AR_c)  # E: incompatible type
-np.isposinf(AR_m)  # E: incompatible type
-np.isposinf(AR_M)  # E: incompatible type
-np.isposinf(AR_O)  # E: incompatible type
-
-np.isneginf(AR_c)  # E: incompatible type
-np.isneginf(AR_m)  # E: incompatible type
-np.isneginf(AR_M)  # E: incompatible type
-np.isneginf(AR_O)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/ufunclike.pyi b/numpy/typing/tests/data/fail/ufunclike.pyi
new file mode 100644 (file)
index 0000000..82a5f3a
--- /dev/null
@@ -0,0 +1,21 @@
+from typing import List, Any
+import numpy as np
+
+AR_c: np.ndarray[Any, np.dtype[np.complex128]]
+AR_m: np.ndarray[Any, np.dtype[np.timedelta64]]
+AR_M: np.ndarray[Any, np.dtype[np.datetime64]]
+AR_O: np.ndarray[Any, np.dtype[np.object_]]
+
+np.fix(AR_c)  # E: incompatible type
+np.fix(AR_m)  # E: incompatible type
+np.fix(AR_M)  # E: incompatible type
+
+np.isposinf(AR_c)  # E: incompatible type
+np.isposinf(AR_m)  # E: incompatible type
+np.isposinf(AR_M)  # E: incompatible type
+np.isposinf(AR_O)  # E: incompatible type
+
+np.isneginf(AR_c)  # E: incompatible type
+np.isneginf(AR_m)  # E: incompatible type
+np.isneginf(AR_M)  # E: incompatible type
+np.isneginf(AR_O)  # E: incompatible type
diff --git a/numpy/typing/tests/data/fail/ufuncs.py b/numpy/typing/tests/data/fail/ufuncs.py
deleted file mode 100644 (file)
index e827267..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-import numpy as np
-import numpy.typing as npt
-
-AR_f8: npt.NDArray[np.float64]
-
-np.sin.nin + "foo"  # E: Unsupported operand types
-np.sin(1, foo="bar")  # E: No overload variant
-
-np.abs(None)  # E: No overload variant
-
-np.add(1, 1, 1)  # E: No overload variant
-np.add(1, 1, axis=0)  # E: No overload variant
-
-np.matmul(AR_f8, AR_f8, where=True)  # E: No overload variant
-
-np.frexp(AR_f8, out=None)  # E: No overload variant
-np.frexp(AR_f8, out=AR_f8)  # E: No overload variant
-
-np.absolute.outer()  # E: "None" not callable
-np.frexp.outer()  # E: "None" not callable
-np.divmod.outer()  # E: "None" not callable
-np.matmul.outer()  # E: "None" not callable
-
-np.absolute.reduceat()  # E: "None" not callable
-np.frexp.reduceat()  # E: "None" not callable
-np.divmod.reduceat()  # E: "None" not callable
-np.matmul.reduceat()  # E: "None" not callable
-
-np.absolute.reduce()  # E: "None" not callable
-np.frexp.reduce()  # E: "None" not callable
-np.divmod.reduce()  # E: "None" not callable
-np.matmul.reduce()  # E: "None" not callable
-
-np.absolute.accumulate()  # E: "None" not callable
-np.frexp.accumulate()  # E: "None" not callable
-np.divmod.accumulate()  # E: "None" not callable
-np.matmul.accumulate()  # E: "None" not callable
-
-np.frexp.at()  # E: "None" not callable
-np.divmod.at()  # E: "None" not callable
-np.matmul.at()  # E: "None" not callable
diff --git a/numpy/typing/tests/data/fail/ufuncs.pyi b/numpy/typing/tests/data/fail/ufuncs.pyi
new file mode 100644 (file)
index 0000000..e827267
--- /dev/null
@@ -0,0 +1,41 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_f8: npt.NDArray[np.float64]
+
+np.sin.nin + "foo"  # E: Unsupported operand types
+np.sin(1, foo="bar")  # E: No overload variant
+
+np.abs(None)  # E: No overload variant
+
+np.add(1, 1, 1)  # E: No overload variant
+np.add(1, 1, axis=0)  # E: No overload variant
+
+np.matmul(AR_f8, AR_f8, where=True)  # E: No overload variant
+
+np.frexp(AR_f8, out=None)  # E: No overload variant
+np.frexp(AR_f8, out=AR_f8)  # E: No overload variant
+
+np.absolute.outer()  # E: "None" not callable
+np.frexp.outer()  # E: "None" not callable
+np.divmod.outer()  # E: "None" not callable
+np.matmul.outer()  # E: "None" not callable
+
+np.absolute.reduceat()  # E: "None" not callable
+np.frexp.reduceat()  # E: "None" not callable
+np.divmod.reduceat()  # E: "None" not callable
+np.matmul.reduceat()  # E: "None" not callable
+
+np.absolute.reduce()  # E: "None" not callable
+np.frexp.reduce()  # E: "None" not callable
+np.divmod.reduce()  # E: "None" not callable
+np.matmul.reduce()  # E: "None" not callable
+
+np.absolute.accumulate()  # E: "None" not callable
+np.frexp.accumulate()  # E: "None" not callable
+np.divmod.accumulate()  # E: "None" not callable
+np.matmul.accumulate()  # E: "None" not callable
+
+np.frexp.at()  # E: "None" not callable
+np.divmod.at()  # E: "None" not callable
+np.matmul.at()  # E: "None" not callable
diff --git a/numpy/typing/tests/data/fail/warnings_and_errors.py b/numpy/typing/tests/data/fail/warnings_and_errors.py
deleted file mode 100644 (file)
index 7390cc4..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-import numpy as np
-
-np.AxisError(1.0)  # E: Argument 1 to "AxisError" has incompatible type
-np.AxisError(1, ndim=2.0)  # E: Argument "ndim" to "AxisError" has incompatible type
-np.AxisError(
-    2, msg_prefix=404  # E: Argument "msg_prefix" to "AxisError" has incompatible type
-)
diff --git a/numpy/typing/tests/data/fail/warnings_and_errors.pyi b/numpy/typing/tests/data/fail/warnings_and_errors.pyi
new file mode 100644 (file)
index 0000000..f4fa382
--- /dev/null
@@ -0,0 +1,5 @@
+import numpy as np
+
+np.AxisError(1.0)  # E: No overload variant
+np.AxisError(1, ndim=2.0)  # E: No overload variant
+np.AxisError(2, msg_prefix=404)  # E: No overload variant
diff --git a/numpy/typing/tests/data/misc/extended_precision.py b/numpy/typing/tests/data/misc/extended_precision.py
deleted file mode 100644 (file)
index 1e495e4..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-import numpy as np
-
-reveal_type(np.uint128())
-reveal_type(np.uint256())
-
-reveal_type(np.int128())
-reveal_type(np.int256())
-
-reveal_type(np.float80())
-reveal_type(np.float96())
-reveal_type(np.float128())
-reveal_type(np.float256())
-
-reveal_type(np.complex160())
-reveal_type(np.complex192())
-reveal_type(np.complex256())
-reveal_type(np.complex512())
diff --git a/numpy/typing/tests/data/misc/extended_precision.pyi b/numpy/typing/tests/data/misc/extended_precision.pyi
new file mode 100644 (file)
index 0000000..1e495e4
--- /dev/null
@@ -0,0 +1,17 @@
+import numpy as np
+
+reveal_type(np.uint128())
+reveal_type(np.uint256())
+
+reveal_type(np.int128())
+reveal_type(np.int256())
+
+reveal_type(np.float80())
+reveal_type(np.float96())
+reveal_type(np.float128())
+reveal_type(np.float256())
+
+reveal_type(np.complex160())
+reveal_type(np.complex192())
+reveal_type(np.complex256())
+reveal_type(np.complex512())
index 62bd79004a114f7665131f7a2632a834ccd72a85..fe1612906e01a7fb7811b23eb93168ebd758f86f 100644 (file)
@@ -191,28 +191,24 @@ AR_b // AR_LIKE_b
 AR_b // AR_LIKE_u
 AR_b // AR_LIKE_i
 AR_b // AR_LIKE_f
-AR_b // AR_LIKE_c
 AR_b // AR_LIKE_O
 
 AR_LIKE_b // AR_b
 AR_LIKE_u // AR_b
 AR_LIKE_i // AR_b
 AR_LIKE_f // AR_b
-AR_LIKE_c // AR_b
 AR_LIKE_O // AR_b
 
 AR_u // AR_LIKE_b
 AR_u // AR_LIKE_u
 AR_u // AR_LIKE_i
 AR_u // AR_LIKE_f
-AR_u // AR_LIKE_c
 AR_u // AR_LIKE_O
 
 AR_LIKE_b // AR_u
 AR_LIKE_u // AR_u
 AR_LIKE_i // AR_u
 AR_LIKE_f // AR_u
-AR_LIKE_c // AR_u
 AR_LIKE_m // AR_u
 AR_LIKE_O // AR_u
 
@@ -220,14 +216,12 @@ AR_i // AR_LIKE_b
 AR_i // AR_LIKE_u
 AR_i // AR_LIKE_i
 AR_i // AR_LIKE_f
-AR_i // AR_LIKE_c
 AR_i // AR_LIKE_O
 
 AR_LIKE_b // AR_i
 AR_LIKE_u // AR_i
 AR_LIKE_i // AR_i
 AR_LIKE_f // AR_i
-AR_LIKE_c // AR_i
 AR_LIKE_m // AR_i
 AR_LIKE_O // AR_i
 
@@ -235,30 +229,15 @@ AR_f // AR_LIKE_b
 AR_f // AR_LIKE_u
 AR_f // AR_LIKE_i
 AR_f // AR_LIKE_f
-AR_f // AR_LIKE_c
 AR_f // AR_LIKE_O
 
 AR_LIKE_b // AR_f
 AR_LIKE_u // AR_f
 AR_LIKE_i // AR_f
 AR_LIKE_f // AR_f
-AR_LIKE_c // AR_f
 AR_LIKE_m // AR_f
 AR_LIKE_O // AR_f
 
-AR_c // AR_LIKE_b
-AR_c // AR_LIKE_u
-AR_c // AR_LIKE_i
-AR_c // AR_LIKE_f
-AR_c // AR_LIKE_c
-
-AR_LIKE_b // AR_c
-AR_LIKE_u // AR_c
-AR_LIKE_i // AR_c
-AR_LIKE_f // AR_c
-AR_LIKE_c // AR_c
-AR_LIKE_O // AR_c
-
 AR_m // AR_LIKE_u
 AR_m // AR_LIKE_i
 AR_m // AR_LIKE_f
@@ -270,7 +249,6 @@ AR_O // AR_LIKE_b
 AR_O // AR_LIKE_u
 AR_O // AR_LIKE_i
 AR_O // AR_LIKE_f
-AR_O // AR_LIKE_c
 AR_O // AR_LIKE_O
 
 AR_LIKE_b // AR_O
index 206f70a15bb1611016ba6d25dab19342807c8fbf..2763d9c9272ac6acb0143a16319750f540dd5989 100644 (file)
@@ -1,5 +1,5 @@
 import sys
-from typing import List, Any
+from typing import Any
 import numpy as np
 
 
index e16d196b60246a61cbb507377bb0fb11f30a6636..5bd2fda20e5cc55c0a93dcfc0ea6f7207b7ebad0 100644 (file)
@@ -1,4 +1,4 @@
-from typing import Any, List, Optional
+from typing import Any, Optional
 
 import numpy as np
 from numpy.typing import ArrayLike, _SupportsArray
index a2a39fb1c4c18d26e49e3b3237f5e159b26adc10..429764e67eccc7855d363da20d432fdb45e66971 100644 (file)
@@ -1,6 +1,6 @@
 from __future__ import annotations
 
-from typing import List, Any
+from typing import Any
 
 import numpy as np
 
index c602923d910400c835b82d81ca459e46c69155c9..65640c28873d3a40f7d6a829a902a6243d341e6a 100644 (file)
@@ -1,12 +1,11 @@
 from __future__ import annotations
 
 from io import StringIO
-from typing import Any
 
 import numpy as np
 
 FILE = StringIO()
-AR: np.ndarray[Any, np.dtype[np.float64]] = np.arange(10).astype(np.float64)
+AR = np.arange(10, dtype=np.float64)
 
 def func(a: int) -> bool: ...
 
index e2b5d16a04a284ceb0dc0208471056753024d4ef..26cedfd77566e7b7865345e0775af88153e74ffc 100644 (file)
@@ -1,37 +1,76 @@
-from __future__ import annotations
-
-from typing import Any
 import numpy as np
+import numpy.typing as npt
+
+AR_f8: npt.NDArray[np.float64] = np.array([1.0])
+AR_i4 = np.array([1], dtype=np.int32)
+AR_u1 = np.array([1], dtype=np.uint8)
 
-AR_f8: np.ndarray[Any, np.dtype[np.float64]] = np.array([1.0])
-AR_i8: np.ndarray[Any, np.dtype[np.int_]] = np.array([1])
+AR_LIKE_f = [1.5]
+AR_LIKE_i = [1]
 
 b_f8 = np.broadcast(AR_f8)
-b_i8_f8_f8 = np.broadcast(AR_i8, AR_f8, AR_f8)
+b_i4_f8_f8 = np.broadcast(AR_i4, AR_f8, AR_f8)
 
 next(b_f8)
-next(b_i8_f8_f8)
-
 b_f8.reset()
-b_i8_f8_f8.reset()
-
 b_f8.index
-b_i8_f8_f8.index
-
 b_f8.iters
-b_i8_f8_f8.iters
-
 b_f8.nd
-b_i8_f8_f8.nd
-
 b_f8.ndim
-b_i8_f8_f8.ndim
-
 b_f8.numiter
-b_i8_f8_f8.numiter
-
 b_f8.shape
-b_i8_f8_f8.shape
-
 b_f8.size
-b_i8_f8_f8.size
+
+next(b_i4_f8_f8)
+b_i4_f8_f8.reset()
+b_i4_f8_f8.ndim
+b_i4_f8_f8.index
+b_i4_f8_f8.iters
+b_i4_f8_f8.nd
+b_i4_f8_f8.numiter
+b_i4_f8_f8.shape
+b_i4_f8_f8.size
+
+np.inner(AR_f8, AR_i4)
+
+np.where([True, True, False])
+np.where([True, True, False], 1, 0)
+
+np.lexsort([0, 1, 2])
+
+np.can_cast(np.dtype("i8"), int)
+np.can_cast(AR_f8, "f8")
+np.can_cast(AR_f8, np.complex128, casting="unsafe")
+
+np.min_scalar_type([1])
+np.min_scalar_type(AR_f8)
+
+np.result_type(int, AR_i4)
+np.result_type(AR_f8, AR_u1)
+np.result_type(AR_f8, np.complex128)
+
+np.dot(AR_LIKE_f, AR_i4)
+np.dot(AR_u1, 1)
+np.dot(1.5j, 1)
+np.dot(AR_u1, 1, out=AR_f8)
+
+np.vdot(AR_LIKE_f, AR_i4)
+np.vdot(AR_u1, 1)
+np.vdot(1.5j, 1)
+
+np.bincount(AR_i4)
+
+np.copyto(AR_f8, [1.6])
+
+np.putmask(AR_f8, [True], 1.5)
+
+np.packbits(AR_i4)
+np.packbits(AR_u1)
+
+np.unpackbits(AR_u1)
+
+np.shares_memory(1, 2)
+np.shares_memory(AR_f8, AR_f8, max_work=1)
+
+np.may_share_memory(1, 2)
+np.may_share_memory(AR_f8, AR_f8, max_work=1)
index 243caf229f13fd86eec26556592a57f92e7cf73f..85965e0de707593239ba55b1a71502ad0852d353 100644 (file)
@@ -47,7 +47,7 @@ np.dtype(object_dtype)
 
 np.dtype((np.int32, (np.int8, 4)))
 
-# Dtype comparision
+# Dtype comparison
 np.dtype(float) == float
 np.dtype(float) != np.float64
 np.dtype(float) < None
index 5b6ec2626c0cfe1b39c86993d1af0f5daa9137ac..a556bf6bcb35b4b3451b49997bef4c8a10d9995b 100644 (file)
@@ -1,7 +1,6 @@
 import numpy as np
 
-np.AxisError(1)
+np.AxisError("test")
 np.AxisError(1, ndim=2)
-np.AxisError(1, ndim=None)
 np.AxisError(1, ndim=2, msg_prefix="error")
 np.AxisError(1, ndim=2, msg_prefix=None)
diff --git a/numpy/typing/tests/data/reveal/arithmetic.py b/numpy/typing/tests/data/reveal/arithmetic.py
deleted file mode 100644 (file)
index f5d1852..0000000
+++ /dev/null
@@ -1,546 +0,0 @@
-from typing import Any, List
-import numpy as np
-import numpy.typing as npt
-
-# Can't directly import `np.float128` as it is not available on all platforms
-f16: np.floating[npt._128Bit]
-
-c16 = np.complex128()
-f8 = np.float64()
-i8 = np.int64()
-u8 = np.uint64()
-
-c8 = np.complex64()
-f4 = np.float32()
-i4 = np.int32()
-u4 = np.uint32()
-
-dt = np.datetime64(0, "D")
-td = np.timedelta64(0, "D")
-
-b_ = np.bool_()
-
-b = bool()
-c = complex()
-f = float()
-i = int()
-
-AR_b: np.ndarray[Any, np.dtype[np.bool_]]
-AR_u: np.ndarray[Any, np.dtype[np.uint32]]
-AR_i: np.ndarray[Any, np.dtype[np.int64]]
-AR_f: np.ndarray[Any, np.dtype[np.float64]]
-AR_c: np.ndarray[Any, np.dtype[np.complex128]]
-AR_m: np.ndarray[Any, np.dtype[np.timedelta64]]
-AR_M: np.ndarray[Any, np.dtype[np.datetime64]]
-AR_O: np.ndarray[Any, np.dtype[np.object_]]
-
-AR_LIKE_b: List[bool]
-AR_LIKE_u: List[np.uint32]
-AR_LIKE_i: List[int]
-AR_LIKE_f: List[float]
-AR_LIKE_c: List[complex]
-AR_LIKE_m: List[np.timedelta64]
-AR_LIKE_M: List[np.datetime64]
-AR_LIKE_O: List[np.object_]
-
-# Array subtraction
-
-reveal_type(AR_b - AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[Any]]]
-reveal_type(AR_b - AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_b - AR_LIKE_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_b - AR_LIKE_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_b - AR_LIKE_m)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_b - AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_u - AR_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[Any]]]
-reveal_type(AR_LIKE_i - AR_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_LIKE_f - AR_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_c - AR_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_m - AR_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_LIKE_M - AR_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.datetime64]]
-reveal_type(AR_LIKE_O - AR_b)  # E: Any
-
-reveal_type(AR_u - AR_LIKE_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[Any]]]
-reveal_type(AR_u - AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[Any]]]
-reveal_type(AR_u - AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_u - AR_LIKE_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_u - AR_LIKE_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_u - AR_LIKE_m)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_u - AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_b - AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[Any]]]
-reveal_type(AR_LIKE_u - AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[Any]]]
-reveal_type(AR_LIKE_i - AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_LIKE_f - AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_c - AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_m - AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_LIKE_M - AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.datetime64]]
-reveal_type(AR_LIKE_O - AR_u)  # E: Any
-
-reveal_type(AR_i - AR_LIKE_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_i - AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_i - AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_i - AR_LIKE_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_i - AR_LIKE_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_i - AR_LIKE_m)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_i - AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_b - AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_LIKE_u - AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_LIKE_i - AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_LIKE_f - AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_c - AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_m - AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_LIKE_M - AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.datetime64]]
-reveal_type(AR_LIKE_O - AR_i)  # E: Any
-
-reveal_type(AR_f - AR_LIKE_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_f - AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_f - AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_f - AR_LIKE_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_f - AR_LIKE_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_f - AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_b - AR_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_u - AR_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_i - AR_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_f - AR_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_c - AR_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_O - AR_f)  # E: Any
-
-reveal_type(AR_c - AR_LIKE_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_c - AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_c - AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_c - AR_LIKE_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_c - AR_LIKE_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_c - AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_b - AR_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_u - AR_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_i - AR_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_f - AR_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_c - AR_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_O - AR_c)  # E: Any
-
-reveal_type(AR_m - AR_LIKE_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_m - AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_m - AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_m - AR_LIKE_m)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_m - AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_b - AR_m)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_LIKE_u - AR_m)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_LIKE_i - AR_m)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_LIKE_m - AR_m)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_LIKE_M - AR_m)  # E: numpy.ndarray[Any, numpy.dtype[numpy.datetime64]]
-reveal_type(AR_LIKE_O - AR_m)  # E: Any
-
-reveal_type(AR_M - AR_LIKE_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.datetime64]]
-reveal_type(AR_M - AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.datetime64]]
-reveal_type(AR_M - AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.datetime64]]
-reveal_type(AR_M - AR_LIKE_m)  # E: numpy.ndarray[Any, numpy.dtype[numpy.datetime64]]
-reveal_type(AR_M - AR_LIKE_M)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_M - AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_M - AR_M)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_LIKE_O - AR_M)  # E: Any
-
-reveal_type(AR_O - AR_LIKE_b)  # E: Any
-reveal_type(AR_O - AR_LIKE_u)  # E: Any
-reveal_type(AR_O - AR_LIKE_i)  # E: Any
-reveal_type(AR_O - AR_LIKE_f)  # E: Any
-reveal_type(AR_O - AR_LIKE_c)  # E: Any
-reveal_type(AR_O - AR_LIKE_m)  # E: Any
-reveal_type(AR_O - AR_LIKE_M)  # E: Any
-reveal_type(AR_O - AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_b - AR_O)  # E: Any
-reveal_type(AR_LIKE_u - AR_O)  # E: Any
-reveal_type(AR_LIKE_i - AR_O)  # E: Any
-reveal_type(AR_LIKE_f - AR_O)  # E: Any
-reveal_type(AR_LIKE_c - AR_O)  # E: Any
-reveal_type(AR_LIKE_m - AR_O)  # E: Any
-reveal_type(AR_LIKE_M - AR_O)  # E: Any
-reveal_type(AR_LIKE_O - AR_O)  # E: Any
-
-# Array floor division
-
-reveal_type(AR_b // AR_LIKE_b)  # E: numpy.ndarray[Any, numpy.dtype[{int8}]]
-reveal_type(AR_b // AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[Any]]]
-reveal_type(AR_b // AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_b // AR_LIKE_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_b // AR_LIKE_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_b // AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_b // AR_b)  # E: numpy.ndarray[Any, numpy.dtype[{int8}]]
-reveal_type(AR_LIKE_u // AR_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[Any]]]
-reveal_type(AR_LIKE_i // AR_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_LIKE_f // AR_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_c // AR_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_O // AR_b)  # E: Any
-
-reveal_type(AR_u // AR_LIKE_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[Any]]]
-reveal_type(AR_u // AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[Any]]]
-reveal_type(AR_u // AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_u // AR_LIKE_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_u // AR_LIKE_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_u // AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_b // AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[Any]]]
-reveal_type(AR_LIKE_u // AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[Any]]]
-reveal_type(AR_LIKE_i // AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_LIKE_f // AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_c // AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_m // AR_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_LIKE_O // AR_u)  # E: Any
-
-reveal_type(AR_i // AR_LIKE_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_i // AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_i // AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_i // AR_LIKE_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_i // AR_LIKE_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_i // AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_b // AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_LIKE_u // AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_LIKE_i // AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-reveal_type(AR_LIKE_f // AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_c // AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_m // AR_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_LIKE_O // AR_i)  # E: Any
-
-reveal_type(AR_f // AR_LIKE_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_f // AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_f // AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_f // AR_LIKE_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_f // AR_LIKE_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_f // AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_b // AR_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_u // AR_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_i // AR_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_f // AR_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(AR_LIKE_c // AR_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_m // AR_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_LIKE_O // AR_f)  # E: Any
-
-reveal_type(AR_c // AR_LIKE_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_c // AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_c // AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_c // AR_LIKE_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_c // AR_LIKE_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_c // AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_b // AR_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_u // AR_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_i // AR_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_f // AR_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_c // AR_c)  # E: numpy.ndarray[Any, numpy.dtype[numpy.complexfloating[Any, Any]]]
-reveal_type(AR_LIKE_O // AR_c)  # E: Any
-
-reveal_type(AR_m // AR_LIKE_u)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_m // AR_LIKE_i)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_m // AR_LIKE_f)  # E: numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]
-reveal_type(AR_m // AR_LIKE_m)  # E: numpy.ndarray[Any, numpy.dtype[{int64}]]
-reveal_type(AR_m // AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_m // AR_m)  # E: numpy.ndarray[Any, numpy.dtype[{int64}]]
-reveal_type(AR_LIKE_O // AR_m)  # E: Any
-
-reveal_type(AR_O // AR_LIKE_b)  # E: Any
-reveal_type(AR_O // AR_LIKE_u)  # E: Any
-reveal_type(AR_O // AR_LIKE_i)  # E: Any
-reveal_type(AR_O // AR_LIKE_f)  # E: Any
-reveal_type(AR_O // AR_LIKE_c)  # E: Any
-reveal_type(AR_O // AR_LIKE_m)  # E: Any
-reveal_type(AR_O // AR_LIKE_M)  # E: Any
-reveal_type(AR_O // AR_LIKE_O)  # E: Any
-
-reveal_type(AR_LIKE_b // AR_O)  # E: Any
-reveal_type(AR_LIKE_u // AR_O)  # E: Any
-reveal_type(AR_LIKE_i // AR_O)  # E: Any
-reveal_type(AR_LIKE_f // AR_O)  # E: Any
-reveal_type(AR_LIKE_c // AR_O)  # E: Any
-reveal_type(AR_LIKE_m // AR_O)  # E: Any
-reveal_type(AR_LIKE_M // AR_O)  # E: Any
-reveal_type(AR_LIKE_O // AR_O)  # E: Any
-
-# unary ops
-
-reveal_type(-f16)  # E: {float128}
-reveal_type(-c16)  # E: {complex128}
-reveal_type(-c8)  # E: {complex64}
-reveal_type(-f8)  # E: {float64}
-reveal_type(-f4)  # E: {float32}
-reveal_type(-i8)  # E: {int64}
-reveal_type(-i4)  # E: {int32}
-reveal_type(-u8)  # E: {uint64}
-reveal_type(-u4)  # E: {uint32}
-reveal_type(-td)  # E: numpy.timedelta64
-reveal_type(-AR_f)  # E: Any
-
-reveal_type(+f16)  # E: {float128}
-reveal_type(+c16)  # E: {complex128}
-reveal_type(+c8)  # E: {complex64}
-reveal_type(+f8)  # E: {float64}
-reveal_type(+f4)  # E: {float32}
-reveal_type(+i8)  # E: {int64}
-reveal_type(+i4)  # E: {int32}
-reveal_type(+u8)  # E: {uint64}
-reveal_type(+u4)  # E: {uint32}
-reveal_type(+td)  # E: numpy.timedelta64
-reveal_type(+AR_f)  # E: Any
-
-reveal_type(abs(f16))  # E: {float128}
-reveal_type(abs(c16))  # E: {float64}
-reveal_type(abs(c8))  # E: {float32}
-reveal_type(abs(f8))  # E: {float64}
-reveal_type(abs(f4))  # E: {float32}
-reveal_type(abs(i8))  # E: {int64}
-reveal_type(abs(i4))  # E: {int32}
-reveal_type(abs(u8))  # E: {uint64}
-reveal_type(abs(u4))  # E: {uint32}
-reveal_type(abs(td))  # E: numpy.timedelta64
-reveal_type(abs(b_))  # E: numpy.bool_
-reveal_type(abs(AR_f))  # E: Any
-
-# Time structures
-
-reveal_type(dt + td)  # E: numpy.datetime64
-reveal_type(dt + i)  # E: numpy.datetime64
-reveal_type(dt + i4)  # E: numpy.datetime64
-reveal_type(dt + i8)  # E: numpy.datetime64
-reveal_type(dt - dt)  # E: numpy.timedelta64
-reveal_type(dt - i)  # E: numpy.datetime64
-reveal_type(dt - i4)  # E: numpy.datetime64
-reveal_type(dt - i8)  # E: numpy.datetime64
-
-reveal_type(td + td)  # E: numpy.timedelta64
-reveal_type(td + i)  # E: numpy.timedelta64
-reveal_type(td + i4)  # E: numpy.timedelta64
-reveal_type(td + i8)  # E: numpy.timedelta64
-reveal_type(td - td)  # E: numpy.timedelta64
-reveal_type(td - i)  # E: numpy.timedelta64
-reveal_type(td - i4)  # E: numpy.timedelta64
-reveal_type(td - i8)  # E: numpy.timedelta64
-reveal_type(td / f)  # E: numpy.timedelta64
-reveal_type(td / f4)  # E: numpy.timedelta64
-reveal_type(td / f8)  # E: numpy.timedelta64
-reveal_type(td / td)  # E: {float64}
-reveal_type(td // td)  # E: {int64}
-
-# boolean
-
-reveal_type(b_ / b)  # E: {float64}
-reveal_type(b_ / b_)  # E: {float64}
-reveal_type(b_ / i)  # E: {float64}
-reveal_type(b_ / i8)  # E: {float64}
-reveal_type(b_ / i4)  # E: {float64}
-reveal_type(b_ / u8)  # E: {float64}
-reveal_type(b_ / u4)  # E: {float64}
-reveal_type(b_ / f)  # E: {float64}
-reveal_type(b_ / f16)  # E: {float128}
-reveal_type(b_ / f8)  # E: {float64}
-reveal_type(b_ / f4)  # E: {float32}
-reveal_type(b_ / c)  # E: {complex128}
-reveal_type(b_ / c16)  # E: {complex128}
-reveal_type(b_ / c8)  # E: {complex64}
-
-reveal_type(b / b_)  # E: {float64}
-reveal_type(b_ / b_)  # E: {float64}
-reveal_type(i / b_)  # E: {float64}
-reveal_type(i8 / b_)  # E: {float64}
-reveal_type(i4 / b_)  # E: {float64}
-reveal_type(u8 / b_)  # E: {float64}
-reveal_type(u4 / b_)  # E: {float64}
-reveal_type(f / b_)  # E: {float64}
-reveal_type(f16 / b_)  # E: {float128}
-reveal_type(f8 / b_)  # E: {float64}
-reveal_type(f4 / b_)  # E: {float32}
-reveal_type(c / b_)  # E: {complex128}
-reveal_type(c16 / b_)  # E: {complex128}
-reveal_type(c8 / b_)  # E: {complex64}
-
-# Complex
-
-reveal_type(c16 + f16)  # E: {complex256}
-reveal_type(c16 + c16)  # E: {complex128}
-reveal_type(c16 + f8)  # E: {complex128}
-reveal_type(c16 + i8)  # E: {complex128}
-reveal_type(c16 + c8)  # E: {complex128}
-reveal_type(c16 + f4)  # E: {complex128}
-reveal_type(c16 + i4)  # E: {complex128}
-reveal_type(c16 + b_)  # E: {complex128}
-reveal_type(c16 + b)  # E: {complex128}
-reveal_type(c16 + c)  # E: {complex128}
-reveal_type(c16 + f)  # E: {complex128}
-reveal_type(c16 + i)  # E: {complex128}
-reveal_type(c16 + AR_f)  # E: Any
-
-reveal_type(f16 + c16)  # E: {complex256}
-reveal_type(c16 + c16)  # E: {complex128}
-reveal_type(f8 + c16)  # E: {complex128}
-reveal_type(i8 + c16)  # E: {complex128}
-reveal_type(c8 + c16)  # E: {complex128}
-reveal_type(f4 + c16)  # E: {complex128}
-reveal_type(i4 + c16)  # E: {complex128}
-reveal_type(b_ + c16)  # E: {complex128}
-reveal_type(b + c16)  # E: {complex128}
-reveal_type(c + c16)  # E: {complex128}
-reveal_type(f + c16)  # E: {complex128}
-reveal_type(i + c16)  # E: {complex128}
-reveal_type(AR_f + c16)  # E: Any
-
-reveal_type(c8 + f16)  # E: {complex256}
-reveal_type(c8 + c16)  # E: {complex128}
-reveal_type(c8 + f8)  # E: {complex128}
-reveal_type(c8 + i8)  # E: {complex128}
-reveal_type(c8 + c8)  # E: {complex64}
-reveal_type(c8 + f4)  # E: {complex64}
-reveal_type(c8 + i4)  # E: {complex64}
-reveal_type(c8 + b_)  # E: {complex64}
-reveal_type(c8 + b)  # E: {complex64}
-reveal_type(c8 + c)  # E: {complex128}
-reveal_type(c8 + f)  # E: {complex128}
-reveal_type(c8 + i)  # E: numpy.complexfloating[{_NBitInt}, {_NBitInt}]
-reveal_type(c8 + AR_f)  # E: Any
-
-reveal_type(f16 + c8)  # E: {complex256}
-reveal_type(c16 + c8)  # E: {complex128}
-reveal_type(f8 + c8)  # E: {complex128}
-reveal_type(i8 + c8)  # E: {complex128}
-reveal_type(c8 + c8)  # E: {complex64}
-reveal_type(f4 + c8)  # E: {complex64}
-reveal_type(i4 + c8)  # E: {complex64}
-reveal_type(b_ + c8)  # E: {complex64}
-reveal_type(b + c8)  # E: {complex64}
-reveal_type(c + c8)  # E: {complex128}
-reveal_type(f + c8)  # E: {complex128}
-reveal_type(i + c8)  # E: numpy.complexfloating[{_NBitInt}, {_NBitInt}]
-reveal_type(AR_f + c8)  # E: Any
-
-# Float
-
-reveal_type(f8 + f16)  # E: {float128}
-reveal_type(f8 + f8)  # E: {float64}
-reveal_type(f8 + i8)  # E: {float64}
-reveal_type(f8 + f4)  # E: {float64}
-reveal_type(f8 + i4)  # E: {float64}
-reveal_type(f8 + b_)  # E: {float64}
-reveal_type(f8 + b)  # E: {float64}
-reveal_type(f8 + c)  # E: {complex128}
-reveal_type(f8 + f)  # E: {float64}
-reveal_type(f8 + i)  # E: {float64}
-reveal_type(f8 + AR_f)  # E: Any
-
-reveal_type(f16 + f8)  # E: {float128}
-reveal_type(f8 + f8)  # E: {float64}
-reveal_type(i8 + f8)  # E: {float64}
-reveal_type(f4 + f8)  # E: {float64}
-reveal_type(i4 + f8)  # E: {float64}
-reveal_type(b_ + f8)  # E: {float64}
-reveal_type(b + f8)  # E: {float64}
-reveal_type(c + f8)  # E: {complex128}
-reveal_type(f + f8)  # E: {float64}
-reveal_type(i + f8)  # E: {float64}
-reveal_type(AR_f + f8)  # E: Any
-
-reveal_type(f4 + f16)  # E: {float128}
-reveal_type(f4 + f8)  # E: {float64}
-reveal_type(f4 + i8)  # E: {float64}
-reveal_type(f4 + f4)  # E: {float32}
-reveal_type(f4 + i4)  # E: {float32}
-reveal_type(f4 + b_)  # E: {float32}
-reveal_type(f4 + b)  # E: {float32}
-reveal_type(f4 + c)  # E: {complex128}
-reveal_type(f4 + f)  # E: {float64}
-reveal_type(f4 + i)  # E: numpy.floating[{_NBitInt}]
-reveal_type(f4 + AR_f)  # E: Any
-
-reveal_type(f16 + f4)  # E: {float128}
-reveal_type(f8 + f4)  # E: {float64}
-reveal_type(i8 + f4)  # E: {float64}
-reveal_type(f4 + f4)  # E: {float32}
-reveal_type(i4 + f4)  # E: {float32}
-reveal_type(b_ + f4)  # E: {float32}
-reveal_type(b + f4)  # E: {float32}
-reveal_type(c + f4)  # E: {complex128}
-reveal_type(f + f4)  # E: {float64}
-reveal_type(i + f4)  # E: numpy.floating[{_NBitInt}]
-reveal_type(AR_f + f4)  # E: Any
-
-# Int
-
-reveal_type(i8 + i8)  # E: {int64}
-reveal_type(i8 + u8)  # E: Any
-reveal_type(i8 + i4)  # E: {int64}
-reveal_type(i8 + u4)  # E: Any
-reveal_type(i8 + b_)  # E: {int64}
-reveal_type(i8 + b)  # E: {int64}
-reveal_type(i8 + c)  # E: {complex128}
-reveal_type(i8 + f)  # E: {float64}
-reveal_type(i8 + i)  # E: {int64}
-reveal_type(i8 + AR_f)  # E: Any
-
-reveal_type(u8 + u8)  # E: {uint64}
-reveal_type(u8 + i4)  # E: Any
-reveal_type(u8 + u4)  # E: {uint64}
-reveal_type(u8 + b_)  # E: {uint64}
-reveal_type(u8 + b)  # E: {uint64}
-reveal_type(u8 + c)  # E: {complex128}
-reveal_type(u8 + f)  # E: {float64}
-reveal_type(u8 + i)  # E: Any
-reveal_type(u8 + AR_f)  # E: Any
-
-reveal_type(i8 + i8)  # E: {int64}
-reveal_type(u8 + i8)  # E: Any
-reveal_type(i4 + i8)  # E: {int64}
-reveal_type(u4 + i8)  # E: Any
-reveal_type(b_ + i8)  # E: {int64}
-reveal_type(b + i8)  # E: {int64}
-reveal_type(c + i8)  # E: {complex128}
-reveal_type(f + i8)  # E: {float64}
-reveal_type(i + i8)  # E: {int64}
-reveal_type(AR_f + i8)  # E: Any
-
-reveal_type(u8 + u8)  # E: {uint64}
-reveal_type(i4 + u8)  # E: Any
-reveal_type(u4 + u8)  # E: {uint64}
-reveal_type(b_ + u8)  # E: {uint64}
-reveal_type(b + u8)  # E: {uint64}
-reveal_type(c + u8)  # E: {complex128}
-reveal_type(f + u8)  # E: {float64}
-reveal_type(i + u8)  # E: Any
-reveal_type(AR_f + u8)  # E: Any
-
-reveal_type(i4 + i8)  # E: {int64}
-reveal_type(i4 + i4)  # E: {int32}
-reveal_type(i4 + i)  # E: {int_}
-reveal_type(i4 + b_)  # E: {int32}
-reveal_type(i4 + b)  # E: {int32}
-reveal_type(i4 + AR_f)  # E: Any
-
-reveal_type(u4 + i8)  # E: Any
-reveal_type(u4 + i4)  # E: Any
-reveal_type(u4 + u8)  # E: {uint64}
-reveal_type(u4 + u4)  # E: {uint32}
-reveal_type(u4 + i)  # E: Any
-reveal_type(u4 + b_)  # E: {uint32}
-reveal_type(u4 + b)  # E: {uint32}
-reveal_type(u4 + AR_f)  # E: Any
-
-reveal_type(i8 + i4)  # E: {int64}
-reveal_type(i4 + i4)  # E: {int32}
-reveal_type(i + i4)  # E: {int_}
-reveal_type(b_ + i4)  # E: {int32}
-reveal_type(b + i4)  # E: {int32}
-reveal_type(AR_f + i4)  # E: Any
-
-reveal_type(i8 + u4)  # E: Any
-reveal_type(i4 + u4)  # E: Any
-reveal_type(u8 + u4)  # E: {uint64}
-reveal_type(u4 + u4)  # E: {uint32}
-reveal_type(b_ + u4)  # E: {uint32}
-reveal_type(b + u4)  # E: {uint32}
-reveal_type(i + u4)  # E: Any
-reveal_type(AR_f + u4)  # E: Any
diff --git a/numpy/typing/tests/data/reveal/arithmetic.pyi b/numpy/typing/tests/data/reveal/arithmetic.pyi
new file mode 100644 (file)
index 0000000..c5b4674
--- /dev/null
@@ -0,0 +1,522 @@
+from typing import Any, List
+import numpy as np
+import numpy.typing as npt
+
+# Can't directly import `np.float128` as it is not available on all platforms
+f16: np.floating[npt._128Bit]
+
+c16 = np.complex128()
+f8 = np.float64()
+i8 = np.int64()
+u8 = np.uint64()
+
+c8 = np.complex64()
+f4 = np.float32()
+i4 = np.int32()
+u4 = np.uint32()
+
+dt = np.datetime64(0, "D")
+td = np.timedelta64(0, "D")
+
+b_ = np.bool_()
+
+b = bool()
+c = complex()
+f = float()
+i = int()
+
+AR_b: np.ndarray[Any, np.dtype[np.bool_]]
+AR_u: np.ndarray[Any, np.dtype[np.uint32]]
+AR_i: np.ndarray[Any, np.dtype[np.int64]]
+AR_f: np.ndarray[Any, np.dtype[np.float64]]
+AR_c: np.ndarray[Any, np.dtype[np.complex128]]
+AR_m: np.ndarray[Any, np.dtype[np.timedelta64]]
+AR_M: np.ndarray[Any, np.dtype[np.datetime64]]
+AR_O: np.ndarray[Any, np.dtype[np.object_]]
+
+AR_LIKE_b: List[bool]
+AR_LIKE_u: List[np.uint32]
+AR_LIKE_i: List[int]
+AR_LIKE_f: List[float]
+AR_LIKE_c: List[complex]
+AR_LIKE_m: List[np.timedelta64]
+AR_LIKE_M: List[np.datetime64]
+AR_LIKE_O: List[np.object_]
+
+# Array subtraction
+
+reveal_type(AR_b - AR_LIKE_u)  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(AR_b - AR_LIKE_i)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_b - AR_LIKE_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_b - AR_LIKE_c)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_b - AR_LIKE_m)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_b - AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_u - AR_b)  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(AR_LIKE_i - AR_b)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_LIKE_f - AR_b)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_c - AR_b)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_LIKE_m - AR_b)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_LIKE_M - AR_b)  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(AR_LIKE_O - AR_b)  # E: Any
+
+reveal_type(AR_u - AR_LIKE_b)  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(AR_u - AR_LIKE_u)  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(AR_u - AR_LIKE_i)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_u - AR_LIKE_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_u - AR_LIKE_c)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_u - AR_LIKE_m)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_u - AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_b - AR_u)  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(AR_LIKE_u - AR_u)  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(AR_LIKE_i - AR_u)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_LIKE_f - AR_u)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_c - AR_u)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_LIKE_m - AR_u)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_LIKE_M - AR_u)  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(AR_LIKE_O - AR_u)  # E: Any
+
+reveal_type(AR_i - AR_LIKE_b)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_i - AR_LIKE_u)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_i - AR_LIKE_i)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_i - AR_LIKE_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_i - AR_LIKE_c)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_i - AR_LIKE_m)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_i - AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_b - AR_i)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_LIKE_u - AR_i)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_LIKE_i - AR_i)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_LIKE_f - AR_i)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_c - AR_i)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_LIKE_m - AR_i)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_LIKE_M - AR_i)  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(AR_LIKE_O - AR_i)  # E: Any
+
+reveal_type(AR_f - AR_LIKE_b)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_f - AR_LIKE_u)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_f - AR_LIKE_i)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_f - AR_LIKE_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_f - AR_LIKE_c)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_f - AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_b - AR_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_u - AR_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_i - AR_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_f - AR_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_c - AR_f)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_LIKE_O - AR_f)  # E: Any
+
+reveal_type(AR_c - AR_LIKE_b)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_c - AR_LIKE_u)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_c - AR_LIKE_i)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_c - AR_LIKE_f)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_c - AR_LIKE_c)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_c - AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_b - AR_c)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_LIKE_u - AR_c)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_LIKE_i - AR_c)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_LIKE_f - AR_c)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_LIKE_c - AR_c)  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(AR_LIKE_O - AR_c)  # E: Any
+
+reveal_type(AR_m - AR_LIKE_b)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_m - AR_LIKE_u)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_m - AR_LIKE_i)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_m - AR_LIKE_m)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_m - AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_b - AR_m)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_LIKE_u - AR_m)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_LIKE_i - AR_m)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_LIKE_m - AR_m)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_LIKE_M - AR_m)  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(AR_LIKE_O - AR_m)  # E: Any
+
+reveal_type(AR_M - AR_LIKE_b)  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(AR_M - AR_LIKE_u)  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(AR_M - AR_LIKE_i)  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(AR_M - AR_LIKE_m)  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(AR_M - AR_LIKE_M)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_M - AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_M - AR_M)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_LIKE_O - AR_M)  # E: Any
+
+reveal_type(AR_O - AR_LIKE_b)  # E: Any
+reveal_type(AR_O - AR_LIKE_u)  # E: Any
+reveal_type(AR_O - AR_LIKE_i)  # E: Any
+reveal_type(AR_O - AR_LIKE_f)  # E: Any
+reveal_type(AR_O - AR_LIKE_c)  # E: Any
+reveal_type(AR_O - AR_LIKE_m)  # E: Any
+reveal_type(AR_O - AR_LIKE_M)  # E: Any
+reveal_type(AR_O - AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_b - AR_O)  # E: Any
+reveal_type(AR_LIKE_u - AR_O)  # E: Any
+reveal_type(AR_LIKE_i - AR_O)  # E: Any
+reveal_type(AR_LIKE_f - AR_O)  # E: Any
+reveal_type(AR_LIKE_c - AR_O)  # E: Any
+reveal_type(AR_LIKE_m - AR_O)  # E: Any
+reveal_type(AR_LIKE_M - AR_O)  # E: Any
+reveal_type(AR_LIKE_O - AR_O)  # E: Any
+
+# Array floor division
+
+reveal_type(AR_b // AR_LIKE_b)  # E: ndarray[Any, dtype[{int8}]]
+reveal_type(AR_b // AR_LIKE_u)  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(AR_b // AR_LIKE_i)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_b // AR_LIKE_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_b // AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_b // AR_b)  # E: ndarray[Any, dtype[{int8}]]
+reveal_type(AR_LIKE_u // AR_b)  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(AR_LIKE_i // AR_b)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_LIKE_f // AR_b)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_O // AR_b)  # E: Any
+
+reveal_type(AR_u // AR_LIKE_b)  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(AR_u // AR_LIKE_u)  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(AR_u // AR_LIKE_i)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_u // AR_LIKE_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_u // AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_b // AR_u)  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(AR_LIKE_u // AR_u)  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(AR_LIKE_i // AR_u)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_LIKE_f // AR_u)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_m // AR_u)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_LIKE_O // AR_u)  # E: Any
+
+reveal_type(AR_i // AR_LIKE_b)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_i // AR_LIKE_u)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_i // AR_LIKE_i)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_i // AR_LIKE_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_i // AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_b // AR_i)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_LIKE_u // AR_i)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_LIKE_i // AR_i)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(AR_LIKE_f // AR_i)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_m // AR_i)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_LIKE_O // AR_i)  # E: Any
+
+reveal_type(AR_f // AR_LIKE_b)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_f // AR_LIKE_u)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_f // AR_LIKE_i)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_f // AR_LIKE_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_f // AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_b // AR_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_u // AR_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_i // AR_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_f // AR_f)  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(AR_LIKE_m // AR_f)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_LIKE_O // AR_f)  # E: Any
+
+reveal_type(AR_m // AR_LIKE_u)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_m // AR_LIKE_i)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_m // AR_LIKE_f)  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(AR_m // AR_LIKE_m)  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(AR_m // AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_m // AR_m)  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(AR_LIKE_O // AR_m)  # E: Any
+
+reveal_type(AR_O // AR_LIKE_b)  # E: Any
+reveal_type(AR_O // AR_LIKE_u)  # E: Any
+reveal_type(AR_O // AR_LIKE_i)  # E: Any
+reveal_type(AR_O // AR_LIKE_f)  # E: Any
+reveal_type(AR_O // AR_LIKE_m)  # E: Any
+reveal_type(AR_O // AR_LIKE_M)  # E: Any
+reveal_type(AR_O // AR_LIKE_O)  # E: Any
+
+reveal_type(AR_LIKE_b // AR_O)  # E: Any
+reveal_type(AR_LIKE_u // AR_O)  # E: Any
+reveal_type(AR_LIKE_i // AR_O)  # E: Any
+reveal_type(AR_LIKE_f // AR_O)  # E: Any
+reveal_type(AR_LIKE_m // AR_O)  # E: Any
+reveal_type(AR_LIKE_M // AR_O)  # E: Any
+reveal_type(AR_LIKE_O // AR_O)  # E: Any
+
+# unary ops
+
+reveal_type(-f16)  # E: {float128}
+reveal_type(-c16)  # E: {complex128}
+reveal_type(-c8)  # E: {complex64}
+reveal_type(-f8)  # E: {float64}
+reveal_type(-f4)  # E: {float32}
+reveal_type(-i8)  # E: {int64}
+reveal_type(-i4)  # E: {int32}
+reveal_type(-u8)  # E: {uint64}
+reveal_type(-u4)  # E: {uint32}
+reveal_type(-td)  # E: timedelta64
+reveal_type(-AR_f)  # E: Any
+
+reveal_type(+f16)  # E: {float128}
+reveal_type(+c16)  # E: {complex128}
+reveal_type(+c8)  # E: {complex64}
+reveal_type(+f8)  # E: {float64}
+reveal_type(+f4)  # E: {float32}
+reveal_type(+i8)  # E: {int64}
+reveal_type(+i4)  # E: {int32}
+reveal_type(+u8)  # E: {uint64}
+reveal_type(+u4)  # E: {uint32}
+reveal_type(+td)  # E: timedelta64
+reveal_type(+AR_f)  # E: Any
+
+reveal_type(abs(f16))  # E: {float128}
+reveal_type(abs(c16))  # E: {float64}
+reveal_type(abs(c8))  # E: {float32}
+reveal_type(abs(f8))  # E: {float64}
+reveal_type(abs(f4))  # E: {float32}
+reveal_type(abs(i8))  # E: {int64}
+reveal_type(abs(i4))  # E: {int32}
+reveal_type(abs(u8))  # E: {uint64}
+reveal_type(abs(u4))  # E: {uint32}
+reveal_type(abs(td))  # E: timedelta64
+reveal_type(abs(b_))  # E: bool_
+reveal_type(abs(AR_f))  # E: Any
+
+# Time structures
+
+reveal_type(dt + td)  # E: datetime64
+reveal_type(dt + i)  # E: datetime64
+reveal_type(dt + i4)  # E: datetime64
+reveal_type(dt + i8)  # E: datetime64
+reveal_type(dt - dt)  # E: timedelta64
+reveal_type(dt - i)  # E: datetime64
+reveal_type(dt - i4)  # E: datetime64
+reveal_type(dt - i8)  # E: datetime64
+
+reveal_type(td + td)  # E: timedelta64
+reveal_type(td + i)  # E: timedelta64
+reveal_type(td + i4)  # E: timedelta64
+reveal_type(td + i8)  # E: timedelta64
+reveal_type(td - td)  # E: timedelta64
+reveal_type(td - i)  # E: timedelta64
+reveal_type(td - i4)  # E: timedelta64
+reveal_type(td - i8)  # E: timedelta64
+reveal_type(td / f)  # E: timedelta64
+reveal_type(td / f4)  # E: timedelta64
+reveal_type(td / f8)  # E: timedelta64
+reveal_type(td / td)  # E: {float64}
+reveal_type(td // td)  # E: {int64}
+
+# boolean
+
+reveal_type(b_ / b)  # E: {float64}
+reveal_type(b_ / b_)  # E: {float64}
+reveal_type(b_ / i)  # E: {float64}
+reveal_type(b_ / i8)  # E: {float64}
+reveal_type(b_ / i4)  # E: {float64}
+reveal_type(b_ / u8)  # E: {float64}
+reveal_type(b_ / u4)  # E: {float64}
+reveal_type(b_ / f)  # E: {float64}
+reveal_type(b_ / f16)  # E: {float128}
+reveal_type(b_ / f8)  # E: {float64}
+reveal_type(b_ / f4)  # E: {float32}
+reveal_type(b_ / c)  # E: {complex128}
+reveal_type(b_ / c16)  # E: {complex128}
+reveal_type(b_ / c8)  # E: {complex64}
+
+reveal_type(b / b_)  # E: {float64}
+reveal_type(b_ / b_)  # E: {float64}
+reveal_type(i / b_)  # E: {float64}
+reveal_type(i8 / b_)  # E: {float64}
+reveal_type(i4 / b_)  # E: {float64}
+reveal_type(u8 / b_)  # E: {float64}
+reveal_type(u4 / b_)  # E: {float64}
+reveal_type(f / b_)  # E: {float64}
+reveal_type(f16 / b_)  # E: {float128}
+reveal_type(f8 / b_)  # E: {float64}
+reveal_type(f4 / b_)  # E: {float32}
+reveal_type(c / b_)  # E: {complex128}
+reveal_type(c16 / b_)  # E: {complex128}
+reveal_type(c8 / b_)  # E: {complex64}
+
+# Complex
+
+reveal_type(c16 + f16)  # E: {complex256}
+reveal_type(c16 + c16)  # E: {complex128}
+reveal_type(c16 + f8)  # E: {complex128}
+reveal_type(c16 + i8)  # E: {complex128}
+reveal_type(c16 + c8)  # E: {complex128}
+reveal_type(c16 + f4)  # E: {complex128}
+reveal_type(c16 + i4)  # E: {complex128}
+reveal_type(c16 + b_)  # E: {complex128}
+reveal_type(c16 + b)  # E: {complex128}
+reveal_type(c16 + c)  # E: {complex128}
+reveal_type(c16 + f)  # E: {complex128}
+reveal_type(c16 + i)  # E: {complex128}
+reveal_type(c16 + AR_f)  # E: Any
+
+reveal_type(f16 + c16)  # E: {complex256}
+reveal_type(c16 + c16)  # E: {complex128}
+reveal_type(f8 + c16)  # E: {complex128}
+reveal_type(i8 + c16)  # E: {complex128}
+reveal_type(c8 + c16)  # E: {complex128}
+reveal_type(f4 + c16)  # E: {complex128}
+reveal_type(i4 + c16)  # E: {complex128}
+reveal_type(b_ + c16)  # E: {complex128}
+reveal_type(b + c16)  # E: {complex128}
+reveal_type(c + c16)  # E: {complex128}
+reveal_type(f + c16)  # E: {complex128}
+reveal_type(i + c16)  # E: {complex128}
+reveal_type(AR_f + c16)  # E: Any
+
+reveal_type(c8 + f16)  # E: {complex256}
+reveal_type(c8 + c16)  # E: {complex128}
+reveal_type(c8 + f8)  # E: {complex128}
+reveal_type(c8 + i8)  # E: {complex128}
+reveal_type(c8 + c8)  # E: {complex64}
+reveal_type(c8 + f4)  # E: {complex64}
+reveal_type(c8 + i4)  # E: {complex64}
+reveal_type(c8 + b_)  # E: {complex64}
+reveal_type(c8 + b)  # E: {complex64}
+reveal_type(c8 + c)  # E: {complex128}
+reveal_type(c8 + f)  # E: {complex128}
+reveal_type(c8 + i)  # E: complexfloating[{_NBitInt}, {_NBitInt}]
+reveal_type(c8 + AR_f)  # E: Any
+
+reveal_type(f16 + c8)  # E: {complex256}
+reveal_type(c16 + c8)  # E: {complex128}
+reveal_type(f8 + c8)  # E: {complex128}
+reveal_type(i8 + c8)  # E: {complex128}
+reveal_type(c8 + c8)  # E: {complex64}
+reveal_type(f4 + c8)  # E: {complex64}
+reveal_type(i4 + c8)  # E: {complex64}
+reveal_type(b_ + c8)  # E: {complex64}
+reveal_type(b + c8)  # E: {complex64}
+reveal_type(c + c8)  # E: {complex128}
+reveal_type(f + c8)  # E: {complex128}
+reveal_type(i + c8)  # E: complexfloating[{_NBitInt}, {_NBitInt}]
+reveal_type(AR_f + c8)  # E: Any
+
+# Float
+
+reveal_type(f8 + f16)  # E: {float128}
+reveal_type(f8 + f8)  # E: {float64}
+reveal_type(f8 + i8)  # E: {float64}
+reveal_type(f8 + f4)  # E: {float64}
+reveal_type(f8 + i4)  # E: {float64}
+reveal_type(f8 + b_)  # E: {float64}
+reveal_type(f8 + b)  # E: {float64}
+reveal_type(f8 + c)  # E: {complex128}
+reveal_type(f8 + f)  # E: {float64}
+reveal_type(f8 + i)  # E: {float64}
+reveal_type(f8 + AR_f)  # E: Any
+
+reveal_type(f16 + f8)  # E: {float128}
+reveal_type(f8 + f8)  # E: {float64}
+reveal_type(i8 + f8)  # E: {float64}
+reveal_type(f4 + f8)  # E: {float64}
+reveal_type(i4 + f8)  # E: {float64}
+reveal_type(b_ + f8)  # E: {float64}
+reveal_type(b + f8)  # E: {float64}
+reveal_type(c + f8)  # E: {complex128}
+reveal_type(f + f8)  # E: {float64}
+reveal_type(i + f8)  # E: {float64}
+reveal_type(AR_f + f8)  # E: Any
+
+reveal_type(f4 + f16)  # E: {float128}
+reveal_type(f4 + f8)  # E: {float64}
+reveal_type(f4 + i8)  # E: {float64}
+reveal_type(f4 + f4)  # E: {float32}
+reveal_type(f4 + i4)  # E: {float32}
+reveal_type(f4 + b_)  # E: {float32}
+reveal_type(f4 + b)  # E: {float32}
+reveal_type(f4 + c)  # E: {complex128}
+reveal_type(f4 + f)  # E: {float64}
+reveal_type(f4 + i)  # E: floating[{_NBitInt}]
+reveal_type(f4 + AR_f)  # E: Any
+
+reveal_type(f16 + f4)  # E: {float128}
+reveal_type(f8 + f4)  # E: {float64}
+reveal_type(i8 + f4)  # E: {float64}
+reveal_type(f4 + f4)  # E: {float32}
+reveal_type(i4 + f4)  # E: {float32}
+reveal_type(b_ + f4)  # E: {float32}
+reveal_type(b + f4)  # E: {float32}
+reveal_type(c + f4)  # E: {complex128}
+reveal_type(f + f4)  # E: {float64}
+reveal_type(i + f4)  # E: floating[{_NBitInt}]
+reveal_type(AR_f + f4)  # E: Any
+
+# Int
+
+reveal_type(i8 + i8)  # E: {int64}
+reveal_type(i8 + u8)  # E: Any
+reveal_type(i8 + i4)  # E: {int64}
+reveal_type(i8 + u4)  # E: Any
+reveal_type(i8 + b_)  # E: {int64}
+reveal_type(i8 + b)  # E: {int64}
+reveal_type(i8 + c)  # E: {complex128}
+reveal_type(i8 + f)  # E: {float64}
+reveal_type(i8 + i)  # E: {int64}
+reveal_type(i8 + AR_f)  # E: Any
+
+reveal_type(u8 + u8)  # E: {uint64}
+reveal_type(u8 + i4)  # E: Any
+reveal_type(u8 + u4)  # E: {uint64}
+reveal_type(u8 + b_)  # E: {uint64}
+reveal_type(u8 + b)  # E: {uint64}
+reveal_type(u8 + c)  # E: {complex128}
+reveal_type(u8 + f)  # E: {float64}
+reveal_type(u8 + i)  # E: Any
+reveal_type(u8 + AR_f)  # E: Any
+
+reveal_type(i8 + i8)  # E: {int64}
+reveal_type(u8 + i8)  # E: Any
+reveal_type(i4 + i8)  # E: {int64}
+reveal_type(u4 + i8)  # E: Any
+reveal_type(b_ + i8)  # E: {int64}
+reveal_type(b + i8)  # E: {int64}
+reveal_type(c + i8)  # E: {complex128}
+reveal_type(f + i8)  # E: {float64}
+reveal_type(i + i8)  # E: {int64}
+reveal_type(AR_f + i8)  # E: Any
+
+reveal_type(u8 + u8)  # E: {uint64}
+reveal_type(i4 + u8)  # E: Any
+reveal_type(u4 + u8)  # E: {uint64}
+reveal_type(b_ + u8)  # E: {uint64}
+reveal_type(b + u8)  # E: {uint64}
+reveal_type(c + u8)  # E: {complex128}
+reveal_type(f + u8)  # E: {float64}
+reveal_type(i + u8)  # E: Any
+reveal_type(AR_f + u8)  # E: Any
+
+reveal_type(i4 + i8)  # E: {int64}
+reveal_type(i4 + i4)  # E: {int32}
+reveal_type(i4 + i)  # E: {int_}
+reveal_type(i4 + b_)  # E: {int32}
+reveal_type(i4 + b)  # E: {int32}
+reveal_type(i4 + AR_f)  # E: Any
+
+reveal_type(u4 + i8)  # E: Any
+reveal_type(u4 + i4)  # E: Any
+reveal_type(u4 + u8)  # E: {uint64}
+reveal_type(u4 + u4)  # E: {uint32}
+reveal_type(u4 + i)  # E: Any
+reveal_type(u4 + b_)  # E: {uint32}
+reveal_type(u4 + b)  # E: {uint32}
+reveal_type(u4 + AR_f)  # E: Any
+
+reveal_type(i8 + i4)  # E: {int64}
+reveal_type(i4 + i4)  # E: {int32}
+reveal_type(i + i4)  # E: {int_}
+reveal_type(b_ + i4)  # E: {int32}
+reveal_type(b + i4)  # E: {int32}
+reveal_type(AR_f + i4)  # E: Any
+
+reveal_type(i8 + u4)  # E: Any
+reveal_type(i4 + u4)  # E: Any
+reveal_type(u8 + u4)  # E: {uint64}
+reveal_type(u4 + u4)  # E: {uint32}
+reveal_type(b_ + u4)  # E: {uint32}
+reveal_type(b + u4)  # E: {uint32}
+reveal_type(i + u4)  # E: Any
+reveal_type(AR_f + u4)  # E: Any
diff --git a/numpy/typing/tests/data/reveal/array_constructors.py b/numpy/typing/tests/data/reveal/array_constructors.py
deleted file mode 100644 (file)
index 2e803a3..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-from typing import List, Any
-import numpy as np
-
-class SubClass(np.ndarray): ...
-
-i8: np.int64
-
-A: np.ndarray
-B: SubClass
-C: List[int]
-
-def func(i: int, j: int, **kwargs: Any) -> SubClass: ...
-
-reveal_type(np.asarray(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.asarray(B))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.asarray(C))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.asanyarray(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.asanyarray(B))  # E: SubClass
-reveal_type(np.asanyarray(B, dtype=int))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.asanyarray(C))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.ascontiguousarray(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.ascontiguousarray(B))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.ascontiguousarray(C))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.asfortranarray(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.asfortranarray(B))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.asfortranarray(C))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.require(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.require(B))  # E: SubClass
-reveal_type(np.require(B, requirements=None))  # E: SubClass
-reveal_type(np.require(B, dtype=int))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.require(B, requirements="E"))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.require(B, requirements=["ENSUREARRAY"]))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.require(B, requirements={"F", "E"}))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.require(B, requirements=["C", "OWNDATA"]))  # E: SubClass
-reveal_type(np.require(B, requirements="W"))  # E: SubClass
-reveal_type(np.require(B, requirements="A"))  # E: SubClass
-reveal_type(np.require(C))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.linspace(0, 10))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.linspace(0, 10, retstep=True))  # E: Tuple[numpy.ndarray[Any, Any], Any]
-reveal_type(np.logspace(0, 10))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.geomspace(1, 10))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.zeros_like(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.zeros_like(C))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.zeros_like(B))  # E: SubClass
-reveal_type(np.zeros_like(B, dtype=np.int64))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.ones_like(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.ones_like(C))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.ones_like(B))  # E: SubClass
-reveal_type(np.ones_like(B, dtype=np.int64))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.empty_like(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.empty_like(C))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.empty_like(B))  # E: SubClass
-reveal_type(np.empty_like(B, dtype=np.int64))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.full_like(A, i8))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.full_like(C, i8))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.full_like(B, i8))  # E: SubClass
-reveal_type(np.full_like(B, i8, dtype=np.int64))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.ones(1))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.ones([1, 1, 1]))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.full(1, i8))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.full([1, 1, 1], i8))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.indices([1, 2, 3]))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.indices([1, 2, 3], sparse=True))  # E: tuple[numpy.ndarray[Any, Any]]
-
-reveal_type(np.fromfunction(func, (3, 5)))  # E: SubClass
-
-reveal_type(np.identity(10))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.atleast_1d(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.atleast_1d(C))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.atleast_1d(A, A))  # E: list[numpy.ndarray[Any, Any]]
-reveal_type(np.atleast_1d(A, C))  # E: list[numpy.ndarray[Any, Any]]
-reveal_type(np.atleast_1d(C, C))  # E: list[numpy.ndarray[Any, Any]]
-
-reveal_type(np.atleast_2d(A))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.atleast_3d(A))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.vstack([A, A]))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.vstack([A, C]))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.vstack([C, C]))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.hstack([A, A]))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.stack([A, A]))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.stack([A, A], axis=0))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.stack([A, A], out=B))  # E: SubClass
-
-reveal_type(np.block([[A, A], [A, A]]))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.block(C))  # E: numpy.ndarray[Any, Any]
diff --git a/numpy/typing/tests/data/reveal/array_constructors.pyi b/numpy/typing/tests/data/reveal/array_constructors.pyi
new file mode 100644 (file)
index 0000000..dc0f107
--- /dev/null
@@ -0,0 +1,182 @@
+from typing import List, Any, TypeVar
+from pathlib import Path
+
+import numpy as np
+import numpy.typing as npt
+
+_SCT = TypeVar("_SCT", bound=np.generic, covariant=True)
+
+class SubClass(np.ndarray[Any, np.dtype[_SCT]]): ...
+
+i8: np.int64
+
+A: npt.NDArray[np.float64]
+B: SubClass[np.float64]
+C: List[int]
+
+def func(i: int, j: int, **kwargs: Any) -> SubClass[np.float64]: ...
+
+reveal_type(np.empty_like(A))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.empty_like(B))  # E: SubClass[{float64}]
+reveal_type(np.empty_like([1, 1.0]))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.empty_like(A, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.empty_like(A, dtype='c16'))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.array(A))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.array(B))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.array(B, subok=True))  # E: SubClass[{float64}]
+reveal_type(np.array([1, 1.0]))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.array(A, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.array(A, dtype='c16'))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.zeros([1, 5, 6]))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.zeros([1, 5, 6], dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.zeros([1, 5, 6], dtype='c16'))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.empty([1, 5, 6]))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.empty([1, 5, 6], dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.empty([1, 5, 6], dtype='c16'))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.concatenate(A))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.concatenate([1, 1.0]))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.concatenate(A, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.concatenate(A, dtype='c16'))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.concatenate([1, 1.0], out=A))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.asarray(A))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.asarray(B))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.asarray([1, 1.0]))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.asarray(A, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.asarray(A, dtype='c16'))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.asanyarray(A))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.asanyarray(B))  # E: SubClass[{float64}]
+reveal_type(np.asanyarray([1, 1.0]))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.asanyarray(A, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.asanyarray(A, dtype='c16'))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.ascontiguousarray(A))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.ascontiguousarray(B))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.ascontiguousarray([1, 1.0]))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.ascontiguousarray(A, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.ascontiguousarray(A, dtype='c16'))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.asfortranarray(A))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.asfortranarray(B))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.asfortranarray([1, 1.0]))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.asfortranarray(A, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.asfortranarray(A, dtype='c16'))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.fromstring("1 1 1", sep=" "))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.fromstring(b"1 1 1", sep=" "))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.fromstring("1 1 1", dtype=np.int64, sep=" "))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.fromstring(b"1 1 1", dtype=np.int64, sep=" "))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.fromstring("1 1 1", dtype="c16", sep=" "))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.fromstring(b"1 1 1", dtype="c16", sep=" "))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.fromfile("test.txt", sep=" "))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.fromfile("test.txt", dtype=np.int64, sep=" "))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.fromfile("test.txt", dtype="c16", sep=" "))  # E: ndarray[Any, dtype[Any]]
+with open("test.txt") as f:
+    reveal_type(np.fromfile(f, sep=" "))  # E: ndarray[Any, dtype[{float64}]]
+    reveal_type(np.fromfile(b"test.txt", sep=" "))  # E: ndarray[Any, dtype[{float64}]]
+    reveal_type(np.fromfile(Path("test.txt"), sep=" "))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.fromiter("12345", np.float64))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.fromiter("12345", float))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.frombuffer(A))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.frombuffer(A, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.frombuffer(A, dtype="c16"))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.arange(False, True))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.arange(10))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.arange(0, 10, step=2))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.arange(10.0))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.arange(start=0, stop=10.0))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.arange(np.timedelta64(0)))  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(np.arange(0, np.timedelta64(10)))  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(np.arange(np.datetime64("0"), np.datetime64("10")))  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(np.arange(10, dtype=np.float64))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.arange(0, 10, step=2, dtype=np.int16))  # E: ndarray[Any, dtype[{int16}]]
+reveal_type(np.arange(10, dtype=int))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.arange(0, 10, dtype="f8"))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.require(A))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.require(B))  # E: SubClass[{float64}]
+reveal_type(np.require(B, requirements=None))  # E: SubClass[{float64}]
+reveal_type(np.require(B, dtype=int))  # E: ndarray[Any, Any]
+reveal_type(np.require(B, requirements="E"))  # E: ndarray[Any, Any]
+reveal_type(np.require(B, requirements=["ENSUREARRAY"]))  # E: ndarray[Any, Any]
+reveal_type(np.require(B, requirements={"F", "E"}))  # E: ndarray[Any, Any]
+reveal_type(np.require(B, requirements=["C", "OWNDATA"]))  # E: SubClass[{float64}]
+reveal_type(np.require(B, requirements="W"))  # E: SubClass[{float64}]
+reveal_type(np.require(B, requirements="A"))  # E: SubClass[{float64}]
+reveal_type(np.require(C))  # E: ndarray[Any, Any]
+
+reveal_type(np.linspace(0, 10))  # E: ndarray[Any, Any]
+reveal_type(np.linspace(0, 10, retstep=True))  # E: Tuple[ndarray[Any, Any], Any]
+reveal_type(np.logspace(0, 10))  # E: ndarray[Any, Any]
+reveal_type(np.geomspace(1, 10))  # E: ndarray[Any, Any]
+
+reveal_type(np.zeros_like(A))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.zeros_like(C))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.zeros_like(A, dtype=float))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.zeros_like(B))  # E: SubClass[{float64}]
+reveal_type(np.zeros_like(B, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+
+reveal_type(np.ones_like(A))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.ones_like(C))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.ones_like(A, dtype=float))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.ones_like(B))  # E: SubClass[{float64}]
+reveal_type(np.ones_like(B, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+
+reveal_type(np.full_like(A, i8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.full_like(C, i8))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.full_like(A, i8, dtype=int))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.full_like(B, i8))  # E: SubClass[{float64}]
+reveal_type(np.full_like(B, i8, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+
+reveal_type(np.ones(1))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.ones([1, 1, 1]))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.ones(5, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.ones(5, dtype=int))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.full(1, i8))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.full([1, 1, 1], i8))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.full(1, i8, dtype=np.float64))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.full(1, i8, dtype=float))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.indices([1, 2, 3]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(np.indices([1, 2, 3], sparse=True))  # E: tuple[ndarray[Any, dtype[{int_}]]]
+
+reveal_type(np.fromfunction(func, (3, 5)))  # E: SubClass[{float64}]
+
+reveal_type(np.identity(10))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.identity(10, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.identity(10, dtype=int))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.atleast_1d(A))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.atleast_1d(C))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.atleast_1d(A, A))  # E: list[ndarray[Any, dtype[Any]]]
+reveal_type(np.atleast_1d(A, C))  # E: list[ndarray[Any, dtype[Any]]]
+reveal_type(np.atleast_1d(C, C))  # E: list[ndarray[Any, dtype[Any]]]
+
+reveal_type(np.atleast_2d(A))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.atleast_3d(A))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.vstack([A, A]))  # E: ndarray[Any, Any]
+reveal_type(np.vstack([A, C]))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.vstack([C, C]))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.hstack([A, A]))  # E: ndarray[Any, Any]
+
+reveal_type(np.stack([A, A]))  # E: Any
+reveal_type(np.stack([A, C]))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.stack([C, C]))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.stack([A, A], axis=0))  # E: Any
+reveal_type(np.stack([A, A], out=B))  # E: SubClass[{float64}]
+
+reveal_type(np.block([[A, A], [A, A]]))  # E: ndarray[Any, Any]
+reveal_type(np.block(C))  # E: ndarray[Any, dtype[Any]]
diff --git a/numpy/typing/tests/data/reveal/arraypad.pyi b/numpy/typing/tests/data/reveal/arraypad.pyi
new file mode 100644 (file)
index 0000000..995f82b
--- /dev/null
@@ -0,0 +1,21 @@
+from typing import List, Any, Mapping, Tuple, SupportsIndex
+
+import numpy as np
+import numpy.typing as npt
+
+def mode_func(
+    ar: npt.NDArray[np.number[Any]],
+    width: Tuple[int, int],
+    iaxis: SupportsIndex,
+    kwargs: Mapping[str, Any],
+) -> None: ...
+
+AR_i8: npt.NDArray[np.int64]
+AR_f8: npt.NDArray[np.float64]
+AR_LIKE: List[int]
+
+reveal_type(np.pad(AR_i8, (2, 3), "constant"))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.pad(AR_LIKE, (2, 3), "constant"))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.pad(AR_f8, (2, 3), mode_func))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.pad(AR_f8, (2, 3), mode_func, a=1, b=2))  # E: ndarray[Any, dtype[{float64}]]
diff --git a/numpy/typing/tests/data/reveal/arrayprint.py b/numpy/typing/tests/data/reveal/arrayprint.py
deleted file mode 100644 (file)
index e797097..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-from typing import Any, Callable
-import numpy as np
-
-AR: np.ndarray[Any, Any]
-func_float: Callable[[np.floating[Any]], str]
-func_int: Callable[[np.integer[Any]], str]
-
-reveal_type(np.get_printoptions())  # E: TypedDict
-reveal_type(np.array2string(  # E: str
-    AR, formatter={'float_kind': func_float, 'int_kind': func_int}
-))
-reveal_type(np.format_float_scientific(1.0))  # E: str
-reveal_type(np.format_float_positional(1))  # E: str
-reveal_type(np.array_repr(AR))  # E: str
-reveal_type(np.array_str(AR))  # E: str
-
-reveal_type(np.printoptions())  # E: contextlib._GeneratorContextManager
-with np.printoptions() as dct:
-    reveal_type(dct)  # E: TypedDict
diff --git a/numpy/typing/tests/data/reveal/arrayprint.pyi b/numpy/typing/tests/data/reveal/arrayprint.pyi
new file mode 100644 (file)
index 0000000..e797097
--- /dev/null
@@ -0,0 +1,19 @@
+from typing import Any, Callable
+import numpy as np
+
+AR: np.ndarray[Any, Any]
+func_float: Callable[[np.floating[Any]], str]
+func_int: Callable[[np.integer[Any]], str]
+
+reveal_type(np.get_printoptions())  # E: TypedDict
+reveal_type(np.array2string(  # E: str
+    AR, formatter={'float_kind': func_float, 'int_kind': func_int}
+))
+reveal_type(np.format_float_scientific(1.0))  # E: str
+reveal_type(np.format_float_positional(1))  # E: str
+reveal_type(np.array_repr(AR))  # E: str
+reveal_type(np.array_str(AR))  # E: str
+
+reveal_type(np.printoptions())  # E: contextlib._GeneratorContextManager
+with np.printoptions() as dct:
+    reveal_type(dct)  # E: TypedDict
diff --git a/numpy/typing/tests/data/reveal/arraysetops.pyi b/numpy/typing/tests/data/reveal/arraysetops.pyi
new file mode 100644 (file)
index 0000000..9deff8a
--- /dev/null
@@ -0,0 +1,60 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_b: npt.NDArray[np.bool_]
+AR_i8: npt.NDArray[np.int64]
+AR_f8: npt.NDArray[np.float64]
+AR_M: npt.NDArray[np.datetime64]
+AR_O: npt.NDArray[np.object_]
+
+AR_LIKE_f8: list[float]
+
+reveal_type(np.ediff1d(AR_b))  # E: ndarray[Any, dtype[{int8}]]
+reveal_type(np.ediff1d(AR_i8, to_end=[1, 2, 3]))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.ediff1d(AR_M))  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(np.ediff1d(AR_O))  # E: ndarray[Any, dtype[object_]]
+reveal_type(np.ediff1d(AR_LIKE_f8, to_begin=[1, 1.5]))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.intersect1d(AR_i8, AR_i8))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.intersect1d(AR_M, AR_M, assume_unique=True))  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(np.intersect1d(AR_f8, AR_i8))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.intersect1d(AR_f8, AR_f8, return_indices=True))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]]]
+
+reveal_type(np.setxor1d(AR_i8, AR_i8))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.setxor1d(AR_M, AR_M, assume_unique=True))  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(np.setxor1d(AR_f8, AR_i8))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.in1d(AR_i8, AR_i8))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.in1d(AR_M, AR_M, assume_unique=True))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.in1d(AR_f8, AR_i8))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.in1d(AR_f8, AR_LIKE_f8, invert=True))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.isin(AR_i8, AR_i8))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isin(AR_M, AR_M, assume_unique=True))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isin(AR_f8, AR_i8))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isin(AR_f8, AR_LIKE_f8, invert=True))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.union1d(AR_i8, AR_i8))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.union1d(AR_M, AR_M))  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(np.union1d(AR_f8, AR_i8))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.setdiff1d(AR_i8, AR_i8))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.setdiff1d(AR_M, AR_M, assume_unique=True))  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(np.setdiff1d(AR_f8, AR_i8))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.unique(AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.unique(AR_LIKE_f8, axis=0))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.unique(AR_f8, return_index=True))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_LIKE_f8, return_index=True))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_f8, return_inverse=True))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_LIKE_f8, return_inverse=True))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_f8, return_counts=True))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_LIKE_f8, return_counts=True))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_f8, return_index=True, return_inverse=True))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_LIKE_f8, return_index=True, return_inverse=True))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_f8, return_index=True, return_counts=True))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_LIKE_f8, return_index=True, return_counts=True))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_f8, return_inverse=True, return_counts=True))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_LIKE_f8, return_inverse=True, return_counts=True))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_f8, return_index=True, return_inverse=True, return_counts=True))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unique(AR_LIKE_f8, return_index=True, return_inverse=True, return_counts=True))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]]]
diff --git a/numpy/typing/tests/data/reveal/arrayterator.py b/numpy/typing/tests/data/reveal/arrayterator.py
deleted file mode 100644 (file)
index ea4e756..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-from typing import Any
-import numpy as np
-
-AR_i8: np.ndarray[Any, np.dtype[np.int64]]
-ar_iter = np.lib.Arrayterator(AR_i8)
-
-reveal_type(ar_iter.var)  # E: numpy.ndarray[Any, numpy.dtype[{int64}]]
-reveal_type(ar_iter.buf_size)  # E: Union[None, builtins.int]
-reveal_type(ar_iter.start)  # E: builtins.list[builtins.int]
-reveal_type(ar_iter.stop)  # E: builtins.list[builtins.int]
-reveal_type(ar_iter.step)  # E: builtins.list[builtins.int]
-reveal_type(ar_iter.shape)  # E: builtins.tuple[builtins.int]
-reveal_type(ar_iter.flat)  # E: typing.Generator[{int64}, None, None]
-
-reveal_type(ar_iter.__array__())  # E: numpy.ndarray[Any, numpy.dtype[{int64}]]
-
-for i in ar_iter:
-    reveal_type(i)  # E: numpy.ndarray[Any, numpy.dtype[{int64}]]
-
-reveal_type(ar_iter[0])  # E: numpy.lib.arrayterator.Arrayterator[Any, numpy.dtype[{int64}]]
-reveal_type(ar_iter[...])  # E: numpy.lib.arrayterator.Arrayterator[Any, numpy.dtype[{int64}]]
-reveal_type(ar_iter[:])  # E: numpy.lib.arrayterator.Arrayterator[Any, numpy.dtype[{int64}]]
-reveal_type(ar_iter[0, 0, 0])  # E: numpy.lib.arrayterator.Arrayterator[Any, numpy.dtype[{int64}]]
-reveal_type(ar_iter[..., 0, :])  # E: numpy.lib.arrayterator.Arrayterator[Any, numpy.dtype[{int64}]]
diff --git a/numpy/typing/tests/data/reveal/arrayterator.pyi b/numpy/typing/tests/data/reveal/arrayterator.pyi
new file mode 100644 (file)
index 0000000..2dab9d0
--- /dev/null
@@ -0,0 +1,24 @@
+from typing import Any
+import numpy as np
+
+AR_i8: np.ndarray[Any, np.dtype[np.int64]]
+ar_iter = np.lib.Arrayterator(AR_i8)
+
+reveal_type(ar_iter.var)  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(ar_iter.buf_size)  # E: Union[None, builtins.int]
+reveal_type(ar_iter.start)  # E: builtins.list[builtins.int]
+reveal_type(ar_iter.stop)  # E: builtins.list[builtins.int]
+reveal_type(ar_iter.step)  # E: builtins.list[builtins.int]
+reveal_type(ar_iter.shape)  # E: builtins.tuple[builtins.int]
+reveal_type(ar_iter.flat)  # E: typing.Generator[{int64}, None, None]
+
+reveal_type(ar_iter.__array__())  # E: ndarray[Any, dtype[{int64}]]
+
+for i in ar_iter:
+    reveal_type(i)  # E: ndarray[Any, dtype[{int64}]]
+
+reveal_type(ar_iter[0])  # E: lib.arrayterator.Arrayterator[Any, dtype[{int64}]]
+reveal_type(ar_iter[...])  # E: lib.arrayterator.Arrayterator[Any, dtype[{int64}]]
+reveal_type(ar_iter[:])  # E: lib.arrayterator.Arrayterator[Any, dtype[{int64}]]
+reveal_type(ar_iter[0, 0, 0])  # E: lib.arrayterator.Arrayterator[Any, dtype[{int64}]]
+reveal_type(ar_iter[..., 0, :])  # E: lib.arrayterator.Arrayterator[Any, dtype[{int64}]]
diff --git a/numpy/typing/tests/data/reveal/bitwise_ops.py b/numpy/typing/tests/data/reveal/bitwise_ops.py
deleted file mode 100644 (file)
index 6b99695..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-import numpy as np
-
-i8 = np.int64(1)
-u8 = np.uint64(1)
-
-i4 = np.int32(1)
-u4 = np.uint32(1)
-
-b_ = np.bool_(1)
-
-b = bool(1)
-i = int(1)
-
-AR = np.array([0, 1, 2], dtype=np.int32)
-AR.setflags(write=False)
-
-
-reveal_type(i8 << i8)  # E: {int64}
-reveal_type(i8 >> i8)  # E: {int64}
-reveal_type(i8 | i8)  # E: {int64}
-reveal_type(i8 ^ i8)  # E: {int64}
-reveal_type(i8 & i8)  # E: {int64}
-
-reveal_type(i8 << AR)  # E: Any
-reveal_type(i8 >> AR)  # E: Any
-reveal_type(i8 | AR)  # E: Any
-reveal_type(i8 ^ AR)  # E: Any
-reveal_type(i8 & AR)  # E: Any
-
-reveal_type(i4 << i4)  # E: {int32}
-reveal_type(i4 >> i4)  # E: {int32}
-reveal_type(i4 | i4)  # E: {int32}
-reveal_type(i4 ^ i4)  # E: {int32}
-reveal_type(i4 & i4)  # E: {int32}
-
-reveal_type(i8 << i4)  # E: {int64}
-reveal_type(i8 >> i4)  # E: {int64}
-reveal_type(i8 | i4)  # E: {int64}
-reveal_type(i8 ^ i4)  # E: {int64}
-reveal_type(i8 & i4)  # E: {int64}
-
-reveal_type(i8 << i)  # E: {int64}
-reveal_type(i8 >> i)  # E: {int64}
-reveal_type(i8 | i)  # E: {int64}
-reveal_type(i8 ^ i)  # E: {int64}
-reveal_type(i8 & i)  # E: {int64}
-
-reveal_type(i8 << b_)  # E: {int64}
-reveal_type(i8 >> b_)  # E: {int64}
-reveal_type(i8 | b_)  # E: {int64}
-reveal_type(i8 ^ b_)  # E: {int64}
-reveal_type(i8 & b_)  # E: {int64}
-
-reveal_type(i8 << b)  # E: {int64}
-reveal_type(i8 >> b)  # E: {int64}
-reveal_type(i8 | b)  # E: {int64}
-reveal_type(i8 ^ b)  # E: {int64}
-reveal_type(i8 & b)  # E: {int64}
-
-reveal_type(u8 << u8)  # E: {uint64}
-reveal_type(u8 >> u8)  # E: {uint64}
-reveal_type(u8 | u8)  # E: {uint64}
-reveal_type(u8 ^ u8)  # E: {uint64}
-reveal_type(u8 & u8)  # E: {uint64}
-
-reveal_type(u8 << AR)  # E: Any
-reveal_type(u8 >> AR)  # E: Any
-reveal_type(u8 | AR)  # E: Any
-reveal_type(u8 ^ AR)  # E: Any
-reveal_type(u8 & AR)  # E: Any
-
-reveal_type(u4 << u4)  # E: {uint32}
-reveal_type(u4 >> u4)  # E: {uint32}
-reveal_type(u4 | u4)  # E: {uint32}
-reveal_type(u4 ^ u4)  # E: {uint32}
-reveal_type(u4 & u4)  # E: {uint32}
-
-reveal_type(u4 << i4)  # E: numpy.signedinteger[Any]
-reveal_type(u4 >> i4)  # E: numpy.signedinteger[Any]
-reveal_type(u4 | i4)  # E: numpy.signedinteger[Any]
-reveal_type(u4 ^ i4)  # E: numpy.signedinteger[Any]
-reveal_type(u4 & i4)  # E: numpy.signedinteger[Any]
-
-reveal_type(u4 << i)  # E: numpy.signedinteger[Any]
-reveal_type(u4 >> i)  # E: numpy.signedinteger[Any]
-reveal_type(u4 | i)  # E: numpy.signedinteger[Any]
-reveal_type(u4 ^ i)  # E: numpy.signedinteger[Any]
-reveal_type(u4 & i)  # E: numpy.signedinteger[Any]
-
-reveal_type(u8 << b_)  # E: {uint64}
-reveal_type(u8 >> b_)  # E: {uint64}
-reveal_type(u8 | b_)  # E: {uint64}
-reveal_type(u8 ^ b_)  # E: {uint64}
-reveal_type(u8 & b_)  # E: {uint64}
-
-reveal_type(u8 << b)  # E: {uint64}
-reveal_type(u8 >> b)  # E: {uint64}
-reveal_type(u8 | b)  # E: {uint64}
-reveal_type(u8 ^ b)  # E: {uint64}
-reveal_type(u8 & b)  # E: {uint64}
-
-reveal_type(b_ << b_)  # E: {int8}
-reveal_type(b_ >> b_)  # E: {int8}
-reveal_type(b_ | b_)  # E: numpy.bool_
-reveal_type(b_ ^ b_)  # E: numpy.bool_
-reveal_type(b_ & b_)  # E: numpy.bool_
-
-reveal_type(b_ << AR)  # E: Any
-reveal_type(b_ >> AR)  # E: Any
-reveal_type(b_ | AR)  # E: Any
-reveal_type(b_ ^ AR)  # E: Any
-reveal_type(b_ & AR)  # E: Any
-
-reveal_type(b_ << b)  # E: {int8}
-reveal_type(b_ >> b)  # E: {int8}
-reveal_type(b_ | b)  # E: numpy.bool_
-reveal_type(b_ ^ b)  # E: numpy.bool_
-reveal_type(b_ & b)  # E: numpy.bool_
-
-reveal_type(b_ << i)  # E: {int_}
-reveal_type(b_ >> i)  # E: {int_}
-reveal_type(b_ | i)  # E: {int_}
-reveal_type(b_ ^ i)  # E: {int_}
-reveal_type(b_ & i)  # E: {int_}
-
-reveal_type(~i8)  # E: {int64}
-reveal_type(~i4)  # E: {int32}
-reveal_type(~u8)  # E: {uint64}
-reveal_type(~u4)  # E: {uint32}
-reveal_type(~b_)  # E: numpy.bool_
-reveal_type(~AR)  # E: Any
diff --git a/numpy/typing/tests/data/reveal/bitwise_ops.pyi b/numpy/typing/tests/data/reveal/bitwise_ops.pyi
new file mode 100644 (file)
index 0000000..f293ef6
--- /dev/null
@@ -0,0 +1,131 @@
+import numpy as np
+
+i8 = np.int64(1)
+u8 = np.uint64(1)
+
+i4 = np.int32(1)
+u4 = np.uint32(1)
+
+b_ = np.bool_(1)
+
+b = bool(1)
+i = int(1)
+
+AR = np.array([0, 1, 2], dtype=np.int32)
+AR.setflags(write=False)
+
+
+reveal_type(i8 << i8)  # E: {int64}
+reveal_type(i8 >> i8)  # E: {int64}
+reveal_type(i8 | i8)  # E: {int64}
+reveal_type(i8 ^ i8)  # E: {int64}
+reveal_type(i8 & i8)  # E: {int64}
+
+reveal_type(i8 << AR)  # E: Any
+reveal_type(i8 >> AR)  # E: Any
+reveal_type(i8 | AR)  # E: Any
+reveal_type(i8 ^ AR)  # E: Any
+reveal_type(i8 & AR)  # E: Any
+
+reveal_type(i4 << i4)  # E: {int32}
+reveal_type(i4 >> i4)  # E: {int32}
+reveal_type(i4 | i4)  # E: {int32}
+reveal_type(i4 ^ i4)  # E: {int32}
+reveal_type(i4 & i4)  # E: {int32}
+
+reveal_type(i8 << i4)  # E: {int64}
+reveal_type(i8 >> i4)  # E: {int64}
+reveal_type(i8 | i4)  # E: {int64}
+reveal_type(i8 ^ i4)  # E: {int64}
+reveal_type(i8 & i4)  # E: {int64}
+
+reveal_type(i8 << i)  # E: {int64}
+reveal_type(i8 >> i)  # E: {int64}
+reveal_type(i8 | i)  # E: {int64}
+reveal_type(i8 ^ i)  # E: {int64}
+reveal_type(i8 & i)  # E: {int64}
+
+reveal_type(i8 << b_)  # E: {int64}
+reveal_type(i8 >> b_)  # E: {int64}
+reveal_type(i8 | b_)  # E: {int64}
+reveal_type(i8 ^ b_)  # E: {int64}
+reveal_type(i8 & b_)  # E: {int64}
+
+reveal_type(i8 << b)  # E: {int64}
+reveal_type(i8 >> b)  # E: {int64}
+reveal_type(i8 | b)  # E: {int64}
+reveal_type(i8 ^ b)  # E: {int64}
+reveal_type(i8 & b)  # E: {int64}
+
+reveal_type(u8 << u8)  # E: {uint64}
+reveal_type(u8 >> u8)  # E: {uint64}
+reveal_type(u8 | u8)  # E: {uint64}
+reveal_type(u8 ^ u8)  # E: {uint64}
+reveal_type(u8 & u8)  # E: {uint64}
+
+reveal_type(u8 << AR)  # E: Any
+reveal_type(u8 >> AR)  # E: Any
+reveal_type(u8 | AR)  # E: Any
+reveal_type(u8 ^ AR)  # E: Any
+reveal_type(u8 & AR)  # E: Any
+
+reveal_type(u4 << u4)  # E: {uint32}
+reveal_type(u4 >> u4)  # E: {uint32}
+reveal_type(u4 | u4)  # E: {uint32}
+reveal_type(u4 ^ u4)  # E: {uint32}
+reveal_type(u4 & u4)  # E: {uint32}
+
+reveal_type(u4 << i4)  # E: signedinteger[Any]
+reveal_type(u4 >> i4)  # E: signedinteger[Any]
+reveal_type(u4 | i4)  # E: signedinteger[Any]
+reveal_type(u4 ^ i4)  # E: signedinteger[Any]
+reveal_type(u4 & i4)  # E: signedinteger[Any]
+
+reveal_type(u4 << i)  # E: signedinteger[Any]
+reveal_type(u4 >> i)  # E: signedinteger[Any]
+reveal_type(u4 | i)  # E: signedinteger[Any]
+reveal_type(u4 ^ i)  # E: signedinteger[Any]
+reveal_type(u4 & i)  # E: signedinteger[Any]
+
+reveal_type(u8 << b_)  # E: {uint64}
+reveal_type(u8 >> b_)  # E: {uint64}
+reveal_type(u8 | b_)  # E: {uint64}
+reveal_type(u8 ^ b_)  # E: {uint64}
+reveal_type(u8 & b_)  # E: {uint64}
+
+reveal_type(u8 << b)  # E: {uint64}
+reveal_type(u8 >> b)  # E: {uint64}
+reveal_type(u8 | b)  # E: {uint64}
+reveal_type(u8 ^ b)  # E: {uint64}
+reveal_type(u8 & b)  # E: {uint64}
+
+reveal_type(b_ << b_)  # E: {int8}
+reveal_type(b_ >> b_)  # E: {int8}
+reveal_type(b_ | b_)  # E: bool_
+reveal_type(b_ ^ b_)  # E: bool_
+reveal_type(b_ & b_)  # E: bool_
+
+reveal_type(b_ << AR)  # E: Any
+reveal_type(b_ >> AR)  # E: Any
+reveal_type(b_ | AR)  # E: Any
+reveal_type(b_ ^ AR)  # E: Any
+reveal_type(b_ & AR)  # E: Any
+
+reveal_type(b_ << b)  # E: {int8}
+reveal_type(b_ >> b)  # E: {int8}
+reveal_type(b_ | b)  # E: bool_
+reveal_type(b_ ^ b)  # E: bool_
+reveal_type(b_ & b)  # E: bool_
+
+reveal_type(b_ << i)  # E: {int_}
+reveal_type(b_ >> i)  # E: {int_}
+reveal_type(b_ | i)  # E: {int_}
+reveal_type(b_ ^ i)  # E: {int_}
+reveal_type(b_ & i)  # E: {int_}
+
+reveal_type(~i8)  # E: {int64}
+reveal_type(~i4)  # E: {int32}
+reveal_type(~u8)  # E: {uint64}
+reveal_type(~u4)  # E: {uint32}
+reveal_type(~b_)  # E: bool_
+reveal_type(~AR)  # E: Any
diff --git a/numpy/typing/tests/data/reveal/char.pyi b/numpy/typing/tests/data/reveal/char.pyi
new file mode 100644 (file)
index 0000000..ce8c1b2
--- /dev/null
@@ -0,0 +1,147 @@
+import numpy as np
+import numpy.typing as npt
+from typing import Sequence
+
+AR_U: npt.NDArray[np.str_]
+AR_S: npt.NDArray[np.bytes_]
+
+reveal_type(np.char.equal(AR_U, AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.equal(AR_S, AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.not_equal(AR_U, AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.not_equal(AR_S, AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.greater_equal(AR_U, AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.greater_equal(AR_S, AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.less_equal(AR_U, AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.less_equal(AR_S, AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.greater(AR_U, AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.greater(AR_S, AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.less(AR_U, AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.less(AR_S, AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.multiply(AR_U, 5))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.multiply(AR_S, [5, 4, 3]))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.mod(AR_U, "test"))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.mod(AR_S, "test"))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.capitalize(AR_U))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.capitalize(AR_S))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.center(AR_U, 5))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.center(AR_S, [2, 3, 4], b"a"))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.encode(AR_U))  # E: ndarray[Any, dtype[bytes_]]
+reveal_type(np.char.decode(AR_S))  # E: ndarray[Any, dtype[str_]]
+
+reveal_type(np.char.expandtabs(AR_U))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.expandtabs(AR_S, tabsize=4))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.join(AR_U, "_"))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.join(AR_S, [b"_", b""]))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.ljust(AR_U, 5))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.ljust(AR_S, [4, 3, 1], fillchar=[b"a", b"b", b"c"]))  # E: ndarray[Any, dtype[bytes_]]
+reveal_type(np.char.rjust(AR_U, 5))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.rjust(AR_S, [4, 3, 1], fillchar=[b"a", b"b", b"c"]))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.lstrip(AR_U))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.lstrip(AR_S, chars=b"_"))  # E: ndarray[Any, dtype[bytes_]]
+reveal_type(np.char.rstrip(AR_U))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.rstrip(AR_S, chars=b"_"))  # E: ndarray[Any, dtype[bytes_]]
+reveal_type(np.char.strip(AR_U))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.strip(AR_S, chars=b"_"))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.partition(AR_U, "\n"))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.partition(AR_S, [b"a", b"b", b"c"]))  # E: ndarray[Any, dtype[bytes_]]
+reveal_type(np.char.rpartition(AR_U, "\n"))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.rpartition(AR_S, [b"a", b"b", b"c"]))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.replace(AR_U, "_", "-"))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.replace(AR_S, [b"_", b""], [b"a", b"b"]))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.split(AR_U, "_"))  # E: ndarray[Any, dtype[object_]]
+reveal_type(np.char.split(AR_S, maxsplit=[1, 2, 3]))  # E: ndarray[Any, dtype[object_]]
+reveal_type(np.char.rsplit(AR_U, "_"))  # E: ndarray[Any, dtype[object_]]
+reveal_type(np.char.rsplit(AR_S, maxsplit=[1, 2, 3]))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.char.splitlines(AR_U))  # E: ndarray[Any, dtype[object_]]
+reveal_type(np.char.splitlines(AR_S, keepends=[True, True, False]))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.char.swapcase(AR_U))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.swapcase(AR_S))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.title(AR_U))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.title(AR_S))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.upper(AR_U))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.upper(AR_S))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.zfill(AR_U, 5))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.char.zfill(AR_S, [2, 3, 4]))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(np.char.count(AR_U, "a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(np.char.count(AR_S, [b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(np.char.endswith(AR_U, "a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.endswith(AR_S, [b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.startswith(AR_U, "a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.startswith(AR_S, [b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.find(AR_U, "a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(np.char.find(AR_S, [b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(np.char.rfind(AR_U, "a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(np.char.rfind(AR_S, [b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(np.char.index(AR_U, "a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(np.char.index(AR_S, [b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(np.char.rindex(AR_U, "a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(np.char.rindex(AR_S, [b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(np.char.isalpha(AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.isalpha(AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.isalnum(AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.isalnum(AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.isdecimal(AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.isdecimal(AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.isdigit(AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.isdigit(AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.islower(AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.islower(AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.isnumeric(AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.isnumeric(AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.isspace(AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.isspace(AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.istitle(AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.istitle(AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.isupper(AR_U))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.char.isupper(AR_S))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.char.str_len(AR_U))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(np.char.str_len(AR_S))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(np.char.array(AR_U))  # E: chararray[Any, dtype[str_]]
+reveal_type(np.char.array(AR_S, order="K"))  # E: chararray[Any, dtype[bytes_]]
+reveal_type(np.char.array("bob", copy=True))  # E: chararray[Any, dtype[str_]]
+reveal_type(np.char.array(b"bob", itemsize=5))  # E: chararray[Any, dtype[bytes_]]
+reveal_type(np.char.array(1, unicode=False))  # E: chararray[Any, dtype[bytes_]]
+reveal_type(np.char.array(1, unicode=True))  # E: chararray[Any, dtype[str_]]
+
+reveal_type(np.char.asarray(AR_U))  # E: chararray[Any, dtype[str_]]
+reveal_type(np.char.asarray(AR_S, order="K"))  # E: chararray[Any, dtype[bytes_]]
+reveal_type(np.char.asarray("bob"))  # E: chararray[Any, dtype[str_]]
+reveal_type(np.char.asarray(b"bob", itemsize=5))  # E: chararray[Any, dtype[bytes_]]
+reveal_type(np.char.asarray(1, unicode=False))  # E: chararray[Any, dtype[bytes_]]
+reveal_type(np.char.asarray(1, unicode=True))  # E: chararray[Any, dtype[str_]]
diff --git a/numpy/typing/tests/data/reveal/chararray.pyi b/numpy/typing/tests/data/reveal/chararray.pyi
new file mode 100644 (file)
index 0000000..3da2e15
--- /dev/null
@@ -0,0 +1,129 @@
+import numpy as np
+from typing import Any
+
+AR_U: np.chararray[Any, np.dtype[np.str_]]
+AR_S: np.chararray[Any, np.dtype[np.bytes_]]
+
+reveal_type(AR_U == AR_U)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S == AR_S)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U != AR_U)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S != AR_S)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U >= AR_U)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S >= AR_S)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U <= AR_U)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S <= AR_S)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U > AR_U)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S > AR_S)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U < AR_U)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S < AR_S)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U * 5)  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S * [5])  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U % "test")  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S % b"test")  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.capitalize())  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.capitalize())  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.center(5))  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.center([2, 3, 4], b"a"))  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.encode())  # E: chararray[Any, dtype[bytes_]]
+reveal_type(AR_S.decode())  # E: chararray[Any, dtype[str_]]
+
+reveal_type(AR_U.expandtabs())  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.expandtabs(tabsize=4))  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.join("_"))  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.join([b"_", b""]))  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.ljust(5))  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.ljust([4, 3, 1], fillchar=[b"a", b"b", b"c"]))  # E: chararray[Any, dtype[bytes_]]
+reveal_type(AR_U.rjust(5))  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.rjust([4, 3, 1], fillchar=[b"a", b"b", b"c"]))  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.lstrip())  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.lstrip(chars=b"_"))  # E: chararray[Any, dtype[bytes_]]
+reveal_type(AR_U.rstrip())  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.rstrip(chars=b"_"))  # E: chararray[Any, dtype[bytes_]]
+reveal_type(AR_U.strip())  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.strip(chars=b"_"))  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.partition("\n"))  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.partition([b"a", b"b", b"c"]))  # E: chararray[Any, dtype[bytes_]]
+reveal_type(AR_U.rpartition("\n"))  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.rpartition([b"a", b"b", b"c"]))  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.replace("_", "-"))  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.replace([b"_", b""], [b"a", b"b"]))  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.split("_"))  # E: ndarray[Any, dtype[object_]]
+reveal_type(AR_S.split(maxsplit=[1, 2, 3]))  # E: ndarray[Any, dtype[object_]]
+reveal_type(AR_U.rsplit("_"))  # E: ndarray[Any, dtype[object_]]
+reveal_type(AR_S.rsplit(maxsplit=[1, 2, 3]))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(AR_U.splitlines())  # E: ndarray[Any, dtype[object_]]
+reveal_type(AR_S.splitlines(keepends=[True, True, False]))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(AR_U.swapcase())  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.swapcase())  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.title())  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.title())  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.upper())  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.upper())  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.zfill(5))  # E: chararray[Any, dtype[str_]]
+reveal_type(AR_S.zfill([2, 3, 4]))  # E: chararray[Any, dtype[bytes_]]
+
+reveal_type(AR_U.count("a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(AR_S.count([b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(AR_U.endswith("a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S.endswith([b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_U.startswith("a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S.startswith([b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U.find("a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(AR_S.find([b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(AR_U.rfind("a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(AR_S.rfind([b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(AR_U.index("a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(AR_S.index([b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(AR_U.rindex("a", start=[1, 2, 3]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(AR_S.rindex([b"a", b"b", b"c"], end=9))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(AR_U.isalpha())  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S.isalpha())  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U.isalnum())  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S.isalnum())  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U.isdecimal())  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S.isdecimal())  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U.isdigit())  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S.isdigit())  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U.islower())  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S.islower())  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U.isnumeric())  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S.isnumeric())  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U.isspace())  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S.isspace())  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U.istitle())  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S.istitle())  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(AR_U.isupper())  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR_S.isupper())  # E: ndarray[Any, dtype[bool_]]
diff --git a/numpy/typing/tests/data/reveal/comparisons.py b/numpy/typing/tests/data/reveal/comparisons.py
deleted file mode 100644 (file)
index 16f21cc..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-import numpy as np
-
-c16 = np.complex128()
-f8 = np.float64()
-i8 = np.int64()
-u8 = np.uint64()
-
-c8 = np.complex64()
-f4 = np.float32()
-i4 = np.int32()
-u4 = np.uint32()
-
-dt = np.datetime64(0, "D")
-td = np.timedelta64(0, "D")
-
-b_ = np.bool_()
-
-b = bool()
-c = complex()
-f = float()
-i = int()
-
-AR = np.array([0], dtype=np.int64)
-AR.setflags(write=False)
-
-SEQ = (0, 1, 2, 3, 4)
-
-# Time structures
-
-reveal_type(dt > dt)  # E: numpy.bool_
-
-reveal_type(td > td)  # E: numpy.bool_
-reveal_type(td > i)  # E: numpy.bool_
-reveal_type(td > i4)  # E: numpy.bool_
-reveal_type(td > i8)  # E: numpy.bool_
-
-reveal_type(td > AR)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(td > SEQ)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(AR > SEQ)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(AR > td)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(SEQ > td)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(SEQ > AR)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-# boolean
-
-reveal_type(b_ > b)  # E: numpy.bool_
-reveal_type(b_ > b_)  # E: numpy.bool_
-reveal_type(b_ > i)  # E: numpy.bool_
-reveal_type(b_ > i8)  # E: numpy.bool_
-reveal_type(b_ > i4)  # E: numpy.bool_
-reveal_type(b_ > u8)  # E: numpy.bool_
-reveal_type(b_ > u4)  # E: numpy.bool_
-reveal_type(b_ > f)  # E: numpy.bool_
-reveal_type(b_ > f8)  # E: numpy.bool_
-reveal_type(b_ > f4)  # E: numpy.bool_
-reveal_type(b_ > c)  # E: numpy.bool_
-reveal_type(b_ > c16)  # E: numpy.bool_
-reveal_type(b_ > c8)  # E: numpy.bool_
-reveal_type(b_ > AR)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(b_ > SEQ)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-# Complex
-
-reveal_type(c16 > c16)  # E: numpy.bool_
-reveal_type(c16 > f8)  # E: numpy.bool_
-reveal_type(c16 > i8)  # E: numpy.bool_
-reveal_type(c16 > c8)  # E: numpy.bool_
-reveal_type(c16 > f4)  # E: numpy.bool_
-reveal_type(c16 > i4)  # E: numpy.bool_
-reveal_type(c16 > b_)  # E: numpy.bool_
-reveal_type(c16 > b)  # E: numpy.bool_
-reveal_type(c16 > c)  # E: numpy.bool_
-reveal_type(c16 > f)  # E: numpy.bool_
-reveal_type(c16 > i)  # E: numpy.bool_
-reveal_type(c16 > AR)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(c16 > SEQ)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(c16 > c16)  # E: numpy.bool_
-reveal_type(f8 > c16)  # E: numpy.bool_
-reveal_type(i8 > c16)  # E: numpy.bool_
-reveal_type(c8 > c16)  # E: numpy.bool_
-reveal_type(f4 > c16)  # E: numpy.bool_
-reveal_type(i4 > c16)  # E: numpy.bool_
-reveal_type(b_ > c16)  # E: numpy.bool_
-reveal_type(b > c16)  # E: numpy.bool_
-reveal_type(c > c16)  # E: numpy.bool_
-reveal_type(f > c16)  # E: numpy.bool_
-reveal_type(i > c16)  # E: numpy.bool_
-reveal_type(AR > c16)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(SEQ > c16)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(c8 > c16)  # E: numpy.bool_
-reveal_type(c8 > f8)  # E: numpy.bool_
-reveal_type(c8 > i8)  # E: numpy.bool_
-reveal_type(c8 > c8)  # E: numpy.bool_
-reveal_type(c8 > f4)  # E: numpy.bool_
-reveal_type(c8 > i4)  # E: numpy.bool_
-reveal_type(c8 > b_)  # E: numpy.bool_
-reveal_type(c8 > b)  # E: numpy.bool_
-reveal_type(c8 > c)  # E: numpy.bool_
-reveal_type(c8 > f)  # E: numpy.bool_
-reveal_type(c8 > i)  # E: numpy.bool_
-reveal_type(c8 > AR)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(c8 > SEQ)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(c16 > c8)  # E: numpy.bool_
-reveal_type(f8 > c8)  # E: numpy.bool_
-reveal_type(i8 > c8)  # E: numpy.bool_
-reveal_type(c8 > c8)  # E: numpy.bool_
-reveal_type(f4 > c8)  # E: numpy.bool_
-reveal_type(i4 > c8)  # E: numpy.bool_
-reveal_type(b_ > c8)  # E: numpy.bool_
-reveal_type(b > c8)  # E: numpy.bool_
-reveal_type(c > c8)  # E: numpy.bool_
-reveal_type(f > c8)  # E: numpy.bool_
-reveal_type(i > c8)  # E: numpy.bool_
-reveal_type(AR > c8)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(SEQ > c8)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-# Float
-
-reveal_type(f8 > f8)  # E: numpy.bool_
-reveal_type(f8 > i8)  # E: numpy.bool_
-reveal_type(f8 > f4)  # E: numpy.bool_
-reveal_type(f8 > i4)  # E: numpy.bool_
-reveal_type(f8 > b_)  # E: numpy.bool_
-reveal_type(f8 > b)  # E: numpy.bool_
-reveal_type(f8 > c)  # E: numpy.bool_
-reveal_type(f8 > f)  # E: numpy.bool_
-reveal_type(f8 > i)  # E: numpy.bool_
-reveal_type(f8 > AR)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(f8 > SEQ)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(f8 > f8)  # E: numpy.bool_
-reveal_type(i8 > f8)  # E: numpy.bool_
-reveal_type(f4 > f8)  # E: numpy.bool_
-reveal_type(i4 > f8)  # E: numpy.bool_
-reveal_type(b_ > f8)  # E: numpy.bool_
-reveal_type(b > f8)  # E: numpy.bool_
-reveal_type(c > f8)  # E: numpy.bool_
-reveal_type(f > f8)  # E: numpy.bool_
-reveal_type(i > f8)  # E: numpy.bool_
-reveal_type(AR > f8)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(SEQ > f8)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(f4 > f8)  # E: numpy.bool_
-reveal_type(f4 > i8)  # E: numpy.bool_
-reveal_type(f4 > f4)  # E: numpy.bool_
-reveal_type(f4 > i4)  # E: numpy.bool_
-reveal_type(f4 > b_)  # E: numpy.bool_
-reveal_type(f4 > b)  # E: numpy.bool_
-reveal_type(f4 > c)  # E: numpy.bool_
-reveal_type(f4 > f)  # E: numpy.bool_
-reveal_type(f4 > i)  # E: numpy.bool_
-reveal_type(f4 > AR)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(f4 > SEQ)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(f8 > f4)  # E: numpy.bool_
-reveal_type(i8 > f4)  # E: numpy.bool_
-reveal_type(f4 > f4)  # E: numpy.bool_
-reveal_type(i4 > f4)  # E: numpy.bool_
-reveal_type(b_ > f4)  # E: numpy.bool_
-reveal_type(b > f4)  # E: numpy.bool_
-reveal_type(c > f4)  # E: numpy.bool_
-reveal_type(f > f4)  # E: numpy.bool_
-reveal_type(i > f4)  # E: numpy.bool_
-reveal_type(AR > f4)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(SEQ > f4)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-# Int
-
-reveal_type(i8 > i8)  # E: numpy.bool_
-reveal_type(i8 > u8)  # E: numpy.bool_
-reveal_type(i8 > i4)  # E: numpy.bool_
-reveal_type(i8 > u4)  # E: numpy.bool_
-reveal_type(i8 > b_)  # E: numpy.bool_
-reveal_type(i8 > b)  # E: numpy.bool_
-reveal_type(i8 > c)  # E: numpy.bool_
-reveal_type(i8 > f)  # E: numpy.bool_
-reveal_type(i8 > i)  # E: numpy.bool_
-reveal_type(i8 > AR)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(i8 > SEQ)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(u8 > u8)  # E: numpy.bool_
-reveal_type(u8 > i4)  # E: numpy.bool_
-reveal_type(u8 > u4)  # E: numpy.bool_
-reveal_type(u8 > b_)  # E: numpy.bool_
-reveal_type(u8 > b)  # E: numpy.bool_
-reveal_type(u8 > c)  # E: numpy.bool_
-reveal_type(u8 > f)  # E: numpy.bool_
-reveal_type(u8 > i)  # E: numpy.bool_
-reveal_type(u8 > AR)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(u8 > SEQ)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(i8 > i8)  # E: numpy.bool_
-reveal_type(u8 > i8)  # E: numpy.bool_
-reveal_type(i4 > i8)  # E: numpy.bool_
-reveal_type(u4 > i8)  # E: numpy.bool_
-reveal_type(b_ > i8)  # E: numpy.bool_
-reveal_type(b > i8)  # E: numpy.bool_
-reveal_type(c > i8)  # E: numpy.bool_
-reveal_type(f > i8)  # E: numpy.bool_
-reveal_type(i > i8)  # E: numpy.bool_
-reveal_type(AR > i8)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(SEQ > i8)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(u8 > u8)  # E: numpy.bool_
-reveal_type(i4 > u8)  # E: numpy.bool_
-reveal_type(u4 > u8)  # E: numpy.bool_
-reveal_type(b_ > u8)  # E: numpy.bool_
-reveal_type(b > u8)  # E: numpy.bool_
-reveal_type(c > u8)  # E: numpy.bool_
-reveal_type(f > u8)  # E: numpy.bool_
-reveal_type(i > u8)  # E: numpy.bool_
-reveal_type(AR > u8)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(SEQ > u8)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(i4 > i8)  # E: numpy.bool_
-reveal_type(i4 > i4)  # E: numpy.bool_
-reveal_type(i4 > i)  # E: numpy.bool_
-reveal_type(i4 > b_)  # E: numpy.bool_
-reveal_type(i4 > b)  # E: numpy.bool_
-reveal_type(i4 > AR)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(i4 > SEQ)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(u4 > i8)  # E: numpy.bool_
-reveal_type(u4 > i4)  # E: numpy.bool_
-reveal_type(u4 > u8)  # E: numpy.bool_
-reveal_type(u4 > u4)  # E: numpy.bool_
-reveal_type(u4 > i)  # E: numpy.bool_
-reveal_type(u4 > b_)  # E: numpy.bool_
-reveal_type(u4 > b)  # E: numpy.bool_
-reveal_type(u4 > AR)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(u4 > SEQ)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(i8 > i4)  # E: numpy.bool_
-reveal_type(i4 > i4)  # E: numpy.bool_
-reveal_type(i > i4)  # E: numpy.bool_
-reveal_type(b_ > i4)  # E: numpy.bool_
-reveal_type(b > i4)  # E: numpy.bool_
-reveal_type(AR > i4)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(SEQ > i4)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-
-reveal_type(i8 > u4)  # E: numpy.bool_
-reveal_type(i4 > u4)  # E: numpy.bool_
-reveal_type(u8 > u4)  # E: numpy.bool_
-reveal_type(u4 > u4)  # E: numpy.bool_
-reveal_type(b_ > u4)  # E: numpy.bool_
-reveal_type(b > u4)  # E: numpy.bool_
-reveal_type(i > u4)  # E: numpy.bool_
-reveal_type(AR > u4)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(SEQ > u4)  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
diff --git a/numpy/typing/tests/data/reveal/comparisons.pyi b/numpy/typing/tests/data/reveal/comparisons.pyi
new file mode 100644 (file)
index 0000000..ecd8ea6
--- /dev/null
@@ -0,0 +1,252 @@
+import numpy as np
+
+c16 = np.complex128()
+f8 = np.float64()
+i8 = np.int64()
+u8 = np.uint64()
+
+c8 = np.complex64()
+f4 = np.float32()
+i4 = np.int32()
+u4 = np.uint32()
+
+dt = np.datetime64(0, "D")
+td = np.timedelta64(0, "D")
+
+b_ = np.bool_()
+
+b = bool()
+c = complex()
+f = float()
+i = int()
+
+AR = np.array([0], dtype=np.int64)
+AR.setflags(write=False)
+
+SEQ = (0, 1, 2, 3, 4)
+
+# Time structures
+
+reveal_type(dt > dt)  # E: bool_
+
+reveal_type(td > td)  # E: bool_
+reveal_type(td > i)  # E: bool_
+reveal_type(td > i4)  # E: bool_
+reveal_type(td > i8)  # E: bool_
+
+reveal_type(td > AR)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(td > SEQ)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR > SEQ)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(AR > td)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(SEQ > td)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(SEQ > AR)  # E: ndarray[Any, dtype[bool_]]
+
+# boolean
+
+reveal_type(b_ > b)  # E: bool_
+reveal_type(b_ > b_)  # E: bool_
+reveal_type(b_ > i)  # E: bool_
+reveal_type(b_ > i8)  # E: bool_
+reveal_type(b_ > i4)  # E: bool_
+reveal_type(b_ > u8)  # E: bool_
+reveal_type(b_ > u4)  # E: bool_
+reveal_type(b_ > f)  # E: bool_
+reveal_type(b_ > f8)  # E: bool_
+reveal_type(b_ > f4)  # E: bool_
+reveal_type(b_ > c)  # E: bool_
+reveal_type(b_ > c16)  # E: bool_
+reveal_type(b_ > c8)  # E: bool_
+reveal_type(b_ > AR)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(b_ > SEQ)  # E: ndarray[Any, dtype[bool_]]
+
+# Complex
+
+reveal_type(c16 > c16)  # E: bool_
+reveal_type(c16 > f8)  # E: bool_
+reveal_type(c16 > i8)  # E: bool_
+reveal_type(c16 > c8)  # E: bool_
+reveal_type(c16 > f4)  # E: bool_
+reveal_type(c16 > i4)  # E: bool_
+reveal_type(c16 > b_)  # E: bool_
+reveal_type(c16 > b)  # E: bool_
+reveal_type(c16 > c)  # E: bool_
+reveal_type(c16 > f)  # E: bool_
+reveal_type(c16 > i)  # E: bool_
+reveal_type(c16 > AR)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(c16 > SEQ)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(c16 > c16)  # E: bool_
+reveal_type(f8 > c16)  # E: bool_
+reveal_type(i8 > c16)  # E: bool_
+reveal_type(c8 > c16)  # E: bool_
+reveal_type(f4 > c16)  # E: bool_
+reveal_type(i4 > c16)  # E: bool_
+reveal_type(b_ > c16)  # E: bool_
+reveal_type(b > c16)  # E: bool_
+reveal_type(c > c16)  # E: bool_
+reveal_type(f > c16)  # E: bool_
+reveal_type(i > c16)  # E: bool_
+reveal_type(AR > c16)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(SEQ > c16)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(c8 > c16)  # E: bool_
+reveal_type(c8 > f8)  # E: bool_
+reveal_type(c8 > i8)  # E: bool_
+reveal_type(c8 > c8)  # E: bool_
+reveal_type(c8 > f4)  # E: bool_
+reveal_type(c8 > i4)  # E: bool_
+reveal_type(c8 > b_)  # E: bool_
+reveal_type(c8 > b)  # E: bool_
+reveal_type(c8 > c)  # E: bool_
+reveal_type(c8 > f)  # E: bool_
+reveal_type(c8 > i)  # E: bool_
+reveal_type(c8 > AR)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(c8 > SEQ)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(c16 > c8)  # E: bool_
+reveal_type(f8 > c8)  # E: bool_
+reveal_type(i8 > c8)  # E: bool_
+reveal_type(c8 > c8)  # E: bool_
+reveal_type(f4 > c8)  # E: bool_
+reveal_type(i4 > c8)  # E: bool_
+reveal_type(b_ > c8)  # E: bool_
+reveal_type(b > c8)  # E: bool_
+reveal_type(c > c8)  # E: bool_
+reveal_type(f > c8)  # E: bool_
+reveal_type(i > c8)  # E: bool_
+reveal_type(AR > c8)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(SEQ > c8)  # E: ndarray[Any, dtype[bool_]]
+
+# Float
+
+reveal_type(f8 > f8)  # E: bool_
+reveal_type(f8 > i8)  # E: bool_
+reveal_type(f8 > f4)  # E: bool_
+reveal_type(f8 > i4)  # E: bool_
+reveal_type(f8 > b_)  # E: bool_
+reveal_type(f8 > b)  # E: bool_
+reveal_type(f8 > c)  # E: bool_
+reveal_type(f8 > f)  # E: bool_
+reveal_type(f8 > i)  # E: bool_
+reveal_type(f8 > AR)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(f8 > SEQ)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(f8 > f8)  # E: bool_
+reveal_type(i8 > f8)  # E: bool_
+reveal_type(f4 > f8)  # E: bool_
+reveal_type(i4 > f8)  # E: bool_
+reveal_type(b_ > f8)  # E: bool_
+reveal_type(b > f8)  # E: bool_
+reveal_type(c > f8)  # E: bool_
+reveal_type(f > f8)  # E: bool_
+reveal_type(i > f8)  # E: bool_
+reveal_type(AR > f8)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(SEQ > f8)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(f4 > f8)  # E: bool_
+reveal_type(f4 > i8)  # E: bool_
+reveal_type(f4 > f4)  # E: bool_
+reveal_type(f4 > i4)  # E: bool_
+reveal_type(f4 > b_)  # E: bool_
+reveal_type(f4 > b)  # E: bool_
+reveal_type(f4 > c)  # E: bool_
+reveal_type(f4 > f)  # E: bool_
+reveal_type(f4 > i)  # E: bool_
+reveal_type(f4 > AR)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(f4 > SEQ)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(f8 > f4)  # E: bool_
+reveal_type(i8 > f4)  # E: bool_
+reveal_type(f4 > f4)  # E: bool_
+reveal_type(i4 > f4)  # E: bool_
+reveal_type(b_ > f4)  # E: bool_
+reveal_type(b > f4)  # E: bool_
+reveal_type(c > f4)  # E: bool_
+reveal_type(f > f4)  # E: bool_
+reveal_type(i > f4)  # E: bool_
+reveal_type(AR > f4)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(SEQ > f4)  # E: ndarray[Any, dtype[bool_]]
+
+# Int
+
+reveal_type(i8 > i8)  # E: bool_
+reveal_type(i8 > u8)  # E: bool_
+reveal_type(i8 > i4)  # E: bool_
+reveal_type(i8 > u4)  # E: bool_
+reveal_type(i8 > b_)  # E: bool_
+reveal_type(i8 > b)  # E: bool_
+reveal_type(i8 > c)  # E: bool_
+reveal_type(i8 > f)  # E: bool_
+reveal_type(i8 > i)  # E: bool_
+reveal_type(i8 > AR)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(i8 > SEQ)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(u8 > u8)  # E: bool_
+reveal_type(u8 > i4)  # E: bool_
+reveal_type(u8 > u4)  # E: bool_
+reveal_type(u8 > b_)  # E: bool_
+reveal_type(u8 > b)  # E: bool_
+reveal_type(u8 > c)  # E: bool_
+reveal_type(u8 > f)  # E: bool_
+reveal_type(u8 > i)  # E: bool_
+reveal_type(u8 > AR)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(u8 > SEQ)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(i8 > i8)  # E: bool_
+reveal_type(u8 > i8)  # E: bool_
+reveal_type(i4 > i8)  # E: bool_
+reveal_type(u4 > i8)  # E: bool_
+reveal_type(b_ > i8)  # E: bool_
+reveal_type(b > i8)  # E: bool_
+reveal_type(c > i8)  # E: bool_
+reveal_type(f > i8)  # E: bool_
+reveal_type(i > i8)  # E: bool_
+reveal_type(AR > i8)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(SEQ > i8)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(u8 > u8)  # E: bool_
+reveal_type(i4 > u8)  # E: bool_
+reveal_type(u4 > u8)  # E: bool_
+reveal_type(b_ > u8)  # E: bool_
+reveal_type(b > u8)  # E: bool_
+reveal_type(c > u8)  # E: bool_
+reveal_type(f > u8)  # E: bool_
+reveal_type(i > u8)  # E: bool_
+reveal_type(AR > u8)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(SEQ > u8)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(i4 > i8)  # E: bool_
+reveal_type(i4 > i4)  # E: bool_
+reveal_type(i4 > i)  # E: bool_
+reveal_type(i4 > b_)  # E: bool_
+reveal_type(i4 > b)  # E: bool_
+reveal_type(i4 > AR)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(i4 > SEQ)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(u4 > i8)  # E: bool_
+reveal_type(u4 > i4)  # E: bool_
+reveal_type(u4 > u8)  # E: bool_
+reveal_type(u4 > u4)  # E: bool_
+reveal_type(u4 > i)  # E: bool_
+reveal_type(u4 > b_)  # E: bool_
+reveal_type(u4 > b)  # E: bool_
+reveal_type(u4 > AR)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(u4 > SEQ)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(i8 > i4)  # E: bool_
+reveal_type(i4 > i4)  # E: bool_
+reveal_type(i > i4)  # E: bool_
+reveal_type(b_ > i4)  # E: bool_
+reveal_type(b > i4)  # E: bool_
+reveal_type(AR > i4)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(SEQ > i4)  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(i8 > u4)  # E: bool_
+reveal_type(i4 > u4)  # E: bool_
+reveal_type(u8 > u4)  # E: bool_
+reveal_type(u4 > u4)  # E: bool_
+reveal_type(b_ > u4)  # E: bool_
+reveal_type(b > u4)  # E: bool_
+reveal_type(i > u4)  # E: bool_
+reveal_type(AR > u4)  # E: ndarray[Any, dtype[bool_]]
+reveal_type(SEQ > u4)  # E: ndarray[Any, dtype[bool_]]
diff --git a/numpy/typing/tests/data/reveal/constants.py b/numpy/typing/tests/data/reveal/constants.py
deleted file mode 100644 (file)
index b2382e8..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-import numpy as np
-
-reveal_type(np.Inf)  # E: float
-reveal_type(np.Infinity)  # E: float
-reveal_type(np.NAN)  # E: float
-reveal_type(np.NINF)  # E: float
-reveal_type(np.NZERO)  # E: float
-reveal_type(np.NaN)  # E: float
-reveal_type(np.PINF)  # E: float
-reveal_type(np.PZERO)  # E: float
-reveal_type(np.e)  # E: float
-reveal_type(np.euler_gamma)  # E: float
-reveal_type(np.inf)  # E: float
-reveal_type(np.infty)  # E: float
-reveal_type(np.nan)  # E: float
-reveal_type(np.pi)  # E: float
-
-reveal_type(np.ALLOW_THREADS)  # E: int
-reveal_type(np.BUFSIZE)  # E: int
-reveal_type(np.CLIP)  # E: int
-reveal_type(np.ERR_CALL)  # E: int
-reveal_type(np.ERR_DEFAULT)  # E: int
-reveal_type(np.ERR_IGNORE)  # E: int
-reveal_type(np.ERR_LOG)  # E: int
-reveal_type(np.ERR_PRINT)  # E: int
-reveal_type(np.ERR_RAISE)  # E: int
-reveal_type(np.ERR_WARN)  # E: int
-reveal_type(np.FLOATING_POINT_SUPPORT)  # E: int
-reveal_type(np.FPE_DIVIDEBYZERO)  # E: int
-reveal_type(np.FPE_INVALID)  # E: int
-reveal_type(np.FPE_OVERFLOW)  # E: int
-reveal_type(np.FPE_UNDERFLOW)  # E: int
-reveal_type(np.MAXDIMS)  # E: int
-reveal_type(np.MAY_SHARE_BOUNDS)  # E: int
-reveal_type(np.MAY_SHARE_EXACT)  # E: int
-reveal_type(np.RAISE)  # E: int
-reveal_type(np.SHIFT_DIVIDEBYZERO)  # E: int
-reveal_type(np.SHIFT_INVALID)  # E: int
-reveal_type(np.SHIFT_OVERFLOW)  # E: int
-reveal_type(np.SHIFT_UNDERFLOW)  # E: int
-reveal_type(np.UFUNC_BUFSIZE_DEFAULT)  # E: int
-reveal_type(np.WRAP)  # E: int
-reveal_type(np.tracemalloc_domain)  # E: int
-
-reveal_type(np.little_endian)  # E: bool
-reveal_type(np.True_)  # E: numpy.bool_
-reveal_type(np.False_)  # E: numpy.bool_
-
-reveal_type(np.UFUNC_PYVALS_NAME)  # E: str
-
-reveal_type(np.sctypeDict)  # E: dict
-reveal_type(np.sctypes)  # E: TypedDict
diff --git a/numpy/typing/tests/data/reveal/constants.pyi b/numpy/typing/tests/data/reveal/constants.pyi
new file mode 100644 (file)
index 0000000..37f54cc
--- /dev/null
@@ -0,0 +1,52 @@
+import numpy as np
+
+reveal_type(np.Inf)  # E: float
+reveal_type(np.Infinity)  # E: float
+reveal_type(np.NAN)  # E: float
+reveal_type(np.NINF)  # E: float
+reveal_type(np.NZERO)  # E: float
+reveal_type(np.NaN)  # E: float
+reveal_type(np.PINF)  # E: float
+reveal_type(np.PZERO)  # E: float
+reveal_type(np.e)  # E: float
+reveal_type(np.euler_gamma)  # E: float
+reveal_type(np.inf)  # E: float
+reveal_type(np.infty)  # E: float
+reveal_type(np.nan)  # E: float
+reveal_type(np.pi)  # E: float
+
+reveal_type(np.ALLOW_THREADS)  # E: int
+reveal_type(np.BUFSIZE)  # E: Literal[8192]
+reveal_type(np.CLIP)  # E: Literal[0]
+reveal_type(np.ERR_CALL)  # E: Literal[3]
+reveal_type(np.ERR_DEFAULT)  # E: Literal[521]
+reveal_type(np.ERR_IGNORE)  # E: Literal[0]
+reveal_type(np.ERR_LOG)  # E: Literal[5]
+reveal_type(np.ERR_PRINT)  # E: Literal[4]
+reveal_type(np.ERR_RAISE)  # E: Literal[2]
+reveal_type(np.ERR_WARN)  # E: Literal[1]
+reveal_type(np.FLOATING_POINT_SUPPORT)  # E: Literal[1]
+reveal_type(np.FPE_DIVIDEBYZERO)  # E: Literal[1]
+reveal_type(np.FPE_INVALID)  # E: Literal[8]
+reveal_type(np.FPE_OVERFLOW)  # E: Literal[2]
+reveal_type(np.FPE_UNDERFLOW)  # E: Literal[4]
+reveal_type(np.MAXDIMS)  # E: Literal[32]
+reveal_type(np.MAY_SHARE_BOUNDS)  # E: Literal[0]
+reveal_type(np.MAY_SHARE_EXACT)  # E: Literal[-1]
+reveal_type(np.RAISE)  # E: Literal[2]
+reveal_type(np.SHIFT_DIVIDEBYZERO)  # E: Literal[0]
+reveal_type(np.SHIFT_INVALID)  # E: Literal[9]
+reveal_type(np.SHIFT_OVERFLOW)  # E: Literal[3]
+reveal_type(np.SHIFT_UNDERFLOW)  # E: Literal[6]
+reveal_type(np.UFUNC_BUFSIZE_DEFAULT)  # E: Literal[8192]
+reveal_type(np.WRAP)  # E: Literal[1]
+reveal_type(np.tracemalloc_domain)  # E: Literal[389047]
+
+reveal_type(np.little_endian)  # E: bool
+reveal_type(np.True_)  # E: bool_
+reveal_type(np.False_)  # E: bool_
+
+reveal_type(np.UFUNC_PYVALS_NAME)  # E: Literal['UFUNC_PYVALS']
+
+reveal_type(np.sctypeDict)  # E: dict
+reveal_type(np.sctypes)  # E: TypedDict
diff --git a/numpy/typing/tests/data/reveal/ctypeslib.pyi b/numpy/typing/tests/data/reveal/ctypeslib.pyi
new file mode 100644 (file)
index 0000000..ccbdfe3
--- /dev/null
@@ -0,0 +1,87 @@
+import ctypes
+from typing import Any
+
+import numpy as np
+import numpy.typing as npt
+
+AR_bool: npt.NDArray[np.bool_]
+AR_ubyte: npt.NDArray[np.ubyte]
+AR_ushort: npt.NDArray[np.ushort]
+AR_uintc: npt.NDArray[np.uintc]
+AR_uint: npt.NDArray[np.uint]
+AR_ulonglong: npt.NDArray[np.ulonglong]
+AR_byte: npt.NDArray[np.byte]
+AR_short: npt.NDArray[np.short]
+AR_intc: npt.NDArray[np.intc]
+AR_int: npt.NDArray[np.int_]
+AR_longlong: npt.NDArray[np.longlong]
+AR_single: npt.NDArray[np.single]
+AR_double: npt.NDArray[np.double]
+AR_longdouble: npt.NDArray[np.longdouble]
+AR_void: npt.NDArray[np.void]
+
+pointer: ctypes.pointer[Any]
+
+reveal_type(np.ctypeslib.c_intp())  # E: {c_intp}
+
+reveal_type(np.ctypeslib.ndpointer())  # E: Type[ctypeslib._ndptr[None]]
+reveal_type(np.ctypeslib.ndpointer(dtype=np.float64))  # E: Type[ctypeslib._ndptr[dtype[{float64}]]]
+reveal_type(np.ctypeslib.ndpointer(dtype=float))  # E: Type[ctypeslib._ndptr[dtype[Any]]]
+reveal_type(np.ctypeslib.ndpointer(shape=(10, 3)))  # E: Type[ctypeslib._ndptr[None]]
+reveal_type(np.ctypeslib.ndpointer(np.int64, shape=(10, 3)))  # E: Type[ctypeslib._concrete_ndptr[dtype[{int64}]]]
+reveal_type(np.ctypeslib.ndpointer(int, shape=(1,)))  # E: Type[ctypeslib._concrete_ndptr[dtype[Any]]]
+
+reveal_type(np.ctypeslib.as_ctypes_type(np.bool_))  # E: Type[ctypes.c_bool]
+reveal_type(np.ctypeslib.as_ctypes_type(np.ubyte))  # E: Type[{c_ubyte}]
+reveal_type(np.ctypeslib.as_ctypes_type(np.ushort))  # E: Type[{c_ushort}]
+reveal_type(np.ctypeslib.as_ctypes_type(np.uintc))  # E: Type[{c_uint}]
+reveal_type(np.ctypeslib.as_ctypes_type(np.uint))  # E: Type[{c_ulong}]
+reveal_type(np.ctypeslib.as_ctypes_type(np.ulonglong))  # E: Type[{c_ulonglong}]
+reveal_type(np.ctypeslib.as_ctypes_type(np.byte))  # E: Type[{c_byte}]
+reveal_type(np.ctypeslib.as_ctypes_type(np.short))  # E: Type[{c_short}]
+reveal_type(np.ctypeslib.as_ctypes_type(np.intc))  # E: Type[{c_int}]
+reveal_type(np.ctypeslib.as_ctypes_type(np.int_))  # E: Type[{c_long}]
+reveal_type(np.ctypeslib.as_ctypes_type(np.longlong))  # E: Type[{c_longlong}]
+reveal_type(np.ctypeslib.as_ctypes_type(np.single))  # E: Type[{c_float}]
+reveal_type(np.ctypeslib.as_ctypes_type(np.double))  # E: Type[{c_double}]
+reveal_type(np.ctypeslib.as_ctypes_type(np.longdouble))  # E: Type[{c_longdouble}]
+reveal_type(np.ctypeslib.as_ctypes_type(ctypes.c_double))  # E: Type[{c_double}]
+reveal_type(np.ctypeslib.as_ctypes_type("q"))  # E: Type[ctypes.c_longlong]
+reveal_type(np.ctypeslib.as_ctypes_type([("i8", np.int64), ("f8", np.float64)]))  # E: Type[Any]
+reveal_type(np.ctypeslib.as_ctypes_type("i8"))  # E: Type[Any]
+reveal_type(np.ctypeslib.as_ctypes_type("f8"))  # E: Type[Any]
+
+reveal_type(np.ctypeslib.as_ctypes(AR_bool.take(0)))  # E: ctypes.c_bool
+reveal_type(np.ctypeslib.as_ctypes(AR_ubyte.take(0)))  # E: {c_ubyte}
+reveal_type(np.ctypeslib.as_ctypes(AR_ushort.take(0)))  # E: {c_ushort}
+reveal_type(np.ctypeslib.as_ctypes(AR_uintc.take(0)))  # E: {c_uint}
+reveal_type(np.ctypeslib.as_ctypes(AR_uint.take(0)))  # E: {c_ulong}
+reveal_type(np.ctypeslib.as_ctypes(AR_ulonglong.take(0)))  # E: {c_ulonglong}
+reveal_type(np.ctypeslib.as_ctypes(AR_byte.take(0)))  # E: {c_byte}
+reveal_type(np.ctypeslib.as_ctypes(AR_short.take(0)))  # E: {c_short}
+reveal_type(np.ctypeslib.as_ctypes(AR_intc.take(0)))  # E: {c_int}
+reveal_type(np.ctypeslib.as_ctypes(AR_int.take(0)))  # E: {c_long}
+reveal_type(np.ctypeslib.as_ctypes(AR_longlong.take(0)))  # E: {c_longlong}
+reveal_type(np.ctypeslib.as_ctypes(AR_single.take(0)))  # E: {c_float}
+reveal_type(np.ctypeslib.as_ctypes(AR_double.take(0)))  # E: {c_double}
+reveal_type(np.ctypeslib.as_ctypes(AR_longdouble.take(0)))  # E: {c_longdouble}
+reveal_type(np.ctypeslib.as_ctypes(AR_void.take(0)))  # E: Any
+reveal_type(np.ctypeslib.as_ctypes(AR_bool))  # E: ctypes.Array[ctypes.c_bool]
+reveal_type(np.ctypeslib.as_ctypes(AR_ubyte))  # E: ctypes.Array[{c_ubyte}]
+reveal_type(np.ctypeslib.as_ctypes(AR_ushort))  # E: ctypes.Array[{c_ushort}]
+reveal_type(np.ctypeslib.as_ctypes(AR_uintc))  # E: ctypes.Array[{c_uint}]
+reveal_type(np.ctypeslib.as_ctypes(AR_uint))  # E: ctypes.Array[{c_ulong}]
+reveal_type(np.ctypeslib.as_ctypes(AR_ulonglong))  # E: ctypes.Array[{c_ulonglong}]
+reveal_type(np.ctypeslib.as_ctypes(AR_byte))  # E: ctypes.Array[{c_byte}]
+reveal_type(np.ctypeslib.as_ctypes(AR_short))  # E: ctypes.Array[{c_short}]
+reveal_type(np.ctypeslib.as_ctypes(AR_intc))  # E: ctypes.Array[{c_int}]
+reveal_type(np.ctypeslib.as_ctypes(AR_int))  # E: ctypes.Array[{c_long}]
+reveal_type(np.ctypeslib.as_ctypes(AR_longlong))  # E: ctypes.Array[{c_longlong}]
+reveal_type(np.ctypeslib.as_ctypes(AR_single))  # E: ctypes.Array[{c_float}]
+reveal_type(np.ctypeslib.as_ctypes(AR_double))  # E: ctypes.Array[{c_double}]
+reveal_type(np.ctypeslib.as_ctypes(AR_longdouble))  # E: ctypes.Array[{c_longdouble}]
+reveal_type(np.ctypeslib.as_ctypes(AR_void))  # E: ctypes.Array[Any]
+
+reveal_type(np.ctypeslib.as_array(AR_ubyte))  # E: ndarray[Any, dtype[{ubyte}]]
+reveal_type(np.ctypeslib.as_array(1))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.ctypeslib.as_array(pointer))  # E: ndarray[Any, dtype[Any]]
diff --git a/numpy/typing/tests/data/reveal/datasource.py b/numpy/typing/tests/data/reveal/datasource.py
deleted file mode 100644 (file)
index 245ac76..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-from pathlib import Path
-import numpy as np
-
-path1: Path
-path2: str
-
-d1 = np.DataSource(path1)
-d2 = np.DataSource(path2)
-d3 = np.DataSource(None)
-
-reveal_type(d1.abspath("..."))  # E: str
-reveal_type(d2.abspath("..."))  # E: str
-reveal_type(d3.abspath("..."))  # E: str
-
-reveal_type(d1.exists("..."))  # E: bool
-reveal_type(d2.exists("..."))  # E: bool
-reveal_type(d3.exists("..."))  # E: bool
-
-reveal_type(d1.open("...", "r"))  # E: IO[Any]
-reveal_type(d2.open("...", encoding="utf8"))  # E: IO[Any]
-reveal_type(d3.open("...", newline="/n"))  # E: IO[Any]
diff --git a/numpy/typing/tests/data/reveal/datasource.pyi b/numpy/typing/tests/data/reveal/datasource.pyi
new file mode 100644 (file)
index 0000000..245ac76
--- /dev/null
@@ -0,0 +1,21 @@
+from pathlib import Path
+import numpy as np
+
+path1: Path
+path2: str
+
+d1 = np.DataSource(path1)
+d2 = np.DataSource(path2)
+d3 = np.DataSource(None)
+
+reveal_type(d1.abspath("..."))  # E: str
+reveal_type(d2.abspath("..."))  # E: str
+reveal_type(d3.abspath("..."))  # E: str
+
+reveal_type(d1.exists("..."))  # E: bool
+reveal_type(d2.exists("..."))  # E: bool
+reveal_type(d3.exists("..."))  # E: bool
+
+reveal_type(d1.open("...", "r"))  # E: IO[Any]
+reveal_type(d2.open("...", encoding="utf8"))  # E: IO[Any]
+reveal_type(d3.open("...", newline="/n"))  # E: IO[Any]
diff --git a/numpy/typing/tests/data/reveal/dtype.py b/numpy/typing/tests/data/reveal/dtype.py
deleted file mode 100644 (file)
index 299fed3..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-import ctypes as ct
-import numpy as np
-
-dtype_obj: np.dtype[np.str_]
-void_dtype_obj: np.dtype[np.void]
-
-reveal_type(np.dtype(np.float64))  # E: numpy.dtype[{float64}]
-reveal_type(np.dtype(np.int64))  # E: numpy.dtype[{int64}]
-
-# String aliases
-reveal_type(np.dtype("float64"))  # E: numpy.dtype[{float64}]
-reveal_type(np.dtype("float32"))  # E: numpy.dtype[{float32}]
-reveal_type(np.dtype("int64"))  # E: numpy.dtype[{int64}]
-reveal_type(np.dtype("int32"))  # E: numpy.dtype[{int32}]
-reveal_type(np.dtype("bool"))  # E: numpy.dtype[numpy.bool_]
-reveal_type(np.dtype("bytes"))  # E: numpy.dtype[numpy.bytes_]
-reveal_type(np.dtype("str"))  # E: numpy.dtype[numpy.str_]
-
-# Python types
-reveal_type(np.dtype(complex))  # E: numpy.dtype[{cdouble}]
-reveal_type(np.dtype(float))  # E: numpy.dtype[{double}]
-reveal_type(np.dtype(int))  # E: numpy.dtype[{int_}]
-reveal_type(np.dtype(bool))  # E: numpy.dtype[numpy.bool_]
-reveal_type(np.dtype(str))  # E: numpy.dtype[numpy.str_]
-reveal_type(np.dtype(bytes))  # E: numpy.dtype[numpy.bytes_]
-reveal_type(np.dtype(object))  # E: numpy.dtype[numpy.object_]
-
-# ctypes
-reveal_type(np.dtype(ct.c_double))  # E: numpy.dtype[{double}]
-reveal_type(np.dtype(ct.c_longlong))  # E: numpy.dtype[{longlong}]
-reveal_type(np.dtype(ct.c_uint32))  # E: numpy.dtype[{uint32}]
-reveal_type(np.dtype(ct.c_bool))  # E: numpy.dtype[numpy.bool_]
-reveal_type(np.dtype(ct.c_char))  # E: numpy.dtype[numpy.bytes_]
-reveal_type(np.dtype(ct.py_object))  # E: numpy.dtype[numpy.object_]
-
-# Special case for None
-reveal_type(np.dtype(None))  # E: numpy.dtype[{double}]
-
-# Dtypes of dtypes
-reveal_type(np.dtype(np.dtype(np.float64)))  # E: numpy.dtype[{float64}]
-
-# Parameterized dtypes
-reveal_type(np.dtype("S8"))  # E: numpy.dtype
-
-# Void
-reveal_type(np.dtype(("U", 10)))  # E: numpy.dtype[numpy.void]
-
-# Methods and attributes
-reveal_type(dtype_obj.base)  # E: numpy.dtype[numpy.str_]
-reveal_type(dtype_obj.subdtype)  # E: Union[Tuple[numpy.dtype[numpy.str_], builtins.tuple[builtins.int]], None]
-reveal_type(dtype_obj.newbyteorder())  # E: numpy.dtype[numpy.str_]
-reveal_type(dtype_obj.type)  # E: Type[numpy.str_]
-reveal_type(dtype_obj.name)  # E: str
-reveal_type(dtype_obj.names)  # E: Union[builtins.tuple[builtins.str], None]
-
-reveal_type(dtype_obj * 0)  # E: None
-reveal_type(dtype_obj * 1)  # E: numpy.dtype[numpy.str_]
-reveal_type(dtype_obj * 2)  # E: numpy.dtype[numpy.void]
-
-reveal_type(0 * dtype_obj)  # E: Any
-reveal_type(1 * dtype_obj)  # E: Any
-reveal_type(2 * dtype_obj)  # E: Any
-
-reveal_type(void_dtype_obj["f0"])  # E: numpy.dtype[Any]
-reveal_type(void_dtype_obj[0])  # E: numpy.dtype[Any]
-reveal_type(void_dtype_obj[["f0", "f1"]])  # E: numpy.dtype[numpy.void]
-reveal_type(void_dtype_obj[["f0"]])  # E: numpy.dtype[numpy.void]
diff --git a/numpy/typing/tests/data/reveal/dtype.pyi b/numpy/typing/tests/data/reveal/dtype.pyi
new file mode 100644 (file)
index 0000000..934d7da
--- /dev/null
@@ -0,0 +1,76 @@
+import ctypes as ct
+import numpy as np
+
+dtype_U: np.dtype[np.str_]
+dtype_V: np.dtype[np.void]
+dtype_i8: np.dtype[np.int64]
+
+reveal_type(np.dtype(np.float64))  # E: dtype[{float64}]
+reveal_type(np.dtype(np.int64))  # E: dtype[{int64}]
+
+# String aliases
+reveal_type(np.dtype("float64"))  # E: dtype[{float64}]
+reveal_type(np.dtype("float32"))  # E: dtype[{float32}]
+reveal_type(np.dtype("int64"))  # E: dtype[{int64}]
+reveal_type(np.dtype("int32"))  # E: dtype[{int32}]
+reveal_type(np.dtype("bool"))  # E: dtype[bool_]
+reveal_type(np.dtype("bytes"))  # E: dtype[bytes_]
+reveal_type(np.dtype("str"))  # E: dtype[str_]
+
+# Python types
+reveal_type(np.dtype(complex))  # E: dtype[{cdouble}]
+reveal_type(np.dtype(float))  # E: dtype[{double}]
+reveal_type(np.dtype(int))  # E: dtype[{int_}]
+reveal_type(np.dtype(bool))  # E: dtype[bool_]
+reveal_type(np.dtype(str))  # E: dtype[str_]
+reveal_type(np.dtype(bytes))  # E: dtype[bytes_]
+reveal_type(np.dtype(object))  # E: dtype[object_]
+
+# ctypes
+reveal_type(np.dtype(ct.c_double))  # E: dtype[{double}]
+reveal_type(np.dtype(ct.c_longlong))  # E: dtype[{longlong}]
+reveal_type(np.dtype(ct.c_uint32))  # E: dtype[{uint32}]
+reveal_type(np.dtype(ct.c_bool))  # E: dtype[bool_]
+reveal_type(np.dtype(ct.c_char))  # E: dtype[bytes_]
+reveal_type(np.dtype(ct.py_object))  # E: dtype[object_]
+
+# Special case for None
+reveal_type(np.dtype(None))  # E: dtype[{double}]
+
+# Dtypes of dtypes
+reveal_type(np.dtype(np.dtype(np.float64)))  # E: dtype[{float64}]
+
+# Parameterized dtypes
+reveal_type(np.dtype("S8"))  # E: dtype
+
+# Void
+reveal_type(np.dtype(("U", 10)))  # E: dtype[void]
+
+# Methods and attributes
+reveal_type(dtype_U.base)  # E: dtype[Any]
+reveal_type(dtype_U.subdtype)  # E: Union[None, Tuple[dtype[Any], builtins.tuple[builtins.int]]]
+reveal_type(dtype_U.newbyteorder())  # E: dtype[str_]
+reveal_type(dtype_U.type)  # E: Type[str_]
+reveal_type(dtype_U.name)  # E: str
+reveal_type(dtype_U.names)  # E: Union[None, builtins.tuple[builtins.str]]
+
+reveal_type(dtype_U * 0)  # E: dtype[str_]
+reveal_type(dtype_U * 1)  # E: dtype[str_]
+reveal_type(dtype_U * 2)  # E: dtype[str_]
+
+reveal_type(dtype_i8 * 0)  # E: dtype[void]
+reveal_type(dtype_i8 * 1)  # E: dtype[{int64}]
+reveal_type(dtype_i8 * 2)  # E: dtype[void]
+
+reveal_type(0 * dtype_U)  # E: dtype[str_]
+reveal_type(1 * dtype_U)  # E: dtype[str_]
+reveal_type(2 * dtype_U)  # E: dtype[str_]
+
+reveal_type(0 * dtype_i8)  # E: dtype[Any]
+reveal_type(1 * dtype_i8)  # E: dtype[Any]
+reveal_type(2 * dtype_i8)  # E: dtype[Any]
+
+reveal_type(dtype_V["f0"])  # E: dtype[Any]
+reveal_type(dtype_V[0])  # E: dtype[Any]
+reveal_type(dtype_V[["f0", "f1"]])  # E: dtype[void]
+reveal_type(dtype_V[["f0"]])  # E: dtype[void]
diff --git a/numpy/typing/tests/data/reveal/einsumfunc.py b/numpy/typing/tests/data/reveal/einsumfunc.py
deleted file mode 100644 (file)
index f1a9042..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-from typing import List, Any
-import numpy as np
-
-AR_LIKE_b: List[bool]
-AR_LIKE_u: List[np.uint32]
-AR_LIKE_i: List[int]
-AR_LIKE_f: List[float]
-AR_LIKE_c: List[complex]
-AR_LIKE_U: List[str]
-
-OUT_f: np.ndarray[Any, np.dtype[np.float64]]
-
-reveal_type(np.einsum("i,i->i", AR_LIKE_b, AR_LIKE_b))  # E: Any
-reveal_type(np.einsum("i,i->i", AR_LIKE_u, AR_LIKE_u))  # E: Any
-reveal_type(np.einsum("i,i->i", AR_LIKE_i, AR_LIKE_i))  # E: Any
-reveal_type(np.einsum("i,i->i", AR_LIKE_f, AR_LIKE_f))  # E: Any
-reveal_type(np.einsum("i,i->i", AR_LIKE_c, AR_LIKE_c))  # E: Any
-reveal_type(np.einsum("i,i->i", AR_LIKE_b, AR_LIKE_i))  # E: Any
-reveal_type(np.einsum("i,i,i,i->i", AR_LIKE_b, AR_LIKE_u, AR_LIKE_i, AR_LIKE_c))  # E: Any
-
-reveal_type(np.einsum("i,i->i", AR_LIKE_c, AR_LIKE_c, out=OUT_f))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]
-reveal_type(np.einsum("i,i->i", AR_LIKE_U, AR_LIKE_U, dtype=bool, casting="unsafe", out=OUT_f))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]
-reveal_type(np.einsum("i,i->i", AR_LIKE_f, AR_LIKE_f, dtype="c16"))  # E: Any
-reveal_type(np.einsum("i,i->i", AR_LIKE_U, AR_LIKE_U, dtype=bool, casting="unsafe"))  # E: Any
-
-reveal_type(np.einsum_path("i,i->i", AR_LIKE_b, AR_LIKE_b))  # E: Tuple[builtins.list[Any], builtins.str]
-reveal_type(np.einsum_path("i,i->i", AR_LIKE_u, AR_LIKE_u))  # E: Tuple[builtins.list[Any], builtins.str]
-reveal_type(np.einsum_path("i,i->i", AR_LIKE_i, AR_LIKE_i))  # E: Tuple[builtins.list[Any], builtins.str]
-reveal_type(np.einsum_path("i,i->i", AR_LIKE_f, AR_LIKE_f))  # E: Tuple[builtins.list[Any], builtins.str]
-reveal_type(np.einsum_path("i,i->i", AR_LIKE_c, AR_LIKE_c))  # E: Tuple[builtins.list[Any], builtins.str]
-reveal_type(np.einsum_path("i,i->i", AR_LIKE_b, AR_LIKE_i))  # E: Tuple[builtins.list[Any], builtins.str]
-reveal_type(np.einsum_path("i,i,i,i->i", AR_LIKE_b, AR_LIKE_u, AR_LIKE_i, AR_LIKE_c))  # E: Tuple[builtins.list[Any], builtins.str]
diff --git a/numpy/typing/tests/data/reveal/einsumfunc.pyi b/numpy/typing/tests/data/reveal/einsumfunc.pyi
new file mode 100644 (file)
index 0000000..5b07e6d
--- /dev/null
@@ -0,0 +1,32 @@
+from typing import List, Any
+import numpy as np
+
+AR_LIKE_b: List[bool]
+AR_LIKE_u: List[np.uint32]
+AR_LIKE_i: List[int]
+AR_LIKE_f: List[float]
+AR_LIKE_c: List[complex]
+AR_LIKE_U: List[str]
+
+OUT_f: np.ndarray[Any, np.dtype[np.float64]]
+
+reveal_type(np.einsum("i,i->i", AR_LIKE_b, AR_LIKE_b))  # E: Any
+reveal_type(np.einsum("i,i->i", AR_LIKE_u, AR_LIKE_u))  # E: Any
+reveal_type(np.einsum("i,i->i", AR_LIKE_i, AR_LIKE_i))  # E: Any
+reveal_type(np.einsum("i,i->i", AR_LIKE_f, AR_LIKE_f))  # E: Any
+reveal_type(np.einsum("i,i->i", AR_LIKE_c, AR_LIKE_c))  # E: Any
+reveal_type(np.einsum("i,i->i", AR_LIKE_b, AR_LIKE_i))  # E: Any
+reveal_type(np.einsum("i,i,i,i->i", AR_LIKE_b, AR_LIKE_u, AR_LIKE_i, AR_LIKE_c))  # E: Any
+
+reveal_type(np.einsum("i,i->i", AR_LIKE_c, AR_LIKE_c, out=OUT_f))  # E: ndarray[Any, dtype[{float64}]
+reveal_type(np.einsum("i,i->i", AR_LIKE_U, AR_LIKE_U, dtype=bool, casting="unsafe", out=OUT_f))  # E: ndarray[Any, dtype[{float64}]
+reveal_type(np.einsum("i,i->i", AR_LIKE_f, AR_LIKE_f, dtype="c16"))  # E: Any
+reveal_type(np.einsum("i,i->i", AR_LIKE_U, AR_LIKE_U, dtype=bool, casting="unsafe"))  # E: Any
+
+reveal_type(np.einsum_path("i,i->i", AR_LIKE_b, AR_LIKE_b))  # E: Tuple[builtins.list[Any], builtins.str]
+reveal_type(np.einsum_path("i,i->i", AR_LIKE_u, AR_LIKE_u))  # E: Tuple[builtins.list[Any], builtins.str]
+reveal_type(np.einsum_path("i,i->i", AR_LIKE_i, AR_LIKE_i))  # E: Tuple[builtins.list[Any], builtins.str]
+reveal_type(np.einsum_path("i,i->i", AR_LIKE_f, AR_LIKE_f))  # E: Tuple[builtins.list[Any], builtins.str]
+reveal_type(np.einsum_path("i,i->i", AR_LIKE_c, AR_LIKE_c))  # E: Tuple[builtins.list[Any], builtins.str]
+reveal_type(np.einsum_path("i,i->i", AR_LIKE_b, AR_LIKE_i))  # E: Tuple[builtins.list[Any], builtins.str]
+reveal_type(np.einsum_path("i,i,i,i->i", AR_LIKE_b, AR_LIKE_u, AR_LIKE_i, AR_LIKE_c))  # E: Tuple[builtins.list[Any], builtins.str]
diff --git a/numpy/typing/tests/data/reveal/fft.pyi b/numpy/typing/tests/data/reveal/fft.pyi
new file mode 100644 (file)
index 0000000..0667938
--- /dev/null
@@ -0,0 +1,35 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_f8: npt.NDArray[np.float64]
+AR_c16: npt.NDArray[np.complex128]
+AR_LIKE_f8: list[float]
+
+reveal_type(np.fft.fftshift(AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.fft.fftshift(AR_LIKE_f8, axes=0))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.fft.ifftshift(AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.fft.ifftshift(AR_LIKE_f8, axes=0))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.fft.fftfreq(5, AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.fft.fftfreq(np.int64(), AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+
+reveal_type(np.fft.fftfreq(5, AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.fft.fftfreq(np.int64(), AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+
+reveal_type(np.fft.fft(AR_f8))  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(np.fft.ifft(AR_f8, axis=1))  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(np.fft.rfft(AR_f8, n=None))  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(np.fft.irfft(AR_f8, norm="ortho"))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.fft.hfft(AR_f8, n=2))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.fft.ihfft(AR_f8))  # E: ndarray[Any, dtype[{complex128}]]
+
+reveal_type(np.fft.fftn(AR_f8))  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(np.fft.ifftn(AR_f8))  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(np.fft.rfftn(AR_f8))  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(np.fft.irfftn(AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.fft.rfft2(AR_f8))  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(np.fft.ifft2(AR_f8))  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(np.fft.fft2(AR_f8))  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(np.fft.irfft2(AR_f8))  # E: ndarray[Any, dtype[{float64}]]
diff --git a/numpy/typing/tests/data/reveal/flatiter.py b/numpy/typing/tests/data/reveal/flatiter.py
deleted file mode 100644 (file)
index 97776dd..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-from typing import Any
-import numpy as np
-
-a: np.flatiter[np.ndarray[Any, np.dtype[np.str_]]]
-
-reveal_type(a.base)  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-reveal_type(a.copy())  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-reveal_type(a.coords)  # E: tuple[builtins.int]
-reveal_type(a.index)  # E: int
-reveal_type(iter(a))  # E: Iterator[numpy.str_]
-reveal_type(next(a))  # E: numpy.str_
-reveal_type(a[0])  # E: numpy.str_
-reveal_type(a[[0, 1, 2]])  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-reveal_type(a[...])  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-reveal_type(a[:])  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-reveal_type(a.__array__())  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-reveal_type(a.__array__(np.dtype(np.float64)))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
diff --git a/numpy/typing/tests/data/reveal/flatiter.pyi b/numpy/typing/tests/data/reveal/flatiter.pyi
new file mode 100644 (file)
index 0000000..ef89acb
--- /dev/null
@@ -0,0 +1,17 @@
+from typing import Any
+import numpy as np
+
+a: np.flatiter[np.ndarray[Any, np.dtype[np.str_]]]
+
+reveal_type(a.base)  # E: ndarray[Any, dtype[str_]]
+reveal_type(a.copy())  # E: ndarray[Any, dtype[str_]]
+reveal_type(a.coords)  # E: tuple[builtins.int]
+reveal_type(a.index)  # E: int
+reveal_type(iter(a))  # E: Iterator[str_]
+reveal_type(next(a))  # E: str_
+reveal_type(a[0])  # E: str_
+reveal_type(a[[0, 1, 2]])  # E: ndarray[Any, dtype[str_]]
+reveal_type(a[...])  # E: ndarray[Any, dtype[str_]]
+reveal_type(a[:])  # E: ndarray[Any, dtype[str_]]
+reveal_type(a.__array__())  # E: ndarray[Any, dtype[str_]]
+reveal_type(a.__array__(np.dtype(np.float64)))  # E: ndarray[Any, dtype[{float64}]]
diff --git a/numpy/typing/tests/data/reveal/fromnumeric.py b/numpy/typing/tests/data/reveal/fromnumeric.py
deleted file mode 100644 (file)
index bbcfbb8..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-"""Tests for :mod:`numpy.core.fromnumeric`."""
-
-import numpy as np
-
-A = np.array(True, ndmin=2, dtype=bool)
-B = np.array(1.0, ndmin=2, dtype=np.float32)
-A.setflags(write=False)
-B.setflags(write=False)
-
-a = np.bool_(True)
-b = np.float32(1.0)
-c = 1.0
-d = np.array(1.0, dtype=np.float32)  # writeable
-
-reveal_type(np.take(a, 0))  # E: Any
-reveal_type(np.take(b, 0))  # E: Any
-reveal_type(np.take(c, 0))  # E: Any
-reveal_type(np.take(A, 0))  # E: Any
-reveal_type(np.take(B, 0))  # E: Any
-reveal_type(np.take(A, [0]))  # E: Any
-reveal_type(np.take(B, [0]))  # E: Any
-
-reveal_type(np.reshape(a, 1))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.reshape(b, 1))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.reshape(c, 1))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.reshape(A, 1))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.reshape(B, 1))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.choose(a, [True, True]))  # E: Any
-reveal_type(np.choose(A, [True, True]))  # E: Any
-
-reveal_type(np.repeat(a, 1))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.repeat(b, 1))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.repeat(c, 1))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.repeat(A, 1))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.repeat(B, 1))  # E: numpy.ndarray[Any, Any]
-
-# TODO: Add tests for np.put()
-
-reveal_type(np.swapaxes(A, 0, 0))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.swapaxes(B, 0, 0))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.transpose(a))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.transpose(b))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.transpose(c))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.transpose(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.transpose(B))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.partition(a, 0, axis=None))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.partition(b, 0, axis=None))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.partition(c, 0, axis=None))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.partition(A, 0))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.partition(B, 0))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.argpartition(a, 0))  # E: Any
-reveal_type(np.argpartition(b, 0))  # E: Any
-reveal_type(np.argpartition(c, 0))  # E: Any
-reveal_type(np.argpartition(A, 0))  # E: Any
-reveal_type(np.argpartition(B, 0))  # E: Any
-
-reveal_type(np.sort(A, 0))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.sort(B, 0))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.argsort(A, 0))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.argsort(B, 0))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.argmax(A))  # E: {intp}
-reveal_type(np.argmax(B))  # E: {intp}
-reveal_type(np.argmax(A, axis=0))  # E: Any
-reveal_type(np.argmax(B, axis=0))  # E: Any
-
-reveal_type(np.argmin(A))  # E: {intp}
-reveal_type(np.argmin(B))  # E: {intp}
-reveal_type(np.argmin(A, axis=0))  # E: Any
-reveal_type(np.argmin(B, axis=0))  # E: Any
-
-reveal_type(np.searchsorted(A[0], 0))  # E: {intp}
-reveal_type(np.searchsorted(B[0], 0))  # E: {intp}
-reveal_type(np.searchsorted(A[0], [0]))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.searchsorted(B[0], [0]))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.resize(a, (5, 5)))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.resize(b, (5, 5)))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.resize(c, (5, 5)))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.resize(A, (5, 5)))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.resize(B, (5, 5)))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.squeeze(a))  # E: numpy.bool_
-reveal_type(np.squeeze(b))  # E: {float32}
-reveal_type(np.squeeze(c))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.squeeze(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.squeeze(B))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.diagonal(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.diagonal(B))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.trace(A))  # E: Any
-reveal_type(np.trace(B))  # E: Any
-
-reveal_type(np.ravel(a))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.ravel(b))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.ravel(c))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.ravel(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.ravel(B))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.nonzero(a))  # E: tuple[numpy.ndarray[Any, Any]]
-reveal_type(np.nonzero(b))  # E: tuple[numpy.ndarray[Any, Any]]
-reveal_type(np.nonzero(c))  # E: tuple[numpy.ndarray[Any, Any]]
-reveal_type(np.nonzero(A))  # E: tuple[numpy.ndarray[Any, Any]]
-reveal_type(np.nonzero(B))  # E: tuple[numpy.ndarray[Any, Any]]
-
-reveal_type(np.shape(a))  # E: tuple[builtins.int]
-reveal_type(np.shape(b))  # E: tuple[builtins.int]
-reveal_type(np.shape(c))  # E: tuple[builtins.int]
-reveal_type(np.shape(A))  # E: tuple[builtins.int]
-reveal_type(np.shape(B))  # E: tuple[builtins.int]
-
-reveal_type(np.compress([True], a))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.compress([True], b))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.compress([True], c))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.compress([True], A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.compress([True], B))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.clip(a, 0, 1.0))  # E: Any
-reveal_type(np.clip(b, -1, 1))  # E: Any
-reveal_type(np.clip(c, 0, 1))  # E: Any
-reveal_type(np.clip(A, 0, 1))  # E: Any
-reveal_type(np.clip(B, 0, 1))  # E: Any
-
-reveal_type(np.sum(a))  # E: Any
-reveal_type(np.sum(b))  # E: Any
-reveal_type(np.sum(c))  # E: Any
-reveal_type(np.sum(A))  # E: Any
-reveal_type(np.sum(B))  # E: Any
-reveal_type(np.sum(A, axis=0))  # E: Any
-reveal_type(np.sum(B, axis=0))  # E: Any
-
-reveal_type(np.all(a))  # E: numpy.bool_
-reveal_type(np.all(b))  # E: numpy.bool_
-reveal_type(np.all(c))  # E: numpy.bool_
-reveal_type(np.all(A))  # E: numpy.bool_
-reveal_type(np.all(B))  # E: numpy.bool_
-reveal_type(np.all(A, axis=0))  # E: Any
-reveal_type(np.all(B, axis=0))  # E: Any
-reveal_type(np.all(A, keepdims=True))  # E: Any
-reveal_type(np.all(B, keepdims=True))  # E: Any
-
-reveal_type(np.any(a))  # E: numpy.bool_
-reveal_type(np.any(b))  # E: numpy.bool_
-reveal_type(np.any(c))  # E: numpy.bool_
-reveal_type(np.any(A))  # E: numpy.bool_
-reveal_type(np.any(B))  # E: numpy.bool_
-reveal_type(np.any(A, axis=0))  # E: Any
-reveal_type(np.any(B, axis=0))  # E: Any
-reveal_type(np.any(A, keepdims=True))  # E: Any
-reveal_type(np.any(B, keepdims=True))  # E: Any
-
-reveal_type(np.cumsum(a))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.cumsum(b))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.cumsum(c))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.cumsum(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.cumsum(B))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.ptp(a))  # E: Any
-reveal_type(np.ptp(b))  # E: Any
-reveal_type(np.ptp(c))  # E: Any
-reveal_type(np.ptp(A))  # E: Any
-reveal_type(np.ptp(B))  # E: Any
-reveal_type(np.ptp(A, axis=0))  # E: Any
-reveal_type(np.ptp(B, axis=0))  # E: Any
-reveal_type(np.ptp(A, keepdims=True))  # E: Any
-reveal_type(np.ptp(B, keepdims=True))  # E: Any
-
-reveal_type(np.amax(a))  # E: Any
-reveal_type(np.amax(b))  # E: Any
-reveal_type(np.amax(c))  # E: Any
-reveal_type(np.amax(A))  # E: Any
-reveal_type(np.amax(B))  # E: Any
-reveal_type(np.amax(A, axis=0))  # E: Any
-reveal_type(np.amax(B, axis=0))  # E: Any
-reveal_type(np.amax(A, keepdims=True))  # E: Any
-reveal_type(np.amax(B, keepdims=True))  # E: Any
-
-reveal_type(np.amin(a))  # E: Any
-reveal_type(np.amin(b))  # E: Any
-reveal_type(np.amin(c))  # E: Any
-reveal_type(np.amin(A))  # E: Any
-reveal_type(np.amin(B))  # E: Any
-reveal_type(np.amin(A, axis=0))  # E: Any
-reveal_type(np.amin(B, axis=0))  # E: Any
-reveal_type(np.amin(A, keepdims=True))  # E: Any
-reveal_type(np.amin(B, keepdims=True))  # E: Any
-
-reveal_type(np.prod(a))  # E: Any
-reveal_type(np.prod(b))  # E: Any
-reveal_type(np.prod(c))  # E: Any
-reveal_type(np.prod(A))  # E: Any
-reveal_type(np.prod(B))  # E: Any
-reveal_type(np.prod(A, axis=0))  # E: Any
-reveal_type(np.prod(B, axis=0))  # E: Any
-reveal_type(np.prod(A, keepdims=True))  # E: Any
-reveal_type(np.prod(B, keepdims=True))  # E: Any
-reveal_type(np.prod(b, out=d))  # E: Any
-reveal_type(np.prod(B, out=d))  # E: Any
-
-reveal_type(np.cumprod(a))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.cumprod(b))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.cumprod(c))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.cumprod(A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.cumprod(B))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.ndim(a))  # E: int
-reveal_type(np.ndim(b))  # E: int
-reveal_type(np.ndim(c))  # E: int
-reveal_type(np.ndim(A))  # E: int
-reveal_type(np.ndim(B))  # E: int
-
-reveal_type(np.size(a))  # E: int
-reveal_type(np.size(b))  # E: int
-reveal_type(np.size(c))  # E: int
-reveal_type(np.size(A))  # E: int
-reveal_type(np.size(B))  # E: int
-
-reveal_type(np.around(a))  # E: Any
-reveal_type(np.around(b))  # E: Any
-reveal_type(np.around(c))  # E: Any
-reveal_type(np.around(A))  # E: Any
-reveal_type(np.around(B))  # E: Any
-
-reveal_type(np.mean(a))  # E: Any
-reveal_type(np.mean(b))  # E: Any
-reveal_type(np.mean(c))  # E: Any
-reveal_type(np.mean(A))  # E: Any
-reveal_type(np.mean(B))  # E: Any
-reveal_type(np.mean(A, axis=0))  # E: Any
-reveal_type(np.mean(B, axis=0))  # E: Any
-reveal_type(np.mean(A, keepdims=True))  # E: Any
-reveal_type(np.mean(B, keepdims=True))  # E: Any
-reveal_type(np.mean(b, out=d))  # E: Any
-reveal_type(np.mean(B, out=d))  # E: Any
-
-reveal_type(np.std(a))  # E: Any
-reveal_type(np.std(b))  # E: Any
-reveal_type(np.std(c))  # E: Any
-reveal_type(np.std(A))  # E: Any
-reveal_type(np.std(B))  # E: Any
-reveal_type(np.std(A, axis=0))  # E: Any
-reveal_type(np.std(B, axis=0))  # E: Any
-reveal_type(np.std(A, keepdims=True))  # E: Any
-reveal_type(np.std(B, keepdims=True))  # E: Any
-reveal_type(np.std(b, out=d))  # E: Any
-reveal_type(np.std(B, out=d))  # E: Any
-
-reveal_type(np.var(a))  # E: Any
-reveal_type(np.var(b))  # E: Any
-reveal_type(np.var(c))  # E: Any
-reveal_type(np.var(A))  # E: Any
-reveal_type(np.var(B))  # E: Any
-reveal_type(np.var(A, axis=0))  # E: Any
-reveal_type(np.var(B, axis=0))  # E: Any
-reveal_type(np.var(A, keepdims=True))  # E: Any
-reveal_type(np.var(B, keepdims=True))  # E: Any
-reveal_type(np.var(b, out=d))  # E: Any
-reveal_type(np.var(B, out=d))  # E: Any
diff --git a/numpy/typing/tests/data/reveal/fromnumeric.pyi b/numpy/typing/tests/data/reveal/fromnumeric.pyi
new file mode 100644 (file)
index 0000000..2ee1952
--- /dev/null
@@ -0,0 +1,264 @@
+"""Tests for :mod:`core.fromnumeric`."""
+
+import numpy as np
+
+A = np.array(True, ndmin=2, dtype=bool)
+B = np.array(1.0, ndmin=2, dtype=np.float32)
+A.setflags(write=False)
+B.setflags(write=False)
+
+a = np.bool_(True)
+b = np.float32(1.0)
+c = 1.0
+d = np.array(1.0, dtype=np.float32)  # writeable
+
+reveal_type(np.take(a, 0))  # E: Any
+reveal_type(np.take(b, 0))  # E: Any
+reveal_type(np.take(c, 0))  # E: Any
+reveal_type(np.take(A, 0))  # E: Any
+reveal_type(np.take(B, 0))  # E: Any
+reveal_type(np.take(A, [0]))  # E: Any
+reveal_type(np.take(B, [0]))  # E: Any
+
+reveal_type(np.reshape(a, 1))  # E: ndarray[Any, Any]
+reveal_type(np.reshape(b, 1))  # E: ndarray[Any, Any]
+reveal_type(np.reshape(c, 1))  # E: ndarray[Any, Any]
+reveal_type(np.reshape(A, 1))  # E: ndarray[Any, Any]
+reveal_type(np.reshape(B, 1))  # E: ndarray[Any, Any]
+
+reveal_type(np.choose(a, [True, True]))  # E: Any
+reveal_type(np.choose(A, [True, True]))  # E: Any
+
+reveal_type(np.repeat(a, 1))  # E: ndarray[Any, Any]
+reveal_type(np.repeat(b, 1))  # E: ndarray[Any, Any]
+reveal_type(np.repeat(c, 1))  # E: ndarray[Any, Any]
+reveal_type(np.repeat(A, 1))  # E: ndarray[Any, Any]
+reveal_type(np.repeat(B, 1))  # E: ndarray[Any, Any]
+
+# TODO: Add tests for np.put()
+
+reveal_type(np.swapaxes(A, 0, 0))  # E: ndarray[Any, Any]
+reveal_type(np.swapaxes(B, 0, 0))  # E: ndarray[Any, Any]
+
+reveal_type(np.transpose(a))  # E: ndarray[Any, Any]
+reveal_type(np.transpose(b))  # E: ndarray[Any, Any]
+reveal_type(np.transpose(c))  # E: ndarray[Any, Any]
+reveal_type(np.transpose(A))  # E: ndarray[Any, Any]
+reveal_type(np.transpose(B))  # E: ndarray[Any, Any]
+
+reveal_type(np.partition(a, 0, axis=None))  # E: ndarray[Any, Any]
+reveal_type(np.partition(b, 0, axis=None))  # E: ndarray[Any, Any]
+reveal_type(np.partition(c, 0, axis=None))  # E: ndarray[Any, Any]
+reveal_type(np.partition(A, 0))  # E: ndarray[Any, Any]
+reveal_type(np.partition(B, 0))  # E: ndarray[Any, Any]
+
+reveal_type(np.argpartition(a, 0))  # E: Any
+reveal_type(np.argpartition(b, 0))  # E: Any
+reveal_type(np.argpartition(c, 0))  # E: Any
+reveal_type(np.argpartition(A, 0))  # E: Any
+reveal_type(np.argpartition(B, 0))  # E: Any
+
+reveal_type(np.sort(A, 0))  # E: ndarray[Any, Any]
+reveal_type(np.sort(B, 0))  # E: ndarray[Any, Any]
+
+reveal_type(np.argsort(A, 0))  # E: ndarray[Any, Any]
+reveal_type(np.argsort(B, 0))  # E: ndarray[Any, Any]
+
+reveal_type(np.argmax(A))  # E: {intp}
+reveal_type(np.argmax(B))  # E: {intp}
+reveal_type(np.argmax(A, axis=0))  # E: Any
+reveal_type(np.argmax(B, axis=0))  # E: Any
+
+reveal_type(np.argmin(A))  # E: {intp}
+reveal_type(np.argmin(B))  # E: {intp}
+reveal_type(np.argmin(A, axis=0))  # E: Any
+reveal_type(np.argmin(B, axis=0))  # E: Any
+
+reveal_type(np.searchsorted(A[0], 0))  # E: {intp}
+reveal_type(np.searchsorted(B[0], 0))  # E: {intp}
+reveal_type(np.searchsorted(A[0], [0]))  # E: ndarray[Any, Any]
+reveal_type(np.searchsorted(B[0], [0]))  # E: ndarray[Any, Any]
+
+reveal_type(np.resize(a, (5, 5)))  # E: ndarray[Any, Any]
+reveal_type(np.resize(b, (5, 5)))  # E: ndarray[Any, Any]
+reveal_type(np.resize(c, (5, 5)))  # E: ndarray[Any, Any]
+reveal_type(np.resize(A, (5, 5)))  # E: ndarray[Any, Any]
+reveal_type(np.resize(B, (5, 5)))  # E: ndarray[Any, Any]
+
+reveal_type(np.squeeze(a))  # E: bool_
+reveal_type(np.squeeze(b))  # E: {float32}
+reveal_type(np.squeeze(c))  # E: ndarray[Any, Any]
+reveal_type(np.squeeze(A))  # E: ndarray[Any, Any]
+reveal_type(np.squeeze(B))  # E: ndarray[Any, Any]
+
+reveal_type(np.diagonal(A))  # E: ndarray[Any, Any]
+reveal_type(np.diagonal(B))  # E: ndarray[Any, Any]
+
+reveal_type(np.trace(A))  # E: Any
+reveal_type(np.trace(B))  # E: Any
+
+reveal_type(np.ravel(a))  # E: ndarray[Any, Any]
+reveal_type(np.ravel(b))  # E: ndarray[Any, Any]
+reveal_type(np.ravel(c))  # E: ndarray[Any, Any]
+reveal_type(np.ravel(A))  # E: ndarray[Any, Any]
+reveal_type(np.ravel(B))  # E: ndarray[Any, Any]
+
+reveal_type(np.nonzero(a))  # E: tuple[ndarray[Any, Any]]
+reveal_type(np.nonzero(b))  # E: tuple[ndarray[Any, Any]]
+reveal_type(np.nonzero(c))  # E: tuple[ndarray[Any, Any]]
+reveal_type(np.nonzero(A))  # E: tuple[ndarray[Any, Any]]
+reveal_type(np.nonzero(B))  # E: tuple[ndarray[Any, Any]]
+
+reveal_type(np.shape(a))  # E: tuple[builtins.int]
+reveal_type(np.shape(b))  # E: tuple[builtins.int]
+reveal_type(np.shape(c))  # E: tuple[builtins.int]
+reveal_type(np.shape(A))  # E: tuple[builtins.int]
+reveal_type(np.shape(B))  # E: tuple[builtins.int]
+
+reveal_type(np.compress([True], a))  # E: ndarray[Any, Any]
+reveal_type(np.compress([True], b))  # E: ndarray[Any, Any]
+reveal_type(np.compress([True], c))  # E: ndarray[Any, Any]
+reveal_type(np.compress([True], A))  # E: ndarray[Any, Any]
+reveal_type(np.compress([True], B))  # E: ndarray[Any, Any]
+
+reveal_type(np.clip(a, 0, 1.0))  # E: Any
+reveal_type(np.clip(b, -1, 1))  # E: Any
+reveal_type(np.clip(c, 0, 1))  # E: Any
+reveal_type(np.clip(A, 0, 1))  # E: Any
+reveal_type(np.clip(B, 0, 1))  # E: Any
+
+reveal_type(np.sum(a))  # E: Any
+reveal_type(np.sum(b))  # E: Any
+reveal_type(np.sum(c))  # E: Any
+reveal_type(np.sum(A))  # E: Any
+reveal_type(np.sum(B))  # E: Any
+reveal_type(np.sum(A, axis=0))  # E: Any
+reveal_type(np.sum(B, axis=0))  # E: Any
+
+reveal_type(np.all(a))  # E: bool_
+reveal_type(np.all(b))  # E: bool_
+reveal_type(np.all(c))  # E: bool_
+reveal_type(np.all(A))  # E: bool_
+reveal_type(np.all(B))  # E: bool_
+reveal_type(np.all(A, axis=0))  # E: Any
+reveal_type(np.all(B, axis=0))  # E: Any
+reveal_type(np.all(A, keepdims=True))  # E: Any
+reveal_type(np.all(B, keepdims=True))  # E: Any
+
+reveal_type(np.any(a))  # E: bool_
+reveal_type(np.any(b))  # E: bool_
+reveal_type(np.any(c))  # E: bool_
+reveal_type(np.any(A))  # E: bool_
+reveal_type(np.any(B))  # E: bool_
+reveal_type(np.any(A, axis=0))  # E: Any
+reveal_type(np.any(B, axis=0))  # E: Any
+reveal_type(np.any(A, keepdims=True))  # E: Any
+reveal_type(np.any(B, keepdims=True))  # E: Any
+
+reveal_type(np.cumsum(a))  # E: ndarray[Any, Any]
+reveal_type(np.cumsum(b))  # E: ndarray[Any, Any]
+reveal_type(np.cumsum(c))  # E: ndarray[Any, Any]
+reveal_type(np.cumsum(A))  # E: ndarray[Any, Any]
+reveal_type(np.cumsum(B))  # E: ndarray[Any, Any]
+
+reveal_type(np.ptp(a))  # E: Any
+reveal_type(np.ptp(b))  # E: Any
+reveal_type(np.ptp(c))  # E: Any
+reveal_type(np.ptp(A))  # E: Any
+reveal_type(np.ptp(B))  # E: Any
+reveal_type(np.ptp(A, axis=0))  # E: Any
+reveal_type(np.ptp(B, axis=0))  # E: Any
+reveal_type(np.ptp(A, keepdims=True))  # E: Any
+reveal_type(np.ptp(B, keepdims=True))  # E: Any
+
+reveal_type(np.amax(a))  # E: Any
+reveal_type(np.amax(b))  # E: Any
+reveal_type(np.amax(c))  # E: Any
+reveal_type(np.amax(A))  # E: Any
+reveal_type(np.amax(B))  # E: Any
+reveal_type(np.amax(A, axis=0))  # E: Any
+reveal_type(np.amax(B, axis=0))  # E: Any
+reveal_type(np.amax(A, keepdims=True))  # E: Any
+reveal_type(np.amax(B, keepdims=True))  # E: Any
+
+reveal_type(np.amin(a))  # E: Any
+reveal_type(np.amin(b))  # E: Any
+reveal_type(np.amin(c))  # E: Any
+reveal_type(np.amin(A))  # E: Any
+reveal_type(np.amin(B))  # E: Any
+reveal_type(np.amin(A, axis=0))  # E: Any
+reveal_type(np.amin(B, axis=0))  # E: Any
+reveal_type(np.amin(A, keepdims=True))  # E: Any
+reveal_type(np.amin(B, keepdims=True))  # E: Any
+
+reveal_type(np.prod(a))  # E: Any
+reveal_type(np.prod(b))  # E: Any
+reveal_type(np.prod(c))  # E: Any
+reveal_type(np.prod(A))  # E: Any
+reveal_type(np.prod(B))  # E: Any
+reveal_type(np.prod(A, axis=0))  # E: Any
+reveal_type(np.prod(B, axis=0))  # E: Any
+reveal_type(np.prod(A, keepdims=True))  # E: Any
+reveal_type(np.prod(B, keepdims=True))  # E: Any
+reveal_type(np.prod(b, out=d))  # E: Any
+reveal_type(np.prod(B, out=d))  # E: Any
+
+reveal_type(np.cumprod(a))  # E: ndarray[Any, Any]
+reveal_type(np.cumprod(b))  # E: ndarray[Any, Any]
+reveal_type(np.cumprod(c))  # E: ndarray[Any, Any]
+reveal_type(np.cumprod(A))  # E: ndarray[Any, Any]
+reveal_type(np.cumprod(B))  # E: ndarray[Any, Any]
+
+reveal_type(np.ndim(a))  # E: int
+reveal_type(np.ndim(b))  # E: int
+reveal_type(np.ndim(c))  # E: int
+reveal_type(np.ndim(A))  # E: int
+reveal_type(np.ndim(B))  # E: int
+
+reveal_type(np.size(a))  # E: int
+reveal_type(np.size(b))  # E: int
+reveal_type(np.size(c))  # E: int
+reveal_type(np.size(A))  # E: int
+reveal_type(np.size(B))  # E: int
+
+reveal_type(np.around(a))  # E: Any
+reveal_type(np.around(b))  # E: Any
+reveal_type(np.around(c))  # E: Any
+reveal_type(np.around(A))  # E: Any
+reveal_type(np.around(B))  # E: Any
+
+reveal_type(np.mean(a))  # E: Any
+reveal_type(np.mean(b))  # E: Any
+reveal_type(np.mean(c))  # E: Any
+reveal_type(np.mean(A))  # E: Any
+reveal_type(np.mean(B))  # E: Any
+reveal_type(np.mean(A, axis=0))  # E: Any
+reveal_type(np.mean(B, axis=0))  # E: Any
+reveal_type(np.mean(A, keepdims=True))  # E: Any
+reveal_type(np.mean(B, keepdims=True))  # E: Any
+reveal_type(np.mean(b, out=d))  # E: Any
+reveal_type(np.mean(B, out=d))  # E: Any
+
+reveal_type(np.std(a))  # E: Any
+reveal_type(np.std(b))  # E: Any
+reveal_type(np.std(c))  # E: Any
+reveal_type(np.std(A))  # E: Any
+reveal_type(np.std(B))  # E: Any
+reveal_type(np.std(A, axis=0))  # E: Any
+reveal_type(np.std(B, axis=0))  # E: Any
+reveal_type(np.std(A, keepdims=True))  # E: Any
+reveal_type(np.std(B, keepdims=True))  # E: Any
+reveal_type(np.std(b, out=d))  # E: Any
+reveal_type(np.std(B, out=d))  # E: Any
+
+reveal_type(np.var(a))  # E: Any
+reveal_type(np.var(b))  # E: Any
+reveal_type(np.var(c))  # E: Any
+reveal_type(np.var(A))  # E: Any
+reveal_type(np.var(B))  # E: Any
+reveal_type(np.var(A, axis=0))  # E: Any
+reveal_type(np.var(B, axis=0))  # E: Any
+reveal_type(np.var(A, keepdims=True))  # E: Any
+reveal_type(np.var(B, keepdims=True))  # E: Any
+reveal_type(np.var(b, out=d))  # E: Any
+reveal_type(np.var(B, out=d))  # E: Any
diff --git a/numpy/typing/tests/data/reveal/getlimits.pyi b/numpy/typing/tests/data/reveal/getlimits.pyi
new file mode 100644 (file)
index 0000000..1614b57
--- /dev/null
@@ -0,0 +1,47 @@
+import numpy as np
+f: float
+f8: np.float64
+c8: np.complex64
+
+i: int
+i8: np.int64
+u4: np.uint32
+
+finfo_f8: np.finfo[np.float64]
+iinfo_i8: np.iinfo[np.int64]
+
+reveal_type(np.finfo(f))  # E: finfo[{double}]
+reveal_type(np.finfo(f8))  # E: finfo[{float64}]
+reveal_type(np.finfo(c8))  # E: finfo[{float32}]
+reveal_type(np.finfo('f2'))  # E: finfo[floating[Any]]
+
+reveal_type(finfo_f8.dtype)  # E: dtype[{float64}]
+reveal_type(finfo_f8.bits)  # E: int
+reveal_type(finfo_f8.eps)  # E: {float64}
+reveal_type(finfo_f8.epsneg)  # E: {float64}
+reveal_type(finfo_f8.iexp)  # E: int
+reveal_type(finfo_f8.machep)  # E: int
+reveal_type(finfo_f8.max)  # E: {float64}
+reveal_type(finfo_f8.maxexp)  # E: int
+reveal_type(finfo_f8.min)  # E: {float64}
+reveal_type(finfo_f8.minexp)  # E: int
+reveal_type(finfo_f8.negep)  # E: int
+reveal_type(finfo_f8.nexp)  # E: int
+reveal_type(finfo_f8.nmant)  # E: int
+reveal_type(finfo_f8.precision)  # E: int
+reveal_type(finfo_f8.resolution)  # E: {float64}
+reveal_type(finfo_f8.tiny)  # E: {float64}
+reveal_type(finfo_f8.smallest_normal)  # E: {float64}
+reveal_type(finfo_f8.smallest_subnormal)  # E: {float64}
+
+reveal_type(np.iinfo(i))  # E: iinfo[{int_}]
+reveal_type(np.iinfo(i8))  # E: iinfo[{int64}]
+reveal_type(np.iinfo(u4))  # E: iinfo[{uint32}]
+reveal_type(np.iinfo('i2'))  # E: iinfo[Any]
+
+reveal_type(iinfo_i8.dtype)  # E: dtype[{int64}]
+reveal_type(iinfo_i8.kind)  # E: str
+reveal_type(iinfo_i8.bits)  # E: int
+reveal_type(iinfo_i8.key)  # E: str
+reveal_type(iinfo_i8.min)  # E: int
+reveal_type(iinfo_i8.max)  # E: int
diff --git a/numpy/typing/tests/data/reveal/histograms.pyi b/numpy/typing/tests/data/reveal/histograms.pyi
new file mode 100644 (file)
index 0000000..d96e44f
--- /dev/null
@@ -0,0 +1,19 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_i8: npt.NDArray[np.int64]
+AR_f8: npt.NDArray[np.float64]
+
+reveal_type(np.histogram_bin_edges(AR_i8, bins="auto"))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.histogram_bin_edges(AR_i8, bins="rice", range=(0, 3)))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.histogram_bin_edges(AR_i8, bins="scott", weights=AR_f8))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.histogram(AR_i8, bins="auto"))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[Any]]]
+reveal_type(np.histogram(AR_i8, bins="rice", range=(0, 3)))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[Any]]]
+reveal_type(np.histogram(AR_i8, bins="scott", weights=AR_f8))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[Any]]]
+reveal_type(np.histogram(AR_f8, bins=1, density=True))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[Any]]]
+
+reveal_type(np.histogramdd(AR_i8, bins=[1]))  # E: Tuple[ndarray[Any, dtype[Any]], builtins.list[ndarray[Any, dtype[Any]]]]
+reveal_type(np.histogramdd(AR_i8, range=[(0, 3)]))  # E: Tuple[ndarray[Any, dtype[Any]], builtins.list[ndarray[Any, dtype[Any]]]]
+reveal_type(np.histogramdd(AR_i8, weights=AR_f8))  # E: Tuple[ndarray[Any, dtype[Any]], builtins.list[ndarray[Any, dtype[Any]]]]
+reveal_type(np.histogramdd(AR_f8, density=True))  # E: Tuple[ndarray[Any, dtype[Any]], builtins.list[ndarray[Any, dtype[Any]]]]
diff --git a/numpy/typing/tests/data/reveal/index_tricks.py b/numpy/typing/tests/data/reveal/index_tricks.py
deleted file mode 100644 (file)
index 863d602..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-from typing import Any, List
-import numpy as np
-
-AR_LIKE_b: List[bool]
-AR_LIKE_i: List[int]
-AR_LIKE_f: List[float]
-AR_LIKE_U: List[str]
-
-AR_i8: np.ndarray[Any, np.dtype[np.int64]]
-
-reveal_type(np.ndenumerate(AR_i8))  # E: numpy.ndenumerate[{int64}]
-reveal_type(np.ndenumerate(AR_LIKE_f))  # E: numpy.ndenumerate[{double}]
-reveal_type(np.ndenumerate(AR_LIKE_U))  # E: numpy.ndenumerate[numpy.str_]
-
-reveal_type(np.ndenumerate(AR_i8).iter)  # E: numpy.flatiter[numpy.ndarray[Any, numpy.dtype[{int64}]]]
-reveal_type(np.ndenumerate(AR_LIKE_f).iter)  # E: numpy.flatiter[numpy.ndarray[Any, numpy.dtype[{double}]]]
-reveal_type(np.ndenumerate(AR_LIKE_U).iter)  # E: numpy.flatiter[numpy.ndarray[Any, numpy.dtype[numpy.str_]]]
-
-reveal_type(next(np.ndenumerate(AR_i8)))  # E: Tuple[builtins.tuple[builtins.int], {int64}]
-reveal_type(next(np.ndenumerate(AR_LIKE_f)))  # E: Tuple[builtins.tuple[builtins.int], {double}]
-reveal_type(next(np.ndenumerate(AR_LIKE_U)))  # E: Tuple[builtins.tuple[builtins.int], numpy.str_]
-
-reveal_type(iter(np.ndenumerate(AR_i8)))  # E: Iterator[Tuple[builtins.tuple[builtins.int], {int64}]]
-reveal_type(iter(np.ndenumerate(AR_LIKE_f)))  # E: Iterator[Tuple[builtins.tuple[builtins.int], {double}]]
-reveal_type(iter(np.ndenumerate(AR_LIKE_U)))  # E: Iterator[Tuple[builtins.tuple[builtins.int], numpy.str_]]
-
-reveal_type(iter(np.ndindex(1, 2, 3)))  # E: Iterator[builtins.tuple[builtins.int]]
-reveal_type(next(np.ndindex(1, 2, 3)))  # E: builtins.tuple[builtins.int]
-
-reveal_type(np.unravel_index([22, 41, 37], (7, 6)))  # E: tuple[numpy.ndarray[Any, numpy.dtype[{intp}]]]
-reveal_type(np.unravel_index([31, 41, 13], (7, 6), order="F"))  # E: tuple[numpy.ndarray[Any, numpy.dtype[{intp}]]]
-reveal_type(np.unravel_index(1621, (6, 7, 8, 9)))  # E: tuple[{intp}]
-
-reveal_type(np.ravel_multi_index([[1]], (7, 6)))  # E: numpy.ndarray[Any, numpy.dtype[{intp}]]
-reveal_type(np.ravel_multi_index(AR_LIKE_i, (7, 6)))  # E: {intp}
-reveal_type(np.ravel_multi_index(AR_LIKE_i, (7, 6), order="F"))  # E: {intp}
-reveal_type(np.ravel_multi_index(AR_LIKE_i, (4, 6), mode="clip"))  # E: {intp}
-reveal_type(np.ravel_multi_index(AR_LIKE_i, (4, 4), mode=("clip", "wrap")))  # E: {intp}
-reveal_type(np.ravel_multi_index((3, 1, 4, 1), (6, 7, 8, 9)))  # E: {intp}
-
-reveal_type(np.mgrid[1:1:2])  # E: numpy.ndarray[Any, numpy.dtype[Any]]
-reveal_type(np.mgrid[1:1:2, None:10])  # E: numpy.ndarray[Any, numpy.dtype[Any]]
-
-reveal_type(np.ogrid[1:1:2])  # E: list[numpy.ndarray[Any, numpy.dtype[Any]]]
-reveal_type(np.ogrid[1:1:2, None:10])  # E: list[numpy.ndarray[Any, numpy.dtype[Any]]]
-
-reveal_type(np.index_exp[0:1])  # E: Tuple[builtins.slice]
-reveal_type(np.index_exp[0:1, None:3])  # E: Tuple[builtins.slice, builtins.slice]
-reveal_type(np.index_exp[0, 0:1, ..., [0, 1, 3]])  # E: Tuple[Literal[0]?, builtins.slice, builtins.ellipsis, builtins.list[builtins.int]]
-
-reveal_type(np.s_[0:1])  # E: builtins.slice
-reveal_type(np.s_[0:1, None:3])  # E: Tuple[builtins.slice, builtins.slice]
-reveal_type(np.s_[0, 0:1, ..., [0, 1, 3]])  # E: Tuple[Literal[0]?, builtins.slice, builtins.ellipsis, builtins.list[builtins.int]]
-
-reveal_type(np.ix_(AR_LIKE_b))  # E: tuple[numpy.ndarray[Any, numpy.dtype[numpy.bool_]]]
-reveal_type(np.ix_(AR_LIKE_i, AR_LIKE_f))  # E: tuple[numpy.ndarray[Any, numpy.dtype[{double}]]]
-reveal_type(np.ix_(AR_i8))  # E: tuple[numpy.ndarray[Any, numpy.dtype[{int64}]]]
-
-reveal_type(np.fill_diagonal(AR_i8, 5))  # E: None
-
-reveal_type(np.diag_indices(4))  # E: tuple[numpy.ndarray[Any, numpy.dtype[{int_}]]]
-reveal_type(np.diag_indices(2, 3))  # E: tuple[numpy.ndarray[Any, numpy.dtype[{int_}]]]
-
-reveal_type(np.diag_indices_from(AR_i8))  # E: tuple[numpy.ndarray[Any, numpy.dtype[{int_}]]]
diff --git a/numpy/typing/tests/data/reveal/index_tricks.pyi b/numpy/typing/tests/data/reveal/index_tricks.pyi
new file mode 100644 (file)
index 0000000..cee4d8c
--- /dev/null
@@ -0,0 +1,64 @@
+from typing import Any, List
+import numpy as np
+
+AR_LIKE_b: List[bool]
+AR_LIKE_i: List[int]
+AR_LIKE_f: List[float]
+AR_LIKE_U: List[str]
+
+AR_i8: np.ndarray[Any, np.dtype[np.int64]]
+
+reveal_type(np.ndenumerate(AR_i8))  # E: ndenumerate[{int64}]
+reveal_type(np.ndenumerate(AR_LIKE_f))  # E: ndenumerate[{double}]
+reveal_type(np.ndenumerate(AR_LIKE_U))  # E: ndenumerate[str_]
+
+reveal_type(np.ndenumerate(AR_i8).iter)  # E: flatiter[ndarray[Any, dtype[{int64}]]]
+reveal_type(np.ndenumerate(AR_LIKE_f).iter)  # E: flatiter[ndarray[Any, dtype[{double}]]]
+reveal_type(np.ndenumerate(AR_LIKE_U).iter)  # E: flatiter[ndarray[Any, dtype[str_]]]
+
+reveal_type(next(np.ndenumerate(AR_i8)))  # E: Tuple[builtins.tuple[builtins.int], {int64}]
+reveal_type(next(np.ndenumerate(AR_LIKE_f)))  # E: Tuple[builtins.tuple[builtins.int], {double}]
+reveal_type(next(np.ndenumerate(AR_LIKE_U)))  # E: Tuple[builtins.tuple[builtins.int], str_]
+
+reveal_type(iter(np.ndenumerate(AR_i8)))  # E: Iterator[Tuple[builtins.tuple[builtins.int], {int64}]]
+reveal_type(iter(np.ndenumerate(AR_LIKE_f)))  # E: Iterator[Tuple[builtins.tuple[builtins.int], {double}]]
+reveal_type(iter(np.ndenumerate(AR_LIKE_U)))  # E: Iterator[Tuple[builtins.tuple[builtins.int], str_]]
+
+reveal_type(iter(np.ndindex(1, 2, 3)))  # E: Iterator[builtins.tuple[builtins.int]]
+reveal_type(next(np.ndindex(1, 2, 3)))  # E: builtins.tuple[builtins.int]
+
+reveal_type(np.unravel_index([22, 41, 37], (7, 6)))  # E: tuple[ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unravel_index([31, 41, 13], (7, 6), order="F"))  # E: tuple[ndarray[Any, dtype[{intp}]]]
+reveal_type(np.unravel_index(1621, (6, 7, 8, 9)))  # E: tuple[{intp}]
+
+reveal_type(np.ravel_multi_index([[1]], (7, 6)))  # E: ndarray[Any, dtype[{intp}]]
+reveal_type(np.ravel_multi_index(AR_LIKE_i, (7, 6)))  # E: {intp}
+reveal_type(np.ravel_multi_index(AR_LIKE_i, (7, 6), order="F"))  # E: {intp}
+reveal_type(np.ravel_multi_index(AR_LIKE_i, (4, 6), mode="clip"))  # E: {intp}
+reveal_type(np.ravel_multi_index(AR_LIKE_i, (4, 4), mode=("clip", "wrap")))  # E: {intp}
+reveal_type(np.ravel_multi_index((3, 1, 4, 1), (6, 7, 8, 9)))  # E: {intp}
+
+reveal_type(np.mgrid[1:1:2])  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.mgrid[1:1:2, None:10])  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.ogrid[1:1:2])  # E: list[ndarray[Any, dtype[Any]]]
+reveal_type(np.ogrid[1:1:2, None:10])  # E: list[ndarray[Any, dtype[Any]]]
+
+reveal_type(np.index_exp[0:1])  # E: Tuple[builtins.slice]
+reveal_type(np.index_exp[0:1, None:3])  # E: Tuple[builtins.slice, builtins.slice]
+reveal_type(np.index_exp[0, 0:1, ..., [0, 1, 3]])  # E: Tuple[Literal[0]?, builtins.slice, builtins.ellipsis, builtins.list[builtins.int]]
+
+reveal_type(np.s_[0:1])  # E: builtins.slice
+reveal_type(np.s_[0:1, None:3])  # E: Tuple[builtins.slice, builtins.slice]
+reveal_type(np.s_[0, 0:1, ..., [0, 1, 3]])  # E: Tuple[Literal[0]?, builtins.slice, builtins.ellipsis, builtins.list[builtins.int]]
+
+reveal_type(np.ix_(AR_LIKE_b))  # E: tuple[ndarray[Any, dtype[bool_]]]
+reveal_type(np.ix_(AR_LIKE_i, AR_LIKE_f))  # E: tuple[ndarray[Any, dtype[{double}]]]
+reveal_type(np.ix_(AR_i8))  # E: tuple[ndarray[Any, dtype[{int64}]]]
+
+reveal_type(np.fill_diagonal(AR_i8, 5))  # E: None
+
+reveal_type(np.diag_indices(4))  # E: tuple[ndarray[Any, dtype[{int_}]]]
+reveal_type(np.diag_indices(2, 3))  # E: tuple[ndarray[Any, dtype[{int_}]]]
+
+reveal_type(np.diag_indices_from(AR_i8))  # E: tuple[ndarray[Any, dtype[{int_}]]]
diff --git a/numpy/typing/tests/data/reveal/lib_function_base.pyi b/numpy/typing/tests/data/reveal/lib_function_base.pyi
new file mode 100644 (file)
index 0000000..c559eb2
--- /dev/null
@@ -0,0 +1,180 @@
+from typing import Any
+
+import numpy as np
+import numpy.typing as npt
+
+vectorized_func: np.vectorize
+
+f8: np.float64
+AR_LIKE_f8: list[float]
+
+AR_i8: npt.NDArray[np.int64]
+AR_f8: npt.NDArray[np.float64]
+AR_c16: npt.NDArray[np.complex128]
+AR_m: npt.NDArray[np.timedelta64]
+AR_M: npt.NDArray[np.datetime64]
+AR_O: npt.NDArray[np.object_]
+AR_b: npt.NDArray[np.bool_]
+AR_U: npt.NDArray[np.str_]
+CHAR_AR_U: np.chararray[Any, np.dtype[np.str_]]
+
+def func(*args: Any, **kwargs: Any) -> Any: ...
+
+reveal_type(vectorized_func.pyfunc)  #  E: def (*Any, **Any) -> Any
+reveal_type(vectorized_func.cache)  # E: bool
+reveal_type(vectorized_func.signature)  # E: Union[None, builtins.str]
+reveal_type(vectorized_func.otypes)  # E: Union[None, builtins.str]
+reveal_type(vectorized_func.excluded)  # E: set[Union[builtins.int, builtins.str]]
+reveal_type(vectorized_func.__doc__)  # E: Union[None, builtins.str]
+reveal_type(vectorized_func([1]))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.vectorize(int))  # E: vectorize
+reveal_type(np.vectorize(  # E: vectorize
+    int, otypes="i", doc="doc", excluded=(), cache=True, signature=None
+))
+
+reveal_type(np.add_newdoc("__main__", "blabla", doc="test doc"))  # E: None
+reveal_type(np.add_newdoc("__main__", "blabla", doc=("meth", "test doc")))  # E: None
+reveal_type(np.add_newdoc("__main__", "blabla", doc=[("meth", "test doc")]))  # E: None
+
+reveal_type(np.rot90(AR_f8, k=2))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.rot90(AR_LIKE_f8, axes=(0, 1)))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.flip(f8))  # E: {float64}
+reveal_type(np.flip(1.0))  # E: Any
+reveal_type(np.flip(AR_f8, axis=(0, 1)))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.flip(AR_LIKE_f8, axis=0))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.iterable(1))  # E: bool
+reveal_type(np.iterable([1]))  # E: bool
+
+reveal_type(np.average(AR_f8))  # E: floating[Any]
+reveal_type(np.average(AR_f8, weights=AR_c16))  # E: complexfloating[Any, Any]
+reveal_type(np.average(AR_O))  # E: Any
+reveal_type(np.average(AR_f8, returned=True))  # E: Tuple[floating[Any], floating[Any]]
+reveal_type(np.average(AR_f8, weights=AR_c16, returned=True))  # E: Tuple[complexfloating[Any, Any], complexfloating[Any, Any]]
+reveal_type(np.average(AR_O, returned=True))  # E: Tuple[Any, Any]
+reveal_type(np.average(AR_f8, axis=0))  # E: Any
+reveal_type(np.average(AR_f8, axis=0, returned=True))  # E: Tuple[Any, Any]
+
+reveal_type(np.asarray_chkfinite(AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.asarray_chkfinite(AR_LIKE_f8))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.asarray_chkfinite(AR_f8, dtype=np.float64))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.asarray_chkfinite(AR_f8, dtype=float))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.piecewise(AR_f8, AR_b, [func]))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.piecewise(AR_LIKE_f8, AR_b, [func]))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.select([AR_f8], [AR_f8]))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.copy(AR_LIKE_f8))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.copy(AR_U))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.copy(CHAR_AR_U))  # E: ndarray[Any, Any]
+reveal_type(np.copy(CHAR_AR_U, "K", subok=True))  # E: chararray[Any, dtype[str_]]
+reveal_type(np.copy(CHAR_AR_U, subok=True))  # E: chararray[Any, dtype[str_]]
+
+reveal_type(np.gradient(AR_f8, axis=None))  # E: Any
+reveal_type(np.gradient(AR_LIKE_f8, edge_order=2))  # E: Any
+
+reveal_type(np.diff("bob", n=0))  # E: str
+reveal_type(np.diff(AR_f8, axis=0))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.diff(AR_LIKE_f8, prepend=1.5))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.angle(AR_f8))  # E: floating[Any]
+reveal_type(np.angle(AR_c16, deg=True))  # E: complexfloating[Any, Any]
+reveal_type(np.angle(AR_O))  # E: Any
+
+reveal_type(np.unwrap(AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.unwrap(AR_O))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.sort_complex(AR_f8))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+
+reveal_type(np.trim_zeros(AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.trim_zeros(AR_LIKE_f8))  # E: list[builtins.float]
+
+reveal_type(np.extract(AR_i8, AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.extract(AR_i8, AR_LIKE_f8))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.place(AR_f8, mask=AR_i8, vals=5.0))  # E: None
+
+reveal_type(np.disp(1, linefeed=True))  # E: None
+with open("test", "w") as f:
+    reveal_type(np.disp("message", device=f))  # E: None
+
+reveal_type(np.cov(AR_f8, bias=True))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.cov(AR_f8, AR_c16, ddof=1))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.cov(AR_f8, aweights=AR_f8, dtype=np.float32))  # E: ndarray[Any, dtype[{float32}]]
+reveal_type(np.cov(AR_f8, fweights=AR_f8, dtype=float))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.corrcoef(AR_f8, rowvar=True))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.corrcoef(AR_f8, AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.corrcoef(AR_f8, dtype=np.float32))  # E: ndarray[Any, dtype[{float32}]]
+reveal_type(np.corrcoef(AR_f8, dtype=float))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.blackman(5))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.bartlett(6))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.hanning(4.5))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.hamming(0))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.i0(AR_i8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.kaiser(4, 5.9))  # E: ndarray[Any, dtype[floating[Any]]]
+
+reveal_type(np.sinc(1.0))  # E: floating[Any]
+reveal_type(np.sinc(1j))  # E: complexfloating[Any, Any]
+reveal_type(np.sinc(AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.sinc(AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+
+reveal_type(np.msort(CHAR_AR_U))  # E: Any
+reveal_type(np.msort(AR_U))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.msort(AR_LIKE_f8))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.median(AR_f8, keepdims=False))  # E: floating[Any]
+reveal_type(np.median(AR_c16, overwrite_input=True))  # E: complexfloating[Any, Any]
+reveal_type(np.median(AR_m))  # E: timedelta64
+reveal_type(np.median(AR_O))  # E: Any
+reveal_type(np.median(AR_f8, keepdims=True))  # E: Any
+reveal_type(np.median(AR_c16, axis=0))  # E: Any
+reveal_type(np.median(AR_LIKE_f8, out=AR_c16))  # E: ndarray[Any, dtype[{complex128}]]
+
+reveal_type(np.add_newdoc_ufunc(np.add, "docstring"))  # E: None
+
+reveal_type(np.percentile(AR_f8, 50))  # E: floating[Any]
+reveal_type(np.percentile(AR_c16, 50))  # E: complexfloating[Any, Any]
+reveal_type(np.percentile(AR_m, 50))  # E: timedelta64
+reveal_type(np.percentile(AR_M, 50, overwrite_input=True))  # E: datetime64
+reveal_type(np.percentile(AR_O, 50))  # E: Any
+reveal_type(np.percentile(AR_f8, [50]))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.percentile(AR_c16, [50]))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.percentile(AR_m, [50]))  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(np.percentile(AR_M, [50], method="nearest"))  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(np.percentile(AR_O, [50]))  # E: ndarray[Any, dtype[object_]]
+reveal_type(np.percentile(AR_f8, [50], keepdims=True))  # E: Any
+reveal_type(np.percentile(AR_f8, [50], axis=[1]))  # E: Any
+reveal_type(np.percentile(AR_f8, [50], out=AR_c16))  # E: ndarray[Any, dtype[{complex128}]]
+
+reveal_type(np.quantile(AR_f8, 0.5))  # E: floating[Any]
+reveal_type(np.quantile(AR_c16, 0.5))  # E: complexfloating[Any, Any]
+reveal_type(np.quantile(AR_m, 0.5))  # E: timedelta64
+reveal_type(np.quantile(AR_M, 0.5, overwrite_input=True))  # E: datetime64
+reveal_type(np.quantile(AR_O, 0.5))  # E: Any
+reveal_type(np.quantile(AR_f8, [0.5]))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.quantile(AR_c16, [0.5]))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.quantile(AR_m, [0.5]))  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(np.quantile(AR_M, [0.5], method="nearest"))  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(np.quantile(AR_O, [0.5]))  # E: ndarray[Any, dtype[object_]]
+reveal_type(np.quantile(AR_f8, [0.5], keepdims=True))  # E: Any
+reveal_type(np.quantile(AR_f8, [0.5], axis=[1]))  # E: Any
+reveal_type(np.quantile(AR_f8, [0.5], out=AR_c16))  # E: ndarray[Any, dtype[{complex128}]]
+
+reveal_type(np.meshgrid(AR_f8, AR_i8, copy=False))  # E: list[ndarray[Any, dtype[Any]]]
+reveal_type(np.meshgrid(AR_f8, AR_i8, AR_c16, indexing="ij"))  # E: list[ndarray[Any, dtype[Any]]]
+
+reveal_type(np.delete(AR_f8, np.s_[:5]))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.delete(AR_LIKE_f8, [0, 4, 9], axis=0))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.insert(AR_f8, np.s_[:5], 5))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.insert(AR_LIKE_f8, [0, 4, 9], [0.5, 9.2, 7], axis=0))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.append(AR_f8, 5))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.append(AR_LIKE_f8, 1j, axis=0))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.digitize(4.5, [1]))  # E: {intp}
+reveal_type(np.digitize(AR_f8, [1, 2, 3]))  # E: ndarray[Any, dtype[{intp}]]
diff --git a/numpy/typing/tests/data/reveal/lib_polynomial.pyi b/numpy/typing/tests/data/reveal/lib_polynomial.pyi
new file mode 100644 (file)
index 0000000..de89507
--- /dev/null
@@ -0,0 +1,111 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_b: npt.NDArray[np.bool_]
+AR_u4: npt.NDArray[np.uint32]
+AR_i8: npt.NDArray[np.int64]
+AR_f8: npt.NDArray[np.float64]
+AR_c16: npt.NDArray[np.complex128]
+AR_O: npt.NDArray[np.object_]
+
+poly_obj: np.poly1d
+
+reveal_type(poly_obj.variable)  # E: str
+reveal_type(poly_obj.order)  # E: int
+reveal_type(poly_obj.o)  # E: int
+reveal_type(poly_obj.roots)  # E: ndarray[Any, dtype[Any]]
+reveal_type(poly_obj.r)  # E: ndarray[Any, dtype[Any]]
+reveal_type(poly_obj.coeffs)  # E: ndarray[Any, dtype[Any]]
+reveal_type(poly_obj.c)  # E: ndarray[Any, dtype[Any]]
+reveal_type(poly_obj.coef)  # E: ndarray[Any, dtype[Any]]
+reveal_type(poly_obj.coefficients)  # E: ndarray[Any, dtype[Any]]
+reveal_type(poly_obj.__hash__)  # E: None
+
+reveal_type(poly_obj(1))  # E: Any
+reveal_type(poly_obj([1]))  # E: ndarray[Any, dtype[Any]]
+reveal_type(poly_obj(poly_obj))  # E: poly1d
+
+reveal_type(len(poly_obj))  # E: int
+reveal_type(-poly_obj)  # E: poly1d
+reveal_type(+poly_obj)  # E: poly1d
+
+reveal_type(poly_obj * 5)  # E: poly1d
+reveal_type(5 * poly_obj)  # E: poly1d
+reveal_type(poly_obj + 5)  # E: poly1d
+reveal_type(5 + poly_obj)  # E: poly1d
+reveal_type(poly_obj - 5)  # E: poly1d
+reveal_type(5 - poly_obj)  # E: poly1d
+reveal_type(poly_obj**1)  # E: poly1d
+reveal_type(poly_obj**1.0)  # E: poly1d
+reveal_type(poly_obj / 5)  # E: poly1d
+reveal_type(5 / poly_obj)  # E: poly1d
+
+reveal_type(poly_obj[0])  # E: Any
+poly_obj[0] = 5
+reveal_type(iter(poly_obj))  # E: Iterator[Any]
+reveal_type(poly_obj.deriv())  # E: poly1d
+reveal_type(poly_obj.integ())  # E: poly1d
+
+reveal_type(np.poly(poly_obj))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.poly(AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.poly(AR_c16))  # E: ndarray[Any, dtype[floating[Any]]]
+
+reveal_type(np.polyint(poly_obj))  # E: poly1d
+reveal_type(np.polyint(AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.polyint(AR_f8, k=AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.polyint(AR_O, m=2))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.polyder(poly_obj))  # E: poly1d
+reveal_type(np.polyder(AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.polyder(AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.polyder(AR_O, m=2))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.polyfit(AR_f8, AR_f8, 2))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.polyfit(AR_f8, AR_i8, 1, full=True))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[signedinteger[typing._32Bit]]], ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{float64}]]]
+reveal_type(np.polyfit(AR_u4, AR_f8, 1.0, cov="unscaled"))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{float64}]]]
+reveal_type(np.polyfit(AR_c16, AR_f8, 2))  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(np.polyfit(AR_f8, AR_c16, 1, full=True))  # E: Tuple[ndarray[Any, dtype[{complex128}]], ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[signedinteger[typing._32Bit]]], ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{float64}]]]
+reveal_type(np.polyfit(AR_u4, AR_c16, 1.0, cov=True))  # E: Tuple[ndarray[Any, dtype[{complex128}]], ndarray[Any, dtype[{complex128}]]]
+
+reveal_type(np.polyval(AR_b, AR_b))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.polyval(AR_u4, AR_b))  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(np.polyval(AR_i8, AR_i8))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.polyval(AR_f8, AR_i8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.polyval(AR_i8, AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.polyval(AR_O, AR_O))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.polyadd(poly_obj, AR_i8))  # E: poly1d
+reveal_type(np.polyadd(AR_f8, poly_obj))  # E: poly1d
+reveal_type(np.polyadd(AR_b, AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.polyadd(AR_u4, AR_b))  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(np.polyadd(AR_i8, AR_i8))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.polyadd(AR_f8, AR_i8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.polyadd(AR_i8, AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.polyadd(AR_O, AR_O))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.polysub(poly_obj, AR_i8))  # E: poly1d
+reveal_type(np.polysub(AR_f8, poly_obj))  # E: poly1d
+reveal_type(np.polysub(AR_b, AR_b))  # E: <nothing>
+reveal_type(np.polysub(AR_u4, AR_b))  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(np.polysub(AR_i8, AR_i8))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.polysub(AR_f8, AR_i8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.polysub(AR_i8, AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.polysub(AR_O, AR_O))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.polymul(poly_obj, AR_i8))  # E: poly1d
+reveal_type(np.polymul(AR_f8, poly_obj))  # E: poly1d
+reveal_type(np.polymul(AR_b, AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.polymul(AR_u4, AR_b))  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(np.polymul(AR_i8, AR_i8))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.polymul(AR_f8, AR_i8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.polymul(AR_i8, AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.polymul(AR_O, AR_O))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.polydiv(poly_obj, AR_i8))  # E: poly1d
+reveal_type(np.polydiv(AR_f8, poly_obj))  # E: poly1d
+reveal_type(np.polydiv(AR_b, AR_b))  # E: Tuple[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]]]
+reveal_type(np.polydiv(AR_u4, AR_b))  # E: Tuple[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]]]
+reveal_type(np.polydiv(AR_i8, AR_i8))  # E: Tuple[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]]]
+reveal_type(np.polydiv(AR_f8, AR_i8))  # E: Tuple[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]]]
+reveal_type(np.polydiv(AR_i8, AR_c16))  # E: Tuple[ndarray[Any, dtype[complexfloating[Any, Any]]], ndarray[Any, dtype[complexfloating[Any, Any]]]]
+reveal_type(np.polydiv(AR_O, AR_O))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[Any]]]
diff --git a/numpy/typing/tests/data/reveal/lib_utils.py b/numpy/typing/tests/data/reveal/lib_utils.py
deleted file mode 100644 (file)
index d820127..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-from io import StringIO
-from typing import Any, Dict
-
-import numpy as np
-
-AR: np.ndarray[Any, np.dtype[np.float64]]
-AR_DICT: Dict[str, np.ndarray[Any, np.dtype[np.float64]]]
-FILE: StringIO
-
-def func(a: int) -> bool: ...
-
-reveal_type(np.deprecate(func))  # E: def (a: builtins.int) -> builtins.bool
-reveal_type(np.deprecate())  # E: _Deprecate
-
-reveal_type(np.deprecate_with_doc("test"))  # E: _Deprecate
-reveal_type(np.deprecate_with_doc(None))  # E: _Deprecate
-
-reveal_type(np.byte_bounds(AR))  # E: Tuple[builtins.int, builtins.int]
-reveal_type(np.byte_bounds(np.float64()))  # E: Tuple[builtins.int, builtins.int]
-
-reveal_type(np.who(None))  # E: None
-reveal_type(np.who(AR_DICT))  # E: None
-
-reveal_type(np.info(1, output=FILE))  # E: None
-
-reveal_type(np.source(np.interp, output=FILE))  # E: None
-
-reveal_type(np.lookfor("binary representation", output=FILE))  # E: None
-
-reveal_type(np.safe_eval("1 + 1"))  # E: Any
diff --git a/numpy/typing/tests/data/reveal/lib_utils.pyi b/numpy/typing/tests/data/reveal/lib_utils.pyi
new file mode 100644 (file)
index 0000000..d820127
--- /dev/null
@@ -0,0 +1,30 @@
+from io import StringIO
+from typing import Any, Dict
+
+import numpy as np
+
+AR: np.ndarray[Any, np.dtype[np.float64]]
+AR_DICT: Dict[str, np.ndarray[Any, np.dtype[np.float64]]]
+FILE: StringIO
+
+def func(a: int) -> bool: ...
+
+reveal_type(np.deprecate(func))  # E: def (a: builtins.int) -> builtins.bool
+reveal_type(np.deprecate())  # E: _Deprecate
+
+reveal_type(np.deprecate_with_doc("test"))  # E: _Deprecate
+reveal_type(np.deprecate_with_doc(None))  # E: _Deprecate
+
+reveal_type(np.byte_bounds(AR))  # E: Tuple[builtins.int, builtins.int]
+reveal_type(np.byte_bounds(np.float64()))  # E: Tuple[builtins.int, builtins.int]
+
+reveal_type(np.who(None))  # E: None
+reveal_type(np.who(AR_DICT))  # E: None
+
+reveal_type(np.info(1, output=FILE))  # E: None
+
+reveal_type(np.source(np.interp, output=FILE))  # E: None
+
+reveal_type(np.lookfor("binary representation", output=FILE))  # E: None
+
+reveal_type(np.safe_eval("1 + 1"))  # E: Any
diff --git a/numpy/typing/tests/data/reveal/lib_version.py b/numpy/typing/tests/data/reveal/lib_version.py
deleted file mode 100644 (file)
index e6f6955..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-from numpy.lib import NumpyVersion
-
-version = NumpyVersion("1.8.0")
-
-reveal_type(version.vstring)  # E: str
-reveal_type(version.version)  # E: str
-reveal_type(version.major)  # E: int
-reveal_type(version.minor)  # E: int
-reveal_type(version.bugfix)  # E: int
-reveal_type(version.pre_release)  # E: str
-reveal_type(version.is_devversion)  # E: bool
-
-reveal_type(version == version)  # E: bool
-reveal_type(version != version)  # E: bool
-reveal_type(version < "1.8.0")  # E: bool
-reveal_type(version <= version)  # E: bool
-reveal_type(version > version)  # E: bool
-reveal_type(version >= "1.8.0")  # E: bool
diff --git a/numpy/typing/tests/data/reveal/lib_version.pyi b/numpy/typing/tests/data/reveal/lib_version.pyi
new file mode 100644 (file)
index 0000000..e6f6955
--- /dev/null
@@ -0,0 +1,18 @@
+from numpy.lib import NumpyVersion
+
+version = NumpyVersion("1.8.0")
+
+reveal_type(version.vstring)  # E: str
+reveal_type(version.version)  # E: str
+reveal_type(version.major)  # E: int
+reveal_type(version.minor)  # E: int
+reveal_type(version.bugfix)  # E: int
+reveal_type(version.pre_release)  # E: str
+reveal_type(version.is_devversion)  # E: bool
+
+reveal_type(version == version)  # E: bool
+reveal_type(version != version)  # E: bool
+reveal_type(version < "1.8.0")  # E: bool
+reveal_type(version <= version)  # E: bool
+reveal_type(version > version)  # E: bool
+reveal_type(version >= "1.8.0")  # E: bool
diff --git a/numpy/typing/tests/data/reveal/linalg.pyi b/numpy/typing/tests/data/reveal/linalg.pyi
new file mode 100644 (file)
index 0000000..19e13ae
--- /dev/null
@@ -0,0 +1,97 @@
+import numpy as np
+import numpy.typing as npt
+
+AR_i8: npt.NDArray[np.int64]
+AR_f8: npt.NDArray[np.float64]
+AR_c16: npt.NDArray[np.complex128]
+AR_O: npt.NDArray[np.object_]
+AR_m: npt.NDArray[np.timedelta64]
+AR_S: npt.NDArray[np.str_]
+
+reveal_type(np.linalg.tensorsolve(AR_i8, AR_i8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.linalg.tensorsolve(AR_i8, AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.linalg.tensorsolve(AR_c16, AR_f8))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+
+reveal_type(np.linalg.solve(AR_i8, AR_i8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.linalg.solve(AR_i8, AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.linalg.solve(AR_c16, AR_f8))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+
+reveal_type(np.linalg.tensorinv(AR_i8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.linalg.tensorinv(AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.linalg.tensorinv(AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+
+reveal_type(np.linalg.inv(AR_i8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.linalg.inv(AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.linalg.inv(AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+
+reveal_type(np.linalg.matrix_power(AR_i8, -1))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.linalg.matrix_power(AR_f8, 0))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.linalg.matrix_power(AR_c16, 1))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.linalg.matrix_power(AR_O, 2))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.linalg.cholesky(AR_i8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.linalg.cholesky(AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.linalg.cholesky(AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+
+reveal_type(np.linalg.qr(AR_i8))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{float64}]]]
+reveal_type(np.linalg.qr(AR_f8))  # E: Tuple[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]]]
+reveal_type(np.linalg.qr(AR_c16))  # E: Tuple[ndarray[Any, dtype[complexfloating[Any, Any]]], ndarray[Any, dtype[complexfloating[Any, Any]]]]
+
+reveal_type(np.linalg.eigvals(AR_i8))  # E: Union[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{complex128}]]]
+reveal_type(np.linalg.eigvals(AR_f8))  # E: Union[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[complexfloating[Any, Any]]]]
+reveal_type(np.linalg.eigvals(AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+
+reveal_type(np.linalg.eigvalsh(AR_i8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.linalg.eigvalsh(AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.linalg.eigvalsh(AR_c16))  # E: ndarray[Any, dtype[floating[Any]]]
+
+reveal_type(np.linalg.eig(AR_i8))  # E: Union[Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{float64}]]], Tuple[ndarray[Any, dtype[{complex128}]], ndarray[Any, dtype[{complex128}]]]]
+reveal_type(np.linalg.eig(AR_f8))  # E: Union[Tuple[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]]], Tuple[ndarray[Any, dtype[complexfloating[Any, Any]]], ndarray[Any, dtype[complexfloating[Any, Any]]]]]
+reveal_type(np.linalg.eig(AR_c16))  # E: Tuple[ndarray[Any, dtype[complexfloating[Any, Any]]], ndarray[Any, dtype[complexfloating[Any, Any]]]]
+
+reveal_type(np.linalg.eigh(AR_i8))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{float64}]]]
+reveal_type(np.linalg.eigh(AR_f8))  # E: Tuple[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]]]
+reveal_type(np.linalg.eigh(AR_c16))  # E: Tuple[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[complexfloating[Any, Any]]]]
+
+reveal_type(np.linalg.svd(AR_i8))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{float64}]]]
+reveal_type(np.linalg.svd(AR_f8))  # E: Tuple[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]]]
+reveal_type(np.linalg.svd(AR_c16))  # E: Tuple[ndarray[Any, dtype[complexfloating[Any, Any]]], ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[complexfloating[Any, Any]]]]
+reveal_type(np.linalg.svd(AR_i8, compute_uv=False))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.linalg.svd(AR_f8, compute_uv=False))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.linalg.svd(AR_c16, compute_uv=False))  # E: ndarray[Any, dtype[floating[Any]]]
+
+reveal_type(np.linalg.cond(AR_i8))  # E: Any
+reveal_type(np.linalg.cond(AR_f8))  # E: Any
+reveal_type(np.linalg.cond(AR_c16))  # E: Any
+
+reveal_type(np.linalg.matrix_rank(AR_i8))  # E: Any
+reveal_type(np.linalg.matrix_rank(AR_f8))  # E: Any
+reveal_type(np.linalg.matrix_rank(AR_c16))  # E: Any
+
+reveal_type(np.linalg.pinv(AR_i8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.linalg.pinv(AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.linalg.pinv(AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+
+reveal_type(np.linalg.slogdet(AR_i8))  # E: Tuple[Any, Any]
+reveal_type(np.linalg.slogdet(AR_f8))  # E: Tuple[Any, Any]
+reveal_type(np.linalg.slogdet(AR_c16))  # E: Tuple[Any, Any]
+
+reveal_type(np.linalg.det(AR_i8))  # E: Any
+reveal_type(np.linalg.det(AR_f8))  # E: Any
+reveal_type(np.linalg.det(AR_c16))  # E: Any
+
+reveal_type(np.linalg.lstsq(AR_i8, AR_i8))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{float64}]], {int32}, ndarray[Any, dtype[{float64}]]]
+reveal_type(np.linalg.lstsq(AR_i8, AR_f8))  # E: Tuple[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]], {int32}, ndarray[Any, dtype[floating[Any]]]]
+reveal_type(np.linalg.lstsq(AR_f8, AR_c16))  # E: Tuple[ndarray[Any, dtype[complexfloating[Any, Any]]], ndarray[Any, dtype[floating[Any]]], {int32}, ndarray[Any, dtype[floating[Any]]]]
+
+reveal_type(np.linalg.norm(AR_i8))  # E: floating[Any]
+reveal_type(np.linalg.norm(AR_f8))  # E: floating[Any]
+reveal_type(np.linalg.norm(AR_c16))  # E: floating[Any]
+reveal_type(np.linalg.norm(AR_S))  # E: floating[Any]
+reveal_type(np.linalg.norm(AR_f8, axis=0))  # E: Any
+
+reveal_type(np.linalg.multi_dot([AR_i8, AR_i8]))  # E: Any
+reveal_type(np.linalg.multi_dot([AR_i8, AR_f8]))  # E: Any
+reveal_type(np.linalg.multi_dot([AR_f8, AR_c16]))  # E: Any
+reveal_type(np.linalg.multi_dot([AR_O, AR_O]))  # E: Any
+reveal_type(np.linalg.multi_dot([AR_m, AR_m]))  # E: Any
diff --git a/numpy/typing/tests/data/reveal/matrix.pyi b/numpy/typing/tests/data/reveal/matrix.pyi
new file mode 100644 (file)
index 0000000..21c3906
--- /dev/null
@@ -0,0 +1,69 @@
+from typing import Any
+import numpy as np
+import numpy.typing as npt
+
+mat: np.matrix[Any, np.dtype[np.int64]]
+ar_f8: npt.NDArray[np.float64]
+
+reveal_type(mat * 5)  # E: matrix[Any, Any]
+reveal_type(5 * mat)  # E: matrix[Any, Any]
+mat *= 5
+
+reveal_type(mat**5)  # E: matrix[Any, Any]
+mat **= 5
+
+reveal_type(mat.sum())  # E: Any
+reveal_type(mat.mean())  # E: Any
+reveal_type(mat.std())  # E: Any
+reveal_type(mat.var())  # E: Any
+reveal_type(mat.prod())  # E: Any
+reveal_type(mat.any())  # E: bool_
+reveal_type(mat.all())  # E: bool_
+reveal_type(mat.max())  # E: {int64}
+reveal_type(mat.min())  # E: {int64}
+reveal_type(mat.argmax())  # E: {intp}
+reveal_type(mat.argmin())  # E: {intp}
+reveal_type(mat.ptp())  # E: {int64}
+
+reveal_type(mat.sum(axis=0))  # E: matrix[Any, Any]
+reveal_type(mat.mean(axis=0))  # E: matrix[Any, Any]
+reveal_type(mat.std(axis=0))  # E: matrix[Any, Any]
+reveal_type(mat.var(axis=0))  # E: matrix[Any, Any]
+reveal_type(mat.prod(axis=0))  # E: matrix[Any, Any]
+reveal_type(mat.any(axis=0))  # E: matrix[Any, dtype[bool_]]
+reveal_type(mat.all(axis=0))  # E: matrix[Any, dtype[bool_]]
+reveal_type(mat.max(axis=0))  # E: matrix[Any, dtype[{int64}]]
+reveal_type(mat.min(axis=0))  # E: matrix[Any, dtype[{int64}]]
+reveal_type(mat.argmax(axis=0))  # E: matrix[Any, dtype[{intp}]]
+reveal_type(mat.argmin(axis=0))  # E: matrix[Any, dtype[{intp}]]
+reveal_type(mat.ptp(axis=0))  # E: matrix[Any, dtype[{int64}]]
+
+reveal_type(mat.sum(out=ar_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(mat.mean(out=ar_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(mat.std(out=ar_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(mat.var(out=ar_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(mat.prod(out=ar_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(mat.any(out=ar_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(mat.all(out=ar_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(mat.max(out=ar_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(mat.min(out=ar_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(mat.argmax(out=ar_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(mat.argmin(out=ar_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(mat.ptp(out=ar_f8))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(mat.T)  # E: matrix[Any, dtype[{int64}]]
+reveal_type(mat.I)  # E: matrix[Any, Any]
+reveal_type(mat.A)  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(mat.A1)  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(mat.H)  # E: matrix[Any, dtype[{int64}]]
+reveal_type(mat.getT())  # E: matrix[Any, dtype[{int64}]]
+reveal_type(mat.getI())  # E: matrix[Any, Any]
+reveal_type(mat.getA())  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(mat.getA1())  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(mat.getH())  # E: matrix[Any, dtype[{int64}]]
+
+reveal_type(np.bmat(ar_f8))  # E: matrix[Any, Any]
+reveal_type(np.bmat([[0, 1, 2]]))  # E: matrix[Any, Any]
+reveal_type(np.bmat("mat"))  # E: matrix[Any, Any]
+
+reveal_type(np.asmatrix(ar_f8, dtype=np.int64))  # E: matrix[Any, Any]
diff --git a/numpy/typing/tests/data/reveal/memmap.pyi b/numpy/typing/tests/data/reveal/memmap.pyi
new file mode 100644 (file)
index 0000000..86de8eb
--- /dev/null
@@ -0,0 +1,16 @@
+import numpy as np
+from typing import Any
+
+memmap_obj: np.memmap[Any, np.dtype[np.str_]]
+
+reveal_type(np.memmap.__array_priority__)  # E: float
+reveal_type(memmap_obj.__array_priority__)  # E: float
+reveal_type(memmap_obj.filename)  # E: Union[builtins.str, None]
+reveal_type(memmap_obj.offset)  # E: int
+reveal_type(memmap_obj.mode)  # E: str
+reveal_type(memmap_obj.flush())  # E: None
+
+reveal_type(np.memmap("file.txt", offset=5))  # E: memmap[Any, dtype[{uint8}]]
+reveal_type(np.memmap(b"file.txt", dtype=np.float64, shape=(10, 3)))  # E: memmap[Any, dtype[{float64}]]
+with open("file.txt", "rb") as f:
+    reveal_type(np.memmap(f, dtype=float, order="K"))  # E: memmap[Any, dtype[Any]]
diff --git a/numpy/typing/tests/data/reveal/mod.py b/numpy/typing/tests/data/reveal/mod.py
deleted file mode 100644 (file)
index bf45b8c..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-from typing import Any
-import numpy as np
-
-f8 = np.float64()
-i8 = np.int64()
-u8 = np.uint64()
-
-f4 = np.float32()
-i4 = np.int32()
-u4 = np.uint32()
-
-td = np.timedelta64(0, "D")
-b_ = np.bool_()
-
-b = bool()
-f = float()
-i = int()
-
-AR_b: np.ndarray[Any, np.dtype[np.bool_]]
-AR_m: np.ndarray[Any, np.dtype[np.timedelta64]]
-
-# Time structures
-
-reveal_type(td % td)  # E: numpy.timedelta64
-reveal_type(AR_m % td)  # E: Any
-reveal_type(td % AR_m)  # E: Any
-
-reveal_type(divmod(td, td))  # E: Tuple[{int64}, numpy.timedelta64]
-reveal_type(divmod(AR_m, td))  # E: Tuple[numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]], numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]]
-reveal_type(divmod(td, AR_m))  # E: Tuple[numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]], numpy.ndarray[Any, numpy.dtype[numpy.timedelta64]]]
-
-# Bool
-
-reveal_type(b_ % b)  # E: {int8}
-reveal_type(b_ % i)  # E: {int_}
-reveal_type(b_ % f)  # E: {float64}
-reveal_type(b_ % b_)  # E: {int8}
-reveal_type(b_ % i8)  # E: {int64}
-reveal_type(b_ % u8)  # E: {uint64}
-reveal_type(b_ % f8)  # E: {float64}
-reveal_type(b_ % AR_b)  # E: numpy.ndarray[Any, numpy.dtype[{int8}]]
-
-reveal_type(divmod(b_, b))  # E: Tuple[{int8}, {int8}]
-reveal_type(divmod(b_, i))  # E: Tuple[{int_}, {int_}]
-reveal_type(divmod(b_, f))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(b_, b_))  # E: Tuple[{int8}, {int8}]
-reveal_type(divmod(b_, i8))  # E: Tuple[{int64}, {int64}]
-reveal_type(divmod(b_, u8))  # E: Tuple[{uint64}, {uint64}]
-reveal_type(divmod(b_, f8))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(b_, AR_b))  # E: numpy.ndarray[Any, numpy.dtype[{int8}]], numpy.ndarray[Any, numpy.dtype[{int8}]]]
-
-reveal_type(b % b_)  # E: {int8}
-reveal_type(i % b_)  # E: {int_}
-reveal_type(f % b_)  # E: {float64}
-reveal_type(b_ % b_)  # E: {int8}
-reveal_type(i8 % b_)  # E: {int64}
-reveal_type(u8 % b_)  # E: {uint64}
-reveal_type(f8 % b_)  # E: {float64}
-reveal_type(AR_b % b_)  # E: numpy.ndarray[Any, numpy.dtype[{int8}]]
-
-reveal_type(divmod(b, b_))  # E: Tuple[{int8}, {int8}]
-reveal_type(divmod(i, b_))  # E: Tuple[{int_}, {int_}]
-reveal_type(divmod(f, b_))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(b_, b_))  # E: Tuple[{int8}, {int8}]
-reveal_type(divmod(i8, b_))  # E: Tuple[{int64}, {int64}]
-reveal_type(divmod(u8, b_))  # E: Tuple[{uint64}, {uint64}]
-reveal_type(divmod(f8, b_))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(AR_b, b_))  # E: numpy.ndarray[Any, numpy.dtype[{int8}]], numpy.ndarray[Any, numpy.dtype[{int8}]]]
-
-# int
-
-reveal_type(i8 % b)  # E: {int64}
-reveal_type(i8 % i)  # E: {int64}
-reveal_type(i8 % f)  # E: {float64}
-reveal_type(i8 % i8)  # E: {int64}
-reveal_type(i8 % f8)  # E: {float64}
-reveal_type(i4 % i8)  # E: {int64}
-reveal_type(i4 % f8)  # E: {float64}
-reveal_type(i4 % i4)  # E: {int32}
-reveal_type(i4 % f4)  # E: {float32}
-reveal_type(i8 % AR_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-
-reveal_type(divmod(i8, b))  # E: Tuple[{int64}, {int64}]
-reveal_type(divmod(i8, i))  # E: Tuple[{int64}, {int64}]
-reveal_type(divmod(i8, f))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(i8, i8))  # E: Tuple[{int64}, {int64}]
-reveal_type(divmod(i8, f8))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(i8, i4))  # E: Tuple[{int64}, {int64}]
-reveal_type(divmod(i8, f4))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(i4, i4))  # E: Tuple[{int32}, {int32}]
-reveal_type(divmod(i4, f4))  # E: Tuple[{float32}, {float32}]
-reveal_type(divmod(i8, AR_b))  # E: Tuple[numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]], numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]]
-
-reveal_type(b % i8)  # E: {int64}
-reveal_type(i % i8)  # E: {int64}
-reveal_type(f % i8)  # E: {float64}
-reveal_type(i8 % i8)  # E: {int64}
-reveal_type(f8 % i8)  # E: {float64}
-reveal_type(i8 % i4)  # E: {int64}
-reveal_type(f8 % i4)  # E: {float64}
-reveal_type(i4 % i4)  # E: {int32}
-reveal_type(f4 % i4)  # E: {float32}
-reveal_type(AR_b % i8)  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]
-
-reveal_type(divmod(b, i8))  # E: Tuple[{int64}, {int64}]
-reveal_type(divmod(i, i8))  # E: Tuple[{int64}, {int64}]
-reveal_type(divmod(f, i8))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(i8, i8))  # E: Tuple[{int64}, {int64}]
-reveal_type(divmod(f8, i8))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(i4, i8))  # E: Tuple[{int64}, {int64}]
-reveal_type(divmod(f4, i8))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(i4, i4))  # E: Tuple[{int32}, {int32}]
-reveal_type(divmod(f4, i4))  # E: Tuple[{float32}, {float32}]
-reveal_type(divmod(AR_b, i8))  # E: Tuple[numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]], numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[Any]]]]
-
-# float
-
-reveal_type(f8 % b)  # E: {float64}
-reveal_type(f8 % i)  # E: {float64}
-reveal_type(f8 % f)  # E: {float64}
-reveal_type(i8 % f4)  # E: {float64}
-reveal_type(f4 % f4)  # E: {float32}
-reveal_type(f8 % AR_b)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-
-reveal_type(divmod(f8, b))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(f8, i))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(f8, f))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(f8, f8))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(f8, f4))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(f4, f4))  # E: Tuple[{float32}, {float32}]
-reveal_type(divmod(f8, AR_b))  # E: Tuple[numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]], numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]]
-
-reveal_type(b % f8)  # E: {float64}
-reveal_type(i % f8)  # E: {float64}
-reveal_type(f % f8)  # E: {float64}
-reveal_type(f8 % f8)  # E: {float64}
-reveal_type(f8 % f8)  # E: {float64}
-reveal_type(f4 % f4)  # E: {float32}
-reveal_type(AR_b % f8)  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-
-reveal_type(divmod(b, f8))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(i, f8))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(f, f8))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(f8, f8))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(f4, f8))  # E: Tuple[{float64}, {float64}]
-reveal_type(divmod(f4, f4))  # E: Tuple[{float32}, {float32}]
-reveal_type(divmod(AR_b, f8))  # E: Tuple[numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]], numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]]
diff --git a/numpy/typing/tests/data/reveal/mod.pyi b/numpy/typing/tests/data/reveal/mod.pyi
new file mode 100644 (file)
index 0000000..b2790b7
--- /dev/null
@@ -0,0 +1,147 @@
+from typing import Any
+import numpy as np
+
+f8 = np.float64()
+i8 = np.int64()
+u8 = np.uint64()
+
+f4 = np.float32()
+i4 = np.int32()
+u4 = np.uint32()
+
+td = np.timedelta64(0, "D")
+b_ = np.bool_()
+
+b = bool()
+f = float()
+i = int()
+
+AR_b: np.ndarray[Any, np.dtype[np.bool_]]
+AR_m: np.ndarray[Any, np.dtype[np.timedelta64]]
+
+# Time structures
+
+reveal_type(td % td)  # E: timedelta64
+reveal_type(AR_m % td)  # E: Any
+reveal_type(td % AR_m)  # E: Any
+
+reveal_type(divmod(td, td))  # E: Tuple[{int64}, timedelta64]
+reveal_type(divmod(AR_m, td))  # E: Tuple[ndarray[Any, dtype[signedinteger[typing._64Bit]]], ndarray[Any, dtype[timedelta64]]]
+reveal_type(divmod(td, AR_m))  # E: Tuple[ndarray[Any, dtype[signedinteger[typing._64Bit]]], ndarray[Any, dtype[timedelta64]]]
+
+# Bool
+
+reveal_type(b_ % b)  # E: {int8}
+reveal_type(b_ % i)  # E: {int_}
+reveal_type(b_ % f)  # E: {float64}
+reveal_type(b_ % b_)  # E: {int8}
+reveal_type(b_ % i8)  # E: {int64}
+reveal_type(b_ % u8)  # E: {uint64}
+reveal_type(b_ % f8)  # E: {float64}
+reveal_type(b_ % AR_b)  # E: ndarray[Any, dtype[{int8}]]
+
+reveal_type(divmod(b_, b))  # E: Tuple[{int8}, {int8}]
+reveal_type(divmod(b_, i))  # E: Tuple[{int_}, {int_}]
+reveal_type(divmod(b_, f))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(b_, b_))  # E: Tuple[{int8}, {int8}]
+reveal_type(divmod(b_, i8))  # E: Tuple[{int64}, {int64}]
+reveal_type(divmod(b_, u8))  # E: Tuple[{uint64}, {uint64}]
+reveal_type(divmod(b_, f8))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(b_, AR_b))  # E: ndarray[Any, dtype[{int8}]], ndarray[Any, dtype[{int8}]]]
+
+reveal_type(b % b_)  # E: {int8}
+reveal_type(i % b_)  # E: {int_}
+reveal_type(f % b_)  # E: {float64}
+reveal_type(b_ % b_)  # E: {int8}
+reveal_type(i8 % b_)  # E: {int64}
+reveal_type(u8 % b_)  # E: {uint64}
+reveal_type(f8 % b_)  # E: {float64}
+reveal_type(AR_b % b_)  # E: ndarray[Any, dtype[{int8}]]
+
+reveal_type(divmod(b, b_))  # E: Tuple[{int8}, {int8}]
+reveal_type(divmod(i, b_))  # E: Tuple[{int_}, {int_}]
+reveal_type(divmod(f, b_))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(b_, b_))  # E: Tuple[{int8}, {int8}]
+reveal_type(divmod(i8, b_))  # E: Tuple[{int64}, {int64}]
+reveal_type(divmod(u8, b_))  # E: Tuple[{uint64}, {uint64}]
+reveal_type(divmod(f8, b_))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(AR_b, b_))  # E: ndarray[Any, dtype[{int8}]], ndarray[Any, dtype[{int8}]]]
+
+# int
+
+reveal_type(i8 % b)  # E: {int64}
+reveal_type(i8 % i)  # E: {int64}
+reveal_type(i8 % f)  # E: {float64}
+reveal_type(i8 % i8)  # E: {int64}
+reveal_type(i8 % f8)  # E: {float64}
+reveal_type(i4 % i8)  # E: {int64}
+reveal_type(i4 % f8)  # E: {float64}
+reveal_type(i4 % i4)  # E: {int32}
+reveal_type(i4 % f4)  # E: {float32}
+reveal_type(i8 % AR_b)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+
+reveal_type(divmod(i8, b))  # E: Tuple[{int64}, {int64}]
+reveal_type(divmod(i8, i))  # E: Tuple[{int64}, {int64}]
+reveal_type(divmod(i8, f))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(i8, i8))  # E: Tuple[{int64}, {int64}]
+reveal_type(divmod(i8, f8))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(i8, i4))  # E: Tuple[{int64}, {int64}]
+reveal_type(divmod(i8, f4))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(i4, i4))  # E: Tuple[{int32}, {int32}]
+reveal_type(divmod(i4, f4))  # E: Tuple[{float32}, {float32}]
+reveal_type(divmod(i8, AR_b))  # E: Tuple[ndarray[Any, dtype[signedinteger[Any]]], ndarray[Any, dtype[signedinteger[Any]]]]
+
+reveal_type(b % i8)  # E: {int64}
+reveal_type(i % i8)  # E: {int64}
+reveal_type(f % i8)  # E: {float64}
+reveal_type(i8 % i8)  # E: {int64}
+reveal_type(f8 % i8)  # E: {float64}
+reveal_type(i8 % i4)  # E: {int64}
+reveal_type(f8 % i4)  # E: {float64}
+reveal_type(i4 % i4)  # E: {int32}
+reveal_type(f4 % i4)  # E: {float32}
+reveal_type(AR_b % i8)  # E: ndarray[Any, dtype[signedinteger[Any]]]
+
+reveal_type(divmod(b, i8))  # E: Tuple[{int64}, {int64}]
+reveal_type(divmod(i, i8))  # E: Tuple[{int64}, {int64}]
+reveal_type(divmod(f, i8))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(i8, i8))  # E: Tuple[{int64}, {int64}]
+reveal_type(divmod(f8, i8))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(i4, i8))  # E: Tuple[{int64}, {int64}]
+reveal_type(divmod(f4, i8))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(i4, i4))  # E: Tuple[{int32}, {int32}]
+reveal_type(divmod(f4, i4))  # E: Tuple[{float32}, {float32}]
+reveal_type(divmod(AR_b, i8))  # E: Tuple[ndarray[Any, dtype[signedinteger[Any]]], ndarray[Any, dtype[signedinteger[Any]]]]
+
+# float
+
+reveal_type(f8 % b)  # E: {float64}
+reveal_type(f8 % i)  # E: {float64}
+reveal_type(f8 % f)  # E: {float64}
+reveal_type(i8 % f4)  # E: {float64}
+reveal_type(f4 % f4)  # E: {float32}
+reveal_type(f8 % AR_b)  # E: ndarray[Any, dtype[floating[Any]]]
+
+reveal_type(divmod(f8, b))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(f8, i))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(f8, f))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(f8, f8))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(f8, f4))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(f4, f4))  # E: Tuple[{float32}, {float32}]
+reveal_type(divmod(f8, AR_b))  # E: Tuple[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]]]
+
+reveal_type(b % f8)  # E: {float64}
+reveal_type(i % f8)  # E: {float64}
+reveal_type(f % f8)  # E: {float64}
+reveal_type(f8 % f8)  # E: {float64}
+reveal_type(f8 % f8)  # E: {float64}
+reveal_type(f4 % f4)  # E: {float32}
+reveal_type(AR_b % f8)  # E: ndarray[Any, dtype[floating[Any]]]
+
+reveal_type(divmod(b, f8))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(i, f8))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(f, f8))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(f8, f8))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(f4, f8))  # E: Tuple[{float64}, {float64}]
+reveal_type(divmod(f4, f4))  # E: Tuple[{float32}, {float32}]
+reveal_type(divmod(AR_b, f8))  # E: Tuple[ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]]]
diff --git a/numpy/typing/tests/data/reveal/modules.py b/numpy/typing/tests/data/reveal/modules.py
deleted file mode 100644 (file)
index fa35696..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-import numpy as np
-from numpy import f2py
-
-reveal_type(np)  # E: ModuleType
-
-reveal_type(np.char)  # E: ModuleType
-reveal_type(np.ctypeslib)  # E: ModuleType
-reveal_type(np.emath)  # E: ModuleType
-reveal_type(np.fft)  # E: ModuleType
-reveal_type(np.lib)  # E: ModuleType
-reveal_type(np.linalg)  # E: ModuleType
-reveal_type(np.ma)  # E: ModuleType
-reveal_type(np.matrixlib)  # E: ModuleType
-reveal_type(np.polynomial)  # E: ModuleType
-reveal_type(np.random)  # E: ModuleType
-reveal_type(np.rec)  # E: ModuleType
-reveal_type(np.testing)  # E: ModuleType
-reveal_type(np.version)  # E: ModuleType
-
-reveal_type(np.lib.format)  # E: ModuleType
-reveal_type(np.lib.mixins)  # E: ModuleType
-reveal_type(np.lib.scimath)  # E: ModuleType
-reveal_type(np.lib.stride_tricks)  # E: ModuleType
-reveal_type(np.ma.extras)  # E: ModuleType
-reveal_type(np.polynomial.chebyshev)  # E: ModuleType
-reveal_type(np.polynomial.hermite)  # E: ModuleType
-reveal_type(np.polynomial.hermite_e)  # E: ModuleType
-reveal_type(np.polynomial.laguerre)  # E: ModuleType
-reveal_type(np.polynomial.legendre)  # E: ModuleType
-reveal_type(np.polynomial.polynomial)  # E: ModuleType
-
-# TODO: Remove when annotations have been added to `np.testing.assert_equal`
-reveal_type(np.testing.assert_equal)  # E: Any
-
-reveal_type(np.__path__)  # E: list[builtins.str]
-reveal_type(np.__version__)  # E: str
-reveal_type(np.__git_version__)  # E: str
-
-reveal_type(np.__all__)  # E: list[builtins.str]
-reveal_type(np.char.__all__)  # E: list[builtins.str]
-reveal_type(np.ctypeslib.__all__)  # E: list[builtins.str]
-reveal_type(np.emath.__all__)  # E: list[builtins.str]
-reveal_type(np.lib.__all__)  # E: list[builtins.str]
-reveal_type(np.ma.__all__)  # E: list[builtins.str]
-reveal_type(np.random.__all__)  # E: list[builtins.str]
-reveal_type(np.rec.__all__)  # E: list[builtins.str]
-reveal_type(np.testing.__all__)  # E: list[builtins.str]
-reveal_type(f2py.__all__)  # E: list[builtins.str]
diff --git a/numpy/typing/tests/data/reveal/modules.pyi b/numpy/typing/tests/data/reveal/modules.pyi
new file mode 100644 (file)
index 0000000..ba830eb
--- /dev/null
@@ -0,0 +1,47 @@
+import numpy as np
+from numpy import f2py
+
+reveal_type(np)  # E: ModuleType
+
+reveal_type(np.char)  # E: ModuleType
+reveal_type(np.ctypeslib)  # E: ModuleType
+reveal_type(np.emath)  # E: ModuleType
+reveal_type(np.fft)  # E: ModuleType
+reveal_type(np.lib)  # E: ModuleType
+reveal_type(np.linalg)  # E: ModuleType
+reveal_type(np.ma)  # E: ModuleType
+reveal_type(np.matrixlib)  # E: ModuleType
+reveal_type(np.polynomial)  # E: ModuleType
+reveal_type(np.random)  # E: ModuleType
+reveal_type(np.rec)  # E: ModuleType
+reveal_type(np.testing)  # E: ModuleType
+reveal_type(np.version)  # E: ModuleType
+
+reveal_type(np.lib.format)  # E: ModuleType
+reveal_type(np.lib.mixins)  # E: ModuleType
+reveal_type(np.lib.scimath)  # E: ModuleType
+reveal_type(np.lib.stride_tricks)  # E: ModuleType
+reveal_type(np.ma.extras)  # E: ModuleType
+reveal_type(np.polynomial.chebyshev)  # E: ModuleType
+reveal_type(np.polynomial.hermite)  # E: ModuleType
+reveal_type(np.polynomial.hermite_e)  # E: ModuleType
+reveal_type(np.polynomial.laguerre)  # E: ModuleType
+reveal_type(np.polynomial.legendre)  # E: ModuleType
+reveal_type(np.polynomial.polynomial)  # E: ModuleType
+
+reveal_type(np.__path__)  # E: list[builtins.str]
+reveal_type(np.__version__)  # E: str
+reveal_type(np.__git_version__)  # E: str
+reveal_type(np.test)  # E: _pytesttester.PytestTester
+reveal_type(np.test.module_name)  # E: str
+
+reveal_type(np.__all__)  # E: list[builtins.str]
+reveal_type(np.char.__all__)  # E: list[builtins.str]
+reveal_type(np.ctypeslib.__all__)  # E: list[builtins.str]
+reveal_type(np.emath.__all__)  # E: list[builtins.str]
+reveal_type(np.lib.__all__)  # E: list[builtins.str]
+reveal_type(np.ma.__all__)  # E: list[builtins.str]
+reveal_type(np.random.__all__)  # E: list[builtins.str]
+reveal_type(np.rec.__all__)  # E: list[builtins.str]
+reveal_type(np.testing.__all__)  # E: list[builtins.str]
+reveal_type(f2py.__all__)  # E: list[builtins.str]
diff --git a/numpy/typing/tests/data/reveal/multiarray.py b/numpy/typing/tests/data/reveal/multiarray.py
deleted file mode 100644 (file)
index 33e9ede..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-from typing import Any
-import numpy as np
-
-AR_f8: np.ndarray[Any, np.dtype[np.float64]]
-AR_i8: np.ndarray[Any, np.dtype[np.int64]]
-
-b_f8 = np.broadcast(AR_f8)
-b_i8_f8_f8 = np.broadcast(AR_i8, AR_f8, AR_f8)
-
-reveal_type(next(b_f8))  # E: tuple[Any]
-reveal_type(next(b_i8_f8_f8))  # E: tuple[Any]
-
-reveal_type(b_f8.reset())  # E: None
-reveal_type(b_i8_f8_f8.reset())  # E: None
-
-reveal_type(b_f8.index)  # E: int
-reveal_type(b_i8_f8_f8.index)  # E: int
-
-reveal_type(b_f8.iters)  # E: tuple[numpy.flatiter[Any]]
-reveal_type(b_i8_f8_f8.iters)  # E: tuple[numpy.flatiter[Any]]
-
-reveal_type(b_f8.nd)  # E: int
-reveal_type(b_i8_f8_f8.nd)  # E: int
-
-reveal_type(b_f8.ndim)  # E: int
-reveal_type(b_i8_f8_f8.ndim)  # E: int
-
-reveal_type(b_f8.numiter)  # E: int
-reveal_type(b_i8_f8_f8.numiter)  # E: int
-
-reveal_type(b_f8.shape)  # E: tuple[builtins.int]
-reveal_type(b_i8_f8_f8.shape)  # E: tuple[builtins.int]
-
-reveal_type(b_f8.size)  # E: int
-reveal_type(b_i8_f8_f8.size)  # E: int
diff --git a/numpy/typing/tests/data/reveal/multiarray.pyi b/numpy/typing/tests/data/reveal/multiarray.pyi
new file mode 100644 (file)
index 0000000..0e91a7a
--- /dev/null
@@ -0,0 +1,132 @@
+from typing import Any, List, TypeVar
+from pathlib import Path
+
+import numpy as np
+import numpy.typing as npt
+
+_SCT = TypeVar("_SCT", bound=np.generic, covariant=True)
+
+class SubClass(np.ndarray[Any, np.dtype[_SCT]]): ...
+
+subclass: SubClass[np.float64]
+
+AR_f8: npt.NDArray[np.float64]
+AR_i8: npt.NDArray[np.int64]
+AR_u1: npt.NDArray[np.uint8]
+AR_m: npt.NDArray[np.timedelta64]
+AR_M: npt.NDArray[np.datetime64]
+
+AR_LIKE_f: List[float]
+AR_LIKE_i: List[int]
+
+m: np.timedelta64
+M: np.datetime64
+
+b_f8 = np.broadcast(AR_f8)
+b_i8_f8_f8 = np.broadcast(AR_i8, AR_f8, AR_f8)
+
+nditer_obj: np.nditer
+
+def func(a: int) -> bool: ...
+
+reveal_type(next(b_f8))  # E: tuple[Any]
+reveal_type(b_f8.reset())  # E: None
+reveal_type(b_f8.index)  # E: int
+reveal_type(b_f8.iters)  # E: tuple[flatiter[Any]]
+reveal_type(b_f8.nd)  # E: int
+reveal_type(b_f8.ndim)  # E: int
+reveal_type(b_f8.numiter)  # E: int
+reveal_type(b_f8.shape)  # E: tuple[builtins.int]
+reveal_type(b_f8.size)  # E: int
+
+reveal_type(next(b_i8_f8_f8))  # E: tuple[Any]
+reveal_type(b_i8_f8_f8.reset())  # E: None
+reveal_type(b_i8_f8_f8.index)  # E: int
+reveal_type(b_i8_f8_f8.iters)  # E: tuple[flatiter[Any]]
+reveal_type(b_i8_f8_f8.nd)  # E: int
+reveal_type(b_i8_f8_f8.ndim)  # E: int
+reveal_type(b_i8_f8_f8.numiter)  # E: int
+reveal_type(b_i8_f8_f8.shape)  # E: tuple[builtins.int]
+reveal_type(b_i8_f8_f8.size)  # E: int
+
+reveal_type(np.inner(AR_f8, AR_i8))  # E: Any
+
+reveal_type(np.where([True, True, False]))  # E: tuple[ndarray[Any, dtype[{intp}]]]
+reveal_type(np.where([True, True, False], 1, 0))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.lexsort([0, 1, 2]))  # E: Any
+
+reveal_type(np.can_cast(np.dtype("i8"), int))  # E: bool
+reveal_type(np.can_cast(AR_f8, "f8"))  # E: bool
+reveal_type(np.can_cast(AR_f8, np.complex128, casting="unsafe"))  # E: bool
+
+reveal_type(np.min_scalar_type([1]))  # E: dtype[Any]
+reveal_type(np.min_scalar_type(AR_f8))  # E: dtype[Any]
+
+reveal_type(np.result_type(int, [1]))  # E: dtype[Any]
+reveal_type(np.result_type(AR_f8, AR_u1))  # E: dtype[Any]
+reveal_type(np.result_type(AR_f8, np.complex128))  # E: dtype[Any]
+
+reveal_type(np.dot(AR_LIKE_f, AR_i8))  # E: Any
+reveal_type(np.dot(AR_u1, 1))  # E: Any
+reveal_type(np.dot(1.5j, 1))  # E: Any
+reveal_type(np.dot(AR_u1, 1, out=AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.vdot(AR_LIKE_f, AR_i8))  # E: floating[Any]
+reveal_type(np.vdot(AR_u1, 1))  # E: signedinteger[Any]
+reveal_type(np.vdot(1.5j, 1))  # E: complexfloating[Any, Any]
+
+reveal_type(np.bincount(AR_i8))  # E: ndarray[Any, dtype[{intp}]]
+
+reveal_type(np.copyto(AR_f8, [1., 1.5, 1.6]))  # E: None
+
+reveal_type(np.putmask(AR_f8, [True, True, False], 1.5))  # E: None
+
+reveal_type(np.packbits(AR_i8))  # ndarray[Any, dtype[{uint8}]]
+reveal_type(np.packbits(AR_u1))  # ndarray[Any, dtype[{uint8}]]
+
+reveal_type(np.unpackbits(AR_u1))  # ndarray[Any, dtype[{uint8}]]
+
+reveal_type(np.shares_memory(1, 2))  # E: bool
+reveal_type(np.shares_memory(AR_f8, AR_f8, max_work=1))  # E: bool
+
+reveal_type(np.may_share_memory(1, 2))  # E: bool
+reveal_type(np.may_share_memory(AR_f8, AR_f8, max_work=1))  # E: bool
+
+reveal_type(np.geterrobj())  # E: list[Any]
+
+reveal_type(np.seterrobj([8192, 521, None]))  # E: None
+
+reveal_type(np.promote_types(np.int32, np.int64))  # E: dtype[Any]
+reveal_type(np.promote_types("f4", float))  # E: dtype[Any]
+
+reveal_type(np.frompyfunc(func, 1, 1, identity=None))  # ufunc
+
+reveal_type(np.datetime_data("m8[D]"))  # E: Tuple[builtins.str, builtins.int]
+reveal_type(np.datetime_data(np.datetime64))  # E: Tuple[builtins.str, builtins.int]
+reveal_type(np.datetime_data(np.dtype(np.timedelta64)))  # E: Tuple[builtins.str, builtins.int]
+
+reveal_type(np.busday_count("2011-01", "2011-02"))  # E: {int_}
+reveal_type(np.busday_count(["2011-01"], "2011-02"))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(np.busday_offset(M, m))  # E: datetime64
+reveal_type(np.busday_offset(M, 5))  # E: datetime64
+reveal_type(np.busday_offset(AR_M, m))  # E: ndarray[Any, dtype[datetime64]]
+reveal_type(np.busday_offset("2011-01", "2011-02", roll="forward"))  # E: datetime64
+reveal_type(np.busday_offset(["2011-01"], "2011-02", roll="forward"))  # E: ndarray[Any, dtype[datetime64]]
+
+reveal_type(np.is_busday("2012"))  # E: bool_
+reveal_type(np.is_busday(["2012"]))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.datetime_as_string(M))  # E: str_
+reveal_type(np.datetime_as_string(AR_M))  # E: ndarray[Any, dtype[str_]]
+
+reveal_type(np.compare_chararrays("a", "b", "!=", rstrip=False))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.compare_chararrays(b"a", b"a", "==", True))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.add_docstring(func, "test"))  # E: None
+
+reveal_type(np.nested_iters([AR_i8, AR_i8], [[0], [1]], flags=["c_index"]))  # E: tuple[nditer]
+reveal_type(np.nested_iters([AR_i8, AR_i8], [[0], [1]], op_flags=[["readonly", "readonly"]]))  # E: tuple[nditer]
+reveal_type(np.nested_iters([AR_i8, AR_i8], [[0], [1]], op_dtypes=np.int_))  # E: tuple[nditer]
+reveal_type(np.nested_iters([AR_i8, AR_i8], [[0], [1]], order="C", casting="no"))  # E: tuple[nditer]
diff --git a/numpy/typing/tests/data/reveal/nbit_base_example.py b/numpy/typing/tests/data/reveal/nbit_base_example.py
deleted file mode 100644 (file)
index d34f6f6..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-from typing import TypeVar, Union
-import numpy as np
-import numpy.typing as npt
-
-T1 = TypeVar("T1", bound=npt.NBitBase)
-T2 = TypeVar("T2", bound=npt.NBitBase)
-
-def add(a: np.floating[T1], b: np.integer[T2]) -> np.floating[Union[T1, T2]]:
-    return a + b
-
-i8: np.int64
-i4: np.int32
-f8: np.float64
-f4: np.float32
-
-reveal_type(add(f8, i8))  # E: {float64}
-reveal_type(add(f4, i8))  # E: {float64}
-reveal_type(add(f8, i4))  # E: {float64}
-reveal_type(add(f4, i4))  # E: {float32}
diff --git a/numpy/typing/tests/data/reveal/nbit_base_example.pyi b/numpy/typing/tests/data/reveal/nbit_base_example.pyi
new file mode 100644 (file)
index 0000000..d34f6f6
--- /dev/null
@@ -0,0 +1,19 @@
+from typing import TypeVar, Union
+import numpy as np
+import numpy.typing as npt
+
+T1 = TypeVar("T1", bound=npt.NBitBase)
+T2 = TypeVar("T2", bound=npt.NBitBase)
+
+def add(a: np.floating[T1], b: np.integer[T2]) -> np.floating[Union[T1, T2]]:
+    return a + b
+
+i8: np.int64
+i4: np.int32
+f8: np.float64
+f4: np.float32
+
+reveal_type(add(f8, i8))  # E: {float64}
+reveal_type(add(f4, i8))  # E: {float64}
+reveal_type(add(f8, i4))  # E: {float64}
+reveal_type(add(f4, i4))  # E: {float32}
diff --git a/numpy/typing/tests/data/reveal/ndarray_conversion.py b/numpy/typing/tests/data/reveal/ndarray_conversion.py
deleted file mode 100644 (file)
index 03f2faf..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-import numpy as np
-import numpy.typing as npt
-
-nd: npt.NDArray[np.int_] = np.array([[1, 2], [3, 4]])
-
-# item
-reveal_type(nd.item())  # E: int
-reveal_type(nd.item(1))  # E: int
-reveal_type(nd.item(0, 1))  # E: int
-reveal_type(nd.item((0, 1)))  # E: int
-
-# tolist
-reveal_type(nd.tolist())  # E: Any
-
-# itemset does not return a value
-# tostring is pretty simple
-# tobytes is pretty simple
-# tofile does not return a value
-# dump does not return a value
-# dumps is pretty simple
-
-# astype
-reveal_type(nd.astype("float"))  # E: numpy.ndarray[Any, numpy.dtype[Any]]
-reveal_type(nd.astype(float))  # E: numpy.ndarray[Any, numpy.dtype[Any]]
-reveal_type(nd.astype(np.float64))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(nd.astype(np.float64, "K"))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(nd.astype(np.float64, "K", "unsafe"))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(nd.astype(np.float64, "K", "unsafe", True))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(nd.astype(np.float64, "K", "unsafe", True, True))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-
-# byteswap
-reveal_type(nd.byteswap())  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(nd.byteswap(True))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-# copy
-reveal_type(nd.copy())  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(nd.copy("C"))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-reveal_type(nd.view())  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(nd.view(np.float64))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(nd.view(float))  # E: numpy.ndarray[Any, numpy.dtype[Any]]
-reveal_type(nd.view(np.float64, np.matrix))  # E: numpy.matrix[Any, Any]
-
-# getfield
-reveal_type(nd.getfield("float"))  # E: numpy.ndarray[Any, numpy.dtype[Any]]
-reveal_type(nd.getfield(float))  # E: numpy.ndarray[Any, numpy.dtype[Any]]
-reveal_type(nd.getfield(np.float64))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(nd.getfield(np.float64, 8))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-
-# setflags does not return a value
-# fill does not return a value
diff --git a/numpy/typing/tests/data/reveal/ndarray_conversion.pyi b/numpy/typing/tests/data/reveal/ndarray_conversion.pyi
new file mode 100644 (file)
index 0000000..6885d4f
--- /dev/null
@@ -0,0 +1,51 @@
+import numpy as np
+import numpy.typing as npt
+
+nd: npt.NDArray[np.int_] = np.array([[1, 2], [3, 4]])
+
+# item
+reveal_type(nd.item())  # E: int
+reveal_type(nd.item(1))  # E: int
+reveal_type(nd.item(0, 1))  # E: int
+reveal_type(nd.item((0, 1)))  # E: int
+
+# tolist
+reveal_type(nd.tolist())  # E: Any
+
+# itemset does not return a value
+# tostring is pretty simple
+# tobytes is pretty simple
+# tofile does not return a value
+# dump does not return a value
+# dumps is pretty simple
+
+# astype
+reveal_type(nd.astype("float"))  # E: ndarray[Any, dtype[Any]]
+reveal_type(nd.astype(float))  # E: ndarray[Any, dtype[Any]]
+reveal_type(nd.astype(np.float64))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(nd.astype(np.float64, "K"))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(nd.astype(np.float64, "K", "unsafe"))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(nd.astype(np.float64, "K", "unsafe", True))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(nd.astype(np.float64, "K", "unsafe", True, True))  # E: ndarray[Any, dtype[{float64}]]
+
+# byteswap
+reveal_type(nd.byteswap())  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(nd.byteswap(True))  # E: ndarray[Any, dtype[{int_}]]
+
+# copy
+reveal_type(nd.copy())  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(nd.copy("C"))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(nd.view())  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(nd.view(np.float64))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(nd.view(float))  # E: ndarray[Any, dtype[Any]]
+reveal_type(nd.view(np.float64, np.matrix))  # E: matrix[Any, Any]
+
+# getfield
+reveal_type(nd.getfield("float"))  # E: ndarray[Any, dtype[Any]]
+reveal_type(nd.getfield(float))  # E: ndarray[Any, dtype[Any]]
+reveal_type(nd.getfield(np.float64))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(nd.getfield(np.float64, 8))  # E: ndarray[Any, dtype[{float64}]]
+
+# setflags does not return a value
+# fill does not return a value
diff --git a/numpy/typing/tests/data/reveal/ndarray_misc.py b/numpy/typing/tests/data/reveal/ndarray_misc.py
deleted file mode 100644 (file)
index ea01b7a..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-"""
-Tests for miscellaneous (non-magic) ``np.ndarray``/``np.generic`` methods.
-
-More extensive tests are performed for the methods'
-function-based counterpart in `../from_numeric.py`.
-
-"""
-
-import operator
-import ctypes as ct
-from typing import Any
-
-import numpy as np
-
-class SubClass(np.ndarray): ...
-
-f8: np.float64
-B: SubClass
-AR_f8: np.ndarray[Any, np.dtype[np.float64]]
-AR_i8: np.ndarray[Any, np.dtype[np.int64]]
-AR_U: np.ndarray[Any, np.dtype[np.str_]]
-
-ctypes_obj = AR_f8.ctypes
-
-reveal_type(ctypes_obj.data)  # E: int
-reveal_type(ctypes_obj.shape)  # E: ctypes.Array[ctypes.c_int64]
-reveal_type(ctypes_obj.strides)  # E: ctypes.Array[ctypes.c_int64]
-reveal_type(ctypes_obj._as_parameter_)  # E: ctypes.c_void_p
-
-reveal_type(ctypes_obj.data_as(ct.c_void_p))  # E: ctypes.c_void_p
-reveal_type(ctypes_obj.shape_as(ct.c_longlong))  # E: ctypes.Array[ctypes.c_longlong]
-reveal_type(ctypes_obj.strides_as(ct.c_ubyte))  # E: ctypes.Array[ctypes.c_ubyte]
-
-reveal_type(f8.all())  # E: numpy.bool_
-reveal_type(AR_f8.all())  # E: numpy.bool_
-reveal_type(AR_f8.all(axis=0))  # E: Any
-reveal_type(AR_f8.all(keepdims=True))  # E: Any
-reveal_type(AR_f8.all(out=B))  # E: SubClass
-
-reveal_type(f8.any())  # E: numpy.bool_
-reveal_type(AR_f8.any())  # E: numpy.bool_
-reveal_type(AR_f8.any(axis=0))  # E: Any
-reveal_type(AR_f8.any(keepdims=True))  # E: Any
-reveal_type(AR_f8.any(out=B))  # E: SubClass
-
-reveal_type(f8.argmax())  # E: {intp}
-reveal_type(AR_f8.argmax())  # E: {intp}
-reveal_type(AR_f8.argmax(axis=0))  # E: Any
-reveal_type(AR_f8.argmax(out=B))  # E: SubClass
-
-reveal_type(f8.argmin())  # E: {intp}
-reveal_type(AR_f8.argmin())  # E: {intp}
-reveal_type(AR_f8.argmin(axis=0))  # E: Any
-reveal_type(AR_f8.argmin(out=B))  # E: SubClass
-
-reveal_type(f8.argsort())  # E: numpy.ndarray[Any, Any]
-reveal_type(AR_f8.argsort())  # E: numpy.ndarray[Any, Any]
-
-reveal_type(f8.astype(np.int64).choose([()]))  # E: numpy.ndarray[Any, Any]
-reveal_type(AR_f8.choose([0]))  # E: numpy.ndarray[Any, Any]
-reveal_type(AR_f8.choose([0], out=B))  # E: SubClass
-
-reveal_type(f8.clip(1))  # E: Any
-reveal_type(AR_f8.clip(1))  # E: Any
-reveal_type(AR_f8.clip(None, 1))  # E: Any
-reveal_type(AR_f8.clip(1, out=B))  # E: SubClass
-reveal_type(AR_f8.clip(None, 1, out=B))  # E: SubClass
-
-reveal_type(f8.compress([0]))  # E: numpy.ndarray[Any, Any]
-reveal_type(AR_f8.compress([0]))  # E: numpy.ndarray[Any, Any]
-reveal_type(AR_f8.compress([0], out=B))  # E: SubClass
-
-reveal_type(f8.conj())  # E: {float64}
-reveal_type(AR_f8.conj())  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(B.conj())  # E: SubClass
-
-reveal_type(f8.conjugate())  # E: {float64}
-reveal_type(AR_f8.conjugate())  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(B.conjugate())  # E: SubClass
-
-reveal_type(f8.cumprod())  # E: numpy.ndarray[Any, Any]
-reveal_type(AR_f8.cumprod())  # E: numpy.ndarray[Any, Any]
-reveal_type(AR_f8.cumprod(out=B))  # E: SubClass
-
-reveal_type(f8.cumsum())  # E: numpy.ndarray[Any, Any]
-reveal_type(AR_f8.cumsum())  # E: numpy.ndarray[Any, Any]
-reveal_type(AR_f8.cumsum(out=B))  # E: SubClass
-
-reveal_type(f8.max())  # E: Any
-reveal_type(AR_f8.max())  # E: Any
-reveal_type(AR_f8.max(axis=0))  # E: Any
-reveal_type(AR_f8.max(keepdims=True))  # E: Any
-reveal_type(AR_f8.max(out=B))  # E: SubClass
-
-reveal_type(f8.mean())  # E: Any
-reveal_type(AR_f8.mean())  # E: Any
-reveal_type(AR_f8.mean(axis=0))  # E: Any
-reveal_type(AR_f8.mean(keepdims=True))  # E: Any
-reveal_type(AR_f8.mean(out=B))  # E: SubClass
-
-reveal_type(f8.min())  # E: Any
-reveal_type(AR_f8.min())  # E: Any
-reveal_type(AR_f8.min(axis=0))  # E: Any
-reveal_type(AR_f8.min(keepdims=True))  # E: Any
-reveal_type(AR_f8.min(out=B))  # E: SubClass
-
-reveal_type(f8.newbyteorder())  # E: {float64}
-reveal_type(AR_f8.newbyteorder())  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(B.newbyteorder('|'))  # E: SubClass
-
-reveal_type(f8.prod())  # E: Any
-reveal_type(AR_f8.prod())  # E: Any
-reveal_type(AR_f8.prod(axis=0))  # E: Any
-reveal_type(AR_f8.prod(keepdims=True))  # E: Any
-reveal_type(AR_f8.prod(out=B))  # E: SubClass
-
-reveal_type(f8.ptp())  # E: Any
-reveal_type(AR_f8.ptp())  # E: Any
-reveal_type(AR_f8.ptp(axis=0))  # E: Any
-reveal_type(AR_f8.ptp(keepdims=True))  # E: Any
-reveal_type(AR_f8.ptp(out=B))  # E: SubClass
-
-reveal_type(f8.round())  # E: {float64}
-reveal_type(AR_f8.round())  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(AR_f8.round(out=B))  # E: SubClass
-
-reveal_type(f8.repeat(1))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(AR_f8.repeat(1))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(B.repeat(1))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(f8.std())  # E: Any
-reveal_type(AR_f8.std())  # E: Any
-reveal_type(AR_f8.std(axis=0))  # E: Any
-reveal_type(AR_f8.std(keepdims=True))  # E: Any
-reveal_type(AR_f8.std(out=B))  # E: SubClass
-
-reveal_type(f8.sum())  # E: Any
-reveal_type(AR_f8.sum())  # E: Any
-reveal_type(AR_f8.sum(axis=0))  # E: Any
-reveal_type(AR_f8.sum(keepdims=True))  # E: Any
-reveal_type(AR_f8.sum(out=B))  # E: SubClass
-
-reveal_type(f8.take(0))  # E: {float64}
-reveal_type(AR_f8.take(0))  # E: {float64}
-reveal_type(AR_f8.take([0]))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(AR_f8.take(0, out=B))  # E: SubClass
-reveal_type(AR_f8.take([0], out=B))  # E: SubClass
-
-reveal_type(f8.var())  # E: Any
-reveal_type(AR_f8.var())  # E: Any
-reveal_type(AR_f8.var(axis=0))  # E: Any
-reveal_type(AR_f8.var(keepdims=True))  # E: Any
-reveal_type(AR_f8.var(out=B))  # E: SubClass
-
-reveal_type(AR_f8.argpartition([0]))  # E: numpy.ndarray[Any, numpy.dtype[{intp}]]
-
-reveal_type(AR_f8.diagonal())  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-
-reveal_type(AR_f8.dot(1))  # E: numpy.ndarray[Any, Any]
-reveal_type(AR_f8.dot([1]))  # E: Any
-reveal_type(AR_f8.dot(1, out=B))  # E: SubClass
-
-reveal_type(AR_f8.nonzero())  # E: tuple[numpy.ndarray[Any, numpy.dtype[{intp}]]]
-
-reveal_type(AR_f8.searchsorted(1))  # E: {intp}
-reveal_type(AR_f8.searchsorted([1]))  # E: numpy.ndarray[Any, numpy.dtype[{intp}]]
-
-reveal_type(AR_f8.trace())  # E: Any
-reveal_type(AR_f8.trace(out=B))  # E: SubClass
-
-reveal_type(AR_f8.item())  # E: float
-reveal_type(AR_U.item())  # E: str
-
-reveal_type(AR_f8.ravel())  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(AR_U.ravel())  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-
-reveal_type(AR_f8.flatten())  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(AR_U.flatten())  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-
-reveal_type(AR_f8.reshape(1))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(AR_U.reshape(1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-
-reveal_type(int(AR_f8))  # E: int
-reveal_type(int(AR_U))  # E: int
-
-reveal_type(float(AR_f8))  # E: float
-reveal_type(float(AR_U))  # E: float
-
-reveal_type(complex(AR_f8))  # E: complex
-
-reveal_type(operator.index(AR_i8))  # E: int
diff --git a/numpy/typing/tests/data/reveal/ndarray_misc.pyi b/numpy/typing/tests/data/reveal/ndarray_misc.pyi
new file mode 100644 (file)
index 0000000..f91d635
--- /dev/null
@@ -0,0 +1,214 @@
+"""
+Tests for miscellaneous (non-magic) ``np.ndarray``/``np.generic`` methods.
+
+More extensive tests are performed for the methods'
+function-based counterpart in `../from_numeric.py`.
+
+"""
+
+import operator
+import ctypes as ct
+from typing import Any
+
+import numpy as np
+from numpy.typing import NDArray
+
+class SubClass(NDArray[np.object_]): ...
+
+f8: np.float64
+B: SubClass
+AR_f8: NDArray[np.float64]
+AR_i8: NDArray[np.int64]
+AR_U: NDArray[np.str_]
+AR_V: NDArray[np.void]
+
+ctypes_obj = AR_f8.ctypes
+
+reveal_type(AR_f8.__dlpack__())  # E: Any
+reveal_type(AR_f8.__dlpack_device__())  # E: Tuple[int, Literal[0]]
+
+reveal_type(ctypes_obj.data)  # E: int
+reveal_type(ctypes_obj.shape)  # E: ctypes.Array[{c_intp}]
+reveal_type(ctypes_obj.strides)  # E: ctypes.Array[{c_intp}]
+reveal_type(ctypes_obj._as_parameter_)  # E: ctypes.c_void_p
+
+reveal_type(ctypes_obj.data_as(ct.c_void_p))  # E: ctypes.c_void_p
+reveal_type(ctypes_obj.shape_as(ct.c_longlong))  # E: ctypes.Array[ctypes.c_longlong]
+reveal_type(ctypes_obj.strides_as(ct.c_ubyte))  # E: ctypes.Array[ctypes.c_ubyte]
+
+reveal_type(f8.all())  # E: bool_
+reveal_type(AR_f8.all())  # E: bool_
+reveal_type(AR_f8.all(axis=0))  # E: Any
+reveal_type(AR_f8.all(keepdims=True))  # E: Any
+reveal_type(AR_f8.all(out=B))  # E: SubClass
+
+reveal_type(f8.any())  # E: bool_
+reveal_type(AR_f8.any())  # E: bool_
+reveal_type(AR_f8.any(axis=0))  # E: Any
+reveal_type(AR_f8.any(keepdims=True))  # E: Any
+reveal_type(AR_f8.any(out=B))  # E: SubClass
+
+reveal_type(f8.argmax())  # E: {intp}
+reveal_type(AR_f8.argmax())  # E: {intp}
+reveal_type(AR_f8.argmax(axis=0))  # E: Any
+reveal_type(AR_f8.argmax(out=B))  # E: SubClass
+
+reveal_type(f8.argmin())  # E: {intp}
+reveal_type(AR_f8.argmin())  # E: {intp}
+reveal_type(AR_f8.argmin(axis=0))  # E: Any
+reveal_type(AR_f8.argmin(out=B))  # E: SubClass
+
+reveal_type(f8.argsort())  # E: ndarray[Any, Any]
+reveal_type(AR_f8.argsort())  # E: ndarray[Any, Any]
+
+reveal_type(f8.astype(np.int64).choose([()]))  # E: ndarray[Any, Any]
+reveal_type(AR_f8.choose([0]))  # E: ndarray[Any, Any]
+reveal_type(AR_f8.choose([0], out=B))  # E: SubClass
+
+reveal_type(f8.clip(1))  # E: Any
+reveal_type(AR_f8.clip(1))  # E: Any
+reveal_type(AR_f8.clip(None, 1))  # E: Any
+reveal_type(AR_f8.clip(1, out=B))  # E: SubClass
+reveal_type(AR_f8.clip(None, 1, out=B))  # E: SubClass
+
+reveal_type(f8.compress([0]))  # E: ndarray[Any, Any]
+reveal_type(AR_f8.compress([0]))  # E: ndarray[Any, Any]
+reveal_type(AR_f8.compress([0], out=B))  # E: SubClass
+
+reveal_type(f8.conj())  # E: {float64}
+reveal_type(AR_f8.conj())  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(B.conj())  # E: SubClass
+
+reveal_type(f8.conjugate())  # E: {float64}
+reveal_type(AR_f8.conjugate())  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(B.conjugate())  # E: SubClass
+
+reveal_type(f8.cumprod())  # E: ndarray[Any, Any]
+reveal_type(AR_f8.cumprod())  # E: ndarray[Any, Any]
+reveal_type(AR_f8.cumprod(out=B))  # E: SubClass
+
+reveal_type(f8.cumsum())  # E: ndarray[Any, Any]
+reveal_type(AR_f8.cumsum())  # E: ndarray[Any, Any]
+reveal_type(AR_f8.cumsum(out=B))  # E: SubClass
+
+reveal_type(f8.max())  # E: Any
+reveal_type(AR_f8.max())  # E: Any
+reveal_type(AR_f8.max(axis=0))  # E: Any
+reveal_type(AR_f8.max(keepdims=True))  # E: Any
+reveal_type(AR_f8.max(out=B))  # E: SubClass
+
+reveal_type(f8.mean())  # E: Any
+reveal_type(AR_f8.mean())  # E: Any
+reveal_type(AR_f8.mean(axis=0))  # E: Any
+reveal_type(AR_f8.mean(keepdims=True))  # E: Any
+reveal_type(AR_f8.mean(out=B))  # E: SubClass
+
+reveal_type(f8.min())  # E: Any
+reveal_type(AR_f8.min())  # E: Any
+reveal_type(AR_f8.min(axis=0))  # E: Any
+reveal_type(AR_f8.min(keepdims=True))  # E: Any
+reveal_type(AR_f8.min(out=B))  # E: SubClass
+
+reveal_type(f8.newbyteorder())  # E: {float64}
+reveal_type(AR_f8.newbyteorder())  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(B.newbyteorder('|'))  # E: SubClass
+
+reveal_type(f8.prod())  # E: Any
+reveal_type(AR_f8.prod())  # E: Any
+reveal_type(AR_f8.prod(axis=0))  # E: Any
+reveal_type(AR_f8.prod(keepdims=True))  # E: Any
+reveal_type(AR_f8.prod(out=B))  # E: SubClass
+
+reveal_type(f8.ptp())  # E: Any
+reveal_type(AR_f8.ptp())  # E: Any
+reveal_type(AR_f8.ptp(axis=0))  # E: Any
+reveal_type(AR_f8.ptp(keepdims=True))  # E: Any
+reveal_type(AR_f8.ptp(out=B))  # E: SubClass
+
+reveal_type(f8.round())  # E: {float64}
+reveal_type(AR_f8.round())  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(AR_f8.round(out=B))  # E: SubClass
+
+reveal_type(f8.repeat(1))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(AR_f8.repeat(1))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(B.repeat(1))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(f8.std())  # E: Any
+reveal_type(AR_f8.std())  # E: Any
+reveal_type(AR_f8.std(axis=0))  # E: Any
+reveal_type(AR_f8.std(keepdims=True))  # E: Any
+reveal_type(AR_f8.std(out=B))  # E: SubClass
+
+reveal_type(f8.sum())  # E: Any
+reveal_type(AR_f8.sum())  # E: Any
+reveal_type(AR_f8.sum(axis=0))  # E: Any
+reveal_type(AR_f8.sum(keepdims=True))  # E: Any
+reveal_type(AR_f8.sum(out=B))  # E: SubClass
+
+reveal_type(f8.take(0))  # E: {float64}
+reveal_type(AR_f8.take(0))  # E: {float64}
+reveal_type(AR_f8.take([0]))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(AR_f8.take(0, out=B))  # E: SubClass
+reveal_type(AR_f8.take([0], out=B))  # E: SubClass
+
+reveal_type(f8.var())  # E: Any
+reveal_type(AR_f8.var())  # E: Any
+reveal_type(AR_f8.var(axis=0))  # E: Any
+reveal_type(AR_f8.var(keepdims=True))  # E: Any
+reveal_type(AR_f8.var(out=B))  # E: SubClass
+
+reveal_type(AR_f8.argpartition([0]))  # E: ndarray[Any, dtype[{intp}]]
+
+reveal_type(AR_f8.diagonal())  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(AR_f8.dot(1))  # E: ndarray[Any, Any]
+reveal_type(AR_f8.dot([1]))  # E: Any
+reveal_type(AR_f8.dot(1, out=B))  # E: SubClass
+
+reveal_type(AR_f8.nonzero())  # E: tuple[ndarray[Any, dtype[{intp}]]]
+
+reveal_type(AR_f8.searchsorted(1))  # E: {intp}
+reveal_type(AR_f8.searchsorted([1]))  # E: ndarray[Any, dtype[{intp}]]
+
+reveal_type(AR_f8.trace())  # E: Any
+reveal_type(AR_f8.trace(out=B))  # E: SubClass
+
+reveal_type(AR_f8.item())  # E: float
+reveal_type(AR_U.item())  # E: str
+
+reveal_type(AR_f8.ravel())  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(AR_U.ravel())  # E: ndarray[Any, dtype[str_]]
+
+reveal_type(AR_f8.flatten())  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(AR_U.flatten())  # E: ndarray[Any, dtype[str_]]
+
+reveal_type(AR_f8.reshape(1))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(AR_U.reshape(1))  # E: ndarray[Any, dtype[str_]]
+
+reveal_type(int(AR_f8))  # E: int
+reveal_type(int(AR_U))  # E: int
+
+reveal_type(float(AR_f8))  # E: float
+reveal_type(float(AR_U))  # E: float
+
+reveal_type(complex(AR_f8))  # E: complex
+
+reveal_type(operator.index(AR_i8))  # E: int
+
+reveal_type(AR_f8.__array_prepare__(B))  # E: ndarray[Any, dtype[object_]]
+reveal_type(AR_f8.__array_wrap__(B))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(AR_V[0])  # E: Any
+reveal_type(AR_V[0, 0])  # E: Any
+reveal_type(AR_V[AR_i8])  # E: Any
+reveal_type(AR_V[AR_i8, AR_i8])  # E: Any
+reveal_type(AR_V[AR_i8, None])  # E: ndarray[Any, dtype[void]]
+reveal_type(AR_V[0, ...])  # E: ndarray[Any, dtype[void]]
+reveal_type(AR_V[:])  # E: ndarray[Any, dtype[void]]
+reveal_type(AR_V["a"])  # E: ndarray[Any, dtype[Any]]
+reveal_type(AR_V[["a", "b"]])  # E: ndarray[Any, dtype[void]]
+
+reveal_type(AR_f8.dump("test_file"))  # E: None
+reveal_type(AR_f8.dump(b"test_file"))  # E: None
+with open("test_file", "wb") as f:
+    reveal_type(AR_f8.dump(f))  # E: None
diff --git a/numpy/typing/tests/data/reveal/ndarray_shape_manipulation.py b/numpy/typing/tests/data/reveal/ndarray_shape_manipulation.py
deleted file mode 100644 (file)
index a44e1cf..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-import numpy as np
-
-nd = np.array([[1, 2], [3, 4]])
-
-# reshape
-reveal_type(nd.reshape())  # E: numpy.ndarray
-reveal_type(nd.reshape(4))  # E: numpy.ndarray
-reveal_type(nd.reshape(2, 2))  # E: numpy.ndarray
-reveal_type(nd.reshape((2, 2)))  # E: numpy.ndarray
-
-reveal_type(nd.reshape((2, 2), order="C"))  # E: numpy.ndarray
-reveal_type(nd.reshape(4, order="C"))  # E: numpy.ndarray
-
-# resize does not return a value
-
-# transpose
-reveal_type(nd.transpose())  # E: numpy.ndarray
-reveal_type(nd.transpose(1, 0))  # E: numpy.ndarray
-reveal_type(nd.transpose((1, 0)))  # E: numpy.ndarray
-
-# swapaxes
-reveal_type(nd.swapaxes(0, 1))  # E: numpy.ndarray
-
-# flatten
-reveal_type(nd.flatten())  # E: numpy.ndarray
-reveal_type(nd.flatten("C"))  # E: numpy.ndarray
-
-# ravel
-reveal_type(nd.ravel())  # E: numpy.ndarray
-reveal_type(nd.ravel("C"))  # E: numpy.ndarray
-
-# squeeze
-reveal_type(nd.squeeze())  # E: numpy.ndarray
-reveal_type(nd.squeeze(0))  # E: numpy.ndarray
-reveal_type(nd.squeeze((0, 2)))  # E: numpy.ndarray
diff --git a/numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi b/numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi
new file mode 100644 (file)
index 0000000..c000bf4
--- /dev/null
@@ -0,0 +1,35 @@
+import numpy as np
+
+nd = np.array([[1, 2], [3, 4]])
+
+# reshape
+reveal_type(nd.reshape())  # E: ndarray
+reveal_type(nd.reshape(4))  # E: ndarray
+reveal_type(nd.reshape(2, 2))  # E: ndarray
+reveal_type(nd.reshape((2, 2)))  # E: ndarray
+
+reveal_type(nd.reshape((2, 2), order="C"))  # E: ndarray
+reveal_type(nd.reshape(4, order="C"))  # E: ndarray
+
+# resize does not return a value
+
+# transpose
+reveal_type(nd.transpose())  # E: ndarray
+reveal_type(nd.transpose(1, 0))  # E: ndarray
+reveal_type(nd.transpose((1, 0)))  # E: ndarray
+
+# swapaxes
+reveal_type(nd.swapaxes(0, 1))  # E: ndarray
+
+# flatten
+reveal_type(nd.flatten())  # E: ndarray
+reveal_type(nd.flatten("C"))  # E: ndarray
+
+# ravel
+reveal_type(nd.ravel())  # E: ndarray
+reveal_type(nd.ravel("C"))  # E: ndarray
+
+# squeeze
+reveal_type(nd.squeeze())  # E: ndarray
+reveal_type(nd.squeeze(0))  # E: ndarray
+reveal_type(nd.squeeze((0, 2)))  # E: ndarray
diff --git a/numpy/typing/tests/data/reveal/nditer.py b/numpy/typing/tests/data/reveal/nditer.py
deleted file mode 100644 (file)
index de2a4b5..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-import copy
-import numpy as np
-
-nditer_obj: np.nditer
-
-with nditer_obj as context:
-    reveal_type(context)   # E: numpy.nditer
-
-reveal_type(len(nditer_obj))  # E: builtins.int
-reveal_type(copy.copy(nditer_obj))  # E: numpy.nditer
-reveal_type(next(nditer_obj))  # E: Any
-reveal_type(iter(nditer_obj))  # E: typing.Iterator[Any]
-reveal_type(nditer_obj[1])  # E: Any
-reveal_type(nditer_obj[1:5])  # E: Any
-
-nditer_obj[1] = 1
-nditer_obj[1:5] = 1
-del nditer_obj[1]
-del nditer_obj[1:5]
diff --git a/numpy/typing/tests/data/reveal/nditer.pyi b/numpy/typing/tests/data/reveal/nditer.pyi
new file mode 100644 (file)
index 0000000..65861da
--- /dev/null
@@ -0,0 +1,46 @@
+import numpy as np
+
+nditer_obj: np.nditer
+
+reveal_type(np.nditer([0, 1], flags=["c_index"]))  # E: nditer
+reveal_type(np.nditer([0, 1], op_flags=[["readonly", "readonly"]]))  # E: nditer
+reveal_type(np.nditer([0, 1], op_dtypes=np.int_))  # E: nditer
+reveal_type(np.nditer([0, 1], order="C", casting="no"))  # E: nditer
+
+reveal_type(nditer_obj.dtypes)  # E: tuple[dtype[Any]]
+reveal_type(nditer_obj.finished)  # E: bool
+reveal_type(nditer_obj.has_delayed_bufalloc)  # E: bool
+reveal_type(nditer_obj.has_index)  # E: bool
+reveal_type(nditer_obj.has_multi_index)  # E: bool
+reveal_type(nditer_obj.index)  # E: int
+reveal_type(nditer_obj.iterationneedsapi)  # E: bool
+reveal_type(nditer_obj.iterindex)  # E: int
+reveal_type(nditer_obj.iterrange)  # E: tuple[builtins.int]
+reveal_type(nditer_obj.itersize)  # E: int
+reveal_type(nditer_obj.itviews)  # E: tuple[ndarray[Any, dtype[Any]]]
+reveal_type(nditer_obj.multi_index)  # E: tuple[builtins.int]
+reveal_type(nditer_obj.ndim)  # E: int
+reveal_type(nditer_obj.nop)  # E: int
+reveal_type(nditer_obj.operands)  # E: tuple[ndarray[Any, dtype[Any]]]
+reveal_type(nditer_obj.shape)  # E: tuple[builtins.int]
+reveal_type(nditer_obj.value)  # E: tuple[ndarray[Any, dtype[Any]]]
+
+reveal_type(nditer_obj.close())  # E: None
+reveal_type(nditer_obj.copy())  # E: nditer
+reveal_type(nditer_obj.debug_print())  # E: None
+reveal_type(nditer_obj.enable_external_loop())  # E: None
+reveal_type(nditer_obj.iternext())  # E: bool
+reveal_type(nditer_obj.remove_axis(0))  # E: None
+reveal_type(nditer_obj.remove_multi_index())  # E: None
+reveal_type(nditer_obj.reset())  # E: None
+
+reveal_type(len(nditer_obj))  # E: int
+reveal_type(iter(nditer_obj))  # E: Iterator[builtins.tuple[ndarray[Any, dtype[Any]]]]
+reveal_type(next(nditer_obj))  # E: tuple[ndarray[Any, dtype[Any]]]
+reveal_type(nditer_obj.__copy__())  # E: nditer
+with nditer_obj as f:
+    reveal_type(f)  # E: nditer
+reveal_type(nditer_obj[0])  # E: ndarray[Any, dtype[Any]]
+reveal_type(nditer_obj[:])  # E: tuple[ndarray[Any, dtype[Any]]]
+nditer_obj[0] = 0
+nditer_obj[:] = [0, 1]
diff --git a/numpy/typing/tests/data/reveal/nested_sequence.pyi b/numpy/typing/tests/data/reveal/nested_sequence.pyi
new file mode 100644 (file)
index 0000000..4d3aad4
--- /dev/null
@@ -0,0 +1,24 @@
+from typing import Sequence, Tuple, List, Any
+import numpy.typing as npt
+
+a: Sequence[int]
+b: Sequence[Sequence[int]]
+c: Sequence[Sequence[Sequence[int]]]
+d: Sequence[Sequence[Sequence[Sequence[int]]]]
+e: Sequence[bool]
+f: Tuple[int, ...]
+g: List[int]
+h: Sequence[Any]
+
+def func(a: npt._NestedSequence[int]) -> None:
+    ...
+
+reveal_type(func(a))  # E: None
+reveal_type(func(b))  # E: None
+reveal_type(func(c))  # E: None
+reveal_type(func(d))  # E: None
+reveal_type(func(e))  # E: None
+reveal_type(func(f))  # E: None
+reveal_type(func(g))  # E: None
+reveal_type(func(h))  # E: None
+reveal_type(func(range(15)))  # E: None
diff --git a/numpy/typing/tests/data/reveal/npyio.pyi b/numpy/typing/tests/data/reveal/npyio.pyi
new file mode 100644 (file)
index 0000000..637bdb6
--- /dev/null
@@ -0,0 +1,92 @@
+import re
+import pathlib
+from typing import IO, List
+
+import numpy.typing as npt
+import numpy as np
+
+str_path: str
+pathlib_path: pathlib.Path
+str_file: IO[str]
+bytes_file: IO[bytes]
+
+bag_obj: np.lib.npyio.BagObj[int]
+npz_file: np.lib.npyio.NpzFile
+
+AR_i8: npt.NDArray[np.int64]
+AR_LIKE_f8: List[float]
+
+class BytesWriter:
+    def write(self, data: bytes) -> None: ...
+
+class BytesReader:
+    def read(self, n: int = ...) -> bytes: ...
+    def seek(self, offset: int, whence: int = ...) -> int: ...
+
+bytes_writer: BytesWriter
+bytes_reader: BytesReader
+
+reveal_type(bag_obj.a)  # E: int
+reveal_type(bag_obj.b)  # E: int
+
+reveal_type(npz_file.zip)  # E: zipfile.ZipFile
+reveal_type(npz_file.fid)  # E: Union[None, typing.IO[builtins.str]]
+reveal_type(npz_file.files)  # E: list[builtins.str]
+reveal_type(npz_file.allow_pickle)  # E: bool
+reveal_type(npz_file.pickle_kwargs)  # E: Union[None, typing.Mapping[builtins.str, Any]]
+reveal_type(npz_file.f)  # E: lib.npyio.BagObj[lib.npyio.NpzFile]
+reveal_type(npz_file["test"])  # E: ndarray[Any, dtype[Any]]
+reveal_type(len(npz_file))  # E: int
+with npz_file as f:
+    reveal_type(f)  # E: lib.npyio.NpzFile
+
+reveal_type(np.load(bytes_file))  # E: Any
+reveal_type(np.load(pathlib_path, allow_pickle=True))  # E: Any
+reveal_type(np.load(str_path, encoding="bytes"))  # E: Any
+reveal_type(np.load(bytes_reader))  # E: Any
+
+reveal_type(np.save(bytes_file, AR_LIKE_f8))  # E: None
+reveal_type(np.save(pathlib_path, AR_i8, allow_pickle=True))  # E: None
+reveal_type(np.save(str_path, AR_LIKE_f8))  # E: None
+reveal_type(np.save(bytes_writer, AR_LIKE_f8))  # E: None
+
+reveal_type(np.savez(bytes_file, AR_LIKE_f8))  # E: None
+reveal_type(np.savez(pathlib_path, ar1=AR_i8, ar2=AR_i8))  # E: None
+reveal_type(np.savez(str_path, AR_LIKE_f8, ar1=AR_i8))  # E: None
+reveal_type(np.savez(bytes_writer, AR_LIKE_f8, ar1=AR_i8))  # E: None
+
+reveal_type(np.savez_compressed(bytes_file, AR_LIKE_f8))  # E: None
+reveal_type(np.savez_compressed(pathlib_path, ar1=AR_i8, ar2=AR_i8))  # E: None
+reveal_type(np.savez_compressed(str_path, AR_LIKE_f8, ar1=AR_i8))  # E: None
+reveal_type(np.savez_compressed(bytes_writer, AR_LIKE_f8, ar1=AR_i8))  # E: None
+
+reveal_type(np.loadtxt(bytes_file))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.loadtxt(pathlib_path, dtype=np.str_))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.loadtxt(str_path, dtype=str, skiprows=2))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.loadtxt(str_file, comments="test"))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.loadtxt(str_file, comments=None))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.loadtxt(str_path, delimiter="\n"))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.loadtxt(str_path, ndmin=2))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.loadtxt(["1", "2", "3"]))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.fromregex(bytes_file, "test", np.float64))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.fromregex(str_file, b"test", dtype=float))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.fromregex(str_path, re.compile("test"), dtype=np.str_, encoding="utf8"))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.fromregex(pathlib_path, "test", np.float64))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.fromregex(bytes_reader, "test", np.float64))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.genfromtxt(bytes_file))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.genfromtxt(pathlib_path, dtype=np.str_))  # E: ndarray[Any, dtype[str_]]
+reveal_type(np.genfromtxt(str_path, dtype=str, skiprows=2))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.genfromtxt(str_file, comments="test"))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.genfromtxt(str_path, delimiter="\n"))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.genfromtxt(str_path, ndmin=2))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.genfromtxt(["1", "2", "3"], ndmin=2))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.recfromtxt(bytes_file))  # E: recarray[Any, dtype[record]]
+reveal_type(np.recfromtxt(pathlib_path, usemask=True))  # E: ma.mrecords.MaskedRecords[Any, dtype[void]]
+reveal_type(np.recfromtxt(["1", "2", "3"]))  # E: recarray[Any, dtype[record]]
+
+reveal_type(np.recfromcsv(bytes_file))  # E: recarray[Any, dtype[record]]
+reveal_type(np.recfromcsv(pathlib_path, usemask=True))  # E: ma.mrecords.MaskedRecords[Any, dtype[void]]
+reveal_type(np.recfromcsv(["1", "2", "3"]))  # E: recarray[Any, dtype[record]]
diff --git a/numpy/typing/tests/data/reveal/numeric.py b/numpy/typing/tests/data/reveal/numeric.py
deleted file mode 100644 (file)
index ec6e47c..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-"""
-Tests for :mod:`numpy.core.numeric`.
-
-Does not include tests which fall under ``array_constructors``.
-
-"""
-
-from typing import List
-import numpy as np
-
-class SubClass(np.ndarray):
-    ...
-
-i8: np.int64
-
-A: np.ndarray
-B: List[int]
-C: SubClass
-
-reveal_type(np.count_nonzero(i8))  # E: int
-reveal_type(np.count_nonzero(A))  # E: int
-reveal_type(np.count_nonzero(B))  # E: int
-reveal_type(np.count_nonzero(A, keepdims=True))  # E: Any
-reveal_type(np.count_nonzero(A, axis=0))  # E: Any
-
-reveal_type(np.isfortran(i8))  # E: bool
-reveal_type(np.isfortran(A))  # E: bool
-
-reveal_type(np.argwhere(i8))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.argwhere(A))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.flatnonzero(i8))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.flatnonzero(A))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.correlate(B, A, mode="valid"))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.correlate(A, A, mode="same"))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.convolve(B, A, mode="valid"))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.convolve(A, A, mode="same"))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.outer(i8, A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.outer(B, A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.outer(A, A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.outer(A, A, out=C))  # E: SubClass
-
-reveal_type(np.tensordot(B, A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.tensordot(A, A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.tensordot(A, A, axes=0))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.tensordot(A, A, axes=(0, 1)))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.isscalar(i8))  # E: bool
-reveal_type(np.isscalar(A))  # E: bool
-reveal_type(np.isscalar(B))  # E: bool
-
-reveal_type(np.roll(A, 1))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.roll(A, (1, 2)))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.roll(B, 1))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.rollaxis(A, 0, 1))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.moveaxis(A, 0, 1))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.moveaxis(A, (0, 1), (1, 2)))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.cross(B, A))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.cross(A, A))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(np.indices([0, 1, 2]))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.indices([0, 1, 2], sparse=False))  # E: numpy.ndarray[Any, Any]
-reveal_type(np.indices([0, 1, 2], sparse=True))  # E: tuple[numpy.ndarray[Any, Any]]
-
-reveal_type(np.binary_repr(1))  # E: str
-
-reveal_type(np.base_repr(1))  # E: str
-
-reveal_type(np.allclose(i8, A))  # E: bool
-reveal_type(np.allclose(B, A))  # E: bool
-reveal_type(np.allclose(A, A))  # E: bool
-
-reveal_type(np.isclose(i8, A))  # E: Any
-reveal_type(np.isclose(B, A))  # E: Any
-reveal_type(np.isclose(A, A))  # E: Any
-
-reveal_type(np.array_equal(i8, A))  # E: bool
-reveal_type(np.array_equal(B, A))  # E: bool
-reveal_type(np.array_equal(A, A))  # E: bool
-
-reveal_type(np.array_equiv(i8, A))  # E: bool
-reveal_type(np.array_equiv(B, A))  # E: bool
-reveal_type(np.array_equiv(A, A))  # E: bool
diff --git a/numpy/typing/tests/data/reveal/numeric.pyi b/numpy/typing/tests/data/reveal/numeric.pyi
new file mode 100644 (file)
index 0000000..bf56539
--- /dev/null
@@ -0,0 +1,134 @@
+"""
+Tests for :mod:`core.numeric`.
+
+Does not include tests which fall under ``array_constructors``.
+
+"""
+
+from typing import List
+import numpy as np
+import numpy.typing as npt
+
+class SubClass(npt.NDArray[np.int64]):
+    ...
+
+i8: np.int64
+
+AR_b: npt.NDArray[np.bool_]
+AR_u8: npt.NDArray[np.uint64]
+AR_i8: npt.NDArray[np.int64]
+AR_f8: npt.NDArray[np.float64]
+AR_c16: npt.NDArray[np.complex128]
+AR_m: npt.NDArray[np.timedelta64]
+AR_O: npt.NDArray[np.object_]
+
+B: List[int]
+C: SubClass
+
+reveal_type(np.count_nonzero(i8))  # E: int
+reveal_type(np.count_nonzero(AR_i8))  # E: int
+reveal_type(np.count_nonzero(B))  # E: int
+reveal_type(np.count_nonzero(AR_i8, keepdims=True))  # E: Any
+reveal_type(np.count_nonzero(AR_i8, axis=0))  # E: Any
+
+reveal_type(np.isfortran(i8))  # E: bool
+reveal_type(np.isfortran(AR_i8))  # E: bool
+
+reveal_type(np.argwhere(i8))  # E: ndarray[Any, dtype[{intp}]]
+reveal_type(np.argwhere(AR_i8))  # E: ndarray[Any, dtype[{intp}]]
+
+reveal_type(np.flatnonzero(i8))  # E: ndarray[Any, dtype[{intp}]]
+reveal_type(np.flatnonzero(AR_i8))  # E: ndarray[Any, dtype[{intp}]]
+
+reveal_type(np.correlate(B, AR_i8, mode="valid"))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.correlate(AR_i8, AR_i8, mode="same"))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.correlate(AR_b, AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.correlate(AR_b, AR_u8))  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(np.correlate(AR_i8, AR_b))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.correlate(AR_i8, AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.correlate(AR_i8, AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.correlate(AR_i8, AR_m))  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(np.correlate(AR_O, AR_O))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.convolve(B, AR_i8, mode="valid"))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.convolve(AR_i8, AR_i8, mode="same"))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.convolve(AR_b, AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.convolve(AR_b, AR_u8))  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(np.convolve(AR_i8, AR_b))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.convolve(AR_i8, AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.convolve(AR_i8, AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.convolve(AR_i8, AR_m))  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(np.convolve(AR_O, AR_O))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.outer(i8, AR_i8))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.outer(B, AR_i8))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.outer(AR_i8, AR_i8))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.outer(AR_i8, AR_i8, out=C))  # E: SubClass
+reveal_type(np.outer(AR_b, AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.outer(AR_b, AR_u8))  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(np.outer(AR_i8, AR_b))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.convolve(AR_i8, AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.outer(AR_i8, AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.outer(AR_i8, AR_m))  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(np.outer(AR_O, AR_O))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.tensordot(B, AR_i8))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.tensordot(AR_i8, AR_i8))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.tensordot(AR_i8, AR_i8, axes=0))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.tensordot(AR_i8, AR_i8, axes=(0, 1)))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.tensordot(AR_b, AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.tensordot(AR_b, AR_u8))  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(np.tensordot(AR_i8, AR_b))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.tensordot(AR_i8, AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.tensordot(AR_i8, AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.tensordot(AR_i8, AR_m))  # E: ndarray[Any, dtype[timedelta64]]
+reveal_type(np.tensordot(AR_O, AR_O))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.isscalar(i8))  # E: bool
+reveal_type(np.isscalar(AR_i8))  # E: bool
+reveal_type(np.isscalar(B))  # E: bool
+
+reveal_type(np.roll(AR_i8, 1))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.roll(AR_i8, (1, 2)))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.roll(B, 1))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.rollaxis(AR_i8, 0, 1))  # E: ndarray[Any, dtype[{int64}]]
+
+reveal_type(np.moveaxis(AR_i8, 0, 1))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.moveaxis(AR_i8, (0, 1), (1, 2)))  # E: ndarray[Any, dtype[{int64}]]
+
+reveal_type(np.cross(B, AR_i8))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.cross(AR_i8, AR_i8))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.cross(AR_b, AR_u8))  # E: ndarray[Any, dtype[unsignedinteger[Any]]]
+reveal_type(np.cross(AR_i8, AR_b))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.cross(AR_i8, AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.cross(AR_i8, AR_c16))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.cross(AR_O, AR_O))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.indices([0, 1, 2]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(np.indices([0, 1, 2], sparse=True))  # E: tuple[ndarray[Any, dtype[{int_}]]]
+reveal_type(np.indices([0, 1, 2], dtype=np.float64))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.indices([0, 1, 2], sparse=True, dtype=np.float64))  # E: tuple[ndarray[Any, dtype[{float64}]]]
+reveal_type(np.indices([0, 1, 2], dtype=float))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.indices([0, 1, 2], sparse=True, dtype=float))  # E: tuple[ndarray[Any, dtype[Any]]]
+
+reveal_type(np.binary_repr(1))  # E: str
+
+reveal_type(np.base_repr(1))  # E: str
+
+reveal_type(np.allclose(i8, AR_i8))  # E: bool
+reveal_type(np.allclose(B, AR_i8))  # E: bool
+reveal_type(np.allclose(AR_i8, AR_i8))  # E: bool
+
+reveal_type(np.isclose(i8, i8))  # E: bool_
+reveal_type(np.isclose(i8, AR_i8))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isclose(B, AR_i8))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isclose(AR_i8, AR_i8))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.array_equal(i8, AR_i8))  # E: bool
+reveal_type(np.array_equal(B, AR_i8))  # E: bool
+reveal_type(np.array_equal(AR_i8, AR_i8))  # E: bool
+
+reveal_type(np.array_equiv(i8, AR_i8))  # E: bool
+reveal_type(np.array_equiv(B, AR_i8))  # E: bool
+reveal_type(np.array_equiv(AR_i8, AR_i8))  # E: bool
diff --git a/numpy/typing/tests/data/reveal/numerictypes.py b/numpy/typing/tests/data/reveal/numerictypes.py
deleted file mode 100644 (file)
index 0f886b3..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-import numpy as np
-
-reveal_type(np.issctype(np.generic))  # E: bool
-reveal_type(np.issctype("foo"))  # E: bool
-
-reveal_type(np.obj2sctype("S8"))  # E: Union[numpy.generic, None]
-reveal_type(np.obj2sctype("S8", default=None))  # E: Union[numpy.generic, None]
-reveal_type(
-    np.obj2sctype("foo", default=int)  # E: Union[numpy.generic, Type[builtins.int*]]
-)
-
-reveal_type(np.issubclass_(np.float64, float))  # E: bool
-reveal_type(np.issubclass_(np.float64, (int, float)))  # E: bool
-
-reveal_type(np.sctype2char("S8"))  # E: str
-reveal_type(np.sctype2char(list))  # E: str
-
-reveal_type(np.find_common_type([np.int64], [np.int64]))  # E: numpy.dtype
-
-reveal_type(np.cast[int])  # E: _CastFunc
-reveal_type(np.cast["i8"])  # E: _CastFunc
-reveal_type(np.cast[np.int64])  # E: _CastFunc
-
-reveal_type(np.nbytes[int])  # E: int
-reveal_type(np.nbytes["i8"])  # E: int
-reveal_type(np.nbytes[np.int64])  # E: int
-
-reveal_type(np.ScalarType)  # E: Tuple
-reveal_type(np.ScalarType[0])  # E: Type[builtins.int]
-reveal_type(np.ScalarType[4])  # E: Type[builtins.bool]
-reveal_type(np.ScalarType[9])  # E: Type[{csingle}]
-reveal_type(np.ScalarType[11])  # E: Type[{clongdouble}]
-
-reveal_type(np.typecodes["Character"])  # E: Literal['c']
-reveal_type(np.typecodes["Complex"])  # E: Literal['FDG']
-reveal_type(np.typecodes["All"])  # E: Literal['?bhilqpBHILQPefdgFDGSUVOMm']
diff --git a/numpy/typing/tests/data/reveal/numerictypes.pyi b/numpy/typing/tests/data/reveal/numerictypes.pyi
new file mode 100644 (file)
index 0000000..cc23352
--- /dev/null
@@ -0,0 +1,42 @@
+import numpy as np
+
+reveal_type(np.maximum_sctype(np.float64))  # E: Type[{float64}]
+reveal_type(np.maximum_sctype("f8"))  # E: Type[Any]
+
+reveal_type(np.issctype(np.float64))  # E: bool
+reveal_type(np.issctype("foo"))  # E: Literal[False]
+
+reveal_type(np.obj2sctype(np.float64))  # E: Union[None, Type[{float64}]]
+reveal_type(np.obj2sctype(np.float64, default=False))  # E: Union[builtins.bool, Type[{float64}]]
+reveal_type(np.obj2sctype("S8"))  # E: Union[None, Type[Any]]
+reveal_type(np.obj2sctype("S8", default=None))  # E: Union[None, Type[Any]]
+reveal_type(np.obj2sctype("foo", default=False))  # E: Union[builtins.bool, Type[Any]]
+reveal_type(np.obj2sctype(1))  # E: None
+reveal_type(np.obj2sctype(1, default=False))  # E: bool
+
+reveal_type(np.issubclass_(np.float64, float))  # E: bool
+reveal_type(np.issubclass_(np.float64, (int, float)))  # E: bool
+reveal_type(np.issubclass_(1, 1))  # E: Literal[False]
+
+reveal_type(np.sctype2char("S8"))  # E: str
+reveal_type(np.sctype2char(list))  # E: str
+
+reveal_type(np.find_common_type([np.int64], [np.int64]))  # E: dtype[Any]
+
+reveal_type(np.cast[int])  # E: _CastFunc
+reveal_type(np.cast["i8"])  # E: _CastFunc
+reveal_type(np.cast[np.int64])  # E: _CastFunc
+
+reveal_type(np.nbytes[int])  # E: int
+reveal_type(np.nbytes["i8"])  # E: int
+reveal_type(np.nbytes[np.int64])  # E: int
+
+reveal_type(np.ScalarType)  # E: Tuple
+reveal_type(np.ScalarType[0])  # E: Type[builtins.int]
+reveal_type(np.ScalarType[4])  # E: Type[builtins.bool]
+reveal_type(np.ScalarType[9])  # E: Type[{csingle}]
+reveal_type(np.ScalarType[11])  # E: Type[{clongdouble}]
+
+reveal_type(np.typecodes["Character"])  # E: Literal['c']
+reveal_type(np.typecodes["Complex"])  # E: Literal['FDG']
+reveal_type(np.typecodes["All"])  # E: Literal['?bhilqpBHILQPefdgFDGSUVOMm']
diff --git a/numpy/typing/tests/data/reveal/random.py b/numpy/typing/tests/data/reveal/random.py
deleted file mode 100644 (file)
index 6fc35ac..0000000
+++ /dev/null
@@ -1,1539 +0,0 @@
-from __future__ import annotations
-
-from typing import Any, List
-
-import numpy as np
-
-def_rng = np.random.default_rng()
-seed_seq = np.random.SeedSequence()
-mt19937 = np.random.MT19937()
-pcg64 = np.random.PCG64()
-sfc64 = np.random.SFC64()
-philox = np.random.Philox()
-seedless_seq = np.random.bit_generator.SeedlessSeedSequence()
-
-reveal_type(def_rng)  # E: numpy.random._generator.Generator
-reveal_type(mt19937)  # E: numpy.random._mt19937.MT19937
-reveal_type(pcg64)  # E: numpy.random._pcg64.PCG64
-reveal_type(sfc64)  # E: numpy.random._sfc64.SFC64
-reveal_type(philox)  # E: numpy.random._philox.Philox
-reveal_type(seed_seq)  # E: numpy.random.bit_generator.SeedSequence
-reveal_type(seedless_seq)  # E: numpy.random.bit_generator.SeedlessSeedSequence
-
-mt19937_jumped = mt19937.jumped()
-mt19937_jumped3 = mt19937.jumped(3)
-mt19937_raw = mt19937.random_raw()
-mt19937_raw_arr = mt19937.random_raw(5)
-
-reveal_type(mt19937_jumped)  # E: numpy.random._mt19937.MT19937
-reveal_type(mt19937_jumped3)  # E: numpy.random._mt19937.MT19937
-reveal_type(mt19937_raw)  # E: int
-reveal_type(mt19937_raw_arr)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(mt19937.lock)  # E: threading.Lock
-
-pcg64_jumped = pcg64.jumped()
-pcg64_jumped3 = pcg64.jumped(3)
-pcg64_adv = pcg64.advance(3)
-pcg64_raw = pcg64.random_raw()
-pcg64_raw_arr = pcg64.random_raw(5)
-
-reveal_type(pcg64_jumped)  # E: numpy.random._pcg64.PCG64
-reveal_type(pcg64_jumped3)  # E: numpy.random._pcg64.PCG64
-reveal_type(pcg64_adv)  # E: numpy.random._pcg64.PCG64
-reveal_type(pcg64_raw)  # E: int
-reveal_type(pcg64_raw_arr)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(pcg64.lock)  # E: threading.Lock
-
-philox_jumped = philox.jumped()
-philox_jumped3 = philox.jumped(3)
-philox_adv = philox.advance(3)
-philox_raw = philox.random_raw()
-philox_raw_arr = philox.random_raw(5)
-
-reveal_type(philox_jumped)  # E: numpy.random._philox.Philox
-reveal_type(philox_jumped3)  # E: numpy.random._philox.Philox
-reveal_type(philox_adv)  # E: numpy.random._philox.Philox
-reveal_type(philox_raw)  # E: int
-reveal_type(philox_raw_arr)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(philox.lock)  # E: threading.Lock
-
-sfc64_raw = sfc64.random_raw()
-sfc64_raw_arr = sfc64.random_raw(5)
-
-reveal_type(sfc64_raw)  # E: int
-reveal_type(sfc64_raw_arr)  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(sfc64.lock)  # E: threading.Lock
-
-reveal_type(seed_seq.pool)  # numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(seed_seq.entropy)  # E:Union[None, int, Sequence[int]]
-reveal_type(seed_seq.spawn(1))  # E: list[numpy.random.bit_generator.SeedSequence]
-reveal_type(seed_seq.generate_state(8, "uint32"))  # E: numpy.ndarray[Any, numpy.dtype[Union[numpy.unsignedinteger[numpy.typing._32Bit], numpy.unsignedinteger[numpy.typing._64Bit]]]]
-reveal_type(seed_seq.generate_state(8, "uint64"))  # E: numpy.ndarray[Any, numpy.dtype[Union[numpy.unsignedinteger[numpy.typing._32Bit], numpy.unsignedinteger[numpy.typing._64Bit]]]]
-
-
-def_gen: np.random.Generator = np.random.default_rng()
-
-D_arr_0p1: np.ndarray[Any, np.dtype[np.float64]] = np.array([0.1])
-D_arr_0p5: np.ndarray[Any, np.dtype[np.float64]] = np.array([0.5])
-D_arr_0p9: np.ndarray[Any, np.dtype[np.float64]] = np.array([0.9])
-D_arr_1p5: np.ndarray[Any, np.dtype[np.float64]] = np.array([1.5])
-I_arr_10: np.ndarray[Any, np.dtype[np.int_]] = np.array([10], dtype=np.int_)
-I_arr_20: np.ndarray[Any, np.dtype[np.int_]] = np.array([20], dtype=np.int_)
-D_arr_like_0p1: List[float] = [0.1]
-D_arr_like_0p5: List[float] = [0.5]
-D_arr_like_0p9: List[float] = [0.9]
-D_arr_like_1p5: List[float] = [1.5]
-I_arr_like_10: List[int] = [10]
-I_arr_like_20: List[int] = [20]
-D_2D_like: List[List[float]] = [[1, 2], [2, 3], [3, 4], [4, 5.1]]
-D_2D: np.ndarray[Any, np.dtype[np.float64]] = np.array(D_2D_like)
-S_out: np.ndarray[Any, np.dtype[np.float32]] = np.empty(1, dtype=np.float32)
-D_out: np.ndarray[Any, np.dtype[np.float64]] = np.empty(1)
-
-reveal_type(def_gen.standard_normal())  # E: float
-reveal_type(def_gen.standard_normal(dtype=np.float32))  # E: float
-reveal_type(def_gen.standard_normal(dtype="float32"))  # E: float
-reveal_type(def_gen.standard_normal(dtype="double"))  # E: float
-reveal_type(def_gen.standard_normal(dtype=np.float64))  # E: float
-reveal_type(def_gen.standard_normal(size=None))  # E: float
-reveal_type(def_gen.standard_normal(size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_normal(size=1, dtype=np.float32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.standard_normal(size=1, dtype="f4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.standard_normal(size=1, dtype="float32", out=S_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.standard_normal(dtype=np.float32, out=S_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.standard_normal(size=1, dtype=np.float64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_normal(size=1, dtype="float64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_normal(size=1, dtype="f8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_normal(out=D_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_normal(size=1, dtype="float64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_normal(size=1, dtype="float64", out=D_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.random())  # E: float
-reveal_type(def_gen.random(dtype=np.float32))  # E: float
-reveal_type(def_gen.random(dtype="float32"))  # E: float
-reveal_type(def_gen.random(dtype="double"))  # E: float
-reveal_type(def_gen.random(dtype=np.float64))  # E: float
-reveal_type(def_gen.random(size=None))  # E: float
-reveal_type(def_gen.random(size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.random(size=1, dtype=np.float32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.random(size=1, dtype="f4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.random(size=1, dtype="float32", out=S_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.random(dtype=np.float32, out=S_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.random(size=1, dtype=np.float64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.random(size=1, dtype="float64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.random(size=1, dtype="f8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.random(out=D_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.random(size=1, dtype="float64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.random(size=1, dtype="float64", out=D_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.standard_cauchy())  # E: float
-reveal_type(def_gen.standard_cauchy(size=None))  # E: float
-reveal_type(def_gen.standard_cauchy(size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.standard_exponential())  # E: float
-reveal_type(def_gen.standard_exponential(method="inv"))  # E: float
-reveal_type(def_gen.standard_exponential(dtype=np.float32))  # E: float
-reveal_type(def_gen.standard_exponential(dtype="float32"))  # E: float
-reveal_type(def_gen.standard_exponential(dtype="double"))  # E: float
-reveal_type(def_gen.standard_exponential(dtype=np.float64))  # E: float
-reveal_type(def_gen.standard_exponential(size=None))  # E: float
-reveal_type(def_gen.standard_exponential(size=None, method="inv"))  # E: float
-reveal_type(def_gen.standard_exponential(size=1, method="inv"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_exponential(size=1, dtype=np.float32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.standard_exponential(size=1, dtype="f4", method="inv"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.standard_exponential(size=1, dtype="float32", out=S_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.standard_exponential(dtype=np.float32, out=S_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.standard_exponential(size=1, dtype=np.float64, method="inv"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_exponential(size=1, dtype="float64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_exponential(size=1, dtype="f8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_exponential(out=D_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_exponential(size=1, dtype="float64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_exponential(size=1, dtype="float64", out=D_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.zipf(1.5))  # E: int
-reveal_type(def_gen.zipf(1.5, size=None))  # E: int
-reveal_type(def_gen.zipf(1.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.zipf(D_arr_1p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.zipf(D_arr_1p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.zipf(D_arr_like_1p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.zipf(D_arr_like_1p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.weibull(0.5))  # E: float
-reveal_type(def_gen.weibull(0.5, size=None))  # E: float
-reveal_type(def_gen.weibull(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.weibull(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.weibull(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.weibull(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.weibull(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.standard_t(0.5))  # E: float
-reveal_type(def_gen.standard_t(0.5, size=None))  # E: float
-reveal_type(def_gen.standard_t(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.standard_t(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.standard_t(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.standard_t(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.standard_t(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.poisson(0.5))  # E: int
-reveal_type(def_gen.poisson(0.5, size=None))  # E: int
-reveal_type(def_gen.poisson(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.poisson(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.poisson(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.poisson(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.poisson(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.power(0.5))  # E: float
-reveal_type(def_gen.power(0.5, size=None))  # E: float
-reveal_type(def_gen.power(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.power(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.power(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.power(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.power(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.pareto(0.5))  # E: float
-reveal_type(def_gen.pareto(0.5, size=None))  # E: float
-reveal_type(def_gen.pareto(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.pareto(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.pareto(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.pareto(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.pareto(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.chisquare(0.5))  # E: float
-reveal_type(def_gen.chisquare(0.5, size=None))  # E: float
-reveal_type(def_gen.chisquare(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.chisquare(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.chisquare(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.chisquare(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.chisquare(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.exponential(0.5))  # E: float
-reveal_type(def_gen.exponential(0.5, size=None))  # E: float
-reveal_type(def_gen.exponential(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.exponential(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.exponential(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.exponential(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.exponential(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.geometric(0.5))  # E: int
-reveal_type(def_gen.geometric(0.5, size=None))  # E: int
-reveal_type(def_gen.geometric(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.geometric(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.geometric(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.geometric(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.geometric(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.logseries(0.5))  # E: int
-reveal_type(def_gen.logseries(0.5, size=None))  # E: int
-reveal_type(def_gen.logseries(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.logseries(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.logseries(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.logseries(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.logseries(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.rayleigh(0.5))  # E: float
-reveal_type(def_gen.rayleigh(0.5, size=None))  # E: float
-reveal_type(def_gen.rayleigh(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.rayleigh(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.rayleigh(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.rayleigh(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.rayleigh(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.standard_gamma(0.5))  # E: float
-reveal_type(def_gen.standard_gamma(0.5, size=None))  # E: float
-reveal_type(def_gen.standard_gamma(0.5, dtype="float32"))  # E: float
-reveal_type(def_gen.standard_gamma(0.5, size=None, dtype="float32"))  # E: float
-reveal_type(def_gen.standard_gamma(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_gamma(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_gamma(D_arr_0p5, dtype="f4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.standard_gamma(0.5, size=1, dtype="float32", out=S_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.standard_gamma(D_arr_0p5, dtype=np.float32, out=S_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._32Bit]]]
-reveal_type(def_gen.standard_gamma(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_gamma(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_gamma(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_gamma(0.5, out=D_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_gamma(D_arr_like_0p5, out=D_out))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_gamma(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(def_gen.standard_gamma(D_arr_like_0p5, size=1, out=D_out, dtype=np.float64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.vonmises(0.5, 0.5))  # E: float
-reveal_type(def_gen.vonmises(0.5, 0.5, size=None))  # E: float
-reveal_type(def_gen.vonmises(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.vonmises(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.vonmises(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.vonmises(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.vonmises(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.vonmises(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.vonmises(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.vonmises(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.vonmises(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.vonmises(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.vonmises(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.wald(0.5, 0.5))  # E: float
-reveal_type(def_gen.wald(0.5, 0.5, size=None))  # E: float
-reveal_type(def_gen.wald(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.wald(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.wald(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.wald(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.wald(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.wald(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.wald(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.wald(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.wald(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.wald(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.wald(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.uniform(0.5, 0.5))  # E: float
-reveal_type(def_gen.uniform(0.5, 0.5, size=None))  # E: float
-reveal_type(def_gen.uniform(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.uniform(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.uniform(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.uniform(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.uniform(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.uniform(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.uniform(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.uniform(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.uniform(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.uniform(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.uniform(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.beta(0.5, 0.5))  # E: float
-reveal_type(def_gen.beta(0.5, 0.5, size=None))  # E: float
-reveal_type(def_gen.beta(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.beta(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.beta(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.beta(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.beta(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.beta(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.beta(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.beta(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.beta(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.beta(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.beta(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.f(0.5, 0.5))  # E: float
-reveal_type(def_gen.f(0.5, 0.5, size=None))  # E: float
-reveal_type(def_gen.f(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.f(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.f(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.f(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.f(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.f(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.f(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.f(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.f(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.f(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.f(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.gamma(0.5, 0.5))  # E: float
-reveal_type(def_gen.gamma(0.5, 0.5, size=None))  # E: float
-reveal_type(def_gen.gamma(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gamma(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gamma(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gamma(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gamma(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gamma(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gamma(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gamma(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gamma(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gamma(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gamma(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.gumbel(0.5, 0.5))  # E: float
-reveal_type(def_gen.gumbel(0.5, 0.5, size=None))  # E: float
-reveal_type(def_gen.gumbel(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gumbel(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gumbel(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gumbel(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gumbel(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gumbel(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gumbel(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gumbel(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gumbel(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gumbel(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.gumbel(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.laplace(0.5, 0.5))  # E: float
-reveal_type(def_gen.laplace(0.5, 0.5, size=None))  # E: float
-reveal_type(def_gen.laplace(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.laplace(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.laplace(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.laplace(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.laplace(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.laplace(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.laplace(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.laplace(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.laplace(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.laplace(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.laplace(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.logistic(0.5, 0.5))  # E: float
-reveal_type(def_gen.logistic(0.5, 0.5, size=None))  # E: float
-reveal_type(def_gen.logistic(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.logistic(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.logistic(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.logistic(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.logistic(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.logistic(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.logistic(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.logistic(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.logistic(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.logistic(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.logistic(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.lognormal(0.5, 0.5))  # E: float
-reveal_type(def_gen.lognormal(0.5, 0.5, size=None))  # E: float
-reveal_type(def_gen.lognormal(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.lognormal(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.lognormal(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.lognormal(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.lognormal(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.lognormal(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.lognormal(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.lognormal(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.lognormal(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.lognormal(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.lognormal(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.noncentral_chisquare(0.5, 0.5))  # E: float
-reveal_type(def_gen.noncentral_chisquare(0.5, 0.5, size=None))  # E: float
-reveal_type(def_gen.noncentral_chisquare(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_chisquare(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_chisquare(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_chisquare(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_chisquare(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_chisquare(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_chisquare(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_chisquare(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_chisquare(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_chisquare(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_chisquare(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.normal(0.5, 0.5))  # E: float
-reveal_type(def_gen.normal(0.5, 0.5, size=None))  # E: float
-reveal_type(def_gen.normal(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.normal(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.normal(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.normal(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.normal(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.normal(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.normal(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.normal(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.normal(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.normal(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.normal(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.triangular(0.1, 0.5, 0.9))  # E: float
-reveal_type(def_gen.triangular(0.1, 0.5, 0.9, size=None))  # E: float
-reveal_type(def_gen.triangular(0.1, 0.5, 0.9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.triangular(D_arr_0p1, 0.5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.triangular(0.1, D_arr_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.triangular(D_arr_0p1, 0.5, D_arr_like_0p9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.triangular(0.1, D_arr_0p5, 0.9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.triangular(D_arr_like_0p1, 0.5, D_arr_0p9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.triangular(0.5, D_arr_like_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.triangular(D_arr_0p1, D_arr_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.triangular(D_arr_like_0p1, D_arr_like_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.triangular(D_arr_0p1, D_arr_0p5, D_arr_0p9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.triangular(D_arr_like_0p1, D_arr_like_0p5, D_arr_like_0p9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.noncentral_f(0.1, 0.5, 0.9))  # E: float
-reveal_type(def_gen.noncentral_f(0.1, 0.5, 0.9, size=None))  # E: float
-reveal_type(def_gen.noncentral_f(0.1, 0.5, 0.9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_f(D_arr_0p1, 0.5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_f(0.1, D_arr_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_f(D_arr_0p1, 0.5, D_arr_like_0p9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_f(0.1, D_arr_0p5, 0.9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_f(D_arr_like_0p1, 0.5, D_arr_0p9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_f(0.5, D_arr_like_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_f(D_arr_0p1, D_arr_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_f(D_arr_like_0p1, D_arr_like_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_f(D_arr_0p1, D_arr_0p5, D_arr_0p9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.noncentral_f(D_arr_like_0p1, D_arr_like_0p5, D_arr_like_0p9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.binomial(10, 0.5))  # E: int
-reveal_type(def_gen.binomial(10, 0.5, size=None))  # E: int
-reveal_type(def_gen.binomial(10, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.binomial(I_arr_10, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.binomial(10, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.binomial(I_arr_10, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.binomial(10, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.binomial(I_arr_like_10, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.binomial(10, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.binomial(I_arr_10, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.binomial(I_arr_like_10, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.binomial(I_arr_10, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.binomial(I_arr_like_10, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.negative_binomial(10, 0.5))  # E: int
-reveal_type(def_gen.negative_binomial(10, 0.5, size=None))  # E: int
-reveal_type(def_gen.negative_binomial(10, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.negative_binomial(I_arr_10, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.negative_binomial(10, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.negative_binomial(I_arr_10, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.negative_binomial(10, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.negative_binomial(I_arr_like_10, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.negative_binomial(10, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.negative_binomial(I_arr_10, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.negative_binomial(I_arr_like_10, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.negative_binomial(I_arr_10, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.negative_binomial(I_arr_like_10, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.hypergeometric(20, 20, 10))  # E: int
-reveal_type(def_gen.hypergeometric(20, 20, 10, size=None))  # E: int
-reveal_type(def_gen.hypergeometric(20, 20, 10, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.hypergeometric(I_arr_20, 20, 10))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.hypergeometric(20, I_arr_20, 10))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.hypergeometric(I_arr_20, 20, I_arr_like_10, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.hypergeometric(20, I_arr_20, 10, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.hypergeometric(I_arr_like_20, 20, I_arr_10))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.hypergeometric(20, I_arr_like_20, 10))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.hypergeometric(I_arr_20, I_arr_20, 10))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.hypergeometric(I_arr_like_20, I_arr_like_20, 10))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.hypergeometric(I_arr_20, I_arr_20, I_arr_10, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.hypergeometric(I_arr_like_20, I_arr_like_20, I_arr_like_10, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-I_int64_100: np.ndarray[Any, np.dtype[np.int64]] = np.array([100], dtype=np.int64)
-
-reveal_type(def_gen.integers(0, 100))  # E: int
-reveal_type(def_gen.integers(100))  # E: int
-reveal_type(def_gen.integers([100]))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(0, [100]))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-I_bool_low: np.ndarray[Any, np.dtype[np.bool_]] = np.array([0], dtype=np.bool_)
-I_bool_low_like: List[int] = [0]
-I_bool_high_open: np.ndarray[Any, np.dtype[np.bool_]] = np.array([1], dtype=np.bool_)
-I_bool_high_closed: np.ndarray[Any, np.dtype[np.bool_]] = np.array([1], dtype=np.bool_)
-
-reveal_type(def_gen.integers(2, dtype=bool))  # E: builtins.bool
-reveal_type(def_gen.integers(0, 2, dtype=bool))  # E: builtins.bool
-reveal_type(def_gen.integers(1, dtype=bool, endpoint=True))  # E: builtins.bool
-reveal_type(def_gen.integers(0, 1, dtype=bool, endpoint=True))  # E: builtins.bool
-reveal_type(def_gen.integers(I_bool_low_like, 1, dtype=bool, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(def_gen.integers(I_bool_high_open, dtype=bool))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(def_gen.integers(I_bool_low, I_bool_high_open, dtype=bool))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(def_gen.integers(0, I_bool_high_open, dtype=bool))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(def_gen.integers(I_bool_high_closed, dtype=bool, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(def_gen.integers(I_bool_low, I_bool_high_closed, dtype=bool, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(def_gen.integers(0, I_bool_high_closed, dtype=bool, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-
-reveal_type(def_gen.integers(2, dtype=np.bool_))  # E: builtins.bool
-reveal_type(def_gen.integers(0, 2, dtype=np.bool_))  # E: builtins.bool
-reveal_type(def_gen.integers(1, dtype=np.bool_, endpoint=True))  # E: builtins.bool
-reveal_type(def_gen.integers(0, 1, dtype=np.bool_, endpoint=True))  # E: builtins.bool
-reveal_type(def_gen.integers(I_bool_low_like, 1, dtype=np.bool_, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(def_gen.integers(I_bool_high_open, dtype=np.bool_))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(def_gen.integers(I_bool_low, I_bool_high_open, dtype=np.bool_))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(def_gen.integers(0, I_bool_high_open, dtype=np.bool_))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(def_gen.integers(I_bool_high_closed, dtype=np.bool_, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(def_gen.integers(I_bool_low, I_bool_high_closed, dtype=np.bool_, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(def_gen.integers(0, I_bool_high_closed, dtype=np.bool_, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-
-I_u1_low: np.ndarray[Any, np.dtype[np.uint8]] = np.array([0], dtype=np.uint8)
-I_u1_low_like: List[int] = [0]
-I_u1_high_open: np.ndarray[Any, np.dtype[np.uint8]] = np.array([255], dtype=np.uint8)
-I_u1_high_closed: np.ndarray[Any, np.dtype[np.uint8]] = np.array([255], dtype=np.uint8)
-
-reveal_type(def_gen.integers(256, dtype="u1"))  # E: int
-reveal_type(def_gen.integers(0, 256, dtype="u1"))  # E: int
-reveal_type(def_gen.integers(255, dtype="u1", endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 255, dtype="u1", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u1_low_like, 255, dtype="u1", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_u1_high_open, dtype="u1"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_u1_low, I_u1_high_open, dtype="u1"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(0, I_u1_high_open, dtype="u1"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_u1_high_closed, dtype="u1", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_u1_low, I_u1_high_closed, dtype="u1", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(0, I_u1_high_closed, dtype="u1", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-
-reveal_type(def_gen.integers(256, dtype="uint8"))  # E: int
-reveal_type(def_gen.integers(0, 256, dtype="uint8"))  # E: int
-reveal_type(def_gen.integers(255, dtype="uint8", endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 255, dtype="uint8", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u1_low_like, 255, dtype="uint8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_u1_high_open, dtype="uint8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_u1_low, I_u1_high_open, dtype="uint8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(0, I_u1_high_open, dtype="uint8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_u1_high_closed, dtype="uint8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_u1_low, I_u1_high_closed, dtype="uint8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(0, I_u1_high_closed, dtype="uint8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-
-reveal_type(def_gen.integers(256, dtype=np.uint8))  # E: int
-reveal_type(def_gen.integers(0, 256, dtype=np.uint8))  # E: int
-reveal_type(def_gen.integers(255, dtype=np.uint8, endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 255, dtype=np.uint8, endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u1_low_like, 255, dtype=np.uint8, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_u1_high_open, dtype=np.uint8))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_u1_low, I_u1_high_open, dtype=np.uint8))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(0, I_u1_high_open, dtype=np.uint8))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_u1_high_closed, dtype=np.uint8, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_u1_low, I_u1_high_closed, dtype=np.uint8, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(0, I_u1_high_closed, dtype=np.uint8, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-
-I_u2_low: np.ndarray[Any, np.dtype[np.uint16]] = np.array([0], dtype=np.uint16)
-I_u2_low_like: List[int] = [0]
-I_u2_high_open: np.ndarray[Any, np.dtype[np.uint16]] = np.array([65535], dtype=np.uint16)
-I_u2_high_closed: np.ndarray[Any, np.dtype[np.uint16]] = np.array([65535], dtype=np.uint16)
-
-reveal_type(def_gen.integers(65536, dtype="u2"))  # E: int
-reveal_type(def_gen.integers(0, 65536, dtype="u2"))  # E: int
-reveal_type(def_gen.integers(65535, dtype="u2", endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 65535, dtype="u2", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u2_low_like, 65535, dtype="u2", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_u2_high_open, dtype="u2"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_u2_low, I_u2_high_open, dtype="u2"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(0, I_u2_high_open, dtype="u2"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_u2_high_closed, dtype="u2", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_u2_low, I_u2_high_closed, dtype="u2", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(0, I_u2_high_closed, dtype="u2", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-
-reveal_type(def_gen.integers(65536, dtype="uint16"))  # E: int
-reveal_type(def_gen.integers(0, 65536, dtype="uint16"))  # E: int
-reveal_type(def_gen.integers(65535, dtype="uint16", endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 65535, dtype="uint16", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u2_low_like, 65535, dtype="uint16", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_u2_high_open, dtype="uint16"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_u2_low, I_u2_high_open, dtype="uint16"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(0, I_u2_high_open, dtype="uint16"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_u2_high_closed, dtype="uint16", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_u2_low, I_u2_high_closed, dtype="uint16", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(0, I_u2_high_closed, dtype="uint16", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-
-reveal_type(def_gen.integers(65536, dtype=np.uint16))  # E: int
-reveal_type(def_gen.integers(0, 65536, dtype=np.uint16))  # E: int
-reveal_type(def_gen.integers(65535, dtype=np.uint16, endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 65535, dtype=np.uint16, endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u2_low_like, 65535, dtype=np.uint16, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_u2_high_open, dtype=np.uint16))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_u2_low, I_u2_high_open, dtype=np.uint16))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(0, I_u2_high_open, dtype=np.uint16))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_u2_high_closed, dtype=np.uint16, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_u2_low, I_u2_high_closed, dtype=np.uint16, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(0, I_u2_high_closed, dtype=np.uint16, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-
-I_u4_low: np.ndarray[Any, np.dtype[np.uint32]] = np.array([0], dtype=np.uint32)
-I_u4_low_like: List[int] = [0]
-I_u4_high_open: np.ndarray[Any, np.dtype[np.uint32]] = np.array([4294967295], dtype=np.uint32)
-I_u4_high_closed: np.ndarray[Any, np.dtype[np.uint32]] = np.array([4294967295], dtype=np.uint32)
-
-reveal_type(def_gen.integers(4294967296, dtype=np.int_))  # E: int
-reveal_type(def_gen.integers(0, 4294967296, dtype=np.int_))  # E: int
-reveal_type(def_gen.integers(4294967295, dtype=np.int_, endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 4294967295, dtype=np.int_, endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u4_low_like, 4294967295, dtype=np.int_, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(def_gen.integers(I_u4_high_open, dtype=np.int_))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(def_gen.integers(I_u4_low, I_u4_high_open, dtype=np.int_))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(def_gen.integers(0, I_u4_high_open, dtype=np.int_))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(def_gen.integers(I_u4_high_closed, dtype=np.int_, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(def_gen.integers(I_u4_low, I_u4_high_closed, dtype=np.int_, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(def_gen.integers(0, I_u4_high_closed, dtype=np.int_, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-
-reveal_type(def_gen.integers(4294967296, dtype="u4"))  # E: int
-reveal_type(def_gen.integers(0, 4294967296, dtype="u4"))  # E: int
-reveal_type(def_gen.integers(4294967295, dtype="u4", endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 4294967295, dtype="u4", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u4_low_like, 4294967295, dtype="u4", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_u4_high_open, dtype="u4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_u4_low, I_u4_high_open, dtype="u4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(0, I_u4_high_open, dtype="u4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_u4_high_closed, dtype="u4", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_u4_low, I_u4_high_closed, dtype="u4", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(0, I_u4_high_closed, dtype="u4", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-
-reveal_type(def_gen.integers(4294967296, dtype="uint32"))  # E: int
-reveal_type(def_gen.integers(0, 4294967296, dtype="uint32"))  # E: int
-reveal_type(def_gen.integers(4294967295, dtype="uint32", endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 4294967295, dtype="uint32", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u4_low_like, 4294967295, dtype="uint32", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_u4_high_open, dtype="uint32"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_u4_low, I_u4_high_open, dtype="uint32"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(0, I_u4_high_open, dtype="uint32"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_u4_high_closed, dtype="uint32", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_u4_low, I_u4_high_closed, dtype="uint32", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(0, I_u4_high_closed, dtype="uint32", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-
-reveal_type(def_gen.integers(4294967296, dtype=np.uint32))  # E: int
-reveal_type(def_gen.integers(0, 4294967296, dtype=np.uint32))  # E: int
-reveal_type(def_gen.integers(4294967295, dtype=np.uint32, endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 4294967295, dtype=np.uint32, endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u4_low_like, 4294967295, dtype=np.uint32, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_u4_high_open, dtype=np.uint32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_u4_low, I_u4_high_open, dtype=np.uint32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(0, I_u4_high_open, dtype=np.uint32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_u4_high_closed, dtype=np.uint32, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_u4_low, I_u4_high_closed, dtype=np.uint32, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(0, I_u4_high_closed, dtype=np.uint32, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-
-reveal_type(def_gen.integers(4294967296, dtype=np.uint))  # E: int
-reveal_type(def_gen.integers(0, 4294967296, dtype=np.uint))  # E: int
-reveal_type(def_gen.integers(4294967295, dtype=np.uint, endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 4294967295, dtype=np.uint, endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u4_low_like, 4294967295, dtype=np.uint, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[{uint}]]
-reveal_type(def_gen.integers(I_u4_high_open, dtype=np.uint))  # E: numpy.ndarray[Any, numpy.dtype[{uint}]]
-reveal_type(def_gen.integers(I_u4_low, I_u4_high_open, dtype=np.uint))  # E: numpy.ndarray[Any, numpy.dtype[{uint}]]
-reveal_type(def_gen.integers(0, I_u4_high_open, dtype=np.uint))  # E: numpy.ndarray[Any, numpy.dtype[{uint}]]
-reveal_type(def_gen.integers(I_u4_high_closed, dtype=np.uint, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[{uint}]]
-reveal_type(def_gen.integers(I_u4_low, I_u4_high_closed, dtype=np.uint, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[{uint}]]
-reveal_type(def_gen.integers(0, I_u4_high_closed, dtype=np.uint, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[{uint}]]
-
-I_u8_low: np.ndarray[Any, np.dtype[np.uint64]] = np.array([0], dtype=np.uint64)
-I_u8_low_like: List[int] = [0]
-I_u8_high_open: np.ndarray[Any, np.dtype[np.uint64]] = np.array([18446744073709551615], dtype=np.uint64)
-I_u8_high_closed: np.ndarray[Any, np.dtype[np.uint64]] = np.array([18446744073709551615], dtype=np.uint64)
-
-reveal_type(def_gen.integers(18446744073709551616, dtype="u8"))  # E: int
-reveal_type(def_gen.integers(0, 18446744073709551616, dtype="u8"))  # E: int
-reveal_type(def_gen.integers(18446744073709551615, dtype="u8", endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 18446744073709551615, dtype="u8", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u8_low_like, 18446744073709551615, dtype="u8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_u8_high_open, dtype="u8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_u8_low, I_u8_high_open, dtype="u8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(0, I_u8_high_open, dtype="u8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_u8_high_closed, dtype="u8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_u8_low, I_u8_high_closed, dtype="u8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(0, I_u8_high_closed, dtype="u8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.integers(18446744073709551616, dtype="uint64"))  # E: int
-reveal_type(def_gen.integers(0, 18446744073709551616, dtype="uint64"))  # E: int
-reveal_type(def_gen.integers(18446744073709551615, dtype="uint64", endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 18446744073709551615, dtype="uint64", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u8_low_like, 18446744073709551615, dtype="uint64", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_u8_high_open, dtype="uint64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_u8_low, I_u8_high_open, dtype="uint64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(0, I_u8_high_open, dtype="uint64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_u8_high_closed, dtype="uint64", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_u8_low, I_u8_high_closed, dtype="uint64", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(0, I_u8_high_closed, dtype="uint64", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.integers(18446744073709551616, dtype=np.uint64))  # E: int
-reveal_type(def_gen.integers(0, 18446744073709551616, dtype=np.uint64))  # E: int
-reveal_type(def_gen.integers(18446744073709551615, dtype=np.uint64, endpoint=True))  # E: int
-reveal_type(def_gen.integers(0, 18446744073709551615, dtype=np.uint64, endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_u8_low_like, 18446744073709551615, dtype=np.uint64, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_u8_high_open, dtype=np.uint64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_u8_low, I_u8_high_open, dtype=np.uint64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(0, I_u8_high_open, dtype=np.uint64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_u8_high_closed, dtype=np.uint64, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_u8_low, I_u8_high_closed, dtype=np.uint64, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(0, I_u8_high_closed, dtype=np.uint64, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-
-I_i1_low: np.ndarray[Any, np.dtype[np.int8]] = np.array([-128], dtype=np.int8)
-I_i1_low_like: List[int] = [-128]
-I_i1_high_open: np.ndarray[Any, np.dtype[np.int8]] = np.array([127], dtype=np.int8)
-I_i1_high_closed: np.ndarray[Any, np.dtype[np.int8]] = np.array([127], dtype=np.int8)
-
-reveal_type(def_gen.integers(128, dtype="i1"))  # E: int
-reveal_type(def_gen.integers(-128, 128, dtype="i1"))  # E: int
-reveal_type(def_gen.integers(127, dtype="i1", endpoint=True))  # E: int
-reveal_type(def_gen.integers(-128, 127, dtype="i1", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_i1_low_like, 127, dtype="i1", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_i1_high_open, dtype="i1"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_i1_low, I_i1_high_open, dtype="i1"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(-128, I_i1_high_open, dtype="i1"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_i1_high_closed, dtype="i1", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_i1_low, I_i1_high_closed, dtype="i1", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(-128, I_i1_high_closed, dtype="i1", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-
-reveal_type(def_gen.integers(128, dtype="int8"))  # E: int
-reveal_type(def_gen.integers(-128, 128, dtype="int8"))  # E: int
-reveal_type(def_gen.integers(127, dtype="int8", endpoint=True))  # E: int
-reveal_type(def_gen.integers(-128, 127, dtype="int8", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_i1_low_like, 127, dtype="int8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_i1_high_open, dtype="int8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_i1_low, I_i1_high_open, dtype="int8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(-128, I_i1_high_open, dtype="int8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_i1_high_closed, dtype="int8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_i1_low, I_i1_high_closed, dtype="int8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(-128, I_i1_high_closed, dtype="int8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-
-reveal_type(def_gen.integers(128, dtype=np.int8))  # E: int
-reveal_type(def_gen.integers(-128, 128, dtype=np.int8))  # E: int
-reveal_type(def_gen.integers(127, dtype=np.int8, endpoint=True))  # E: int
-reveal_type(def_gen.integers(-128, 127, dtype=np.int8, endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_i1_low_like, 127, dtype=np.int8, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_i1_high_open, dtype=np.int8))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_i1_low, I_i1_high_open, dtype=np.int8))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(-128, I_i1_high_open, dtype=np.int8))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_i1_high_closed, dtype=np.int8, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(I_i1_low, I_i1_high_closed, dtype=np.int8, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(def_gen.integers(-128, I_i1_high_closed, dtype=np.int8, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-
-I_i2_low: np.ndarray[Any, np.dtype[np.int16]] = np.array([-32768], dtype=np.int16)
-I_i2_low_like: List[int] = [-32768]
-I_i2_high_open: np.ndarray[Any, np.dtype[np.int16]] = np.array([32767], dtype=np.int16)
-I_i2_high_closed: np.ndarray[Any, np.dtype[np.int16]] = np.array([32767], dtype=np.int16)
-
-reveal_type(def_gen.integers(32768, dtype="i2"))  # E: int
-reveal_type(def_gen.integers(-32768, 32768, dtype="i2"))  # E: int
-reveal_type(def_gen.integers(32767, dtype="i2", endpoint=True))  # E: int
-reveal_type(def_gen.integers(-32768, 32767, dtype="i2", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_i2_low_like, 32767, dtype="i2", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_i2_high_open, dtype="i2"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_i2_low, I_i2_high_open, dtype="i2"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(-32768, I_i2_high_open, dtype="i2"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_i2_high_closed, dtype="i2", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_i2_low, I_i2_high_closed, dtype="i2", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(-32768, I_i2_high_closed, dtype="i2", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-
-reveal_type(def_gen.integers(32768, dtype="int16"))  # E: int
-reveal_type(def_gen.integers(-32768, 32768, dtype="int16"))  # E: int
-reveal_type(def_gen.integers(32767, dtype="int16", endpoint=True))  # E: int
-reveal_type(def_gen.integers(-32768, 32767, dtype="int16", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_i2_low_like, 32767, dtype="int16", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_i2_high_open, dtype="int16"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_i2_low, I_i2_high_open, dtype="int16"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(-32768, I_i2_high_open, dtype="int16"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_i2_high_closed, dtype="int16", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_i2_low, I_i2_high_closed, dtype="int16", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(-32768, I_i2_high_closed, dtype="int16", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-
-reveal_type(def_gen.integers(32768, dtype=np.int16))  # E: int
-reveal_type(def_gen.integers(-32768, 32768, dtype=np.int16))  # E: int
-reveal_type(def_gen.integers(32767, dtype=np.int16, endpoint=True))  # E: int
-reveal_type(def_gen.integers(-32768, 32767, dtype=np.int16, endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_i2_low_like, 32767, dtype=np.int16, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_i2_high_open, dtype=np.int16))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_i2_low, I_i2_high_open, dtype=np.int16))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(-32768, I_i2_high_open, dtype=np.int16))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_i2_high_closed, dtype=np.int16, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(I_i2_low, I_i2_high_closed, dtype=np.int16, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(def_gen.integers(-32768, I_i2_high_closed, dtype=np.int16, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-
-I_i4_low: np.ndarray[Any, np.dtype[np.int32]] = np.array([-2147483648], dtype=np.int32)
-I_i4_low_like: List[int] = [-2147483648]
-I_i4_high_open: np.ndarray[Any, np.dtype[np.int32]] = np.array([2147483647], dtype=np.int32)
-I_i4_high_closed: np.ndarray[Any, np.dtype[np.int32]] = np.array([2147483647], dtype=np.int32)
-
-reveal_type(def_gen.integers(2147483648, dtype="i4"))  # E: int
-reveal_type(def_gen.integers(-2147483648, 2147483648, dtype="i4"))  # E: int
-reveal_type(def_gen.integers(2147483647, dtype="i4", endpoint=True))  # E: int
-reveal_type(def_gen.integers(-2147483648, 2147483647, dtype="i4", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_i4_low_like, 2147483647, dtype="i4", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_i4_high_open, dtype="i4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_i4_low, I_i4_high_open, dtype="i4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(-2147483648, I_i4_high_open, dtype="i4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_i4_high_closed, dtype="i4", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_i4_low, I_i4_high_closed, dtype="i4", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(-2147483648, I_i4_high_closed, dtype="i4", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-
-reveal_type(def_gen.integers(2147483648, dtype="int32"))  # E: int
-reveal_type(def_gen.integers(-2147483648, 2147483648, dtype="int32"))  # E: int
-reveal_type(def_gen.integers(2147483647, dtype="int32", endpoint=True))  # E: int
-reveal_type(def_gen.integers(-2147483648, 2147483647, dtype="int32", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_i4_low_like, 2147483647, dtype="int32", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_i4_high_open, dtype="int32"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_i4_low, I_i4_high_open, dtype="int32"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(-2147483648, I_i4_high_open, dtype="int32"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_i4_high_closed, dtype="int32", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_i4_low, I_i4_high_closed, dtype="int32", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(-2147483648, I_i4_high_closed, dtype="int32", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-
-reveal_type(def_gen.integers(2147483648, dtype=np.int32))  # E: int
-reveal_type(def_gen.integers(-2147483648, 2147483648, dtype=np.int32))  # E: int
-reveal_type(def_gen.integers(2147483647, dtype=np.int32, endpoint=True))  # E: int
-reveal_type(def_gen.integers(-2147483648, 2147483647, dtype=np.int32, endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_i4_low_like, 2147483647, dtype=np.int32, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_i4_high_open, dtype=np.int32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_i4_low, I_i4_high_open, dtype=np.int32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(-2147483648, I_i4_high_open, dtype=np.int32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_i4_high_closed, dtype=np.int32, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(I_i4_low, I_i4_high_closed, dtype=np.int32, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(def_gen.integers(-2147483648, I_i4_high_closed, dtype=np.int32, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-
-I_i8_low: np.ndarray[Any, np.dtype[np.int64]] = np.array([-9223372036854775808], dtype=np.int64)
-I_i8_low_like: List[int] = [-9223372036854775808]
-I_i8_high_open: np.ndarray[Any, np.dtype[np.int64]] = np.array([9223372036854775807], dtype=np.int64)
-I_i8_high_closed: np.ndarray[Any, np.dtype[np.int64]] = np.array([9223372036854775807], dtype=np.int64)
-
-reveal_type(def_gen.integers(9223372036854775808, dtype="i8"))  # E: int
-reveal_type(def_gen.integers(-9223372036854775808, 9223372036854775808, dtype="i8"))  # E: int
-reveal_type(def_gen.integers(9223372036854775807, dtype="i8", endpoint=True))  # E: int
-reveal_type(def_gen.integers(-9223372036854775808, 9223372036854775807, dtype="i8", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_i8_low_like, 9223372036854775807, dtype="i8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_i8_high_open, dtype="i8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_i8_low, I_i8_high_open, dtype="i8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(-9223372036854775808, I_i8_high_open, dtype="i8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_i8_high_closed, dtype="i8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_i8_low, I_i8_high_closed, dtype="i8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(-9223372036854775808, I_i8_high_closed, dtype="i8", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.integers(9223372036854775808, dtype="int64"))  # E: int
-reveal_type(def_gen.integers(-9223372036854775808, 9223372036854775808, dtype="int64"))  # E: int
-reveal_type(def_gen.integers(9223372036854775807, dtype="int64", endpoint=True))  # E: int
-reveal_type(def_gen.integers(-9223372036854775808, 9223372036854775807, dtype="int64", endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_i8_low_like, 9223372036854775807, dtype="int64", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_i8_high_open, dtype="int64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_i8_low, I_i8_high_open, dtype="int64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(-9223372036854775808, I_i8_high_open, dtype="int64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_i8_high_closed, dtype="int64", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_i8_low, I_i8_high_closed, dtype="int64", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(-9223372036854775808, I_i8_high_closed, dtype="int64", endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.integers(9223372036854775808, dtype=np.int64))  # E: int
-reveal_type(def_gen.integers(-9223372036854775808, 9223372036854775808, dtype=np.int64))  # E: int
-reveal_type(def_gen.integers(9223372036854775807, dtype=np.int64, endpoint=True))  # E: int
-reveal_type(def_gen.integers(-9223372036854775808, 9223372036854775807, dtype=np.int64, endpoint=True))  # E: int
-reveal_type(def_gen.integers(I_i8_low_like, 9223372036854775807, dtype=np.int64, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_i8_high_open, dtype=np.int64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_i8_low, I_i8_high_open, dtype=np.int64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(-9223372036854775808, I_i8_high_open, dtype=np.int64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_i8_high_closed, dtype=np.int64, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(I_i8_low, I_i8_high_closed, dtype=np.int64, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.integers(-9223372036854775808, I_i8_high_closed, dtype=np.int64, endpoint=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-
-reveal_type(def_gen.bit_generator)  # E: BitGenerator
-
-reveal_type(def_gen.bytes(2))  # E: bytes
-
-reveal_type(def_gen.choice(5))  # E: int
-reveal_type(def_gen.choice(5, 3))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.choice(5, 3, replace=True))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.choice(5, 3, p=[1 / 5] * 5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.choice(5, 3, p=[1 / 5] * 5, replace=False))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.choice(["pooh", "rabbit", "piglet", "Christopher"]))  # E: Any
-reveal_type(def_gen.choice(["pooh", "rabbit", "piglet", "Christopher"], 3))  # E: numpy.ndarray[Any, Any]
-reveal_type(def_gen.choice(["pooh", "rabbit", "piglet", "Christopher"], 3, p=[1 / 4] * 4))  # E: numpy.ndarray[Any, Any]
-reveal_type(def_gen.choice(["pooh", "rabbit", "piglet", "Christopher"], 3, replace=True))  # E: numpy.ndarray[Any, Any]
-reveal_type(def_gen.choice(["pooh", "rabbit", "piglet", "Christopher"], 3, replace=False, p=np.array([1 / 8, 1 / 8, 1 / 2, 1 / 4])))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(def_gen.dirichlet([0.5, 0.5]))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.dirichlet(np.array([0.5, 0.5])))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.dirichlet(np.array([0.5, 0.5]), size=3))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.multinomial(20, [1 / 6.0] * 6))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.multinomial(20, np.array([0.5, 0.5])))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.multinomial(20, [1 / 6.0] * 6, size=2))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.multinomial([[10], [20]], [1 / 6.0] * 6, size=(2, 2)))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.multinomial(np.array([[10], [20]]), np.array([0.5, 0.5]), size=(2, 2)))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.multivariate_hypergeometric([3, 5, 7], 2))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.multivariate_hypergeometric(np.array([3, 5, 7]), 2))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.multivariate_hypergeometric(np.array([3, 5, 7]), 2, size=4))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.multivariate_hypergeometric(np.array([3, 5, 7]), 2, size=(4, 7)))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.multivariate_hypergeometric([3, 5, 7], 2, method="count"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.multivariate_hypergeometric(np.array([3, 5, 7]), 2, method="marginals"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(def_gen.multivariate_normal([0.0], [[1.0]]))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.multivariate_normal([0.0], np.array([[1.0]])))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.multivariate_normal(np.array([0.0]), [[1.0]]))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(def_gen.multivariate_normal([0.0], np.array([[1.0]])))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(def_gen.permutation(10))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(def_gen.permutation([1, 2, 3, 4]))  # E: numpy.ndarray[Any, Any]
-reveal_type(def_gen.permutation(np.array([1, 2, 3, 4])))  # E: numpy.ndarray[Any, Any]
-reveal_type(def_gen.permutation(D_2D, axis=1))  # E: numpy.ndarray[Any, Any]
-reveal_type(def_gen.permuted(D_2D))  # E: numpy.ndarray[Any, Any]
-reveal_type(def_gen.permuted(D_2D_like))  # E: numpy.ndarray[Any, Any]
-reveal_type(def_gen.permuted(D_2D, axis=1))  # E: numpy.ndarray[Any, Any]
-reveal_type(def_gen.permuted(D_2D, out=D_2D))  # E: numpy.ndarray[Any, Any]
-reveal_type(def_gen.permuted(D_2D_like, out=D_2D))  # E: numpy.ndarray[Any, Any]
-reveal_type(def_gen.permuted(D_2D_like, out=D_2D))  # E: numpy.ndarray[Any, Any]
-reveal_type(def_gen.permuted(D_2D, axis=1, out=D_2D))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(def_gen.shuffle(np.arange(10)))  # E: None
-reveal_type(def_gen.shuffle([1, 2, 3, 4, 5]))  # E: None
-reveal_type(def_gen.shuffle(D_2D, axis=1))  # E: None
-
-reveal_type(np.random.Generator(pcg64))  # E: Generator
-reveal_type(def_gen.__str__())  # E: str
-reveal_type(def_gen.__repr__())  # E: str
-def_gen_state = def_gen.__getstate__()
-reveal_type(def_gen_state)  # E: builtins.dict[builtins.str, Any]
-reveal_type(def_gen.__setstate__(def_gen_state))  # E: None
-
-# RandomState
-random_st: np.random.RandomState = np.random.RandomState()
-
-reveal_type(random_st.standard_normal())  # E: float
-reveal_type(random_st.standard_normal(size=None))  # E: float
-reveal_type(random_st.standard_normal(size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-
-reveal_type(random_st.random())  # E: float
-reveal_type(random_st.random(size=None))  # E: float
-reveal_type(random_st.random(size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-
-reveal_type(random_st.standard_cauchy())  # E: float
-reveal_type(random_st.standard_cauchy(size=None))  # E: float
-reveal_type(random_st.standard_cauchy(size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.standard_exponential())  # E: float
-reveal_type(random_st.standard_exponential(size=None))  # E: float
-reveal_type(random_st.standard_exponential(size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-
-reveal_type(random_st.zipf(1.5))  # E: int
-reveal_type(random_st.zipf(1.5, size=None))  # E: int
-reveal_type(random_st.zipf(1.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.zipf(D_arr_1p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.zipf(D_arr_1p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.zipf(D_arr_like_1p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.zipf(D_arr_like_1p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-reveal_type(random_st.weibull(0.5))  # E: float
-reveal_type(random_st.weibull(0.5, size=None))  # E: float
-reveal_type(random_st.weibull(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.weibull(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.weibull(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.weibull(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.weibull(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.standard_t(0.5))  # E: float
-reveal_type(random_st.standard_t(0.5, size=None))  # E: float
-reveal_type(random_st.standard_t(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.standard_t(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.standard_t(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.standard_t(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.standard_t(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.poisson(0.5))  # E: int
-reveal_type(random_st.poisson(0.5, size=None))  # E: int
-reveal_type(random_st.poisson(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.poisson(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.poisson(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.poisson(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.poisson(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-reveal_type(random_st.power(0.5))  # E: float
-reveal_type(random_st.power(0.5, size=None))  # E: float
-reveal_type(random_st.power(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.power(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.power(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.power(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.power(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.pareto(0.5))  # E: float
-reveal_type(random_st.pareto(0.5, size=None))  # E: float
-reveal_type(random_st.pareto(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.pareto(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.pareto(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.pareto(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.pareto(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.chisquare(0.5))  # E: float
-reveal_type(random_st.chisquare(0.5, size=None))  # E: float
-reveal_type(random_st.chisquare(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.chisquare(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.chisquare(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.chisquare(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.chisquare(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.exponential(0.5))  # E: float
-reveal_type(random_st.exponential(0.5, size=None))  # E: float
-reveal_type(random_st.exponential(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.exponential(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.exponential(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.exponential(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.exponential(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.geometric(0.5))  # E: int
-reveal_type(random_st.geometric(0.5, size=None))  # E: int
-reveal_type(random_st.geometric(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.geometric(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.geometric(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.geometric(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.geometric(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-reveal_type(random_st.logseries(0.5))  # E: int
-reveal_type(random_st.logseries(0.5, size=None))  # E: int
-reveal_type(random_st.logseries(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.logseries(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.logseries(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.logseries(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.logseries(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-reveal_type(random_st.rayleigh(0.5))  # E: float
-reveal_type(random_st.rayleigh(0.5, size=None))  # E: float
-reveal_type(random_st.rayleigh(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.rayleigh(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.rayleigh(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.rayleigh(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.rayleigh(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.standard_gamma(0.5))  # E: float
-reveal_type(random_st.standard_gamma(0.5, size=None))  # E: float
-reveal_type(random_st.standard_gamma(0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(random_st.standard_gamma(D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(random_st.standard_gamma(D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(random_st.standard_gamma(D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(random_st.standard_gamma(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-reveal_type(random_st.standard_gamma(D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]]
-
-reveal_type(random_st.vonmises(0.5, 0.5))  # E: float
-reveal_type(random_st.vonmises(0.5, 0.5, size=None))  # E: float
-reveal_type(random_st.vonmises(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.vonmises(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.vonmises(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.vonmises(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.vonmises(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.vonmises(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.vonmises(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.vonmises(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.vonmises(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.vonmises(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.vonmises(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.wald(0.5, 0.5))  # E: float
-reveal_type(random_st.wald(0.5, 0.5, size=None))  # E: float
-reveal_type(random_st.wald(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.wald(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.wald(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.wald(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.wald(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.wald(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.wald(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.wald(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.wald(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.wald(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.wald(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.uniform(0.5, 0.5))  # E: float
-reveal_type(random_st.uniform(0.5, 0.5, size=None))  # E: float
-reveal_type(random_st.uniform(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.uniform(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.uniform(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.uniform(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.uniform(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.uniform(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.uniform(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.uniform(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.uniform(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.uniform(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.uniform(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.beta(0.5, 0.5))  # E: float
-reveal_type(random_st.beta(0.5, 0.5, size=None))  # E: float
-reveal_type(random_st.beta(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.beta(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.beta(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.beta(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.beta(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.beta(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.beta(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.beta(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.beta(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.beta(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.beta(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.f(0.5, 0.5))  # E: float
-reveal_type(random_st.f(0.5, 0.5, size=None))  # E: float
-reveal_type(random_st.f(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.f(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.f(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.f(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.f(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.f(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.f(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.f(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.f(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.f(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.f(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.gamma(0.5, 0.5))  # E: float
-reveal_type(random_st.gamma(0.5, 0.5, size=None))  # E: float
-reveal_type(random_st.gamma(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gamma(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gamma(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gamma(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gamma(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gamma(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gamma(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gamma(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gamma(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gamma(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gamma(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.gumbel(0.5, 0.5))  # E: float
-reveal_type(random_st.gumbel(0.5, 0.5, size=None))  # E: float
-reveal_type(random_st.gumbel(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gumbel(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gumbel(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gumbel(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gumbel(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gumbel(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gumbel(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gumbel(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gumbel(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gumbel(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.gumbel(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.laplace(0.5, 0.5))  # E: float
-reveal_type(random_st.laplace(0.5, 0.5, size=None))  # E: float
-reveal_type(random_st.laplace(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.laplace(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.laplace(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.laplace(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.laplace(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.laplace(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.laplace(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.laplace(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.laplace(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.laplace(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.laplace(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.logistic(0.5, 0.5))  # E: float
-reveal_type(random_st.logistic(0.5, 0.5, size=None))  # E: float
-reveal_type(random_st.logistic(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.logistic(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.logistic(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.logistic(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.logistic(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.logistic(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.logistic(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.logistic(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.logistic(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.logistic(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.logistic(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.lognormal(0.5, 0.5))  # E: float
-reveal_type(random_st.lognormal(0.5, 0.5, size=None))  # E: float
-reveal_type(random_st.lognormal(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.lognormal(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.lognormal(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.lognormal(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.lognormal(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.lognormal(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.lognormal(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.lognormal(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.lognormal(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.lognormal(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.lognormal(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.noncentral_chisquare(0.5, 0.5))  # E: float
-reveal_type(random_st.noncentral_chisquare(0.5, 0.5, size=None))  # E: float
-reveal_type(random_st.noncentral_chisquare(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_chisquare(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_chisquare(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_chisquare(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_chisquare(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_chisquare(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_chisquare(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_chisquare(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_chisquare(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_chisquare(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_chisquare(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.normal(0.5, 0.5))  # E: float
-reveal_type(random_st.normal(0.5, 0.5, size=None))  # E: float
-reveal_type(random_st.normal(0.5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.normal(D_arr_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.normal(0.5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.normal(D_arr_0p5, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.normal(0.5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.normal(D_arr_like_0p5, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.normal(0.5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.normal(D_arr_0p5, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.normal(D_arr_like_0p5, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.normal(D_arr_0p5, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.normal(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.triangular(0.1, 0.5, 0.9))  # E: float
-reveal_type(random_st.triangular(0.1, 0.5, 0.9, size=None))  # E: float
-reveal_type(random_st.triangular(0.1, 0.5, 0.9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.triangular(D_arr_0p1, 0.5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.triangular(0.1, D_arr_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.triangular(D_arr_0p1, 0.5, D_arr_like_0p9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.triangular(0.1, D_arr_0p5, 0.9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.triangular(D_arr_like_0p1, 0.5, D_arr_0p9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.triangular(0.5, D_arr_like_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.triangular(D_arr_0p1, D_arr_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.triangular(D_arr_like_0p1, D_arr_like_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.triangular(D_arr_0p1, D_arr_0p5, D_arr_0p9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.triangular(D_arr_like_0p1, D_arr_like_0p5, D_arr_like_0p9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.noncentral_f(0.1, 0.5, 0.9))  # E: float
-reveal_type(random_st.noncentral_f(0.1, 0.5, 0.9, size=None))  # E: float
-reveal_type(random_st.noncentral_f(0.1, 0.5, 0.9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_f(D_arr_0p1, 0.5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_f(0.1, D_arr_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_f(D_arr_0p1, 0.5, D_arr_like_0p9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_f(0.1, D_arr_0p5, 0.9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_f(D_arr_like_0p1, 0.5, D_arr_0p9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_f(0.5, D_arr_like_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_f(D_arr_0p1, D_arr_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_f(D_arr_like_0p1, D_arr_like_0p5, 0.9))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_f(D_arr_0p1, D_arr_0p5, D_arr_0p9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.noncentral_f(D_arr_like_0p1, D_arr_like_0p5, D_arr_like_0p9, size=1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.binomial(10, 0.5))  # E: int
-reveal_type(random_st.binomial(10, 0.5, size=None))  # E: int
-reveal_type(random_st.binomial(10, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.binomial(I_arr_10, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.binomial(10, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.binomial(I_arr_10, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.binomial(10, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.binomial(I_arr_like_10, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.binomial(10, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.binomial(I_arr_10, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.binomial(I_arr_like_10, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.binomial(I_arr_10, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.binomial(I_arr_like_10, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-reveal_type(random_st.negative_binomial(10, 0.5))  # E: int
-reveal_type(random_st.negative_binomial(10, 0.5, size=None))  # E: int
-reveal_type(random_st.negative_binomial(10, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.negative_binomial(I_arr_10, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.negative_binomial(10, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.negative_binomial(I_arr_10, 0.5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.negative_binomial(10, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.negative_binomial(I_arr_like_10, 0.5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.negative_binomial(10, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.negative_binomial(I_arr_10, D_arr_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.negative_binomial(I_arr_like_10, D_arr_like_0p5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.negative_binomial(I_arr_10, D_arr_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.negative_binomial(I_arr_like_10, D_arr_like_0p5, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-reveal_type(random_st.hypergeometric(20, 20, 10))  # E: int
-reveal_type(random_st.hypergeometric(20, 20, 10, size=None))  # E: int
-reveal_type(random_st.hypergeometric(20, 20, 10, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.hypergeometric(I_arr_20, 20, 10))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.hypergeometric(20, I_arr_20, 10))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.hypergeometric(I_arr_20, 20, I_arr_like_10, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.hypergeometric(20, I_arr_20, 10, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.hypergeometric(I_arr_like_20, 20, I_arr_10))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.hypergeometric(20, I_arr_like_20, 10))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.hypergeometric(I_arr_20, I_arr_20, 10))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.hypergeometric(I_arr_like_20, I_arr_like_20, 10))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.hypergeometric(I_arr_20, I_arr_20, I_arr_10, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.hypergeometric(I_arr_like_20, I_arr_like_20, I_arr_like_10, size=1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-reveal_type(random_st.randint(0, 100))  # E: int
-reveal_type(random_st.randint(100))  # E: int
-reveal_type(random_st.randint([100]))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.randint(0, [100]))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-reveal_type(random_st.randint(2, dtype=bool))  # E: builtins.bool
-reveal_type(random_st.randint(0, 2, dtype=bool))  # E: builtins.bool
-reveal_type(random_st.randint(I_bool_high_open, dtype=bool))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(random_st.randint(I_bool_low, I_bool_high_open, dtype=bool))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(random_st.randint(0, I_bool_high_open, dtype=bool))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-
-reveal_type(random_st.randint(2, dtype=np.bool_))  # E: builtins.bool
-reveal_type(random_st.randint(0, 2, dtype=np.bool_))  # E: builtins.bool
-reveal_type(random_st.randint(I_bool_high_open, dtype=np.bool_))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(random_st.randint(I_bool_low, I_bool_high_open, dtype=np.bool_))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-reveal_type(random_st.randint(0, I_bool_high_open, dtype=np.bool_))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]
-
-reveal_type(random_st.randint(256, dtype="u1"))  # E: int
-reveal_type(random_st.randint(0, 256, dtype="u1"))  # E: int
-reveal_type(random_st.randint(I_u1_high_open, dtype="u1"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(random_st.randint(I_u1_low, I_u1_high_open, dtype="u1"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(random_st.randint(0, I_u1_high_open, dtype="u1"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-
-reveal_type(random_st.randint(256, dtype="uint8"))  # E: int
-reveal_type(random_st.randint(0, 256, dtype="uint8"))  # E: int
-reveal_type(random_st.randint(I_u1_high_open, dtype="uint8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(random_st.randint(I_u1_low, I_u1_high_open, dtype="uint8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(random_st.randint(0, I_u1_high_open, dtype="uint8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-
-reveal_type(random_st.randint(256, dtype=np.uint8))  # E: int
-reveal_type(random_st.randint(0, 256, dtype=np.uint8))  # E: int
-reveal_type(random_st.randint(I_u1_high_open, dtype=np.uint8))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(random_st.randint(I_u1_low, I_u1_high_open, dtype=np.uint8))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-reveal_type(random_st.randint(0, I_u1_high_open, dtype=np.uint8))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._8Bit]]]
-
-reveal_type(random_st.randint(65536, dtype="u2"))  # E: int
-reveal_type(random_st.randint(0, 65536, dtype="u2"))  # E: int
-reveal_type(random_st.randint(I_u2_high_open, dtype="u2"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(I_u2_low, I_u2_high_open, dtype="u2"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(0, I_u2_high_open, dtype="u2"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-
-reveal_type(random_st.randint(65536, dtype="uint16"))  # E: int
-reveal_type(random_st.randint(0, 65536, dtype="uint16"))  # E: int
-reveal_type(random_st.randint(I_u2_high_open, dtype="uint16"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(I_u2_low, I_u2_high_open, dtype="uint16"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(0, I_u2_high_open, dtype="uint16"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-
-reveal_type(random_st.randint(65536, dtype=np.uint16))  # E: int
-reveal_type(random_st.randint(0, 65536, dtype=np.uint16))  # E: int
-reveal_type(random_st.randint(I_u2_high_open, dtype=np.uint16))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(I_u2_low, I_u2_high_open, dtype=np.uint16))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(0, I_u2_high_open, dtype=np.uint16))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._16Bit]]]
-
-reveal_type(random_st.randint(4294967296, dtype="u4"))  # E: int
-reveal_type(random_st.randint(0, 4294967296, dtype="u4"))  # E: int
-reveal_type(random_st.randint(I_u4_high_open, dtype="u4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(random_st.randint(I_u4_low, I_u4_high_open, dtype="u4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(random_st.randint(0, I_u4_high_open, dtype="u4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-
-reveal_type(random_st.randint(4294967296, dtype="uint32"))  # E: int
-reveal_type(random_st.randint(0, 4294967296, dtype="uint32"))  # E: int
-reveal_type(random_st.randint(I_u4_high_open, dtype="uint32"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(random_st.randint(I_u4_low, I_u4_high_open, dtype="uint32"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(random_st.randint(0, I_u4_high_open, dtype="uint32"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-
-reveal_type(random_st.randint(4294967296, dtype=np.uint32))  # E: int
-reveal_type(random_st.randint(0, 4294967296, dtype=np.uint32))  # E: int
-reveal_type(random_st.randint(I_u4_high_open, dtype=np.uint32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(random_st.randint(I_u4_low, I_u4_high_open, dtype=np.uint32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-reveal_type(random_st.randint(0, I_u4_high_open, dtype=np.uint32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]]
-
-reveal_type(random_st.randint(4294967296, dtype=np.uint))  # E: int
-reveal_type(random_st.randint(0, 4294967296, dtype=np.uint))  # E: int
-reveal_type(random_st.randint(I_u4_high_open, dtype=np.uint))  # E: numpy.ndarray[Any, numpy.dtype[{uint}]]
-reveal_type(random_st.randint(I_u4_low, I_u4_high_open, dtype=np.uint))  # E: numpy.ndarray[Any, numpy.dtype[{uint}]]
-reveal_type(random_st.randint(0, I_u4_high_open, dtype=np.uint))  # E: numpy.ndarray[Any, numpy.dtype[{uint}]]
-
-reveal_type(random_st.randint(18446744073709551616, dtype="u8"))  # E: int
-reveal_type(random_st.randint(0, 18446744073709551616, dtype="u8"))  # E: int
-reveal_type(random_st.randint(I_u8_high_open, dtype="u8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(random_st.randint(I_u8_low, I_u8_high_open, dtype="u8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(random_st.randint(0, I_u8_high_open, dtype="u8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-
-reveal_type(random_st.randint(18446744073709551616, dtype="uint64"))  # E: int
-reveal_type(random_st.randint(0, 18446744073709551616, dtype="uint64"))  # E: int
-reveal_type(random_st.randint(I_u8_high_open, dtype="uint64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(random_st.randint(I_u8_low, I_u8_high_open, dtype="uint64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(random_st.randint(0, I_u8_high_open, dtype="uint64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-
-reveal_type(random_st.randint(18446744073709551616, dtype=np.uint64))  # E: int
-reveal_type(random_st.randint(0, 18446744073709551616, dtype=np.uint64))  # E: int
-reveal_type(random_st.randint(I_u8_high_open, dtype=np.uint64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(random_st.randint(I_u8_low, I_u8_high_open, dtype=np.uint64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-reveal_type(random_st.randint(0, I_u8_high_open, dtype=np.uint64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._64Bit]]]
-
-reveal_type(random_st.randint(128, dtype="i1"))  # E: int
-reveal_type(random_st.randint(-128, 128, dtype="i1"))  # E: int
-reveal_type(random_st.randint(I_i1_high_open, dtype="i1"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(random_st.randint(I_i1_low, I_i1_high_open, dtype="i1"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(random_st.randint(-128, I_i1_high_open, dtype="i1"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-
-reveal_type(random_st.randint(128, dtype="int8"))  # E: int
-reveal_type(random_st.randint(-128, 128, dtype="int8"))  # E: int
-reveal_type(random_st.randint(I_i1_high_open, dtype="int8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(random_st.randint(I_i1_low, I_i1_high_open, dtype="int8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(random_st.randint(-128, I_i1_high_open, dtype="int8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-
-reveal_type(random_st.randint(128, dtype=np.int8))  # E: int
-reveal_type(random_st.randint(-128, 128, dtype=np.int8))  # E: int
-reveal_type(random_st.randint(I_i1_high_open, dtype=np.int8))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(random_st.randint(I_i1_low, I_i1_high_open, dtype=np.int8))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-reveal_type(random_st.randint(-128, I_i1_high_open, dtype=np.int8))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._8Bit]]]
-
-reveal_type(random_st.randint(32768, dtype="i2"))  # E: int
-reveal_type(random_st.randint(-32768, 32768, dtype="i2"))  # E: int
-reveal_type(random_st.randint(I_i2_high_open, dtype="i2"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(I_i2_low, I_i2_high_open, dtype="i2"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(-32768, I_i2_high_open, dtype="i2"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(32768, dtype="int16"))  # E: int
-reveal_type(random_st.randint(-32768, 32768, dtype="int16"))  # E: int
-reveal_type(random_st.randint(I_i2_high_open, dtype="int16"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(I_i2_low, I_i2_high_open, dtype="int16"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(-32768, I_i2_high_open, dtype="int16"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(32768, dtype=np.int16))  # E: int
-reveal_type(random_st.randint(-32768, 32768, dtype=np.int16))  # E: int
-reveal_type(random_st.randint(I_i2_high_open, dtype=np.int16))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(I_i2_low, I_i2_high_open, dtype=np.int16))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-reveal_type(random_st.randint(-32768, I_i2_high_open, dtype=np.int16))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._16Bit]]]
-
-reveal_type(random_st.randint(2147483648, dtype="i4"))  # E: int
-reveal_type(random_st.randint(-2147483648, 2147483648, dtype="i4"))  # E: int
-reveal_type(random_st.randint(I_i4_high_open, dtype="i4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(random_st.randint(I_i4_low, I_i4_high_open, dtype="i4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(random_st.randint(-2147483648, I_i4_high_open, dtype="i4"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-
-reveal_type(random_st.randint(2147483648, dtype="int32"))  # E: int
-reveal_type(random_st.randint(-2147483648, 2147483648, dtype="int32"))  # E: int
-reveal_type(random_st.randint(I_i4_high_open, dtype="int32"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(random_st.randint(I_i4_low, I_i4_high_open, dtype="int32"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(random_st.randint(-2147483648, I_i4_high_open, dtype="int32"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-
-reveal_type(random_st.randint(2147483648, dtype=np.int32))  # E: int
-reveal_type(random_st.randint(-2147483648, 2147483648, dtype=np.int32))  # E: int
-reveal_type(random_st.randint(I_i4_high_open, dtype=np.int32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(random_st.randint(I_i4_low, I_i4_high_open, dtype=np.int32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-reveal_type(random_st.randint(-2147483648, I_i4_high_open, dtype=np.int32))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._32Bit]]]
-
-reveal_type(random_st.randint(2147483648, dtype=np.int_))  # E: int
-reveal_type(random_st.randint(-2147483648, 2147483648, dtype=np.int_))  # E: int
-reveal_type(random_st.randint(I_i4_high_open, dtype=np.int_))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.randint(I_i4_low, I_i4_high_open, dtype=np.int_))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.randint(-2147483648, I_i4_high_open, dtype=np.int_))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-reveal_type(random_st.randint(9223372036854775808, dtype="i8"))  # E: int
-reveal_type(random_st.randint(-9223372036854775808, 9223372036854775808, dtype="i8"))  # E: int
-reveal_type(random_st.randint(I_i8_high_open, dtype="i8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(random_st.randint(I_i8_low, I_i8_high_open, dtype="i8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(random_st.randint(-9223372036854775808, I_i8_high_open, dtype="i8"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(random_st.randint(9223372036854775808, dtype="int64"))  # E: int
-reveal_type(random_st.randint(-9223372036854775808, 9223372036854775808, dtype="int64"))  # E: int
-reveal_type(random_st.randint(I_i8_high_open, dtype="int64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(random_st.randint(I_i8_low, I_i8_high_open, dtype="int64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(random_st.randint(-9223372036854775808, I_i8_high_open, dtype="int64"))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(random_st.randint(9223372036854775808, dtype=np.int64))  # E: int
-reveal_type(random_st.randint(-9223372036854775808, 9223372036854775808, dtype=np.int64))  # E: int
-reveal_type(random_st.randint(I_i8_high_open, dtype=np.int64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(random_st.randint(I_i8_low, I_i8_high_open, dtype=np.int64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-reveal_type(random_st.randint(-9223372036854775808, I_i8_high_open, dtype=np.int64))  # E: numpy.ndarray[Any, numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]]
-
-reveal_type(random_st._bit_generator)  # E: BitGenerator
-
-reveal_type(random_st.bytes(2))  # E: bytes
-
-reveal_type(random_st.choice(5))  # E: int
-reveal_type(random_st.choice(5, 3))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.choice(5, 3, replace=True))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.choice(5, 3, p=[1 / 5] * 5))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.choice(5, 3, p=[1 / 5] * 5, replace=False))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-reveal_type(random_st.choice(["pooh", "rabbit", "piglet", "Christopher"]))  # E: Any
-reveal_type(random_st.choice(["pooh", "rabbit", "piglet", "Christopher"], 3))  # E: numpy.ndarray[Any, Any]
-reveal_type(random_st.choice(["pooh", "rabbit", "piglet", "Christopher"], 3, p=[1 / 4] * 4))  # E: numpy.ndarray[Any, Any]
-reveal_type(random_st.choice(["pooh", "rabbit", "piglet", "Christopher"], 3, replace=True))  # E: numpy.ndarray[Any, Any]
-reveal_type(random_st.choice(["pooh", "rabbit", "piglet", "Christopher"], 3, replace=False, p=np.array([1 / 8, 1 / 8, 1 / 2, 1 / 4])))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(random_st.dirichlet([0.5, 0.5]))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.dirichlet(np.array([0.5, 0.5])))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.dirichlet(np.array([0.5, 0.5]), size=3))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.multinomial(20, [1 / 6.0] * 6))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.multinomial(20, np.array([0.5, 0.5])))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.multinomial(20, [1 / 6.0] * 6, size=2))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-
-reveal_type(random_st.multivariate_normal([0.0], [[1.0]]))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.multivariate_normal([0.0], np.array([[1.0]])))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.multivariate_normal(np.array([0.0]), [[1.0]]))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.multivariate_normal([0.0], np.array([[1.0]])))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.permutation(10))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.permutation([1, 2, 3, 4]))  # E: numpy.ndarray[Any, Any]
-reveal_type(random_st.permutation(np.array([1, 2, 3, 4])))  # E: numpy.ndarray[Any, Any]
-reveal_type(random_st.permutation(D_2D))  # E: numpy.ndarray[Any, Any]
-
-reveal_type(random_st.shuffle(np.arange(10)))  # E: None
-reveal_type(random_st.shuffle([1, 2, 3, 4, 5]))  # E: None
-reveal_type(random_st.shuffle(D_2D))  # E: None
-
-reveal_type(np.random.RandomState(pcg64))  # E: RandomState
-reveal_type(np.random.RandomState(0))  # E: RandomState
-reveal_type(np.random.RandomState([0, 1, 2]))  # E: RandomState
-reveal_type(random_st.__str__())  # E: str
-reveal_type(random_st.__repr__())  # E: str
-random_st_state = random_st.__getstate__()
-reveal_type(random_st_state)  # E: builtins.dict[builtins.str, Any]
-reveal_type(random_st.__setstate__(random_st_state))  # E: None
-reveal_type(random_st.seed())  # E: None
-reveal_type(random_st.seed(1))  # E: None
-reveal_type(random_st.seed([0, 1]))  # E: None
-random_st_get_state = random_st.get_state()
-reveal_type(random_st_state)  # E: builtins.dict[builtins.str, Any]
-random_st_get_state_legacy = random_st.get_state(legacy=True)
-reveal_type(random_st_get_state_legacy)  # E: Union[builtins.dict[builtins.str, Any], Tuple[builtins.str, numpy.ndarray[Any, numpy.dtype[numpy.unsignedinteger[numpy.typing._32Bit]]], builtins.int, builtins.int, builtins.float]]
-reveal_type(random_st.set_state(random_st_get_state))  # E: None
-
-reveal_type(random_st.rand())  # E: float
-reveal_type(random_st.rand(1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.rand(1, 2))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.randn())  # E: float
-reveal_type(random_st.randn(1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.randn(1, 2))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.random_sample())  # E: float
-reveal_type(random_st.random_sample(1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-reveal_type(random_st.random_sample(size=(1, 2)))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[numpy.typing._64Bit]]
-
-reveal_type(random_st.tomaxint())  # E: int
-reveal_type(random_st.tomaxint(1))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
-reveal_type(random_st.tomaxint((1,)))  # E: numpy.ndarray[Any, numpy.dtype[{int_}]]
diff --git a/numpy/typing/tests/data/reveal/random.pyi b/numpy/typing/tests/data/reveal/random.pyi
new file mode 100644 (file)
index 0000000..4e06aa7
--- /dev/null
@@ -0,0 +1,1539 @@
+from __future__ import annotations
+
+from typing import Any, List
+
+import numpy as np
+
+def_rng = np.random.default_rng()
+seed_seq = np.random.SeedSequence()
+mt19937 = np.random.MT19937()
+pcg64 = np.random.PCG64()
+sfc64 = np.random.SFC64()
+philox = np.random.Philox()
+seedless_seq = np.random.bit_generator.SeedlessSeedSequence()
+
+reveal_type(def_rng)  # E: random._generator.Generator
+reveal_type(mt19937)  # E: random._mt19937.MT19937
+reveal_type(pcg64)  # E: random._pcg64.PCG64
+reveal_type(sfc64)  # E: random._sfc64.SFC64
+reveal_type(philox)  # E: random._philox.Philox
+reveal_type(seed_seq)  # E: random.bit_generator.SeedSequence
+reveal_type(seedless_seq)  # E: random.bit_generator.SeedlessSeedSequence
+
+mt19937_jumped = mt19937.jumped()
+mt19937_jumped3 = mt19937.jumped(3)
+mt19937_raw = mt19937.random_raw()
+mt19937_raw_arr = mt19937.random_raw(5)
+
+reveal_type(mt19937_jumped)  # E: random._mt19937.MT19937
+reveal_type(mt19937_jumped3)  # E: random._mt19937.MT19937
+reveal_type(mt19937_raw)  # E: int
+reveal_type(mt19937_raw_arr)  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(mt19937.lock)  # E: threading.Lock
+
+pcg64_jumped = pcg64.jumped()
+pcg64_jumped3 = pcg64.jumped(3)
+pcg64_adv = pcg64.advance(3)
+pcg64_raw = pcg64.random_raw()
+pcg64_raw_arr = pcg64.random_raw(5)
+
+reveal_type(pcg64_jumped)  # E: random._pcg64.PCG64
+reveal_type(pcg64_jumped3)  # E: random._pcg64.PCG64
+reveal_type(pcg64_adv)  # E: random._pcg64.PCG64
+reveal_type(pcg64_raw)  # E: int
+reveal_type(pcg64_raw_arr)  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(pcg64.lock)  # E: threading.Lock
+
+philox_jumped = philox.jumped()
+philox_jumped3 = philox.jumped(3)
+philox_adv = philox.advance(3)
+philox_raw = philox.random_raw()
+philox_raw_arr = philox.random_raw(5)
+
+reveal_type(philox_jumped)  # E: random._philox.Philox
+reveal_type(philox_jumped3)  # E: random._philox.Philox
+reveal_type(philox_adv)  # E: random._philox.Philox
+reveal_type(philox_raw)  # E: int
+reveal_type(philox_raw_arr)  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(philox.lock)  # E: threading.Lock
+
+sfc64_raw = sfc64.random_raw()
+sfc64_raw_arr = sfc64.random_raw(5)
+
+reveal_type(sfc64_raw)  # E: int
+reveal_type(sfc64_raw_arr)  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(sfc64.lock)  # E: threading.Lock
+
+reveal_type(seed_seq.pool)  # ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(seed_seq.entropy)  # E:Union[None, int, Sequence[int]]
+reveal_type(seed_seq.spawn(1))  # E: list[random.bit_generator.SeedSequence]
+reveal_type(seed_seq.generate_state(8, "uint32"))  # E: ndarray[Any, dtype[Union[unsignedinteger[typing._32Bit], unsignedinteger[typing._64Bit]]]]
+reveal_type(seed_seq.generate_state(8, "uint64"))  # E: ndarray[Any, dtype[Union[unsignedinteger[typing._32Bit], unsignedinteger[typing._64Bit]]]]
+
+
+def_gen: np.random.Generator = np.random.default_rng()
+
+D_arr_0p1: np.ndarray[Any, np.dtype[np.float64]] = np.array([0.1])
+D_arr_0p5: np.ndarray[Any, np.dtype[np.float64]] = np.array([0.5])
+D_arr_0p9: np.ndarray[Any, np.dtype[np.float64]] = np.array([0.9])
+D_arr_1p5: np.ndarray[Any, np.dtype[np.float64]] = np.array([1.5])
+I_arr_10: np.ndarray[Any, np.dtype[np.int_]] = np.array([10], dtype=np.int_)
+I_arr_20: np.ndarray[Any, np.dtype[np.int_]] = np.array([20], dtype=np.int_)
+D_arr_like_0p1: List[float] = [0.1]
+D_arr_like_0p5: List[float] = [0.5]
+D_arr_like_0p9: List[float] = [0.9]
+D_arr_like_1p5: List[float] = [1.5]
+I_arr_like_10: List[int] = [10]
+I_arr_like_20: List[int] = [20]
+D_2D_like: List[List[float]] = [[1, 2], [2, 3], [3, 4], [4, 5.1]]
+D_2D: np.ndarray[Any, np.dtype[np.float64]] = np.array(D_2D_like)
+S_out: np.ndarray[Any, np.dtype[np.float32]] = np.empty(1, dtype=np.float32)
+D_out: np.ndarray[Any, np.dtype[np.float64]] = np.empty(1)
+
+reveal_type(def_gen.standard_normal())  # E: float
+reveal_type(def_gen.standard_normal(dtype=np.float32))  # E: float
+reveal_type(def_gen.standard_normal(dtype="float32"))  # E: float
+reveal_type(def_gen.standard_normal(dtype="double"))  # E: float
+reveal_type(def_gen.standard_normal(dtype=np.float64))  # E: float
+reveal_type(def_gen.standard_normal(size=None))  # E: float
+reveal_type(def_gen.standard_normal(size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_normal(size=1, dtype=np.float32))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.standard_normal(size=1, dtype="f4"))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.standard_normal(size=1, dtype="float32", out=S_out))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.standard_normal(dtype=np.float32, out=S_out))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.standard_normal(size=1, dtype=np.float64))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_normal(size=1, dtype="float64"))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_normal(size=1, dtype="f8"))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_normal(out=D_out))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_normal(size=1, dtype="float64"))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_normal(size=1, dtype="float64", out=D_out))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+
+reveal_type(def_gen.random())  # E: float
+reveal_type(def_gen.random(dtype=np.float32))  # E: float
+reveal_type(def_gen.random(dtype="float32"))  # E: float
+reveal_type(def_gen.random(dtype="double"))  # E: float
+reveal_type(def_gen.random(dtype=np.float64))  # E: float
+reveal_type(def_gen.random(size=None))  # E: float
+reveal_type(def_gen.random(size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.random(size=1, dtype=np.float32))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.random(size=1, dtype="f4"))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.random(size=1, dtype="float32", out=S_out))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.random(dtype=np.float32, out=S_out))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.random(size=1, dtype=np.float64))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.random(size=1, dtype="float64"))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.random(size=1, dtype="f8"))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.random(out=D_out))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.random(size=1, dtype="float64"))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.random(size=1, dtype="float64", out=D_out))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+
+reveal_type(def_gen.standard_cauchy())  # E: float
+reveal_type(def_gen.standard_cauchy(size=None))  # E: float
+reveal_type(def_gen.standard_cauchy(size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.standard_exponential())  # E: float
+reveal_type(def_gen.standard_exponential(method="inv"))  # E: float
+reveal_type(def_gen.standard_exponential(dtype=np.float32))  # E: float
+reveal_type(def_gen.standard_exponential(dtype="float32"))  # E: float
+reveal_type(def_gen.standard_exponential(dtype="double"))  # E: float
+reveal_type(def_gen.standard_exponential(dtype=np.float64))  # E: float
+reveal_type(def_gen.standard_exponential(size=None))  # E: float
+reveal_type(def_gen.standard_exponential(size=None, method="inv"))  # E: float
+reveal_type(def_gen.standard_exponential(size=1, method="inv"))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_exponential(size=1, dtype=np.float32))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.standard_exponential(size=1, dtype="f4", method="inv"))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.standard_exponential(size=1, dtype="float32", out=S_out))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.standard_exponential(dtype=np.float32, out=S_out))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.standard_exponential(size=1, dtype=np.float64, method="inv"))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_exponential(size=1, dtype="float64"))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_exponential(size=1, dtype="f8"))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_exponential(out=D_out))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_exponential(size=1, dtype="float64"))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_exponential(size=1, dtype="float64", out=D_out))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+
+reveal_type(def_gen.zipf(1.5))  # E: int
+reveal_type(def_gen.zipf(1.5, size=None))  # E: int
+reveal_type(def_gen.zipf(1.5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.zipf(D_arr_1p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.zipf(D_arr_1p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.zipf(D_arr_like_1p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.zipf(D_arr_like_1p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.weibull(0.5))  # E: float
+reveal_type(def_gen.weibull(0.5, size=None))  # E: float
+reveal_type(def_gen.weibull(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.weibull(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.weibull(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.weibull(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.weibull(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.standard_t(0.5))  # E: float
+reveal_type(def_gen.standard_t(0.5, size=None))  # E: float
+reveal_type(def_gen.standard_t(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.standard_t(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.standard_t(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.standard_t(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.standard_t(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.poisson(0.5))  # E: int
+reveal_type(def_gen.poisson(0.5, size=None))  # E: int
+reveal_type(def_gen.poisson(0.5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.poisson(D_arr_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.poisson(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.poisson(D_arr_like_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.poisson(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.power(0.5))  # E: float
+reveal_type(def_gen.power(0.5, size=None))  # E: float
+reveal_type(def_gen.power(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.power(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.power(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.power(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.power(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.pareto(0.5))  # E: float
+reveal_type(def_gen.pareto(0.5, size=None))  # E: float
+reveal_type(def_gen.pareto(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.pareto(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.pareto(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.pareto(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.pareto(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.chisquare(0.5))  # E: float
+reveal_type(def_gen.chisquare(0.5, size=None))  # E: float
+reveal_type(def_gen.chisquare(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.chisquare(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.chisquare(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.chisquare(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.chisquare(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.exponential(0.5))  # E: float
+reveal_type(def_gen.exponential(0.5, size=None))  # E: float
+reveal_type(def_gen.exponential(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.exponential(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.exponential(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.exponential(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.exponential(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.geometric(0.5))  # E: int
+reveal_type(def_gen.geometric(0.5, size=None))  # E: int
+reveal_type(def_gen.geometric(0.5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.geometric(D_arr_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.geometric(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.geometric(D_arr_like_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.geometric(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.logseries(0.5))  # E: int
+reveal_type(def_gen.logseries(0.5, size=None))  # E: int
+reveal_type(def_gen.logseries(0.5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.logseries(D_arr_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.logseries(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.logseries(D_arr_like_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.logseries(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.rayleigh(0.5))  # E: float
+reveal_type(def_gen.rayleigh(0.5, size=None))  # E: float
+reveal_type(def_gen.rayleigh(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.rayleigh(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.rayleigh(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.rayleigh(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.rayleigh(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.standard_gamma(0.5))  # E: float
+reveal_type(def_gen.standard_gamma(0.5, size=None))  # E: float
+reveal_type(def_gen.standard_gamma(0.5, dtype="float32"))  # E: float
+reveal_type(def_gen.standard_gamma(0.5, size=None, dtype="float32"))  # E: float
+reveal_type(def_gen.standard_gamma(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_gamma(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_gamma(D_arr_0p5, dtype="f4"))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.standard_gamma(0.5, size=1, dtype="float32", out=S_out))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.standard_gamma(D_arr_0p5, dtype=np.float32, out=S_out))  # E: ndarray[Any, dtype[floating[typing._32Bit]]]
+reveal_type(def_gen.standard_gamma(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_gamma(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_gamma(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_gamma(0.5, out=D_out))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_gamma(D_arr_like_0p5, out=D_out))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_gamma(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(def_gen.standard_gamma(D_arr_like_0p5, size=1, out=D_out, dtype=np.float64))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+
+reveal_type(def_gen.vonmises(0.5, 0.5))  # E: float
+reveal_type(def_gen.vonmises(0.5, 0.5, size=None))  # E: float
+reveal_type(def_gen.vonmises(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.vonmises(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.vonmises(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.vonmises(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.vonmises(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.vonmises(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.vonmises(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.vonmises(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.vonmises(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.vonmises(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.vonmises(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.wald(0.5, 0.5))  # E: float
+reveal_type(def_gen.wald(0.5, 0.5, size=None))  # E: float
+reveal_type(def_gen.wald(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.wald(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.wald(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.wald(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.wald(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.wald(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.wald(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.wald(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.wald(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.wald(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.wald(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.uniform(0.5, 0.5))  # E: float
+reveal_type(def_gen.uniform(0.5, 0.5, size=None))  # E: float
+reveal_type(def_gen.uniform(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.uniform(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.uniform(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.uniform(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.uniform(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.uniform(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.uniform(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.uniform(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.uniform(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.uniform(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.uniform(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.beta(0.5, 0.5))  # E: float
+reveal_type(def_gen.beta(0.5, 0.5, size=None))  # E: float
+reveal_type(def_gen.beta(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.beta(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.beta(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.beta(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.beta(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.beta(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.beta(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.beta(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.beta(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.beta(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.beta(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.f(0.5, 0.5))  # E: float
+reveal_type(def_gen.f(0.5, 0.5, size=None))  # E: float
+reveal_type(def_gen.f(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.f(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.f(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.f(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.f(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.f(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.f(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.f(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.f(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.f(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.f(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.gamma(0.5, 0.5))  # E: float
+reveal_type(def_gen.gamma(0.5, 0.5, size=None))  # E: float
+reveal_type(def_gen.gamma(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gamma(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gamma(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gamma(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gamma(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gamma(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gamma(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gamma(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gamma(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gamma(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gamma(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.gumbel(0.5, 0.5))  # E: float
+reveal_type(def_gen.gumbel(0.5, 0.5, size=None))  # E: float
+reveal_type(def_gen.gumbel(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gumbel(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gumbel(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gumbel(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gumbel(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gumbel(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gumbel(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gumbel(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gumbel(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gumbel(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.gumbel(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.laplace(0.5, 0.5))  # E: float
+reveal_type(def_gen.laplace(0.5, 0.5, size=None))  # E: float
+reveal_type(def_gen.laplace(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.laplace(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.laplace(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.laplace(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.laplace(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.laplace(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.laplace(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.laplace(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.laplace(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.laplace(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.laplace(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.logistic(0.5, 0.5))  # E: float
+reveal_type(def_gen.logistic(0.5, 0.5, size=None))  # E: float
+reveal_type(def_gen.logistic(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.logistic(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.logistic(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.logistic(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.logistic(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.logistic(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.logistic(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.logistic(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.logistic(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.logistic(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.logistic(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.lognormal(0.5, 0.5))  # E: float
+reveal_type(def_gen.lognormal(0.5, 0.5, size=None))  # E: float
+reveal_type(def_gen.lognormal(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.lognormal(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.lognormal(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.lognormal(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.lognormal(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.lognormal(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.lognormal(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.lognormal(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.lognormal(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.lognormal(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.lognormal(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.noncentral_chisquare(0.5, 0.5))  # E: float
+reveal_type(def_gen.noncentral_chisquare(0.5, 0.5, size=None))  # E: float
+reveal_type(def_gen.noncentral_chisquare(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_chisquare(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_chisquare(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_chisquare(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_chisquare(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_chisquare(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_chisquare(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_chisquare(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_chisquare(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_chisquare(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_chisquare(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.normal(0.5, 0.5))  # E: float
+reveal_type(def_gen.normal(0.5, 0.5, size=None))  # E: float
+reveal_type(def_gen.normal(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.normal(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.normal(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.normal(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.normal(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.normal(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.normal(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.normal(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.normal(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.normal(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.normal(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.triangular(0.1, 0.5, 0.9))  # E: float
+reveal_type(def_gen.triangular(0.1, 0.5, 0.9, size=None))  # E: float
+reveal_type(def_gen.triangular(0.1, 0.5, 0.9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.triangular(D_arr_0p1, 0.5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.triangular(0.1, D_arr_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.triangular(D_arr_0p1, 0.5, D_arr_like_0p9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.triangular(0.1, D_arr_0p5, 0.9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.triangular(D_arr_like_0p1, 0.5, D_arr_0p9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.triangular(0.5, D_arr_like_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.triangular(D_arr_0p1, D_arr_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.triangular(D_arr_like_0p1, D_arr_like_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.triangular(D_arr_0p1, D_arr_0p5, D_arr_0p9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.triangular(D_arr_like_0p1, D_arr_like_0p5, D_arr_like_0p9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.noncentral_f(0.1, 0.5, 0.9))  # E: float
+reveal_type(def_gen.noncentral_f(0.1, 0.5, 0.9, size=None))  # E: float
+reveal_type(def_gen.noncentral_f(0.1, 0.5, 0.9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_f(D_arr_0p1, 0.5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_f(0.1, D_arr_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_f(D_arr_0p1, 0.5, D_arr_like_0p9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_f(0.1, D_arr_0p5, 0.9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_f(D_arr_like_0p1, 0.5, D_arr_0p9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_f(0.5, D_arr_like_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_f(D_arr_0p1, D_arr_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_f(D_arr_like_0p1, D_arr_like_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_f(D_arr_0p1, D_arr_0p5, D_arr_0p9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.noncentral_f(D_arr_like_0p1, D_arr_like_0p5, D_arr_like_0p9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.binomial(10, 0.5))  # E: int
+reveal_type(def_gen.binomial(10, 0.5, size=None))  # E: int
+reveal_type(def_gen.binomial(10, 0.5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.binomial(I_arr_10, 0.5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.binomial(10, D_arr_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.binomial(I_arr_10, 0.5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.binomial(10, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.binomial(I_arr_like_10, 0.5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.binomial(10, D_arr_like_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.binomial(I_arr_10, D_arr_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.binomial(I_arr_like_10, D_arr_like_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.binomial(I_arr_10, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.binomial(I_arr_like_10, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.negative_binomial(10, 0.5))  # E: int
+reveal_type(def_gen.negative_binomial(10, 0.5, size=None))  # E: int
+reveal_type(def_gen.negative_binomial(10, 0.5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.negative_binomial(I_arr_10, 0.5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.negative_binomial(10, D_arr_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.negative_binomial(I_arr_10, 0.5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.negative_binomial(10, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.negative_binomial(I_arr_like_10, 0.5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.negative_binomial(10, D_arr_like_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.negative_binomial(I_arr_10, D_arr_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.negative_binomial(I_arr_like_10, D_arr_like_0p5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.negative_binomial(I_arr_10, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.negative_binomial(I_arr_like_10, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.hypergeometric(20, 20, 10))  # E: int
+reveal_type(def_gen.hypergeometric(20, 20, 10, size=None))  # E: int
+reveal_type(def_gen.hypergeometric(20, 20, 10, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.hypergeometric(I_arr_20, 20, 10))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.hypergeometric(20, I_arr_20, 10))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.hypergeometric(I_arr_20, 20, I_arr_like_10, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.hypergeometric(20, I_arr_20, 10, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.hypergeometric(I_arr_like_20, 20, I_arr_10))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.hypergeometric(20, I_arr_like_20, 10))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.hypergeometric(I_arr_20, I_arr_20, 10))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.hypergeometric(I_arr_like_20, I_arr_like_20, 10))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.hypergeometric(I_arr_20, I_arr_20, I_arr_10, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.hypergeometric(I_arr_like_20, I_arr_like_20, I_arr_like_10, size=1))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+I_int64_100: np.ndarray[Any, np.dtype[np.int64]] = np.array([100], dtype=np.int64)
+
+reveal_type(def_gen.integers(0, 100))  # E: int
+reveal_type(def_gen.integers(100))  # E: int
+reveal_type(def_gen.integers([100]))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(0, [100]))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+I_bool_low: np.ndarray[Any, np.dtype[np.bool_]] = np.array([0], dtype=np.bool_)
+I_bool_low_like: List[int] = [0]
+I_bool_high_open: np.ndarray[Any, np.dtype[np.bool_]] = np.array([1], dtype=np.bool_)
+I_bool_high_closed: np.ndarray[Any, np.dtype[np.bool_]] = np.array([1], dtype=np.bool_)
+
+reveal_type(def_gen.integers(2, dtype=bool))  # E: builtins.bool
+reveal_type(def_gen.integers(0, 2, dtype=bool))  # E: builtins.bool
+reveal_type(def_gen.integers(1, dtype=bool, endpoint=True))  # E: builtins.bool
+reveal_type(def_gen.integers(0, 1, dtype=bool, endpoint=True))  # E: builtins.bool
+reveal_type(def_gen.integers(I_bool_low_like, 1, dtype=bool, endpoint=True))  # E: ndarray[Any, dtype[bool_]
+reveal_type(def_gen.integers(I_bool_high_open, dtype=bool))  # E: ndarray[Any, dtype[bool_]
+reveal_type(def_gen.integers(I_bool_low, I_bool_high_open, dtype=bool))  # E: ndarray[Any, dtype[bool_]
+reveal_type(def_gen.integers(0, I_bool_high_open, dtype=bool))  # E: ndarray[Any, dtype[bool_]
+reveal_type(def_gen.integers(I_bool_high_closed, dtype=bool, endpoint=True))  # E: ndarray[Any, dtype[bool_]
+reveal_type(def_gen.integers(I_bool_low, I_bool_high_closed, dtype=bool, endpoint=True))  # E: ndarray[Any, dtype[bool_]
+reveal_type(def_gen.integers(0, I_bool_high_closed, dtype=bool, endpoint=True))  # E: ndarray[Any, dtype[bool_]
+
+reveal_type(def_gen.integers(2, dtype=np.bool_))  # E: builtins.bool
+reveal_type(def_gen.integers(0, 2, dtype=np.bool_))  # E: builtins.bool
+reveal_type(def_gen.integers(1, dtype=np.bool_, endpoint=True))  # E: builtins.bool
+reveal_type(def_gen.integers(0, 1, dtype=np.bool_, endpoint=True))  # E: builtins.bool
+reveal_type(def_gen.integers(I_bool_low_like, 1, dtype=np.bool_, endpoint=True))  # E: ndarray[Any, dtype[bool_]
+reveal_type(def_gen.integers(I_bool_high_open, dtype=np.bool_))  # E: ndarray[Any, dtype[bool_]
+reveal_type(def_gen.integers(I_bool_low, I_bool_high_open, dtype=np.bool_))  # E: ndarray[Any, dtype[bool_]
+reveal_type(def_gen.integers(0, I_bool_high_open, dtype=np.bool_))  # E: ndarray[Any, dtype[bool_]
+reveal_type(def_gen.integers(I_bool_high_closed, dtype=np.bool_, endpoint=True))  # E: ndarray[Any, dtype[bool_]
+reveal_type(def_gen.integers(I_bool_low, I_bool_high_closed, dtype=np.bool_, endpoint=True))  # E: ndarray[Any, dtype[bool_]
+reveal_type(def_gen.integers(0, I_bool_high_closed, dtype=np.bool_, endpoint=True))  # E: ndarray[Any, dtype[bool_]
+
+I_u1_low: np.ndarray[Any, np.dtype[np.uint8]] = np.array([0], dtype=np.uint8)
+I_u1_low_like: List[int] = [0]
+I_u1_high_open: np.ndarray[Any, np.dtype[np.uint8]] = np.array([255], dtype=np.uint8)
+I_u1_high_closed: np.ndarray[Any, np.dtype[np.uint8]] = np.array([255], dtype=np.uint8)
+
+reveal_type(def_gen.integers(256, dtype="u1"))  # E: int
+reveal_type(def_gen.integers(0, 256, dtype="u1"))  # E: int
+reveal_type(def_gen.integers(255, dtype="u1", endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 255, dtype="u1", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u1_low_like, 255, dtype="u1", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_u1_high_open, dtype="u1"))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_u1_low, I_u1_high_open, dtype="u1"))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(0, I_u1_high_open, dtype="u1"))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_u1_high_closed, dtype="u1", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_u1_low, I_u1_high_closed, dtype="u1", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(0, I_u1_high_closed, dtype="u1", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+
+reveal_type(def_gen.integers(256, dtype="uint8"))  # E: int
+reveal_type(def_gen.integers(0, 256, dtype="uint8"))  # E: int
+reveal_type(def_gen.integers(255, dtype="uint8", endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 255, dtype="uint8", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u1_low_like, 255, dtype="uint8", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_u1_high_open, dtype="uint8"))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_u1_low, I_u1_high_open, dtype="uint8"))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(0, I_u1_high_open, dtype="uint8"))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_u1_high_closed, dtype="uint8", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_u1_low, I_u1_high_closed, dtype="uint8", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(0, I_u1_high_closed, dtype="uint8", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+
+reveal_type(def_gen.integers(256, dtype=np.uint8))  # E: int
+reveal_type(def_gen.integers(0, 256, dtype=np.uint8))  # E: int
+reveal_type(def_gen.integers(255, dtype=np.uint8, endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 255, dtype=np.uint8, endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u1_low_like, 255, dtype=np.uint8, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_u1_high_open, dtype=np.uint8))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_u1_low, I_u1_high_open, dtype=np.uint8))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(0, I_u1_high_open, dtype=np.uint8))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_u1_high_closed, dtype=np.uint8, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_u1_low, I_u1_high_closed, dtype=np.uint8, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(0, I_u1_high_closed, dtype=np.uint8, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+
+I_u2_low: np.ndarray[Any, np.dtype[np.uint16]] = np.array([0], dtype=np.uint16)
+I_u2_low_like: List[int] = [0]
+I_u2_high_open: np.ndarray[Any, np.dtype[np.uint16]] = np.array([65535], dtype=np.uint16)
+I_u2_high_closed: np.ndarray[Any, np.dtype[np.uint16]] = np.array([65535], dtype=np.uint16)
+
+reveal_type(def_gen.integers(65536, dtype="u2"))  # E: int
+reveal_type(def_gen.integers(0, 65536, dtype="u2"))  # E: int
+reveal_type(def_gen.integers(65535, dtype="u2", endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 65535, dtype="u2", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u2_low_like, 65535, dtype="u2", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_u2_high_open, dtype="u2"))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_u2_low, I_u2_high_open, dtype="u2"))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(0, I_u2_high_open, dtype="u2"))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_u2_high_closed, dtype="u2", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_u2_low, I_u2_high_closed, dtype="u2", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(0, I_u2_high_closed, dtype="u2", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+
+reveal_type(def_gen.integers(65536, dtype="uint16"))  # E: int
+reveal_type(def_gen.integers(0, 65536, dtype="uint16"))  # E: int
+reveal_type(def_gen.integers(65535, dtype="uint16", endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 65535, dtype="uint16", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u2_low_like, 65535, dtype="uint16", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_u2_high_open, dtype="uint16"))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_u2_low, I_u2_high_open, dtype="uint16"))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(0, I_u2_high_open, dtype="uint16"))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_u2_high_closed, dtype="uint16", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_u2_low, I_u2_high_closed, dtype="uint16", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(0, I_u2_high_closed, dtype="uint16", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+
+reveal_type(def_gen.integers(65536, dtype=np.uint16))  # E: int
+reveal_type(def_gen.integers(0, 65536, dtype=np.uint16))  # E: int
+reveal_type(def_gen.integers(65535, dtype=np.uint16, endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 65535, dtype=np.uint16, endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u2_low_like, 65535, dtype=np.uint16, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_u2_high_open, dtype=np.uint16))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_u2_low, I_u2_high_open, dtype=np.uint16))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(0, I_u2_high_open, dtype=np.uint16))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_u2_high_closed, dtype=np.uint16, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_u2_low, I_u2_high_closed, dtype=np.uint16, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(0, I_u2_high_closed, dtype=np.uint16, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+
+I_u4_low: np.ndarray[Any, np.dtype[np.uint32]] = np.array([0], dtype=np.uint32)
+I_u4_low_like: List[int] = [0]
+I_u4_high_open: np.ndarray[Any, np.dtype[np.uint32]] = np.array([4294967295], dtype=np.uint32)
+I_u4_high_closed: np.ndarray[Any, np.dtype[np.uint32]] = np.array([4294967295], dtype=np.uint32)
+
+reveal_type(def_gen.integers(4294967296, dtype=np.int_))  # E: int
+reveal_type(def_gen.integers(0, 4294967296, dtype=np.int_))  # E: int
+reveal_type(def_gen.integers(4294967295, dtype=np.int_, endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 4294967295, dtype=np.int_, endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u4_low_like, 4294967295, dtype=np.int_, endpoint=True))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(def_gen.integers(I_u4_high_open, dtype=np.int_))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(def_gen.integers(I_u4_low, I_u4_high_open, dtype=np.int_))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(def_gen.integers(0, I_u4_high_open, dtype=np.int_))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(def_gen.integers(I_u4_high_closed, dtype=np.int_, endpoint=True))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(def_gen.integers(I_u4_low, I_u4_high_closed, dtype=np.int_, endpoint=True))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(def_gen.integers(0, I_u4_high_closed, dtype=np.int_, endpoint=True))  # E: ndarray[Any, dtype[{int_}]]
+
+
+reveal_type(def_gen.integers(4294967296, dtype="u4"))  # E: int
+reveal_type(def_gen.integers(0, 4294967296, dtype="u4"))  # E: int
+reveal_type(def_gen.integers(4294967295, dtype="u4", endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 4294967295, dtype="u4", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u4_low_like, 4294967295, dtype="u4", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_u4_high_open, dtype="u4"))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_u4_low, I_u4_high_open, dtype="u4"))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(0, I_u4_high_open, dtype="u4"))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_u4_high_closed, dtype="u4", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_u4_low, I_u4_high_closed, dtype="u4", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(0, I_u4_high_closed, dtype="u4", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+
+reveal_type(def_gen.integers(4294967296, dtype="uint32"))  # E: int
+reveal_type(def_gen.integers(0, 4294967296, dtype="uint32"))  # E: int
+reveal_type(def_gen.integers(4294967295, dtype="uint32", endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 4294967295, dtype="uint32", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u4_low_like, 4294967295, dtype="uint32", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_u4_high_open, dtype="uint32"))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_u4_low, I_u4_high_open, dtype="uint32"))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(0, I_u4_high_open, dtype="uint32"))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_u4_high_closed, dtype="uint32", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_u4_low, I_u4_high_closed, dtype="uint32", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(0, I_u4_high_closed, dtype="uint32", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+
+reveal_type(def_gen.integers(4294967296, dtype=np.uint32))  # E: int
+reveal_type(def_gen.integers(0, 4294967296, dtype=np.uint32))  # E: int
+reveal_type(def_gen.integers(4294967295, dtype=np.uint32, endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 4294967295, dtype=np.uint32, endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u4_low_like, 4294967295, dtype=np.uint32, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_u4_high_open, dtype=np.uint32))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_u4_low, I_u4_high_open, dtype=np.uint32))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(0, I_u4_high_open, dtype=np.uint32))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_u4_high_closed, dtype=np.uint32, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_u4_low, I_u4_high_closed, dtype=np.uint32, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(0, I_u4_high_closed, dtype=np.uint32, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+
+reveal_type(def_gen.integers(4294967296, dtype=np.uint))  # E: int
+reveal_type(def_gen.integers(0, 4294967296, dtype=np.uint))  # E: int
+reveal_type(def_gen.integers(4294967295, dtype=np.uint, endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 4294967295, dtype=np.uint, endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u4_low_like, 4294967295, dtype=np.uint, endpoint=True))  # E: ndarray[Any, dtype[{uint}]]
+reveal_type(def_gen.integers(I_u4_high_open, dtype=np.uint))  # E: ndarray[Any, dtype[{uint}]]
+reveal_type(def_gen.integers(I_u4_low, I_u4_high_open, dtype=np.uint))  # E: ndarray[Any, dtype[{uint}]]
+reveal_type(def_gen.integers(0, I_u4_high_open, dtype=np.uint))  # E: ndarray[Any, dtype[{uint}]]
+reveal_type(def_gen.integers(I_u4_high_closed, dtype=np.uint, endpoint=True))  # E: ndarray[Any, dtype[{uint}]]
+reveal_type(def_gen.integers(I_u4_low, I_u4_high_closed, dtype=np.uint, endpoint=True))  # E: ndarray[Any, dtype[{uint}]]
+reveal_type(def_gen.integers(0, I_u4_high_closed, dtype=np.uint, endpoint=True))  # E: ndarray[Any, dtype[{uint}]]
+
+I_u8_low: np.ndarray[Any, np.dtype[np.uint64]] = np.array([0], dtype=np.uint64)
+I_u8_low_like: List[int] = [0]
+I_u8_high_open: np.ndarray[Any, np.dtype[np.uint64]] = np.array([18446744073709551615], dtype=np.uint64)
+I_u8_high_closed: np.ndarray[Any, np.dtype[np.uint64]] = np.array([18446744073709551615], dtype=np.uint64)
+
+reveal_type(def_gen.integers(18446744073709551616, dtype="u8"))  # E: int
+reveal_type(def_gen.integers(0, 18446744073709551616, dtype="u8"))  # E: int
+reveal_type(def_gen.integers(18446744073709551615, dtype="u8", endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 18446744073709551615, dtype="u8", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u8_low_like, 18446744073709551615, dtype="u8", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_u8_high_open, dtype="u8"))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_u8_low, I_u8_high_open, dtype="u8"))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(0, I_u8_high_open, dtype="u8"))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_u8_high_closed, dtype="u8", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_u8_low, I_u8_high_closed, dtype="u8", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(0, I_u8_high_closed, dtype="u8", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.integers(18446744073709551616, dtype="uint64"))  # E: int
+reveal_type(def_gen.integers(0, 18446744073709551616, dtype="uint64"))  # E: int
+reveal_type(def_gen.integers(18446744073709551615, dtype="uint64", endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 18446744073709551615, dtype="uint64", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u8_low_like, 18446744073709551615, dtype="uint64", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_u8_high_open, dtype="uint64"))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_u8_low, I_u8_high_open, dtype="uint64"))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(0, I_u8_high_open, dtype="uint64"))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_u8_high_closed, dtype="uint64", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_u8_low, I_u8_high_closed, dtype="uint64", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(0, I_u8_high_closed, dtype="uint64", endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.integers(18446744073709551616, dtype=np.uint64))  # E: int
+reveal_type(def_gen.integers(0, 18446744073709551616, dtype=np.uint64))  # E: int
+reveal_type(def_gen.integers(18446744073709551615, dtype=np.uint64, endpoint=True))  # E: int
+reveal_type(def_gen.integers(0, 18446744073709551615, dtype=np.uint64, endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_u8_low_like, 18446744073709551615, dtype=np.uint64, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_u8_high_open, dtype=np.uint64))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_u8_low, I_u8_high_open, dtype=np.uint64))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(0, I_u8_high_open, dtype=np.uint64))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_u8_high_closed, dtype=np.uint64, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_u8_low, I_u8_high_closed, dtype=np.uint64, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(0, I_u8_high_closed, dtype=np.uint64, endpoint=True))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+
+I_i1_low: np.ndarray[Any, np.dtype[np.int8]] = np.array([-128], dtype=np.int8)
+I_i1_low_like: List[int] = [-128]
+I_i1_high_open: np.ndarray[Any, np.dtype[np.int8]] = np.array([127], dtype=np.int8)
+I_i1_high_closed: np.ndarray[Any, np.dtype[np.int8]] = np.array([127], dtype=np.int8)
+
+reveal_type(def_gen.integers(128, dtype="i1"))  # E: int
+reveal_type(def_gen.integers(-128, 128, dtype="i1"))  # E: int
+reveal_type(def_gen.integers(127, dtype="i1", endpoint=True))  # E: int
+reveal_type(def_gen.integers(-128, 127, dtype="i1", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_i1_low_like, 127, dtype="i1", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_i1_high_open, dtype="i1"))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_i1_low, I_i1_high_open, dtype="i1"))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(-128, I_i1_high_open, dtype="i1"))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_i1_high_closed, dtype="i1", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_i1_low, I_i1_high_closed, dtype="i1", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(-128, I_i1_high_closed, dtype="i1", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+
+reveal_type(def_gen.integers(128, dtype="int8"))  # E: int
+reveal_type(def_gen.integers(-128, 128, dtype="int8"))  # E: int
+reveal_type(def_gen.integers(127, dtype="int8", endpoint=True))  # E: int
+reveal_type(def_gen.integers(-128, 127, dtype="int8", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_i1_low_like, 127, dtype="int8", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_i1_high_open, dtype="int8"))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_i1_low, I_i1_high_open, dtype="int8"))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(-128, I_i1_high_open, dtype="int8"))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_i1_high_closed, dtype="int8", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_i1_low, I_i1_high_closed, dtype="int8", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(-128, I_i1_high_closed, dtype="int8", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+
+reveal_type(def_gen.integers(128, dtype=np.int8))  # E: int
+reveal_type(def_gen.integers(-128, 128, dtype=np.int8))  # E: int
+reveal_type(def_gen.integers(127, dtype=np.int8, endpoint=True))  # E: int
+reveal_type(def_gen.integers(-128, 127, dtype=np.int8, endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_i1_low_like, 127, dtype=np.int8, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_i1_high_open, dtype=np.int8))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_i1_low, I_i1_high_open, dtype=np.int8))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(-128, I_i1_high_open, dtype=np.int8))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_i1_high_closed, dtype=np.int8, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(I_i1_low, I_i1_high_closed, dtype=np.int8, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(def_gen.integers(-128, I_i1_high_closed, dtype=np.int8, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+
+I_i2_low: np.ndarray[Any, np.dtype[np.int16]] = np.array([-32768], dtype=np.int16)
+I_i2_low_like: List[int] = [-32768]
+I_i2_high_open: np.ndarray[Any, np.dtype[np.int16]] = np.array([32767], dtype=np.int16)
+I_i2_high_closed: np.ndarray[Any, np.dtype[np.int16]] = np.array([32767], dtype=np.int16)
+
+reveal_type(def_gen.integers(32768, dtype="i2"))  # E: int
+reveal_type(def_gen.integers(-32768, 32768, dtype="i2"))  # E: int
+reveal_type(def_gen.integers(32767, dtype="i2", endpoint=True))  # E: int
+reveal_type(def_gen.integers(-32768, 32767, dtype="i2", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_i2_low_like, 32767, dtype="i2", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_i2_high_open, dtype="i2"))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_i2_low, I_i2_high_open, dtype="i2"))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(-32768, I_i2_high_open, dtype="i2"))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_i2_high_closed, dtype="i2", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_i2_low, I_i2_high_closed, dtype="i2", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(-32768, I_i2_high_closed, dtype="i2", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+
+reveal_type(def_gen.integers(32768, dtype="int16"))  # E: int
+reveal_type(def_gen.integers(-32768, 32768, dtype="int16"))  # E: int
+reveal_type(def_gen.integers(32767, dtype="int16", endpoint=True))  # E: int
+reveal_type(def_gen.integers(-32768, 32767, dtype="int16", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_i2_low_like, 32767, dtype="int16", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_i2_high_open, dtype="int16"))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_i2_low, I_i2_high_open, dtype="int16"))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(-32768, I_i2_high_open, dtype="int16"))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_i2_high_closed, dtype="int16", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_i2_low, I_i2_high_closed, dtype="int16", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(-32768, I_i2_high_closed, dtype="int16", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+
+reveal_type(def_gen.integers(32768, dtype=np.int16))  # E: int
+reveal_type(def_gen.integers(-32768, 32768, dtype=np.int16))  # E: int
+reveal_type(def_gen.integers(32767, dtype=np.int16, endpoint=True))  # E: int
+reveal_type(def_gen.integers(-32768, 32767, dtype=np.int16, endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_i2_low_like, 32767, dtype=np.int16, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_i2_high_open, dtype=np.int16))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_i2_low, I_i2_high_open, dtype=np.int16))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(-32768, I_i2_high_open, dtype=np.int16))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_i2_high_closed, dtype=np.int16, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(I_i2_low, I_i2_high_closed, dtype=np.int16, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(def_gen.integers(-32768, I_i2_high_closed, dtype=np.int16, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+
+I_i4_low: np.ndarray[Any, np.dtype[np.int32]] = np.array([-2147483648], dtype=np.int32)
+I_i4_low_like: List[int] = [-2147483648]
+I_i4_high_open: np.ndarray[Any, np.dtype[np.int32]] = np.array([2147483647], dtype=np.int32)
+I_i4_high_closed: np.ndarray[Any, np.dtype[np.int32]] = np.array([2147483647], dtype=np.int32)
+
+reveal_type(def_gen.integers(2147483648, dtype="i4"))  # E: int
+reveal_type(def_gen.integers(-2147483648, 2147483648, dtype="i4"))  # E: int
+reveal_type(def_gen.integers(2147483647, dtype="i4", endpoint=True))  # E: int
+reveal_type(def_gen.integers(-2147483648, 2147483647, dtype="i4", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_i4_low_like, 2147483647, dtype="i4", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_i4_high_open, dtype="i4"))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_i4_low, I_i4_high_open, dtype="i4"))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(-2147483648, I_i4_high_open, dtype="i4"))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_i4_high_closed, dtype="i4", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_i4_low, I_i4_high_closed, dtype="i4", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(-2147483648, I_i4_high_closed, dtype="i4", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+
+reveal_type(def_gen.integers(2147483648, dtype="int32"))  # E: int
+reveal_type(def_gen.integers(-2147483648, 2147483648, dtype="int32"))  # E: int
+reveal_type(def_gen.integers(2147483647, dtype="int32", endpoint=True))  # E: int
+reveal_type(def_gen.integers(-2147483648, 2147483647, dtype="int32", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_i4_low_like, 2147483647, dtype="int32", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_i4_high_open, dtype="int32"))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_i4_low, I_i4_high_open, dtype="int32"))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(-2147483648, I_i4_high_open, dtype="int32"))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_i4_high_closed, dtype="int32", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_i4_low, I_i4_high_closed, dtype="int32", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(-2147483648, I_i4_high_closed, dtype="int32", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+
+reveal_type(def_gen.integers(2147483648, dtype=np.int32))  # E: int
+reveal_type(def_gen.integers(-2147483648, 2147483648, dtype=np.int32))  # E: int
+reveal_type(def_gen.integers(2147483647, dtype=np.int32, endpoint=True))  # E: int
+reveal_type(def_gen.integers(-2147483648, 2147483647, dtype=np.int32, endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_i4_low_like, 2147483647, dtype=np.int32, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_i4_high_open, dtype=np.int32))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_i4_low, I_i4_high_open, dtype=np.int32))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(-2147483648, I_i4_high_open, dtype=np.int32))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_i4_high_closed, dtype=np.int32, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(I_i4_low, I_i4_high_closed, dtype=np.int32, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(def_gen.integers(-2147483648, I_i4_high_closed, dtype=np.int32, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+
+I_i8_low: np.ndarray[Any, np.dtype[np.int64]] = np.array([-9223372036854775808], dtype=np.int64)
+I_i8_low_like: List[int] = [-9223372036854775808]
+I_i8_high_open: np.ndarray[Any, np.dtype[np.int64]] = np.array([9223372036854775807], dtype=np.int64)
+I_i8_high_closed: np.ndarray[Any, np.dtype[np.int64]] = np.array([9223372036854775807], dtype=np.int64)
+
+reveal_type(def_gen.integers(9223372036854775808, dtype="i8"))  # E: int
+reveal_type(def_gen.integers(-9223372036854775808, 9223372036854775808, dtype="i8"))  # E: int
+reveal_type(def_gen.integers(9223372036854775807, dtype="i8", endpoint=True))  # E: int
+reveal_type(def_gen.integers(-9223372036854775808, 9223372036854775807, dtype="i8", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_i8_low_like, 9223372036854775807, dtype="i8", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_i8_high_open, dtype="i8"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_i8_low, I_i8_high_open, dtype="i8"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(-9223372036854775808, I_i8_high_open, dtype="i8"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_i8_high_closed, dtype="i8", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_i8_low, I_i8_high_closed, dtype="i8", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(-9223372036854775808, I_i8_high_closed, dtype="i8", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.integers(9223372036854775808, dtype="int64"))  # E: int
+reveal_type(def_gen.integers(-9223372036854775808, 9223372036854775808, dtype="int64"))  # E: int
+reveal_type(def_gen.integers(9223372036854775807, dtype="int64", endpoint=True))  # E: int
+reveal_type(def_gen.integers(-9223372036854775808, 9223372036854775807, dtype="int64", endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_i8_low_like, 9223372036854775807, dtype="int64", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_i8_high_open, dtype="int64"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_i8_low, I_i8_high_open, dtype="int64"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(-9223372036854775808, I_i8_high_open, dtype="int64"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_i8_high_closed, dtype="int64", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_i8_low, I_i8_high_closed, dtype="int64", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(-9223372036854775808, I_i8_high_closed, dtype="int64", endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.integers(9223372036854775808, dtype=np.int64))  # E: int
+reveal_type(def_gen.integers(-9223372036854775808, 9223372036854775808, dtype=np.int64))  # E: int
+reveal_type(def_gen.integers(9223372036854775807, dtype=np.int64, endpoint=True))  # E: int
+reveal_type(def_gen.integers(-9223372036854775808, 9223372036854775807, dtype=np.int64, endpoint=True))  # E: int
+reveal_type(def_gen.integers(I_i8_low_like, 9223372036854775807, dtype=np.int64, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_i8_high_open, dtype=np.int64))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_i8_low, I_i8_high_open, dtype=np.int64))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(-9223372036854775808, I_i8_high_open, dtype=np.int64))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_i8_high_closed, dtype=np.int64, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(I_i8_low, I_i8_high_closed, dtype=np.int64, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.integers(-9223372036854775808, I_i8_high_closed, dtype=np.int64, endpoint=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+
+reveal_type(def_gen.bit_generator)  # E: BitGenerator
+
+reveal_type(def_gen.bytes(2))  # E: bytes
+
+reveal_type(def_gen.choice(5))  # E: int
+reveal_type(def_gen.choice(5, 3))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.choice(5, 3, replace=True))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.choice(5, 3, p=[1 / 5] * 5))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.choice(5, 3, p=[1 / 5] * 5, replace=False))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.choice(["pooh", "rabbit", "piglet", "Christopher"]))  # E: Any
+reveal_type(def_gen.choice(["pooh", "rabbit", "piglet", "Christopher"], 3))  # E: ndarray[Any, Any]
+reveal_type(def_gen.choice(["pooh", "rabbit", "piglet", "Christopher"], 3, p=[1 / 4] * 4))  # E: ndarray[Any, Any]
+reveal_type(def_gen.choice(["pooh", "rabbit", "piglet", "Christopher"], 3, replace=True))  # E: ndarray[Any, Any]
+reveal_type(def_gen.choice(["pooh", "rabbit", "piglet", "Christopher"], 3, replace=False, p=np.array([1 / 8, 1 / 8, 1 / 2, 1 / 4])))  # E: ndarray[Any, Any]
+
+reveal_type(def_gen.dirichlet([0.5, 0.5]))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.dirichlet(np.array([0.5, 0.5])))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.dirichlet(np.array([0.5, 0.5]), size=3))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.multinomial(20, [1 / 6.0] * 6))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.multinomial(20, np.array([0.5, 0.5])))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.multinomial(20, [1 / 6.0] * 6, size=2))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.multinomial([[10], [20]], [1 / 6.0] * 6, size=(2, 2)))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.multinomial(np.array([[10], [20]]), np.array([0.5, 0.5]), size=(2, 2)))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.multivariate_hypergeometric([3, 5, 7], 2))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.multivariate_hypergeometric(np.array([3, 5, 7]), 2))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.multivariate_hypergeometric(np.array([3, 5, 7]), 2, size=4))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.multivariate_hypergeometric(np.array([3, 5, 7]), 2, size=(4, 7)))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.multivariate_hypergeometric([3, 5, 7], 2, method="count"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.multivariate_hypergeometric(np.array([3, 5, 7]), 2, method="marginals"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(def_gen.multivariate_normal([0.0], [[1.0]]))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.multivariate_normal([0.0], np.array([[1.0]])))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.multivariate_normal(np.array([0.0]), [[1.0]]))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(def_gen.multivariate_normal([0.0], np.array([[1.0]])))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(def_gen.permutation(10))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(def_gen.permutation([1, 2, 3, 4]))  # E: ndarray[Any, Any]
+reveal_type(def_gen.permutation(np.array([1, 2, 3, 4])))  # E: ndarray[Any, Any]
+reveal_type(def_gen.permutation(D_2D, axis=1))  # E: ndarray[Any, Any]
+reveal_type(def_gen.permuted(D_2D))  # E: ndarray[Any, Any]
+reveal_type(def_gen.permuted(D_2D_like))  # E: ndarray[Any, Any]
+reveal_type(def_gen.permuted(D_2D, axis=1))  # E: ndarray[Any, Any]
+reveal_type(def_gen.permuted(D_2D, out=D_2D))  # E: ndarray[Any, Any]
+reveal_type(def_gen.permuted(D_2D_like, out=D_2D))  # E: ndarray[Any, Any]
+reveal_type(def_gen.permuted(D_2D_like, out=D_2D))  # E: ndarray[Any, Any]
+reveal_type(def_gen.permuted(D_2D, axis=1, out=D_2D))  # E: ndarray[Any, Any]
+
+reveal_type(def_gen.shuffle(np.arange(10)))  # E: None
+reveal_type(def_gen.shuffle([1, 2, 3, 4, 5]))  # E: None
+reveal_type(def_gen.shuffle(D_2D, axis=1))  # E: None
+
+reveal_type(np.random.Generator(pcg64))  # E: Generator
+reveal_type(def_gen.__str__())  # E: str
+reveal_type(def_gen.__repr__())  # E: str
+def_gen_state = def_gen.__getstate__()
+reveal_type(def_gen_state)  # E: builtins.dict[builtins.str, Any]
+reveal_type(def_gen.__setstate__(def_gen_state))  # E: None
+
+# RandomState
+random_st: np.random.RandomState = np.random.RandomState()
+
+reveal_type(random_st.standard_normal())  # E: float
+reveal_type(random_st.standard_normal(size=None))  # E: float
+reveal_type(random_st.standard_normal(size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+
+reveal_type(random_st.random())  # E: float
+reveal_type(random_st.random(size=None))  # E: float
+reveal_type(random_st.random(size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+
+reveal_type(random_st.standard_cauchy())  # E: float
+reveal_type(random_st.standard_cauchy(size=None))  # E: float
+reveal_type(random_st.standard_cauchy(size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.standard_exponential())  # E: float
+reveal_type(random_st.standard_exponential(size=None))  # E: float
+reveal_type(random_st.standard_exponential(size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+
+reveal_type(random_st.zipf(1.5))  # E: int
+reveal_type(random_st.zipf(1.5, size=None))  # E: int
+reveal_type(random_st.zipf(1.5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.zipf(D_arr_1p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.zipf(D_arr_1p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.zipf(D_arr_like_1p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.zipf(D_arr_like_1p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(random_st.weibull(0.5))  # E: float
+reveal_type(random_st.weibull(0.5, size=None))  # E: float
+reveal_type(random_st.weibull(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.weibull(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.weibull(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.weibull(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.weibull(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.standard_t(0.5))  # E: float
+reveal_type(random_st.standard_t(0.5, size=None))  # E: float
+reveal_type(random_st.standard_t(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.standard_t(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.standard_t(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.standard_t(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.standard_t(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.poisson(0.5))  # E: int
+reveal_type(random_st.poisson(0.5, size=None))  # E: int
+reveal_type(random_st.poisson(0.5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.poisson(D_arr_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.poisson(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.poisson(D_arr_like_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.poisson(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(random_st.power(0.5))  # E: float
+reveal_type(random_st.power(0.5, size=None))  # E: float
+reveal_type(random_st.power(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.power(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.power(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.power(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.power(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.pareto(0.5))  # E: float
+reveal_type(random_st.pareto(0.5, size=None))  # E: float
+reveal_type(random_st.pareto(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.pareto(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.pareto(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.pareto(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.pareto(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.chisquare(0.5))  # E: float
+reveal_type(random_st.chisquare(0.5, size=None))  # E: float
+reveal_type(random_st.chisquare(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.chisquare(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.chisquare(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.chisquare(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.chisquare(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.exponential(0.5))  # E: float
+reveal_type(random_st.exponential(0.5, size=None))  # E: float
+reveal_type(random_st.exponential(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.exponential(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.exponential(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.exponential(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.exponential(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.geometric(0.5))  # E: int
+reveal_type(random_st.geometric(0.5, size=None))  # E: int
+reveal_type(random_st.geometric(0.5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.geometric(D_arr_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.geometric(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.geometric(D_arr_like_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.geometric(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(random_st.logseries(0.5))  # E: int
+reveal_type(random_st.logseries(0.5, size=None))  # E: int
+reveal_type(random_st.logseries(0.5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.logseries(D_arr_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.logseries(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.logseries(D_arr_like_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.logseries(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(random_st.rayleigh(0.5))  # E: float
+reveal_type(random_st.rayleigh(0.5, size=None))  # E: float
+reveal_type(random_st.rayleigh(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.rayleigh(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.rayleigh(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.rayleigh(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.rayleigh(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.standard_gamma(0.5))  # E: float
+reveal_type(random_st.standard_gamma(0.5, size=None))  # E: float
+reveal_type(random_st.standard_gamma(0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(random_st.standard_gamma(D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(random_st.standard_gamma(D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(random_st.standard_gamma(D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(random_st.standard_gamma(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+reveal_type(random_st.standard_gamma(D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]]
+
+reveal_type(random_st.vonmises(0.5, 0.5))  # E: float
+reveal_type(random_st.vonmises(0.5, 0.5, size=None))  # E: float
+reveal_type(random_st.vonmises(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.vonmises(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.vonmises(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.vonmises(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.vonmises(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.vonmises(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.vonmises(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.vonmises(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.vonmises(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.vonmises(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.vonmises(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.wald(0.5, 0.5))  # E: float
+reveal_type(random_st.wald(0.5, 0.5, size=None))  # E: float
+reveal_type(random_st.wald(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.wald(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.wald(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.wald(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.wald(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.wald(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.wald(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.wald(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.wald(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.wald(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.wald(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.uniform(0.5, 0.5))  # E: float
+reveal_type(random_st.uniform(0.5, 0.5, size=None))  # E: float
+reveal_type(random_st.uniform(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.uniform(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.uniform(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.uniform(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.uniform(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.uniform(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.uniform(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.uniform(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.uniform(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.uniform(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.uniform(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.beta(0.5, 0.5))  # E: float
+reveal_type(random_st.beta(0.5, 0.5, size=None))  # E: float
+reveal_type(random_st.beta(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.beta(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.beta(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.beta(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.beta(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.beta(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.beta(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.beta(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.beta(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.beta(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.beta(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.f(0.5, 0.5))  # E: float
+reveal_type(random_st.f(0.5, 0.5, size=None))  # E: float
+reveal_type(random_st.f(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.f(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.f(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.f(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.f(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.f(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.f(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.f(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.f(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.f(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.f(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.gamma(0.5, 0.5))  # E: float
+reveal_type(random_st.gamma(0.5, 0.5, size=None))  # E: float
+reveal_type(random_st.gamma(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gamma(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gamma(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gamma(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gamma(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gamma(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gamma(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gamma(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gamma(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gamma(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gamma(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.gumbel(0.5, 0.5))  # E: float
+reveal_type(random_st.gumbel(0.5, 0.5, size=None))  # E: float
+reveal_type(random_st.gumbel(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gumbel(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gumbel(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gumbel(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gumbel(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gumbel(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gumbel(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gumbel(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gumbel(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gumbel(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.gumbel(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.laplace(0.5, 0.5))  # E: float
+reveal_type(random_st.laplace(0.5, 0.5, size=None))  # E: float
+reveal_type(random_st.laplace(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.laplace(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.laplace(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.laplace(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.laplace(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.laplace(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.laplace(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.laplace(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.laplace(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.laplace(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.laplace(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.logistic(0.5, 0.5))  # E: float
+reveal_type(random_st.logistic(0.5, 0.5, size=None))  # E: float
+reveal_type(random_st.logistic(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.logistic(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.logistic(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.logistic(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.logistic(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.logistic(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.logistic(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.logistic(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.logistic(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.logistic(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.logistic(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.lognormal(0.5, 0.5))  # E: float
+reveal_type(random_st.lognormal(0.5, 0.5, size=None))  # E: float
+reveal_type(random_st.lognormal(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.lognormal(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.lognormal(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.lognormal(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.lognormal(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.lognormal(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.lognormal(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.lognormal(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.lognormal(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.lognormal(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.lognormal(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.noncentral_chisquare(0.5, 0.5))  # E: float
+reveal_type(random_st.noncentral_chisquare(0.5, 0.5, size=None))  # E: float
+reveal_type(random_st.noncentral_chisquare(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_chisquare(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_chisquare(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_chisquare(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_chisquare(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_chisquare(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_chisquare(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_chisquare(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_chisquare(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_chisquare(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_chisquare(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.normal(0.5, 0.5))  # E: float
+reveal_type(random_st.normal(0.5, 0.5, size=None))  # E: float
+reveal_type(random_st.normal(0.5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.normal(D_arr_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.normal(0.5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.normal(D_arr_0p5, 0.5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.normal(0.5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.normal(D_arr_like_0p5, 0.5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.normal(0.5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.normal(D_arr_0p5, D_arr_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.normal(D_arr_like_0p5, D_arr_like_0p5))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.normal(D_arr_0p5, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.normal(D_arr_like_0p5, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.triangular(0.1, 0.5, 0.9))  # E: float
+reveal_type(random_st.triangular(0.1, 0.5, 0.9, size=None))  # E: float
+reveal_type(random_st.triangular(0.1, 0.5, 0.9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.triangular(D_arr_0p1, 0.5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.triangular(0.1, D_arr_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.triangular(D_arr_0p1, 0.5, D_arr_like_0p9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.triangular(0.1, D_arr_0p5, 0.9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.triangular(D_arr_like_0p1, 0.5, D_arr_0p9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.triangular(0.5, D_arr_like_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.triangular(D_arr_0p1, D_arr_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.triangular(D_arr_like_0p1, D_arr_like_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.triangular(D_arr_0p1, D_arr_0p5, D_arr_0p9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.triangular(D_arr_like_0p1, D_arr_like_0p5, D_arr_like_0p9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.noncentral_f(0.1, 0.5, 0.9))  # E: float
+reveal_type(random_st.noncentral_f(0.1, 0.5, 0.9, size=None))  # E: float
+reveal_type(random_st.noncentral_f(0.1, 0.5, 0.9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_f(D_arr_0p1, 0.5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_f(0.1, D_arr_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_f(D_arr_0p1, 0.5, D_arr_like_0p9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_f(0.1, D_arr_0p5, 0.9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_f(D_arr_like_0p1, 0.5, D_arr_0p9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_f(0.5, D_arr_like_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_f(D_arr_0p1, D_arr_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_f(D_arr_like_0p1, D_arr_like_0p5, 0.9))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_f(D_arr_0p1, D_arr_0p5, D_arr_0p9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.noncentral_f(D_arr_like_0p1, D_arr_like_0p5, D_arr_like_0p9, size=1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.binomial(10, 0.5))  # E: int
+reveal_type(random_st.binomial(10, 0.5, size=None))  # E: int
+reveal_type(random_st.binomial(10, 0.5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.binomial(I_arr_10, 0.5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.binomial(10, D_arr_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.binomial(I_arr_10, 0.5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.binomial(10, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.binomial(I_arr_like_10, 0.5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.binomial(10, D_arr_like_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.binomial(I_arr_10, D_arr_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.binomial(I_arr_like_10, D_arr_like_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.binomial(I_arr_10, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.binomial(I_arr_like_10, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(random_st.negative_binomial(10, 0.5))  # E: int
+reveal_type(random_st.negative_binomial(10, 0.5, size=None))  # E: int
+reveal_type(random_st.negative_binomial(10, 0.5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.negative_binomial(I_arr_10, 0.5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.negative_binomial(10, D_arr_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.negative_binomial(I_arr_10, 0.5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.negative_binomial(10, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.negative_binomial(I_arr_like_10, 0.5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.negative_binomial(10, D_arr_like_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.negative_binomial(I_arr_10, D_arr_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.negative_binomial(I_arr_like_10, D_arr_like_0p5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.negative_binomial(I_arr_10, D_arr_0p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.negative_binomial(I_arr_like_10, D_arr_like_0p5, size=1))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(random_st.hypergeometric(20, 20, 10))  # E: int
+reveal_type(random_st.hypergeometric(20, 20, 10, size=None))  # E: int
+reveal_type(random_st.hypergeometric(20, 20, 10, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.hypergeometric(I_arr_20, 20, 10))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.hypergeometric(20, I_arr_20, 10))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.hypergeometric(I_arr_20, 20, I_arr_like_10, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.hypergeometric(20, I_arr_20, 10, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.hypergeometric(I_arr_like_20, 20, I_arr_10))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.hypergeometric(20, I_arr_like_20, 10))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.hypergeometric(I_arr_20, I_arr_20, 10))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.hypergeometric(I_arr_like_20, I_arr_like_20, 10))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.hypergeometric(I_arr_20, I_arr_20, I_arr_10, size=1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.hypergeometric(I_arr_like_20, I_arr_like_20, I_arr_like_10, size=1))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(random_st.randint(0, 100))  # E: int
+reveal_type(random_st.randint(100))  # E: int
+reveal_type(random_st.randint([100]))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.randint(0, [100]))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(random_st.randint(2, dtype=bool))  # E: builtins.bool
+reveal_type(random_st.randint(0, 2, dtype=bool))  # E: builtins.bool
+reveal_type(random_st.randint(I_bool_high_open, dtype=bool))  # E: ndarray[Any, dtype[bool_]
+reveal_type(random_st.randint(I_bool_low, I_bool_high_open, dtype=bool))  # E: ndarray[Any, dtype[bool_]
+reveal_type(random_st.randint(0, I_bool_high_open, dtype=bool))  # E: ndarray[Any, dtype[bool_]
+
+reveal_type(random_st.randint(2, dtype=np.bool_))  # E: builtins.bool
+reveal_type(random_st.randint(0, 2, dtype=np.bool_))  # E: builtins.bool
+reveal_type(random_st.randint(I_bool_high_open, dtype=np.bool_))  # E: ndarray[Any, dtype[bool_]
+reveal_type(random_st.randint(I_bool_low, I_bool_high_open, dtype=np.bool_))  # E: ndarray[Any, dtype[bool_]
+reveal_type(random_st.randint(0, I_bool_high_open, dtype=np.bool_))  # E: ndarray[Any, dtype[bool_]
+
+reveal_type(random_st.randint(256, dtype="u1"))  # E: int
+reveal_type(random_st.randint(0, 256, dtype="u1"))  # E: int
+reveal_type(random_st.randint(I_u1_high_open, dtype="u1"))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(random_st.randint(I_u1_low, I_u1_high_open, dtype="u1"))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(random_st.randint(0, I_u1_high_open, dtype="u1"))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+
+reveal_type(random_st.randint(256, dtype="uint8"))  # E: int
+reveal_type(random_st.randint(0, 256, dtype="uint8"))  # E: int
+reveal_type(random_st.randint(I_u1_high_open, dtype="uint8"))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(random_st.randint(I_u1_low, I_u1_high_open, dtype="uint8"))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(random_st.randint(0, I_u1_high_open, dtype="uint8"))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+
+reveal_type(random_st.randint(256, dtype=np.uint8))  # E: int
+reveal_type(random_st.randint(0, 256, dtype=np.uint8))  # E: int
+reveal_type(random_st.randint(I_u1_high_open, dtype=np.uint8))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(random_st.randint(I_u1_low, I_u1_high_open, dtype=np.uint8))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+reveal_type(random_st.randint(0, I_u1_high_open, dtype=np.uint8))  # E: ndarray[Any, dtype[unsignedinteger[typing._8Bit]]]
+
+reveal_type(random_st.randint(65536, dtype="u2"))  # E: int
+reveal_type(random_st.randint(0, 65536, dtype="u2"))  # E: int
+reveal_type(random_st.randint(I_u2_high_open, dtype="u2"))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(I_u2_low, I_u2_high_open, dtype="u2"))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(0, I_u2_high_open, dtype="u2"))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+
+reveal_type(random_st.randint(65536, dtype="uint16"))  # E: int
+reveal_type(random_st.randint(0, 65536, dtype="uint16"))  # E: int
+reveal_type(random_st.randint(I_u2_high_open, dtype="uint16"))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(I_u2_low, I_u2_high_open, dtype="uint16"))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(0, I_u2_high_open, dtype="uint16"))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+
+reveal_type(random_st.randint(65536, dtype=np.uint16))  # E: int
+reveal_type(random_st.randint(0, 65536, dtype=np.uint16))  # E: int
+reveal_type(random_st.randint(I_u2_high_open, dtype=np.uint16))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(I_u2_low, I_u2_high_open, dtype=np.uint16))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(0, I_u2_high_open, dtype=np.uint16))  # E: ndarray[Any, dtype[unsignedinteger[typing._16Bit]]]
+
+reveal_type(random_st.randint(4294967296, dtype="u4"))  # E: int
+reveal_type(random_st.randint(0, 4294967296, dtype="u4"))  # E: int
+reveal_type(random_st.randint(I_u4_high_open, dtype="u4"))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(random_st.randint(I_u4_low, I_u4_high_open, dtype="u4"))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(random_st.randint(0, I_u4_high_open, dtype="u4"))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+
+reveal_type(random_st.randint(4294967296, dtype="uint32"))  # E: int
+reveal_type(random_st.randint(0, 4294967296, dtype="uint32"))  # E: int
+reveal_type(random_st.randint(I_u4_high_open, dtype="uint32"))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(random_st.randint(I_u4_low, I_u4_high_open, dtype="uint32"))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(random_st.randint(0, I_u4_high_open, dtype="uint32"))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+
+reveal_type(random_st.randint(4294967296, dtype=np.uint32))  # E: int
+reveal_type(random_st.randint(0, 4294967296, dtype=np.uint32))  # E: int
+reveal_type(random_st.randint(I_u4_high_open, dtype=np.uint32))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(random_st.randint(I_u4_low, I_u4_high_open, dtype=np.uint32))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+reveal_type(random_st.randint(0, I_u4_high_open, dtype=np.uint32))  # E: ndarray[Any, dtype[unsignedinteger[typing._32Bit]]]
+
+reveal_type(random_st.randint(4294967296, dtype=np.uint))  # E: int
+reveal_type(random_st.randint(0, 4294967296, dtype=np.uint))  # E: int
+reveal_type(random_st.randint(I_u4_high_open, dtype=np.uint))  # E: ndarray[Any, dtype[{uint}]]
+reveal_type(random_st.randint(I_u4_low, I_u4_high_open, dtype=np.uint))  # E: ndarray[Any, dtype[{uint}]]
+reveal_type(random_st.randint(0, I_u4_high_open, dtype=np.uint))  # E: ndarray[Any, dtype[{uint}]]
+
+reveal_type(random_st.randint(18446744073709551616, dtype="u8"))  # E: int
+reveal_type(random_st.randint(0, 18446744073709551616, dtype="u8"))  # E: int
+reveal_type(random_st.randint(I_u8_high_open, dtype="u8"))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(random_st.randint(I_u8_low, I_u8_high_open, dtype="u8"))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(random_st.randint(0, I_u8_high_open, dtype="u8"))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+
+reveal_type(random_st.randint(18446744073709551616, dtype="uint64"))  # E: int
+reveal_type(random_st.randint(0, 18446744073709551616, dtype="uint64"))  # E: int
+reveal_type(random_st.randint(I_u8_high_open, dtype="uint64"))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(random_st.randint(I_u8_low, I_u8_high_open, dtype="uint64"))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(random_st.randint(0, I_u8_high_open, dtype="uint64"))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+
+reveal_type(random_st.randint(18446744073709551616, dtype=np.uint64))  # E: int
+reveal_type(random_st.randint(0, 18446744073709551616, dtype=np.uint64))  # E: int
+reveal_type(random_st.randint(I_u8_high_open, dtype=np.uint64))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(random_st.randint(I_u8_low, I_u8_high_open, dtype=np.uint64))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+reveal_type(random_st.randint(0, I_u8_high_open, dtype=np.uint64))  # E: ndarray[Any, dtype[unsignedinteger[typing._64Bit]]]
+
+reveal_type(random_st.randint(128, dtype="i1"))  # E: int
+reveal_type(random_st.randint(-128, 128, dtype="i1"))  # E: int
+reveal_type(random_st.randint(I_i1_high_open, dtype="i1"))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(random_st.randint(I_i1_low, I_i1_high_open, dtype="i1"))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(random_st.randint(-128, I_i1_high_open, dtype="i1"))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+
+reveal_type(random_st.randint(128, dtype="int8"))  # E: int
+reveal_type(random_st.randint(-128, 128, dtype="int8"))  # E: int
+reveal_type(random_st.randint(I_i1_high_open, dtype="int8"))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(random_st.randint(I_i1_low, I_i1_high_open, dtype="int8"))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(random_st.randint(-128, I_i1_high_open, dtype="int8"))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+
+reveal_type(random_st.randint(128, dtype=np.int8))  # E: int
+reveal_type(random_st.randint(-128, 128, dtype=np.int8))  # E: int
+reveal_type(random_st.randint(I_i1_high_open, dtype=np.int8))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(random_st.randint(I_i1_low, I_i1_high_open, dtype=np.int8))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+reveal_type(random_st.randint(-128, I_i1_high_open, dtype=np.int8))  # E: ndarray[Any, dtype[signedinteger[typing._8Bit]]]
+
+reveal_type(random_st.randint(32768, dtype="i2"))  # E: int
+reveal_type(random_st.randint(-32768, 32768, dtype="i2"))  # E: int
+reveal_type(random_st.randint(I_i2_high_open, dtype="i2"))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(I_i2_low, I_i2_high_open, dtype="i2"))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(-32768, I_i2_high_open, dtype="i2"))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(32768, dtype="int16"))  # E: int
+reveal_type(random_st.randint(-32768, 32768, dtype="int16"))  # E: int
+reveal_type(random_st.randint(I_i2_high_open, dtype="int16"))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(I_i2_low, I_i2_high_open, dtype="int16"))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(-32768, I_i2_high_open, dtype="int16"))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(32768, dtype=np.int16))  # E: int
+reveal_type(random_st.randint(-32768, 32768, dtype=np.int16))  # E: int
+reveal_type(random_st.randint(I_i2_high_open, dtype=np.int16))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(I_i2_low, I_i2_high_open, dtype=np.int16))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+reveal_type(random_st.randint(-32768, I_i2_high_open, dtype=np.int16))  # E: ndarray[Any, dtype[signedinteger[typing._16Bit]]]
+
+reveal_type(random_st.randint(2147483648, dtype="i4"))  # E: int
+reveal_type(random_st.randint(-2147483648, 2147483648, dtype="i4"))  # E: int
+reveal_type(random_st.randint(I_i4_high_open, dtype="i4"))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(random_st.randint(I_i4_low, I_i4_high_open, dtype="i4"))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(random_st.randint(-2147483648, I_i4_high_open, dtype="i4"))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+
+reveal_type(random_st.randint(2147483648, dtype="int32"))  # E: int
+reveal_type(random_st.randint(-2147483648, 2147483648, dtype="int32"))  # E: int
+reveal_type(random_st.randint(I_i4_high_open, dtype="int32"))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(random_st.randint(I_i4_low, I_i4_high_open, dtype="int32"))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(random_st.randint(-2147483648, I_i4_high_open, dtype="int32"))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+
+reveal_type(random_st.randint(2147483648, dtype=np.int32))  # E: int
+reveal_type(random_st.randint(-2147483648, 2147483648, dtype=np.int32))  # E: int
+reveal_type(random_st.randint(I_i4_high_open, dtype=np.int32))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(random_st.randint(I_i4_low, I_i4_high_open, dtype=np.int32))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+reveal_type(random_st.randint(-2147483648, I_i4_high_open, dtype=np.int32))  # E: ndarray[Any, dtype[signedinteger[typing._32Bit]]]
+
+reveal_type(random_st.randint(2147483648, dtype=np.int_))  # E: int
+reveal_type(random_st.randint(-2147483648, 2147483648, dtype=np.int_))  # E: int
+reveal_type(random_st.randint(I_i4_high_open, dtype=np.int_))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.randint(I_i4_low, I_i4_high_open, dtype=np.int_))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.randint(-2147483648, I_i4_high_open, dtype=np.int_))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(random_st.randint(9223372036854775808, dtype="i8"))  # E: int
+reveal_type(random_st.randint(-9223372036854775808, 9223372036854775808, dtype="i8"))  # E: int
+reveal_type(random_st.randint(I_i8_high_open, dtype="i8"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(random_st.randint(I_i8_low, I_i8_high_open, dtype="i8"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(random_st.randint(-9223372036854775808, I_i8_high_open, dtype="i8"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(random_st.randint(9223372036854775808, dtype="int64"))  # E: int
+reveal_type(random_st.randint(-9223372036854775808, 9223372036854775808, dtype="int64"))  # E: int
+reveal_type(random_st.randint(I_i8_high_open, dtype="int64"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(random_st.randint(I_i8_low, I_i8_high_open, dtype="int64"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(random_st.randint(-9223372036854775808, I_i8_high_open, dtype="int64"))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(random_st.randint(9223372036854775808, dtype=np.int64))  # E: int
+reveal_type(random_st.randint(-9223372036854775808, 9223372036854775808, dtype=np.int64))  # E: int
+reveal_type(random_st.randint(I_i8_high_open, dtype=np.int64))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(random_st.randint(I_i8_low, I_i8_high_open, dtype=np.int64))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+reveal_type(random_st.randint(-9223372036854775808, I_i8_high_open, dtype=np.int64))  # E: ndarray[Any, dtype[signedinteger[typing._64Bit]]]
+
+reveal_type(random_st._bit_generator)  # E: BitGenerator
+
+reveal_type(random_st.bytes(2))  # E: bytes
+
+reveal_type(random_st.choice(5))  # E: int
+reveal_type(random_st.choice(5, 3))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.choice(5, 3, replace=True))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.choice(5, 3, p=[1 / 5] * 5))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.choice(5, 3, p=[1 / 5] * 5, replace=False))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(random_st.choice(["pooh", "rabbit", "piglet", "Christopher"]))  # E: Any
+reveal_type(random_st.choice(["pooh", "rabbit", "piglet", "Christopher"], 3))  # E: ndarray[Any, Any]
+reveal_type(random_st.choice(["pooh", "rabbit", "piglet", "Christopher"], 3, p=[1 / 4] * 4))  # E: ndarray[Any, Any]
+reveal_type(random_st.choice(["pooh", "rabbit", "piglet", "Christopher"], 3, replace=True))  # E: ndarray[Any, Any]
+reveal_type(random_st.choice(["pooh", "rabbit", "piglet", "Christopher"], 3, replace=False, p=np.array([1 / 8, 1 / 8, 1 / 2, 1 / 4])))  # E: ndarray[Any, Any]
+
+reveal_type(random_st.dirichlet([0.5, 0.5]))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.dirichlet(np.array([0.5, 0.5])))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.dirichlet(np.array([0.5, 0.5]), size=3))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.multinomial(20, [1 / 6.0] * 6))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.multinomial(20, np.array([0.5, 0.5])))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.multinomial(20, [1 / 6.0] * 6, size=2))  # E: ndarray[Any, dtype[{int_}]]
+
+reveal_type(random_st.multivariate_normal([0.0], [[1.0]]))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.multivariate_normal([0.0], np.array([[1.0]])))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.multivariate_normal(np.array([0.0]), [[1.0]]))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.multivariate_normal([0.0], np.array([[1.0]])))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.permutation(10))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.permutation([1, 2, 3, 4]))  # E: ndarray[Any, Any]
+reveal_type(random_st.permutation(np.array([1, 2, 3, 4])))  # E: ndarray[Any, Any]
+reveal_type(random_st.permutation(D_2D))  # E: ndarray[Any, Any]
+
+reveal_type(random_st.shuffle(np.arange(10)))  # E: None
+reveal_type(random_st.shuffle([1, 2, 3, 4, 5]))  # E: None
+reveal_type(random_st.shuffle(D_2D))  # E: None
+
+reveal_type(np.random.RandomState(pcg64))  # E: RandomState
+reveal_type(np.random.RandomState(0))  # E: RandomState
+reveal_type(np.random.RandomState([0, 1, 2]))  # E: RandomState
+reveal_type(random_st.__str__())  # E: str
+reveal_type(random_st.__repr__())  # E: str
+random_st_state = random_st.__getstate__()
+reveal_type(random_st_state)  # E: builtins.dict[builtins.str, Any]
+reveal_type(random_st.__setstate__(random_st_state))  # E: None
+reveal_type(random_st.seed())  # E: None
+reveal_type(random_st.seed(1))  # E: None
+reveal_type(random_st.seed([0, 1]))  # E: None
+random_st_get_state = random_st.get_state()
+reveal_type(random_st_state)  # E: builtins.dict[builtins.str, Any]
+random_st_get_state_legacy = random_st.get_state(legacy=True)
+reveal_type(random_st_get_state_legacy)  # E: Union[builtins.dict[builtins.str, Any], Tuple[builtins.str, ndarray[Any, dtype[unsignedinteger[typing._32Bit]]], builtins.int, builtins.int, builtins.float]]
+reveal_type(random_st.set_state(random_st_get_state))  # E: None
+
+reveal_type(random_st.rand())  # E: float
+reveal_type(random_st.rand(1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.rand(1, 2))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.randn())  # E: float
+reveal_type(random_st.randn(1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.randn(1, 2))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.random_sample())  # E: float
+reveal_type(random_st.random_sample(1))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+reveal_type(random_st.random_sample(size=(1, 2)))  # E: ndarray[Any, dtype[floating[typing._64Bit]]
+
+reveal_type(random_st.tomaxint())  # E: int
+reveal_type(random_st.tomaxint(1))  # E: ndarray[Any, dtype[{int_}]]
+reveal_type(random_st.tomaxint((1,)))  # E: ndarray[Any, dtype[{int_}]]
diff --git a/numpy/typing/tests/data/reveal/rec.pyi b/numpy/typing/tests/data/reveal/rec.pyi
new file mode 100644 (file)
index 0000000..9921621
--- /dev/null
@@ -0,0 +1,127 @@
+import io
+from typing import Any, List
+
+import numpy as np
+import numpy.typing as npt
+
+AR_i8: npt.NDArray[np.int64]
+REC_AR_V: np.recarray[Any, np.dtype[np.record]]
+AR_LIST: List[npt.NDArray[np.int64]]
+
+format_parser: np.format_parser
+record: np.record
+file_obj: io.BufferedIOBase
+
+reveal_type(np.format_parser(  # E: format_parser
+    formats=[np.float64, np.int64, np.bool_],
+    names=["f8", "i8", "?"],
+    titles=None,
+    aligned=True,
+))
+reveal_type(format_parser.dtype)  # E: dtype[void]
+
+reveal_type(record.field_a)  # E: Any
+reveal_type(record.field_b)  # E: Any
+reveal_type(record["field_a"])  # E: Any
+reveal_type(record["field_b"])  # E: Any
+reveal_type(record.pprint())  # E: str
+record.field_c = 5
+
+reveal_type(REC_AR_V.field(0))  # E: Any
+reveal_type(REC_AR_V.field("field_a"))  # E: Any
+reveal_type(REC_AR_V.field(0, AR_i8))  # E: None
+reveal_type(REC_AR_V.field("field_a", AR_i8))  # E: None
+reveal_type(REC_AR_V["field_a"])  # E: Any
+reveal_type(REC_AR_V.field_a)  # E: Any
+
+reveal_type(np.recarray(  # recarray[Any, dtype[record]]
+    shape=(10, 5),
+    formats=[np.float64, np.int64, np.bool_],
+    order="K",
+    byteorder="|",
+))
+reveal_type(np.recarray(  # recarray[Any, dtype[Any]]
+    shape=(10, 5),
+    dtype=[("f8", np.float64), ("i8", np.int64)],
+    strides=(5, 5),
+))
+
+reveal_type(np.rec.fromarrays(  # recarray[Any, dtype[record]]
+    AR_LIST,
+))
+reveal_type(np.rec.fromarrays(  # recarray[Any, dtype[Any]]
+    AR_LIST,
+    dtype=np.int64,
+))
+reveal_type(np.rec.fromarrays(  # recarray[Any, dtype[Any]]
+    AR_LIST,
+    formats=[np.int64, np.float64],
+    names=["i8", "f8"]
+))
+
+reveal_type(np.rec.fromrecords(  # recarray[Any, dtype[record]]
+    (1, 1.5),
+))
+reveal_type(np.rec.fromrecords(  # recarray[Any, dtype[record]]
+    [(1, 1.5)],
+    dtype=[("i8", np.int64), ("f8", np.float64)],
+))
+reveal_type(np.rec.fromrecords(  # recarray[Any, dtype[record]]
+    REC_AR_V,
+    formats=[np.int64, np.float64],
+    names=["i8", "f8"]
+))
+
+reveal_type(np.rec.fromstring(  # recarray[Any, dtype[record]]
+    b"(1, 1.5)",
+    dtype=[("i8", np.int64), ("f8", np.float64)],
+))
+reveal_type(np.rec.fromstring(  # recarray[Any, dtype[record]]
+    REC_AR_V,
+    formats=[np.int64, np.float64],
+    names=["i8", "f8"]
+))
+
+reveal_type(np.rec.fromfile(  # recarray[Any, dtype[Any]]
+    "test_file.txt",
+    dtype=[("i8", np.int64), ("f8", np.float64)],
+))
+reveal_type(np.rec.fromfile(  # recarray[Any, dtype[record]]
+    file_obj,
+    formats=[np.int64, np.float64],
+    names=["i8", "f8"]
+))
+
+reveal_type(np.rec.array(  # recarray[Any, dtype[{int64}]]
+    AR_i8,
+))
+reveal_type(np.rec.array(  # recarray[Any, dtype[Any]]
+    [(1, 1.5)],
+    dtype=[("i8", np.int64), ("f8", np.float64)],
+))
+reveal_type(np.rec.array(  # recarray[Any, dtype[record]]
+    [(1, 1.5)],
+    formats=[np.int64, np.float64],
+    names=["i8", "f8"]
+))
+
+reveal_type(np.rec.array(  # recarray[Any, dtype[Any]]
+    None,
+    dtype=np.float64,
+    shape=(10, 3),
+))
+reveal_type(np.rec.array(  # recarray[Any, dtype[Any]]
+    None,
+    formats=[np.int64, np.float64],
+    names=["i8", "f8"],
+    shape=(10, 3),
+))
+reveal_type(np.rec.array(  # recarray[Any, dtype[Any]]
+    file_obj,
+    dtype=np.float64,
+))
+reveal_type(np.rec.array(  # recarray[Any, dtype[Any]]
+    file_obj,
+    formats=[np.int64, np.float64],
+    names=["i8", "f8"],
+))
diff --git a/numpy/typing/tests/data/reveal/scalars.py b/numpy/typing/tests/data/reveal/scalars.py
deleted file mode 100644 (file)
index ac6d256..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-import sys
-import numpy as np
-
-b: np.bool_
-u8: np.uint64
-i8: np.int64
-f8: np.float64
-c8: np.complex64
-c16: np.complex128
-m: np.timedelta64
-U: np.str_
-S: np.bytes_
-
-reveal_type(c8.real)  # E: {float32}
-reveal_type(c8.imag)  # E: {float32}
-
-reveal_type(c8.real.real)  # E: {float32}
-reveal_type(c8.real.imag)  # E: {float32}
-
-reveal_type(c8.itemsize)  # E: int
-reveal_type(c8.shape)  # E: Tuple[]
-reveal_type(c8.strides)  # E: Tuple[]
-
-reveal_type(c8.ndim)  # E: Literal[0]
-reveal_type(c8.size)  # E: Literal[1]
-
-reveal_type(c8.squeeze())  # E: {complex64}
-reveal_type(c8.byteswap())  # E: {complex64}
-reveal_type(c8.transpose())  # E: {complex64}
-
-reveal_type(c8.dtype)  # E: numpy.dtype[{complex64}]
-
-reveal_type(c8.real)  # E: {float32}
-reveal_type(c16.imag)  # E: {float64}
-
-reveal_type(np.unicode_('foo'))  # E: numpy.str_
-reveal_type(np.str0('foo'))  # E: numpy.str_
-
-# Aliases
-reveal_type(np.unicode_())  # E: numpy.str_
-reveal_type(np.str0())  # E: numpy.str_
-reveal_type(np.bool8())  # E: numpy.bool_
-reveal_type(np.bytes0())  # E: numpy.bytes_
-reveal_type(np.string_())  # E: numpy.bytes_
-reveal_type(np.object0())  # E: numpy.object_
-reveal_type(np.void0(0))  # E: numpy.void
-
-reveal_type(np.byte())  # E: {byte}
-reveal_type(np.short())  # E: {short}
-reveal_type(np.intc())  # E: {intc}
-reveal_type(np.intp())  # E: {intp}
-reveal_type(np.int0())  # E: {intp}
-reveal_type(np.int_())  # E: {int_}
-reveal_type(np.longlong())  # E: {longlong}
-
-reveal_type(np.ubyte())  # E: {ubyte}
-reveal_type(np.ushort())  # E: {ushort}
-reveal_type(np.uintc())  # E: {uintc}
-reveal_type(np.uintp())  # E: {uintp}
-reveal_type(np.uint0())  # E: {uintp}
-reveal_type(np.uint())  # E: {uint}
-reveal_type(np.ulonglong())  # E: {ulonglong}
-
-reveal_type(np.half())  # E: {half}
-reveal_type(np.single())  # E: {single}
-reveal_type(np.double())  # E: {double}
-reveal_type(np.float_())  # E: {double}
-reveal_type(np.longdouble())  # E: {longdouble}
-reveal_type(np.longfloat())  # E: {longdouble}
-
-reveal_type(np.csingle())  # E: {csingle}
-reveal_type(np.singlecomplex())  # E: {csingle}
-reveal_type(np.cdouble())  # E: {cdouble}
-reveal_type(np.complex_())  # E: {cdouble}
-reveal_type(np.cfloat())  # E: {cdouble}
-reveal_type(np.clongdouble())  # E: {clongdouble}
-reveal_type(np.clongfloat())  # E: {clongdouble}
-reveal_type(np.longcomplex())  # E: {clongdouble}
-
-reveal_type(b.item())  # E: bool
-reveal_type(i8.item())  # E: int
-reveal_type(u8.item())  # E: int
-reveal_type(f8.item())  # E: float
-reveal_type(c16.item())  # E: complex
-reveal_type(U.item())  # E: str
-reveal_type(S.item())  # E: bytes
-
-reveal_type(b.tolist())  # E: bool
-reveal_type(i8.tolist())  # E: int
-reveal_type(u8.tolist())  # E: int
-reveal_type(f8.tolist())  # E: float
-reveal_type(c16.tolist())  # E: complex
-reveal_type(U.tolist())  # E: str
-reveal_type(S.tolist())  # E: bytes
-
-reveal_type(b.ravel())  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(i8.ravel())  # E: numpy.ndarray[Any, numpy.dtype[{int64}]]
-reveal_type(u8.ravel())  # E: numpy.ndarray[Any, numpy.dtype[{uint64}]]
-reveal_type(f8.ravel())  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(c16.ravel())  # E: numpy.ndarray[Any, numpy.dtype[{complex128}]]
-reveal_type(U.ravel())  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-reveal_type(S.ravel())  # E: numpy.ndarray[Any, numpy.dtype[numpy.bytes_]]
-
-reveal_type(b.flatten())  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(i8.flatten())  # E: numpy.ndarray[Any, numpy.dtype[{int64}]]
-reveal_type(u8.flatten())  # E: numpy.ndarray[Any, numpy.dtype[{uint64}]]
-reveal_type(f8.flatten())  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(c16.flatten())  # E: numpy.ndarray[Any, numpy.dtype[{complex128}]]
-reveal_type(U.flatten())  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-reveal_type(S.flatten())  # E: numpy.ndarray[Any, numpy.dtype[numpy.bytes_]]
-
-reveal_type(b.reshape(1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(i8.reshape(1))  # E: numpy.ndarray[Any, numpy.dtype[{int64}]]
-reveal_type(u8.reshape(1))  # E: numpy.ndarray[Any, numpy.dtype[{uint64}]]
-reveal_type(f8.reshape(1))  # E: numpy.ndarray[Any, numpy.dtype[{float64}]]
-reveal_type(c16.reshape(1))  # E: numpy.ndarray[Any, numpy.dtype[{complex128}]]
-reveal_type(U.reshape(1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-reveal_type(S.reshape(1))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bytes_]]
-
-reveal_type(f8.as_integer_ratio())  # E: Tuple[builtins.int, builtins.int]
-reveal_type(f8.is_integer())  # E: bool
-reveal_type(f8.__trunc__())  # E: int
-reveal_type(f8.__getformat__("float"))  # E: str
-reveal_type(f8.hex())  # E: str
-reveal_type(np.float64.fromhex("0x0.0p+0"))  # E: {float64}
-
-reveal_type(f8.__getnewargs__())  # E: Tuple[builtins.float]
-reveal_type(c16.__getnewargs__())  # E: Tuple[builtins.float, builtins.float]
-
-reveal_type(i8.numerator)  # E: {int64}
-reveal_type(i8.denominator)  # E: Literal[1]
-reveal_type(u8.numerator)  # E: {uint64}
-reveal_type(u8.denominator)  # E: Literal[1]
-reveal_type(m.numerator)  # E: numpy.timedelta64
-reveal_type(m.denominator)  # E: Literal[1]
-
-reveal_type(round(i8))  # E: int
-reveal_type(round(i8, 3))  # E: {int64}
-reveal_type(round(u8))  # E: int
-reveal_type(round(u8, 3))  # E: {uint64}
-reveal_type(round(f8))  # E: int
-reveal_type(round(f8, 3))  # E: {float64}
-
-if sys.version_info >= (3, 9):
-    reveal_type(f8.__ceil__())  # E: int
-    reveal_type(f8.__floor__())  # E: int
-
-reveal_type(i8.astype(float))  # E: Any
-reveal_type(i8.astype(np.float64))  # E: {float64}
-
-reveal_type(i8.view())  # E: {int64}
-reveal_type(i8.view(np.float64))  # E: {float64}
-reveal_type(i8.view(float))  # E: Any
-reveal_type(i8.view(np.float64, np.ndarray))  # E: {float64}
-
-reveal_type(i8.getfield(float))  # E: Any
-reveal_type(i8.getfield(np.float64))  # E: {float64}
-reveal_type(i8.getfield(np.float64, 8))  # E: {float64}
diff --git a/numpy/typing/tests/data/reveal/scalars.pyi b/numpy/typing/tests/data/reveal/scalars.pyi
new file mode 100644 (file)
index 0000000..383e40e
--- /dev/null
@@ -0,0 +1,166 @@
+import sys
+import numpy as np
+
+b: np.bool_
+u8: np.uint64
+i8: np.int64
+f8: np.float64
+c8: np.complex64
+c16: np.complex128
+m: np.timedelta64
+U: np.str_
+S: np.bytes_
+V: np.void
+
+reveal_type(c8.real)  # E: {float32}
+reveal_type(c8.imag)  # E: {float32}
+
+reveal_type(c8.real.real)  # E: {float32}
+reveal_type(c8.real.imag)  # E: {float32}
+
+reveal_type(c8.itemsize)  # E: int
+reveal_type(c8.shape)  # E: Tuple[]
+reveal_type(c8.strides)  # E: Tuple[]
+
+reveal_type(c8.ndim)  # E: Literal[0]
+reveal_type(c8.size)  # E: Literal[1]
+
+reveal_type(c8.squeeze())  # E: {complex64}
+reveal_type(c8.byteswap())  # E: {complex64}
+reveal_type(c8.transpose())  # E: {complex64}
+
+reveal_type(c8.dtype)  # E: dtype[{complex64}]
+
+reveal_type(c8.real)  # E: {float32}
+reveal_type(c16.imag)  # E: {float64}
+
+reveal_type(np.unicode_('foo'))  # E: str_
+reveal_type(np.str0('foo'))  # E: str_
+
+reveal_type(V[0])  # E: Any
+reveal_type(V["field1"])  # E: Any
+reveal_type(V[["field1", "field2"]])  # E: void
+V[0] = 5
+
+# Aliases
+reveal_type(np.unicode_())  # E: str_
+reveal_type(np.str0())  # E: str_
+reveal_type(np.bool8())  # E: bool_
+reveal_type(np.bytes0())  # E: bytes_
+reveal_type(np.string_())  # E: bytes_
+reveal_type(np.object0())  # E: object_
+reveal_type(np.void0(0))  # E: void
+
+reveal_type(np.byte())  # E: {byte}
+reveal_type(np.short())  # E: {short}
+reveal_type(np.intc())  # E: {intc}
+reveal_type(np.intp())  # E: {intp}
+reveal_type(np.int0())  # E: {intp}
+reveal_type(np.int_())  # E: {int_}
+reveal_type(np.longlong())  # E: {longlong}
+
+reveal_type(np.ubyte())  # E: {ubyte}
+reveal_type(np.ushort())  # E: {ushort}
+reveal_type(np.uintc())  # E: {uintc}
+reveal_type(np.uintp())  # E: {uintp}
+reveal_type(np.uint0())  # E: {uintp}
+reveal_type(np.uint())  # E: {uint}
+reveal_type(np.ulonglong())  # E: {ulonglong}
+
+reveal_type(np.half())  # E: {half}
+reveal_type(np.single())  # E: {single}
+reveal_type(np.double())  # E: {double}
+reveal_type(np.float_())  # E: {double}
+reveal_type(np.longdouble())  # E: {longdouble}
+reveal_type(np.longfloat())  # E: {longdouble}
+
+reveal_type(np.csingle())  # E: {csingle}
+reveal_type(np.singlecomplex())  # E: {csingle}
+reveal_type(np.cdouble())  # E: {cdouble}
+reveal_type(np.complex_())  # E: {cdouble}
+reveal_type(np.cfloat())  # E: {cdouble}
+reveal_type(np.clongdouble())  # E: {clongdouble}
+reveal_type(np.clongfloat())  # E: {clongdouble}
+reveal_type(np.longcomplex())  # E: {clongdouble}
+
+reveal_type(b.item())  # E: bool
+reveal_type(i8.item())  # E: int
+reveal_type(u8.item())  # E: int
+reveal_type(f8.item())  # E: float
+reveal_type(c16.item())  # E: complex
+reveal_type(U.item())  # E: str
+reveal_type(S.item())  # E: bytes
+
+reveal_type(b.tolist())  # E: bool
+reveal_type(i8.tolist())  # E: int
+reveal_type(u8.tolist())  # E: int
+reveal_type(f8.tolist())  # E: float
+reveal_type(c16.tolist())  # E: complex
+reveal_type(U.tolist())  # E: str
+reveal_type(S.tolist())  # E: bytes
+
+reveal_type(b.ravel())  # E: ndarray[Any, dtype[bool_]]
+reveal_type(i8.ravel())  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(u8.ravel())  # E: ndarray[Any, dtype[{uint64}]]
+reveal_type(f8.ravel())  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(c16.ravel())  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(U.ravel())  # E: ndarray[Any, dtype[str_]]
+reveal_type(S.ravel())  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(b.flatten())  # E: ndarray[Any, dtype[bool_]]
+reveal_type(i8.flatten())  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(u8.flatten())  # E: ndarray[Any, dtype[{uint64}]]
+reveal_type(f8.flatten())  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(c16.flatten())  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(U.flatten())  # E: ndarray[Any, dtype[str_]]
+reveal_type(S.flatten())  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(b.reshape(1))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(i8.reshape(1))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(u8.reshape(1))  # E: ndarray[Any, dtype[{uint64}]]
+reveal_type(f8.reshape(1))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(c16.reshape(1))  # E: ndarray[Any, dtype[{complex128}]]
+reveal_type(U.reshape(1))  # E: ndarray[Any, dtype[str_]]
+reveal_type(S.reshape(1))  # E: ndarray[Any, dtype[bytes_]]
+
+reveal_type(i8.astype(float))  # E: Any
+reveal_type(i8.astype(np.float64))  # E: {float64}
+
+reveal_type(i8.view())  # E: {int64}
+reveal_type(i8.view(np.float64))  # E: {float64}
+reveal_type(i8.view(float))  # E: Any
+reveal_type(i8.view(np.float64, np.ndarray))  # E: {float64}
+
+reveal_type(i8.getfield(float))  # E: Any
+reveal_type(i8.getfield(np.float64))  # E: {float64}
+reveal_type(i8.getfield(np.float64, 8))  # E: {float64}
+
+reveal_type(f8.as_integer_ratio())  # E: Tuple[builtins.int, builtins.int]
+reveal_type(f8.is_integer())  # E: bool
+reveal_type(f8.__trunc__())  # E: int
+reveal_type(f8.__getformat__("float"))  # E: str
+reveal_type(f8.hex())  # E: str
+reveal_type(np.float64.fromhex("0x0.0p+0"))  # E: {float64}
+
+reveal_type(f8.__getnewargs__())  # E: Tuple[builtins.float]
+reveal_type(c16.__getnewargs__())  # E: Tuple[builtins.float, builtins.float]
+
+reveal_type(i8.numerator)  # E: {int64}
+reveal_type(i8.denominator)  # E: Literal[1]
+reveal_type(u8.numerator)  # E: {uint64}
+reveal_type(u8.denominator)  # E: Literal[1]
+reveal_type(m.numerator)  # E: timedelta64
+reveal_type(m.denominator)  # E: Literal[1]
+
+reveal_type(round(i8))  # E: int
+reveal_type(round(i8, 3))  # E: {int64}
+reveal_type(round(u8))  # E: int
+reveal_type(round(u8, 3))  # E: {uint64}
+reveal_type(round(f8))  # E: int
+reveal_type(round(f8, 3))  # E: {float64}
+
+if sys.version_info >= (3, 9):
+    reveal_type(f8.__ceil__())  # E: int
+    reveal_type(f8.__floor__())  # E: int
+
+reveal_type(i8.is_integer())  # E: Literal[True]
diff --git a/numpy/typing/tests/data/reveal/shape_base.pyi b/numpy/typing/tests/data/reveal/shape_base.pyi
new file mode 100644 (file)
index 0000000..f13678c
--- /dev/null
@@ -0,0 +1,57 @@
+import numpy as np
+from numpy.typing import NDArray
+from typing import Any, List
+
+i8: np.int64
+f8: np.float64
+
+AR_b: NDArray[np.bool_]
+AR_i8: NDArray[np.int64]
+AR_f8: NDArray[np.float64]
+
+AR_LIKE_f8: List[float]
+
+reveal_type(np.take_along_axis(AR_f8, AR_i8, axis=1))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.take_along_axis(f8, AR_i8, axis=None))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.put_along_axis(AR_f8, AR_i8, "1.0", axis=1))  # E: None
+
+reveal_type(np.expand_dims(AR_i8, 2))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.expand_dims(AR_LIKE_f8, 2))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.column_stack([AR_i8]))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.column_stack([AR_LIKE_f8]))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.dstack([AR_i8]))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.dstack([AR_LIKE_f8]))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.row_stack([AR_i8]))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.row_stack([AR_LIKE_f8]))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.array_split(AR_i8, [3, 5, 6, 10]))  # E: list[ndarray[Any, dtype[{int64}]]]
+reveal_type(np.array_split(AR_LIKE_f8, [3, 5, 6, 10]))  # E: list[ndarray[Any, dtype[Any]]]
+
+reveal_type(np.split(AR_i8, [3, 5, 6, 10]))  # E: list[ndarray[Any, dtype[{int64}]]]
+reveal_type(np.split(AR_LIKE_f8, [3, 5, 6, 10]))  # E: list[ndarray[Any, dtype[Any]]]
+
+reveal_type(np.hsplit(AR_i8, [3, 5, 6, 10]))  # E: list[ndarray[Any, dtype[{int64}]]]
+reveal_type(np.hsplit(AR_LIKE_f8, [3, 5, 6, 10]))  # E: list[ndarray[Any, dtype[Any]]]
+
+reveal_type(np.vsplit(AR_i8, [3, 5, 6, 10]))  # E: list[ndarray[Any, dtype[{int64}]]]
+reveal_type(np.vsplit(AR_LIKE_f8, [3, 5, 6, 10]))  # E: list[ndarray[Any, dtype[Any]]]
+
+reveal_type(np.dsplit(AR_i8, [3, 5, 6, 10]))  # E: list[ndarray[Any, dtype[{int64}]]]
+reveal_type(np.dsplit(AR_LIKE_f8, [3, 5, 6, 10]))  # E: list[ndarray[Any, dtype[Any]]]
+
+reveal_type(np.lib.shape_base.get_array_prepare(AR_i8))  # E: lib.shape_base._ArrayPrepare
+reveal_type(np.lib.shape_base.get_array_prepare(AR_i8, 1))  # E: Union[None, lib.shape_base._ArrayPrepare]
+
+reveal_type(np.get_array_wrap(AR_i8))  # E: lib.shape_base._ArrayWrap
+reveal_type(np.get_array_wrap(AR_i8, 1))  # E: Union[None, lib.shape_base._ArrayWrap]
+
+reveal_type(np.kron(AR_b, AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.kron(AR_b, AR_i8))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.kron(AR_f8, AR_f8))  # E: ndarray[Any, dtype[floating[Any]]]
+
+reveal_type(np.tile(AR_i8, 5))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.tile(AR_LIKE_f8, [2, 2]))  # E: ndarray[Any, dtype[Any]]
diff --git a/numpy/typing/tests/data/reveal/stride_tricks.pyi b/numpy/typing/tests/data/reveal/stride_tricks.pyi
new file mode 100644 (file)
index 0000000..0d6dcd3
--- /dev/null
@@ -0,0 +1,28 @@
+from typing import List, Dict, Any
+import numpy as np
+import numpy.typing as npt
+
+AR_f8: npt.NDArray[np.float64]
+AR_LIKE_f: List[float]
+interface_dict: Dict[str, Any]
+
+reveal_type(np.lib.stride_tricks.DummyArray(interface_dict))  # E: lib.stride_tricks.DummyArray
+
+reveal_type(np.lib.stride_tricks.as_strided(AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.lib.stride_tricks.as_strided(AR_LIKE_f))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.lib.stride_tricks.as_strided(AR_f8, strides=(1, 5)))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.lib.stride_tricks.as_strided(AR_f8, shape=[9, 20]))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.lib.stride_tricks.sliding_window_view(AR_f8, 5))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.lib.stride_tricks.sliding_window_view(AR_LIKE_f, (1, 5)))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.lib.stride_tricks.sliding_window_view(AR_f8, [9], axis=1))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.broadcast_to(AR_f8, 5))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.broadcast_to(AR_LIKE_f, (1, 5)))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.broadcast_to(AR_f8, [4, 6], subok=True))  # E: ndarray[Any, dtype[{float64}]]
+
+reveal_type(np.broadcast_shapes((1, 2), [3, 1], (3, 2)))  # E: tuple[builtins.int]
+reveal_type(np.broadcast_shapes((6, 7), (5, 6, 1), 7, (5, 1, 7)))  # E: tuple[builtins.int]
+
+reveal_type(np.broadcast_arrays(AR_f8, AR_f8))  # E: list[ndarray[Any, dtype[Any]]]
+reveal_type(np.broadcast_arrays(AR_f8, AR_LIKE_f))  # E: list[ndarray[Any, dtype[Any]]]
diff --git a/numpy/typing/tests/data/reveal/testing.pyi b/numpy/typing/tests/data/reveal/testing.pyi
new file mode 100644 (file)
index 0000000..9813dc7
--- /dev/null
@@ -0,0 +1,173 @@
+from __future__ import annotations
+
+import re
+import sys
+from typing import Any, Callable, TypeVar
+from pathlib import Path
+
+import numpy as np
+import numpy.typing as npt
+
+AR_f8: npt.NDArray[np.float64]
+AR_i8: npt.NDArray[np.int64]
+
+bool_obj: bool
+suppress_obj: np.testing.suppress_warnings
+FT = TypeVar("FT", bound=Callable[..., Any])
+
+def func() -> int: ...
+
+def func2(
+    x: npt.NDArray[np.number[Any]],
+    y: npt.NDArray[np.number[Any]],
+) -> npt.NDArray[np.bool_]: ...
+
+reveal_type(np.testing.KnownFailureException())  # E: KnownFailureException
+reveal_type(np.testing.IgnoreException())  # E: IgnoreException
+
+reveal_type(np.testing.clear_and_catch_warnings(modules=[np.testing]))  # E: _clear_and_catch_warnings_without_records
+reveal_type(np.testing.clear_and_catch_warnings(True))  # E: _clear_and_catch_warnings_with_records
+reveal_type(np.testing.clear_and_catch_warnings(False))  # E: _clear_and_catch_warnings_without_records
+reveal_type(np.testing.clear_and_catch_warnings(bool_obj))  # E: clear_and_catch_warnings
+reveal_type(np.testing.clear_and_catch_warnings.class_modules)  # E: tuple[types.ModuleType]
+reveal_type(np.testing.clear_and_catch_warnings.modules)  # E: set[types.ModuleType]
+
+with np.testing.clear_and_catch_warnings(True) as c1:
+    reveal_type(c1)  # E: builtins.list[warnings.WarningMessage]
+with np.testing.clear_and_catch_warnings() as c2:
+    reveal_type(c2)  # E: None
+
+reveal_type(np.testing.suppress_warnings("once"))  # E: suppress_warnings
+reveal_type(np.testing.suppress_warnings()(func))  # E: def () -> builtins.int
+reveal_type(suppress_obj.filter(RuntimeWarning))  # E: None
+reveal_type(suppress_obj.record(RuntimeWarning))  # E: list[warnings.WarningMessage]
+with suppress_obj as c3:
+    reveal_type(c3)  # E: suppress_warnings
+
+reveal_type(np.testing.verbose)  # E: int
+reveal_type(np.testing.IS_PYPY)  # E: bool
+reveal_type(np.testing.HAS_REFCOUNT)  # E: bool
+reveal_type(np.testing.HAS_LAPACK64)  # E: bool
+
+reveal_type(np.testing.assert_(1, msg="test"))  # E: None
+reveal_type(np.testing.assert_(2, msg=lambda: "test"))  # E: None
+
+if sys.platform == "win32" or sys.platform == "cygwin":
+    reveal_type(np.testing.memusage())  # E: builtins.int
+elif sys.platform == "linux":
+    reveal_type(np.testing.memusage())  # E: Union[None, builtins.int]
+else:
+    reveal_type(np.testing.memusage())  # E: <nothing>
+
+reveal_type(np.testing.jiffies())  # E: builtins.int
+
+reveal_type(np.testing.build_err_msg([0, 1, 2], "test"))  # E: str
+reveal_type(np.testing.build_err_msg(range(2), "test", header="header"))  # E: str
+reveal_type(np.testing.build_err_msg(np.arange(9).reshape(3, 3), "test", verbose=False))  # E: str
+reveal_type(np.testing.build_err_msg("abc", "test", names=["x", "y"]))  # E: str
+reveal_type(np.testing.build_err_msg([1.0, 2.0], "test", precision=5))  # E: str
+
+reveal_type(np.testing.assert_equal({1}, {1}))  # E: None
+reveal_type(np.testing.assert_equal([1, 2, 3], [1, 2, 3], err_msg="fail"))  # E: None
+reveal_type(np.testing.assert_equal(1, 1.0, verbose=True))  # E: None
+
+reveal_type(np.testing.print_assert_equal('Test XYZ of func xyz', [0, 1], [0, 1]))  # E: None
+
+reveal_type(np.testing.assert_almost_equal(1.0, 1.1))  # E: None
+reveal_type(np.testing.assert_almost_equal([1, 2, 3], [1, 2, 3], err_msg="fail"))  # E: None
+reveal_type(np.testing.assert_almost_equal(1, 1.0, verbose=True))  # E: None
+reveal_type(np.testing.assert_almost_equal(1, 1.0001, decimal=2))  # E: None
+
+reveal_type(np.testing.assert_approx_equal(1.0, 1.1))  # E: None
+reveal_type(np.testing.assert_approx_equal("1", "2", err_msg="fail"))  # E: None
+reveal_type(np.testing.assert_approx_equal(1, 1.0, verbose=True))  # E: None
+reveal_type(np.testing.assert_approx_equal(1, 1.0001, significant=2))  # E: None
+
+reveal_type(np.testing.assert_array_compare(func2, AR_i8, AR_f8, err_msg="test"))  # E: None
+reveal_type(np.testing.assert_array_compare(func2, AR_i8, AR_f8, verbose=True))  # E: None
+reveal_type(np.testing.assert_array_compare(func2, AR_i8, AR_f8, header="header"))  # E: None
+reveal_type(np.testing.assert_array_compare(func2, AR_i8, AR_f8, precision=np.int64()))  # E: None
+reveal_type(np.testing.assert_array_compare(func2, AR_i8, AR_f8, equal_nan=False))  # E: None
+reveal_type(np.testing.assert_array_compare(func2, AR_i8, AR_f8, equal_inf=True))  # E: None
+
+reveal_type(np.testing.assert_array_equal(AR_i8, AR_f8))  # E: None
+reveal_type(np.testing.assert_array_equal(AR_i8, AR_f8, err_msg="test"))  # E: None
+reveal_type(np.testing.assert_array_equal(AR_i8, AR_f8, verbose=True))  # E: None
+
+reveal_type(np.testing.assert_array_almost_equal(AR_i8, AR_f8))  # E: None
+reveal_type(np.testing.assert_array_almost_equal(AR_i8, AR_f8, err_msg="test"))  # E: None
+reveal_type(np.testing.assert_array_almost_equal(AR_i8, AR_f8, verbose=True))  # E: None
+reveal_type(np.testing.assert_array_almost_equal(AR_i8, AR_f8, decimal=1))  # E: None
+
+reveal_type(np.testing.assert_array_less(AR_i8, AR_f8))  # E: None
+reveal_type(np.testing.assert_array_less(AR_i8, AR_f8, err_msg="test"))  # E: None
+reveal_type(np.testing.assert_array_less(AR_i8, AR_f8, verbose=True))  # E: None
+
+reveal_type(np.testing.runstring("1 + 1", {}))  # E: Any
+reveal_type(np.testing.runstring("int64() + 1", {"int64": np.int64}))  # E: Any
+
+reveal_type(np.testing.assert_string_equal("1", "1"))  # E: None
+
+reveal_type(np.testing.rundocs())  # E: None
+reveal_type(np.testing.rundocs("test.py"))  # E: None
+reveal_type(np.testing.rundocs(Path("test.py"), raise_on_error=True))  # E: None
+
+@np.testing.raises(RuntimeError, RuntimeWarning)
+def func3(a: int) -> bool: ...
+
+reveal_type(func3)  # E: def (a: builtins.int) -> builtins.bool
+
+reveal_type(np.testing.assert_raises(RuntimeWarning))  # E: _AssertRaisesContext[builtins.RuntimeWarning]
+reveal_type(np.testing.assert_raises(RuntimeWarning, func3, 5))  # E: None
+
+reveal_type(np.testing.assert_raises_regex(RuntimeWarning, r"test"))  # E: _AssertRaisesContext[builtins.RuntimeWarning]
+reveal_type(np.testing.assert_raises_regex(RuntimeWarning, b"test", func3, 5))  # E: None
+reveal_type(np.testing.assert_raises_regex(RuntimeWarning, re.compile(b"test"), func3, 5))  # E: None
+
+class Test: ...
+
+def decorate(a: FT) -> FT:
+    return a
+
+reveal_type(np.testing.decorate_methods(Test, decorate))  # E: None
+reveal_type(np.testing.decorate_methods(Test, decorate, None))  # E: None
+reveal_type(np.testing.decorate_methods(Test, decorate, "test"))  # E: None
+reveal_type(np.testing.decorate_methods(Test, decorate, b"test"))  # E: None
+reveal_type(np.testing.decorate_methods(Test, decorate, re.compile("test")))  # E: None
+
+reveal_type(np.testing.measure("for i in range(1000): np.sqrt(i**2)"))  # E: float
+reveal_type(np.testing.measure(b"for i in range(1000): np.sqrt(i**2)", times=5))  # E: float
+
+reveal_type(np.testing.assert_allclose(AR_i8, AR_f8))  # E: None
+reveal_type(np.testing.assert_allclose(AR_i8, AR_f8, rtol=0.005))  # E: None
+reveal_type(np.testing.assert_allclose(AR_i8, AR_f8, atol=1))  # E: None
+reveal_type(np.testing.assert_allclose(AR_i8, AR_f8, equal_nan=True))  # E: None
+reveal_type(np.testing.assert_allclose(AR_i8, AR_f8, err_msg="err"))  # E: None
+reveal_type(np.testing.assert_allclose(AR_i8, AR_f8, verbose=False))  # E: None
+
+reveal_type(np.testing.assert_array_almost_equal_nulp(AR_i8, AR_f8, nulp=2))  # E: None
+
+reveal_type(np.testing.assert_array_max_ulp(AR_i8, AR_f8, maxulp=2))  # E: ndarray[Any, dtype[Any]]
+reveal_type(np.testing.assert_array_max_ulp(AR_i8, AR_f8, dtype=np.float32))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.testing.assert_warns(RuntimeWarning))  # E: _GeneratorContextManager[None]
+reveal_type(np.testing.assert_warns(RuntimeWarning, func3, 5))  # E: bool
+
+reveal_type(np.testing.assert_no_warnings())  # E: _GeneratorContextManager[None]
+reveal_type(np.testing.assert_no_warnings(func3, 5))  # E: bool
+
+reveal_type(np.testing.tempdir("test_dir"))  # E: _GeneratorContextManager[builtins.str]
+reveal_type(np.testing.tempdir(prefix=b"test"))  # E: _GeneratorContextManager[builtins.bytes]
+reveal_type(np.testing.tempdir("test_dir", dir=Path("here")))  # E: _GeneratorContextManager[builtins.str]
+
+reveal_type(np.testing.temppath("test_dir", text=True))  # E: _GeneratorContextManager[builtins.str]
+reveal_type(np.testing.temppath(prefix=b"test"))  # E: _GeneratorContextManager[builtins.bytes]
+reveal_type(np.testing.temppath("test_dir", dir=Path("here")))  # E: _GeneratorContextManager[builtins.str]
+
+reveal_type(np.testing.assert_no_gc_cycles())  # E: _GeneratorContextManager[None]
+reveal_type(np.testing.assert_no_gc_cycles(func3, 5))  # E: None
+
+reveal_type(np.testing.break_cycles())  # E: None
+
+reveal_type(np.testing.TestCase())  # E: unittest.case.TestCase
+reveal_type(np.testing.run_module_suite(file_to_run="numpy/tests/test_matlib.py"))  # E: None
diff --git a/numpy/typing/tests/data/reveal/twodim_base.pyi b/numpy/typing/tests/data/reveal/twodim_base.pyi
new file mode 100644 (file)
index 0000000..0318c3c
--- /dev/null
@@ -0,0 +1,72 @@
+from typing import Any, List, TypeVar
+
+import numpy as np
+import numpy.typing as npt
+
+_SCT = TypeVar("_SCT", bound=np.generic)
+
+
+def func1(ar: npt.NDArray[_SCT], a: int) -> npt.NDArray[_SCT]:
+    pass
+
+
+def func2(ar: npt.NDArray[np.number[Any]], a: str) -> npt.NDArray[np.float64]:
+    pass
+
+
+AR_b: npt.NDArray[np.bool_]
+AR_u: npt.NDArray[np.uint64]
+AR_i: npt.NDArray[np.int64]
+AR_f: npt.NDArray[np.float64]
+AR_c: npt.NDArray[np.complex128]
+AR_O: npt.NDArray[np.object_]
+
+AR_LIKE_b: List[bool]
+
+reveal_type(np.fliplr(AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.fliplr(AR_LIKE_b))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.flipud(AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.flipud(AR_LIKE_b))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.eye(10))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.eye(10, M=20, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.eye(10, k=2, dtype=int))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.diag(AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.diag(AR_LIKE_b, k=0))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.diagflat(AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.diagflat(AR_LIKE_b, k=0))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.tri(10))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.tri(10, M=20, dtype=np.int64))  # E: ndarray[Any, dtype[{int64}]]
+reveal_type(np.tri(10, k=2, dtype=int))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.tril(AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.tril(AR_LIKE_b, k=0))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.triu(AR_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.triu(AR_LIKE_b, k=0))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.vander(AR_b))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.vander(AR_u))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.vander(AR_i, N=2))  # E: ndarray[Any, dtype[signedinteger[Any]]]
+reveal_type(np.vander(AR_f, increasing=True))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.vander(AR_c))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.vander(AR_O))  # E: ndarray[Any, dtype[object_]]
+
+reveal_type(np.histogram2d(AR_i, AR_b))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]]]
+reveal_type(np.histogram2d(AR_f, AR_f))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[floating[Any]]], ndarray[Any, dtype[floating[Any]]]]
+reveal_type(np.histogram2d(AR_f, AR_c, weights=AR_LIKE_b))  # E: Tuple[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[complexfloating[Any, Any]]], ndarray[Any, dtype[complexfloating[Any, Any]]]]
+
+reveal_type(np.mask_indices(10, func1))  # E: Tuple[ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]]]
+reveal_type(np.mask_indices(8, func2, "0"))  # E: Tuple[ndarray[Any, dtype[{intp}]], ndarray[Any, dtype[{intp}]]]
+
+reveal_type(np.tril_indices(10))  # E: Tuple[ndarray[Any, dtype[{int_}]], ndarray[Any, dtype[{int_}]]]
+
+reveal_type(np.tril_indices_from(AR_b))  # E: Tuple[ndarray[Any, dtype[{int_}]], ndarray[Any, dtype[{int_}]]]
+
+reveal_type(np.triu_indices(10))  # E: Tuple[ndarray[Any, dtype[{int_}]], ndarray[Any, dtype[{int_}]]]
+
+reveal_type(np.triu_indices_from(AR_b))  # E: Tuple[ndarray[Any, dtype[{int_}]], ndarray[Any, dtype[{int_}]]]
diff --git a/numpy/typing/tests/data/reveal/type_check.pyi b/numpy/typing/tests/data/reveal/type_check.pyi
new file mode 100644 (file)
index 0000000..13d41d8
--- /dev/null
@@ -0,0 +1,73 @@
+from typing import List
+import numpy as np
+import numpy.typing as npt
+
+f8: np.float64
+f: float
+
+# NOTE: Avoid importing the platform specific `np.float128` type
+AR_i8: npt.NDArray[np.int64]
+AR_i4: npt.NDArray[np.int32]
+AR_f2: npt.NDArray[np.float16]
+AR_f8: npt.NDArray[np.float64]
+AR_f16: npt.NDArray[np.floating[npt._128Bit]]
+AR_c8: npt.NDArray[np.complex64]
+AR_c16: npt.NDArray[np.complex128]
+
+AR_LIKE_f: List[float]
+
+class RealObj:
+    real: slice
+
+class ImagObj:
+    imag: slice
+
+reveal_type(np.mintypecode(["f8"], typeset="qfQF"))
+
+reveal_type(np.asfarray(AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.asfarray(AR_LIKE_f))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.asfarray(AR_f8, dtype="c16"))  # E: ndarray[Any, dtype[complexfloating[Any, Any]]]
+reveal_type(np.asfarray(AR_f8, dtype="i8"))  # E: ndarray[Any, dtype[floating[Any]]]
+
+reveal_type(np.real(RealObj()))  # E: slice
+reveal_type(np.real(AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.real(AR_c16))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.real(AR_LIKE_f))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.imag(ImagObj()))  # E: slice
+reveal_type(np.imag(AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.imag(AR_c16))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.imag(AR_LIKE_f))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.iscomplex(f8))  # E: bool_
+reveal_type(np.iscomplex(AR_f8))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.iscomplex(AR_LIKE_f))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.isreal(f8))  # E: bool_
+reveal_type(np.isreal(AR_f8))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isreal(AR_LIKE_f))  # E: ndarray[Any, dtype[bool_]]
+
+reveal_type(np.iscomplexobj(f8))  # E: bool
+reveal_type(np.isrealobj(f8))  # E: bool
+
+reveal_type(np.nan_to_num(f8))  # E: {float64}
+reveal_type(np.nan_to_num(f, copy=True))  # E: Any
+reveal_type(np.nan_to_num(AR_f8, nan=1.5))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.nan_to_num(AR_LIKE_f, posinf=9999))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.real_if_close(AR_f8))  # E: ndarray[Any, dtype[{float64}]]
+reveal_type(np.real_if_close(AR_c16))  # E: Union[ndarray[Any, dtype[{float64}]], ndarray[Any, dtype[{complex128}]]]
+reveal_type(np.real_if_close(AR_c8))  # E: Union[ndarray[Any, dtype[{float32}]], ndarray[Any, dtype[{complex64}]]]
+reveal_type(np.real_if_close(AR_LIKE_f))  # E: ndarray[Any, dtype[Any]]
+
+reveal_type(np.typename("h"))  # E: Literal['short']
+reveal_type(np.typename("B"))  # E: Literal['unsigned char']
+reveal_type(np.typename("V"))  # E: Literal['void']
+reveal_type(np.typename("S1"))  # E: Literal['character']
+
+reveal_type(np.common_type(AR_i4))  # E: Type[{float64}]
+reveal_type(np.common_type(AR_f2))  # E: Type[{float16}]
+reveal_type(np.common_type(AR_f2, AR_i4))  # E: Type[{float64}]
+reveal_type(np.common_type(AR_f16, AR_i4))  # E: Type[{float128}]
+reveal_type(np.common_type(AR_c8, AR_f2))  # E: Type[{complex64}]
+reveal_type(np.common_type(AR_f2, AR_c8, AR_i4))  # E: Type[{complex128}]
diff --git a/numpy/typing/tests/data/reveal/ufunc_config.py b/numpy/typing/tests/data/reveal/ufunc_config.py
deleted file mode 100644 (file)
index 26be803..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-"""Typing tests for `numpy.core._ufunc_config`."""
-
-import numpy as np
-
-def func(a: str, b: int) -> None: ...
-
-class Write:
-    def write(self, value: str) -> None: ...
-
-reveal_type(np.seterr(all=None))  # E: TypedDict('numpy.core._ufunc_config._ErrDict'
-reveal_type(np.seterr(divide="ignore"))  # E: TypedDict('numpy.core._ufunc_config._ErrDict'
-reveal_type(np.seterr(over="warn"))  # E: TypedDict('numpy.core._ufunc_config._ErrDict'
-reveal_type(np.seterr(under="call"))  # E: TypedDict('numpy.core._ufunc_config._ErrDict'
-reveal_type(np.seterr(invalid="raise"))  # E: TypedDict('numpy.core._ufunc_config._ErrDict'
-reveal_type(np.geterr())  # E: TypedDict('numpy.core._ufunc_config._ErrDict'
-
-reveal_type(np.setbufsize(4096))  # E: int
-reveal_type(np.getbufsize())  # E: int
-
-reveal_type(np.seterrcall(func))  # E: Union[None, def (builtins.str, builtins.int) -> Any, numpy.core._ufunc_config._SupportsWrite]
-reveal_type(np.seterrcall(Write()))  # E: Union[None, def (builtins.str, builtins.int) -> Any, numpy.core._ufunc_config._SupportsWrite]
-reveal_type(np.geterrcall())  # E: Union[None, def (builtins.str, builtins.int) -> Any, numpy.core._ufunc_config._SupportsWrite]
-
-reveal_type(np.errstate(call=func, all="call"))  # E: numpy.errstate[def (a: builtins.str, b: builtins.int)]
-reveal_type(np.errstate(call=Write(), divide="log", over="log"))  # E: numpy.errstate[ufunc_config.Write]
diff --git a/numpy/typing/tests/data/reveal/ufunc_config.pyi b/numpy/typing/tests/data/reveal/ufunc_config.pyi
new file mode 100644 (file)
index 0000000..2c6fadf
--- /dev/null
@@ -0,0 +1,25 @@
+"""Typing tests for `core._ufunc_config`."""
+
+import numpy as np
+
+def func(a: str, b: int) -> None: ...
+
+class Write:
+    def write(self, value: str) -> None: ...
+
+reveal_type(np.seterr(all=None))  # E: TypedDict('core._ufunc_config._ErrDict'
+reveal_type(np.seterr(divide="ignore"))  # E: TypedDict('core._ufunc_config._ErrDict'
+reveal_type(np.seterr(over="warn"))  # E: TypedDict('core._ufunc_config._ErrDict'
+reveal_type(np.seterr(under="call"))  # E: TypedDict('core._ufunc_config._ErrDict'
+reveal_type(np.seterr(invalid="raise"))  # E: TypedDict('core._ufunc_config._ErrDict'
+reveal_type(np.geterr())  # E: TypedDict('core._ufunc_config._ErrDict'
+
+reveal_type(np.setbufsize(4096))  # E: int
+reveal_type(np.getbufsize())  # E: int
+
+reveal_type(np.seterrcall(func))  # E: Union[None, def (builtins.str, builtins.int) -> Any, _SupportsWrite[builtins.str]]
+reveal_type(np.seterrcall(Write()))  # E: Union[None, def (builtins.str, builtins.int) -> Any, _SupportsWrite[builtins.str]]
+reveal_type(np.geterrcall())  # E: Union[None, def (builtins.str, builtins.int) -> Any, _SupportsWrite[builtins.str]]
+
+reveal_type(np.errstate(call=func, all="call"))  # E: errstate[def (a: builtins.str, b: builtins.int)]
+reveal_type(np.errstate(call=Write(), divide="log", over="log"))  # E: errstate[ufunc_config.Write]
diff --git a/numpy/typing/tests/data/reveal/ufunclike.py b/numpy/typing/tests/data/reveal/ufunclike.py
deleted file mode 100644 (file)
index 8b3aea7..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-from typing import List, Any
-import numpy as np
-
-AR_LIKE_b: List[bool]
-AR_LIKE_u: List[np.uint32]
-AR_LIKE_i: List[int]
-AR_LIKE_f: List[float]
-AR_LIKE_O: List[np.object_]
-
-AR_U: np.ndarray[Any, np.dtype[np.str_]]
-
-reveal_type(np.fix(AR_LIKE_b))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(np.fix(AR_LIKE_u))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(np.fix(AR_LIKE_i))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(np.fix(AR_LIKE_f))  # E: numpy.ndarray[Any, numpy.dtype[numpy.floating[Any]]]
-reveal_type(np.fix(AR_LIKE_O))  # E: Any
-reveal_type(np.fix(AR_LIKE_f, out=AR_U))  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-
-reveal_type(np.isposinf(AR_LIKE_b))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(np.isposinf(AR_LIKE_u))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(np.isposinf(AR_LIKE_i))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(np.isposinf(AR_LIKE_f))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(np.isposinf(AR_LIKE_f, out=AR_U))  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
-
-reveal_type(np.isneginf(AR_LIKE_b))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(np.isneginf(AR_LIKE_u))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(np.isneginf(AR_LIKE_i))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(np.isneginf(AR_LIKE_f))  # E: numpy.ndarray[Any, numpy.dtype[numpy.bool_]]
-reveal_type(np.isneginf(AR_LIKE_f, out=AR_U))  # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
diff --git a/numpy/typing/tests/data/reveal/ufunclike.pyi b/numpy/typing/tests/data/reveal/ufunclike.pyi
new file mode 100644 (file)
index 0000000..2d67c92
--- /dev/null
@@ -0,0 +1,29 @@
+from typing import List, Any
+import numpy as np
+
+AR_LIKE_b: List[bool]
+AR_LIKE_u: List[np.uint32]
+AR_LIKE_i: List[int]
+AR_LIKE_f: List[float]
+AR_LIKE_O: List[np.object_]
+
+AR_U: np.ndarray[Any, np.dtype[np.str_]]
+
+reveal_type(np.fix(AR_LIKE_b))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.fix(AR_LIKE_u))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.fix(AR_LIKE_i))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.fix(AR_LIKE_f))  # E: ndarray[Any, dtype[floating[Any]]]
+reveal_type(np.fix(AR_LIKE_O))  # E: Any
+reveal_type(np.fix(AR_LIKE_f, out=AR_U))  # E: ndarray[Any, dtype[str_]]
+
+reveal_type(np.isposinf(AR_LIKE_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isposinf(AR_LIKE_u))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isposinf(AR_LIKE_i))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isposinf(AR_LIKE_f))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isposinf(AR_LIKE_f, out=AR_U))  # E: ndarray[Any, dtype[str_]]
+
+reveal_type(np.isneginf(AR_LIKE_b))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isneginf(AR_LIKE_u))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isneginf(AR_LIKE_i))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isneginf(AR_LIKE_f))  # E: ndarray[Any, dtype[bool_]]
+reveal_type(np.isneginf(AR_LIKE_f, out=AR_U))  # E: ndarray[Any, dtype[str_]]
diff --git a/numpy/typing/tests/data/reveal/ufuncs.py b/numpy/typing/tests/data/reveal/ufuncs.py
deleted file mode 100644 (file)
index ade4557..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-import numpy as np
-import numpy.typing as npt
-
-f8: np.float64
-AR_f8: npt.NDArray[np.float64]
-AR_i8: npt.NDArray[np.int64]
-
-reveal_type(np.absolute.__doc__)  # E: str
-reveal_type(np.absolute.types)  # E: builtins.list[builtins.str]
-
-reveal_type(np.absolute.__name__)  # E: Literal['absolute']
-reveal_type(np.absolute.ntypes)  # E: Literal[20]
-reveal_type(np.absolute.identity)  # E: None
-reveal_type(np.absolute.nin)  # E: Literal[1]
-reveal_type(np.absolute.nin)  # E: Literal[1]
-reveal_type(np.absolute.nout)  # E: Literal[1]
-reveal_type(np.absolute.nargs)  # E: Literal[2]
-reveal_type(np.absolute.signature)  # E: None
-reveal_type(np.absolute(f8))  # E: Any
-reveal_type(np.absolute(AR_f8))  # E: numpy.ndarray
-reveal_type(np.absolute.at(AR_f8, AR_i8))  # E: None
-
-reveal_type(np.add.__name__)  # E: Literal['add']
-reveal_type(np.add.ntypes)  # E: Literal[22]
-reveal_type(np.add.identity)  # E: Literal[0]
-reveal_type(np.add.nin)  # E: Literal[2]
-reveal_type(np.add.nout)  # E: Literal[1]
-reveal_type(np.add.nargs)  # E: Literal[3]
-reveal_type(np.add.signature)  # E: None
-reveal_type(np.add(f8, f8))  # E: Any
-reveal_type(np.add(AR_f8, f8))  # E: numpy.ndarray
-reveal_type(np.add.at(AR_f8, AR_i8, f8))  # E: None
-reveal_type(np.add.reduce(AR_f8, axis=0))  # E: Any
-reveal_type(np.add.accumulate(AR_f8))  # E: numpy.ndarray
-reveal_type(np.add.reduceat(AR_f8, AR_i8))  # E: numpy.ndarray
-reveal_type(np.add.outer(f8, f8))  # E: Any
-reveal_type(np.add.outer(AR_f8, f8))  # E: numpy.ndarray
-
-reveal_type(np.frexp.__name__)  # E: Literal['frexp']
-reveal_type(np.frexp.ntypes)  # E: Literal[4]
-reveal_type(np.frexp.identity)  # E: None
-reveal_type(np.frexp.nin)  # E: Literal[1]
-reveal_type(np.frexp.nout)  # E: Literal[2]
-reveal_type(np.frexp.nargs)  # E: Literal[3]
-reveal_type(np.frexp.signature)  # E: None
-reveal_type(np.frexp(f8))  # E: Tuple[Any, Any]
-reveal_type(np.frexp(AR_f8))  # E: Tuple[numpy.ndarray[Any, numpy.dtype[Any]], numpy.ndarray[Any, numpy.dtype[Any]]]
-
-reveal_type(np.divmod.__name__)  # E: Literal['divmod']
-reveal_type(np.divmod.ntypes)  # E: Literal[15]
-reveal_type(np.divmod.identity)  # E: None
-reveal_type(np.divmod.nin)  # E: Literal[2]
-reveal_type(np.divmod.nout)  # E: Literal[2]
-reveal_type(np.divmod.nargs)  # E: Literal[4]
-reveal_type(np.divmod.signature)  # E: None
-reveal_type(np.divmod(f8, f8))  # E: Tuple[Any, Any]
-reveal_type(np.divmod(AR_f8, f8))  # E: Tuple[numpy.ndarray[Any, numpy.dtype[Any]], numpy.ndarray[Any, numpy.dtype[Any]]]
-
-reveal_type(np.matmul.__name__)  # E: Literal['matmul']
-reveal_type(np.matmul.ntypes)  # E: Literal[19]
-reveal_type(np.matmul.identity)  # E: None
-reveal_type(np.matmul.nin)  # E: Literal[2]
-reveal_type(np.matmul.nout)  # E: Literal[1]
-reveal_type(np.matmul.nargs)  # E: Literal[3]
-reveal_type(np.matmul.signature)  # E: Literal['(n?,k),(k,m?)->(n?,m?)']
-reveal_type(np.matmul.identity)  # E: None
-reveal_type(np.matmul(AR_f8, AR_f8))  # E: Any
-reveal_type(np.matmul(AR_f8, AR_f8, axes=[(0, 1), (0, 1), (0, 1)]))  # E: Any
diff --git a/numpy/typing/tests/data/reveal/ufuncs.pyi b/numpy/typing/tests/data/reveal/ufuncs.pyi
new file mode 100644 (file)
index 0000000..3bf83c8
--- /dev/null
@@ -0,0 +1,68 @@
+import numpy as np
+import numpy.typing as npt
+
+f8: np.float64
+AR_f8: npt.NDArray[np.float64]
+AR_i8: npt.NDArray[np.int64]
+
+reveal_type(np.absolute.__doc__)  # E: str
+reveal_type(np.absolute.types)  # E: builtins.list[builtins.str]
+
+reveal_type(np.absolute.__name__)  # E: Literal['absolute']
+reveal_type(np.absolute.ntypes)  # E: Literal[20]
+reveal_type(np.absolute.identity)  # E: None
+reveal_type(np.absolute.nin)  # E: Literal[1]
+reveal_type(np.absolute.nin)  # E: Literal[1]
+reveal_type(np.absolute.nout)  # E: Literal[1]
+reveal_type(np.absolute.nargs)  # E: Literal[2]
+reveal_type(np.absolute.signature)  # E: None
+reveal_type(np.absolute(f8))  # E: Any
+reveal_type(np.absolute(AR_f8))  # E: ndarray
+reveal_type(np.absolute.at(AR_f8, AR_i8))  # E: None
+
+reveal_type(np.add.__name__)  # E: Literal['add']
+reveal_type(np.add.ntypes)  # E: Literal[22]
+reveal_type(np.add.identity)  # E: Literal[0]
+reveal_type(np.add.nin)  # E: Literal[2]
+reveal_type(np.add.nout)  # E: Literal[1]
+reveal_type(np.add.nargs)  # E: Literal[3]
+reveal_type(np.add.signature)  # E: None
+reveal_type(np.add(f8, f8))  # E: Any
+reveal_type(np.add(AR_f8, f8))  # E: ndarray
+reveal_type(np.add.at(AR_f8, AR_i8, f8))  # E: None
+reveal_type(np.add.reduce(AR_f8, axis=0))  # E: Any
+reveal_type(np.add.accumulate(AR_f8))  # E: ndarray
+reveal_type(np.add.reduceat(AR_f8, AR_i8))  # E: ndarray
+reveal_type(np.add.outer(f8, f8))  # E: Any
+reveal_type(np.add.outer(AR_f8, f8))  # E: ndarray
+
+reveal_type(np.frexp.__name__)  # E: Literal['frexp']
+reveal_type(np.frexp.ntypes)  # E: Literal[4]
+reveal_type(np.frexp.identity)  # E: None
+reveal_type(np.frexp.nin)  # E: Literal[1]
+reveal_type(np.frexp.nout)  # E: Literal[2]
+reveal_type(np.frexp.nargs)  # E: Literal[3]
+reveal_type(np.frexp.signature)  # E: None
+reveal_type(np.frexp(f8))  # E: Tuple[Any, Any]
+reveal_type(np.frexp(AR_f8))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[Any]]]
+
+reveal_type(np.divmod.__name__)  # E: Literal['divmod']
+reveal_type(np.divmod.ntypes)  # E: Literal[15]
+reveal_type(np.divmod.identity)  # E: None
+reveal_type(np.divmod.nin)  # E: Literal[2]
+reveal_type(np.divmod.nout)  # E: Literal[2]
+reveal_type(np.divmod.nargs)  # E: Literal[4]
+reveal_type(np.divmod.signature)  # E: None
+reveal_type(np.divmod(f8, f8))  # E: Tuple[Any, Any]
+reveal_type(np.divmod(AR_f8, f8))  # E: Tuple[ndarray[Any, dtype[Any]], ndarray[Any, dtype[Any]]]
+
+reveal_type(np.matmul.__name__)  # E: Literal['matmul']
+reveal_type(np.matmul.ntypes)  # E: Literal[19]
+reveal_type(np.matmul.identity)  # E: None
+reveal_type(np.matmul.nin)  # E: Literal[2]
+reveal_type(np.matmul.nout)  # E: Literal[1]
+reveal_type(np.matmul.nargs)  # E: Literal[3]
+reveal_type(np.matmul.signature)  # E: Literal['(n?,k),(k,m?)->(n?,m?)']
+reveal_type(np.matmul.identity)  # E: None
+reveal_type(np.matmul(AR_f8, AR_f8))  # E: Any
+reveal_type(np.matmul(AR_f8, AR_f8, axes=[(0, 1), (0, 1), (0, 1)]))  # E: Any
diff --git a/numpy/typing/tests/data/reveal/version.pyi b/numpy/typing/tests/data/reveal/version.pyi
new file mode 100644 (file)
index 0000000..e538376
--- /dev/null
@@ -0,0 +1,8 @@
+import numpy.version
+
+reveal_type(numpy.version.version)  # E: str
+reveal_type(numpy.version.__version__)  # E: str
+reveal_type(numpy.version.full_version)  # E: str
+reveal_type(numpy.version.git_revision)  # E: str
+reveal_type(numpy.version.release)  # E: bool
+reveal_type(numpy.version.short_version)  # E: str
diff --git a/numpy/typing/tests/data/reveal/warnings_and_errors.py b/numpy/typing/tests/data/reveal/warnings_and_errors.py
deleted file mode 100644 (file)
index c428deb..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-from typing import Type
-
-import numpy as np
-
-reveal_type(np.ModuleDeprecationWarning())  # E: numpy.ModuleDeprecationWarning
-reveal_type(np.VisibleDeprecationWarning())  # E: numpy.VisibleDeprecationWarning
-reveal_type(np.ComplexWarning())  # E: numpy.ComplexWarning
-reveal_type(np.RankWarning())  # E: numpy.RankWarning
-reveal_type(np.TooHardError())  # E: numpy.TooHardError
-reveal_type(np.AxisError(1))  # E: numpy.AxisError
diff --git a/numpy/typing/tests/data/reveal/warnings_and_errors.pyi b/numpy/typing/tests/data/reveal/warnings_and_errors.pyi
new file mode 100644 (file)
index 0000000..d5c5044
--- /dev/null
@@ -0,0 +1,11 @@
+from typing import Type
+
+import numpy as np
+
+reveal_type(np.ModuleDeprecationWarning())  # E: ModuleDeprecationWarning
+reveal_type(np.VisibleDeprecationWarning())  # E: VisibleDeprecationWarning
+reveal_type(np.ComplexWarning())  # E: ComplexWarning
+reveal_type(np.RankWarning())  # E: RankWarning
+reveal_type(np.TooHardError())  # E: TooHardError
+reveal_type(np.AxisError("test"))  # E: AxisError
+reveal_type(np.AxisError(5, 1))  # E: AxisError
index 35c0da3490b371f3e8953128537fc19665922362..39343420bdc53523515bbad400d3b083e74f3356 100644 (file)
@@ -42,6 +42,12 @@ class TestGenericAlias:
 
     @pytest.mark.parametrize("name,func", [
         ("__init__", lambda n: n),
+        ("__init__", lambda n: _GenericAlias(np.ndarray, Any)),
+        ("__init__", lambda n: _GenericAlias(np.ndarray, (Any,))),
+        ("__init__", lambda n: _GenericAlias(np.ndarray, (Any, Any))),
+        ("__init__", lambda n: _GenericAlias(np.ndarray, T1)),
+        ("__init__", lambda n: _GenericAlias(np.ndarray, (T1,))),
+        ("__init__", lambda n: _GenericAlias(np.ndarray, (T1, T2))),
         ("__origin__", lambda n: n.__origin__),
         ("__args__", lambda n: n.__args__),
         ("__parameters__", lambda n: n.__parameters__),
index b617b3873b649e214b703ea0c7c389d8d91d6030..a898b3e285b908123b0746f3970e8495319797f7 100644 (file)
@@ -8,9 +8,7 @@ ROOT = Path(np.__file__).parents[0]
 FILES = [
     ROOT / "py.typed",
     ROOT / "__init__.pyi",
-    ROOT / "char.pyi",
     ROOT / "ctypeslib.pyi",
-    ROOT / "rec.pyi",
     ROOT / "core" / "__init__.pyi",
     ROOT / "distutils" / "__init__.pyi",
     ROOT / "f2py" / "__init__.pyi",
index e82b08ac26a0df09295fb1bf130933e54c6c7c0b..5b5df49dc5718b9d6cf727cd54e4691c2801b013 100644 (file)
@@ -3,22 +3,16 @@
 from __future__ import annotations
 
 import sys
-from typing import get_type_hints, Union, Tuple, NamedTuple
+from typing import get_type_hints, Union, NamedTuple, get_args, get_origin
 
 import pytest
 import numpy as np
 import numpy.typing as npt
 
-try:
-    from typing_extensions import get_args, get_origin
-    SKIP = False
-except ImportError:
-    SKIP = True
-
 
 class TypeTup(NamedTuple):
     typ: type
-    args: Tuple[type, ...]
+    args: tuple[type, ...]
     origin: None | type
 
 
@@ -36,7 +30,6 @@ TYPES = {
 
 
 @pytest.mark.parametrize("name,tup", TYPES.items(), ids=TYPES.keys())
-@pytest.mark.skipif(SKIP, reason="requires typing-extensions")
 def test_get_args(name: type, tup: TypeTup) -> None:
     """Test `typing.get_args`."""
     typ, ref = tup.typ, tup.args
@@ -45,7 +38,6 @@ def test_get_args(name: type, tup: TypeTup) -> None:
 
 
 @pytest.mark.parametrize("name,tup", TYPES.items(), ids=TYPES.keys())
-@pytest.mark.skipif(SKIP, reason="requires typing-extensions")
 def test_get_origin(name: type, tup: TypeTup) -> None:
     """Test `typing.get_origin`."""
     typ, ref = tup.typ, tup.origin
index be08c1359daa1ad2875c8e8b4e2d95526f3f205c..fe58a8f4c5e89382551e988f14099f08e9225417 100644 (file)
@@ -1,14 +1,22 @@
+from __future__ import annotations
+
 import importlib.util
 import itertools
 import os
 import re
 import shutil
 from collections import defaultdict
-from typing import Optional, IO, Dict, List
+from collections.abc import Iterator
+from typing import IO, TYPE_CHECKING
 
 import pytest
 import numpy as np
-from numpy.typing.mypy_plugin import _PRECISION_DICT, _EXTENDED_PRECISION_LIST
+import numpy.typing as npt
+from numpy.typing.mypy_plugin import (
+    _PRECISION_DICT,
+    _EXTENDED_PRECISION_LIST,
+    _C_INTP,
+)
 
 try:
     from mypy import api
@@ -17,6 +25,10 @@ except ImportError:
 else:
     NO_MYPY = False
 
+if TYPE_CHECKING:
+    # We need this as annotation, but it's located in a private namespace.
+    # As a compromise, do *not* import it during runtime
+    from _pytest.mark.structures import ParameterSet
 
 DATA_DIR = os.path.join(os.path.dirname(__file__), "data")
 PASS_DIR = os.path.join(DATA_DIR, "pass")
@@ -28,11 +40,11 @@ CACHE_DIR = os.path.join(DATA_DIR, ".mypy_cache")
 
 #: A dictionary with file names as keys and lists of the mypy stdout as values.
 #: To-be populated by `run_mypy`.
-OUTPUT_MYPY: Dict[str, List[str]] = {}
+OUTPUT_MYPY: dict[str, list[str]] = {}
 
 
 def _key_func(key: str) -> str:
-    """Split at the first occurance of the ``:`` character.
+    """Split at the first occurrence of the ``:`` character.
 
     Windows drive-letters (*e.g.* ``C:``) are ignored herein.
     """
@@ -46,6 +58,11 @@ def _strip_filename(msg: str) -> str:
     return tail.split(":", 1)[-1]
 
 
+def strip_func(match: re.Match[str]) -> str:
+    """`re.sub` helper function for stripping module names."""
+    return match.groups()[1]
+
+
 @pytest.mark.slow
 @pytest.mark.skipif(NO_MYPY, reason="Mypy is not installed")
 @pytest.fixture(scope="module", autouse=True)
@@ -58,7 +75,10 @@ def run_mypy() -> None:
 
     NUMPY_TYPING_TEST_CLEAR_CACHE=0 pytest numpy/typing/tests
     """
-    if os.path.isdir(CACHE_DIR) and bool(os.environ.get("NUMPY_TYPING_TEST_CLEAR_CACHE", True)):
+    if (
+        os.path.isdir(CACHE_DIR)
+        and bool(os.environ.get("NUMPY_TYPING_TEST_CLEAR_CACHE", True))
+    ):
         shutil.rmtree(CACHE_DIR)
 
     for directory in (PASS_DIR, REVEAL_DIR, FAIL_DIR, MISC_DIR):
@@ -81,25 +101,19 @@ def run_mypy() -> None:
         OUTPUT_MYPY.update((k, list(v)) for k, v in iterator if k)
 
 
-def get_test_cases(directory):
+def get_test_cases(directory: str) -> Iterator[ParameterSet]:
     for root, _, files in os.walk(directory):
         for fname in files:
-            if os.path.splitext(fname)[-1] == ".py":
+            short_fname, ext = os.path.splitext(fname)
+            if ext in (".pyi", ".py"):
                 fullpath = os.path.join(root, fname)
-                # Use relative path for nice py.test name
-                relpath = os.path.relpath(fullpath, start=directory)
-
-                yield pytest.param(
-                    fullpath,
-                    # Manually specify a name for the test
-                    id=relpath,
-                )
+                yield pytest.param(fullpath, id=short_fname)
 
 
 @pytest.mark.slow
 @pytest.mark.skipif(NO_MYPY, reason="Mypy is not installed")
 @pytest.mark.parametrize("path", get_test_cases(PASS_DIR))
-def test_success(path):
+def test_success(path) -> None:
     # Alias `OUTPUT_MYPY` so that it appears in the local namespace
     output_mypy = OUTPUT_MYPY
     if path in output_mypy:
@@ -111,7 +125,7 @@ def test_success(path):
 @pytest.mark.slow
 @pytest.mark.skipif(NO_MYPY, reason="Mypy is not installed")
 @pytest.mark.parametrize("path", get_test_cases(FAIL_DIR))
-def test_fail(path):
+def test_fail(path: str) -> None:
     __tracebackhide__ = True
 
     with open(path) as fin:
@@ -134,38 +148,86 @@ def test_fail(path):
 
     for i, line in enumerate(lines):
         lineno = i + 1
-        if line.startswith('#') or (" E:" not in line and lineno not in errors):
+        if (
+            line.startswith('#')
+            or (" E:" not in line and lineno not in errors)
+        ):
             continue
 
         target_line = lines[lineno - 1]
         if "# E:" in target_line:
-            marker = target_line.split("# E:")[-1].strip()
-            expected_error = errors.get(lineno)
-            _test_fail(path, marker, expected_error, lineno)
+            expression, _, marker = target_line.partition("  # E: ")
+            expected_error = errors[lineno].strip()
+            marker = marker.strip()
+            _test_fail(path, expression, marker, expected_error, lineno)
         else:
-            pytest.fail(f"Unexpected mypy output\n\n{errors[lineno]}")
+            pytest.fail(
+                f"Unexpected mypy output at line {lineno}\n\n{errors[lineno]}"
+            )
 
 
 _FAIL_MSG1 = """Extra error at line {}
 
+Expression: {}
 Extra error: {!r}
 """
 
 _FAIL_MSG2 = """Error mismatch at line {}
 
+Expression: {}
 Expected error: {!r}
 Observed error: {!r}
 """
 
 
-def _test_fail(path: str, error: str, expected_error: Optional[str], lineno: int) -> None:
+def _test_fail(
+    path: str,
+    expression: str,
+    error: str,
+    expected_error: None | str,
+    lineno: int,
+) -> None:
     if expected_error is None:
-        raise AssertionError(_FAIL_MSG1.format(lineno, error))
+        raise AssertionError(_FAIL_MSG1.format(lineno, expression, error))
     elif error not in expected_error:
-        raise AssertionError(_FAIL_MSG2.format(lineno, expected_error, error))
+        raise AssertionError(_FAIL_MSG2.format(
+            lineno, expression, expected_error, error
+        ))
+
+
+def _construct_ctypes_dict() -> dict[str, str]:
+    dct = {
+        "ubyte": "c_ubyte",
+        "ushort": "c_ushort",
+        "uintc": "c_uint",
+        "uint": "c_ulong",
+        "ulonglong": "c_ulonglong",
+        "byte": "c_byte",
+        "short": "c_short",
+        "intc": "c_int",
+        "int_": "c_long",
+        "longlong": "c_longlong",
+        "single": "c_float",
+        "double": "c_double",
+        "longdouble": "c_longdouble",
+    }
+
+    # Match `ctypes` names to the first ctypes type with a given kind and
+    # precision, e.g. {"c_double": "c_double", "c_longdouble": "c_double"}
+    # if both types represent 64-bit floats.
+    # In this context "first" is defined by the order of `dct`
+    ret = {}
+    visited: dict[tuple[str, int], str] = {}
+    for np_name, ct_name in dct.items():
+        np_scalar = getattr(np, np_name)()
+
+        # Find the first `ctypes` type for a given `kind`/`itemsize` combo
+        key = (np_scalar.dtype.kind, np_scalar.dtype.itemsize)
+        ret[ct_name] = visited.setdefault(key, f"ctypes.{ct_name}")
+    return ret
 
 
-def _construct_format_dict():
+def _construct_format_dict() -> dict[str, str]:
     dct = {k.split(".")[-1]: v.replace("numpy", "numpy.typing") for
            k, v in _PRECISION_DICT.items()}
 
@@ -189,12 +251,18 @@ def _construct_format_dict():
         "float96": "numpy.floating[numpy.typing._96Bit]",
         "float128": "numpy.floating[numpy.typing._128Bit]",
         "float256": "numpy.floating[numpy.typing._256Bit]",
-        "complex64": "numpy.complexfloating[numpy.typing._32Bit, numpy.typing._32Bit]",
-        "complex128": "numpy.complexfloating[numpy.typing._64Bit, numpy.typing._64Bit]",
-        "complex160": "numpy.complexfloating[numpy.typing._80Bit, numpy.typing._80Bit]",
-        "complex192": "numpy.complexfloating[numpy.typing._96Bit, numpy.typing._96Bit]",
-        "complex256": "numpy.complexfloating[numpy.typing._128Bit, numpy.typing._128Bit]",
-        "complex512": "numpy.complexfloating[numpy.typing._256Bit, numpy.typing._256Bit]",
+        "complex64": ("numpy.complexfloating"
+                      "[numpy.typing._32Bit, numpy.typing._32Bit]"),
+        "complex128": ("numpy.complexfloating"
+                       "[numpy.typing._64Bit, numpy.typing._64Bit]"),
+        "complex160": ("numpy.complexfloating"
+                       "[numpy.typing._80Bit, numpy.typing._80Bit]"),
+        "complex192": ("numpy.complexfloating"
+                       "[numpy.typing._96Bit, numpy.typing._96Bit]"),
+        "complex256": ("numpy.complexfloating"
+                       "[numpy.typing._128Bit, numpy.typing._128Bit]"),
+        "complex512": ("numpy.complexfloating"
+                       "[numpy.typing._256Bit, numpy.typing._256Bit]"),
 
         "ubyte": f"numpy.unsignedinteger[{dct['_NBitByte']}]",
         "ushort": f"numpy.unsignedinteger[{dct['_NBitShort']}]",
@@ -213,51 +281,68 @@ def _construct_format_dict():
         "single": f"numpy.floating[{dct['_NBitSingle']}]",
         "double": f"numpy.floating[{dct['_NBitDouble']}]",
         "longdouble": f"numpy.floating[{dct['_NBitLongDouble']}]",
-        "csingle": f"numpy.complexfloating[{dct['_NBitSingle']}, {dct['_NBitSingle']}]",
-        "cdouble": f"numpy.complexfloating[{dct['_NBitDouble']}, {dct['_NBitDouble']}]",
-        "clongdouble": f"numpy.complexfloating[{dct['_NBitLongDouble']}, {dct['_NBitLongDouble']}]",
+        "csingle": ("numpy.complexfloating"
+                    f"[{dct['_NBitSingle']}, {dct['_NBitSingle']}]"),
+        "cdouble": ("numpy.complexfloating"
+                    f"[{dct['_NBitDouble']}, {dct['_NBitDouble']}]"),
+        "clongdouble": (
+            "numpy.complexfloating"
+            f"[{dct['_NBitLongDouble']}, {dct['_NBitLongDouble']}]"
+        ),
 
         # numpy.typing
         "_NBitInt": dct['_NBitInt'],
+
+        # numpy.ctypeslib
+        "c_intp": f"ctypes.{_C_INTP}"
     }
 
 
 #: A dictionary with all supported format keys (as keys)
 #: and matching values
-FORMAT_DICT: Dict[str, str] = _construct_format_dict()
+FORMAT_DICT: dict[str, str] = _construct_format_dict()
+FORMAT_DICT.update(_construct_ctypes_dict())
 
 
-def _parse_reveals(file: IO[str]) -> List[str]:
-    """Extract and parse all ``"  # E: "`` comments from the passed file-like object.
+def _parse_reveals(file: IO[str]) -> tuple[npt.NDArray[np.str_], list[str]]:
+    """Extract and parse all ``"  # E: "`` comments from the passed
+    file-like object.
 
-    All format keys will be substituted for their respective value from `FORMAT_DICT`,
-    *e.g.* ``"{float64}"`` becomes ``"numpy.floating[numpy.typing._64Bit]"``.
+    All format keys will be substituted for their respective value
+    from `FORMAT_DICT`, *e.g.* ``"{float64}"`` becomes
+    ``"numpy.floating[numpy.typing._64Bit]"``.
     """
     string = file.read().replace("*", "")
 
-    # Grab all `# E:`-based comments
-    comments_array = np.char.partition(string.split("\n"), sep="  # E: ")[:, 2]
+    # Grab all `# E:`-based comments and matching expressions
+    expression_array, _, comments_array = np.char.partition(
+        string.split("\n"), sep="  # E: "
+    ).T
     comments = "/n".join(comments_array)
 
-    # Only search for the `{*}` pattern within comments,
-    # otherwise there is the risk of accidently grabbing dictionaries and sets
+    # Only search for the `{*}` pattern within comments, otherwise
+    # there is the risk of accidentally grabbing dictionaries and sets
     key_set = set(re.findall(r"\{(.*?)\}", comments))
     kwargs = {
-        k: FORMAT_DICT.get(k, f"<UNRECOGNIZED FORMAT KEY {k!r}>") for k in key_set
+        k: FORMAT_DICT.get(k, f"<UNRECOGNIZED FORMAT KEY {k!r}>") for
+        k in key_set
     }
     fmt_str = comments.format(**kwargs)
 
-    return fmt_str.split("/n")
+    return expression_array, fmt_str.split("/n")
 
 
 @pytest.mark.slow
 @pytest.mark.skipif(NO_MYPY, reason="Mypy is not installed")
 @pytest.mark.parametrize("path", get_test_cases(REVEAL_DIR))
-def test_reveal(path):
+def test_reveal(path: str) -> None:
+    """Validate that mypy correctly infers the return-types of
+    the expressions in `path`.
+    """
     __tracebackhide__ = True
 
     with open(path) as fin:
-        lines = _parse_reveals(fin)
+        expression_array, reveal_list = _parse_reveals(fin)
 
     output_mypy = OUTPUT_MYPY
     assert path in output_mypy
@@ -272,29 +357,53 @@ def test_reveal(path):
         lineno = int(match.group('lineno')) - 1
         assert "Revealed type is" in error_line
 
-        marker = lines[lineno]
-        _test_reveal(path, marker, error_line, 1 + lineno)
+        marker = reveal_list[lineno]
+        expression = expression_array[lineno]
+        _test_reveal(path, expression, marker, error_line, 1 + lineno)
 
 
 _REVEAL_MSG = """Reveal mismatch at line {}
 
+Expression: {}
 Expected reveal: {!r}
 Observed reveal: {!r}
 """
 
 
-def _test_reveal(path: str, reveal: str, expected_reveal: str, lineno: int) -> None:
-    if reveal not in expected_reveal:
-        raise AssertionError(_REVEAL_MSG.format(lineno, expected_reveal, reveal))
+def _test_reveal(
+    path: str,
+    expression: str,
+    reveal: str,
+    expected_reveal: str,
+    lineno: int,
+) -> None:
+    """Error-reporting helper function for `test_reveal`."""
+    strip_pattern = re.compile(r"(\w+\.)+(\w+)")
+    stripped_reveal = strip_pattern.sub(strip_func, reveal)
+    stripped_expected_reveal = strip_pattern.sub(strip_func, expected_reveal)
+    if stripped_reveal not in stripped_expected_reveal:
+        raise AssertionError(
+            _REVEAL_MSG.format(lineno,
+                               expression,
+                               stripped_expected_reveal,
+                               stripped_reveal)
+        )
 
 
 @pytest.mark.slow
 @pytest.mark.skipif(NO_MYPY, reason="Mypy is not installed")
 @pytest.mark.parametrize("path", get_test_cases(PASS_DIR))
-def test_code_runs(path):
+def test_code_runs(path: str) -> None:
+    """Validate that the code in `path` properly during runtime."""
     path_without_extension, _ = os.path.splitext(path)
     dirname, filename = path.split(os.sep)[-2:]
-    spec = importlib.util.spec_from_file_location(f"{dirname}.{filename}", path)
+
+    spec = importlib.util.spec_from_file_location(
+        f"{dirname}.{filename}", path
+    )
+    assert spec is not None
+    assert spec.loader is not None
+
     test_module = importlib.util.module_from_spec(spec)
     spec.loader.exec_module(test_module)
 
@@ -318,15 +427,19 @@ LINENO_MAPPING = {
 @pytest.mark.slow
 @pytest.mark.skipif(NO_MYPY, reason="Mypy is not installed")
 def test_extended_precision() -> None:
-    path = os.path.join(MISC_DIR, "extended_precision.py")
+    path = os.path.join(MISC_DIR, "extended_precision.pyi")
     output_mypy = OUTPUT_MYPY
     assert path in output_mypy
 
+    with open(path, "r") as f:
+        expression_list = f.readlines()
+
     for _msg in output_mypy[path]:
         *_, _lineno, msg_typ, msg = _msg.split(":")
 
         msg = _strip_filename(msg)
         lineno = int(_lineno)
+        expression = expression_list[lineno - 1].rstrip("\n")
         msg_typ = msg_typ.strip()
         assert msg_typ in {"error", "note"}
 
@@ -335,8 +448,8 @@ def test_extended_precision() -> None:
                 raise ValueError(f"Unexpected reveal line format: {lineno}")
             else:
                 marker = FORMAT_DICT[LINENO_MAPPING[lineno]]
-                _test_reveal(path, marker, msg, lineno)
+                _test_reveal(path, expression, marker, msg, lineno)
         else:
             if msg_typ == "error":
                 marker = "Module has no attribute"
-                _test_fail(path, marker, msg, lineno)
+                _test_fail(path, expression, marker, msg, lineno)
diff --git a/numpy/typing/tests/test_typing_extensions.py b/numpy/typing/tests/test_typing_extensions.py
deleted file mode 100644 (file)
index f59f222..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-"""Tests for the optional typing-extensions dependency."""
-
-import sys
-import textwrap
-import subprocess
-
-CODE = textwrap.dedent(r"""
-    import sys
-    import importlib
-
-    assert "typing_extensions" not in sys.modules
-    assert "numpy.typing" not in sys.modules
-
-    # Importing `typing_extensions` will now raise an `ImportError`
-    sys.modules["typing_extensions"] = None
-    assert importlib.import_module("numpy.typing")
-""")
-
-
-def test_no_typing_extensions() -> None:
-    """Import `numpy.typing` in the absence of typing-extensions.
-
-    Notes
-    -----
-    Ideally, we'd just run the normal typing tests in an environment where
-    typing-extensions is not installed, but unfortunatelly this is currently
-    impossible as it is an indirect hard dependency of pytest.
-
-    """
-    p = subprocess.run([sys.executable, '-c', CODE], capture_output=True)
-    if p.returncode:
-        raise AssertionError(
-            f"Non-zero return code: {p.returncode!r}\n\n{p.stderr.decode()}"
-        )
-
index 4159a1c0eb82ec84053e502a1db6a76ba64b10fd..d5657d0d08ebabaa7a3f3ed51a58213aafb16ba7 100644 (file)
@@ -1,12 +1,15 @@
+from __future__ import annotations
+
 from ._version import get_versions
 
-__ALL__ = ['version', 'full_version', 'git_revision', 'release']
+__ALL__ = ['version', '__version__', 'full_version', 'git_revision', 'release']
 
-vinfo = get_versions()
-version: str = vinfo["version"]
-full_version: str = vinfo['version']
-git_revision: str = vinfo['full-revisionid']
+vinfo: dict[str, str] = get_versions()
+version = vinfo["version"]
+__version__ = vinfo.get("closest-tag", vinfo["version"])
+full_version = vinfo['version']
+git_revision = vinfo['full-revisionid']
 release = 'dev0' not in version and '+' not in version
-short_version: str = vinfo['version'].split("+")[0]
+short_version = vinfo['version'].split("+")[0]
 
 del get_versions, vinfo
index e7773fed6218527eedde1fbe93dc911a0d198cd3..6fdaae975c245447300859cd239b0fb10a1f6cad 100644 (file)
@@ -38,7 +38,7 @@ from paver.easy import Bunch, options, task, sh
 #-----------------------------------
 
 # Path to the release notes
-RELEASE_NOTES = 'doc/source/release/1.21.6-notes.rst'
+RELEASE_NOTES = 'doc/source/release/1.22.0-notes.rst'
 
 
 #-------------------------------------------------------
@@ -168,7 +168,7 @@ def compute_sha256(idirs):
 def write_release_task(options, filename='README'):
     """Append hashes of release files to release notes.
 
-    This appends file hashes to the release notes ane creates
+    This appends file hashes to the release notes and creates
     four README files of the result in various formats:
 
     - README.rst
index 855fd715755ee6da8900e4c38d773b26f7f9c838..ac057a358dd32052b9afa51db0ed3fc7e6c37891 100755 (executable)
@@ -192,7 +192,12 @@ def main(argv):
         site_dir, site_dir_noarch = build_project(args)
         sys.path.insert(0, site_dir)
         sys.path.insert(0, site_dir_noarch)
-        os.environ['PYTHONPATH'] = site_dir + os.pathsep + site_dir_noarch
+        os.environ['PYTHONPATH'] = \
+            os.pathsep.join((
+                site_dir, 
+                site_dir_noarch, 
+                os.environ.get('PYTHONPATH', '')
+            ))
     else:
         _temp = __import__(PROJECT_MODULE)
         site_dir = os.path.sep.join(_temp.__file__.split(os.path.sep)[:-2])
@@ -474,23 +479,18 @@ def build_project(args):
             '--single-version-externally-managed',
             '--record=' + dst_dir + 'tmp_install_log.txt']
 
-    py_v_s = sysconfig.get_config_var('py_version_short')
-    platlibdir = getattr(sys, 'platlibdir', '')  # Python3.9+
+    config_vars = dict(sysconfig.get_config_vars())
+    config_vars["platbase"] = dst_dir
+    config_vars["base"] = dst_dir
+
     site_dir_template = os.path.normpath(sysconfig.get_path(
         'platlib', expand=False
     ))
-    site_dir = site_dir_template.format(platbase=dst_dir,
-                                        py_version_short=py_v_s,
-                                        platlibdir=platlibdir,
-                                        base=dst_dir,
-                                        )
+    site_dir = site_dir_template.format(**config_vars)
     noarch_template = os.path.normpath(sysconfig.get_path(
         'purelib', expand=False
     ))
-    site_dir_noarch = noarch_template.format(base=dst_dir,
-                                             py_version_short=py_v_s,
-                                             platlibdir=platlibdir,
-                                             )
+    site_dir_noarch = noarch_template.format(**config_vars)
 
     # easy_install won't install to a path that Python by default cannot see
     # and isn't on the PYTHONPATH.  Plus, it has to exist.
@@ -498,7 +498,8 @@ def build_project(args):
         os.makedirs(site_dir)
     if not os.path.exists(site_dir_noarch):
         os.makedirs(site_dir_noarch)
-    env['PYTHONPATH'] = site_dir + os.pathsep + site_dir_noarch
+    env['PYTHONPATH'] = \
+        os.pathsep.join((site_dir, site_dir_noarch, env.get('PYTHONPATH', '')))
 
     log_filename = os.path.join(ROOT_DIR, 'build.log')
 
@@ -624,7 +625,7 @@ def asv_substitute_config(in_config, out_config, **custom_vars):
             hash_line = wfd.readline().split('hash:')
             if len(hash_line) > 1 and int(hash_line[1]) == vars_hash:
                 return True
-    except IOError:
+    except OSError:
         pass
 
     custom_vars = {f'{{{k}}}':v for k, v in custom_vars.items()}
index 5bca14ba00ee29220f257e83be25c04ae1d9aa53..f36b4b624066781f8f4ea6b6bd521f820c85dd65 100644 (file)
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,3 +1,6 @@
+[codespell]
+skip = *-changelog.rst,*-notes.rst,f2c_blas.c,f2c_c_lapack.c,f2c_d_lapack.c,f2c_s_lapack.c,f2c_z_lapack.c
+
 # See the docstring in versioneer.py for instructions. Note that you must
 # re-run 'versioneer.py setup' after changing this section, and commit the
 # resulting files.
index ceb9900713cec61e8d7e9af20e050b6eda3fb9e8..703fe79e1694fdc670189e3fc1432c8b209ba52b 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -30,8 +30,8 @@ import re
 
 # Python supported version checks. Keep right after stdlib imports to ensure we
 # get a sensible error for older Python versions
-if sys.version_info[:2] < (3, 7):
-    raise RuntimeError("Python version >= 3.7 required.")
+if sys.version_info[:2] < (3, 8):
+    raise RuntimeError("Python version >= 3.8 required.")
 
 
 import versioneer
@@ -54,11 +54,14 @@ FULLVERSION = versioneer.get_version()
 # 1.22.0 ... -> ISRELEASED == True, VERSION == 1.22.0
 # 1.22.0rc1 ... -> ISRELEASED == True, VERSION == 1.22.0
 ISRELEASED = re.search(r'(dev|\+)', FULLVERSION) is None
-MAJOR, MINOR, MICRO = re.match(r'(\d+)\.(\d+)\.(\d+)', FULLVERSION).groups()
+_V_MATCH = re.match(r'(\d+)\.(\d+)\.(\d+)', FULLVERSION)
+if _V_MATCH is None:
+    raise RuntimeError(f'Cannot parse version {FULLVERSION}')
+MAJOR, MINOR, MICRO = _V_MATCH.groups()
 VERSION = '{}.{}.{}'.format(MAJOR, MINOR, MICRO)
 
 # The first version not in the `Programming Language :: Python :: ...` classifiers above
-if sys.version_info >= (3, 10):
+if sys.version_info >= (3, 11):
     fmt = "NumPy {} may not yet support Python {}.{}."
     warnings.warn(
         fmt.format(VERSION, *sys.version_info[:2]),
@@ -90,7 +93,6 @@ License :: OSI Approved :: BSD License
 Programming Language :: C
 Programming Language :: Python
 Programming Language :: Python :: 3
-Programming Language :: Python :: 3.7
 Programming Language :: Python :: 3.8
 Programming Language :: Python :: 3.9
 Programming Language :: Python :: 3.10
@@ -210,9 +212,8 @@ def get_build_overrides():
     class new_build_clib(build_clib):
         def build_a_library(self, build_info, lib_name, libraries):
             if _needs_gcc_c99_flag(self):
-                args = build_info.get('extra_compiler_args') or []
-                args.append('-std=c99')
-                build_info['extra_compiler_args'] = args
+                build_info['extra_cflags'] = ['-std=c99']
+            build_info['extra_cxxflags'] = ['-std=c++11']
             build_clib.build_a_library(self, build_info, lib_name, libraries)
 
     class new_build_ext(build_ext):
@@ -406,10 +407,11 @@ def setup_package():
         test_suite='pytest',
         version=versioneer.get_version(),
         cmdclass=cmdclass,
-        python_requires='>=3.7,<3.11',
+        python_requires='>=3.8',
         zip_safe=False,
         entry_points={
-            'console_scripts': f2py_cmds
+            'console_scripts': f2py_cmds,
+            'array_api': ['numpy = numpy.array_api'],
         },
     )
 
index a765692b7416e5631af9f43a3cc59101c853a96e..e33649c4a37f66a35b622f9e51350309026c9a00 100644 (file)
@@ -5,11 +5,8 @@ hypothesis==6.24.1
 pytest==6.2.5
 pytz==2021.3
 pytest-cov==3.0.0
-pickle5; python_version == '3.7' and platform_python_implementation != 'PyPy'
 # for numpy.random.test.test_extending
 cffi; python_version < '3.10'
 # For testing types. Notes on the restrictions:
 # - Mypy relies on C API features not present in PyPy
-# - There is no point in installing typing_extensions without mypy
-mypy==0.910; platform_python_implementation != "PyPy"
-#typing_extensions==3.10.0.0; platform_python_implementation != "PyPy"
+mypy==0.930; platform_python_implementation != "PyPy"
index 2bd7cde08d83941ca3b766e63a025d47484f2a1a..444d96882216643c2f054032f13bbeb3fbaca7ca 100755 (executable)
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# -*- encoding:utf-8 -*-
 """
 Script to generate contributor and pull request lists
 
index 8370574a11bfe07d452263afc447cf2a19836675..c06962cf98a96d7eefe48ba628a3b44e95a5e015 100755 (executable)
@@ -40,12 +40,6 @@ HASH_FILE = 'cythonize.dat'
 DEFAULT_ROOT = 'numpy'
 VENDOR = 'NumPy'
 
-# WindowsError is not defined on unix systems
-try:
-    WindowsError
-except NameError:
-    WindowsError = None
-
 #
 # Rules
 #
@@ -141,7 +135,7 @@ rules = {
 # Hash db
 #
 def load_hashes(filename):
-    # Return { filename : (sha1 of input, sha1 of output) }
+    # Return { filename : (sha256 of input, sha256 of output) }
     if os.path.isfile(filename):
         hashes = {}
         with open(filename, 'r') as f:
@@ -157,8 +151,8 @@ def save_hashes(hash_db, filename):
         for key, value in sorted(hash_db.items()):
             f.write("%s %s %s\n" % (key, value[0], value[1]))
 
-def sha1_of_file(filename):
-    h = hashlib.sha1()
+def sha256_of_file(filename):
+    h = hashlib.sha256()
     with open(filename, "rb") as f:
         h.update(f.read())
     return h.hexdigest()
@@ -174,8 +168,8 @@ def normpath(path):
     return path
 
 def get_hash(frompath, topath):
-    from_hash = sha1_of_file(frompath)
-    to_hash = sha1_of_file(topath) if os.path.exists(topath) else None
+    from_hash = sha256_of_file(frompath)
+    to_hash = sha256_of_file(topath) if os.path.exists(topath) else None
     return (from_hash, to_hash)
 
 def process(path, fromfile, tofile, processor_function, hash_db):
index 28b3fc7ad6a9f79664dee9088a400ed0c6c6499f..dd066d9adba9f0236f7eaecc511d15a384ff30ee 100644 (file)
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# -*- encoding:utf-8 -*-
 """
 Script to download NumPy wheels from the Anaconda staging area.
 
index ad731fd63d01ea12898c648d6271c9e471e1c259..7894be5bc3582850c9ea18343e3746441211c408 100644 (file)
@@ -5,7 +5,9 @@ ARG BASE_CONTAINER="numpy/numpy-dev:latest"
 FROM gitpod/workspace-base:latest as clone
 
 COPY --chown=gitpod . /tmp/numpy_repo
-RUN git clone --depth 1 file:////tmp/numpy_repo /tmp/numpy
+
+# the clone should be deep enough for versioneer to work
+RUN git clone --shallow-since=2021-05-22 file:////tmp/numpy_repo /tmp/numpy
 
 # -----------------------------------------------------------------------------
 # Using the numpy-dev Docker image as a base
@@ -32,12 +34,13 @@ COPY --from=clone --chown=gitpod /tmp/numpy ${WORKSPACE}
 WORKDIR ${WORKSPACE}
 
 # Build numpy to populate the cache used by ccache
+RUN git submodule update --init --depth=1 -- numpy/core/src/umath/svml
 RUN conda activate ${CONDA_ENV} && \ 
     python setup.py build_ext --inplace && \
     ccache -s
 
 # Gitpod will load the repository into /workspace/numpy. We remove the
-# directoy from the image to prevent conflicts
+# directory from the image to prevent conflicts
 RUN rm -rf ${WORKSPACE}
 
 # -----------------------------------------------------------------------------
index 3b66d3c3e900ea40417684f8bb6ea8b670b34ab4..9e31050b78a46aa5587bc72ae3d6082157239b41 100644 (file)
@@ -1,4 +1,5 @@
 [pycodestyle]
 max_line_length = 79
 statistics = True
-ignore = E121,E122,E123,E125,E126,E127,E128,E226,E251,E265,E266,E302,E402,E704,E712,E721,E731,E741,W291,W293,W391,W503,W504
+ignore = E121,E122,E123,E125,E126,E127,E128,E226,E241,E251,E265,E266,E302,E402,E704,E712,E721,E731,E741,W291,W293,W391,W503,W504
+exclude = numpy/__config__.py,numpy/typing/tests/data
index fd229dbef8f92d18d7627ce53a69f3fb97335e83..0031ff83a4794e0b95cd52ed53a6d5edf5a955b5 100644 (file)
@@ -14,7 +14,9 @@ CONFIG = os.path.join(
 # computing the diff itself.
 EXCLUDE = (
     "numpy/typing/tests/data/",
+    "numpy/typing/_char_codes.py",
     "numpy/__config__.py",
+    "numpy/f2py",
 )
 
 
diff --git a/tools/list_installed_dll_dependencies_cygwin.sh b/tools/list_installed_dll_dependencies_cygwin.sh
new file mode 100644 (file)
index 0000000..ee06ae0
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/dash
+# Check permissions and dependencies on installed DLLs
+# DLLs need execute permissions to be used
+# DLLs must be able to find their dependencies
+# This checks both of those, then does a direct test
+# The best way of checking whether a C extension module is importable
+# is trying to import it.  The rest is trying to give reasons why it
+# isn't importing.
+#
+# One of the tools and the extension for shared libraries are
+# Cygwin-specific, but the rest should work on most platforms with
+# /bin/sh
+
+py_ver=${1}
+dll_list=`/bin/dash tools/list_numpy_dlls.sh ${py_ver}`
+echo "Checks for existence, permissions and file type"
+ls -l ${dll_list}
+file ${dll_list}
+echo "Dependency checks"
+ldd ${dll_list} | grep -F -e " => not found" && exit 1
+cygcheck ${dll_list} >cygcheck_dll_list 2>cygcheck_missing_deps
+grep -F -e "cygcheck: track_down: could not find " cygcheck_missing_deps && exit 1
+echo "Import tests"
+mkdir -p dist/
+cd dist/
+for name in ${dll_list};
+do
+    echo ${name}
+    ext_module=`echo ${name} | \
+                     sed -E \
+                        -e "s/^\/+(home|usr).*?site-packages\/+//" \
+                        -e "s/.cpython-3.m?-x86(_64)?-cygwin.dll$//" \
+                        -e "s/\//./g"`
+    python${py_ver} -c "import ${ext_module}"
+done
diff --git a/tools/list_numpy_dlls.sh b/tools/list_numpy_dlls.sh
new file mode 100644 (file)
index 0000000..fedd209
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/dash
+# Print the list of dlls installed by NumPy
+
+py_ver=${1}
+site_packages=`python${py_ver} -m pip show numpy | \
+                   grep Location | cut -d " " -f 2 -`;
+dll_list=`for name in $(python${py_ver} -m pip show -f numpy | \
+                            grep -F .dll); do echo ${site_packages}/${name}; done`
+echo ${dll_list}
index 8509326f0d74a63a9735893f17c24b014967f3e5..4eb72dbc9b4b3d910212bf0f4257e64c5fa13dfc 100644 (file)
@@ -13,8 +13,8 @@ from tempfile import mkstemp, gettempdir
 from urllib.request import urlopen, Request
 from urllib.error import HTTPError
 
-OPENBLAS_V = '0.3.17'
-OPENBLAS_LONG = 'v0.3.17'
+OPENBLAS_V = '0.3.18'
+OPENBLAS_LONG = 'v0.3.18'
 BASE_LOC = 'https://anaconda.org/multibuild-wheels-staging/openblas-libs'
 BASEURL = f'{BASE_LOC}/{OPENBLAS_LONG}/download'
 SUPPORTED_PLATFORMS = [
@@ -149,7 +149,10 @@ def unpack_windows_zip(fname):
         if not lib:
             return 'could not find libopenblas_%s*.a ' \
                     'in downloaded zipfile' % OPENBLAS_LONG
-        target = os.path.join(gettempdir(), 'openblas.a')
+        if get_ilp64() is None:
+            target = os.path.join(gettempdir(), 'openblas.a')
+        else:
+            target = os.path.join(gettempdir(), 'openblas64_.a')
         with open(target, 'wb') as fid:
             fid.write(zf.read(lib[0]))
     return target
diff --git a/tools/rebase_installed_dlls_cygwin.sh b/tools/rebase_installed_dlls_cygwin.sh
new file mode 100644 (file)
index 0000000..f772879
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/dash
+# Rebase the dlls installed by NumPy
+
+py_ver=${1}
+/usr/bin/rebase --database --oblivious `/bin/dash tools/list_numpy_dlls.sh ${py_ver}`
index 9a6d1c9f85b4e8565126eb8057222988a857ad6f..21ba5a448dcc507e9c555235941c28e1a7577566 100644 (file)
@@ -93,18 +93,27 @@ OTHER_MODULE_DOCS = {
 
 # these names are known to fail doctesting and we like to keep it that way
 # e.g. sometimes pseudocode is acceptable etc
-DOCTEST_SKIPLIST = set([
+#
+# Optionally, a subset of methods can be skipped by setting dict-values
+# to a container of method-names
+DOCTEST_SKIPDICT = {
     # cases where NumPy docstrings import things from SciPy:
-    'numpy.lib.vectorize',
-    'numpy.random.standard_gamma',
-    'numpy.random.gamma',
-    'numpy.random.vonmises',
-    'numpy.random.power',
-    'numpy.random.zipf',
+    'numpy.lib.vectorize': None,
+    'numpy.random.standard_gamma': None,
+    'numpy.random.gamma': None,
+    'numpy.random.vonmises': None,
+    'numpy.random.power': None,
+    'numpy.random.zipf': None,
     # remote / local file IO with DataSource is problematic in doctest:
-    'numpy.lib.DataSource',
-    'numpy.lib.Repository',
-])
+    'numpy.lib.DataSource': None,
+    'numpy.lib.Repository': None,
+}
+if sys.version_info < (3, 9):
+    DOCTEST_SKIPDICT.update({
+        "numpy.core.ndarray": {"__class_getitem__"},
+        "numpy.core.dtype": {"__class_getitem__"},
+        "numpy.core.number": {"__class_getitem__"},
+    })
 
 # Skip non-numpy RST files, historical release notes
 # Any single-directory exact match will skip the directory and all subdirs.
@@ -118,14 +127,13 @@ RST_SKIPLIST = [
     'changelog',
     'doc/release',
     'doc/source/release',
+    'doc/release/upcoming_changes',
     'c-info.ufunc-tutorial.rst',
     'c-info.python-as-glue.rst',
     'f2py.getting-started.rst',
     'arrays.nditer.cython.rst',
     # See PR 17222, these should be fixed
-    'basics.broadcasting.rst',
     'basics.byteswapping.rst',
-    'basics.creation.rst',
     'basics.dispatch.rst',
     'basics.indexing.rst',
     'basics.subclassing.rst',
@@ -870,8 +878,12 @@ def check_doctests(module, verbose, ns=None,
     for name in get_all_dict(module)[0]:
         full_name = module.__name__ + '.' + name
 
-        if full_name in DOCTEST_SKIPLIST:
-            continue
+        if full_name in DOCTEST_SKIPDICT:
+            skip_methods = DOCTEST_SKIPDICT[full_name]
+            if skip_methods is None:
+                continue
+        else:
+            skip_methods = None
 
         try:
             obj = getattr(module, name)
@@ -892,6 +904,10 @@ def check_doctests(module, verbose, ns=None,
                             traceback.format_exc()))
             continue
 
+        if skip_methods is not None:
+            tests = [i for i in tests if
+                     i.name.partition(".")[2] not in skip_methods]
+
         success, output = _run_doctests(tests, full_name, verbose,
                                         doctest_warnings)
 
@@ -972,7 +988,7 @@ def check_doctests_testfile(fname, verbose, ns=None,
     results = []
 
     _, short_name = os.path.split(fname)
-    if short_name in DOCTEST_SKIPLIST:
+    if short_name in DOCTEST_SKIPDICT:
         return results
 
     full_name = fname
index 43a6003f411f1e57656ad93237ecc98e411f3d0d..29bf96fe2f68c4b2dc0b85fe025138439b17458e 100755 (executable)
@@ -28,7 +28,7 @@ class FarrayTestCase(unittest.TestCase):
 
     def testConstructor1(self):
         "Test Farray size constructor"
-        self.failUnless(isinstance(self.array, Farray.Farray))
+        self.assertTrue(isinstance(self.array, Farray.Farray))
 
     def testConstructor2(self):
         "Test Farray copy constructor"
@@ -36,7 +36,7 @@ class FarrayTestCase(unittest.TestCase):
             for j in range(self.ncols):
                 self.array[i, j] = i + j
         arrayCopy = Farray.Farray(self.array)
-        self.failUnless(arrayCopy == self.array)
+        self.assertTrue(arrayCopy == self.array)
 
     def testConstructorBad1(self):
         "Test Farray size constructor, negative nrows"
@@ -48,15 +48,15 @@ class FarrayTestCase(unittest.TestCase):
 
     def testNrows(self):
         "Test Farray nrows method"
-        self.failUnless(self.array.nrows() == self.nrows)
+        self.assertTrue(self.array.nrows() == self.nrows)
 
     def testNcols(self):
         "Test Farray ncols method"
-        self.failUnless(self.array.ncols() == self.ncols)
+        self.assertTrue(self.array.ncols() == self.ncols)
 
     def testLen(self):
         "Test Farray __len__ method"
-        self.failUnless(len(self.array) == self.nrows*self.ncols)
+        self.assertTrue(len(self.array) == self.nrows*self.ncols)
 
     def testSetGet(self):
         "Test Farray __setitem__, __getitem__ methods"
@@ -67,7 +67,7 @@ class FarrayTestCase(unittest.TestCase):
                 self.array[i, j] = i*j
         for i in range(m):
             for j in range(n):
-                self.failUnless(self.array[i, j] == i*j)
+                self.assertTrue(self.array[i, j] == i*j)
 
     def testSetBad1(self):
         "Test Farray __setitem__ method, negative row"
@@ -113,7 +113,7 @@ class FarrayTestCase(unittest.TestCase):
         for i in range(self.nrows):
             for j in range(self.ncols):
                 self.array[i, j] = i+j
-        self.failUnless(self.array.asString() == result)
+        self.assertTrue(self.array.asString() == result)
 
     def testStr(self):
         "Test Farray __str__ method"
@@ -127,7 +127,7 @@ class FarrayTestCase(unittest.TestCase):
         for i in range(self.nrows):
             for j in range(self.ncols):
                 self.array[i, j] = i-j
-        self.failUnless(str(self.array) == result)
+        self.assertTrue(str(self.array) == result)
 
     def testView(self):
         "Test Farray view method"
@@ -135,11 +135,11 @@ class FarrayTestCase(unittest.TestCase):
             for j in range(self.ncols):
                 self.array[i, j] = i+j
         a = self.array.view()
-        self.failUnless(isinstance(a, np.ndarray))
-        self.failUnless(a.flags.f_contiguous)
+        self.assertTrue(isinstance(a, np.ndarray))
+        self.assertTrue(a.flags.f_contiguous)
         for i in range(self.nrows):
             for j in range(self.ncols):
-                self.failUnless(a[i, j] == i+j)
+                self.assertTrue(a[i, j] == i+j)
 
 ######################################################################
 
index 65aa4ad13108dcf4f53e2d05c9d1c4f78321a2b9..056e9747278fcd732947d8baa11d67feecfd9ecb 100755 (executable)
@@ -22,13 +22,12 @@ pushd builds
 
 # Build into own virtualenv
 # We therefore control our own environment, avoid travis' numpy
-pip install -U virtualenv
 
 if [ -n "$USE_DEBUG" ]
 then
-  virtualenv --python=$(which python3-dbg) venv
+  python3-dbg -m venv venv
 else
-  virtualenv --python=python venv
+  python -m venv venv
 fi
 
 source venv/bin/activate
index 4667db991e9a881e220aae5a94fa2328b47e87cc..b395942fba8af23cda001c1ab5f98a48c3351cc0 100755 (executable)
@@ -165,7 +165,7 @@ if [ -n "$USE_WHEEL" ] && [ $# -eq 0 ]; then
   fi
   $PYTHON setup.py build --warn-error build_src --verbose-cfg bdist_wheel
   # Make another virtualenv to install into
-  virtualenv --python=`which $PYTHON` venv-for-wheel
+  $PYTHON -m venv venv-for-wheel
   . venv-for-wheel/bin/activate
   # Move out of source directory to avoid finding local numpy
   pushd dist
@@ -181,7 +181,7 @@ elif [ -n "$USE_SDIST" ] && [ $# -eq 0 ]; then
   export CFLAGS=$CFLAGS" -Wno-sign-compare -Wno-unused-result"
   $PYTHON setup.py sdist
   # Make another virtualenv to install into
-  virtualenv --python=`which $PYTHON` venv-for-wheel
+  $PYTHON -m venv venv-for-wheel
   . venv-for-wheel/bin/activate
   # Move out of source directory to avoid finding local numpy
   pushd dist
diff --git a/tools/wheels/LICENSE_linux.txt b/tools/wheels/LICENSE_linux.txt
new file mode 100644 (file)
index 0000000..9ea808a
--- /dev/null
@@ -0,0 +1,880 @@
+
+----
+
+This binary distribution of NumPy also bundles the following software:
+
+
+Name: OpenBLAS
+Files: .libs/libopenb*.so
+Description: bundled as a dynamically linked library
+Availability: https://github.com/xianyi/OpenBLAS/
+License: 3-clause BSD
+  Copyright (c) 2011-2014, The OpenBLAS Project
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions are
+  met:
+
+     1. Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
+
+     2. Redistributions in binary form must reproduce the above copyright
+        notice, this list of conditions and the following disclaimer in
+        the documentation and/or other materials provided with the
+        distribution.
+     3. Neither the name of the OpenBLAS project nor the names of
+        its contributors may be used to endorse or promote products
+        derived from this software without specific prior written
+        permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Name: LAPACK
+Files: .libs/libopenb*.so
+Description: bundled in OpenBLAS
+Availability: https://github.com/xianyi/OpenBLAS/
+License 3-clause BSD
+  Copyright (c) 1992-2013 The University of Tennessee and The University
+                          of Tennessee Research Foundation.  All rights
+                          reserved.
+  Copyright (c) 2000-2013 The University of California Berkeley. All
+                          rights reserved.
+  Copyright (c) 2006-2013 The University of Colorado Denver.  All rights
+                          reserved.
+
+  $COPYRIGHT$
+
+  Additional copyrights may follow
+
+  $HEADER$
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions are
+  met:
+
+  - Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+  - Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer listed
+    in this license in the documentation and/or other materials
+    provided with the distribution.
+
+  - Neither the name of the copyright holders nor the names of its
+    contributors may be used to endorse or promote products derived from
+    this software without specific prior written permission.
+
+  The copyright holders provide no reassurances that the source code
+  provided does not infringe any patent, copyright, or any other
+  intellectual property rights of third parties.  The copyright holders
+  disclaim any liability to any recipient for claims brought against
+  recipient by any third party for infringement of that parties
+  intellectual property rights.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Name: GCC runtime library
+Files: .libs/libgfortran*.so
+Description: dynamically linked to files compiled with gcc
+Availability: https://gcc.gnu.org/viewcvs/gcc/
+License: GPLv3 + runtime exception
+  Copyright (C) 2002-2017 Free Software Foundation, Inc.
+
+  Libgfortran is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 3, or (at your option)
+  any later version.
+
+  Libgfortran is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  Under Section 7 of GPL version 3, you are granted additional
+  permissions described in the GCC Runtime Library Exception, version
+  3.1, as published by the Free Software Foundation.
+
+  You should have received a copy of the GNU General Public License and
+  a copy of the GCC Runtime Library Exception along with this program;
+  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+  <http://www.gnu.org/licenses/>.
+
+----
+
+Full text of license texts referred to above follows (that they are
+listed below does not necessarily imply the conditions apply to the
+present binary release):
+
+----
+
+GCC RUNTIME LIBRARY EXCEPTION
+
+Version 3.1, 31 March 2009
+
+Copyright (C) 2009 Free Software Foundation, Inc. <http://fsf.org/>
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+This GCC Runtime Library Exception ("Exception") is an additional
+permission under section 7 of the GNU General Public License, version
+3 ("GPLv3"). It applies to a given file (the "Runtime Library") that
+bears a notice placed by the copyright holder of the file stating that
+the file is governed by GPLv3 along with this Exception.
+
+When you use GCC to compile a program, GCC may combine portions of
+certain GCC header files and runtime libraries with the compiled
+program. The purpose of this Exception is to allow compilation of
+non-GPL (including proprietary) programs to use, in this way, the
+header files and runtime libraries covered by this Exception.
+
+0. Definitions.
+
+A file is an "Independent Module" if it either requires the Runtime
+Library for execution after a Compilation Process, or makes use of an
+interface provided by the Runtime Library, but is not otherwise based
+on the Runtime Library.
+
+"GCC" means a version of the GNU Compiler Collection, with or without
+modifications, governed by version 3 (or a specified later version) of
+the GNU General Public License (GPL) with the option of using any
+subsequent versions published by the FSF.
+
+"GPL-compatible Software" is software whose conditions of propagation,
+modification and use would permit combination with GCC in accord with
+the license of GCC.
+
+"Target Code" refers to output from any compiler for a real or virtual
+target processor architecture, in executable form or suitable for
+input to an assembler, loader, linker and/or execution
+phase. Notwithstanding that, Target Code does not include data in any
+format that is used as a compiler intermediate representation, or used
+for producing a compiler intermediate representation.
+
+The "Compilation Process" transforms code entirely represented in
+non-intermediate languages designed for human-written code, and/or in
+Java Virtual Machine byte code, into Target Code. Thus, for example,
+use of source code generators and preprocessors need not be considered
+part of the Compilation Process, since the Compilation Process can be
+understood as starting with the output of the generators or
+preprocessors.
+
+A Compilation Process is "Eligible" if it is done using GCC, alone or
+with other GPL-compatible software, or if it is done without using any
+work based on GCC. For example, using non-GPL-compatible Software to
+optimize any GCC intermediate representations would not qualify as an
+Eligible Compilation Process.
+
+1. Grant of Additional Permission.
+
+You have permission to propagate a work of Target Code formed by
+combining the Runtime Library with Independent Modules, even if such
+propagation would otherwise violate the terms of GPLv3, provided that
+all Target Code was generated by Eligible Compilation Processes. You
+may then convey such a combination under terms of your choice,
+consistent with the licensing of the Independent Modules.
+
+2. No Weakening of GCC Copyleft.
+
+The availability of this Exception does not imply any general
+presumption that third-party software is unaffected by the copyleft
+requirements of the license of GCC.
+
+----
+
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/tools/wheels/LICENSE_osx.txt b/tools/wheels/LICENSE_osx.txt
new file mode 100644 (file)
index 0000000..9a687c3
--- /dev/null
@@ -0,0 +1,789 @@
+
+----
+
+This binary distribution of NumPy also bundles the following software:
+
+
+Name: GCC runtime library
+Files: .dylibs/*
+Description: dynamically linked to files compiled with gcc
+Availability: https://gcc.gnu.org/viewcvs/gcc/
+License: GPLv3 + runtime exception
+  Copyright (C) 2002-2017 Free Software Foundation, Inc.
+
+  Libgfortran is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 3, or (at your option)
+  any later version.
+
+  Libgfortran is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  Under Section 7 of GPL version 3, you are granted additional
+  permissions described in the GCC Runtime Library Exception, version
+  3.1, as published by the Free Software Foundation.
+
+  You should have received a copy of the GNU General Public License and
+  a copy of the GCC Runtime Library Exception along with this program;
+  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+  <http://www.gnu.org/licenses/>.
+
+----
+
+Full text of license texts referred to above follows (that they are
+listed below does not necessarily imply the conditions apply to the
+present binary release):
+
+----
+
+GCC RUNTIME LIBRARY EXCEPTION
+
+Version 3.1, 31 March 2009
+
+Copyright (C) 2009 Free Software Foundation, Inc. <http://fsf.org/>
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+This GCC Runtime Library Exception ("Exception") is an additional
+permission under section 7 of the GNU General Public License, version
+3 ("GPLv3"). It applies to a given file (the "Runtime Library") that
+bears a notice placed by the copyright holder of the file stating that
+the file is governed by GPLv3 along with this Exception.
+
+When you use GCC to compile a program, GCC may combine portions of
+certain GCC header files and runtime libraries with the compiled
+program. The purpose of this Exception is to allow compilation of
+non-GPL (including proprietary) programs to use, in this way, the
+header files and runtime libraries covered by this Exception.
+
+0. Definitions.
+
+A file is an "Independent Module" if it either requires the Runtime
+Library for execution after a Compilation Process, or makes use of an
+interface provided by the Runtime Library, but is not otherwise based
+on the Runtime Library.
+
+"GCC" means a version of the GNU Compiler Collection, with or without
+modifications, governed by version 3 (or a specified later version) of
+the GNU General Public License (GPL) with the option of using any
+subsequent versions published by the FSF.
+
+"GPL-compatible Software" is software whose conditions of propagation,
+modification and use would permit combination with GCC in accord with
+the license of GCC.
+
+"Target Code" refers to output from any compiler for a real or virtual
+target processor architecture, in executable form or suitable for
+input to an assembler, loader, linker and/or execution
+phase. Notwithstanding that, Target Code does not include data in any
+format that is used as a compiler intermediate representation, or used
+for producing a compiler intermediate representation.
+
+The "Compilation Process" transforms code entirely represented in
+non-intermediate languages designed for human-written code, and/or in
+Java Virtual Machine byte code, into Target Code. Thus, for example,
+use of source code generators and preprocessors need not be considered
+part of the Compilation Process, since the Compilation Process can be
+understood as starting with the output of the generators or
+preprocessors.
+
+A Compilation Process is "Eligible" if it is done using GCC, alone or
+with other GPL-compatible software, or if it is done without using any
+work based on GCC. For example, using non-GPL-compatible Software to
+optimize any GCC intermediate representations would not qualify as an
+Eligible Compilation Process.
+
+1. Grant of Additional Permission.
+
+You have permission to propagate a work of Target Code formed by
+combining the Runtime Library with Independent Modules, even if such
+propagation would otherwise violate the terms of GPLv3, provided that
+all Target Code was generated by Eligible Compilation Processes. You
+may then convey such a combination under terms of your choice,
+consistent with the licensing of the Independent Modules.
+
+2. No Weakening of GCC Copyleft.
+
+The availability of this Exception does not imply any general
+presumption that third-party software is unaffected by the copyleft
+requirements of the license of GCC.
+
+----
+
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/tools/wheels/check_license.py b/tools/wheels/check_license.py
new file mode 100644 (file)
index 0000000..0fe7356
--- /dev/null
@@ -0,0 +1,55 @@
+#!/usr/bin/env python
+"""
+check_license.py [MODULE]
+
+Check the presence of a LICENSE.txt in the installed module directory,
+and that it appears to contain text prevalent for a NumPy binary
+distribution.
+
+"""
+import os
+import sys
+import io
+import re
+import argparse
+
+
+def check_text(text):
+    ok = "Copyright (c)" in text and re.search(
+        r"This binary distribution of \w+ also bundles the following software",
+        text,
+    )
+    return ok
+
+
+def main():
+    p = argparse.ArgumentParser(usage=__doc__.rstrip())
+    p.add_argument("module", nargs="?", default="numpy")
+    args = p.parse_args()
+
+    # Drop '' from sys.path
+    sys.path.pop(0)
+
+    # Find module path
+    __import__(args.module)
+    mod = sys.modules[args.module]
+
+    # Check license text
+    license_txt = os.path.join(os.path.dirname(mod.__file__), "LICENSE.txt")
+    with io.open(license_txt, "r", encoding="utf-8") as f:
+        text = f.read()
+
+    ok = check_text(text)
+    if not ok:
+        print(
+            "ERROR: License text {} does not contain expected "
+            "text fragments\n".format(license_txt)
+        )
+        print(text)
+        sys.exit(1)
+
+    sys.exit(0)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/tools/wheels/cibw_before_build.sh b/tools/wheels/cibw_before_build.sh
new file mode 100644 (file)
index 0000000..36410ba
--- /dev/null
@@ -0,0 +1,37 @@
+set -xe
+
+PROJECT_DIR="$1"
+UNAME="$(uname)"
+
+# Update license
+if [[ $UNAME == "Linux" ]] ; then
+    cat $PROJECT_DIR/tools/wheels/LICENSE_linux.txt >> $PROJECT_DIR/LICENSE.txt
+elif [[ $UNAME == "Darwin" ]]; then
+    cat $PROJECT_DIR/tools/wheels/LICENSE_osx.txt >> $PROJECT_DIR/LICENSE.txt
+fi
+
+# Install Openblas
+if [[ $UNAME == "Linux" || $UNAME == "Darwin" ]] ; then
+    basedir=$(python tools/openblas_support.py)
+    cp -r $basedir/lib/* /usr/local/lib
+    cp $basedir/include/* /usr/local/include
+fi
+
+# Install GFortran
+if [[ $UNAME == "Darwin" ]]; then
+    # same version of gfortran as the openblas-libs and numpy-wheel builds
+    curl -L https://github.com/MacPython/gfortran-install/raw/master/archives/gfortran-4.9.0-Mavericks.dmg -o gfortran.dmg
+    GFORTRAN_SHA256=$(shasum -a 256 gfortran.dmg)
+    KNOWN_SHA256="d2d5ca5ba8332d63bbe23a07201c4a0a5d7e09ee56f0298a96775f928c3c4b30  gfortran.dmg"
+    if [ "$GFORTRAN_SHA256" != "$KNOWN_SHA256" ]; then
+        echo sha256 mismatch
+        exit 1
+    fi
+    hdiutil attach -mountpoint /Volumes/gfortran gfortran.dmg
+    sudo installer -pkg /Volumes/gfortran/gfortran.pkg -target /
+    otool -L /usr/local/gfortran/lib/libgfortran.3.dylib
+    # Manually symlink gfortran-4.9 to plain gfortran for f2py.
+    # No longer needed after Feb 13 2020 as gfortran is already present
+    # and the attempted link errors. Keep this for future reference.
+    # ln -s /usr/local/bin/gfortran-4.9 /usr/local/bin/gfortran
+fi
diff --git a/tools/wheels/cibw_test_command.sh b/tools/wheels/cibw_test_command.sh
new file mode 100644 (file)
index 0000000..f09395e
--- /dev/null
@@ -0,0 +1,15 @@
+# This script is used by .github/workflows/wheels.yml to build wheels with
+# cibuildwheel. It runs the full test suite, checks for lincense inclusion
+# and that the openblas version is correct.
+set -xe
+
+PROJECT_DIR="$1"
+UNAME="$(uname)"
+
+python -c "import numpy; numpy.show_config()"
+python -c "import sys; import numpy; sys.exit(not numpy.test('full', extra_argv=['-vv']))"
+
+python $PROJECT_DIR/tools/wheels/check_license.py
+if [[ $UNAME == "Linux" || $UNAME == "Darwin" ]] ; then
+    python $PROJECT_DIR/tools/openblas_support.py --check_version
+fi
index 7a77c5ef7fa188e5325eec14e8e5e033d93e8b99..7aa415ac8a9b6b01de7a19c480c2ff1e5115d4c0 100644 (file)
@@ -946,21 +946,20 @@ def git_get_keywords(versionfile_abs):
     # _version.py.
     keywords = {}
     try:
-        f = open(versionfile_abs, "r")
-        for line in f.readlines():
-            if line.strip().startswith("git_refnames ="):
-                mo = re.search(r'=\s*"(.*)"', line)
-                if mo:
-                    keywords["refnames"] = mo.group(1)
-            if line.strip().startswith("git_full ="):
-                mo = re.search(r'=\s*"(.*)"', line)
-                if mo:
-                    keywords["full"] = mo.group(1)
-            if line.strip().startswith("git_date ="):
-                mo = re.search(r'=\s*"(.*)"', line)
-                if mo:
-                    keywords["date"] = mo.group(1)
-        f.close()
+        with open(versionfile_abs, "r") as f:
+            for line in f.readlines():
+                if line.strip().startswith("git_refnames ="):
+                    mo = re.search(r'=\s*"(.*)"', line)
+                    if mo:
+                        keywords["refnames"] = mo.group(1)
+                if line.strip().startswith("git_full ="):
+                    mo = re.search(r'=\s*"(.*)"', line)
+                    if mo:
+                        keywords["full"] = mo.group(1)
+                if line.strip().startswith("git_date ="):
+                    mo = re.search(r'=\s*"(.*)"', line)
+                    if mo:
+                        keywords["date"] = mo.group(1)
     except EnvironmentError:
         pass
     return keywords
@@ -1142,18 +1141,16 @@ def do_vcs_install(manifest_in, versionfile_source, ipy):
     files.append(versioneer_file)
     present = False
     try:
-        f = open(".gitattributes", "r")
-        for line in f.readlines():
-            if line.strip().startswith(versionfile_source):
-                if "export-subst" in line.strip().split()[1:]:
-                    present = True
-        f.close()
+        with open(".gitattributes", "r") as f:
+            for line in f.readlines():
+                if line.strip().startswith(versionfile_source):
+                    if "export-subst" in line.strip().split()[1:]:
+                        present = True
     except EnvironmentError:
         pass
     if not present:
-        f = open(".gitattributes", "a+")
-        f.write("%s export-subst\n" % versionfile_source)
-        f.close()
+        with open(".gitattributes", "a+") as f:
+            f.write("%s export-subst\n" % versionfile_source)
         files.append(".gitattributes")
     run_command(GITS, ["add", "--"] + files)